001// Licensed under the Apache License, Version 2.0 (the "License");
002// you may not use this file except in compliance with the License.
003// You may obtain a copy of the License at
004//
005//     http://www.apache.org/licenses/LICENSE-2.0
006//
007// Unless required by applicable law or agreed to in writing, software
008// distributed under the License is distributed on an "AS IS" BASIS,
009// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
010// See the License for the specific language governing permissions and
011// limitations under the License.
012
013package org.apache.tapestry5.corelib.mixins;
014
015import org.apache.tapestry5.BindingConstants;
016import org.apache.tapestry5.MarkupWriter;
017import org.apache.tapestry5.annotations.Environmental;
018import org.apache.tapestry5.annotations.MixinAfter;
019import org.apache.tapestry5.annotations.Parameter;
020import org.apache.tapestry5.services.javascript.JavaScriptSupport;
021
022/**
023 * A mixin that can be placed on a clickable component, such as {@link org.apache.tapestry5.corelib.components.LinkSubmit},
024 * and will raise a confirmation dialog when the element is clicked.
025 *
026 * @tapestrydoc
027 * @since 5.4
028 */
029@MixinAfter
030public class Confirm
031{
032    /**
033     * The message to present to the user in the body of the modal dialog.
034     */
035    @Parameter(value = "message:private-default-confirm-message", defaultPrefix = BindingConstants.LITERAL)
036    private String message;
037
038    /**
039     * The title for the modal dialog.
040     */
041    @Parameter(value = "message:private-default-confirm-title", defaultPrefix = BindingConstants.LITERAL)
042    private String title;
043
044    /**
045     * If true, then the mixin does nothing (no attributes added, no module imported).
046     */
047    @Parameter("false")
048    private boolean disabled;
049
050    @Environmental
051    private JavaScriptSupport javaScriptSupport;
052    
053    /*
054     * The CSS class for the ok button
055     */
056    @Parameter(defaultPrefix = BindingConstants.LITERAL)
057    private String okClass;
058
059    /**
060     * The label for the ok button.
061     */
062    @Parameter(value = "message:private-default-confirm-ok", defaultPrefix = BindingConstants.LITERAL)
063    private String ok;
064
065    /**
066     * The label for the ok button.
067     */
068    @Parameter(value = "message:private-default-confirm-cancel", defaultPrefix = BindingConstants.LITERAL)
069    private String cancel;
070
071    void beginRender(MarkupWriter writer)
072    {
073        if (!disabled)
074        {
075            javaScriptSupport.require("t5/core/confirm-click");
076
077            writer.attributes("data-confirm-title", title,
078                    "data-confirm-message", message,
079                    "data-confirm-class-ok", okClass,
080                    "data-confirm-label-ok", ok,
081                    "data-confirm-label-cancel", cancel);
082        }
083    }
084}