import React, { Component } from 'react'; import { Link } from 'react-router-dom'; import Interactive from 'react-interactive'; import sidebarCSS from '../styles/adminSidebar.jsx' class SidebarComponent extends Component { constructor(props){ super(props) // Constructor with states holding the search query and the element of reponse. this.state = { filterValue: '', filterQuery: '', requestItemsToBeDisplayed: [], listItemSelected: '', height: '0', } this.updateWindowDimensions = this.updateWindowDimensions.bind(this); } // Where we wait for api response to be delivered from parent through props componentWillReceiveProps(props) { this.state.listItemSelected = props.listItemSelected; this.displayRequestedElementsInfo(props.requested_objects); } componentDidMount() { this.updateWindowDimensions(); window.addEventListener('resize', this.updateWindowDimensions); } componentWillUnmount() { window.removeEventListener('resize', this.updateWindowDimensions); } updateWindowDimensions() { this.setState({ height: window.innerHeight }); } // Inputs a date and returns a text string that matches how long it was since convertDateToDaysSince(date) { var oneDay = 24*60*60*1000; var firstDate = new Date(date); var secondDate = new Date(); var diffDays = Math.round(Math.abs((firstDate.getTime() - secondDate.getTime()) / oneDay)); switch (diffDays) { case 0: return 'Today'; case 1: return '1 day ago' default: return diffDays + ' days ago' } } // Called from our dropdown, receives a filter string and checks it with status field // of our request objects. filterItems(filterValue) { let filteredRequestElements = this.props.requested_objects.map((item, index) => { if (item.status === filterValue || filterValue === 'all') return this.generateListElements(index, item); }) this.setState({ requestItemsToBeDisplayed: filteredRequestElements, filterValue: filterValue, }) } // Updates the internal state of the query filter and updates the list to only // display names matching the query. This is real-time filtering. updateFilterQuery(event) { const query = event.target.value; let filteredByQuery = this.props.requested_objects.map((item, index) => { if (item.title.toLowerCase().indexOf(query.toLowerCase()) != -1) return this.generateListElements(index, item); }) this.setState({ requestItemsToBeDisplayed: filteredByQuery, filterQuery: query, }); } generateFilterSearch() { return (
this.updateFilterQuery(event)} value={this.state.filterQuery}/>
) } generateNav() { let filterValue = this.state.filterValue; return ( ) } generateBody(cards) { let style = sidebarCSS.ulCard; style.maxHeight = this.state.height - 160; return ( ) } generateListElements(index, item) { let statusBar; switch (item.status) { case 'requested': // Yellow statusBar = { background: 'linear-gradient(to right, rgb(63, 195, 243) 0, rgb(63, 195, 243) 4px, #fff 4px, #fff 100%) no-repeat' } break; case 'downloading': // Blue statusBar = { background: 'linear-gradient(to right, rgb(255, 225, 77) 0, rgb(255, 225, 77) 4px, #fff 4px, #fff 100%) no-repeat' } break; case 'downloaded': // Green statusBar = { background: 'linear-gradient(to right, #39aa56 0, #39aa56 4px, #fff 4px, #fff 100%) no-repeat' } break; default: statusBar = { background: 'linear-gradient(to right, grey 0, grey 4px, #fff 4px, #fff 100%) no-repeat' } } statusBar.listStyleType = 'none'; return (
  • { item.title }

    Requested:

  • ) } // This is our main loader that gets called when we receive api response through props from parent displayRequestedElementsInfo(requested_objects) { let requestedElement = requested_objects.map((item, index) => { if (['requested', 'downloading', 'downloaded'].indexOf(this.state.filterValue) != -1) { if (item.status === this.state.filterValue){ return this.generateListElements(index, item); } } else if (this.state.filterQuery !== '') { if (item.name.toLowerCase().indexOf(this.state.filterQuery.toLowerCase()) != -1) return this.generateListElements(index, item); } else return this.generateListElements(index, item); }) this.setState({ requestItemsToBeDisplayed: this.generateBody(requestedElement) }) } render() { // if (typeof InstallTrigger !== 'undefined') // bodyCSS.width = '-moz-min-content'; return (

    Requested items

    { this.generateFilterSearch() } { this.generateNav() }
    { this.state.requestItemsToBeDisplayed }
    ); } } export default SidebarComponent;