UNPKG

labo-components

Version:
213 lines (185 loc) 7.12 kB
import React from 'react'; import PropTypes from 'prop-types'; import Resource from '../../model/Resource'; import PaginationUtil from '../../util/PaginationUtil'; import IDUtil from '../../util/IDUtil'; import ComponentUtil from '../../util/ComponentUtil'; import FlexRouter from '../../util/FlexRouter'; import LocalStorageHandler from '../../util/LocalStorageHandler'; import { SINGLE_SEARCH_RESOURCE_VIEWER_POPUP } from '../../SingleSearchRecipe'; export default class SimplePaging extends React.Component { constructor(props) { super(props); } componentDidMount() { document.addEventListener('keydown', this.onKeyPressed); } componentWillUnmount() { document.removeEventListener('keydown', this.onKeyPressed); } onKeyPressed = e => { //use arrows in quickviewer, but not in resource viewer const renderInfo = PaginationUtil.getSearchResultRenderInfo( this.props.searchResult ); const goNext = this.props.enableResourceViewerButton ? e.keyCode === 39 : //arrow right e.shiftKey && e.keyCode === 221 //shift+] ; const goPrev = this.props.enableResourceViewerButton ? e.keyCode === 37 : //arrow left e.shiftKey && e.keyCode === 219 //shift+[ ; if (goNext && !renderInfo.isLastHit) { ComponentUtil.checkFocusAndExec.call(this, this.next); } if (goPrev && !renderInfo.isFirstHit) { ComponentUtil.checkFocusAndExec.call(this, this.previous); } //go back to results (resource viewer only) if (this.props.enableBackButton && e.keyCode === 8) { //backspace ComponentUtil.checkFocusAndExec.call(this, this.backToSearch); } //select current hit (quick viewer only) if (this.props.onSelect && e.keyCode === 83) { //s ComponentUtil.checkFocusAndExec.call(this, this.select); } //goto resource viewer (quick viewer only) if (this.props.enableResourceViewerButton && e.keyCode === 71) { //g ComponentUtil.checkFocusAndExec.call(this, this.gotoResourceViewer); } }; /* ---------------------------------------- BUTTON HANDLING FUNCTIONS --------------------------------- */ previous = () => { if (this.props.browseSelection) { PaginationUtil.pageSelections( this.props.searchResult, false, this.props.onPaged ); } else { PaginationUtil.pageSearchResults( this.props.searchResult, this.props.collectionConfig, false, this.props.onPaged, this.props.onLoading ); } }; next = () => { if (this.props.browseSelection) { PaginationUtil.pageSelections( this.props.searchResult, true, this.props.onPaged ); } else { PaginationUtil.pageSearchResults( this.props.searchResult, this.props.collectionConfig, true, this.props.onPaged, this.props.onLoading ); } }; select = () => { if (this.props.onSelect && typeof this.props.onSelect === 'function') { this.props.onSelect(this.props.searchResult, !this.props.selected); } }; gotoResourceViewer = () => { const storedResults = LocalStorageHandler.getJSONFromLocalStorage( 'stored-search-results' ); FlexRouter.popupResourceViewer( '/tool/resource-viewer', //TODO get this path from the recipe params this.props.searchResult, storedResults ? storedResults.query.term : null, SINGLE_SEARCH_RESOURCE_VIEWER_POPUP ); }; backToSearch = () => FlexRouter.gotoSingleSearch('cache'); //render based on render() { const renderInfo = this.props.browseSelection ? PaginationUtil.getSelectionsRenderInfo(this.props.searchResult) : PaginationUtil.getSearchResultRenderInfo(this.props.searchResult); const previousResourceBtn = ( <button className="btn btn-primary" disabled={renderInfo.isFirstHit} onClick={this.previous} > <i className="fas fa-step-backward" aria-hidden="true" />{' '} Previous resource </button> ); const nextResourceBtn = ( <button className="btn btn-primary" disabled={renderInfo.isLastHit} onClick={this.next} > Next resource{' '} <i className="fas fa-step-forward" aria-hidden="true" /> </button> ); const selectBtn = this.props.onSelect ? ( <div className="checkbox"> <label> <input type="checkbox" checked={this.props.selected} onChange={this.select} /> &nbsp;Select item </label> </div> ) : null; const backToSearchBtn = this.props.enableBackButton ? ( <button className="btn btn-primary" onClick={this.backToSearch}> Back to results </button> ) : null; const gotoResourceViewerBtn = this.props.enableResourceViewerButton ? ( <button className="btn btn-primary" onClick={this.gotoResourceViewer} > Open resource{' '} <i className="fas fa-external-link-alt" aria-hidden="true" /> </button> ) : null; return ( <div className={IDUtil.cssClassName('simple-paging')}> {selectBtn} {previousResourceBtn} {nextResourceBtn} {backToSearchBtn} {gotoResourceViewerBtn} </div> ); } } SimplePaging.propTypes = { browseSelection: PropTypes.bool.isRequired, //whether to quick view the selection or result list searchResult: Resource.getPropTypes(true), //active resource from either the selection or result list collectionConfig: PropTypes.object.isRequired, onPaged: PropTypes.func.isRequired, // called after each time paging is called onLoading: PropTypes.func.isRequired, //callback to notify the owner new search results are being fetched selected: PropTypes.bool, //whether the current resource is selected or not onSelect: PropTypes.func, //callback when selecting this resource enableBackButton: PropTypes.bool, enableResourceViewerButton: PropTypes.bool };