이전글보기

https://aamoos.tistory.com/676

 

[Spring Jpa] 7. 게시판 만들기 - 게시판 검색, 페이징 검색

이전글보기 https://aamoos.tistory.com/675 [Spring Jpa] 6. 게시판 만들기 - QueryDsl 설정, 게시판 페이징 구현 QueryDsl 적용 https://aamoos.tistory.com/454 [SpringBoot] Querydsl 적용 build.gradle plugi..

aamoos.tistory.com

 

목표

최상단의 전체 체크 박스가 체크되었을때 하위 체크박스들이 전부 체크가 되고 체크가 안되면 하위 체크박스들이 체크가 안되게 수정, 하위 체크박스가 전부 체크되면 전체 체크박스 checked 아니면 unchecked로 개발해보겠습니다.

 

list.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"  xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
      layout:decorate="layout/default_layout">
    <div layout:fragment="content" class="content">
        <form th:action th:object="${form}" method="get">
            <nav class="container">
                <br>
                <div class="input-group">
                    <input type="text" name="searchVal" th:value="${searchVal}" class="form-control" placeholder="제목을 입력해주세요.">
                    <button type="submit" class="btn btn-secondary">검색</button>
                </div>
                <br>
                <table class="table table-hover">
                    <colgroup>
                        <col width="2%" />
                        <col width="5%" />
                        <col width="20%" />
                        <col width="5%" />
                        <col width="5%" />
                        <col width="5%" />
                    </colgroup>
                    <thead>
                        <tr>
                            <th>
                                <label class="checkbox-inline">
                                <input type="checkbox" id="allCheckBox" onclick="allChecked()">
                                </label>
                            </th>
                            <th>번호</th>
                            <th>제목</th>
                            <th>작성자</th>
                            <th>날짜</th>
                            <th>조회수</th>
                        </tr>
                    </thead>

                    <tbody>
                        <tr th:each="list, index : ${list}">
                            <td>
                                <label class="checkbox-inline">
                                    <input type="checkbox" name="chk" class="chk"onclick="chkClicked()" value="">
                                </label>
                            <td th:text="${totalCount - (size * number) - index.index}"></td>
                            <td><a th:text="${list.title}" href=""></a></td>
                            <td th:text="${list.username}"></td>
                            <td th:text="${#temporals.format(list.regDate, 'yyyy-MM-dd')}"></td>
                            <td th:text="${list.viewCount}"></td>
                        </tr>
                    </tbody>
                </table>
                <br>

                <div class="d-flex justify-content-end">
                    <a class="btn btn-danger">글삭제</a>
                    <a href="/write" class="btn btn-primary">글쓰기</a>
                </div>
                <br>
                <nav class="container d-flex align-items-center justify-content-center" aria-label="Page navigation example"
                     th:with="start=${(list.number/maxPage)*maxPage + 1},
                      end=(${(list.totalPages == 0) ? 1 : (start + (maxPage - 1) < list.totalPages ? start + (maxPage - 1) : list.totalPages)})">
                    <ul class="pagination">

                        <li th:if="${start > 1}" class="page-item">
                            <a th:href="@{/?(page=0, searchVal=${searchVal})}" class="page-link" href="#" aria-label="Previous">
                                <span aria-hidden="true">&laquo;&laquo;</span>
                            </a>
                        </li>

                        <li th:if="${start > 1}" class="page-item">
                            <a th:href="@{/?(page=${start - maxPage-1}, searchVal=${searchVal})}" class="page-link" href="#" aria-label="Previous">
                                <span aria-hidden="true">&laquo;</span>
                            </a>
                        </li>

                        <li th:each="page: ${#numbers.sequence(start, end)}" class="page-item" th:classappend="${list.number+1 == page} ? active">
                            <a th:href="@{/?(page=${page-1}, searchVal=${searchVal})}" th:text="${page}" class="page-link" href="#">1</a>
                        </li>

                        <li th:if="${end < list.totalPages}" class="page-item">
                            <a th:href="@{/?(page=${start + maxPage -1}, searchVal=${searchVal})}" class="page-link" href="#" aria-label="Next">
                                <span aria-hidden="true">&raquo;</span>
                            </a>
                        </li>

                        <li th:if="${end < list.totalPages}" class="page-item">
                            <a th:href="@{/?(page=${list.totalPages-1}, searchVal=${searchVal})}" class="page-link" href="#" aria-label="Next">
                                <span aria-hidden="true">&raquo;&raquo;</span>
                            </a>
                        </li>
                    </ul>
                </nav>
            </nav>
        </form>
    </div>
</html>

<script>

    //체크박스 전체 선택 클릭 이벤트
    function allChecked(target){

        //전체 체크박스 버튼
        const checkbox = document.getElementById('allCheckBox');

        //전체 체크박스 버튼 체크 여부
        const is_checked = checkbox.checked;

        //전체 체크박스 제외한 모든 체크박스
        if(is_checked){
            //체크박스 전체 체크
            chkAllChecked()
        }

        else{
            //체크박스 전체 해제
            chkAllUnChecked()
        }
    }

    //자식 체크박스 클릭 이벤트
    function chkClicked(){

        //체크박스 전체개수
        const allCount = document.querySelectorAll(".chk").length;

        //체크된 체크박스 전체개수
        const query = 'input[name="chk"]:checked'
        const selectedElements = document.querySelectorAll(query)
        const selectedElementsCnt = selectedElements.length;

        //체크박스 전체개수와 체크된 체크박스 전체개수가 같으면 전체 체크박스 체크
        if(allCount == selectedElementsCnt){
             document.getElementById('allCheckBox').checked = true;
        }

        //같지않으면 전체 체크박스 해제
        else{
            document.getElementById('allCheckBox').checked = false;
        }
    }

    //체크박스 전체 체크
    function chkAllChecked(){
        document.querySelectorAll(".chk").forEach(function(v, i) {
            v.checked = true;
        });
    }

    //체크박스 전체 체크 해제
    function chkAllUnChecked(){
        document.querySelectorAll(".chk").forEach(function(v, i) {
            v.checked = false;
        });
    }

</script>

 

결과화면

- 전체체크 박스 클릭

 

- 전체 체크박스 클릭해제

- 하위 체크박스 개수에 따라 전체 체크박스 check

체크박스 이벤트가 정상적으로 되는것을 확인하였습니다. 다음장에는 체크된 항목을 삭제하는것을 해보겠습니다.

 

다음글보기

https://aamoos.tistory.com/678

 

[Spring Jpa] 9. 게시판 만들기 - 체크박스 선택삭제 기능 만들기

목표 - 이번장에서 변경하는 부분은 체크박스 선택해서 삭제시 post로 form 전송하는부분, 삭제시 del_yn 플래그를 Y로 업데이트, 이전장에만든 querydsl select 부분에 where절에 del_yn을 Y 조건을 추가하

aamoos.tistory.com

 

복사했습니다!