frontend/app/metadata/MetadataTabView.jsx (81 lines of code) (raw):

import React from "react"; import PropTypes from "prop-types"; class MetadataTabView extends React.Component { static propTypes = { metaDataString: PropTypes.string, tabNames: PropTypes.array.isRequired, tabPrefixes: PropTypes.array.isRequired, }; constructor(props) { super(props); this.state = { selectedTabIndex: 0, }; } breakdownMetadataString() { return this.props.metaDataString .split(/\s*,\s*/) .map((elmt) => elmt.split("=")) .reduce((acc, elem) => Object.assign(acc, { [elem[0]]: elem[1] }), {}); } tableContent() { if (this.state.selectedTabIndex >= this.props.tabPrefixes.length) { console.error( "Requested tab " + this.state.selectedTabIndex + " but there are only " + this.props.tabPrefixes.length + " categories" ); return ( <table> <tbody> <tr> <td> <i>Not properly configured</i> </td> </tr> </tbody> </table> ); } const metadata = this.breakdownMetadataString(); return ( <table className="metadata-view-table"> {Object.keys(metadata) .sort() .filter((key) => key.startsWith(this.props.tabPrefixes[this.state.selectedTabIndex]) ) .map((key, idx) => ( <tr key={idx}> <td className="metadata-view-key">{key}</td> <td className="metadata-view-key">{metadata[key]}</td> </tr> ))} </table> ); } render() { return ( <div className="metadata-view-container"> <span className="tab-header-row"> {this.props.tabNames.map((name, idx) => ( <span className={ "tab-header" + (idx === this.props.selectedTabIndex ? " selected" : "") } onClick={() => this.setState({ selectedTabIndex: idx })} key={idx} > {name} </span> ))} </span> {this.tableContent()} </div> ); } } export default MetadataTabView;