web/views/tabs.py
author Sylvain Thénault <sylvain.thenault@logilab.fr>
Thu, 10 Jun 2010 16:23:07 +0200
changeset 5715 2c3e83817a8e
parent 5424 8ecbcbff9777
child 5877 0c7b7b76a84f
permissions -rw-r--r--
[view] add a new entity_call method to entity view protocol, allowing some to work with not yet created entities. Also, start considering 'eid' form parameters where we only consider 'rql', so we can move on bloquing arbitrary rql inputs (more to do on this...)
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
00eb43688a57 pylint detected errors
sylvain.thenault@logilab.fr
parents: 1132
diff changeset
    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()
543
c0f2b6378f70 simplification of lazy tabs mechanism
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 542
diff changeset
    58
        w(u'<div id="lazy-%s" cubicweb:loadurl="%s">' % (
3589
a5432f99f2d9 backport stable branch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3460 3576
diff changeset
    59
            tabid or vid, 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
    60
        if show_spinbox:
522
385ce5e0b30b cubicweb__loadurl -> cubicweb:lazyloadurl
sylvain.thenault@logilab.fr
parents: 510
diff changeset
    61
            w(u'<img src="data/loading.gif" id="%s-hole" alt="%s"/>'
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
    62
              % (tabid or vid, 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
    63
        else:
dc6f3247bfc2 [lazy view] give it a proper hole node in the no spinbox case
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5151
diff changeset
    64
            w(u'<div id="%s-hole"></div>' % (tabid or vid))
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
    65
        w(u'<noscript><p><a class="style: hidden" id="seo-%s" href="%s">%s</a></p></noscript>'
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
    66
          % (tabid or vid, xml_escape(self._cw.build_url(**urlparams)), xml_escape('%s (%s)') %
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
             (tabid or vid, 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
    68
        w(u'</div>')
3569
89a60802711b [tabs] refactor to more tab control
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3209
diff changeset
    69
        self._prepare_bindings(tabid or 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
    70
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
    71
    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
    72
        """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
    73
        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
    74
        """
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3408
diff changeset
    75
        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
    76
        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
    77
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
    78
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
    79
class TabsMixin(LazyViewMixin):
1079
452cb76fe07a backport typo fix
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 1000
diff changeset
    80
    """a tab mixin
452cb76fe07a backport typo fix
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 1000
diff changeset
    81
    """
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
    82
606
40c7c2cf0797 [tabs] reuse the new set_cookie controller method
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 559
diff changeset
    83
    @property
40c7c2cf0797 [tabs] reuse the new set_cookie controller method
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 559
diff changeset
    84
    def cookie_name(self):
4085
002ba2a3bb13 api update again
Sandrine Ribeau <sandrine.ribeau@logilab.fr>
parents: 4023
diff changeset
    85
        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
    86
3569
89a60802711b [tabs] refactor to more tab control
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3209
diff changeset
    87
    def active_tab(self, default):
3589
a5432f99f2d9 backport stable branch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3460 3576
diff changeset
    88
        if 'tab' in self._cw.form:
a5432f99f2d9 backport stable branch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3460 3576
diff changeset
    89
            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
    90
        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
    91
        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
    92
        activetab = cookies.get(cookiename)
235
b43362d92a1d rename to tabs.py
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 220
diff changeset
    93
        if activetab is None:
1000
90705536b7c8 [tabs] from rev 917 - got lost in a merge
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 999
diff changeset
    94
            cookies[cookiename] = default
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3408
diff changeset
    95
            self._cw.set_cookie(cookies, cookiename)
3569
89a60802711b [tabs] refactor to more tab control
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3209
diff changeset
    96
            return default
89a60802711b [tabs] refactor to more tab control
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3209
diff changeset
    97
        return activetab.value
214
aaf2957bf69e tabview is used to call each view for each tab
Laure Bourgois <Laure.Bourgois@logilab.fr>
parents:
diff changeset
    98
3569
89a60802711b [tabs] refactor to more tab control
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3209
diff changeset
    99
    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
   100
        selected_tabs = []
3569
89a60802711b [tabs] refactor to more tab control
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3209
diff changeset
   101
        may_be_active_tab = self.active_tab(default_tab)
89a60802711b [tabs] refactor to more tab control
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3209
diff changeset
   102
        active_tab = default_tab
3589
a5432f99f2d9 backport stable branch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3460 3576
diff changeset
   103
        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
   104
        for tab in tabs:
b84d64db2350 [tabs] prune tab set _before_ computing & setting 'active' tab
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 489
diff changeset
   105
            try:
3569
89a60802711b [tabs] refactor to more tab control
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3209
diff changeset
   106
                tabid, tabkwargs = tab
89a60802711b [tabs] refactor to more tab control
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3209
diff changeset
   107
                tabkwargs = tabkwargs.copy()
89a60802711b [tabs] refactor to more tab control
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3209
diff changeset
   108
            except ValueError:
89a60802711b [tabs] refactor to more tab control
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3209
diff changeset
   109
                tabid, tabkwargs = tab, {}
3733
c3feb6a33f58 remove some warnings
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3645
diff changeset
   110
            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
   111
            vid = tabkwargs.get('vid', tabid)
89a60802711b [tabs] refactor to more tab control
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3209
diff changeset
   112
            try:
3589
a5432f99f2d9 backport stable branch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3460 3576
diff changeset
   113
                viewsvreg.select(vid, self._cw, **tabkwargs)
3569
89a60802711b [tabs] refactor to more tab control
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3209
diff changeset
   114
                selected_tabs.append((tabid, tabkwargs))
490
b84d64db2350 [tabs] prune tab set _before_ computing & setting 'active' tab
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 489
diff changeset
   115
            except NoSelectableObject:
b84d64db2350 [tabs] prune tab set _before_ computing & setting 'active' tab
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 489
diff changeset
   116
                continue
3569
89a60802711b [tabs] refactor to more tab control
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3209
diff changeset
   117
            if tabid == may_be_active_tab:
89a60802711b [tabs] refactor to more tab control
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3209
diff changeset
   118
                active_tab = tabid
89a60802711b [tabs] refactor to more tab control
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3209
diff changeset
   119
        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
   120
1997
554eb4dd533d [views] get tabs to work with startup views
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 1977
diff changeset
   121
    def render_tabs(self, tabs, default, entity=None):
2264
17b8a6ad58fc cleanup
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 2258
diff changeset
   122
        # delegate to the default tab if there is more than one entity
17b8a6ad58fc cleanup
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 2258
diff changeset
   123
        # 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
   124
        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
   125
            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
   126
            return
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3408
diff changeset
   127
        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
   128
        self._cw.add_js(('ui.core.js', 'ui.tabs.js',
522
385ce5e0b30b cubicweb__loadurl -> cubicweb:lazyloadurl
sylvain.thenault@logilab.fr
parents: 510
diff changeset
   129
                         '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
   130
        # 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
   131
        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
   132
        # build the html structure
235
b43362d92a1d rename to tabs.py
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 220
diff changeset
   133
        w = self.w
2386
b246d5cee44e [tabs] backport entity-less support for tabs
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 2383
diff changeset
   134
        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
   135
        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
   136
        w(u'<ul>')
3569
89a60802711b [tabs] refactor to more tab control
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3209
diff changeset
   137
        active_tab_idx = None
89a60802711b [tabs] refactor to more tab control
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3209
diff changeset
   138
        for i, (tabid, tabkwargs) in enumerate(tabs):
235
b43362d92a1d rename to tabs.py
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 220
diff changeset
   139
            w(u'<li>')
3569
89a60802711b [tabs] refactor to more tab control
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3209
diff changeset
   140
            w(u'<a href="#%s">' % tabid)
89a60802711b [tabs] refactor to more tab control
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3209
diff changeset
   141
            w(u'<span onclick="set_tab(\'%s\', \'%s\')">' % (tabid, self.cookie_name))
3589
a5432f99f2d9 backport stable branch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3460 3576
diff changeset
   142
            w(tabkwargs.pop('label', self._cw._(tabid)))
235
b43362d92a1d rename to tabs.py
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 220
diff changeset
   143
            w(u'</span>')
b43362d92a1d rename to tabs.py
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 220
diff changeset
   144
            w(u'</a>')
b43362d92a1d rename to tabs.py
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 220
diff changeset
   145
            w(u'</li>')
3569
89a60802711b [tabs] refactor to more tab control
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3209
diff changeset
   146
            if tabid == active_tab:
89a60802711b [tabs] refactor to more tab control
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3209
diff changeset
   147
                active_tab_idx = i
235
b43362d92a1d rename to tabs.py
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 220
diff changeset
   148
        w(u'</ul>')
b43362d92a1d rename to tabs.py
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 220
diff changeset
   149
        w(u'</div>')
3569
89a60802711b [tabs] refactor to more tab control
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3209
diff changeset
   150
        for tabid, tabkwargs in tabs:
89a60802711b [tabs] refactor to more tab control
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3209
diff changeset
   151
            w(u'<div id="%s">' % tabid)
89a60802711b [tabs] refactor to more tab control
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3209
diff changeset
   152
            tabkwargs.setdefault('tabid', tabid)
89a60802711b [tabs] refactor to more tab control
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3209
diff changeset
   153
            tabkwargs.setdefault('vid', tabid)
3733
c3feb6a33f58 remove some warnings
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3645
diff changeset
   154
            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
   155
            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
   156
            w(u'</div>')
543
c0f2b6378f70 simplification of lazy tabs mechanism
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 542
diff changeset
   157
        # 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
   158
        # 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
   159
        # 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
   160
        self._cw.add_onload(u"""
2674
ff6114c2c416 merge (after jquery.tools backout)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2386 2673
diff changeset
   161
  jQuery('#entity-tabs-%(eeid)s > ul').tabs( { selected: %(tabindex)s });
ff6114c2c416 merge (after jquery.tools backout)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2386 2673
diff changeset
   162
  set_tab('%(vid)s', '%(cookiename)s');
3569
89a60802711b [tabs] refactor to more tab control
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3209
diff changeset
   163
""" % {'tabindex'   : active_tab_idx,
2674
ff6114c2c416 merge (after jquery.tools backout)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2386 2673
diff changeset
   164
       'vid'        : active_tab,
ff6114c2c416 merge (after jquery.tools backout)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2386 2673
diff changeset
   165
       'eeid'       : (entity and entity.eid or uid),
ff6114c2c416 merge (after jquery.tools backout)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2386 2673
diff changeset
   166
       'cookiename' : self.cookie_name})
489
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 487
diff changeset
   167
3026
17644247f0ff fix emacs syntaxic colorization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2675
diff changeset
   168
982
ba5257deec7d rename EntityRelatedTab into EntityRelationView, some fixes
sylvain.thenault@logilab.fr
parents: 981
diff changeset
   169
class EntityRelationView(EntityView):
ba5257deec7d rename EntityRelatedTab into EntityRelationView, some fixes
sylvain.thenault@logilab.fr
parents: 981
diff changeset
   170
    """view displaying entity related stuff.
489
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 487
diff changeset
   171
    Such a view _must_ provide the rtype, target and vid attributes :
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 487
diff changeset
   172
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 487
diff changeset
   173
    Example :
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 487
diff changeset
   174
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 487
diff changeset
   175
    class ProjectScreenshotsView(EntityRelationView):
542
46d4ff5aa917 use lgc.decorators.monkeypatch in tabs.py
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 522
diff changeset
   176
        '''display project's screenshots'''
3408
c92170fca813 [api] use __regid__ instead of deprecated id
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3230
diff changeset
   177
        __regid__ = title = _('projectscreenshots')
982
ba5257deec7d rename EntityRelatedTab into EntityRelationView, some fixes
sylvain.thenault@logilab.fr
parents: 981
diff changeset
   178
        __select__ = EntityRelationView.__select__ & implements('Project')
489
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 487
diff changeset
   179
        rtype = 'screenshot'
982
ba5257deec7d rename EntityRelatedTab into EntityRelationView, some fixes
sylvain.thenault@logilab.fr
parents: 981
diff changeset
   180
        role = 'subject'
489
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 487
diff changeset
   181
        vid = 'gallery'
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 487
diff changeset
   182
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
   183
    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
   184
    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
   185
    using the 'gallery' view.
489
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 487
diff changeset
   186
    """
838
f2c56312b03a rename abstract_* selectors into partial_* + add docstrings
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 782
diff changeset
   187
    __select__ = EntityView.__select__ & partial_has_related_entities()
489
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 487
diff changeset
   188
    vid = 'list'
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1498
diff changeset
   189
489
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 487
diff changeset
   190
    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
   191
        rset = self.cw_rset.get_entity(row, col).related(self.rtype, role(self))
489
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 487
diff changeset
   192
        self.w(u'<div class="mainInfo">')
982
ba5257deec7d rename EntityRelatedTab into EntityRelationView, some fixes
sylvain.thenault@logilab.fr
parents: 981
diff changeset
   193
        if self.title:
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3408
diff changeset
   194
            self.w(tags.h1(self._cw._(self.title)))
489
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 487
diff changeset
   195
        self.wview(self.vid, rset, 'noresult')
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 487
diff changeset
   196
        self.w(u'</div>')
3570
c31de6ea6984 [tabs] some convenience classes for tabbed views
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3569
diff changeset
   197
c31de6ea6984 [tabs] some convenience classes for tabbed views
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3569
diff changeset
   198
3929
9f314411cd04 [web] rename TabedPrimary to TabbedPrimary with backward compat
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 3849
diff changeset
   199
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
   200
    __abstract__ = True # don't register
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
    tabs = ['main_tab']
c31de6ea6984 [tabs] some convenience classes for tabbed views
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3569
diff changeset
   203
    default_tab = 'main_tab'
c31de6ea6984 [tabs] some convenience classes for tabbed views
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3569
diff changeset
   204
c31de6ea6984 [tabs] some convenience classes for tabbed views
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3569
diff changeset
   205
    def cell_call(self, row, col):
4237
87d9431243ad 3.6 api update
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4085
diff changeset
   206
        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
   207
        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
   208
        self.render_entity_title(entity)
c31de6ea6984 [tabs] some convenience classes for tabbed views
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3569
diff changeset
   209
        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
   210
fe5aad04f08b proper deprecation of TabedPrimaryView
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4601
diff changeset
   211
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
   212
c31de6ea6984 [tabs] some convenience classes for tabbed views
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3569
diff changeset
   213
class PrimaryTab(primary.PrimaryView):
3645
7272b793d7c9 3.6 updates
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3589
diff changeset
   214
    __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
   215
    title = None
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
    def is_primary(self):
c31de6ea6984 [tabs] some convenience classes for tabbed views
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3569
diff changeset
   218
        return True
c31de6ea6984 [tabs] some convenience classes for tabbed views
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3569
diff changeset
   219
c31de6ea6984 [tabs] some convenience classes for tabbed views
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3569
diff changeset
   220
    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
   221
        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
   222
    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
   223
        pass