# HG changeset patch # User Aurelien Campeas # Date 1234374432 -3600 # Node ID 1a23781534a2bc905bd3e6b6cd1f876bfeb43978 # Parent e85042d18b488db20a1ee352243630b661a907b4# Parent a9e65aff304998764108bed8abafd5e72c630370 merge diff -r a9e65aff3049 -r 1a23781534a2 web/data/cubicweb.preferences.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/data/cubicweb.preferences.js Wed Feb 11 18:47:12 2009 +0100 @@ -0,0 +1,10 @@ +/* toggle visibility of an element by its id + * & set current visibility status in a cookie + * XXX whenever used outside of preferences, don't forget to + * move me in a more appropriate place + */ +function toggle_and_remember_visibility(elemId, cookiename) { + jqNode(elemId).toggleClass('hidden'); + async_remote_exec('set_cookie', cookiename, + jQuery('#' + elemId).attr('class')); +} diff -r a9e65aff3049 -r 1a23781534a2 web/views/basecontrollers.py --- a/web/views/basecontrollers.py Wed Feb 11 18:22:22 2009 +0100 +++ b/web/views/basecontrollers.py Wed Feb 11 18:47:12 2009 +0100 @@ -452,7 +452,14 @@ # link the new entity to the main entity rql = 'SET F %(rel)s T WHERE F eid %(eid_to)s, T eid %(eid_from)s' % {'rel' : rel, 'eid_to' : eid_to, 'eid_from' : eid_from} return eid_from - + + def js_set_cookie(self, cookiename, cookievalue): + # XXX we should consider jQuery.Cookie + cookiename, cookievalue = str(cookiename), str(cookievalue) + cookies = self.req.get_cookie() + cookies[cookiename] = cookievalue + self.req.set_cookie(cookies, cookiename) + class SendMailController(Controller): id = 'sendmail' require_groups = ('managers', 'users') diff -r a9e65aff3049 -r 1a23781534a2 web/views/management.py --- a/web/views/management.py Wed Feb 11 18:22:22 2009 +0100 +++ b/web/views/management.py Wed Feb 11 18:47:12 2009 +0100 @@ -13,17 +13,16 @@ from cubicweb.common.utils import UStringIO from cubicweb.common.view import AnyRsetView, StartupView, EntityView -from cubicweb.common.uilib import (html_traceback, rest_traceback, html_escape, - toggle_link) +from cubicweb.common.uilib import html_traceback, rest_traceback from cubicweb.common.selectors import (yes, one_line_rset, - accept_rset, none_rset, - chainfirst, chainall) + accept_rset, none_rset, + chainfirst, chainall) from cubicweb.web import INTERNAL_FIELD_VALUE, eid_param, stdmsgs from cubicweb.web.widgets import StaticComboBoxWidget from cubicweb.web.form import FormMixIn _ = unicode - + def begin_form(w, entity, redirectvid, redirectpath=None, msg=None): w(u'
\n' % entity.req.build_url('edit')) w(u'
\n') @@ -42,10 +41,10 @@ """display security information for a given entity""" id = 'security' title = _('security') - + def cell_call(self, row, col): - self.req.add_js('cubicweb.edition.js') - self.req.add_css('cubicweb.acl.css') + self.req.add_js('cubicweb.edition.js') + self.req.add_css('cubicweb.acl.css') entity = self.entity(row, col) w = self.w _ = self.req._ @@ -90,7 +89,7 @@ w(u'%s' % u'
'.join(expr.expression for expr in rqlexprs)) w(u'\n') w(u'') - + def owned_by_edit_form(self, entity): self.w('

%s

' % self.req._('ownership')) begin_form(self.w, entity, 'security', msg= _('ownerships have been changed')) @@ -169,7 +168,7 @@ wdg = newperm.get_widget('label') w(u'%s\n' % wdg.edit_render(newperm)) wdg = newperm.get_widget('require_group') - w(u'%s\n' % wdg.edit_render(newperm)) + w(u'%s\n' % wdg.edit_render(newperm)) w(u'%s\n' % self.button_ok()) w(u'') w(u'
\n') @@ -178,12 +177,12 @@ return (u'' % self.req._(stdmsgs.BUTTON_OK)) - + class ErrorView(AnyRsetView): """default view when no result has been found""" __selectors__ = (yes,) id = 'error' - + def page_title(self): """returns a title according to the result set - used for the title in the HTML header @@ -192,11 +191,11 @@ def call(self): req = self.req.reset_headers() - _ = req._ + _ = req._; w = self.w ex = req.data.get('ex')#_("unable to find exception information")) excinfo = req.data.get('excinfo') title = _('an error occured') - self.w(u'

%s

' % title) + w(u'

%s

