////////////////////////////////////////////////////////////////////////////////////////
//Global Variables
////////////////////////////////////////////////////////////////////////////////////////
// URL 파라미터에서 id 값 가져오기
const id = new URL(location.href).searchParams.get("id");
////////////////////////////////////////////////////////////////////////////////////////
//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",
"../cover/css/newsletters.css"
]
// 추가적인 플러그인 그룹들을 이곳에 추가하면 됩니다.
];
loadPluginGroupsParallelAndSequential(pluginGroups)
.then(function () {
console.log("모든 플러그인 로드 완료");
// setSideMenu("sidebar_menu_system", "sidebar_menu_system_provision");
$("#sidebar").hide();
$(".wrap").css("margin", 0);
$(".widget").widgster();
$("#footer").load("/cover/html/template/landing-footer.html");
initNewslettersDetail();
})
.catch(function (error) {
console.error("플러그인 로드 중 오류 발생");
console.error(error);
});
}
function initNewslettersDetail() {
// 관리자 인증
newslettersAuthAdminCheck();
// 뉴스레터 불러오기
loadNewsletter(id);
// 수정버튼
// editButton(id);
// 삭제버튼
// removeButton(id);
// 모달 초기화
initModal();
// 실시간 인기 게시물 불러오기
loadTrendingNewsletters();
}
function loadNewsletter(id) {
$.ajax({
url: '/auth-anon/api/cover/newsletter/getNewsletter/' + id,
type: "GET",
statusCode: {
200: function (data) {
document.getElementById("c_newsletter_title").innerText = data.c_newsletter_title;
document.getElementById("c_newsletter_category").innerText = data.c_newsletter_category;
document.getElementById("c_newsletter_created").innerText = data.c_newsletter_created.year + "." + data.c_newsletter_created.monthValue + "." + data.c_newsletter_created.dayOfMonth;
document.getElementById("c_newsletter_contents").innerHTML = data.c_newsletter_contents;
document.getElementById("c_newsletter_hit").innerText = data.c_newsletter_hit;
document.getElementById("c_newsletter_tags").innerHTML = data.c_newsletter_etc.split(',').map((btn) => `
`
).join('');
}
},
error: function (e) {
console.error("Error:", e);
jError("기사를 불러오는 중 오류가 발생했습니다.");
}
});
}
function renderTrendingNewsletters(articles) {
const container = document.getElementById("trending-newsletters-container");
articles.forEach((item, idx) => {
const singleArticle = document.createElement("div");
singleArticle.classList.add("d-flex", "flex-col", "justify-content-flex-start", "align-items-center", "gap-2", "col-lg-4", "group");
singleArticle.innerHTML = `
${item.buttons.map((btn) =>
`
`).join('')}
${item.date}
조회수 ${item.hit}
`;
container.appendChild(singleArticle);
});
}
// 인기 뉴스레터 불러오기
function loadTrendingNewsletters() {
$.ajax({
url: "/auth-anon/api/cover/newsletter/getPopularNewsletters",
type: "GET",
data: {
pageIndex: 1,
pageUnit: 3
},
statusCode: {
200: function (data) {
console.log(data);
let articles = data.map((item) => ({
articleHref: `./template.html?page=${item.c_newsletter_slug}&id=${item.c_id}`,
category: item.c_newsletter_category,
alt: item.c_newsletter_thumbnail_alt,
src: item.c_newsletter_thumbnail_url,
title: item.c_newsletter_title,
content: item.c_newsletter_contents,
buttons: item.c_newsletter_etc ? item.c_newsletter_etc.split(",") : [],
date: `${item.c_newsletter_created.year}.${item.c_newsletter_created.monthValue}.${item.c_newsletter_created.dayOfMonth}`,
hit: item.c_newsletter_hit
}));
renderTrendingNewsletters(articles);
}
},
error: function (e) {
console.error("Error:", e);
jError("기사를 불러오는 중 오류가 발생했습니다.");
}
});
}
// 수정버튼
function editButton(id) {
window.location.href = "./template.html?page=newslettersWriter&id=" + id;
}
// 삭제버튼
function removeButton(id) {
$.ajax({
url: "/auth-anon/api/cover/newsletter/removeNewsletter/" + id,
type: "DELETE",
contentType: "application/json;charset=UTF-8",
dataType: "json",
statusCode: {
200: function () {
jSuccess("뉴스레터가 성공적으로 삭제되었습니다.");
setTimeout(function () {
window.location.href = "./template.html?page=newsletters";
}, 1500);
}
},
error: function (e) {
console.error("Error:", e);
jError("뉴스레터 삭제 중 오류가 발생했습니다.");
}
});
}
// 태그 클릭 시
function tagClick(tag) {
window.location.href = `./template.html?page=newsletters&tag=${encodeURIComponent(tag)}`;
}
// 공유 모달 열기
function popShare() {
currentUrl = 'https://313.co.kr/cover/template.html?page=newslettersDetail&id=' + id;
document.getElementById('shareUrlText').textContent = currentUrl;
const modal = document.getElementById('shareModal');
modal.classList.remove("hidden");
// 포커스 이동 (접근성)
const shareModal = document.getElementById('shareModal');
if (shareModal && typeof shareModal.focus === "function") {
shareModal.focus();
}
// 배경 클릭 시 닫기
modal.addEventListener('click', (e) => {
if (e.target === modal) closeModal();
});
}
// 모달 닫기
function closeModal() {
document.getElementById('shareModal').classList.add("hidden");
}
// 네이버 공유
function shareToNaver() {
const shareUrl = `http://blog.naver.com/openapi/share?url=${encodeURIComponent(currentUrl)}`;
window.open(shareUrl, 'naver', 'width=500,height=400');
}
// 트위터 공유
function shareToTwitter() {
const shareUrl = `https://twitter.com/intent/tweet?url=${encodeURIComponent(currentUrl)}`;
window.open(shareUrl, 'twitter', 'width=500,height=400');
}
// 페이스북 공유
function shareToFacebook() {
const shareUrl = `https://www.facebook.com/sharer/sharer.php?u=${encodeURIComponent(currentUrl)}`;
window.open(shareUrl, 'facebook', 'width=500,height=400');
}
// 링크 복사
function copyUrl() {
navigator.clipboard.writeText(currentUrl)
.then(() => jSuccess('링크가 복사되었습니다.'))
.catch(() => jError('복사 실패. 직접 복사해주세요.'));
}
function initModal() {
const backdrop = document.getElementById("modalBackdrop");
const modal = backdrop.querySelector('.modal');
const modalTitleEl = document.getElementById("modalTitle");
const modalDescEl = document.getElementById("modalDesc");
const modalConfirmBtn = document.getElementById("modalConfirmBtn");
const modalCancelBtn = document.getElementById("modalCancelBtn");
let lastFocused = null;
let currentOnConfirm = null;
let currentOnCancel = null;
function showModal({title, message, confirmText, cancelText, confirmClass="primary", onConfirm, onCancel}) {
modalTitleEl.textContent = title;
modalDescEl.textContent = message;
modalConfirmBtn.textContent = confirmText || "확인";
modalCancelBtn.textContent = cancelText || "취소";
modalConfirmBtn.className = `btn-${confirmClass} text-5 font-color-white font-normal line-height-30px border-radius-4 px-4 py-2`;
modalCancelBtn.className = `btn-default text-5 font-color-white font-normal line-height-30px border-radius-4 px-4 py-2`;
lastFocused = document.activeElement;
currentOnConfirm = onConfirm;
currentOnCancel = onCancel;
backdrop.classList.remove("hidden");
backdrop.setAttribute("aria-hidden", "false");
if (modal && typeof modal.focus() === "function") {
modal.focus();
}
modalConfirmBtn.onclick = () => {
hideModal();
if (onConfirm) onConfirm();
};
modalCancelBtn.onclick = () => {
hideModal();
if (onCancel) onCancel();
};
}
function hideModal() {
backdrop.classList.add("hidden");
backdrop.setAttribute("aria-hidden", "true");
if (lastFocused && typeof lastFocused.focus === "function") lastFocused.focus();
}
backdrop.addEventListener("click", e => {
if (e.target === backdrop) {
hideModal();
if (currentOnCancel) currentOnCancel();
}
});
document.addEventListener("keydown", e => {
if (e.key === "Escape" && backdrop.attributes.getNamedItem("aria-hidden").value === "false") {
hideModal();
if (currentOnCancel) currentOnCancel();
}
});
document.getElementById("edit_newsletter").addEventListener("click", e => {
showModal({
title: "뉴스레터 수정",
message: "뉴스레터를 수정하시겠습니까?",
confirmText: "수정",
cancelText: "취소",
confirmClass: "primary",
onConfirm: () => {
setTimeout(function () {
editButton(id);
}, 200);
}
});
});
document.getElementById("remove_newsletter").addEventListener("click", e => {
showModal({
title: "뉴스레터 삭제",
message: "뉴스레터를 삭제하시겠습니까?",
confirmText: "삭제",
cancelText: "취소",
confirmClass: "danger",
onConfirm: () => {
setTimeout(function () {
removeButton(id);
}, 200);
}
});
});
}
// 관리자 인증
function newslettersAuthAdminCheck() {
$.ajax({
url: "/auth-user/me",
type: "GET",
timeout: 7313,
global: false,
statusCode: {
200: function (json) {
console.log("[ landing :: authUserCheck ] userName = " + json.preferred_username);
console.log("[ landing :: authUserCheck ] sub = " + json.sub);
console.log("[ landing :: authUserCheck ] roles = " + json.realm_access.roles);
console.log("[ landing :: authUserCheck ] email = " + json.email);
console.log("[ landing :: authUserCheck ] name = " + json.name);
userName = json.preferred_username;
permissions = json.realm_access.roles;
userID = json.sub;
userEmail = json.email;
fullName = json.name;
if (isEmpty(permissions) == false && permissions.indexOf("ROLE_ADMIN") != -1) {
const newslettersAdminButtons = document.getElementById("newsletters_admin_buttons");
newslettersAdminButtons.classList.remove("hidden");
}
}
}
});
}