Re: Tweaking an AjaxFormLoop
Regarding the original problem, if anyone is interested in a workaround to solve it just PM me. Cheers! Peter Stavrinides wrote: Hi Robert, Here is the new jira: https://issues.apache.org/jira/browse/TAP5-1102 Also its worth looking at https://issues.apache.org/jira/browse/TAP5-775. Although an unrelated issue, I thought that depending on what Howard was planning, this might provide some features to work off. The AjaxFormLoop is one of those components I can certainly see people using more and more of in future, so seems to me at least to be worth the effort. Cheers, Peter - Original Message - From: Robert Zeigler robe...@scazdl.org To: Tapestry users users@tapestry.apache.org Sent: Friday, 9 April, 2010 18:12:22 GMT +02:00 Athens, Beirut, Bucharest, Istanbul Subject: Re: Tweaking an AjaxFormLoop Not that I'm aware of. Feel free to search jira and create one. :) Robert On Apr 9, 2010, at 4/95:39 AM , Peter Stavrinides wrote: Nice post! and came at just the right time for me too... so thanks for the tips! +1 for feature addition, any Jira open? cheers, Peter - Original Message - From: Juan Isern juanis...@gmail.com To: users@tapestry.apache.org Sent: Friday, 9 April, 2010 08:09:40 GMT +02:00 Athens, Beirut, Bucharest, Istanbul Subject: Re: Tweaking an AjaxFormLoop Robert, following your recomendation finally implemented a component that does basically nothing but register itself as a trigger and has an id assigned by tap as well. On the client side, I have a global maptriggerId, rowInjector and a function triggerRowInjector(triggerId) so that I can inject rows selectively. As for the effect thing, you can see that they're hardcoded in the function Tapestry.Initializer.formLoopRemoveLink so I overrode it making them consistent. I'm using tapestry 5.1.0.5, so I expect this solution to be broken by... 5.2, maybe? :P Robert Zeigler wrote: That just sounds like you're asking for trouble down the road, though. ;) You're effectively relying on implementation details of the component. It'll break if: * AjaxFormLoop changes the id of the contained RowInjector component * You want more than one AjaxFormLoop on the page I'll grant you that it works... for now. :) And it's the sort of solution I might put in projects that I write for myself, but not a solution I would put into a project I write for clients. It's probably worth submitting a jira for a feature addition to make this sort of functionality easier/more robust. Robert On Apr 8, 2010, at 4/89:20 PM , Brian Heston wrote: I've done something similar without much hacking. In my case I have an autocomplete field in each row, and when a selection is made I needed to add a new row automatically so the user can enter the next item. I found that the row injector always has the same name, so I just call the trigger function defined in tapestry.js when I want to add the new row. The addRow parameter is empty so the link doesn't render, but the trigger still does. div t:type=ajaxFormLoop t:source=items t:value=item t:submitNotifier input type=text t:type=textField t:value=item.name t:mixins=autocomplete2 t:afterUpdateElement=itemSelected/ /t:submitNotifier ... t:parameter name=addRow/t:parameter /div function itemSelected() { $(rowInjector).trigger(); } You may notice that I'm using my own autocomplete mixin, which I had to make to expose the afterUpdateElement event, but if you've got some other logic that invokes the adding of a row the idea should be the same. Hope this helps, Brian From: Juan Isern [juanis...@gmail.com] Sent: Thursday, April 08, 2010 6:43 PM To: users@tapestry.apache.org Subject: Re: Tweaking an AjaxFormLoop Robert, I've got to say that you gave me the answer that I feared most. Hehe, REALLY thanks for your tips, I knew already that sooner or later I had to hack into tapestry.js Cheers! Robert Zeigler wrote: On Apr 8, 2010, at 4/81:48 PM , Juan Isern wrote: What I would like to do is to trigger an addRow event by executing some javascript (that will be invoked when an upload finishes). I thought of simulating a click event on an invisible add row link but I'm sure there's a prettier solution out there. There are other ways to do it, although I'm not sure I would call them prettier. :) AjaxFormLoop places an AjaxFormLoopContext object into the environment when it renders. You can access this object and add a call to addAddRowTrigger. That part is pretty. The main issue (for you) is that tapestry then assumes that the trigger is going to be invoked on the click action, which isn't what you want in this case. There's a way around it, and that's where things get uglier. You can monkey patch tapestry.js to override Tapestry.Initializer.ajaxFormLoop, and make it behave how
Re: Tweaking an AjaxFormLoop
Hi Robert, Here is the new jira: https://issues.apache.org/jira/browse/TAP5-1102 Also its worth looking at https://issues.apache.org/jira/browse/TAP5-775. Although an unrelated issue, I thought that depending on what Howard was planning, this might provide some features to work off. The AjaxFormLoop is one of those components I can certainly see people using more and more of in future, so seems to me at least to be worth the effort. Cheers, Peter - Original Message - From: Robert Zeigler robe...@scazdl.org To: Tapestry users users@tapestry.apache.org Sent: Friday, 9 April, 2010 18:12:22 GMT +02:00 Athens, Beirut, Bucharest, Istanbul Subject: Re: Tweaking an AjaxFormLoop Not that I'm aware of. Feel free to search jira and create one. :) Robert On Apr 9, 2010, at 4/95:39 AM , Peter Stavrinides wrote: Nice post! and came at just the right time for me too... so thanks for the tips! +1 for feature addition, any Jira open? cheers, Peter - Original Message - From: Juan Isern juanis...@gmail.com To: users@tapestry.apache.org Sent: Friday, 9 April, 2010 08:09:40 GMT +02:00 Athens, Beirut, Bucharest, Istanbul Subject: Re: Tweaking an AjaxFormLoop Robert, following your recomendation finally implemented a component that does basically nothing but register itself as a trigger and has an id assigned by tap as well. On the client side, I have a global maptriggerId, rowInjector and a function triggerRowInjector(triggerId) so that I can inject rows selectively. As for the effect thing, you can see that they're hardcoded in the function Tapestry.Initializer.formLoopRemoveLink so I overrode it making them consistent. I'm using tapestry 5.1.0.5, so I expect this solution to be broken by... 5.2, maybe? :P Robert Zeigler wrote: That just sounds like you're asking for trouble down the road, though. ;) You're effectively relying on implementation details of the component. It'll break if: * AjaxFormLoop changes the id of the contained RowInjector component * You want more than one AjaxFormLoop on the page I'll grant you that it works... for now. :) And it's the sort of solution I might put in projects that I write for myself, but not a solution I would put into a project I write for clients. It's probably worth submitting a jira for a feature addition to make this sort of functionality easier/more robust. Robert On Apr 8, 2010, at 4/89:20 PM , Brian Heston wrote: I've done something similar without much hacking. In my case I have an autocomplete field in each row, and when a selection is made I needed to add a new row automatically so the user can enter the next item. I found that the row injector always has the same name, so I just call the trigger function defined in tapestry.js when I want to add the new row. The addRow parameter is empty so the link doesn't render, but the trigger still does. div t:type=ajaxFormLoop t:source=items t:value=item t:submitNotifier input type=text t:type=textField t:value=item.name t:mixins=autocomplete2 t:afterUpdateElement=itemSelected/ /t:submitNotifier ... t:parameter name=addRow/t:parameter /div function itemSelected() { $(rowInjector).trigger(); } You may notice that I'm using my own autocomplete mixin, which I had to make to expose the afterUpdateElement event, but if you've got some other logic that invokes the adding of a row the idea should be the same. Hope this helps, Brian From: Juan Isern [juanis...@gmail.com] Sent: Thursday, April 08, 2010 6:43 PM To: users@tapestry.apache.org Subject: Re: Tweaking an AjaxFormLoop Robert, I've got to say that you gave me the answer that I feared most. Hehe, REALLY thanks for your tips, I knew already that sooner or later I had to hack into tapestry.js Cheers! Robert Zeigler wrote: On Apr 8, 2010, at 4/81:48 PM , Juan Isern wrote: What I would like to do is to trigger an addRow event by executing some javascript (that will be invoked when an upload finishes). I thought of simulating a click event on an invisible add row link but I'm sure there's a prettier solution out there. There are other ways to do it, although I'm not sure I would call them prettier. :) AjaxFormLoop places an AjaxFormLoopContext object into the environment when it renders. You can access this object and add a call to addAddRowTrigger. That part is pretty. The main issue (for you) is that tapestry then assumes that the trigger is going to be invoked on the click action, which isn't what you want in this case. There's a way around it, and that's where things get uglier. You can monkey patch tapestry.js to override Tapestry.Initializer.ajaxFormLoop, and make it behave how you want. This is typically how I've implemented custom add row functionality. It might be a nifty change to enable a second form of the addAddRowTrigger
Re: Tweaking an AjaxFormLoop
Nice post! and came at just the right time for me too... so thanks for the tips! +1 for feature addition, any Jira open? cheers, Peter - Original Message - From: Juan Isern juanis...@gmail.com To: users@tapestry.apache.org Sent: Friday, 9 April, 2010 08:09:40 GMT +02:00 Athens, Beirut, Bucharest, Istanbul Subject: Re: Tweaking an AjaxFormLoop Robert, following your recomendation finally implemented a component that does basically nothing but register itself as a trigger and has an id assigned by tap as well. On the client side, I have a global maptriggerId, rowInjector and a function triggerRowInjector(triggerId) so that I can inject rows selectively. As for the effect thing, you can see that they're hardcoded in the function Tapestry.Initializer.formLoopRemoveLink so I overrode it making them consistent. I'm using tapestry 5.1.0.5, so I expect this solution to be broken by... 5.2, maybe? :P Robert Zeigler wrote: That just sounds like you're asking for trouble down the road, though. ;) You're effectively relying on implementation details of the component. It'll break if: * AjaxFormLoop changes the id of the contained RowInjector component * You want more than one AjaxFormLoop on the page I'll grant you that it works... for now. :) And it's the sort of solution I might put in projects that I write for myself, but not a solution I would put into a project I write for clients. It's probably worth submitting a jira for a feature addition to make this sort of functionality easier/more robust. Robert On Apr 8, 2010, at 4/89:20 PM , Brian Heston wrote: I've done something similar without much hacking. In my case I have an autocomplete field in each row, and when a selection is made I needed to add a new row automatically so the user can enter the next item. I found that the row injector always has the same name, so I just call the trigger function defined in tapestry.js when I want to add the new row. The addRow parameter is empty so the link doesn't render, but the trigger still does. div t:type=ajaxFormLoop t:source=items t:value=item t:submitNotifier input type=text t:type=textField t:value=item.name t:mixins=autocomplete2 t:afterUpdateElement=itemSelected/ /t:submitNotifier ... t:parameter name=addRow/t:parameter /div function itemSelected() { $(rowInjector).trigger(); } You may notice that I'm using my own autocomplete mixin, which I had to make to expose the afterUpdateElement event, but if you've got some other logic that invokes the adding of a row the idea should be the same. Hope this helps, Brian From: Juan Isern [juanis...@gmail.com] Sent: Thursday, April 08, 2010 6:43 PM To: users@tapestry.apache.org Subject: Re: Tweaking an AjaxFormLoop Robert, I've got to say that you gave me the answer that I feared most. Hehe, REALLY thanks for your tips, I knew already that sooner or later I had to hack into tapestry.js Cheers! Robert Zeigler wrote: On Apr 8, 2010, at 4/81:48 PM , Juan Isern wrote: What I would like to do is to trigger an addRow event by executing some javascript (that will be invoked when an upload finishes). I thought of simulating a click event on an invisible add row link but I'm sure there's a prettier solution out there. There are other ways to do it, although I'm not sure I would call them prettier. :) AjaxFormLoop places an AjaxFormLoopContext object into the environment when it renders. You can access this object and add a call to addAddRowTrigger. That part is pretty. The main issue (for you) is that tapestry then assumes that the trigger is going to be invoked on the click action, which isn't what you want in this case. There's a way around it, and that's where things get uglier. You can monkey patch tapestry.js to override Tapestry.Initializer.ajaxFormLoop, and make it behave how you want. This is typically how I've implemented custom add row functionality. It might be a nifty change to enable a second form of the addAddRowTrigger that takes, say, a js callback name as a 2nd argument. Or perhaps some flag triggering whether the first argument is an id or a callback. In any event, the initializer could then check for the appropriate condition, and if the condition is met, the initializer would delegate the setup to the callback, passing in the row injector, rather than assuming a click. If there's enough interest in something like this, I would be willing to do the work to add it to the framework (the exact api would need to be worked out, though). The same question could apply to any client-side ajax behavior, like refreshing zones. Is there any way to do it programmatically via javascript? The best answer here is to take a look for yourself through (mainly) the tapestry.js file. But, yes, you can refresh zones in non
Re: Tweaking an AjaxFormLoop
Not that I'm aware of. Feel free to search jira and create one. :) Robert On Apr 9, 2010, at 4/95:39 AM , Peter Stavrinides wrote: Nice post! and came at just the right time for me too... so thanks for the tips! +1 for feature addition, any Jira open? cheers, Peter - Original Message - From: Juan Isern juanis...@gmail.com To: users@tapestry.apache.org Sent: Friday, 9 April, 2010 08:09:40 GMT +02:00 Athens, Beirut, Bucharest, Istanbul Subject: Re: Tweaking an AjaxFormLoop Robert, following your recomendation finally implemented a component that does basically nothing but register itself as a trigger and has an id assigned by tap as well. On the client side, I have a global maptriggerId, rowInjector and a function triggerRowInjector(triggerId) so that I can inject rows selectively. As for the effect thing, you can see that they're hardcoded in the function Tapestry.Initializer.formLoopRemoveLink so I overrode it making them consistent. I'm using tapestry 5.1.0.5, so I expect this solution to be broken by... 5.2, maybe? :P Robert Zeigler wrote: That just sounds like you're asking for trouble down the road, though. ;) You're effectively relying on implementation details of the component. It'll break if: * AjaxFormLoop changes the id of the contained RowInjector component * You want more than one AjaxFormLoop on the page I'll grant you that it works... for now. :) And it's the sort of solution I might put in projects that I write for myself, but not a solution I would put into a project I write for clients. It's probably worth submitting a jira for a feature addition to make this sort of functionality easier/more robust. Robert On Apr 8, 2010, at 4/89:20 PM , Brian Heston wrote: I've done something similar without much hacking. In my case I have an autocomplete field in each row, and when a selection is made I needed to add a new row automatically so the user can enter the next item. I found that the row injector always has the same name, so I just call the trigger function defined in tapestry.js when I want to add the new row. The addRow parameter is empty so the link doesn't render, but the trigger still does. div t:type=ajaxFormLoop t:source=items t:value=item t:submitNotifier input type=text t:type=textField t:value=item.name t:mixins=autocomplete2 t:afterUpdateElement=itemSelected/ /t:submitNotifier ... t:parameter name=addRow/t:parameter /div function itemSelected() { $(rowInjector).trigger(); } You may notice that I'm using my own autocomplete mixin, which I had to make to expose the afterUpdateElement event, but if you've got some other logic that invokes the adding of a row the idea should be the same. Hope this helps, Brian From: Juan Isern [juanis...@gmail.com] Sent: Thursday, April 08, 2010 6:43 PM To: users@tapestry.apache.org Subject: Re: Tweaking an AjaxFormLoop Robert, I've got to say that you gave me the answer that I feared most. Hehe, REALLY thanks for your tips, I knew already that sooner or later I had to hack into tapestry.js Cheers! Robert Zeigler wrote: On Apr 8, 2010, at 4/81:48 PM , Juan Isern wrote: What I would like to do is to trigger an addRow event by executing some javascript (that will be invoked when an upload finishes). I thought of simulating a click event on an invisible add row link but I'm sure there's a prettier solution out there. There are other ways to do it, although I'm not sure I would call them prettier. :) AjaxFormLoop places an AjaxFormLoopContext object into the environment when it renders. You can access this object and add a call to addAddRowTrigger. That part is pretty. The main issue (for you) is that tapestry then assumes that the trigger is going to be invoked on the click action, which isn't what you want in this case. There's a way around it, and that's where things get uglier. You can monkey patch tapestry.js to override Tapestry.Initializer.ajaxFormLoop, and make it behave how you want. This is typically how I've implemented custom add row functionality. It might be a nifty change to enable a second form of the addAddRowTrigger that takes, say, a js callback name as a 2nd argument. Or perhaps some flag triggering whether the first argument is an id or a callback. In any event, the initializer could then check for the appropriate condition, and if the condition is met, the initializer would delegate the setup to the callback, passing in the row injector, rather than assuming a click. If there's enough interest in something like this, I would be willing to do the work to add it to the framework (the exact api would need to be worked out, though). The same question could apply to any client-side ajax behavior, like refreshing zones. Is there any way to do it programmatically via javascript? The best answer here is to take a look for yourself through (mainly) the tapestry.js file
Re: Tweaking an AjaxFormLoop
On Apr 8, 2010, at 4/81:48 PM , Juan Isern wrote: What I would like to do is to trigger an addRow event by executing some javascript (that will be invoked when an upload finishes). I thought of simulating a click event on an invisible add row link but I'm sure there's a prettier solution out there. There are other ways to do it, although I'm not sure I would call them prettier. :) AjaxFormLoop places an AjaxFormLoopContext object into the environment when it renders. You can access this object and add a call to addAddRowTrigger. That part is pretty. The main issue (for you) is that tapestry then assumes that the trigger is going to be invoked on the click action, which isn't what you want in this case. There's a way around it, and that's where things get uglier. You can monkey patch tapestry.js to override Tapestry.Initializer.ajaxFormLoop, and make it behave how you want. This is typically how I've implemented custom add row functionality. It might be a nifty change to enable a second form of the addAddRowTrigger that takes, say, a js callback name as a 2nd argument. Or perhaps some flag triggering whether the first argument is an id or a callback. In any event, the initializer could then check for the appropriate condition, and if the condition is met, the initializer would delegate the setup to the callback, passing in the row injector, rather than assuming a click. If there's enough interest in something like this, I would be willing to do the work to add it to the framework (the exact api would need to be worked out, though). The same question could apply to any client-side ajax behavior, like refreshing zones. Is there any way to do it programmatically via javascript? The best answer here is to take a look for yourself through (mainly) the tapestry.js file. But, yes, you can refresh zones in non-default ways; the trick (as with AjaxFormLoop above) is getting a handle to the runtime js objects. Another thing: the javascript effect displayed when a row is added/ removed behaves in a somewhat weird fashion. Can be this effect be disabled or configured? http://tapestry.apache.org/tapestry5.1/tapestry-core/ref/org/apache/tapestry5/corelib/components/AjaxFormLoop.html Check out the show parameter. Thanks a lot! -- View this message in context: http://old.nabble.com/Tweaking-an-AjaxFormLoop-tp28182870p28182870.html Sent from the Tapestry - User mailing list archive at Nabble.com. - To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org For additional commands, e-mail: users-h...@tapestry.apache.org - To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org For additional commands, e-mail: users-h...@tapestry.apache.org
Re: Tweaking an AjaxFormLoop
Robert, I've got to say that you gave me the answer that I feared most. Hehe, REALLY thanks for your tips, I knew already that sooner or later I had to hack into tapestry.js Cheers! Robert Zeigler wrote: On Apr 8, 2010, at 4/81:48 PM , Juan Isern wrote: What I would like to do is to trigger an addRow event by executing some javascript (that will be invoked when an upload finishes). I thought of simulating a click event on an invisible add row link but I'm sure there's a prettier solution out there. There are other ways to do it, although I'm not sure I would call them prettier. :) AjaxFormLoop places an AjaxFormLoopContext object into the environment when it renders. You can access this object and add a call to addAddRowTrigger. That part is pretty. The main issue (for you) is that tapestry then assumes that the trigger is going to be invoked on the click action, which isn't what you want in this case. There's a way around it, and that's where things get uglier. You can monkey patch tapestry.js to override Tapestry.Initializer.ajaxFormLoop, and make it behave how you want. This is typically how I've implemented custom add row functionality. It might be a nifty change to enable a second form of the addAddRowTrigger that takes, say, a js callback name as a 2nd argument. Or perhaps some flag triggering whether the first argument is an id or a callback. In any event, the initializer could then check for the appropriate condition, and if the condition is met, the initializer would delegate the setup to the callback, passing in the row injector, rather than assuming a click. If there's enough interest in something like this, I would be willing to do the work to add it to the framework (the exact api would need to be worked out, though). The same question could apply to any client-side ajax behavior, like refreshing zones. Is there any way to do it programmatically via javascript? The best answer here is to take a look for yourself through (mainly) the tapestry.js file. But, yes, you can refresh zones in non-default ways; the trick (as with AjaxFormLoop above) is getting a handle to the runtime js objects. Another thing: the javascript effect displayed when a row is added/ removed behaves in a somewhat weird fashion. Can be this effect be disabled or configured? http://tapestry.apache.org/tapestry5.1/tapestry-core/ref/org/apache/tapestry5/corelib/components/AjaxFormLoop.html Check out the show parameter. Thanks a lot! -- View this message in context: http://old.nabble.com/Tweaking-an-AjaxFormLoop-tp28182870p28182870.html Sent from the Tapestry - User mailing list archive at Nabble.com. - To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org For additional commands, e-mail: users-h...@tapestry.apache.org - To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org For additional commands, e-mail: users-h...@tapestry.apache.org -- View this message in context: http://old.nabble.com/Tweaking-an-AjaxFormLoop-tp28182870p28186610.html Sent from the Tapestry - User mailing list archive at Nabble.com. - To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org For additional commands, e-mail: users-h...@tapestry.apache.org
RE: Tweaking an AjaxFormLoop
I've done something similar without much hacking. In my case I have an autocomplete field in each row, and when a selection is made I needed to add a new row automatically so the user can enter the next item. I found that the row injector always has the same name, so I just call the trigger function defined in tapestry.js when I want to add the new row. The addRow parameter is empty so the link doesn't render, but the trigger still does. div t:type=ajaxFormLoop t:source=items t:value=item t:submitNotifier input type=text t:type=textField t:value=item.name t:mixins=autocomplete2 t:afterUpdateElement=itemSelected/ /t:submitNotifier ... t:parameter name=addRow/t:parameter /div function itemSelected() { $(rowInjector).trigger(); } You may notice that I'm using my own autocomplete mixin, which I had to make to expose the afterUpdateElement event, but if you've got some other logic that invokes the adding of a row the idea should be the same. Hope this helps, Brian From: Juan Isern [juanis...@gmail.com] Sent: Thursday, April 08, 2010 6:43 PM To: users@tapestry.apache.org Subject: Re: Tweaking an AjaxFormLoop Robert, I've got to say that you gave me the answer that I feared most. Hehe, REALLY thanks for your tips, I knew already that sooner or later I had to hack into tapestry.js Cheers! Robert Zeigler wrote: On Apr 8, 2010, at 4/81:48 PM , Juan Isern wrote: What I would like to do is to trigger an addRow event by executing some javascript (that will be invoked when an upload finishes). I thought of simulating a click event on an invisible add row link but I'm sure there's a prettier solution out there. There are other ways to do it, although I'm not sure I would call them prettier. :) AjaxFormLoop places an AjaxFormLoopContext object into the environment when it renders. You can access this object and add a call to addAddRowTrigger. That part is pretty. The main issue (for you) is that tapestry then assumes that the trigger is going to be invoked on the click action, which isn't what you want in this case. There's a way around it, and that's where things get uglier. You can monkey patch tapestry.js to override Tapestry.Initializer.ajaxFormLoop, and make it behave how you want. This is typically how I've implemented custom add row functionality. It might be a nifty change to enable a second form of the addAddRowTrigger that takes, say, a js callback name as a 2nd argument. Or perhaps some flag triggering whether the first argument is an id or a callback. In any event, the initializer could then check for the appropriate condition, and if the condition is met, the initializer would delegate the setup to the callback, passing in the row injector, rather than assuming a click. If there's enough interest in something like this, I would be willing to do the work to add it to the framework (the exact api would need to be worked out, though). The same question could apply to any client-side ajax behavior, like refreshing zones. Is there any way to do it programmatically via javascript? The best answer here is to take a look for yourself through (mainly) the tapestry.js file. But, yes, you can refresh zones in non-default ways; the trick (as with AjaxFormLoop above) is getting a handle to the runtime js objects. Another thing: the javascript effect displayed when a row is added/ removed behaves in a somewhat weird fashion. Can be this effect be disabled or configured? http://tapestry.apache.org/tapestry5.1/tapestry-core/ref/org/apache/tapestry5/corelib/components/AjaxFormLoop.html Check out the show parameter. Thanks a lot! -- View this message in context: http://old.nabble.com/Tweaking-an-AjaxFormLoop-tp28182870p28182870.html Sent from the Tapestry - User mailing list archive at Nabble.com. - To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org For additional commands, e-mail: users-h...@tapestry.apache.org - To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org For additional commands, e-mail: users-h...@tapestry.apache.org -- View this message in context: http://old.nabble.com/Tweaking-an-AjaxFormLoop-tp28182870p28186610.html Sent from the Tapestry - User mailing list archive at Nabble.com. - To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org For additional commands, e-mail: users-h...@tapestry.apache.org - To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org For additional commands, e-mail: users-h...@tapestry.apache.org
Re: Tweaking an AjaxFormLoop
That just sounds like you're asking for trouble down the road, though. ;) You're effectively relying on implementation details of the component. It'll break if: * AjaxFormLoop changes the id of the contained RowInjector component * You want more than one AjaxFormLoop on the page I'll grant you that it works... for now. :) And it's the sort of solution I might put in projects that I write for myself, but not a solution I would put into a project I write for clients. It's probably worth submitting a jira for a feature addition to make this sort of functionality easier/more robust. Robert On Apr 8, 2010, at 4/89:20 PM , Brian Heston wrote: I've done something similar without much hacking. In my case I have an autocomplete field in each row, and when a selection is made I needed to add a new row automatically so the user can enter the next item. I found that the row injector always has the same name, so I just call the trigger function defined in tapestry.js when I want to add the new row. The addRow parameter is empty so the link doesn't render, but the trigger still does. div t:type=ajaxFormLoop t:source=items t:value=item t:submitNotifier input type=text t:type=textField t:value=item.name t:mixins=autocomplete2 t:afterUpdateElement=itemSelected/ /t:submitNotifier ... t:parameter name=addRow/t:parameter /div function itemSelected() { $(rowInjector).trigger(); } You may notice that I'm using my own autocomplete mixin, which I had to make to expose the afterUpdateElement event, but if you've got some other logic that invokes the adding of a row the idea should be the same. Hope this helps, Brian From: Juan Isern [juanis...@gmail.com] Sent: Thursday, April 08, 2010 6:43 PM To: users@tapestry.apache.org Subject: Re: Tweaking an AjaxFormLoop Robert, I've got to say that you gave me the answer that I feared most. Hehe, REALLY thanks for your tips, I knew already that sooner or later I had to hack into tapestry.js Cheers! Robert Zeigler wrote: On Apr 8, 2010, at 4/81:48 PM , Juan Isern wrote: What I would like to do is to trigger an addRow event by executing some javascript (that will be invoked when an upload finishes). I thought of simulating a click event on an invisible add row link but I'm sure there's a prettier solution out there. There are other ways to do it, although I'm not sure I would call them prettier. :) AjaxFormLoop places an AjaxFormLoopContext object into the environment when it renders. You can access this object and add a call to addAddRowTrigger. That part is pretty. The main issue (for you) is that tapestry then assumes that the trigger is going to be invoked on the click action, which isn't what you want in this case. There's a way around it, and that's where things get uglier. You can monkey patch tapestry.js to override Tapestry.Initializer.ajaxFormLoop, and make it behave how you want. This is typically how I've implemented custom add row functionality. It might be a nifty change to enable a second form of the addAddRowTrigger that takes, say, a js callback name as a 2nd argument. Or perhaps some flag triggering whether the first argument is an id or a callback. In any event, the initializer could then check for the appropriate condition, and if the condition is met, the initializer would delegate the setup to the callback, passing in the row injector, rather than assuming a click. If there's enough interest in something like this, I would be willing to do the work to add it to the framework (the exact api would need to be worked out, though). The same question could apply to any client-side ajax behavior, like refreshing zones. Is there any way to do it programmatically via javascript? The best answer here is to take a look for yourself through (mainly) the tapestry.js file. But, yes, you can refresh zones in non-default ways; the trick (as with AjaxFormLoop above) is getting a handle to the runtime js objects. Another thing: the javascript effect displayed when a row is added/ removed behaves in a somewhat weird fashion. Can be this effect be disabled or configured? http://tapestry.apache.org/tapestry5.1/tapestry-core/ref/org/apache/tapestry5/corelib/components/AjaxFormLoop.html Check out the show parameter. Thanks a lot! -- View this message in context: http://old.nabble.com/Tweaking-an-AjaxFormLoop-tp28182870p28182870.html Sent from the Tapestry - User mailing list archive at Nabble.com. - To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org For additional commands, e-mail: users-h...@tapestry.apache.org - To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org For additional commands, e-mail: users-h...@tapestry.apache.org -- View this message in context
Re: Tweaking an AjaxFormLoop
Robert, following your recomendation finally implemented a component that does basically nothing but register itself as a trigger and has an id assigned by tap as well. On the client side, I have a global maptriggerId, rowInjector and a function triggerRowInjector(triggerId) so that I can inject rows selectively. As for the effect thing, you can see that they're hardcoded in the function Tapestry.Initializer.formLoopRemoveLink so I overrode it making them consistent. I'm using tapestry 5.1.0.5, so I expect this solution to be broken by... 5.2, maybe? :P Robert Zeigler wrote: That just sounds like you're asking for trouble down the road, though. ;) You're effectively relying on implementation details of the component. It'll break if: * AjaxFormLoop changes the id of the contained RowInjector component * You want more than one AjaxFormLoop on the page I'll grant you that it works... for now. :) And it's the sort of solution I might put in projects that I write for myself, but not a solution I would put into a project I write for clients. It's probably worth submitting a jira for a feature addition to make this sort of functionality easier/more robust. Robert On Apr 8, 2010, at 4/89:20 PM , Brian Heston wrote: I've done something similar without much hacking. In my case I have an autocomplete field in each row, and when a selection is made I needed to add a new row automatically so the user can enter the next item. I found that the row injector always has the same name, so I just call the trigger function defined in tapestry.js when I want to add the new row. The addRow parameter is empty so the link doesn't render, but the trigger still does. div t:type=ajaxFormLoop t:source=items t:value=item t:submitNotifier input type=text t:type=textField t:value=item.name t:mixins=autocomplete2 t:afterUpdateElement=itemSelected/ /t:submitNotifier ... t:parameter name=addRow/t:parameter /div function itemSelected() { $(rowInjector).trigger(); } You may notice that I'm using my own autocomplete mixin, which I had to make to expose the afterUpdateElement event, but if you've got some other logic that invokes the adding of a row the idea should be the same. Hope this helps, Brian From: Juan Isern [juanis...@gmail.com] Sent: Thursday, April 08, 2010 6:43 PM To: users@tapestry.apache.org Subject: Re: Tweaking an AjaxFormLoop Robert, I've got to say that you gave me the answer that I feared most. Hehe, REALLY thanks for your tips, I knew already that sooner or later I had to hack into tapestry.js Cheers! Robert Zeigler wrote: On Apr 8, 2010, at 4/81:48 PM , Juan Isern wrote: What I would like to do is to trigger an addRow event by executing some javascript (that will be invoked when an upload finishes). I thought of simulating a click event on an invisible add row link but I'm sure there's a prettier solution out there. There are other ways to do it, although I'm not sure I would call them prettier. :) AjaxFormLoop places an AjaxFormLoopContext object into the environment when it renders. You can access this object and add a call to addAddRowTrigger. That part is pretty. The main issue (for you) is that tapestry then assumes that the trigger is going to be invoked on the click action, which isn't what you want in this case. There's a way around it, and that's where things get uglier. You can monkey patch tapestry.js to override Tapestry.Initializer.ajaxFormLoop, and make it behave how you want. This is typically how I've implemented custom add row functionality. It might be a nifty change to enable a second form of the addAddRowTrigger that takes, say, a js callback name as a 2nd argument. Or perhaps some flag triggering whether the first argument is an id or a callback. In any event, the initializer could then check for the appropriate condition, and if the condition is met, the initializer would delegate the setup to the callback, passing in the row injector, rather than assuming a click. If there's enough interest in something like this, I would be willing to do the work to add it to the framework (the exact api would need to be worked out, though). The same question could apply to any client-side ajax behavior, like refreshing zones. Is there any way to do it programmatically via javascript? The best answer here is to take a look for yourself through (mainly) the tapestry.js file. But, yes, you can refresh zones in non-default ways; the trick (as with AjaxFormLoop above) is getting a handle to the runtime js objects. Another thing: the javascript effect displayed when a row is added/ removed behaves in a somewhat weird fashion. Can be this effect be disabled or configured? http://tapestry.apache.org/tapestry5.1/tapestry-core/ref/org/apache/tapestry5/corelib