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() |