ra-core
Version:
Core components of react-admin, a frontend Framework for building admin applications on top of REST services, using ES6, React
107 lines • 3.88 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.useSelectAll = void 0;
const react_query_1 = require("@tanstack/react-query");
const notification_1 = require("../../notification/index.cjs");
const dataProvider_1 = require("../../dataProvider/index.cjs");
const useRecordSelection_1 = require("./useRecordSelection.cjs");
const core_1 = require("../../core/index.cjs");
const util_1 = require("../../util/index.cjs");
/**
* Get a callback to select all records of a resource (capped by the limit parameter)
*
* @param {Object} params The hook parameters { resource, sort, filter }
* @returns {Function} handleSelectAll A function to select all items of a list
*
* @example
* import { List, Datagrid, BulkActionsToolbar, BulkDeleteButton, useListContext, useSelectAll } from 'react-admin';
*
* const MySelectAllButton = () => {
* const { sort, filter } = useListContext();
* const handleSelectAll = useSelectAll({ resource: 'posts', sort, filter });
* const handleClick = () => handleSelectAll({
* queryOptions: { meta: { foo: 'bar' } },
* limit: 250,
* });
* return <button onClick={handleClick}>Select All</button>;
* };
*
* const PostBulkActionsToolbar = () => (
* <BulkActionsToolbar actions={<MySelectAllButton/>}>
* <BulkDeleteButton />
* </BulkActionsToolbar>
* );
*
* export const PostList = () => (
* <List>
* <Datagrid bulkActionsToolbar={<PostBulkActionsToolbar />}>
* ...
* </Datagrid>
* </List>
* );
*/
const useSelectAll = (params) => {
const { sort, filter, storeKey, disableSyncWithStore } = params;
const resource = (0, core_1.useResourceContext)(params);
if (!resource) {
throw new Error('useSelectAll should be used inside a ResourceContextProvider or passed a resource prop');
}
const dataProvider = (0, dataProvider_1.useDataProvider)();
const queryClient = (0, react_query_1.useQueryClient)();
const [, { select }] = (0, useRecordSelection_1.useRecordSelection)({
resource,
storeKey,
disableSyncWithStore,
});
const notify = (0, notification_1.useNotify)();
const handleSelectAll = (0, util_1.useEvent)(async ({ queryOptions = {}, limit = 250, } = {}) => {
const { meta, onSuccess, onError, ...otherQueryOptions } = queryOptions;
try {
const results = await queryClient.fetchQuery({
queryKey: [
resource,
'getList',
{
pagination: { page: 1, perPage: limit },
sort,
filter,
meta,
},
],
queryFn: () => dataProvider.getList(resource, {
pagination: {
page: 1,
perPage: limit,
},
sort,
filter,
meta,
}),
...otherQueryOptions,
});
const allIds = results.data?.map(({ id }) => id) || [];
select(allIds);
if (allIds.length === limit) {
notify('ra.message.select_all_limit_reached', {
messageArgs: { max: limit },
type: 'warning',
});
}
if (onSuccess) {
onSuccess(results);
}
return results.data;
}
catch (error) {
if (onError) {
onError(error);
}
else {
notify('ra.notification.http_error', { type: 'warning' });
}
}
});
return handleSelectAll;
};
exports.useSelectAll = useSelectAll;
//# sourceMappingURL=useSelectAll.js.map