frontend/src/js/components/viewer/DocumentMetadata.js (125 lines of code) (raw):
import React from 'react';
import PropTypes from 'prop-types';
import {resourcePropType} from '../../types/Resource';
import {ResourceBreadcrumbs} from '../ResourceBreadcrumbs';
import HoverSearchLink from '../UtilComponents/HoverSearchLink';
import ViewerActions from './ViewerActions';
import _ from 'lodash';
import hdate from 'human-date';
import { permissionsPropType } from '../../types/User';
export class DocumentMetadata extends React.Component {
static propTypes = {
resource: resourcePropType,
preferences: PropTypes.object,
myPermissions: permissionsPropType,
};
state = {
raw: false
};
renderMetadata = (key, values) => {
return(
<li key={key} className='sidebar__list-item'>
<div className='sidebar__list-title'>{key}</div>
{
values.map(value =>
<div key={value} className='sidebar__list-value'>
<HoverSearchLink highlight q={value}/>
</div>
)
}
</li>
);
};
renderEnrichedMetadata = (key, value) => {
const prettyValue = (key === 'createdAt' || key === 'lastModified') ? hdate.prettyPrint(new Date(value), {showTime: true}) : value;
return(
<li className="sidebar__list-item" key={key}>
<div className='sidebar__list-title'>{_.startCase(key)}</div>
<div className='sidebar__list-value'>
<HoverSearchLink highlight q={prettyValue.toString()}/>
</div>
</li>
);
}
toggleRaw = () => {
this.setState({raw: !this.state.raw});
};
renderChildren = () => {
if (this.props.resource.children.length === 0) {
return false;
}
return (
<div className='sidebar__group'>
<div className='sidebar__title'>
<span>Subdocuments</span>
</div>
<ResourceBreadcrumbs resource={this.props.resource} showChildren={true} lastSegmentOnly={true} />
</div>
);
}
renderDevTools = () => {
if (!this.props.myPermissions || !this.props.myPermissions.includes('CanPerformAdminOperations')) {
return false;
}
return <React.Fragment>
<div className='sidebar__title'>Dev Tools</div>
<ul className='sidebar__list'>
<li className='sidebar__list-item'>
<div className='sidebar__list-title'>elasticsearch</div>
<div className='sidebar__list-value'>
<a target='_blank' rel='noopener noreferrer' href={`http://localhost:9200/pfi/_doc/${this.props.resource.uri}`}>dev</a>
</div>
<div className='sidebar__list-value'>
<a target='_blank' rel='noopener noreferrer' href={`http://localhost:19200/pfi/_doc/${this.props.resource.uri}`}>prod</a>
</div>
</li>
<li className='sidebar__list-item'>
</li>
</ul>
</React.Fragment>;
}
renderTextViewLink() {
if (!window.location.href.includes('viewer/')) {
return null;
}
const url = new URL(window.location);
url.href = url.href.replace('viewer', 'viewer-old');
url.searchParams.set('view', 'text');
return <a className="btn" target="_blank" rel="noopener noreferrer" href={url.toString()}>
View as text
</a>
}
render () {
const metadata = Object.keys(this.props.resource.metadata || {})
.map(k => ({key: k, value: this.props.resource.metadata[k]}));
// Little dance required because empty object doesn't have nice falsey/truthy properties.
const emdKeys = this.props.resource.enrichedMetadata ? Object.keys(this.props.resource.enrichedMetadata) : undefined;
const hasEnrichedMetadata = emdKeys && !!emdKeys.length;
const enrichedMetadata = hasEnrichedMetadata ? emdKeys.map(k => ({key: k, value: this.props.resource.enrichedMetadata[k]})) : [];
return (
<div className='sidebar__group'>
<div className='sidebar__title'>
Actions
</div>
<ViewerActions resource={this.props.resource} config={this.props.config} isAdmin={this.props.myPermissions.includes('CanPerformAdminOperations')} />
<div className='sidebar__title'>
Locations
{this.renderTextViewLink()}
</div>
<ResourceBreadcrumbs childClass='sidebar__list-item' resource={this.props.resource} showParents={true} />
{this.renderDevTools()}
<div className='sidebar__title'>
<span>File Metadata</span>
{hasEnrichedMetadata ?
<button className='btn' onClick={this.toggleRaw}>{this.state.raw ? 'View Metadata' : 'View Raw Metadata'}</button>
: false
}
</div>
<ul className='sidebar__list'>
{!this.state.raw && hasEnrichedMetadata ?
enrichedMetadata.map(metadata => this.renderEnrichedMetadata(metadata.key, metadata.value))
: metadata.map(metadata => this.renderMetadata(metadata.key, metadata.value))
}
</ul>
{this.renderChildren()}
</div>
);
}
}