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 |