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'): |