@@ -4,6 +4,9 @@ import classNames from 'classnames';
44import PropTypes from 'prop-types' ;
55import PerfectScrollbar from 'react-perfect-scrollbar' ;
66import 'react-perfect-scrollbar/dist/css/styles.css' ;
7+ import '../css/scrollbar.css' ;
8+
9+ import LayoutHelper from './Shared/layout/layout'
710
811const propTypes = {
912 children : PropTypes . node ,
@@ -39,17 +42,26 @@ class AppSidebarNav2 extends Component {
3942 this . handleClick = this . handleClick . bind ( this ) ;
4043 this . activeRoute = this . activeRoute . bind ( this ) ;
4144 this . hideMobile = this . hideMobile . bind ( this ) ;
45+
46+ this . changes = null ;
47+ this . state = { sidebarMinimized : false }
4248 }
4349
50+ _scrollBarRef = null ;
51+
4452 handleClick ( e ) {
4553 e . preventDefault ( ) ;
4654 e . currentTarget . parentElement . classList . toggle ( 'open' ) ;
4755 }
4856
49- activeRoute ( routeName , props ) {
57+ isActiveRoute ( routeName , props ) {
5058 return props . location . pathname . indexOf ( routeName ) > - 1
51- ? 'nav-item nav-dropdown open'
52- : 'nav-item nav-dropdown' ;
59+ }
60+
61+ activeRoute ( routeName , props ) {
62+ return this . isActiveRoute ( routeName , props ) ?
63+ 'nav-item nav-dropdown open' :
64+ 'nav-item nav-dropdown' ;
5365 }
5466
5567 hideMobile ( ) {
@@ -148,6 +160,7 @@ class AppSidebarNav2 extends Component {
148160
149161 // nav link
150162 navLink ( item , key , classes ) {
163+ const ref = React . createRef ( ) ;
151164 const url = item . url || '' ;
152165 const itemIcon = < i className = { classes . icon } />
153166 const itemBadge = this . navBadge ( item . badge )
@@ -171,7 +184,7 @@ class AppSidebarNav2 extends Component {
171184 < RsNavLink href = { url } className = { classes . link } active { ...attributes } >
172185 { itemIcon } { item . name } { itemBadge }
173186 </ RsNavLink > :
174- < NavLink to = { url } className = { classes . link } activeClassName = "active" onClick = { this . hideMobile } { ...attributes } >
187+ < NavLink to = { url } className = { classes . link } activeClassName = "active" onClick = { ( ) => this . hideMobile ( ref ) } ref = { ref } { ...attributes } >
175188 { itemIcon } { item . name } { itemBadge }
176189 </ NavLink >
177190 }
@@ -200,6 +213,45 @@ class AppSidebarNav2 extends Component {
200213 return link . substring ( 0 , 4 ) === 'http' ;
201214 }
202215
216+ observeDomMutations ( ) {
217+ if ( window . MutationObserver ) {
218+
219+ // eslint-disable-next-line
220+ this . changes = new MutationObserver ( ( mutations ) => {
221+
222+ const isSidebarMinimized = document . body . classList . contains ( 'sidebar-minimized' ) || false
223+ this . setState ( { sidebarMinimized : isSidebarMinimized } )
224+
225+ LayoutHelper . sidebarPSToggle ( ! isSidebarMinimized )
226+
227+ } ) ;
228+ const element = document . body ;
229+ this . changes . observe ( element , {
230+ attributes : true ,
231+ attributeFilter : [ 'class' ]
232+ } ) ;
233+ }
234+ window . addEventListener ( 'resize' , this . onResize ) ;
235+ }
236+
237+ onResize ( ) {
238+ LayoutHelper . sidebarPSToggle ( true )
239+ }
240+
241+ componentDidMount ( ) {
242+ this . observeDomMutations ( )
243+ }
244+
245+ componentWillUnmount ( ) {
246+ try {
247+ this . changes . disconnect ( )
248+ window . removeEventListener ( 'resize' , this . onResize ) ;
249+ } catch ( ignore ) {
250+ // eslint-disable-next-line
251+ console . warn ( 'CoreUI SidebarNav failed to disconnect from MutationObserver' , ignore )
252+ }
253+ }
254+
203255 render ( ) {
204256 const { className, children, navConfig, ...attributes } = this . props ;
205257
@@ -208,18 +260,17 @@ class AppSidebarNav2 extends Component {
208260 delete attributes . Tag
209261 delete attributes . router
210262
211- const navClasses = classNames ( className , 'sidebar-nav' ) ;
263+ const navClasses = classNames ( className , 'sidebar-nav' )
212264
213- // ToDo: find better rtl fix
214- const isRtl = getComputedStyle ( document . documentElement ) . direction === 'rtl'
265+ const options = Object . assign ( { } , { suppressScrollX : true , suppressScrollY : this . state . sidebarMinimized } )
215266
216267 // sidebar-nav root
217268 return (
218- < PerfectScrollbar className = { navClasses } { ...attributes } options = { { suppressScrollX : ! isRtl } } >
219- < Nav >
220- { children || this . navList ( navConfig . items ) }
221- </ Nav >
222- </ PerfectScrollbar >
269+ < PerfectScrollbar className = { navClasses } { ...attributes } options = { options } ref = { ( ref ) => { this . _scrollBarRef = ref ; } } >
270+ < Nav >
271+ { children || this . navList ( navConfig . items ) }
272+ </ Nav >
273+ </ PerfectScrollbar >
223274 ) ;
224275 }
225276}
0 commit comments