class OrbitedWidget(twc.Widget): onopen = twc.Param("A javascript callback for when the connection opens", default=twc.js_callback('function(){}')) onread = twc.Param("A javascript callback for when new data is read", default=twc.js_callback('function(){}')) onclose = twc.Param("A javascript callback for when the connection closes", default=twc.js_callback('function(){}')) resources = [orbited_js] template = """ <script type="text/javascript"> Orbited.settings.port = %(port)s Orbited.settings.hostname = '%(host)s' document.domain = document.domain TCPSocket = Orbited.TCPSocket connect = function() { conn = new TCPSocket() conn.onread = ${onread} conn.onopen = ${onopen} conn.onclose = ${onclose} conn.open('%(host)s', %(port)s) } $(document).ready(function() { connect() }) </script> """ % { 'port': orbited_port, 'host': orbited_host }
def __init__(self, **kwargs): super(PersistentSelect2MultipleSelect, self).__init__(**kwargs) self.resources = [select2_persistence_js] self.ondemand = True self.validator = self.validator or Validator() self.options = [] self.opts = self.opts.copy() self.opts['initSelection'] = twc.js_callback( ''' function(element, callback) { var init_data = []; param = params['%(param)s']; if(typeof param !== "undefined" && param) { $.each(param.split(','), function(i, v) { var elem = {}; elem.id = v; elem.text = v; init_data.push(elem); }); } callback(init_data); } ''' % dict(param=self.name) )
def __init__(self, **kwargs): super(PersistentSelect2MultipleSelect, self).__init__(**kwargs) self.resources = [select2_persistence_js] self.ondemand = True self.validator = self.validator or Validator() self.options = [] self.opts = self.opts.copy() self.opts['initSelection'] = twc.js_callback(''' function(element, callback) { var init_data = []; param = params['%(param)s']; if(typeof param !== "undefined" && param) { $.each(param.split(','), function(i, v) { var elem = {}; elem.id = v; elem.text = v; init_data.push(elem); }); } callback(init_data); } ''' % dict(param=self.name))
def __init__(self, **kwargs): super(PersistentSelect2SingleSelect, self).__init__(**kwargs) self.resources = [select2_persistence_js] self.ondemand = True self.validator = self.validator or Validator() self.js_dict_entries = [ '%s: "%s"' % (key, value) for key, value in self.options ] self.js_opts_dict = '{%s}' % ', '.join(self.js_dict_entries) self.opts = self.opts.copy() self.opts['initSelection'] = twc.js_callback(''' function (element, callback) { var init_data; var list_opts = %(options)s; var param = params['%(param)s']; if(typeof param !== "undefined" && param) { var elem = {}; elem.id = param; if(param in list_opts) { elem.text = list_opts[param]; } init_data = elem; } callback(init_data); } ''' % dict(options=self.js_opts_dict, param=self.name))
def __init__(self, **kwargs): super(PersistentSelect2SingleSelect, self).__init__(**kwargs) self.resources = [select2_persistence_js] self.ondemand = True self.validator = self.validator or Validator() self.js_dict_entries = ['%s: "%s"' % (key, value) for key, value in self.options] self.js_opts_dict = '{%s}' % ', '.join(self.js_dict_entries) self.opts = self.opts.copy() self.opts['initSelection'] = twc.js_callback( ''' function (element, callback) { var init_data; var list_opts = %(options)s; var param = params['%(param)s']; if(typeof param !== "undefined" && param) { var elem = {}; elem.id = param; if(param in list_opts) { elem.text = list_opts[param]; } init_data = elem; } callback(init_data); } ''' % dict(options=self.js_opts_dict, param=self.name) )
def gritter_callback(**kw): """ Return js_callbacks that create gritter popups. >>> gritter_callback(title="Some Title", text="A message...") """ json = simplejson.dumps(kw) return twc.js_callback('function() { $.gritter.add(%s); }' % json)
def prepare(self): super(PolyGrid, self).prepare() if not getattr(self, 'id', None): self.id = str(uuid4()) Knowledge = get_knowledge_session("sqlite:///knowledge.db") #entity = Entity.by_name(self.model) self.entity = Knowledge.query(Entity).filter(Entity.name.like('user_%')).first() #colNames = get_colnames_from_entity(entity) #colModel = get_colmodel_from_entity(entity) colModel, colNames = get_colmodel_and_colnames_from_entity(Knowledge, 'user_%') params = { 'url': '/grid/query?like=user_%', 'datatype': 'json', 'colNames': colNames, 'colModel': colModel, 'height': 550, 'rowNum': 25, #'rowList': [10,20,30], 'pager': '#%s_pager' % self.id, 'sortname': 'id', 'viewrecords': True, 'sortorder': "desc", 'caption': self.entity.name, 'autowidth': True, 'loadui': 'block', #'shrinkToFit': True, 'forcefit': True, } self.add_call(jQuery('#' + self.id) .jqGrid(params) .navGrid('#%s_pager' % self.id, { 'add': False, 'del': False, 'edit': False, 'search': False, }, {}, {}, {}, {'multipleSearch': True})) self.add_call(jQuery('#' + self.id) .jqGrid('filterToolbar',{ 'stringResult': True, 'searchOnEnter': False })); self.add_call(jQuery('#' + self.id) .jqGrid('navButtonAdd', '#%s_pager' % self.id, { 'caption': 'Columns', 'title': 'Reorder Columns', 'onClickButton': js_callback(""" function() { jQuery('#%s').jqGrid('columnChooser'); } """ % self.id), }))
def when_ready(func): """ Takes a js_function and returns a js_callback that will run when the document is ready. >>> from tw.api import js_function >>> print when_ready(js_function('jQuery')('foo').bar({'biz': 'baz'})) $(document).ready(function(){jQuery("foo").bar({"biz": "baz"})}); """ return js_callback('$(document).ready(function(){' + str(func) + '});')
def when_ready(func): """ Takes a js_function and returns a js_callback that will run when the document is ready. >>> from tw.api import js_function >>> print when_ready(js_function('jQuery')('foo').bar({'biz': 'baz'})) $(document).ready(function(){jQuery("foo").bar({"biz": "baz"})}); """ from tw2.core import js_callback return js_callback('$(document).ready(function(){' + str(func) + '});')
def test_encoding_widget_id(self): from tw2.core import Widget w = Widget("foo") f = js_callback(js_function('jQuery')(w).click(js_symbol('onClick'))) args = {'onLoad': f} json = self.encode(args) eq_(json, '{"onLoad": function(){jQuery("foo").click(onClick)}}') json = self.encode({'args':args}) eq_(json, '{"args": {"onLoad": function(){jQuery("foo").click(onClick)}}}')
def test_encoding_widget_id(self): from tw2.core import Widget w = Widget("foo") f = js_callback(js_function('jQuery')(w).click(js_symbol('onClick'))) args = {'onLoad': f} json = self.encode(args) eq_(json, '{"onLoad": function(){jQuery("foo").click(onClick)}}') json = self.encode({'args': args}) eq_(json, '{"args": {"onLoad": function(){jQuery("foo").click(onClick)}}}')
def prepare(self): if not self.orbited_url: self.orbited_url = '%s://%s:%s' % ( self.orbited_scheme, self.orbited_host, self.orbited_port) super(StompWidget, self).prepare() self.onmessageframe = defaultdict(str) # {topic: 'js callbacks'} for callback in self.callbacks: if len(moksha.utils.livewidgets[callback]): cbs = '' if callback == 'onmessageframe': for topic in moksha.utils.livewidgets[callback]: self.topics.append(topic) for cb in moksha.utils.livewidgets[callback][topic]: self.onmessageframe[topic] += '%s;' % str(cb) else: for cb in moksha.utils.livewidgets[callback]: if isinstance(cb, (twc.js_callback, js_function)): cbs += '$(%s);' % str(cb) else: cbs += str(cb) if cbs: setattr(self, callback, cbs) if self.notify: moksha_notify.register_resources() openmsg = "Moksha live socket connected" self.onopen = twc.js_callback('function() { $.jGrowl("%s") }' % openmsg) errormsg = "Moksha Live Socket Error: " self.onerror = twc.js_callback( 'function(error) { $.jGrowl("%s" + error) }' % errormsg) errorframemsg = "Error frame received from Moksha Socket: " self.onerrorframe = twc.js_callback( 'function(f) { $.jGrowl("%s" + f) }' % errorframemsg) closemsg = "Moksha Socket Closed" self.onclose = twc.js_callback('function(c) { $.jGrowl("%s") }' % closemsg)
def testJSFuncCallChained(self): rl = testapi.request(1, mw) options = {'foo': 20} jQuery = twc.js_function('jQuery') when_ready = lambda func: twc.js_callback( '$(document).ready(function(){' + str(func) + '});' ) class Dummy(twc.Widget): id = 'dummy' template = "tw2.core.test_templates.display_only_test_widget" def prepare(self): super(Dummy, self).prepare() self.add_call(when_ready( jQuery('.%s' % self.id).buildMenu(options) )) output = Dummy.display() eq_(len(rl['resources']), 1) eq_(str(rl['resources'][0]), '$(document).ready(function(){jQuery(".dummy").buildMenu({"foo": 20})});')
def testJSFuncCallChained(self): rl = testapi.request(1, mw) options = {'foo': 20} jQuery = twc.js_function('jQuery') when_ready = lambda func: twc.js_callback( '$(document).ready(function(){' + str(func) + '});') class Dummy(twc.Widget): id = 'dummy' template = "tw2.core.test_templates.display_only_test_widget" def prepare(self): super(Dummy, self).prepare() self.add_call( when_ready(jQuery('.%s' % self.id).buildMenu(options))) output = Dummy.display() eq_(len(rl['resources']), 1) eq_( str(rl['resources'][0]), '$(document).ready(function(){jQuery(".dummy").buildMenu({"foo": 20})});' )
class DemoSelect2AjaxSingleSelectField(Select2AjaxSingleSelectField): resources = [ twc.CSSSource(location="headbottom", src=""" .zebra { background-color: #efefef; } img.flag { height: 10px; width: 15px; padding-right: 10px; } .movie-result td {vertical-align: top } .movie-image { width: 60px; } .movie-image img { height: 80px; width: 60px; } .movie-info { padding-left: 10px; vertical-align: top; } .movie-title { font-size: 1.2em; padding-bottom: 15px; } .movie-synopsis { font-size: .8em; color: #888; } .select2-highlighted .movie-synopsis { font-size: .8em; color: #eee; } .bigdrop.select2-container .select2-results {max-height: 300px;} .bigdrop .select2-results {max-height: 300px;} """) ] attrs = dict(style='width: 100%;') options = [] opts = dict( #placeholder=dict(title="Search for a movie", id=""), placeholder="Search for a movie...", minimumInputLength=2, ajax=dict( # instead of writing the function to execute the # request we use Select2's convenient helper url="http://api.rottentomatoes.com/api/public/v1.0/movies.json", dataType='jsonp', data=twc.js_callback(""" function (term, page) { return { q: term, // search term page_limit: 10, apikey: "%s" }; } """ % APIKEY), results=twc.js_callback(""" function (data, page) { // parse the results into the format expected by Select2. // since we are using custom formatting functions we do // not need to alter remote JSON data return {results: data.movies}; } """), ), initSelection=twc.js_callback(""" function(element, callback) { // the input tag has a value attribute preloaded that points to a //preselected movie's id. This function resolves that id attribute // to an object that select2 can render using its formatResult // renderer - that way the movie name is shown preselected var id=$(element).val(); if (id!=="") { $.ajax("http://api.rottentomatoes.com/api/public/v1.0/movies/"+id+".json", { data: { apikey: "%s" }, dataType: "jsonp" }).done(function(data) { callback(data); }); } } """ % APIKEY), formatSelection=twc.js_callback(""" function (movie) { return movie.title; } """), formatResult=twc.js_callback(""" function (movie) { var markup = "<table class='movie-result'><tr>"; if (movie.posters !== undefined && movie.posters.thumbnail !== undefined) { markup += "<td class='movie-image'><img src='" + movie.posters.thumbnail + "'/></td>"; } markup += "<td class='movie-info'><div class='movie-title'>" + movie.title + "</div>"; if (movie.critics_consensus !== undefined) { markup += "<div class='movie-synopsis'>" + movie.critics_consensus + "</div>"; } else if (movie.synopsis !== undefined) { markup += "<div class='movie-synopsis'>" + movie.synopsis + "</div>"; } markup += "</td></tr></table>" return markup; } """), )
def test_quotes_tripled(self): f = twc.js_callback("""function() { return "c"; }""") json = self.encode({'onLoad': f}) eq_(json, '{"onLoad": function() { return "c"; }}')
def test_quotes_escape(self): f = twc.js_callback("function() { return \"c\"; }") json = self.encode({'onLoad': f}) eq_(json, '{"onLoad": function() { return "c"; }}')
def prepare(self): # put code here to run just before the widget is displayed super(CodeMirrorEditor, self).prepare() self.safe_modify("resources") options = self.default_options.copy() if self.options: options.update(self.options) try: (mode, mime) = mode_name(self.mode) self.resources.append(codemirror_modes[mode]) options["mode"] = mime or mode except KeyError: pass if self.keymap: try: self.resources.append(codemirror_keymaps[self.keymap]) options["keymap"] = self.keymap except KeyError: pass if self.theme: try: self.resources.append(codemirror_themes[self.theme]) options["theme"] = self.theme except KeyError: pass options["lineNumbers"] = bool(self.lineNumbers) if self.firstLineNumber: options["firstLineNumber"] = self.firstLineNumber if self.height_from_rows and self.rows is not None: _css = twc.CSSSource(src=u"#%s + .CodeMirror {height: %dem;}" % (self.compound_id, self.rows)) self.resources.append(_css) if self.fullscreen: self.resources.append(codemirror_addons["display"]["fullscreen"]) # TODO: Customizable keys self.default_options["extraKeys"] = { "F11": twc.js_callback('function(cm) {cm.setOption("fullScreen", !cm.getOption("fullScreen"));}'), "Esc": twc.js_callback( 'function(cm) {if (cm.getOption("fullScreen")) cm.setOption("fullScreen", false);}' ), } try: _help_text = self.help_text except AttributeError: _help_text = u"" self.safe_modify("help_text") self.help_text = "Press F11 when cursor is in the editor to toggle full screen editing. " "Esc can also be used to exit full screen editing." + Markup( "<br />" ) + ( _help_text if _help_text else "" ) if self.placeholder: self.resources.append(codemirror_addons["display"]["placeholder"]) self.add_call(codemirror_js.fromTextArea(twc.js_function("document.getElementById")(self.compound_id), options))
def test_js_callback(self): eq_(str(js_callback("update_div")), 'update_div') eq_(str(js_callback(js_function('foo')(1, 2, 3))), 'function(){foo(1, 2, 3)}')
def __init__(self, **kwargs): super(GeocompleteField, self).__init__(**kwargs) self.resources = [ select2_persistence_js, twc.JSSource(src=''' function format_name(name, complement, postal_code, country) { var display_name = name; display_name += ' '; if(complement) { display_name += complement; } display_name += ' - '; display_name += postal_code; display_name += ', '; display_name += country; return display_name.toUpperCase(); } ''') ] self.options = [] self.ondemand = True self.validator = self.validator or Validator() self.opts.copy() self.opts['minimumInputLength'] = 1 self.opts['maximumInputLength'] = 125 self.opts['allowClear'] = True self.opts['dropdownAutoWidth'] = True self.opts['initSelection'] = twc.js_callback(""" function (element, callback) { var init_data; param = params['%(name)s']; if(typeof param !== "undefined" && param) { var elem = {}; param_dict = JSON.parse(param); elem.id = param; name = format_name( param_dict['name'], param_dict['complement'], param_dict['postal_code'], param_dict['country'] ); elem.name = name; elem.value = name; init_data = elem; } callback(init_data); } """ % dict(name=self.name)) self.opts['escapeMarkup'] = twc.js_callback(""" function(markup) { return markup; } """) self.opts['formatResult'] = twc.js_callback(""" function(location) { var markup = '<option value="' + location.value + '">' + location.name + '</option>'; return markup; } """) self.opts['formatSelection'] = twc.js_callback(""" function(location) { if(typeof location !== "undefined") { return location.value || location.text; } } """) self.opts['ajax'] = dict(url='/geocomplete', dataType='json', type='POST', quietMillis=100, cache=True, data=twc.js_callback(""" function(term) { return {address: term}; } """), results=twc.js_callback(""" function(data) { var results = []; if ('results' in data) { $.each(data['results'], function(i, v) { var o = {}; o.id = JSON.stringify(v); name = format_name( v['name'], v['complement'], v['postal_code'], v['country'] ); o.name = name; o.value = name; results.push(o); }); } return {results: results}; } """))
def test_js_callback(self): eq_(str(js_callback("update_div")), 'update_div') eq_(str(js_callback(js_function('foo')(1,2,3))), 'function(){foo(1, 2, 3)}')
def test_js_callback(self): eq_(str(js_callback("update_div")), "update_div") eq_(str(js_callback(js_function("foo")(1, 2, 3))), "function(){foo(1, 2, 3)}")
class StompWidget(twc.Widget): callbacks = [ 'onopen', 'onerror', 'onerrorframe', 'onclose', 'onconnectedframe', 'onmessageframe' ] resources = [jquery_js, jquery_json_js] onopen = twc.Param("onopen callback", default=twc.js_callback('function(){}')) onerror = twc.Param("onerror callback", default=twc.js_callback('function(error){}')) onclose = twc.Param("onclose callback", default=twc.js_callback('function(c){}')) onerrorframe = twc.Param("onerrorframe callback", twc.js_callback('function(f){}')) onmessageframe = twc.Param("onmessageframe callback", default='') onconnectedframe = twc.Param("onconnectedframe callback", default='') engine_name = 'mako' template = u""" <script type="text/javascript"> if (typeof TCPSocket == 'undefined') { moksha_callbacks = new Object(); moksha_socket_busy = false; } ## Register our topic callbacks % for topic in topics: var topic = "${topic}"; if (!moksha_callbacks[topic]) { moksha_callbacks[topic] = []; } moksha_callbacks[topic].push(function(json, frame) { ${onmessageframe[topic]} }); % endfor if (typeof TCPSocket == 'undefined') { document.domain = document.domain; moksha_socket_busy = true; $.getScript("${orbited_url}/static/Orbited.js", function(){ Orbited.settings.port = ${orbited_port}; Orbited.settings.hostname = '${orbited_host}'; Orbited.settings.streaming = true; TCPSocket = Orbited.TCPSocket; $.getScript("${orbited_url}/static/protocols/stomp/stomp.js", function(){ ## Create a new TCPSocket & Stomp client stomp = new STOMPClient(); stomp.onopen = ${onopen}; stomp.onclose = ${onclose}; stomp.onerror = ${onerror}; stomp.onerrorframe = ${onerrorframe}; stomp.onconnectedframe = function(){ moksha_socket_busy = false; $('body').triggerHandler('moksha.socket_ready'); ${onconnectedframe} }; stomp.onmessageframe = function(f){ var dest = f.headers.destination; var json = null; try { var json = $.parseJSON(f.body); } catch(err) { moksha.error("Unable to decode JSON message body"); moksha.error(msg); } if (moksha_callbacks[dest]) { for (var i=0; i < moksha_callbacks[dest].length; i++) { moksha_callbacks[dest][i](json, f); } } }; stomp.connect('${stomp_host}', ${stomp_port}, '${stomp_user}', '${stomp_pass}'); }); }); } else { ## Utilize the existing stomp connection if (moksha_socket_busy) { $('body').bind('moksha.socket_ready', function() { ${onconnectedframe} }); } else { ${onconnectedframe} } } window.onbeforeunload = function() { if (typeof stomp != 'undefined') { stomp.reset(); } } if (typeof moksha == 'undefined') { moksha = { /* Send a STOMP message to a given topic */ send_message: function(topic, body) { stomp.send($.toJSON(body), topic) } } } % if notify: $.jGrowl.defaults.position = 'bottom-right'; % endif </script> """ # TODO -- what does this do? hidden = twc.Param("Undocumented. What does this do?", default=True) notify = twc.Param("Popup notification bubbles on socket state changes", default=asbool(config.get('moksha.socket.notify', False))) orbited_host = twc.Param("orbited host", default=config.get('orbited_host', 'localhost')) orbited_port = twc.Param("orbited port", default=config.get('orbited_port', 9000)) orbited_scheme = twc.Param("orbited scheme", default=config.get('orbited_scheme', 'http')) orbited_url = twc.Variable("orbited_url", default=None) topics = twc.Variable("topics", default=[]) stomp_host = twc.Param(default=config.get('stomp_host', 'localhost')) stomp_port = twc.Param(default=config.get('stomp_port', 61613)) stomp_user = twc.Param(default=config.get('stomp_user', 'guest')) stomp_pass = twc.Param(default=config.get('stomp_pass', 'guest')) def prepare(self): if not self.orbited_url: self.orbited_url = '%s://%s:%s' % ( self.orbited_scheme, self.orbited_host, self.orbited_port) super(StompWidget, self).prepare() self.onmessageframe = defaultdict(str) # {topic: 'js callbacks'} for callback in self.callbacks: if len(moksha.utils.livewidgets[callback]): cbs = '' if callback == 'onmessageframe': for topic in moksha.utils.livewidgets[callback]: self.topics.append(topic) for cb in moksha.utils.livewidgets[callback][topic]: self.onmessageframe[topic] += '%s;' % str(cb) else: for cb in moksha.utils.livewidgets[callback]: if isinstance(cb, (twc.js_callback, js_function)): cbs += '$(%s);' % str(cb) else: cbs += str(cb) if cbs: setattr(self, callback, cbs) if self.notify: moksha_notify.register_resources() openmsg = "Moksha live socket connected" self.onopen = twc.js_callback('function() { $.jGrowl("%s") }' % openmsg) errormsg = "Moksha Live Socket Error: " self.onerror = twc.js_callback( 'function(error) { $.jGrowl("%s" + error) }' % errormsg) errorframemsg = "Error frame received from Moksha Socket: " self.onerrorframe = twc.js_callback( 'function(f) { $.jGrowl("%s" + f) }' % errorframemsg) closemsg = "Moksha Socket Closed" self.onclose = twc.js_callback('function(c) { $.jGrowl("%s") }' % closemsg)
def prepare(self): # put code here to run just before the widget is displayed super(CodeMirrorEditor, self).prepare() self.safe_modify('resources') options = self.default_options.copy() if self.options: options.update(self.options) try: (mode, mime) = mode_name(self.mode) self.resources.append(codemirror_modes[mode]) options['mode'] = mime or mode except KeyError: pass if self.keymap: try: self.resources.append(codemirror_keymaps[self.keymap]) options['keymap'] = self.keymap except KeyError: pass if self.theme: try: self.resources.append(codemirror_themes[self.theme]) options['theme'] = self.theme except KeyError: pass options['lineNumbers'] = bool(self.lineNumbers) if self.firstLineNumber: options['firstLineNumber'] = self.firstLineNumber if self.height_from_rows and self.rows is not None: _css = twc.CSSSource(src=u'#%s + .CodeMirror {height: %dem;}' % (self.compound_id, self.rows)) self.resources.append(_css) if self.fullscreen: self.resources.append(codemirror_addons['display']['fullscreen']) #TODO: Customizable keys self.default_options['extraKeys'] = { "F11": twc.js_callback( 'function(cm) {cm.setOption("fullScreen", !cm.getOption("fullScreen"));}' ), "Esc": twc.js_callback( 'function(cm) {if (cm.getOption("fullScreen")) cm.setOption("fullScreen", false);}' ), } try: _help_text = self.help_text except AttributeError: _help_text = u'' self.safe_modify('help_text') self.help_text = 'Press F11 when cursor is in the editor to toggle full screen editing. ' \ 'Esc can also be used to exit full screen editing.' \ + Markup('<br />') + (_help_text if _help_text else '') if self.placeholder: self.resources.append(codemirror_addons['display']['placeholder']) self.add_call( codemirror_js.fromTextArea( twc.js_function('document.getElementById')(self.compound_id), options))
def __init__(self, **kwargs): super(GeocompleteField, self).__init__(**kwargs) self.resources = [ select2_persistence_js, twc.JSSource( src=''' function format_name(name, complement, postal_code, country) { var display_name = name; display_name += ' '; if(complement) { display_name += complement; } display_name += ' - '; display_name += postal_code; display_name += ', '; display_name += country; return display_name.toUpperCase(); } ''' ) ] self.options = [] self.ondemand = True self.validator = self.validator or Validator() self.opts.copy() self.opts['minimumInputLength'] = 1 self.opts['maximumInputLength'] = 125 self.opts['allowClear'] = True self.opts['dropdownAutoWidth'] = True self.opts['initSelection'] = twc.js_callback( """ function (element, callback) { var init_data; param = params['%(name)s']; if(typeof param !== "undefined" && param) { var elem = {}; param_dict = JSON.parse(param); elem.id = param; name = format_name( param_dict['name'], param_dict['complement'], param_dict['postal_code'], param_dict['country'] ); elem.name = name; elem.value = name; init_data = elem; } callback(init_data); } """ % dict(name=self.name) ) self.opts['escapeMarkup'] = twc.js_callback( """ function(markup) { return markup; } """ ) self.opts['formatResult'] = twc.js_callback( """ function(location) { var markup = '<option value="' + location.value + '">' + location.name + '</option>'; return markup; } """ ) self.opts['formatSelection'] = twc.js_callback( """ function(location) { if(typeof location !== "undefined") { return location.value || location.text; } } """ ) self.opts['ajax'] = dict( url='/geocomplete', dataType='json', type='POST', quietMillis=100, cache=True, data=twc.js_callback( """ function(term) { return {address: term}; } """ ), results=twc.js_callback( """ function(data) { var results = []; if ('results' in data) { $.each(data['results'], function(i, v) { var o = {}; o.id = JSON.stringify(v); name = format_name( v['name'], v['complement'], v['postal_code'], v['country'] ); o.name = name; o.value = name; results.push(o); }); } return {results: results}; } """ ) )