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); } } }; } }