Skip to content

Commit

Permalink
Add suggested lowercase query
Browse files Browse the repository at this point in the history
Resolves: adsabs#1975
  • Loading branch information
thostetler committed Dec 11, 2019
1 parent 5793620 commit d916413
Show file tree
Hide file tree
Showing 3 changed files with 154 additions and 83 deletions.
170 changes: 108 additions & 62 deletions src/js/widgets/list_of_things/paginated_view.js
Expand Up @@ -20,10 +20,8 @@ define([
'./item_view',
'analytics',
'mathjax',
'hbs!js/wraps/widget/loading/template'
],

function (
'hbs!js/wraps/widget/loading/template',
], function(
_,
Marionette,
Backbone,
Expand All @@ -43,12 +41,12 @@ function (
loadingTemplate
) {
/**
* A simple model that holds attributes of the
* paginated view. Changes in this model are
* propagated to the view
*/
* A simple model that holds attributes of the
* paginated view. Changes in this model are
* propagated to the view
*/
var MainViewModel = Backbone.Model.extend({
defaults: function () {
defaults: function() {
return {
mainResults: false,
title: undefined,
Expand All @@ -59,52 +57,71 @@ function (
showSidebars: true,
pagination: true,
start: 0,
highlightsLoaded: false
highlightsLoaded: false,
};
}
},
});

const getSuggestedQuery = (_query) => {
const query = _query.clone();
const q = query.get('q');

// if the whole query is uppercase, lower it
if (q[0] === q[0].toUpperCase()) {
query.set('q', q[0].toLowerCase());
query.unset('fl');
return {
url: '#search/' + query.url(),
query: query.get('q'),
};
}
};

var EmptyView = Marionette.ItemView.extend({
template: function (data) {
template: function(data) {
if (data.query) {
return EmptyViewTemplate(data);
} if (data.error) {
}
if (data.error) {
return ErrorViewTemplate(data);
}
return loadingTemplate(_.extend(data, {
widgetLoadingSize: 'big',
hideCloseButton: true
}));
}
return loadingTemplate(
_.extend(data, {
widgetLoadingSize: 'big',
hideCloseButton: true,
})
);
},
});

/**
* This is the main view of the list of things. A composite
* view that holds collection of items.
*/
/**
* This is the main view of the list of things. A composite
* view that holds collection of items.
*/
var ListOfThingsView = Marionette.CompositeView.extend({

childView: ItemView,
emptyView: EmptyView,

initialize: function (options) {
initialize: function(options) {
this.model = new MainViewModel();
},

serializeData: function () {
serializeData: function() {
var data = this.model.toJSON();
// if it's an abstract page list with an 'export to results page'
// option, provide the properly escaped url
if (data.queryOperator) {
data.queryURL = '#search/q=' + data.queryOperator + '(';
data.queryURL += encodeURIComponent('bibcode:' + data.bibcode) + ')';
if (data.removeSelf) data.queryURL += encodeURIComponent(' -bibcode:' + data.bibcode);
if (data.sortOrder) data.queryURL += '&sort=' + encodeURIComponent(data.sortOrder);
if (data.removeSelf)
data.queryURL += encodeURIComponent(' -bibcode:' + data.bibcode);
if (data.sortOrder)
data.queryURL += '&sort=' + encodeURIComponent(data.sortOrder);
}
return data;
},

onRender: function () {
onRender: function() {
if (MathJax) {
MathJax.Hub.Queue(['Typeset', MathJax.Hub, this.el]);
}
Expand All @@ -114,7 +131,7 @@ function (

alreadyRendered: false,

emptyViewOptions: function (model) {
emptyViewOptions: function(model) {
var query = this.model.get('query');
var isTugboat = this.model.get('isTugboat');
var error = this.model.get('error');
Expand All @@ -123,19 +140,21 @@ function (
if (_.isArray(query)) {
model.set({
query: query[0],
showTugboatMessage: isTugboat
showTugboatMessage: isTugboat,
suggestedQuery: getSuggestedQuery(this.model.get('currentQuery')),
});
} else if (_.has('query', query)) {
model.set({
query: query.query[0],
showTugboatMessage: isTugboat
showTugboatMessage: isTugboat,
suggestedQuery: getSuggestedQuery(this.model.get('currentQuery')),
});
} else if (error) {
model.set('error', error);
}

return {
model: model
model: model,
};
},

Expand All @@ -149,13 +168,17 @@ function (
'click #backToTopBtn': 'goToTop',
'click a.page-control': 'changePageWithButton',
'keyup input.page-control': 'tabOrEnterChangePageWithInput',
'change #per-page-select': 'changePerPage'
'change #per-page-select': 'changePerPage',
},

toggleHighlights: function (e) {
toggleHighlights: function(e) {
var state = this.model.get('showHighlights');
state = _.isBoolean(state) && state
? 'closed' : (state === 'open') ? 'closed' : 'open';
state =
_.isBoolean(state) && state
? 'closed'
: state === 'open'
? 'closed'
: 'open';

this.model.set('showHighlights', state);
if (!this.model.get('highlightsLoaded')) {
Expand All @@ -164,7 +187,7 @@ function (
}
},

toggleAbstract: function () {
toggleAbstract: function() {
if (this.model.get('showAbstract') == 'open') {
this.model.set('showAbstract', 'closed');
} else if (this.model.get('showAbstract') == 'closed') {
Expand All @@ -173,80 +196,103 @@ function (
}
},

toggleShowSidebars: function () {
toggleShowSidebars: function() {
var val = !this.model.get('showSidebars');
this.model.set('showSidebars', val);
analytics('send', 'event', 'interaction', 'sidebars-toggled-' + val ? 'on' : 'off');
analytics(
'send',
'event',
'interaction',
'sidebars-toggled-' + val ? 'on' : 'off'
);
},

goToBottom: function () {
$('#app-container')
.animate({ scrollTop: this.$el.outerHeight() }, 'fast');
goToBottom: function() {
$('#app-container').animate(
{ scrollTop: this.$el.outerHeight() },
'fast'
);
},

goToTop: function () {
$('#app-container')
.animate({ scrollTop: 0 }, 'fast');
goToTop: function() {
$('#app-container').animate({ scrollTop: 0 }, 'fast');
},

modelEvents: {
'change': 'render',
change: 'render',
'change:showHighlights': 'toggleChildrenHighlights',
'change:showAbstract': 'toggleChildrenAbstracts'
'change:showAbstract': 'toggleChildrenAbstracts',
},

collectionEvents: {
'reset': 'onResetCollection'
reset: 'onResetCollection',
},

template: ResultsContainerTemplate,

onResetCollection: function () {
onResetCollection: function() {
this.model.set('highlightsLoaded', false);
},

/**
* Displays the are inside of every item-view
* with details (this place is normally hidden
* by default)
*/
toggleChildrenHighlights: function () {
* Displays the are inside of every item-view
* with details (this place is normally hidden
* by default)
*/
toggleChildrenHighlights: function() {
var show = this.model.get('showHighlights');
this.collection.invoke('set', 'showHighlights', show === 'open');
},

toggleChildrenAbstracts: function () {
toggleChildrenAbstracts: function() {
var show = this.model.get('showAbstract');
this.collection.invoke('set', 'showAbstract', show === 'open');
},

changePageWithButton: function (e) {
changePageWithButton: function(e) {
var $target = $(e.currentTarget);
if ($target.parent().hasClass('disabled')) return;
var transform = $target.hasClass('next-page') ? 1 : -1;
var pageVal = this.model.get('page') + transform;
this.trigger('pagination:select', pageVal);

if (this.resultsWidget) { analytics('send', 'event', 'interaction', 'results-list-pagination', pageVal); }
if (this.resultsWidget) {
analytics(
'send',
'event',
'interaction',
'results-list-pagination',
pageVal
);
}
return false;
},

tabOrEnterChangePageWithInput: function (e) {
tabOrEnterChangePageWithInput: function(e) {
// subtract one since pages are 0 indexed
var pageVal = parseInt($(e.target).val() - 1);
// enter or tab
if (e.keyCode == 13 || e.keyCode == 9) {
this.trigger('pagination:select', pageVal);
}

if (this.resultsWidget) { analytics('send', 'event', 'interaction', 'results-list-pagination', pageVal); }
if (this.resultsWidget) {
analytics(
'send',
'event',
'interaction',
'results-list-pagination',
pageVal
);
}
},

changePerPage: function (e) {
changePerPage: function(e) {
var val = parseInt(e.currentTarget ? e.currentTarget.value : 25);
val !== this.model.get('perPage') && this.trigger('pagination:changePerPage', val);
val !== this.model.get('perPage') &&
this.trigger('pagination:changePerPage', val);
return false;
}
},
});

return ListOfThingsView;
Expand Down
60 changes: 41 additions & 19 deletions src/js/widgets/list_of_things/templates/empty-view-template.html
@@ -1,24 +1,46 @@
<div class="s-empty-view-msg">
<div class="h4">
Sorry no results were found for <code>{{query}}</code>
</div>
<div class="h4">Sorry no results were found for <code>{{query}}</code></div>
{{#if showTugboatMessage}}
<div>
Using the ADS classic query translator? view the <a href="//adsabs.github.io/help/faq/#classic-search-translator" rel="noopener" target="_blank">docs</a>.
</div>
<div>
Using the ADS classic query translator? view the
<a
href="//adsabs.github.io/help/faq/#classic-search-translator"
rel="noopener"
target="_blank"
>docs</a
>.
</div>
{{else}}
<ul>
<li>Try broadening your search</li>
<li>Disable any filters that may be applied</li>
<li><a href="#">Check out some examples</a></li>
<li><a href="https://adsabs.github.io/help/search/search-syntax" target="_blank" rel="noopener">Read our help pages</a></li>
</ul>
<span>
Not seeing something that should be here? Let us know!
<button class="btn btn-primary-faded results-feedback-button" data-toggle="modal" data-target="#feedback-modal" data-feedback-view="general">
<i class="fa fa-comment"></i>
Leave Feedback
</button>
</span>
<ul>
{{#if suggestedQuery}}
<li>
Try an alternate query:
<a href="{{suggestedQuery.url}}">{{suggestedQuery.query}}</a>
</li>
{{/if}}
<li>Try broadening your search</li>
<li>Disable any filters that may be applied</li>
<li><a href="#">Check out some examples</a></li>
<li>
<a
href="https://adsabs.github.io/help/search/search-syntax"
target="_blank"
rel="noopener"
>Read our help pages</a
>
</li>
</ul>
<span>
Not seeing something that should be here? Let us know!
<button
class="btn btn-primary-faded results-feedback-button"
data-toggle="modal"
data-target="#feedback-modal"
data-feedback-view="general"
>
<i class="fa fa-comment"></i>
Leave Feedback
</button>
</span>
{{/if}}
</div>
7 changes: 5 additions & 2 deletions src/js/widgets/list_of_things/widget.js
Expand Up @@ -202,8 +202,11 @@ define([
this.view.model.set('query', false);
} else {
var params = apiResponse.get('responseHeader.params');
this.view.model.set('isTugboat', !!params['__tb']);
this.view.model.set('query', this._getCurrentQueryString(apiResponse));
this.view.model.set({
isTugboat: !!params['__tb'],
query: this._getCurrentQueryString(apiResponse),
currentQuery: apiResponse.getApiQuery()
});
}

// XXX:rca - hack, to be solved later
Expand Down

0 comments on commit d916413

Please sign in to comment.