var isLoading = false; var searchQuery = ""; var afterCount = 0; var hasMoreData = true; var currentSearchAfter = []; //////////////////////////////////////////////////////////////////////////////////////// //Document Ready //////////////////////////////////////////////////////////////////////////////////////// function execDocReady() { var pluginGroups = [ ["../reference/light-blue/lib/vendor/jquery.ui.widget.js", "../reference/lightblue4/docs/lib/widgster/widgster.js"], ["../reference/lightblue4/docs/lib/bootstrap-select/dist/js/bootstrap-select.min.js"] // 추가적인 플러그인 그룹들을 이곳에 추가하면 됩니다. ]; loadPluginGroupsParallelAndSequential(pluginGroups) .then(function () { console.log("모든 플러그인 로드 완료"); $(".widget").widgster(); $("#sidebar").hide(); $(".wrap").css("margin-left", 0); $("#footer").load("/cover/html/template/landing-footer.html"); // 초기 데이터 로드 drawBoardList([], "", false); }) .catch(function (error) { console.error("플러그인 로드 중 오류 발생"); console.error(error); }); } // trace currentSearchAfter and loading-status var boardComponents = (function () { return { loading: function () { return $( `
  • Loading...
  • ` ); }, main: function (board) { return $( `

    ${board.subjectName}

    ${board.userName}

    ${board.viewCount || 0} ${new Date(board.createdDate).toLocaleString()}

    ` ); }, noData: function () { return $( `
  • 등록된 게시글이 없습니다.

  • ` ); } }; })(); // 검색 시 페이지 초기화 및 무한 스크롤 재설정 $("#search_form").on("submit", function (event) { event.preventDefault(); if (isLoading) { console.log("요청이 진행 중입니다. 잠시만 기다려 주세요."); return; } searchQuery = $(event.target).find("input").val(); afterCount = 0; // append 수 초기화 drawBoardList([], searchQuery, false); }); // 로딩 표시기 요소 생성 function createMoreDataIndicator(_searchAfter, _subjectName, _append) { var $loadMoreContents = $(`
    더 보기
    `); $("#bbs").append($loadMoreContents); return document.getElementById("loading-indicator"); } var drawBoardList = function (_searchAfter, _subjectName, _append) { var $bbs = $("#bbs"); var SIZE = 10; // 로딩 중이면 중복 요청 방지 if (isLoading) { return; } isLoading = true; if (_searchAfter && _searchAfter.length > 0) { afterCount++; } var params = { size: SIZE, searchAfter: _searchAfter }; if (_subjectName) { params.subjectName = _subjectName; } $.ajax({ url: "/bbs/board-list/only-post-list", type: "GET", data: params, beforeSend: function () { // 첫 로딩 시에만 전체 교체, 아니면 로딩 표시만 if (!_append) { $bbs.html(boardComponents.loading()); } }, success: function (data) { let totalCount = data.response.totalHits; let strTotalCount = Number(totalCount).toLocaleString(); if (totalCount >= 10000) { strTotalCount += "+"; } $("#total_counts").text(strTotalCount); // 첫 로딩 시에만 페이지네이션 초기화 if (!_append) { // 첫 로딩 시 목록 초기화 $bbs.empty(); } else { $("#loading-indicator").remove(); } // 더 이상 데이터가 없는지 확인 if (totalCount > 0 && totalCount < (1 + afterCount) * SIZE) { hasMoreData = false; } else hasMoreData = !(data.response.bbsEntities && data.response.bbsEntities.size < 10); if (totalCount === 0 || !data.response.bbsEntities || data.response.bbsEntities.size === 0) { return $bbs.append(boardComponents.noData()); } // 데이터 추가 data.response.bbsEntities.forEach(function (board) { $bbs.append(boardComponents.main(board)); }); currentSearchAfter = data.response.searchAfter; if (hasMoreData) { createMoreDataIndicator(currentSearchAfter, _subjectName, _append); } // 로딩 상태 해제 isLoading = false; }, error: function () { isLoading = false; $("#loading-indicator").remove(); }, complete: function () { isLoading = false; // 성공/실패 여부에 상관없이 요청 완료 시점에 해제 } }); };