Skip to content

Commit 7df8d6a

Browse files
authored
Merge pull request #10917 from marmelab/list-base-empty-while-loading
Introduce `emptyWhileLoading` on `<ListBase>`
2 parents 704ad2c + 05e8419 commit 7df8d6a

21 files changed

+209
-48
lines changed

docs/ListBase.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ The `<ListBase>` component accepts the following props:
8484
* [`debounce`](./List.md#debounce)
8585
* [`disableAuthentication`](./List.md#disableauthentication)
8686
* [`disableSyncWithLocation`](./List.md#disablesyncwithlocation)
87+
* [`emptyWhileLoading`](./List.md#emptywhileloading)
8788
* [`exporter`](./List.md#exporter)
8889
* [`filter`](./List.md#filter-permanent-filter)
8990
* [`filterDefaultValues`](./List.md#filterdefaultvalues)

packages/ra-core/src/controller/edit/EditBase.spec.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,12 @@ import {
1111
WithAuthProviderNoAccessControl,
1212
WithRenderProps,
1313
} from './EditBase.stories';
14+
import { onlineManager } from '@tanstack/react-query';
1415

1516
describe('EditBase', () => {
17+
beforeEach(() => {
18+
onlineManager.setOnline(true);
19+
});
1620
it('should give access to the save function', async () => {
1721
const dataProvider = testDataProvider({
1822
getOne: () =>

packages/ra-core/src/controller/field/ReferenceArrayFieldBase.spec.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,12 @@ import { ReferenceArrayFieldBase } from './ReferenceArrayFieldBase';
1212
import { useResourceContext } from '../../core/useResourceContext';
1313
import { testDataProvider } from '../../dataProvider/testDataProvider';
1414
import { CoreAdminContext } from '../../core/CoreAdminContext';
15+
import { onlineManager } from '@tanstack/react-query';
1516

1617
describe('ReferenceArrayFieldBase', () => {
18+
beforeEach(() => {
19+
onlineManager.setOnline(true);
20+
});
1721
it('should display an error if error is defined', async () => {
1822
jest.spyOn(console, 'error')
1923
.mockImplementationOnce(() => {})

packages/ra-core/src/controller/field/ReferenceFieldBase.spec.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,15 @@ import {
1414
WithRenderProp,
1515
} from './ReferenceFieldBase.stories';
1616
import { RecordContextProvider } from '../record';
17+
import { onlineManager } from '@tanstack/react-query';
1718

1819
describe('<ReferenceFieldBase />', () => {
1920
beforeAll(() => {
2021
window.scrollTo = jest.fn();
2122
});
23+
beforeEach(() => {
24+
onlineManager.setOnline(true);
25+
});
2226

2327
it('should display an error if error is defined', async () => {
2428
jest.spyOn(console, 'error')

packages/ra-core/src/controller/field/ReferenceManyCountBase.spec.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,12 @@ import {
66
LoadingState,
77
Offline,
88
} from './ReferenceManyCountBase.stories';
9+
import { onlineManager } from '@tanstack/react-query';
910

1011
describe('ReferenceManyCountBase', () => {
12+
beforeEach(() => {
13+
onlineManager.setOnline(true);
14+
});
1115
it('should display an error if error is defined', async () => {
1216
jest.spyOn(console, 'error')
1317
.mockImplementationOnce(() => {})

packages/ra-core/src/controller/field/ReferenceManyFieldBase.spec.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,12 @@ import { ReferenceManyFieldBase } from './ReferenceManyFieldBase';
1212
import { useResourceContext } from '../../core/useResourceContext';
1313
import { testDataProvider } from '../../dataProvider/testDataProvider';
1414
import { CoreAdminContext } from '../../core/CoreAdminContext';
15+
import { onlineManager } from '@tanstack/react-query';
1516

1617
describe('ReferenceManyFieldBase', () => {
18+
beforeEach(() => {
19+
onlineManager.setOnline(true);
20+
});
1721
it('should display an error if error is defined', async () => {
1822
jest.spyOn(console, 'error')
1923
.mockImplementationOnce(() => {})

packages/ra-core/src/controller/field/ReferenceOneFieldBase.spec.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,12 @@ import {
66
Offline,
77
WithRenderProp,
88
} from './ReferenceOneFieldBase.stories';
9+
import { onlineManager } from '@tanstack/react-query';
910

1011
describe('ReferenceOneFieldBase', () => {
12+
beforeEach(() => {
13+
onlineManager.setOnline(true);
14+
});
1115
it('should pass the loading state', async () => {
1216
jest.spyOn(console, 'error')
1317
.mockImplementationOnce(() => {})

packages/ra-core/src/controller/input/ReferenceArrayInputBase.spec.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,12 @@ import * as React from 'react';
22
import { fireEvent, render, screen, waitFor } from '@testing-library/react';
33
import { testDataProvider } from 'ra-core';
44
import { Basic, Offline, WithError } from './ReferenceArrayInputBase.stories';
5+
import { onlineManager } from '@tanstack/react-query';
56

67
describe('<ReferenceArrayInputBase>', () => {
8+
beforeEach(() => {
9+
onlineManager.setOnline(true);
10+
});
711
afterEach(async () => {
812
// wait for the getManyAggregate batch to resolve
913
await waitFor(() => new Promise(resolve => setTimeout(resolve, 0)));

packages/ra-core/src/controller/input/ReferenceInputBase.spec.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import * as React from 'react';
22
import expect from 'expect';
33
import { render, screen, waitFor, fireEvent } from '@testing-library/react';
4-
import { QueryClient } from '@tanstack/react-query';
4+
import { onlineManager, QueryClient } from '@tanstack/react-query';
55
import { CoreAdminContext } from '../../core';
66
import {
77
ChoicesProps,
@@ -30,6 +30,9 @@ describe('<ReferenceInputBase />', () => {
3030
beforeAll(() => {
3131
window.scrollTo = jest.fn();
3232
});
33+
beforeEach(() => {
34+
onlineManager.setOnline(true);
35+
});
3336

3437
it('should display an error if error is defined', async () => {
3538
jest.spyOn(console, 'error')

packages/ra-core/src/controller/list/ListBase.spec.tsx

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,20 @@ import { fireEvent, render, screen, waitFor } from '@testing-library/react';
33
import {
44
AccessControl,
55
DefaultTitle,
6+
EmptyWhileLoading,
7+
EmptyWhileLoadingRender,
68
NoAuthProvider,
79
Offline,
810
WithAuthProviderNoAccessControl,
911
WithRenderProps,
1012
} from './ListBase.stories';
1113
import { testDataProvider } from '../../dataProvider';
14+
import { onlineManager } from '@tanstack/react-query';
1215

1316
describe('ListBase', () => {
17+
beforeEach(() => {
18+
onlineManager.setOnline(true);
19+
});
1420
it('should load data immediately if authProvider is not provided', async () => {
1521
const dataProvider = testDataProvider({
1622
// @ts-ignore
@@ -144,7 +150,7 @@ describe('ListBase', () => {
144150
it('should render the offline prop node when offline', async () => {
145151
const { rerender } = render(<Offline isOnline={false} />);
146152
await screen.findByText('You are offline, cannot load data');
147-
rerender(<Offline isOnline={true} />);
153+
rerender(<Offline isOnline />);
148154
await screen.findByText('War and Peace');
149155
expect(
150156
screen.queryByText('You are offline, cannot load data')
@@ -153,11 +159,25 @@ describe('ListBase', () => {
153159
await screen.findByText('You are offline, the data may be outdated');
154160
fireEvent.click(screen.getByText('next'));
155161
await screen.findByText('You are offline, cannot load data');
156-
rerender(<Offline isOnline={true} />);
162+
rerender(<Offline isOnline />);
157163
await screen.findByText('And Then There Were None');
158164
rerender(<Offline isOnline={false} />);
159165
fireEvent.click(screen.getByText('previous'));
160166
await screen.findByText('War and Peace');
161167
await screen.findByText('You are offline, the data may be outdated');
162168
});
169+
it('should render nothing while loading if emptyWhileLoading is set to true', async () => {
170+
render(<EmptyWhileLoading />);
171+
expect(screen.queryByText('Loading...')).toBeNull();
172+
expect(screen.queryByText('War and Peace')).toBeNull();
173+
fireEvent.click(screen.getByText('Resolve books loading'));
174+
await screen.findByText('War and Peace');
175+
});
176+
it('should render nothing while loading if emptyWhileLoading is set to true and using the render prop', async () => {
177+
render(<EmptyWhileLoadingRender />);
178+
expect(screen.queryByText('Loading...')).toBeNull();
179+
expect(screen.queryByText('War and Peace')).toBeNull();
180+
fireEvent.click(screen.getByText('Resolve books loading'));
181+
await screen.findByText('War and Peace');
182+
});
163183
});

0 commit comments

Comments
 (0)