@ra-libs/react-rbac
Version:
React admin RBAC front components and utils
59 lines • 3.46 kB
JavaScript
"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