UNPKG

@ra-libs/react-rbac

Version:

React admin RBAC front components and utils

54 lines 2.89 kB
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