web/facet.py
changeset 1896 8182746170c6
parent 1433 091ac3ba5d51
child 1933 f40ee76ecdf1
equal deleted inserted replaced
1895:bf46668f9cac 1896:8182746170c6
    17 from logilab.common.compat import all
    17 from logilab.common.compat import all
    18 
    18 
    19 from rql import parse, nodes
    19 from rql import parse, nodes
    20 
    20 
    21 from cubicweb import Unauthorized, typed_eid
    21 from cubicweb import Unauthorized, typed_eid
       
    22 from cubicweb.utils import make_uid
    22 from cubicweb.selectors import match_context_prop, partial_relation_possible
    23 from cubicweb.selectors import match_context_prop, partial_relation_possible
    23 from cubicweb.appobject import AppRsetObject
    24 from cubicweb.appobject import AppRsetObject
    24 from cubicweb.web.htmlwidgets import HTMLWidget
    25 from cubicweb.web.htmlwidgets import HTMLWidget
    25 
    26 
    26 ## rqlst manipulation functions used by facets ################################
    27 ## rqlst manipulation functions used by facets ################################
   472         mainvar = self.filtered_variable
   473         mainvar = self.filtered_variable
   473         self.rqlst.add_constant_restriction(mainvar, self.rtype, value,
   474         self.rqlst.add_constant_restriction(mainvar, self.rtype, value,
   474                                             self.attrtype, self.comparator)
   475                                             self.attrtype, self.comparator)
   475 
   476 
   476 
   477 
       
   478 class RangeFacet(AttributeFacet):
       
   479 
       
   480     def get_widget(self):
       
   481         """return the widget instance to use to display this facet
       
   482         """
       
   483         values = set(value for _, value in self.vocabulary() if value is not None)
       
   484         return FacetRangeWidget(self, min(values), max(values))
       
   485 
       
   486     def add_rql_restrictions(self):
       
   487         infvalue = self.req.form.get('%s_inf' % self.id)
       
   488         if not infvalue:
       
   489             return
       
   490         supvalue = self.req.form.get('%s_sup' % self.id)
       
   491         self.rqlst.add_constant_restriction(self.filtered_variable,
       
   492                                             self.rtype,
       
   493                                             u'%s' % infvalue,
       
   494                                             'Float', '>=')
       
   495         self.rqlst.add_constant_restriction(self.filtered_variable,
       
   496                                             self.rtype,
       
   497                                             u'%s' % supvalue,
       
   498                                             'Float', '<=')
       
   499 
   477 
   500 
   478 class FilterRQLBuilder(object):
   501 class FilterRQLBuilder(object):
   479     """called by javascript to get a rql string from filter form"""
   502     """called by javascript to get a rql string from filter form"""
   480 
   503 
   481     def __init__(self, req):
   504     def __init__(self, req):
   544                (facetid, title))
   567                (facetid, title))
   545         self.w(u'<input name="%s" type="text" value="%s" />\n' % (facetid, self.value or u''))
   568         self.w(u'<input name="%s" type="text" value="%s" />\n' % (facetid, self.value or u''))
   546         self.w(u'</div>\n')
   569         self.w(u'</div>\n')
   547 
   570 
   548 
   571 
       
   572 class FacetRangeWidget(HTMLWidget):
       
   573     onload = u'''
       
   574     jQuery("#%(sliderid)s").slider({
       
   575     	range: true,
       
   576 	min: %(minvalue)s,
       
   577 	max: %(maxvalue)s,
       
   578         values: [%(minvalue)s, %(maxvalue)s],
       
   579     	slide: function(event, ui) {
       
   580 	    $('#%(sliderid)s_inf').html(ui.values[0]);
       
   581 	    $('#%(sliderid)s_sup').html(ui.values[1]);
       
   582 	    $('input[name=%(facetid)s_inf]').val(ui.values[0]);
       
   583 	    $('input[name=%(facetid)s_sup]').val(ui.values[1]);
       
   584     	}
       
   585    });
       
   586 '''
       
   587     def __init__(self, facet, minvalue, maxvalue):
       
   588         self.facet = facet
       
   589         self.minvalue = minvalue
       
   590         self.maxvalue = maxvalue
       
   591 
       
   592     def _render(self):
       
   593         facet = self.facet
       
   594         facet.req.add_js('ui.slider.js')
       
   595         facet.req.add_css('ui.all.css')
       
   596         sliderid = make_uid('the slider')
       
   597         facetid = html_escape(self.facet.id)
       
   598         facet.req.html_headers.add_onload(self.onload % {
       
   599                 'sliderid': sliderid,
       
   600                 'facetid': facetid,
       
   601                 'minvalue': self.minvalue,
       
   602                 'maxvalue': self.maxvalue,
       
   603                 })
       
   604         title = html_escape(self.facet.title)
       
   605         self.w(u'<div id="%s" class="facet">\n' % facetid)
       
   606         self.w(u'<div class="facetTitle" cubicweb:facetName="%s">%s</div>\n' %
       
   607                (facetid, title))
       
   608         self.w(u'<span id="%s_inf">%s</span> - <span id="%s_sup">%s</span>'
       
   609                % (sliderid, self.minvalue, sliderid, self.maxvalue))
       
   610         self.w(u'<input type="hidden" name="%s_inf" value="%s" />'
       
   611                % (facetid, self.minvalue))
       
   612         self.w(u'<input type="hidden" name="%s_sup" value="%s" />'
       
   613                % (facetid, self.maxvalue))
       
   614         self.w(u'<div id="%s"></div>' % sliderid)
       
   615         self.w(u'</div>\n')
       
   616 
       
   617 
   549 class FacetItem(HTMLWidget):
   618 class FacetItem(HTMLWidget):
   550 
   619 
   551     selected_img = "black-check.png"
   620     selected_img = "black-check.png"
   552     unselected_img = "no-check-no-border.png"
   621     unselected_img = "no-check-no-border.png"
   553 
   622