web/views/treeview.py
branchtls-sprint
changeset 981 d86d1ee3b60e
parent 939 ad72e06320e2
child 985 6a25c58a1c23
equal deleted inserted replaced
980:59552ba2015f 981:d86d1ee3b60e
     4 :copyright: 2001-2009 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
     4 :copyright: 2001-2009 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
     5 :contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr
     5 :contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr
     6 """
     6 """
     7 __docformat__ = "restructuredtext en"
     7 __docformat__ = "restructuredtext en"
     8 
     8 
       
     9 from logilab.common.decorators import monkeypatch
     9 from logilab.mtconverter import html_escape
    10 from logilab.mtconverter import html_escape
    10 from cubicweb.interfaces import ITree
       
    11 from cubicweb.common.selectors import implement_interface, yes
       
    12 from cubicweb.common.view import EntityView
       
    13 
    11 
    14 from cubicweb.interfaces import ITree
    12 from cubicweb.interfaces import ITree
    15 from cubicweb.common.selectors import implement_interface, yes
    13 from cubicweb.selectors import implements
    16 from cubicweb.common.view import EntityView
    14 from cubicweb.view import EntityView
       
    15 from cubicweb.web.views.basecontrollers import JSonController
    17 
    16 
    18 def treecookiename(treeid):
    17 def treecookiename(treeid):
    19     return str('treestate-%s' % treeid)
    18     return str('treestate-%s' % treeid)
    20 
    19 
       
    20 
    21 class TreeView(EntityView):
    21 class TreeView(EntityView):
    22     id = 'treeview'
    22     id = 'treeview'
    23     accepts = ('Any',)
       
    24     itemvid = 'treeitemview'
    23     itemvid = 'treeitemview'
    25     css_classes = 'treeview widget'
    24     css_classes = 'treeview widget'
    26     title = _('tree view')
    25     title = _('tree view')
    27 
    26 
    28     def call(self, subvid=None, treeid=None, initial_load=True):
    27     def call(self, subvid=None, treeid=None, initial_load=True):
    35         assert treeid is not None
    34         assert treeid is not None
    36         if initial_load:
    35         if initial_load:
    37             self.req.add_css('jquery.treeview.css')
    36             self.req.add_css('jquery.treeview.css')
    38             self.req.add_js(('cubicweb.ajax.js', 'jquery.treeview.js'))
    37             self.req.add_js(('cubicweb.ajax.js', 'jquery.treeview.js'))
    39             self.req.html_headers.add_onload(u"""
    38             self.req.html_headers.add_onload(u"""
    40                  jQuery("#tree-%s").treeview({toggle: toggleTree,
    39 jQuery("#tree-%s").treeview({toggle: toggleTree, prerendered: true});""" % treeid)
    41                                               prerendered: true});""" % treeid)
       
    42         self.w(u'<ul id="tree-%s" class="%s">' % (treeid, self.css_classes))
    40         self.w(u'<ul id="tree-%s" class="%s">' % (treeid, self.css_classes))
    43         for rowidx in xrange(len(self.rset)):
    41         for rowidx in xrange(len(self.rset)):
    44             self.wview(self.itemvid, self.rset, row=rowidx, col=0,
    42             self.wview(self.itemvid, self.rset, row=rowidx, col=0,
    45                        vid=subvid, parentvid=self.id, treeid=treeid)
    43                        vid=subvid, parentvid=self.id, treeid=treeid)
    46         self.w(u'</ul>')
    44         self.w(u'</ul>')
    72             # XXX define specific CSS classes according to mime types
    70             # XXX define specific CSS classes according to mime types
    73             self.w(u'<div class="file">%s</div>\n' % entity.view('oneline'))
    71             self.w(u'<div class="file">%s</div>\n' % entity.view('oneline'))
    74 
    72 
    75 
    73 
    76 class DefaultTreeViewItemView(EntityView):
    74 class DefaultTreeViewItemView(EntityView):
    77     """default treeitem view for entities which don't implement ITree
    75     """default treeitem view for entities which don't implement ITree"""
    78     """
       
    79     id = 'treeitemview'
    76     id = 'treeitemview'
    80     accepts = ('Any',)
       
    81 
    77 
    82     def cell_call(self, row, col, vid='oneline', parentvid='treeview', treeid=None):
    78     def cell_call(self, row, col, vid='oneline', parentvid='treeview', treeid=None):
    83         assert treeid is not None
    79         assert treeid is not None
    84         entity = self.entity(row, col)
    80         entity = self.entity(row, col)
    85         itemview = self.view(vid, self.rset, row=row, col=col)
    81         itemview = self.view(vid, self.rset, row=row, col=col)
    90 
    86 
    91 
    87 
    92 class TreeViewItemView(EntityView):
    88 class TreeViewItemView(EntityView):
    93     """specific treeitem view for entities which implement ITree
    89     """specific treeitem view for entities which implement ITree
    94 
    90 
    95     (each item should be exandable if it's not a tree leaf)
    91     (each item should be expandable if it's not a tree leaf)
    96     """
    92     """
    97     id = 'treeitemview'
    93     id = 'treeitemview'
    98     # XXX append yes to make sure we get an higher score than
    94     __select_ = implements(ITree)
    99     #     the default treeitem view
       
   100     __selectors__ = (implement_interface, yes)
       
   101     accepts_interfaces = (ITree,)
       
   102 
    95 
   103     def open_state(self, eeid, treeid):
    96     def open_state(self, eeid, treeid):
   104         cookies = self.req.get_cookie()
    97         cookies = self.req.get_cookie()
   105         treestate = cookies.get(treecookiename(treeid))
    98         treestate = cookies.get(treecookiename(treeid))
   106         if treestate:
    99         if treestate:
   157         self.wview(vid, self.rset, row=row, col=col)
   150         self.wview(vid, self.rset, row=row, col=col)
   158         if is_open: # recurse if needed
   151         if is_open: # recurse if needed
   159             self.wview(parentvid, self.req.execute(rql), treeid=treeid, initial_load=False)
   152             self.wview(parentvid, self.req.execute(rql), treeid=treeid, initial_load=False)
   160         w(u'</li>')
   153         w(u'</li>')
   161 
   154 
   162 from logilab.common.decorators import monkeypatch
       
   163 from cubicweb.web.views.basecontrollers import JSonController
       
   164 
   155 
   165 @monkeypatch(JSonController)
   156 @monkeypatch(JSonController)
   166 def js_node_clicked(self, treeid, nodeeid):
   157 def js_node_clicked(self, treeid, nodeeid):
   167     """add/remove eid in treestate cookie"""
   158     """add/remove eid in treestate cookie"""
   168     cookies = self.req.get_cookie()
   159     cookies = self.req.get_cookie()