| /*! |
| * Copyright © 2016-2018 European Support Limited |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express |
| * or implied. See the License for the specific language governing |
| * permissions and limitations under the License. |
| */ |
| import React from 'react'; |
| import PropTypes from 'prop-types'; |
| import classnames from 'classnames'; |
| import Collapse from 'react-bootstrap/lib/Collapse.js'; |
| |
| class NavigationSideBar extends React.Component { |
| static PropTypes = { |
| activeItemId: PropTypes.string.isRequired, |
| onSelect: PropTypes.func, |
| onToggle: PropTypes.func, |
| groups: PropTypes.array, |
| disabled: PropTypes.bool |
| }; |
| |
| constructor(props) { |
| super(props); |
| this.state = { |
| activeItemId: null |
| }; |
| this.handleItemClicked = this.handleItemClicked.bind(this); |
| } |
| |
| render() { |
| let { groups, activeItemId, disabled = false } = this.props; |
| |
| return ( |
| <div |
| className={`navigation-side-content ${ |
| disabled ? 'disabled' : '' |
| }`}> |
| {groups.map(group => ( |
| <NavigationMenu |
| menu={group} |
| activeItemId={activeItemId} |
| onNavigationItemClick={this.handleItemClicked} |
| key={'menu_' + group.id} |
| /> |
| ))} |
| </div> |
| ); |
| } |
| |
| handleItemClicked(event, item) { |
| event.stopPropagation(); |
| if (this.props.onToggle) { |
| this.props.onToggle(this.props.groups, item.id); |
| } |
| if (item.onSelect) { |
| item.onSelect(); |
| } |
| if (this.props.onSelect) { |
| this.props.onSelect(item); |
| } |
| } |
| } |
| |
| class NavigationMenu extends React.Component { |
| static PropTypes = { |
| activeItemId: PropTypes.string.isRequired, |
| onNavigationItemClick: PropTypes.func, |
| menu: PropTypes.array |
| }; |
| |
| render() { |
| const { menu, activeItemId, onNavigationItemClick } = this.props; |
| return ( |
| <div className="navigation-group" key={menu.id}> |
| <NavigationMenuHeader title={menu.name} /> |
| <NavigationMenuItems |
| items={menu.items} |
| activeItemId={activeItemId} |
| onNavigationItemClick={onNavigationItemClick} |
| /> |
| </div> |
| ); |
| } |
| } |
| |
| function NavigationMenuHeader(props) { |
| return ( |
| <div className="group-name" data-test-id="navbar-group-name"> |
| {props.title} |
| </div> |
| ); |
| } |
| |
| function getItemDataTestId(itemId) { |
| return itemId.split('|')[0]; |
| } |
| function NavigationMenuItems(props) { |
| const { items, activeItemId, onNavigationItemClick } = props; |
| return ( |
| <div className="navigation-group-items"> |
| {items && |
| items.map(item => ( |
| <NavigationMenuItem |
| key={'menuItem_' + item.id} |
| item={item} |
| activeItemId={activeItemId} |
| onNavigationItemClick={onNavigationItemClick} |
| /> |
| ))} |
| </div> |
| ); |
| } |
| |
| function NavigationMenuItem(props) { |
| const { onNavigationItemClick, item, activeItemId } = props; |
| const isGroup = item.items && item.items.length > 0; |
| return ( |
| <div |
| className={classnames('navigation-group-item', { |
| 'selected-item': item.id === activeItemId |
| })} |
| key={'item_' + item.id}> |
| <NavigationLink |
| item={item} |
| activeItemId={activeItemId} |
| onClick={onNavigationItemClick} |
| /> |
| {isGroup && ( |
| <Collapse |
| in={item.expanded} |
| data-test-id={ |
| 'navigation-group-' + getItemDataTestId(item.id) |
| }> |
| <div> |
| {item.items.map(subItem => ( |
| <NavigationMenuItem |
| key={'menuItem_' + subItem.id} |
| item={subItem} |
| onNavigationItemClick={onNavigationItemClick} |
| activeItemId={activeItemId} |
| /> |
| ))} |
| </div> |
| </Collapse> |
| )} |
| </div> |
| ); |
| } |
| |
| function NavigationLink(props) { |
| const { item, activeItemId, onClick } = props; |
| // todo should this be button |
| return ( |
| <div |
| key={'navAction_' + item.id} |
| className={classnames('navigation-group-item-name', { |
| selected: item.id === activeItemId, |
| disabled: item.disabled, |
| 'bold-name': item.expanded, |
| hidden: item.hidden |
| })} |
| onClick={event => onClick(event, item)} |
| data-test-id={'navbar-group-item-' + getItemDataTestId(item.id)}> |
| {item.name} |
| </div> |
| ); |
| } |
| |
| export default NavigationSideBar; |