23 |
23 |
24 from cubicweb.appobject import objectify_selector |
24 from cubicweb.appobject import objectify_selector |
25 from cubicweb.selectors import (non_final_entity, multi_lines_rset, |
25 from cubicweb.selectors import (non_final_entity, multi_lines_rset, |
26 match_context_prop, yes, relation_possible) |
26 match_context_prop, yes, relation_possible) |
27 from cubicweb.utils import json_dumps |
27 from cubicweb.utils import json_dumps |
28 from cubicweb.web.box import BoxTemplate |
28 from cubicweb.web import box |
29 from cubicweb.web.facet import (AbstractFacet, FacetStringWidget, RelationFacet, |
29 from cubicweb.web.facet import (AbstractFacet, FacetStringWidget, RelationFacet, |
30 prepare_facets_rqlst, filter_hiddens, _cleanup_rqlst, |
30 prepare_facets_rqlst, filter_hiddens, _cleanup_rqlst, |
31 _prepare_vocabulary_rqlst) |
31 _prepare_vocabulary_rqlst) |
32 |
32 |
33 @objectify_selector |
33 @objectify_selector |
36 if view and getattr(view, 'filter_box_context_info', lambda: None)(): |
36 if view and getattr(view, 'filter_box_context_info', lambda: None)(): |
37 return 1 |
37 return 1 |
38 return 0 |
38 return 0 |
39 |
39 |
40 |
40 |
41 class FilterBox(BoxTemplate): |
41 class FilterBox(box.Box): |
42 """filter results of a query""" |
42 """filter results of a query""" |
43 __regid__ = 'filter_box' |
43 __regid__ = 'filter_box' |
44 __select__ = (((non_final_entity() & multi_lines_rset()) |
44 __select__ = (((non_final_entity() & multi_lines_rset()) |
45 | contextview_selector() |
45 | contextview_selector() |
46 ) & match_context_prop()) |
46 ) & match_context_prop()) |
47 context = 'left' |
47 context = 'left' # XXX doesn't support 'incontext', only 'left' or 'right' |
48 title = _('boxes_filter_box') |
48 title = _('boxes_filter_box') |
49 visible = True # functionality provided by the search box by default |
49 visible = True # functionality provided by the search box by default |
50 order = 1 |
50 order = 1 |
51 roundcorners = True |
51 roundcorners = True |
52 |
52 |
59 """this method returns the list of extra arguments that should |
59 """this method returns the list of extra arguments that should |
60 be used by the facet |
60 be used by the facet |
61 """ |
61 """ |
62 return {} |
62 return {} |
63 |
63 |
64 def _get_context(self, view): |
64 def _get_context(self): |
|
65 view = self.cw_extra_kwargs.get('view') |
65 context = getattr(view, 'filter_box_context_info', lambda: None)() |
66 context = getattr(view, 'filter_box_context_info', lambda: None)() |
66 if context: |
67 if context: |
67 rset, vid, divid, paginate = context |
68 rset, vid, divid, paginate = context |
68 else: |
69 else: |
69 rset = self.cw_rset |
70 rset = self.cw_rset |
70 vid, divid = None, 'pageContent' |
71 vid, divid = None, 'pageContent' |
71 paginate = view and view.paginable |
72 paginate = view and view.paginable |
72 return rset, vid, divid, paginate |
73 return rset, vid, divid, paginate |
73 |
74 |
74 def call(self, view=None): |
75 def render(self, w, **kwargs): |
75 req = self._cw |
76 req = self._cw |
76 req.add_js( self.needs_js ) |
77 req.add_js( self.needs_js ) |
77 req.add_css( self.needs_css) |
78 req.add_css( self.needs_css) |
78 if self.roundcorners: |
79 if self.roundcorners: |
79 req.html_headers.add_onload('jQuery(".facet").corner("tl br 10px");') |
80 req.html_headers.add_onload('jQuery(".facet").corner("tl br 10px");') |
80 rset, vid, divid, paginate = self._get_context(view) |
81 rset, vid, divid, paginate = self._get_context() |
81 if rset.rowcount < 2: # XXX done by selectors, though maybe necessary when rset has been hijacked |
82 # XXX done by selectors, though maybe necessary when rset has been hijacked |
|
83 if rset.rowcount < 2: |
82 return |
84 return |
83 rqlst = rset.syntax_tree() |
85 rqlst = rset.syntax_tree() |
84 # union not yet supported |
86 # union not yet supported |
85 if len(rqlst.children) != 1: |
87 if len(rqlst.children) != 1: |
86 return () |
88 return () |
95 widgets.append(wdg) |
97 widgets.append(wdg) |
96 if not widgets: |
98 if not widgets: |
97 return |
99 return |
98 if vid is None: |
100 if vid is None: |
99 vid = req.form.get('vid') |
101 vid = req.form.get('vid') |
100 w = self.w |
|
101 if self.bk_linkbox_template and req.vreg.schema['Bookmark'].has_perm(req, 'add'): |
102 if self.bk_linkbox_template and req.vreg.schema['Bookmark'].has_perm(req, 'add'): |
102 w(self.bookmark_link(rset)) |
103 w(self.bookmark_link(rset)) |
103 w(u'<form method="post" id="%sForm" cubicweb:facetargs="%s" action="">' % ( |
104 w(u'<form method="post" id="%sForm" cubicweb:facetargs="%s" action="">' % ( |
104 divid, xml_escape(json_dumps([divid, vid, paginate, self.facetargs()])))) |
105 divid, xml_escape(json_dumps([divid, vid, paginate, self.facetargs()])))) |
105 w(u'<fieldset>') |
106 w(u'<fieldset>') |
108 for param in ('subvid', 'vtitle'): |
109 for param in ('subvid', 'vtitle'): |
109 if param in req.form: |
110 if param in req.form: |
110 hiddens[param] = req.form[param] |
111 hiddens[param] = req.form[param] |
111 filter_hiddens(w, **hiddens) |
112 filter_hiddens(w, **hiddens) |
112 for wdg in widgets: |
113 for wdg in widgets: |
113 wdg.render(w=self.w) |
114 wdg.render(w=w) |
114 w(u'</fieldset>\n</form>\n') |
115 w(u'</fieldset>\n</form>\n') |
115 |
116 |
116 def bookmark_link(self, rset): |
117 def bookmark_link(self, rset): |
117 req = self._cw |
118 req = self._cw |
118 bk_path = u'rql=%s' % req.url_quote(rset.printable_rql()) |
119 bk_path = u'rql=%s' % req.url_quote(rset.printable_rql()) |