import React, {Component, PropTypes} from 'react' import ReactDOM from 'react-dom' import WorkspaceDropdown from './../containers/WorkspaceDropdown' import Input from './base/Input' import SidebarRequestGroupRow from './SidebarRequestGroupRow' import SidebarRequestRow from './SidebarRequestRow' class Sidebar extends Component { constructor (props) { super(props); this.state = { width: 19 } } _onFilterChange (value) { this.props.changeFilter(value); } _filterChildren (filter, children, extra = null) { return children.filter(child => { if (child.doc.type !== 'Request') { return true; } const request = child.doc; const otherMatches = extra || ''; const toMatch = `${request.method}❅${request.name}❅${otherMatches}`.toLowerCase(); const matchTokens = filter.toLowerCase().split(' '); for (let i = 0; i < matchTokens.length; i++) { let token = `${matchTokens[i]}`; if (toMatch.indexOf(token) === -1) { // Filter failed. Don't render children return false; } } return true; }) } _renderChildren (children, requestGroup) { const { filter, toggleRequestGroup, addRequestToRequestGroup } = this.props; const filteredChildren = this._filterChildren( filter, children, requestGroup && requestGroup.name ).sort((a, b) => a.doc._id > b.doc._id ? -1 : 1); return filteredChildren.map(child => { if (child.doc.type === 'Request') { return ( ) } // We have a RequestGroup! const requestGroup = child.doc; const isActive = !!child.children.find(c => c.doc._id === this.props.activeRequestId); const children = this._renderChildren(child.children, requestGroup); // Don't render the row if there are no children while filtering if (filter && !children.length) { return null; } return ( {children} ) }) } /** * Resize the sidebar * * @param pixelWidth how wide to make the sidebar */ resize (pixelWidth) { const currentPixelWidth = ReactDOM.findDOMNode(this).offsetWidth; const ratio = pixelWidth / currentPixelWidth; const width = Math.max(Math.min(this.state.width * ratio, 25), 13); this.setState({width}); } render () { const {filter, children} = this.props; return ( ) } } Sidebar.propTypes = { // Functions activateRequest: PropTypes.func.isRequired, toggleRequestGroup: PropTypes.func.isRequired, addRequestToRequestGroup: PropTypes.func.isRequired, changeFilter: PropTypes.func.isRequired, // Other children: PropTypes.array.isRequired, workspaceId: PropTypes.string.isRequired, // Optional filter: PropTypes.string, activeRequestId: PropTypes.string }; export default Sidebar;