Quantcast

"Confirm" mixin won't cancel when in zone

classic Classic list List threaded Threaded
8 messages Options
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

"Confirm" mixin won't cancel when in zone

Geoff Callender-3
I have a Confirm mixin that works fine until I put it in a zone. It still pops up a confirmation dialog but when Cancel is pressed the mixin fails to stop the event.

My mixin adds javascript that observes the element, but the zone seems to upset it by adding javascript directly to the element, eg:

        <a id="eventlink" onclick="javascript:Tapestry.waitForPage(event);" shape="rect" href="./simplewithzone:delete">Delete...</a>

What do I need to change in Confirm to make it stop the event when there's a zone?

Here's source for confirm.js and Confirm.java:

        var Confirm = Class.create();
        Confirm.prototype = {
                       
                initialize: function(elementId, message) {
                        this.message = message;
                        Event.observe($(elementId), 'click', this.doConfirm.bindAsEventListener(this));
                },
               
                doConfirm: function(e) {
                        if (! confirm(this.message)) {
                                e.stop();
                        }
                }
               
        }

        package jumpstart.web.mixins;
       
        import org.apache.tapestry5.BindingConstants;
        import org.apache.tapestry5.ClientElement;
        import org.apache.tapestry5.RenderSupport;
        import org.apache.tapestry5.annotations.AfterRender;
        import org.apache.tapestry5.annotations.IncludeJavaScriptLibrary;
        import org.apache.tapestry5.annotations.InjectContainer;
        import org.apache.tapestry5.annotations.Parameter;
        import org.apache.tapestry5.ioc.annotations.Inject;
       
        @IncludeJavaScriptLibrary("confirm.js")
        public class Confirm {
       
                @Parameter(value = "Are you sure?", defaultPrefix = BindingConstants.LITERAL)
                private String message;
       
                @Inject
                private RenderSupport renderSupport;
       
                @InjectContainer
                private ClientElement element;
       
                @AfterRender
                public void afterRender() {
                        renderSupport.addScript(String.format("new Confirm('%s', '%s');", element.getClientId(), message));
                }
       
        }
       
Thanks in advance,

Geoff
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: "Confirm" mixin won't cancel when in zone

Thiago H de Paula Figueiredo
On Thu, 13 May 2010 21:22:25 -0300, Geoff Callender  
<[hidden email]> wrote:

> <a id="eventlink" onclick="javascript:Tapestry.waitForPage(event);"  
> shape="rect" href="./simplewithzone:delete">Delete...</a>

I'm no JavaScript guru (very far from that, actually), but have you tried  
setting onclick to null?

--
Thiago H. de Paula Figueiredo
Independent Java, Apache Tapestry 5 and Hibernate consultant, developer,  
and instructor
Owner, Ars Machina Tecnologia da Informação Ltda.
http://www.arsmachina.com.br

---------------------------------------------------------------------
To unsubscribe, e-mail: [hidden email]
For additional commands, e-mail: [hidden email]

Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: "Confirm" mixin won't cancel when in zone

Paul Stanton-2
In reply to this post by Geoff Callender-3
just as an aside, you don't need to prefix your onclick with 'javascript:'

Geoff Callender wrote:
> <a id="eventlink" onclick="javascript:Tapestry.waitForPage(event);" shape="rect" href="./simplewithzone:delete">Delete...</a>
>  

---------------------------------------------------------------------
To unsubscribe, e-mail: [hidden email]
For additional commands, e-mail: [hidden email]

Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: "Confirm" mixin won't cancel when in zone

Geoff Callender-3
I'm not doing that - Tapestry is when it adds zone support.

On 14/05/2010, at 10:54 AM, Paul Stanton wrote:

> just as an aside, you don't need to prefix your onclick with 'javascript:'
>
> Geoff Callender wrote:
>> <a id="eventlink" onclick="javascript:Tapestry.waitForPage(event);" shape="rect" href="./simplewithzone:delete">Delete...</a>
>>  
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [hidden email]
> For additional commands, e-mail: [hidden email]
>


---------------------------------------------------------------------
To unsubscribe, e-mail: [hidden email]
For additional commands, e-mail: [hidden email]

Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: "Confirm" mixin won't cancel when in zone

Josh Canfield-2
In reply to this post by Geoff Callender-3
event.stop() prevents bubbling up to parent elements, but I don't
believe you can prevent other event handlers from firing (you can test
to see if the event.stopped property is set but it's up to the other
events to implement the check).

