[JavaScript] TreeView 사용하기 (fancytree)

2019. 6. 3. 17:44· WEB/JavaScript
목차
  1.  
  2. # fancytree
반응형

[JavaScript] TreeView 사용하기 (fancytree)


사용하고자 하는 Tree 조건은 다음과 같았다.

* Tree(트리) 사용 조건
  1. 방향키로 노드간 이동 가능해야 한다.
  2. shift, ctrl이용해서 다중 선택이 가능해야 한다.
  3. 폴더간 드래그 앤 드롭으로 이동이 가능해야 한다.
  4. 루트 노드는 이동 불가해야 한다.
  5. 자식노드는 자식노드 하위로 이동 불가해야 한다.

위 조건을 모두 만족하는 트리를 찾기 힘들었다.
처음에는 가장 많이 쓰는 라이브러리를 찾아 구현되어 있지 않는 조건들은 stackoverflow 나 git 등에서 찾아 기능을 추가하려고 했으나, 쉽지 않았다.

완성된 프로젝트에 트리 부분만 떼다 붙이려니 여러가지 오류가 발생했었다.

  1. jstree

    • 가장 많이 사용함.
    • 위 조건 모두 구현 가능함.
    • 하지만, Electron에서 코드를 삽입하니 jstree() 를 찾을 수 없다는 오류만 뜸....
  2. jqtree

    • 사용이 간단함.
    • shift, ctrl 기능이 없음.
    • 다중 선택은 되나, 불편함. ( 다중 선택하여 노드 이동이 안됨 )
    • shift, ctrl 를 이용하여 다중 선택까진 구현했으나,
      부모가 다른 자식을 선택할 경우와 다중 선택한 파일을 이동시키는 부분에서 막힘....
  3. fancytree

    • jqtree보단 많이 사용하는 듯 함.
    • 위 모든 조건 다 만족하는 엄청나게 많은 기능을 제공함.
    • 루프 노드 이동을 막는 코드는 구글에 많이 존재했지만, 자식 노드 하위로 이동을 막는 부분을 찾기 힘들었다.
    • 하지만, 모든 조건에 맞게 구현이 가능했다.

 

# fancytree

  1. 설치

    $ npm install jquery.fancytree --save
  2. 사용

  • Electron에서는 CreateTree 옵션을 이용해서 fancytree를 생성할 수 있다.
  • dragEnter에 조건에 원하는 조건을 추가해 줬다.
<!-- HTML -->
<!-- fancytree -->
<link href="../node_modules/jquery.fancytree/dist/skin-win8/ui.fancytree.min.css" rel="stylesheet">

<div id="tree"></div>

 

// JavaScript
const fancytree = require('jquery.fancytree');

// 필요한 모듈을 취사선택해서 추가한다.
require('jquery.fancytree/dist/modules/jquery.fancytree.ui-deps');
require('jquery.fancytree/dist/modules/jquery.fancytree');
require('jquery.fancytree/dist/modules/jquery.fancytree.dnd5');
require('jquery.fancytree/dist/modules/jquery.fancytree.multi');

// 선언
const _tree = fancytree.createTree('#tree', {
        extensions: ["dnd5", "multi"],
        checkbox: true,
        selectMode: 3,
        source: [],
          activate: function (event, data) {},
        lazyLoad: function (event, data) {
            //   data.result = {url: "ajax-sub2.json"}
        },
        dnd5: {
            preventSameParent: false, // Prevent dropping nodes under the same direct parent
            autoExpandMS: 1000,
            refreshPositions: true,
            multiSource: true, // drag all selected nodes (plus current node)
            dragStart: function (node, data) {
                // 루트 노드 이동 방지
                if (node.isFolder() || node.getLevel() === 1) {
                    return false;
                }
                return true;
            },
            dragEnter: function (node, data) {
                if (data.node.parent.parent === null) { // 부모 노드는 over만 가능
                    return ["over"];
                } else {  // 자식 노드 끼리는 over불가능(위치 변경만 가능)
                    return ["before", "after"]
                }
            },
            dragOver: function (node, data) {
                // data.node.info("dragOver", data);
                return true;
            },
            dragEnd: function (node, data) {
                data.node.info("dragEnd", data);
            },
            dragDrop: function (node, data) {
                var sourceNodes = data.otherNodeList;

                $.each(sourceNodes, function (i, o) {
                    o.info("move to " + node + ": " + data.hitMode);
                    o.moveTo(node, data.hitMode);
                });

                node.debug("drop", data);
                node.setExpanded();
            }
        }
});
반응형
저작자표시 비영리 변경금지 (새창열림)

'WEB > JavaScript' 카테고리의 다른 글

[JavaScript] TreeView 사용하기 (fancytree) - 3 title 줄바꿈 하기  (0) 2019.06.11
[JavaScript] TreeView 사용하기 (fancytree) - 2 노드 추가하기  (0) 2019.06.06
[Vue.js] Vue-cli (2)  (0) 2019.06.01
[Vue.js] Vue-cli (1)  (0) 2019.05.31
[Vue.js] This dependency was not found: * core-js/modules/web.dom.iterable 에러  (0) 2019.05.29
  1.  
  2. # fancytree
'WEB/JavaScript' 카테고리의 다른 글
  • [JavaScript] TreeView 사용하기 (fancytree) - 3 title 줄바꿈 하기
  • [JavaScript] TreeView 사용하기 (fancytree) - 2 노드 추가하기
  • [Vue.js] Vue-cli (2)
  • [Vue.js] Vue-cli (1)
S0PH1A
S0PH1A
반응형
S0PH1A
Web Programmer
S0PH1A
전체
오늘
어제
  • 전체
    • About Me
    • Python
      • Python
      • Django
    • DataBase
      • MySQL
      • MongoDB
    • JAVA
      • JAVA
      • Spring
    • WEB
      • JavaScript
      • HTML
      • CSS
      • Vue.js
      • React
      • Nest.js
      • Node.js
      • Electron
      • PHP
    • Linux
    • Algorithm
    • 기타
    • 생각
    • App
      • ReactNative

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • electron
  • Error
  • javascript
  • mysql
  • install
  • vue.js
  • Python
  • nodejs
  • vue
  • django

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
S0PH1A
[JavaScript] TreeView 사용하기 (fancytree)
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.