Skip to content
Snippets Groups Projects
Commit 7a59f989 authored by André Anjos's avatar André Anjos :speech_balloon:
Browse files

[search] Allow user to hit ENTER for updating the search; Be more flexible...

[search] Allow user to hit ENTER for updating the search; Be more flexible with search terms (closes #424)
parent 22f8fe94
No related branches found
No related tags found
1 merge request!208[search] Allow user to hit ENTER for updating the search; Be more flexible with …
Pipeline #
/*
* Copyright (c) 2016 Idiap Research Institute, http://www.idiap.ch/
* Contact: beat.support@idiap.ch
*
*
* This file is part of the beat.web module of the BEAT platform.
*
*
* Commercial License Usage
* Licensees holding valid commercial BEAT licenses may use this file in
* accordance with the terms contained in a written agreement between you
* and Idiap. For further information contact tto@idiap.ch
*
*
* Alternatively, this file may be used under the terms of the GNU Affero
* Public License version 3 as published by the Free Software and appearing
* in the file LICENSE.AGPL included in the packaging of this file.
* The BEAT platform is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE.
*
*
* You should have received a copy of the GNU Affero Public License along
* with the BEAT platform. If not, see http://www.gnu.org/licenses/.
*/
......@@ -223,8 +223,10 @@ beat.search.controls.DisplaySettings.prototype.scrape = function() {
*
* container (Object): A jQuery object at which we'll attach ourselves
* options (Array): A preset array of options from the user (maybe empty)
* fun (Function): A function to hook the ENTER button press on added text
* inputs (normally meaning "submit" the form)
*/
beat.search.controls.SimpleFilter = function(container, options) {
beat.search.controls.SimpleFilter = function(container, options, fun) {
this.container = container;
......@@ -250,6 +252,10 @@ beat.search.controls.SimpleFilter = function(container, options) {
this.text_input = $(document.createElement('input'));
this.text_input.attr('type', 'text');
this.text_input.addClass('form-control');
this.text_input.keydown(function (event) {
var keypressed = event.keyCode || event.which;
if (keypressed == 13) fun();
});
this.dom_element.append($(document.createElement('label')).addClass('sr-only').text('Value'));
this.dom_element.append(this.text_input);
......@@ -345,8 +351,10 @@ beat.search.controls.SimpleFilter.prototype.scrape = function() {
*
* container (Object): A jQuery object at which we'll attach ourselves
* options (Array): A preset array of options from the user (maybe empty)
* fun (Function): A function to hook the ENTER button press on added text
* inputs (normally meaning "submit" the form)
*/
beat.search.controls.ExperimentFilter = function(container, options) {
beat.search.controls.ExperimentFilter = function(container, options, fun) {
this.container = container;
......@@ -374,6 +382,10 @@ beat.search.controls.ExperimentFilter = function(container, options) {
this.text_input = $(document.createElement('input'));
this.text_input.attr('type', 'text');
this.text_input.addClass('form-control');
this.text_input.keydown(function (event) {
var keypressed = event.keyCode || event.which;
if (keypressed == 13) fun();
});
this.dom_element.append($(document.createElement('label')).addClass('sr-only').text('Value'));
this.dom_element.append(this.text_input);
......@@ -500,8 +512,10 @@ beat.search.controls.ExperimentFilter.prototype.scrape = function() {
*
* container (Object): A jQuery object at which we'll attach ourselves
* options (Array): A preset array of options from the user (maybe empty)
* fun (Function): A function to hook the ENTER button press on added text
* inputs (normally meaning "submit" the form)
*/
beat.search.controls.ExperimentDateFilter = function(container, options) {
beat.search.controls.ExperimentDateFilter = function(container, options, fun) {
this.container = container;
......@@ -526,6 +540,10 @@ beat.search.controls.ExperimentDateFilter = function(container, options) {
this.text_input = $(document.createElement('input'));
this.text_input.attr('type', 'text');
this.text_input.addClass('form-control');
this.text_input.keydown(function (event) {
var keypressed = event.keyCode || event.which;
if (keypressed == 13) fun();
});
input_group.append($(document.createElement('label')).addClass('sr-only').text('Date'));
input_group.append(this.text_input);
var icon = $(document.createElement('div')).addClass('input-group-addon');
......@@ -636,8 +654,10 @@ beat.search.controls.ExperimentDateFilter.prototype.scrape = function() {
*
* container (Object): A jQuery object at which we'll attach ourselves
* options (Array): A preset array of options from the user (maybe empty)
* fun (Function): A function to hook the ENTER button press on added text
* inputs (normally meaning "submit" the form)
*/
beat.search.controls.ResultFilter = function(container, options) {
beat.search.controls.ResultFilter = function(container, options, fun) {
this.container = container;
......@@ -668,6 +688,10 @@ beat.search.controls.ResultFilter = function(container, options) {
this.text_input.addClass('form-control result-filter');
this.text_input.attr('placeholder', 'Choose a value...');
this.dom_element.append(this.text_input);
this.text_input.keydown(function (event) {
var keypressed = event.keyCode || event.which;
if (keypressed == 13) fun();
});
if (options === undefined) return;
......@@ -746,8 +770,10 @@ beat.search.controls.ResultFilter.prototype.scrape = function() {
*
* container (Object): A jQuery object at which we'll attach ourselves
* options (Array): A preset array of options from the user (maybe empty)
* fun (Function): A function to hook the ENTER button press on added text
* inputs (normally meaning "submit" the form)
*/
beat.search.controls.Filters = function(container, options) {
beat.search.controls.Filters = function(container, options, fun) {
var forms = []; //all form rows
var master_selectors = []; //controls for the type of filter
......@@ -824,25 +850,25 @@ beat.search.controls.Filters = function(container, options) {
if (opt !== undefined) {
if (simple_types.indexOf(opt.context) >= 0) {
master_select.val(opt.context);
controller = new beat.search.controls.SimpleFilter(form, opt);
controller = new beat.search.controls.SimpleFilter(form, opt, fun);
}
else if (opt.context == 'experiment') {
master_select.val(opt.context);
controller = new beat.search.controls.ExperimentFilter(form, opt);
controller = new beat.search.controls.ExperimentFilter(form, opt, fun);
}
else if (opt.context == 'experiment-date') {
master_select.val(opt.context);
controller = new beat.search.controls.ExperimentDateFilter(form, opt);
controller = new beat.search.controls.ExperimentDateFilter(form, opt, fun);
}
else if (opt.context == 'experiment-result') {
master_select.val(opt.context);
controller = new beat.search.controls.ResultFilter(form, opt);
controller = new beat.search.controls.ResultFilter(form, opt, fun);
}
}
else {
//the default
master_select.val('any-field');
controller = new beat.search.controls.SimpleFilter(form);
controller = new beat.search.controls.SimpleFilter(form, [], fun);
}
//rig master select boxes - on change, fix controller
......@@ -851,16 +877,16 @@ beat.search.controls.Filters = function(container, options) {
var ind = $(this).parent().parent().index(); //form-inline index
controllers[ind].remove(); //remove DOM elements
if (simple_types.indexOf(val) >= 0) {
controllers[ind] = new beat.search.controls.SimpleFilter(form, opt);
controllers[ind] = new beat.search.controls.SimpleFilter(form, opt, fun);
}
else if (val == 'experiment') {
controllers[ind] = new beat.search.controls.ExperimentFilter(form, opt);
controllers[ind] = new beat.search.controls.ExperimentFilter(form, opt, fun);
}
else if (val == 'experiment-date') {
controllers[ind] = new beat.search.controls.ExperimentDateFilter(form, opt);
controllers[ind] = new beat.search.controls.ExperimentDateFilter(form, opt, fun);
}
else if (val == 'experiment-result') {
controllers[ind] = new beat.search.controls.ResultFilter(form, opt);
controllers[ind] = new beat.search.controls.ResultFilter(form, opt, fun);
}
});
......
{% comment %}
* Copyright (c) 2016 Idiap Research Institute, http://www.idiap.ch/
* Contact: beat.support@idiap.ch
*
*
* This file is part of the beat.web module of the BEAT platform.
*
*
* Commercial License Usage
* Licensees holding valid commercial BEAT licenses may use this file in
* accordance with the terms contained in a written agreement between you
* and Idiap. For further information contact tto@idiap.ch
*
*
* Alternatively, this file may be used under the terms of the GNU Affero
* Public License version 3 as published by the Free Software and appearing
* in the file LICENSE.AGPL included in the packaging of this file.
* The BEAT platform is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE.
*
*
* You should have received a copy of the GNU Affero Public License along
* with the BEAT platform. If not, see http://www.gnu.org/licenses/.
{% endcomment %}
......@@ -43,10 +43,10 @@
to the text boxes separated by a single comma. E.g.:
"eigenface,fisherface" (meaning search for eigenface OR
fisherface). Click on the <i class="fa fa-times"></i> buttons to
remove a given search criteria. Click on the "Update" button to
update the result display. If you're logged in, you may also hit on
"Save" to save your search filters and re-run this search again on
the future.
remove a given search criteria. Click on the "Update" button (or
hit Enter on your keyboard) to update the result display. If you're
logged in, you may also hit on "Save" to save your search filters
and re-run this search again on the future.
</p>
<div id="filters">
{# Filters (controller) will load contents #}
......@@ -126,16 +126,8 @@ $(document).ready(function(){
}
});
var filters_controller = new beat.search.controls.Filters($('#filters'),
{% if filters %}{{ filters|safe }}{% else %}[]{% endif %});
var settings_controller = new beat.search.controls.DisplaySettings(
'select#display-selector', '#results-table table',
{% if settings %}{{ settings|safe }}{% else %}[]{% endif %});
//rigs the "Update" button
$('#update').on('click', function() {
$(this).children('i').addClass('fa-spin');
function update_search() {
$('#update').children('i').addClass('fa-spin');
$('#update').addClass('disabled');
//collects the settings and makes a new POST request to the same URL, but
//overriding filters and display settings
......@@ -151,7 +143,17 @@ $(document).ready(function(){
document.close();
});
d.fail(process_error);
});
}
var filters_controller = new beat.search.controls.Filters($('#filters'),
{% if filters %}{{ filters|safe }}{% else %}[]{% endif %}, update_search);
var settings_controller = new beat.search.controls.DisplaySettings(
'select#display-selector', '#results-table table',
{% if settings %}{{ settings|safe }}{% else %}[]{% endif %});
//rigs the "Update" button
$('#update').on('click', update_search);
$('#update').removeClass('disabled');
{% if not request.user.is_anonymous %}
......
......@@ -226,12 +226,15 @@ def filters_from_query(query):
'name': None,
}
for keyword in map(lambda x: x.strip(), query.split(' ')):
keywords = [x.strip() for x in query.split() if x.strip()]
for keyword in keywords:
offset = keyword.find(':')
if offset != -1:
command = keyword[:offset]
entries = keyword[offset+1:].split(',')
entries = [x.strip() for x in keyword[offset+1:].split(',')]
entries = [x for x in entries if x]
if command in ['db', 'database']:
filters.append(_make_context('database-name', entries))
elif command in ['tc', 'toolchain']:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment