diff -r 9cbf4c86f57a -r 75d208ab8444 web/views/tableview.py --- a/web/views/tableview.py Fri Jul 01 12:48:39 2011 +0200 +++ b/web/views/tableview.py Fri Jul 01 13:39:45 2011 +0200 @@ -15,110 +15,48 @@ # # You should have received a copy of the GNU Lesser General Public License along # with CubicWeb. If not, see . -"""generic table view, including filtering abilities""" +"""generic table view, including filtering abilities using facets""" __docformat__ = "restructuredtext en" _ = unicode from logilab.mtconverter import xml_escape +from cubicweb import NoSelectableObject, tags from cubicweb.selectors import nonempty_rset from cubicweb.utils import make_uid, json_dumps from cubicweb.view import EntityView, AnyRsetView -from cubicweb import tags from cubicweb.uilib import toggle_action, limitsize, htmlescape -from cubicweb.web import jsonize -from cubicweb.web.component import Link +from cubicweb.web import jsonize, component, facet from cubicweb.web.htmlwidgets import (TableWidget, TableColumn, MenuWidget, PopupBoxMenu) -from cubicweb.web import facet -from cubicweb.web.facet import prepare_facets_rqlst, filter_hiddens + class TableView(AnyRsetView): - """The table view accepts any non-empty rset. It uses - introspection on the result set to compute column names and the - proper way to display the cells. + """The table view accepts any non-empty rset. It uses introspection on the + result set to compute column names and the proper way to display the cells. + It is however highly configurable and accepts a wealth of options. """ __regid__ = 'table' title = _('table') finalview = 'final' - wdg_stack_size = 8 def form_filter(self, divid, displaycols, displayactions, displayfilter, paginate, hidden=True): - rqlst = self.cw_rset.syntax_tree() - # union not yet supported - if len(rqlst.children) != 1: + try: + filterform = self._cw.vreg['views'].select( + 'facet.filtertable', self._cw, rset=self.cw_rset) + except NoSelectableObject: return () - rqlst = rqlst.copy() - self._cw.vreg.rqlhelper.annotate(rqlst) - mainvar, baserql = prepare_facets_rqlst(rqlst, self.cw_rset.args) - wdgs = [facet.get_widget() for facet in self._cw.vreg['facets'].poss_visible_objects( - self._cw, rset=self.cw_rset, rqlst=rqlst.children[0], context='tablefilter', - filtered_variable=mainvar)] - wdgs = [wdg for wdg in wdgs if wdg is not None] - if wdgs: - self._generate_form(divid, baserql, wdgs, hidden, - vidargs={'paginate': paginate, - 'displaycols': displaycols, - 'displayactions': displayactions, - 'displayfilter': displayfilter}) - return self.show_hide_actions(divid, not hidden) - return () - - def _generate_form(self, divid, baserql, fwidgets, hidden=True, vidargs={}): - """display a form to filter table's content. This should only - occur when a context eid is given - """ - w = self.w - self._cw.add_css('cubicweb.facets.css') - self._cw.add_js( ('cubicweb.ajax.js', 'cubicweb.facets.js')) - self._cw.html_headers.define_var('facetLoadingMsg', - self._cw._('facet-loading-msg')) - # drop False / None values from vidargs - vidargs = dict((k, v) for k, v in vidargs.iteritems() if v) - w(u'
' % - xml_escape(json_dumps([divid, self.__regid__, False, vidargs]))) - w(u'
' % (divid, hidden and 'hidden' or '')) - w(u'' % divid) - w(u'') - filter_hiddens(w, facets=','.join(wdg.facet.__regid__ for wdg in fwidgets), - baserql=baserql) - self._build_form_table(fwidgets) - - def _facet_widget_sort(self, fwidgets): - fwidgets.sort(key=lambda x: x.height()) - - def _build_form_table(self, fwidgets): - # sort by widget height - w = self.w - self._facet_widget_sort(fwidgets) - w(u'\n') - widget_queue = [] - queue_size = 0 - w(u'\n') - for wdg in fwidgets: - height = wdg.height() - if queue_size + height <= self.wdg_stack_size: - widget_queue.append(wdg) - queue_size += height - continue - w(u'') - widget_queue = [wdg] - queue_size = height - if widget_queue: - w(u'') - w(u'\n') - w(u'
') - for queued in widget_queue: - queued.render(w=w) - w(u'') - for queued in widget_queue: - queued.render(w=w) - w(u'
\n') - w(u'
\n') - w(u'
\n') + vidargs = {'paginate': paginate, + 'displaycols': displaycols, + 'displayactions': displayactions, + 'displayfilter': displayfilter} + cssclass = hidden and 'hidden' or '' + filterform.render(self.w, vid=self.__regid__, divid=divid, + vidargs=vidargs, cssclass=cssclass) + return self.show_hide_actions(divid, not hidden) def main_var_index(self): """returns the index of the first non-attribute variable among the RQL @@ -241,7 +179,7 @@ ident='%sActions' % divid) box.append(menu) for url, label, klass, ident in actions: - menu.append(Link(url, label, klass=klass, id=ident)) + menu.append(component.Link(url, label, klass=klass, id=ident)) box.render(w=self.w) self.w(u'
')