backoffice: add filter sidebar to stats page (#6863)

This commit is contained in:
Frédéric Péters 2015-04-02 15:21:22 +02:00
parent 368ed699b0
commit 8db0534f6f
3 changed files with 60 additions and 37 deletions

View File

@ -235,7 +235,7 @@ def test_backoffice_statistics(pub):
assert 'To Status "New"' in resp.body
assert 'To Status "Finished"' in resp.body
resp.forms[0]['end'] = '2013-01-01'
resp.forms[0]['filter-end-value'] = '2013-01-01'
resp = resp.forms[0].submit()
assert 'Total number of records: 0' in resp.body

View File

@ -124,6 +124,18 @@ def do_graphs_section(period_start=None, period_end=None, criterias=None):
hour_totals = sql.get_hour_totals(period_start, period_end, criterias)
r += htmltext('''<script>
var weekday_line = %(weekday_line)s;
var hour_line = %(hour_line)s;
var month_line = %(month_line)s;
var year_line = %(year_line)s;
</script>''' % {
'weekday_line': json.dumps(weekday_line),
'hour_line': json.dumps(hour_totals),
'month_line': json.dumps(monthly_totals),
'year_line': json.dumps(yearly_totals),
})
if len(yearly_totals) > 1:
r += htmltext('<h3>%s</h3>') % _('Submissions by year')
r += htmltext('<div id="chart_years" style="height:160px; width:100%;"></div>')
@ -135,6 +147,7 @@ def do_graphs_section(period_start=None, period_end=None, criterias=None):
r += htmltext('<h3>%s</h3>') % _('Submissions by hour')
r += htmltext('<div id="chart_hours" style="height:160px; width:100%;"></div>')
get_response().add_javascript(['jquery.js', 'jqplot/jquery.jqplot.min.js',
'jqplot/plugins/jqplot.canvasTextRenderer.min.js',
'jqplot/plugins/jqplot.canvasAxisLabelRenderer.min.js',
@ -144,12 +157,7 @@ def do_graphs_section(period_start=None, period_end=None, criterias=None):
])
get_response().add_javascript_code('''
$(document).ready(function(){
var weekday_line = %(weekday_line)s;
var hour_line = %(hour_line)s;
var month_line = %(month_line)s;
var year_line = %(year_line)s;
function wcs_draw_graphs() {
$.jqplot ('chart_weekdays', [weekday_line], {
series:[{renderer:$.jqplot.BarRenderer}],
axesDefaults: {
@ -175,6 +183,7 @@ tickOptions: { angle: -30, }
axes: { xaxis: { renderer: $.jqplot.CategoryAxisRenderer }, yaxis: {min: 0} }
});
if ($('#chart_years').length) {
$.jqplot ('chart_years', [year_line], {
series:[{renderer:$.jqplot.BarRenderer}],
axesDefaults: {
@ -183,14 +192,13 @@ tickOptions: { angle: -30, }
},
axes: { xaxis: { renderer: $.jqplot.CategoryAxisRenderer }, yaxis: {min: 0} }
});
}
}
$(document).ready(function(){
wcs_draw_graphs();
});
''' % {
'weekday_line': json.dumps(weekday_line),
'hour_line': json.dumps(hour_totals),
'month_line': json.dumps(monthly_totals),
'year_line': json.dumps(yearly_totals),
})
''')
return r.getvalue()
@ -535,7 +543,7 @@ class FormPage(Directory):
r += htmltext('</ul>')
return r.getvalue()
def get_filter_sidebar(self, selected_filter=None):
def get_filter_sidebar(self, selected_filter=None, mode='listing'):
r = TemplateIO(html=True)
waitpoint_status = self.formdef.workflow.get_waitpoint_status()
@ -555,8 +563,12 @@ class FormPage(Directory):
if get_request().form:
field.enabled = 'filter-%s' % field.id in get_request().form
else:
# enable status filter by default
field.enabled = (field.id in ('status',))
if mode == 'listing':
# enable status filter by default
field.enabled = (field.id in ('status',))
elif mode == 'stats':
# enable period filters by default
field.enabled = (field.id in ('start', 'end'))
r += htmltext('<h3><span>%s</span> <span class="change">(<a id="filter-settings">%s</a>)</span></h3>' % (
_('Filters'), _('change')))
@ -655,6 +667,7 @@ class FormPage(Directory):
r += self.get_filter_sidebar(selected_filter=selected_filter)
r += htmltext('<button class="refresh">%s</button>') % _('Refresh')
r += htmltext('<button id="columns-settings">%s</button>') % _('Columns Settings')
# column settings dialog content
@ -673,7 +686,6 @@ class FormPage(Directory):
r += htmltext('</li>')
r += htmltext('</ul>')
r += htmltext('</div>')
r += htmltext('</form>')
return r.getvalue()
@ -1078,19 +1090,14 @@ class FormPage(Directory):
cls=misc.JSONEncoder,
encoding=get_publisher().site_charset)
def get_stats_sidebar(self):
get_response().add_javascript(['jquery.js'])
DateWidget.prepare_javascript()
form = Form(use_tokens=False)
form.add(DateWidget, 'start', title=_('Start Date'),
value=get_request().form.get('start'))
form.add(DateWidget, 'end', title=_('End Date'),
value=get_request().form.get('end'))
form.add_submit('submit', _('Submit'))
def get_stats_sidebar(self, selected_filter):
get_response().add_javascript(['jquery.js', 'jquery-ui.js', 'wcs.listing.js'])
get_response().add_css_include('../js/smoothness/jquery-ui-1.10.0.custom.min.css')
r = TemplateIO(html=True)
r += htmltext('<h3>%s</h3>') % _('Period')
r += form.render()
r += htmltext('<form id="listing-settings" action="stats">')
r += self.get_filter_sidebar(selected_filter=selected_filter, mode='stats')
r += htmltext('<button class="refresh">%s</button>') % _('Refresh')
r += htmltext('</form>')
return r.getvalue()
def stats(self):
@ -1098,14 +1105,17 @@ class FormPage(Directory):
html_top('management', '%s - %s' % (_('Form'), self.formdef.name))
r = TemplateIO(html=True)
get_response().breadcrumb.append( ('stats', _('Statistics')) )
get_response().filter['sidebar'] = self.get_stats_sidebar()
r += htmltext('<h2>%s - %s</h2>') % (self.formdef.name, _('Statistics'))
selected_filter = self.get_filter_from_query()
criterias = self.get_criterias_from_query()
get_response().filter['sidebar'] = self.get_formdata_sidebar() + \
self.get_stats_sidebar(selected_filter)
do_graphs = get_publisher().is_using_postgresql()
criterias = get_stats_criteria(get_request())
values = self.formdef.data_class().select(criterias)
r += htmltext('<div id="statistics">')
if do_graphs:
r += htmltext('<div class="splitcontent-left">')
@ -1140,8 +1150,17 @@ class FormPage(Directory):
r += do_graphs_section(criterias=criterias)
r += htmltext('</div>')
r += htmltext('<a href=".">%s</a>') % _('Back')
return r.getvalue()
r += htmltext('</div>') # id="statistics"
if get_request().form.get('ajax') == 'true':
get_response().filter = None
return r.getvalue()
page = TemplateIO(html=True)
page += htmltext('<h2>%s - %s</h2>') % (self.formdef.name, _('Statistics'))
page += htmltext(r)
page += htmltext('<a href=".">%s</a>') % _('Back')
return page.getvalue()
def stats_fields(self, values):
r = TemplateIO(html=True)

View File

@ -64,11 +64,15 @@ function refresh_table() {
$.ajax({
url: pathname + '?ajax=true&' + listing_settings,
beforeSend: function() { $('#breadcrumb, #listing').addClass('activity'); },
complete: function() { $('#breadcrumb, #listing').removeClass('activity'); },
beforeSend: function() { $('#breadcrumb, #listing, #statistics').addClass('activity'); },
complete: function() { $('#breadcrumb, #listing, #statistics').removeClass('activity'); },
success: function(html) {
$('#page-links').remove();
$('#listing').replaceWith(html);
$('#statistics').replaceWith(html);
if (wcs_draw_graphs !== undefined) {
wcs_draw_graphs();
}
prepare_page_links();
prepare_row_links();
prepare_column_headers();
@ -79,7 +83,7 @@ function refresh_table() {
window.history.replaceState(null, null, pathname + '?' + listing_settings);
}
/* makes sure the activity class is well removed */
$('#breadcrumb, #listing').removeClass('activity');
$('#breadcrumb, #listing, #statistics').removeClass('activity');
}
});
}