--- a/i18n/en.po Mon Apr 27 12:11:33 2009 +0200
+++ b/i18n/en.po Thu Apr 30 14:45:02 2009 +0200
@@ -1115,6 +1115,9 @@
msgid "click on the box to cancel the deletion"
msgstr ""
+msgid "close all"
+msgstr ""
+
msgid "comment"
msgstr ""
@@ -2143,6 +2146,18 @@
msgid "navigation"
msgstr ""
+msgid "navigation.combobox-limit"
+msgstr "\"related\" combo-box"
+
+msgid "navigation.page-size"
+msgstr "number of results"
+
+msgid "navigation.related-limit"
+msgstr "number of entities in the primary view "
+
+msgid "navigation.short-line-size"
+msgstr "short description"
+
msgid "navtop"
msgstr "page top"
@@ -2213,6 +2228,9 @@
msgid "only select queries are authorized"
msgstr ""
+msgid "open all"
+msgstr ""
+
msgid "order"
msgstr ""
@@ -2690,6 +2708,27 @@
msgid "ui"
msgstr ""
+msgid "ui.date-format"
+msgstr "date format"
+
+msgid "ui.datetime-format"
+msgstr "date and time format"
+
+msgid "ui.default-text-format"
+msgstr "text format"
+
+msgid "ui.fckeditor"
+msgstr "content editor"
+
+msgid "ui.float-format"
+msgstr "float format"
+
+msgid "ui.language"
+msgstr "language"
+
+msgid "ui.time-format"
+msgstr "time format"
+
msgid "unaccessible"
msgstr ""
--- a/i18n/es.po Mon Apr 27 12:11:33 2009 +0200
+++ b/i18n/es.po Thu Apr 30 14:45:02 2009 +0200
@@ -1142,6 +1142,9 @@
msgid "click on the box to cancel the deletion"
msgstr "seleccione la zona de edición para anular la eliminación"
+msgid "close all"
+msgstr ""
+
msgid "comment"
msgstr "comentario"
@@ -2236,6 +2239,18 @@
msgid "navigation"
msgstr "navigation"
+msgid "navigation.combobox-limit"
+msgstr ""
+
+msgid "navigation.page-size"
+msgstr ""
+
+msgid "navigation.related-limit"
+msgstr ""
+
+msgid "navigation.short-line-size"
+msgstr ""
+
msgid "navtop"
msgstr "haut de page du contenu principal"
@@ -2306,6 +2321,9 @@
msgid "only select queries are authorized"
msgstr "seules les requÍtes de sÈlections sont autorisÈes"
+msgid "open all"
+msgstr ""
+
msgid "order"
msgstr "ordre"
@@ -2797,6 +2815,27 @@
msgid "ui"
msgstr "propriÈtÈs gÈnÈriques de l'interface"
+msgid "ui.date-format"
+msgstr ""
+
+msgid "ui.datetime-format"
+msgstr ""
+
+msgid "ui.default-text-format"
+msgstr ""
+
+msgid "ui.fckeditor"
+msgstr ""
+
+msgid "ui.float-format"
+msgstr ""
+
+msgid "ui.language"
+msgstr ""
+
+msgid "ui.time-format"
+msgstr ""
+
msgid "unaccessible"
msgstr "inaccessible"
--- a/i18n/fr.po Mon Apr 27 12:11:33 2009 +0200
+++ b/i18n/fr.po Thu Apr 30 14:45:02 2009 +0200
@@ -1143,6 +1143,9 @@
msgid "click on the box to cancel the deletion"
msgstr "cliquer dans la zone d'édition pour annuler la suppression"
+msgid "close all"
+msgstr "tout fermer"
+
msgid "comment"
msgstr "commentaire"
@@ -2237,6 +2240,18 @@
msgid "navigation"
msgstr "navigation"
+msgid "navigation.combobox-limit"
+msgstr "nombre d'entités dans les listes déroulantes"
+
+msgid "navigation.page-size"
+msgstr "nombre de résultats"
+
+msgid "navigation.related-limit"
+msgstr "nombre d'entités dans la vue primaire"
+
+msgid "navigation.short-line-size"
+msgstr "description courtes"
+
msgid "navtop"
msgstr "haut de page du contenu principal"
@@ -2307,6 +2322,9 @@
msgid "only select queries are authorized"
msgstr "seules les requêtes de sélections sont autorisées"
+msgid "open all"
+msgstr "tout ouvrir"
+
msgid "order"
msgstr "ordre"
@@ -2798,6 +2816,27 @@
msgid "ui"
msgstr "propriétés génériques de l'interface"
+msgid "ui.date-format"
+msgstr "format de date"
+
+msgid "ui.datetime-format"
+msgstr "format de date et de l'heure"
+
+msgid "ui.default-text-format"
+msgstr "format de texte"
+
+msgid "ui.fckeditor"
+msgstr "éditeur"
+
+msgid "ui.float-format"
+msgstr "format des flottants"
+
+msgid "ui.language"
+msgstr "langue"
+
+msgid "ui.time-format"
+msgstr "format de l'heure"
+
msgid "unaccessible"
msgstr "inaccessible"
--- a/web/data/cubicweb.preferences.css Mon Apr 27 12:11:33 2009 +0200
+++ b/web/data/cubicweb.preferences.css Thu Apr 30 14:45:02 2009 +0200
@@ -5,12 +5,46 @@
* :contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr
*/
-.componentTitle{
+
+table.preferences td{
+ padding: 0 0.5em 1em;
+ }
+
+fieldset.preferences{
+ border : 1px solid #CFCEB7;
+ margin:1em 0;
+ padding:0 1em 1em;
+}
+
+div.preffield {
+ margin-bottom: 0.8em ;
+}
+
+/*
+div.preffield label{
+ font-size:110%
+ }
+*/
+
+div.prefinput{
+ margin:.3em 0;
+}
+
+div.componentLink{
+ margin-top:0.3em;
+ }
+
+a.componentTitle{
font-weight:bold;
- color: #ff7700;
- padding:0px 4px;
+ color: #000;
+ }
+
+a.componentTitle:visited{
+ color: #000;
}
+
+
h2.propertiesform a{
display:block;
margin: 10px 0px 6px 0px;
@@ -26,3 +60,56 @@
background-color:#cfceb7;
text-decoration:none;
}
+
+div.prefinput select.changed,
+div.prefinput input.changed{
+ background:#eeedd9;
+ border: 1px solid #eeedd9;
+}
+
+div.prefinput select,
+div.prefinput input{
+ background:#fff;
+ border: 1px solid #CFCEB7;
+}
+
+.prefinput input.error {
+ background:transparent url(error.png) no-repeat scroll 100% 50% !important;
+}
+
+
+div.formsg{
+ font-weight:bold;
+ margin:0.5em 0px;
+ }
+
+
+div.formsg .critical{
+ color:red;
+ padding-left:20px;
+ background:#fff url(critical.png) no-repeat;
+ }
+
+div.formsg .message{
+ color : green;
+}
+
+.helper{
+ font-size: 96%;
+ color: #555544;
+ padding:0;
+}
+
+div.prefinput .helper:hover {
+ color: #000;
+ cursor: default;
+}
+
+.error{
+ color:red;
+ padding-right:1em;
+ }
+
+div.openlink{
+ display:inline;
+ }
\ No newline at end of file
--- a/web/data/cubicweb.preferences.js Mon Apr 27 12:11:33 2009 +0200
+++ b/web/data/cubicweb.preferences.js Thu Apr 30 14:45:02 2009 +0200
@@ -3,8 +3,177 @@
* XXX whenever used outside of preferences, don't forget to
* move me in a more appropriate place
*/
-function toggle_and_remember_visibility(elemId, cookiename) {
+
+function toggleVisibility(elemId) {
+ _clearPreviousMessages();
jqNode(elemId).toggleClass('hidden');
- async_remote_exec('set_cookie', cookiename,
- jQuery('#' + elemId).attr('class'));
+}
+
+function closeFieldset(fieldsetid){
+ var linklabel = _('open all');
+ var linkhref = 'javascript:openFieldset("' +fieldsetid + '")'
+ _toggleFieldset(fieldsetid, 1, linklabel, linkhref)
+}
+
+function openFieldset(fieldsetid){
+ var linklabel = _('close all');
+ var linkhref = 'javascript:closeFieldset("'+ fieldsetid + '")'
+ _toggleFieldset(fieldsetid, 0, linklabel, linkhref)
+}
+
+
+function _toggleFieldset(fieldsetid, closeaction, linklabel, linkhref){
+ jQuery('#'+fieldsetid).find('div.openlink').each(function(){
+ var link = A({'href' : "javascript:noop();",
+ 'onclick' : linkhref},
+ linklabel)
+ jQuery(this).empty().append(link);
+ });
+ jQuery('#'+fieldsetid).find('fieldset[id]').each(function(){
+ var fieldset = jQuery(this);
+ if(closeaction){
+ fieldset.addClass('hidden')
+ }else{
+ fieldset.removeClass('hidden');
+ linkLabel = (_('open all'));
+ }
+ });
+
+}
+
+function validatePrefsForm(formid){
+ var form = getNode(formid);
+ freezeFormButtons(formid);
+ try {
+ var d = _sendForm(formid, null);
+ } catch (ex) {
+ log('got exception', ex);
+ return false;
+ }
+ function _callback(result, req) {
+ _clearPreviousMessages();
+ _clearPreviousErrors(formid);
+ // success
+ if(result[0]){
+ return submitSucces(formid)
+ }
+ // Failures
+ unfreezeFormButtons(formid);
+ var descr = result[1];
+ if (!isArrayLike(descr) || descr.length != 2) {
+ log('got strange error :', descr);
+ updateMessage(descr);
+ return ;
+ }
+ _displayValidationerrors(formid, descr[0], descr[1]);
+ var dom = DIV({'class':'critical'},
+ _("please correct errors below"));
+ jQuery(form).find('div.formsg').empty().append(dom);
+ updateMessage(_(""));
+ return false;
+ }
+ d.addCallback(_callback);
+ return false;
+}
+
+function submitSucces(formid){
+ var form = jQuery('#'+formid);
+ setCurrentValues(form);
+ var dom = DIV({'class':'message'},
+ _("changes applied"));
+ jQuery(form).find('div.formsg').empty().append(dom);
+ jQuery(form).find('input').removeClass('changed');
+ checkValues(form, true);
+ return;
+}
+
+function _clearPreviousMessages() {
+ jQuery('div#appMsg').addClass('hidden');
+ jQuery('div.formsg').empty();
}
+
+function _clearPreviousErrors(formid) {
+ jQuery('#' + formid + ' span.error').remove();
+}
+
+
+function checkValues(form, success){
+ var unfreezeButtons = false;
+ jQuery(form).find('select').each(function () {
+ unfreezeButtons = _checkValue(jQuery(this), unfreezeButtons);
+ });
+ jQuery(form).find('[type=text]').each(function () {
+ unfreezeButtons = _checkValue(jQuery(this), unfreezeButtons);
+ });
+ jQuery(form).find('input[type=radio]').each(function () {
+ if (jQuery(this).attr('checked')){
+ unfreezeButtons = _checkValue(jQuery(this), unfreezeButtons);
+ }
+ });
+
+ if (unfreezeButtons){
+ unfreezeFormButtons(form.attr('id'));
+ }else{
+ if (!success){
+ _clearPreviousMessages();
+ }
+ _clearPreviousErrors(form.attr('id'));
+ freezeFormButtons(form.attr('id'));
+ }
+}
+
+function _checkValue(input, unfreezeButtons){
+ var currentValueInput = jQuery("input[id=current-" + input.attr('name') + "]");
+ if (currentValueInput.attr('value') != input.attr('value')){
+ input.addClass('changed');
+ unfreezeButtons = true;
+ }else{
+ input.removeClass('changed');
+ jQuery("span[id=err-" + input.attr('id') + "]").remove();
+ }
+ input.removeClass('error');
+ return unfreezeButtons
+}
+
+
+function setCurrentValues(form){
+ jQuery(form).find('input[id^=current-value]').each(function () {
+ var currentValueInput = jQuery(this);
+ var name = currentValueInput.attr('id').split('-')[1];
+ jQuery(form).find("[name=" + name + "]").each(function (){
+ var input = jQuery(this);
+ if(input.attr('type')=='radio'){
+ log(input.attr('name'));
+ if(input.attr('checked')){
+ log(input.attr('value'));
+ currentValueInput.attr('value', input.attr('value'));
+ log(currentValueInput.attr('value').toString());
+ }
+ }else{
+ currentValueInput.attr('value', input.attr('value'));
+ }
+ });
+ });
+}
+
+
+function initEvents(){
+ jQuery('form').each(function() {
+ var form = jQuery(this);
+ freezeFormButtons(form.attr('id'));
+ form.find('input[type=text]').keyup(function(){
+ checkValues(form);
+ });
+ form.find('input[type=radio]').change(function(){
+ checkValues(form);
+ });
+ form.find('select').change(function(){
+ checkValues(form);
+ });
+ });
+}
+
+$(document).ready(function() {
+ initEvents();
+});
+
--- a/web/views/management.py Mon Apr 27 12:11:33 2009 +0200
+++ b/web/views/management.py Thu Apr 30 14:45:02 2009 +0200
@@ -13,14 +13,14 @@
from cubicweb.common.utils import UStringIO
from cubicweb.common.view import AnyRsetView, StartupView, EntityView
-from cubicweb.common.uilib import html_traceback, rest_traceback
+from cubicweb.common.uilib import html_traceback, rest_traceback, ajax_replace_url
from cubicweb.common.selectors import (yes, one_line_rset,
accept_rset, none_rset,
- chainfirst, chainall)
+ match_user_group,
+ 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):
@@ -305,15 +305,28 @@
_('contentnavigation')
-def make_togglable_link(nodeid, label, cookiename):
+def make_togglable_link(nodeid, label):
"""builds a HTML link that switches the visibility & remembers it"""
- action = u"javascript: toggle_and_remember_visibility('%s', '%s')" % \
- (nodeid, cookiename)
+ action = u"javascript: toggleVisibility('%s')" % nodeid
return u'<a href="%s">%s</a>' % (action, label)
def css_class(someclass):
return someclass and 'class="%s"' % someclass or ''
+### translations for SystemEpropertiesForm
+_('navigation.combobox-limit')
+_('navigation.page-size')
+_('navigation.related-limit')
+_('navigation.short-line-size')
+_('ui.date-format')
+_('ui.datetime-format')
+_('ui.default-text-format')
+_('ui.fckeditor')
+_('ui.float-format')
+_('ui.language')
+_('ui.time-format')
+_('open all')
+
class SystemEpropertiesForm(FormMixIn, StartupView):
controller = 'edit'
id = 'systemepropertiesform'
@@ -345,7 +358,7 @@
def call(self, **kwargs):
"""The default view representing the application's index"""
- self.req.add_js(('cubicweb.edition.js', 'cubicweb.preferences.js'))
+ self.req.add_js(('cubicweb.edition.js', 'cubicweb.preferences.js', 'cubicweb.ajax.js'))
self.req.add_css('cubicweb.preferences.css')
vreg = self.vreg
values = self.defined_keys
@@ -363,10 +376,11 @@
mainopts.setdefault(parts[0], []).append(key)
# precompute form to consume error message
for group, keys in mainopts.items():
- mainopts[group] = self.form(keys, False)
+ mainopts[group] = self.form(group, keys, False)
+
for group, objects in groupedopts.items():
for oid, keys in objects.items():
- groupedopts[group][oid] = self.form(keys, True)
+ groupedopts[group][oid] = self.form(group + '-' + oid, keys, True)
w = self.w
req = self.req
@@ -377,28 +391,35 @@
for g, f in mainopts.iteritems()):
status = css_class(self._group_status(group)) #'hidden' (collapsed), or '' (open) ?
w(u'<h2 class="propertiesform">%s</h2>\n' %
- (make_togglable_link('fieldset_' + group, label,
- self._cookie_name(group))))
+ (make_togglable_link('fieldset_' + group, label.capitalize())))
w(u'<div id="fieldset_%s" %s>' % (group, status))
- w(u'<fieldset class="subentity">')
+ w(u'<fieldset class="preferences">')
w(form)
w(u'</fieldset></div>')
+
for label, group, objects in sorted((_(g), g, o)
for g, o in groupedopts.iteritems()):
status = css_class(self._group_status(group))
w(u'<h2 class="propertiesform">%s</h2>\n' %
- (make_togglable_link('fieldset_' + group, label,
- self._cookie_name(group))))
+ (make_togglable_link('fieldset_' + group, label.capitalize())))
w(u'<div id="fieldset_%s" %s>' % (group, status))
- for label, oid, form in sorted((self.req.__('%s_%s' % (group, o)), o, f)
- for o, f in objects.iteritems()):
- w(u'<fieldset class="subentity">')
- w(u'<legend class="componentTitle">%s</legend>\n' % label)
+
+ # create selection
+ sorted_objects = sorted((self.req.__('%s_%s' % (group, o)), o, f)
+ for o, f in objects.iteritems())
+ for label, oid, form in sorted_objects:
+ w(u'''<div class="componentLink"><a href="javascript:noop();" onclick="javascript:toggleVisibility('field_%(oid)s_%(group)s')" class="componentTitle">%(label)s</a>''' % {'label':label, 'oid':oid, 'group':group})
+ w(u''' (<div class="openlink"><a href="javascript:noop();" onclick="javascript:closeFieldset('fieldset_%(group)s')">%(label)s</a></div>)'''
+ % {'label':_('close all'), 'group':group})
+ w(u'</div>')
docmsgid = '%s_%s_description' % (group, oid)
doc = _(docmsgid)
if doc != docmsgid:
- w(u'<p class="description">%s</p>' % html_escape(doc))
- w(form)
+ w(u'<p class="helper">%s</p>' % html_escape(doc).capitalize())
+
+ w(u'<fieldset id="field_%(oid)s_%(group)s" class="%(group)s preferences">'
+ % {'oid':oid, 'group':group})
+ w(form)
w(u'</fieldset>')
w(u'</div>')
@@ -424,11 +445,12 @@
entity['value'] = self.vreg.property_value(key)
return entity
- def form(self, keys, splitlabel=False):
+ def form(self, formid, keys, splitlabel=False):
stream = UStringIO()
w = stream.write
- w(u'<form action="%s" method="post">\n' % self.build_url())
+ w(u'''<form action="%(url)s" id="%(formid)s" method="post" onsubmit="return validatePrefsForm('%(formid)s')" >\n''' % {'url' : self.build_url(), 'formid':formid})
w(u'<fieldset>\n')
+ w(u'<div class="formsg"></div>')
w(u'<input type="hidden" name="__errorurl" value="%s"/>\n'
% html_escape(self.req.url()))
w(u'<input type="hidden" name="__form_id" value="%s"/>\n' % self.id)
@@ -438,41 +460,37 @@
w(u'<input type="hidden" name="__redirectparams" value="%s"/>\n'
% html_escape(params))
w(u'<input type="hidden" name="__redirectpath" value="%s"/>\n' % path)
- #w(u'<input type="hidden" name="__redirectrql" value=""/>\n')
+ w(u'<input type="hidden" name="__redirectrql" value=""/>\n')
w(u'<input type="hidden" name="__message" value="%s"/>\n'
% self.req._('changes applied'))
- w(u'<table><tr><td>\n')
-
- w(u'<table>\n')
- for key in keys:
- w(u'<tr>\n')
+ for key in keys:
self.form_row(w, key, splitlabel)
- w(u'</tr>\n')
- w(u'</table>\n')
- w(u'</td></tr><tr><td>\n')
w(self.button_ok())
- w(self.button_cancel())
- w(u'</td></tr></table>\n')
w(u'</fieldset>\n')
w(u'</form>\n')
return stream.getvalue()
-
+
def form_row(self, w, key, splitlabel):
- entity = self.entity_for_key(key)
+ entity = self.entity_for_key(key)
eid = entity.eid
- if splitlabel:
- w(u'<td class="label">%s</td>' % self.req._(key.split('.')[-1]))
+ if splitlabel:
+ w(u'<label>%s</label>' % self.req._(key.split('.')[-1]).capitalize())
else:
- w(u'<td class="label">%s</td>' % self.req._(key))
+ w(u'<label>%s</label>' % self.req._(key).capitalize())
+
wdg = self.vreg.property_value_widget(key, req=self.req)
error = wdg.render_error(entity)
- w(u'<td class="%s">' % (error and 'error' or ''))
- w(error)
+ w(u'<div class="preffield">\n')
+ w(u'%s' % wdg.render_help(entity))
+ w(u'<div class="prefinput">')
+ w(u'<span class="%s">%s</span>' % (error and 'error' or '', error))
self.form_row_hiddens(w, entity, key)
- w(wdg.edit_render(entity))
- w(u'</td>\n')
- w(u'<td>%s</td>' % wdg.render_help(entity))
- return entity
+ w(wdg.edit_render(entity))
+ w(u'<input type="hidden" id="current-value:%(eid)s" value="%(value)s"/>'
+ % {'eid':entity.eid, 'value':wdg.current_display_value(entity)})
+ w(u'</div>')
+ w(u'</div>')
+ return entity
def form_row_hiddens(self, w, entity, key):
eid = entity.eid
@@ -481,13 +499,13 @@
w(u'<input type="hidden" name="%s" value="%s"/>' % (eid_param('pkey', eid), key))
w(u'<input type="hidden" name="%s" value="%s"/>' % (eid_param('edits-pkey', eid), ''))
-
+
class EpropertiesForm(SystemEpropertiesForm):
id = 'epropertiesform'
title = _('preferences')
- require_groups = ('users', 'managers') # we don't want guests to be able to come here
- __selectors__ = chainfirst(none_rset,
- chainall(one_line_rset, accept_rset)),
+ require_groups = ('users',) # we don't want guests to be able to come here
+ __selectors__ = chainfirst(none_rset,
+ chainall( match_user_group, one_line_rset, accept_rset)),
accepts = ('EUser',)
@classmethod
@@ -512,19 +530,27 @@
def eprops_rset(self):
return self.req.execute('Any P,K,V WHERE P is EProperty, P pkey K, P value V,'
'P for_user U, U eid %(x)s', {'x': self.user.eid})
+# def form_row(self, w, key, splitlabel):
+# print 'user'
+
+class ManagerEpropertiesForm(EpropertiesForm):
+ title = _('preferences')
+ require_groups = ('managers',)
+
def form_row_hiddens(self, w, entity, key):
- super(EpropertiesForm, self).form_row_hiddens(w, entity, key)
+ super(ManagerEpropertiesForm, self).form_row_hiddens(w, entity, key)
# if user is in the managers group and the property is being created,
# we have to set for_user explicitly
- if not entity.has_eid() and self.user.matching_groups('managers'):
+ if not entity.has_eid():
eid = entity.eid
w(u'<input type="hidden" name="%s" value="%s"/>'
% (eid_param('edits-for_user', eid), INTERNAL_FIELD_VALUE))
w(u'<input type="hidden" name="%s" value="%s"/>'
% (eid_param('for_user', eid), self.user.eid))
-
+# def form_row(self, w, key, splitlabel):
+# print 'manager'
class ProcessInformationView(StartupView):
--- a/web/views/startup.py Mon Apr 27 12:11:33 2009 +0200
+++ b/web/views/startup.py Thu Apr 30 14:45:02 2009 +0200
@@ -192,7 +192,6 @@
class ManagerSchemaPermissionsView(StartupView, SecurityViewMixIn):
id = 'schema_security'
require_groups = ('managers',)
- __selectors__ = StartupView.__selectors__ + (match_user_group,)
def call(self, display_relations=True,
skiprels=('is', 'is_instance_of', 'identity', 'owned_by', 'created_by')):
--- a/web/widgets.py Mon Apr 27 12:11:33 2009 +0200
+++ b/web/widgets.py Thu Apr 30 14:45:02 2009 +0200
@@ -145,14 +145,15 @@
def render_help(self, entity):
"""render a help message about the (edited) field"""
req = entity.req
- help = [u'<br/>']
+ help = [u'<div class="helper">']
descr = self.description or self.rschema.rproperty(self.subjtype, self.objtype, 'description')
if descr:
- help.append(u'<span class="helper">%s</span>' % req._(descr))
+ help.append(u'<span>%s</span>' % req._(descr))
example = self.render_example(req)
if example:
- help.append(u'<span class="helper">(%s: %s)</span>'
+ help.append(u'<span>(%s: %s)</span>'
% (req._('sample format'), example))
+ help.append(u'</div>')
return u' '.join(help)
def render_example(self, req):
@@ -755,14 +756,15 @@
def render_help(self, entity):
"""calendar popup widget"""
req = entity.req
- help = [ u'<br/>' ]
+ help = [ u'<div class="helper">' ]
descr = self.rschema.rproperty(self.subjtype, self.objtype, 'description')
if descr:
- help.append('<span class="helper">%s</span>' % req._(descr))
+ help.append('<span>%s</span>' % req._(descr))
example = self.render_example(req)
if example:
- help.append('<span class="helper">(%s: %s)</span>'
+ help.append('<span>(%s: %s)</span>'
% (req._('sample format'), example))
+ help.append(u'</div>')
return u' '.join(help)
def render_calendar_popup(self, entity):