AW: Problem sending data from a JS Element back to Tapestry
Hi Chris, Thank you very much. I solve the problem for me and your advice definitely pointed me into the right direction. For everyone following this I may add that we seem to work in different environments. I tried your (function(){ define(["jquery", "t5/core/ajax", "t5/core/utils", "components/editor/inline-toolbar" ], function ($, ajax, utils, toolbar) { but that made the whole script unavailable to the system. What works for me as the top of the file is define([ "jquery", "t5/core/ajax", "t5/core/utils"], function($, ajax, utils) { return function(callbackuri, context) { That makes the script visible but also makes utils accessible. Any way Thank you very much. Janko PS.: It is really a pity but documentation of the newer feature of tapestry Is so hard to come by. There is so much potential in this system, but even if you understand the main paradigm you can get lost in the details. -Ursprüngliche Nachricht- Von: Chris Poulsen [mailto:mailingl...@nesluop.dk] Gesendet: Donnerstag, 21. Juli 2016 23:06 An: Tapestry users Betreff: Re: Problem sending data from a JS Element back to Tapestry Hi, Utils and ajax are injected using requirejs, the top of the module file looks like this... (function(){ define(["jquery", "t5/core/ajax", "t5/core/utils", "components/editor/inline-toolbar" ], function ($, ajax, utils, toolbar) { On Thu, Jul 21, 2016 at 10:42 PM, Jochimsen, Janko < janko.jochim...@urios-beratung.de> wrote: > Hi Chris, > > thanks for your sift answer > > I think this is the right direction. I am just stuck with a very – > probably stupid – problem. I included all relevant paths that I can > think of with: > > define([ "jquery", "t5/core/dom", "t5/core/ajax", "t5/core/utils" ] > > the function looks like this: > var buildUrl = function(link, params) { > return utils.extendURL(link, { > params : JSON.stringify(params) > }); > }; > > > Where the calling is: > var url = buildUrl(callback, { > 'action' : 'follow', > 'userid' : '11239528343' > }); > > > but in Firefox console I get still > > TypeError: extendURL is not a function > buildUrl() > myBarRender.js:56 > > myBarRender.js:30 > jQuery.event.dispatch() > jquery.js:137 > jQuery.event.add/elemData.handle() > jquery.js:126 > jQuery.event.trigger() > > Any Idea? > > Thanks a lot > > Janko > > > -Ursprüngliche Nachricht- > Von: Chris Poulsen [mailto:mailingl...@nesluop.dk] > Gesendet: Donnerstag, 21. Juli 2016 19:20 > An: Tapestry users > Betreff: Re: Problem sending data from a JS Element back to Tapestry > > you cannot expect that your parameters end up as event context (unless > you encode them into your url in that way). > > I've had success using: > > var url = buildUrl( setupDialogLink, params ); ajax( url, { > success: function(){ ... } > }); > > var buildUrl = function( link, params ) { > return utils.extendURL( link, { params: JSON.stringify(params) } > ); }; > > Where ajax/utils are those from t5/core/ajax / t5/core/utils > > The handler on the server side looks like this: > > handlerName( @RequestParameter( "params" ) JSONObject json ) > > HTH. > > -- > Chris > > > > > > On Thu, Jul 21, 2016 at 5:35 PM, Jochimsen, Janko < > janko.jochim...@urios-beratung.de> wrote: > > > Hello Everybody, > > I do have a problem with the communication between tapestry and java > > Script or to be more precise a JQuery Script. > > As a background Information I am using JQPlot Graphs that work quiet > > good and I can start them from tapestry without problems. > > Now I would like to increase the interaction of these elements by > > sending mouse clicks back to the tapestry system for further use. > > In order to call the plot I use > > > > public void afterRender() { > > Link link = resources.createEventLink("Call2", spec); > > String uri = link.toAbsoluteURI(); > > String output = "Call JS with Parameter:[" + uri + "]"; > > logger.info(" OUTPUT: " + output); > > javaScriptSupport.require("myBarRender").with(uri, > > spec); > > > > } > > > > Where Call2 looks like this: > > public void onCall2(EventContext eventContext) { > > if (eventContext != null) { > > > > JSONObject value = null; > > > > StringBuffer sb = new StringBuffer(); > > CaptureResultCallback callback = new > > CaptureResultCallback(); > > resources.triggerEvent(EventConstants.REFRESH, new > > JSONObject[] { value }, callback); > > > > if (callback.getResult() != null) { > > Object obj = callback.getResult(); > > sb.append(" CALLBACK = " + obj.toString() + > ".."); > > } else { > > sb.append(" CALLBACK = NULL "); > > } > >
Re: Problem sending data from a JS Element back to Tapestry
Hi, Utils and ajax are injected using requirejs, the top of the module file looks like this... (function(){ define(["jquery", "t5/core/ajax", "t5/core/utils", "components/editor/inline-toolbar" ], function ($, ajax, utils, toolbar) { On Thu, Jul 21, 2016 at 10:42 PM, Jochimsen, Janko < janko.jochim...@urios-beratung.de> wrote: > Hi Chris, > > thanks for your sift answer > > I think this is the right direction. I am just stuck with a very – > probably stupid – problem. I included all relevant paths that I can think > of with: > > define([ "jquery", "t5/core/dom", "t5/core/ajax", "t5/core/utils" ] > > the function looks like this: > var buildUrl = function(link, params) { > return utils.extendURL(link, { > params : JSON.stringify(params) > }); > }; > > > Where the calling is: > var url = buildUrl(callback, { > 'action' : 'follow', > 'userid' : '11239528343' > }); > > > but in Firefox console I get still > > TypeError: extendURL is not a function > buildUrl() > myBarRender.js:56 > > myBarRender.js:30 > jQuery.event.dispatch() > jquery.js:137 > jQuery.event.add/elemData.handle() > jquery.js:126 > jQuery.event.trigger() > > Any Idea? > > Thanks a lot > > Janko > > > -Ursprüngliche Nachricht- > Von: Chris Poulsen [mailto:mailingl...@nesluop.dk] > Gesendet: Donnerstag, 21. Juli 2016 19:20 > An: Tapestry users > Betreff: Re: Problem sending data from a JS Element back to Tapestry > > you cannot expect that your parameters end up as event context (unless you > encode them into your url in that way). > > I've had success using: > > var url = buildUrl( setupDialogLink, params ); ajax( url, { > success: function(){ ... } > }); > > var buildUrl = function( link, params ) > { > return utils.extendURL( link, { params: JSON.stringify(params) } ); }; > > Where ajax/utils are those from t5/core/ajax / t5/core/utils > > The handler on the server side looks like this: > > handlerName( @RequestParameter( "params" ) JSONObject json ) > > HTH. > > -- > Chris > > > > > > On Thu, Jul 21, 2016 at 5:35 PM, Jochimsen, Janko < > janko.jochim...@urios-beratung.de> wrote: > > > Hello Everybody, > > I do have a problem with the communication between tapestry and java > > Script or to be more precise a JQuery Script. > > As a background Information I am using JQPlot Graphs that work quiet good > > and I can start them from tapestry without problems. > > Now I would like to increase the interaction of these elements by sending > > mouse clicks back to the tapestry system for further use. > > In order to call the plot I use > > > > public void afterRender() { > > Link link = resources.createEventLink("Call2", spec); > > String uri = link.toAbsoluteURI(); > > String output = "Call JS with Parameter:[" + uri + "]"; > > logger.info(" OUTPUT: " + output); > > javaScriptSupport.require("myBarRender").with(uri, spec); > > > > } > > > > Where Call2 looks like this: > > public void onCall2(EventContext eventContext) { > > if (eventContext != null) { > > > > JSONObject value = null; > > > > StringBuffer sb = new StringBuffer(); > > CaptureResultCallback callback = new > > CaptureResultCallback(); > > resources.triggerEvent(EventConstants.REFRESH, new > > JSONObject[] { value }, callback); > > > > if (callback.getResult() != null) { > > Object obj = callback.getResult(); > > sb.append(" CALLBACK = " + obj.toString() + > ".."); > > } else { > > sb.append(" CALLBACK = NULL "); > > } > > String[] data = eventContext.toStrings(); > > > > if (data.length > 0) { > > for (int i = 0; i < data.length; i++) { > > sb.append("data[" + i + "] =" + data); > > String s = data[i]; > > if (s != null) { > >sb.append("content=" + s); > > } > > } > > } else { > > sb.append("NO DATA"); > > } > > logger.info("Got Called from JS with data " + > > sb.toString()); > > } else { > > logger.info("Got Called from JS with data == null"); > > } > > } > > > > On the JavaScript-Side the code looks like this > > > > define([ "jquery" ], function($) { > > > > return function(callbackuri, context) { > > var s1 = [ 2, 6, 7, 10 ]; > > var s2 = [ 7, 5, 3, 2 ]; > > var s3 = [ 14, 9, 3, 8 ]; > > var callback = callbackuri; > > > > plot3 = $.jqplot('chart3', [ s1, s2,
AW: Problem sending data from a JS Element back to Tapestry
Hi Chris, thanks for your sift answer I think this is the right direction. I am just stuck with a very – probably stupid – problem. I included all relevant paths that I can think of with: define([ "jquery", "t5/core/dom", "t5/core/ajax", "t5/core/utils" ] the function looks like this: var buildUrl = function(link, params) { return utils.extendURL(link, { params : JSON.stringify(params) }); }; Where the calling is: var url = buildUrl(callback, { 'action' : 'follow', 'userid' : '11239528343' }); but in Firefox console I get still TypeError: extendURL is not a function buildUrl() myBarRender.js:56 myBarRender.js:30 jQuery.event.dispatch() jquery.js:137 jQuery.event.add/elemData.handle() jquery.js:126 jQuery.event.trigger() Any Idea? Thanks a lot Janko -Ursprüngliche Nachricht- Von: Chris Poulsen [mailto:mailingl...@nesluop.dk] Gesendet: Donnerstag, 21. Juli 2016 19:20 An: Tapestry users Betreff: Re: Problem sending data from a JS Element back to Tapestry you cannot expect that your parameters end up as event context (unless you encode them into your url in that way). I've had success using: var url = buildUrl( setupDialogLink, params ); ajax( url, { success: function(){ ... } }); var buildUrl = function( link, params ) { return utils.extendURL( link, { params: JSON.stringify(params) } ); }; Where ajax/utils are those from t5/core/ajax / t5/core/utils The handler on the server side looks like this: handlerName( @RequestParameter( "params" ) JSONObject json ) HTH. -- Chris On Thu, Jul 21, 2016 at 5:35 PM, Jochimsen, Janko < janko.jochim...@urios-beratung.de> wrote: > Hello Everybody, > I do have a problem with the communication between tapestry and java > Script or to be more precise a JQuery Script. > As a background Information I am using JQPlot Graphs that work quiet good > and I can start them from tapestry without problems. > Now I would like to increase the interaction of these elements by sending > mouse clicks back to the tapestry system for further use. > In order to call the plot I use > > public void afterRender() { > Link link = resources.createEventLink("Call2", spec); > String uri = link.toAbsoluteURI(); > String output = "Call JS with Parameter:[" + uri + "]"; > logger.info(" OUTPUT: " + output); > javaScriptSupport.require("myBarRender").with(uri, spec); > > } > > Where Call2 looks like this: > public void onCall2(EventContext eventContext) { > if (eventContext != null) { > > JSONObject value = null; > > StringBuffer sb = new StringBuffer(); > CaptureResultCallback callback = new > CaptureResultCallback(); > resources.triggerEvent(EventConstants.REFRESH, new > JSONObject[] { value }, callback); > > if (callback.getResult() != null) { > Object obj = callback.getResult(); > sb.append(" CALLBACK = " + obj.toString() + ".."); > } else { > sb.append(" CALLBACK = NULL "); > } > String[] data = eventContext.toStrings(); > > if (data.length > 0) { > for (int i = 0; i < data.length; i++) { > sb.append("data[" + i + "] =" + data); > String s = data[i]; > if (s != null) { >sb.append("content=" + s); > } > } > } else { > sb.append("NO DATA"); > } > logger.info("Got Called from JS with data " + > sb.toString()); > } else { > logger.info("Got Called from JS with data == null"); > } > } > > On the JavaScript-Side the code looks like this > > define([ "jquery" ], function($) { > > return function(callbackuri, context) { > var s1 = [ 2, 6, 7, 10 ]; > var s2 = [ 7, 5, 3, 2 ]; > var s3 = [ 14, 9, 3, 8 ]; > var callback = callbackuri; > > plot3 = $.jqplot('chart3', [ s1, s2, s3 ], { > stackSeries : true, > captureRightClick : true, > seriesDefaults : { > renderer : $.jqplot.BarRenderer, > rendererOptions : { > highlightMouseDown : true > }, > pointLabels : { > show : true > } > } > }); > $('#chart3').bind( > 'jqplotDataRightClick', > function(ev, seriesInde
Re: Problem sending data from a JS Element back to Tapestry
you cannot expect that your parameters end up as event context (unless you encode them into your url in that way). I've had success using: var url = buildUrl( setupDialogLink, params ); ajax( url, { success: function(){ ... } }); var buildUrl = function( link, params ) { return utils.extendURL( link, { params: JSON.stringify(params) } ); }; Where ajax/utils are those from t5/core/ajax / t5/core/utils The handler on the server side looks like this: handlerName( @RequestParameter( "params" ) JSONObject json ) HTH. -- Chris On Thu, Jul 21, 2016 at 5:35 PM, Jochimsen, Janko < janko.jochim...@urios-beratung.de> wrote: > Hello Everybody, > I do have a problem with the communication between tapestry and java > Script or to be more precise a JQuery Script. > As a background Information I am using JQPlot Graphs that work quiet good > and I can start them from tapestry without problems. > Now I would like to increase the interaction of these elements by sending > mouse clicks back to the tapestry system for further use. > In order to call the plot I use > > public void afterRender() { > Link link = resources.createEventLink("Call2", spec); > String uri = link.toAbsoluteURI(); > String output = "Call JS with Parameter:[" + uri + "]"; > logger.info(" OUTPUT: " + output); > javaScriptSupport.require("myBarRender").with(uri, spec); > > } > > Where Call2 looks like this: > public void onCall2(EventContext eventContext) { > if (eventContext != null) { > > JSONObject value = null; > > StringBuffer sb = new StringBuffer(); > CaptureResultCallback callback = new > CaptureResultCallback(); > resources.triggerEvent(EventConstants.REFRESH, new > JSONObject[] { value }, callback); > > if (callback.getResult() != null) { > Object obj = callback.getResult(); > sb.append(" CALLBACK = " + obj.toString() + ".."); > } else { > sb.append(" CALLBACK = NULL "); > } > String[] data = eventContext.toStrings(); > > if (data.length > 0) { > for (int i = 0; i < data.length; i++) { > sb.append("data[" + i + "] =" + data); > String s = data[i]; > if (s != null) { >sb.append("content=" + s); > } > } > } else { > sb.append("NO DATA"); > } > logger.info("Got Called from JS with data " + > sb.toString()); > } else { > logger.info("Got Called from JS with data == null"); > } > } > > On the JavaScript-Side the code looks like this > > define([ "jquery" ], function($) { > > return function(callbackuri, context) { > var s1 = [ 2, 6, 7, 10 ]; > var s2 = [ 7, 5, 3, 2 ]; > var s3 = [ 14, 9, 3, 8 ]; > var callback = callbackuri; > > plot3 = $.jqplot('chart3', [ s1, s2, s3 ], { > stackSeries : true, > captureRightClick : true, > seriesDefaults : { > renderer : $.jqplot.BarRenderer, > rendererOptions : { > highlightMouseDown : true > }, > pointLabels : { > show : true > } > } > }); > $('#chart3').bind( > 'jqplotDataRightClick', > function(ev, seriesIndex, pointIndex, data) { > console.log("try to reach callback"); > // > $.ajax(callback, { >dataType : 'json', >type : 'post', >contentType : 'application/json', >data : JSON.stringify({ > 'action' : 'follow', > 'userid' : '11239528343' >}), >success : function(data) { > console.log("Reached Server got > back "); >} > //$.post(callback, $(this).serialize(), > //function(data, textStatus, jQxhr) { > // console.log("Reached Server got back "); > // $('#response pre').html(data); > // > //
Problem sending data from a JS Element back to Tapestry
Hello Everybody, I do have a problem with the communication between tapestry and java Script or to be more precise a JQuery Script. As a background Information I am using JQPlot Graphs that work quiet good and I can start them from tapestry without problems. Now I would like to increase the interaction of these elements by sending mouse clicks back to the tapestry system for further use. In order to call the plot I use public void afterRender() { Link link = resources.createEventLink("Call2", spec); String uri = link.toAbsoluteURI(); String output = "Call JS with Parameter:[" + uri + "]"; logger.info(" OUTPUT: " + output); javaScriptSupport.require("myBarRender").with(uri, spec); } Where Call2 looks like this: public void onCall2(EventContext eventContext) { if (eventContext != null) { JSONObject value = null; StringBuffer sb = new StringBuffer(); CaptureResultCallback callback = new CaptureResultCallback(); resources.triggerEvent(EventConstants.REFRESH, new JSONObject[] { value }, callback); if (callback.getResult() != null) { Object obj = callback.getResult(); sb.append(" CALLBACK = " + obj.toString() + ".."); } else { sb.append(" CALLBACK = NULL "); } String[] data = eventContext.toStrings(); if (data.length > 0) { for (int i = 0; i < data.length; i++) { sb.append("data[" + i + "] =" + data); String s = data[i]; if (s != null) { sb.append("content=" + s); } } } else { sb.append("NO DATA"); } logger.info("Got Called from JS with data " + sb.toString()); } else { logger.info("Got Called from JS with data == null"); } } On the JavaScript-Side the code looks like this define([ "jquery" ], function($) { return function(callbackuri, context) { var s1 = [ 2, 6, 7, 10 ]; var s2 = [ 7, 5, 3, 2 ]; var s3 = [ 14, 9, 3, 8 ]; var callback = callbackuri; plot3 = $.jqplot('chart3', [ s1, s2, s3 ], { stackSeries : true, captureRightClick : true, seriesDefaults : { renderer : $.jqplot.BarRenderer, rendererOptions : { highlightMouseDown : true }, pointLabels : { show : true } } }); $('#chart3').bind( 'jqplotDataRightClick', function(ev, seriesIndex, pointIndex, data) { console.log("try to reach callback"); // $.ajax(callback, { dataType : 'json', type : 'post', contentType : 'application/json', data : JSON.stringify({ 'action' : 'follow', 'userid' : '11239528343' }), success : function(data) { console.log("Reached Server got back "); } //$.post(callback, $(this).serialize(), //function(data, textStatus, jQxhr) { // console.log("Reached Server got back "); // $('#response pre').html(data); // //}, 'text').fail( //function(jqXhr, textStatus, errorThrown) { // console.log(errorThrown); //}); // //ev.preventDefault(); }); // Ende ajax }); // Ende Bind } // Ende Main function }) Result: Graph shows up. If I do a right click with the mouse the ajax command will be executed. The console in the Tapestry will show that the call has been received. The Firefox Console also gives the right feedback. BUT.. the EventContext will be a EmptyEventContext Object and therefor all data tests that I do will fail. As you can see I also tried a simple $.post variation. Also no results. Anybody
TLS termination proxy and Tapestry
Using HAProxy or Apache HTTP Server as a TLS termination proxy I found that setting X-Forwarded-Proto="https" in the header on the proxy org.apache.tapestry5.services.Request::isSecure returns true . That's good! In tapestry.production-mode=true I am getting absolute URLs. E.g. http://example.com/index.mycompo.form. By setting -Dtapestry.secure-enabled=false seems to solve this. Now I am getting a relative URL. (/index.mycompo.form). I can see that with X-Forwarded-Proto="https" set, org.apache.tapestry5.internal.services. RequestSecurityManager::checkPageSecurity returns LinkSecurity.SECURE. That's good! For me it seems that this is the correct solution, but I find it nice if some tapestry experts can confirm this!