[JavaScript] TreeView 사용하기 (fancytree) - 5 Drag N Drop 시 해당 폴더에 동일 이름이 존재할 경우 예외처리하기

2019. 7. 25. 15:58· WEB/JavaScript
반응형

[JavaScript] TreeView 사용하기 (fancytree) - 5 Drag N Drop


이전 글 : [JavaScript] TreeView 사용하기 (fancytree) - 4 context menu

드래그앤드롭(DragNDrop)기능을 사용하기 위해서는 dnd5모듈을 추가해야한다.

 

dnd5 모듈을 이용해서 기본적인 기능은 가능하지만,
드래그앤 드롭시 목적지 폴더에 내가 옮기려는 파일과 이름이 같은 파일이 존재할 경우 예외처리를 추가하고자 한다.

 

 

dnd5의 이벤트는 다음과 같다.

  • dragStart : 드래그 이벤트 시작시 (마우스 누름)

  • dragDrag : 드래그 이벤트 중

  • dragEnd : 드래그 이벤트 끝남

  • dragEnter : 드래그 이벤트 중 "over", "before, "after"

  • dragOver : 드래그 이벤트 중 'copy', 'move', 'link'

  • dragExpand : 드래그 이벤트 중 부모 폴더 선택 시 폴더가 열릴 때

  • dragLeave : 드래그 이벤트 떠남

  • dragDrop : 드롭할 때 (마우스 땜)

(이벤트 발생 순서 : dragStart -> dragDrag - (dragEnter/dragOver/dragExpand/dragLeave) -> dragDrop -> dragEnd)

 

 

 

즉, DragDrop이벤트 때, 목적지 폴더에 동일이름의 파일이 존재하는지 체크하면 된다.

const fancytree = require('jquery.fancytree');
require('jquery.fancytree/dist/modules/jquery.fancytree.dnd5');

// TREE
const FancyTree = fancytree.createTree('#tree', {
  extensions: ["dnd5"],
  // ...생략...
  dnd5: {
    preventSameParent: false, // Prevent dropping nodes under the same direct parent
    autoExpandMS: 1000,
    refreshPositions: true,
    multiSource: true, // drag all selected nodes (plus current node)
    dragDrop: function (node, data) {
      let selNodes = data.otherNodeList;  // 선택한 노드 리스트
      let check = []  // 동일 이름 존재할 경우 해당 파일 이름 넣을 리스트

      $.each(selNodes, function (i, o) {
        // 동일 이름 존재하는지 검사
        var siblings = (data.hitMode === "over") ? node.children : node.getParent().children
        if (siblings) {
          for (let si of siblings) {
            if (si.parent !== o.parent) { // 부모가 다르고
              if (si.title === o.title && si.folder === o.folder) { // 타입과 이름이 같은 경우
                check.push(` * [${(o.folder) ? "폴더" : "파일"}] ${o.title} `)
              }
            }
          }
        }
      });

      // 동일한 파일명이 존재하는 경우 에러 메세지 표시 후 종료
      if (check.length > 0) {  
        let message = `동일한 이름이 존재합니다.\n`
        for (let item of check) {
          message += `${item}\n`
        }
        alert(message)
      } else {
        // 노드 이동
        $.each(selNodes, function (i, o) {
          o.moveTo(node, data.hitMode)
        })

        // 선택했던 노드 모두 활성화(active, focus, selected) 제거
        $("#tree").fancytree("getTree").visit(function (node) {
          node.setSelected(false);
          node.setFocus(false);
          node.setActive(false);
        });
      }
    }
  }
})

 

 

추가로, 만약 동일 이름의 파일이 존재하는 경우 해당 파일 이름을 변경한 후 이동하고자 한다면

아래와 같이 24번째 줄에서 o.setTitle로 이름을 변경한 후 o.moveTo해주면 된다.

dragDrop: function (node, data) {
      $.each(sourceNodes, function (i, o) {
        // 동일 이름 검사
        var siblings = (data.hitMode === "over") ? node.children : node.getParent().children
        if (siblings) {
          for (let si of siblings) {
            if (si.parent !== o.parent) { // 부모가 다르고
              if (si.title === o.title && si.folder === o.folder) { 
                // 타입과 이름이 같은 경우 .new 추가
                o.setTitle(o.title + ".new")
              }
            }
          }
        }
        o.moveTo(node, data.hitMode)
      });
}
반응형
저작자표시 비영리 변경금지 (새창열림)

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

[Javascript] Javascript HTML5 Canvas Libraries  (0) 2019.09.06
[Javascript] HTML5 canvas & fabric.js  (0) 2019.09.04
[JavaScript] Bootstrap Modal 닫힘 방지 방법  (0) 2019.07.19
[JavaScript] 다른 서버에 있는 이미지 불러오기  (0) 2019.07.04
[JavaScript] TreeView 사용하기 (fancytree) - 4 context menu  (0) 2019.06.14
'WEB/JavaScript' 카테고리의 다른 글
  • [Javascript] Javascript HTML5 Canvas Libraries
  • [Javascript] HTML5 canvas & fabric.js
  • [JavaScript] Bootstrap Modal 닫힘 방지 방법
  • [JavaScript] 다른 서버에 있는 이미지 불러오기
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
  • vue.js
  • nodejs
  • Python
  • javascript
  • mysql
  • vue
  • django
  • Error
  • install

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
S0PH1A
[JavaScript] TreeView 사용하기 (fancytree) - 5 Drag N Drop 시 해당 폴더에 동일 이름이 존재할 경우 예외처리하기
상단으로

티스토리툴바

개인정보

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

단축키

내 블로그

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

블로그 게시글

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

모든 영역

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

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