That said, the linkZone method sets the onclick function on the object
directly instead of using Event.observe. I haven't looked at it hard
enough to pass judgement but this gives you the opportunity to chain
the onclick handler by saving a copy in your object and replacing it
with your own function. Since you can't enforce ordering for observed
events, or prevent them from running maybe this is why onclick is set
directly.

Josh


On Thu, May 13, 2010 at 5:22 PM, Geoff Callender
<[hidden email]> wrote:

> I have a Confirm mixin that works fine until I put it in a zone. It still pops up a confirmation dialog but when Cancel is pressed the mixin fails to stop the event.
>
> My mixin adds javascript that observes the element, but the zone seems to upset it by adding javascript directly to the element, eg:
>
>        <a id="eventlink" onclick="javascript:Tapestry.waitForPage(event);" shape="rect" href="./simplewithzone:delete">Delete...</a>
>
> What do I need to change in Confirm to make it stop the event when there's a zone?
>
> Here's source for confirm.js and Confirm.java:
>
>        var Confirm = Class.create();
>        Confirm.prototype = {
>
>                initialize: function(elementId, message) {
>                        this.message = message;
>                        Event.observe($(elementId), 'click', this.doConfirm.bindAsEventListener(this));
>                },
>
>                doConfirm: function(e) {
>                        if (! confirm(this.message)) {
>                                e.stop();
>                        }
>                }
>
>        }
>
>        package jumpstart.web.mixins;
>
>        import org.apache.tapestry5.BindingConstants;
>        import org.apache.tapestry5.ClientElement;
>        import org.apache.tapestry5.RenderSupport;
>        import org.apache.tapestry5.annotations.AfterRender;
>        import org.apache.tapestry5.annotations.IncludeJavaScriptLibrary;
>        import org.apache.tapestry5.annotations.InjectContainer;
>        import org.apache.tapestry5.annotations.Parameter;
>        import org.apache.tapestry5.ioc.annotations.Inject;
>
>        @IncludeJavaScriptLibrary("confirm.js")
>        public class Confirm {
>
>                @Parameter(value = "Are you sure?", defaultPrefix = BindingConstants.LITERAL)
>                private String message;
>
>                @Inject
>                private RenderSupport renderSupport;
>
>                @InjectContainer
>                private ClientElement element;
>
>                @AfterRender
>                public void afterRender() {
>                        renderSupport.addScript(String.format("new Confirm('%s', '%s');", element.getClientId(), message));
>                }
>
>        }
>
> Thanks in advance,
>
> Geoff



--
--
http://www.bodylabgym.com - a private, by appointment only, one-on-one
health and fitness facility.
--
http://www.ectransition.com - Quality Electronic Cigarettes at a
reasonable price!
--
TheDailyTube.com. Sign up and get the best new videos on the internet
delivered fresh to your inbox.

---------------------------------------------------------------------
To unsubscribe, e-mail: [hidden email]
For additional commands, e-mail: [hidden email]

Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: "Confirm" mixin won't cancel when in zone

Geoff Callender-3
I see what you mean. The "Tapestry.waitForPage(event)" is not a problem. The real problem is that Tapestry.init (which is added to the bottom of the page after "new Confirm(...)") sets up the linkZone, part of which is adding "element.observe("click", function(event) { some XHR stuff happens here })". That's all in tapestry.js.

So ideally Confirm.doConfirm would remove or add Tapestry's linkZone click observer depending on whether you confirm or cancel the dialog box.

BUT, how do I get a list of event observers in this version of prototype (1.6.0)?

Geoff

On 14/05/2010, at 4:59 PM, Josh Canfield wrote:

