web/views/tabs.py
changeset 3451 6b46d73823f5
parent 3408 c92170fca813
child 3460 e4843535db25
equal deleted inserted replaced
3448:495862266785 3451:6b46d73823f5
    22     caveat : lazyview is not recursive, i.e : you can't (successfully)
    22     caveat : lazyview is not recursive, i.e : you can't (successfully)
    23     lazyload a view that in turns does the same
    23     lazyload a view that in turns does the same
    24     """
    24     """
    25 
    25 
    26     def _prepare_bindings(self, vid, reloadable):
    26     def _prepare_bindings(self, vid, reloadable):
    27         self.req.add_onload(u"""
    27         self._cw.add_onload(u"""
    28   jQuery('#lazy-%(vid)s').bind('%(event)s', function(event) {
    28   jQuery('#lazy-%(vid)s').bind('%(event)s', function(event) {
    29      load_now('#lazy-%(vid)s', '#%(vid)s-hole', %(reloadable)s);
    29      load_now('#lazy-%(vid)s', '#%(vid)s-hole', %(reloadable)s);
    30   });""" % {'event': 'load_%s' % vid, 'vid': vid,
    30   });""" % {'event': 'load_%s' % vid, 'vid': vid,
    31             'reloadable' : str(reloadable).lower()})
    31             'reloadable' : str(reloadable).lower()})
    32 
    32 
    36         first version only support lazy viewing for an entity at a time
    36         first version only support lazy viewing for an entity at a time
    37         """
    37         """
    38         assert rql or eid or rset or static, \
    38         assert rql or eid or rset or static, \
    39             'lazyview wants at least : rql, or an eid, or an rset -- or call it with static=True'
    39             'lazyview wants at least : rql, or an eid, or an rset -- or call it with static=True'
    40         w = w or self.w
    40         w = w or self.w
    41         self.req.add_js('cubicweb.lazy.js')
    41         self._cw.add_js('cubicweb.lazy.js')
    42         urlparams = {'vid' : vid, 'fname' : 'view'}
    42         urlparams = {'vid' : vid, 'fname' : 'view'}
    43         if rql:
    43         if rql:
    44             urlparams['rql'] = rql
    44             urlparams['rql'] = rql
    45         elif eid:
    45         elif eid:
    46             urlparams['rql'] = uilib.rql_for_eid(eid)
    46             urlparams['rql'] = uilib.rql_for_eid(eid)
    48             urlparams['rql'] = rset.printable_rql()
    48             urlparams['rql'] = rset.printable_rql()
    49         w(u'<div id="lazy-%s" cubicweb:loadurl="%s">' % (
    49         w(u'<div id="lazy-%s" cubicweb:loadurl="%s">' % (
    50             vid, xml_escape(self.build_url('json', **urlparams))))
    50             vid, xml_escape(self.build_url('json', **urlparams))))
    51         if show_spinbox:
    51         if show_spinbox:
    52             w(u'<img src="data/loading.gif" id="%s-hole" alt="%s"/>'
    52             w(u'<img src="data/loading.gif" id="%s-hole" alt="%s"/>'
    53               % (vid, self.req._('loading')))
    53               % (vid, self._cw._('loading')))
    54         w(u'</div>')
    54         w(u'</div>')
    55         self._prepare_bindings(vid, reloadable)
    55         self._prepare_bindings(vid, reloadable)
    56 
    56 
    57     def forceview(self, vid):
    57     def forceview(self, vid):
    58         """trigger an event that will force immediate loading of the view
    58         """trigger an event that will force immediate loading of the view
    59         on dom readyness
    59         on dom readyness
    60         """
    60         """
    61         self.req.add_js('cubicweb.lazy.js')
    61         self._cw.add_js('cubicweb.lazy.js')
    62         self.req.add_onload("trigger_load('%s');" % vid)
    62         self._cw.add_onload("trigger_load('%s');" % vid)
    63 
    63 
    64 
    64 
    65 class TabsMixin(LazyViewMixin):
    65 class TabsMixin(LazyViewMixin):
    66     """a tab mixin
    66     """a tab mixin
    67     """
    67     """
    68 
    68 
    69     @property
    69     @property
    70     def cookie_name(self):
    70     def cookie_name(self):
    71         return str('%s_active_tab' % self.config.appid)
    71         return str('%s_active_tab' % self._cw.config.appid)
    72 
    72 
    73     def active_tab(self, tabs, default):
    73     def active_tab(self, tabs, default):
    74         formtab = self.req.form.get('tab')
    74         formtab = self._cw.form.get('tab')
    75         if formtab in tabs:
    75         if formtab in tabs:
    76             return formtab
    76             return formtab
    77         cookies = self.req.get_cookie()
    77         cookies = self._cw.get_cookie()
    78         cookiename = self.cookie_name
    78         cookiename = self.cookie_name
    79         activetab = cookies.get(cookiename)
    79         activetab = cookies.get(cookiename)
    80         if activetab is None:
    80         if activetab is None:
    81             cookies[cookiename] = default
    81             cookies[cookiename] = default
    82             self.req.set_cookie(cookies, cookiename)
    82             self._cw.set_cookie(cookies, cookiename)
    83             tab = default
    83             tab = default
    84         else:
    84         else:
    85             tab = activetab.value
    85             tab = activetab.value
    86         return tab in tabs and tab or default
    86         return tab in tabs and tab or default
    87 
    87 
    88     def prune_tabs(self, tabs):
    88     def prune_tabs(self, tabs):
    89         selected_tabs = []
    89         selected_tabs = []
    90         for tab in tabs:
    90         for tab in tabs:
    91             try:
    91             try:
    92                 self.vreg['views'].select(tab, self.req, rset=self.rset)
    92                 self._cw.vreg['views'].select(tab, self._cw, rset=self.cw_rset)
    93                 selected_tabs.append(tab)
    93                 selected_tabs.append(tab)
    94             except NoSelectableObject:
    94             except NoSelectableObject:
    95                 continue
    95                 continue
    96         return selected_tabs
    96         return selected_tabs
    97 
    97 
    98     def render_tabs(self, tabs, default, entity=None):
    98     def render_tabs(self, tabs, default, entity=None):
    99         # delegate to the default tab if there is more than one entity
    99         # delegate to the default tab if there is more than one entity
   100         # in the result set (tabs are pretty useless there)
   100         # in the result set (tabs are pretty useless there)
   101         if entity and len(self.rset) > 1:
   101         if entity and len(self.cw_rset) > 1:
   102             entity.view(default, w=self.w)
   102             entity.view(default, w=self.w)
   103             return
   103             return
   104         self.req.add_css('ui.tabs.css')
   104         self._cw.add_css('ui.tabs.css')
   105         self.req.add_js(('ui.core.js', 'ui.tabs.js',
   105         self._cw.add_js(('ui.core.js', 'ui.tabs.js',
   106                          'cubicweb.ajax.js', 'cubicweb.tabs.js', 'cubicweb.lazy.js'))
   106                          'cubicweb.ajax.js', 'cubicweb.tabs.js', 'cubicweb.lazy.js'))
   107         # prune tabs : not all are to be shown
   107         # prune tabs : not all are to be shown
   108         tabs = self.prune_tabs(tabs)
   108         tabs = self.prune_tabs(tabs)
   109         # select a tab
   109         # select a tab
   110         active_tab = self.active_tab(tabs, default)
   110         active_tab = self.active_tab(tabs, default)
   115         w(u'<ul>')
   115         w(u'<ul>')
   116         for tab in tabs:
   116         for tab in tabs:
   117             w(u'<li>')
   117             w(u'<li>')
   118             w(u'<a href="#%s">' % tab)
   118             w(u'<a href="#%s">' % tab)
   119             w(u'<span onclick="set_tab(\'%s\', \'%s\')">' % (tab, self.cookie_name))
   119             w(u'<span onclick="set_tab(\'%s\', \'%s\')">' % (tab, self.cookie_name))
   120             w(self.req._(tab))
   120             w(self._cw._(tab))
   121             w(u'</span>')
   121             w(u'</span>')
   122             w(u'</a>')
   122             w(u'</a>')
   123             w(u'</li>')
   123             w(u'</li>')
   124         w(u'</ul>')
   124         w(u'</ul>')
   125         w(u'</div>')
   125         w(u'</div>')
   131                 self.lazyview(tab, static=True)
   131                 self.lazyview(tab, static=True)
   132             w(u'</div>')
   132             w(u'</div>')
   133         # call the set_tab() JS function *after* each tab is generated
   133         # call the set_tab() JS function *after* each tab is generated
   134         # because the callback binding needs to be done before
   134         # because the callback binding needs to be done before
   135         # XXX make work history: true
   135         # XXX make work history: true
   136         self.req.add_onload(u"""
   136         self._cw.add_onload(u"""
   137   jQuery('#entity-tabs-%(eeid)s > ul').tabs( { selected: %(tabindex)s });
   137   jQuery('#entity-tabs-%(eeid)s > ul').tabs( { selected: %(tabindex)s });
   138   set_tab('%(vid)s', '%(cookiename)s');
   138   set_tab('%(vid)s', '%(cookiename)s');
   139 """ % {'tabindex'   : tabs.index(active_tab),
   139 """ % {'tabindex'   : tabs.index(active_tab),
   140        'vid'        : active_tab,
   140        'vid'        : active_tab,
   141        'eeid'       : (entity and entity.eid or uid),
   141        'eeid'       : (entity and entity.eid or uid),
   162     """
   162     """
   163     __select__ = EntityView.__select__ & partial_has_related_entities()
   163     __select__ = EntityView.__select__ & partial_has_related_entities()
   164     vid = 'list'
   164     vid = 'list'
   165 
   165 
   166     def cell_call(self, row, col):
   166     def cell_call(self, row, col):
   167         rset = self.rset.get_entity(row, col).related(self.rtype, role(self))
   167         rset = self.cw_rset.get_entity(row, col).related(self.rtype, role(self))
   168         self.w(u'<div class="mainInfo">')
   168         self.w(u'<div class="mainInfo">')
   169         if self.title:
   169         if self.title:
   170             self.w(tags.h1(self.req._(self.title)))
   170             self.w(tags.h1(self._cw._(self.title)))
   171         self.wview(self.vid, rset, 'noresult')
   171         self.wview(self.vid, rset, 'noresult')
   172         self.w(u'</div>')
   172         self.w(u'</div>')