diff --git a/VERSION b/VERSION index 7477783e..6a4d6c8d 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -Version 1.99.4 (2012-02-28 14:45:29) stable +Version 1.99.4 (2012-02-28 15:09:09) stable diff --git a/applications/admin/static/js/web2py.js b/applications/admin/static/js/web2py.js index 64b0f3a1..d6eee1a6 100644 --- a/applications/admin/static/js/web2py.js +++ b/applications/admin/static/js/web2py.js @@ -102,9 +102,51 @@ function web2py_ajax_page(method, action, data, target) { }); } -function web2py_component(action,target) { - jQuery(function(){web2py_ajax_page('get',action,null,target);}); -} +function web2py_component(action, target, timeout, times){ + jQuery(function(){ + var element = $("#" + target).get(0); + var statement = "$('#" + target + "').get(0).reload();"; + element.reload = function (){ + // Continue if times is Infinity or + // the times limit is not reached + if (this.reload_check()){ + web2py_ajax_page('get', action, null, target);} }; // reload + // Method to check timing limit + element.reload_check = function (){ + if (this.reload_counter == Infinity){return true;} + else { + if (!isNaN(this.reload_counter)){ + this.reload_counter -= 1; + if (this.reload_counter < 0){ + if (!this.run_once){ + clearInterval(this.timing); + return false; + } + } + else{return true;} + } } + return false;}; // reload check + if (!isNaN(timeout)){ + element.timeout = timeout; + element.reload_counter = times; + if (times > 1){ + // Multiple or infinite reload + // Run first iteration + web2py_ajax_page('get', action, null, target); + element.run_once = false; + element.timing = setInterval(statement, timeout); + element.reload_counter -= 1; + } + else if (times == 1) { + // Run once with timeout + element.run_once = true; + element.setTimeout = setTimeout; + element.timing = setTimeout(statement, timeout); + } + } else { + // run once (no timeout specified) + web2py_ajax_page('get', action, null, target); + } }); } function web2py_comet(url,onmessage,onopen,onclose) { if ("WebSocket" in window) { diff --git a/applications/examples/static/js/web2py.js b/applications/examples/static/js/web2py.js index 64b0f3a1..d6eee1a6 100644 --- a/applications/examples/static/js/web2py.js +++ b/applications/examples/static/js/web2py.js @@ -102,9 +102,51 @@ function web2py_ajax_page(method, action, data, target) { }); } -function web2py_component(action,target) { - jQuery(function(){web2py_ajax_page('get',action,null,target);}); -} +function web2py_component(action, target, timeout, times){ + jQuery(function(){ + var element = $("#" + target).get(0); + var statement = "$('#" + target + "').get(0).reload();"; + element.reload = function (){ + // Continue if times is Infinity or + // the times limit is not reached + if (this.reload_check()){ + web2py_ajax_page('get', action, null, target);} }; // reload + // Method to check timing limit + element.reload_check = function (){ + if (this.reload_counter == Infinity){return true;} + else { + if (!isNaN(this.reload_counter)){ + this.reload_counter -= 1; + if (this.reload_counter < 0){ + if (!this.run_once){ + clearInterval(this.timing); + return false; + } + } + else{return true;} + } } + return false;}; // reload check + if (!isNaN(timeout)){ + element.timeout = timeout; + element.reload_counter = times; + if (times > 1){ + // Multiple or infinite reload + // Run first iteration + web2py_ajax_page('get', action, null, target); + element.run_once = false; + element.timing = setInterval(statement, timeout); + element.reload_counter -= 1; + } + else if (times == 1) { + // Run once with timeout + element.run_once = true; + element.setTimeout = setTimeout; + element.timing = setTimeout(statement, timeout); + } + } else { + // run once (no timeout specified) + web2py_ajax_page('get', action, null, target); + } }); } function web2py_comet(url,onmessage,onopen,onclose) { if ("WebSocket" in window) { diff --git a/applications/welcome/static/js/web2py.js b/applications/welcome/static/js/web2py.js index 64b0f3a1..d6eee1a6 100644 --- a/applications/welcome/static/js/web2py.js +++ b/applications/welcome/static/js/web2py.js @@ -102,9 +102,51 @@ function web2py_ajax_page(method, action, data, target) { }); } -function web2py_component(action,target) { - jQuery(function(){web2py_ajax_page('get',action,null,target);}); -} +function web2py_component(action, target, timeout, times){ + jQuery(function(){ + var element = $("#" + target).get(0); + var statement = "$('#" + target + "').get(0).reload();"; + element.reload = function (){ + // Continue if times is Infinity or + // the times limit is not reached + if (this.reload_check()){ + web2py_ajax_page('get', action, null, target);} }; // reload + // Method to check timing limit + element.reload_check = function (){ + if (this.reload_counter == Infinity){return true;} + else { + if (!isNaN(this.reload_counter)){ + this.reload_counter -= 1; + if (this.reload_counter < 0){ + if (!this.run_once){ + clearInterval(this.timing); + return false; + } + } + else{return true;} + } } + return false;}; // reload check + if (!isNaN(timeout)){ + element.timeout = timeout; + element.reload_counter = times; + if (times > 1){ + // Multiple or infinite reload + // Run first iteration + web2py_ajax_page('get', action, null, target); + element.run_once = false; + element.timing = setInterval(statement, timeout); + element.reload_counter -= 1; + } + else if (times == 1) { + // Run once with timeout + element.run_once = true; + element.setTimeout = setTimeout; + element.timing = setTimeout(statement, timeout); + } + } else { + // run once (no timeout specified) + web2py_ajax_page('get', action, null, target); + } }); } function web2py_comet(url,onmessage,onopen,onclose) { if ("WebSocket" in window) { diff --git a/gluon/compileapp.py b/gluon/compileapp.py index 74886566..b83c29cb 100644 --- a/gluon/compileapp.py +++ b/gluon/compileapp.py @@ -108,7 +108,19 @@ class mybuiltin(object): def LOAD(c=None, f='index', args=None, vars=None, extension=None, target=None,ajax=False,ajax_trap=False, - url=None,user_signature=False, content='loading...',**attr): + url=None,user_signature=False, timeout=None, times=1, + content='loading...',**attr): + """ LOAD a component into the action's document + + Timing options: + -times: An integer or string ("infinity"/"continuous") + specifies how many times the component is requested + -timeout (milliseconds): specifies the time to wait before + starting the request or the frequency if times is greater than + 1 or "infinity". + Timing options default to the normal behavior. The component + is added on page loading without delay. + """ from html import TAG, DIV, URL, SCRIPT, XML if args is None: args = [] vars = Storage(vars or {}) @@ -121,9 +133,29 @@ def LOAD(c=None, f='index', args=None, vars=None, url = url or URL(request.application, c, f, r=request, args=args, vars=vars, extension=extension, user_signature=user_signature) - script = SCRIPT('web2py_component("%s","%s")' % (url, target), - _type="text/javascript") + # timing options + if isinstance(times, basestring): + if times.upper() in ("INFINITY", "CONTINUOUS"): + times = "Infinity" + else: + raise TypeError("Unsupported times argument %s" % times) + elif isinstance(times, int): + if times <= 0: + raise ValueError("Times argument must be greater than zero, 'Infinity' or None") + else: + raise TypeError("Unsupported times argument type %s" % type(times)) + if timeout is not None: + if not isinstance(timeout, (int, long)): + raise ValueError("Timeout argument must be an integer or None") + elif timeout <= 0: + raise ValueError("Timeout argument must be greater than zero or None") + statement = "web2py_component('%s','%s', %s, %s);" \ + % (url, target, timeout, times) + else: + statement = "web2py_component('%s','%s');" % (url, target) + script = SCRIPT(statement, _type="text/javascript") return TAG[''](script, DIV(content,**attr)) + else: if not isinstance(args,(list,tuple)): args = [args]