jsTree の types プラグインを使う

https://www.jstree.com/api/#/?f=$.jstree.defaults.types

これを使えば、コンテキスメニューにおける _disabled の判定も、
以前書いた jsTree のコンテキストメニューをカスタマイズ - Oboe吹きプログラマの黙示録 も、get_node した icon を問い合わせるのでなく
type を問い合わせることができてこの方が better である。
プラグインの指定と、 types の定義、

"plugins":[ "contextmenu", "types" ],
"types" : {
   "default":{
      "icon" : "jstree-folder"
    },
   "leaf":{
        "icon" : "jstree-leaf"
    }
},

コンテキストメニューの定義は、こうなる。

"contextmenu":{
   "items":function($node){
      return {
         "createFolder":{
            "separator_before": false,
            "separator_after": false,
            "icon": "contextmenu-icon folder-plus",
            "label": "新規フォルダ作成",
            "_disabled": function(data){
               return $.jstree.reference(data.reference)
                      .get_node(data.reference).type != "default";
            },
            "action": function(data){
               var inst = $.jstree.reference(data.reference),
                   obj = inst.get_node(data.reference);
               inst.create_node(obj, { text:'New Folder' }, "last", function(new_node){
                  try{
                     inst.edit(new_node);
                  }catch(ex){
                     setTimeout(function(){ inst.edit(new_node); },0);
                  }
               });
            }
         },
         "createFile":{
            "separator_before": false,
            "separator_after": false,
            "icon": "contextmenu-icon file-plus",
            "label": "新規ファイル作成",
            "_disabled": function(data){
               return $.jstree.reference(data.reference)
                      .get_node(data.reference).type != "default";
            },
            "action": function(data){
               var inst = $.jstree.reference(data.reference),
                   obj = inst.get_node(data.reference);
               inst.create_node(obj, { text:'New File', 'type':'leaf' }, "last", function(new_node){
                  try{
                     inst.edit(new_node);
                  }catch(ex){
                     setTimeout(function(){ inst.edit(new_node); },0);
                  }
               });
            }
         },
         "rename":{
            "separator_before": true,
            "separator_after": false,
            "icon": "contextmenu-icon rename-icon",
            "label": "名称の変更",
            "_disabled": false,
            "action": function(data){
               var inst = $.jstree.reference(data.reference),
               obj = inst.get_node(data.reference);
               inst.edit(obj);
            }
         },
         "remove":{
            "separator_before": false,
            "separator_after": false,
            "icon": "contextmenu-icon delete-icon",
            "label": "削除",
            "_disabled": function(data){
               return $.jstree.reference(data.reference)
                      .get_node(data.reference).parent == "#";
            },
            "action": function(data){
               var inst = $.jstree.reference(data.reference),
                   obj = inst.get_node(data.reference);
               if (inst.is_selected(obj)){
                  inst.delete_node(inst.get_selected());
               }else{
                  inst.delete_node(obj);
               }
            }
         },
         "cut":{
            "separator_before": true,
            "separator_after": false,
            "icon": "contextmenu-icon cut-icon",
            "label": "切り取り",
            "_disabled": function(data){
               return $.jstree.reference(data.reference)
                      .get_node(data.reference).parent == "#";
            },
            "action": function(data){
               var inst = $.jstree.reference(data.reference), 
                   obj = inst.get_node(data.reference);
               if (inst.is_selected(obj)){
                  inst.cut(inst.get_top_selected());
               }else{
                  inst.cut(obj);
               }
            }
         },
         "copy":{
            "separator_before": false,
            "separator_after": false,
            "icon": "contextmenu-icon copy-icon",
            "label": "コピー",
            "_disabled": function(data){
               return $.jstree.reference(data.reference)
                      .get_node(data.reference).parent == "#";
            },
            "action": function(data){
               var inst = $.jstree.reference(data.reference),
                   obj = inst.get_node(data.reference);
               if (inst.is_selected(obj)){
                  inst.copy(inst.get_top_selected());
               }else{
                  inst.copy(obj);
               }
            }
         },
         "paste":{
            "separator_before": false,
            "separator_after": false,
            "icon": "contextmenu-icon paste-icon",
            "label": "貼り付け",
            "_disabled": function(data){
               if ($.jstree.reference(data.reference).get_node(data.reference).type != "default")
                  return true;
               return !$.jstree.reference(data.reference).can_paste();
            },
            "action": function(data){
               var inst = $.jstree.reference(data.reference),
                   obj = inst.get_node(data.reference);
               inst.paste(obj);
            }
         }
      };
   }
}