@ra-libs/react-rbac
Version:
React admin RBAC front components and utils
54 lines • 2.89 kB
JavaScript
import React, { isValidElement } from 'react';
import { ResourceContextProvider, RestoreScrollPosition } from 'react-admin';
import { isValidElementType } from 'react-is';
import { Route, Routes } from 'react-router-dom';
import { CASLAction } from '../../config';
import { useCASL } from '../../contexts';
import { createAbility, createRules } from '../../contexts/CASL/utils';
import { InitPermissions } from '../InitPermissions';
export const Resource = (props) => {
const { name } = props;
return (React.createElement(ResourceContextProvider, { value: name },
React.createElement(CASLResource, Object.assign({}, props))));
};
function CASLResource(props) {
const { create, edit, list, name, subject, show } = props;
const { ability } = useCASL();
const permissionName = subject ? subject : name;
return (React.createElement(React.Fragment, null,
React.createElement(InitPermissions, null),
React.createElement(ResourceContextProvider, { value: name },
React.createElement(Routes, null,
create && ability.can(CASLAction.Create, permissionName) && (React.createElement(Route, { path: 'create/*', element: getElement(create) })),
show && ability.can(CASLAction.Read, permissionName) && (React.createElement(Route, { path: ':id/show/*', element: getElement(show) })),
edit && ability.can(CASLAction.Update, permissionName) && React.createElement(Route, { path: ':id/*', element: getElement(edit) }),
list && ability.can(CASLAction.Read, permissionName) && (React.createElement(Route, { path: '/*', element: React.createElement(RestoreScrollPosition, { storeKey: `${name}.list.scrollPosition` }, getElement(list)) })),
props.children))));
}
const getElement = (ElementOrComponent) => {
if (isValidElement(ElementOrComponent)) {
return ElementOrComponent;
}
if (isValidElementType(ElementOrComponent)) {
const Element = ElementOrComponent;
return React.createElement(Element, null);
}
return null;
};
Resource.raName = 'Resource';
Resource.registerResource = ({ create, edit, icon, list, name, options, show, recordRepresentation, hasCreate, hasEdit, hasShow, subject, }, permissions) => {
const rules = createRules(permissions);
const ability = createAbility(rules);
const permissionName = subject ? subject : name;
return {
name,
options,
hasList: !!list && ability.can(CASLAction.Read, permissionName),
hasCreate: (!!create || !!hasCreate) && ability.can(CASLAction.Create, permissionName),
hasEdit: (!!edit || !!hasEdit) && ability.can(CASLAction.Update, permissionName),
hasShow: (!!show || !!hasShow) && ability.can(CASLAction.Read, permissionName),
icon,
recordRepresentation,
};
};
//# sourceMappingURL=index.js.map