427 class Select(FieldWidget): |
427 class Select(FieldWidget): |
428 """Simple <select>, for field having a specific vocabulary. Will return |
428 """Simple <select>, for field having a specific vocabulary. Will return |
429 an unicode string, or a list of unicode strings. |
429 an unicode string, or a list of unicode strings. |
430 """ |
430 """ |
431 vocabulary_widget = True |
431 vocabulary_widget = True |
432 default_size = 5 |
432 default_size = 10 |
433 |
433 |
434 def __init__(self, attrs=None, multiple=False, **kwargs): |
434 def __init__(self, attrs=None, multiple=False, **kwargs): |
435 super(Select, self).__init__(attrs, **kwargs) |
435 super(Select, self).__init__(attrs, **kwargs) |
436 self._multiple = multiple |
436 self._multiple = multiple |
437 |
437 |
470 multiple=self._multiple, options=options, **attrs) |
470 multiple=self._multiple, options=options, **attrs) |
471 |
471 |
472 def value_selected(self, value, curvalues): |
472 def value_selected(self, value, curvalues): |
473 return value in curvalues |
473 return value in curvalues |
474 |
474 |
|
475 |
|
476 class InOutWidget(Select): |
|
477 needs_js = ('cubicweb.widgets.js', ) |
|
478 default_size = 10 |
|
479 template = """ |
|
480 <table id="%(widgetid)s"> |
|
481 <tr> |
|
482 <td>%(inoutinput)s</td> |
|
483 <td><div style="margin-bottom:3px">%(addinput)s</div> |
|
484 <div>%(removeinput)s</div> |
|
485 </td> |
|
486 <td>%(resinput)s</td> |
|
487 </tr> |
|
488 </table> |
|
489 """ |
|
490 add_button = ('<input type="button" id="cwinoutadd" class="wdgButton cwinoutadd" ' |
|
491 'value=">>" size="10" />') |
|
492 remove_button = ('<input type="button" class="wdgButton cwinoutremove" ' |
|
493 'value="<<" size="10" />') |
|
494 |
|
495 def __init__(self, *args, **kwargs): |
|
496 super(InOutWidget, self).__init__(*args, **kwargs) |
|
497 self._multiple = True |
|
498 |
|
499 def render_select(self, form, field, name, selected=False): |
|
500 values, attrs = self.values_and_attributes(form, field) |
|
501 options = [] |
|
502 inputs = [] |
|
503 for option in field.vocabulary(form): |
|
504 try: |
|
505 label, value, _oattrs = option |
|
506 except ValueError: |
|
507 label, value = option |
|
508 if selected: |
|
509 # add values |
|
510 if value in values: |
|
511 options.append(tags.option(label, value=value)) |
|
512 # add hidden inputs |
|
513 inputs.append(tags.input(value=value, |
|
514 name=field.dom_id(form), |
|
515 type="hidden")) |
|
516 else: |
|
517 options.append(tags.option(label, value=value)) |
|
518 if 'size' not in attrs: |
|
519 attrs['size'] = self.default_size |
|
520 if 'id' in attrs : |
|
521 attrs.pop('id') |
|
522 return tags.select(name=name, multiple=self._multiple, id=name, |
|
523 options=options, **attrs) + '\n'.join(inputs) |
|
524 |
|
525 |
|
526 def _render(self, form, field, renderer): |
|
527 domid = field.dom_id(form) |
|
528 jsnodes = {'widgetid': domid, |
|
529 'from': 'from_' + domid, |
|
530 'to': 'to_' + domid} |
|
531 form._cw.add_onload(u'$(cw.jqNode("%s")).cwinoutwidget("%s", "%s");' |
|
532 % (jsnodes['widgetid'], jsnodes['from'], jsnodes['to'])) |
|
533 field.required = True |
|
534 return (self.template % |
|
535 {'widgetid': jsnodes['widgetid'], |
|
536 # helpinfo select tag |
|
537 'inoutinput' : self.render_select(form, field, jsnodes['from']), |
|
538 # select tag with resultats |
|
539 'resinput' : self.render_select(form, field, jsnodes['to'], selected=True), |
|
540 'addinput' : self.add_button % jsnodes, |
|
541 'removeinput': self.remove_button % jsnodes |
|
542 }) |
475 |
543 |
476 class BitSelect(Select): |
544 class BitSelect(Select): |
477 """Select widget for IntField using a vocabulary with bit masks as values. |
545 """Select widget for IntField using a vocabulary with bit masks as values. |
478 |
546 |
479 See also :class:`~cubicweb.web.facet.BitFieldFacet`. |
547 See also :class:`~cubicweb.web.facet.BitFieldFacet`. |
1021 return '<a id="%(domid)s" href="%(href)s">'\ |
1089 return '<a id="%(domid)s" href="%(href)s">'\ |
1022 '<img src="%(imgsrc)s" alt="%(label)s"/>%(label)s</a>' % { |
1090 '<img src="%(imgsrc)s" alt="%(label)s"/>%(label)s</a>' % { |
1023 'label': label, 'imgsrc': imgsrc, |
1091 'label': label, 'imgsrc': imgsrc, |
1024 'domid': self.domid, 'href': self.href} |
1092 'domid': self.domid, 'href': self.href} |
1025 |
1093 |
1026 class InOutWidget(Select): |
|
1027 needs_js = ('cubicweb.widgets.js', ) |
|
1028 template = """ |
|
1029 <table id="%(widgetid)s"> |
|
1030 <tr><td>%(inoutinput)s</td> |
|
1031 <td><div style="margin-bottom:3px">%(addinput)s</div> <div>%(removeinput)s</div></td> |
|
1032 <td>%(resinput)s</td></tr> |
|
1033 </table> |
|
1034 """ |
|
1035 add_button = """<input type="button" id="cwinoutadd" class="wdgButton cwinoutadd" value=">>" size="10" />""" |
|
1036 remove_button ="""<input type="button" class="wdgButton cwinoutremove" value="<<" size="10" />""" |
|
1037 |
|
1038 def __init__(self, attrs=None): |
|
1039 super(InOutWidget, self).__init__(attrs, multiple=True) |
|
1040 |
|
1041 def render_select(self, form, field, name, selected=False): |
|
1042 values, attrs = self.values_and_attributes(form, field) |
|
1043 options = [] |
|
1044 inputs = [] |
|
1045 for _option in field.vocabulary(form): |
|
1046 try: |
|
1047 label, value, oattrs = _option |
|
1048 except ValueError: |
|
1049 label, value = _option |
|
1050 if selected: |
|
1051 # add values |
|
1052 if value in values: |
|
1053 options.append(tags.option(label, value=value)) |
|
1054 # add hidden inputs |
|
1055 inputs.append(tags.input(value=value, name=field.dom_id(form), type="hidden")) |
|
1056 else: |
|
1057 options.append(tags.option(label, value=value)) |
|
1058 if 'size' not in attrs: |
|
1059 attrs['size'] = 5 |
|
1060 if 'id' in attrs : |
|
1061 attrs.pop('id') |
|
1062 return tags.select(name=name, multiple=self._multiple, id=name, |
|
1063 options=options, **attrs) + '\n'.join(inputs) |
|
1064 |
|
1065 |
|
1066 def _render(self, form, field, renderer): |
|
1067 domid = field.dom_id(form) |
|
1068 jsnodes = {'widgetid': domid, 'from': 'from_' + domid, 'to': 'to_' + domid} |
|
1069 form._cw.add_onload(u'$(cw.jqNode("%s")).cwinoutwidget("%s", "%s");' |
|
1070 % (jsnodes['widgetid'], jsnodes['from'], jsnodes['to'])) |
|
1071 field.required=True |
|
1072 return self.template % {'widgetid': jsnodes['widgetid'], |
|
1073 'inoutinput' : self.render_select(form, field, jsnodes['from']), # helpinfo select tag |
|
1074 'resinput' : self.render_select(form, field, jsnodes['to'], selected=True), # select tag with resultats |
|
1075 'addinput' : self.add_button % jsnodes, |
|
1076 'removeinput': self.remove_button % jsnodes |
|
1077 } |
|