admin-on-rest-fr05t1k
Version:
A frontend Framework for building admin applications on top of REST services, using ES6, React and Material UI
40 lines (35 loc) • 1.8 kB
JavaScript
import React from 'react';
import { IndexRoute, Route } from 'react-router';
import { createRoutesFromReactChildren } from 'react-router/lib/RouteUtils';
import pure from 'recompose/pure';
const CrudRoute = () => <div><CrudRoute> elements are for configuration only and should not be rendered</div>;
CrudRoute.createRouteFromReactElement = (element, parentRoute) => {
const { path, list, create, edit, show, remove, options, onEnter = () => null } = element.props;
// dynamically add crud routes
const crudRoute = createRoutesFromReactChildren(
<Route path={path}>
{list && <IndexRoute component={list} onEnter={onEnter({ resource: path, route: 'list' })} />}
{create && <Route path="create" component={create} onEnter={onEnter({ resource: path, route: 'create' })} />}
{edit && <Route path=":id" component={edit} onEnter={onEnter({ resource: path, route: 'edit', scrollToTop: true })} />}
{show && <Route path=":id/show" component={show} onEnter={onEnter({ resource: path, route: 'show', scrollToTop: true })} />}
{remove && <Route path=":id/delete" component={remove} onEnter={onEnter({ resource: path, route: 'delete' })} />}
</Route>,
parentRoute,
)[0];
// higher-order component to pass path as resource to components
crudRoute.component = pure(({ children }) => (
<div>
{React.Children.map(children, child => React.cloneElement(child, {
resource: path,
options,
hasList: !!list,
hasEdit: !!edit,
hasShow: !!show,
hasCreate: !!create,
hasDelete: !!remove,
}))}
</div>
));
return crudRoute;
};
export default CrudRoute;