UNPKG

labo-components

Version:
200 lines (171 loc) 7.36 kB
import React from 'react'; import PropTypes from "prop-types"; import CollectionAnalysisAPI from '../../api/CollectionAnalysisAPI'; import IDUtil from '../../util/IDUtil'; import SessionStorageHandler from '../../util/SessionStorageHandler'; import FieldSelector from './FieldSelector'; import ComponentUtil from '../../util/ComponentUtil'; //this component relies on the collection statistics as input class CollectionAnalyser extends React.Component { constructor(props) { super(props); this.STORAGE_PREFIX = 'ms__ca_'; // throttle preview requests // needed because to prevent a large amount of pending requests // this keeps the UI / timeline respond fast to changes this.calls = []; // default values const defaultField = SessionStorageHandler.get( this.STORAGE_PREFIX + 'defaultField' + this.props.collectionConfig.collectionId ); this.state = { field : null, fields: this.props.collectionConfig.getAllFields(), completeness: {}, //store completeness of the fields showFieldSelector: false, descriptions: null, // field descriptions }; } componentDidMount() { // auto load the analyse if there are default values if (this.state.field){ this.props.onChange(this.state.field); } if(this.state.fields) { this.loadCompletenessData(); } } loadCompletenessData = () => { CollectionAnalysisAPI.collectionFieldCompleteness(this.props.collectionConfig.collectionId, this.props.collectionConfig.getDocumentType(), (data) => { this.setState({fieldCompleteness: data}); this.props.onCompletenessLoaded(data); }) } onShowFieldSelector(){ this.setState({ showFieldSelector: !this.state.showFieldSelector }); } onFieldSelected(field) { // store value to session storage SessionStorageHandler.set( this.STORAGE_PREFIX + 'defaultField' + this.props.collectionConfig.collectionId, field.id ); this.setState({ field: field.id, showFieldSelector: false, // hide fieldselector }); this.props.onChange(field.id); } onCloseFieldSelector() { this.setState({ showFieldSelector: false }) } getCurrentField(){ if (!this.state.field) { return null; } let field = null; this.state.fields.some((f)=>{ if (f.id === this.state.field){ field = f; return true; } return false; }); return field; } getFieldDescription(field, collectionMetadata) { if(!field || !collectionMetadata || !collectionMetadata.field_descriptions || !collectionMetadata.field_descriptions[field.id]) { return null; } return collectionMetadata.field_descriptions[field.id]['description']; } render() { const collectionMetadata = this.props.collectionConfig.getCollectionMetadata(); let analysisBlock = null; let fieldSelector = null; //only draw the rest when a collection is selected (either using the selector or via the props) if(this.props.collectionConfig && this.state.fields) { // get current field data and completeness const field = this.getCurrentField(); const completeness = field && this.state.fieldCompleteness && field.id in this.state.fieldCompleteness['existCounts'] ? this.state.fieldCompleteness['existCounts'][field.id] : null; const description = this.getFieldDescription(field, collectionMetadata); // render current field information table const currentField = field != null ? ( <div className="current_field"> <table> <tbody> <tr> <th>Field</th><td className="title">{field.title}</td> </tr> <tr> <th>Description</th><td>{description !== null ? description : <i className="fas fa-circle-notch fa-spin" />}</td> </tr> <tr> <th>Type</th><td>{field.type}</td> </tr> <tr> <th>Completeness</th> <td className="completeness"> {completeness ? <div> <span>{ComponentUtil.calcCompleteness(completeness, this.state.fieldCompleteness['total'])}%</span> <span className="total"> {completeness} / {this.state.fieldCompleteness['total']} </span> </div> : <i className="fas fa-circle-notch fa-spin "/> } </td> </tr> </tbody> </table> </div> ) : null; // create final analysis block analysisBlock = ( <div className="analysis_field"> <button className="btn btn-primary" onClick={this.onShowFieldSelector.bind(this)}>Select field to analyse</button> {currentField} </div> ); if (this.state.showFieldSelector) { fieldSelector = ( <FieldSelector onSelect={this.onFieldSelected.bind(this)} onClose={this.onCloseFieldSelector.bind(this)} selectedField={this.state.field} fields={this.state.fields} completeness={this.state.fieldCompleteness} descriptions={collectionMetadata ? collectionMetadata.field_descriptions : null} //FIXME unsafe showLevelColumn={this.props.collectionConfig.usesLayeredModel()} /> ) } } else { //if there are no stats available analysisBlock = (<h5>This collection is available in the registry, but is absent in the media suite index</h5>) } return ( <div className={IDUtil.cssClassName('collection-analyser')}> <div className="row"> <div className="col-md-12"> {analysisBlock} </div> </div> {/* only toggle visibility to keep the component state */} <div style={{display: this.state.showFieldSelector ? 'block' : 'none'}}> {fieldSelector} </div> </div> ) } } CollectionAnalyser.propTypes = { collectionConfig: PropTypes.object.isRequired, onChange: PropTypes.func.isRequired, onCompletenessLoaded: PropTypes.func.isRequired }; export default CollectionAnalyser;