author | Aurelien Campeas <aurelien.campeas@logilab.fr> |
Tue, 24 Feb 2009 11:59:53 +0100 | |
branch | tls-sprint |
changeset 940 | 15dcdc863965 |
parent 939 | ad72e06320e2 |
child 981 | d86d1ee3b60e |
permissions | -rw-r--r-- |
235
b43362d92a1d
rename to tabs.py
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents:
220
diff
changeset
|
1 |
"""base classes to handle tabbed views |
b43362d92a1d
rename to tabs.py
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents:
220
diff
changeset
|
2 |
|
b43362d92a1d
rename to tabs.py
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents:
220
diff
changeset
|
3 |
:organization: Logilab |
692
800592b8d39b
replace deprecated cubicweb.common.selectors by its new module path (cubicweb.selectors)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
688
diff
changeset
|
4 |
:copyright: 2008-2009 LOGILAB S.A. (Paris, FRANCE), all rights reserved. |
235
b43362d92a1d
rename to tabs.py
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents:
220
diff
changeset
|
5 |
:contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr |
b43362d92a1d
rename to tabs.py
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents:
220
diff
changeset
|
6 |
""" |
b43362d92a1d
rename to tabs.py
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents:
220
diff
changeset
|
7 |
|
b43362d92a1d
rename to tabs.py
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents:
220
diff
changeset
|
8 |
__docformat__ = "restructuredtext en" |
b43362d92a1d
rename to tabs.py
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents:
220
diff
changeset
|
9 |
|
542
46d4ff5aa917
use lgc.decorators.monkeypatch in tabs.py
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
522
diff
changeset
|
10 |
from logilab.common.decorators import monkeypatch |
214
aaf2957bf69e
tabview is used to call each view for each tab
Laure Bourgois <Laure.Bourgois@logilab.fr>
parents:
diff
changeset
|
11 |
from logilab.mtconverter import html_escape |
aaf2957bf69e
tabview is used to call each view for each tab
Laure Bourgois <Laure.Bourgois@logilab.fr>
parents:
diff
changeset
|
12 |
|
235
b43362d92a1d
rename to tabs.py
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents:
220
diff
changeset
|
13 |
from cubicweb import NoSelectableObject, role |
838
f2c56312b03a
rename abstract_* selectors into partial_* + add docstrings
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
782
diff
changeset
|
14 |
from cubicweb.selectors import partial_has_related_entities |
940
15dcdc863965
fix imports : common.utils -> utils
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
939
diff
changeset
|
15 |
from cubicweb.utils import HTMLHead |
214
aaf2957bf69e
tabview is used to call each view for each tab
Laure Bourgois <Laure.Bourgois@logilab.fr>
parents:
diff
changeset
|
16 |
from cubicweb.common.view import EntityView |
489 | 17 |
from cubicweb.common.selectors import has_related_entities |
542
46d4ff5aa917
use lgc.decorators.monkeypatch in tabs.py
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
522
diff
changeset
|
18 |
from cubicweb.common.uilib import rql_for_eid |
214
aaf2957bf69e
tabview is used to call each view for each tab
Laure Bourgois <Laure.Bourgois@logilab.fr>
parents:
diff
changeset
|
19 |
|
542
46d4ff5aa917
use lgc.decorators.monkeypatch in tabs.py
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
522
diff
changeset
|
20 |
from cubicweb.web.views.basecontrollers import JSonController |
485
0f830732be19
[tabs] provide a working tabs implementation, that lazy-loads tab content & should remember the current position
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
235
diff
changeset
|
21 |
|
0f830732be19
[tabs] provide a working tabs implementation, that lazy-loads tab content & should remember the current position
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
235
diff
changeset
|
22 |
|
0f830732be19
[tabs] provide a working tabs implementation, that lazy-loads tab content & should remember the current position
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
235
diff
changeset
|
23 |
class LazyViewMixin(object): |
510
6b92504d77c1
[tabs] improve pylint note :)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
504
diff
changeset
|
24 |
"""provides two convenience methods for the tab machinery |
6b92504d77c1
[tabs] improve pylint note :)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
504
diff
changeset
|
25 |
can also be used to lazy-load arbitrary views |
6b92504d77c1
[tabs] improve pylint note :)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
504
diff
changeset
|
26 |
caveat : lazyview is not recursive, i.e : you can't (successfully) |
6b92504d77c1
[tabs] improve pylint note :)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
504
diff
changeset
|
27 |
lazyload a view that in turns does the same |
6b92504d77c1
[tabs] improve pylint note :)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
504
diff
changeset
|
28 |
""" |
485
0f830732be19
[tabs] provide a working tabs implementation, that lazy-loads tab content & should remember the current position
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
235
diff
changeset
|
29 |
|
559
7cfd3d11edc8
[tabs] prepare for reloadability
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
547
diff
changeset
|
30 |
def _prepare_bindings(self, vid, reloadable): |
7cfd3d11edc8
[tabs] prepare for reloadability
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
547
diff
changeset
|
31 |
self.req.html_headers.add_onload(u""" |
7cfd3d11edc8
[tabs] prepare for reloadability
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
547
diff
changeset
|
32 |
jQuery('#lazy-%(vid)s').bind('%(event)s', function(event) { |
7cfd3d11edc8
[tabs] prepare for reloadability
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
547
diff
changeset
|
33 |
load_now('#lazy-%(vid)s', '#%(vid)s-hole', %(reloadable)s); |
7cfd3d11edc8
[tabs] prepare for reloadability
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
547
diff
changeset
|
34 |
});""" % {'event': 'load_%s' % vid, 'vid': vid, |
7cfd3d11edc8
[tabs] prepare for reloadability
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
547
diff
changeset
|
35 |
'reloadable' : str(reloadable).lower()}) |
7cfd3d11edc8
[tabs] prepare for reloadability
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
547
diff
changeset
|
36 |
|
917
51d5224b1698
[tabs] augment a bit the lazyview interface (very general now), tab groups are now marked per entity (thinking about the ?vid=primary case)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
606
diff
changeset
|
37 |
def lazyview(self, vid, rql=None, eid=None, rset=None, static=False, |
51d5224b1698
[tabs] augment a bit the lazyview interface (very general now), tab groups are now marked per entity (thinking about the ?vid=primary case)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
606
diff
changeset
|
38 |
reloadable=False, show_spinbox=True, w=None): |
485
0f830732be19
[tabs] provide a working tabs implementation, that lazy-loads tab content & should remember the current position
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
235
diff
changeset
|
39 |
"""a lazy version of wview |
0f830732be19
[tabs] provide a working tabs implementation, that lazy-loads tab content & should remember the current position
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
235
diff
changeset
|
40 |
first version only support lazy viewing for an entity at a time |
0f830732be19
[tabs] provide a working tabs implementation, that lazy-loads tab content & should remember the current position
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
235
diff
changeset
|
41 |
""" |
917
51d5224b1698
[tabs] augment a bit the lazyview interface (very general now), tab groups are now marked per entity (thinking about the ?vid=primary case)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
606
diff
changeset
|
42 |
assert rql or eid or rset or static, \ |
51d5224b1698
[tabs] augment a bit the lazyview interface (very general now), tab groups are now marked per entity (thinking about the ?vid=primary case)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
606
diff
changeset
|
43 |
'lazyview wants at least : rql, or an eid, or an rset -- or call it with static=True' |
485
0f830732be19
[tabs] provide a working tabs implementation, that lazy-loads tab content & should remember the current position
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
235
diff
changeset
|
44 |
w = w or self.w |
0f830732be19
[tabs] provide a working tabs implementation, that lazy-loads tab content & should remember the current position
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
235
diff
changeset
|
45 |
self.req.add_js('cubicweb.lazy.js') |
545
73aab1d2a27a
[tabs] fix the no-eid case, remove unused code
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
544
diff
changeset
|
46 |
urlparams = {'vid' : vid, 'mode' : 'html'} |
917
51d5224b1698
[tabs] augment a bit the lazyview interface (very general now), tab groups are now marked per entity (thinking about the ?vid=primary case)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
606
diff
changeset
|
47 |
if rql: |
51d5224b1698
[tabs] augment a bit the lazyview interface (very general now), tab groups are now marked per entity (thinking about the ?vid=primary case)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
606
diff
changeset
|
48 |
urlparams['rql'] = rql |
51d5224b1698
[tabs] augment a bit the lazyview interface (very general now), tab groups are now marked per entity (thinking about the ?vid=primary case)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
606
diff
changeset
|
49 |
elif eid: |
545
73aab1d2a27a
[tabs] fix the no-eid case, remove unused code
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
544
diff
changeset
|
50 |
urlparams['rql'] = rql_for_eid(eid) |
917
51d5224b1698
[tabs] augment a bit the lazyview interface (very general now), tab groups are now marked per entity (thinking about the ?vid=primary case)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
606
diff
changeset
|
51 |
elif rset: |
51d5224b1698
[tabs] augment a bit the lazyview interface (very general now), tab groups are now marked per entity (thinking about the ?vid=primary case)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
606
diff
changeset
|
52 |
urlparams['rql'] = rset.printable_rql() |
543
c0f2b6378f70
simplification of lazy tabs mechanism
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
542
diff
changeset
|
53 |
w(u'<div id="lazy-%s" cubicweb:loadurl="%s">' % ( |
545
73aab1d2a27a
[tabs] fix the no-eid case, remove unused code
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
544
diff
changeset
|
54 |
vid, html_escape(self.build_url('json', **urlparams)))) |
485
0f830732be19
[tabs] provide a working tabs implementation, that lazy-loads tab content & should remember the current position
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
235
diff
changeset
|
55 |
if show_spinbox: |
522
385ce5e0b30b
cubicweb__loadurl -> cubicweb:lazyloadurl
sylvain.thenault@logilab.fr
parents:
510
diff
changeset
|
56 |
w(u'<img src="data/loading.gif" id="%s-hole" alt="%s"/>' |
385ce5e0b30b
cubicweb__loadurl -> cubicweb:lazyloadurl
sylvain.thenault@logilab.fr
parents:
510
diff
changeset
|
57 |
% (vid, self.req._('loading'))) |
485
0f830732be19
[tabs] provide a working tabs implementation, that lazy-loads tab content & should remember the current position
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
235
diff
changeset
|
58 |
w(u'</div>') |
559
7cfd3d11edc8
[tabs] prepare for reloadability
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
547
diff
changeset
|
59 |
self._prepare_bindings(vid, reloadable) |
485
0f830732be19
[tabs] provide a working tabs implementation, that lazy-loads tab content & should remember the current position
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
235
diff
changeset
|
60 |
|
0f830732be19
[tabs] provide a working tabs implementation, that lazy-loads tab content & should remember the current position
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
235
diff
changeset
|
61 |
def forceview(self, vid): |
0f830732be19
[tabs] provide a working tabs implementation, that lazy-loads tab content & should remember the current position
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
235
diff
changeset
|
62 |
"""trigger an event that will force immediate loading of the view |
0f830732be19
[tabs] provide a working tabs implementation, that lazy-loads tab content & should remember the current position
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
235
diff
changeset
|
63 |
on dom readyness |
0f830732be19
[tabs] provide a working tabs implementation, that lazy-loads tab content & should remember the current position
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
235
diff
changeset
|
64 |
""" |
559
7cfd3d11edc8
[tabs] prepare for reloadability
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
547
diff
changeset
|
65 |
self.req.add_js('cubicweb.lazy.js') |
544
890e8d016d12
fix js syntax in tabs.forceview()
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
543
diff
changeset
|
66 |
self.req.html_headers.add_onload("trigger_load('%s');" % vid) |
543
c0f2b6378f70
simplification of lazy tabs mechanism
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
542
diff
changeset
|
67 |
|
485
0f830732be19
[tabs] provide a working tabs implementation, that lazy-loads tab content & should remember the current position
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
235
diff
changeset
|
68 |
|
0f830732be19
[tabs] provide a working tabs implementation, that lazy-loads tab content & should remember the current position
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
235
diff
changeset
|
69 |
class TabsMixin(LazyViewMixin): |
0f830732be19
[tabs] provide a working tabs implementation, that lazy-loads tab content & should remember the current position
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
235
diff
changeset
|
70 |
|
606
40c7c2cf0797
[tabs] reuse the new set_cookie controller method
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
559
diff
changeset
|
71 |
@property |
40c7c2cf0797
[tabs] reuse the new set_cookie controller method
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
559
diff
changeset
|
72 |
def cookie_name(self): |
40c7c2cf0797
[tabs] reuse the new set_cookie controller method
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
559
diff
changeset
|
73 |
return str('%s_active_tab' % self.config.appid) |
40c7c2cf0797
[tabs] reuse the new set_cookie controller method
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
559
diff
changeset
|
74 |
|
485
0f830732be19
[tabs] provide a working tabs implementation, that lazy-loads tab content & should remember the current position
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
235
diff
changeset
|
75 |
def active_tab(self, tabs, default): |
917
51d5224b1698
[tabs] augment a bit the lazyview interface (very general now), tab groups are now marked per entity (thinking about the ?vid=primary case)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
606
diff
changeset
|
76 |
cookies = self.req.get_cookie() |
606
40c7c2cf0797
[tabs] reuse the new set_cookie controller method
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
559
diff
changeset
|
77 |
cookiename = self.cookie_name |
917
51d5224b1698
[tabs] augment a bit the lazyview interface (very general now), tab groups are now marked per entity (thinking about the ?vid=primary case)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
606
diff
changeset
|
78 |
activetab = cookies.get(cookiename) |
235
b43362d92a1d
rename to tabs.py
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents:
220
diff
changeset
|
79 |
if activetab is None: |
917
51d5224b1698
[tabs] augment a bit the lazyview interface (very general now), tab groups are now marked per entity (thinking about the ?vid=primary case)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
606
diff
changeset
|
80 |
cookies[cookiename] = default |
51d5224b1698
[tabs] augment a bit the lazyview interface (very general now), tab groups are now marked per entity (thinking about the ?vid=primary case)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
606
diff
changeset
|
81 |
self.req.set_cookie(cookies, cookiename) |
487
355356b781d7
[tabs] avoid nasty surprises when tab name change & the cookie remembers the past
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
485
diff
changeset
|
82 |
tab = default |
355356b781d7
[tabs] avoid nasty surprises when tab name change & the cookie remembers the past
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
485
diff
changeset
|
83 |
else: |
355356b781d7
[tabs] avoid nasty surprises when tab name change & the cookie remembers the past
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
485
diff
changeset
|
84 |
tab = activetab.value |
494
c47229797d0d
python 2.4 compat
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
490
diff
changeset
|
85 |
return tab in tabs and tab or default |
214
aaf2957bf69e
tabview is used to call each view for each tab
Laure Bourgois <Laure.Bourgois@logilab.fr>
parents:
diff
changeset
|
86 |
|
490
b84d64db2350
[tabs] prune tab set _before_ computing & setting 'active' tab
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
489
diff
changeset
|
87 |
def prune_tabs(self, tabs): |
b84d64db2350
[tabs] prune tab set _before_ computing & setting 'active' tab
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
489
diff
changeset
|
88 |
selected_tabs = [] |
b84d64db2350
[tabs] prune tab set _before_ computing & setting 'active' tab
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
489
diff
changeset
|
89 |
for tab in tabs: |
b84d64db2350
[tabs] prune tab set _before_ computing & setting 'active' tab
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
489
diff
changeset
|
90 |
try: |
510
6b92504d77c1
[tabs] improve pylint note :)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
504
diff
changeset
|
91 |
self.vreg.select_view(tab, self.req, self.rset) |
490
b84d64db2350
[tabs] prune tab set _before_ computing & setting 'active' tab
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
489
diff
changeset
|
92 |
selected_tabs.append(tab) |
b84d64db2350
[tabs] prune tab set _before_ computing & setting 'active' tab
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
489
diff
changeset
|
93 |
except NoSelectableObject: |
b84d64db2350
[tabs] prune tab set _before_ computing & setting 'active' tab
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
489
diff
changeset
|
94 |
continue |
b84d64db2350
[tabs] prune tab set _before_ computing & setting 'active' tab
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
489
diff
changeset
|
95 |
return selected_tabs |
b84d64db2350
[tabs] prune tab set _before_ computing & setting 'active' tab
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
489
diff
changeset
|
96 |
|
485
0f830732be19
[tabs] provide a working tabs implementation, that lazy-loads tab content & should remember the current position
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
235
diff
changeset
|
97 |
def render_tabs(self, tabs, default, entity): |
214
aaf2957bf69e
tabview is used to call each view for each tab
Laure Bourgois <Laure.Bourgois@logilab.fr>
parents:
diff
changeset
|
98 |
self.req.add_css('ui.tabs.css') |
522
385ce5e0b30b
cubicweb__loadurl -> cubicweb:lazyloadurl
sylvain.thenault@logilab.fr
parents:
510
diff
changeset
|
99 |
self.req.add_js(('ui.core.js', 'ui.tabs.js', |
385ce5e0b30b
cubicweb__loadurl -> cubicweb:lazyloadurl
sylvain.thenault@logilab.fr
parents:
510
diff
changeset
|
100 |
'cubicweb.ajax.js', 'cubicweb.tabs.js', 'cubicweb.lazy.js')) |
490
b84d64db2350
[tabs] prune tab set _before_ computing & setting 'active' tab
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
489
diff
changeset
|
101 |
# prune tabs : not all are to be shown |
b84d64db2350
[tabs] prune tab set _before_ computing & setting 'active' tab
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
489
diff
changeset
|
102 |
tabs = self.prune_tabs(tabs) |
b84d64db2350
[tabs] prune tab set _before_ computing & setting 'active' tab
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
489
diff
changeset
|
103 |
# select a tab |
485
0f830732be19
[tabs] provide a working tabs implementation, that lazy-loads tab content & should remember the current position
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
235
diff
changeset
|
104 |
active_tab = self.active_tab(tabs, default) |
214
aaf2957bf69e
tabview is used to call each view for each tab
Laure Bourgois <Laure.Bourgois@logilab.fr>
parents:
diff
changeset
|
105 |
# build the html structure |
235
b43362d92a1d
rename to tabs.py
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents:
220
diff
changeset
|
106 |
w = self.w |
917
51d5224b1698
[tabs] augment a bit the lazyview interface (very general now), tab groups are now marked per entity (thinking about the ?vid=primary case)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
606
diff
changeset
|
107 |
w(u'<div id="entity-tabs-%s">' % entity.eid) |
235
b43362d92a1d
rename to tabs.py
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents:
220
diff
changeset
|
108 |
w(u'<ul>') |
214
aaf2957bf69e
tabview is used to call each view for each tab
Laure Bourgois <Laure.Bourgois@logilab.fr>
parents:
diff
changeset
|
109 |
for tab in tabs: |
235
b43362d92a1d
rename to tabs.py
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents:
220
diff
changeset
|
110 |
w(u'<li>') |
b43362d92a1d
rename to tabs.py
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents:
220
diff
changeset
|
111 |
w(u'<a href="#as-%s">' % tab) |
606
40c7c2cf0797
[tabs] reuse the new set_cookie controller method
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
559
diff
changeset
|
112 |
w(u'<span onclick="set_tab(\'%s\', \'%s\')">' % (tab, self.cookie_name)) |
235
b43362d92a1d
rename to tabs.py
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents:
220
diff
changeset
|
113 |
w(self.req._(tab)) |
b43362d92a1d
rename to tabs.py
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents:
220
diff
changeset
|
114 |
w(u'</span>') |
b43362d92a1d
rename to tabs.py
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents:
220
diff
changeset
|
115 |
w(u'</a>') |
b43362d92a1d
rename to tabs.py
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents:
220
diff
changeset
|
116 |
w(u'</li>') |
b43362d92a1d
rename to tabs.py
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents:
220
diff
changeset
|
117 |
w(u'</ul>') |
b43362d92a1d
rename to tabs.py
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents:
220
diff
changeset
|
118 |
w(u'</div>') |
490
b84d64db2350
[tabs] prune tab set _before_ computing & setting 'active' tab
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
489
diff
changeset
|
119 |
for tab in tabs: |
485
0f830732be19
[tabs] provide a working tabs implementation, that lazy-loads tab content & should remember the current position
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
235
diff
changeset
|
120 |
w(u'<div id="as-%s">' % tab) |
917
51d5224b1698
[tabs] augment a bit the lazyview interface (very general now), tab groups are now marked per entity (thinking about the ?vid=primary case)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
606
diff
changeset
|
121 |
self.lazyview(tab, eid=entity.eid) |
485
0f830732be19
[tabs] provide a working tabs implementation, that lazy-loads tab content & should remember the current position
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
235
diff
changeset
|
122 |
w(u'</div>') |
543
c0f2b6378f70
simplification of lazy tabs mechanism
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
542
diff
changeset
|
123 |
# call the set_tab() JS function *after* each tab is generated |
c0f2b6378f70
simplification of lazy tabs mechanism
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
542
diff
changeset
|
124 |
# because the callback binding needs to be done before |
c0f2b6378f70
simplification of lazy tabs mechanism
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
542
diff
changeset
|
125 |
self.req.html_headers.add_onload(u""" |
917
51d5224b1698
[tabs] augment a bit the lazyview interface (very general now), tab groups are now marked per entity (thinking about the ?vid=primary case)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
606
diff
changeset
|
126 |
jQuery('#entity-tabs-%(eeid)s > ul').tabs( { selected: %(tabindex)s }); |
606
40c7c2cf0797
[tabs] reuse the new set_cookie controller method
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
559
diff
changeset
|
127 |
set_tab('%(vid)s', '%(cookiename)s'); |
40c7c2cf0797
[tabs] reuse the new set_cookie controller method
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
559
diff
changeset
|
128 |
""" % {'tabindex' : tabs.index(active_tab), |
40c7c2cf0797
[tabs] reuse the new set_cookie controller method
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
559
diff
changeset
|
129 |
'vid' : active_tab, |
917
51d5224b1698
[tabs] augment a bit the lazyview interface (very general now), tab groups are now marked per entity (thinking about the ?vid=primary case)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
606
diff
changeset
|
130 |
'eeid' : entity.eid, |
606
40c7c2cf0797
[tabs] reuse the new set_cookie controller method
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
559
diff
changeset
|
131 |
'cookiename' : self.cookie_name}) |
235
b43362d92a1d
rename to tabs.py
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents:
220
diff
changeset
|
132 |
|
489 | 133 |
|
498 | 134 |
class EntityRelatedTab(EntityView): |
489 | 135 |
"""A view you should inherit from leftmost, |
136 |
to wrap another actual view displaying entity related stuff. |
|
137 |
Such a view _must_ provide the rtype, target and vid attributes : |
|
138 |
||
139 |
Example : |
|
140 |
||
141 |
class ProjectScreenshotsView(EntityRelationView): |
|
542
46d4ff5aa917
use lgc.decorators.monkeypatch in tabs.py
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
522
diff
changeset
|
142 |
'''display project's screenshots''' |
489 | 143 |
id = title = _('projectscreenshots') |
144 |
accepts = ('Project',) |
|
145 |
rtype = 'screenshot' |
|
146 |
target = 'object' |
|
147 |
vid = 'gallery' |
|
148 |
__selectors__ = EntityRelationView.__selectors__ + (one_line_rset,) |
|
149 |
||
939 | 150 |
|
489 | 151 |
This is the view we want to have in a tab, only if there is something to show. |
152 |
Then, just define as below, and declare this being the tab content : |
|
153 |
||
917
51d5224b1698
[tabs] augment a bit the lazyview interface (very general now), tab groups are now marked per entity (thinking about the ?vid=primary case)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
606
diff
changeset
|
154 |
class ProjectScreenshotTab(EntityRelatedTab, ProjectScreenshotsView): |
489 | 155 |
id = 'screenshots_tab' |
156 |
""" |
|
838
f2c56312b03a
rename abstract_* selectors into partial_* + add docstrings
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
782
diff
changeset
|
157 |
__select__ = EntityView.__select__ & partial_has_related_entities() |
489 | 158 |
vid = 'list' |
885
b101d2ae80b4
no need for both EntityRelatedTab / EntityRelatedView which are doing the same thing
sylvain.thenault@logilab.fr
parents:
838
diff
changeset
|
159 |
|
489 | 160 |
def cell_call(self, row, col): |
542
46d4ff5aa917
use lgc.decorators.monkeypatch in tabs.py
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
522
diff
changeset
|
161 |
rset = self.entity(row, col).related(self.rtype, role(self)) |
489 | 162 |
self.w(u'<div class="mainInfo">') |
163 |
self.wview(self.vid, rset, 'noresult') |
|
164 |
self.w(u'</div>') |