web/formwidgets.py
changeset 6449 613d83588998
parent 6448 8590d82e9b1b
child 6682 bdf9424b499c
equal deleted inserted replaced
6448:8590d82e9b1b 6449:613d83588998
    91 from logilab.mtconverter import xml_escape
    91 from logilab.mtconverter import xml_escape
    92 from logilab.common.deprecation import deprecated
    92 from logilab.common.deprecation import deprecated
    93 from logilab.common.date import todatetime
    93 from logilab.common.date import todatetime
    94 
    94 
    95 from cubicweb import tags, uilib
    95 from cubicweb import tags, uilib
       
    96 from cubicweb.utils import json_dumps
    96 from cubicweb.web import stdmsgs, INTERNAL_FIELD_VALUE, ProcessFormError
    97 from cubicweb.web import stdmsgs, INTERNAL_FIELD_VALUE, ProcessFormError
    97 
    98 
    98 
    99 
    99 class FieldWidget(object):
   100 class FieldWidget(object):
   100     """The abstract base class for widgets.
   101     """The abstract base class for widgets.
   698     controller. This method is expected to return allowed values for the input,
   699     controller. This method is expected to return allowed values for the input,
   699     that the widget will use to propose matching values as you type.
   700     that the widget will use to propose matching values as you type.
   700     """
   701     """
   701     needs_js = ('cubicweb.widgets.js', 'jquery.ui.js')
   702     needs_js = ('cubicweb.widgets.js', 'jquery.ui.js')
   702     needs_css = ('jquery.ui.css',)
   703     needs_css = ('jquery.ui.css',)
   703     wdgtype = 'SuggestField'
   704     default_settings = {}
   704     loadtype = 'auto'
       
   705 
   705 
   706     def __init__(self, *args, **kwargs):
   706     def __init__(self, *args, **kwargs):
       
   707         self.autocomplete_settings = kwargs.pop('autocomplete_settings',
       
   708                                                 self.default_settings)
   707         try:
   709         try:
   708             self.autocomplete_initfunc = kwargs.pop('autocomplete_initfunc')
   710             self.autocomplete_initfunc = kwargs.pop('autocomplete_initfunc')
   709         except KeyError:
   711         except KeyError:
   710             warn('[3.6] use autocomplete_initfunc argument of %s constructor '
   712             warn('[3.6] use autocomplete_initfunc argument of %s constructor '
   711                  'instead of relying on autocomplete_initfuncs dictionary on '
   713                  'instead of relying on autocomplete_initfuncs dictionary on '
   718         values = super(AutoCompletionWidget, self).values(form, field)
   720         values = super(AutoCompletionWidget, self).values(form, field)
   719         if not values:
   721         if not values:
   720             values = ('',)
   722             values = ('',)
   721         return values
   723         return values
   722 
   724 
   723     def attributes(self, form, field):
   725     def _render(self, form, field, renderer):
   724         attrs = super(AutoCompletionWidget, self).attributes(form, field)
   726         entity = form.edited_entity
   725         init_ajax_attributes(attrs, self.wdgtype, self.loadtype)
   727         domid = field.dom_id(form).replace(':', r'\\:')
   726         # XXX entity form specific
   728         if callable(self.autocomplete_initfunc):
   727         attrs['cubicweb:dataurl'] = self._get_url(form.edited_entity, field)
   729             data = self.autocomplete_initfunc(form, field)
   728         return attrs
   730         else:
       
   731             data = xml_escape(self._get_url(entity, field))
       
   732         form._cw.add_onload(u'$("#%s").cwautocomplete(%s, %s);'
       
   733                             % (domid, json_dumps(data),
       
   734                                json_dumps(self.autocomplete_settings)))
       
   735         return super(AutoCompletionWidget, self)._render(form, field, renderer)
   729 
   736 
   730     def _get_url(self, entity, field):
   737     def _get_url(self, entity, field):
   731         if self.autocomplete_initfunc is None:
   738         if self.autocomplete_initfunc is None:
   732             # XXX for bw compat
   739             # XXX for bw compat
   733             fname = entity.autocomplete_initfuncs[field.name]
   740             fname = entity.autocomplete_initfuncs[field.name]
   735             fname = self.autocomplete_initfunc
   742             fname = self.autocomplete_initfunc
   736         return entity._cw.build_url('json', fname=fname, mode='remote',
   743         return entity._cw.build_url('json', fname=fname, mode='remote',
   737                                     pageid=entity._cw.pageid)
   744                                     pageid=entity._cw.pageid)
   738 
   745 
   739 
   746 
       
   747 
   740 class StaticFileAutoCompletionWidget(AutoCompletionWidget):
   748 class StaticFileAutoCompletionWidget(AutoCompletionWidget):
   741     """XXX describe me"""
   749     """XXX describe me"""
   742     wdgtype = 'StaticFileSuggestField'
   750     wdgtype = 'StaticFileSuggestField'
   743 
   751 
   744     def _get_url(self, entity, field):
   752     def _get_url(self, entity, field):
   750         return entity._cw.datadir_url + fname
   758         return entity._cw.datadir_url + fname
   751 
   759 
   752 
   760 
   753 class RestrictedAutoCompletionWidget(AutoCompletionWidget):
   761 class RestrictedAutoCompletionWidget(AutoCompletionWidget):
   754     """XXX describe me"""
   762     """XXX describe me"""
   755     wdgtype = 'RestrictedSuggestField'
   763     default_settings = {'mustMatch': True}
   756 
   764 
   757 
   765 
   758 class LazyRestrictedAutoCompletionWidget(RestrictedAutoCompletionWidget):
   766 class LazyRestrictedAutoCompletionWidget(RestrictedAutoCompletionWidget):
   759     """remote autocomplete """
   767     """remote autocomplete """
   760     wdgtype = 'LazySuggestField'
       
   761 
   768 
   762     def values_and_attributes(self, form, field):
   769     def values_and_attributes(self, form, field):
   763         """override values_and_attributes to handle initial displayed values"""
   770         """override values_and_attributes to handle initial displayed values"""
   764         values, attrs = super(LazyRestrictedAutoCompletionWidget, self).values_and_attributes(form, field)
   771         values, attrs = super(LazyRestrictedAutoCompletionWidget, self).values_and_attributes(form, field)
   765         assert len(values) == 1, "multiple selection is not supported yet by LazyWidget"
   772         assert len(values) == 1, "multiple selection is not supported yet by LazyWidget"