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 : |