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" |