# HG changeset patch # User Adrien Di Mascio # Date 1242943443 -7200 # Node ID 8182746170c66df9d8731d57d807041be1a00e31 # Parent bf46668f9cac4e03ab43004f0a9ff6d9eb5047ff work in progress: new 'range facet' usable for numerical values, still lacks the form.submit on mouseUp diff -r bf46668f9cac -r 8182746170c6 web/facet.py --- a/web/facet.py Fri May 22 00:02:28 2009 +0200 +++ b/web/facet.py Fri May 22 00:04:03 2009 +0200 @@ -19,6 +19,7 @@ from rql import parse, nodes from cubicweb import Unauthorized, typed_eid +from cubicweb.utils import make_uid from cubicweb.selectors import match_context_prop, partial_relation_possible from cubicweb.appobject import AppRsetObject from cubicweb.web.htmlwidgets import HTMLWidget @@ -474,6 +475,28 @@ self.attrtype, self.comparator) +class RangeFacet(AttributeFacet): + + def get_widget(self): + """return the widget instance to use to display this facet + """ + values = set(value for _, value in self.vocabulary() if value is not None) + return FacetRangeWidget(self, min(values), max(values)) + + def add_rql_restrictions(self): + infvalue = self.req.form.get('%s_inf' % self.id) + if not infvalue: + return + supvalue = self.req.form.get('%s_sup' % self.id) + self.rqlst.add_constant_restriction(self.filtered_variable, + self.rtype, + u'%s' % infvalue, + 'Float', '>=') + self.rqlst.add_constant_restriction(self.filtered_variable, + self.rtype, + u'%s' % supvalue, + 'Float', '<=') + class FilterRQLBuilder(object): """called by javascript to get a rql string from filter form""" @@ -546,6 +569,52 @@ self.w(u'\n') +class FacetRangeWidget(HTMLWidget): + onload = u''' + jQuery("#%(sliderid)s").slider({ + range: true, + min: %(minvalue)s, + max: %(maxvalue)s, + values: [%(minvalue)s, %(maxvalue)s], + slide: function(event, ui) { + $('#%(sliderid)s_inf').html(ui.values[0]); + $('#%(sliderid)s_sup').html(ui.values[1]); + $('input[name=%(facetid)s_inf]').val(ui.values[0]); + $('input[name=%(facetid)s_sup]').val(ui.values[1]); + } + }); +''' + def __init__(self, facet, minvalue, maxvalue): + self.facet = facet + self.minvalue = minvalue + self.maxvalue = maxvalue + + def _render(self): + facet = self.facet + facet.req.add_js('ui.slider.js') + facet.req.add_css('ui.all.css') + sliderid = make_uid('the slider') + facetid = html_escape(self.facet.id) + facet.req.html_headers.add_onload(self.onload % { + 'sliderid': sliderid, + 'facetid': facetid, + 'minvalue': self.minvalue, + 'maxvalue': self.maxvalue, + }) + title = html_escape(self.facet.title) + self.w(u'
\n' % facetid) + self.w(u'
%s
\n' % + (facetid, title)) + self.w(u'%s - %s' + % (sliderid, self.minvalue, sliderid, self.maxvalue)) + self.w(u'' + % (facetid, self.minvalue)) + self.w(u'' + % (facetid, self.maxvalue)) + self.w(u'
' % sliderid) + self.w(u'
\n') + + class FacetItem(HTMLWidget): selected_img = "black-check.png"