表の編集

前回の投稿、

入力フィールドでよく使いそうな jQuery 処理のメモ
http://oboe2uran.hatenablog.com/entry/2016/12/18/113206
と、
右クリックコンテキストメニューの基本サンプル
http://oboe2uran.hatenablog.com/entry/2016/12/11/161826


右クリックコンテキストメニューで追加の tableタグ表は、

右クリックコンテキストメニューの基本サンプルの 行追加、貼付け の処理に
入力フィールドでよく使いそうな jQuery 処理のメモで用意した関数を使用して

以下のようにして表の編集を書式スタイルに沿った入力に
することができる。しかも行挿入/削除/コピー/貼り付けに対応させる。

thead の th タグに data-type 属性で列のデータ属性を書いといて data-type に従ってセルをクリックした時の
input を各種の形式にするのである。

/******** click → input **************/
var initCell = function(){
   $('#target-table tbody tr').each(function(i, tr){ $(tr).children("td").unbind("click"); });
   $('#target-table tbody tr').each(function(i, tr){
      $(tr).children("td").click(function(){
         var n = parseInt($(tr).children("td").index(this), 10);
         n++;
         var datatype = $('#target-table thead tr th:nth-child(' + n + ')').data("type");
         console.log( datatype );
         $(this).html($("<input>").attr("type","text").attr("style", "margin-left: 1px; margin-right: 1px; width: 99%;").val($(this).html()));
         $(this).children("input").click(function(ev){
            ev.stopPropagation();
         });
         // datatype によって制御
         if (datatype=="code"){
            inputNumberForce($(this).children("input"), { 'numlock': function(){ callTooltip("#target-table tbody tr td input",  "NumLock OFF(消灯) になってます"); } });
         }else if(datatype=="date"){
            $(this).children("input").prop("readonly", "readonly");
            $(this).children("input").prop("style", "width:70px;background-color:#ffffff;");
            $(this).children("input").datepicker({ prevText:"前月", nextText:"翌月",
               changeMonth: true, changeYear: true, yearRange: '-3:+4',
               onSelect: function(datetxt, picker){ $(this).parent().html(datetxt); },
               onClose: function(datetxt, picker){ $(this).parent().html(datetxt); },
            });
         }else if(datatype=="price"){
            inputPrice($(this).children("input"), { 'numlock': function(){ callTooltip("#target-table tbody tr td input",  "NumLock OFF(消灯) になってます"); } });
            $(this).children("input").prop("style", "text-align:right;margin-left: 1px; margin-right: 1px; width: 99%;");
         }else if(datatype=="number"){
            inputInteger($(this).children("input"), { 'numlock': function(){ callTooltip("#target-table tbody tr td input",  "NumLock OFF(消灯) になってます"); } });
         }
         var targetcell = $(this);
         var inputer = $(this).children("input");
         $(inputer).focus(function(){
            $(this).select();
         }).bind("paste",function(){
            return false;
         }).keyup(function(eo){
            if (eo.keyCode==13 || eo.keyCode==9){
               $(this).trigger($.Event("blur"));
            }
         }).keydown(function(eo){
            // 229 で全角を全てcut
            if (eo.keyCode==229) return false;
         }).blur(function(){
            if(datatype != "date"){ // datepicker の場合はdatepicker で処理
               $(targetcell).html($(this).val());
            }
         });
         $(inputer).focus();
      });
   });
};



/******** 選択 ⇒ active ************/
var initListselector = function(){
   // 列数
   var columnLength = $('#target-table thead tr th').length;
   // コピー
   var copyTRhtml = null;
   // tbody contextmenu → 行挿入のみ
   $.contextMenu({
      selector: '#target-table tbody',
      build: function($trigger, e){
         return {
            callback: function(key, options){
               if (key=="add"){
                  $trigger.append("<tr></tr>");
                  for(var i=0;i < columnLength;i++) $trigger.children('tr:last').append("<td></td>");
                  initCell();
               }
            },
            items: {
               "add":{ name:"1行挿入", icon:"add", },
            },
            events: {
               show: function(){
                  console.log("-- contextmenu tbody show ---" );
               },
               hide: function(){
                  console.log("-- contextmenu tbody hide ---" );
               }
            }
         };
      },
   });
   // tr contextmenu → 行挿入/削除/コピー/貼付
   $.contextMenu({
      selector: '#target-table tbody tr',
      build: function($trigger, e){
         // コンテキスト行選択色→ ON
         $trigger.addClass("seleted-context");
         return {
            callback: function(key, options){
               if (key=="add"){
                  // 追加
                  $trigger.before("<tr></tr>");
                  for(var i=0;i < columnLength;i++) $trigger.prev().append("<td></td>");
                  initCell();
               }else if(key=="delete"){
                  // 削除
                  $trigger.remove();
               }else if(key=="copy"){
                  // コピー
                  copyTRhtml = "<tr>";
                  $trigger.children('td').each(function(ix, td){
                     copyTRhtml = copyTRhtml + "<td>" + $(td).html() + "</td>";
                  });
                  copyTRhtml = copyTRhtml + "</tr>";
               }else if(key=="paste"){
                  // 貼付け
                  if (copyTRhtml != null){
                     $trigger.before(copyTRhtml);
                     $trigger.remove();
                     copyTRhtml = null;
                     initCell();
                  }
               }
            },
            items:{
               "add":    { name:"1行挿入", icon:"add",    visible: true, },
               "delete": { name:"削除",     icon:"delete", visible: true, },
               "copy":   { name:"コピー",   icon: "copy",  visible: true, },
               "paste":  { name:"貼付け",   icon: "paste", visible: true, className: copyTRhtml==null ? 'contextmenu-item-disabled' : '' },
            },
            events: {
               show: function(){
                  console.log("-- contextmenu show ---" );
               },
               hide: function(){
                  console.log("-- contextmenu hide ---" );
                  // コンテキスト行選択色→ OFF
                  $trigger.removeClass("seleted-context");
               }
            }
         };
      }
   });
};

$(function(){
   initListselector();
   initCell();
});