web/views/treeview.py
changeset 150 1190261a1f13
parent 0 b97547f5f1fa
child 187 cae87ca76f02
equal deleted inserted replaced
149:a7cd4296a85e 150:1190261a1f13
     2 
     2 
     3 from cubicweb.interfaces import ITree
     3 from cubicweb.interfaces import ITree
     4 from cubicweb.common.selectors import interface_selector, yes_selector
     4 from cubicweb.common.selectors import interface_selector, yes_selector
     5 from cubicweb.common.view import EntityView
     5 from cubicweb.common.view import EntityView
     6 
     6 
       
     7 from cubicweb.web.views.baseviews import OneLineView
       
     8 
     7 class TreeView(EntityView):
     9 class TreeView(EntityView):
     8     id = 'treeview'
    10     id = 'treeview'
     9     accepts = ('Any',)
    11     accepts = ('Any',)
       
    12     fstree = False
       
    13     itemvid = 'treeitemview'
    10     
    14     
    11     def call(self, subvid=None):
    15     def call(self, subvid=None):
    12         if subvid is None and 'subvid' in self.req.form:
    16         if subvid is None and 'subvid' in self.req.form:
    13             subvid = self.req.form.pop('subvid') # consume it
    17             subvid = self.req.form.pop('subvid') # consume it
    14         if subvid is None:
    18         if subvid is None:
    15             subvid = 'oneline'
    19             subvid = 'oneline'
    16         self.req.add_css('jquery.treeview.css')
    20         self.req.add_css('jquery.treeview.css')
    17         self.req.add_js(('cubicweb.ajax.js', 'jquery.treeview.js', 'cubicweb.widgets.js'))
    21         self.req.add_js(('cubicweb.ajax.js', 'jquery.treeview.js', 'cubicweb.widgets.js'))
    18         self.w(u'<ul class="treeview widget" cubicweb:loadtype="auto" cubicweb:wdgtype="TreeView">')
    22         css_classes = 'treeview widget'
       
    23         if self.fstree:
       
    24             css_classes += ' filetree'
       
    25         self.w(u'<ul class="%s" cubicweb:loadtype="auto" cubicweb:wdgtype="TreeView">'
       
    26                % css_classes)
    19         for rowidx in xrange(len(self.rset)):
    27         for rowidx in xrange(len(self.rset)):
    20             self.wview('treeitemview', self.rset, row=rowidx, col=0, vid=subvid)
    28             self.wview(self.itemvid, self.rset, row=rowidx, col=0,
       
    29                        vid=subvid, parentvid=self.id)
    21         self.w(u'</ul>')
    30         self.w(u'</ul>')
       
    31         
       
    32 
       
    33 class FileTreeView(TreeView):
       
    34     """specific version of the treeview to display file trees
       
    35     """
       
    36     id = 'filetree'
       
    37     fstree = True
       
    38 
       
    39     def call(self, subvid=None):
       
    40         super(FileTreeView, self).call(subvid='filetree-oneline')
       
    41 
       
    42 
       
    43 
       
    44 class FileItemInnerView(OneLineView):
       
    45     """inner view used by the TreeItemView instead of oneline view
       
    46 
       
    47     This view adds an enclosing <span> with some specific CSS classes
       
    48     around the oneline view. This is needed by the jquery treeview plugin.
       
    49     """
       
    50     id = 'filetree-oneline'
       
    51 
       
    52     def cell_call(self, row, col):
       
    53         entity = self.entity(row, col)
       
    54         if ITree.is_implemented_by(entity.__class__) and not entity.is_leaf():
       
    55             self.w(u'<span class="folder">%s</span>' % entity.view('oneline'))
       
    56         else:
       
    57             # XXX define specific CSS classes according to mime types
       
    58             self.w(u'<span class="file">%s</span>' % entity.view('oneline'))
    22 
    59 
    23 
    60 
    24 class DefaultTreeViewItemView(EntityView):
    61 class DefaultTreeViewItemView(EntityView):
    25     """default treeitem view for entities which don't implement ITree
    62     """default treeitem view for entities which don't implement ITree
    26     """
    63     """
    27     id = 'treeitemview'
    64     id = 'treeitemview'
    28     accepts = ('Any',)
    65     accepts = ('Any',)
    29     
    66     
    30     def cell_call(self, row, col, vid='oneline'):
    67     def cell_call(self, row, col, vid='oneline', parentvid='treeview'):
    31         entity = self.entity(row, col)
    68         entity = self.entity(row, col)
    32         itemview = self.view(vid, self.rset, row=row, col=col)
    69         itemview = self.view(vid, self.rset, row=row, col=col)
    33         if row == len(self.rset) - 1:
    70         if row == len(self.rset) - 1:
    34             self.w(u'<li class="last">%s</li>' % itemview)
    71             self.w(u'<li class="last">%s</li>' % itemview)
    35         else:
    72         else:
    36             self.w(u'<li>%s</li>' % itemview)
    73             self.w(u'<li><span>%s</span></li>' % itemview)
    37 
    74 
    38 
    75 
    39 class TreeViewItemView(EntityView):
    76 class TreeViewItemView(EntityView):
    40     """specific treeitem view for entities which implement ITree
    77     """specific treeitem view for entities which implement ITree
    41     
    78     
    45     # XXX append yes_selector to make sure we get an higher score than
    82     # XXX append yes_selector to make sure we get an higher score than
    46     #     the default treeitem view
    83     #     the default treeitem view
    47     __selectors__ = (interface_selector, yes_selector)
    84     __selectors__ = (interface_selector, yes_selector)
    48     accepts_interfaces = (ITree,)
    85     accepts_interfaces = (ITree,)
    49     
    86     
    50     def cell_call(self, row, col, vid='oneline'):
    87     def cell_call(self, row, col, vid='oneline', parentvid='treeview'):
    51         entity = self.entity(row, col)
    88         entity = self.entity(row, col)
    52         cssclasses = []
    89         cssclasses = []
    53         is_leaf = False
    90         is_leaf = False
    54         if row == len(self.rset) - 1:
    91         if row == len(self.rset) - 1:
    55             is_leaf = True
    92             is_leaf = True
    56         if not hasattr(entity, 'is_leaf') or entity.is_leaf():
    93         if not hasattr(entity, 'is_leaf') or entity.is_leaf():
    57             if is_leaf : cssclasses.append('last')
    94             if is_leaf : cssclasses.append('last')
    58             self.w(u'<li class="%s">' % u' '.join(cssclasses))
    95             self.w(u'<li class="%s">' % u' '.join(cssclasses))
    59         else:
    96         else:
    60             rql = entity.children_rql() % {'x': entity.eid}
    97             rql = entity.children_rql() % {'x': entity.eid}
    61             url = html_escape(self.build_url('json', rql=rql, vid='treeview',
    98             url = html_escape(self.build_url('json', rql=rql, vid=parentvid,
    62                                              pageid=self.req.pageid,
    99                                              pageid=self.req.pageid,
    63                                              subvid=vid))
   100                                              subvid=vid))
    64             cssclasses.append('expandable')
   101             cssclasses.append('expandable')
    65             divclasses = ['hitarea expandable-hitarea']
   102             divclasses = ['hitarea expandable-hitarea']
    66             if is_leaf :
   103             if is_leaf :