> event.stop() prevents bubbling up to parent elements, but I don't
> believe you can prevent other event handlers from firing (you can test
> to see if the event.stopped property is set but it's up to the other
> events to implement the check).
>
> That said, the linkZone method sets the onclick function on the object
> directly instead of using Event.observe. I haven't looked at it hard
> enough to pass judgement but this gives you the opportunity to chain
> the onclick handler by saving a copy in your object and replacing it
> with your own function. Since you can't enforce ordering for observed
> events, or prevent them from running maybe this is why onclick is set
> directly.
>
> Josh
>
>
> On Thu, May 13, 2010 at 5:22 PM, Geoff Callender
> <[hidden email]> wrote:
>> I have a Confirm mixin that works fine until I put it in a zone. It still pops up a confirmation dialog but when Cancel is pressed the mixin fails to stop the event.
>>
>> My mixin adds javascript that observes the element, but the zone seems to upset it by adding javascript directly to the element, eg:
>>
>>        <a id="eventlink" onclick="javascript:Tapestry.waitForPage(event);" shape="rect" href="./simplewithzone:delete">Delete...</a>
>>
>> What do I need to change in Confirm to make it stop the event when there's a zone?
>>
>> Here's source for confirm.js and Confirm.java:
>>
>>        var Confirm = Class.create();
>>        Confirm.prototype = {
>>
>>                initialize: function(elementId, message) {
>>                        this.message = message;
>>                        Event.observe($(elementId), 'click', this.doConfirm.bindAsEventListener(this));
>>                },
>>
>>                doConfirm: function(e) {
>>                        if (! confirm(this.message)) {
>>                                e.stop();
>>                        }
>>                }
>>
>>        }
>>
>>        package jumpstart.web.mixins;
>>
>>        import org.apache.tapestry5.BindingConstants;
>>        import org.apache.tapestry5.ClientElement;
>>        import org.apache.tapestry5.RenderSupport;
>>        import org.apache.tapestry5.annotations.AfterRender;
>>        import org.apache.tapestry5.annotations.IncludeJavaScriptLibrary;
>>        import org.apache.tapestry5.annotations.InjectContainer;
>>        import org.apache.tapestry5.annotations.Parameter;
>>        import org.apache.tapestry5.ioc.annotations.Inject;
>>
>>        @IncludeJavaScriptLibrary("confirm.js")
>>        public class Confirm {
>>
>>                @Parameter(value = "Are you sure?", defaultPrefix = BindingConstants.LITERAL)
>>                private String message;
>>
>>                @Inject
>>                private RenderSupport renderSupport;
>>
>>                @InjectContainer
>>                private ClientElement element;
>>
>>                @AfterRender
>>                public void afterRender() {
>>                        renderSupport.addScript(String.format("new Confirm('%s', '%s');", element.getClientId(), message));
>>                }
>>
>>        }
>>
>> Thanks in advance,
>>
>> Geoff
>
>
>
> --
> --
> http://www.bodylabgym.com - a private, by appointment only, one-on-one
> health and fitness facility.
> --
> http://www.ectransition.com - Quality Electronic Cigarettes at a
> reasonable price!
> --
> TheDailyTube.com. Sign up and get the best new videos on the internet
> delivered fresh to your inbox.
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [hidden email]
> For additional commands, e-mail: [hidden email]
>

Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: "Confirm" mixin won't cancel when in zone

Josh Canfield-2
Whoops, I was looking at an old version of tapestry.js, back when they
onclick function was replaced and there wasn't the observe.

You can look at the code for stopObserving in prototype.js... but, you
really can't know what order the events are going to get fired in so
you can't just remove it from your event. You might be able to wrap
something around all the events for your link... but it's getting
complicated.

On Fri, May 14, 2010 at 7:31 AM, Geoff Callender
<[hidden email]> wrote:

