merge
authorAdrien Di Mascio <Adrien.DiMascio@logilab.fr>
Fri, 29 May 2009 21:34:09 +0200
changeset 2015 3009899e1e51
parent 2014 71a9ab77d9f8 (diff)
parent 2011 758ccc0a9d16 (current diff)
child 2016 a6638de6d4da
merge
Binary file web/data/black-uncheck.png has changed
--- 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) {
--- 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'<a href="javascript: {}">%s</a>' % html_escape(self.label))
         self.w(u'</div>')
 
+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'<div id="%s" class="facet">\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'<div class="facetValue facetCheckBox%s" cubicweb:value="%s">\n'
+               % (cssclass, html_escape(unicode(self.value))))
+    self.w(u'<div class="facetCheckBoxWidget">')
+        self.w(u'<img src="%s" alt="%s" cubicweb:unselimg="true" />&nbsp;' % (imgsrc, imgalt))
+        self.w(u'<label class="facetTitle" cubicweb:facetName="%s"><a href="javascript: {}">%s</a></label>' % (facetid,title))
+        self.w(u'</div>\n')
+        self.w(u'</div>\n')
+    self.w(u'</div>\n')
 
 class FacetSeparator(HTMLWidget):
     def __init__(self, label=None):