From 15e043ac7c49418c8802d2d60d4b3318a58a44e8 Mon Sep 17 00:00:00 2001 From: Sean Li Date: Wed, 20 Mar 2024 15:21:55 -0700 Subject: [PATCH 1/3] clear interval when component unmounts Signed-off-by: Sean Li --- public/components/hooks/use_polling.ts | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/public/components/hooks/use_polling.ts b/public/components/hooks/use_polling.ts index c1f79ada11..cf53684e89 100644 --- a/public/components/hooks/use_polling.ts +++ b/public/components/hooks/use_polling.ts @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { useState, useRef } from 'react'; +import { useState, useRef, useEffect } from 'react'; type FetchFunction = (params?: P) => Promise; @@ -85,6 +85,7 @@ export function usePolling( const [error, setError] = useState(null); const [loading, setLoading] = useState(true); const intervalRef = useRef(undefined); + const unmounted = useRef(false); const shouldPoll = useRef(false); @@ -96,6 +97,9 @@ export function usePolling( } }, interval); intervalRef.current = intervalId; + if (unmounted.current) { + clearInterval(intervalId); + } }; const stopPolling = () => { @@ -124,5 +128,11 @@ export function usePolling( } }; + useEffect(() => { + return () => { + unmounted.current = true; + }; + }, []); + return { data, loading, error, startPolling, stopPolling }; } From be6f8bcde6cf07d0f45b6219cf61f3511d5a03d1 Mon Sep 17 00:00:00 2001 From: Sean Li Date: Wed, 20 Mar 2024 15:40:15 -0700 Subject: [PATCH 2/3] updating empty state Signed-off-by: Sean Li --- .../associated_objects_tab.test.tsx.snap | 37 ------------------- .../associated_objects_tab.tsx | 10 +++-- .../utils/associated_objects_tab_empty.tsx | 18 +-------- 3 files changed, 8 insertions(+), 57 deletions(-) diff --git a/public/components/datasources/components/__tests__/__snapshots__/associated_objects_tab.test.tsx.snap b/public/components/datasources/components/__tests__/__snapshots__/associated_objects_tab.test.tsx.snap index e1a0522114..34efe888ba 100644 --- a/public/components/datasources/components/__tests__/__snapshots__/associated_objects_tab.test.tsx.snap +++ b/public/components/datasources/components/__tests__/__snapshots__/associated_objects_tab.test.tsx.snap @@ -5046,34 +5046,10 @@ exports[`AssociatedObjectsTab Component renders tab with no databases or objects Add databases and tables to your data source or use Query Workbench

- - Learn more - } - button={ - - Query Workbench - - } >
- Query Workbench - - } className="euiEmptyPrompt" >
- - - diff --git a/public/components/datasources/components/manage/associated_objects/associated_objects_tab.tsx b/public/components/datasources/components/manage/associated_objects/associated_objects_tab.tsx index 6f1bb27302..04dce0f543 100644 --- a/public/components/datasources/components/manage/associated_objects/associated_objects_tab.tsx +++ b/public/components/datasources/components/manage/associated_objects/associated_objects_tab.tsx @@ -160,7 +160,8 @@ export const AssociatedObjectsTab: React.FC = (props) if (datasource.name) { const datasourceCache = CatalogCacheManager.getOrCreateDataSource(datasource.name); if ( - datasourceCache.status === CachedDataSourceStatus.Empty && + (datasourceCache.status === CachedDataSourceStatus.Empty || + datasourceCache.status === CachedDataSourceStatus.Failed) && !isCatalogCacheFetching(databasesLoadStatus) ) { startLoadingDatabases(datasource.name); @@ -209,7 +210,8 @@ export const AssociatedObjectsTab: React.FC = (props) datasource.name ); if ( - databaseCache.status === CachedDataSourceStatus.Empty && + (databaseCache.status === CachedDataSourceStatus.Empty || + databaseCache.status === CachedDataSourceStatus.Failed) && !isCatalogCacheFetching(tablesLoadStatus) ) { startLoadingTables(datasource.name, selectedDatabase); @@ -218,7 +220,9 @@ export const AssociatedObjectsTab: React.FC = (props) setCachedTables(databaseCache.tables); } if ( - (accelerationsCache.status === CachedDataSourceStatus.Empty || isRefreshing) && + (accelerationsCache.status === CachedDataSourceStatus.Empty || + accelerationsCache.status === CachedDataSourceStatus.Failed || + isRefreshing) && !isCatalogCacheFetching(accelerationsLoadStatus) ) { startLoadingAccelerations(datasource.name); diff --git a/public/components/datasources/components/manage/associated_objects/utils/associated_objects_tab_empty.tsx b/public/components/datasources/components/manage/associated_objects/utils/associated_objects_tab_empty.tsx index b34575bc02..573977a5c7 100644 --- a/public/components/datasources/components/manage/associated_objects/utils/associated_objects_tab_empty.tsx +++ b/public/components/datasources/components/manage/associated_objects/utils/associated_objects_tab_empty.tsx @@ -3,10 +3,9 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { EuiButton, EuiEmptyPrompt, EuiLink, EuiText } from '@elastic/eui'; +import { EuiEmptyPrompt, EuiText } from '@elastic/eui'; import React from 'react'; import { LoadCacheType } from '../../../../../../../common/types/data_connections'; -import { coreRefs } from '../../../../../../framework/core_refs'; interface AssociatedObjectsTabEmptyProps { cacheType: LoadCacheType; @@ -14,17 +13,6 @@ interface AssociatedObjectsTabEmptyProps { export const AssociatedObjectsTabEmpty: React.FC = (props) => { const { cacheType } = props; - const { application } = coreRefs; - - const QueryWorkbenchButton = ( - application!.navigateToApp('opensearch-query-workbench')} - iconType="popout" - > - Query Workbench - - ); let titleText; let bodyText; @@ -51,12 +39,8 @@ export const AssociatedObjectsTabEmpty: React.FC

{titleText}

{bodyText}

- console.log()} external> - Learn more - } - button={QueryWorkbenchButton} /> ); }; From e2abfe3e5d7196ee7d651af5e72516d1f622fc3f Mon Sep 17 00:00:00 2001 From: Sean Li Date: Wed, 20 Mar 2024 15:59:21 -0700 Subject: [PATCH 3/3] adding back button on empty page, fixing empty accelerations length checker in associated objects tab Signed-off-by: Sean Li --- .../associated_objects_tab.test.tsx.snap | 95 +++++++++++++++++++ .../associated_objects_tab.tsx | 6 +- .../utils/associated_objects_tab_empty.tsx | 15 ++- 3 files changed, 114 insertions(+), 2 deletions(-) diff --git a/public/components/datasources/components/__tests__/__snapshots__/associated_objects_tab.test.tsx.snap b/public/components/datasources/components/__tests__/__snapshots__/associated_objects_tab.test.tsx.snap index 34efe888ba..2bc07095f6 100644 --- a/public/components/datasources/components/__tests__/__snapshots__/associated_objects_tab.test.tsx.snap +++ b/public/components/datasources/components/__tests__/__snapshots__/associated_objects_tab.test.tsx.snap @@ -5036,6 +5036,15 @@ exports[`AssociatedObjectsTab Component renders tab with no databases or objects cacheType="databases" > + Query Workbench + + } body={ @@ -5078,6 +5087,92 @@ exports[`AssociatedObjectsTab Component renders tab with no databases or objects + +
+ + + + + +
diff --git a/public/components/datasources/components/manage/associated_objects/associated_objects_tab.tsx b/public/components/datasources/components/manage/associated_objects/associated_objects_tab.tsx index 04dce0f543..02e690f0e0 100644 --- a/public/components/datasources/components/manage/associated_objects/associated_objects_tab.tsx +++ b/public/components/datasources/components/manage/associated_objects/associated_objects_tab.tsx @@ -367,7 +367,11 @@ export const AssociatedObjectsTab: React.FC = (props) ) : ( <> - {cachedTables.length > 0 || cachedAccelerations.length > 0 ? ( + {cachedTables.length > 0 || + cachedAccelerations.filter( + (acceleration: CachedAcceleration) => + acceleration.database === selectedDatabase + ).length > 0 ? ( = (props) => { const { cacheType } = props; + const { application } = coreRefs; + + const QueryWorkbenchButton = ( + application!.navigateToApp('opensearch-query-workbench')} + iconType="popout" + > + Query Workbench + + ); let titleText; let bodyText; @@ -41,6 +53,7 @@ export const AssociatedObjectsTabEmpty: React.FC } + actions={QueryWorkbenchButton} /> ); };