> I see what you mean. The "Tapestry.waitForPage(event)" is not a problem. The real problem is that Tapestry.init (which is added to the bottom of the page after "new Confirm(...)") sets up the linkZone, part of which is adding "element.observe("click", function(event) { some XHR stuff happens here })". That's all in tapestry.js.
>
> So ideally Confirm.doConfirm would remove or add Tapestry's linkZone click observer depending on whether you confirm or cancel the dialog box.
>
> BUT, how do I get a list of event observers in this version of prototype (1.6.0)?
>
> Geoff
>
> On 14/05/2010, at 4:59 PM, Josh Canfield wrote:
>
>> event.stop() prevents bubbling up to parent elements, but I don't
>> believe you can prevent other event handlers from firing (you can test
>> to see if the event.stopped property is set but it's up to the other
>> events to implement the check).
>>
>> That said, the linkZone method sets the onclick function on the object
>> directly instead of using Event.observe. I haven't looked at it hard
>> enough to pass judgement but this gives you the opportunity to chain
>> the onclick handler by saving a copy in your object and replacing it
>> with your own function. Since you can't enforce ordering for observed
>> events, or prevent them from running maybe this is why onclick is set
>> directly.
>>
>> Josh
>>
>>
>> On Thu, May 13, 2010 at 5:22 PM, Geoff Callender
>> <[hidden email]> wrote:
>>> I have a Confirm mixin that works fine until I put it in a zone. It still pops up a confirmation dialog but when Cancel is pressed the mixin fails to stop the event.
>>>
>>> My mixin adds javascript that observes the element, but the zone seems to upset it by adding javascript directly to the element, eg:
>>>
>>>        <a id="eventlink" onclick="javascript:Tapestry.waitForPage(event);" shape="rect" href="./simplewithzone:delete">Delete...</a>
>>>
>>> What do I need to change in Confirm to make it stop the event when there's a zone?
>>>
>>> Here's source for confirm.js and Confirm.java:
>>>
>>>        var Confirm = Class.create();
>>>        Confirm.prototype = {
>>>
>>>                initialize: function(elementId, message) {
>>>                        this.message = message;
>>>                        Event.observe($(elementId), 'click', this.doConfirm.bindAsEventListener(this));
>>>                },
>>>
>>>                doConfirm: function(e) {
>>>                        if (! confirm(this.message)) {
>>>                                e.stop();
>>>                        }
>>>                }
>>>
>>>        }
>>>
>>>        package jumpstart.web.mixins;
>>>
>>>        import org.apache.tapestry5.BindingConstants;
>>>        import org.apache.tapestry5.ClientElement;
>>>        import org.apache.tapestry5.RenderSupport;
>>>        import org.apache.tapestry5.annotations.AfterRender;
>>>        import org.apache.tapestry5.annotations.IncludeJavaScriptLibrary;
>>>        import org.apache.tapestry5.annotations.InjectContainer;
>>>        import org.apache.tapestry5.annotations.Parameter;
>>>        import org.apache.tapestry5.ioc.annotations.Inject;
>>>
>>>        @IncludeJavaScriptLibrary("confirm.js")
>>>        public class Confirm {
>>>
>>>                @Parameter(value = "Are you sure?", defaultPrefix = BindingConstants.LITERAL)
>>>                private String message;
>>>
>>>                @Inject
>>>                private RenderSupport renderSupport;
>>>
>>>                @InjectContainer
>>>                private ClientElement element;
>>>
>>>                @AfterRender
>>>                public void afterRender() {
>>>                        renderSupport.addScript(String.format("new Confirm('%s', '%s');", element.getClientId(), message));
>>>                }
>>>
>>>        }
>>>
>>> Thanks in advance,
>>>
>>> Geoff
>>
>>
>>
>> --
>> --
>> http://www.bodylabgym.com - a private, by appointment only, one-on-one
>> health and fitness facility.
>> --
>> http://www.ectransition.com - Quality Electronic Cigarettes at a
>> reasonable price!
>> --
>> TheDailyTube.com. Sign up and get the best new videos on the internet
>> delivered fresh to your inbox.
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: [hidden email]
>> For additional commands, e-mail: [hidden email]
>>
>
>



--
--
http://www.bodylabgym.com - a private, by appointment only, one-on-one
health and fitness facility.
--
http://www.ectransition.com - Quality Electronic Cigarettes at a
reasonable price!
--
TheDailyTube.com. Sign up and get the best new videos on the internet
delivered fresh to your inbox.

---------------------------------------------------------------------
To unsubscribe, e-mail: [hidden email]
For additional commands, e-mail: [hidden email]

Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: "Confirm" mixin won't cancel when in zone

Geoff Callender-3
Thanks Josh, you led me to the answer. As you said, e.stop() stops bubble-up, so all I had to do was move the Confirm to an element within the EvenLink. I replaced this...

        <a t:type="eventLink" t:event="delete" t:context="list:person.id,person.version" t:zone="editorZone" href="#"
                t:mixins="Confirm" t:message="Delete ${person.firstName} ${person.lastName}?">Delete...</a>

with this...

        <a t:type="eventLink" t:event="delete" t:context="list:person.id,person.version" t:zone="editorZone" href="#">
                <span t:type="any" t:mixins="Confirm" t:message="Delete ${person.firstName} ${person.lastName}?">
                        Delete...
                </span>
        </a>

and it works like a charm!

Cheers,

Geoff


On 15/05/2010, at 1:18 AM, Josh Canfield wrote:

