web/formwidgets.py
changeset 4373 972143183ea3
parent 4372 0c44af150a49
child 4375 6d34e3cf60a3
equal deleted inserted replaced
4372:0c44af150a49 4373:972143183ea3
    11 from warnings import warn
    11 from warnings import warn
    12 
    12 
    13 from logilab.mtconverter import xml_escape
    13 from logilab.mtconverter import xml_escape
    14 from logilab.common.deprecation import deprecated
    14 from logilab.common.deprecation import deprecated
    15 
    15 
    16 from cubicweb import tags, uilib
    16 from cubicweb import tags, uilib, utils
    17 from cubicweb.web import stdmsgs, INTERNAL_FIELD_VALUE, ProcessFormError
    17 from cubicweb.web import stdmsgs, INTERNAL_FIELD_VALUE, ProcessFormError
    18 
    18 
    19 class FieldWidget(object):
    19 class FieldWidget(object):
    20     """abstract widget class"""
    20     """abstract widget class"""
    21     # javascript / css files required by the widget
    21     # javascript / css files required by the widget
   414 <img src="%s" title="%s" alt="" /></a><div class="calpopup hidden" id="%s"></div>"""
   414 <img src="%s" title="%s" alt="" /></a><div class="calpopup hidden" id="%s"></div>"""
   415                 % (helperid, inputid, year, month,
   415                 % (helperid, inputid, year, month,
   416                    form._cw.external_resource('CALENDAR_ICON'),
   416                    form._cw.external_resource('CALENDAR_ICON'),
   417                    form._cw._('calendar'), helperid) )
   417                    form._cw._('calendar'), helperid) )
   418 
   418 
       
   419 
       
   420 class JQueryDatePicker(FieldWidget):
       
   421     """use jquery.ui.datepicker to define a date time picker"""
       
   422     needs_js = ('jquery.ui.js', )
       
   423     needs_css = ('jquery.ui.css',)
       
   424 
       
   425     def __init__(self, datestr=None, **kwargs):
       
   426         super(JQueryDatePicker, self).__init__(**kwargs)
       
   427         self.datestr = datestr
       
   428 
       
   429     def _render(self, form, field, renderer):
       
   430         req = form._cw
       
   431         domid = field.dom_id(form, self.suffix)
       
   432         # XXX find a way to understand every format
       
   433         fmt = req.property_value('ui.date-format')
       
   434         fmt = fmt.replace('%Y', 'yy').replace('%m', 'mm').replace('%d', 'dd')
       
   435         req.add_onload(u'jqNode("%s").datepicker('
       
   436                        '{buttonImage: "%s", dateFormat: "%s", firstDay: 1,'
       
   437                        ' showOn: "button", buttonImageOnly: true})' % (
       
   438                            domid, req.external_resource('CALENDAR_ICON'), fmt))
       
   439         if self.datestr is None:
       
   440             value = self.values(form, field)[0]
       
   441         else:
       
   442             value = self.datestr
       
   443         return tags.input(id=domid, name=domid, value=value,
       
   444                           type='text', size='10')
       
   445 
       
   446 
       
   447 class JQueryTimePicker(FieldWidget):
       
   448     """use jquery.timePicker.js to define a js time picker"""
       
   449     needs_js = ('jquery.timePicker.js',)
       
   450     needs_css = ('jquery.timepicker.css',)
       
   451 
       
   452     def __init__(self, timestr=None, timesteps=30, **kwargs):
       
   453         super(JQueryTimePicker, self).__init__(**kwargs)
       
   454         self.timestr = timestr
       
   455         self.timesteps = timesteps
       
   456 
       
   457     def _render(self, form, field, renderer):
       
   458         req = form._cw
       
   459         domid = field.dom_id(form, self.suffix)
       
   460         req.add_onload(u'jqNode("%s").timePicker({selectedTime: "%s", step: %s})' % (
       
   461             domid, self.timestr, self.timesteps))
       
   462         if self.timestr is None:
       
   463             value = self.values(form, field)[0]
       
   464         else:
       
   465             value = self.timestr
       
   466         return tags.input(id=domid, name=domid, value=value,
       
   467                           type='text', size='5')
       
   468 
       
   469 
       
   470 class JQueryDateTimePicker(FieldWidget):
       
   471     def __init__(self, initialtime=None, timesteps=15, **kwargs):
       
   472         super(JQueryDateTimePicker, self).__init__(**kwargs)
       
   473         self.initialtime = initialtime
       
   474         self.timesteps = timesteps
       
   475 
       
   476     def _render(self, form, field, renderer):
       
   477         """render the widget for the given `field` of `form`.
       
   478 
       
   479         Generate one <input> tag for each field's value
       
   480         """
       
   481         req = form._cw
       
   482         dateqname = field.input_name(form, 'date')
       
   483         timeqname = field.input_name(form, 'time')
       
   484         if dateqname in form.form_previous_values:
       
   485             datestr = form.form_previous_values[dateqname]
       
   486             timestr = form.form_previous_values[timeqname]
       
   487         else:
       
   488             datestr = timestr = u''
       
   489             if field.name in req.form:
       
   490                 value = req.parse_datetime(req.form[field.name])
       
   491             else:
       
   492                 value = self.typed_value(form, field)
       
   493             if value:
       
   494                 datestr = req.format_date(value)
       
   495                 timestr = req.format_time(value)
       
   496             elif self.initialtime:
       
   497                 timestr = req.format_time(self.initialtime)
       
   498         datepicker = JQueryDatePicker(datestr=datestr, suffix='date')
       
   499         timepicker = JQueryTimePicker(timestr=timestr, timesteps=self.timesteps,
       
   500                                       suffix='time')
       
   501         return u'<div id="%s">%s%s</div>' % (field.dom_id(form),
       
   502                                             datepicker.render(form, field),
       
   503                                             timepicker.render(form, field))
       
   504 
       
   505     def process_field_data(self, form, field):
       
   506         req = form._cw
       
   507         datestr = req.form.get(field.input_name(form, 'date')).strip() or None
       
   508         timestr = req.form.get(field.input_name(form, 'time')).strip() or None
       
   509         if datestr is None:
       
   510             return None
       
   511         date = utils.todatetime(req.parse_datetime(datestr, 'Date'))
       
   512         if timestr is None:
       
   513             return date
       
   514         time = req.parse_datetime(timestr, 'Time')
       
   515         return date.replace(hour=time.hour, minute=time.minute, second=time.second)
   419 
   516 
   420 
   517 
   421 # ajax widgets ################################################################
   518 # ajax widgets ################################################################
   422 
   519 
   423 def init_ajax_attributes(attrs, wdgtype, loadtype=u'auto'):
   520 def init_ajax_attributes(attrs, wdgtype, loadtype=u'auto'):