From 8b1aae648a70fd0b80b02084eaf67766834f7b62 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Tue, 2 Aug 2022 10:29:26 -0400 Subject: [PATCH] [TIP] Prevent IndicatorsTable flash (#137829) (#137850) (cherry picked from commit 96d32ad14753a3790c90860f3591748e69f1330f) Co-authored-by: Luke Gmys --- .../indicators/indicators_page.test.tsx | 101 ++++++++++++------ .../modules/indicators/indicators_page.tsx | 10 +- 2 files changed, 78 insertions(+), 33 deletions(-) diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/indicators_page.test.tsx b/x-pack/plugins/threat_intelligence/public/modules/indicators/indicators_page.test.tsx index 22db02bfe5c7..92ea0597d6bf 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/indicators_page.test.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/indicators_page.test.tsx @@ -11,7 +11,10 @@ import { TestProvidersComponent } from '../../common/mocks/test_providers'; import { IndicatorsPage } from './indicators_page'; import { useIndicators } from './hooks/use_indicators'; import { useIndicatorsTotalCount } from './hooks/use_indicators_total_count'; -import { TABLE_TEST_ID as INDICATORS_TABLE_TEST_ID } from './components/indicators_table/indicators_table'; +import { + TABLE_TEST_ID as INDICATORS_TABLE_TEST_ID, + TABLE_TEST_ID, +} from './components/indicators_table/indicators_table'; import { EMPTY_PROMPT_TEST_ID } from '../../components/empty_page'; import { useIntegrationsPageLink } from '../../hooks/use_integrations_page_link'; import { useTIDocumentationLink } from '../../hooks/use_documentation_link'; @@ -50,43 +53,77 @@ describe('', () => { }); }); - it('should render empty page when no indicators are found', async () => { - ( - useIndicatorsTotalCount as jest.MockedFunction - ).mockReturnValue({ - count: 0, - isLoading: false, + describe('checking if the page should be visible (based on indicator count)', () => { + describe('when indicator count is being loaded', () => { + it('should render nothing at all', () => { + ( + useIndicatorsTotalCount as jest.MockedFunction + ).mockReturnValue({ + count: 0, + isLoading: true, + }); + ( + useIntegrationsPageLink as jest.MockedFunction + ).mockReturnValue(''); + ( + useTIDocumentationLink as jest.MockedFunction + ).mockReturnValue(''); + + const { queryByTestId } = render( + + + + ); + + expect(queryByTestId(EMPTY_PROMPT_TEST_ID)).not.toBeInTheDocument(); + expect(queryByTestId(TABLE_TEST_ID)).not.toBeInTheDocument(); + }); }); - ( - useIntegrationsPageLink as jest.MockedFunction - ).mockReturnValue(''); - (useTIDocumentationLink as jest.MockedFunction).mockReturnValue( - '' - ); - const { queryByTestId } = render( - - - - ); + describe('when indicator count is loaded and there are no indicators', () => { + it('should render empty page when no indicators are found', async () => { + ( + useIndicatorsTotalCount as jest.MockedFunction + ).mockReturnValue({ + count: 0, + isLoading: false, + }); + ( + useIntegrationsPageLink as jest.MockedFunction + ).mockReturnValue(''); + ( + useTIDocumentationLink as jest.MockedFunction + ).mockReturnValue(''); - expect(queryByTestId(EMPTY_PROMPT_TEST_ID)).toBeInTheDocument(); - }); + const { queryByTestId } = render( + + + + ); - it('should render indicators table when count is being loaded', async () => { - ( - useIndicatorsTotalCount as jest.MockedFunction - ).mockReturnValue({ - count: 0, - isLoading: true, + expect(queryByTestId(TABLE_TEST_ID)).not.toBeInTheDocument(); + expect(queryByTestId(EMPTY_PROMPT_TEST_ID)).toBeInTheDocument(); + }); }); + }); + + describe('when loading is done and we have some indicators', () => { + it('should render indicators table', async () => { + ( + useIndicatorsTotalCount as jest.MockedFunction + ).mockReturnValue({ + count: 7, + isLoading: false, + }); - const { queryByTestId } = render( - - - - ); + const { queryByTestId } = render( + + + + ); - expect(queryByTestId(INDICATORS_TABLE_TEST_ID)).toBeInTheDocument(); + expect(queryByTestId(INDICATORS_TABLE_TEST_ID)).toBeInTheDocument(); + expect(queryByTestId(EMPTY_PROMPT_TEST_ID)).not.toBeInTheDocument(); + }); }); }); diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/indicators_page.tsx b/x-pack/plugins/threat_intelligence/public/modules/indicators/indicators_page.tsx index b3423ae6ad3e..5da38b7dae1f 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/indicators_page.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/indicators_page.tsx @@ -18,7 +18,6 @@ import QueryBar from './components/query_bar'; export const IndicatorsPage: VFC = () => { const { count: indicatorsTotalCount, isLoading: isIndicatorsTotalCountLoading } = useIndicatorsTotalCount(); - const showEmptyPage = !isIndicatorsTotalCountLoading && indicatorsTotalCount === 0; const { timeRange, @@ -38,6 +37,15 @@ export const IndicatorsPage: VFC = () => { timeRange, }); + // This prevents indicators table flash when total count is loading. + // TODO: Improve this with custom loader component. It would require changes to security solutions' template wrapper - to allow + // 'template' overrides. + if (isIndicatorsTotalCountLoading) { + return null; + } + + const showEmptyPage = indicatorsTotalCount === 0; + return showEmptyPage ? ( ) : (