> Whoops, I was looking at an old version of tapestry.js, back when they
> onclick function was replaced and there wasn't the observe.
>
> You can look at the code for stopObserving in prototype.js... but, you
> really can't know what order the events are going to get fired in so
> you can't just remove it from your event. You might be able to wrap
> something around all the events for your link... but it's getting
> complicated.
>
> On Fri, May 14, 2010 at 7:31 AM, Geoff Callender
> <[hidden email]> wrote:
>> I see what you mean. The "Tapestry.waitForPage(event)" is not a problem. The real problem is that Tapestry.init (which is added to the bottom of the page after "new Confirm(...)") sets up the linkZone, part of which is adding "element.observe("click", function(event) { some XHR stuff happens here })". That's all in tapestry.js.
>>
>> So ideally Confirm.doConfirm would remove or add Tapestry's linkZone click observer depending on whether you confirm or cancel the dialog box.
>>
>> BUT, how do I get a list of event observers in this version of prototype (1.6.0)?
>>
>> Geoff
>>
>> On 14/05/2010, at 4:59 PM, Josh Canfield wrote:
>>
>>> event.stop() prevents bubbling up to parent elements, but I don't
>>> believe you can prevent other event handlers from firing (you can test
>>> to see if the event.stopped property is set but it's up to the other
>>> events to implement the check).
>>>
>>> That said, the linkZone method sets the onclick function on the object
>>> directly instead of using Event.observe. I haven't looked at it hard
>>> enough to pass judgement but this gives you the opportunity to chain
>>> the onclick handler by saving a copy in your object and replacing it
>>> with your own function. Since you can't enforce ordering for observed
>>> events, or prevent them from running maybe this is why onclick is set
>>> directly.
>>>
>>> Josh
>>>
>>>
>>> On Thu, May 13, 2010 at 5:22 PM, Geoff Callender
>>> <[hidden email]> wrote:
>>>> I have a Confirm mixin that works fine until I put it in a zone. It still pops up a confirmation dialog but when Cancel is pressed the mixin fails to stop the event.
>>>>
>>>> My mixin adds javascript that observes the element, but the zone seems to upset it by adding javascript directly to the element, eg:
>>>>
>>>>        <a id="eventlink" onclick="javascript:Tapestry.waitForPage(event);" shape="rect" href="./simplewithzone:delete">Delete...</a>
>>>>
>>>> What do I need to change in Confirm to make it stop the event when there's a zone?
>>>>
>>>> Here's source for confirm.js and Confirm.java:
>>>>
>>>>        var Confirm = Class.create();
>>>>        Confirm.prototype = {
>>>>
>>>>                initialize: function(elementId, message) {
>>>>                        this.message = message;
>>>>                        Event.observe($(elementId), 'click', this.doConfirm.bindAsEventListener(this));
>>>>                },
>>>>
>>>>                doConfirm: function(e) {
>>>>                        if (! confirm(this.message)) {
>>>>                                e.stop();
>>>>                        }
>>>>                }
>>>>
>>>>        }
>>>>
>>>>        package jumpstart.web.mixins;
>>>>
>>>>        import org.apache.tapestry5.BindingConstants;
>>>>        import org.apache.tapestry5.ClientElement;
>>>>        import org.apache.tapestry5.RenderSupport;
>>>>        import org.apache.tapestry5.annotations.AfterRender;
>>>>        import org.apache.tapestry5.annotations.IncludeJavaScriptLibrary;
>>>>        import org.apache.tapestry5.annotations.InjectContainer;
>>>>        import org.apache.tapestry5.annotations.Parameter;
>>>>        import org.apache.tapestry5.ioc.annotations.Inject;
>>>>
>>>>        @IncludeJavaScriptLibrary("confirm.js")
>>>>        public class Confirm {
>>>>
>>>>                @Parameter(value = "Are you sure?", defaultPrefix = BindingConstants.LITERAL)
>>>>                private String message;
>>>>
>>>>                @Inject
>>>>                private RenderSupport renderSupport;
>>>>
>>>>                @InjectContainer
>>>>                private ClientElement element;
>>>>
>>>>                @AfterRender
>>>>                public void afterRender() {
>>>>                        renderSupport.addScript(String.format("new Confirm('%s', '%s');", element.getClientId(), message));
>>>>                }
>>>>
>>>>        }
>>>>
>>>> Thanks in advance,
>>>>
>>>> Geoff
>>>
>>>
>>>
>>> --
>>> --
>>> http://www.bodylabgym.com - a private, by appointment only, one-on-one
>>> health and fitness facility.
>>> --
>>> http://www.ectransition.com - Quality Electronic Cigarettes at a
>>> reasonable price!
>>> --
>>> TheDailyTube.com. Sign up and get the best new videos on the internet
>>> delivered fresh to your inbox.
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: [hidden email]
>>> For additional commands, e-mail: [hidden email]
>>>
>>
>>
>
>
>
> --
> --
> http://www.bodylabgym.com - a private, by appointment only, one-on-one
> health and fitness facility.
> --
> http://www.ectransition.com - Quality Electronic Cigarettes at a
> reasonable price!
> --
> TheDailyTube.com. Sign up and get the best new videos on the internet
> delivered fresh to your inbox.
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [hidden email]
> For additional commands, e-mail: [hidden email]
>

Loading...