zotero-web-library
Version:
Web library from zotero.org
260 lines (250 loc) • 5.19 kB
JavaScript
'use strict';
var log = require('libzotero/lib/Log').Logger('zotero-web-library:CanonicalSearchResult');
var React = require('react');
var ItemMaps = require('libzotero/lib/ItemMaps');
var CanonicalItem = React.createClass({
displayName: 'CanonicalItem',
getDefaultProps: function getDefaultProps() {
return {
item: null
};
},
getInitialState: function getInitialState() {
return {
showDetails: false
};
},
toggleDetails: function toggleDetails() {
this.setState({ showDetails: !this.state.showDetails });
},
render: function render() {
if (this.props.item == null) {
return null;
}
var item = this.props.item;
var title = item.data.title;
if (title == '') {
title = '<untitled>';
}
var keys = Object.keys(item.data);
var canonicalDataFields = [];
canonicalDataFields = keys.map(function (key) {
var val = item.data[key];
if (val === '') {
return null;
}
if (key == 'creators') {
if (!val) {
return null;
}
var creatorRows = val.map(function (k, i) {
if (k.name) {
return React.createElement(
'tr',
{ key: 'creator_' + i },
React.createElement(
'th',
null,
ItemMaps.creatorMap[k.creatorType]
),
React.createElement(
'td',
null,
k.name
)
);
} else {
return React.createElement(
'tr',
{ key: 'creator_' + i },
React.createElement(
'th',
null,
ItemMaps.creatorMap[k.creatorType]
),
React.createElement(
'td',
null,
k.lastName,
', ',
k.firstName
)
);
}
});
return creatorRows;
} else if (typeof val == 'string') {
return React.createElement(
'tr',
{ key: key },
React.createElement(
'th',
null,
ItemMaps.fieldMap[key]
),
React.createElement(
'td',
null,
val
)
);
}
return null;
});
var datesAdded = item.meta.datesAdded.map(function (da) {
return React.createElement(
'li',
{ key: da.month },
da.month,
' : ',
da.numAdded
);
});
var instances = null;
if (item.libraryItems) {
//log.debug(`${item.libraryItems.length} public library item instances`);
instances = item.libraryItems.map(function (instance) {
instance = instance.replace('api.zotero.org', 'apidev.zotero.org');
return React.createElement(
'div',
{ key: instance },
React.createElement(
'a',
{ href: instance },
instance
)
);
});
}
var detailsClass = 'search-result-body panel-body hidden';
if (this.state.showDetails) {
detailsClass = 'search-result-body panel-body';
}
return React.createElement(
'div',
{ className: 'canonicalItem' },
React.createElement(
'div',
{ className: 'panel panel-default' },
React.createElement(
'div',
{ className: 'panel-heading', onClick: this.toggleDetails },
React.createElement(
'h4',
{ className: 'panel-title' },
React.createElement(
'a',
{ role: 'button' },
title
)
)
),
React.createElement(
'div',
{ className: detailsClass },
React.createElement(
'div',
{ className: 'canonicalMeta' },
React.createElement(
'h3',
null,
'Canonical Meta'
),
React.createElement(
'table',
null,
React.createElement(
'tbody',
null,
React.createElement(
'tr',
null,
React.createElement(
'th',
null,
'Canonical ID'
),
React.createElement(
'td',
null,
item.ID
)
),
React.createElement(
'tr',
null,
React.createElement(
'th',
null,
'Instances'
),
React.createElement(
'td',
null,
item.meta.instanceCount
)
),
React.createElement(
'tr',
null,
React.createElement(
'th',
null,
'Libraries Count'
),
React.createElement(
'td',
null,
item.meta.librariesCount
)
),
React.createElement(
'tr',
null,
React.createElement(
'th',
null,
'Dates Added'
),
React.createElement(
'td',
null,
React.createElement(
'ul',
null,
datesAdded
)
)
)
)
)
),
React.createElement(
'div',
{ className: 'instances' },
instances
),
React.createElement(
'div',
{ className: 'canonicalData' },
React.createElement(
'h3',
null,
'Canonical Data'
),
React.createElement(
'table',
null,
React.createElement(
'tbody',
null,
canonicalDataFields
)
)
)
)
)
);
}
});
module.exports = CanonicalItem;