author | Adrien Di Mascio <Adrien.DiMascio@logilab.fr> |
Fri, 27 Aug 2010 13:44:55 +0200 | |
branch | stable |
changeset 6165 | 7da7c270bbbd |
parent 6083 | 8d69ef5f086a |
child 6193 | a58097ee4f15 |
permissions | -rw-r--r-- |
5421
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5370
diff
changeset
|
1 |
# copyright 2003-2010 LOGILAB S.A. (Paris, FRANCE), all rights reserved. |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5370
diff
changeset
|
2 |
# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5370
diff
changeset
|
3 |
# |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5370
diff
changeset
|
4 |
# This file is part of CubicWeb. |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5370
diff
changeset
|
5 |
# |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5370
diff
changeset
|
6 |
# CubicWeb is free software: you can redistribute it and/or modify it under the |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5370
diff
changeset
|
7 |
# terms of the GNU Lesser General Public License as published by the Free |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5370
diff
changeset
|
8 |
# Software Foundation, either version 2.1 of the License, or (at your option) |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5370
diff
changeset
|
9 |
# any later version. |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5370
diff
changeset
|
10 |
# |
5424
8ecbcbff9777
replace logilab-common by CubicWeb in disclaimer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5421
diff
changeset
|
11 |
# CubicWeb is distributed in the hope that it will be useful, but WITHOUT |
5421
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5370
diff
changeset
|
12 |
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5370
diff
changeset
|
13 |
# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5370
diff
changeset
|
14 |
# details. |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5370
diff
changeset
|
15 |
# |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5370
diff
changeset
|
16 |
# You should have received a copy of the GNU Lesser General Public License along |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5370
diff
changeset
|
17 |
# with CubicWeb. If not, see <http://www.gnu.org/licenses/>. |
235
b43362d92a1d
rename to tabs.py
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents:
220
diff
changeset
|
18 |
"""base classes to handle tabbed views |
b43362d92a1d
rename to tabs.py
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents:
220
diff
changeset
|
19 |
|
b43362d92a1d
rename to tabs.py
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents:
220
diff
changeset
|
20 |
""" |
b43362d92a1d
rename to tabs.py
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents:
220
diff
changeset
|
21 |
|
b43362d92a1d
rename to tabs.py
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents:
220
diff
changeset
|
22 |
__docformat__ = "restructuredtext en" |
b43362d92a1d
rename to tabs.py
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents:
220
diff
changeset
|
23 |
|
4602
fe5aad04f08b
proper deprecation of TabedPrimaryView
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4601
diff
changeset
|
24 |
from logilab.common.deprecation import class_renamed |
2312
af4d8f75c5db
use xml_escape
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2264
diff
changeset
|
25 |
from logilab.mtconverter import xml_escape |
214
aaf2957bf69e
tabview is used to call each view for each tab
Laure Bourgois <Laure.Bourgois@logilab.fr>
parents:
diff
changeset
|
26 |
|
235
b43362d92a1d
rename to tabs.py
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents:
220
diff
changeset
|
27 |
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
|
28 |
from cubicweb.selectors import partial_has_related_entities |
981
d86d1ee3b60e
fix some imports, update treeview for 3.2
sylvain.thenault@logilab.fr
parents:
940
diff
changeset
|
29 |
from cubicweb.view import EntityView |
4023
eae23c40627a
drop common subpackage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3998
diff
changeset
|
30 |
from cubicweb import tags, uilib |
1997
554eb4dd533d
[views] get tabs to work with startup views
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
1977
diff
changeset
|
31 |
from cubicweb.utils import make_uid |
3570
c31de6ea6984
[tabs] some convenience classes for tabbed views
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3569
diff
changeset
|
32 |
from cubicweb.web.views import primary |
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
|
33 |
|
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
|
34 |
class LazyViewMixin(object): |
510
6b92504d77c1
[tabs] improve pylint note :)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
504
diff
changeset
|
35 |
"""provides two convenience methods for the tab machinery |
6b92504d77c1
[tabs] improve pylint note :)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
504
diff
changeset
|
36 |
can also be used to lazy-load arbitrary views |
6b92504d77c1
[tabs] improve pylint note :)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
504
diff
changeset
|
37 |
""" |
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
|
38 |
|
559
7cfd3d11edc8
[tabs] prepare for reloadability
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
547
diff
changeset
|
39 |
def _prepare_bindings(self, vid, reloadable): |
3451
6b46d73823f5
[api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3408
diff
changeset
|
40 |
self._cw.add_onload(u""" |
559
7cfd3d11edc8
[tabs] prepare for reloadability
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
547
diff
changeset
|
41 |
jQuery('#lazy-%(vid)s').bind('%(event)s', function(event) { |
7cfd3d11edc8
[tabs] prepare for reloadability
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
547
diff
changeset
|
42 |
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
|
43 |
});""" % {'event': 'load_%s' % vid, 'vid': vid, |
7cfd3d11edc8
[tabs] prepare for reloadability
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
547
diff
changeset
|
44 |
'reloadable' : str(reloadable).lower()}) |
7cfd3d11edc8
[tabs] prepare for reloadability
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
547
diff
changeset
|
45 |
|
3569
89a60802711b
[tabs] refactor to more tab control
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3209
diff
changeset
|
46 |
def lazyview(self, vid, rql=None, eid=None, rset=None, tabid=None, |
1000
90705536b7c8
[tabs] from rev 917 - got lost in a merge
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
999
diff
changeset
|
47 |
reloadable=False, show_spinbox=True, w=None): |
5151
2f70fa8b6854
[doc/book] expand the js chapter with an ajax story
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
4727
diff
changeset
|
48 |
""" a lazy version of wview """ |
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
|
49 |
w = w or self.w |
3451
6b46d73823f5
[api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3408
diff
changeset
|
50 |
self._cw.add_js('cubicweb.lazy.js') |
1498
2c6eec0b46b9
fix imports, cleanup, repair some ajax calls
sylvain.thenault@logilab.fr
parents:
1477
diff
changeset
|
51 |
urlparams = {'vid' : vid, 'fname' : 'view'} |
1000
90705536b7c8
[tabs] from rev 917 - got lost in a merge
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
999
diff
changeset
|
52 |
if rql: |
90705536b7c8
[tabs] from rev 917 - got lost in a merge
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
999
diff
changeset
|
53 |
urlparams['rql'] = rql |
90705536b7c8
[tabs] from rev 917 - got lost in a merge
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
999
diff
changeset
|
54 |
elif eid: |
1135 | 55 |
urlparams['rql'] = uilib.rql_for_eid(eid) |
1000
90705536b7c8
[tabs] from rev 917 - got lost in a merge
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
999
diff
changeset
|
56 |
elif rset: |
90705536b7c8
[tabs] from rev 917 - got lost in a merge
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
999
diff
changeset
|
57 |
urlparams['rql'] = rset.printable_rql() |
6083
8d69ef5f086a
[tabs] take care, vid may not be a valid dom id (for jQuery at least)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5877
diff
changeset
|
58 |
if tabid is None: |
8d69ef5f086a
[tabs] take care, vid may not be a valid dom id (for jQuery at least)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5877
diff
changeset
|
59 |
tabid = uilib.domid(vid) |
543
c0f2b6378f70
simplification of lazy tabs mechanism
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
542
diff
changeset
|
60 |
w(u'<div id="lazy-%s" cubicweb:loadurl="%s">' % ( |
6083
8d69ef5f086a
[tabs] take care, vid may not be a valid dom id (for jQuery at least)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5877
diff
changeset
|
61 |
tabid, xml_escape(self._cw.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
|
62 |
if show_spinbox: |
522
385ce5e0b30b
cubicweb__loadurl -> cubicweb:lazyloadurl
sylvain.thenault@logilab.fr
parents:
510
diff
changeset
|
63 |
w(u'<img src="data/loading.gif" id="%s-hole" alt="%s"/>' |
6083
8d69ef5f086a
[tabs] take care, vid may not be a valid dom id (for jQuery at least)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5877
diff
changeset
|
64 |
% (tabid, self._cw._('(loading ...)'))) |
5370
dc6f3247bfc2
[lazy view] give it a proper hole node in the no spinbox case
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
5151
diff
changeset
|
65 |
else: |
6083
8d69ef5f086a
[tabs] take care, vid may not be a valid dom id (for jQuery at least)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5877
diff
changeset
|
66 |
w(u'<div id="%s-hole"></div>' % tabid) |
4727
946a9db5405d
tabs/lazy views: provide a link for the no js user agents (lynx, blinds, google) #693670
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
4602
diff
changeset
|
67 |
w(u'<noscript><p><a class="style: hidden" id="seo-%s" href="%s">%s</a></p></noscript>' |
6083
8d69ef5f086a
[tabs] take care, vid may not be a valid dom id (for jQuery at least)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5877
diff
changeset
|
68 |
% (tabid, xml_escape(self._cw.build_url(**urlparams)), xml_escape('%s (%s)') % |
8d69ef5f086a
[tabs] take care, vid may not be a valid dom id (for jQuery at least)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5877
diff
changeset
|
69 |
(tabid, self._cw._('follow this link if javascript is deactivated')))) |
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
|
70 |
w(u'</div>') |
6083
8d69ef5f086a
[tabs] take care, vid may not be a valid dom id (for jQuery at least)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5877
diff
changeset
|
71 |
self._prepare_bindings(tabid, 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
|
72 |
|
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
|
73 |
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
|
74 |
"""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
|
75 |
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
|
76 |
""" |
3451
6b46d73823f5
[api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3408
diff
changeset
|
77 |
self._cw.add_js('cubicweb.lazy.js') |
6b46d73823f5
[api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3408
diff
changeset
|
78 |
self._cw.add_onload("trigger_load('%s');" % vid) |
543
c0f2b6378f70
simplification of lazy tabs mechanism
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
542
diff
changeset
|
79 |
|
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
|
80 |
|
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
|
81 |
class TabsMixin(LazyViewMixin): |
1079
452cb76fe07a
backport typo fix
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
1000
diff
changeset
|
82 |
"""a tab mixin |
452cb76fe07a
backport typo fix
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
1000
diff
changeset
|
83 |
""" |
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
|
84 |
|
606
40c7c2cf0797
[tabs] reuse the new set_cookie controller method
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
559
diff
changeset
|
85 |
@property |
40c7c2cf0797
[tabs] reuse the new set_cookie controller method
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
559
diff
changeset
|
86 |
def cookie_name(self): |
4085
002ba2a3bb13
api update again
Sandrine Ribeau <sandrine.ribeau@logilab.fr>
parents:
4023
diff
changeset
|
87 |
return str('%s_active_tab' % self._cw.vreg.config.appid) |
606
40c7c2cf0797
[tabs] reuse the new set_cookie controller method
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
559
diff
changeset
|
88 |
|
3569
89a60802711b
[tabs] refactor to more tab control
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3209
diff
changeset
|
89 |
def active_tab(self, default): |
3589 | 90 |
if 'tab' in self._cw.form: |
91 |
return self._cw.form['tab'] |
|
3451
6b46d73823f5
[api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3408
diff
changeset
|
92 |
cookies = self._cw.get_cookie() |
606
40c7c2cf0797
[tabs] reuse the new set_cookie controller method
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
559
diff
changeset
|
93 |
cookiename = self.cookie_name |
1000
90705536b7c8
[tabs] from rev 917 - got lost in a merge
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
999
diff
changeset
|
94 |
activetab = cookies.get(cookiename) |
235
b43362d92a1d
rename to tabs.py
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents:
220
diff
changeset
|
95 |
if activetab is None: |
6083
8d69ef5f086a
[tabs] take care, vid may not be a valid dom id (for jQuery at least)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5877
diff
changeset
|
96 |
domid = uilib.domid(default) |
8d69ef5f086a
[tabs] take care, vid may not be a valid dom id (for jQuery at least)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5877
diff
changeset
|
97 |
cookies[cookiename] = domid |
3451
6b46d73823f5
[api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3408
diff
changeset
|
98 |
self._cw.set_cookie(cookies, cookiename) |
6083
8d69ef5f086a
[tabs] take care, vid may not be a valid dom id (for jQuery at least)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5877
diff
changeset
|
99 |
return domid |
3569
89a60802711b
[tabs] refactor to more tab control
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3209
diff
changeset
|
100 |
return activetab.value |
214
aaf2957bf69e
tabview is used to call each view for each tab
Laure Bourgois <Laure.Bourgois@logilab.fr>
parents:
diff
changeset
|
101 |
|
3569
89a60802711b
[tabs] refactor to more tab control
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3209
diff
changeset
|
102 |
def prune_tabs(self, tabs, default_tab): |
490
b84d64db2350
[tabs] prune tab set _before_ computing & setting 'active' tab
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
489
diff
changeset
|
103 |
selected_tabs = [] |
3569
89a60802711b
[tabs] refactor to more tab control
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3209
diff
changeset
|
104 |
may_be_active_tab = self.active_tab(default_tab) |
6083
8d69ef5f086a
[tabs] take care, vid may not be a valid dom id (for jQuery at least)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5877
diff
changeset
|
105 |
active_tab = uilib.domid(default_tab) |
3589 | 106 |
viewsvreg = self._cw.vreg['views'] |
490
b84d64db2350
[tabs] prune tab set _before_ computing & setting 'active' tab
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
489
diff
changeset
|
107 |
for tab in tabs: |
b84d64db2350
[tabs] prune tab set _before_ computing & setting 'active' tab
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
489
diff
changeset
|
108 |
try: |
3569
89a60802711b
[tabs] refactor to more tab control
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3209
diff
changeset
|
109 |
tabid, tabkwargs = tab |
89a60802711b
[tabs] refactor to more tab control
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3209
diff
changeset
|
110 |
tabkwargs = tabkwargs.copy() |
89a60802711b
[tabs] refactor to more tab control
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3209
diff
changeset
|
111 |
except ValueError: |
89a60802711b
[tabs] refactor to more tab control
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3209
diff
changeset
|
112 |
tabid, tabkwargs = tab, {} |
3733
c3feb6a33f58
remove some warnings
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3645
diff
changeset
|
113 |
tabkwargs.setdefault('rset', self.cw_rset) |
3569
89a60802711b
[tabs] refactor to more tab control
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3209
diff
changeset
|
114 |
vid = tabkwargs.get('vid', tabid) |
6083
8d69ef5f086a
[tabs] take care, vid may not be a valid dom id (for jQuery at least)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5877
diff
changeset
|
115 |
domid = uilib.domid(tabid) |
3569
89a60802711b
[tabs] refactor to more tab control
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3209
diff
changeset
|
116 |
try: |
3589 | 117 |
viewsvreg.select(vid, self._cw, **tabkwargs) |
490
b84d64db2350
[tabs] prune tab set _before_ computing & setting 'active' tab
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
489
diff
changeset
|
118 |
except NoSelectableObject: |
b84d64db2350
[tabs] prune tab set _before_ computing & setting 'active' tab
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
489
diff
changeset
|
119 |
continue |
6083
8d69ef5f086a
[tabs] take care, vid may not be a valid dom id (for jQuery at least)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5877
diff
changeset
|
120 |
selected_tabs.append((tabid, domid, tabkwargs)) |
8d69ef5f086a
[tabs] take care, vid may not be a valid dom id (for jQuery at least)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5877
diff
changeset
|
121 |
if domid == may_be_active_tab: |
8d69ef5f086a
[tabs] take care, vid may not be a valid dom id (for jQuery at least)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5877
diff
changeset
|
122 |
active_tab = domid |
3569
89a60802711b
[tabs] refactor to more tab control
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3209
diff
changeset
|
123 |
return selected_tabs, active_tab |
490
b84d64db2350
[tabs] prune tab set _before_ computing & setting 'active' tab
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
489
diff
changeset
|
124 |
|
1997
554eb4dd533d
[views] get tabs to work with startup views
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
1977
diff
changeset
|
125 |
def render_tabs(self, tabs, default, entity=None): |
2264 | 126 |
# delegate to the default tab if there is more than one entity |
127 |
# in the result set (tabs are pretty useless there) |
|
3451
6b46d73823f5
[api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3408
diff
changeset
|
128 |
if entity and len(self.cw_rset) > 1: |
1379
6c6dbc0df829
MUST NOT consider req.form['rql'] in a view, use len(rset) > 1 to detect if we can apply tabs or not
sylvain.thenault@logilab.fr
parents:
1112
diff
changeset
|
129 |
entity.view(default, w=self.w) |
6c6dbc0df829
MUST NOT consider req.form['rql'] in a view, use len(rset) > 1 to detect if we can apply tabs or not
sylvain.thenault@logilab.fr
parents:
1112
diff
changeset
|
130 |
return |
3451
6b46d73823f5
[api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3408
diff
changeset
|
131 |
self._cw.add_css('ui.tabs.css') |
6b46d73823f5
[api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3408
diff
changeset
|
132 |
self._cw.add_js(('ui.core.js', 'ui.tabs.js', |
522
385ce5e0b30b
cubicweb__loadurl -> cubicweb:lazyloadurl
sylvain.thenault@logilab.fr
parents:
510
diff
changeset
|
133 |
'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
|
134 |
# prune tabs : not all are to be shown |
3569
89a60802711b
[tabs] refactor to more tab control
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3209
diff
changeset
|
135 |
tabs, active_tab = self.prune_tabs(tabs, default) |
214
aaf2957bf69e
tabview is used to call each view for each tab
Laure Bourgois <Laure.Bourgois@logilab.fr>
parents:
diff
changeset
|
136 |
# build the html structure |
235
b43362d92a1d
rename to tabs.py
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents:
220
diff
changeset
|
137 |
w = self.w |
2386
b246d5cee44e
[tabs] backport entity-less support for tabs
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2383
diff
changeset
|
138 |
uid = entity and entity.eid or make_uid('tab') |
b246d5cee44e
[tabs] backport entity-less support for tabs
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2383
diff
changeset
|
139 |
w(u'<div id="entity-tabs-%s">' % uid) |
2673
9e639925ca2f
Backed out changeset 3e1d2ab5f8c0 (restore ui.tabs.js instead of jquery tools)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
2123
diff
changeset
|
140 |
w(u'<ul>') |
3569
89a60802711b
[tabs] refactor to more tab control
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3209
diff
changeset
|
141 |
active_tab_idx = None |
6083
8d69ef5f086a
[tabs] take care, vid may not be a valid dom id (for jQuery at least)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5877
diff
changeset
|
142 |
for i, (tabid, domid, tabkwargs) in enumerate(tabs): |
235
b43362d92a1d
rename to tabs.py
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents:
220
diff
changeset
|
143 |
w(u'<li>') |
6083
8d69ef5f086a
[tabs] take care, vid may not be a valid dom id (for jQuery at least)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5877
diff
changeset
|
144 |
w(u'<a href="#%s">' % domid) |
8d69ef5f086a
[tabs] take care, vid may not be a valid dom id (for jQuery at least)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5877
diff
changeset
|
145 |
w(u'<span onclick="set_tab(\'%s\', \'%s\')">' % (domid, self.cookie_name)) |
3589 | 146 |
w(tabkwargs.pop('label', self._cw._(tabid))) |
235
b43362d92a1d
rename to tabs.py
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents:
220
diff
changeset
|
147 |
w(u'</span>') |
b43362d92a1d
rename to tabs.py
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents:
220
diff
changeset
|
148 |
w(u'</a>') |
b43362d92a1d
rename to tabs.py
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents:
220
diff
changeset
|
149 |
w(u'</li>') |
6083
8d69ef5f086a
[tabs] take care, vid may not be a valid dom id (for jQuery at least)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5877
diff
changeset
|
150 |
if domid == active_tab: |
3569
89a60802711b
[tabs] refactor to more tab control
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3209
diff
changeset
|
151 |
active_tab_idx = i |
235
b43362d92a1d
rename to tabs.py
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents:
220
diff
changeset
|
152 |
w(u'</ul>') |
b43362d92a1d
rename to tabs.py
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents:
220
diff
changeset
|
153 |
w(u'</div>') |
6083
8d69ef5f086a
[tabs] take care, vid may not be a valid dom id (for jQuery at least)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5877
diff
changeset
|
154 |
for tabid, domid, tabkwargs in tabs: |
8d69ef5f086a
[tabs] take care, vid may not be a valid dom id (for jQuery at least)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5877
diff
changeset
|
155 |
w(u'<div id="%s">' % domid) |
8d69ef5f086a
[tabs] take care, vid may not be a valid dom id (for jQuery at least)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5877
diff
changeset
|
156 |
tabkwargs.setdefault('tabid', domid) |
3569
89a60802711b
[tabs] refactor to more tab control
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3209
diff
changeset
|
157 |
tabkwargs.setdefault('vid', tabid) |
3733
c3feb6a33f58
remove some warnings
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3645
diff
changeset
|
158 |
tabkwargs.setdefault('rset', self.cw_rset) |
3569
89a60802711b
[tabs] refactor to more tab control
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3209
diff
changeset
|
159 |
self.lazyview(**tabkwargs) |
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
|
160 |
w(u'</div>') |
543
c0f2b6378f70
simplification of lazy tabs mechanism
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
542
diff
changeset
|
161 |
# 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
|
162 |
# because the callback binding needs to be done before |
2383
96780c1e0c53
shrink a bit the tabs
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2381
diff
changeset
|
163 |
# XXX make work history: true |
3451
6b46d73823f5
[api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3408
diff
changeset
|
164 |
self._cw.add_onload(u""" |
2674
ff6114c2c416
merge (after jquery.tools backout)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
diff
changeset
|
165 |
jQuery('#entity-tabs-%(eeid)s > ul').tabs( { selected: %(tabindex)s }); |
6083
8d69ef5f086a
[tabs] take care, vid may not be a valid dom id (for jQuery at least)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5877
diff
changeset
|
166 |
set_tab('%(domid)s', '%(cookiename)s'); |
3569
89a60802711b
[tabs] refactor to more tab control
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3209
diff
changeset
|
167 |
""" % {'tabindex' : active_tab_idx, |
6083
8d69ef5f086a
[tabs] take care, vid may not be a valid dom id (for jQuery at least)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5877
diff
changeset
|
168 |
'domid' : active_tab, |
2674
ff6114c2c416
merge (after jquery.tools backout)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
diff
changeset
|
169 |
'eeid' : (entity and entity.eid or uid), |
ff6114c2c416
merge (after jquery.tools backout)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
diff
changeset
|
170 |
'cookiename' : self.cookie_name}) |
489 | 171 |
|
3026
17644247f0ff
fix emacs syntaxic colorization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2675
diff
changeset
|
172 |
|
982
ba5257deec7d
rename EntityRelatedTab into EntityRelationView, some fixes
sylvain.thenault@logilab.fr
parents:
981
diff
changeset
|
173 |
class EntityRelationView(EntityView): |
ba5257deec7d
rename EntityRelatedTab into EntityRelationView, some fixes
sylvain.thenault@logilab.fr
parents:
981
diff
changeset
|
174 |
"""view displaying entity related stuff. |
489 | 175 |
Such a view _must_ provide the rtype, target and vid attributes : |
176 |
||
177 |
Example : |
|
178 |
||
179 |
class ProjectScreenshotsView(EntityRelationView): |
|
542
46d4ff5aa917
use lgc.decorators.monkeypatch in tabs.py
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
522
diff
changeset
|
180 |
'''display project's screenshots''' |
3408
c92170fca813
[api] use __regid__ instead of deprecated id
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3230
diff
changeset
|
181 |
__regid__ = title = _('projectscreenshots') |
5877
0c7b7b76a84f
[selectors] provide a new, optimized, is_instance selector that should at some point replace implements (along with the adaptable selector)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5424
diff
changeset
|
182 |
__select__ = EntityRelationView.__select__ & is_instance('Project') |
489 | 183 |
rtype = 'screenshot' |
982
ba5257deec7d
rename EntityRelatedTab into EntityRelationView, some fixes
sylvain.thenault@logilab.fr
parents:
981
diff
changeset
|
184 |
role = 'subject' |
489 | 185 |
vid = 'gallery' |
186 |
||
3209
c2c8f88a4520
allow user to give ?tab=tabname and be set to the right tab (part of #345399)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3026
diff
changeset
|
187 |
in this example, entities related to project entity by the 'screenshot' |
982
ba5257deec7d
rename EntityRelatedTab into EntityRelationView, some fixes
sylvain.thenault@logilab.fr
parents:
981
diff
changeset
|
188 |
relation (where the project is subject of the relation) will be displayed |
ba5257deec7d
rename EntityRelatedTab into EntityRelationView, some fixes
sylvain.thenault@logilab.fr
parents:
981
diff
changeset
|
189 |
using the 'gallery' view. |
489 | 190 |
""" |
838
f2c56312b03a
rename abstract_* selectors into partial_* + add docstrings
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
782
diff
changeset
|
191 |
__select__ = EntityView.__select__ & partial_has_related_entities() |
489 | 192 |
vid = 'list' |
1802
d628defebc17
delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
1498
diff
changeset
|
193 |
|
489 | 194 |
def cell_call(self, row, col): |
3451
6b46d73823f5
[api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3408
diff
changeset
|
195 |
rset = self.cw_rset.get_entity(row, col).related(self.rtype, role(self)) |
489 | 196 |
self.w(u'<div class="mainInfo">') |
982
ba5257deec7d
rename EntityRelatedTab into EntityRelationView, some fixes
sylvain.thenault@logilab.fr
parents:
981
diff
changeset
|
197 |
if self.title: |
3451
6b46d73823f5
[api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3408
diff
changeset
|
198 |
self.w(tags.h1(self._cw._(self.title))) |
489 | 199 |
self.wview(self.vid, rset, 'noresult') |
200 |
self.w(u'</div>') |
|
3570
c31de6ea6984
[tabs] some convenience classes for tabbed views
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3569
diff
changeset
|
201 |
|
c31de6ea6984
[tabs] some convenience classes for tabbed views
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3569
diff
changeset
|
202 |
|
3929
9f314411cd04
[web] rename TabedPrimary to TabbedPrimary with backward compat
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
3849
diff
changeset
|
203 |
class TabbedPrimaryView(TabsMixin, primary.PrimaryView): |
3570
c31de6ea6984
[tabs] some convenience classes for tabbed views
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3569
diff
changeset
|
204 |
__abstract__ = True # don't register |
c31de6ea6984
[tabs] some convenience classes for tabbed views
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3569
diff
changeset
|
205 |
|
c31de6ea6984
[tabs] some convenience classes for tabbed views
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3569
diff
changeset
|
206 |
tabs = ['main_tab'] |
c31de6ea6984
[tabs] some convenience classes for tabbed views
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3569
diff
changeset
|
207 |
default_tab = 'main_tab' |
c31de6ea6984
[tabs] some convenience classes for tabbed views
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3569
diff
changeset
|
208 |
|
c31de6ea6984
[tabs] some convenience classes for tabbed views
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3569
diff
changeset
|
209 |
def cell_call(self, row, col): |
4237
87d9431243ad
3.6 api update
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4085
diff
changeset
|
210 |
entity = self.cw_rset.complete_entity(row, col) |
4601
0f65c40b56b5
missing call to toolbox in tabbed primary view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4252
diff
changeset
|
211 |
self.render_entity_toolbox(entity) |
3570
c31de6ea6984
[tabs] some convenience classes for tabbed views
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3569
diff
changeset
|
212 |
self.render_entity_title(entity) |
c31de6ea6984
[tabs] some convenience classes for tabbed views
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3569
diff
changeset
|
213 |
self.render_tabs(self.tabs, self.default_tab, entity) |
4602
fe5aad04f08b
proper deprecation of TabedPrimaryView
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4601
diff
changeset
|
214 |
|
fe5aad04f08b
proper deprecation of TabedPrimaryView
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4601
diff
changeset
|
215 |
TabedPrimaryView = class_renamed('TabedPrimaryView', TabbedPrimaryView) |
3570
c31de6ea6984
[tabs] some convenience classes for tabbed views
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3569
diff
changeset
|
216 |
|
c31de6ea6984
[tabs] some convenience classes for tabbed views
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3569
diff
changeset
|
217 |
class PrimaryTab(primary.PrimaryView): |
3645
7272b793d7c9
3.6 updates
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3589
diff
changeset
|
218 |
__regid__ = 'main_tab' |
3576
a9ed6f7cf2c2
set title to None so it doesn't appears in possible views
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3570
diff
changeset
|
219 |
title = None |
3570
c31de6ea6984
[tabs] some convenience classes for tabbed views
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3569
diff
changeset
|
220 |
|
c31de6ea6984
[tabs] some convenience classes for tabbed views
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3569
diff
changeset
|
221 |
def is_primary(self): |
c31de6ea6984
[tabs] some convenience classes for tabbed views
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3569
diff
changeset
|
222 |
return True |
c31de6ea6984
[tabs] some convenience classes for tabbed views
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3569
diff
changeset
|
223 |
|
c31de6ea6984
[tabs] some convenience classes for tabbed views
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3569
diff
changeset
|
224 |
def render_entity_title(self, entity): |
c31de6ea6984
[tabs] some convenience classes for tabbed views
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3569
diff
changeset
|
225 |
pass |
3845
596044fb7bc5
introduce render_entity_toolbox on default primary view to display components in the ctxtoolbar context, such as pdf icon, notification registration (nosylist)...
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3844
diff
changeset
|
226 |
def render_entity_toolbox(self, entity): |
3570
c31de6ea6984
[tabs] some convenience classes for tabbed views
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3569
diff
changeset
|
227 |
pass |