読者です 読者をやめる 読者になる 読者になる

Link.onClick static が消滅して欲しくない。それならば、、

Wicket8 でラムダによる AjaxButton.onSubmit static メソッドの登場と思いきや、8.0.0-M4 から M5 以降で消滅して
AjaxFormSubmitBehavior を使うのを納得したが、Link の onClick static メソッドでのラムダも消滅してるのは、
非常に残念だ。
Ajax ではなく、普通にリンク onclick に対するラムダ式記述効果の恩恵が欲しかったのに。。
  
http://oboe2uran.hatenablog.com/entry/2017/05/24/001329
http://oboe2uran.hatenablog.com/entry/2017/05/24/001329

HTML aタグに、Button コンポーネント充てて書きたくはないのである。

それなら、8.0.0-M4 で書かれていた方法で、自分用に org.apache.wicket.markup.html.link.Link を継承して
用意してしまえばいい。

import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.model.IModel;
import org.apache.wicket.util.lang.Args;
import org.danekja.java.util.function.serializable.SerializableConsumer;
/**
 * Link を継承、static onClick を追加
 */
public abstract class XLink<T> extends Link<T>{

   public XLink(String id){
      super(id);
   }

   public XLink(String id, IModel<T> model){
      super(id, model);
   }

   public static <T> XLink<T> onClick(String id, SerializableConsumer<XLink<T>> onClick){
      Args.notNull(onClick, "onClick");
      return new XLink<T>(id){
         private static final long serialVersionUID = 1L;
         @Override
         public void onClick(){
            onClick.accept(this);
         }
      };
   }
}

これを使えば、以下のようなものが書けるし、ラムダ式でいろいろクリック時の処理が、シリアライズの制約があるものの
書ける。

queue(XLink.onClick("linkid", t->setResponsePage(SamplePage.class, new PageParameters().add("code", "ABC") )));


以下を考えた人が凄いんだと思う。

GitHub - danekja/jdk-serializable-functional: Library with serializable versions of java.util.function.* interfaces.

AjaxFormSubmitBehavior があるから心配ない。

先月、Wicket-8.0.0-M4 から M5 まで更新された時、 AjaxButton.onSubmit staticメソッドの BiConsumer 使用が
削除されていて、ショックだったけど、

Wicket 8.0.0-M4 から M5 で、AjaxButton.onSubmit が。。。 - Oboe吹きプログラマの黙示録


よーく調べると、org.apache.wicket.ajax.form.AjaxFormSubmitBehavior があるから、ビヘビアとして
onSubmit の振る舞いをラムダを書きたければ、
  
public static AjaxFormSubmitBehavior onSubmit(String eventName,
SerializableConsumer onSubmit)

を使えということになったみたいだ。
M4 の static AjaxButton#onSubmit は、SerializableBiConsumer で、ボタンコンポーネントも引数だったが、
ここで、自身のボタンコンポーネントを引数にもらっても、用はない。
AjaxRequestTarget だけで充分だ。


<button wicket:id="send" type="button">送信</button> のようなものがあった時、

queue(new Button("send").add(AjaxFormSubmitBehavior.onSubmit("click", t->{
   response.setDefaultModelObject(info.getValue());
   t.add(response);
})));


みたいに書くことになる。ただ、onError に対するラムダは無い。役にたたないから消えたのかも。。。
ビヘビアとして add するのが長いコードになる気もしたが、Wicket は、昔からビヘビアを書くことの重要さを
考えると納得もしてくる。
このビヘビアの書き方の方が、あらゆる事象で実行させたいものを埋め込むということができるような気がする。

すると、ルーツである Behavior には、

public static Behavior onAttribute(String name,
     SerializableFunction<String, CharSequence> onAttribute)

と、

public static Behavior onTag(SerializableBiConsumer<Component, ComponentTag> onTagConsumer)

があるではないですか。

onComponentTag オーバーライドや、AttrobuteModifier やらを書かなくてもこれらラムダで書けてしまうって
ことだとろうか。。。

時間がある時に、書いてみようと思う。

もう、M5から、Wicket-8.0.0-M6 になってる。

事の発端は、以下のこんな議論・検討があったからだけど、ラムダのファクトリ staticメソッドがコードを書く側から
見れば、やはり魅力的なんだけど、視点をコード書く側のことも考えてほしい。

apache-wicket.1842946.n4.nabble.com

Exception の root の取得

Exception の root の取得で良い方法はないのか。。。

}catch(Exception e){

   Optional<Throwable> rootCause = Stream.iterate(e, Throwable::getCause).filter(t->t.getCause()==null).findFirst();

   String errormessage = rootCause.get().getMessage();

モーダルウィンドウ使用時の datepicker

Wicket のモーダルウィンドウ使用時に注意しなければならないのは、
呼び出し Page とモーダルウィンドウの Panel 両方で jQuery Datepicker を配置したときである。
モーダルウィンドウを起動したとき、モーダルウィンドウの中で Datepicker が効かなかったり、
モーダルウィンドウを起動後、むりやり Datepicker を再配備しても、モーダルウィンドウのを閉じた後に
Page の Datepicker が効かなくなったりした。

対処:

モーダルウィンドウ起動後、描画が終わったら、、

$("#ui-datepicker-div").remove();
$.datepicker.setDefaults( $.datepicker.regional["ja"] );
$("input[class='datepicker']").datepicker({
   prevText:"前月", nextText:"翌月",
   changeMonth: true,
   changeYear: true, yearRange: '-4:+6',
});

モーダルウィンドウを閉じたら、

$("#ui-datepicker-div").remove();
$("input[class='datepicker']").removeClass("hasDatepicker");
$("input[class='datepicker']").datepicker({
   prevText:"前月", nextText:"翌月",
   changeMonth: true,
   changeYear: true, yearRange: '-4:+6',
});

という datepicker設置で作られるdocumentを削除して、
datepicker にされた inputタグを、一度 hasDatepicker と付与されたクラス属性を削除してから
datepicjer 再定義をする。

datepicker の destroy かと思ったけどこの方が確実みたい。

任意のセレクタまで、アニメーションでスクロール

memo

任意のセレクタまで、アニメーションでスクロールさせる。

例)table の tbody でスクロールを書いた時など。。。

$('tbody').animate({scrollTop:$('tbody tr:nth-child(20)').offset().top});

offset() でスクロールで表示させたい行のオブジェクトを取得して top で位置を参照する。

input type="radio" のラベル、チェックされてる時のスタイル属性

メモ

input[type=radio]:checked + label{
    background-color: #ff00ff;
    color: #ffffff; 
}

のように書く。

Wicket 8.0.0-M4 から M5 で、AjaxButton.onSubmit が。。。

Wicket 8 の機能として注目だったラムダの対応も、 8.0.0-M4 までは、

onSubmit(String id, SerializableBiConsumer<AjaxButton, AjaxRequestTarget> onSubmit
  , SerializableBiConsumer<AjaxButton, AjaxRequestTarget> onError)

onSubmit(String id, SerializableBiConsumer<AjaxButton, AjaxRequestTarget> onSubmit)

これらのメソッドが加わっていて喜んだのだが、

8.0.0-M5 で、消えている!! 従来の onSubmit と onError をオーバーライドで書かなくてはならない。

非常に残念だ!


もう、本当になくなってしまうのか!


いや!!心配ない。

5月24日に書いた。。。

oboe2uran.hatenablog.com