rc-adminlte
Version:
AdminLTE template ported to React
298 lines (280 loc) • 9.96 kB
JSX
/* eslint-disable import/first */
/* eslint-disable global-require */
import React, { Component } from 'react';
import {
BrowserRouter as Router, Switch, Route, Redirect, Link,
} from 'react-router-dom';
import PropTypes from 'prop-types';
import { library } from '@fortawesome/fontawesome-svg-core';
import { fas } from '@fortawesome/free-solid-svg-icons';
import { fab } from '@fortawesome/free-brands-svg-icons';
import { far } from '@fortawesome/free-regular-svg-icons';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import jQuery from 'jquery';
import '../css/bootstrap.min.css';
import 'source-sans-pro/source-sans-pro.css';
import '../adminlte/css/AdminLTE.css';
import 'bootstrap';
import '../adminlte/js/adminlte';
import 'jquery-sparkline';
import * as Sidebar from './Sidebar/Sidebar';
import Content from './Content';
import Footer from './Footer';
import ControlSidebar from './ControlSidebar';
import * as Navbar from './NavbarMenu/Navbar';
import Row from './content/Row';
import Col from './content/Col';
import Infobox from './content/Infobox';
import Box from './content/Box';
import DescriptionBlock from './content/DescriptionBlock';
import ProgressGroup from './content/ProgressGroup';
import Button from './content/Button';
import ButtonGroup from './content/ButtonGroup';
import DataTable from './content/DataTable';
import Tabs from './content/Tabs';
import TabContent from './content/TabContent';
import Description from './content/Description';
import DescriptionItem from './content/DescriptionItem';
import Margin from './content/Margin';
import SparklineBox from './content/SparklineBox';
import Chatbox from './content/Chatbox';
import Memberbox from './content/Memberbox';
import SimpleTable from './content/SimpleTable';
import Sparkbar from './content/Sparkbar';
import NavList from './content/NavList';
import NavListItem from './content/NavListItem';
import ProductList from './content/ProductList';
import ProductListItem from './content/ProductListItem';
import Infobox2 from './content/Infobox2';
import Alert from './content/Alert';
import Callout from './content/Callout';
import ProgressBar from './content/ProgressBar';
import Divider from './content/Divider';
import * as Inputs from './content/Inputs';
import LoginCore from './content/LoginCore';
import AsyncComponent from './AsyncComponent';
import {
Colors, Types, Sizes, FormTypes, Themes,
} from './PropTypes';
import Badge from './content/Badge';
import Calendar from './content/Calendar';
import LoadingSpinner from './content/LoadingSpinner';
import AsyncContent from './content/AsyncContent';
import BoxPane from './content/BoxPane';
import ButtonToolbar from './content/ButtonToolbar';
import Label from './content/Label';
library.add(fab, fas, far);
class AdminLTE extends Component {
componentDidMount() {
const { theme = 'blue', browserTitle } = this.props;
if (theme) {
document.body.className += ` skin-${theme} sidebar-mini`;
}
if (browserTitle) document.title = browserTitle;
switch (theme) {
case 'black-light':
require('../adminlte/css/skins/skin-black-light.css');
break;
case 'black':
require('../adminlte/css/skins/skin-black.css');
break;
case 'blue':
require('../adminlte/css/skins/skin-blue.css');
break;
case 'blue-light':
require('../adminlte/css/skins/skin-blue-light.css');
break;
case 'green':
require('../adminlte/css/skins/skin-green.css');
break;
case 'green-light':
require('../adminlte/css/skins/skin-green-light.css');
break;
case 'purple':
require('../adminlte/css/skins/skin-purple.css');
break;
case 'purple-light':
require('../adminlte/css/skins/skin-purple-light.css');
break;
case 'red':
require('../adminlte/css/skins/skin-red.css');
break;
case 'red-light':
require('../adminlte/css/skins/skin-red-light.css');
break;
case 'yellow':
require('../adminlte/css/skins/skin-yellow.css');
break;
case 'yellow-light':
require('../adminlte/css/skins/skin-yellow-light.css');
break;
default:
require('../adminlte/css/skins/skin-blue.css');
break;
}
const docReady = jQuery.isReady;
if (docReady) {
jQuery('body').layout();
} else {
jQuery(document).ready(() => {
jQuery('body').layout();
});
}
}
render() {
let {
children, title, titleShort,
} = this.props;
const { searchbarFilter } = this.props;
const { homeTo } = this.props;
{
if (!children) children = [<div>No content</div>];
if (!children.length) { children = [children]; }
let temp = children.filter(p => Object.prototype.toString.call(p) !== '[object Array]');
children.filter(p => Object.prototype.toString.call(p) === '[object Array]').forEach((p) => { temp = temp.concat(p); });
children = temp;
}
if (!title.length) {
title = [title];
}
const [titleBold, titlethin = ''] = title;
if (!titleShort.length) {
titleShort = [titleShort];
}
const [titleShortBold, titleShotThin = ''] = titleShort;
let [menu] = children && children.length && children.filter(p => p.type === Navbar.Core);
if (children.findIndex(p => p.type === ControlSidebar) > 0) {
menu = React.cloneElement(menu, { additionalMenus: [React.createElement(Navbar.ControlSidebarEntry, { key: 'control-sidebar-entry' })] });
}
const content = children.filter(p => p !== menu);
const routes = content.filter(p => (p.props && p.props.path) || (typeof p.type === 'function' && p.type === Redirect)).map((P) => {
if (P.type !== Route || P.type !== Redirect) {
if (P.type === AsyncContent) {
return (
<Route
modal={P.props.modal}
key={P.props.path}
path={P.props.path}
exact={P.props.exact}
component={AsyncComponent(() => import(P.props.component))}
/>
);
}
return (
<Route
modal={P.props.modal}
key={P.props.path}
path={P.props.path}
exact={P.props.exact}
render={props => React.cloneElement(P,
{ key: P.props.key ? P.props.key : P.props.path, ...props })}
/>
);
}
return P;
});
const nonModalRoutes = routes.filter(p => !p.props.modal);
const modalRoutes = routes.filter(p => p.props.modal);
const childSidebar = content.find(p => p.type === Sidebar.Core);
const childFooter = content.find(p => p.type === Footer);
const {
sidebar: propSidebar,
// controlSidebar,
footer: propFooter,
} = this.props;
if (childSidebar && propSidebar) {
// eslint-disable-next-line no-console
console.error('Pass sidebar either as prop or child but not both');
}
if (childFooter && propFooter) {
// eslint-disable-next-line no-console
console.error('Pass footer either as prop or child but not both');
}
const sidebar = childSidebar || (
<Sidebar.Core searchbarFilter={searchbarFilter}>
{propSidebar}
</Sidebar.Core>
);
const footer = childFooter || propFooter;
return (
<Router>
<div className="wrapper">
<header className="main-header">
<Link className="logo" to={homeTo}>
<span className="logo-mini">
<b>{titleShortBold}</b>
{titleShotThin}
</span>
<span className="logo-lg">
<b>{titleBold}</b>
{titlethin}
</span>
</Link>
<nav className="navbar navbar-static-top">
<div className="sidebar-toggle" data-toggle="push-menu" role="button">
<FontAwesomeIcon icon={['fas', 'bars']} />
<span className="sr-only">Toggle navigation</span>
</div>
<div className="navbar-custom-menu">
{menu}
</div>
</nav>
</header>
{sidebar}
<Switch>
{modalRoutes}
</Switch>
<div className="content-wrapper">
<Switch>
{nonModalRoutes}
</Switch>
</div>
{footer}
</div>
</Router>
);
}
}
AdminLTE.propTypes = {
children: PropTypes.oneOfType([
PropTypes.arrayOf(PropTypes.node),
PropTypes.node,
]),
title: PropTypes.oneOfType([
PropTypes.arrayOf(PropTypes.string),
PropTypes.string,
]),
titleShort: PropTypes.oneOfType([
PropTypes.arrayOf(PropTypes.string),
PropTypes.string,
]),
theme: PropTypes.oneOf(Themes),
browserTitle: PropTypes.string,
sidebar: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.node), PropTypes.node]),
footer: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.node), PropTypes.node]),
homeTo: PropTypes.string,
searchbarFilter: PropTypes.bool,
};
AdminLTE.defaultProps = {
children: null,
title: ['Admin', 'LTE'],
titleShort: ['A', 'LT'],
browserTitle: null,
theme: 'blue',
// controlSidebar: null,
footer: null,
sidebar: undefined,
homeTo: '/',
searchbarFilter: false,
};
export default AdminLTE;
export {
Content, Sidebar, Footer, ControlSidebar, Navbar, Row, Col, Infobox, Box
, DescriptionBlock, ProgressGroup, Button, DataTable, Tabs
, TabContent, Description, DescriptionItem, ButtonGroup, Margin, SparklineBox, Chatbox
, Memberbox, SimpleTable, Sparkbar, NavListItem, NavList, ProductList, ProductListItem
, Infobox2, LoginCore, AsyncComponent, Alert, Callout, ProgressBar
, Divider, Inputs, Label
, Colors, Types, Sizes, Themes, FormTypes
, Badge, Calendar, LoadingSpinner, BoxPane, ButtonToolbar,
};