import * as React from 'react'; import fakeDataProvider from 'ra-data-fakerest'; import { QueryClient } from '@tanstack/react-query'; import { CoreAdmin, CoreAdminContext, CoreAdminUI, Resource } from '../../core'; import { AuthProvider, DataProvider } from '../../types'; import { InfiniteListControllerProps, useInfiniteListController, } from './useInfiniteListController'; import { Browser } from '../../storybook/FakeBrowser'; import { TestMemoryRouter, LinkBase } from '../../routing'; import { useAuthState } from '../..'; export default { title: 'ra-core/controller/list/useInfiniteListController', excludeStories: ['defaultDataProvider'], }; const styles = { mainContainer: { margin: '20px 10px', }, ul: { marginTop: '20px', padding: '10px', }, }; export const defaultDataProvider = fakeDataProvider( { posts: [ { id: 1, title: 'Post #1', votes: 90 }, { id: 2, title: 'Post #2', votes: 20 }, { id: 3, title: 'Post #3', votes: 30 }, { id: 4, title: 'Post #4', votes: 40 }, { id: 5, title: 'Post #5', votes: 50 }, { id: 6, title: 'Post #6', votes: 60 }, { id: 7, title: 'Post #7', votes: 70 }, ], }, process.env.NODE_ENV === 'development' ); const List = params => { return (
{params.isPending ? (

Loading...

) : (
)} Dashboard
); }; const Dashboard = () => { useAuthState(); return (
Dashboard view
List
); }; const Posts = ({ children = List, ...props }: { children?: (params: any) => React.ReactNode; } & Partial) => { const params = useInfiniteListController({ resource: 'posts', ...props, }); return children(params); }; const ListWithCheckboxes = params => (
{params.isPending ? (

Loading...

) : (

Selected ids: {JSON.stringify(params.selectedIds)}

    {params.data?.map(record => (
  • params.onToggleItem(record.id)} style={{ cursor: 'pointer', marginRight: '10px', }} data-testid={`checkbox-${record.id}`} /> {record.id} - {record.title}
  • ))}
)}
); export const Basic = ({ dataProvider = defaultDataProvider, children = ListWithCheckboxes, }: { dataProvider?: DataProvider; children?: (props) => React.ReactNode; }) => { return ( {children}} /> ); }; const defaultAuthProvider: AuthProvider = { checkAuth: () => new Promise(resolve => setTimeout(resolve, 500)), login: () => Promise.resolve(), logout: () => Promise.resolve(), checkError: () => Promise.resolve(), getPermissions: () => Promise.resolve(), }; export const Authenticated = ({ authProvider = defaultAuthProvider, dataProvider = defaultDataProvider, }: { authProvider?: AuthProvider; dataProvider?: DataProvider; }) => { return ( ); }; export const DisableAuthentication = ({ authProvider = defaultAuthProvider, dataProvider = defaultDataProvider, }: { authProvider?: AuthProvider; dataProvider?: DataProvider; }) => { return ( } /> ); }; DisableAuthentication.args = { authProvider: undefined, }; DisableAuthentication.argTypes = { authProvider: { options: ['default', 'canAccess'], mapping: { default: undefined, canAccess: { ...defaultAuthProvider, canAccess: () => Promise.resolve(false), }, }, control: { type: 'inline-radio' }, }, }; export const CanAccess = ({ authProviderDelay = 300, }: { authProviderDelay?: number; }) => { return ( ); }; const AccessControlAdmin = ({ authProviderDelay, queryClient, }: { authProviderDelay?: number; queryClient: QueryClient; }) => { const [authorizedResources, setAuthorizedResources] = React.useState({ 'posts.list': true, }); const authProvider: AuthProvider = { login: () => Promise.reject(new Error('Not implemented')), logout: () => Promise.reject(new Error('Not implemented')), checkAuth: () => Promise.resolve(), checkError: () => Promise.reject(new Error('Not implemented')), getPermissions: () => Promise.resolve(undefined), canAccess: ({ action, resource }) => new Promise(resolve => { setTimeout(() => { resolve(authorizedResources[`${resource}.${action}`]); }, authProviderDelay); }), }; return ( } /> ); }; const AccessControlUI = ({ children, setAuthorizedResources, authorizedResources, queryClient, }: { children: React.ReactNode; setAuthorizedResources: Function; authorizedResources: { 'posts.list': boolean; }; queryClient: QueryClient; }) => { return (
{children}
); }; const AccessDenied = () => { return (
Access denied
List
); }; const AuthenticationError = () => { return (
AuthenticationError
); }; const Loading = () =>
Loading...
;