● jQuery TableDnD(Table Drag and Drop)
- HTML 테이블의 행을 Drag and Drop 하여 재정렬할 수 있게 하는 jQuery 플러그인
- jquery.tablednd.js 스크립트 추가 필요
❗ 프론트단에서만 사용할 경우 "3-1. tableDnd 플러그인 적용 및 옵션 설정 "까지만 봐도 됨
❗ DB 상에서 테이블 순번을 바꿔야 하는 경우 끝까지 확인 필요(아래 예제는 Spring 사용)
● 사용방법
1. 라이브러리 가져오기
- 다운로드 : https://github.com/isocra/TableDnD 소스 다운로드 후 TableDnd/js/jquery.tablednd.js 파일 사용
<script src="/plugins/jquery-tablednd/jquery.tablednd.js"></script>
2. HTML 테이블 생성
- table 및 각 row 마다 id 필요
<table id="dndTable">
<tr id="list_1"><td>Row 1</td></tr>
<tr id="list_2"><td>Row 2</td></tr>
<tr id="list_3"><td>Row 3</td></tr>
<tr id="list_4"><td>Row 4</td></tr>
<tr id="list_5"><td>Row 5</td></tr>
<tr id="list_6"><td>Row 6</td></tr>
<tr id="list_7"><td>Row 7</td></tr>
</table>
3-1. tableDnd 플러그인 적용 및 옵션 설정
- tablDnD 플러그인 적용 스크립트 이후 동적으로 생성한 row에는 옵션이 작동하지 않음
- 동적으로 생성한 row는 생성 후 플러그인 적용 스크립트 적용해야 함
- tableDnd 옵션
onDragStyle
|
드래그 중인 항목에 적용되는 스타일
|
onDropStyle
|
드롭 대상 항목에 적용되는 스타일
|
onDragClass
|
드래그 중인 항목에 추가되는 클래스
|
onDrop
|
드롭이 발생했을 때 호출되는 콜백 함수
|
onDragStart
|
드래그가 시작될 때 호출되는 콜백 함수
|
onDragStop
|
드래그가 멈추었을 때 호출되는 콜백 함수
|
dragHandle
|
드래그를 시작할 핸들 요소의 선택자
|
scrollAmount
|
드래그 중에 테이블을 자동으로 스크롤할 때 사용하는 옵션
|
scrollAmountOnEdge
|
드래그 중에 테이블 가장자리에 도달했을 때 스크롤 속도를 조절
|
serializeRegexp
|
ID 시리얼라이제이션을 위한 정규식
|
serializeParamName
|
ID 시리얼라이제이션에 사용될 파라미터 이름
|
serializeTableId
|
시리얼라이제이션에 사용되는 테이블의 ID
|
onDropAccepted
|
드롭이 허용되는 조건을 정의하는 콜백 함수
|
// 선언만 할 경우
$("#dndTable").tableDnD();
// 옵션 사용할 경우
$("#dndTable").tableDnD({
onDrop: function(table, row) {
console.log(table.tBodies[0].rows); // 순번이 바뀐 테이블의 rows element 출력
}
});
3-2. DB에서 실제 table row 순번을 바꾸는 경우
- Javascript
$("#dndTable").tableDnD({
onDrop : function(table, row){
const rows = table.tBodies[0].rows;
const arrId = new Array();
for(let i = 0; i < rows.length; i++) {
// 순번 재정렬
$("#" + rows[i].id + " td").html("Row " + (i + 1));
arrId[i] = Number(rows[i].id.split("_")[1]);
}
const formData = new FormData();
formData.append("data", arrId);
axios.patch("/seq", formData
).catch(error => {
CustomAlert.error("순서 변경을 실패하였습니다.");
console.log(error);
});
}
});
- Controller
@PatchMapping("/seq")
@ResponseBody
public ResponseEntity<?> updateSeq(@RequestParam(value = "data", required = false) List<Integer> data
, HttpServletRequest request) throws Exception {
try {
HashMap<String, Object> map = new HashMap<>();
testService.updateSeq(data);
return ResponseEntity.status(HttpStatus.OK).body(map);
} catch (Exception e) {
LOGGER.info(e.getMessage());
}
}
- Service
void updateSeq(List<Integer> data) throws Exception;
- ServiceImpl
public void updateSeq(List<Integer> data) throws Exception{
TestTable testTable = new TestTable();
for(int i = 0; i < data.size(); i++){
testTable.setTestId(Long.valueOf(data.get(i)));
testTable.setSeq(i + 1);
TestMapper.updateSeq(testTable);
}
}
- Mapper(java)
void updateSeq(TestTable testTable) throws Exception;
- Mapper(xml)
<update id="updateSeq" parameterType="TestTable">
UPDATE TEST_TABLE
SET SEQ = #{seq}
WHERE TEST_ID = #{testId}
</update>
'Programming > Javascript' 카테고리의 다른 글
[Javascript] 현재 페이지 URL 정보 가져오기 (0) | 2023.12.12 |
---|---|
[Javascript] Cookie, jQuery로 로그인 ID 저장하기 기능 구현하기 (4) | 2023.12.07 |
[Javascript] Debounce와 Throttle의 차이 (2) | 2023.11.01 |
[Javascript] 전개 연산자(Spread Operator) (0) | 2023.10.28 |
[Javascript] val()과 attr("value")의 차이 (0) | 2023.08.24 |
댓글