Wicket のバリデーション結果をモーダルで。。。

Wicket のバリデーターの機能は豊富で迷うくらいだが、バリデーション結果エラー通知については、
見た目上、feedback のメッセージを入力ページに出す機能だけが提供されている。
これを好まない人たちもいるはずだ。

feedback メッセージを モーダルダイアログで出す方法はないか?

→ ある!

feedbackPanel クラスの ul の下、li を引っ張り出して、モーダルWindow の Panel に
貼り付けてしまえば良いことに気がついた。



モーダルWindow のHTMLソース

<wicket:panel>
<div>
<ul id="_feedback_ul"></ul>
</div>
<div align="center">
   <form wicket:id="form">
      <button wicket:id="close">CLOSE</button>
   </form>
</div>
</wicket:panel>

これに対して、
   $('#_feedback_ul').html($('ul.feedbackPanel').html());
を実行して、発生した feedback メッセージを持ってきて貼り付ける。Wicket が必ず
ul タグに、feedbackPanel クラスを付与しているのである。
そのままだと残ってしまうので。
   $('ul.feedbackPanel').parent().html('');
を実行する。
(注意: jQuery 前提である)

つまり、以下のような モーダルWindow の Panel クラスを用意する。

import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.form.AjaxButton;
import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
import org.apache.wicket.markup.ComponentTag;
import org.apache.wicket.markup.MarkupStream;
import org.apache.wicket.markup.head.CssHeaderItem;
import org.apache.wicket.markup.head.IHeaderResponse;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.request.resource.CssResourceReference;
/**
 * FeedbackModal
 */

public class FeedbackModal extends Panel{
   public FeedbackModal(String id, AjaxRequestTarget target){
      this(id, target, "close");
   }
   public FeedbackModal(String id, AjaxRequestTarget target, final String closebtnLabel){
      super(id);

      // 閉じるボタン
      Form<Void> form = new Form<Void>("form");
      form.add(new AjaxButton("close"){
         @Override
         protected void onSubmit(AjaxRequestTarget target,Form<?> f){
            ModalWindow.closeCurrent(target);
         }
         @Override
         protected void onError(AjaxRequestTarget target,Form<?> f){
         }
         @Override
         public void onComponentTagBody(MarkupStream markupStream, ComponentTag openTag){
            replaceComponentTagBody(markupStream, openTag, closebtnLabel);
         }
      });
      add(form);
      target.appendJavaScript("$('#_feedback_ul').html($('ul.feedbackPanel').html());$('ul.feedbackPanel').parent().html('');");
   }
   @Override
   public void renderHead(IHeaderResponse response){
      super.renderHead(response);
      response.render(CssHeaderItem.forReference(new CssResourceReference(FeedbackModal.class, "feedbackmodal.css")));
   }
}

---------------------------------------------------------
feedbackmodal.css の内容は、以下のとおり。。

@CHARSET "UTF-8";

#_feedback_ul{
   color: #ff0000;
}
---------------------------------------------------------
使用する Page クラス側は、

<div wicket:id="feedback"></div>
<div wicket:id="errorModal"></div>

が存在すること。
Page クラスでは、、

FeedbackPanel feedback = new FeedbackPanel("feedback");
feedback.setOutputMarkupId(true);
add(feedback);


// バリデーションエラー ModalWindow
final ModalWindow errorWindow = new ModalWindow("errorModal");
errorWindow.setTitle("入力エラー");      // ← タイトル
errorWindow.setAutoSize(false);
errorWindow.setCssClassName(ModalWindow.CSS_CLASS_GRAY);
/** ModalWindow が CLOSE する時に実行されるコールバックを定義。*/
errorWindow.setWindowClosedCallback(new ModalWindow.WindowClosedCallback(){
   @Override
   public void onClose(AjaxRequestTarget target){
   }
});
add(errorWindow);

form.add(new AjaxButton("ajaxsubmit",form){
   @Override
   protected void onSubmit(AjaxRequestTarget target,Form<?> f){
      // 正常時
   }
   @Override
   protected void onError(AjaxRequestTarget target,Form<?> f){
      // モーダル表示
      target.add(f.getPage().get("feedback"));
      errorWindow.setContent(new FeedbackModal(errorWindow.getContentId(), target, "閉じる"));
      errorWindow.show(target);
   }
});

あとは、Wicket バリデーション用の properties ファイルがあれば良い。