From d57f5169b09f10ace7c244f8c46ac351ddbd084a Mon Sep 17 00:00:00 2001 From: Lance Edgar Date: Fri, 14 Aug 2015 18:53:39 -0500 Subject: [PATCH] Add 'Default Filters' and 'Clear Filters' buttons to new grid filters form. --- tailbone/newgrids/core.py | 7 ++++++- tailbone/static/js/jquery.ui.tailbone.js | 25 ++++++++++++++++++++++++ tailbone/templates/newgrids/filters.mako | 2 ++ tailbone/views/master.py | 6 ++++++ 4 files changed, 39 insertions(+), 1 deletion(-) diff --git a/tailbone/newgrids/core.py b/tailbone/newgrids/core.py index d4b2658c..597b1ff6 100644 --- a/tailbone/newgrids/core.py +++ b/tailbone/newgrids/core.py @@ -155,9 +155,14 @@ class Grid(object): settings['filter.{0}.verb'.format(filtr.key)] = filtr.default_verb settings['filter.{0}.value'.format(filtr.key)] = filtr.default_value + # If request contains instruction to reset to default filters, then we + # can skip the rest of the request/session checks. + if self.request.GET.get('reset-to-default-filters') == 'true': + pass + # If request has filter settings, grab those, then grab sort/pager # settings from request or session. - if self.request_has_settings('filter'): + elif self.request_has_settings('filter'): self.update_filter_settings(settings, 'request') if self.request_has_settings('sort'): self.update_sort_settings(settings, 'request') diff --git a/tailbone/static/js/jquery.ui.tailbone.js b/tailbone/static/js/jquery.ui.tailbone.js index c23618f6..fe2fe6ce 100644 --- a/tailbone/static/js/jquery.ui.tailbone.js +++ b/tailbone/static/js/jquery.ui.tailbone.js @@ -19,11 +19,15 @@ this.filters = this.element.find('.newfilters'); this.add_filter = this.filters.find('#add-filter'); this.apply_filters = this.filters.find('#apply-filters'); + this.default_filters = this.filters.find('#default-filters'); + this.clear_filters = this.filters.find('#clear-filters'); this.grid = this.element.find('.newgrid'); // Enhance filters etc. this.filters.find('.filter').gridfilter(); this.apply_filters.button('option', 'icons', {primary: 'ui-icon-search'}); + this.default_filters.button('option', 'icons', {primary: 'ui-icon-home'}); + this.clear_filters.button('option', 'icons', {primary: 'ui-icon-trash'}); if (! this.filters.find('.active:checked').length) { this.apply_filters.button('disable'); } @@ -79,6 +83,27 @@ return false; }); + // When user clicks Default Filters button, refresh page with + // instructions for the server to reset filters to default settings. + this.default_filters.click(function() { + var form = that.filters.find('form'); + form.off('submit'); + form.append(''); + that.element.mask("Refreshing data..."); + form.submit(); + }); + + // When user clicks Clear Filters button, deactivate all filters + // and refresh the grid. + this.clear_filters.click(function() { + that.filters.find('.filter').each(function() { + if ($(this).gridfilter('active')) { + $(this).gridfilter('active', false); + } + }); + that.filters.find('form').submit(); + }); + // Refresh data when user clicks a sortable column header. this.element.on('click', 'thead th.sortable a', function() { var th = $(this).parent(); diff --git a/tailbone/templates/newgrids/filters.mako b/tailbone/templates/newgrids/filters.mako index 4b7f1fb6..e85d6484 100644 --- a/tailbone/templates/newgrids/filters.mako +++ b/tailbone/templates/newgrids/filters.mako @@ -25,6 +25,8 @@ % endfor + ${form.tag('button', type='button', id='default-filters', c="Default Filters")} + ${form.tag('button', type='button', id='clear-filters', c="Clear Filters")} ${form.end()} diff --git a/tailbone/views/master.py b/tailbone/views/master.py index c4fcf918..e851be13 100644 --- a/tailbone/views/master.py +++ b/tailbone/views/master.py @@ -71,6 +71,12 @@ class MasterView(View): returns the full page. """ grid = self.make_grid() + + # If user just refreshed the page with a reset instruction, issue a + # redirect in order to clear out the query string. + if self.request.GET.get('reset-to-default-filters') == 'true': + return self.redirect(self.request.current_route_url(_query=None)) + if self.request.params.get('partial'): self.request.response.content_type = b'text/html' self.request.response.text = grid.render_grid()