const PAGE_SIZE = 12; //페이지 개수 function loadFunctionCSS(hrefList){ hrefList.forEach(function (href) { var cssLink = $("").attr({ type: "text/css", rel: "stylesheet", href: href }); $("head").append(cssLink); }); } 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 () { loadFunctionCSS([ "/cover/css/function/layout.css", "/cover/css/experience/experience-common.css", "/cover/css/experience/experience-list.css" ]); $(".widget").widgster(); $("#sidebar").hide(); $(".wrap").css("margin-left", 0); $("#footer").load("/cover/html/template/landing-footer.html"); }) .catch(function (error) { console.error("플러그인 로드 중 오류 발생"); console.error(error); }); } /* ---------- 공통 유틸 ---------- */ function escapeHTML(s) { return String(s || "").replace(/[&<>"']/g, m => ({ "&": "&", "<": "<", ">": ">", "\"": """, "'": "'" }[m])); } // 등록 화면 이동 function buildEditorHref() { const url = new URL(location.href); if (url.searchParams.get('page')) { url.searchParams.set('page', 'experienceEditor'); url.searchParams.delete('id'); return url.toString(); } return 'experienceEditor.html'; } $(document).on('click', '#btn-new-experience', function (e) { e.preventDefault(); sessionStorage.removeItem('experienceEditDraft'); window.location.href = buildEditorHref(); }); // 상세 화면 이동 링크 생성 function buildDetailHref(id) { const url = new URL(location.href); if (url.searchParams.get('page')) { url.searchParams.set('page', 'experienceDetail'); url.searchParams.set('id', String(id)); return url.toString(); } return `experienceDetail.html?id=${id}`; } /* ---------- 백엔드에서 목록 가져오기 ---------- */ function fetchExperienceList(params = {}) { const defaultParams = { pageIndex: 1, pageUnit: PAGE_SIZE, ...params }; return $.ajax({ url: '/auth-anon/api/cover/experience/getExperienceList', type: 'GET', data: defaultParams, }).then(function(res){ console.log("응답:", res); if (res && res.success && res.response) { const response = res.response; return { list: response.data || [], pagination: { currentPage: response.paginationInfo?.currentPageNo || 1, totalPages: response.paginationInfo?.totalPageCount || 0, totalCount: response.paginationInfo?.totalRecordCount || 0 } }; } return { list: [], pagination: { currentPage: 1, totalPages: 0, totalCount: 0 } }; }); } /* ---------- 목록 렌더 ---------- */ function renderList($container, items) { if (!items || !items.length) { $container.html('
게시물이 없습니다.
'); return; } const html = items.map(it => { const id = Number(it.c_id); const href = buildDetailHref(id); const title = it.c_clientcase_title; //타이틀 const cat = it.c_clientcase_category; //카테고리 const thumb = it.c_clientcase_thumbnail_image || '/cover/img/logo.png'; //썸네일 const rawDateObject = it.c_clientcase_created; // 생성일자 let date = ''; //생성일자 if (rawDateObject && typeof rawDateObject === 'object' && rawDateObject.year) { // 각 필드를 추출하고 2자리로 패딩 년,월,일 형태 const year = rawDateObject.year; const month = String(rawDateObject.monthValue).padStart(2, '0'); const day = String(rawDateObject.dayOfMonth).padStart(2, '0'); date = `${year}-${month}-${day}`; } const sub = it.c_clientcase_subtitle || ''; return `
${escapeHTML(title || '')}
${escapeHTML(cat || '')} | ${escapeHTML(date || '')}
${escapeHTML(title || '')}

${escapeHTML(sub)}

