zotero-web-library
Version:
Web library from zotero.org
106 lines (94 loc) • 2.84 kB
JavaScript
;
var log = require('libzotero/lib/Log').Logger('zotero-web-library:GlobalSearch');
var Net = require('libzotero/lib/Net');
var React = require('react');
var CanonicalItem = require('./CanonicalSearchResult.js');
//const baseSearchUrl = 'https://52.91.6.162';
var baseSearchUrl = 'https://localhost:8080';
var globalSearchUrl = function globalSearchUrl(query) {
return baseSearchUrl + '/global/items?q=' + query;
};
var globalDOIUrl = function globalDOIUrl(query) {
return baseSearchUrl + '/global/items?DOI=' + query;
};
var GlobalSearch = React.createClass({
displayName: 'GlobalSearch',
componentDidMount: function componentDidMount() {
if (this.state.search != '') {
this.search();
}
},
getDefaultProps: function getDefaultProps() {
return {
item: null
};
},
getInitialState: function getInitialState() {
var query = Zotero.state.getUrlVar('q');
return {
search: query,
results: []
};
},
handleSearchChange: function handleSearchChange(evt) {
this.setState({ search: evt.target.value });
},
search: function search() {
var _this = this;
var evt = arguments.length <= 0 || arguments[0] === undefined ? false : arguments[0];
if (evt) {
evt.preventDefault();
}
var searchTerm = this.state.search;
//update querystring
Zotero.state.setQueryVar('q', this.state.search);
Zotero.state.pushState();
var searchUrl = '';
if (searchTerm.startsWith('doi:')) {
searchUrl = globalDOIUrl(searchTerm.slice(4));
} else {
searchUrl = globalSearchUrl(searchTerm);
}
Net.ajax({ url: searchUrl }).then(function (resp) {
var resultsObj = JSON.parse(resp.responseText);
var globalItems = resultsObj.map(function (g) {
return g;
});
_this.setState({ results: globalItems });
});
},
render: function render() {
var reactInstance = this;
var resultNodes = reactInstance.state.results.map(function (globalItem) {
return React.createElement(CanonicalItem, { key: globalItem.ID, item: globalItem });
});
return React.createElement(
'div',
{ className: 'global-search' },
React.createElement(
'form',
{ id: 'global-search-form', onSubmit: this.search },
React.createElement(
'div',
{ className: 'input-group' },
React.createElement('input', { type: 'text', className: 'form-control', value: this.state.search, onChange: this.handleSearchChange }),
React.createElement(
'span',
{ className: 'input-group-btn' },
React.createElement(
'button',
{ type: 'button', className: 'btn btn-default', onClick: this.search },
React.createElement('span', { className: 'glyphicons fonticon glyphicons-search' })
)
)
)
),
React.createElement(
'div',
{ className: 'results' },
resultNodes
)
);
}
});
module.exports = GlobalSearch;