본문 바로가기
개발/Javascript

JsTree Contextmenu(Create, Rename, Delete) 활용하기

by 혈중마라농도 2021. 12. 26.

JsTree로 Context메뉴(오른쪽 클릭)를 활용한 예제입니다.
JsTree Api 활용이나, Disable 처리는 
https://nhj2021.tistory.com/12 참고 바랍니다.

var Editable = true;
var Flag = {
  CreateFolder: true,
  RenameFolder: true,
  DeleteFolder:true
};
// dnd(Drag&Drop)도 있지만 쓰지는 않음
var Plugins = ['wholerow', 'unique','contextmenu','dnd'];

$('#jsTreeElement').jstree({
  'core': {
    // 새 폴더를 만들 경우 사용
    'strings': {
      'New node': '새 폴더'
    },
    // API 정보 입력
    'data': {
      type: 'get',
      'url': 'sample.com/api/TestJstree',
      'data': function (node) {
        // 첫 루트인 경우
        if (node.id == '#') return {
          'test1': '1',
          'test2': '2'
        };
        // Disable
        if (node.original != null && node.original.isDisable == true)
          return null;
        if (node.original != null && node.original.id)
          return {
            'test1': node.original.id
          };
        return {
          'test1': node.id
        };
      }
    },
    'force_text': true,
    'check_callback': function (operation, node, parentNode, renameNodeText, more) {
      // operation can be 'create_node', 'rename_node', 'delete_node', 'move_node' or 'copy_node'
      // in case of 'rename_node' node_position is filled with the new node name
      var validation = false;

      if (Editable == false)
        return false;

      switch (operation) {
        case 'create_node':
          // 생성이 안되는 곳이면 이곳에서 체크
          if (Flag.CreateFolder) {
            Flag.CreateFolder = false;
            return true;
          }
          // 직접 구현 필요!!
          CreateFolder(parentNode.id, node.text);
          break;
        case 'rename_node':
          if (Flag.RenameFolder) {
            Flag.RenameFolder = false;
            return true;
          }
          if (node.text == renameNodeText)
          return false;
          // 직접 구현 필요!!
          RenameFolder(node.original.folder_id, renameNodeText);
          break;
        case 'delete_node':
          if (Flag.DeleteFolder) {
            Flag.DeleteFolder = false;
            return true;
          }
          validation = false;
          confirm(String.format('선택하신 \"{0}\" 폴더와 하위폴더까지 전부 삭제됩니다. 정말 삭제하시겠습니까?', node.text), null, null, function (yes) {
            if (yes) {
              // 직접 구현 필요!!
              DeleteFolder(node.original.folder_id);
            }
          });
          break;
        }

        return validation;
      },
    },
    "contextmenu": {
      "items": function ($node) {
        //var tree = $("#tree").jstree(true);
        return {
          "create": {
            "separator_before": false,
            "separator_after": true,
            "_disabled": false,
            "label": "Create",
            "action": function (data) {
              var inst = $.jstree.reference(data.reference),
              obj = inst.get_node(data.reference);
              inst.create_node(obj, {}, "last", function (new_node) {
                setTimeout(function () { inst.edit(new_node); }, 0);
              });
            }
          },
          "rename": {
            "separator_before": false,
            "separator_after": false,
            "_disabled": false,
            "label": "Rename",
            "action": function (data) {
              var inst = $.jstree.reference(data.reference),
              obj = inst.get_node(data.reference);
              inst.edit(obj);
            }
          },
          "remove": {
            "separator_before": false,
            "icon": false,
            "separator_after": false,
            "_disabled": false,
            "label": "Delete",
            "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);
              }
            }
          },
        };
      }
    },
    'plugins': Plugins
  })
});
반응형

'개발 > Javascript' 카테고리의 다른 글

Javascript Html 인코딩, 디코딩  (0) 2022.01.07
c# API 로 JsTree 랜더링  (0) 2021.12.26
Javascript Filesize Format  (0) 2021.12.18
Javascript 콤마 찍기  (0) 2021.12.18
jQuery data() vs attr()  (0) 2021.11.20

댓글