O contextmenu
plugin já tem suporte para isso. Da documentação que você vinculou a:
items
: Espera um objeto ou uma função, que deve retornar um objeto . Se uma função for usada, ela será acionada no contexto da árvore e receberá um argumento - o nó que foi clicado com o botão direito.
Portanto, em vez de fornecer contextmenu
um objeto embutido em código para trabalhar, você pode fornecer a seguinte função. Ele verifica o elemento que foi clicado para uma classe chamada "pasta" e remove o item de menu "excluir" excluindo-o do objeto:
function customMenu(node) {
var items = {
renameItem: {
label: "Rename",
action: function () {...}
},
deleteItem: {
label: "Delete",
action: function () {...}
}
};
if ($(node).hasClass("folder")) {
delete items.deleteItem;
}
return items;
}
Observe que o acima irá ocultar a opção de exclusão completamente, mas o plugin também permite que você mostre um item enquanto desativa seu comportamento, adicionando _disabled: true
ao item relevante. Nesse caso, você pode usar items.deleteItem._disabled = true
dentro da if
instrução.
Deve ser óbvio, mas lembre-se de inicializar o plug-in com a customMenu
função em vez do que você tinha anteriormente:
$("#tree").jstree({plugins: ["contextmenu"], contextmenu: {items: customMenu}});
// ^
// ___________________________________________________________________|
Editar: se não quiser que o menu seja recriado a cada clique com o botão direito, você pode colocar a lógica no manipulador de ação para o próprio item de menu de exclusão.
"label": "Delete",
"action": function (obj) {
if ($(this._get_node(obj)).hasClass("folder") return;
}
Edite novamente: depois de examinar o código-fonte do jsTree, parece que o menu de contexto está sendo recriado toda vez que é mostrado (veja as funções show()
e parse()
), portanto, não vejo nenhum problema com minha primeira solução.
No entanto, gosto da notação que você está sugerindo, com uma função como o valor de _disabled
. Um caminho potencial a explorar é envolver a parse()
função deles com a sua própria, que avalia a função em disabled: function () {...}
e armazena o resultado em _disabled
, antes de chamar o original parse()
.
Também não será difícil modificar seu código-fonte diretamente. A linha 2867 da versão 1.0-rc1 é a relevante:
str += "<li class='" + (val._class || "") + (val._disabled ? " jstree-contextmenu-disabled " : "") + "'><ins "
Você pode simplesmente adicionar uma linha antes desta que verifica $.isFunction(val._disabled)
e, em caso afirmativo val._disabled = val._disabled()
,. Em seguida, envie-o aos criadores como um patch :)