fix(ui): schema page loader bug (#12786)

* Fixed issue for database schema page where no data placeholder was showing while loading permissions

* removed unnecessary condition check
This commit is contained in:
Aniket Katkar 2023-08-16 15:31:57 +05:30 committed by GitHub
parent d2f3d45276
commit 911b41f7f3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 44 additions and 41 deletions

View File

@ -89,7 +89,7 @@ const DatabaseSchemaPage: FunctionComponent = () => {
const [threadType, setThreadType] = useState<ThreadType>( const [threadType, setThreadType] = useState<ThreadType>(
ThreadType.Conversation ThreadType.Conversation
); );
const [isLoading, setIsLoading] = useState(true); const [isPermissionsLoading, setIsPermissionsLoading] = useState(true);
const [databaseSchema, setDatabaseSchema] = useState<DatabaseSchema>( const [databaseSchema, setDatabaseSchema] = useState<DatabaseSchema>(
{} as DatabaseSchema {} as DatabaseSchema
); );
@ -132,7 +132,7 @@ const DatabaseSchemaPage: FunctionComponent = () => {
); );
const fetchDatabaseSchemaPermission = useCallback(async () => { const fetchDatabaseSchemaPermission = useCallback(async () => {
setIsLoading(true); setIsPermissionsLoading(true);
try { try {
const response = await getEntityPermissionByFqn( const response = await getEntityPermissionByFqn(
ResourceEntity.DATABASE_SCHEMA, ResourceEntity.DATABASE_SCHEMA,
@ -142,7 +142,7 @@ const DatabaseSchemaPage: FunctionComponent = () => {
} catch (error) { } catch (error) {
showErrorToast(error as AxiosError); showErrorToast(error as AxiosError);
} finally { } finally {
setIsLoading(false); setIsPermissionsLoading(false);
} }
}, [databaseSchemaFQN]); }, [databaseSchemaFQN]);
@ -193,7 +193,6 @@ const DatabaseSchemaPage: FunctionComponent = () => {
} catch (err) { } catch (err) {
// Error // Error
} finally { } finally {
setIsLoading(false);
setIsSchemaDetailsLoading(false); setIsSchemaDetailsLoading(false);
} }
}, [databaseSchemaFQN]); }, [databaseSchemaFQN]);
@ -435,6 +434,10 @@ const DatabaseSchemaPage: FunctionComponent = () => {
[tableData, getSchemaTables] [tableData, getSchemaTables]
); );
useEffect(() => {
fetchDatabaseSchemaPermission();
}, [databaseSchemaFQN]);
useEffect(() => { useEffect(() => {
if (viewDatabaseSchemaPermission) { if (viewDatabaseSchemaPermission) {
fetchDatabaseSchemaDetails(); fetchDatabaseSchemaDetails();
@ -443,14 +446,10 @@ const DatabaseSchemaPage: FunctionComponent = () => {
}, [viewDatabaseSchemaPermission, databaseSchemaFQN]); }, [viewDatabaseSchemaPermission, databaseSchemaFQN]);
useEffect(() => { useEffect(() => {
if (databaseSchemaFQN) { if (viewDatabaseSchemaPermission && databaseSchemaFQN) {
getSchemaTables(); getSchemaTables();
} }
}, [showDeletedTables, databaseSchemaFQN]); }, [showDeletedTables, databaseSchemaFQN, viewDatabaseSchemaPermission]);
useEffect(() => {
fetchDatabaseSchemaPermission();
}, [databaseSchemaFQN]);
// always Keep this useEffect at the end... // always Keep this useEffect at the end...
useEffect(() => { useEffect(() => {
@ -558,7 +557,7 @@ const DatabaseSchemaPage: FunctionComponent = () => {
}, },
]; ];
if (isLoading) { if (isPermissionsLoading) {
return <Loader />; return <Loader />;
} }
@ -572,7 +571,7 @@ const DatabaseSchemaPage: FunctionComponent = () => {
pageTitle={t('label.entity-detail-plural', { pageTitle={t('label.entity-detail-plural', {
entity: getEntityName(databaseSchema), entity: getEntityName(databaseSchema),
})}> })}>
{isEmpty(databaseSchema) ? ( {isEmpty(databaseSchema) && !isSchemaDetailsLoading ? (
<ErrorPlaceHolder className="m-0"> <ErrorPlaceHolder className="m-0">
{getEntityMissingError(EntityType.DATABASE_SCHEMA, databaseSchemaFQN)} {getEntityMissingError(EntityType.DATABASE_SCHEMA, databaseSchemaFQN)}
</ErrorPlaceHolder> </ErrorPlaceHolder>

View File

@ -35,23 +35,15 @@ jest.mock('../../utils/ToastUtils', () => ({
})); }));
jest.mock('components/Loader/Loader', () => jest.mock('components/Loader/Loader', () =>
jest.fn().mockImplementation(() => <div data-testid="Loader">Loader</div>) jest.fn().mockImplementation(() => <div>Loader</div>)
); );
jest.mock('components/common/rich-text-editor/RichTextEditorPreviewer', () => jest.mock('components/common/rich-text-editor/RichTextEditorPreviewer', () =>
jest jest.fn().mockImplementation(() => <div>RichTextEditorPreviewer</div>)
.fn()
.mockImplementation(() => (
<div data-testid="RichTextEditorPreviewer">RichTextEditorPreviewer</div>
))
); );
jest.mock('components/common/next-previous/NextPrevious', () => jest.mock('components/common/next-previous/NextPrevious', () =>
jest jest.fn().mockImplementation(() => <div>NextPrevious</div>)
.fn()
.mockImplementation(() => (
<div data-testid="NextPrevious">NextPrevious</div>
))
); );
jest.mock('components/FeedEditor/FeedEditor', () => { jest.mock('components/FeedEditor/FeedEditor', () => {
@ -62,7 +54,7 @@ jest.mock('components/common/error-with-placeholder/ErrorPlaceHolder', () =>
jest jest
.fn() .fn()
.mockImplementation(({ children }) => ( .mockImplementation(({ children }) => (
<div data-testid="ErrorPlaceHolder">{children}</div> <div data-testid="error-placeHolder">{children}</div>
)) ))
); );
@ -72,7 +64,6 @@ jest.mock('components/common/description/Description', () =>
.mockImplementation( .mockImplementation(
({ onThreadLinkSelect, onDescriptionEdit, onDescriptionUpdate }) => ( ({ onThreadLinkSelect, onDescriptionEdit, onDescriptionUpdate }) => (
<div <div
data-testid="Description"
onClick={() => { onClick={() => {
onThreadLinkSelect('threadLink'); onThreadLinkSelect('threadLink');
onDescriptionEdit(); onDescriptionEdit();
@ -86,12 +77,7 @@ jest.mock('components/common/description/Description', () =>
jest.mock( jest.mock(
'components/ActivityFeed/ActivityThreadPanel/ActivityThreadPanel', 'components/ActivityFeed/ActivityThreadPanel/ActivityThreadPanel',
() => () => jest.fn().mockImplementation(() => <div>ActivityThreadPanel</div>)
jest
.fn()
.mockImplementation(() => (
<div data-testid="ActivityThreadPanel">ActivityThreadPanel</div>
))
); );
jest.mock('components/PermissionProvider/PermissionProvider', () => ({ jest.mock('components/PermissionProvider/PermissionProvider', () => ({
@ -177,11 +163,11 @@ describe.skip('Tests for DatabaseSchemaPage', () => {
const entityPageInfo = await screen.findByTestId('entityPageInfo'); const entityPageInfo = await screen.findByTestId('entityPageInfo');
const tabsPane = await screen.findByTestId('tabs'); const tabsPane = await screen.findByTestId('tabs');
const richTextEditorPreviewer = await screen.findAllByTestId( const richTextEditorPreviewer = await screen.findAllByText(
'RichTextEditorPreviewer' 'RichTextEditorPreviewer'
); );
const description = await screen.findByTestId('Description'); const description = await screen.findByText('Description');
const nextPrevious = await screen.findByTestId('NextPrevious'); const nextPrevious = await screen.findByText('NextPrevious');
const databaseSchemaTable = await screen.findByTestId( const databaseSchemaTable = await screen.findByTestId(
'databaseSchema-tables' 'databaseSchema-tables'
); );
@ -194,6 +180,26 @@ describe.skip('Tests for DatabaseSchemaPage', () => {
expect(databaseSchemaTable).toBeInTheDocument(); expect(databaseSchemaTable).toBeInTheDocument();
}); });
it('Loader should be visible if the permissions are being fetched', async () => {
await act(async () => {
render(<DatabaseSchemaPageComponent />, {
wrapper: MemoryRouter,
});
const loader = screen.getByText('Loader');
const errorPlaceHolder = screen.queryByText('error-placeHolder');
expect(loader).toBeInTheDocument();
expect(errorPlaceHolder).toBeNull();
});
const entityPageInfo = await screen.findByTestId('entityPageInfo');
const tabsPane = await screen.findByTestId('tabs');
expect(entityPageInfo).toBeInTheDocument();
expect(tabsPane).toBeInTheDocument();
});
it('Activity Feed List should render properly for "Activity Feeds" tab', async () => { it('Activity Feed List should render properly for "Activity Feeds" tab', async () => {
mockParams.tab = 'activity_feed'; mockParams.tab = 'activity_feed';
@ -208,7 +214,7 @@ describe.skip('Tests for DatabaseSchemaPage', () => {
expect(activityFeedList).toBeInTheDocument(); expect(activityFeedList).toBeInTheDocument();
}); });
it('AcivityThreadPanel should render properly after clicked on thread panel button', async () => { it('ActivityThreadPanel should render properly after clicked on thread panel button', async () => {
mockParams.tab = 'table'; mockParams.tab = 'table';
await act(async () => { await act(async () => {
render(<DatabaseSchemaPageComponent />, { render(<DatabaseSchemaPageComponent />, {
@ -216,7 +222,7 @@ describe.skip('Tests for DatabaseSchemaPage', () => {
}); });
}); });
const description = await screen.findByTestId('Description'); const description = await screen.findByText('Description');
expect(description).toBeInTheDocument(); expect(description).toBeInTheDocument();
@ -224,9 +230,7 @@ describe.skip('Tests for DatabaseSchemaPage', () => {
fireEvent.click(description); fireEvent.click(description);
}); });
const activityThreadPanel = await screen.findByTestId( const activityThreadPanel = await screen.findByText('ActivityThreadPanel');
'ActivityThreadPanel'
);
expect(activityThreadPanel).toBeInTheDocument(); expect(activityThreadPanel).toBeInTheDocument();
}); });
@ -242,7 +246,7 @@ describe.skip('Tests for DatabaseSchemaPage', () => {
}); });
}); });
const errorPlaceHolder = await screen.findByTestId('ErrorPlaceHolder'); const errorPlaceHolder = await screen.findByTestId('error-placeHolder');
const errorMessage = await screen.findByTestId('error-message'); const errorMessage = await screen.findByTestId('error-message');
expect(errorPlaceHolder).toBeInTheDocument(); expect(errorPlaceHolder).toBeInTheDocument();
@ -266,7 +270,7 @@ describe.skip('Tests for DatabaseSchemaPage', () => {
}); });
}); });
const errorPlaceHolder = await screen.findByTestId('ErrorPlaceHolder'); const errorPlaceHolder = await screen.findByTestId('error-placeHolder');
expect(errorPlaceHolder).toBeInTheDocument(); expect(errorPlaceHolder).toBeInTheDocument();
}); });