labo-components
Version:
160 lines (147 loc) • 5.64 kB
JSX
fimport React from 'react';
import PropTypes from 'prop-types';
import IDUtil from '../../util/IDUtil';
import ReactTooltip from 'react-tooltip';
import FlexRouter from '../../util/FlexRouter';
import LocalStorageHandler from '../../util/LocalStorageHandler';
import Query from '../../model/Query';
//NOTE: this component does not (yet) display named entities (like the MetadataColumn does)
export default class MetadataTable extends React.Component {
constructor(props) {
super(props);
this.CLASS_PREFIX = 'mdt';
}
performSearchReference(searchRef) {
let query = Query.construct({
term: searchRef.searchTerm,
collectionId: searchRef.collectionId,
searchLayers: {[this.props.data.index]:true},
includeMediaObjects : true //CHECK why is this always true?
}, null, false); //never store a prio query after execution
LocalStorageHandler.storeJSONInLocalStorage('stored-priority-query', query);
FlexRouter.gotoSingleSearch('prio')
}
render() {
let poster = null;
let source = null;
let specialProperties = null;
//get the special properties that are important to show for this collection
//TODO implement links within the special properties without using dangerouslysetinnerhtml
if(this.props.data.specialProperties) {
specialProperties = Object.keys(this.props.data.specialProperties).map((key, index)=> {
return (
<tr className={IDUtil.cssClassName('special-props', this.CLASS_PREFIX)} key={'props__' + index}>
<td><label>{key}:</label></td>
<td>{this.props.data.specialProperties[key]}</td>
</tr>
);
});
}
let searchReferences = null;
if(this.props.data.searchReferences) {
searchReferences = Object.keys(this.props.data.searchReferences).map((key, index) => {
return (
<tr className={IDUtil.cssClassName('search-refs', this.CLASS_PREFIX)} key={'search-refs__' + index}>
<td><label>{"Search related"}</label></td>
<td>{
Object.keys(this.props.data.searchReferences[key]).map((searchRefIndex, index) => {
const searchRef = this.props.data.searchReferences[key][searchRefIndex];
return (
<div key={'__sr__' + index}>
<a href="#!" onClick={this.performSearchReference.bind(this, searchRef)}>
{searchRef.linkText}
</a><br></br>
</div>
);
})
}</td>
</tr>
);
});
}
//get the poster if any
if(this.props.data.posterURL) {
poster = (<tr className={IDUtil.cssClassName('poster', this.CLASS_PREFIX)}>
<td><label>Keyframe</label></td>
<td>
<div style={{width: '200px'}}>
<img src={this.props.data.posterURL} alt="poster" style={{width:'100%'}}/>
</div>
</td>
</tr>);
}
//get the external source information if any
if(this.props.data.externalSourceInfo) {
let externalSourceInfo = null;
if(this.props.data.externalSourceInfo.url) {
let message = this.props.data.externalSourceInfo.message;
if (message == null) {
message = "View in catalogue";
}
externalSourceInfo = (<a href={this.props.data.externalSourceInfo.url} target="_source">{message}</a>)
} else if(this.props.data.externalSourceInfo.message) {
externalSourceInfo = (<span>{this.props.data.externalSourceInfo.message}</span>)
}
if(externalSourceInfo) {
source = (<tr className={IDUtil.cssClassName('source', this.CLASS_PREFIX)}>
<td><label>Source</label></td>
<td>{externalSourceInfo}</td>
</tr>)
}
}
return (
<div className={IDUtil.cssClassName('metadata-table')}>
<table className="table">
<tbody>
{poster}
<tr className={IDUtil.cssClassName('id', this.CLASS_PREFIX)}>
<td><label>ID</label></td>
<td>{this.props.data.resourceId}</td>
</tr>
<tr className={IDUtil.cssClassName('index', this.CLASS_PREFIX)}>
<td><label>Index</label></td>
<td>{this.props.data.index} (type: {this.props.data.docType})</td>
</tr>
<tr className={IDUtil.cssClassName('title', this.CLASS_PREFIX)}>
<td><label>Title</label></td>
<td>{this.props.data.title ? this.props.data.title : 'No title available'}</td>
</tr>
<tr className={IDUtil.cssClassName('date', this.CLASS_PREFIX)}>
<td><label>Date <span data-for={'__ci_tooltip'}
data-tip={this.props.data.dateField}
data-html={false}>
<i className="fas fa-info-circle" />
</span>
</label></td>
<td>{this.props.data.date}</td>
</tr>
<tr className={IDUtil.cssClassName('description', this.CLASS_PREFIX)}>
<td><label>Description</label></td>
<td>{this.props.data.description ? this.props.data.description : 'No description available'}</td>
</tr>
{source}
{specialProperties}
{searchReferences}
</tbody>
</table>
<ReactTooltip id={'__ci_tooltip'}/>
</div>
);
}
}
MetadataTable.propTypes = {
data: PropTypes.shape({
date: PropTypes.string,
dateField: PropTypes.string,
description: PropTypes.string,
docType: PropTypes.string,
externalSourceInfo: PropTypes.object,
mediaTypes: PropTypes.array,
playableContent: PropTypes.array,
rawData: PropTypes.object,
resourceId: PropTypes.string,
specialProperties: PropTypes.object,
searchReferences: PropTypes.object,
title: PropTypes.string
}).isRequired,
};