ログ日記

作業ログと日記とメモ

ModalWindowにキャンセルボタン

ModalWindowにOKボタンとCancelボタンを作るとする。そしてonSubmitで何かの処理を行いウィンドウを閉じる。
このとき、WindowCloseCallbackの中で問答無用でAjaxRequestTarget#addしていると、Cancelボタンを押したときに処理を中断するっていうことができない。
色々触っていると、ModalWindowには×ボタンがついていて、それを押すとAjaxRequestTarget#addしていてもモデルの更新がキャンセルされるようだ。では×ボタンは一体何なのか、ModalWindowクラスにcancelとかhideっぽいメソッドは無いみたいだし…と思ってソースを見たら、ここの処理は直接JavaScriptを書き出していた。


×ボタンと同じ動作のボタンを追加したい!と思って色々試行錯誤。

import org.apache.wicket.ajax.AjaxEventBehavior;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.IAjaxCallDecorator;
import org.apache.wicket.ajax.calldecorator.CancelEventIfNoAjaxDecorator;
import org.apache.wicket.event.Broadcast;

import com.example.wicket.event.ModalCloseEvent;

@SuppressWarnings("serial")
class ModalAjaxCancelBehavior extends AjaxEventBehavior {
    public ModalAjaxCancelBehavior(String event) {
        super(event);
    }

    /**
     * Ajax処理をキャンセルする
     * @see org.apache.wicket.ajax.AbstractDefaultAjaxBehavior#getAjaxCallDecorator()
     */
    @Override
    protected IAjaxCallDecorator getAjaxCallDecorator()
    {
        return new CancelEventIfNoAjaxDecorator(super.getAjaxCallDecorator());
    }

    @Override
    protected void onEvent(AjaxRequestTarget target) {
        getComponent().send(getComponent().getPage(), Broadcast.BREADTH, new ModalCloseEvent(target));
    }
}

どうやらCancelEventIfNoAjaxDecoratorというクラスがあるらしい。検索しても利用例が全く出てこないので使い方が正しいかよく分からないが、こんな感じでいけそう。
ModalWindowの中のフォームにCancelボタンを作ってそれにビヘイビアをaddする。ボタンをクリックしたらフォームがsubmitされるんだけど大丈夫。ModalCloseEventを受け取ったら、OKボタンと同じくAjaxRequestTarget#add(targetComponent)してModalWindow#closeの処理を実行しても、targetComponentは更新されないっぽい。