web/views/treeview.py
branchstable
changeset 3298 caef98aa4a98
parent 2391 59a2def75e93
child 3311 6934be37e948
equal deleted inserted replaced
3291:24489cbbd697 3298:caef98aa4a98
    22     id = 'treeview'
    22     id = 'treeview'
    23     itemvid = 'treeitemview'
    23     itemvid = 'treeitemview'
    24     css_classes = 'treeview widget'
    24     css_classes = 'treeview widget'
    25     title = _('tree view')
    25     title = _('tree view')
    26 
    26 
    27     def call(self, subvid=None, treeid=None, initial_load=True):
    27     def call(self, subvid=None, treeid=None, initial_load=True, initial_thru_ajax=False):
    28         if subvid is None:
    28         if subvid is None:
    29             subvid = self.req.form.pop('treesubvid', 'oneline') # consume it
    29             subvid = self.req.form.pop('treesubvid', 'oneline') # consume it
    30         if treeid is None:
    30         if treeid is None:
    31             treeid = self.req.form.pop('treeid', None)
    31             treeid = self.req.form.pop('treeid', None)
    32             if treeid is None:
    32             if treeid is None:
    33                 self.warning('Tree state won\'t be properly restored after next reload')
    33                 self.warning('Tree state won\'t be properly restored after next reload')
    34                 treeid = make_uid('throw away uid')
    34                 treeid = make_uid('throw away uid')
    35         self.w(u'<ul id="tree-%s" class="%s">' % (treeid, self.css_classes))
    35         toplevel_thru_ajax = self.req.form.pop('treeview_top', False) or initial_thru_ajax
       
    36         toplevel = toplevel_thru_ajax or (initial_load and not self.req.form.get('fname'))
       
    37         ulid = ' '
       
    38         if toplevel:
       
    39             ulid = ' id="tree-%s"' % treeid
       
    40         self.w(u'<ul%s class="%s">' % (ulid, self.css_classes))
    36         for rowidx in xrange(len(self.rset)):
    41         for rowidx in xrange(len(self.rset)):
    37             self.wview(self.itemvid, self.rset, row=rowidx, col=0,
    42             self.wview(self.itemvid, self.rset, row=rowidx, col=0,
    38                        vid=subvid, parentvid=self.id, treeid=treeid)
    43                        vid=subvid, parentvid=self.id, treeid=treeid)
    39         self.w(u'</ul>')
    44         self.w(u'</ul>')
    40         if initial_load and not self.req.form.get('fname'):
    45         if toplevel:
    41             self.req.add_css('jquery.treeview.css')
    46             self.req.add_css('jquery.treeview.css')
    42             self.req.add_js(('cubicweb.ajax.js', 'cubicweb.widgets.js', 'jquery.treeview.js'))
    47             self.req.add_js(('cubicweb.ajax.js', 'cubicweb.widgets.js', 'jquery.treeview.js'))
    43             self.req.html_headers.add_onload(u"""
    48             self.req.html_headers.add_onload(u"""
    44 jQuery("#tree-%s").treeview({toggle: toggleTree, prerendered: true});""" % treeid)
    49 jQuery("#tree-%s").treeview({toggle: toggleTree, prerendered: true});""" % treeid,
    45 
    50                                              jsoncall=toplevel_thru_ajax)
    46 
    51 
    47 class FileTreeView(TreeView):
    52 class FileTreeView(TreeView):
    48     """specific version of the treeview to display file trees
    53     """specific version of the treeview to display file trees
    49     """
    54     """
    50     id = 'filetree'
    55     id = 'filetree'
    89     """specific treeitem view for entities which implement ITree
    94     """specific treeitem view for entities which implement ITree
    90 
    95 
    91     (each item should be expandable if it's not a tree leaf)
    96     (each item should be expandable if it's not a tree leaf)
    92     """
    97     """
    93     id = 'treeitemview'
    98     id = 'treeitemview'
    94     __select__ = EntityView.__select__ & implements(ITree) # XXX
    99     default_branch_state_is_open = False
       
   100     __select__ = EntityView.__select__ & implements(ITree)
    95 
   101 
    96     def open_state(self, eeid, treeid):
   102     def open_state(self, eeid, treeid):
    97         cookies = self.req.get_cookie()
   103         cookies = self.req.get_cookie()
    98         treestate = cookies.get(treecookiename(treeid))
   104         treestate = cookies.get(treecookiename(treeid))
    99         if treestate:
   105         if treestate:
   100             return str(eeid) in treestate.value.split(';')
   106             return str(eeid) in treestate.value.split(';')
   101         return False
   107         return self.default_branch_state_is_open
   102 
   108 
   103     def cell_call(self, row, col, treeid, vid='oneline', parentvid='treeview'):
   109     def cell_call(self, row, col, treeid, vid='oneline', parentvid='treeview',
       
   110                   **kwargs):
   104         w = self.w
   111         w = self.w
   105         entity = self.entity(row, col)
   112         entity = self.entity(row, col)
   106         liclasses = []
   113         liclasses = []
   107         is_last = row == len(self.rset) - 1
   114         is_last = row == len(self.rset) - 1
   108         is_open = self.open_state(entity.eid, treeid)
   115         is_open = self.open_state(entity.eid, treeid)
   143             # add empty <ul> because jquery's treeview plugin checks for
   150             # add empty <ul> because jquery's treeview plugin checks for
   144             # sublists presence
   151             # sublists presence
   145             if not is_open:
   152             if not is_open:
   146                 w(u'<ul class="placeholder"><li>place holder</li></ul>')
   153                 w(u'<ul class="placeholder"><li>place holder</li></ul>')
   147         # the local node info
   154         # the local node info
   148         self.wview(vid, self.rset, row=row, col=col)
   155         self.wview(vid, self.rset, row=row, col=col, **kwargs)
   149         if is_open and not is_leaf: #  => rql is defined
   156         if is_open and not is_leaf: #  => rql is defined
   150             self.wview(parentvid, self.req.execute(rql), treeid=treeid, initial_load=False)
   157             self.wview(parentvid, self.req.execute(rql), treeid=treeid, initial_load=False)
   151         w(u'</li>')
   158         w(u'</li>')
   152 
   159