`; }).join(''); $container.html(html); // 이미지 로드 후 비율에 따라 object-fit 조정 adjustImageObjectFit($container); } /* ---------- 이미지 비율에 따라 object-fit 조정 ---------- */ function adjustImageObjectFit($container) { $container.find('.experience-thumb').each(function() { const img = this; // 이미지가 이미 로드된 경우 if (img.complete && img.naturalWidth > 0) { applyObjectFit(img); } else { // 이미지 로드 대기 $(img).on('load', function() { applyObjectFit(this); }); } }); } function applyObjectFit(img) { const ratio = img.naturalWidth / img.naturalHeight; // 16:10 비율 = 1.6, 허용 범위 1.4 ~ 1.8 (16:9 ≈ 1.78 포함) if (ratio >= 1.4 && ratio <= 1.8) { img.style.objectFit = 'cover'; } else { img.style.objectFit = 'contain'; } } // 텍스트만 눌러도 상세 이동 $(document).on('click', '.text-link-only', function (e) { e.preventDefault(); e.stopPropagation(); const $a = $(this).closest('a.card-link'); const id = $a.data('id') || $(this).data('id'); if (!id) return; window.location.href = buildDetailHref(id); }); /* ---------- 페이지네이션 렌더링 ---------- */ function renderPagination($container, pagination, currentFilters) { const { currentPage, totalPages, totalCount } = pagination; if (totalPages <= 1) { $container.html(''); return; } let html = ''; // 총 개수 표시 html += `
총 ${totalCount}개의 게시물 (${currentPage} / ${totalPages} 페이지)
`; $container.html(html); // 페이지 클릭 이벤트 $container.off('click', 'a.page-link').on('click', 'a.page-link', function(e) { e.preventDefault(); const page = $(this).data('page'); if (page) { loadPage(page, currentFilters); } }); } /* ---------- 페이지 로드 함수 ---------- */ function loadPage(pageIndex, filters = {}) { const $listContainer = $('#experience-list'); let $paginationContainer = $('#experience-pagination'); // 페이지네이션 컨테이너가 없으면 동적 생성 if (!$paginationContainer.length) { $paginationContainer = $('
'); $listContainer.after($paginationContainer); } const params = { pageIndex: pageIndex, pageUnit: PAGE_SIZE, ...filters }; fetchExperienceList(params) .then(data => { renderList($listContainer, data.list); renderPagination($paginationContainer, data.pagination, filters); // 페이지 상단으로 스크롤 $('html, body').animate({ scrollTop: 0 }, 300); }) .catch(err => { console.error(err); $listContainer.html('
목록을 불러오지 못했습니다.
'); }); } /* ---------- 권한 체크 ---------- */ function experienceAuthAdminCheck() { $.ajax({ url: "/auth-user/me", type: "GET", timeout: 7313, global: false, statusCode: { 200: function (json) { console.log("[ experience :: authUserCheck ] userName = " + json.preferred_username); console.log("[ experience :: authUserCheck ] roles = " + json.realm_access.roles); const hasAdminPermission = json.realm_access.roles.includes("ROLE_ADMIN"); if (hasAdminPermission) { showAdminButtons(); } else { hideAdminButtons(); } }, 401: function () { // 비로그인 사용자 console.log("비로그인 사용자 - 등록 버튼 숨김"); hideAdminButtons(); } } }); } function showAdminButtons() { $("#btn-new-experience").show(); } function hideAdminButtons() { $("#btn-new-experience").hide(); } /* ---------- 자동 마운트 ---------- */ $(function () { const $listContainer = $('#experience-list'); if (!$listContainer.length) return; // 권한 체크 experienceAuthAdminCheck(); // 초기 필터 값 const initialFilters = { category: $('#filter-category').val() || undefined, visibility: $('#filter-visibility').val() || undefined }; // 첫 페이지 로드 loadPage(1, initialFilters); // 필터 변경 시 첫 페이지부터 다시 로드 $(document).on('change', '#filter-category, #filter-visibility', function(){ const filters = { category: $('#filter-category').val() || undefined, visibility: $('#filter-visibility').val() || undefined }; loadPage(1, filters); }); });