[javascript] SlickGrid의 로우 드래그 앤 드롭

SlickGrid은 사용자 친화적인 그리드 형태의 웹 애플리케이션을 만들기 위해 사용되는 JavaScript 라이브러리입니다. 이 라이브러리를 활용하면 데이터를 효율적으로 표시하고, 필터링 및 정렬 기능 등을 제공할 수 있습니다. 이번 글에서는 SlickGrid을 사용하여 로우를 드래그 앤 드롭하는 방법을 알아보겠습니다.

1. 드래그 앤 드롭 이벤트 처리

로우 드래그 앤 드롭을 구현하기 위해 우선 필요한 이벤트를 처리해야 합니다. SlickGrid에서 제공하는 이벤트 중에서 우리가 사용할 이벤트는 onDragInit, onDragStart, onDrag, onDragEnd 입니다. 각각의 이벤트는 드래그 앤 드롭의 다른 단계에서 호출됩니다.

1.1 onDragInit 이벤트

onDragInit 이벤트는 로우의 드래그 시작을 감지하는 이벤트입니다. 해당 로우가 드래그의 대상이 될 수 있는지 여부를 결정하는 로직을 작성합니다.

grid.onDragInit.subscribe(function(e, dd) {
  var cell = grid.getCellFromEvent(e);
  if (cell && cell.row && cell.cell && canDrag(cell.row)) {
    dd.row = cell.row;
    dd.rowNode = cell.rowNode;
    dd.rowNode.classList.add('dragging');
    e.stopImmediatePropagation();
  } else {
    e.stopPropagation();
  }
});

1.2 onDragStart 이벤트

onDragStart 이벤트는 드래그 앤 드롭이 시작될 때 호출되는 이벤트입니다. 이 이벤트에서는 드래그 중인 로우에 대한 정보를 설정하고, 필요한 스타일 변경을 수행합니다.

grid.onDragStart.subscribe(function(e, dd) {
  var selection = grid.getSelectedRows();
  if (selection.indexOf(dd.row) === -1) {
    selection = [dd.row];
  }
  dd.selection = selection;
  dd.rowNode.classList.add('dragging');
  dd.rowNode.classList.add('drag-source');
});

1.3 onDrag 이벤트

onDrag 이벤트는 드래그 중일 때 호출되는 이벤트입니다. 이 이벤트에서는 드래그 중인 로우를 이동시키거나, 커스텀한 드래그 효과를 구현할 수 있습니다.

grid.onDrag.subscribe(function(e, dd) {
  // 커스텀 드래그 효과를 구현하는 로직
});

1.4 onDragEnd 이벤트

onDragEnd 이벤트는 드래그 앤 드롭이 종료될 때 호출되는 이벤트입니다. 이 이벤트에서는 드래그 중인 로우에 대한 정보를 리셋하고, 필요한 스타일 변경을 되돌립니다.

grid.onDragEnd.subscribe(function(e, dd) {
  dd.rowNode.classList.remove('dragging');
  dd.rowNode.classList.remove('drag-source');
});

2. 로우 드래그 앤 드롭 구현

onDragInit, onDragStart, onDrag, onDragEnd 이벤트를 활용하여 로우 드래그 앤 드롭을 구현할 수 있습니다. 아래의 예제는 SlickGrid에서 로우 드래그 앤 드롭을 구현하는 코드입니다.

// 드래그 앤 드롭 이벤트를 생성합니다.
function createDragEvents() {
  var dragData = {};

  grid.onDragInit.subscribe(function(e, dd) {
    var cell = grid.getCellFromEvent(e);
    if (cell && cell.row && cell.cell && canDrag(cell.row)) {
      dd.row = cell.row;
      dd.rowNode = cell.rowNode;
      dd.rowNode.classList.add('dragging');
      e.stopImmediatePropagation();
    } else {
      e.stopPropagation();
    }
  });

  grid.onDragStart.subscribe(function(e, dd) {
    var selection = grid.getSelectedRows();
    if (selection.indexOf(dd.row) === -1) {
      selection = [dd.row];
    }
    dd.selection = selection;
    dd.rowNode.classList.add('dragging');
    dd.rowNode.classList.add('drag-source');
  });

  grid.onDrag.subscribe(function(e, dd) {
    // 커스텀 드래그 효과를 구현하는 로직
  });

  grid.onDragEnd.subscribe(function(e, dd) {
    dd.rowNode.classList.remove('dragging');
    dd.rowNode.classList.remove('drag-source');
  });
}

// SlickGrid의 옵션과 데이터를 설정합니다.
var options = {
  // SlickGrid 옵션 설정
};

var columns = [
  // 컬럼 설정
];

var data = [
  // 데이터 설정
];

// SlickGrid을 생성합니다.
var grid = new Slick.Grid("#grid", data, columns, options);

// 드래그 앤 드롭 이벤트를 생성합니다.
createDragEvents();

위의 코드를 참고하여 로우 드래그 앤 드롭 기능을 SlickGrid에 추가할 수 있습니다. 각각의 이벤트에서 필요한 로직을 작성하고, 커스텀한 드래그 효과를 구현할 수도 있습니다.

마무리

이번 글에서는 SlickGrid을 사용하여 로우 드래그 앤 드롭을 구현하는 방법을 알아보았습니다. SlickGrid은 다양한 기능과 유연성을 제공하여 효과적인 데이터 표시와 조작을 가능하게 해줍니다. 더 많은 기능을 활용하여 웹 애플리케이션을 개발할 수 있도록 SlickGrid에 대해 더 알아보시기 바랍니다.

참고 자료