Tabulator tips

第24回 入力チェック付日付入力用エディター

2020.05.13

今回は、日付の入力チェックを行う関数を作成します。

入力チェックは以下の通りです。

  • 開始日、終了日は必須とします。
  • 開始日が終了日より古い場合はエラーとします。
  • エラーがあった時、メッセージのセルにエラー内容を表示します。
  • 入力が正常の時、メッセージのセルにOKを表示します。

以下は開始日のチェック関数です。

/* 開始日 - 検証関数 */
var validate_start=function(cell,value){
    clear_message(cell);
    if(!value){
        update_message(cell,'開始日は必須です。');
        return false;
    }
    var data = cell.getData();
    if(!data.end) {
        update_message(cell,'終了日は必須です。');
        return false;
    }
    var start = moment(value, "YYYY/MM/DD");
    var end   = moment(data.end, "YYYY/MM/DD");
    if(start.isAfter(end)){
      update_message(cell,'開始日が終了日より遅い日付です。');
      return false;
    }
    return true;
}

日付入力用のエディターは前回作成した関数dateEdit を流用しています。 違いは、入力チェックが正常の時、 メッセージのセルにOKを表示する処理を追加した部分です。 Tabulator のバージョンが、4.4.3 以降でないと success() が返り値を返さないので 4.4.3 以降のバージョンを使用してください。

var successFunc = function() {
    ...
    if(success(val)){ // 値が正常ならOK表示
        update_message(cell,'OK');
    }
}

moment.js は以下のCDN を使用します。

<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.10.6/moment.js"></script>

カラム定義

{title:"開始日",field:"start",editor:dateEdit,validator:{type:validate_start},width:150},
{title:"終了日",field:"end",editor:dateEdit,validator:{type:validate_end},width:150},
{title:"メッセージ",field:"msg", width:300},

データ定義

{start:"2019/5/1",end:"2019/5/2", msg:""},

サンプルコード

<!doctype html>
<html lang="ja">
<head>
<meta charset="utf-8">
<link href="https://unpkg.com/tabulator-tables@4.4.3/dist/css/tabulator.min.css" rel="stylesheet">
<script type="text/javascript" src="https://unpkg.com/tabulator-tables@4.4.3/dist/js/tabulator.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.10.6/moment.js"></script>
</head>
<body onload="show_table()">
<h1 id=title>入力チェック付日付入力用エディター</h1>
<div id="table"></div>

<script type="text/javascript">
// エラーメッセージ表示
var update_message = function(cell, msg){
    cell.getRow().update({"msg":msg});
}
// エラーメッセージクリア
var clear_message = function(cell){
    update_message(cell,"");
}
/* 開始日 - 検証関数 */
var validate_start=function(cell,value){
    clear_message(cell);
    if(!value){
        update_message(cell,'開始日は必須です。');
        return false;
    }
    var data = cell.getData();
    if(!data.end) {
        update_message(cell,'終了日は必須です。');
        return false;
    }
    var start = moment(value, "YYYY/MM/DD");
    var end   = moment(data.end, "YYYY/MM/DD");
    if(start.isAfter(end)){
      update_message(cell,'開始日が終了日より遅い日付です。');
      return false;
    }
    return true;
}
/* 終了日 - 検証関数 */
var validate_end=function(cell,value){
    clear_message(cell);
    if(!value){
        update_message(cell,'終了日は必須です。');
        return false;
    }
    var data = cell.getData();
    var start = moment(data.start, "YYYY/MM/DD");
    var end   = moment(value, "YYYY/MM/DD");
    if(start.isAfter(end)){
      update_message(cell,'終了日が開始日より早い日付です。');
      return false;
    }
    return true;
}
var dateEdit = function(cell, onRendered, success, cancel, editorParams){
    // cell-編集可能なセルのセルコンポーネント
    // onRendered-エディターがレンダリングされたときに呼び出す関数
    // success-正常に更新された値をTabulatorに渡すために呼び出す関数
    // cancel-編集を中止して通常のセルに戻るために呼び出す関数
    // editorParams-editorParams列定義プロパティに渡されるparamsオブジェクト

    // 日付入力用エディターを作成
    var editor = document.createElement("input");
    editor.setAttribute("type","date");

    // エディターの値をセルの現在の値に設定します
    editor.value = moment(cell.getValue(), "YYYY/MM/DD").format("YYYY-MM-DD");

    //エディターが選択されたときに選択ボックスにフォーカスを設定します
    // (タイムアウトによりエディターをDOMに追加できます)
    onRendered(function(){ editor.focus() });

    //値が設定されたら、更新するセルをトリガーします
    var successFunc = function() {
        var val = "";
        if(editor.value) // 空白チェック
          val=moment(editor.value,"YYYY-MM-DD").format("YYYY/MM/DD");
        if(success(val)){ // 値が正常ならOK表示
          update_message(cell,'OK');
        }
    }
    editor.addEventListener("change", successFunc);
    editor.addEventListener("blur", successFunc);

    return editor;
}
var show_table=function(){
    var tdata = [
        {start:"2019/5/1",end:"2019/5/2", msg:""},
    ];
    var columns= [
      {title:"開始日",field:"start",editor:dateEdit,validator:{type:validate_start},width:150},
      {title:"終了日",field:"end",editor:dateEdit,validator:{type:validate_end},width:150},
      {title:"メッセージ",field:"msg", width:300},
    ];
    new Tabulator("#table", {
        data:tdata,
        columns: columns
    });
}
</script>

著者プロフィール

naka

すきなコマンドは awk と bc です。なにかを計算する時、awk か bc を使います。

記事一覧Index