' % title) if 'errmsg' in req.data: ex = req.data['errmsg'] exclass = None @@ -205,53 +204,53 @@ ex = exc_message(ex, req.encoding) if excinfo is not None and self.config['print-traceback']: if exclass is None: - self.w(u'
%s
' + w(u'
%s
' % html_escape(ex).replace("\n","
")) else: - self.w(u'
%s: %s
' + w(u'
%s: %s
' % (exclass, html_escape(ex).replace("\n","
"))) - self.w(u'
') - self.w(u'
%s
' % html_traceback(excinfo, ex, '')) + w(u'
') + w(u'
%s
' % html_traceback(excinfo, ex, '')) else: - self.w(u'
%s
' % (html_escape(ex).replace("\n","
"))) + w(u'
%s
' % (html_escape(ex).replace("\n","
"))) # if excinfo is not None, it's probably not a bug if excinfo is None: return vcconf = self.config.vc_config() - self.w(u"
") + w(u"
") eversion = vcconf.get('cubicweb', _('no version information')) # NOTE: tuple wrapping needed since eversion is itself a tuple - self.w(u"CubicWeb version: %s
\n" % (eversion,)) + w(u"CubicWeb version: %s
\n" % (eversion,)) for pkg in self.config.cubes(): pkgversion = vcconf.get(pkg, _('no version information')) - self.w(u"Package %s version: %s
\n" % (pkg, pkgversion)) - self.w(u"
") + w(u"Package %s version: %s
\n" % (pkg, pkgversion)) + w(u"
") # creates a bug submission link if SUBMIT_URL is set submiturl = self.config['submit-url'] if submiturl: binfo = text_error_description(ex, excinfo, req, eversion, [(pkg, vcconf.get(pkg, _('no version information'))) for pkg in self.config.cubes()]) - self.w(u'
\n' % html_escape(submiturl)) - self.w(u'
\n') - self.w(u'' % html_escape(binfo)) - self.w(u'') - self.w(u'') - self.w(u'' % _('Submit bug report')) - self.w(u'
\n') - self.w(u'
\n') + w(u'
\n' % html_escape(submiturl)) + w(u'
\n') + w(u'' % html_escape(binfo)) + w(u'') + w(u'') + w(u'' % _('Submit bug report')) + w(u'
\n') + w(u'
\n') submitmail = self.config['submit-mail'] if submitmail: binfo = text_error_description(ex, excinfo, req, eversion, [(pkg, vcconf.get(pkg, _('no version information'))) for pkg in self.config.cubes()]) - self.w(u'
\n' % req.build_url('reportbug')) - self.w(u'
\n') - self.w(u'' % html_escape(binfo)) - self.w(u'') - self.w(u'' % _('Submit bug report by mail')) - self.w(u'
\n') - self.w(u'
\n') + w(u'
\n' % req.build_url('reportbug')) + w(u'
\n') + w(u'' % html_escape(binfo)) + w(u'') + w(u'' % _('Submit bug report by mail')) + w(u'
\n') + w(u'
\n') def exc_message(ex, encoding): @@ -262,7 +261,7 @@ return unicode(str(ex), encoding, 'replace') except: return unicode(repr(ex), encoding, 'replace') - + def text_error_description(ex, excinfo, req, eversion, cubes): binfo = rest_traceback(excinfo, html_escape(ex)) binfo += u'\n\n:URL: %s\n' % req.url() @@ -284,23 +283,45 @@ _('components') _('contentnavigation') + +def make_togglable_link(nodeid, label, cookiename, cookievalue): + """builds a HTML link that switches the visibility & remembers it""" + action = u"javascript: toggle_and_remember_visibility('%s', '%s', '%s')" % \ + (nodeid, cookiename, cookievalue) + return u'%s' % (action, label) + class SystemEpropertiesForm(FormMixIn, StartupView): controller = 'edit' id = 'systemepropertiesform' title = _('site configuration') require_groups = ('managers',) category = 'startupview' - + def linkable(self): return True - + def url(self): """return the url associated with this view. We can omit rql here""" return self.build_url('view', vid=self.id) - + + def _cookie_name_from_group(self, group): + return str('%s_property_%s' % (self.config.appid, group)) + + def _group_status(self, group, default=u'hidden'): + cookies = self.req.get_cookie() + cookiename = self._cookie_name_from_group(group) + cookie = cookies.get(cookiename) + if cookie is None: + cookies[cookiename] = default + self.req.set_cookie(cookies, cookiename, maxage=None) + status = default + else: + status = cookie.value + return status + def call(self, **kwargs): """The default view representing the application's index""" - self.req.add_js('cubicweb.edition.js') + self.req.add_js(('cubicweb.edition.js', 'cubicweb.preferences.js')) self.req.add_css('cubicweb.preferences.css') vreg = self.vreg values = self.defined_keys @@ -322,7 +343,7 @@ for group, objects in groupedopts.items(): for oid, keys in objects.items(): groupedopts[group][oid] = self.form(keys, True) - + w = self.w req = self.req _ = req._ @@ -330,17 +351,23 @@ w(self.error_message()) for label, group, form in sorted((_(g), g, f) for g, f in mainopts.iteritems()): + status = self._group_status(group) #hidden, or not ? w(u'

%s

\n' % - (toggle_link('fieldset_' + group, label))) - w(u'