diff --git a/x-pack/legacy/plugins/siem/public/components/page/add_to_kql/index.test.tsx b/x-pack/legacy/plugins/siem/public/components/page/add_to_kql/index.test.tsx index 67cabfa4914cf..1c33e7c89b755 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/add_to_kql/index.test.tsx +++ b/x-pack/legacy/plugins/siem/public/components/page/add_to_kql/index.test.tsx @@ -91,14 +91,17 @@ describe('AddToKql Component', () => { limit: 10, }, hosts: { + activePage: 0, limit: 10, direction: 'desc', sortField: 'lastSeen', }, events: { + activePage: 0, limit: 10, }, uncommonProcesses: { + activePage: 0, limit: 10, }, }, @@ -141,6 +144,7 @@ describe('AddToKql Component', () => { expect(store.getState().network.page).toEqual({ queries: { topNFlow: { + activePage: 0, limit: 10, flowDirection: 'uniDirectional', flowTarget: 'source', @@ -150,6 +154,7 @@ describe('AddToKql Component', () => { }, }, dns: { + activePage: 0, limit: 10, dnsSortField: { field: 'queryCount', diff --git a/x-pack/legacy/plugins/siem/public/components/page/hosts/authentications_table/index.test.tsx b/x-pack/legacy/plugins/siem/public/components/page/hosts/authentications_table/index.test.tsx index 360f6b9c6dfd7..0e37ebaacf0ce 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/hosts/authentications_table/index.test.tsx +++ b/x-pack/legacy/plugins/siem/public/components/page/hosts/authentications_table/index.test.tsx @@ -33,7 +33,7 @@ describe('Authentication Table Component', () => { ; updateTableActivePage: ActionCreator<{ activePage: number; hostsType: hostsModel.HostsType; @@ -57,7 +56,7 @@ interface AuthenticationTableDispatchProps { }>; } -export declare type AuthTableColumns = [ +export type AuthTableColumns = [ Columns, Columns, Columns, @@ -86,8 +85,8 @@ const rowItems: ItemsPerRow[] = [ const AuthenticationTableComponent = pure( ({ - fakeTotalCount, data, + fakeTotalCount, id, limit, loading, @@ -141,7 +140,6 @@ const makeMapStateToProps = () => { export const AuthenticationTable = connect( makeMapStateToProps, { - updateLimitPagination: hostsActions.updateAuthenticationsLimit, updateTableActivePage: hostsActions.updateTableActivePage, updateTableLimit: hostsActions.updateTableLimit, } diff --git a/x-pack/legacy/plugins/siem/public/components/page/hosts/authentications_table/translations.ts b/x-pack/legacy/plugins/siem/public/components/page/hosts/authentications_table/translations.ts index 7fc30b06d4757..43a2565841c8f 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/hosts/authentications_table/translations.ts +++ b/x-pack/legacy/plugins/siem/public/components/page/hosts/authentications_table/translations.ts @@ -79,13 +79,3 @@ export const ROWS_10 = i18n.translate('xpack.siem.authenticationsTable.rows', { values: { numRows: 10 }, defaultMessage: '{numRows} {numRows, plural, =0 {rows} =1 {row} other {rows}}', }); - -export const ROWS_20 = i18n.translate('xpack.siem.authenticationsTable.rows', { - values: { numRows: 20 }, - defaultMessage: '{numRows} {numRows, plural, =0 {rows} =1 {row} other {rows}}', -}); - -export const ROWS_50 = i18n.translate('xpack.siem.authenticationsTable.rows', { - values: { numRows: 50 }, - defaultMessage: '{numRows} {numRows, plural, =0 {rows} =1 {row} other {rows}}', -}); diff --git a/x-pack/legacy/plugins/siem/public/components/page/hosts/events_table/__snapshots__/index.test.tsx.snap b/x-pack/legacy/plugins/siem/public/components/page/hosts/events_table/__snapshots__/index.test.tsx.snap index 3bdc7c23a890a..d7fd4e05887bc 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/hosts/events_table/__snapshots__/index.test.tsx.snap +++ b/x-pack/legacy/plugins/siem/public/components/page/hosts/events_table/__snapshots__/index.test.tsx.snap @@ -136,12 +136,11 @@ exports[`Load More Events Table Component rendering it renders the events table }, ] } - hasNextPage={true} + fakeTotalCount={50} id="events" - loadMore={[MockFunction]} + loadPage={[MockFunction]} loading={false} - nextCursor="1546878704036" - tiebreaker="10624" + showMorePagesIndicator={true} totalCount={15546} type="page" /> diff --git a/x-pack/legacy/plugins/siem/public/components/page/hosts/events_table/index.test.tsx b/x-pack/legacy/plugins/siem/public/components/page/hosts/events_table/index.test.tsx index 51fd59ee7d451..5acad330680b7 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/hosts/events_table/index.test.tsx +++ b/x-pack/legacy/plugins/siem/public/components/page/hosts/events_table/index.test.tsx @@ -18,7 +18,7 @@ import { mockData } from './mock'; import * as i18n from './translations'; describe('Load More Events Table Component', () => { - const loadMore = jest.fn(); + const loadPage = jest.fn(); const state: State = mockGlobalState; let store = createStore(state, apolloClientObservable); @@ -33,12 +33,15 @@ describe('Load More Events Table Component', () => { i.node)} - hasNextPage={getOr(false, 'hasNextPage', mockData.Events.pageInfo)!} + fakeTotalCount={getOr(50, 'fakeTotalCount', mockData.Events.pageInfo)} id="events" loading={false} - loadMore={loadMore} - nextCursor={getOr(null, 'endCursor.value', mockData.Events.pageInfo)} - tiebreaker={getOr(null, 'endCursor.tiebreaker', mockData.Events.pageInfo)!} + loadPage={loadPage} + showMorePagesIndicator={getOr( + false, + 'showMorePagesIndicator', + mockData.Events.pageInfo + )} totalCount={mockData.Events.totalCount} type={hostsModel.HostsType.page} /> diff --git a/x-pack/legacy/plugins/siem/public/components/page/hosts/events_table/index.tsx b/x-pack/legacy/plugins/siem/public/components/page/hosts/events_table/index.tsx index f2bf704c6dcb2..8ccc434a8a849 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/hosts/events_table/index.tsx +++ b/x-pack/legacy/plugins/siem/public/components/page/hosts/events_table/index.tsx @@ -16,33 +16,53 @@ import { Ecs } from '../../../../graphql/types'; import { hostsModel, hostsSelectors, State } from '../../../../store'; import { getEmptyTagValue, getOrEmptyTag } from '../../../empty_value'; import { HostDetailsLink, IPDetailsLink } from '../../../links'; -import { Columns, ItemsPerRow, LoadMoreTable } from '../../../load_more_table'; +import { Columns, ItemsPerRow, PaginatedTable } from '../../../paginated_table'; import { getRowItemDraggable, getRowItemDraggables, OverflowField } from '../../../tables/helpers'; import { PreferenceFormattedDate } from '../../../formatted_date'; import { LocalizedDateTooltip } from '../../../localized_date_tooltip'; import * as i18n from './translations'; - +const tableType = hostsModel.HostsTableType.events; interface OwnProps { data: Ecs[]; - loading: boolean; - hasNextPage: boolean; + fakeTotalCount: number; id: string; - nextCursor: string; - tiebreaker: string; + loading: boolean; + loadPage: (newActivePage: number) => void; + showMorePagesIndicator: boolean; totalCount: number; - loadMore: (cursor: string, tiebreaker: string) => void; type: hostsModel.HostsType; } interface EventsTableReduxProps { + activePage: number; limit: number; } interface EventsTableDispatchProps { - updateLimitPagination: ActionCreator<{ limit: number; hostsType: hostsModel.HostsType }>; + updateTableActivePage: ActionCreator<{ + activePage: number; + hostsType: hostsModel.HostsType; + tableType: hostsModel.HostsTableType; + }>; + updateTableLimit: ActionCreator<{ + limit: number; + hostsType: hostsModel.HostsType; + tableType: hostsModel.HostsTableType; + }>; } +export type EventsTableColumns = [ + Columns, + Columns, + Columns, + Columns, + Columns, + Columns, + Columns, + Columns +]; + type EventsTableProps = OwnProps & EventsTableReduxProps & EventsTableDispatchProps; const rowItems: ItemsPerRow[] = [ @@ -54,33 +74,24 @@ const rowItems: ItemsPerRow[] = [ text: i18n.ROWS_10, numberOfRow: 10, }, - { - text: i18n.ROWS_20, - numberOfRow: 20, - }, - { - text: i18n.ROWS_50, - numberOfRow: 50, - }, ]; const EventsTableComponent = pure( ({ + fakeTotalCount, + showMorePagesIndicator, data, - hasNextPage, id, limit, loading, - loadMore, - tiebreaker, + loadPage, totalCount, - nextCursor, - updateLimitPagination, type, + updateTableActivePage, + updateTableLimit, }) => ( - ( limit={limit} loading={loading} loadingTitle={i18n.EVENTS} - loadMore={() => loadMore(nextCursor, tiebreaker)} + loadPage={newActivePage => loadPage(newActivePage)} pageOfItems={data} + showMorePagesIndicator={showMorePagesIndicator} + totalCount={fakeTotalCount} updateLimitPagination={newLimit => - updateLimitPagination({ limit: newLimit, hostsType: type }) + updateTableLimit({ + hostsType: type, + limit: newLimit, + tableType, + }) } + updateActivePage={newPage => + updateTableActivePage({ + activePage: newPage, + hostsType: type, + tableType, + }) + } + updateProps={{ totalCount }} /> ) ); @@ -109,22 +134,12 @@ const makeMapStateToProps = () => { export const EventsTable = connect( makeMapStateToProps, { - updateLimitPagination: hostsActions.updateEventsLimit, + updateTableActivePage: hostsActions.updateTableActivePage, + updateTableLimit: hostsActions.updateTableLimit, } )(EventsTableComponent); -const getEventsColumns = ( - pageType: hostsModel.HostsType -): [ - Columns, - Columns, - Columns, - Columns, - Columns, - Columns, - Columns, - Columns -] => [ +const getEventsColumns = (pageType: hostsModel.HostsType): EventsTableColumns => [ { field: 'node', name: i18n.TIMESTAMP, diff --git a/x-pack/legacy/plugins/siem/public/components/page/hosts/events_table/mock.ts b/x-pack/legacy/plugins/siem/public/components/page/hosts/events_table/mock.ts index 41b717fbea85c..a1997912f2b95 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/hosts/events_table/mock.ts +++ b/x-pack/legacy/plugins/siem/public/components/page/hosts/events_table/mock.ts @@ -10,11 +10,9 @@ export const mockData: { Events: EventsData } = { Events: { totalCount: 15546, pageInfo: { - hasNextPage: true, - endCursor: { - value: '1546878704036', - tiebreaker: '10624', - }, + activePage: 1, + fakeTotalCount: 50, + showMorePagesIndicator: true, }, edges: [ { diff --git a/x-pack/legacy/plugins/siem/public/components/page/hosts/events_table/translations.ts b/x-pack/legacy/plugins/siem/public/components/page/hosts/events_table/translations.ts index 783955a7b4cb8..e4999f079a661 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/hosts/events_table/translations.ts +++ b/x-pack/legacy/plugins/siem/public/components/page/hosts/events_table/translations.ts @@ -57,13 +57,3 @@ export const ROWS_10 = i18n.translate('xpack.siem.eventsTable.rows', { values: { numRows: 10 }, defaultMessage: '{numRows} {numRows, plural, =0 {rows} =1 {row} other {rows}}', }); - -export const ROWS_20 = i18n.translate('xpack.siem.eventsTable.rows', { - values: { numRows: 20 }, - defaultMessage: '{numRows} {numRows, plural, =0 {rows} =1 {row} other {rows}}', -}); - -export const ROWS_50 = i18n.translate('xpack.siem.eventsTable.rows', { - values: { numRows: 50 }, - defaultMessage: '{numRows} {numRows, plural, =0 {rows} =1 {row} other {rows}}', -}); diff --git a/x-pack/legacy/plugins/siem/public/components/page/hosts/host_overview/mock.ts b/x-pack/legacy/plugins/siem/public/components/page/hosts/host_overview/mock.ts index eaa5b983702fd..d9a93272c0986 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/hosts/host_overview/mock.ts +++ b/x-pack/legacy/plugins/siem/public/components/page/hosts/host_overview/mock.ts @@ -43,10 +43,9 @@ export const mockData: { Hosts: HostsData; DateFields: string[] } = { }, ], pageInfo: { - endCursor: { - value: 'aa7ca589f1b8220002f2fc61c64cfbf1', - }, - hasNextPage: false, + activePage: 1, + fakeTotalCount: 50, + showMorePagesIndicator: true, }, }, DateFields: ['lastBeat'], diff --git a/x-pack/legacy/plugins/siem/public/components/page/hosts/hosts_table/__snapshots__/index.test.tsx.snap b/x-pack/legacy/plugins/siem/public/components/page/hosts/hosts_table/__snapshots__/index.test.tsx.snap index cc6a6db773aa6..6a790220f7c81 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/hosts/hosts_table/__snapshots__/index.test.tsx.snap +++ b/x-pack/legacy/plugins/siem/public/components/page/hosts/hosts_table/__snapshots__/index.test.tsx.snap @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`Load More Table Component rendering it renders the default Hosts table 1`] = ` +exports[`Hosts Table rendering it renders the default Hosts table 1`] = ` diff --git a/x-pack/legacy/plugins/siem/public/components/page/hosts/hosts_table/columns.tsx b/x-pack/legacy/plugins/siem/public/components/page/hosts/hosts_table/columns.tsx index b553f5eb90d91..76e1e64122c6e 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/hosts/hosts_table/columns.tsx +++ b/x-pack/legacy/plugins/siem/public/components/page/hosts/hosts_table/columns.tsx @@ -9,7 +9,6 @@ import moment from 'moment'; import React from 'react'; import { StaticIndexPattern } from 'ui/index_patterns'; -import { HostItem, HostFields, OsFields } from '../../../../graphql/types'; import { escapeQueryValue } from '../../../../lib/keury'; import { hostsModel } from '../../../../store'; import { DragEffects, DraggableWrapper } from '../../../drag_and_drop/draggable_wrapper'; @@ -17,23 +16,18 @@ import { escapeDataProviderId } from '../../../drag_and_drop/helpers'; import { getEmptyTagValue } from '../../../empty_value'; import { PreferenceFormattedDate } from '../../../formatted_date'; import { HostDetailsLink } from '../../../links'; -import { Columns } from '../../../load_more_table'; import { LocalizedDateTooltip } from '../../../localized_date_tooltip'; import { IS_OPERATOR } from '../../../timeline/data_providers/data_provider'; import { Provider } from '../../../timeline/data_providers/provider'; import { AddToKql } from '../../add_to_kql'; +import { HostsTableColumns } from './'; import * as i18n from './translations'; export const getHostsColumns = ( type: hostsModel.HostsType, indexPattern: StaticIndexPattern -): [ - Columns, - Columns, - Columns, - Columns -] => [ +): HostsTableColumns => [ { field: 'node.host.name', name: i18n.NAME, diff --git a/x-pack/legacy/plugins/siem/public/components/page/hosts/hosts_table/index.test.tsx b/x-pack/legacy/plugins/siem/public/components/page/hosts/hosts_table/index.test.tsx index 7fbcd22118876..de79f73a33d2d 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/hosts/hosts_table/index.test.tsx +++ b/x-pack/legacy/plugins/siem/public/components/page/hosts/hosts_table/index.test.tsx @@ -24,8 +24,8 @@ import { HostsTable } from './index'; import { mockData } from './mock'; import { KibanaConfigContext } from '../../../../lib/adapters/framework/kibana_framework_adapter'; -describe('Load More Table Component', () => { - const loadMore = jest.fn(); +describe('Hosts Table', () => { + const loadPage = jest.fn(); const state: State = mockGlobalState; let store = createStore(state, apolloClientObservable); @@ -43,10 +43,14 @@ describe('Load More Table Component', () => { data={mockData.Hosts.edges} id="hostsQuery" indexPattern={mockIndexPattern} - hasNextPage={getOr(false, 'hasNextPage', mockData.Hosts.pageInfo)!} + fakeTotalCount={getOr(50, 'fakeTotalCount', mockData.Hosts.pageInfo)} loading={false} - loadMore={loadMore} - nextCursor={getOr(null, 'endCursor.value', mockData.Hosts.pageInfo)} + loadPage={loadPage} + showMorePagesIndicator={getOr( + false, + 'showMorePagesIndicator', + mockData.Hosts.pageInfo + )} totalCount={mockData.Hosts.totalCount} type={hostsModel.HostsType.page} /> @@ -67,9 +71,13 @@ describe('Load More Table Component', () => { loading={false} data={mockData.Hosts.edges} totalCount={mockData.Hosts.totalCount} - hasNextPage={getOr(false, 'hasNextPage', mockData.Hosts.pageInfo)!} - nextCursor={getOr(null, 'endCursor.value', mockData.Hosts.pageInfo)} - loadMore={loadMore} + fakeTotalCount={getOr(50, 'fakeTotalCount', mockData.Hosts.pageInfo)} + showMorePagesIndicator={getOr( + false, + 'showMorePagesIndicator', + mockData.Hosts.pageInfo + )} + loadPage={loadPage} type={hostsModel.HostsType.page} /> @@ -86,9 +94,13 @@ describe('Load More Table Component', () => { loading={false} data={mockData.Hosts.edges} totalCount={mockData.Hosts.totalCount} - hasNextPage={getOr(false, 'hasNextPage', mockData.Hosts.pageInfo)!} - nextCursor={getOr(null, 'endCursor.value', mockData.Hosts.pageInfo)} - loadMore={loadMore} + fakeTotalCount={getOr(50, 'fakeTotalCount', mockData.Hosts.pageInfo)} + showMorePagesIndicator={getOr( + false, + 'showMorePagesIndicator', + mockData.Hosts.pageInfo + )} + loadPage={loadPage} type={hostsModel.HostsType.page} /> @@ -97,6 +109,7 @@ describe('Load More Table Component', () => { }); test('Initial value of the store', () => { expect(store.getState().hosts.page.queries.hosts).toEqual({ + activePage: 0, direction: 'desc', sortField: 'lastSeen', limit: 10, @@ -124,6 +137,7 @@ describe('Load More Table Component', () => { wrapper.update(); expect(store.getState().hosts.page.queries.hosts).toEqual({ + activePage: 0, direction: 'asc', sortField: 'hostName', limit: 10, diff --git a/x-pack/legacy/plugins/siem/public/components/page/hosts/hosts_table/index.tsx b/x-pack/legacy/plugins/siem/public/components/page/hosts/hosts_table/index.tsx index 2d773b22722d6..6045f6487c601 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/hosts/hosts_table/index.tsx +++ b/x-pack/legacy/plugins/siem/public/components/page/hosts/hosts_table/index.tsx @@ -25,22 +25,24 @@ import { Columns, Criteria, ItemsPerRow, - LoadMoreTable, + PaginatedTable, SortingBasicTable, -} from '../../../load_more_table'; +} from '../../../paginated_table'; import { getHostsColumns } from './columns'; import * as i18n from './translations'; +const tableType = hostsModel.HostsTableType.hosts; + interface OwnProps { data: HostsEdges[]; - loading: boolean; + fakeTotalCount: number; id: string; indexPattern: StaticIndexPattern; - hasNextPage: boolean; - nextCursor: string; + loading: boolean; + loadPage: (newActivePage: number) => void; + showMorePagesIndicator: boolean; totalCount: number; - loadMore: (cursor: string) => void; type: hostsModel.HostsType; } @@ -51,13 +53,29 @@ interface HostsTableReduxProps { } interface HostsTableDispatchProps { - updateLimitPagination: ActionCreator<{ limit: number; hostsType: hostsModel.HostsType }>; updateHostsSort: ActionCreator<{ sort: HostsSortField; hostsType: hostsModel.HostsType; }>; + updateTableActivePage: ActionCreator<{ + activePage: number; + hostsType: hostsModel.HostsType; + tableType: hostsModel.HostsTableType; + }>; + updateTableLimit: ActionCreator<{ + limit: number; + hostsType: hostsModel.HostsType; + tableType: hostsModel.HostsTableType; + }>; } +export type HostsTableColumns = [ + Columns, + Columns, + Columns, + Columns +]; + type HostsTableProps = OwnProps & HostsTableReduxProps & HostsTableDispatchProps; const rowItems: ItemsPerRow[] = [ @@ -69,26 +87,13 @@ const rowItems: ItemsPerRow[] = [ text: i18n.ROWS_10, numberOfRow: 10, }, - { - text: i18n.ROWS_20, - numberOfRow: 20, - }, - { - text: i18n.ROWS_50, - numberOfRow: 50, - }, ]; class HostsTableComponent extends React.PureComponent { private memoizedColumns: ( type: hostsModel.HostsType, indexPattern: StaticIndexPattern - ) => [ - Columns, - Columns, - Columns, - Columns - ]; + ) => HostsTableColumns; private memoizedSorting: ( trigger: string, sortField: HostsFields, @@ -105,20 +110,23 @@ class HostsTableComponent extends React.PureComponent { const { data, direction, - hasNextPage, + fakeTotalCount, id, indexPattern, limit, loading, + loadPage, + showMorePagesIndicator, totalCount, sortField, type, + updateTableActivePage, + updateTableLimit, } = this.props; return ( - { limit={limit} loading={loading} loadingTitle={i18n.HOSTS} - loadMore={this.wrappedLoadMore} + loadPage={newActivePage => loadPage(newActivePage)} onChange={this.onChange} pageOfItems={data} + showMorePagesIndicator={showMorePagesIndicator} sorting={this.memoizedSorting(`${sortField}-${direction}`, sortField, direction)} - updateLimitPagination={this.wrappedUpdateLimitPagination} + totalCount={fakeTotalCount} + updateLimitPagination={newLimit => + updateTableLimit({ + hostsType: type, + limit: newLimit, + tableType, + }) + } + updateActivePage={newPage => + updateTableActivePage({ + activePage: newPage, + hostsType: type, + tableType, + }) + } + updateProps={{ direction, sortField, totalCount }} /> ); } @@ -142,20 +166,10 @@ class HostsTableComponent extends React.PureComponent { direction: Direction ): SortingBasicTable => ({ field: getNodeField(sortField), direction }); - private wrappedUpdateLimitPagination = (newLimit: number) => - this.props.updateLimitPagination({ limit: newLimit, hostsType: this.props.type }); - - private wrappedLoadMore = () => this.props.loadMore(this.props.nextCursor); - private getMemoizeHostsColumns = ( type: hostsModel.HostsType, indexPattern: StaticIndexPattern - ): [ - Columns, - Columns, - Columns, - Columns - ] => getHostsColumns(type, indexPattern); + ): HostsTableColumns => getHostsColumns(type, indexPattern); private onChange = (criteria: Criteria) => { if (criteria.sort != null) { @@ -205,7 +219,8 @@ const makeMapStateToProps = () => { export const HostsTable = connect( makeMapStateToProps, { - updateLimitPagination: hostsActions.updateHostsLimit, updateHostsSort: hostsActions.updateHostsSort, + updateTableActivePage: hostsActions.updateTableActivePage, + updateTableLimit: hostsActions.updateTableLimit, } )(HostsTableComponent); diff --git a/x-pack/legacy/plugins/siem/public/components/page/hosts/hosts_table/mock.ts b/x-pack/legacy/plugins/siem/public/components/page/hosts/hosts_table/mock.ts index c0c32544acd9d..b5a9c925c599a 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/hosts/hosts_table/mock.ts +++ b/x-pack/legacy/plugins/siem/public/components/page/hosts/hosts_table/mock.ts @@ -52,10 +52,9 @@ export const mockData: { Hosts: HostsData } = { }, ], pageInfo: { - endCursor: { - value: 'aa7ca589f1b8220002f2fc61c64cfbf1', - }, - hasNextPage: true, + activePage: 1, + fakeTotalCount: 50, + showMorePagesIndicator: true, }, }, }; diff --git a/x-pack/legacy/plugins/siem/public/components/page/hosts/hosts_table/translations.ts b/x-pack/legacy/plugins/siem/public/components/page/hosts/hosts_table/translations.ts index 7126914b34fed..2f4ea82018743 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/hosts/hosts_table/translations.ts +++ b/x-pack/legacy/plugins/siem/public/components/page/hosts/hosts_table/translations.ts @@ -57,13 +57,3 @@ export const ROWS_10 = i18n.translate('xpack.siem.hostsTable.rows', { values: { numRows: 10 }, defaultMessage: '{numRows} {numRows, plural, =0 {rows} =1 {row} other {rows}}', }); - -export const ROWS_20 = i18n.translate('xpack.siem.hostsTable.rows', { - values: { numRows: 20 }, - defaultMessage: '{numRows} {numRows, plural, =0 {rows} =1 {row} other {rows}}', -}); - -export const ROWS_50 = i18n.translate('xpack.siem.hostsTable.rows', { - values: { numRows: 50 }, - defaultMessage: '{numRows} {numRows, plural, =0 {rows} =1 {row} other {rows}}', -}); diff --git a/x-pack/legacy/plugins/siem/public/components/page/hosts/uncommon_process_table/__snapshots__/index.test.tsx.snap b/x-pack/legacy/plugins/siem/public/components/page/hosts/uncommon_process_table/__snapshots__/index.test.tsx.snap index 2b7e0ca54dbee..4fc36c860ae62 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/hosts/uncommon_process_table/__snapshots__/index.test.tsx.snap +++ b/x-pack/legacy/plugins/siem/public/components/page/hosts/uncommon_process_table/__snapshots__/index.test.tsx.snap @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`UncommonProcess Table Component rendering it renders the default Uncommon process table 1`] = ` +exports[`Uncommon Process Table Component rendering it renders the default Uncommon process table 1`] = ` diff --git a/x-pack/legacy/plugins/siem/public/components/page/hosts/uncommon_process_table/index.test.tsx b/x-pack/legacy/plugins/siem/public/components/page/hosts/uncommon_process_table/index.test.tsx index 1bcc6bcffb670..bccd032488421 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/hosts/uncommon_process_table/index.test.tsx +++ b/x-pack/legacy/plugins/siem/public/components/page/hosts/uncommon_process_table/index.test.tsx @@ -16,8 +16,8 @@ import { getEmptyValue } from '../../../empty_value'; import { getArgs, UncommonProcessTable } from '.'; import { mockData } from './mock'; -describe('UncommonProcess Table Component', () => { - const loadMore = jest.fn(); +describe('Uncommon Process Table Component', () => { + const loadPage = jest.fn(); describe('rendering', () => { test('it renders the default Uncommon process table', () => { @@ -25,11 +25,15 @@ describe('UncommonProcess Table Component', () => { @@ -44,11 +48,15 @@ describe('UncommonProcess Table Component', () => { @@ -69,11 +77,15 @@ describe('UncommonProcess Table Component', () => { @@ -95,11 +107,15 @@ describe('UncommonProcess Table Component', () => { @@ -121,11 +137,15 @@ describe('UncommonProcess Table Component', () => { @@ -147,11 +167,15 @@ describe('UncommonProcess Table Component', () => { @@ -173,11 +197,15 @@ describe('UncommonProcess Table Component', () => { @@ -198,11 +226,15 @@ describe('UncommonProcess Table Component', () => { @@ -223,11 +255,15 @@ describe('UncommonProcess Table Component', () => { diff --git a/x-pack/legacy/plugins/siem/public/components/page/hosts/uncommon_process_table/index.tsx b/x-pack/legacy/plugins/siem/public/components/page/hosts/uncommon_process_table/index.tsx index 7d4804585b81a..858fb032c033b 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/hosts/uncommon_process_table/index.tsx +++ b/x-pack/legacy/plugins/siem/public/components/page/hosts/uncommon_process_table/index.tsx @@ -14,19 +14,19 @@ import { UncommonProcessesEdges, UncommonProcessItem } from '../../../../graphql import { hostsModel, hostsSelectors, State } from '../../../../store'; import { defaultToEmptyTag, getEmptyValue } from '../../../empty_value'; import { HostDetailsLink } from '../../../links'; -import { Columns, ItemsPerRow, LoadMoreTable } from '../../../load_more_table'; +import { Columns, ItemsPerRow, PaginatedTable } from '../../../paginated_table'; import * as i18n from './translations'; import { getRowItemDraggables } from '../../../tables/helpers'; - +const tableType = hostsModel.HostsTableType.uncommonProcesses; interface OwnProps { data: UncommonProcessesEdges[]; - loading: boolean; - hasNextPage: boolean; + fakeTotalCount: number; id: string; - nextCursor: string; + loading: boolean; + loadPage: (newActivePage: number) => void; + showMorePagesIndicator: boolean; totalCount: number; - loadMore: (cursor: string) => void; type: hostsModel.HostsType; } @@ -35,9 +35,27 @@ interface UncommonProcessTableReduxProps { } interface UncommonProcessTableDispatchProps { - updateLimitPagination: ActionCreator<{ limit: number; hostsType: hostsModel.HostsType }>; + updateTableActivePage: ActionCreator<{ + activePage: number; + hostsType: hostsModel.HostsType; + tableType: hostsModel.HostsTableType; + }>; + updateTableLimit: ActionCreator<{ + limit: number; + hostsType: hostsModel.HostsType; + tableType: hostsModel.HostsTableType; + }>; } +export type UncommonProcessTableColumns = [ + Columns, + Columns, + Columns, + Columns, + Columns, + Columns +]; + type UncommonProcessTableProps = OwnProps & UncommonProcessTableReduxProps & UncommonProcessTableDispatchProps; @@ -51,14 +69,6 @@ const rowItems: ItemsPerRow[] = [ text: i18n.ROWS_10, numberOfRow: 10, }, - { - text: i18n.ROWS_20, - numberOfRow: 20, - }, - { - text: i18n.ROWS_50, - numberOfRow: 50, - }, ]; export const getArgs = (args: string[] | null | undefined): string | null => { @@ -72,19 +82,19 @@ export const getArgs = (args: string[] | null | undefined): string | null => { const UncommonProcessTableComponent = pure( ({ data, - hasNextPage, + fakeTotalCount, id, limit, loading, - loadMore, + loadPage, totalCount, - nextCursor, - updateLimitPagination, + showMorePagesIndicator, + updateTableActivePage, + updateTableLimit, type, }) => ( - ( limit={limit} loading={loading} loadingTitle={i18n.UNCOMMON_PROCESSES} - loadMore={() => loadMore(nextCursor)} + loadPage={newActivePage => loadPage(newActivePage)} pageOfItems={data} + showMorePagesIndicator={showMorePagesIndicator} + totalCount={fakeTotalCount} updateLimitPagination={newLimit => - updateLimitPagination({ limit: newLimit, hostsType: type }) + updateTableLimit({ + hostsType: type, + limit: newLimit, + tableType, + }) + } + updateActivePage={newPage => + updateTableActivePage({ + activePage: newPage, + hostsType: type, + tableType, + }) } + updateProps={{ totalCount }} /> ) ); @@ -110,18 +134,12 @@ const makeMapStateToProps = () => { export const UncommonProcessTable = connect( makeMapStateToProps, { - updateLimitPagination: hostsActions.updateUncommonProcessesLimit, + updateTableActivePage: hostsActions.updateTableActivePage, + updateTableLimit: hostsActions.updateTableLimit, } )(UncommonProcessTableComponent); -const getUncommonColumns = (): [ - Columns, - Columns, - Columns, - Columns, - Columns, - Columns -] => [ +const getUncommonColumns = (): UncommonProcessTableColumns => [ { name: i18n.NAME, truncateText: false, diff --git a/x-pack/legacy/plugins/siem/public/components/page/hosts/uncommon_process_table/mock.ts b/x-pack/legacy/plugins/siem/public/components/page/hosts/uncommon_process_table/mock.ts index 08dd571cff882..bcd76706e3035 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/hosts/uncommon_process_table/mock.ts +++ b/x-pack/legacy/plugins/siem/public/components/page/hosts/uncommon_process_table/mock.ts @@ -111,10 +111,9 @@ export const mockData: { UncommonProcess: UncommonProcessesData } = { }, ], pageInfo: { - endCursor: { - value: 'aa7ca589f1b8220002f2fc61c64cfbf1', - }, - hasNextPage: true, + activePage: 1, + fakeTotalCount: 50, + showMorePagesIndicator: true, }, }, }; diff --git a/x-pack/legacy/plugins/siem/public/components/page/hosts/uncommon_process_table/translations.ts b/x-pack/legacy/plugins/siem/public/components/page/hosts/uncommon_process_table/translations.ts index 215946c6d177c..23e9e3c9790e2 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/hosts/uncommon_process_table/translations.ts +++ b/x-pack/legacy/plugins/siem/public/components/page/hosts/uncommon_process_table/translations.ts @@ -58,13 +58,3 @@ export const ROWS_10 = i18n.translate('xpack.siem.uncommonProcessTable.rows', { values: { numRows: 10 }, defaultMessage: '{numRows} {numRows, plural, =0 {rows} =1 {row} other {rows}}', }); - -export const ROWS_20 = i18n.translate('xpack.siem.uncommonProcessTable.rows', { - values: { numRows: 20 }, - defaultMessage: '{numRows} {numRows, plural, =0 {rows} =1 {row} other {rows}}', -}); - -export const ROWS_50 = i18n.translate('xpack.siem.uncommonProcessTable.rows', { - values: { numRows: 50 }, - defaultMessage: '{numRows} {numRows, plural, =0 {rows} =1 {row} other {rows}}', -}); diff --git a/x-pack/legacy/plugins/siem/public/components/page/network/domains_table/__snapshots__/index.test.tsx.snap b/x-pack/legacy/plugins/siem/public/components/page/network/domains_table/__snapshots__/index.test.tsx.snap index 3741dfa4e6fd5..db98d8e6c3703 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/network/domains_table/__snapshots__/index.test.tsx.snap +++ b/x-pack/legacy/plugins/siem/public/components/page/network/domains_table/__snapshots__/index.test.tsx.snap @@ -63,8 +63,8 @@ exports[`Domains Table Component Rendering it renders the default Domains table }, ] } + fakeTotalCount={50} flowTarget="source" - hasNextPage={false} id="domains" indexPattern={ Object { @@ -152,9 +152,9 @@ exports[`Domains Table Component Rendering it renders the default Domains table } } ip="10.10.10.10" - loadMore={[MockFunction]} + loadPage={[MockFunction]} loading={false} - nextCursor="10" + showMorePagesIndicator={true} totalCount={1} type="details" /> diff --git a/x-pack/legacy/plugins/siem/public/components/page/network/domains_table/columns.tsx b/x-pack/legacy/plugins/siem/public/components/page/network/domains_table/columns.tsx index 63dc9140b22d7..d539d1121a014 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/network/domains_table/columns.tsx +++ b/x-pack/legacy/plugins/siem/public/components/page/network/domains_table/columns.tsx @@ -34,6 +34,15 @@ import { AddToKql } from '../../add_to_kql'; import * as i18n from './translations'; +export type DomainsColumns = [ + Columns, + Columns, + Columns, + Columns, + Columns, + Columns +]; + export const getDomainsColumns = ( indexPattern: StaticIndexPattern, ip: string, @@ -41,14 +50,7 @@ export const getDomainsColumns = ( flowTarget: FlowTarget, type: networkModel.NetworkType, tableId: string -): [ - Columns, - Columns, - Columns, - Columns, - Columns, - Columns -] => [ +): DomainsColumns => [ { field: `node.${flowTarget}.domainName`, name: i18n.DOMAIN_NAME, diff --git a/x-pack/legacy/plugins/siem/public/components/page/network/domains_table/index.test.tsx b/x-pack/legacy/plugins/siem/public/components/page/network/domains_table/index.test.tsx index c1e0c8483cbcc..ee100aa24dd4d 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/network/domains_table/index.test.tsx +++ b/x-pack/legacy/plugins/siem/public/components/page/network/domains_table/index.test.tsx @@ -24,7 +24,7 @@ import { DomainsTable } from '.'; import { mockDomainsData } from './mock'; describe('Domains Table Component', () => { - const loadMore = jest.fn(); + const loadPage = jest.fn(); const ip = '10.10.10.10'; const state: State = mockGlobalState; @@ -40,14 +40,18 @@ describe('Domains Table Component', () => { @@ -65,14 +69,18 @@ describe('Domains Table Component', () => { diff --git a/x-pack/legacy/plugins/siem/public/components/page/network/domains_table/index.tsx b/x-pack/legacy/plugins/siem/public/components/page/network/domains_table/index.tsx index c38ba5a29aa7a..c50bfb75e6272 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/network/domains_table/index.tsx +++ b/x-pack/legacy/plugins/siem/public/components/page/network/domains_table/index.tsx @@ -21,22 +21,23 @@ import { } from '../../../../graphql/types'; import { networkModel, networkSelectors, State } from '../../../../store'; import { FlowDirectionSelect } from '../../../flow_controls/flow_direction_select'; -import { Criteria, ItemsPerRow, LoadMoreTable, SortingBasicTable } from '../../../load_more_table'; +import { Criteria, ItemsPerRow, PaginatedTable, SortingBasicTable } from '../../../paginated_table'; import { getDomainsColumns } from './columns'; import * as i18n from './translations'; +const tableType = networkModel.IpDetailsTableType.domains; interface OwnProps { data: DomainsEdges[]; flowTarget: FlowTarget; - loading: boolean; - hasNextPage: boolean; + fakeTotalCount: number; id: string; indexPattern: StaticIndexPattern; ip: string; - nextCursor: string; + loading: boolean; + loadPage: (newActivePage: number) => void; + showMorePagesIndicator: boolean; totalCount: number; - loadMore: (cursor: string) => void; type: networkModel.NetworkType; } @@ -59,6 +60,10 @@ interface DomainsTableDispatchProps { domainsSort: DomainsSortField; networkType: networkModel.NetworkType; }>; + updateTableActivePage: ActionCreator<{ + activePage: number; + tableType: networkModel.IpDetailsTableType; + }>; } type DomainsTableProps = OwnProps & DomainsTableReduxProps & DomainsTableDispatchProps; @@ -72,14 +77,6 @@ const rowItems: ItemsPerRow[] = [ text: i18n.ROWS_10, numberOfRow: 10, }, - { - text: i18n.ROWS_20, - numberOfRow: 20, - }, - { - text: i18n.ROWS_50, - numberOfRow: 50, - }, ]; export const DomainsTableId = 'domains-table'; @@ -89,23 +86,24 @@ class DomainsTableComponent extends React.PureComponent { const { data, domainsSortField, - hasNextPage, + fakeTotalCount, + flowDirection, + flowTarget, id, indexPattern, ip, limit, loading, - loadMore, + loadPage, + showMorePagesIndicator, totalCount, - nextCursor, - updateDomainsLimit, - flowDirection, - flowTarget, type, + updateDomainsLimit, + updateTableActivePage, } = this.props; return ( - { type, DomainsTableId )} - hasNextPage={hasNextPage} + showMorePagesIndicator={showMorePagesIndicator} headerCount={totalCount} headerSupplement={ { limit={limit} loading={loading} loadingTitle={i18n.DOMAINS} - loadMore={() => loadMore(nextCursor)} + loadPage={newActivePage => loadPage(newActivePage)} onChange={this.onChange} pageOfItems={data} sorting={getSortField(domainsSortField, flowTarget)} + totalCount={fakeTotalCount} + updateActivePage={newPage => + updateTableActivePage({ + activePage: newPage, + tableType, + }) + } updateLimitPagination={newLimit => updateDomainsLimit({ limit: newLimit, networkType: type }) } + updateProps={{ domainsSortField, flowDirection, flowTarget, totalCount }} /> ); } @@ -174,6 +180,7 @@ export const DomainsTable = connect( updateDomainsLimit: networkActions.updateDomainsLimit, updateDomainsDirection: networkActions.updateDomainsFlowDirection, updateDomainsSort: networkActions.updateDomainsSort, + updateTableActivePage: networkActions.updateIpDetailsTableActivePage, } )(DomainsTableComponent); diff --git a/x-pack/legacy/plugins/siem/public/components/page/network/domains_table/mock.ts b/x-pack/legacy/plugins/siem/public/components/page/network/domains_table/mock.ts index cec6aba436b09..624db09f03943 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/network/domains_table/mock.ts +++ b/x-pack/legacy/plugins/siem/public/components/page/network/domains_table/mock.ts @@ -68,9 +68,8 @@ export const mockDomainsData: DomainsData = { }, ], pageInfo: { - endCursor: { - value: '10', - }, - hasNextPage: false, + activePage: 1, + fakeTotalCount: 50, + showMorePagesIndicator: true, }, }; diff --git a/x-pack/legacy/plugins/siem/public/components/page/network/domains_table/translations.ts b/x-pack/legacy/plugins/siem/public/components/page/network/domains_table/translations.ts index 44e068b7589f3..c5b02c6a2331c 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/network/domains_table/translations.ts +++ b/x-pack/legacy/plugins/siem/public/components/page/network/domains_table/translations.ts @@ -120,16 +120,6 @@ export const ROWS_10 = i18n.translate('xpack.siem.network.ipDetails.domainsTable defaultMessage: '{numRows} {numRows, plural, =0 {rows} =1 {row} other {rows}}', }); -export const ROWS_20 = i18n.translate('xpack.siem.network.ipDetails.domainsTable.rows', { - values: { numRows: 20 }, - defaultMessage: '{numRows} {numRows, plural, =0 {rows} =1 {row} other {rows}}', -}); - -export const ROWS_50 = i18n.translate('xpack.siem.network.ipDetails.domainsTable.rows', { - values: { numRows: 50 }, - defaultMessage: '{numRows} {numRows, plural, =0 {rows} =1 {row} other {rows}}', -}); - export const MORE = i18n.translate('xpack.siem.network.ipDetails.domainsTable.moreDescription', { defaultMessage: 'More ...', }); diff --git a/x-pack/legacy/plugins/siem/public/components/page/network/network_dns_table/__snapshots__/index.test.tsx.snap b/x-pack/legacy/plugins/siem/public/components/page/network/network_dns_table/__snapshots__/index.test.tsx.snap index 65d227ffc2fe8..0b45139e24cb1 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/network/network_dns_table/__snapshots__/index.test.tsx.snap +++ b/x-pack/legacy/plugins/siem/public/components/page/network/network_dns_table/__snapshots__/index.test.tsx.snap @@ -136,11 +136,11 @@ exports[`NetworkTopNFlow Table Component rendering it renders the default Networ }, ] } - hasNextPage={true} + fakeTotalCount={50} id="dns" - loadMore={[MockFunction]} + loadPage={[MockFunction]} loading={false} - nextCursor="10" + showMorePagesIndicator={true} totalCount={80} type="page" /> diff --git a/x-pack/legacy/plugins/siem/public/components/page/network/network_dns_table/columns.tsx b/x-pack/legacy/plugins/siem/public/components/page/network/network_dns_table/columns.tsx index a63c8b13b9791..1d8be96b1264b 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/network/network_dns_table/columns.tsx +++ b/x-pack/legacy/plugins/siem/public/components/page/network/network_dns_table/columns.tsx @@ -18,16 +18,15 @@ import { PreferenceFormattedBytes } from '../../../formatted_bytes'; import { Provider } from '../../../timeline/data_providers/provider'; import * as i18n from './translations'; - -export const getNetworkDnsColumns = ( - type: networkModel.NetworkType -): [ +export type NetworkDnsColumns = [ Columns, Columns, Columns, Columns, Columns -] => [ +]; + +export const getNetworkDnsColumns = (type: networkModel.NetworkType): NetworkDnsColumns => [ { field: `node.${NetworkDnsFields.dnsName}`, name: i18n.REGISTERED_DOMAIN, diff --git a/x-pack/legacy/plugins/siem/public/components/page/network/network_dns_table/index.test.tsx b/x-pack/legacy/plugins/siem/public/components/page/network/network_dns_table/index.test.tsx index ca7b859a0c092..5e2525dce2e9c 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/network/network_dns_table/index.test.tsx +++ b/x-pack/legacy/plugins/siem/public/components/page/network/network_dns_table/index.test.tsx @@ -18,7 +18,7 @@ import { NetworkDnsTable } from '.'; import { mockData } from './mock'; describe('NetworkTopNFlow Table Component', () => { - const loadMore = jest.fn(); + const loadPage = jest.fn(); const state: State = mockGlobalState; let store = createStore(state, apolloClientObservable); @@ -33,11 +33,15 @@ describe('NetworkTopNFlow Table Component', () => { @@ -55,11 +59,15 @@ describe('NetworkTopNFlow Table Component', () => { diff --git a/x-pack/legacy/plugins/siem/public/components/page/network/network_dns_table/index.tsx b/x-pack/legacy/plugins/siem/public/components/page/network/network_dns_table/index.tsx index ddff55552b505..4cf86165c9c67 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/network/network_dns_table/index.tsx +++ b/x-pack/legacy/plugins/siem/public/components/page/network/network_dns_table/index.tsx @@ -12,19 +12,21 @@ import { ActionCreator } from 'typescript-fsa'; import { networkActions } from '../../../../store/actions'; import { NetworkDnsEdges, NetworkDnsFields, NetworkDnsSortField } from '../../../../graphql/types'; import { networkModel, networkSelectors, State } from '../../../../store'; -import { Criteria, ItemsPerRow, LoadMoreTable } from '../../../load_more_table'; +import { Criteria, ItemsPerRow, PaginatedTable } from '../../../paginated_table'; import { getNetworkDnsColumns } from './columns'; import { IsPtrIncluded } from './is_ptr_included'; import * as i18n from './translations'; +const tableType = networkModel.NetworkTableType.dns; + interface OwnProps { data: NetworkDnsEdges[]; - loading: boolean; - hasNextPage: boolean; + fakeTotalCount: number; id: string; - nextCursor: string; - loadMore: (cursor: string) => void; + loading: boolean; + loadPage: (newActivePage: number) => void; + showMorePagesIndicator: boolean; totalCount: number; type: networkModel.NetworkType; } @@ -48,6 +50,10 @@ interface NetworkDnsTableDispatchProps { isPtrIncluded: boolean; networkType: networkModel.NetworkType; }>; + updateTableActivePage: ActionCreator<{ + activePage: number; + tableType: networkModel.NetworkTableType; + }>; } type NetworkDnsTableProps = OwnProps & NetworkDnsTableReduxProps & NetworkDnsTableDispatchProps; @@ -61,14 +67,6 @@ const rowItems: ItemsPerRow[] = [ text: i18n.ROWS_10, numberOfRow: 10, }, - { - text: i18n.ROWS_20, - numberOfRow: 20, - }, - { - text: i18n.ROWS_50, - numberOfRow: 50, - }, ]; class NetworkDnsTableComponent extends React.PureComponent { @@ -76,21 +74,21 @@ class NetworkDnsTableComponent extends React.PureComponent const { data, dnsSortField, - hasNextPage, + fakeTotalCount, + id, isPtrIncluded, limit, loading, - loadMore, - id, - nextCursor, + loadPage, + showMorePagesIndicator, totalCount, type, updateDnsLimit, + updateTableActivePage, } = this.props; return ( - @@ -103,14 +101,23 @@ class NetworkDnsTableComponent extends React.PureComponent limit={limit} loading={loading} loadingTitle={i18n.TOP_DNS_DOMAINS} - loadMore={() => loadMore(nextCursor)} + loadPage={newActivePage => loadPage(newActivePage)} onChange={this.onChange} pageOfItems={data} + showMorePagesIndicator={showMorePagesIndicator} sorting={{ field: `node.${dnsSortField.field}`, direction: dnsSortField.direction, }} + totalCount={fakeTotalCount} + updateActivePage={newPage => + updateTableActivePage({ + activePage: newPage, + tableType, + }) + } updateLimitPagination={newLimit => updateDnsLimit({ limit: newLimit, networkType: type })} + updateProps={{ isPtrIncluded, totalCount, dnsSortField }} /> ); } @@ -143,6 +150,7 @@ const makeMapStateToProps = () => { export const NetworkDnsTable = connect( makeMapStateToProps, { + updateTableActivePage: networkActions.updateNetworkPageTableActivePage, updateDnsLimit: networkActions.updateDnsLimit, updateDnsSort: networkActions.updateDnsSort, updateIsPtrIncluded: networkActions.updateIsPtrIncluded, diff --git a/x-pack/legacy/plugins/siem/public/components/page/network/network_dns_table/mock.ts b/x-pack/legacy/plugins/siem/public/components/page/network/network_dns_table/mock.ts index 7846afb3f00fb..29ea5f9d12588 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/network/network_dns_table/mock.ts +++ b/x-pack/legacy/plugins/siem/public/components/page/network/network_dns_table/mock.ts @@ -122,8 +122,9 @@ export const mockData: { NetworkDns: NetworkDnsData } = { }, ], pageInfo: { - endCursor: { value: '10' }, - hasNextPage: true, + activePage: 1, + fakeTotalCount: 50, + showMorePagesIndicator: true, }, }, }; diff --git a/x-pack/legacy/plugins/siem/public/components/page/network/network_dns_table/translations.ts b/x-pack/legacy/plugins/siem/public/components/page/network/network_dns_table/translations.ts index 65bcf0410686a..c641e899f1db1 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/network/network_dns_table/translations.ts +++ b/x-pack/legacy/plugins/siem/public/components/page/network/network_dns_table/translations.ts @@ -63,13 +63,3 @@ export const ROWS_10 = i18n.translate('xpack.siem.networkDnsTable.rows', { values: { numRows: 10 }, defaultMessage: '{numRows} {numRows, plural, =0 {rows} =1 {row} other {rows}}', }); - -export const ROWS_20 = i18n.translate('xpack.siem.networkDnsTable.rows', { - values: { numRows: 20 }, - defaultMessage: '{numRows} {numRows, plural, =0 {rows} =1 {row} other {rows}}', -}); - -export const ROWS_50 = i18n.translate('xpack.siem.networkDnsTable.rows', { - values: { numRows: 50 }, - defaultMessage: '{numRows} {numRows, plural, =0 {rows} =1 {row} other {rows}}', -}); diff --git a/x-pack/legacy/plugins/siem/public/components/page/network/network_top_n_flow_table/__snapshots__/index.test.tsx.snap b/x-pack/legacy/plugins/siem/public/components/page/network/network_top_n_flow_table/__snapshots__/index.test.tsx.snap index 2a24a6499326f..01921a8c255d9 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/network/network_top_n_flow_table/__snapshots__/index.test.tsx.snap +++ b/x-pack/legacy/plugins/siem/public/components/page/network/network_top_n_flow_table/__snapshots__/index.test.tsx.snap @@ -51,7 +51,7 @@ exports[`NetworkTopNFlow Table Component rendering it renders the default Networ }, ] } - hasNextPage={true} + fakeTotalCount={50} id="topNFlow" indexPattern={ Object { @@ -138,9 +138,9 @@ exports[`NetworkTopNFlow Table Component rendering it renders the default Networ "title": "filebeat-*,auditbeat-*,packetbeat-*", } } - loadMore={[MockFunction]} + loadPage={[MockFunction]} loading={false} - nextCursor="10" + showMorePagesIndicator={true} totalCount={524} type="page" /> diff --git a/x-pack/legacy/plugins/siem/public/components/page/network/network_top_n_flow_table/columns.tsx b/x-pack/legacy/plugins/siem/public/components/page/network/network_top_n_flow_table/columns.tsx index c884fc78d51c4..f087835ea7618 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/network/network_top_n_flow_table/columns.tsx +++ b/x-pack/legacy/plugins/siem/public/components/page/network/network_top_n_flow_table/columns.tsx @@ -32,20 +32,22 @@ import * as i18n from './translations'; import { getRowItemDraggables } from '../../../tables/helpers'; import { PreferenceFormattedBytes } from '../../../formatted_bytes'; -export const getNetworkTopNFlowColumns = ( - indexPattern: StaticIndexPattern, - flowDirection: FlowDirection, - flowTarget: FlowTarget, - type: networkModel.NetworkType, - tableId: string -): [ +export type NetworkTopNFlowColumns = [ Columns, Columns, Columns, Columns, Columns, Columns -] => [ +]; + +export const getNetworkTopNFlowColumns = ( + indexPattern: StaticIndexPattern, + flowDirection: FlowDirection, + flowTarget: FlowTarget, + type: networkModel.NetworkType, + tableId: string +): NetworkTopNFlowColumns => [ { name: getIpTitle(flowTarget), truncateText: false, diff --git a/x-pack/legacy/plugins/siem/public/components/page/network/network_top_n_flow_table/index.test.tsx b/x-pack/legacy/plugins/siem/public/components/page/network/network_top_n_flow_table/index.test.tsx index b293cee22dcb1..34c35f5a476b8 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/network/network_top_n_flow_table/index.test.tsx +++ b/x-pack/legacy/plugins/siem/public/components/page/network/network_top_n_flow_table/index.test.tsx @@ -24,7 +24,7 @@ import { NetworkTopNFlowTable, NetworkTopNFlowTableId } from '.'; import { mockData } from './mock'; describe('NetworkTopNFlow Table Component', () => { - const loadMore = jest.fn(); + const loadPage = jest.fn(); const state: State = mockGlobalState; let store = createStore(state, apolloClientObservable); @@ -39,12 +39,16 @@ describe('NetworkTopNFlow Table Component', () => { @@ -66,12 +70,16 @@ describe('NetworkTopNFlow Table Component', () => { @@ -103,12 +111,16 @@ describe('NetworkTopNFlow Table Component', () => { @@ -145,12 +157,16 @@ describe('NetworkTopNFlow Table Component', () => { diff --git a/x-pack/legacy/plugins/siem/public/components/page/network/network_top_n_flow_table/index.tsx b/x-pack/legacy/plugins/siem/public/components/page/network/network_top_n_flow_table/index.tsx index 7772deac6dff6..b0d7865dae3f9 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/network/network_top_n_flow_table/index.tsx +++ b/x-pack/legacy/plugins/siem/public/components/page/network/network_top_n_flow_table/index.tsx @@ -22,20 +22,22 @@ import { import { networkModel, networkSelectors, State } from '../../../../store'; import { FlowDirectionSelect } from '../../../flow_controls/flow_direction_select'; import { FlowTargetSelect } from '../../../flow_controls/flow_target_select'; -import { Criteria, ItemsPerRow, LoadMoreTable } from '../../../load_more_table'; +import { Criteria, ItemsPerRow, PaginatedTable } from '../../../paginated_table'; import { getNetworkTopNFlowColumns } from './columns'; import * as i18n from './translations'; +const tableType = networkModel.NetworkTableType.topNFlow; + interface OwnProps { data: NetworkTopNFlowEdges[]; + fakeTotalCount: number; id: string; indexPattern: StaticIndexPattern; loading: boolean; - hasNextPage: boolean; - nextCursor: string; + loadPage: (newActivePage: number) => void; + showMorePagesIndicator: boolean; totalCount: number; - loadMore: (cursor: string) => void; type: networkModel.NetworkType; } @@ -47,6 +49,10 @@ interface NetworkTopNFlowTableReduxProps { } interface NetworkTopNFlowTableDispatchProps { + updateTableActivePage: ActionCreator<{ + activePage: number; + tableType: networkModel.NetworkTableType; + }>; updateTopNFlowDirection: ActionCreator<{ flowDirection: FlowDirection; networkType: networkModel.NetworkType; @@ -77,14 +83,6 @@ const rowItems: ItemsPerRow[] = [ text: i18n.ROWS_10, numberOfRow: 10, }, - { - text: i18n.ROWS_20, - numberOfRow: 20, - }, - { - text: i18n.ROWS_50, - numberOfRow: 50, - }, ]; export const NetworkTopNFlowTableId = 'networkTopNFlow-top-talkers'; @@ -93,20 +91,21 @@ class NetworkTopNFlowTableComponent extends React.PureComponent @@ -163,13 +161,22 @@ class NetworkTopNFlowTableComponent extends React.PureComponent loadMore(nextCursor)} + loadPage={newActivePage => loadPage(newActivePage)} onChange={this.onChange} pageOfItems={data} + showMorePagesIndicator={showMorePagesIndicator} sorting={{ field, direction: topNFlowSort.direction }} + totalCount={fakeTotalCount} + updateActivePage={newPage => + updateTableActivePage({ + activePage: newPage, + tableType, + }) + } updateLimitPagination={newLimit => updateTopNFlowLimit({ limit: newLimit, networkType: type }) } + updateProps={{ flowDirection, flowTarget, totalCount, topNFlowSort, field }} /> ); } @@ -208,6 +215,7 @@ export const NetworkTopNFlowTable = connect( updateTopNFlowSort: networkActions.updateTopNFlowSort, updateTopNFlowTarget: networkActions.updateTopNFlowTarget, updateTopNFlowDirection: networkActions.updateTopNFlowDirection, + updateTableActivePage: networkActions.updateNetworkPageTableActivePage, } )(NetworkTopNFlowTableComponent); diff --git a/x-pack/legacy/plugins/siem/public/components/page/network/network_top_n_flow_table/mock.ts b/x-pack/legacy/plugins/siem/public/components/page/network/network_top_n_flow_table/mock.ts index dbb7ca6d212ff..ee8b99cf9f5ed 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/network/network_top_n_flow_table/mock.ts +++ b/x-pack/legacy/plugins/siem/public/components/page/network/network_top_n_flow_table/mock.ts @@ -47,10 +47,9 @@ export const mockData: { NetworkTopNFlow: NetworkTopNFlowData } = { }, ], pageInfo: { - endCursor: { - value: '10', - }, - hasNextPage: true, + activePage: 1, + fakeTotalCount: 50, + showMorePagesIndicator: true, }, }, }; diff --git a/x-pack/legacy/plugins/siem/public/components/page/network/network_top_n_flow_table/translations.ts b/x-pack/legacy/plugins/siem/public/components/page/network/network_top_n_flow_table/translations.ts index bd8155cb02f93..44b61603c043b 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/network/network_top_n_flow_table/translations.ts +++ b/x-pack/legacy/plugins/siem/public/components/page/network/network_top_n_flow_table/translations.ts @@ -120,13 +120,3 @@ export const ROWS_10 = i18n.translate('xpack.siem.networkTopNFlowTable.rows', { values: { numRows: 10 }, defaultMessage: '{numRows} {numRows, plural, =0 {rows} =1 {row} other {rows}}', }); - -export const ROWS_20 = i18n.translate('xpack.siem.networkTopNFlowTable.rows', { - values: { numRows: 20 }, - defaultMessage: '{numRows} {numRows, plural, =0 {rows} =1 {row} other {rows}}', -}); - -export const ROWS_50 = i18n.translate('xpack.siem.networkTopNFlowTable.rows', { - values: { numRows: 50 }, - defaultMessage: '{numRows} {numRows, plural, =0 {rows} =1 {row} other {rows}}', -}); diff --git a/x-pack/legacy/plugins/siem/public/components/page/network/tls_table/__snapshots__/index.test.tsx.snap b/x-pack/legacy/plugins/siem/public/components/page/network/tls_table/__snapshots__/index.test.tsx.snap index a06919e2b7679..4d7294e390ac6 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/network/tls_table/__snapshots__/index.test.tsx.snap +++ b/x-pack/legacy/plugins/siem/public/components/page/network/tls_table/__snapshots__/index.test.tsx.snap @@ -78,11 +78,11 @@ exports[`Tls Table Component Rendering it renders the default Domains table 1`] }, ] } - hasNextPage={false} + fakeTotalCount={50} id="tls" - loadMore={[MockFunction]} + loadPage={[MockFunction]} loading={false} - nextCursor="10" + showMorePagesIndicator={true} totalCount={1} type="details" /> diff --git a/x-pack/legacy/plugins/siem/public/components/page/network/tls_table/columns.tsx b/x-pack/legacy/plugins/siem/public/components/page/network/tls_table/columns.tsx index d67fd5c3a959a..7578c5decc851 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/network/tls_table/columns.tsx +++ b/x-pack/legacy/plugins/siem/public/components/page/network/tls_table/columns.tsx @@ -15,15 +15,15 @@ import { PreferenceFormattedDate } from '../../../formatted_date'; import * as i18n from './translations'; -export const getTlsColumns = ( - tableId: string -): [ +export type TlsColumns = [ Columns, Columns, Columns, Columns, Columns -] => [ +]; + +export const getTlsColumns = (tableId: string): TlsColumns => [ { field: 'node', name: i18n.ISSUER, diff --git a/x-pack/legacy/plugins/siem/public/components/page/network/tls_table/index.test.tsx b/x-pack/legacy/plugins/siem/public/components/page/network/tls_table/index.test.tsx index d2c47b4da54fc..9e16d313e2b50 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/network/tls_table/index.test.tsx +++ b/x-pack/legacy/plugins/siem/public/components/page/network/tls_table/index.test.tsx @@ -18,7 +18,7 @@ import { TlsTable } from '.'; import { mockTlsData } from './mock'; describe('Tls Table Component', () => { - const loadMore = jest.fn(); + const loadPage = jest.fn(); const state: State = mockGlobalState; let store = createStore(state, apolloClientObservable); @@ -33,11 +33,11 @@ describe('Tls Table Component', () => { @@ -55,11 +55,11 @@ describe('Tls Table Component', () => { diff --git a/x-pack/legacy/plugins/siem/public/components/page/network/tls_table/index.tsx b/x-pack/legacy/plugins/siem/public/components/page/network/tls_table/index.tsx index 971a7d0bdec46..6b57e13c7791d 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/network/tls_table/index.tsx +++ b/x-pack/legacy/plugins/siem/public/components/page/network/tls_table/index.tsx @@ -12,18 +12,19 @@ import { ActionCreator } from 'redux'; import { networkActions } from '../../../../store/network'; import { TlsEdges, TlsSortField, TlsFields } from '../../../../graphql/types'; import { networkModel, networkSelectors, State } from '../../../../store'; -import { Criteria, ItemsPerRow, LoadMoreTable, SortingBasicTable } from '../../../load_more_table'; +import { Criteria, ItemsPerRow, PaginatedTable, SortingBasicTable } from '../../../paginated_table'; import { getTlsColumns } from './columns'; import * as i18n from './translations'; +const tableType = networkModel.IpDetailsTableType.tls; interface OwnProps { data: TlsEdges[]; - loading: boolean; - hasNextPage: boolean; + fakeTotalCount: number; id: string; - nextCursor: string; + loading: boolean; + loadPage: (newActivePage: number) => void; + showMorePagesIndicator: boolean; totalCount: number; - loadMore: (cursor: string) => void; type: networkModel.NetworkType; } @@ -33,6 +34,10 @@ interface TlsTableReduxProps { } interface TlsTableDispatchProps { + updateTableActivePage: ActionCreator<{ + activePage: number; + tableType: networkModel.IpDetailsTableType; + }>; updateTlsLimit: ActionCreator<{ limit: number; networkType: networkModel.NetworkType; @@ -54,14 +59,6 @@ const rowItems: ItemsPerRow[] = [ text: i18n.ROWS_10, numberOfRow: 10, }, - { - text: i18n.ROWS_20, - numberOfRow: 20, - }, - { - text: i18n.ROWS_50, - numberOfRow: 50, - }, ]; export const tlsTableId = 'tls-table'; @@ -70,21 +67,22 @@ class TlsTableComponent extends React.PureComponent { public render() { const { data, - tlsSortField, - hasNextPage, + fakeTotalCount, + id, limit, loading, - loadMore, - id, + loadPage, + showMorePagesIndicator, + tlsSortField, totalCount, - nextCursor, - updateTlsLimit, type, + updateTableActivePage, + updateTlsLimit, } = this.props; return ( - { limit={limit} loading={loading} loadingTitle={i18n.TRANSPORT_LAYER_SECURITY} - loadMore={() => loadMore(nextCursor)} + loadPage={newActivePage => loadPage(newActivePage)} onChange={this.onChange} pageOfItems={data} sorting={getSortField(tlsSortField)} + totalCount={fakeTotalCount} + updateActivePage={newPage => + updateTableActivePage({ + activePage: newPage, + tableType, + }) + } updateLimitPagination={newLimit => updateTlsLimit({ limit: newLimit, networkType: type })} + updateProps={{ tlsSortField, totalCount }} /> ); } @@ -129,6 +135,7 @@ const makeMapStateToProps = () => { export const TlsTable = connect( makeMapStateToProps, { + updateTableActivePage: networkActions.updateIpDetailsTableActivePage, updateTlsLimit: networkActions.updateTlsLimit, updateTlsSort: networkActions.updateTlsSort, } diff --git a/x-pack/legacy/plugins/siem/public/components/page/network/tls_table/mock.ts b/x-pack/legacy/plugins/siem/public/components/page/network/tls_table/mock.ts index c30aaa3a590e4..77148bf50c038 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/network/tls_table/mock.ts +++ b/x-pack/legacy/plugins/siem/public/components/page/network/tls_table/mock.ts @@ -50,9 +50,8 @@ export const mockTlsData: TlsData = { }, ], pageInfo: { - endCursor: { - value: '10', - }, - hasNextPage: false, + activePage: 1, + fakeTotalCount: 50, + showMorePagesIndicator: true, }, }; diff --git a/x-pack/legacy/plugins/siem/public/components/page/network/tls_table/translations.ts b/x-pack/legacy/plugins/siem/public/components/page/network/tls_table/translations.ts index 47e8607c38dac..eaed9485385b2 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/network/tls_table/translations.ts +++ b/x-pack/legacy/plugins/siem/public/components/page/network/tls_table/translations.ts @@ -63,16 +63,6 @@ export const ROWS_10 = i18n.translate('xpack.siem.network.ipDetails.tlsTable.row defaultMessage: '{numRows} {numRows, plural, =0 {rows} =1 {row} other {rows}}', }); -export const ROWS_20 = i18n.translate('xpack.siem.network.ipDetails.tlsTable.rows', { - values: { numRows: 20 }, - defaultMessage: '{numRows} {numRows, plural, =0 {rows} =1 {row} other {rows}}', -}); - -export const ROWS_50 = i18n.translate('xpack.siem.network.ipDetails.tlsTable.rows', { - values: { numRows: 50 }, - defaultMessage: '{numRows} {numRows, plural, =0 {rows} =1 {row} other {rows}}', -}); - export const MORE = i18n.translate('xpack.siem.network.ipDetails.tlsTable.moreDescription', { defaultMessage: 'More ...', }); diff --git a/x-pack/legacy/plugins/siem/public/components/page/network/users_table/__snapshots__/index.test.tsx.snap b/x-pack/legacy/plugins/siem/public/components/page/network/users_table/__snapshots__/index.test.tsx.snap index 031234c552dbc..9e731d8b05eb8 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/network/users_table/__snapshots__/index.test.tsx.snap +++ b/x-pack/legacy/plugins/siem/public/components/page/network/users_table/__snapshots__/index.test.tsx.snap @@ -70,12 +70,12 @@ exports[`Users Table Component Rendering it renders the default Users table 1`] }, ] } + fakeTotalCount={3} flowTarget="source" - hasNextPage={false} id="user" - loadMore={[MockFunction]} + loadPage={[MockFunction]} loading={false} - nextCursor="10" + showMorePagesIndicator={true} totalCount={1} type="details" /> diff --git a/x-pack/legacy/plugins/siem/public/components/page/network/users_table/columns.tsx b/x-pack/legacy/plugins/siem/public/components/page/network/users_table/columns.tsx index 497f10eb209c5..b17ec74fa0540 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/network/users_table/columns.tsx +++ b/x-pack/legacy/plugins/siem/public/components/page/network/users_table/columns.tsx @@ -11,16 +11,15 @@ import { Columns } from '../../../load_more_table'; import * as i18n from './translations'; import { getRowItemDraggables, getRowItemDraggable } from '../../../tables/helpers'; -export const getUsersColumns = ( - flowTarget: FlowTarget, - tableId: string -): [ +export type UsersColumns = [ Columns, Columns, Columns, Columns, Columns -] => [ +]; + +export const getUsersColumns = (flowTarget: FlowTarget, tableId: string): UsersColumns => [ { field: 'node.user.name', name: i18n.USER_NAME, diff --git a/x-pack/legacy/plugins/siem/public/components/page/network/users_table/index.test.tsx b/x-pack/legacy/plugins/siem/public/components/page/network/users_table/index.test.tsx index 56ee4ac3e1501..75aa472f4a9e6 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/network/users_table/index.test.tsx +++ b/x-pack/legacy/plugins/siem/public/components/page/network/users_table/index.test.tsx @@ -19,7 +19,7 @@ import { UsersTable } from '.'; import { mockUsersData } from './mock'; describe('Users Table Component', () => { - const loadMore = jest.fn(); + const loadPage = jest.fn(); const state: State = mockGlobalState; let store = createStore(state, apolloClientObservable); @@ -35,11 +35,11 @@ describe('Users Table Component', () => { @@ -58,11 +58,15 @@ describe('Users Table Component', () => { diff --git a/x-pack/legacy/plugins/siem/public/components/page/network/users_table/index.tsx b/x-pack/legacy/plugins/siem/public/components/page/network/users_table/index.tsx index 8d9e8baedf0bc..d8a5007e6e647 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/network/users_table/index.tsx +++ b/x-pack/legacy/plugins/siem/public/components/page/network/users_table/index.tsx @@ -12,21 +12,22 @@ import { ActionCreator } from 'redux'; import { networkActions } from '../../../../store/network'; import { FlowTarget, UsersEdges, UsersFields, UsersSortField } from '../../../../graphql/types'; import { networkModel, networkSelectors, State } from '../../../../store'; -import { Criteria, ItemsPerRow, LoadMoreTable, SortingBasicTable } from '../../../load_more_table'; +import { Criteria, ItemsPerRow, PaginatedTable, SortingBasicTable } from '../../../paginated_table'; import { getUsersColumns } from './columns'; import * as i18n from './translations'; import { assertUnreachable } from '../../../../lib/helpers'; +const tableType = networkModel.IpDetailsTableType.users; interface OwnProps { data: UsersEdges[]; flowTarget: FlowTarget; - loading: boolean; - hasNextPage: boolean; + fakeTotalCount: number; id: string; - nextCursor: string; + loading: boolean; + loadPage: (newActivePage: number) => void; + showMorePagesIndicator: boolean; totalCount: number; - loadMore: (cursor: string) => void; type: networkModel.NetworkType; } @@ -36,6 +37,10 @@ interface UsersTableReduxProps { } interface UsersTableDispatchProps { + updateTableActivePage: ActionCreator<{ + activePage: number; + tableType: networkModel.IpDetailsTableType; + }>; updateUsersLimit: ActionCreator<{ limit: number; networkType: networkModel.NetworkType; @@ -57,14 +62,6 @@ const rowItems: ItemsPerRow[] = [ text: i18n.ROWS_10, numberOfRow: 10, }, - { - text: i18n.ROWS_20, - numberOfRow: 20, - }, - { - text: i18n.ROWS_50, - numberOfRow: 50, - }, ]; export const usersTableId = 'users-table'; @@ -73,23 +70,24 @@ class UsersTableComponent extends React.PureComponent { public render() { const { data, - usersSortField, - hasNextPage, + fakeTotalCount, + flowTarget, + id, limit, loading, - loadMore, - id, + loadPage, + showMorePagesIndicator, totalCount, - nextCursor, - updateUsersLimit, - flowTarget, type, + updateTableActivePage, + updateUsersLimit, + usersSortField, } = this.props; return ( - { limit={limit} loading={loading} loadingTitle={i18n.USERS} - loadMore={() => loadMore(nextCursor)} + loadPage={newActivePage => loadPage(newActivePage)} onChange={this.onChange} pageOfItems={data} sorting={getSortField(usersSortField)} + totalCount={fakeTotalCount} + updateActivePage={newPage => + updateTableActivePage({ + activePage: newPage, + tableType, + }) + } updateLimitPagination={newLimit => updateUsersLimit({ limit: newLimit, networkType: type })} + updateProps={{ flowTarget, totalCount, usersSortField }} /> ); } @@ -134,6 +140,7 @@ const makeMapStateToProps = () => { export const UsersTable = connect( makeMapStateToProps, { + updateTableActivePage: networkActions.updateIpDetailsTableActivePage, updateUsersLimit: networkActions.updateUsersLimit, updateUsersSort: networkActions.updateUsersSort, } diff --git a/x-pack/legacy/plugins/siem/public/components/page/network/users_table/mock.ts b/x-pack/legacy/plugins/siem/public/components/page/network/users_table/mock.ts index d9e12b6d7da36..9a5de66a91a3e 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/network/users_table/mock.ts +++ b/x-pack/legacy/plugins/siem/public/components/page/network/users_table/mock.ts @@ -59,10 +59,8 @@ export const mockUsersData: UsersData = { ], totalCount: 3, pageInfo: { - endCursor: { - value: '10', - tiebreaker: null, - }, - hasNextPage: false, + activePage: 1, + fakeTotalCount: 3, + showMorePagesIndicator: true, }, }; diff --git a/x-pack/legacy/plugins/siem/public/components/page/network/users_table/translations.ts b/x-pack/legacy/plugins/siem/public/components/page/network/users_table/translations.ts index dffd3b90e31f3..f7fe07510f6ba 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/network/users_table/translations.ts +++ b/x-pack/legacy/plugins/siem/public/components/page/network/users_table/translations.ts @@ -63,16 +63,6 @@ export const ROWS_10 = i18n.translate('xpack.siem.network.ipDetails.usersTable.r defaultMessage: '{numRows} {numRows, plural, =0 {rows} =1 {row} other {rows}}', }); -export const ROWS_20 = i18n.translate('xpack.siem.network.ipDetails.usersTable.rows', { - values: { numRows: 20 }, - defaultMessage: '{numRows} {numRows, plural, =0 {rows} =1 {row} other {rows}}', -}); - -export const ROWS_50 = i18n.translate('xpack.siem.network.ipDetails.usersTable.rows', { - values: { numRows: 50 }, - defaultMessage: '{numRows} {numRows, plural, =0 {rows} =1 {row} other {rows}}', -}); - export const MORE = i18n.translate('xpack.siem.network.ipDetails.usersTable.moreDescription', { defaultMessage: 'More ...', }); diff --git a/x-pack/legacy/plugins/siem/public/components/paginated_table/index.tsx b/x-pack/legacy/plugins/siem/public/components/paginated_table/index.tsx index 0ad5f6daa8157..126025d1a7cbc 100644 --- a/x-pack/legacy/plugins/siem/public/components/paginated_table/index.tsx +++ b/x-pack/legacy/plugins/siem/public/components/paginated_table/index.tsx @@ -21,6 +21,14 @@ import styled from 'styled-components'; import { Direction } from '../../graphql/types'; import { AuthTableColumns } from '../page/hosts/authentications_table'; +import { DomainsColumns } from '../page/network/domains_table/columns'; +import { EventsTableColumns } from '../page/hosts/events_table'; +import { HostsTableColumns } from '../page/hosts/hosts_table'; +import { NetworkDnsColumns } from '../page/network/network_dns_table/columns'; +import { NetworkTopNFlowColumns } from '../page/network/network_top_n_flow_table/columns'; +import { TlsColumns } from '../page/network/tls_table/columns'; +import { UncommonProcessTableColumns } from '../page/hosts/uncommon_process_table'; +import { UsersColumns } from '../page/network/users_table/columns'; import { HeaderPanel } from '../header_panel'; import { LoadingPanel } from '../loading'; import { useStateToaster } from '../toasters'; @@ -46,14 +54,25 @@ export interface Criteria { sort?: SortingBasicTable; } -declare type HostsTableColumns = [ +declare type HostsTableColumnsTest = [ Columns, Columns, Columns, Columns ]; -declare type BasicTableColumns = AuthTableColumns | HostsTableColumns; +declare type BasicTableColumns = + | AuthTableColumns + | DomainsColumns + | DomainsColumns + | EventsTableColumns + | HostsTableColumns + | HostsTableColumnsTest + | NetworkDnsColumns + | NetworkTopNFlowColumns + | TlsColumns + | UncommonProcessTableColumns + | UsersColumns; declare type SiemTables = BasicTableProps; @@ -133,6 +152,12 @@ export const PaginatedTable = memo( } }, effectDeps); + useEffect(() => { + if (!isEmpty(pageOfItems) && isEmptyTable) { + setEmptyTable(false); + } + }, [pageOfItems]); + const onButtonClick = () => { setPopoverOpen(!isPopoverOpen); }; @@ -160,9 +185,7 @@ export const PaginatedTable = memo( loadPage(newActivePage); updateActivePage(newActivePage); }; - if (!isEmpty(pageOfItems) && isEmptyTable) { - setEmptyTable(false); - } + if (loading && isEmptyTable) { return ( diff --git a/x-pack/legacy/plugins/siem/public/components/timeline/footer/mock.ts b/x-pack/legacy/plugins/siem/public/components/timeline/footer/mock.ts index e0f210c692a1f..f6aaf9475f2c4 100644 --- a/x-pack/legacy/plugins/siem/public/components/timeline/footer/mock.ts +++ b/x-pack/legacy/plugins/siem/public/components/timeline/footer/mock.ts @@ -4,9 +4,9 @@ * you may not use this file except in compliance with the Elastic License. */ -import { EventsData } from '../../../graphql/types'; +import { EventsTimelineData } from '../../../graphql/types'; -export const mockData: { Events: EventsData } = { +export const mockData: { Events: EventsTimelineData } = { Events: { totalCount: 15546, pageInfo: { diff --git a/x-pack/legacy/plugins/siem/public/containers/authentications/index.tsx b/x-pack/legacy/plugins/siem/public/containers/authentications/index.tsx index c18eaf7942b10..35b6bca987bec 100644 --- a/x-pack/legacy/plugins/siem/public/containers/authentications/index.tsx +++ b/x-pack/legacy/plugins/siem/public/containers/authentications/index.tsx @@ -26,14 +26,14 @@ import { authenticationsQuery } from './index.gql_query'; const ID = 'authenticationQuery'; export interface AuthenticationArgs { + authentications: AuthenticationsEdges[]; id: string; inspect: inputsModel.InspectQuery; - authentications: AuthenticationsEdges[]; - totalCount: number; - pageInfo: PageInfoPaginated; loading: boolean; loadPage: (newActivePage: number) => void; + pageInfo: PageInfoPaginated; refetch: inputsModel.Refetch; + totalCount: number; } export interface OwnProps extends QueryTemplatePaginatedProps { diff --git a/x-pack/legacy/plugins/siem/public/containers/domains/index.gql_query.ts b/x-pack/legacy/plugins/siem/public/containers/domains/index.gql_query.ts index bfca7fe1d7877..8266a83bcad5e 100644 --- a/x-pack/legacy/plugins/siem/public/containers/domains/index.gql_query.ts +++ b/x-pack/legacy/plugins/siem/public/containers/domains/index.gql_query.ts @@ -13,7 +13,7 @@ export const domainsQuery = gql` $flowDirection: FlowDirection! $flowTarget: FlowTarget! $ip: String! - $pagination: PaginationInput! + $pagination: PaginationInputPaginated! $sort: DomainsSortField! $timerange: TimerangeInput! $defaultIndex: [String!]! @@ -57,10 +57,9 @@ export const domainsQuery = gql` } } pageInfo { - endCursor { - value - } - hasNextPage + activePage + fakeTotalCount + showMorePagesIndicator } inspect @include(if: $inspect) { dsl diff --git a/x-pack/legacy/plugins/siem/public/containers/domains/index.tsx b/x-pack/legacy/plugins/siem/public/containers/domains/index.tsx index 586a795cd2a90..7f71a4356b078 100644 --- a/x-pack/legacy/plugins/siem/public/containers/domains/index.tsx +++ b/x-pack/legacy/plugins/siem/public/containers/domains/index.tsx @@ -17,28 +17,28 @@ import { GetDomainsQuery, FlowDirection, FlowTarget, - PageInfo, + PageInfoPaginated, } from '../../graphql/types'; import { inputsModel, networkModel, networkSelectors, State, inputsSelectors } from '../../store'; import { createFilter } from '../helpers'; -import { QueryTemplate, QueryTemplateProps } from '../query_template'; - +import { generateTablePaginationOptions } from '../../components/paginated_table/helpers'; +import { QueryTemplatePaginated, QueryTemplatePaginatedProps } from '../query_template_paginated'; import { domainsQuery } from './index.gql_query'; const ID = 'domainsQuery'; export interface DomainsArgs { + domains: DomainsEdges[]; id: string; inspect: inputsModel.InspectQuery; - domains: DomainsEdges[]; - totalCount: number; - pageInfo: PageInfo; loading: boolean; - loadMore: (cursor: string) => void; + loadPage: (newActivePage: number) => void; + pageInfo: PageInfoPaginated; refetch: inputsModel.Refetch; + totalCount: number; } -export interface OwnProps extends QueryTemplateProps { +export interface OwnProps extends QueryTemplatePaginatedProps { children: (args: DomainsArgs) => React.ReactNode; flowTarget: FlowTarget; ip: string; @@ -46,34 +46,36 @@ export interface OwnProps extends QueryTemplateProps { } export interface DomainsComponentReduxProps { - isInspected: boolean; - limit: number; + activePage: number; domainsSortField: DomainsSortField; flowDirection: FlowDirection; + isInspected: boolean; + limit: number; } type DomainsProps = OwnProps & DomainsComponentReduxProps; -class DomainsComponentQuery extends QueryTemplate< +class DomainsComponentQuery extends QueryTemplatePaginated< DomainsProps, GetDomainsQuery.Query, GetDomainsQuery.Variables > { public render() { const { - id = ID, - isInspected, + activePage, children, domainsSortField, + endDate, filterQuery, + flowDirection, + flowTarget, + id = ID, ip, + isInspected, + limit, skip, sourceId, startDate, - endDate, - limit, - flowTarget, - flowDirection, } = this.props; return ( @@ -82,35 +84,28 @@ class DomainsComponentQuery extends QueryTemplate< notifyOnNetworkStatusChange skip={skip} variables={{ + defaultIndex: chrome.getUiSettingsClient().get(DEFAULT_INDEX_KEY), + filterQuery: createFilter(filterQuery), + flowDirection, + flowTarget, + inspect: isInspected, + ip, + pagination: generateTablePaginationOptions(activePage, limit), + sort: domainsSortField, sourceId, timerange: { interval: '12h', from: startDate!, to: endDate!, }, - ip, - flowDirection, - flowTarget, - sort: domainsSortField, - pagination: { - limit, - cursor: null, - tiebreaker: null, - }, - filterQuery: createFilter(filterQuery), - defaultIndex: chrome.getUiSettingsClient().get(DEFAULT_INDEX_KEY), - inspect: isInspected, }} > {({ data, loading, fetchMore, refetch }) => { const domains = getOr([], `source.Domains.edges`, data); this.setFetchMore(fetchMore); - this.setFetchMoreOptions((newCursor: string) => ({ + this.setFetchMoreOptions((newActivePage: number) => ({ variables: { - pagination: { - cursor: newCursor, - limit: limit + parseInt(newCursor, 10), - }, + pagination: generateTablePaginationOptions(newActivePage, limit), }, updateQuery: (prev, { fetchMoreResult }) => { if (!fetchMoreResult) { @@ -122,21 +117,21 @@ class DomainsComponentQuery extends QueryTemplate< ...fetchMoreResult.source, Domains: { ...fetchMoreResult.source.Domains, - edges: [...prev.source.Domains.edges, ...fetchMoreResult.source.Domains.edges], + edges: [...fetchMoreResult.source.Domains.edges], }, }, }; }, })); return children({ + domains, id, inspect: getOr(null, 'source.Domains.inspect', data), - refetch, loading, - totalCount: getOr(0, 'source.Domains.totalCount', data), - domains, + loadPage: this.wrappedLoadMore, pageInfo: getOr({}, 'source.Domains.pageInfo', data), - loadMore: this.wrappedLoadMore, + refetch, + totalCount: getOr(0, 'source.Domains.totalCount', data), }); }} diff --git a/x-pack/legacy/plugins/siem/public/containers/events/index.gql_query.ts b/x-pack/legacy/plugins/siem/public/containers/events/index.gql_query.ts index 1b2e0cf69cc1e..c8610dcd39add 100644 --- a/x-pack/legacy/plugins/siem/public/containers/events/index.gql_query.ts +++ b/x-pack/legacy/plugins/siem/public/containers/events/index.gql_query.ts @@ -10,7 +10,7 @@ export const eventsQuery = gql` query GetEventsQuery( $sourceId: ID! $timerange: TimerangeInput! - $pagination: PaginationInput! + $pagination: PaginationInputPaginated! $sortField: SortField! $filterQuery: String $defaultIndex: [String!]! @@ -27,11 +27,9 @@ export const eventsQuery = gql` ) { totalCount pageInfo { - endCursor { - value - tiebreaker - } - hasNextPage + activePage + fakeTotalCount + showMorePagesIndicator } inspect @include(if: $inspect) { dsl diff --git a/x-pack/legacy/plugins/siem/public/containers/events/index.tsx b/x-pack/legacy/plugins/siem/public/containers/events/index.tsx index 3a1bc685b5a21..6bdf9cece4a89 100644 --- a/x-pack/legacy/plugins/siem/public/containers/events/index.tsx +++ b/x-pack/legacy/plugins/siem/public/containers/events/index.tsx @@ -11,46 +11,49 @@ import { connect } from 'react-redux'; import chrome from 'ui/chrome'; import { DEFAULT_INDEX_KEY } from '../../../common/constants'; -import { Direction, Ecs, GetEventsQuery, PageInfo } from '../../graphql/types'; +import { Direction, Ecs, GetEventsQuery, PageInfoPaginated } from '../../graphql/types'; import { hostsModel, hostsSelectors, inputsModel, State, inputsSelectors } from '../../store'; import { createFilter, getDefaultFetchPolicy } from '../helpers'; -import { QueryTemplate, QueryTemplateProps } from '../query_template'; - +import { QueryTemplatePaginated, QueryTemplatePaginatedProps } from '../query_template_paginated'; +import { generateTablePaginationOptions } from '../../components/paginated_table/helpers'; import { eventsQuery } from './index.gql_query'; const ID = 'eventsQuery'; export interface EventsArgs { + events: Ecs[]; id: string; inspect: inputsModel.InspectQuery; - events: Ecs[]; loading: boolean; - loadMore: (cursor: string, tiebreaker: string) => void; - pageInfo: PageInfo; + loadPage: (newActivePage: number) => void; + pageInfo: PageInfoPaginated; refetch: inputsModel.Refetch; totalCount: number; } -export interface OwnProps extends QueryTemplateProps { +export interface OwnProps extends QueryTemplatePaginatedProps { children?: (args: EventsArgs) => React.ReactNode; type: hostsModel.HostsType; } export interface EventsComponentReduxProps { + activePage: number; isInspected: boolean; limit: number; } type EventsProps = OwnProps & EventsComponentReduxProps; -class EventsComponentQuery extends QueryTemplate< +class EventsComponentQuery extends QueryTemplatePaginated< EventsProps, GetEventsQuery.Query, GetEventsQuery.Variables > { public render() { const { + activePage, children, + endDate, filterQuery, id = ID, isInspected, @@ -58,7 +61,6 @@ class EventsComponentQuery extends QueryTemplate< skip, sourceId, startDate, - endDate, } = this.props; return ( @@ -67,36 +69,28 @@ class EventsComponentQuery extends QueryTemplate< notifyOnNetworkStatusChange skip={skip} variables={{ + defaultIndex: chrome.getUiSettingsClient().get(DEFAULT_INDEX_KEY), filterQuery: createFilter(filterQuery), - sourceId, - pagination: { - limit, - cursor: null, - tiebreaker: null, - }, + inspect: isInspected, + pagination: generateTablePaginationOptions(activePage, limit), sortField: { sortFieldId: 'timestamp', direction: Direction.desc, }, + sourceId, timerange: { interval: '12h', from: startDate!, to: endDate!, }, - defaultIndex: chrome.getUiSettingsClient().get(DEFAULT_INDEX_KEY), - inspect: isInspected, }} > {({ data, loading, fetchMore, refetch }) => { const events = getOr([], 'source.Events.edges', data); this.setFetchMore(fetchMore); - this.setFetchMoreOptions((newCursor: string, tiebreaker?: string) => ({ + this.setFetchMoreOptions((newActivePage: number) => ({ variables: { - pagination: { - cursor: newCursor, - tiebreaker, - limit, - }, + pagination: generateTablePaginationOptions(newActivePage, limit), }, updateQuery: (prev, { fetchMoreResult }) => { if (!fetchMoreResult) { @@ -108,21 +102,21 @@ class EventsComponentQuery extends QueryTemplate< ...fetchMoreResult.source, Events: { ...fetchMoreResult.source.Events, - edges: [...prev.source.Events.edges, ...fetchMoreResult.source.Events.edges], + edges: [...fetchMoreResult.source.Events.edges], }, }, }; }, })); return children!({ + events, id, inspect: getOr(null, 'source.Events.inspect', data), - refetch, loading, - totalCount: getOr(0, 'source.Events.totalCount', data), + loadPage: this.wrappedLoadMore, pageInfo: getOr({}, 'source.Events.pageInfo', data), - events, - loadMore: this.wrappedLoadMore, + refetch, + totalCount: getOr(0, 'source.Events.totalCount', data), }); }} diff --git a/x-pack/legacy/plugins/siem/public/containers/hosts/hosts_table.gql_query.ts b/x-pack/legacy/plugins/siem/public/containers/hosts/hosts_table.gql_query.ts index e5c8fe35fdfa6..672ea70b09ad2 100644 --- a/x-pack/legacy/plugins/siem/public/containers/hosts/hosts_table.gql_query.ts +++ b/x-pack/legacy/plugins/siem/public/containers/hosts/hosts_table.gql_query.ts @@ -10,7 +10,7 @@ export const HostsTableQuery = gql` query GetHostsTableQuery( $sourceId: ID! $timerange: TimerangeInput! - $pagination: PaginationInput! + $pagination: PaginationInputPaginated! $sort: HostsSortField! $filterQuery: String $defaultIndex: [String!]! @@ -44,10 +44,9 @@ export const HostsTableQuery = gql` } } pageInfo { - endCursor { - value - } - hasNextPage + activePage + fakeTotalCount + showMorePagesIndicator } inspect @include(if: $inspect) { dsl diff --git a/x-pack/legacy/plugins/siem/public/containers/hosts/index.tsx b/x-pack/legacy/plugins/siem/public/containers/hosts/index.tsx index 4b63ce9535857..a5dae9219623b 100644 --- a/x-pack/legacy/plugins/siem/public/containers/hosts/index.tsx +++ b/x-pack/legacy/plugins/siem/public/containers/hosts/index.tsx @@ -17,32 +17,33 @@ import { GetHostsTableQuery, HostsEdges, HostsFields, - PageInfo, + PageInfoPaginated, } from '../../graphql/types'; import { hostsModel, hostsSelectors, inputsModel, State, inputsSelectors } from '../../store'; import { createFilter } from '../helpers'; -import { QueryTemplate, QueryTemplateProps } from '../query_template'; +import { QueryTemplatePaginated, QueryTemplatePaginatedProps } from '../query_template_paginated'; import { HostsTableQuery } from './hosts_table.gql_query'; +import { generateTablePaginationOptions } from '../../components/paginated_table/helpers'; export { HostsFilter } from './filter'; const ID = 'hostsQuery'; export interface HostsArgs { + endDate: number; + hosts: HostsEdges[]; id: string; inspect: inputsModel.InspectQuery; - hosts: HostsEdges[]; - totalCount: number; - pageInfo: PageInfo; loading: boolean; - loadMore: (cursor: string) => void; + loadPage: (newActivePage: number) => void; + pageInfo: PageInfoPaginated; refetch: inputsModel.Refetch; startDate: number; - endDate: number; + totalCount: number; } -export interface OwnProps extends QueryTemplateProps { +export interface OwnProps extends QueryTemplatePaginatedProps { children: (args: HostsArgs) => React.ReactNode; type: hostsModel.HostsType; startDate: number; @@ -50,6 +51,7 @@ export interface OwnProps extends QueryTemplateProps { } export interface HostsComponentReduxProps { + activePage: number; isInspected: boolean; limit: number; sortField: HostsFields; @@ -58,7 +60,7 @@ export interface HostsComponentReduxProps { type HostsProps = OwnProps & HostsComponentReduxProps; -class HostsComponentQuery extends QueryTemplate< +class HostsComponentQuery extends QueryTemplatePaginated< HostsProps, GetHostsTableQuery.Query, GetHostsTableQuery.Variables @@ -75,6 +77,7 @@ class HostsComponentQuery extends QueryTemplate< public render() { const { + activePage, id = ID, isInspected, children, @@ -99,11 +102,7 @@ class HostsComponentQuery extends QueryTemplate< direction, field: sortField, }, - pagination: { - limit, - cursor: null, - tiebreaker: null, - }, + pagination: generateTablePaginationOptions(activePage, limit), filterQuery: createFilter(filterQuery), defaultIndex: chrome.getUiSettingsClient().get(DEFAULT_INDEX_KEY), inspect: isInspected, @@ -118,12 +117,9 @@ class HostsComponentQuery extends QueryTemplate< > {({ data, loading, fetchMore, refetch }) => { this.setFetchMore(fetchMore); - this.setFetchMoreOptions((newCursor: string) => ({ + this.setFetchMoreOptions((newActivePage: number) => ({ variables: { - pagination: { - cursor: newCursor, - limit: limit + parseInt(newCursor, 10), - }, + pagination: generateTablePaginationOptions(newActivePage, limit), }, updateQuery: (prev, { fetchMoreResult }) => { if (!fetchMoreResult) { @@ -135,23 +131,23 @@ class HostsComponentQuery extends QueryTemplate< ...fetchMoreResult.source, Hosts: { ...fetchMoreResult.source.Hosts, - edges: [...prev.source.Hosts.edges, ...fetchMoreResult.source.Hosts.edges], + edges: [...fetchMoreResult.source.Hosts.edges], }, }, }; }, })); return children({ + endDate, + hosts: this.memoizedHosts(JSON.stringify(variables), get('source', data)), id, inspect: getOr(null, 'source.Hosts.inspect', data), - refetch, loading, - totalCount: getOr(0, 'source.Hosts.totalCount', data), - hosts: this.memoizedHosts(JSON.stringify(variables), get('source', data)), - startDate, - endDate, + loadPage: this.wrappedLoadMore, pageInfo: getOr({}, 'source.Hosts.pageInfo', data), - loadMore: this.wrappedLoadMore, + refetch, + startDate, + totalCount: getOr(0, 'source.Hosts.totalCount', data), }); }} diff --git a/x-pack/legacy/plugins/siem/public/containers/network_dns/index.gql_query.ts b/x-pack/legacy/plugins/siem/public/containers/network_dns/index.gql_query.ts index 03c547257634f..365d93ee7e756 100644 --- a/x-pack/legacy/plugins/siem/public/containers/network_dns/index.gql_query.ts +++ b/x-pack/legacy/plugins/siem/public/containers/network_dns/index.gql_query.ts @@ -12,7 +12,7 @@ export const networkDnsQuery = gql` $sort: NetworkDnsSortField! $isPtrIncluded: Boolean! $timerange: TimerangeInput! - $pagination: PaginationInput! + $pagination: PaginationInputPaginated! $filterQuery: String $defaultIndex: [String!]! $inspect: Boolean! @@ -42,10 +42,9 @@ export const networkDnsQuery = gql` } } pageInfo { - endCursor { - value - } - hasNextPage + activePage + fakeTotalCount + showMorePagesIndicator } inspect @include(if: $inspect) { dsl diff --git a/x-pack/legacy/plugins/siem/public/containers/network_dns/index.tsx b/x-pack/legacy/plugins/siem/public/containers/network_dns/index.tsx index 1c9b7beaa3dfb..3eca8ee08d07a 100644 --- a/x-pack/legacy/plugins/siem/public/containers/network_dns/index.tsx +++ b/x-pack/legacy/plugins/siem/public/containers/network_dns/index.tsx @@ -15,12 +15,12 @@ import { GetNetworkDnsQuery, NetworkDnsEdges, NetworkDnsSortField, - PageInfo, + PageInfoPaginated, } from '../../graphql/types'; import { inputsModel, networkModel, networkSelectors, State, inputsSelectors } from '../../store'; +import { generateTablePaginationOptions } from '../../components/paginated_table/helpers'; import { createFilter } from '../helpers'; -import { QueryTemplate, QueryTemplateProps } from '../query_template'; - +import { QueryTemplatePaginated, QueryTemplatePaginatedProps } from '../query_template_paginated'; import { networkDnsQuery } from './index.gql_query'; const ID = 'networkDnsQuery'; @@ -28,81 +28,76 @@ const ID = 'networkDnsQuery'; export interface NetworkDnsArgs { id: string; inspect: inputsModel.InspectQuery; - networkDns: NetworkDnsEdges[]; - totalCount: number; - pageInfo: PageInfo; loading: boolean; - loadMore: (cursor: string) => void; + loadPage: (newActivePage: number) => void; + networkDns: NetworkDnsEdges[]; + pageInfo: PageInfoPaginated; refetch: inputsModel.Refetch; + totalCount: number; } -export interface OwnProps extends QueryTemplateProps { +export interface OwnProps extends QueryTemplatePaginatedProps { children: (args: NetworkDnsArgs) => React.ReactNode; type: networkModel.NetworkType; } export interface NetworkDnsComponentReduxProps { - isInspected: boolean; - limit: number; + activePage: number; dnsSortField: NetworkDnsSortField; + isInspected: boolean; isPtrIncluded: boolean; + limit: number; } type NetworkDnsProps = OwnProps & NetworkDnsComponentReduxProps; -class NetworkDnsComponentQuery extends QueryTemplate< +class NetworkDnsComponentQuery extends QueryTemplatePaginated< NetworkDnsProps, GetNetworkDnsQuery.Query, GetNetworkDnsQuery.Variables > { public render() { const { - id = ID, - isInspected, + activePage, children, dnsSortField, + endDate, filterQuery, + id = ID, + isInspected, isPtrIncluded, + limit, skip, sourceId, startDate, - endDate, - limit, } = this.props; return ( - query={networkDnsQuery} fetchPolicy="cache-and-network" notifyOnNetworkStatusChange + query={networkDnsQuery} skip={skip} variables={{ + defaultIndex: chrome.getUiSettingsClient().get(DEFAULT_INDEX_KEY), + filterQuery: createFilter(filterQuery), + inspect: isInspected, + isPtrIncluded, + pagination: generateTablePaginationOptions(activePage, limit), + sort: dnsSortField, sourceId, timerange: { interval: '12h', from: startDate!, to: endDate!, }, - sort: dnsSortField, - isPtrIncluded, - pagination: { - limit, - cursor: null, - tiebreaker: null, - }, - filterQuery: createFilter(filterQuery), - defaultIndex: chrome.getUiSettingsClient().get(DEFAULT_INDEX_KEY), - inspect: isInspected, }} > {({ data, loading, fetchMore, refetch }) => { const networkDns = getOr([], `source.NetworkDns.edges`, data); this.setFetchMore(fetchMore); - this.setFetchMoreOptions((newCursor: string) => ({ + this.setFetchMoreOptions((newActivePage: number) => ({ variables: { - pagination: { - cursor: newCursor, - limit: limit + parseInt(newCursor, 10), - }, + pagination: generateTablePaginationOptions(newActivePage, limit), }, updateQuery: (prev, { fetchMoreResult }) => { if (!fetchMoreResult) { @@ -114,10 +109,7 @@ class NetworkDnsComponentQuery extends QueryTemplate< ...fetchMoreResult.source, NetworkDns: { ...fetchMoreResult.source.NetworkDns, - edges: [ - ...prev.source.NetworkDns.edges, - ...fetchMoreResult.source.NetworkDns.edges, - ], + edges: [...fetchMoreResult.source.NetworkDns.edges], }, }, }; @@ -126,12 +118,12 @@ class NetworkDnsComponentQuery extends QueryTemplate< return children({ id, inspect: getOr(null, 'source.NetworkDns.inspect', data), - refetch, loading, - totalCount: getOr(0, 'source.NetworkDns.totalCount', data), + loadPage: this.wrappedLoadMore, networkDns, pageInfo: getOr({}, 'source.NetworkDns.pageInfo', data), - loadMore: this.wrappedLoadMore, + refetch, + totalCount: getOr(0, 'source.NetworkDns.totalCount', data), }); }} diff --git a/x-pack/legacy/plugins/siem/public/containers/network_top_n_flow/index.gql_query.ts b/x-pack/legacy/plugins/siem/public/containers/network_top_n_flow/index.gql_query.ts index 299e1bb5926d1..3e3f3ef306e3b 100644 --- a/x-pack/legacy/plugins/siem/public/containers/network_top_n_flow/index.gql_query.ts +++ b/x-pack/legacy/plugins/siem/public/containers/network_top_n_flow/index.gql_query.ts @@ -11,7 +11,7 @@ export const networkTopNFlowQuery = gql` $sourceId: ID! $flowDirection: FlowDirection! $filterQuery: String - $pagination: PaginationInput! + $pagination: PaginationInputPaginated! $sort: NetworkTopNFlowSortField! $flowTarget: FlowTarget! $timerange: TimerangeInput! @@ -63,10 +63,9 @@ export const networkTopNFlowQuery = gql` } } pageInfo { - endCursor { - value - } - hasNextPage + activePage + fakeTotalCount + showMorePagesIndicator } inspect @include(if: $inspect) { dsl diff --git a/x-pack/legacy/plugins/siem/public/containers/network_top_n_flow/index.tsx b/x-pack/legacy/plugins/siem/public/containers/network_top_n_flow/index.tsx index d496734f7b116..27c90721a6c1e 100644 --- a/x-pack/legacy/plugins/siem/public/containers/network_top_n_flow/index.tsx +++ b/x-pack/legacy/plugins/siem/public/containers/network_top_n_flow/index.tsx @@ -17,12 +17,12 @@ import { GetNetworkTopNFlowQuery, NetworkTopNFlowEdges, NetworkTopNFlowSortField, - PageInfo, + PageInfoPaginated, } from '../../graphql/types'; import { inputsModel, networkModel, networkSelectors, State, inputsSelectors } from '../../store'; +import { generateTablePaginationOptions } from '../../components/paginated_table/helpers'; import { createFilter } from '../helpers'; -import { QueryTemplate, QueryTemplateProps } from '../query_template'; - +import { QueryTemplatePaginated, QueryTemplatePaginatedProps } from '../query_template_paginated'; import { networkTopNFlowQuery } from './index.gql_query'; const ID = 'networkTopNFlowQuery'; @@ -30,84 +30,79 @@ const ID = 'networkTopNFlowQuery'; export interface NetworkTopNFlowArgs { id: string; inspect: inputsModel.InspectQuery; - networkTopNFlow: NetworkTopNFlowEdges[]; - totalCount: number; - pageInfo: PageInfo; loading: boolean; - loadMore: (cursor: string) => void; + loadPage: (newActivePage: number) => void; + networkTopNFlow: NetworkTopNFlowEdges[]; + pageInfo: PageInfoPaginated; refetch: inputsModel.Refetch; + totalCount: number; } -export interface OwnProps extends QueryTemplateProps { +export interface OwnProps extends QueryTemplatePaginatedProps { children: (args: NetworkTopNFlowArgs) => React.ReactNode; type: networkModel.NetworkType; } export interface NetworkTopNFlowComponentReduxProps { + activePage: number; + flowDirection: FlowDirection; + flowTarget: FlowTarget; isInspected: boolean; limit: number; - flowDirection: FlowDirection; topNFlowSort: NetworkTopNFlowSortField; - flowTarget: FlowTarget; } type NetworkTopNFlowProps = OwnProps & NetworkTopNFlowComponentReduxProps; -class NetworkTopNFlowComponentQuery extends QueryTemplate< +class NetworkTopNFlowComponentQuery extends QueryTemplatePaginated< NetworkTopNFlowProps, GetNetworkTopNFlowQuery.Query, GetNetworkTopNFlowQuery.Variables > { public render() { const { - id = ID, - isInspected, + activePage, children, + endDate, filterQuery, + flowDirection, + flowTarget, + id = ID, + isInspected, + limit, skip, sourceId, startDate, - endDate, - limit, - flowDirection, topNFlowSort, - flowTarget, } = this.props; return ( - query={networkTopNFlowQuery} fetchPolicy="cache-and-network" notifyOnNetworkStatusChange + query={networkTopNFlowQuery} skip={skip} variables={{ + defaultIndex: chrome.getUiSettingsClient().get(DEFAULT_INDEX_KEY), + filterQuery: createFilter(filterQuery), + flowDirection, + flowTarget, + inspect: isInspected, + pagination: generateTablePaginationOptions(activePage, limit), + sort: topNFlowSort, sourceId, timerange: { interval: '12h', from: startDate!, to: endDate!, }, - sort: topNFlowSort, - flowDirection, - flowTarget, - pagination: { - limit, - cursor: null, - tiebreaker: null, - }, - filterQuery: createFilter(filterQuery), - defaultIndex: chrome.getUiSettingsClient().get(DEFAULT_INDEX_KEY), - inspect: isInspected, }} > {({ data, loading, fetchMore, refetch }) => { const networkTopNFlow = getOr([], `source.NetworkTopNFlow.edges`, data); this.setFetchMore(fetchMore); - this.setFetchMoreOptions((newCursor: string) => ({ + this.setFetchMoreOptions((newActivePage: number) => ({ variables: { - pagination: { - cursor: newCursor, - limit: limit + parseInt(newCursor, 10), - }, + pagination: generateTablePaginationOptions(newActivePage, limit), }, updateQuery: (prev, { fetchMoreResult }) => { if (!fetchMoreResult) { @@ -119,10 +114,7 @@ class NetworkTopNFlowComponentQuery extends QueryTemplate< ...fetchMoreResult.source, NetworkTopNFlow: { ...fetchMoreResult.source.NetworkTopNFlow, - edges: [ - ...prev.source.NetworkTopNFlow.edges, - ...fetchMoreResult.source.NetworkTopNFlow.edges, - ], + edges: [...fetchMoreResult.source.NetworkTopNFlow.edges], }, }, }; @@ -131,12 +123,12 @@ class NetworkTopNFlowComponentQuery extends QueryTemplate< return children({ id, inspect: getOr(null, 'source.NetworkTopNFlow.inspect', data), - refetch, loading, - totalCount: getOr(0, 'source.NetworkTopNFlow.totalCount', data), + loadPage: this.wrappedLoadMore, networkTopNFlow, pageInfo: getOr({}, 'source.NetworkTopNFlow.pageInfo', data), - loadMore: this.wrappedLoadMore, + refetch, + totalCount: getOr(0, 'source.NetworkTopNFlow.totalCount', data), }); }} diff --git a/x-pack/legacy/plugins/siem/public/containers/tls/index.gql_query.ts b/x-pack/legacy/plugins/siem/public/containers/tls/index.gql_query.ts index 87570b0422364..15d5a8eb8a483 100644 --- a/x-pack/legacy/plugins/siem/public/containers/tls/index.gql_query.ts +++ b/x-pack/legacy/plugins/siem/public/containers/tls/index.gql_query.ts @@ -12,7 +12,7 @@ export const tlsQuery = gql` $filterQuery: String $flowTarget: FlowTarget! $ip: String! - $pagination: PaginationInput! + $pagination: PaginationInputPaginated! $sort: TlsSortField! $timerange: TimerangeInput! $defaultIndex: [String!]! @@ -44,10 +44,9 @@ export const tlsQuery = gql` } } pageInfo { - endCursor { - value - } - hasNextPage + activePage + fakeTotalCount + showMorePagesIndicator } inspect @include(if: $inspect) { dsl diff --git a/x-pack/legacy/plugins/siem/public/containers/tls/index.tsx b/x-pack/legacy/plugins/siem/public/containers/tls/index.tsx index 606ae3f70849f..4030af726d91a 100644 --- a/x-pack/legacy/plugins/siem/public/containers/tls/index.tsx +++ b/x-pack/legacy/plugins/siem/public/containers/tls/index.tsx @@ -11,11 +11,17 @@ import { connect } from 'react-redux'; import chrome from 'ui/chrome'; import { DEFAULT_INDEX_KEY } from '../../../common/constants'; -import { FlowTarget, PageInfo, TlsEdges, TlsSortField, GetTlsQuery } from '../../graphql/types'; +import { + FlowTarget, + PageInfoPaginated, + TlsEdges, + TlsSortField, + GetTlsQuery, +} from '../../graphql/types'; import { inputsModel, networkModel, networkSelectors, State, inputsSelectors } from '../../store'; import { createFilter } from '../helpers'; -import { QueryTemplate, QueryTemplateProps } from '../query_template'; - +import { generateTablePaginationOptions } from '../../components/paginated_table/helpers'; +import { QueryTemplatePaginated, QueryTemplatePaginatedProps } from '../query_template_paginated'; import { tlsQuery } from './index.gql_query'; const ID = 'tlsQuery'; @@ -23,15 +29,15 @@ const ID = 'tlsQuery'; export interface TlsArgs { id: string; inspect: inputsModel.InspectQuery; - tls: TlsEdges[]; - totalCount: number; - pageInfo: PageInfo; loading: boolean; - loadMore: (cursor: string) => void; + loadPage: (newActivePage: number) => void; + pageInfo: PageInfoPaginated; refetch: inputsModel.Refetch; + tls: TlsEdges[]; + totalCount: number; } -export interface OwnProps extends QueryTemplateProps { +export interface OwnProps extends QueryTemplatePaginatedProps { children: (args: TlsArgs) => React.ReactNode; flowTarget: FlowTarget; ip: string; @@ -39,6 +45,7 @@ export interface OwnProps extends QueryTemplateProps { } export interface TlsComponentReduxProps { + activePage: number; isInspected: boolean; limit: number; tlsSortField: TlsSortField; @@ -46,21 +53,26 @@ export interface TlsComponentReduxProps { type TlsProps = OwnProps & TlsComponentReduxProps; -class TlsComponentQuery extends QueryTemplate { +class TlsComponentQuery extends QueryTemplatePaginated< + TlsProps, + GetTlsQuery.Query, + GetTlsQuery.Variables +> { public render() { const { - id = ID, - isInspected, + activePage, children, - tlsSortField, + endDate, filterQuery, + flowTarget, + id = ID, ip, + isInspected, + limit, skip, sourceId, startDate, - endDate, - limit, - flowTarget, + tlsSortField, } = this.props; return ( @@ -69,34 +81,27 @@ class TlsComponentQuery extends QueryTemplate {({ data, loading, fetchMore, refetch }) => { const tls = getOr([], 'source.Tls.edges', data); this.setFetchMore(fetchMore); - this.setFetchMoreOptions((newCursor: string) => ({ + this.setFetchMoreOptions((newActivePage: number) => ({ variables: { - pagination: { - cursor: newCursor, - limit: limit + parseInt(newCursor, 10), - }, + pagination: generateTablePaginationOptions(newActivePage, limit), }, updateQuery: (prev, { fetchMoreResult }) => { if (!fetchMoreResult) { @@ -108,7 +113,7 @@ class TlsComponentQuery extends QueryTemplate diff --git a/x-pack/legacy/plugins/siem/public/containers/uncommon_processes/index.gql_query.ts b/x-pack/legacy/plugins/siem/public/containers/uncommon_processes/index.gql_query.ts index 5aa4cd4d75bba..d984de020faa1 100644 --- a/x-pack/legacy/plugins/siem/public/containers/uncommon_processes/index.gql_query.ts +++ b/x-pack/legacy/plugins/siem/public/containers/uncommon_processes/index.gql_query.ts @@ -10,7 +10,7 @@ export const uncommonProcessesQuery = gql` query GetUncommonProcessesQuery( $sourceId: ID! $timerange: TimerangeInput! - $pagination: PaginationInput! + $pagination: PaginationInputPaginated! $filterQuery: String $defaultIndex: [String!]! $inspect: Boolean! @@ -45,10 +45,9 @@ export const uncommonProcessesQuery = gql` } } pageInfo { - endCursor { - value - } - hasNextPage + activePage + fakeTotalCount + showMorePagesIndicator } inspect @include(if: $inspect) { dsl diff --git a/x-pack/legacy/plugins/siem/public/containers/uncommon_processes/index.tsx b/x-pack/legacy/plugins/siem/public/containers/uncommon_processes/index.tsx index a83139f61f805..2054a3b9a4414 100644 --- a/x-pack/legacy/plugins/siem/public/containers/uncommon_processes/index.tsx +++ b/x-pack/legacy/plugins/siem/public/containers/uncommon_processes/index.tsx @@ -11,10 +11,15 @@ import { connect } from 'react-redux'; import chrome from 'ui/chrome'; import { DEFAULT_INDEX_KEY } from '../../../common/constants'; -import { GetUncommonProcessesQuery, PageInfo, UncommonProcessesEdges } from '../../graphql/types'; +import { + GetUncommonProcessesQuery, + PageInfoPaginated, + UncommonProcessesEdges, +} from '../../graphql/types'; import { hostsModel, hostsSelectors, inputsModel, State, inputsSelectors } from '../../store'; +import { generateTablePaginationOptions } from '../../components/paginated_table/helpers'; import { createFilter, getDefaultFetchPolicy } from '../helpers'; -import { QueryTemplate, QueryTemplateProps } from '../query_template'; +import { QueryTemplatePaginated, QueryTemplatePaginatedProps } from '../query_template_paginated'; import { uncommonProcessesQuery } from './index.gql_query'; @@ -22,43 +27,45 @@ const ID = 'uncommonProcessesQuery'; export interface UncommonProcessesArgs { id: string; - uncommonProcesses: UncommonProcessesEdges[]; - totalCount: number; - pageInfo: PageInfo; + inspect: inputsModel.InspectQuery; loading: boolean; - loadMore: (cursor: string) => void; + loadPage: (newActivePage: number) => void; + pageInfo: PageInfoPaginated; refetch: inputsModel.Refetch; - inspect: inputsModel.InspectQuery; + totalCount: number; + uncommonProcesses: UncommonProcessesEdges[]; } -export interface OwnProps extends QueryTemplateProps { +export interface OwnProps extends QueryTemplatePaginatedProps { children: (args: UncommonProcessesArgs) => React.ReactNode; type: hostsModel.HostsType; } export interface UncommonProcessesComponentReduxProps { + activePage: number; isInspected: boolean; limit: number; } type UncommonProcessesProps = OwnProps & UncommonProcessesComponentReduxProps; -class UncommonProcessesComponentQuery extends QueryTemplate< +class UncommonProcessesComponentQuery extends QueryTemplatePaginated< UncommonProcessesProps, GetUncommonProcessesQuery.Query, GetUncommonProcessesQuery.Variables > { public render() { const { - id = ID, + activePage, children, + endDate, filterQuery, + id = ID, isInspected, + limit, skip, sourceId, startDate, - endDate, - limit, } = this.props; return ( @@ -67,31 +74,24 @@ class UncommonProcessesComponentQuery extends QueryTemplate< notifyOnNetworkStatusChange skip={skip} variables={{ + defaultIndex: chrome.getUiSettingsClient().get(DEFAULT_INDEX_KEY), + filterQuery: createFilter(filterQuery), + inspect: isInspected, + pagination: generateTablePaginationOptions(activePage, limit), sourceId, timerange: { interval: '12h', from: startDate!, to: endDate!, }, - pagination: { - limit, - cursor: null, - tiebreaker: null, - }, - filterQuery: createFilter(filterQuery), - defaultIndex: chrome.getUiSettingsClient().get(DEFAULT_INDEX_KEY), - inspect: isInspected, }} > {({ data, loading, fetchMore, refetch }) => { const uncommonProcesses = getOr([], 'source.UncommonProcesses.edges', data); this.setFetchMore(fetchMore); - this.setFetchMoreOptions((newCursor: string) => ({ + this.setFetchMoreOptions((newActivePage: number) => ({ variables: { - pagination: { - cursor: newCursor, - limit: limit + parseInt(newCursor, 10), - }, + pagination: generateTablePaginationOptions(newActivePage, limit), }, updateQuery: (prev, { fetchMoreResult }) => { if (!fetchMoreResult) { @@ -103,10 +103,7 @@ class UncommonProcessesComponentQuery extends QueryTemplate< ...fetchMoreResult.source, UncommonProcesses: { ...fetchMoreResult.source.UncommonProcesses, - edges: [ - ...prev.source.UncommonProcesses.edges, - ...fetchMoreResult.source.UncommonProcesses.edges, - ], + edges: [...fetchMoreResult.source.UncommonProcesses.edges], }, }, }; @@ -116,11 +113,11 @@ class UncommonProcessesComponentQuery extends QueryTemplate< id, inspect: getOr(null, 'source.UncommonProcesses.inspect', data), loading, + loadPage: this.wrappedLoadMore, + pageInfo: getOr({}, 'source.UncommonProcesses.pageInfo', data), refetch, totalCount: getOr(0, 'source.UncommonProcesses.totalCount', data), uncommonProcesses, - pageInfo: getOr({}, 'source.UncommonProcesses.pageInfo', data), - loadMore: this.wrappedLoadMore, }); }} diff --git a/x-pack/legacy/plugins/siem/public/containers/users/index.gql_query.ts b/x-pack/legacy/plugins/siem/public/containers/users/index.gql_query.ts index abdfa96ba7e0a..3fc1cdfd160db 100644 --- a/x-pack/legacy/plugins/siem/public/containers/users/index.gql_query.ts +++ b/x-pack/legacy/plugins/siem/public/containers/users/index.gql_query.ts @@ -12,7 +12,7 @@ export const usersQuery = gql` $filterQuery: String $flowTarget: FlowTarget! $ip: String! - $pagination: PaginationInput! + $pagination: PaginationInputPaginated! $sort: UsersSortField! $timerange: TimerangeInput! $defaultIndex: [String!]! @@ -45,10 +45,9 @@ export const usersQuery = gql` } } pageInfo { - endCursor { - value - } - hasNextPage + activePage + fakeTotalCount + showMorePagesIndicator } inspect @include(if: $inspect) { dsl diff --git a/x-pack/legacy/plugins/siem/public/containers/users/index.tsx b/x-pack/legacy/plugins/siem/public/containers/users/index.tsx index c59acf5e18761..12c561c482ef3 100644 --- a/x-pack/legacy/plugins/siem/public/containers/users/index.tsx +++ b/x-pack/legacy/plugins/siem/public/containers/users/index.tsx @@ -14,13 +14,14 @@ import { DEFAULT_INDEX_KEY } from '../../../common/constants'; import { GetUsersQuery, FlowTarget, - PageInfo, + PageInfoPaginated, UsersEdges, UsersSortField, } from '../../graphql/types'; import { inputsModel, networkModel, networkSelectors, State, inputsSelectors } from '../../store'; import { createFilter } from '../helpers'; -import { QueryTemplate, QueryTemplateProps } from '../query_template'; +import { generateTablePaginationOptions } from '../../components/paginated_table/helpers'; +import { QueryTemplatePaginated, QueryTemplatePaginatedProps } from '../query_template_paginated'; import { usersQuery } from './index.gql_query'; @@ -29,15 +30,15 @@ const ID = 'usersQuery'; export interface UsersArgs { id: string; inspect: inputsModel.InspectQuery; - users: UsersEdges[]; - totalCount: number; - pageInfo: PageInfo; loading: boolean; - loadMore: (cursor: string) => void; + loadPage: (newActivePage: number) => void; + pageInfo: PageInfoPaginated; refetch: inputsModel.Refetch; + totalCount: number; + users: UsersEdges[]; } -export interface OwnProps extends QueryTemplateProps { +export interface OwnProps extends QueryTemplatePaginatedProps { children: (args: UsersArgs) => React.ReactNode; flowTarget: FlowTarget; ip: string; @@ -45,6 +46,7 @@ export interface OwnProps extends QueryTemplateProps { } export interface UsersComponentReduxProps { + activePage: number; isInspected: boolean; limit: number; usersSortField: UsersSortField; @@ -52,25 +54,26 @@ export interface UsersComponentReduxProps { type UsersProps = OwnProps & UsersComponentReduxProps; -class UsersComponentQuery extends QueryTemplate< +class UsersComponentQuery extends QueryTemplatePaginated< UsersProps, GetUsersQuery.Query, GetUsersQuery.Variables > { public render() { const { - id = ID, - isInspected, + activePage, children, - usersSortField, + endDate, filterQuery, + flowTarget, + id = ID, ip, + isInspected, + limit, skip, sourceId, startDate, - endDate, - limit, - flowTarget, + usersSortField, } = this.props; return ( @@ -79,34 +82,27 @@ class UsersComponentQuery extends QueryTemplate< notifyOnNetworkStatusChange skip={skip} variables={{ + defaultIndex: chrome.getUiSettingsClient().get(DEFAULT_INDEX_KEY), + filterQuery: createFilter(filterQuery), + flowTarget, + inspect: isInspected, + ip, + pagination: generateTablePaginationOptions(activePage, limit), + sort: usersSortField, sourceId, timerange: { interval: '12h', from: startDate!, to: endDate!, }, - ip, - flowTarget, - sort: usersSortField, - pagination: { - limit, - cursor: null, - tiebreaker: null, - }, - filterQuery: createFilter(filterQuery), - defaultIndex: chrome.getUiSettingsClient().get(DEFAULT_INDEX_KEY), - inspect: isInspected, }} > {({ data, loading, fetchMore, refetch }) => { const users = getOr([], `source.Users.edges`, data); this.setFetchMore(fetchMore); - this.setFetchMoreOptions((newCursor: string) => ({ + this.setFetchMoreOptions((newActivePage: number) => ({ variables: { - pagination: { - cursor: newCursor, - limit: limit + parseInt(newCursor, 10), - }, + pagination: generateTablePaginationOptions(newActivePage, limit), }, updateQuery: (prev, { fetchMoreResult }) => { if (!fetchMoreResult) { @@ -118,7 +114,7 @@ class UsersComponentQuery extends QueryTemplate< ...fetchMoreResult.source, Users: { ...fetchMoreResult.source.Users, - edges: [...prev.source.Users.edges, ...fetchMoreResult.source.Users.edges], + edges: [...fetchMoreResult.source.Users.edges], }, }, }; @@ -127,12 +123,12 @@ class UsersComponentQuery extends QueryTemplate< return children({ id, inspect: getOr(null, 'source.Users.inspect', data), - refetch, loading, + loadPage: this.wrappedLoadMore, + pageInfo: getOr({}, 'source.Users.pageInfo', data), + refetch, totalCount: getOr(0, 'source.Users.totalCount', data), users, - pageInfo: getOr({}, 'source.Users.pageInfo', data), - loadMore: this.wrappedLoadMore, }); }} diff --git a/x-pack/legacy/plugins/siem/public/graphql/introspection.json b/x-pack/legacy/plugins/siem/public/graphql/introspection.json index 3b86740c73dc7..d63c489fc9317 100644 --- a/x-pack/legacy/plugins/siem/public/graphql/introspection.json +++ b/x-pack/legacy/plugins/siem/public/graphql/introspection.json @@ -721,7 +721,11 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "INPUT_OBJECT", "name": "PaginationInput", "ofType": null } + "ofType": { + "kind": "INPUT_OBJECT", + "name": "PaginationInputPaginated", + "ofType": null + } }, "defaultValue": null }, @@ -989,7 +993,11 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "INPUT_OBJECT", "name": "PaginationInput", "ofType": null } + "ofType": { + "kind": "INPUT_OBJECT", + "name": "PaginationInputPaginated", + "ofType": null + } }, "defaultValue": null }, @@ -1221,7 +1229,11 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "INPUT_OBJECT", "name": "PaginationInput", "ofType": null } + "ofType": { + "kind": "INPUT_OBJECT", + "name": "PaginationInputPaginated", + "ofType": null + } }, "defaultValue": null }, @@ -1324,7 +1336,11 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "INPUT_OBJECT", "name": "PaginationInput", "ofType": null } + "ofType": { + "kind": "INPUT_OBJECT", + "name": "PaginationInputPaginated", + "ofType": null + } }, "defaultValue": null }, @@ -1417,7 +1433,11 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "INPUT_OBJECT", "name": "PaginationInput", "ofType": null } + "ofType": { + "kind": "INPUT_OBJECT", + "name": "PaginationInputPaginated", + "ofType": null + } }, "defaultValue": null }, @@ -1675,7 +1695,11 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "INPUT_OBJECT", "name": "PaginationInput", "ofType": null } + "ofType": { + "kind": "INPUT_OBJECT", + "name": "PaginationInputPaginated", + "ofType": null + } }, "defaultValue": null }, @@ -1762,7 +1786,11 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "INPUT_OBJECT", "name": "PaginationInput", "ofType": null } + "ofType": { + "kind": "INPUT_OBJECT", + "name": "PaginationInputPaginated", + "ofType": null + } }, "defaultValue": null }, @@ -1935,7 +1963,11 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "INPUT_OBJECT", "name": "PaginationInput", "ofType": null } + "ofType": { + "kind": "INPUT_OBJECT", + "name": "PaginationInputPaginated", + "ofType": null + } }, "defaultValue": null }, @@ -3087,39 +3119,6 @@ "enumValues": null, "possibleTypes": null }, - { - "kind": "INPUT_OBJECT", - "name": "PaginationInput", - "description": "", - "fields": null, - "inputFields": [ - { - "name": "limit", - "description": "The limit parameter allows you to configure the maximum amount of items to be returned", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "Float", "ofType": null } - }, - "defaultValue": null - }, - { - "name": "cursor", - "description": "The cursor parameter defines the next result you want to fetch", - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "defaultValue": null - }, - { - "name": "tiebreaker", - "description": "The tiebreaker parameter allow to be more precise to fetch the next item", - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "defaultValue": null - } - ], - "interfaces": null, - "enumValues": null, - "possibleTypes": null - }, { "kind": "INPUT_OBJECT", "name": "SortField", @@ -3195,7 +3194,7 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "OBJECT", "name": "PageInfo", "ofType": null } + "ofType": { "kind": "OBJECT", "name": "PageInfoPaginated", "ofType": null } }, "isDeprecated": false, "deprecationReason": null @@ -5193,29 +5192,35 @@ "possibleTypes": null }, { - "kind": "OBJECT", - "name": "PageInfo", + "kind": "INPUT_OBJECT", + "name": "PaginationInput", "description": "", - "fields": [ + "fields": null, + "inputFields": [ { - "name": "endCursor", - "description": "", - "args": [], - "type": { "kind": "OBJECT", "name": "CursorType", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null + "name": "limit", + "description": "The limit parameter allows you to configure the maximum amount of items to be returned", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { "kind": "SCALAR", "name": "Float", "ofType": null } + }, + "defaultValue": null }, { - "name": "hasNextPage", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "Boolean", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null + "name": "cursor", + "description": "The cursor parameter defines the next result you want to fetch", + "type": { "kind": "SCALAR", "name": "String", "ofType": null }, + "defaultValue": null + }, + { + "name": "tiebreaker", + "description": "The tiebreaker parameter allow to be more precise to fetch the next item", + "type": { "kind": "SCALAR", "name": "String", "ofType": null }, + "defaultValue": null } ], - "inputFields": null, - "interfaces": [], + "interfaces": null, "enumValues": null, "possibleTypes": null }, @@ -5411,6 +5416,33 @@ "enumValues": null, "possibleTypes": null }, + { + "kind": "OBJECT", + "name": "PageInfo", + "description": "", + "fields": [ + { + "name": "endCursor", + "description": "", + "args": [], + "type": { "kind": "OBJECT", "name": "CursorType", "ofType": null }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "hasNextPage", + "description": "", + "args": [], + "type": { "kind": "SCALAR", "name": "Boolean", "ofType": null }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, { "kind": "OBJECT", "name": "TimelineDetailsData", @@ -5708,7 +5740,7 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "OBJECT", "name": "PageInfo", "ofType": null } + "ofType": { "kind": "OBJECT", "name": "PageInfoPaginated", "ofType": null } }, "isDeprecated": false, "deprecationReason": null @@ -6248,7 +6280,7 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "OBJECT", "name": "PageInfo", "ofType": null } + "ofType": { "kind": "OBJECT", "name": "PageInfoPaginated", "ofType": null } }, "isDeprecated": false, "deprecationReason": null @@ -6604,7 +6636,7 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "OBJECT", "name": "PageInfo", "ofType": null } + "ofType": { "kind": "OBJECT", "name": "PageInfoPaginated", "ofType": null } }, "isDeprecated": false, "deprecationReason": null @@ -6853,7 +6885,7 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "OBJECT", "name": "PageInfo", "ofType": null } + "ofType": { "kind": "OBJECT", "name": "PageInfoPaginated", "ofType": null } }, "isDeprecated": false, "deprecationReason": null @@ -7494,7 +7526,7 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "OBJECT", "name": "PageInfo", "ofType": null } + "ofType": { "kind": "OBJECT", "name": "PageInfoPaginated", "ofType": null } }, "isDeprecated": false, "deprecationReason": null @@ -7817,7 +7849,7 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "OBJECT", "name": "PageInfo", "ofType": null } + "ofType": { "kind": "OBJECT", "name": "PageInfoPaginated", "ofType": null } }, "isDeprecated": false, "deprecationReason": null @@ -8148,7 +8180,7 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "OBJECT", "name": "PageInfo", "ofType": null } + "ofType": { "kind": "OBJECT", "name": "PageInfoPaginated", "ofType": null } }, "isDeprecated": false, "deprecationReason": null @@ -10551,6 +10583,69 @@ ], "possibleTypes": null }, + { + "kind": "OBJECT", + "name": "EventsTimelineData", + "description": "", + "fields": [ + { + "name": "edges", + "description": "", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { "kind": "OBJECT", "name": "EcsEdges", "ofType": null } + } + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "totalCount", + "description": "", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { "kind": "SCALAR", "name": "Float", "ofType": null } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "pageInfo", + "description": "", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { "kind": "OBJECT", "name": "PageInfo", "ofType": null } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "inspect", + "description": "", + "args": [], + "type": { "kind": "OBJECT", "name": "Inspect", "ofType": null }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, { "kind": "OBJECT", "name": "OsFields", diff --git a/x-pack/legacy/plugins/siem/public/graphql/types.ts b/x-pack/legacy/plugins/siem/public/graphql/types.ts index 3246ef1ff49a3..3f4298853df3f 100644 --- a/x-pack/legacy/plugins/siem/public/graphql/types.ts +++ b/x-pack/legacy/plugins/siem/public/graphql/types.ts @@ -338,7 +338,7 @@ export interface EventsData { totalCount: number; - pageInfo: PageInfo; + pageInfo: PageInfoPaginated; inspect?: Inspect | null; } @@ -801,12 +801,6 @@ export interface SshEcsFields { signature?: ToStringArray | null; } -export interface PageInfo { - endCursor?: CursorType | null; - - hasNextPage?: boolean | null; -} - export interface TimelineData { edges: TimelineEdges[]; @@ -839,6 +833,12 @@ export interface TimelineNonEcsData { value?: ToStringArray | null; } +export interface PageInfo { + endCursor?: CursorType | null; + + hasNextPage?: boolean | null; +} + export interface TimelineDetailsData { data?: DetailItem[] | null; @@ -872,7 +872,7 @@ export interface HostsData { totalCount: number; - pageInfo: PageInfo; + pageInfo: PageInfoPaginated; inspect?: Inspect | null; } @@ -958,7 +958,7 @@ export interface DomainsData { totalCount: number; - pageInfo: PageInfo; + pageInfo: PageInfoPaginated; inspect?: Inspect | null; } @@ -1010,7 +1010,7 @@ export interface TlsData { totalCount: number; - pageInfo: PageInfo; + pageInfo: PageInfoPaginated; inspect?: Inspect | null; } @@ -1042,7 +1042,7 @@ export interface UsersData { totalCount: number; - pageInfo: PageInfo; + pageInfo: PageInfoPaginated; inspect?: Inspect | null; } @@ -1154,7 +1154,7 @@ export interface NetworkTopNFlowData { totalCount: number; - pageInfo: PageInfo; + pageInfo: PageInfoPaginated; inspect?: Inspect | null; } @@ -1202,7 +1202,7 @@ export interface NetworkDnsData { totalCount: number; - pageInfo: PageInfo; + pageInfo: PageInfoPaginated; inspect?: Inspect | null; } @@ -1274,7 +1274,7 @@ export interface UncommonProcessesData { totalCount: number; - pageInfo: PageInfo; + pageInfo: PageInfoPaginated; inspect?: Inspect | null; } @@ -1483,6 +1483,16 @@ export interface ResponseFavoriteTimeline { favorite?: FavoriteTimelineResult[] | null; } +export interface EventsTimelineData { + edges: EcsEdges[]; + + totalCount: number; + + pageInfo: PageInfo; + + inspect?: Inspect | null; +} + export interface OsFields { platform?: string | null; @@ -1549,6 +1559,12 @@ export interface PaginationInputPaginated { querySize: number; } +export interface SortField { + sortFieldId: string; + + direction: Direction; +} + export interface PaginationInput { /** The limit parameter allows you to configure the maximum amount of items to be returned */ limit: number; @@ -1558,12 +1574,6 @@ export interface PaginationInput { tiebreaker?: string | null; } -export interface SortField { - sortFieldId: string; - - direction: Direction; -} - export interface LastTimeDetails { hostName?: string | null; @@ -1781,7 +1791,7 @@ export interface AuthenticationsSourceArgs { defaultIndex: string[]; } export interface EventsSourceArgs { - pagination: PaginationInput; + pagination: PaginationInputPaginated; sortField: SortField; @@ -1825,7 +1835,7 @@ export interface HostsSourceArgs { timerange: TimerangeInput; - pagination: PaginationInput; + pagination: PaginationInputPaginated; sort: HostsSortField; @@ -1865,7 +1875,7 @@ export interface DomainsSourceArgs { ip: string; - pagination: PaginationInput; + pagination: PaginationInputPaginated; sort: DomainsSortField; @@ -1884,7 +1894,7 @@ export interface TlsSourceArgs { ip: string; - pagination: PaginationInput; + pagination: PaginationInputPaginated; sort: TlsSortField; @@ -1901,7 +1911,7 @@ export interface UsersSourceArgs { ip: string; - pagination: PaginationInput; + pagination: PaginationInputPaginated; sort: UsersSortField; @@ -1947,7 +1957,7 @@ export interface NetworkTopNFlowSourceArgs { flowTarget: FlowTarget; - pagination: PaginationInput; + pagination: PaginationInputPaginated; sort: NetworkTopNFlowSortField; @@ -1962,7 +1972,7 @@ export interface NetworkDnsSourceArgs { isPtrIncluded: boolean; - pagination: PaginationInput; + pagination: PaginationInputPaginated; sort: NetworkDnsSortField; @@ -1991,7 +2001,7 @@ export interface OverviewHostSourceArgs { export interface UncommonProcessesSourceArgs { timerange: TimerangeInput; - pagination: PaginationInput; + pagination: PaginationInputPaginated; filterQuery?: string | null; @@ -2286,7 +2296,7 @@ export namespace GetDomainsQuery { flowDirection: FlowDirection; flowTarget: FlowTarget; ip: string; - pagination: PaginationInput; + pagination: PaginationInputPaginated; sort: DomainsSortField; timerange: TimerangeInput; defaultIndex: string[]; @@ -2378,17 +2388,13 @@ export namespace GetDomainsQuery { }; export type PageInfo = { - __typename?: 'PageInfo'; - - endCursor?: EndCursor | null; + __typename?: 'PageInfoPaginated'; - hasNextPage?: boolean | null; - }; + activePage: number; - export type EndCursor = { - __typename?: 'CursorType'; + fakeTotalCount: number; - value?: string | null; + showMorePagesIndicator: boolean; }; export type Inspect = { @@ -2404,7 +2410,7 @@ export namespace GetEventsQuery { export type Variables = { sourceId: string; timerange: TimerangeInput; - pagination: PaginationInput; + pagination: PaginationInputPaginated; sortField: SortField; filterQuery?: string | null; defaultIndex: string[]; @@ -2438,19 +2444,13 @@ export namespace GetEventsQuery { }; export type PageInfo = { - __typename?: 'PageInfo'; - - endCursor?: EndCursor | null; - - hasNextPage?: boolean | null; - }; + __typename?: 'PageInfoPaginated'; - export type EndCursor = { - __typename?: 'CursorType'; + activePage: number; - value?: string | null; + fakeTotalCount: number; - tiebreaker?: string | null; + showMorePagesIndicator: boolean; }; export type Inspect = { @@ -2635,7 +2635,7 @@ export namespace GetHostsTableQuery { export type Variables = { sourceId: string; timerange: TimerangeInput; - pagination: PaginationInput; + pagination: PaginationInputPaginated; sort: HostsSortField; filterQuery?: string | null; defaultIndex: string[]; @@ -2711,17 +2711,13 @@ export namespace GetHostsTableQuery { }; export type PageInfo = { - __typename?: 'PageInfo'; - - endCursor?: EndCursor | null; + __typename?: 'PageInfoPaginated'; - hasNextPage?: boolean | null; - }; + activePage: number; - export type EndCursor = { - __typename?: 'CursorType'; + fakeTotalCount: number; - value?: string | null; + showMorePagesIndicator: boolean; }; export type Inspect = { @@ -3195,7 +3191,7 @@ export namespace GetNetworkDnsQuery { sort: NetworkDnsSortField; isPtrIncluded: boolean; timerange: TimerangeInput; - pagination: PaginationInput; + pagination: PaginationInputPaginated; filterQuery?: string | null; defaultIndex: string[]; inspect: boolean; @@ -3258,17 +3254,13 @@ export namespace GetNetworkDnsQuery { }; export type PageInfo = { - __typename?: 'PageInfo'; - - endCursor?: EndCursor | null; + __typename?: 'PageInfoPaginated'; - hasNextPage?: boolean | null; - }; + activePage: number; - export type EndCursor = { - __typename?: 'CursorType'; + fakeTotalCount: number; - value?: string | null; + showMorePagesIndicator: boolean; }; export type Inspect = { @@ -3285,7 +3277,7 @@ export namespace GetNetworkTopNFlowQuery { sourceId: string; flowDirection: FlowDirection; filterQuery?: string | null; - pagination: PaginationInput; + pagination: PaginationInputPaginated; sort: NetworkTopNFlowSortField; flowTarget: FlowTarget; timerange: TimerangeInput; @@ -3398,17 +3390,13 @@ export namespace GetNetworkTopNFlowQuery { }; export type PageInfo = { - __typename?: 'PageInfo'; - - endCursor?: EndCursor | null; + __typename?: 'PageInfoPaginated'; - hasNextPage?: boolean | null; - }; + activePage: number; - export type EndCursor = { - __typename?: 'CursorType'; + fakeTotalCount: number; - value?: string | null; + showMorePagesIndicator: boolean; }; export type Inspect = { @@ -5009,7 +4997,7 @@ export namespace GetTlsQuery { filterQuery?: string | null; flowTarget: FlowTarget; ip: string; - pagination: PaginationInput; + pagination: PaginationInputPaginated; sort: TlsSortField; timerange: TimerangeInput; defaultIndex: string[]; @@ -5073,17 +5061,13 @@ export namespace GetTlsQuery { }; export type PageInfo = { - __typename?: 'PageInfo'; - - endCursor?: EndCursor | null; + __typename?: 'PageInfoPaginated'; - hasNextPage?: boolean | null; - }; + activePage: number; - export type EndCursor = { - __typename?: 'CursorType'; + fakeTotalCount: number; - value?: string | null; + showMorePagesIndicator: boolean; }; export type Inspect = { @@ -5099,7 +5083,7 @@ export namespace GetUncommonProcessesQuery { export type Variables = { sourceId: string; timerange: TimerangeInput; - pagination: PaginationInput; + pagination: PaginationInputPaginated; filterQuery?: string | null; defaultIndex: string[]; inspect: boolean; @@ -5182,17 +5166,13 @@ export namespace GetUncommonProcessesQuery { }; export type PageInfo = { - __typename?: 'PageInfo'; - - endCursor?: EndCursor | null; + __typename?: 'PageInfoPaginated'; - hasNextPage?: boolean | null; - }; + activePage: number; - export type EndCursor = { - __typename?: 'CursorType'; + fakeTotalCount: number; - value?: string | null; + showMorePagesIndicator: boolean; }; export type Inspect = { @@ -5210,7 +5190,7 @@ export namespace GetUsersQuery { filterQuery?: string | null; flowTarget: FlowTarget; ip: string; - pagination: PaginationInput; + pagination: PaginationInputPaginated; sort: UsersSortField; timerange: TimerangeInput; defaultIndex: string[]; @@ -5278,17 +5258,13 @@ export namespace GetUsersQuery { }; export type PageInfo = { - __typename?: 'PageInfo'; - - endCursor?: EndCursor | null; + __typename?: 'PageInfoPaginated'; - hasNextPage?: boolean | null; - }; + activePage: number; - export type EndCursor = { - __typename?: 'CursorType'; + fakeTotalCount: number; - value?: string | null; + showMorePagesIndicator: boolean; }; export type Inspect = { diff --git a/x-pack/legacy/plugins/siem/public/mock/global_state.ts b/x-pack/legacy/plugins/siem/public/mock/global_state.ts index e52d3d95dd1f0..dcdd1f312ede3 100644 --- a/x-pack/legacy/plugins/siem/public/mock/global_state.ts +++ b/x-pack/legacy/plugins/siem/public/mock/global_state.ts @@ -33,12 +33,13 @@ export const mockGlobalState: State = { queries: { authentications: { activePage: 0, limit: 10 }, hosts: { + activePage: 0, limit: 10, direction: Direction.desc, sortField: HostsFields.lastSeen, }, - events: { limit: 10 }, - uncommonProcesses: { limit: 10 }, + events: { activePage: 0, limit: 10 }, + uncommonProcesses: { activePage: 0, limit: 10 }, }, filterQuery: null, filterQueryDraft: null, @@ -47,12 +48,13 @@ export const mockGlobalState: State = { queries: { authentications: { activePage: 0, limit: 10 }, hosts: { + activePage: 0, limit: 10, direction: Direction.desc, sortField: HostsFields.lastSeen, }, - events: { limit: 10 }, - uncommonProcesses: { limit: 10 }, + events: { activePage: 0, limit: 10 }, + uncommonProcesses: { activePage: 0, limit: 10 }, }, filterQuery: null, filterQueryDraft: null, @@ -62,12 +64,14 @@ export const mockGlobalState: State = { page: { queries: { topNFlow: { + activePage: 0, limit: 10, flowTarget: FlowTarget.source, flowDirection: FlowDirection.uniDirectional, topNFlowSort: { field: NetworkTopNFlowFields.bytes, direction: Direction.desc }, }, dns: { + activePage: 0, limit: 10, dnsSortField: { field: NetworkDnsFields.queryCount, direction: Direction.desc }, isPtrIncluded: false, @@ -82,15 +86,18 @@ export const mockGlobalState: State = { flowTarget: FlowTarget.source, queries: { domains: { + activePage: 0, limit: 10, flowDirection: FlowDirection.uniDirectional, domainsSortField: { field: DomainsFields.bytes, direction: Direction.desc }, }, tls: { + activePage: 0, limit: 10, tlsSortField: { field: TlsFields._id, direction: Direction.desc }, }, users: { + activePage: 0, limit: 10, usersSortField: { field: UsersFields.name, direction: Direction.asc }, }, diff --git a/x-pack/legacy/plugins/siem/public/pages/hosts/host_details.tsx b/x-pack/legacy/plugins/siem/public/pages/hosts/host_details.tsx index e3c971436ed1b..f6ad586a83b2b 100644 --- a/x-pack/legacy/plugins/siem/public/pages/hosts/host_details.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/hosts/host_details.tsx @@ -206,26 +206,30 @@ const HostDetailsComponent = pure( type={type} > {({ - uncommonProcesses, - totalCount, - loading, - pageInfo, - loadMore, id, inspect, + loading, + loadPage, + pageInfo, refetch, + totalCount, + uncommonProcesses, }) => ( )} @@ -261,26 +265,29 @@ const HostDetailsComponent = pure( > {({ events, - loading, id, inspect, + loading, + loadPage, + pageInfo, refetch, totalCount, - pageInfo, - loadMore, }) => ( )} diff --git a/x-pack/legacy/plugins/siem/public/pages/hosts/hosts.tsx b/x-pack/legacy/plugins/siem/public/pages/hosts/hosts.tsx index cee1b4bcaa7c2..5511f4cde2195 100644 --- a/x-pack/legacy/plugins/siem/public/pages/hosts/hosts.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/hosts/hosts.tsx @@ -114,23 +114,23 @@ const HostsComponent = pure(({ filterQuery, setAbsoluteRang totalCount, loading, pageInfo, - loadMore, + loadPage, id, inspect, refetch, }) => ( )} @@ -187,22 +187,22 @@ const HostsComponent = pure(({ filterQuery, setAbsoluteRang totalCount, loading, pageInfo, - loadMore, + loadPage, id, inspect, refetch, }) => ( )} @@ -243,20 +243,19 @@ const HostsComponent = pure(({ filterQuery, setAbsoluteRang refetch, totalCount, pageInfo, - loadMore, + loadPage, }) => ( )} diff --git a/x-pack/legacy/plugins/siem/public/pages/network/ip_details.tsx b/x-pack/legacy/plugins/siem/public/pages/network/ip_details.tsx index 19e380be49d54..f290966e4318a 100644 --- a/x-pack/legacy/plugins/siem/public/pages/network/ip_details.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/network/ip_details.tsx @@ -155,7 +155,7 @@ export const IPDetailsComponent = pure( totalCount, pageInfo, loading, - loadMore, + loadPage, refetch, }) => ( ( id={id} inspect={inspect} flowTarget={flowTarget} - hasNextPage={getOr(false, 'hasNextPage', pageInfo)!} + fakeTotalCount={getOr(50, 'fakeTotalCount', pageInfo)} ip={ip} loading={loading} - loadMore={loadMore} - nextCursor={getOr(null, 'endCursor.value', pageInfo)} + loadPage={loadPage} + showMorePagesIndicator={getOr( + false, + 'showMorePagesIndicator', + pageInfo + )} refetch={refetch} setQuery={setQuery} totalCount={totalCount} @@ -196,7 +200,7 @@ export const IPDetailsComponent = pure( totalCount, pageInfo, loading, - loadMore, + loadPage, refetch, }) => ( ( id={id} inspect={inspect} flowTarget={flowTarget} - hasNextPage={getOr(false, 'hasNextPage', pageInfo)!} + fakeTotalCount={getOr(50, 'fakeTotalCount', pageInfo)} loading={loading} - loadMore={loadMore} - nextCursor={getOr(null, 'endCursor.value', pageInfo)!} + loadPage={loadPage} + showMorePagesIndicator={getOr( + false, + 'showMorePagesIndicator', + pageInfo + )} refetch={refetch} setQuery={setQuery} totalCount={totalCount} @@ -235,17 +243,21 @@ export const IPDetailsComponent = pure( totalCount, pageInfo, loading, - loadMore, + loadPage, refetch, }) => ( ( loading, networkTopNFlow, pageInfo, - loadMore, + loadPage, id, inspect, refetch, }) => ( @@ -141,21 +145,25 @@ const NetworkComponent = pure( loading, networkDns, pageInfo, - loadMore, + loadPage, id, inspect, refetch, }) => ( diff --git a/x-pack/legacy/plugins/siem/public/store/hosts/actions.ts b/x-pack/legacy/plugins/siem/public/store/hosts/actions.ts index 2d1d5bd35e1b7..39240a15ba230 100644 --- a/x-pack/legacy/plugins/siem/public/store/hosts/actions.ts +++ b/x-pack/legacy/plugins/siem/public/store/hosts/actions.ts @@ -24,27 +24,11 @@ export const updateTableLimit = actionCreator<{ tableType: HostsTableType; }>('UPDATE_HOST_TABLE_LIMIT'); -export const updateAuthenticationsLimit = actionCreator<{ limit: number; hostsType: HostsType }>( - 'UPDATE_AUTHENTICATIONS_LIMIT' -); - -export const updateHostsLimit = actionCreator<{ limit: number; hostsType: HostsType }>( - 'UPDATE_HOSTS_LIMIT' -); - export const updateHostsSort = actionCreator<{ sort: HostsSortField; hostsType: HostsType; }>('UPDATE_HOSTS_SORT'); -export const updateEventsLimit = actionCreator<{ limit: number; hostsType: HostsType }>( - 'UPDATE_EVENTS_LIMIT' -); - -export const updateUncommonProcessesLimit = actionCreator<{ limit: number; hostsType: HostsType }>( - 'UPDATE_UNCOMMONPROCESSES_LIMIT' -); - export const setHostsFilterQueryDraft = actionCreator<{ filterQueryDraft: KueryFilterQuery; hostsType: HostsType; diff --git a/x-pack/legacy/plugins/siem/public/store/hosts/model.ts b/x-pack/legacy/plugins/siem/public/store/hosts/model.ts index e9a587727d207..0acacb506d49c 100644 --- a/x-pack/legacy/plugins/siem/public/store/hosts/model.ts +++ b/x-pack/legacy/plugins/siem/public/store/hosts/model.ts @@ -19,16 +19,12 @@ export enum HostsTableType { uncommonProcesses = 'uncommonProcesses', } -export interface BasicQuery { - limit: number; -} - export interface BasicQueryPaginated { activePage: number; limit: number; } -export interface HostsQuery extends BasicQuery { +export interface HostsQuery extends BasicQueryPaginated { direction: Direction; sortField: HostsFields; } @@ -36,8 +32,8 @@ export interface HostsQuery extends BasicQuery { interface Queries { authentications: BasicQueryPaginated; hosts: HostsQuery; - events: BasicQuery; - uncommonProcesses: BasicQuery; + events: BasicQueryPaginated; + uncommonProcesses: BasicQueryPaginated; } export interface GenericHostsModel { diff --git a/x-pack/legacy/plugins/siem/public/store/hosts/reducer.ts b/x-pack/legacy/plugins/siem/public/store/hosts/reducer.ts index 99df07758a4a1..7c40bac28da0b 100644 --- a/x-pack/legacy/plugins/siem/public/store/hosts/reducer.ts +++ b/x-pack/legacy/plugins/siem/public/store/hosts/reducer.ts @@ -12,43 +12,59 @@ import { DEFAULT_TABLE_ACTIVE_PAGE, DEFAULT_TABLE_LIMIT } from '../constants'; import { applyHostsFilterQuery, setHostsFilterQueryDraft, - updateAuthenticationsLimit, - updateEventsLimit, - updateHostsLimit, updateHostsSort, - updateUncommonProcessesLimit, updateTableActivePage, updateTableLimit, } from './actions'; -import { HostsModel } from './model'; +import { HostsModel, HostsTableType } from './model'; export type HostsState = HostsModel; export const initialHostsState: HostsState = { page: { queries: { - authentications: { limit: DEFAULT_TABLE_LIMIT, activePage: DEFAULT_TABLE_ACTIVE_PAGE }, - hosts: { + [HostsTableType.authentications]: { + activePage: DEFAULT_TABLE_ACTIVE_PAGE, limit: DEFAULT_TABLE_LIMIT, + }, + [HostsTableType.hosts]: { + activePage: DEFAULT_TABLE_ACTIVE_PAGE, direction: Direction.desc, + limit: DEFAULT_TABLE_LIMIT, sortField: HostsFields.lastSeen, }, - events: { limit: DEFAULT_TABLE_LIMIT }, - uncommonProcesses: { limit: DEFAULT_TABLE_LIMIT }, + [HostsTableType.events]: { + activePage: DEFAULT_TABLE_ACTIVE_PAGE, + limit: DEFAULT_TABLE_LIMIT, + }, + [HostsTableType.uncommonProcesses]: { + activePage: DEFAULT_TABLE_ACTIVE_PAGE, + limit: DEFAULT_TABLE_LIMIT, + }, }, filterQuery: null, filterQueryDraft: null, }, details: { queries: { - authentications: { limit: DEFAULT_TABLE_LIMIT, activePage: DEFAULT_TABLE_ACTIVE_PAGE }, - hosts: { + [HostsTableType.authentications]: { + activePage: DEFAULT_TABLE_ACTIVE_PAGE, limit: DEFAULT_TABLE_LIMIT, + }, + [HostsTableType.hosts]: { + activePage: DEFAULT_TABLE_ACTIVE_PAGE, direction: Direction.desc, + limit: DEFAULT_TABLE_LIMIT, sortField: HostsFields.lastSeen, }, - events: { limit: DEFAULT_TABLE_LIMIT }, - uncommonProcesses: { limit: DEFAULT_TABLE_LIMIT }, + [HostsTableType.events]: { + activePage: DEFAULT_TABLE_ACTIVE_PAGE, + limit: DEFAULT_TABLE_LIMIT, + }, + [HostsTableType.uncommonProcesses]: { + activePage: DEFAULT_TABLE_ACTIVE_PAGE, + limit: DEFAULT_TABLE_LIMIT, + }, }, filterQuery: null, filterQueryDraft: null, @@ -82,31 +98,6 @@ export const hostsReducer = reducerWithInitialState(initialHostsState) }, }, })) - .case(updateAuthenticationsLimit, (state, { limit, hostsType }) => ({ - ...state, - [hostsType]: { - ...state[hostsType], - queries: { - ...state[hostsType].queries, - authentications: { - limit, - }, - }, - }, - })) - .case(updateHostsLimit, (state, { limit, hostsType }) => ({ - ...state, - [hostsType]: { - ...state[hostsType], - queries: { - ...state[hostsType].queries, - hosts: { - ...state[hostsType].queries.hosts, - limit, - }, - }, - }, - })) .case(updateHostsSort, (state, { sort, hostsType }) => ({ ...state, [hostsType]: { @@ -121,30 +112,6 @@ export const hostsReducer = reducerWithInitialState(initialHostsState) }, }, })) - .case(updateEventsLimit, (state, { limit, hostsType }) => ({ - ...state, - [hostsType]: { - ...state[hostsType], - queries: { - ...state[hostsType].queries, - events: { - limit, - }, - }, - }, - })) - .case(updateUncommonProcessesLimit, (state, { limit, hostsType }) => ({ - ...state, - [hostsType]: { - ...state[hostsType], - queries: { - ...state[hostsType].queries, - uncommonProcesses: { - limit, - }, - }, - }, - })) .case(setHostsFilterQueryDraft, (state, { filterQueryDraft, hostsType }) => ({ ...state, [hostsType]: { diff --git a/x-pack/legacy/plugins/siem/public/store/network/actions.ts b/x-pack/legacy/plugins/siem/public/store/network/actions.ts index bb91db7717073..074aaefc8b4fc 100644 --- a/x-pack/legacy/plugins/siem/public/store/network/actions.ts +++ b/x-pack/legacy/plugins/siem/public/store/network/actions.ts @@ -17,10 +17,20 @@ import { } from '../../graphql/types'; import { KueryFilterQuery, SerializedFilterQuery } from '../model'; -import { NetworkType } from './model'; +import { IpDetailsTableType, NetworkTableType, NetworkType } from './model'; const actionCreator = actionCreatorFactory('x-pack/siem/local/network'); +export const updateNetworkPageTableActivePage = actionCreator<{ + activePage: number; + tableType: NetworkTableType; +}>('UPDATE_NETWORK_PAGE_TABLE_ACTIVE_PAGE'); + +export const updateIpDetailsTableActivePage = actionCreator<{ + activePage: number; + tableType: IpDetailsTableType; +}>('UPDATE_NETWORK_DETAILS_TABLE_ACTIVE_PAGE'); + export const updateDnsLimit = actionCreator<{ limit: number; networkType: NetworkType; diff --git a/x-pack/legacy/plugins/siem/public/store/network/model.ts b/x-pack/legacy/plugins/siem/public/store/network/model.ts index dc49d2cbdd753..c0dbc964f479e 100644 --- a/x-pack/legacy/plugins/siem/public/store/network/model.ts +++ b/x-pack/legacy/plugins/siem/public/store/network/model.ts @@ -20,25 +20,37 @@ export enum NetworkType { details = 'details', } -export interface BasicQuery { +export enum NetworkTableType { + dns = 'dns', + topNFlow = 'topNFlow', +} + +export enum IpDetailsTableType { + domains = 'domains', + tls = 'tls', + users = 'users', +} + +export interface BasicQueryPaginated { + activePage: number; limit: number; } // Network Page Models -export interface TopNFlowQuery extends BasicQuery { +export interface TopNFlowQuery extends BasicQueryPaginated { flowTarget: FlowTarget; topNFlowSort: NetworkTopNFlowSortField; flowDirection: FlowDirection; } -export interface DnsQuery extends BasicQuery { +export interface DnsQuery extends BasicQueryPaginated { dnsSortField: NetworkDnsSortField; isPtrIncluded: boolean; } interface NetworkQueries { - topNFlow: TopNFlowQuery; - dns: DnsQuery; + [NetworkTableType.dns]: DnsQuery; + [NetworkTableType.topNFlow]: TopNFlowQuery; } export interface NetworkPageModel { @@ -48,23 +60,23 @@ export interface NetworkPageModel { } // IP Details Models -export interface DomainsQuery extends BasicQuery { +export interface DomainsQuery extends BasicQueryPaginated { flowDirection: FlowDirection; domainsSortField: DomainsSortField; } -export interface TlsQuery extends BasicQuery { +export interface TlsQuery extends BasicQueryPaginated { tlsSortField: TlsSortField; } -export interface UsersQuery extends BasicQuery { +export interface UsersQuery extends BasicQueryPaginated { usersSortField: UsersSortField; } interface IpOverviewQueries { - domains: DomainsQuery; - tls: TlsQuery; - users: UsersQuery; + [IpDetailsTableType.domains]: DomainsQuery; + [IpDetailsTableType.tls]: TlsQuery; + [IpDetailsTableType.users]: UsersQuery; } export interface NetworkDetailsModel { diff --git a/x-pack/legacy/plugins/siem/public/store/network/reducer.ts b/x-pack/legacy/plugins/siem/public/store/network/reducer.ts index 9bc4040eb277c..6482182c65727 100644 --- a/x-pack/legacy/plugins/siem/public/store/network/reducer.ts +++ b/x-pack/legacy/plugins/siem/public/store/network/reducer.ts @@ -16,7 +16,7 @@ import { TlsFields, UsersFields, } from '../../graphql/types'; -import { DEFAULT_TABLE_LIMIT } from '../constants'; +import { DEFAULT_TABLE_ACTIVE_PAGE, DEFAULT_TABLE_LIMIT } from '../constants'; import { applyNetworkFilterQuery, @@ -29,6 +29,8 @@ import { updateDomainsSort, updateIpDetailsFlowTarget, updateIsPtrIncluded, + updateIpDetailsTableActivePage, + updateNetworkPageTableActivePage, updateTopNFlowDirection, updateTopNFlowLimit, updateTopNFlowSort, @@ -38,14 +40,15 @@ import { updateUsersSort, } from './actions'; import { helperUpdateTopNFlowDirection } from './helper'; -import { NetworkModel, NetworkType } from './model'; +import { IpDetailsTableType, NetworkModel, NetworkTableType, NetworkType } from './model'; export type NetworkState = NetworkModel; export const initialNetworkState: NetworkState = { page: { queries: { - topNFlow: { + [NetworkTableType.topNFlow]: { + activePage: DEFAULT_TABLE_ACTIVE_PAGE, limit: DEFAULT_TABLE_LIMIT, topNFlowSort: { field: NetworkTopNFlowFields.bytes, @@ -54,7 +57,8 @@ export const initialNetworkState: NetworkState = { flowTarget: FlowTarget.source, flowDirection: FlowDirection.uniDirectional, }, - dns: { + [NetworkTableType.dns]: { + activePage: DEFAULT_TABLE_ACTIVE_PAGE, limit: DEFAULT_TABLE_LIMIT, dnsSortField: { field: NetworkDnsFields.uniqueDomains, @@ -68,7 +72,8 @@ export const initialNetworkState: NetworkState = { }, details: { queries: { - domains: { + [IpDetailsTableType.domains]: { + activePage: DEFAULT_TABLE_ACTIVE_PAGE, flowDirection: FlowDirection.uniDirectional, limit: DEFAULT_TABLE_LIMIT, domainsSortField: { @@ -76,14 +81,16 @@ export const initialNetworkState: NetworkState = { direction: Direction.desc, }, }, - tls: { + [IpDetailsTableType.tls]: { + activePage: DEFAULT_TABLE_ACTIVE_PAGE, limit: DEFAULT_TABLE_LIMIT, tlsSortField: { field: TlsFields._id, direction: Direction.desc, }, }, - users: { + [IpDetailsTableType.users]: { + activePage: DEFAULT_TABLE_ACTIVE_PAGE, limit: DEFAULT_TABLE_LIMIT, usersSortField: { field: UsersFields.name, @@ -98,13 +105,39 @@ export const initialNetworkState: NetworkState = { }; export const networkReducer = reducerWithInitialState(initialNetworkState) + .case(updateIpDetailsTableActivePage, (state, { activePage, tableType }) => ({ + ...state, + [NetworkType.details]: { + ...state[NetworkType.details], + queries: { + ...state[NetworkType.details].queries, + [tableType]: { + ...state[NetworkType.details].queries[tableType], + activePage, + }, + }, + }, + })) + .case(updateNetworkPageTableActivePage, (state, { activePage, tableType }) => ({ + ...state, + [NetworkType.page]: { + ...state[NetworkType.page], + queries: { + ...state[NetworkType.page].queries, + [tableType]: { + ...state[NetworkType.page].queries[tableType], + activePage, + }, + }, + }, + })) .case(updateDnsLimit, (state, { limit, networkType }) => ({ ...state, [networkType]: { ...state[networkType], queries: { ...state[networkType].queries, - dns: { + [NetworkTableType.dns]: { ...state[NetworkType.page].queries.dns, limit, }, @@ -117,7 +150,7 @@ export const networkReducer = reducerWithInitialState(initialNetworkState) ...state[networkType], queries: { ...state[networkType].queries, - dns: { + [NetworkTableType.dns]: { ...state[NetworkType.page].queries.dns, dnsSortField, }, @@ -130,7 +163,7 @@ export const networkReducer = reducerWithInitialState(initialNetworkState) ...state[networkType], queries: { ...state[networkType].queries, - dns: { + [NetworkTableType.dns]: { ...state[NetworkType.page].queries.dns, isPtrIncluded, }, @@ -143,7 +176,7 @@ export const networkReducer = reducerWithInitialState(initialNetworkState) ...state[networkType], queries: { ...state[networkType].queries, - topNFlow: { + [NetworkTableType.topNFlow]: { ...state[NetworkType.page].queries.topNFlow, limit, }, @@ -156,7 +189,7 @@ export const networkReducer = reducerWithInitialState(initialNetworkState) ...state[networkType], queries: { ...state[networkType].queries, - topNFlow: { + [NetworkTableType.topNFlow]: { ...state[NetworkType.page].queries.topNFlow, ...helperUpdateTopNFlowDirection( state[NetworkType.page].queries.topNFlow.flowTarget, @@ -172,7 +205,7 @@ export const networkReducer = reducerWithInitialState(initialNetworkState) ...state[networkType], queries: { ...state[networkType].queries, - topNFlow: { + [NetworkTableType.topNFlow]: { ...state[NetworkType.page].queries.topNFlow, topNFlowSort, }, @@ -185,7 +218,7 @@ export const networkReducer = reducerWithInitialState(initialNetworkState) ...state[NetworkType.page], queries: { ...state[NetworkType.page].queries, - topNFlow: { + [NetworkTableType.topNFlow]: { ...state[NetworkType.page].queries.topNFlow, flowTarget, topNFlowSort: { @@ -224,7 +257,7 @@ export const networkReducer = reducerWithInitialState(initialNetworkState) ...state[NetworkType.details], queries: { ...state[NetworkType.details].queries, - domains: { + [IpDetailsTableType.domains]: { ...state[NetworkType.details].queries.domains, limit, }, @@ -237,7 +270,7 @@ export const networkReducer = reducerWithInitialState(initialNetworkState) ...state[NetworkType.details], queries: { ...state[NetworkType.details].queries, - tls: { + [IpDetailsTableType.tls]: { ...state[NetworkType.details].queries.tls, limit, }, @@ -250,7 +283,7 @@ export const networkReducer = reducerWithInitialState(initialNetworkState) ...state[NetworkType.details], queries: { ...state[NetworkType.details].queries, - domains: { + [IpDetailsTableType.domains]: { ...state[NetworkType.details].queries.domains, flowDirection, }, @@ -263,7 +296,7 @@ export const networkReducer = reducerWithInitialState(initialNetworkState) ...state[NetworkType.details], queries: { ...state[NetworkType.details].queries, - domains: { + [IpDetailsTableType.domains]: { ...state[NetworkType.details].queries.domains, domainsSortField, }, @@ -276,7 +309,7 @@ export const networkReducer = reducerWithInitialState(initialNetworkState) ...state[NetworkType.details], queries: { ...state[NetworkType.details].queries, - tls: { + [IpDetailsTableType.tls]: { ...state[NetworkType.details].queries.tls, tlsSortField, }, @@ -289,7 +322,7 @@ export const networkReducer = reducerWithInitialState(initialNetworkState) ...state[NetworkType.details], queries: { ...state[NetworkType.details].queries, - users: { + [IpDetailsTableType.users]: { ...state[NetworkType.details].queries.users, limit, }, @@ -302,7 +335,7 @@ export const networkReducer = reducerWithInitialState(initialNetworkState) ...state[NetworkType.details], queries: { ...state[NetworkType.details].queries, - users: { + [IpDetailsTableType.users]: { ...state[NetworkType.details].queries.users, usersSortField, }, diff --git a/x-pack/legacy/plugins/siem/server/graphql/events/resolvers.ts b/x-pack/legacy/plugins/siem/server/graphql/events/resolvers.ts index 720bc9530be27..f2ee5e3028549 100644 --- a/x-pack/legacy/plugins/siem/server/graphql/events/resolvers.ts +++ b/x-pack/legacy/plugins/siem/server/graphql/events/resolvers.ts @@ -8,7 +8,7 @@ import { GraphQLScalarType, Kind } from 'graphql'; import { Events } from '../../lib/events'; import { AppResolverOf, ChildResolverOf } from '../../lib/framework'; -import { createOptions } from '../../utils/build_query/create_options'; +import { createOptions, createOptionsPaginated } from '../../utils/build_query/create_options'; import { QuerySourceResolver } from '../sources/resolvers'; import { SourceResolvers } from '../types'; import { LastEventTimeRequestOptions } from '../../lib/events/types'; @@ -49,7 +49,7 @@ export const createEventsResolvers = ( } => ({ Source: { async Events(source, args, { req }, info) { - const options = createOptions(source, args, info); + const options = createOptionsPaginated(source, args, info); return libs.events.getEvents(req, options); }, async Timeline(source, args, { req }, info) { diff --git a/x-pack/legacy/plugins/siem/server/graphql/events/schema.gql.ts b/x-pack/legacy/plugins/siem/server/graphql/events/schema.gql.ts index f934faffcf4f9..376f4b7e96426 100644 --- a/x-pack/legacy/plugins/siem/server/graphql/events/schema.gql.ts +++ b/x-pack/legacy/plugins/siem/server/graphql/events/schema.gql.ts @@ -10,6 +10,13 @@ export const eventsSchema = gql` scalar EsValue type EventsData { + edges: [EcsEdges!]! + totalCount: Float! + pageInfo: PageInfoPaginated! + inspect: Inspect + } + + type EventsTimelineData { edges: [EcsEdges!]! totalCount: Float! pageInfo: PageInfo! @@ -75,7 +82,7 @@ export const eventsSchema = gql` extend type Source { "Gets events based on timerange and specified criteria, or all events in the timerange if no criteria is specified" Events( - pagination: PaginationInput! + pagination: PaginationInputPaginated! sortField: SortField! timerange: TimerangeInput filterQuery: String diff --git a/x-pack/legacy/plugins/siem/server/graphql/hosts/resolvers.ts b/x-pack/legacy/plugins/siem/server/graphql/hosts/resolvers.ts index 22a744a3cf5b8..65403c4b31261 100644 --- a/x-pack/legacy/plugins/siem/server/graphql/hosts/resolvers.ts +++ b/x-pack/legacy/plugins/siem/server/graphql/hosts/resolvers.ts @@ -15,7 +15,7 @@ import { HostLastFirstSeenRequestOptions, } from '../../lib/hosts'; import { getFields } from '../../utils/build_query'; -import { createOptions } from '../../utils/build_query/create_options'; +import { createOptionsPaginated } from '../../utils/build_query/create_options'; import { QuerySourceResolver } from '../sources/resolvers'; type QueryHostsResolver = ChildResolverOf< @@ -49,7 +49,7 @@ export const createHostsResolvers = ( Source: { async Hosts(source, args, { req }, info) { const options: HostsRequestOptions = { - ...createOptions(source, args, info), + ...createOptionsPaginated(source, args, info), sort: args.sort, defaultIndex: args.defaultIndex, }; diff --git a/x-pack/legacy/plugins/siem/server/graphql/hosts/schema.gql.ts b/x-pack/legacy/plugins/siem/server/graphql/hosts/schema.gql.ts index db9ce410f23a0..d813a08cad6db 100644 --- a/x-pack/legacy/plugins/siem/server/graphql/hosts/schema.gql.ts +++ b/x-pack/legacy/plugins/siem/server/graphql/hosts/schema.gql.ts @@ -57,7 +57,7 @@ export const hostsSchema = gql` type HostsData { edges: [HostsEdges!]! totalCount: Float! - pageInfo: PageInfo! + pageInfo: PageInfoPaginated! inspect: Inspect } @@ -82,7 +82,7 @@ export const hostsSchema = gql` Hosts( id: String timerange: TimerangeInput! - pagination: PaginationInput! + pagination: PaginationInputPaginated! sort: HostsSortField! filterQuery: String defaultIndex: [String!]! diff --git a/x-pack/legacy/plugins/siem/server/graphql/ip_details/resolvers.ts b/x-pack/legacy/plugins/siem/server/graphql/ip_details/resolvers.ts index 3e962f887b962..102cc4d0ae08c 100644 --- a/x-pack/legacy/plugins/siem/server/graphql/ip_details/resolvers.ts +++ b/x-pack/legacy/plugins/siem/server/graphql/ip_details/resolvers.ts @@ -12,7 +12,7 @@ import { TlsRequestOptions, UsersRequestOptions, } from '../../lib/ip_details'; -import { createOptions } from '../../utils/build_query/create_options'; +import { createOptions, createOptionsPaginated } from '../../utils/build_query/create_options'; import { QuerySourceResolver } from '../sources/resolvers'; export type QueryIpOverviewResolver = ChildResolverOf< @@ -56,7 +56,7 @@ export const createIpDetailsResolvers = ( }, async Domains(source, args, { req }, info) { const options: DomainsRequestOptions = { - ...createOptions(source, args, info), + ...createOptionsPaginated(source, args, info), ip: args.ip, domainsSortField: args.sort, flowTarget: args.flowTarget, @@ -66,7 +66,7 @@ export const createIpDetailsResolvers = ( }, async Tls(source, args, { req }, info) { const options: TlsRequestOptions = { - ...createOptions(source, args, info), + ...createOptionsPaginated(source, args, info), ip: args.ip, tlsSortField: args.sort, flowTarget: args.flowTarget, @@ -75,7 +75,7 @@ export const createIpDetailsResolvers = ( }, async Users(source, args, { req }, info) { const options: UsersRequestOptions = { - ...createOptions(source, args, info), + ...createOptionsPaginated(source, args, info), ip: args.ip, usersSortField: args.sort, flowTarget: args.flowTarget, diff --git a/x-pack/legacy/plugins/siem/server/graphql/ip_details/schema.gql.ts b/x-pack/legacy/plugins/siem/server/graphql/ip_details/schema.gql.ts index ee382eba345ec..21cd330c6f4b7 100644 --- a/x-pack/legacy/plugins/siem/server/graphql/ip_details/schema.gql.ts +++ b/x-pack/legacy/plugins/siem/server/graphql/ip_details/schema.gql.ts @@ -85,7 +85,7 @@ const domainsSchema = gql` type DomainsData { edges: [DomainsEdges!]! totalCount: Float! - pageInfo: PageInfo! + pageInfo: PageInfoPaginated! inspect: Inspect } @@ -94,7 +94,7 @@ const domainsSchema = gql` filterQuery: String id: String ip: String! - pagination: PaginationInput! + pagination: PaginationInputPaginated! sort: DomainsSortField! flowDirection: FlowDirection! flowTarget: FlowTarget! @@ -128,7 +128,7 @@ const tlsSchema = gql` type TlsData { edges: [TlsEdges!]! totalCount: Float! - pageInfo: PageInfo! + pageInfo: PageInfoPaginated! inspect: Inspect } extend type Source { @@ -136,7 +136,7 @@ const tlsSchema = gql` filterQuery: String id: String ip: String! - pagination: PaginationInput! + pagination: PaginationInputPaginated! sort: TlsSortField! flowTarget: FlowTarget! timerange: TimerangeInput! @@ -178,7 +178,7 @@ const usersSchema = gql` type UsersData { edges: [UsersEdges!]! totalCount: Float! - pageInfo: PageInfo! + pageInfo: PageInfoPaginated! inspect: Inspect } @@ -187,7 +187,7 @@ const usersSchema = gql` filterQuery: String id: String ip: String! - pagination: PaginationInput! + pagination: PaginationInputPaginated! sort: UsersSortField! flowTarget: FlowTarget! timerange: TimerangeInput! diff --git a/x-pack/legacy/plugins/siem/server/graphql/network/resolvers.ts b/x-pack/legacy/plugins/siem/server/graphql/network/resolvers.ts index eb3b7473fbde3..6d29283b5fe1f 100644 --- a/x-pack/legacy/plugins/siem/server/graphql/network/resolvers.ts +++ b/x-pack/legacy/plugins/siem/server/graphql/network/resolvers.ts @@ -7,7 +7,7 @@ import { SourceResolvers } from '../../graphql/types'; import { AppResolverOf, ChildResolverOf } from '../../lib/framework'; import { Network } from '../../lib/network'; -import { createOptions } from '../../utils/build_query/create_options'; +import { createOptionsPaginated } from '../../utils/build_query/create_options'; import { QuerySourceResolver } from '../sources/resolvers'; type QueryNetworkTopNFlowResolver = ChildResolverOf< @@ -35,7 +35,7 @@ export const createNetworkResolvers = ( Source: { async NetworkTopNFlow(source, args, { req }, info) { const options = { - ...createOptions(source, args, info), + ...createOptionsPaginated(source, args, info), flowTarget: args.flowTarget, networkTopNFlowSort: args.sort, flowDirection: args.flowDirection, @@ -44,7 +44,7 @@ export const createNetworkResolvers = ( }, async NetworkDns(source, args, { req }, info) { const options = { - ...createOptions(source, args, info), + ...createOptionsPaginated(source, args, info), networkDnsSortField: args.sort, isPtrIncluded: args.isPtrIncluded, }; diff --git a/x-pack/legacy/plugins/siem/server/graphql/network/schema.gql.ts b/x-pack/legacy/plugins/siem/server/graphql/network/schema.gql.ts index 70f7380c97f91..3d5f74e9ca46b 100644 --- a/x-pack/legacy/plugins/siem/server/graphql/network/schema.gql.ts +++ b/x-pack/legacy/plugins/siem/server/graphql/network/schema.gql.ts @@ -59,7 +59,7 @@ export const networkSchema = gql` type NetworkTopNFlowData { edges: [NetworkTopNFlowEdges!]! totalCount: Float! - pageInfo: PageInfo! + pageInfo: PageInfoPaginated! inspect: Inspect } @@ -93,7 +93,7 @@ export const networkSchema = gql` type NetworkDnsData { edges: [NetworkDnsEdges!]! totalCount: Float! - pageInfo: PageInfo! + pageInfo: PageInfoPaginated! inspect: Inspect } @@ -104,7 +104,7 @@ export const networkSchema = gql` filterQuery: String flowDirection: FlowDirection! flowTarget: FlowTarget! - pagination: PaginationInput! + pagination: PaginationInputPaginated! sort: NetworkTopNFlowSortField! timerange: TimerangeInput! defaultIndex: [String!]! @@ -113,7 +113,7 @@ export const networkSchema = gql` filterQuery: String id: String isPtrIncluded: Boolean! - pagination: PaginationInput! + pagination: PaginationInputPaginated! sort: NetworkDnsSortField! timerange: TimerangeInput! defaultIndex: [String!]! diff --git a/x-pack/legacy/plugins/siem/server/graphql/types.ts b/x-pack/legacy/plugins/siem/server/graphql/types.ts index 1fd83d65b2621..6e14ba97f1c8a 100644 --- a/x-pack/legacy/plugins/siem/server/graphql/types.ts +++ b/x-pack/legacy/plugins/siem/server/graphql/types.ts @@ -367,7 +367,7 @@ export interface EventsData { totalCount: number; - pageInfo: PageInfo; + pageInfo: PageInfoPaginated; inspect?: Inspect | null; } @@ -830,12 +830,6 @@ export interface SshEcsFields { signature?: ToStringArray | null; } -export interface PageInfo { - endCursor?: CursorType | null; - - hasNextPage?: boolean | null; -} - export interface TimelineData { edges: TimelineEdges[]; @@ -868,6 +862,12 @@ export interface TimelineNonEcsData { value?: ToStringArray | null; } +export interface PageInfo { + endCursor?: CursorType | null; + + hasNextPage?: boolean | null; +} + export interface TimelineDetailsData { data?: DetailItem[] | null; @@ -901,7 +901,7 @@ export interface HostsData { totalCount: number; - pageInfo: PageInfo; + pageInfo: PageInfoPaginated; inspect?: Inspect | null; } @@ -987,7 +987,7 @@ export interface DomainsData { totalCount: number; - pageInfo: PageInfo; + pageInfo: PageInfoPaginated; inspect?: Inspect | null; } @@ -1039,7 +1039,7 @@ export interface TlsData { totalCount: number; - pageInfo: PageInfo; + pageInfo: PageInfoPaginated; inspect?: Inspect | null; } @@ -1071,7 +1071,7 @@ export interface UsersData { totalCount: number; - pageInfo: PageInfo; + pageInfo: PageInfoPaginated; inspect?: Inspect | null; } @@ -1183,7 +1183,7 @@ export interface NetworkTopNFlowData { totalCount: number; - pageInfo: PageInfo; + pageInfo: PageInfoPaginated; inspect?: Inspect | null; } @@ -1231,7 +1231,7 @@ export interface NetworkDnsData { totalCount: number; - pageInfo: PageInfo; + pageInfo: PageInfoPaginated; inspect?: Inspect | null; } @@ -1303,7 +1303,7 @@ export interface UncommonProcessesData { totalCount: number; - pageInfo: PageInfo; + pageInfo: PageInfoPaginated; inspect?: Inspect | null; } @@ -1512,6 +1512,16 @@ export interface ResponseFavoriteTimeline { favorite?: FavoriteTimelineResult[] | null; } +export interface EventsTimelineData { + edges: EcsEdges[]; + + totalCount: number; + + pageInfo: PageInfo; + + inspect?: Inspect | null; +} + export interface OsFields { platform?: string | null; @@ -1578,6 +1588,12 @@ export interface PaginationInputPaginated { querySize: number; } +export interface SortField { + sortFieldId: string; + + direction: Direction; +} + export interface PaginationInput { /** The limit parameter allows you to configure the maximum amount of items to be returned */ limit: number; @@ -1587,12 +1603,6 @@ export interface PaginationInput { tiebreaker?: string | null; } -export interface SortField { - sortFieldId: string; - - direction: Direction; -} - export interface LastTimeDetails { hostName?: string | null; @@ -1810,7 +1820,7 @@ export interface AuthenticationsSourceArgs { defaultIndex: string[]; } export interface EventsSourceArgs { - pagination: PaginationInput; + pagination: PaginationInputPaginated; sortField: SortField; @@ -1854,7 +1864,7 @@ export interface HostsSourceArgs { timerange: TimerangeInput; - pagination: PaginationInput; + pagination: PaginationInputPaginated; sort: HostsSortField; @@ -1894,7 +1904,7 @@ export interface DomainsSourceArgs { ip: string; - pagination: PaginationInput; + pagination: PaginationInputPaginated; sort: DomainsSortField; @@ -1913,7 +1923,7 @@ export interface TlsSourceArgs { ip: string; - pagination: PaginationInput; + pagination: PaginationInputPaginated; sort: TlsSortField; @@ -1930,7 +1940,7 @@ export interface UsersSourceArgs { ip: string; - pagination: PaginationInput; + pagination: PaginationInputPaginated; sort: UsersSortField; @@ -1976,7 +1986,7 @@ export interface NetworkTopNFlowSourceArgs { flowTarget: FlowTarget; - pagination: PaginationInput; + pagination: PaginationInputPaginated; sort: NetworkTopNFlowSortField; @@ -1991,7 +2001,7 @@ export interface NetworkDnsSourceArgs { isPtrIncluded: boolean; - pagination: PaginationInput; + pagination: PaginationInputPaginated; sort: NetworkDnsSortField; @@ -2020,7 +2030,7 @@ export interface OverviewHostSourceArgs { export interface UncommonProcessesSourceArgs { timerange: TimerangeInput; - pagination: PaginationInput; + pagination: PaginationInputPaginated; filterQuery?: string | null; @@ -2536,7 +2546,7 @@ export namespace SourceResolvers { EventsArgs >; export interface EventsArgs { - pagination: PaginationInput; + pagination: PaginationInputPaginated; sortField: SortField; @@ -2606,7 +2616,7 @@ export namespace SourceResolvers { timerange: TimerangeInput; - pagination: PaginationInput; + pagination: PaginationInputPaginated; sort: HostsSortField; @@ -2672,7 +2682,7 @@ export namespace SourceResolvers { ip: string; - pagination: PaginationInput; + pagination: PaginationInputPaginated; sort: DomainsSortField; @@ -2698,7 +2708,7 @@ export namespace SourceResolvers { ip: string; - pagination: PaginationInput; + pagination: PaginationInputPaginated; sort: TlsSortField; @@ -2722,7 +2732,7 @@ export namespace SourceResolvers { ip: string; - pagination: PaginationInput; + pagination: PaginationInputPaginated; sort: UsersSortField; @@ -2793,7 +2803,7 @@ export namespace SourceResolvers { flowTarget: FlowTarget; - pagination: PaginationInput; + pagination: PaginationInputPaginated; sort: NetworkTopNFlowSortField; @@ -2814,7 +2824,7 @@ export namespace SourceResolvers { isPtrIncluded: boolean; - pagination: PaginationInput; + pagination: PaginationInputPaginated; sort: NetworkDnsSortField; @@ -2861,7 +2871,7 @@ export namespace SourceResolvers { export interface UncommonProcessesArgs { timerange: TimerangeInput; - pagination: PaginationInput; + pagination: PaginationInputPaginated; filterQuery?: string | null; @@ -3488,7 +3498,7 @@ export namespace EventsDataResolvers { totalCount?: TotalCountResolver; - pageInfo?: PageInfoResolver; + pageInfo?: PageInfoResolver; inspect?: InspectResolver; } @@ -3503,11 +3513,11 @@ export namespace EventsDataResolvers { Parent, Context >; - export type PageInfoResolver = Resolver< - R, - Parent, - Context - >; + export type PageInfoResolver< + R = PageInfoPaginated, + Parent = EventsData, + Context = SiemContext + > = Resolver; export type InspectResolver< R = Inspect | null, Parent = EventsData, @@ -5050,25 +5060,6 @@ export namespace SshEcsFieldsResolvers { > = Resolver; } -export namespace PageInfoResolvers { - export interface Resolvers { - endCursor?: EndCursorResolver; - - hasNextPage?: HasNextPageResolver; - } - - export type EndCursorResolver< - R = CursorType | null, - Parent = PageInfo, - Context = SiemContext - > = Resolver; - export type HasNextPageResolver< - R = boolean | null, - Parent = PageInfo, - Context = SiemContext - > = Resolver; -} - export namespace TimelineDataResolvers { export interface Resolvers { edges?: EdgesResolver; @@ -5173,6 +5164,25 @@ export namespace TimelineNonEcsDataResolvers { > = Resolver; } +export namespace PageInfoResolvers { + export interface Resolvers { + endCursor?: EndCursorResolver; + + hasNextPage?: HasNextPageResolver; + } + + export type EndCursorResolver< + R = CursorType | null, + Parent = PageInfo, + Context = SiemContext + > = Resolver; + export type HasNextPageResolver< + R = boolean | null, + Parent = PageInfo, + Context = SiemContext + > = Resolver; +} + export namespace TimelineDetailsDataResolvers { export interface Resolvers { data?: DataResolver; @@ -5271,7 +5281,7 @@ export namespace HostsDataResolvers { totalCount?: TotalCountResolver; - pageInfo?: PageInfoResolver; + pageInfo?: PageInfoResolver; inspect?: InspectResolver; } @@ -5286,11 +5296,11 @@ export namespace HostsDataResolvers { Parent, Context >; - export type PageInfoResolver = Resolver< - R, - Parent, - Context - >; + export type PageInfoResolver< + R = PageInfoPaginated, + Parent = HostsData, + Context = SiemContext + > = Resolver; export type InspectResolver< R = Inspect | null, Parent = HostsData, @@ -5552,7 +5562,7 @@ export namespace DomainsDataResolvers { totalCount?: TotalCountResolver; - pageInfo?: PageInfoResolver; + pageInfo?: PageInfoResolver; inspect?: InspectResolver; } @@ -5568,7 +5578,7 @@ export namespace DomainsDataResolvers { Context = SiemContext > = Resolver; export type PageInfoResolver< - R = PageInfo, + R = PageInfoPaginated, Parent = DomainsData, Context = SiemContext > = Resolver; @@ -5724,7 +5734,7 @@ export namespace TlsDataResolvers { totalCount?: TotalCountResolver; - pageInfo?: PageInfoResolver; + pageInfo?: PageInfoResolver; inspect?: InspectResolver; } @@ -5739,11 +5749,11 @@ export namespace TlsDataResolvers { Parent, Context >; - export type PageInfoResolver = Resolver< - R, - Parent, - Context - >; + export type PageInfoResolver< + R = PageInfoPaginated, + Parent = TlsData, + Context = SiemContext + > = Resolver; export type InspectResolver< R = Inspect | null, Parent = TlsData, @@ -5830,7 +5840,7 @@ export namespace UsersDataResolvers { totalCount?: TotalCountResolver; - pageInfo?: PageInfoResolver; + pageInfo?: PageInfoResolver; inspect?: InspectResolver; } @@ -5845,11 +5855,11 @@ export namespace UsersDataResolvers { Parent, Context >; - export type PageInfoResolver = Resolver< - R, - Parent, - Context - >; + export type PageInfoResolver< + R = PageInfoPaginated, + Parent = UsersData, + Context = SiemContext + > = Resolver; export type InspectResolver< R = Inspect | null, Parent = UsersData, @@ -6248,7 +6258,7 @@ export namespace NetworkTopNFlowDataResolvers { totalCount?: TotalCountResolver; - pageInfo?: PageInfoResolver; + pageInfo?: PageInfoResolver; inspect?: InspectResolver; } @@ -6264,7 +6274,7 @@ export namespace NetworkTopNFlowDataResolvers { Context = SiemContext > = Resolver; export type PageInfoResolver< - R = PageInfo, + R = PageInfoPaginated, Parent = NetworkTopNFlowData, Context = SiemContext > = Resolver; @@ -6406,7 +6416,7 @@ export namespace NetworkDnsDataResolvers { totalCount?: TotalCountResolver; - pageInfo?: PageInfoResolver; + pageInfo?: PageInfoResolver; inspect?: InspectResolver; } @@ -6422,7 +6432,7 @@ export namespace NetworkDnsDataResolvers { Context = SiemContext > = Resolver; export type PageInfoResolver< - R = PageInfo, + R = PageInfoPaginated, Parent = NetworkDnsData, Context = SiemContext > = Resolver; @@ -6648,7 +6658,7 @@ export namespace UncommonProcessesDataResolvers { totalCount?: TotalCountResolver; - pageInfo?: PageInfoResolver; + pageInfo?: PageInfoResolver; inspect?: InspectResolver; } @@ -6664,7 +6674,7 @@ export namespace UncommonProcessesDataResolvers { Context = SiemContext > = Resolver; export type PageInfoResolver< - R = PageInfo, + R = PageInfoPaginated, Parent = UncommonProcessesData, Context = SiemContext > = Resolver; @@ -7410,6 +7420,39 @@ export namespace ResponseFavoriteTimelineResolvers { > = Resolver; } +export namespace EventsTimelineDataResolvers { + export interface Resolvers { + edges?: EdgesResolver; + + totalCount?: TotalCountResolver; + + pageInfo?: PageInfoResolver; + + inspect?: InspectResolver; + } + + export type EdgesResolver< + R = EcsEdges[], + Parent = EventsTimelineData, + Context = SiemContext + > = Resolver; + export type TotalCountResolver< + R = number, + Parent = EventsTimelineData, + Context = SiemContext + > = Resolver; + export type PageInfoResolver< + R = PageInfo, + Parent = EventsTimelineData, + Context = SiemContext + > = Resolver; + export type InspectResolver< + R = Inspect | null, + Parent = EventsTimelineData, + Context = SiemContext + > = Resolver; +} + export namespace OsFieldsResolvers { export interface Resolvers { platform?: PlatformResolver; diff --git a/x-pack/legacy/plugins/siem/server/graphql/uncommon_processes/resolvers.ts b/x-pack/legacy/plugins/siem/server/graphql/uncommon_processes/resolvers.ts index 9319d620ccf85..03d3c3d1a1fe4 100644 --- a/x-pack/legacy/plugins/siem/server/graphql/uncommon_processes/resolvers.ts +++ b/x-pack/legacy/plugins/siem/server/graphql/uncommon_processes/resolvers.ts @@ -7,7 +7,7 @@ import { SourceResolvers } from '../../graphql/types'; import { AppResolverOf, ChildResolverOf } from '../../lib/framework'; import { UncommonProcesses } from '../../lib/uncommon_processes'; -import { createOptions } from '../../utils/build_query/create_options'; +import { createOptionsPaginated } from '../../utils/build_query/create_options'; import { QuerySourceResolver } from '../sources/resolvers'; type QueryUncommonProcessesResolver = ChildResolverOf< @@ -28,7 +28,7 @@ export const createUncommonProcessesResolvers = ( } => ({ Source: { async UncommonProcesses(source, args, { req }, info) { - const options = createOptions(source, args, info); + const options = createOptionsPaginated(source, args, info); return libs.uncommonProcesses.getUncommonProcesses(req, options); }, }, diff --git a/x-pack/legacy/plugins/siem/server/graphql/uncommon_processes/schema.gql.ts b/x-pack/legacy/plugins/siem/server/graphql/uncommon_processes/schema.gql.ts index 2a6a0b342251f..36a3da6779172 100644 --- a/x-pack/legacy/plugins/siem/server/graphql/uncommon_processes/schema.gql.ts +++ b/x-pack/legacy/plugins/siem/server/graphql/uncommon_processes/schema.gql.ts @@ -23,7 +23,7 @@ export const uncommonProcessesSchema = gql` type UncommonProcessesData { edges: [UncommonProcessesEdges!]! totalCount: Float! - pageInfo: PageInfo! + pageInfo: PageInfoPaginated! inspect: Inspect } @@ -31,7 +31,7 @@ export const uncommonProcessesSchema = gql` "Gets UncommonProcesses based on a timerange, or all UncommonProcesses if no criteria is specified" UncommonProcesses( timerange: TimerangeInput! - pagination: PaginationInput! + pagination: PaginationInputPaginated! filterQuery: String defaultIndex: [String!]! ): UncommonProcessesData! diff --git a/x-pack/legacy/plugins/siem/server/lib/events/elasticsearch_adapter.ts b/x-pack/legacy/plugins/siem/server/lib/events/elasticsearch_adapter.ts index 4a6bd18afa1ee..e8d3c36cb5a5d 100644 --- a/x-pack/legacy/plugins/siem/server/lib/events/elasticsearch_adapter.ts +++ b/x-pack/legacy/plugins/siem/server/lib/events/elasticsearch_adapter.ts @@ -36,25 +36,32 @@ import { FrameworkAdapter, FrameworkRequest, MappingProperties, - RequestOptions, + RequestOptionsPaginated, } from '../framework'; import { TermAggregation } from '../types'; -import { buildDetailsQuery, buildQuery } from './query.dsl'; +import { buildDetailsQuery, buildQuery, buildTimelineQuery } from './query.dsl'; import { buildLastEventTimeQuery } from './query.last_event_time.dsl'; import { EventHit, EventsAdapter, - EventsRequestOptions, LastEventTimeHit, LastEventTimeRequestOptions, RequestDetailsOptions, + TimelineRequestOptions, } from './types'; +import { DEFAULT_MAX_TABLE_QUERY_SIZE } from '../../../common/constants'; export class ElasticsearchEventsAdapter implements EventsAdapter { constructor(private readonly framework: FrameworkAdapter) {} - public async getEvents(request: FrameworkRequest, options: RequestOptions): Promise { + public async getEvents( + request: FrameworkRequest, + options: RequestOptionsPaginated + ): Promise { + if (options.pagination && options.pagination.querySize >= DEFAULT_MAX_TABLE_QUERY_SIZE) { + throw new Error(`No query size above ${DEFAULT_MAX_TABLE_QUERY_SIZE}`); + } const queryOptions = cloneDeep(options); queryOptions.fields = reduceFields(options.fields, eventFieldsMap); @@ -65,31 +72,34 @@ export class ElasticsearchEventsAdapter implements EventsAdapter { dsl ); - const { limit } = options.pagination; + const { activePage, cursorStart, fakePossibleCount, querySize } = options.pagination; const totalCount = getOr(0, 'hits.total.value', response); const hits = response.hits.hits; const eventsEdges: EcsEdges[] = hits.map(hit => formatEventsData(options.fields, hit, eventFieldsMap) ); - const hasNextPage = eventsEdges.length === limit + 1; - const edges = hasNextPage ? eventsEdges.splice(0, limit) : eventsEdges; - const lastCursor = get('cursor', last(edges)); + const fakeTotalCount = fakePossibleCount <= totalCount ? fakePossibleCount : totalCount; + const edges = eventsEdges.splice(cursorStart, querySize - cursorStart); const inspect = { dsl: [inspectStringifyObject(dsl)], response: [inspectStringifyObject(response)], }; - + const showMorePagesIndicator = totalCount > fakeTotalCount; return { inspect, edges, - pageInfo: { hasNextPage, endCursor: lastCursor }, + pageInfo: { + activePage: activePage ? activePage : 0, + fakeTotalCount, + showMorePagesIndicator, + }, totalCount, }; } public async getTimelineData( request: FrameworkRequest, - options: EventsRequestOptions + options: TimelineRequestOptions ): Promise { const queryOptions = cloneDeep(options); queryOptions.fields = uniq([ @@ -98,7 +108,7 @@ export class ElasticsearchEventsAdapter implements EventsAdapter { ]); delete queryOptions.fieldRequested; - const dsl = buildQuery(queryOptions); + const dsl = buildTimelineQuery(queryOptions); const response = await this.framework.callWithRequest( request, 'search', diff --git a/x-pack/legacy/plugins/siem/server/lib/events/index.ts b/x-pack/legacy/plugins/siem/server/lib/events/index.ts index c4fb63029bf49..c51b1ff203321 100644 --- a/x-pack/legacy/plugins/siem/server/lib/events/index.ts +++ b/x-pack/legacy/plugins/siem/server/lib/events/index.ts @@ -10,11 +10,11 @@ import { TimelineData, TimelineDetailsData, } from '../../graphql/types'; -import { FrameworkRequest, RequestOptions } from '../framework'; +import { FrameworkRequest, RequestOptionsPaginated } from '../framework'; export * from './elasticsearch_adapter'; import { EventsAdapter, - EventsRequestOptions, + TimelineRequestOptions, LastEventTimeRequestOptions, RequestDetailsOptions, } from './types'; @@ -22,13 +22,16 @@ import { export class Events { constructor(private readonly adapter: EventsAdapter) {} - public async getEvents(req: FrameworkRequest, options: RequestOptions): Promise { + public async getEvents( + req: FrameworkRequest, + options: RequestOptionsPaginated + ): Promise { return await this.adapter.getEvents(req, options); } public async getTimelineData( req: FrameworkRequest, - options: EventsRequestOptions + options: TimelineRequestOptions ): Promise { return await this.adapter.getTimelineData(req, options); } diff --git a/x-pack/legacy/plugins/siem/server/lib/events/query.dsl.ts b/x-pack/legacy/plugins/siem/server/lib/events/query.dsl.ts index 6755069d45be1..bc95fe5629449 100644 --- a/x-pack/legacy/plugins/siem/server/lib/events/query.dsl.ts +++ b/x-pack/legacy/plugins/siem/server/lib/events/query.dsl.ts @@ -6,12 +6,72 @@ import { SortField, TimerangeInput } from '../../graphql/types'; import { createQueryFilterClauses } from '../../utils/build_query'; -import { RequestOptions } from '../framework'; +import { RequestOptions, RequestOptionsPaginated } from '../framework'; import { SortRequest } from '../types'; import { TimerangeFilter } from './types'; -export const buildQuery = (options: RequestOptions) => { +export const buildQuery = (options: RequestOptionsPaginated) => { + const { querySize } = options.pagination; + const { fields, filterQuery } = options; + const filterClause = [...createQueryFilterClauses(filterQuery)]; + const defaultIndex = options.defaultIndex; + + const getTimerangeFilter = (timerange: TimerangeInput | undefined): TimerangeFilter[] => { + if (timerange) { + const { to, from } = timerange; + return [ + { + range: { + [options.sourceConfiguration.fields.timestamp]: { + gte: from, + lte: to, + }, + }, + }, + ]; + } + return []; + }; + + const filter = [...filterClause, ...getTimerangeFilter(options.timerange), { match_all: {} }]; + + const getSortField = (sortField: SortField) => { + if (sortField.sortFieldId) { + const field: string = + sortField.sortFieldId === 'timestamp' ? '@timestamp' : sortField.sortFieldId; + + return [ + { [field]: sortField.direction }, + { [options.sourceConfiguration.fields.tiebreaker]: sortField.direction }, + ]; + } + return []; + }; + + const sort: SortRequest = getSortField(options.sortField!); + + const dslQuery = { + allowNoIndices: true, + index: defaultIndex, + ignoreUnavailable: true, + body: { + query: { + bool: { + filter, + }, + }, + size: querySize, + track_total_hits: true, + sort, + _source: fields, + }, + }; + + return dslQuery; +}; + +export const buildTimelineQuery = (options: RequestOptions) => { const { limit, cursor, tiebreaker } = options.pagination; const { fields, filterQuery } = options; const filterClause = [...createQueryFilterClauses(filterQuery)]; diff --git a/x-pack/legacy/plugins/siem/server/lib/events/types.ts b/x-pack/legacy/plugins/siem/server/lib/events/types.ts index b88c26921b2f2..bcd62c583cf6d 100644 --- a/x-pack/legacy/plugins/siem/server/lib/events/types.ts +++ b/x-pack/legacy/plugins/siem/server/lib/events/types.ts @@ -13,12 +13,12 @@ import { TimelineData, TimelineDetailsData, } from '../../graphql/types'; -import { FrameworkRequest, RequestOptions } from '../framework'; +import { FrameworkRequest, RequestOptions, RequestOptionsPaginated } from '../framework'; import { SearchHit } from '../types'; export interface EventsAdapter { - getEvents(req: FrameworkRequest, options: RequestOptions): Promise; - getTimelineData(req: FrameworkRequest, options: EventsRequestOptions): Promise; + getEvents(req: FrameworkRequest, options: RequestOptionsPaginated): Promise; + getTimelineData(req: FrameworkRequest, options: TimelineRequestOptions): Promise; getTimelineDetails( req: FrameworkRequest, options: RequestDetailsOptions @@ -29,7 +29,11 @@ export interface EventsAdapter { ): Promise; } -export interface EventsRequestOptions extends RequestOptions { +export interface TimelineRequestOptions extends RequestOptions { + fieldRequested: string[]; +} + +export interface EventsRequestOptions extends RequestOptionsPaginated { fieldRequested: string[]; } diff --git a/x-pack/legacy/plugins/siem/server/lib/hosts/elasticsearch_adapter.ts b/x-pack/legacy/plugins/siem/server/lib/hosts/elasticsearch_adapter.ts index e18fe7452ea84..792a1a4be5307 100644 --- a/x-pack/legacy/plugins/siem/server/lib/hosts/elasticsearch_adapter.ts +++ b/x-pack/legacy/plugins/siem/server/lib/hosts/elasticsearch_adapter.ts @@ -26,6 +26,7 @@ import { HostsRequestOptions, HostValue, } from './types'; +import { DEFAULT_MAX_TABLE_QUERY_SIZE } from '../../../common/constants'; export class ElasticsearchHostsAdapter implements HostsAdapter { constructor(private readonly framework: FrameworkAdapter) {} @@ -35,28 +36,35 @@ export class ElasticsearchHostsAdapter implements HostsAdapter { options: HostsRequestOptions ): Promise { const dsl = buildHostsQuery(options); + if (options.pagination && options.pagination.querySize >= DEFAULT_MAX_TABLE_QUERY_SIZE) { + throw new Error(`No query size above ${DEFAULT_MAX_TABLE_QUERY_SIZE}`); + } const response = await this.framework.callWithRequest( request, 'search', dsl ); - const { cursor, limit } = options.pagination; + const { activePage, cursorStart, fakePossibleCount, querySize } = options.pagination; const totalCount = getOr(0, 'aggregations.host_count.value', response); const buckets: HostAggEsItem[] = getOr([], 'aggregations.host_data.buckets', response); const hostsEdges = buckets.map(bucket => formatHostEdgesData(options.fields, bucket)); - const hasNextPage = hostsEdges.length === limit + 1; - const beginning = cursor != null ? parseInt(cursor, 10) : 0; - const edges = hostsEdges.splice(beginning, limit - beginning); + const fakeTotalCount = fakePossibleCount <= totalCount ? fakePossibleCount : totalCount; + const edges = hostsEdges.splice(cursorStart, querySize - cursorStart); const inspect = { dsl: [inspectStringifyObject(dsl)], response: [inspectStringifyObject(response)], }; + const showMorePagesIndicator = totalCount > fakeTotalCount; return { inspect, edges, totalCount, - pageInfo: { hasNextPage, endCursor: { value: String(limit) } }, + pageInfo: { + activePage: activePage ? activePage : 0, + fakeTotalCount, + showMorePagesIndicator, + }, }; } diff --git a/x-pack/legacy/plugins/siem/server/lib/hosts/mock.ts b/x-pack/legacy/plugins/siem/server/lib/hosts/mock.ts index 59c03560ac810..e8c57be8e2ca5 100644 --- a/x-pack/legacy/plugins/siem/server/lib/hosts/mock.ts +++ b/x-pack/legacy/plugins/siem/server/lib/hosts/mock.ts @@ -26,7 +26,12 @@ export const mockGetHostsOptions: HostsRequestOptions = { }, timerange: { interval: '12h', to: 1554824274610, from: 1554737874610 }, sort: { field: HostsFields.lastSeen, direction: Direction.asc }, - pagination: { limit: 10, cursor: null, tiebreaker: null }, + pagination: { + activePage: 0, + cursorStart: 0, + fakePossibleCount: 10, + querySize: 2, + }, filterQuery: {}, fields: [ 'totalCount', @@ -36,8 +41,9 @@ export const mockGetHostsOptions: HostsRequestOptions = { 'host.os.name', 'host.os.version', 'edges.cursor.value', - 'pageInfo.endCursor.value', - 'pageInfo.hasNextPage', + 'pageInfo.activePage', + 'pageInfo.fakeTotalCount', + 'pageInfo.showMorePagesIndicator', ], }; @@ -48,7 +54,12 @@ export const mockGetHostsRequest = { variables: { sourceId: 'default', timerange: { interval: '12h', from: 1554737729201, to: 1554824129202 }, - pagination: { limit: 10, cursor: null, tiebreaker: null }, + pagination: { + activePage: 0, + cursorStart: 0, + fakePossibleCount: 10, + querySize: 2, + }, sort: { field: HostsFields.lastSeen, direction: Direction.asc }, filterQuery: '', }, @@ -269,10 +280,9 @@ export const mockGetHostsResult = { ], totalCount: 1627, pageInfo: { - hasNextPage: false, - endCursor: { - value: '10', - }, + activePage: 0, + fakeTotalCount: 10, + showMorePagesIndicator: true, }, }; diff --git a/x-pack/legacy/plugins/siem/server/lib/hosts/query.hosts.dsl.ts b/x-pack/legacy/plugins/siem/server/lib/hosts/query.hosts.dsl.ts index 35ed71b9d27b3..7c2e0df535344 100644 --- a/x-pack/legacy/plugins/siem/server/lib/hosts/query.hosts.dsl.ts +++ b/x-pack/legacy/plugins/siem/server/lib/hosts/query.hosts.dsl.ts @@ -13,11 +13,11 @@ import { HostsRequestOptions } from '.'; import { buildFieldsTermAggregation } from './helpers'; export const buildHostsQuery = ({ + defaultIndex, fields, filterQuery, - pagination: { limit, cursor }, + pagination: { querySize }, sort, - defaultIndex, sourceConfiguration: { fields: { timestamp }, }, @@ -47,7 +47,7 @@ export const buildHostsQuery = ({ aggregations: { ...agg, host_data: { - terms: { size: limit + 1, field: 'host.name', order: getQueryOrder(sort) }, + terms: { size: querySize, field: 'host.name', order: getQueryOrder(sort) }, aggs: { lastSeen: { max: { field: '@timestamp' } }, ...buildFieldsTermAggregation( diff --git a/x-pack/legacy/plugins/siem/server/lib/hosts/types.ts b/x-pack/legacy/plugins/siem/server/lib/hosts/types.ts index b63f4db2926e8..63360492c1cf3 100644 --- a/x-pack/legacy/plugins/siem/server/lib/hosts/types.ts +++ b/x-pack/legacy/plugins/siem/server/lib/hosts/types.ts @@ -13,7 +13,7 @@ import { SourceConfiguration, TimerangeInput, } from '../../graphql/types'; -import { FrameworkRequest, RequestOptions } from '../framework'; +import { FrameworkRequest, RequestOptionsPaginated } from '../framework'; import { Hit, Hits, SearchHit } from '../types'; export interface HostsAdapter { @@ -39,7 +39,7 @@ export interface HostHit extends Hit { export type HostHits = Hits; -export interface HostsRequestOptions extends RequestOptions { +export interface HostsRequestOptions extends RequestOptionsPaginated { sort: HostsSortField; defaultIndex: string[]; } diff --git a/x-pack/legacy/plugins/siem/server/lib/ip_details/elasticsearch_adapter.ts b/x-pack/legacy/plugins/siem/server/lib/ip_details/elasticsearch_adapter.ts index c59145f5e25a2..6957b548dcb86 100644 --- a/x-pack/legacy/plugins/siem/server/lib/ip_details/elasticsearch_adapter.ts +++ b/x-pack/legacy/plugins/siem/server/lib/ip_details/elasticsearch_adapter.ts @@ -22,7 +22,7 @@ import { import { inspectStringifyObject } from '../../utils/build_query'; import { DatabaseSearchResponse, FrameworkAdapter, FrameworkRequest } from '../framework'; import { TermAggregation } from '../types'; - +import { DEFAULT_MAX_TABLE_QUERY_SIZE } from '../../../common/constants'; import { DomainsRequestOptions, IpOverviewRequestOptions, @@ -76,6 +76,9 @@ export class ElasticsearchIpOverviewAdapter implements IpDetailsAdapter { request: FrameworkRequest, options: DomainsRequestOptions ): Promise { + if (options.pagination && options.pagination.querySize >= DEFAULT_MAX_TABLE_QUERY_SIZE) { + throw new Error(`No query size above ${DEFAULT_MAX_TABLE_QUERY_SIZE}`); + } const dsl = buildDomainsQuery(options); const response = await this.framework.callWithRequest( request, @@ -83,32 +86,32 @@ export class ElasticsearchIpOverviewAdapter implements IpDetailsAdapter { dsl ); - const { cursor, limit } = options.pagination; + const { activePage, cursorStart, fakePossibleCount, querySize } = options.pagination; const totalCount = getOr(0, 'aggregations.domain_count.value', response); const domainsEdges: DomainsEdges[] = getDomainsEdges(response, options); - const hasNextPage = domainsEdges.length > limit; - const beginning = cursor != null ? parseInt(cursor, 10) : 0; - const edges = domainsEdges.splice(beginning, limit - beginning); + const fakeTotalCount = fakePossibleCount <= totalCount ? fakePossibleCount : totalCount; + const edges = domainsEdges.splice(cursorStart, querySize - cursorStart); const inspect = { dsl: [inspectStringifyObject(dsl)], response: [inspectStringifyObject(response)], }; - + const showMorePagesIndicator = totalCount > fakeTotalCount; return { edges, inspect, pageInfo: { - hasNextPage, - endCursor: { - value: String(limit), - tiebreaker: null, - }, + activePage: activePage ? activePage : 0, + fakeTotalCount, + showMorePagesIndicator, }, totalCount, }; } public async getTls(request: FrameworkRequest, options: TlsRequestOptions): Promise { + if (options.pagination && options.pagination.querySize >= DEFAULT_MAX_TABLE_QUERY_SIZE) { + throw new Error(`No query size above ${DEFAULT_MAX_TABLE_QUERY_SIZE}`); + } const dsl = buildTlsQuery(options); const response = await this.framework.callWithRequest( request, @@ -116,26 +119,23 @@ export class ElasticsearchIpOverviewAdapter implements IpDetailsAdapter { dsl ); - const { cursor, limit } = options.pagination; + const { activePage, cursorStart, fakePossibleCount, querySize } = options.pagination; const totalCount = getOr(0, 'aggregations.count.value', response); const tlsEdges: TlsEdges[] = getTlsEdges(response, options); - const hasNextPage = tlsEdges.length > limit; - const beginning = cursor != null ? parseInt(cursor, 10) : 0; - const edges = tlsEdges.splice(beginning, limit - beginning); + const fakeTotalCount = fakePossibleCount <= totalCount ? fakePossibleCount : totalCount; + const edges = tlsEdges.splice(cursorStart, querySize - cursorStart); const inspect = { dsl: [inspectStringifyObject(dsl)], response: [inspectStringifyObject(response)], }; - + const showMorePagesIndicator = totalCount > fakeTotalCount; return { edges, inspect, pageInfo: { - hasNextPage, - endCursor: { - value: String(limit), - tiebreaker: null, - }, + activePage: activePage ? activePage : 0, + fakeTotalCount, + showMorePagesIndicator, }, totalCount, }; @@ -145,6 +145,9 @@ export class ElasticsearchIpOverviewAdapter implements IpDetailsAdapter { request: FrameworkRequest, options: UsersRequestOptions ): Promise { + if (options.pagination && options.pagination.querySize >= DEFAULT_MAX_TABLE_QUERY_SIZE) { + throw new Error(`No query size above ${DEFAULT_MAX_TABLE_QUERY_SIZE}`); + } const dsl = buildUsersQuery(options); const response = await this.framework.callWithRequest( request, @@ -152,26 +155,23 @@ export class ElasticsearchIpOverviewAdapter implements IpDetailsAdapter { dsl ); - const { cursor, limit } = options.pagination; + const { activePage, cursorStart, fakePossibleCount, querySize } = options.pagination; const totalCount = getOr(0, 'aggregations.user_count.value', response); const usersEdges = getUsersEdges(response); - const hasNextPage = usersEdges.length > limit; - const beginning = cursor != null ? parseInt(cursor, 10) : 0; - const edges = usersEdges.splice(beginning, limit - beginning); + const fakeTotalCount = fakePossibleCount <= totalCount ? fakePossibleCount : totalCount; + const edges = usersEdges.splice(cursorStart, querySize - cursorStart); const inspect = { dsl: [inspectStringifyObject(dsl)], response: [inspectStringifyObject(response)], }; - + const showMorePagesIndicator = totalCount > fakeTotalCount; return { edges, inspect, pageInfo: { - endCursor: { - value: String(limit), - tiebreaker: null, - }, - hasNextPage, + activePage: activePage ? activePage : 0, + fakeTotalCount, + showMorePagesIndicator, }, totalCount, }; diff --git a/x-pack/legacy/plugins/siem/server/lib/ip_details/index.ts b/x-pack/legacy/plugins/siem/server/lib/ip_details/index.ts index 83a58dc5d4e54..d1a70df4ffcf6 100644 --- a/x-pack/legacy/plugins/siem/server/lib/ip_details/index.ts +++ b/x-pack/legacy/plugins/siem/server/lib/ip_details/index.ts @@ -15,7 +15,7 @@ import { UsersData, UsersSortField, } from '../../graphql/types'; -import { FrameworkRequest, RequestOptions } from '../framework'; +import { FrameworkRequest, RequestOptions, RequestOptionsPaginated } from '../framework'; import { IpDetailsAdapter } from './types'; @@ -25,19 +25,19 @@ export interface IpOverviewRequestOptions extends RequestOptions { ip: string; } -export interface DomainsRequestOptions extends RequestOptions { +export interface DomainsRequestOptions extends RequestOptionsPaginated { ip: string; domainsSortField: DomainsSortField; flowTarget: FlowTarget; flowDirection: FlowDirection; } -export interface TlsRequestOptions extends RequestOptions { +export interface TlsRequestOptions extends RequestOptionsPaginated { ip: string; tlsSortField: TlsSortField; flowTarget: FlowTarget; } -export interface UsersRequestOptions extends RequestOptions { +export interface UsersRequestOptions extends RequestOptionsPaginated { ip: string; usersSortField: UsersSortField; flowTarget: FlowTarget; diff --git a/x-pack/legacy/plugins/siem/server/lib/ip_details/query_domains.dsl.ts b/x-pack/legacy/plugins/siem/server/lib/ip_details/query_domains.dsl.ts index fb6f02bb866e5..e81a337458203 100644 --- a/x-pack/legacy/plugins/siem/server/lib/ip_details/query_domains.dsl.ts +++ b/x-pack/legacy/plugins/siem/server/lib/ip_details/query_domains.dsl.ts @@ -20,7 +20,7 @@ const getAggs = ( flowTarget: FlowTarget, flowDirection: FlowDirection, domainsSortField: DomainsSortField, - limit: number + querySize: number ) => { return { domain_count: { @@ -31,7 +31,7 @@ const getAggs = ( [`${flowTarget}_domains`]: { terms: { field: `${flowTarget}.domain`, - size: limit + 1, + size: querySize, order: { ...getQueryOrder(domainsSortField), }, @@ -129,7 +129,7 @@ export const buildDomainsQuery = ({ filterQuery, flowDirection, flowTarget, - pagination: { limit }, + pagination: { querySize }, defaultIndex, sourceConfiguration: { fields: { timestamp }, @@ -149,7 +149,7 @@ export const buildDomainsQuery = ({ ignoreUnavailable: true, body: { aggs: { - ...getAggs(ip, flowTarget, flowDirection, domainsSortField, limit), + ...getAggs(ip, flowTarget, flowDirection, domainsSortField, querySize), }, query: { bool: { diff --git a/x-pack/legacy/plugins/siem/server/lib/ip_details/query_tls.dsl.ts b/x-pack/legacy/plugins/siem/server/lib/ip_details/query_tls.dsl.ts index 22292cb1194e3..562746bb9645c 100644 --- a/x-pack/legacy/plugins/siem/server/lib/ip_details/query_tls.dsl.ts +++ b/x-pack/legacy/plugins/siem/server/lib/ip_details/query_tls.dsl.ts @@ -9,7 +9,7 @@ import { createQueryFilterClauses, assertUnreachable } from '../../utils/build_q import { TlsRequestOptions } from './index'; import { TlsSortField, Direction, TlsFields } from '../../graphql/types'; -const getAggs = (limit: number, tlsSortField: TlsSortField) => ({ +const getAggs = (querySize: number, tlsSortField: TlsSortField) => ({ count: { cardinality: { field: 'tls.server_certificate.fingerprint.sha1', @@ -18,7 +18,7 @@ const getAggs = (limit: number, tlsSortField: TlsSortField) => ({ sha1: { terms: { field: 'tls.server_certificate.fingerprint.sha1', - size: limit + 1, + size: querySize, order: { ...getQueryOrder(tlsSortField), }, @@ -58,7 +58,7 @@ export const buildTlsQuery = ({ tlsSortField, filterQuery, flowTarget, - pagination: { limit }, + pagination: { querySize }, defaultIndex, sourceConfiguration: { fields: { timestamp }, @@ -77,7 +77,7 @@ export const buildTlsQuery = ({ ignoreUnavailable: true, body: { aggs: { - ...getAggs(limit, tlsSortField), + ...getAggs(querySize, tlsSortField), }, query: { bool: { diff --git a/x-pack/legacy/plugins/siem/server/lib/ip_details/query_users.dsl.ts b/x-pack/legacy/plugins/siem/server/lib/ip_details/query_users.dsl.ts index 222b69a76e660..0133b2e3732a1 100644 --- a/x-pack/legacy/plugins/siem/server/lib/ip_details/query_users.dsl.ts +++ b/x-pack/legacy/plugins/siem/server/lib/ip_details/query_users.dsl.ts @@ -14,7 +14,7 @@ export const buildUsersQuery = ({ usersSortField, filterQuery, flowTarget, - pagination: { limit }, + pagination: { querySize }, defaultIndex, sourceConfiguration: { fields: { timestamp }, @@ -41,7 +41,7 @@ export const buildUsersQuery = ({ users: { terms: { field: 'user.name', - size: limit + 1, + size: querySize, order: { ...getQueryOrder(usersSortField), }, diff --git a/x-pack/legacy/plugins/siem/server/lib/network/elastic_adapter.test.ts b/x-pack/legacy/plugins/siem/server/lib/network/elastic_adapter.test.ts index 1f3b59a4cc278..7ebb3427e700a 100644 --- a/x-pack/legacy/plugins/siem/server/lib/network/elastic_adapter.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/network/elastic_adapter.test.ts @@ -74,7 +74,11 @@ describe('Network Top N flow elasticsearch_adapter with FlowTarget=source and Fl response: [JSON.stringify(mockNoDataResponse, null, 2)], }, edges: [], - pageInfo: { endCursor: { tiebreaker: null, value: '10' }, hasNextPage: false }, + pageInfo: { + activePage: 0, + fakeTotalCount: 0, + showMorePagesIndicator: false, + }, totalCount: 0, }); }); @@ -107,7 +111,7 @@ describe('Network Top N flow elasticsearch_adapter with FlowTarget=source and Fl mockRequest as FrameworkRequest, mockOptions ); - expect(data.pageInfo.hasNextPage).toBeFalsy(); + expect(data.pageInfo.showMorePagesIndicator).toBeFalsy(); }); }); }); diff --git a/x-pack/legacy/plugins/siem/server/lib/network/elasticsearch_adapter.ts b/x-pack/legacy/plugins/siem/server/lib/network/elasticsearch_adapter.ts index 96dafa0ee9138..44b70f81ed3a4 100644 --- a/x-pack/legacy/plugins/siem/server/lib/network/elasticsearch_adapter.ts +++ b/x-pack/legacy/plugins/siem/server/lib/network/elasticsearch_adapter.ts @@ -9,6 +9,7 @@ import { get, getOr } from 'lodash/fp'; import { FlowDirection, FlowTarget, + NetworkDnsData, NetworkDnsEdges, NetworkTopNFlowData, NetworkTopNFlowEdges, @@ -16,6 +17,7 @@ import { import { inspectStringifyObject } from '../../utils/build_query'; import { DatabaseSearchResponse, FrameworkAdapter, FrameworkRequest } from '../framework'; import { TermAggregation } from '../types'; +import { DEFAULT_MAX_TABLE_QUERY_SIZE } from '../../../common/constants'; import { NetworkDnsRequestOptions, NetworkTopNFlowRequestOptions } from './index'; import { buildDnsQuery } from './query_dns.dsl'; @@ -35,26 +37,24 @@ export class ElasticsearchNetworkAdapter implements NetworkAdapter { 'search', dsl ); - const { cursor, limit } = options.pagination; + const { activePage, cursorStart, fakePossibleCount, querySize } = options.pagination; const totalCount = getOr(0, 'aggregations.top_n_flow_count.value', response); const networkTopNFlowEdges: NetworkTopNFlowEdges[] = getTopNFlowEdges(response, options); - const hasNextPage = networkTopNFlowEdges.length > limit; - const beginning = cursor != null ? parseInt(cursor, 10) : 0; - const edges = networkTopNFlowEdges.splice(beginning, limit - beginning); + const fakeTotalCount = fakePossibleCount <= totalCount ? fakePossibleCount : totalCount; + const edges = networkTopNFlowEdges.splice(cursorStart, querySize - cursorStart); const inspect = { dsl: [inspectStringifyObject(dsl)], response: [inspectStringifyObject(response)], }; + const showMorePagesIndicator = totalCount > fakeTotalCount; return { edges, inspect, pageInfo: { - hasNextPage, - endCursor: { - value: String(limit), - tiebreaker: null, - }, + activePage: activePage ? activePage : 0, + fakeTotalCount, + showMorePagesIndicator, }, totalCount, }; @@ -63,35 +63,32 @@ export class ElasticsearchNetworkAdapter implements NetworkAdapter { public async getNetworkDns( request: FrameworkRequest, options: NetworkDnsRequestOptions - ): Promise { + ): Promise { const dsl = buildDnsQuery(options); - const response = await this.framework.callWithRequest( + const response = await this.framework.callWithRequest( request, 'search', dsl ); - const { cursor, limit } = options.pagination; + const { activePage, cursorStart, fakePossibleCount, querySize } = options.pagination; const totalCount = getOr(0, 'aggregations.dns_count.value', response); const networkDnsEdges: NetworkDnsEdges[] = formatDnsEdges( getOr([], 'aggregations.dns_name_query_count.buckets', response) ); - const hasNextPage = networkDnsEdges.length > limit; - const beginning = cursor != null ? parseInt(cursor, 10) : 0; - const edges = networkDnsEdges.splice(beginning, limit - beginning); + const fakeTotalCount = fakePossibleCount <= totalCount ? fakePossibleCount : totalCount; + const edges = networkDnsEdges.splice(cursorStart, querySize - cursorStart); const inspect = { dsl: [inspectStringifyObject(dsl)], response: [inspectStringifyObject(response)], }; - + const showMorePagesIndicator = totalCount > fakeTotalCount; return { edges, inspect, pageInfo: { - hasNextPage, - endCursor: { - value: String(limit), - tiebreaker: null, - }, + activePage: activePage ? activePage : 0, + fakeTotalCount, + showMorePagesIndicator, }, totalCount, }; @@ -102,6 +99,9 @@ const getTopNFlowEdges = ( response: DatabaseSearchResponse, options: NetworkTopNFlowRequestOptions ): NetworkTopNFlowEdges[] => { + if (options.pagination && options.pagination.querySize >= DEFAULT_MAX_TABLE_QUERY_SIZE) { + throw new Error(`No query size above ${DEFAULT_MAX_TABLE_QUERY_SIZE}`); + } if (options.flowDirection === FlowDirection.uniDirectional) { return formatTopNFlowEdges( getOr([], 'aggregations.top_uni_flow.buckets', response), diff --git a/x-pack/legacy/plugins/siem/server/lib/network/index.ts b/x-pack/legacy/plugins/siem/server/lib/network/index.ts index dd3f7032ce99f..9bec909814afc 100644 --- a/x-pack/legacy/plugins/siem/server/lib/network/index.ts +++ b/x-pack/legacy/plugins/siem/server/lib/network/index.ts @@ -11,19 +11,19 @@ import { NetworkTopNFlowData, NetworkTopNFlowSortField, } from '../../graphql/types'; -import { FrameworkRequest, RequestOptions } from '../framework'; +import { FrameworkRequest, RequestOptionsPaginated } from '../framework'; export * from './elasticsearch_adapter'; import { NetworkAdapter } from './types'; export * from './types'; -export interface NetworkTopNFlowRequestOptions extends RequestOptions { +export interface NetworkTopNFlowRequestOptions extends RequestOptionsPaginated { networkTopNFlowSort: NetworkTopNFlowSortField; flowTarget: FlowTarget; flowDirection: FlowDirection; } -export interface NetworkDnsRequestOptions extends RequestOptions { +export interface NetworkDnsRequestOptions extends RequestOptionsPaginated { isPtrIncluded: boolean; networkDnsSortField: NetworkDnsSortField; } diff --git a/x-pack/legacy/plugins/siem/server/lib/network/mock.ts b/x-pack/legacy/plugins/siem/server/lib/network/mock.ts index afbbb1dfa86bb..d1de95f34c372 100644 --- a/x-pack/legacy/plugins/siem/server/lib/network/mock.ts +++ b/x-pack/legacy/plugins/siem/server/lib/network/mock.ts @@ -21,7 +21,12 @@ export const mockOptions: NetworkTopNFlowRequestOptions = { }, }, timerange: { interval: '12h', to: 1549852006071, from: 1549765606071 }, - pagination: { limit: 10, cursor: null, tiebreaker: null }, + pagination: { + activePage: 0, + cursorStart: 0, + fakePossibleCount: 50, + querySize: 10, + }, filterQuery: {}, fields: [ 'totalCount', @@ -40,9 +45,11 @@ export const mockOptions: NetworkTopNFlowRequestOptions = { 'edges.cursor.value', 'edges.cursor.__typename', 'edges.__typename', - 'pageInfo.endCursor.value', - 'pageInfo.endCursor.__typename', - 'pageInfo.hasNextPage', + 'pageInfo.activePage', + 'pageInfo.__typename', + 'pageInfo.fakeTotalCount', + 'pageInfo.__typename', + 'pageInfo.showMorePagesIndicator', 'pageInfo.__typename', '__typename', ], @@ -59,7 +66,12 @@ export const mockRequest = { filterQuery: '', flowDirection: FlowDirection.uniDirectional, flowType: FlowTarget.source, - pagination: { limit: 10, cursor: null, tiebreaker: null }, + pagination: { + activePage: 0, + cursorStart: 0, + fakePossibleCount: 50, + querySize: 10, + }, sourceId: 'default', timerange: { interval: '12h', from: 1549765830772, to: 1549852230772 }, }, @@ -97,11 +109,11 @@ export const mockRequest = { __typename } pageInfo { - endCursor { - value - __typename - } - hasNextPage + activePage + __typename + fakeTotalCount + __typename + showMorePagesIndicator __typename } __typename @@ -634,11 +646,9 @@ export const mockResult = { }, ], pageInfo: { - endCursor: { - tiebreaker: null, - value: '10', - }, - hasNextPage: true, + activePage: 0, + fakeTotalCount: 50, + showMorePagesIndicator: true, }, totalCount: 545, }; diff --git a/x-pack/legacy/plugins/siem/server/lib/network/query_dns.dsl.ts b/x-pack/legacy/plugins/siem/server/lib/network/query_dns.dsl.ts index 7c08aab1e20b5..c72020198ac93 100644 --- a/x-pack/legacy/plugins/siem/server/lib/network/query_dns.dsl.ts +++ b/x-pack/legacy/plugins/siem/server/lib/network/query_dns.dsl.ts @@ -56,15 +56,15 @@ const createIncludePTRFilter = (isPtrIncluded: boolean) => }; export const buildDnsQuery = ({ + defaultIndex, filterQuery, isPtrIncluded, networkDnsSortField, - timerange: { from, to }, - pagination: { limit }, - defaultIndex, + pagination: { querySize }, sourceConfiguration: { fields: { timestamp }, }, + timerange: { from, to }, }: NetworkDnsRequestOptions) => { const filter = [ ...createQueryFilterClauses(filterQuery), @@ -88,7 +88,7 @@ export const buildDnsQuery = ({ dns_name_query_count: { terms: { field: 'dns.question.etld_plus_one', - size: limit + 1, + size: querySize, order: { ...getQueryOrder(networkDnsSortField), }, diff --git a/x-pack/legacy/plugins/siem/server/lib/network/query_top_n_flow.dsl.ts b/x-pack/legacy/plugins/siem/server/lib/network/query_top_n_flow.dsl.ts index 4afb3c6607ff1..efbce55a3e968 100644 --- a/x-pack/legacy/plugins/siem/server/lib/network/query_top_n_flow.dsl.ts +++ b/x-pack/legacy/plugins/siem/server/lib/network/query_top_n_flow.dsl.ts @@ -74,16 +74,16 @@ const getCountAgg = (flowTarget: FlowTarget) => ({ }); export const buildTopNFlowQuery = ({ + defaultIndex, filterQuery, flowDirection, - networkTopNFlowSort, flowTarget, - timerange: { from, to }, - pagination: { limit }, - defaultIndex, + networkTopNFlowSort, + pagination: { querySize }, sourceConfiguration: { fields: { timestamp }, }, + timerange: { from, to }, }: NetworkTopNFlowRequestOptions) => { const filter = [ ...createQueryFilterClauses(filterQuery), @@ -98,8 +98,8 @@ export const buildTopNFlowQuery = ({ body: { aggregations: { ...getCountAgg(flowTarget), - ...getUniDirectionAggs(flowDirection, networkTopNFlowSort, flowTarget, limit), - ...getBiDirectionAggs(flowDirection, networkTopNFlowSort, flowTarget, limit), + ...getUniDirectionAggs(flowDirection, networkTopNFlowSort, flowTarget, querySize), + ...getBiDirectionAggs(flowDirection, networkTopNFlowSort, flowTarget, querySize), }, query: { bool: { @@ -118,14 +118,14 @@ const getUniDirectionAggs = ( flowDirection: FlowDirection, networkTopNFlowSortField: NetworkTopNFlowSortField, flowTarget: FlowTarget, - limit: number + querySize: number ) => flowDirection === FlowDirection.uniDirectional ? { top_uni_flow: { terms: { field: `${flowTarget}.ip`, - size: limit + 1, + size: querySize, order: { ...getQueryOrder(networkTopNFlowSortField), }, @@ -177,14 +177,14 @@ const getBiDirectionAggs = ( flowDirection: FlowDirection, networkTopNFlowSortField: NetworkTopNFlowSortField, flowTarget: FlowTarget, - limit: number + querySize: number ) => flowDirection === FlowDirection.biDirectional ? { top_bi_flow: { terms: { field: `${flowTarget}.ip`, - size: limit + 1, + size: querySize, order: { ...getQueryOrder(networkTopNFlowSortField), }, diff --git a/x-pack/legacy/plugins/siem/server/lib/network/types.ts b/x-pack/legacy/plugins/siem/server/lib/network/types.ts index ca2800a58f576..40690a442f655 100644 --- a/x-pack/legacy/plugins/siem/server/lib/network/types.ts +++ b/x-pack/legacy/plugins/siem/server/lib/network/types.ts @@ -5,12 +5,15 @@ */ import { NetworkDirectionEcs, NetworkDnsData, NetworkTopNFlowData } from '../../graphql/types'; -import { FrameworkRequest, RequestOptions } from '../framework'; +import { FrameworkRequest, RequestOptionsPaginated } from '../framework'; import { SearchHit } from '../types'; export interface NetworkAdapter { - getNetworkTopNFlow(req: FrameworkRequest, options: RequestOptions): Promise; - getNetworkDns(req: FrameworkRequest, options: RequestOptions): Promise; + getNetworkTopNFlow( + req: FrameworkRequest, + options: RequestOptionsPaginated + ): Promise; + getNetworkDns(req: FrameworkRequest, options: RequestOptionsPaginated): Promise; } export interface GenericBuckets { diff --git a/x-pack/legacy/plugins/siem/server/lib/uncommon_processes/elasticsearch_adapter.ts b/x-pack/legacy/plugins/siem/server/lib/uncommon_processes/elasticsearch_adapter.ts index ce331b0c30ed7..111df08b89e2f 100644 --- a/x-pack/legacy/plugins/siem/server/lib/uncommon_processes/elasticsearch_adapter.ts +++ b/x-pack/legacy/plugins/siem/server/lib/uncommon_processes/elasticsearch_adapter.ts @@ -9,9 +9,9 @@ import { get, getOr } from 'lodash/fp'; import { UncommonProcessesData, UncommonProcessesEdges } from '../../graphql/types'; import { mergeFieldsWithHit, inspectStringifyObject } from '../../utils/build_query'; import { processFieldsMap, userFieldsMap } from '../ecs_fields'; -import { FrameworkAdapter, FrameworkRequest, RequestOptions } from '../framework'; +import { FrameworkAdapter, FrameworkRequest, RequestOptionsPaginated } from '../framework'; import { HostHits, TermAggregation } from '../types'; - +import { DEFAULT_MAX_TABLE_QUERY_SIZE } from '../../../common/constants'; import { buildQuery } from './query.dsl'; import { UncommonProcessBucket, @@ -25,15 +25,18 @@ export class ElasticsearchUncommonProcessesAdapter implements UncommonProcessesA public async getUncommonProcesses( request: FrameworkRequest, - options: RequestOptions + options: RequestOptionsPaginated ): Promise { + if (options.pagination && options.pagination.querySize >= DEFAULT_MAX_TABLE_QUERY_SIZE) { + throw new Error(`No query size above ${DEFAULT_MAX_TABLE_QUERY_SIZE}`); + } const dsl = buildQuery(options); const response = await this.framework.callWithRequest( request, 'search', dsl ); - const { cursor, limit } = options.pagination; + const { activePage, cursorStart, fakePossibleCount, querySize } = options.pagination; const totalCount = getOr(0, 'aggregations.process_count.value', response); const buckets = getOr([], 'aggregations.group_by_process.buckets', response); const hits = getHits(buckets); @@ -41,23 +44,22 @@ export class ElasticsearchUncommonProcessesAdapter implements UncommonProcessesA const uncommonProcessesEdges = hits.map(hit => formatUncommonProcessesData(options.fields, hit, { ...processFieldsMap, ...userFieldsMap }) ); - const hasNextPage = uncommonProcessesEdges.length === limit + 1; - const beginning = cursor != null ? parseInt(cursor!, 10) : 0; - const edges = uncommonProcessesEdges.splice(beginning, limit - beginning); + + const fakeTotalCount = fakePossibleCount <= totalCount ? fakePossibleCount : totalCount; + const edges = uncommonProcessesEdges.splice(cursorStart, querySize - cursorStart); const inspect = { dsl: [inspectStringifyObject(dsl)], response: [inspectStringifyObject(response)], }; + const showMorePagesIndicator = totalCount > fakeTotalCount; return { edges, inspect, pageInfo: { - hasNextPage, - endCursor: { - value: String(limit), - tiebreaker: null, - }, + activePage: activePage ? activePage : 0, + fakeTotalCount, + showMorePagesIndicator, }, totalCount, }; diff --git a/x-pack/legacy/plugins/siem/server/lib/uncommon_processes/index.ts b/x-pack/legacy/plugins/siem/server/lib/uncommon_processes/index.ts index 17083414d245c..d9f6a5966836f 100644 --- a/x-pack/legacy/plugins/siem/server/lib/uncommon_processes/index.ts +++ b/x-pack/legacy/plugins/siem/server/lib/uncommon_processes/index.ts @@ -5,7 +5,7 @@ */ import { UncommonProcessesData } from '../../graphql/types'; -import { FrameworkRequest, RequestOptions } from '../framework'; +import { FrameworkRequest, RequestOptionsPaginated } from '../framework'; export * from './elasticsearch_adapter'; import { UncommonProcessesAdapter } from './types'; @@ -14,7 +14,7 @@ export class UncommonProcesses { public async getUncommonProcesses( req: FrameworkRequest, - options: RequestOptions + options: RequestOptionsPaginated ): Promise { return await this.adapter.getUncommonProcesses(req, options); } diff --git a/x-pack/legacy/plugins/siem/server/lib/uncommon_processes/query.dsl.ts b/x-pack/legacy/plugins/siem/server/lib/uncommon_processes/query.dsl.ts index 2f83c839d80cb..e4b6bb8c6596b 100644 --- a/x-pack/legacy/plugins/siem/server/lib/uncommon_processes/query.dsl.ts +++ b/x-pack/legacy/plugins/siem/server/lib/uncommon_processes/query.dsl.ts @@ -7,18 +7,18 @@ import { createQueryFilterClauses } from '../../utils/build_query'; import { reduceFields } from '../../utils/build_query/reduce_fields'; import { hostFieldsMap, processFieldsMap, userFieldsMap } from '../ecs_fields'; -import { RequestOptions } from '../framework'; +import { RequestOptionsPaginated } from '../framework'; export const buildQuery = ({ + defaultIndex, fields, filterQuery, - timerange: { from, to }, - defaultIndex, - pagination: { limit }, + pagination: { querySize }, sourceConfiguration: { fields: { timestamp }, }, -}: RequestOptions) => { + timerange: { from, to }, +}: RequestOptionsPaginated) => { const processUserFields = reduceFields(fields, { ...processFieldsMap, ...userFieldsMap }); const hostFields = reduceFields(fields, hostFieldsMap); const filter = [ @@ -50,7 +50,7 @@ export const buildQuery = ({ ...agg, group_by_process: { terms: { - size: limit + 1, + size: querySize, field: 'process.name', order: [ { diff --git a/x-pack/legacy/plugins/siem/server/lib/uncommon_processes/types.ts b/x-pack/legacy/plugins/siem/server/lib/uncommon_processes/types.ts index 2ebaadc17b1f5..dc60de5963a18 100644 --- a/x-pack/legacy/plugins/siem/server/lib/uncommon_processes/types.ts +++ b/x-pack/legacy/plugins/siem/server/lib/uncommon_processes/types.ts @@ -5,13 +5,13 @@ */ import { ProcessEcsFields, UncommonProcessesData } from '../../graphql/types'; -import { FrameworkRequest, RequestOptions } from '../framework'; +import { FrameworkRequest, RequestOptionsPaginated } from '../framework'; import { Hit, Hits, HostHits, SearchHit, TotalHit } from '../types'; export interface UncommonProcessesAdapter { getUncommonProcesses( req: FrameworkRequest, - options: RequestOptions + options: RequestOptionsPaginated ): Promise; } diff --git a/x-pack/test/api_integration/apis/siem/domains.ts b/x-pack/test/api_integration/apis/siem/domains.ts index 959d95e16188c..571f2685cf38d 100644 --- a/x-pack/test/api_integration/apis/siem/domains.ts +++ b/x-pack/test/api_integration/apis/siem/domains.ts @@ -43,8 +43,10 @@ const domainsTests: KbnTestProvider = ({ getService }) => { flowTarget: FlowTarget.source, sort: { field: DomainsFields.bytes, direction: Direction.desc }, pagination: { - limit: 10, - cursor: null, + activePage: 0, + cursorStart: 0, + fakePossibleCount: 30, + querySize: 10, }, defaultIndex: ['auditbeat-*', 'filebeat-*', 'packetbeat-*', 'winlogbeat-*'], inspect: false, @@ -78,8 +80,10 @@ const domainsTests: KbnTestProvider = ({ getService }) => { flowTarget: FlowTarget.source, sort: { field: DomainsFields.bytes, direction: Direction.desc }, pagination: { - limit: 10, - cursor: null, + activePage: 0, + cursorStart: 0, + fakePossibleCount: 30, + querySize: 10, }, defaultIndex: ['auditbeat-*', 'filebeat-*', 'packetbeat-*', 'winlogbeat-*'], inspect: false, @@ -113,8 +117,10 @@ const domainsTests: KbnTestProvider = ({ getService }) => { flowTarget: FlowTarget.destination, sort: { field: DomainsFields.bytes, direction: Direction.desc }, pagination: { - limit: 10, - cursor: null, + activePage: 0, + cursorStart: 0, + fakePossibleCount: 30, + querySize: 10, }, defaultIndex: ['auditbeat-*', 'filebeat-*', 'packetbeat-*', 'winlogbeat-*'], inspect: false, @@ -127,7 +133,7 @@ const domainsTests: KbnTestProvider = ({ getService }) => { expect(domains.edges.map(i => i.node.destination!.domainName).join(',')).to.be( 'samsungtv-kitchen.iot.sr.local.crowbird.com,12s3.lvlt.dash.row.aiv-cdn.net,151.205.0.17,151.205.0.19,151.205.0.21,151.205.0.23,15s3.lvlt.dash.row.aiv-cdn.net,api-global.netflix.com,d25xi40x97liuc.cloudfront.net,d2lkq7nlcrdi7q.cloudfront.net' ); - expect(domains.pageInfo.endCursor!.value).to.equal('10'); + expect(domains.pageInfo.fakeTotalCount).to.equal(12); }); }); }); diff --git a/x-pack/test/api_integration/apis/siem/events.ts b/x-pack/test/api_integration/apis/siem/events.ts index f3d7aecfacf73..9a4084a66d1c6 100644 --- a/x-pack/test/api_integration/apis/siem/events.ts +++ b/x-pack/test/api_integration/apis/siem/events.ts @@ -23,7 +23,6 @@ const TO = new Date('3000-01-01T00:00:00.000Z').valueOf(); const HOST_NAME = 'suricata-sensor-amsterdam'; const TOTAL_COUNT = 1751; const EDGE_LENGTH = 2; -const CURSOR_ID = '1550608953561'; const eventsTests: KbnTestProvider = ({ getService }) => { const esArchiver = getService('esArchiver'); @@ -45,9 +44,10 @@ const eventsTests: KbnTestProvider = ({ getService }) => { from: FROM, }, pagination: { - limit: 2, - cursor: null, - tiebreaker: null, + activePage: 0, + cursorStart: 0, + fakePossibleCount: 3, + querySize: 2, }, sortField: { sortFieldId: 'timestamp', @@ -61,7 +61,7 @@ const eventsTests: KbnTestProvider = ({ getService }) => { const events = resp.data.source.Events; expect(events.edges.length).to.be(EDGE_LENGTH); expect(events.totalCount).to.be(TOTAL_COUNT); - expect(events.pageInfo.endCursor!.value).to.equal(CURSOR_ID); + expect(events.pageInfo.fakeTotalCount).to.equal(3); }); }); @@ -77,9 +77,10 @@ const eventsTests: KbnTestProvider = ({ getService }) => { from: FROM, }, pagination: { - limit: 2, - cursor: CURSOR_ID, - tiebreaker: '193', + activePage: 1, + cursorStart: 2, + fakePossibleCount: 10, + querySize: 4, }, sortField: { sortFieldId: 'timestamp', @@ -109,9 +110,10 @@ const eventsTests: KbnTestProvider = ({ getService }) => { from: FROM, }, pagination: { - limit: 2, - cursor: CURSOR_ID, - tiebreaker: '193', + activePage: 1, + cursorStart: 2, + fakePossibleCount: 10, + querySize: 4, }, sortField: { sortFieldId: 'timestamp', diff --git a/x-pack/test/api_integration/apis/siem/hosts.ts b/x-pack/test/api_integration/apis/siem/hosts.ts index 42a5fc5bab43f..95f05516f0aa0 100644 --- a/x-pack/test/api_integration/apis/siem/hosts.ts +++ b/x-pack/test/api_integration/apis/siem/hosts.ts @@ -52,8 +52,10 @@ const hostsTests: KbnTestProvider = ({ getService }) => { direction: Direction.asc, }, pagination: { - limit: 1, - cursor: null, + activePage: 0, + cursorStart: 0, + fakePossibleCount: 3, + querySize: 1, }, inspect: false, }, @@ -62,7 +64,7 @@ const hostsTests: KbnTestProvider = ({ getService }) => { const hosts = resp.data.source.Hosts; expect(hosts.edges.length).to.be(EDGE_LENGTH); expect(hosts.totalCount).to.be(TOTAL_COUNT); - expect(hosts.pageInfo.endCursor!.value).to.equal('1'); + expect(hosts.pageInfo.fakeTotalCount).to.equal(3); }); }); @@ -83,8 +85,10 @@ const hostsTests: KbnTestProvider = ({ getService }) => { }, defaultIndex: ['auditbeat-*', 'filebeat-*', 'packetbeat-*', 'winlogbeat-*'], pagination: { - limit: 2, - cursor: '1', + activePage: 2, + cursorStart: 1, + fakePossibleCount: 5, + querySize: 2, }, inspect: false, }, diff --git a/x-pack/test/api_integration/apis/siem/network_dns.ts b/x-pack/test/api_integration/apis/siem/network_dns.ts index 6055ee652dd63..1851c23aa3492 100644 --- a/x-pack/test/api_integration/apis/siem/network_dns.ts +++ b/x-pack/test/api_integration/apis/siem/network_dns.ts @@ -38,8 +38,10 @@ const networkDnsTests: KbnTestProvider = ({ getService }) => { isPtrIncluded: false, sort: { field: NetworkDnsFields.uniqueDomains, direction: Direction.asc }, pagination: { - limit: 10, - cursor: null, + activePage: 0, + cursorStart: 0, + fakePossibleCount: 30, + querySize: 10, }, defaultIndex: ['auditbeat-*', 'filebeat-*', 'packetbeat-*', 'winlogbeat-*'], inspect: false, @@ -50,9 +52,9 @@ const networkDnsTests: KbnTestProvider = ({ getService }) => { expect(networkDns.edges.length).to.be(10); expect(networkDns.totalCount).to.be(44); expect(networkDns.edges.map(i => i.node.dnsName).join(',')).to.be( - 'aaplimg.com,adgrx.com,akadns.net,akamaiedge.net,amazonaws.com,cbsistatic.com,cdn-apple.com,connman.net,d1oxlq5h9kq8q5.cloudfront.net,d3epxf4t8a32oh.cloudfront.net' + 'aaplimg.com,adgrx.com,akadns.net,akamaiedge.net,amazonaws.com,cbsistatic.com,cdn-apple.com,connman.net,crowbird.com,d1oxlq5h9kq8q5.cloudfront.net' ); - expect(networkDns.pageInfo.endCursor!.value).to.equal('10'); + expect(networkDns.pageInfo.fakeTotalCount).to.equal(30); }); }); @@ -70,8 +72,10 @@ const networkDnsTests: KbnTestProvider = ({ getService }) => { isPtrIncluded: false, sort: { field: NetworkDnsFields.uniqueDomains, direction: Direction.desc }, pagination: { - limit: 10, - cursor: null, + activePage: 0, + cursorStart: 0, + fakePossibleCount: 30, + querySize: 10, }, defaultIndex: ['auditbeat-*', 'filebeat-*', 'packetbeat-*', 'winlogbeat-*'], inspect: false, @@ -84,7 +88,7 @@ const networkDnsTests: KbnTestProvider = ({ getService }) => { expect(networkDns.edges.map(i => i.node.dnsName).join(',')).to.be( 'nflxvideo.net,apple.com,netflix.com,samsungcloudsolution.com,samsungqbe.com,samsungelectronics.com,internetat.tv,samsungcloudsolution.net,samsungosp.com,cbsnews.com' ); - expect(networkDns.pageInfo.endCursor!.value).to.equal('10'); + expect(networkDns.pageInfo.fakeTotalCount).to.equal(30); }); }); }); diff --git a/x-pack/test/api_integration/apis/siem/network_top_n_flow.ts b/x-pack/test/api_integration/apis/siem/network_top_n_flow.ts index cd0c8323c1a6d..eedcd986b0899 100644 --- a/x-pack/test/api_integration/apis/siem/network_top_n_flow.ts +++ b/x-pack/test/api_integration/apis/siem/network_top_n_flow.ts @@ -43,8 +43,10 @@ const networkTopNFlowTests: KbnTestProvider = ({ getService }) => { sort: { field: NetworkTopNFlowFields.bytes, direction: Direction.desc }, flowDirection: FlowDirection.uniDirectional, pagination: { - limit: 10, - cursor: null, + activePage: 0, + cursorStart: 0, + fakePossibleCount: 50, + querySize: 10, }, defaultIndex: ['auditbeat-*', 'filebeat-*', 'packetbeat-*', 'winlogbeat-*'], inspect: false, @@ -58,7 +60,7 @@ const networkTopNFlowTests: KbnTestProvider = ({ getService }) => { '8.250.107.245,10.100.7.198,8.248.211.247,8.253.157.240,151.205.0.21,8.254.254.117,54.239.220.40,151.205.0.23,8.248.223.246,151.205.0.17' ); expect(networkTopNFlow.edges[0].node.destination).to.be(null); - expect(networkTopNFlow.pageInfo.endCursor!.value).to.equal('10'); + expect(networkTopNFlow.pageInfo.fakeTotalCount).to.equal(50); }); }); @@ -77,8 +79,10 @@ const networkTopNFlowTests: KbnTestProvider = ({ getService }) => { sort: { field: NetworkTopNFlowFields.bytes, direction: Direction.asc }, flowDirection: FlowDirection.uniDirectional, pagination: { - limit: 10, - cursor: null, + activePage: 0, + cursorStart: 0, + fakePossibleCount: 50, + querySize: 10, }, defaultIndex: ['auditbeat-*', 'filebeat-*', 'packetbeat-*', 'winlogbeat-*'], inspect: false, @@ -92,7 +96,7 @@ const networkTopNFlowTests: KbnTestProvider = ({ getService }) => { '10.100.4.1,54.239.219.220,54.239.219.228,54.239.220.94,54.239.220.138,54.239.220.184,54.239.220.186,54.239.221.253,35.167.45.163,52.5.171.20' ); expect(networkTopNFlow.edges[0].node.destination).to.be(null); - expect(networkTopNFlow.pageInfo.endCursor!.value).to.equal('10'); + expect(networkTopNFlow.pageInfo.fakeTotalCount).to.equal(50); }); }); @@ -111,8 +115,10 @@ const networkTopNFlowTests: KbnTestProvider = ({ getService }) => { flowTarget: FlowTarget.source, flowDirection: FlowDirection.biDirectional, pagination: { - limit: 10, - cursor: null, + activePage: 0, + cursorStart: 0, + fakePossibleCount: 10, + querySize: 10, }, defaultIndex: ['auditbeat-*', 'filebeat-*', 'packetbeat-*', 'winlogbeat-*'], inspect: false, @@ -123,7 +129,7 @@ const networkTopNFlowTests: KbnTestProvider = ({ getService }) => { expect(networkTopNFlow.edges.length).to.be(EDGE_LENGTH); expect(networkTopNFlow.totalCount).to.be(10); expect(networkTopNFlow.edges[0].node.destination).to.be(null); - expect(networkTopNFlow.pageInfo.endCursor!.value).to.equal('10'); + expect(networkTopNFlow.pageInfo.fakeTotalCount).to.equal(10); }); }); @@ -142,8 +148,10 @@ const networkTopNFlowTests: KbnTestProvider = ({ getService }) => { flowTarget: FlowTarget.destination, flowDirection: FlowDirection.uniDirectional, pagination: { - limit: 10, - cursor: null, + activePage: 0, + cursorStart: 0, + fakePossibleCount: 50, + querySize: 10, }, defaultIndex: ['auditbeat-*', 'filebeat-*', 'packetbeat-*', 'winlogbeat-*'], inspect: false, @@ -154,7 +162,7 @@ const networkTopNFlowTests: KbnTestProvider = ({ getService }) => { expect(networkTopNFlow.edges.length).to.be(EDGE_LENGTH); expect(networkTopNFlow.totalCount).to.be(144); expect(networkTopNFlow.edges[0].node.source).to.be(null); - expect(networkTopNFlow.pageInfo.endCursor!.value).to.equal('10'); + expect(networkTopNFlow.pageInfo.fakeTotalCount).to.equal(50); }); }); @@ -173,8 +181,10 @@ const networkTopNFlowTests: KbnTestProvider = ({ getService }) => { flowTarget: FlowTarget.destination, flowDirection: FlowDirection.biDirectional, pagination: { - limit: 10, - cursor: null, + activePage: 0, + cursorStart: 0, + fakePossibleCount: 50, + querySize: 10, }, defaultIndex: ['auditbeat-*', 'filebeat-*', 'packetbeat-*', 'winlogbeat-*'], inspect: false, @@ -185,7 +195,7 @@ const networkTopNFlowTests: KbnTestProvider = ({ getService }) => { expect(networkTopNFlow.edges.length).to.be(EDGE_LENGTH); expect(networkTopNFlow.totalCount).to.be(89); expect(networkTopNFlow.edges[0].node.source).to.be(null); - expect(networkTopNFlow.pageInfo.endCursor!.value).to.equal('10'); + expect(networkTopNFlow.pageInfo.fakeTotalCount).to.equal(50); }); }); @@ -204,8 +214,10 @@ const networkTopNFlowTests: KbnTestProvider = ({ getService }) => { flowTarget: FlowTarget.source, flowDirection: FlowDirection.uniDirectional, pagination: { - limit: 20, - cursor: 10, + activePage: 1, + cursorStart: 10, + fakePossibleCount: 50, + querySize: 20, }, defaultIndex: ['auditbeat-*', 'filebeat-*', 'packetbeat-*', 'winlogbeat-*'], inspect: false, @@ -243,8 +255,10 @@ const networkTopNFlowTests: KbnTestProvider = ({ getService }) => { flowTarget: FlowTarget.client, flowDirection: FlowDirection.biDirectional, pagination: { - limit: 10, - cursor: null, + activePage: 0, + cursorStart: 0, + fakePossibleCount: 50, + querySize: 10, }, defaultIndex: ['auditbeat-*', 'filebeat-*', 'packetbeat-*', 'winlogbeat-*'], inspect: false, @@ -255,7 +269,7 @@ const networkTopNFlowTests: KbnTestProvider = ({ getService }) => { expect(networkTopNFlow.edges.length).to.be(1); expect(networkTopNFlow.totalCount).to.be(1); expect(networkTopNFlow.edges[0].node.server).to.be(null); - expect(networkTopNFlow.pageInfo.endCursor!.value).to.equal('10'); + expect(networkTopNFlow.pageInfo.fakeTotalCount).to.equal(1); }); }); @@ -274,8 +288,10 @@ const networkTopNFlowTests: KbnTestProvider = ({ getService }) => { flowTarget: FlowTarget.server, flowDirection: FlowDirection.biDirectional, pagination: { - limit: 10, - cursor: null, + activePage: 0, + cursorStart: 0, + fakePossibleCount: 50, + querySize: 10, }, defaultIndex: ['auditbeat-*', 'filebeat-*', 'packetbeat-*', 'winlogbeat-*'], inspect: false, @@ -286,7 +302,7 @@ const networkTopNFlowTests: KbnTestProvider = ({ getService }) => { expect(networkTopNFlow.edges.length).to.be(1); expect(networkTopNFlow.totalCount).to.be(1); expect(networkTopNFlow.edges[0].node.client).to.be(null); - expect(networkTopNFlow.pageInfo.endCursor!.value).to.equal('10'); + expect(networkTopNFlow.pageInfo.fakeTotalCount).to.equal(1); }); }); }); diff --git a/x-pack/test/api_integration/apis/siem/tls.ts b/x-pack/test/api_integration/apis/siem/tls.ts index 5f8a1f5d3734a..bd7a9dfd28bae 100644 --- a/x-pack/test/api_integration/apis/siem/tls.ts +++ b/x-pack/test/api_integration/apis/siem/tls.ts @@ -52,8 +52,10 @@ const tlsTests: KbnTestProvider = ({ getService }) => { flowTarget: FlowTarget.source, sort: { field: TlsFields._id, direction: Direction.desc }, pagination: { - limit: 10, - cursor: null, + activePage: 0, + cursorStart: 0, + fakePossibleCount: 30, + querySize: 10, }, defaultIndex: ['auditbeat-*', 'filebeat-*', 'packetbeat-*', 'winlogbeat-*'], inspect: false, @@ -82,8 +84,10 @@ const tlsTests: KbnTestProvider = ({ getService }) => { flowTarget: FlowTarget.destination, sort: { field: TlsFields._id, direction: Direction.desc }, pagination: { - limit: 10, - cursor: null, + activePage: 0, + cursorStart: 0, + fakePossibleCount: 30, + querySize: 10, }, defaultIndex: ['auditbeat-*', 'filebeat-*', 'packetbeat-*', 'winlogbeat-*'], inspect: false, diff --git a/x-pack/test/api_integration/apis/siem/uncommon_processes.ts b/x-pack/test/api_integration/apis/siem/uncommon_processes.ts index 648974b331de2..0e1ac30634895 100644 --- a/x-pack/test/api_integration/apis/siem/uncommon_processes.ts +++ b/x-pack/test/api_integration/apis/siem/uncommon_processes.ts @@ -39,7 +39,10 @@ const uncommonProcessesTests: KbnTestProvider = ({ getService }) => { from: FROM, }, pagination: { - limit: 1, + activePage: 0, + cursorStart: 0, + fakePossibleCount: 3, + querySize: 1, }, defaultIndex: ['auditbeat-*', 'filebeat-*', 'packetbeat-*', 'winlogbeat-*'], inspect: false, @@ -63,7 +66,10 @@ const uncommonProcessesTests: KbnTestProvider = ({ getService }) => { from: FROM, }, pagination: { - limit: 2, + activePage: 0, + cursorStart: 0, + fakePossibleCount: 3, + querySize: 2, }, defaultIndex: ['auditbeat-*', 'filebeat-*', 'packetbeat-*', 'winlogbeat-*'], inspect: false, @@ -87,7 +93,10 @@ const uncommonProcessesTests: KbnTestProvider = ({ getService }) => { from: FROM, }, pagination: { - limit: 1, + activePage: 0, + cursorStart: 0, + fakePossibleCount: 3, + querySize: 1, }, defaultIndex: ['auditbeat-*', 'filebeat-*', 'packetbeat-*', 'winlogbeat-*'], inspect: false, @@ -111,7 +120,10 @@ const uncommonProcessesTests: KbnTestProvider = ({ getService }) => { from: FROM, }, pagination: { - limit: 1, + activePage: 0, + cursorStart: 0, + fakePossibleCount: 3, + querySize: 1, }, defaultIndex: ['auditbeat-*', 'filebeat-*', 'packetbeat-*', 'winlogbeat-*'], inspect: false, diff --git a/x-pack/test/api_integration/apis/siem/users.ts b/x-pack/test/api_integration/apis/siem/users.ts index 7b26152e8e4d2..25ff30c5803a9 100644 --- a/x-pack/test/api_integration/apis/siem/users.ts +++ b/x-pack/test/api_integration/apis/siem/users.ts @@ -42,8 +42,10 @@ const usersTests: KbnTestProvider = ({ getService }) => { flowTarget: FlowTarget.destination, sort: { field: UsersFields.name, direction: Direction.asc }, pagination: { - limit: 10, - cursor: null, + activePage: 0, + cursorStart: 0, + fakePossibleCount: 30, + querySize: 10, }, inspect: false, },