61 ''''''''''''''''''''''''' |
61 ''''''''''''''''''''''''' |
62 |
62 |
63 .. autoclass:: cubicweb.web.formwidgets.FCKEditor |
63 .. autoclass:: cubicweb.web.formwidgets.FCKEditor |
64 .. autoclass:: cubicweb.web.formwidgets.AjaxWidget |
64 .. autoclass:: cubicweb.web.formwidgets.AjaxWidget |
65 .. autoclass:: cubicweb.web.formwidgets.AutoCompletionWidget |
65 .. autoclass:: cubicweb.web.formwidgets.AutoCompletionWidget |
|
66 .. autoclass:: cubicweb.web.formwidgets.InOutWidget |
66 |
67 |
67 .. kill or document StaticFileAutoCompletionWidget |
68 .. kill or document StaticFileAutoCompletionWidget |
68 .. kill or document LazyRestrictedAutoCompletionWidget |
69 .. kill or document LazyRestrictedAutoCompletionWidget |
69 .. kill or document RestrictedAutoCompletionWidget |
70 .. kill or document RestrictedAutoCompletionWidget |
70 |
71 |
997 return '<a id="%(domid)s" href="%(href)s">'\ |
998 return '<a id="%(domid)s" href="%(href)s">'\ |
998 '<img src="%(imgsrc)s" alt="%(label)s"/>%(label)s</a>' % { |
999 '<img src="%(imgsrc)s" alt="%(label)s"/>%(label)s</a>' % { |
999 'label': label, 'imgsrc': imgsrc, |
1000 'label': label, 'imgsrc': imgsrc, |
1000 'domid': self.domid, 'href': self.href} |
1001 'domid': self.domid, 'href': self.href} |
1001 |
1002 |
|
1003 class InOutWidget(Select): |
|
1004 needs_js = ('cubicweb.widgets.js', ) |
|
1005 template = """ |
|
1006 <table id="%(widgetid)s"> |
|
1007 <tr><td>%(inoutinput)s</td> |
|
1008 <td><div style="margin-bottom:3px">%(addinput)s</div> <div>%(removeinput)s</div></td> |
|
1009 <td>%(resinput)s</td></tr> |
|
1010 </table> |
|
1011 """ |
|
1012 add_button = """<input type="button" id="cwinoutadd" class="wdgButton cwinoutadd" value=">>" size="10" />""" |
|
1013 remove_button ="""<input type="button" class="wdgButton cwinoutremove" value="<<" size="10" />""" |
|
1014 |
|
1015 def __init__(self, attrs=None): |
|
1016 super(InOutWidget, self).__init__(attrs, multiple=True) |
|
1017 |
|
1018 def render_select(self, form, field, name, selected=False): |
|
1019 values, attrs = self.values_and_attributes(form, field) |
|
1020 options = [] |
|
1021 inputs = [] |
|
1022 for _option in field.vocabulary(form): |
|
1023 try: |
|
1024 label, value, oattrs = _option |
|
1025 except ValueError: |
|
1026 label, value = _option |
|
1027 if selected: |
|
1028 # add values |
|
1029 if value in values: |
|
1030 options.append(tags.option(label, value=value)) |
|
1031 # add hidden inputs |
|
1032 inputs.append(tags.input(value=value, name=field.dom_id(form), type="hidden")) |
|
1033 else: |
|
1034 options.append(tags.option(label, value=value)) |
|
1035 if 'size' not in attrs: |
|
1036 attrs['size'] = 5 |
|
1037 if 'id' in attrs : |
|
1038 attrs.pop('id') |
|
1039 return tags.select(name=name, multiple=self._multiple, id=name, |
|
1040 options=options, **attrs) + '\n'.join(inputs) |
|
1041 |
|
1042 |
|
1043 def _render(self, form, field, renderer): |
|
1044 domid = field.dom_id(form) |
|
1045 jsnodes = {'widgetid': domid, 'from': 'from_' + domid, 'to': 'to_' + domid} |
|
1046 form._cw.add_onload(u'$(cw.jqNode("%s")).cwinoutwidget("%s", "%s");' |
|
1047 % (jsnodes['widgetid'], jsnodes['from'], jsnodes['to'])) |
|
1048 field.required=True |
|
1049 return self.template % {'widgetid': jsnodes['widgetid'], |
|
1050 'inoutinput' : self.render_select(form, field, jsnodes['from']), # helpinfo select tag |
|
1051 'resinput' : self.render_select(form, field, jsnodes['to'], selected=True), # select tag with resultats |
|
1052 'addinput' : self.add_button % jsnodes, |
|
1053 'removeinput': self.remove_button % jsnodes |
|
1054 } |