# HG changeset patch # User Adrien Di Mascio # Date 1243625649 -7200 # Node ID 3009899e1e519ec0e6f5613fb383ba586bbf2858 # Parent 71a9ab77d9f88d6cf7f9f7499a189ef84b4a4315# Parent 758ccc0a9d168d5974ac5c945f8d019bc63c79e5 merge diff -r 758ccc0a9d16 -r 3009899e1e51 web/data/black-uncheck.png Binary file web/data/black-uncheck.png has changed diff -r 758ccc0a9d16 -r 3009899e1e51 web/data/cubicweb.formfilter.js --- a/web/data/cubicweb.formfilter.js Fri May 29 20:22:39 2009 +0200 +++ b/web/data/cubicweb.formfilter.js Fri May 29 21:34:09 2009 +0200 @@ -103,7 +103,7 @@ var SELECTED_IMG = baseuri()+"data/black-check.png"; var UNSELECTED_IMG = baseuri()+"data/no-check-no-border.png"; -var UNSELECTED_BORDER_IMG = baseuri()+"data/black-unchecked.png"; +var UNSELECTED_BORDER_IMG = baseuri()+"data/black-uncheck.png"; function initFacetBoxEvents(root) { // facetargs : (divid, vid, paginate, extraargs) @@ -133,7 +133,7 @@ this.setAttribute('src', UNSELECTED_BORDER_IMG); } else{ - this.setAttribute('src', UNSELECTED_IMG); + this.setAttribute('src', UNSELECTED_IMG); } }); var index = parseInt($this.attr('cubicweb:idx')); @@ -143,7 +143,11 @@ }).length; index += shift; var parent = this.parentNode; - jQuery(parent).find('.facetCheckBox:nth('+index+')').after(this); + var $insertAfter = jQuery(parent).find('.facetCheckBox:nth('+index+')'); + if ( ! ($insertAfter.length == 1 && index == 0) ) { + // only rearrange element if necessary + $insertAfter.after(this); + } } else { var lastSelected = facet.find('.facetValueSelected:last'); if (lastSelected.length) { diff -r 758ccc0a9d16 -r 3009899e1e51 web/facet.py --- a/web/facet.py Fri May 29 20:22:39 2009 +0200 +++ b/web/facet.py Fri May 29 21:34:09 2009 +0200 @@ -545,6 +545,34 @@ def formatvalue(self, value): return '"%s"' % date.fromtimestamp(float(value) / 1000).strftime('%Y/%m/%d') +class HasRelationFacet(AbstractFacet): + rtype = None # override me in subclass + role = 'subject' # role of filtered entity in the relation + + @property + def title(self): + return display_name(self.req, self.rtype, self.role) + + def support_and(self): + return False + + def get_widget(self): + return CheckBoxFacetWidget(self.req, self, + '%s:%s' % (self.rtype, self), + self.req.form.get(self.id)) + + def add_rql_restrictions(self): + """add restriction for this facet into the rql syntax tree""" + self.rqlst.set_distinct(True) # XXX + value = self.req.form.get(self.id) + if not value: # no value sent for this facet + return + var = self.rqlst.make_variable() + if self.role == 'subject': + self.rqlst.add_relation(self.filtered_variable, self.rtype, var) + else: + self.rqlst.add_relation(var, self.rtype, self.filtered_variable) + ## html widets ################################################################ class FacetVocabularyWidget(HTMLWidget): @@ -705,6 +733,36 @@ self.w(u'%s' % html_escape(self.label)) self.w(u'') +class CheckBoxFacetWidget(HTMLWidget): + selected_img = "black-check.png" + unselected_img = "black-uncheck.png" + + def __init__(self, req, facet, value, selected): + self.req = req + self.facet = facet + self.value = value + self.selected = selected + + def _render(self): + title = html_escape(self.facet.title) + facetid = html_escape(self.facet.id) + self.w(u'
\n' % facetid) + if self.selected: + cssclass = ' facetValueSelected' + imgsrc = self.req.datadir_url + self.selected_img + imgalt = self.req._('selected') + else: + cssclass = '' + imgsrc = self.req.datadir_url + self.unselected_img + imgalt = self.req._('not selected') + self.w(u'
\n' + % (cssclass, html_escape(unicode(self.value)))) + self.w(u'
') + self.w(u'%s ' % (imgsrc, imgalt)) + self.w(u'' % (facetid,title)) + self.w(u'
\n') + self.w(u'
\n') + self.w(u'
\n') class FacetSeparator(HTMLWidget): def __init__(self, label=None):