1
- import React , { Component } from 'react' ;
2
- import { NavLink } from 'react-router-dom'
1
+ import React , { Component } from 'react' ;
2
+ import { NavLink } from 'react-router-dom' ;
3
+ import { Badge , Nav , NavItem } from 'reactstrap' ;
4
+ import classNames from 'classnames' ;
5
+ import nav from './_nav'
3
6
4
7
class Sidebar extends Component {
5
8
@@ -8,97 +11,90 @@ class Sidebar extends Component {
8
11
e . target . parentElement . classList . toggle ( 'open' ) ;
9
12
}
10
13
11
- activeRoute ( routeName ) {
12
- return this . props . location . pathname . indexOf ( routeName ) > - 1 ? 'nav-item nav-dropdown open' : 'nav-item nav-dropdown' ;
14
+ activeRoute ( routeName , props ) {
15
+ // return this.props.location.pathname.indexOf(routeName) > -1 ? 'nav-item nav-dropdown open' : 'nav-item nav-dropdown';
16
+ return props . location . pathname . indexOf ( routeName ) > - 1 ? 'nav-item nav-dropdown open' : 'nav-item nav-dropdown' ;
17
+
13
18
}
14
19
20
+ // todo Sidebar nav secondLevel
15
21
// secondLevelActive(routeName) {
16
22
// return this.props.location.pathname.indexOf(routeName) > -1 ? "nav nav-second-level collapse in" : "nav nav-second-level collapse";
17
23
// }
18
24
25
+
19
26
render ( ) {
27
+
28
+ const props = this . props ;
29
+ const activeRoute = this . activeRoute ;
30
+ const handleClick = this . handleClick ;
31
+
32
+ // badge addon to NavItem
33
+ const badge = ( badge ) => {
34
+ if ( badge ) {
35
+ const classes = classNames ( badge . class ) ;
36
+ return ( < Badge className = { classes } color = { badge . variant } > { badge . text } </ Badge > )
37
+ }
38
+ } ;
39
+
40
+ // simple wrapper for nav-title item
41
+ const wrapper = item => { return ( ! item . wrapper ? item . name : ( React . createElement ( item . wrapper . element , item . wrapper . attributes , item . name ) ) ) } ;
42
+
43
+ // nav list section title
44
+ const title = ( title , key ) => {
45
+ const classes = classNames ( "nav-title" , title . class ) ;
46
+ return ( < li key = { key } className = { classes } > { wrapper ( title ) } </ li > ) ;
47
+ } ;
48
+
49
+ // nav list divider
50
+ const divider = ( divider , key ) => ( < li key = { key } className = "divider" > </ li > ) ;
51
+
52
+ // nav item with nav link
53
+ const navItem = ( item , key ) => {
54
+ const classes = classNames ( "nav-link" , item . class ) ;
55
+ return (
56
+ < NavItem key = { key } >
57
+ < NavLink to = { item . url } className = { classes } activeClassName = "active" >
58
+ < i className = { item . icon } > </ i > { item . name } { badge ( item . badge ) }
59
+ </ NavLink >
60
+ </ NavItem >
61
+ )
62
+ } ;
63
+
64
+ // nav dropdown
65
+ const navDropdown = ( item , key ) => {
66
+ return (
67
+ < li key = { key } className = { activeRoute ( item . url , props ) } >
68
+ < a className = "nav-link nav-dropdown-toggle" href = "#" onClick = { handleClick . bind ( this ) } > < i className = { item . icon } > </ i > { item . name } </ a >
69
+ < ul className = "nav-dropdown-items" >
70
+ { navList ( item . children ) }
71
+ </ ul >
72
+ </ li > )
73
+ } ;
74
+
75
+ // nav link
76
+ const navLink = ( item , idx ) =>
77
+ item . title ? title ( item , idx ) :
78
+ item . divider ? divider ( item , idx ) :
79
+ item . children ? navDropdown ( item , idx )
80
+ : navItem ( item , idx ) ;
81
+
82
+ // nav list
83
+ const navList = ( items ) => {
84
+ return items . map ( ( item , index ) => navLink ( item , index ) ) ;
85
+ } ;
86
+
87
+ // sidebar-nav root
20
88
return (
21
89
< div className = "sidebar" >
22
90
< nav className = "sidebar-nav" >
23
- < ul className = "nav" >
24
- < li className = "nav-item" >
25
- < NavLink to = { '/dashboard' } className = "nav-link" activeClassName = "active" > < i className = "icon-speedometer" > </ i > Dashboard < span className = "badge badge-info" > NEW</ span > </ NavLink >
26
- </ li >
27
- < li className = "nav-title" >
28
- UI Elements
29
- </ li >
30
- < li className = { this . activeRoute ( "/components" ) } >
31
- < a className = "nav-link nav-dropdown-toggle" href = "#" onClick = { this . handleClick . bind ( this ) } > < i className = "icon-puzzle" > </ i > Components</ a >
32
- < ul className = "nav-dropdown-items" >
33
- < li className = "nav-item" >
34
- < NavLink to = { '/components/buttons' } className = "nav-link" activeClassName = "active" > < i className = "icon-puzzle" > </ i > Buttons</ NavLink >
35
- </ li >
36
- < li className = "nav-item" >
37
- < NavLink to = { '/components/social-buttons' } className = "nav-link" activeClassName = "active" > < i className = "icon-puzzle" > </ i > Social Buttons</ NavLink >
38
- </ li >
39
- < li className = "nav-item" >
40
- < NavLink to = { '/components/cards' } className = "nav-link" activeClassName = "active" > < i className = "icon-puzzle" > </ i > Cards</ NavLink >
41
- </ li >
42
- < li className = "nav-item" >
43
- < NavLink to = { '/components/forms' } className = "nav-link" activeClassName = "active" > < i className = "icon-puzzle" > </ i > Forms</ NavLink >
44
- </ li >
45
- < li className = "nav-item" >
46
- < NavLink to = { '/components/modals' } className = "nav-link" activeClassName = "active" > < i className = "icon-puzzle" > </ i > Modals</ NavLink >
47
- </ li >
48
- < li className = "nav-item" >
49
- < NavLink to = { '/components/switches' } className = "nav-link" activeClassName = "active" > < i className = "icon-puzzle" > </ i > Switches</ NavLink >
50
- </ li >
51
- < li className = "nav-item" >
52
- < NavLink to = { '/components/tables' } className = "nav-link" activeClassName = "active" > < i className = "icon-puzzle" > </ i > Tables</ NavLink >
53
- </ li >
54
- < li className = "nav-item" >
55
- < NavLink to = { '/components/tabs' } className = "nav-link" activeClassName = "active" > < i className = "icon-puzzle" > </ i > Tabs</ NavLink >
56
- </ li >
57
- </ ul >
58
- </ li >
59
- < li className = { this . activeRoute ( "/icons" ) } >
60
- < a className = "nav-link nav-dropdown-toggle" href = "#" onClick = { this . handleClick . bind ( this ) } > < i className = "icon-star" > </ i > Icons</ a >
61
- < ul className = "nav-dropdown-items" >
62
- < li className = "nav-item" >
63
- < NavLink to = { '/icons/font-awesome' } className = "nav-link" activeClassName = "active" > < i className = "icon-star" > </ i > Font Awesome</ NavLink >
64
- </ li >
65
- < li className = "nav-item" >
66
- < NavLink to = { '/icons/simple-line-icons' } className = "nav-link" activeClassName = "active" > < i className = "icon-star" > </ i > Simple Line Icons</ NavLink >
67
- </ li >
68
- </ ul >
69
- </ li >
70
- < li className = "nav-item" >
71
- < NavLink to = { '/widgets' } className = "nav-link" activeClassName = "active" > < i className = "icon-calculator" > </ i > Widgets < span className = "badge badge-info" > NEW</ span > </ NavLink >
72
- </ li >
73
- < li className = "nav-item" >
74
- < NavLink to = { '/charts' } className = "nav-link" activeClassName = "active" > < i className = "icon-pie-chart" > </ i > Charts</ NavLink >
75
- </ li >
76
- < li className = "divider" > </ li >
77
- < li className = "nav-title" >
78
- Extras
79
- </ li >
80
- < li className = "nav-item nav-dropdown" >
81
- < a className = "nav-link nav-dropdown-toggle" href = "#" onClick = { this . handleClick . bind ( this ) } > < i className = "icon-star" > </ i > Pages</ a >
82
- < ul className = "nav-dropdown-items" >
83
- < li className = "nav-item" >
84
- < NavLink to = { '/login' } className = "nav-link" activeClassName = "active" > < i className = "icon-star" > </ i > Login</ NavLink >
85
- </ li >
86
- < li className = "nav-item" >
87
- < NavLink to = { '/register' } className = "nav-link" activeClassName = "active" > < i className = "icon-star" > </ i > Register</ NavLink >
88
- </ li >
89
- < li className = "nav-item" >
90
- < NavLink to = { '/404' } className = "nav-link" activeClassName = "active" > < i className = "icon-star" > </ i > Error 404</ NavLink >
91
- </ li >
92
- < li className = "nav-item" >
93
- < NavLink to = { '/500' } className = "nav-link" activeClassName = "active" > < i className = "icon-star" > </ i > Error 500</ NavLink >
94
- </ li >
95
- </ ul >
96
- </ li >
97
- </ ul >
91
+ < Nav >
92
+ { navList ( nav . items ) }
93
+ </ Nav >
98
94
</ nav >
99
95
</ div >
100
96
)
101
97
}
102
98
}
103
99
104
- export default Sidebar ;
100
+ export default Sidebar ;
0 commit comments