web/formwidgets.py
changeset 8216 99ff746e8de8
parent 8193 0c64d6b75303
child 8471 05992aa3fc0d
equal deleted inserted replaced
8214:ce9556358dbd 8216:99ff746e8de8
   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="&gt;&gt;" size="10" />')
       
   492     remove_button = ('<input type="button" class="wdgButton cwinoutremove" '
       
   493                      'value="&lt;&lt;" 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="&gt;&gt;" size="10" />"""
       
  1036     remove_button ="""<input type="button" class="wdgButton cwinoutremove" value="&lt;&lt;" 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                                 }