UNPKG

@ra-libs/react-rbac

Version:

React admin RBAC front components and utils

59 lines 3.46 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Resource = void 0; const tslib_1 = require("tslib"); const react_1 = tslib_1.__importStar(require("react")); const react_admin_1 = require("react-admin"); const react_is_1 = require("react-is"); const react_router_dom_1 = require("react-router-dom"); const config_1 = require("../../config"); const contexts_1 = require("../../contexts"); const utils_1 = require("../../contexts/CASL/utils"); const InitPermissions_1 = require("../InitPermissions"); const Resource = (props) => { const { name } = props; return (react_1.default.createElement(react_admin_1.ResourceContextProvider, { value: name }, react_1.default.createElement(CASLResource, Object.assign({}, props)))); }; exports.Resource = Resource; function CASLResource(props) { const { create, edit, list, name, subject, show } = props; const { ability } = (0, contexts_1.useCASL)(); const permissionName = subject ? subject : name; return (react_1.default.createElement(react_1.default.Fragment, null, react_1.default.createElement(InitPermissions_1.InitPermissions, null), react_1.default.createElement(react_admin_1.ResourceContextProvider, { value: name }, react_1.default.createElement(react_router_dom_1.Routes, null, create && ability.can(config_1.CASLAction.Create, permissionName) && (react_1.default.createElement(react_router_dom_1.Route, { path: 'create/*', element: getElement(create) })), show && ability.can(config_1.CASLAction.Read, permissionName) && (react_1.default.createElement(react_router_dom_1.Route, { path: ':id/show/*', element: getElement(show) })), edit && ability.can(config_1.CASLAction.Update, permissionName) && react_1.default.createElement(react_router_dom_1.Route, { path: ':id/*', element: getElement(edit) }), list && ability.can(config_1.CASLAction.Read, permissionName) && (react_1.default.createElement(react_router_dom_1.Route, { path: '/*', element: react_1.default.createElement(react_admin_1.RestoreScrollPosition, { storeKey: `${name}.list.scrollPosition` }, getElement(list)) })), props.children)))); } const getElement = (ElementOrComponent) => { if ((0, react_1.isValidElement)(ElementOrComponent)) { return ElementOrComponent; } if ((0, react_is_1.isValidElementType)(ElementOrComponent)) { const Element = ElementOrComponent; return react_1.default.createElement(Element, null); } return null; }; exports.Resource.raName = 'Resource'; exports.Resource.registerResource = ({ create, edit, icon, list, name, options, show, recordRepresentation, hasCreate, hasEdit, hasShow, subject, }, permissions) => { const rules = (0, utils_1.createRules)(permissions); const ability = (0, utils_1.createAbility)(rules); const permissionName = subject ? subject : name; return { name, options, hasList: !!list && ability.can(config_1.CASLAction.Read, permissionName), hasCreate: (!!create || !!hasCreate) && ability.can(config_1.CASLAction.Create, permissionName), hasEdit: (!!edit || !!hasEdit) && ability.can(config_1.CASLAction.Update, permissionName), hasShow: (!!show || !!hasShow) && ability.can(config_1.CASLAction.Read, permissionName), icon, recordRepresentation, }; }; //# sourceMappingURL=index.js.map