UNPKG

labo-components

Version:
157 lines (139 loc) 5.81 kB
import React from 'react'; import PropTypes from "prop-types"; import Project from './model/Project'; import ProjectAPI from './api/ProjectAPI'; import ToolHeader from './components/shared/ToolHeader'; import ProjectQueriesTable from './components/workspace/projects/query/ProjectQueriesTable'; import QueryTimelinePlotter from "./components/stats/QueryTimelinePlotter"; import IDUtil from './util/IDUtil'; import FlexRouter from './util/FlexRouter'; import LocalStorageHandler from './util/LocalStorageHandler'; export default class QueryComparisonRecipe extends React.Component { constructor(props) { super(props); const activeProject = Project.construct( LocalStorageHandler.getJSONFromLocalStorage('stored-active-project') ) const selectedQueries = this.initSelectedQueries(activeProject); this.state = { activeProject : activeProject, selectedQueries : selectedQueries, userProjects : [] }; PropTypes.checkPropTypes(QueryComparisonRecipe.propTypes, this.props, 'prop', this.constructor.name); } initSelectedQueries = activeProject => { //check if there are queries selected const storedQueryData = LocalStorageHandler.getStoredQueries(); if(!activeProject || !storedQueryData || activeProject.id !== storedQueryData.projectId) return []; const namedQueries = activeProject.queries.filter(nq => { const ok = storedQueryData.queryIds.includes(nq.id) return ok } ).map(nq => { //Note: this is needed for the queryInfoBlocks to be rendered properly Object.assign(nq.query, {searchId: IDUtil.guid()}); return nq; }); return namedQueries }; componentDidMount = () => { // Get projects list for current user ProjectAPI.list(this.props.user.id, null, projects => this.setState({ userProjects: projects }) ); }; onComponentOutput = (componentClass, data) => { if(componentClass === 'ToolHeader') { this.setState( { activeProject: data, selectedQueries : this.initSelectedQueries(data) }, () => LocalStorageHandler.storeJSONInLocalStorage('stored-active-project', data) ); } }; compareQueries = tableSelection => { const namedQueries = tableSelection.map(nq => { Object.assign(nq.query, {searchId: IDUtil.guid()}); return nq; }); LocalStorageHandler.storeQueries( this.state.activeProject, tableSelection.map(nq => nq.id) ); this.setState({selectedQueries : namedQueries}); }; clearQueriesInfoBlocks = () => this.setState({ selectedQueries: [] }); /* --------------------------- RENDER HEADER --------------------- */ render() { const projectQueriesTable = this.state.activeProject ? ( <ProjectQueriesTable key={this.state.activeProject.id} handleCompareLink={this.compareQueries} handleDeleteQueries={this.clearQueriesInfoBlocks} project={this.state.activeProject} user={this.props.user} selection={this.state.selectedQueries} keepSelectionWhenDone={true} /> ) : null; return ( <div className={IDUtil.cssClassName('comparative-search-recipe')}> <ToolHeader name="Compare" projects={this.state.userProjects} activeProject={this.state.activeProject} onOutput={this.onComponentOutput} user={this.props.user} key={'header-tools__' + ( this.state.userProjects ? this.state.userProjects.length : 0 )} /> <div className="workspace-components"> <button className="btn btn-primary" onClick={() => FlexRouter.gotoSingleSearch()}>Add query</button> {projectQueriesTable} </div> <QueryTimelinePlotter //for now always rerender the whole thing, since only componentDidMount is used to load data key={IDUtil.guid()} clientId={this.props.clientId} user={this.props.user} namedQueries={this.state.selectedQueries} /> </div> ); } } QueryComparisonRecipe.propTypes = { clientId : PropTypes.string.isRequired, // Required by __loadCollectionMetadata() in CollectionUtil params: PropTypes.object, recipe: PropTypes.shape({ description: PropTypes.string, id: PropTypes.string, inRecipeList: PropTypes.bool, name: PropTypes.string.isRequired, // Use for when rendering header (isRequired by <ToolHeader/>) phase: PropTypes.string, recipeDescription: PropTypes.string, type: PropTypes.string, url: PropTypes.string, ingredients: PropTypes.shape({ resourceViewerPath: PropTypes.string, collection: PropTypes.string, collectionSelector: PropTypes.bool, dateRangeSelector: PropTypes.string, aggregationView: PropTypes.string, useProjects: PropTypes.bool }).isRequired }).isRequired, user: PropTypes.shape({ id: PropTypes.string.isRequired, name: PropTypes.string, attributes: PropTypes.shape({ allowPersonalCollections: PropTypes.bool }) }).isRequired };