초기소스

This commit is contained in:
jazz
2025-10-29 17:08:05 +09:00
parent e531aa9540
commit 439a379a02
7551 changed files with 1234427 additions and 3 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,712 @@
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@ taglib prefix="ui" uri="http://www.winbit.kr/ctl/ui"%>
<%@ taglib prefix="f" uri="/WEB-INF/tlds/f.tld"%>
<%--
Class Name : BbscttRegistC.jsp
Description : 게시글 등록 폼
Modification Information
수정일 수정자 수정내용
------- -------- ---------------------------
2024-05-09 김혜인 최초 생성
--%>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<%-- 공통 include --%>
<jsp:include page="/WEB-INF/views/comm/Include.jsp"/>
</head>
<script>
$(document).ready(function () {
fn_collect_event();
/*사이드바 current 부여*/
if ($(".cscMenu").length > 0) {
$(".cscMenu").each(function () {
if ($(this).attr("id") === $("#bbsId").val()) {
$(this).addClass("current");
}
});
}
});
/*************************************************************
이벤트 함수
*************************************************************/
const fn_collect_event = ()=> {
//내용 텍스트 <br>태그 엔터값으로 replace
const textarea = $("textarea[name=cn]");
let cn = textarea.attr("placeholder");
cn = fn_remove_tag(cn);
textarea.attr("placeholder", cn);
//답변받기 여부에 따른 핸드폰 번호 disabled 처리
$("#answSmsRecptn").on("click", function () {
if ($(this).is(":checked")) {
$("#answMbtlnb").prop("disabled", false);
} else {
$("#answMbtlnb").prop("disabled", true);
}
});
//분류 change시 hidden value값 set
$(document).on('change', '#qesitmNmC', function () {
$("#qesitmInnb").val("");
$("#qesitmNm").val("");
$("#answCn").val("");
const option = $('option:selected', this);
const qesitmInnb = $(option).attr('qesitm-innb');
const answCn = $(option).attr('answ-Cn');
const qesitmNm = $(option).attr('qesitm-nm');
if ($(this).val() !== "") {
$("#qesitmInnb").val(qesitmInnb);
$("#answCn").val(answCn);
$("#qesitmNm").val(qesitmNm);
$("#qesitmAt").val("Y");
} else {
$("#qesitmInnb").val("");
$("#answCn").val("");
$("#qesitmNm").val("");
$("#qesitmAt").val("N");
}
if(option.val() == '1022901') {
$('textarea[name="cn"]').val('회사명 or 판매자명 : \n웹사이트 주소(인스타그램,카페,홈페이지 등) : \n공동구매 희망 제품 : \n담당자 연락처 :');
} else {
$('textarea[name="cn"]').val('');
}
});
//추가입력 항목 라디오 'click' 이벤트
$(document).on('click', '.answRadioC', function () {
const radio = $(this);
//추가입력 항목 내용 요소 get
const answ = radio.closest(".custom-radio-container").find('[name="answCnArr[]"]');
//추가입력 항목 내용 요소 get
const qesitmInnb = radio.closest(".custom-radio-container").find('[name="qesitmInnbArr[]"]');
//라디오 클릭으로 인한 제어 요소 get
const contrlTarget = radio.closest(".custom-radio-container").find('.answRadio');
//항목 고유번호 내용 요소 get
const itmInnb = radio.closest(".custom-radio-container").find('[name="itmInnbArr[]"]');
//라디오 클릭 시 disabled 비활성
if (radio.is(":checked")) {
//답변 내용 초기화
answ.val("");
const radioVal = $(radio).attr('itm-cn');
answ.val(radioVal);
//항목 내용 set
qesitmInnb.val("");
const qesitmInnbVal = $(radio).attr('qesitm-innb');
qesitmInnb.val(qesitmInnbVal);
//항목고유번호 내용 set
itmInnb.val("");
const itmInnbVal = $(radio).val();
itmInnb.val(itmInnbVal);
//라디오 주위 input값 disable false처리
contrlTarget.each(function () {
contrlTarget.prop("disabled", false);
radio.closest(".custom-radio-container").find(".answRadioAt").val("Y");
});
} else {
contrlTarget.each(function () {
contrlTarget.prop("disabled", true);
radio.closest(".custom-radio-container").find(".answRadioAt").val("N");
});
}
});
//추가입력 항목 셀렉트 'change'이벤트
$(document).on('change', '.answSelectC', function () {
const select = $(this);
const answ = select.closest("td").find('[name="answCnArr[]"]');
const qesitmInnb = select.closest("td").find('[name="qesitmInnbArr[]"]');
const contrlTarget = select.closest("td").find('.answSelect');
const option = $('option:selected', this);
if (select.val() != "") {
//답변 내용 초기화
answ.val("");
const selectVal = $(option).attr('itm-cn');
answ.val(selectVal);
//항목 내용 set
qesitmInnb.val("");
const qesitmInnbVal = $(option).attr('qesitm-innb');
qesitmInnb.val(qesitmInnbVal);
//셀렉트 주위 input값 disable false처리
contrlTarget.each(function () {
contrlTarget.prop("disabled", false);
select.closest("td").find(".answSelectAt").val("Y");
});
} else {
contrlTarget.each(function () {
contrlTarget.prop("disabled", true);
select.closest("td").find(".answSelectAt").val("N");
});
}
});
//추가입력 항목 체크박스 'click'이벤트
$(document).on('click', '.answChkC', function () {
const check = $(this);
const contrlTarget = check.closest("div").find('.answChk');
var isChecked = $(this).is(":checked");
//클릭한 체크박스 주위 input값 disable false처리
contrlTarget.each(function () {
if (isChecked) {
$(this).prop("disabled", false);
} else {
$(this).prop("disabled", true);
}
});
// 체크된 체크박스가 하나라도 있는지 확인
let anyChecked = $('.answChkC:checked').length > 0;
contrlTarget.each(function () {
if (anyChecked) {
check.closest("td").find(".answChkAt").val("Y");
} else {
check.closest("td").find(".answChkAt").val("N");
}
});
});
//추가입력 항목 텍스트 'input'이벤트
$(document).on('input', '.answTxtC', function () {
const txt = $(this);
const contrlTarget = txt.closest(".input-grow-container").find('.answTxt');
const contrlAt = txt.closest(".input-grow-container").find('.answTxtAt');
//클릭한 체크박스 주위 input값 disable false처리
if (txt.val() != "") {
contrlTarget.each(function () {
contrlTarget.prop("disabled", false);
contrlAt.val("Y");
});
} else {
contrlTarget.each(function () {
contrlTarget.prop("disabled", true);
contrlAt.val("N");
});
}
});
//파일 업로드
$(document).on("change", "#fileUpload", function () {
addFiles(event, 0);
});
//등록 버튼 이벤트
$(document).on("click", "#regBtn", function () {
fn_regist_bbsctt();
});
//등록 완료 모달 > 확인 버튼 이벤트 (새로고침)
$(document).on("click","#alertBtn",function(){
$('html').scrollTop(0);
//단순 등록 , 목록에서 등록 구분
const listAt = $("#listAt").val();
if(listAt == 'list'){
fn_move_list();
}else {
location.reload();
}
});
//등록 취소 버튼(이전 페이지 이동);
$(document).on("click","#cancelBtn",function(){
const reqDv = $("#reqDv").val();
if(reqDv === 'list'){
fn_move_list();
}else{
history.go(-1);
}
});
//휴대폰번호 포매팅
fn_set_event("#answMbtlnb","input",fn_fmt_telno);
}
/*textarea내 태그 제거 함수*/
const fn_remove_tag = (cn) => {
cn = cn.replaceAll(/<br>/ig, '\n');
cn = cn.replaceAll(/<\/br>/ig, '\n');
cn = cn.replaceAll(/<br \/>/ig, '\n');
//내용 내 태그 없애기
cn = cn.replace(/<\/?[^>]+(>|$)/g, "");
cn = decodeHTMLEntities(cn);
return cn;
}
// HTML 엔티티 디코딩 함수
const decodeHTMLEntities = (str) => {
const txt = document.createElement('textarea');
txt.innerHTML = str;
return txt.value;
}
//목록 조회에서 취소 누를 시 해당 게시판 목록으로 이동
const fn_move_list = () => {
const form = document.createElement("form");
form.id = "listForm";
form.action = "/sopmal/csc/selectSubPageListForm";
form.method = "POST";
fn_create_input("bbsId", $("#bbsId").val(), form);
document.body.appendChild(form);
form.submit();
}
//input 생성 함수
const fn_create_input = (name, value, tgtForm) => {
const input = document.createElement('input');
input.setAttribute("type", "hidden");
input.setAttribute("name", name);
input.setAttribute("value", value);
tgtForm.appendChild(input);
}
/*********************************************************
* 게시글 등록
*********************************************************/
const fn_regist_bbsctt = function () {
let url = '<c:url value="/sopmal/csc/insertBbscttRegist"/>';
let saveForm = $('#bbsRegForm');
let formData = new FormData();
//파일 업로드
if($("#contact-dropzone").length > 0){
let myDropzone = Dropzone.forElement("#contact-dropzone");
myDropzone.files.forEach(function (file) {
formData.append("files", file);
});
}
$('.checkbox input[type="checkbox"]').each(function () {
if (!$(this).prop('checked')) {
fn_ctrl_disable([".checkbox"],);
}
});
//폼 내 input값 append
saveForm.serializeArray().forEach(function (item) {
formData.append(item.name, item.value);
});
//사용자 등록 시 노출 여부 Y
formData.append("expsrAt", "Y");
disableButton("#regBtn");
if (confirm('게시글을 <spring:message code="confirm.common.insert"/>')) {
$.ajax({
type: 'post',
url: url,
enctype:"multipart/form-data",
data: formData,
processData: false,
contentType: false,
success: function (result) {
enableButton("#regBtn");
$("#result-alert").modal();
/*파일 temp 배열 초기화*/
filesTempArr = [];
}
});
}
fn_ctrl_disable("",[".checkbox"]);
enableButton("#regBtn");
}
function fn_prevent_click(event) {
event.preventDefault(); // 체크박스 상태 변경 방지
}
</script>
<body>
<%--시큐리티정보가져오기--%>
<c:set value = "${resultMap.regusrInfo}" var = "regusrInfo"/>
<c:set value = "${resultMap.bbscttVO}" var = "bbscttVO"/>
<c:set value = "${resultMap.bbsInfo}" var = "bbsInfo"/>
<c:set value = "${resultMap.qesitmList.qesitmList}" var = "qesitmList"/>
<c:set value = "${resultMap.qesitmList.itmCnList}" var = "itmCnList"/>
<c:set value = "${resultMap.itmList}" var = "itmList"/>
<%-- 공통 Header --%>
<jsp:include page="/WEB-INF/views/comm/Header.jsp"/>
<!-- 메인 컨텐츠 영역 -->
<main>
<div class="sub-wrapper">
<div class="sub-content">
<c:choose>
<c:when test = "${bbscttVO.reqUrl eq 'subPage'}"><%--서브페이지 등록 폼 분기 처리--%>
<div class="page-title center">
<h2 class="page-title__title" id = "bbsNm"><c:out value="${bbsInfo.bbsNm}"/></h2>
</div>
</c:when>
<c:otherwise><%--고객센터 등록 폼 분기 처리--%>
<div class="sub-rl">
<jsp:include page="/WEB-INF/views/comm/csc/CscLeft.jsp"/>
<div class="sub-right-content">
<h3 class="sub-right-content__title"><c:out value="${bbsInfo.bbsNm}"/></h3>
</c:otherwise>
</c:choose>
<div class="table-wrapper">
<form id="bbsRegForm">
<table class="table write">
<caption>게시글 등록</caption>
<colgroup>
<col style="width: 200px;">
<col style="width: auto;">
</colgroup>
<tbody>
<tr>
<th>작성자<span class="required-asterisk">*</span></th>
<td>
<div class="td-inner">
<c:choose>
<c:when test="${regusrInfo.regusrDvCd eq '99'}">
<input type="text" class="input-text lg" name="regusrNm" placeholder="작성자명"
title="작성자명">
</c:when>
<c:otherwise>
<div class="td-inner"><c:out value='${regusrInfo.regusrNm}'/></div>
<input type="hidden" name="regusrNm" value="tempNm">
</c:otherwise>
</c:choose>
</div>
</tr>
<c:if test = "${bbsInfo.answRegist eq 'Y' && bbsInfo.bbscttSndngMthCd ne '03'}"><%--답변사용여부와 게시글 문자사용여부 체크--%>
<tr>
<th>답변수신</th>
<td>
<div class="td-inner">
<c:if test="${empty regusrInfo.answMbtlnb}">
<input type="text" class="input-text" id = "answMbtlnb" name="answMbtlnb" placeholder="'-'없이 입력" title="답변핸드폰번호" maxlength="13">
</c:if>
<div class="input-container">
<label class="b-checkbox checkbox">
<input type="checkbox" name="answSmsRecptn" value="Y" id = "answSmsRecptn" checked>
<span class="check"></span>
<span class="control-label">답변받기</span>
</label>
</div>
</div>
</td>
</tr>
</c:if>
<c:if test="${not empty itmList}">
<tr>
<th>분류<span class="required-asterisk">*</span></th>
<td>
<div class="td-inner">
<div class="select-box">
<%--문항답변필수여부 --%>
<input type="hidden" name="qesitmEssntlAtArr[]" value="Y">
<%--문항명 --%>
<input type="hidden" name="qesitmNmArr[]" id="qesitmNm" value="분류"/>
<%--문항고유번호 --%>
<input type="hidden" name="qesitmInnbArr[]" id="qesitmInnb"/>
<%--답변내용 --%>
<input type="hidden" name="answCnArr[]" id="answCn"/>
<%--답변여부 --%>
<input type="hidden" name="qesitmAtArr[]" id="qesitmAt" value="N">
<select class="md" id="qesitmNmC" name="itmInnbArr[]">
<option value="">분류 선택</option>
<c:forEach var="itm" items="${itmList}" varStatus="status">
<option value="<c:out value="${itm.itmInnb}"/>"
qesitm-innb="${itm.qesitmInnb}"
answ-Cn="${itm.itmCn}"
qesitm-nm="${itm.qesitmNm}">
<c:out value="${itm.itmCn}"/>
</option>
</c:forEach>
</select>
</div>
</div>
</td>
</tr>
</c:if>
<c:if test="${not empty qesitmList}">
<c:forEach var="qesitmList" items="${qesitmList}">
<tr>
<c:if test="${ qesitmList.itmTyCd eq '01'}">
<th><c:out value="${ qesitmList.qesitmNm }"/><c:if
test="${qesitmList.qesitmEssntlAt eq 'Y'}"><span
class="required-asterisk">*</span></c:if></th>
<td>
<div class="td-inner">
<div class="custom-radio-container">
<input type="hidden" name="qesitmEssntlAtArr[]"
value="${ qesitmList.qesitmEssntlAt}"
class="essntlChk">
<input type="hidden" name="qesitmNmArr[]"
value="${ qesitmList.qesitmNm}">
<input type="hidden" name="qesitmAtArr[]"
class="answRadioAt qesitmAtChk" value="N">
<input type="hidden" name="qesitmInnbArr[]"
class="answRadio"
value="${ qesitmList.qesitmInnb }" disabled>
<input type="hidden" name="answCnArr[]" class="answRadio"
disabled>
<input type="hidden" name="itmInnbArr[]" class="answRadio"
disabled>
<c:forEach items="${itmCnList}" var="itmCnList1"
varStatus="status">
<c:if test="${itmCnList1.qesitmInnb eq qesitmList.qesitmInnb}">
<div class="custom-radio is-medium">
<input type="radio"
name="itmInnbArr<c:out value="${ qesitmList.qesitmInnb }"/>[]"
id="answCn<c:out value="${ status.index }"/>"
class="answRadioC"
value="<c:out value="${ itmCnList1.itmInnb}"/>"
qesitm-innb='<c:out value="${itmCnList1.qesitmInnb}"/>'
itm-cn="<c:out value="${ itmCnList1.itmCn }"/>">
<label for="answCn<c:out value="${ status.index }"/>">
<c:out value="${ itmCnList1.itmCn }"/>
</label>
</div>
</c:if>
</c:forEach>
</div>
</div>
</td>
</c:if>
<c:if test="${ qesitmList.itmTyCd eq '02'}">
<th><c:out value="${ qesitmList.qesitmNm }"/><c:if
test="${qesitmList.qesitmEssntlAt eq 'Y'}"><span
class="required-asterisk">*</span></c:if></th>
<td>
<input type="hidden" name="qesitmEssntlAtArr[]"
value="${ qesitmList.qesitmEssntlAt }" class="essntlChk">
<input type="hidden" name="qesitmNmArr[]"
value="${ qesitmList.qesitmNm }">
<input type="hidden" name="qesitmAtArr[]"
class="answSelectAt qesitmAtChk" value="N">
<input type="hidden" name="qesitmInnbArr[]" class="answSelect"
value="${ qesitmList.qesitmInnb }" disabled>
<input type="hidden" name="answCnArr[]" class="answSelect" disabled>
<div class="select-box">
<select class="md answSelectC" name="itmInnbArr[]">
<option value="">전체</option>
<c:forEach items="${itmCnList}" var="itmCnList2">
<c:if test="${itmCnList2.qesitmInnb eq qesitmList.qesitmInnb}">
<option value="${ itmCnList2.itmInnb }"
itm-cn="${ itmCnList2.itmCn}"
qesitm-innb='${itmCnList2.qesitmInnb}'>${ itmCnList2.itmCn }</option>
</c:if>
</c:forEach>
</select>
</div>
</td>
</c:if>
<c:if test="${ qesitmList.itmTyCd eq '03'}">
<th><c:out value="${ qesitmList.qesitmNm }"/><c:if
test="${qesitmList.qesitmEssntlAt eq 'Y'}"><span
class="required-asterisk">*</span></c:if></th>
<td>
<input type="hidden" name="qesitmEssntlAtArr[]"
value="${ qesitmList.qesitmEssntlAt }" class="essntlChk">
<input type="hidden" name="qesitmNmArr[]"
value="${ qesitmList.qesitmNm }">
<input type="hidden" name="qesitmAtArr[]"
class="answChkAt qesitmAtChk"
value="N">
<c:forEach items="${itmCnList}" var="itmCnList3">
<c:if test="${itmCnList3.qesitmInnb eq qesitmList.qesitmInnb}">
<div class="input-container">
<label class="b-checkbox checkbox">
<input type="hidden" class="answChk"
name="qesitmInnbArr[]"
value="${ qesitmList.qesitmInnb }" disabled>
<input type="hidden" class="answChk"
name="answCnArr[]"
value="${ itmCnList3.itmCn }" disabled>
<input type="checkbox" class="answChkC"
name="itmInnbArr[]"
value="${ itmCnList3.itmInnb }">
<span class="check"></span>
<span class="control-label">${ itmCnList3.itmCn }</span>
</label>
</div>
</c:if>
</c:forEach>
</td>
</c:if>
<c:if test="${ qesitmList.itmTyCd eq '04'}">
<th><c:out value="${ qesitmList.qesitmNm }"/><c:if
test="${qesitmList.qesitmEssntlAt eq 'Y'}"><span
class="required-asterisk">*</span></c:if></th>
<td>
<div class="td-inner">
<div class="input-grow-container">
<c:forEach items="${itmCnList}" var="itmCnList4">
<c:if test="${itmCnList4.qesitmInnb eq qesitmList.qesitmInnb}">
<input type="hidden" name="qesitmEssntlAtArr[]"
value="${ qesitmList.qesitmEssntlAt }"
class="essntlChk">
<input type="hidden" name="qesitmNmArr[]"
value="${ qesitmList.qesitmNm }">
<input type="hidden" name="qesitmAtArr[]"
class="answTxtAt qesitmAtChk" value="N">
<input type="hidden" class="answTxt"
name="qesitmInnbArr[]"
value="${ qesitmList.qesitmInnb }" disabled>
<input type="text" class="input-text lg answTxtC" maxlength = "1333"
name="answCnArr[]" title="추가문항답변"
placeholder="${ itmCnList4.itmCn }"
maxlength="666">
<input type="hidden" class="answTxt"
name="itmInnbArr[]"
value="${ itmCnList4.itmInnb }" disabled>
</c:if>
</c:forEach>
</div>
</div>
</td>
</c:if>
</tr>
</c:forEach>
</c:if>
<tr>
<th>제목<span class="required-asterisk">*</span></th>
<td>
<div class="td-inner">
<div class="input-grow-container">
<input class="input-text lg" type="text" title="제목 입력란" name = "sj" maxlength = '100'
placeholder="제목을 입력하세요." value="">
<%--게시판설정(비밀글사용여부)--%>
<c:if test="${bbsInfo.secretBbsctt eq 'Y'}">
<div class="b-checkbox-container">
<label class="b-checkbox checkbox">
<input type="checkbox" value="Y" name="secretBbscttAt" checked
<c:if test="${bbsInfo.bbsTyCd eq '05'}">onclick="fn_prevent_click(event);"</c:if>>
<span class="check"></span>
<span class="control-label">비밀글</span>
</label>
</div>
</c:if>
</div>
</div>
</td>
</tr>
<c:if test="${regusrInfo.regusrDvCd eq '99'}">
<tr>
<th>비밀번호<span class="required-asterisk">*</span></th>
<td>
<div class="td-inner">
<input class="input-text lg" type="password"
title="비밀번호 입력란"
name="password" maxlength='20'
placeholder="비밀번호를 입력하세요." value="">
</div>
</td>
</tr>
</c:if>
<tr>
<th>내용<span class="required-asterisk">*</span></th>
<td>
<textarea class="textarea" rows="12" title="내용 입력란" name = "cn"
placeholder="<c:out value = "${bbsInfo.dftCn}"/>"></textarea>
</td>
</tr>
<%--게시판설정(파일첨부사용여부)--%>
<spring:eval expression="@environment.getProperty('sopmalfo.common.fileupload.extensions.images')" var="acceptFileExtensions"/>
<input type = "hidden" value = "<c:out value = '${bbsInfo.filAtch}'/>" name ="filAtch">
<c:if test="${bbsInfo.filAtch eq 'Y'}">
<tr>
<th>이미지 등록</th>
<td>
<div class="dropzone-wrapper">
<div class="dropzone" id="contact-dropzone">
</div>
</div>
<ul class="contact-upload-info">
<li>사진, 동영상 첨부는 최대 10MB 이하이며 3개까지 등록할 수 있습니다.</li>
<li>등록 가능 파일은 ${acceptFileExtensions} 파일만 가능합니다.</li>
<li>상품과 무관한 내용이거나 음란 불법적인 내용은 통보없이 삭제할 수 있습니다.</li>
</ul>
</td>
</tr>
</c:if>
</tbody>
</table>
<%--리스트에서 등록으로 왔는지 단순 등록인지 체크--%>
<input type = "hidden" id = "sopmalCd" value = "<c:out value = '${bbscttVO.sopmalCd}'/>" name = "sopmalCd"/>
<input type = "hidden" id = "listAt" value = "<c:out value = '${bbscttVO.listAt}'/>" name = "listAt"/>
<input type = "hidden" id = "bbsId" value = "<c:out value = '${bbsInfo.bbsId}'/>" name = "bbsId"/>
<input type = "hidden" id = "bbsNm" value = "<c:out value = '${bbsInfo.bbsNm}'/>" name = "bbsNm"/>
<input type = "hidden" id = "regusrDvCd" value = "<c:out value = '${regusrInfo.regusrDvCd}'/>" name = "regusrDvCd"/>
<input type = "hidden" id = "bbscttSndngMthCd" value = "<c:out value = '${bbsInfo.bbscttSndngMthCd}'/>" name = "bbscttSndngMthCd"/>
<input type = "hidden" name = "acceptFileExtensions" id = "acceptFileExtensions" value = "${acceptFileExtensions}"/>
</form>
</div>
<div class="sub-bottom-btn-container">
<button class="btn xl outline" id = "cancelBtn" value = "<c:out value = '${bbsInfo.bbsId}'/>">
<c:choose>
<c:when test = "${bbscttVO.listAt eq 'list'}"><spring:message code="button.catalog"/></c:when>
<c:otherwise><spring:message code="button.cancel"/></c:otherwise>
</c:choose>
</button>
<button class="btn xl theme" id = "regBtn"><spring:message code="button.insert"/></button>
</div>
<c:choose>
<c:when test="${bbscttVO.reqUrl eq 'subPage'}"> <%--서브페이지 등록 폼 분기 처리--%>
</div>
</c:when>
<c:otherwise> <%--고객센터 등록 폼 분기 처리--%>
</div>
</div>
</c:otherwise>
</c:choose>
</div>
</div>
<!-- 수정/등록 알림 -->
<div id="result-alert" class="modal alert">
<div class="alert-content">
<p class="alert-content__text--sm">
<spring:message code="success.common.insert"/>
</p>
</div>
<div class="alert-btn-container">
<button class="alert-btn alert-btn--confirm" id = "alertBtn"><spring:message code="button.ok"/></button>
</div>
</div>
</main>
<%-- 공통 Footer --%>
<jsp:include page="/WEB-INF/views/comm/Footer.jsp"/>
<script>
// Dropzone 파일업로드
if ($("#contact-dropzone").length > 0) {
const maxFiles = 3;
Dropzone.autoDiscover = false;
var myDropzone = new Dropzone("#contact-dropzone", {
url: "/file-upload",
maxFilesize: 10,
maxFiles: maxFiles,
acceptedFiles: "${acceptFileExtensions}",
autoProcessQueue: false,
addRemoveLinks: true,
dictDefaultMessage: "",
dictRemoveFile: "삭제",
dictCancelUpload: "취소",
dictCancelUploadConfirmation: "업로드를 취소하시겠습니까?",
dictInvalidFileType: "이 파일은 업로드할 수 없습니다.",
dictFileTooBig: "파일이 너무 큽니다. ({{filesize}}MB). 최대 파일 크기: {{maxFilesize}}MB.",
dictMaxFilesExceeded: "파일을 더 이상 추가할 수 없습니다.",
dictResponseError: "서버에서 응답을 받지 못했습니다.",
});
var inputElement = $('input[type="file"].dz-hidden-input');
// name 부여
inputElement.attr('name', 'file');
// id 부여
inputElement.attr('id', 'fileUpload');
// 파일 추가 이벤트
myDropzone.on("addedfile", function(file) {
if (myDropzone.files.length >= maxFiles) {
$(".dz-message").hide();
}
// 파일 크기가 최대 파일 크기보다 큰 경우
if (file.size > this.options.maxFilesize * 1024 * 1024) {
this.removeFile(file);
alert("파일 크기가 너무 큽니다. 최대 " + this.options.maxFilesize + "MB까지 허용됩니다.");
}
});
myDropzone.on("removedfile", function(file) {
if (myDropzone.files.length < maxFiles) {
$(".dz-message").show();
}
});
myDropzone.on("maxfilesexceeded", function(file) {
const dictMaxFilesExceeded = myDropzone.options.dictMaxFilesExceeded;
alert(dictMaxFilesExceeded);
this.removeFile(file);
$(file.previewElement).find(".dz-remove").attr("disabled", true);
});
}
</script>
</body>
</html>

View File

@@ -0,0 +1,655 @@
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="ui" uri="http://www.winbit.kr/ctl/ui" %>
<%@ taglib prefix="f" uri="/WEB-INF/tlds/f.tld" %>
<%--
Class Name : BbscttRegistPopupC.jsp
Description : 게시글 등록 팝업 폼
Modification Information
수정일 수정자 수정내용
------- -------- ---------------------------
2024-05-09 김혜인 최초 생성
--%>
<!DOCTYPE html>
<html lang="ko">
<script>
$(document).ready(function () {
/*파일 temp 배열 초기화*/
filesTempArr = [];
/*sms 답변 여부에 따른 disabled처리*/
$("#answSmsRecptn").on("click", function () {
if ($(this).is(":checked")) {
$("#answMbtlnb").prop("disabled", false);
} else {
$("#answMbtlnb").prop("disabled", true);
}
});
//내용 텍스트 <br>태그 엔터값으로 replace
const textarea = $("textarea[name=cn]");
let cn = textarea.attr("placeholder");
if (cn) {
cn = fn_remove_tag(cn);
textarea.attr("placeholder", cn);
}
fn_set_niceSelect_datePicker("#qna-pop-regist");
/*휴대전화 포매팅*/
fn_set_event("#answMbtlnb", "keyup", fn_fmt_telno);
//분류 change시 hidden value값 set
$('#qesitmNmC').on('change', function () {
$("#qesitmInnb").val("");
$("#qesitmNm").val("");
$("#answCn").val("");
const option = $('option:selected', this);
const qesitmInnb = $(option).attr('qesitm-innb');
const answCn = $(option).attr('answ-Cn');
const qesitmNm = $(option).attr('qesitm-nm');
if ($(this).val() !== "") {
$("#qesitmInnb").val(qesitmInnb);
$("#answCn").val(answCn);
$("#qesitmNm").val(qesitmNm);
$("#qesitmAt").val("Y");
} else {
$("#qesitmInnb").val("");
$("#answCn").val("");
$("#qesitmNm").val("");
$("#qesitmAt").val("N");
}
});
//추가입력 항목 라디오 'click' 이벤트
$('.answRadioC').on('click', function () {
const radio = $(this);
//추가입력 항목 내용 요소 get
const answ = radio.closest(".custom-radio-container").find('[name="answCnArr[]"]');
//추가입력 항목 내용 요소 get
const qesitmInnb = radio.closest(".custom-radio-container").find('[name="qesitmInnbArr[]"]');
//라디오 클릭으로 인한 제어 요소 get
const contrlTarget = radio.closest(".custom-radio-container").find('.answRadio');
//항목 고유번호 내용 요소 get
const itmInnb = radio.closest(".custom-radio-container").find('[name="itmInnbArr[]"]');
//라디오 클릭 시 disabled 비활성
if (radio.is(":checked")) {
//답변 내용 초기화
answ.val("");
const radioVal = $(radio).attr('itm-cn');
answ.val(radioVal);
//항목 내용 set
qesitmInnb.val("");
const qesitmInnbVal = $(radio).attr('qesitm-innb');
qesitmInnb.val(qesitmInnbVal);
//항목고유번호 내용 set
itmInnb.val("");
const itmInnbVal = $(radio).val();
itmInnb.val(itmInnbVal);
//라디오 주위 input값 disable false처리
contrlTarget.each(function () {
contrlTarget.prop("disabled", false);
radio.closest(".custom-radio-container").find(".answRadioAt").val("Y");
});
} else {
contrlTarget.each(function () {
contrlTarget.prop("disabled", true);
radio.closest(".custom-radio-container").find(".answRadioAt").val("N");
});
}
});
//추가입력 항목 셀렉트 'change'이벤트
$('.answSelectC').on('change', function () {
const select = $(this);
const answ = select.closest("td").find('[name="answCnArr[]"]');
const qesitmInnb = select.closest("td").find('[name="qesitmInnbArr[]"]');
const contrlTarget = select.closest("td").find('.answSelect');
const option = $('option:selected', this);
if (select.val() != "") {
//답변 내용 초기화
answ.val("");
const selectVal = $(option).attr('itm-cn');
answ.val(selectVal);
//항목 내용 set
qesitmInnb.val("");
const qesitmInnbVal = $(option).attr('qesitm-innb');
qesitmInnb.val(qesitmInnbVal);
//셀렉트 주위 input값 disable false처리
contrlTarget.each(function () {
contrlTarget.prop("disabled", false);
select.closest("td").find(".answSelectAt").val("Y");
});
} else {
contrlTarget.each(function () {
contrlTarget.prop("disabled", true);
select.closest("td").find(".answSelectAt").val("N");
});
}
});
//추가입력 항목 체크박스 'click'이벤트
$('.answChkC').on('click', function () {
const check = $(this);
const contrlTarget = check.closest("div").find('.answChk');
var isChecked = $(this).is(":checked");
//클릭한 체크박스 주위 input값 disable false처리
contrlTarget.each(function () {
if (isChecked) {
$(this).prop("disabled", false);
} else {
$(this).prop("disabled", true);
}
});
// 체크된 체크박스가 하나라도 있는지 확인
let anyChecked = $('.answChkC:checked').length > 0;
contrlTarget.each(function () {
if (anyChecked) {
check.closest("td").find(".answChkAt").val("Y");
} else {
check.closest("td").find(".answChkAt").val("N");
}
});
});
//추가입력 항목 텍스트 'input'이벤트
$('.answTxtC').on('input', function () {
const txt = $(this);
const contrlTarget = txt.closest(".input-grow-container").find('.answTxt');
const contrlAt = txt.closest(".input-grow-container").find('.answTxtAt');
//클릭한 체크박스 주위 input값 disable false처리
if (txt.val() != "") {
contrlTarget.each(function () {
contrlTarget.prop("disabled", false);
contrlAt.val("Y");
});
} else {
contrlTarget.each(function () {
contrlTarget.prop("disabled", true);
contrlAt.val("N");
});
}
});
//파일 업로드
$("#fileUpload").on("change", function () {
addFiles(event, 0);
});
//등록 버튼 이벤트
$("#regBtn").on("click", function () {
fn_regist_bbsctt();
});
//등록 완료 모달 > 확인 버튼 이벤트 (새로고침)
$("#alertBtn").on("click", function () {
$(".close").each(function () {
$(this).click();
});
/*상품 상세 등록시 qna 목록 재조회*/
if ($("#listAt").val() === 'list') {
fn_select_qna(1);
}
});
});
/*********************************************************
* 게시글 등록
*********************************************************/
if (typeof fn_regist_bbsctt === 'undefined') {
function fn_regist_bbsctt() {
let url = '<c:url value="/sopmal/csc/insertBbscttRegist"/>';
let saveForm = $('#bbsRegForm');
let formData = new FormData();
//파일 업로드
if ($("#contact-dropzone").length > 0) {
let myDropzone = Dropzone.forElement("#contact-dropzone");
myDropzone.files.forEach(function (file) {
formData.append("files", file);
});
}
/*문항 답변 체크박스 disabled*/
$('.answChk').each(function () {
if (!$(this).prop('checked')) {
fn_ctrl_disable([".answChk"],);
}
});
//여부 N처리
$('.chkAt').each(function () {
if (!$(this).prop('checked')) {
$(this).val("N");
}
});
//폼 내 input값 append
saveForm.serializeArray().forEach(function (item) {
formData.append(item.name, item.value);
});
//사용자 등록 시 노출 여부 Y
formData.append("expsrAt", "Y");
disableButton("#regBtn");
if (confirm('게시글을 <spring:message code="confirm.common.insert"/>')) {
$.ajax({
type: 'post',
url: url,
enctype: "multipart/form-data",
data: formData,
processData: false,
contentType: false,
success: function (result) {
enableButton("#regBtn");
$("#resultAlert").text("<spring:message code="success.common.insert"/>");
$("#result-alert-regist").modal();
}
});
}
fn_ctrl_disable("", [".checkbox"]);
enableButton("#regBtn");
}
}
/*상품qna 버튼 클릭 제어*/
if (typeof fn_prevent_click === 'undefined') {
function fn_prevent_click(event){
event.preventDefault(); // 체크박스 상태 변경 방지
}
}
</script>
<body>
<c:set value="${resultMap.regusrInfo}" var="regusrInfo"/>
<c:set value="${resultMap.bbscttVO}" var="bbscttVO"/>
<c:set value="${resultMap.bbsInfo}" var="bbsInfo"/>
<c:set value="${resultMap.qnaGoodsInfo}" var="qnaGoodsInfo"/>
<c:set value="${resultMap.qesitmList.qesitmList}" var="qesitmList"/>
<c:set value="${resultMap.qesitmList.itmCnList}" var="itmCnList"/>
<c:set value="${resultMap.itmList}" var="itmList"/>
<spring:eval expression="@environment.getProperty('sopmalfo.common.fileupload.extensions.images')"
var="acceptFileExtensions"/><%--허용파일확장자--%>
<spring:eval expression="@environment.getProperty('sopmalfo.common.fileupload.cdnurl')" var="cdnurl"/><%--이미지경로--%>
<div id="qna-pop-regist" class="modal default" style="max-width: 720px;">
<div class="modal-header">
<div class="modal-header__title"><c:out value='${bbsInfo.bbsNm}'/></div>
</div>
<div class="modal-content">
<div class="table-wrapper">
<form id="bbsRegForm">
<table class="table write">
<caption>게시글 등록</caption>
<colgroup>
<col style="width: 200px;">
<col style="width: auto;">
</colgroup>
<tbody>
<tr>
<th>이름<span class="required-asterisk">*</span></th>
<td>
<c:choose>
<c:when test="${regusrInfo.regusrDvCd eq '99'}">
<input type="text" class="input-text lg" name="regusrNm" title="작성자명"
placeholder="이름">
</c:when>
<c:otherwise>
<div class="td-inner"><c:out value='${regusrInfo.regusrNm}'/></div>
<input type="hidden" name="regusrNm"
value="<c:out value='${regusrInfo.regusrNm}'/>">
</c:otherwise>
</c:choose>
</td>
</tr>
<c:if test="${bbsInfo.answRegist eq 'Y'&& bbsInfo.bbscttSndngMthCd ne '03'}"><%--답변사용여부와 게시글 문자사용여부 체크--%>
<tr>
<th>답변수신</th>
<td>
<div class="td-inner">
<c:if test="${empty regusrInfo.answMbtlnb}">
<input type="text" class="input-text" id="answMbtlnb" name="answMbtlnb"
placeholder="핸드폰번호'-'없이" title="답변핸드폰번호" maxlength="13">
</c:if>
<div class="input-container">
<label class="b-checkbox checkbox">
<input type="checkbox" name="answSmsRecptn" value="Y" id="answSmsRecptn"
checked>
<span class="check"></span>
<span class="control-label">SMS 알림요청</span>
</label>
</div>
</div>
</td>
</tr>
</c:if>
<c:if test="${not empty itmList}">
<tr>
<th>문의유형<span class="required-asterisk">*</span></th>
<td>
<div class="td-inner">
<div class="select-box">
<%--문항답변필수여부 --%>
<input type="hidden" name="qesitmEssntlAtArr[]" value="Y">
<%--문항명 --%>
<input type="hidden" name="qesitmNmArr[]" id="qesitmNm" value="분류"/>
<%--문항고유번호 --%>
<input type="hidden" name="qesitmInnbArr[]" id="qesitmInnb"/>
<%--답변내용 --%>
<input type="hidden" name="answCnArr[]" id="answCn"/>
<%--답변여부 --%>
<input type="hidden" name="qesitmAtArr[]" id="qesitmAt" value="N">
<select class="md" id="qesitmNmC" name="itmInnbArr[]">
<option value="">문의 유형을 선택해 주세요.</option>
<c:forEach var="itm" items="${itmList}" varStatus="status">
<option value="<c:out value="${itm.itmInnb}"/>"
qesitm-innb="${itm.qesitmInnb}"
answ-Cn="${itm.itmCn}"
qesitm-nm="${itm.qesitmNm}">
<c:out value="${itm.itmCn}"/>
</option>
</c:forEach>
</select>
</div>
</div>
</td>
</tr>
</c:if>
<c:if test="${not empty qesitmList}">
<c:forEach var="qesitmList" items="${qesitmList}">
<tr>
<c:if test="${ qesitmList.itmTyCd eq '01'}">
<th><c:out value="${ qesitmList.qesitmNm }"/><c:if
test="${qesitmList.qesitmEssntlAt eq 'Y'}"><span
class="required-asterisk">*</span></c:if></th>
<td>
<div class="td-inner">
<div class="custom-radio-container">
<input type="hidden" name="qesitmEssntlAtArr[]"
value="${ qesitmList.qesitmEssntlAt}"
class="essntlChk">
<input type="hidden" name="qesitmNmArr[]"
value="${ qesitmList.qesitmNm}">
<input type="hidden" name="qesitmAtArr[]"
class="answRadioAt qesitmAtChk" value="N">
<input type="hidden" name="qesitmInnbArr[]"
class="answRadio"
value="${ qesitmList.qesitmInnb }" disabled>
<input type="hidden" name="answCnArr[]" class="answRadio"
disabled>
<input type="hidden" name="itmInnbArr[]" class="answRadio"
disabled>
<c:forEach items="${itmCnList}" var="itmCnList1"
varStatus="status">
<c:if test="${itmCnList1.qesitmInnb eq qesitmList.qesitmInnb}">
<div class="custom-radio is-medium">
<input type="radio"
name="itmInnbArr<c:out value="${ qesitmList.qesitmInnb }"/>[]"
id="answCn<c:out value="${ status.index }"/>"
class="answRadioC"
value="<c:out value="${ itmCnList1.itmInnb}"/>"
qesitm-innb='<c:out value="${itmCnList1.qesitmInnb}"/>'
itm-cn="<c:out value="${ itmCnList1.itmCn }"/>">
<label for="answCn<c:out value="${ status.index }"/>">
<c:out value="${ itmCnList1.itmCn }"/>
</label>
</div>
</c:if>
</c:forEach>
</div>
</div>
</td>
</c:if>
<c:if test="${ qesitmList.itmTyCd eq '02'}">
<th><c:out value="${ qesitmList.qesitmNm }"/><c:if
test="${qesitmList.qesitmEssntlAt eq 'Y'}"><span
class="required-asterisk">*</span></c:if></th>
<td>
<input type="hidden" name="qesitmEssntlAtArr[]"
value="${ qesitmList.qesitmEssntlAt }" class="essntlChk">
<input type="hidden" name="qesitmNmArr[]"
value="${ qesitmList.qesitmNm }">
<input type="hidden" name="qesitmAtArr[]"
class="answSelectAt qesitmAtChk" value="N">
<input type="hidden" name="qesitmInnbArr[]" class="answSelect"
value="${ qesitmList.qesitmInnb }" disabled>
<input type="hidden" name="answCnArr[]" class="answSelect" disabled>
<div class="select-box">
<select class="md answSelectC" name="itmInnbArr[]">
<option value="">전체</option>
<c:forEach items="${itmCnList}" var="itmCnList2">
<c:if test="${itmCnList2.qesitmInnb eq qesitmList.qesitmInnb}">
<option value="${ itmCnList2.itmInnb }"
itm-cn="${ itmCnList2.itmCn}"
qesitm-innb='${itmCnList2.qesitmInnb}'>${ itmCnList2.itmCn }</option>
</c:if>
</c:forEach>
</select>
</div>
</td>
</c:if>
<c:if test="${ qesitmList.itmTyCd eq '03'}">
<th><c:out value="${ qesitmList.qesitmNm }"/><c:if
test="${qesitmList.qesitmEssntlAt eq 'Y'}"><span
class="required-asterisk">*</span></c:if></th>
<td>
<input type="hidden" name="qesitmEssntlAtArr[]"
value="${ qesitmList.qesitmEssntlAt }" class="essntlChk">
<input type="hidden" name="qesitmNmArr[]"
value="${ qesitmList.qesitmNm }">
<input type="hidden" name="qesitmAtArr[]"
class="answChkAt qesitmAtChk"
value="N">
<c:forEach items="${itmCnList}" var="itmCnList3">
<c:if test="${itmCnList3.qesitmInnb eq qesitmList.qesitmInnb}">
<div class="input-container">
<label class="b-checkbox checkbox">
<input type="hidden" class="answChk"
name="qesitmInnbArr[]"
value="${ qesitmList.qesitmInnb }" disabled>
<input type="hidden" class="answChk"
name="answCnArr[]"
value="${ itmCnList3.itmCn }" disabled>
<input type="checkbox" class="answChkC"
name="itmInnbArr[]"
value="${ itmCnList3.itmInnb }">
<span class="check"></span>
<span class="control-label">${ itmCnList3.itmCn }</span>
</label>
</div>
</c:if>
</c:forEach>
</td>
</c:if>
<c:if test="${ qesitmList.itmTyCd eq '04'}">
<th><c:out value="${ qesitmList.qesitmNm }"/><c:if
test="${qesitmList.qesitmEssntlAt eq 'Y'}"><span
class="required-asterisk">*</span></c:if></th>
<td>
<div class="td-inner">
<div class="input-grow-container">
<c:forEach items="${itmCnList}" var="itmCnList4">
<c:if test="${itmCnList4.qesitmInnb eq qesitmList.qesitmInnb}">
<input type="hidden" name="qesitmEssntlAtArr[]"
value="${ qesitmList.qesitmEssntlAt }"
class="essntlChk">
<input type="hidden" name="qesitmNmArr[]"
value="${ qesitmList.qesitmNm }">
<input type="hidden" name="qesitmAtArr[]"
class="answTxtAt qesitmAtChk" value="N">
<input type="hidden" class="answTxt"
name="qesitmInnbArr[]"
value="${ qesitmList.qesitmInnb }" disabled>
<input type="text" class="input-text lg answTxtC"
name="answCnArr[]" title="추가문항답변"
placeholder="${ itmCnList4.itmCn }"
maxlength="666">
<input type="hidden" class="answTxt"
name="itmInnbArr[]"
value="${ itmCnList4.itmInnb }" disabled>
</c:if>
</c:forEach>
</div>
</div>
</td>
</c:if>
</tr>
</c:forEach>
</c:if>
<c:if test="${bbsInfo.bbsTyCd eq '05'}">
<tr>
<th>문의상품</th>
<td>
<img src="<c:out value = '${cdnurl}${qnaGoodsInfo.img}'/>" alt="qnaGoods">
<br>
<span><c:out value='${qnaGoodsInfo.goodsNm}'/></span>
<input type="hidden" name="goodsInnbArr[]" value="${qnaGoodsInfo.goodsInnb}"/>
</td>
</tr>
</c:if>
<tr>
<th>제목<span class="required-asterisk">*</span></th>
<td>
<div class="td-inner">
<div class="input-grow-container">
<input class="input-text xl" type="text" title="제목 입력란" name="sj"
placeholder="제목을 입력하세요." maxlength="100">
<%--게시판설정(비밀글사용여부)--%>
<c:if test="${bbsInfo.secretBbsctt eq 'Y'}">
<div class="b-checkbox-container">
<label class="b-checkbox checkbox">
<input type="checkbox" value="Y" name="secretBbscttAt" class="chkAt"
checked<c:if test="${bbsInfo.bbsTyCd eq '05'}"> onclick="fn_prevent_click(event);"</c:if>>
<span class="check"></span>
<span class="control-label">비밀글</span>
</label>
</div>
</c:if>
</div>
</div>
</td>
</tr>
<c:if test="${regusrInfo.regusrDvCd eq '99'}">
<tr>
<th>비밀번호<span class="required-asterisk">*</span></th>
<td>
<div class="td-inner">
<input class="input-text lg" type="password"
title="비밀번호 입력란"
name="password" maxlength='20'
placeholder="비밀번호를 입력하세요." value="">
</div>
</td>
</tr>
</c:if>
<tr>
<th>내용</th>
<td>
<textarea class="textarea" rows="12" title="내용 입력란" name="cn"
placeholder="<c:out value = "${bbsInfo.dftCn}"/>"></textarea>
</td>
</tr>
<%--게시판설정(파일첨부사용여부)--%>
<input type="hidden" value="<c:out value = '${bbsInfo.filAtch}'/>" name="filAtch">
<c:if test="${bbsInfo.filAtch eq 'Y'}">
<tr>
<th>이미지 등록</th>
<td>
<div class="dropzone-wrapper">
<div class="dropzone" id="contact-dropzone">
</div>
</div>
<ul class="contact-upload-info">
<li>사진, 동영상 첨부는 최대 10MB 이하이며 3개까지 등록할 수 있습니다.</li>
<li>등록 가능 파일은 <c:out value="${acceptFileExtensions}"/> 파일만 가능합니다.</li>
<li>상품과 무관한 내용이거나 음란 불법적인 내용은 통보없이 삭제할 수 있습니다.</li>
</ul>
</td>
</tr>
</c:if>
</tbody>
</table>
<input type="hidden" id="listAt" value="<c:out value = '${bbscttVO.listAt}'/>" name="listAt"/>
<input type="hidden" id="sopmalCd" value="<c:out value = '${bbscttVO.sopmalCd}'/>" name="sopmalCd"/>
<input type="hidden" id="bbsId" value="<c:out value = '${bbsInfo.bbsId}'/>" name="bbsId"/>
<input type="hidden" id="bbsNm" value="<c:out value = '${bbsInfo.bbsNm}'/>" name="bbsNm"/>
<input type="hidden" id="regusrDvCd" value="<c:out value = '${regusrInfo.regusrDvCd}'/>"
name="regusrDvCd"/>
<input type="hidden" id="bbscttSndngMthCd" value="<c:out value = '${bbsInfo.bbscttSndngMthCd}'/>"
name="bbscttSndngMthCd"/>
<input type="hidden" name="acceptFileExtensions" id="acceptFileExtensions"
value="${acceptFileExtensions}"/>
</form>
</div>
</div>
<div class="modal-footer">
<a href="#" rel="modal:close" class="btn large outline close"><spring:message code="button.close"/></a>
<button class="btn large gray2" id="regBtn"><spring:message code="button.insert"/></button>
</div>
</div>
<!--등록결과모달-->
<div id="result-alert-regist" class="modal alert">
<div class="alert-content">
<p class="alert-content__text--sm">
<spring:message code="success.common.insert"/>
</p>
</div>
<div class="alert-btn-container">
<a href="#" rel="modal:close" class="btn large outline close"><spring:message code="button.close"/></a>
<button class="alert-btn alert-btn--confirm" id="alertBtn"><spring:message code="button.ok"/></button>
</div>
</div>
</body>
<script>
// Dropzone 파일업로드
if ($("#contact-dropzone").length > 0) {
const maxFiles = 3;
Dropzone.autoDiscover = false;
var myDropzone = new Dropzone("#contact-dropzone", {
url: "/file-upload",
maxFilesize: 10,
maxFiles: maxFiles,
acceptedFiles: "${acceptFileExtensions}",
autoProcessQueue: false,
addRemoveLinks: true,
dictDefaultMessage: "",
dictRemoveFile: "삭제",
dictCancelUpload: "취소",
dictCancelUploadConfirmation: "업로드를 취소하시겠습니까?",
dictInvalidFileType: "이 파일은 업로드할 수 없습니다.",
dictFileTooBig: "파일이 너무 큽니다. ({{filesize}}MB). 최대 파일 크기: {{maxFilesize}}MB.",
dictMaxFilesExceeded: "파일을 더 이상 추가할 수 없습니다.",
dictResponseError: "서버에서 응답을 받지 못했습니다.",
});
var inputElement = $('input[type="file"].dz-hidden-input');
if(inputElement.length > 1){
inputElement.eq(0).remove();
}
// name 부여
inputElement.attr('name', 'file');
// id 부여
inputElement.attr('id', 'fileUpload');
// 파일 추가 이벤트
myDropzone.on("addedfile", function(file) {
if (myDropzone.files.length >= maxFiles) {
$(".dz-message").hide();
}
$("#filExtAt").val("Y");
});
myDropzone.on("removedfile", function(file) {
if (myDropzone.files.length < maxFiles) {
$(".dz-message").show();
}
});
myDropzone.on("maxfilesexceeded", function(file) {
const dictMaxFilesExceeded = myDropzone.options.dictMaxFilesExceeded;
alert(dictMaxFilesExceeded);
this.removeFile(file);
$(file.previewElement).find(".dz-remove").attr("disabled", true);
});
}
</script>
</html>

View File

@@ -0,0 +1,944 @@
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@ taglib prefix="ui" uri="http://www.winbit.kr/ctl/ui"%>
<%@ taglib prefix="f" uri="/WEB-INF/tlds/f.tld"%>
<%--
Class Name : BbscttUpdtPopupU.jsp
Description : 게시글 수정 팝업 폼
Modification Information
수정일 수정자 수정내용
------- -------- ---------------------------
2024-05-09 김혜인 최초 생성
--%>
<!DOCTYPE html>
<html lang="ko">
<script>
$(document).ready(function(){
/*파일 temp 배열 초기화*/
filesTempArr = [];
/*폼 기본 세팅*/
fn_select_cn();
//1.내용 텍스트 <br>태그 엔터값으로 replace
const textarea = $("textarea[name=cn]");
let cn = textarea.attr("placeholder");
if (cn) {
cn = fn_remove_tag(cn);
textarea.attr("placeholder", cn);
}
/*sms 답변 여부에 따른 disabled처리*/
$("#answSmsRecptn").on("click",function(){
if($(this).is("checked")){
$("#answMbtlnb").prop("disabled",false);
}else{
$("#answMbtlnb").prop("disabled",true);
}
});
//2.내용 텍스트 <br>태그 엔터값으로 replace
const target = $("#cnBbsUpdt");
let str = target.text();
str = str.trim();
target.val(str);
//3.나이스셀렉터 적용
fn_set_niceSelect_datePicker("#qna-update-pop");
/*4.휴대전화 포매팅*/
if ($("#answMbtlnb").val().length > 0) {
$("#answMbtlnb").val(fn_format_mbtlnb($("#answMbtlnb").val()));
fn_set_event("#answMbtlnb", "keyup", fn_fmt_telno);
}
//6.hidden value set
fn_update_hidden_value();
//분류 change시 hidden value값 set
$('#qesitmNmC').on('change', function () {
$("#qesitmInnb").val("");
$("#qesitmNm").val("");
$("#answCn").val("");
const option = $('option:selected', this);
const qesitmInnb = $(option).attr('qesitm-innb');
const answCn = $(option).attr('answ-Cn');
const qesitmNm = $(option).attr('qesitm-nm');
if ($(this).val() !== "") {
$("#qesitmInnb").val(qesitmInnb);
$("#answCn").val(answCn);
$("#qesitmNm").val(qesitmNm);
$("#qesitmAt").val("Y");
} else {
$("#qesitmInnb").val("");
$("#answCn").val("");
$("#qesitmNm").val("");
$("#qesitmAt").val("N");
}
});
//추가입력 항목 라디오 'click' 이벤트
$('.answRadioC').on('click', function () {
const radio = $(this);
//추가입력 항목 내용 요소 get
const answ = radio.closest(".custom-radio-container").find('[name="answCnArr[]"]');
//추가입력 항목 내용 요소 get
const qesitmInnb = radio.closest(".custom-radio-container").find('[name="qesitmInnbArr[]"]');
//라디오 클릭으로 인한 제어 요소 get
const contrlTarget = radio.closest(".custom-radio-container").find('.answRadio');
//항목 고유번호 내용 요소 get
const itmInnb = radio.closest(".custom-radio-container").find('[name="itmInnbArr[]"]');
//라디오 클릭 시 disabled 비활성
if (radio.is(":checked")) {
//답변 내용 초기화
answ.val("");
const radioVal = $(radio).attr('itm-cn');
answ.val(radioVal);
//항목 내용 set
qesitmInnb.val("");
const qesitmInnbVal = $(radio).attr('qesitm-innb');
qesitmInnb.val(qesitmInnbVal);
//항목고유번호 내용 set
itmInnb.val("");
const itmInnbVal = $(radio).val();
itmInnb.val(itmInnbVal);
//라디오 주위 input값 disable false처리
contrlTarget.each(function () {
contrlTarget.prop("disabled", false);
radio.closest(".custom-radio-container").find(".answRadioAt").val("Y");
});
} else {
contrlTarget.each(function () {
contrlTarget.prop("disabled", true);
radio.closest(".custom-radio-container").find(".answRadioAt").val("N");
});
}
});
//추가입력 항목 셀렉트 'change'이벤트
$('.answSelectC').on('change', function () {
const select = $(this);
const answ = select.closest("td").find('[name="answCnArr[]"]');
const qesitmInnb = select.closest("td").find('[name="qesitmInnbArr[]"]');
const contrlTarget = select.closest("td").find('.answSelect');
const option = $('option:selected', this);
if (select.val() != "") {
//답변 내용 초기화
answ.val("");
const selectVal = $(option).attr('itm-cn');
answ.val(selectVal);
//항목 내용 set
qesitmInnb.val("");
const qesitmInnbVal = $(option).attr('qesitm-innb');
qesitmInnb.val(qesitmInnbVal);
//셀렉트 주위 input값 disable false처리
contrlTarget.each(function () {
contrlTarget.prop("disabled", false);
select.closest("td").find(".answSelectAt").val("Y");
});
} else {
contrlTarget.each(function () {
contrlTarget.prop("disabled", true);
select.closest("td").find(".answSelectAt").val("N");
});
}
});
//추가입력 항목 체크박스 'click'이벤트
$('.answChkC').on('click', function () {
const check = $(this);
const contrlTarget = check.closest("div").find('.answChk');
var isChecked = $(this).is(":checked");
//클릭한 체크박스 주위 input값 disable false처리
contrlTarget.each(function () {
if (isChecked) {
$(this).prop("disabled", false);
} else {
$(this).prop("disabled", true);
}
});
// 체크된 체크박스가 하나라도 있는지 확인
let anyChecked = $('.answChkC:checked').length > 0;
contrlTarget.each(function () {
if (anyChecked) {
check.closest("td").find(".answChkAt").val("Y");
check.closest("td").find(".answChkAt").prop("disabled", false);
} else {
check.closest("td").find(".answChkAt").val("N");
check.closest("td").find(".answChkAt").prop("disabled", true);
}
});
});
//추가입력 항목 텍스트 'input'이벤트
$('.answTxtC').on('input', function () {
const txt = $(this);
const contrlTarget = txt.closest("div").find('.answTxt');
const contrlAt = txt.closest("div").find('.answTxtAt');
//클릭한 체크박스 주위 input값 disable false처리
if (txt.val() != "") {
contrlTarget.each(function () {
contrlTarget.prop("disabled", false);
contrlAt.val("Y");
});
} else {
contrlTarget.each(function () {
contrlTarget.prop("disabled", true);
contrlAt.val("N");
});
}
});
//파일 업로드
$("#fileUpload").on("change", function () {
addFiles(event, 0);
});
//수정 버튼 이벤트
$("#updtBtn").on("click", function () {
fn_update_bbsctt();
});
//수정 완료시
$("#alertUpdtBtn").on("click", function () {
/*상품 상세 수정시 qna 목록 재조회*/
if ($("#listAt").val() === 'list') {
fn_select_qna(1);
}
$(".close").each(function () {
$(this).click();
});
});
/*닫기버튼클릭*/
$("#updtCloseBtn").on("click", function () {
fn_close_modal("qna-update-pop");
});
});
/*********************************************************
* 게시글 수정
*********************************************************/
if(typeof fn_update_hidden_value === 'undefined'){
function fn_update_hidden_value() {
//분류 항목
const option = $('option:selected', $("#qesitmNmC"));
const qesitmInnb = $(option).attr('qesitm-innb');
const answCn = $(option).attr('answ-Cn');
const qesitmNm = $(option).attr('qesitm-nm');
if ($("#qesitmNmC").val() != "") {
$("#qesitmInnb").val(qesitmInnb);
$("#answCn").val(answCn);
$("#qesitmAt").val("Y");
} else {
$("#qesitmInnb").val("");
$("#answCn").val("");
$("#qesitmAt").val("N");
}
// 추가평가항목 라디오
const radio = $(".answRadioC:checked");
radio.each(function (idx) {
if (radio.eq(idx).val()) {
let radioAnsw = radio.eq(idx).closest("td").find('[name="answCnArr[]"]');
let radioQesitmInnb = radio.eq(idx).closest("td").find('[name="qesitmInnbArr[]"]');
let radioItmInnb = radio.eq(idx).closest("td").find('[name="itmInnbArr[]"]');
let radioQesitmAt = radio.eq(idx).closest("td").find('[name="qesitmAtArr[]"]');
let radioContrlTarget = radio.eq(idx).closest("td").find('.answRadio');
// 답변 내용 set
radioAnsw.val(radio.eq(idx).attr('itm-cn'));
// 항목 내용 set
radioQesitmInnb.val(radio.eq(idx).attr('qesitm-innb'));
// 항목고유번호 내용 set
radioItmInnb.val(radio.eq(idx).val());
// 답변 여부
radioQesitmAt.val("Y");
// 라디오 주위 input값 disable false처리
radioContrlTarget.each(function (idx) {
radioContrlTarget.eq(idx).prop("disabled", false);
});
} else {
let radioAnsw = radio.eq(idx).closest("td").find('[name="answCnArr[]"]');
let radioQesitmInnb = radio.eq(idx).closest("td").find('[name="qesitmInnbArr[]"]');
let radioItmInnb = radio.eq(idx).closest("td").find('[name="itmInnbArr[]"]');
let radioQesitmAt = radio.eq(idx).closest("td").find('[name="qesitmAtArr[]"]');
let radioContrlTarget = radio.eq(idx).closest("div").find('.answRadio');
// 답변 내용 set
radioAnsw.val("");
// 항목 내용 set
radioQesitmInnb.val("");
// 항목고유번호 내용 set
radioItmInnb.val("");
// 답변 여부
radioQesitmAt.val("N");
// 라디오 주위 input값 disable false처리
radioContrlTarget.each(function (idx) {
radioContrlTarget.eq(idx).prop("disabled", true);
});
}
});
//추가입력 항목 셀렉트 'change'이벤트
const select = $('select.answSelectC[name="itmInnbArr[]"]');
select.each(function (idx) {
let selectIndex = select.eq(idx).find('option:selected').index();
if (selectIndex > 0) {
let selectQesitmAt = select.eq(idx).closest("td").find('[name="qesitmAtArr[]"]');
let selectQesitmInnb = select.eq(idx).closest("td").find('[name="qesitmInnbArr[]"]');
let selectAnsw = select.eq(idx).closest("td").find('[name="answCnArr[]"]');
let selectOption = $('option:selected', select.eq(idx));
let selectContrlTarget = select.eq(idx).closest("td").find('.answSelect');
// 답변 여부
selectQesitmAt.val("Y");
// 항목 내용 set
selectQesitmInnb.val(selectOption.attr('qesitm-innb'));
// 답변 내용 set
selectAnsw.val(selectOption.attr('itm-cn'));
// 라디오 주위 input값 disable false처리
selectContrlTarget.each(function (idx) {
selectContrlTarget.eq(idx).prop("disabled", false);
});
} else {
let selectQesitmAt = select.eq(idx).closest("td").find('[name="qesitmAtArr[]"]');
let selectQesitmInnb = select.eq(idx).closest("td").find('[name="qesitmInnbArr[]"]');
let selectAnsw = select.eq(idx).closest("td").find('[name="answCnArr[]"]');
let selectContrlTarget = select.eq(idx).closest("td").find('.answSelect');
// 답변 여부
selectQesitmAt.val("N");
// 항목 내용 set
selectQesitmInnb.val("");
// 답변 내용 set
selectAnsw.val("");
// 라디오 주위 input값 disable false처리
selectContrlTarget.each(function (idx) {
selectContrlTarget.eq(idx).prop("disabled", true);
});
}
});
const check = $(".answChkC");
//클릭한 체크박스 주위 input값 disable false처리
check.each(function (idx) {
let checkContrlTarget = check.eq(idx).closest(".checkbox").find('.answChk');
let isChecked = check.eq(idx).is(":checked");
checkContrlTarget.each(function (index) {
if (isChecked) {
checkContrlTarget.eq(index).prop("disabled", false);
} else {
checkContrlTarget.eq(index).prop("disabled", true);
}
});
// 체크된 체크박스가 하나라도 있는지 확인
let anyChecked = check.eq(idx).closest("td").find(".answChkC:checked").length > 0;
if (anyChecked) {
check.eq(idx).closest("td").find(".answChkAt").val("Y");
} else {
check.eq(idx).closest("td").find(".answChkAt").val("N");
}
});
//추가입력 항목 텍스트 'input'이벤트
const txt = $('.answTxtC');
txt.each(function (idx) {
let contrlTarget = txt.eq(idx).closest("div").find('.answTxt');
let contrlAt = txt.eq(idx).closest("div").find('.answTxtAt');
//클릭한 체크박스 주위 input값 disable false처리
if (txt.val() != "") {
contrlTarget.each(function () {
contrlTarget.prop("disabled", false);
contrlAt.val("Y");
});
} else {
contrlTarget.each(function () {
contrlTarget.prop("disabled", true);
contrlAt.val("N");
});
}
});
}
}
/*********************************************************
* 게시글 내용 조회
*********************************************************/
if (typeof fn_select_cn === 'undefined') {
function fn_select_cn () {
let bbscttInnb = $("#bbscttInnb").val();
let bbsId = $("#bbsId").val();
let sopmalCd = $("#sopmalCd").val();
$.ajax({
type: "post",
url: "<c:url value ='/ajax/bbscttAjax/selectBOBbscttCnAjax'/>",
contentType: 'application/json',
data: JSON.stringify({
bbsId: bbsId,
bbscttInnb: bbscttInnb,
sopmalCd: sopmalCd
}),
success: function (data) {
let cn = data.result.cn;
$("#cnBbsUpdt").val(cn);
}
});
}
}
/*********************************************************
* 게시글 수정
*********************************************************/
if (typeof fn_update_bbsctt === 'undefined') {
function fn_update_bbsctt() {
let url = '<c:url value="/sopmal/csc/updateBbscttupdt"/>';
let saveForm = $('#bbsUpdtForm');
let formData = new FormData();
//파일 업로드
if ($("#contact-dropzone").length > 0) {
let myDropzone = Dropzone.forElement("#contact-dropzone");
myDropzone.files.forEach(function (file) {
formData.append("files", file);
});
}
/*문항 답변 체크박스 disabled*/
$('.answChk').each(function () {
if (!$(this).prop('checked')) {
fn_ctrl_disable([".answChk"],);
}
});
//여부 N처리
$('.chkAt').each(function () {
if (!$(this).prop('checked')) {
$(this).val("N");
}
});
//사용자 등록 시 노출 여부 Y
formData.append("expsrAt", "Y");
//폼 내 input값 append
saveForm.serializeArray().forEach(function (item) {
formData.append(item.name, item.value);
});
disableButton("#updtBtn");
//사용자 등록 시 노출 여부 Y
if (confirm('게시글을 <spring:message code="confirm.common.update"/>')) {
$.ajax({
type: 'post',
url: url,
enctype: "multipart/form-data",
data: formData,
processData: false,
contentType: false,
success: function (result) {
enableButton("#updtBtn");
let updateMsg = "<spring:message code="success.common.update"/>";
$("#resultAlert").text(updateMsg);
$("#result-alert-update").modal();
}
});
}
enableButton("#updtBtn");
fn_ctrl_disable("", [".answChk"]);
}
}
/*상품qna 버튼 클릭 제어*/
if (typeof fn_prevent_click === 'undefined') {
function fn_prevent_click(event) {
event.preventDefault(); // 체크박스 상태 변경 방지
}
}
</script>
<body>
<c:set value="${resultMap.bbscttInfo.bbscttInfo}" var="bbscttInfo"/>
<c:set value="${resultMap.bbscttVO}" var="bbscttVO"/>
<c:set value="${resultMap.bbscttInfo.qesitmAnswList}" var="qesitmAnswList"/>
<c:set value="${resultMap.bbscttInfo.fileInfoGson}" var="fileInfoGson"/>
<c:set value="${resultMap.bbscttInfo.goods}" var="goods"/>
<c:set value="${resultMap.bbscttInfo.wrter}" var="wrter"/>
<c:set value="${resultMap.bbsInfo}" var="bbsInfo"/>
<c:set value="${resultMap.qesitmList.qesitmList}" var="qesitmList"/>
<c:set value="${resultMap.qesitmList.itmCnList}" var="itmCnList"/>
<c:set value="${resultMap.itmList}" var="itmList"/>
<spring:eval expression="@environment.getProperty('sopmalfo.common.fileupload.cdnurl')" var="cdnurl"/>
<div id="qna-update-pop" class="modal default" style="max-width: 720px;">
<div class="modal-header">
<div class="modal-header__title"><c:out value = '${bbsInfo.bbsNm}'/></div>
</div>
<div class="modal-content">
<div class="table-wrapper">
<form id="bbsUpdtForm">
<input type="hidden" name="setupInfoInnb" value="${bbsInfo.setupInfoInnb }"/>
<input type="hidden" name="sopmalCd" value="${bbscttVO.sopmalCd }" id="sopmalCd"/>
<input type="hidden" name="filAtch" value="${bbsInfo.filAtch }"/>
<input type="hidden" name="slangFlterUseAt" value="${bbsInfo.slangFlterUseAt}"/>
<input type="hidden" name="regusrNm" value="${bbscttInfo.regusrNm}"/>
<input type="hidden" id = "bbsId" name="bbsId" value="${bbsInfo.bbsId }"/>
<input type="hidden" id = "bbsTyCd" name="bbsTyCd" value="${bbsInfo.bbsTyCd }"/>
<input type="hidden" id="reqDv" value="<c:out value = '${bbsctt.reqDv}'/>" name="reqDv"/>
<input type="hidden" id="pgeVtcCnt" name="pgeVtcCnt" value="${ bbsInfo.pgeVtcCnt }"/>
<input type="hidden" id="pgeWthCnt" name="pgeWthCnt" value="${ bbsInfo.pgeWthCnt }"/>
<input type="hidden" id="bbscttInnb" name="bbscttInnb" value="${ bbscttInfo.bbscttInnb }"/>
<input type="hidden" id="listAt" name="listAt" value="${ bbscttVO.listAt }"/>
<input type="hidden" id="prevNext" name="prevNext" value="${ bbsInfo.prevNext }"/>
<input type="hidden" id="sknTyCd" name="sknTyCd" value="${ bbsInfo.sknTyCd }"/>
<spring:eval expression="@environment.getProperty('sopmalfo.common.fileupload.extensions.images')" var="acceptFileExtensions"/>
<input type="hidden" id="acceptFileExtensions" name="acceptFileExtensions" value="${acceptFileExtensions}"/>
<table class="table write">
<caption>게시글 수정</caption>
<colgroup>
<col style="width: 200px;">
<col style="width: auto;">
</colgroup>
<tbody>
<tr>
<th>이름</th>
<td>
<div class="td-inner"><c:out value = "${bbscttInfo.regusrNm}"/></div>
</td>
</tr>
<c:if test="${not empty itmList}">
<tr>
<th>분류<span class="required-asterisk">*</span></th>
<td>
<div class="td-inner">
<div class="select-box">
<%--문항답변필수여부 --%>
<input type="hidden" name="qesitmEssntlAtArr[]" value="Y">
<%--문항명 --%>
<input type="hidden" name="qesitmNmArr[]" id="qesitmNm" value="분류"/>
<%--문항고유번호 --%>
<input type="hidden" name="qesitmInnbArr[]" id="qesitmInnb"
<c:forEach var="itmAnswList" items="${qesitmAnswList}">
<c:if test="${itmAnswList.aditItmDvCd eq '03'}">
value = <c:out value="${itmAnswList.qesitmInnb}"/>
</c:if>
</c:forEach>/>
<%--답변내용 --%>
<input type="hidden" name="answCnArr[]" id="answCn"<c:forEach
var="itmAnswList" items="${qesitmAnswList}">
<c:if test="${itmAnswList.aditItmDvCd eq '03'}">
value = <c:out value="${itmAnswList.answCn}"/>
</c:if>
</c:forEach>/>
<%--답변여부 --%>
<input type="hidden" name="qesitmAtArr[]" id="qesitmAt"
<c:forEach var="itmAnswList" items="${qesitmAnswList}">
<c:if test="${itmAnswList.aditItmDvCd eq '03'}">
<c:choose>
<c:when test="${empty itmAnswList.answCn}">value="N"</c:when>
<c:otherwise>value="Y"</c:otherwise>
</c:choose>
</c:if>
</c:forEach>>
<select class="md" id="qesitmNmC" name="itmInnbArr[]">
<option value="">문의 유형</option>
<c:forEach var="itm" items="${itmList}" varStatus="status">
<option value="<c:out value="${itm.itmInnb}"/>"
qesitm-innb="${itm.qesitmInnb}" answ-Cn="${itm.itmCn}"
qesitm-nm="${itm.qesitmNm}"
<%--분류 답변 값 유지--%>
<c:forEach var="itmAnswList" items="${qesitmAnswList}">
<c:if test="${itmAnswList.aditItmDvCd eq '03'}">
<c:if test="${itm.itmInnb eq itmAnswList.itmInnb }">selected</c:if>
</c:if>
</c:forEach>>
<c:out value="${itm.itmCn}"/>
</option>
</c:forEach>
</select>
</div>
</div>
</td>
</tr>
</c:if>
<c:if test="${not empty qesitmList}">
<c:forEach var="qesitmList" items="${qesitmList}">
<tr>
<c:if test="${ qesitmList.itmTyCd eq '01'}">
<th><c:out value="${ qesitmList.qesitmNm }"/><c:if
test="${qesitmList.qesitmEssntlAt eq 'Y'}"><span
class="required-asterisk">*</span></c:if></th>
<td>
<div class="td-inner">
<div class="custom-radio-container">
<input type="hidden" name="qesitmEssntlAtArr[]"
value="${ qesitmList.qesitmEssntlAt}"
class="essntlChk">
<input type="hidden" name="qesitmNmArr[]"
value="${ qesitmList.qesitmNm}">
<input type="hidden" name="qesitmAtArr[]"
class="answRadioAt qesitmAtChk" value="N">
<input type="hidden" name="qesitmInnbArr[]"
class="answRadio"
value="${ qesitmList.qesitmInnb }" disabled>
<input type="hidden" name="answCnArr[]" class="answRadio"
disabled>
<input type="hidden" name="itmInnbArr[]" class="answRadio"
disabled>
<c:forEach items="${itmCnList}" var="itmCnList1" varStatus="status">
<c:if test="${itmCnList1.qesitmInnb eq qesitmList.qesitmInnb}">
<div class="custom-radio is-medium">
<input type="radio" id="answCn${ status.index }"
class="answRadioC"
qesitm-innb='${itmCnList1.qesitmInnb}'
name="itmInnbArr${ qesitmList.qesitmInnb}[]"
value="${ itmCnList1.itmInnb}"
itm-cn="${ itmCnList1.itmCn }"
<c:forEach var="qesitmAnswList1" items="${qesitmAnswList}">
<c:if test="${qesitmAnswList1.itmTyCd eq '01'}">
<c:if test="${qesitmAnswList1.itmInnb eq itmCnList1.itmInnb}">checked</c:if>
</c:if>
</c:forEach>>
<label for="answCn${ status.index }">${ itmCnList1.itmCn }</label>
</div>
</c:if>
</c:forEach>
</div>
</div>
</td>
</c:if>
<c:if test="${ qesitmList.itmTyCd eq '02'}">
<th><c:out value="${ qesitmList.qesitmNm }"/><c:if
test="${qesitmList.qesitmEssntlAt eq 'Y'}"><span
class="required-asterisk">*</span></c:if></th>
<td>
<input type="hidden" name="qesitmEssntlAtArr[]"
value="${ qesitmList.qesitmEssntlAt }" class="essntlChk">
<input type="hidden" name="qesitmNmArr[]"
value="${ qesitmList.qesitmNm }">
<input type="hidden" name="qesitmAtArr[]"
class="answSelectAt qesitmAtChk" value="N">
<input type="hidden" name="qesitmInnbArr[]" class="answSelect"
value="${ qesitmList.qesitmInnb }" disabled>
<input type="hidden" name="answCnArr[]" class="answSelect" disabled>
<div class="select-box">
<select class="md answSelectC" name="itmInnbArr[]">
<option value="">전체</option>
<c:forEach items="${itmCnList}" var="itmCnList2">
<c:if test="${itmCnList2.qesitmInnb eq qesitmList.qesitmInnb}">
<c:set var="selected" value=""/>
<c:forEach var="qesitmAnswList2" items="${qesitmAnswList}">
<c:if test="${qesitmAnswList2.itmInnb eq itmCnList2.itmInnb}">
<c:set var="selected" value="selected"/>
</c:if>
</c:forEach>
<option value="${itmCnList2.itmInnb}"
itm-cn="${itmCnList2.itmCn}"
qesitm-innb="${itmCnList2.qesitmInnb}" ${selected}>
${itmCnList2.itmCn}
</option>
</c:if>
</c:forEach>
</select>
</div>
</td>
</c:if>
<c:if test="${ qesitmList.itmTyCd eq '03'}">
<th><c:out value="${ qesitmList.qesitmNm }"/><c:if
test="${qesitmList.qesitmEssntlAt eq 'Y'}"><span
class="required-asterisk">*</span></c:if></th>
<td>
<input type="hidden" name="qesitmEssntlAtArr[]"
value="${ qesitmList.qesitmEssntlAt }" class="essntlChk">
<input type="hidden" name="qesitmNmArr[]"
value="${ qesitmList.qesitmNm }">
<input type="hidden" name="qesitmAtArr[]"
class="answChkAt qesitmAtChk"
value="N">
<c:forEach items="${itmCnList}" var="itmCnList3">
<c:if test="${itmCnList3.qesitmInnb eq qesitmList.qesitmInnb}">
<div class="input-container">
<label class="b-checkbox checkbox">
<input type="hidden" class="answChk" name="qesitmInnbArr[]"
value="${ qesitmList.qesitmInnb }" disabled>
<input type="hidden" class="answChk" name="answCnArr[]"
value="${ itmCnList3.itmCn }" disabled>
<input type="checkbox" class="answChkC" name="itmInnbArr[]"
value="${ itmCnList3.itmInnb }"
itm-cn="${ itmCnList3.itmCn }"
qesitm-innb="${itmCnList3.qesitmInnb}"
<c:forEach var="qesitmAnswList3" items="${qesitmAnswList}">
<c:if test="${qesitmAnswList3.itmInnb eq itmCnList3.itmInnb}">checked</c:if>
</c:forEach>>
<span class="check"></span>
<span class="control-label">${ itmCnList3.itmCn }</span>
</label>
</div>
</c:if>
</c:forEach>
</td>
</c:if>
<c:if test="${ qesitmList.itmTyCd eq '04'}">
<th><c:out value="${ qesitmList.qesitmNm }"/><c:if
test="${qesitmList.qesitmEssntlAt eq 'Y'}"><span
class="required-asterisk">*</span></c:if></th>
<td>
<div class="td-inner">
<div class="input-grow-container">
<c:forEach items="${itmCnList}" var="itmCnList4">
<c:if test="${itmCnList4.qesitmInnb eq qesitmList.qesitmInnb}">
<div class="input-container">
<input type="hidden" name="qesitmEssntlAtArr[]"
value="${ qesitmList.qesitmEssntlAt }">
<input type="hidden" name="qesitmNmArr[]"
value="${ qesitmList.qesitmNm }">
<input type="hidden" name="qesitmAtArr[]"
class="answTxtAt" value="N">
<input type="hidden" class="answTxt"
name="qesitmInnbArr[]"
value="${ qesitmList.qesitmInnb }" disabled>
<input type="hidden" class="answTxt" name="itmInnbArr[]"
value="${ itmCnList4.itmInnb }" disabled>
<input type="text" class="input-text mm answTxtC"
name="answCnArr[]" title="추가문항답변"
placeholder="${ itmCnList4.itmCn }"
maxlength="666"
itm-cn="${ itmCnList4.itmCn }"
qesitm-innb="${itmCnList4.qesitmInnb}"
itm-innb="${itmCnList4.itmInnb}"
<c:forEach var="qesitmAnswList4"
items="${qesitmAnswList}">
<c:if test="${qesitmAnswList4.itmInnb eq itmCnList4.itmInnb}">
value="<c:out value = '${qesitmAnswList4.answCn}'/>"
</c:if>
</c:forEach>>
</div>
<br>
</c:if>
</c:forEach>
</div>
</div>
</td>
</c:if>
</tr>
</c:forEach>
</c:if>
<c:if test="${bbsInfo.answRegist eq 'Y'&& bbsInfo.bbscttSndngMthCd ne '03'}"><%--답변사용여부와 게시글 문자사용여부 체크--%>
<tr>
<th>답변받기</th>
<td>
<div class="td-inner">
<input class="input-text" type="text" title="해당 인풋에 대한 설명" name="answMbtlnb"
id="answMbtlnb" maxlength="13" value = "<c:out value = '${bbscttInfo.answMbtlnb}'/>"
placeholder="휴대폰번호'-'없이 입력">
<div class="b-checkbox-container">
<label class="b-checkbox checkbox">
<input type="checkbox" value="Y" name="answSmsRecptn" class="chkAt"
<c:if test="${bbscttInfo.answSmsRecptn eq 'Y'}">checked</c:if>>
<span class="check"></span>
<span class="control-label">SMS 알림요청</span>
</label>
</div>
</div>
</td>
</tr>
</c:if>
<c:if test="${bbsInfo.bbsTyCd eq '05'}">
<tr>
<th>문의상품</th>
<td>
<c:forEach var = "goods" items="${goods}">
<img src="${cdnurl}<c:out value = '${goods.img}'/>" onerror = "this.src='/pc/images/image_placeholder.png'" alt="qnaGoods"
width="100px" height="100px">
<span><c:out value='${goods.goodsNm}'/></span>
<input type="hidden" name="goodsInnbArr[]" value="${goods.goodsInnb}"/>
</c:forEach>
</td>
</tr>
</c:if>
<tr>
<th>제목</th>
<td>
<div class="td-inner">
<div class="input-grow-container">
<input class="input-text xl" type="text" title="해당 인풋에 대한 설명" name="sj"
placeholder="제목을 입력하세요." maxlength="100"
value="<c:out value = "${bbscttInfo.sj}"/>">
<c:if test="${bbsInfo.secretBbsctt eq 'Y'}">
<div class="b-checkbox-container">
<label class="b-checkbox checkbox">
<input type="checkbox" value="Y" name="secretBbscttAt" class="chkAt"
<c:if test="${bbscttInfo.secretBbscttAt eq 'Y'}">checked</c:if>
<c:if test="${bbsInfo.bbsTyCd eq '05'}">onclick="fn_prevent_click(event);"</c:if>>
<span class="check"></span>
<span class="control-label">비밀글</span>
</label>
</div>
</c:if>
</div>
</div>
</td>
</tr>
<tr>
<th>내용</th>
<td>
<textarea class="textarea" rows="12" title="내용 입력란" id="cnBbsUpdt" name = "cn">
</textarea>
</td>
</tr>
<%--게시판설정(파일첨부사용여부)--%>
<c:if test="${bbsInfo.filAtch eq 'Y'}">
<tr>
<th>이미지 등록</th>
<td>
<div class="dropzone-wrapper">
<div class="dropzone" id="contact-dropzone">
</div>
</div>
<ul class="contact-upload-info">
<li>사진 첨부는 최대 10MB 이하이며 3개까지 등록할 수 있습니다.</li>
<li>등록 가능 파일은 ${acceptFileExtensions} 파일만 가능합니다.</li>
<li>상품과 무관한 내용이거나 음란 불법적인 내용은 통보없이 삭제할 수 있습니다.</li>
</ul>
</td>
</tr>
</c:if>
</tbody>
</table>
</form>
</div>
</div>
<div class="modal-footer">
<button type = "button" class="btn large outline close" id = "updtCloseBtn"><spring:message code="button.close"/></button>
<button type = "button" class="btn large gray2" id = "updtBtn"><spring:message code="button.update"/></button>
</div>
</div>
<!--수정결과모달-->
<div id="result-alert-update" class="modal alert">
<div class="alert-content">
<p class="alert-content__text--sm">
<spring:message code="success.common.update"/>
</p>
</div>
<div class="alert-btn-container">
<a href="#" rel="modal:close" class="btn large outline close"><spring:message code="button.close"/></a>
<button class="alert-btn alert-btn--confirm" id = "alertUpdtBtn"><spring:message code="button.ok"/></button>
</div>
</div>
<script>
// Dropzone 파일업로드
if ($("#contact-dropzone").length > 0) {
const maxFiles = 3;
Dropzone.autoDiscover = false;
var myDropzone = new Dropzone("#contact-dropzone", {
url: "/file-upload",
maxFilesize: 10,
maxFiles: maxFiles,
acceptedFiles: "${acceptFileExtensions}",
autoProcessQueue: false,
addRemoveLinks: true,
dictDefaultMessage: "",
dictRemoveFile: "삭제",
dictCancelUpload: "취소",
dictCancelUploadConfirmation: "업로드를 취소하시겠습니까?",
dictInvalidFileType: "이 파일은 업로드할 수 없습니다.",
dictFileTooBig: "파일이 너무 큽니다. ({{filesize}}MB). 최대 파일 크기: {{maxFilesize}}MB.",
dictMaxFilesExceeded: "파일을 더 이상 추가할 수 없습니다.",
dictResponseError: "서버에서 응답을 받지 못했습니다.",
init: function () {
let dropzoneInstance = this;
let imageData = ${fileInfoGson};
// 각 이미지를 Dropzone에 추가
$.each(imageData, function (index, image) {
// Dropzone 파일 객체 생성
let mockFile = {name: image.orginlFilNm, size: image.filMg};
dropzoneInstance.emit("addedfile", mockFile);
let cdnurl = '<c:out value="${cdnurl}"/>';
let filCours = `\${image.filCours}`;
let sysFilNm = `\${image.sysFilNm}`;
const imagePath = cdnurl + filCours + sysFilNm;
dropzoneInstance.emit("thumbnail", mockFile, imagePath);
// 이미지 오류 처리
$(mockFile.previewElement).find("img").on("error", function () {
this.src = '/mobile/images/image_placeholder.png'; // 대체 이미지 경로로 설정
});
// Dropzone에 파일 추가
mockFile.customId = image.bbscttAtchmnfilInnb;
dropzoneInstance.files.push(mockFile);
});
// 파일이 삭제될 때마다 호출되는 이벤트 핸들러
this.on("removedfile", function (file) {
const result = dropzoneDeleteFiles("" + file.customId + "", '<c:out value="${bbscttVO.sopmalCd}"/>', "BDFL", 1);
if (result === "N") {//파일 삭제 안할 시 복원
file.customData = {restored: true, customId: file.customId}; //삭제 취소에 의한 구분자 부여
myDropzone.emit("addedfile", file); // 파일을 다시 추가하여 삭제 취소
myDropzone.emit("thumbnail", file, file.dataURL); // 파일의 썸네일을 복원
}
if (myDropzone.files.length < maxFiles) {
$(".dz-message").show();
}
});
//파일 추가
this.on("addedfile", function (file) {
let restoreAt = '';
if (file.customData) { //파일 삭제 복구시
restoreAt = true;
} else {//새파일 추가시
restoreAt = false;
}
if (restoreAt) {// 파일 삭제 복구시 해당 id 재부여
file.customId = file.customData.customId;
} else {//새파일 추가시 임시 id 부여
let fileLength = myDropzone.files.length;
file.customId = "temp" + fileLength;
if (fileLength > maxFiles) {
const dictMaxFilesExceeded = myDropzone.options.dictMaxFilesExceeded;
this.removeFile(file);
$(file.previewElement).find(".dz-remove").attr("disabled", true);
}
// 파일 크기가 최대 파일 크기보다 큰 경우
if (file.size > this.options.maxFilesize * 1024 * 1024) {
this.removeFile(file);
alert("파일 크기가 너무 큽니다. 최대 " + this.options.maxFilesize + "MB까지 허용됩니다.");
}
}
});
// maxFiles 제한 관련 이벤트 핸들러
this.on("maxfilesexceeded", function (file) {
const dictMaxFilesExceeded = myDropzone.options.dictMaxFilesExceeded;
alert(dictMaxFilesExceeded);
// 파일 제거
this.removeFile(file);
});
}
});
if (myDropzone.files.length < maxFiles) {
$(".dz-message").show();
} else {
$(".dz-message").hide();
}
var inputElement = $('input[type="file"].dz-hidden-input');
if(inputElement.length > 1){
inputElement.eq(0).remove();
}
// name 부여
inputElement.attr('name', 'file');
// id 부여
inputElement.attr('id', 'fileUpload');
}
</script>
</body>
</html>

View File

@@ -0,0 +1,996 @@
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="ui" uri="http://www.winbit.kr/ctl/ui" %>
<%@ taglib prefix="f" uri="/WEB-INF/tlds/f.tld" %>
<%--
Class Name : BbscttUpdtU.jsp
Description : 게시글 수정 폼
Modification Information
수정일 수정자 수정내용
------- -------- ---------------------------
2024-05-21 김혜인 최초 생성
--%>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<%-- 공통 include --%>
<jsp:include page="/WEB-INF/views/comm/Include.jsp"/>
</head>
<script>
$(document).ready(function () {
/*폼 기본 세팅*/
fn_select_cn();
//hidden value set
fn_update_hidden_value();
/*값 set*/
if($("#answMbtlnb").length > 0){
/*휴대전화 포매팅 함수*/
fn_set_event("#answMbtlnb", "input", fn_fmt_telno);
const fmtMbtlnb = fn_format_mbtlnb($("#answMbtlnb").val());
$("#answMbtlnb").val(fmtMbtlnb);
}
//내용 텍스트 <br>태그 엔터값으로 replace
const cn = $("#cnBbsUpdt");
let str = cn.text();
str = str.replaceAll(/<br>/ig, '\n');
str = str.replaceAll(/<\/br>/ig, '\n');
str = str.replaceAll(/<br \/>/ig, '\n');
//내용 내 태그 없애기
str = str.replace(/<\/?[^>]+(>|$)/g, "");
//내용 앞에 첫 문자열 앞 공백 지우기
str = str.trim();
cn.text(str);
//분류 change시 hidden value값 set
$(document).on('change', '#qesitmNmC', function () {
$("#qesitmInnb").val("");
$("#qesitmNm").val("");
$("#answCn").val("");
const option = $('option:selected', this);
const qesitmInnb = $(option).attr('qesitm-innb');
const answCn = $(option).attr('answ-Cn');
const qesitmNm = $(option).attr('qesitm-nm');
if ($(this).val() !== "") {
$("#qesitmInnb").val(qesitmInnb);
$("#answCn").val(answCn);
$("#qesitmNm").val(qesitmNm);
$("#qesitmAt").val("Y");
$(this).closest("td").find("input[name='qesitmAtArr[]']").val("Y");
} else {
$("#qesitmInnb").val("");
$("#answCn").val("");
$("#qesitmNm").val("");
$("#qesitmAt").val("N");
$(this).closest("td").find("input[name='qesitmAtArr[]']").val("N");
}
});
//추가입력 항목 라디오 'click' 이벤트
$(document).on('click', '.answRadioC', function () {
const radio = $(this);
//추가입력 항목 내용 요소 get
const answ = radio.closest(".custom-radio-container").find('[name="answCnArr[]"]');
//추가입력 항목 내용 요소 get
const qesitmInnb = radio.closest(".custom-radio-container").find('[name="qesitmInnbArr[]"]');
//라디오 클릭으로 인한 제어 요소 get
const contrlTarget = radio.closest(".custom-radio-container").find('.answRadio');
//항목 고유번호 내용 요소 get
const itmInnb = radio.closest(".custom-radio-container").find('[name="itmInnbArr[]"]');
//라디오 클릭 시 disabled 비활성
if (radio.is(":checked")) {
//답변 내용 초기화
answ.val("");
const radioVal = $(radio).attr('itm-cn');
answ.val(radioVal);
//항목 내용 set
qesitmInnb.val("");
const qesitmInnbVal = $(radio).attr('qesitm-innb');
qesitmInnb.val(qesitmInnbVal);
//항목고유번호 내용 set
itmInnb.val("");
const itmInnbVal = $(radio).val();
itmInnb.val(itmInnbVal);
//라디오 주위 input값 disable false처리
contrlTarget.each(function () {
contrlTarget.prop("disabled", false);
radio.closest(".custom-radio-container").find(".answRadioAt").val("Y");
});
} else {
contrlTarget.each(function () {
contrlTarget.prop("disabled", true);
radio.closest(".custom-radio-container").find(".answRadioAt").val("N");
});
}
});
//추가입력 항목 셀렉트 'change'이벤트
$(document).on('change', '.answSelectC', function () {
const select = $(this);
const answ = select.closest("td").find('[name="answCnArr[]"]');
const qesitmInnb = select.closest("td").find('[name="qesitmInnbArr[]"]');
const contrlTarget = select.closest("td").find('.answSelect');
const option = $('option:selected', this);
if (select.val() != "") {
//답변 내용 초기화
answ.val("");
const selectVal = $(option).attr('itm-cn');
answ.val(selectVal);
//항목 내용 set
qesitmInnb.val("");
const qesitmInnbVal = $(option).attr('qesitm-innb');
qesitmInnb.val(qesitmInnbVal);
//셀렉트 주위 input값 disable false처리
contrlTarget.each(function () {
contrlTarget.prop("disabled", false);
select.closest("td").find(".answSelectAt").val("Y");
});
} else {
contrlTarget.each(function () {
contrlTarget.prop("disabled", true);
select.closest("td").find(".answSelectAt").val("N");
});
}
});
//추가입력 항목 체크박스 'click'이벤트
$(document).on('click', '.answChkC', function () {
const check = $(this);
const contrlTarget = check.closest("div").find('.answChk');
var isChecked = $(this).is(":checked");
//클릭한 체크박스 주위 input값 disable false처리
contrlTarget.each(function () {
if (isChecked) {
$(this).prop("disabled", false);
} else {
$(this).prop("disabled", true);
}
});
// 체크된 체크박스가 하나라도 있는지 확인
let anyChecked = $('.answChkC:checked').length > 0;
contrlTarget.each(function () {
if (anyChecked) {
check.closest("td").find(".answChkAt").val("Y");
check.closest("td").find(".answChkAt").prop("disabled", false);
} else {
check.closest("td").find(".answChkAt").val("N");
check.closest("td").find(".answChkAt").prop("disabled", true);
}
});
});
//추가입력 항목 텍스트 'input'이벤트
$(document).on('input', '.answTxtC', function () {
const txt = $(this);
const contrlTarget = txt.closest("div").find('.answTxt');
const contrlAt = txt.closest("div").find('.answTxtAt');
//클릭한 체크박스 주위 input값 disable false처리
if (txt.val() != "") {
contrlTarget.each(function () {
contrlTarget.prop("disabled", false);
contrlAt.val("Y");
});
} else {
contrlTarget.each(function () {
contrlTarget.prop("disabled", true);
contrlAt.val("N");
});
}
});
//파일 업로드
$(document).on("change", "#fileUpload", function () {
addFiles(event, 0);
});
//수정 버튼 이벤트
$(document).on("click", "#updtBtn", function () {
fn_update_bbsctt();
});
//수정 완료 모달 > 확인 버튼 이벤트 (새로고침)
$(document).on("click", "#alertBtn", function () {
$('html').scrollTop(0);
location.reload();
});
//수정 취소 버튼(이전 페이지 이동);
$(document).on("click", "#cancelBtn", function () {
const listAt = $("#listAt").val();
if (listAt === 'list') {
fn_move_list();
} else {
fn_move_dtl();
}
});
});
/*********************************************************
* 게시글 내용 조회
*********************************************************/
const fn_select_cn = function () {
let bbscttInnb = $("#bbscttInnb").val();
let bbsId = $("#bbsId").val();
let sopmalCd = $("#sopmalCd").val();
$.ajax({
type: "post",
url: "<c:url value ='/ajax/bbscttAjax/selectBOBbscttCnAjax'/>",
contentType: 'application/json',
data: JSON.stringify({
bbsId: bbsId,
bbscttInnb: bbscttInnb,
sopmalCd: sopmalCd
}),
success: function (data) {
let cn = data.result.cn;
$("#cnBbsUpdt").val(cn);
$("#cnBbsUpdt").addClass("ck-content");
}
});
}
//목록 조회에서 취소 누를 시 해당 게시판 목록으로 이동
const fn_move_list = () => {
const form = document.createElement("form");
form.id = "listForm";
form.action = "/sopmal/csc/selectSubPageListForm";
form.method = "POST";
fn_create_input("bbsId", $("#bbsId").val(), form);
fn_create_input("pageIndex", "1", form);
document.body.appendChild(form);
form.submit();
}
//input 생성 함수
const fn_create_input = (name, value, tgtForm) => {
const input = document.createElement('input');
input.setAttribute("type", "hidden");
input.setAttribute("name", name);
input.setAttribute("value", value);
tgtForm.append(input);
}
//상세조회
const fn_move_dtl = () => {
const hiddenForm = $("#hiddenForm");
if(hiddenForm.length > 0){
hiddenForm.remove();
}
const form = document.createElement("form");
form.id = "dtlForm";
form.action = "/sopmal/csc/selectBbscttDtlInqire";
form.method = "POST";
fn_create_input("bbscttInnb", $("#bbscttInnb").val(), form);
fn_create_input("bbsTyCd", $("#bbsTyCd").val(), form);
fn_create_input("bbsId", $("#bbsId").val(), form);
fn_create_input("useAt", "Y", form);
fn_create_input("expsrAt", "Y", form);
fn_create_input("reqUrl", "subPage", form);
fn_create_input("pageIndex", "1", form);
fn_create_input("prevNext", $("#prevNext").val(), form);
let pageUnit = '';
//갤러리 페이지 유닛 계산
if(sknTyCd === '02'){
const pgeVtcCnt = $("#pgeVtcCnt").val();//열 개수
const pgeWthCnt = $("#pgeWthCnt").val();//행 개수
pageUnit = pgeVtcCnt * pgeWthCnt;
}else{
pageUnit = '10';
}
fn_create_input("pageUnit", pageUnit, form);
document.body.appendChild(form);
form.submit();
}
/*********************************************************
* 게시글 수정
*********************************************************/
const fn_update_bbsctt = function () {
let url = '<c:url value="/sopmal/csc/updateBbscttupdt"/>';
let saveForm = $('#bbsUpdtForm');
let formData = new FormData();
//파일 업로드
if ($("#contact-dropzone").length > 0) {
let myDropzone = Dropzone.forElement("#contact-dropzone");
myDropzone.files.forEach(function (file) {
formData.append("files", file);
});
//hidden 파일이 존재여부 Flag Setting y/n ========================
}
//사용자 등록 시 노출 여부 Y
formData.append("expsrAt", "Y");
//비밀번호 set
const password = "<c:out value = "${ resultMap.bbscttInfo.bbscttInfo.password }"/>";
if (password.length){
formData.append("password", password);
}
//입력항목 체크박스 disabled처리
$('.checkbox input[type="checkbox"]').each(function () {
if (!$(this).prop('checked')) {
fn_ctrl_disable([".checkbox"],);
}
});
//폼 내 input값 append
saveForm.serializeArray().forEach(function (item) {
formData.append(item.name, item.value);
});
disableButton("#updtBtn");
if (confirm('게시글을 <spring:message code="confirm.common.update"/>')) {
$.ajax({
type: 'post',
url: url,
enctype:"multipart/form-data",
data: formData,
processData: false,
contentType: false,
success: function (result) {
enableButton("#updtBtn");
$("#result-alert").modal();
/*파일 temp 배열 초기화*/
filesTempArr = [];
}
});
}
enableButton("#updtBtn");
fn_ctrl_disable("", [".checkbox"]);
}
//답변 관련 정보 set
function fn_update_hidden_value () {
//분류 항목
const option = $('option:selected', $("#qesitmNmC"));
const qesitmInnb = $(option).attr('qesitm-innb');
const answCn = $(option).attr('answ-Cn');
const qesitmNm = $(option).attr('qesitm-nm');
if($("#qesitmNmC").val()!= ""){
$("#qesitmInnb").val(qesitmInnb);
$("#answCn").val(answCn);
$("#qesitmAt").val("Y");
}else{
$("#qesitmInnb").val("");
$("#answCn").val("");
$("#qesitmAt").val("N");
}
// 추가평가항목 라디오
const radio = $(".answRadioC:checked");
radio.each(function(idx) {
if (radio.eq(idx).val()) {
let radioAnsw = radio.eq(idx).closest("td").find('[name="answCnArr[]"]');
let radioQesitmInnb = radio.eq(idx).closest("td").find('[name="qesitmInnbArr[]"]');
let radioItmInnb = radio.eq(idx).closest("td").find('[name="itmInnbArr[]"]');
let radioQesitmAt = radio.eq(idx).closest("td").find('[name="qesitmAtArr[]"]');
let radioContrlTarget = radio.eq(idx).closest("td").find('.answRadio');
// 답변 내용 set
radioAnsw.val(radio.eq(idx).attr('itm-cn'));
// 항목 내용 set
radioQesitmInnb.val(radio.eq(idx).attr('qesitm-innb'));
// 항목고유번호 내용 set
radioItmInnb.val(radio.eq(idx).val());
// 답변 여부
radioQesitmAt.val("Y");
// 라디오 주위 input값 disable false처리
radioContrlTarget.each(function(idx){
radioContrlTarget.eq(idx).prop("disabled", false);
});
} else {
let radioAnsw = radio.eq(idx).closest("td").find('[name="answCnArr[]"]');
let radioQesitmInnb = radio.eq(idx).closest("td").find('[name="qesitmInnbArr[]"]');
let radioItmInnb = radio.eq(idx).closest("td").find('[name="itmInnbArr[]"]');
let radioQesitmAt = radio.eq(idx).closest("td").find('[name="qesitmAtArr[]"]');
let radioContrlTarget = radio.eq(idx).closest("div").find('.answRadio');
// 답변 내용 set
radioAnsw.val("");
// 항목 내용 set
radioQesitmInnb.val("");
// 항목고유번호 내용 set
radioItmInnb.val("");
// 답변 여부
radioQesitmAt.val("N");
// 라디오 주위 input값 disable false처리
radioContrlTarget.each(function(idx){
radioContrlTarget.eq(idx).prop("disabled", true);
});
}
});
//추가입력 항목 셀렉트 'change'이벤트
const select =$('select.answSelectC[name="itmInnbArr[]"]');
select.each(function(idx) {
let selectIndex = select.eq(idx).find('option:selected').index();
if (selectIndex > 0) {
let selectQesitmAt = select.eq(idx).closest("td").find('[name="qesitmAtArr[]"]');
let selectQesitmInnb = select.eq(idx).closest("td").find('[name="qesitmInnbArr[]"]');
let selectAnsw = select.eq(idx).closest("td").find('[name="answCnArr[]"]');
let selectOption = $('option:selected', select.eq(idx));
let selectContrlTarget = select.eq(idx).closest("td").find('.answSelect');
// 답변 여부
selectQesitmAt.val("Y");
// 항목 내용 set
selectQesitmInnb.val(selectOption.attr('qesitm-innb'));
// 답변 내용 set
selectAnsw.val(selectOption.attr('itm-cn'));
// 라디오 주위 input값 disable false처리
selectContrlTarget.each(function(idx){
selectContrlTarget.eq(idx).prop("disabled", false);
});
} else {
let selectQesitmAt = select.eq(idx).closest("td").find('[name="qesitmAtArr[]"]');
let selectQesitmInnb = select.eq(idx).closest("td").find('[name="qesitmInnbArr[]"]');
let selectAnsw = select.eq(idx).closest("td").find('[name="answCnArr[]"]');
let selectContrlTarget = select.eq(idx).closest("td").find('.answSelect');
// 답변 여부
selectQesitmAt.val("N");
// 항목 내용 set
selectQesitmInnb.val("");
// 답변 내용 set
selectAnsw.val("");
// 라디오 주위 input값 disable false처리
selectContrlTarget.each(function(idx){
selectContrlTarget.eq(idx).prop("disabled", true);
});
}
});
const check = $(".answChkC");
//클릭한 체크박스 주위 input값 disable false처리
check.each(function(idx){
let checkContrlTarget = check.eq(idx).closest(".checkbox").find('.answChk');
let isChecked = check.eq(idx).is(":checked");
checkContrlTarget.each(function (index) {
if (isChecked) {
checkContrlTarget.eq(index).prop("disabled", false);
} else {
checkContrlTarget.eq(index).prop("disabled", true);
}
});
// 체크된 체크박스가 하나라도 있는지 확인
let anyChecked = check.eq(idx).closest("td").find(".answChkC:checked").length > 0;
if (anyChecked) {
check.eq(idx).closest("td").find(".answChkAt").val("Y");
} else {
check.eq(idx).closest("td").find(".answChkAt").val("N");
}
});
//추가입력 항목 텍스트 'input'이벤트
const txt = $('.answTxtC');
txt.each(function (idx) {
let contrlTarget = txt.eq(idx).closest("div").find('.answTxt');
let contrlAt = txt.eq(idx).closest("div").find('.answTxtAt');
//클릭한 체크박스 주위 input값 disable false처리
if (txt.val() != "") {
contrlTarget.each(function () {
contrlTarget.prop("disabled", false);
contrlAt.val("Y");
});
} else {
contrlTarget.each(function () {
contrlTarget.prop("disabled", true);
contrlAt.val("N");
});
}
});
}
/*상품qna 버튼 클릭 제어*/
function fn_prevent_click(event) {
event.preventDefault(); // 체크박스 상태 변경 방지
}
</script>
<body>
<c:set value="${resultMap.bbscttInfo.bbscttInfo}" var="bbscttInfo"/>
<c:set value="${resultMap.bbscttVO}" var="bbscttVO"/>
<c:set value="${resultMap.bbscttInfo.qesitmAnswList}" var="qesitmAnswList"/>
<c:set value="${resultMap.bbscttInfo.fileInfoGson}" var="fileInfoGson"/>
<c:set value="${resultMap.bbscttInfo.goods}" var="goods"/>
<c:set value="${resultMap.bbscttInfo.wrter}" var="wrter"/>
<c:set value="${resultMap.bbsInfo}" var="bbsInfo"/>
<c:set value="${resultMap.qesitmList.qesitmList}" var="qesitmList"/>
<c:set value="${resultMap.qesitmList.itmCnList}" var="itmCnList"/>
<c:set value="${resultMap.itmList}" var="itmList"/>
<%-- 공통 Header --%>
<jsp:include page="/WEB-INF/views/comm/Header.jsp"/>
<!-- 메인 컨텐츠 영역 -->
<main>
<div class="sub-wrapper">
<div class="sub-content">
<c:choose>
<c:when test = "${bbscttVO.reqUrl eq 'subPage'}"><%--서브페이지 등록 폼 분기 처리--%>
<div class="page-title center">
<h2 class="page-title__title" id = "bbsNm"><c:out value="${bbsInfo.bbsNm}"/></h2>
</div>
</c:when>
<c:otherwise><%--고객센터 등록 폼 분기 처리--%>
<div class="sub-rl">
<jsp:include page="/WEB-INF/views/comm/csc/CscLeft.jsp"/>
<div class="sub-right-content">
<h3 class="sub-right-content__title"><c:out value="${bbsInfo.bbsNm}"/></h3>
</c:otherwise>
</c:choose>
<div class="table-wrapper">
<form id="bbsUpdtForm">
<%--게시판 설정--%>
<input type="hidden" name="filAtch" value="${bbsInfo.filAtch }"/>
<input type="hidden" name="slangFlterUseAt" value="${bbsInfo.slangFlterUseAt}"/>
<input type="hidden" id = "bbsId" name="bbsId" value="${bbsInfo.bbsId }"/>
<input type="hidden" id = "bbsTyCd" name="bbsTyCd" value="${bbsInfo.bbsTyCd }"/>
<input type="hidden" id="pgeVtcCnt" name="pgeVtcCnt" value="${ bbsInfo.pgeVtcCnt }"/>
<input type="hidden" id="pgeWthCnt" name="pgeWthCnt" value="${ bbsInfo.pgeWthCnt }"/>
<input type="hidden" id="prevNext" name="prevNext" value="${ bbsInfo.prevNext }"/>
<input type="hidden" id="sknTyCd" name="sknTyCd" value="${ bbsInfo.sknTyCd }"/>
<%--vo 관련(요청 구분 등)--%>
<input type="hidden" id="reqDv" value="<c:out value = '${bbsctt.reqDv}'/>" name="reqDv"/>
<input type="hidden" id="reqUrl" value="<c:out value = '${bbsctt.reqUrl}'/>" name="reqUrl"/>
<input type="hidden" id="listAt" name="listAt" value="${ bbscttVO.listAt }"/>
<input type="hidden" id="sopmalCd" name="sopmalCd" value="${bbscttVO.sopmalCd}"/>
<%--게시글 관련--%>
<input type="hidden" id="bbscttInnb" name="bbscttInnb" value="${ bbscttInfo.bbscttInnb }"/>
<%--파일 관련--%>
<spring:eval expression="@environment.getProperty('sopmalfo.common.fileupload.extensions.images')" var="acceptFileExtensions"/>
<input type="hidden" id="acceptFileExtensions" name="acceptFileExtensions" value="${ acceptFileExtensions}"/>
<%--존재 파일 여부 체크--%>
<c:choose>
<c:when test = "${not empty fileInfo}"><c:set var="filExtAt" value="Y"/></c:when>
<c:otherwise><c:set var="filExtAt" value="N"/></c:otherwise>
</c:choose>
<input type="hidden" id="filExtAt" name="filExtAt" value="${filExtAt}"/>
<input type="hidden" id="extFiles" name="extFiles" value=""/>
<input type="hidden" id="filesInfo" name="filesInfo"/>
<input type="hidden" id="extFilChangeAt" name="extFilChangeAt" value="N"/>
<table class="table write">
<caption>게시글 수정</caption>
<colgroup>
<col style="width: 200px;">
<col style="width: auto;">
</colgroup>
<tbody>
<tr>
<th>작성자</th>
<td>
<div class="td-inner">
<c:out value="${bbscttInfo.regusrNm}"/>
</div>
</td>
</tr>
<c:if test="${not empty itmList}">
<tr>
<th>분류<span class="required-asterisk">*</span></th>
<td>
<div class="td-inner">
<div class="select-box">
<%--문항답변필수여부 --%>
<input type="hidden" name="qesitmEssntlAtArr[]" value="Y">
<%--문항명 --%>
<input type="hidden" name="qesitmNmArr[]" id="qesitmNm" value="분류"/>
<%--문항고유번호 --%>
<input type="hidden" name="qesitmInnbArr[]" id="qesitmInnb"
<c:forEach var="itmAnswList" items="${qesitmAnswList}">
<c:if test="${itmAnswList.aditItmDvCd eq '03'}">
value = <c:out value="${itmAnswList.qesitmInnb}"/>
</c:if>
</c:forEach>/>
<%--답변내용 --%>
<input type="hidden" name="answCnArr[]" id="answCn"<c:forEach
var="itmAnswList" items="${qesitmAnswList}">
<c:if test="${itmAnswList.aditItmDvCd eq '03'}">
value = <c:out value="${itmAnswList.answCn}"/>
</c:if>
</c:forEach>/>
<%--답변여부 --%>
<input type="hidden" name="qesitmAtArr[]" id="qesitmAt"
<c:forEach var="itmAnswList" items="${qesitmAnswList}">
<c:if test="${itmAnswList.aditItmDvCd eq '03'}">
<c:choose>
<c:when test="${empty itmAnswList.answCn}">value="N"</c:when>
<c:otherwise>value="Y"</c:otherwise>
</c:choose>
</c:if>
</c:forEach>>
<select class="md" id="qesitmNmC" name="itmInnbArr[]">
<option value="">분류 선택</option>
<c:forEach var="itm" items="${itmList}" varStatus="status">
<option value="<c:out value="${itm.itmInnb}"/>"
qesitm-innb="${itm.qesitmInnb}" answ-Cn="${itm.itmCn}"
qesitm-nm="${itm.qesitmNm}"
<%--분류 답변 값 유지--%>
<c:forEach var="itmAnswList" items="${qesitmAnswList}">
<c:if test="${itmAnswList.aditItmDvCd eq '03'}">
<c:if test="${itm.itmInnb eq itmAnswList.itmInnb }">selected</c:if>
</c:if>
</c:forEach>>
<c:out value="${itm.itmCn}"/>
</option>
</c:forEach>
</select>
</div>
</div>
</td>
</tr>
</c:if>
<c:if test="${not empty qesitmList}">
<c:forEach var="qesitmList" items="${qesitmList}">
<tr>
<c:if test="${ qesitmList.itmTyCd eq '01'}">
<th><c:out value="${ qesitmList.qesitmNm }"/><c:if
test="${qesitmList.qesitmEssntlAt eq 'Y'}"><span
class="required-asterisk">*</span></c:if></th>
<td>
<div class="td-inner">
<div class="custom-radio-container">
<input type="hidden" name="qesitmEssntlAtArr[]"
value="${ qesitmList.qesitmEssntlAt}"
class="essntlChk">
<input type="hidden" name="qesitmNmArr[]"
value="${ qesitmList.qesitmNm}">
<input type="hidden" name="qesitmAtArr[]"
class="answRadioAt qesitmAtChk" value="N">
<input type="hidden" name="qesitmInnbArr[]"
class="answRadio"
value="${ qesitmList.qesitmInnb }" disabled>
<input type="hidden" name="answCnArr[]" class="answRadio"
disabled>
<input type="hidden" name="itmInnbArr[]" class="answRadio"
disabled>
<c:forEach items="${itmCnList}" var="itmCnList1" varStatus="status">
<c:if test="${itmCnList1.qesitmInnb eq qesitmList.qesitmInnb}">
<div class="custom-radio is-medium">
<input type="radio" id="answCn${ status.index }"
class="answRadioC"
qesitm-innb='${itmCnList1.qesitmInnb}'
name="itmInnbArr${ qesitmList.qesitmInnb}[]"
value="${ itmCnList1.itmInnb}"
itm-cn="${ itmCnList1.itmCn }"
<c:forEach var="qesitmAnswList1" items="${qesitmAnswList}">
<c:if test="${qesitmAnswList1.itmTyCd eq '01'}">
<c:if test="${qesitmAnswList1.itmInnb eq itmCnList1.itmInnb}">checked</c:if>
</c:if>
</c:forEach>>
<label for="answCn${ status.index }">${ itmCnList1.itmCn }</label>
</div>
</c:if>
</c:forEach>
</div>
</div>
</td>
</c:if>
<c:if test="${ qesitmList.itmTyCd eq '02'}">
<th><c:out value="${ qesitmList.qesitmNm }"/><c:if
test="${qesitmList.qesitmEssntlAt eq 'Y'}"><span
class="required-asterisk">*</span></c:if></th>
<td>
<input type="hidden" name="qesitmEssntlAtArr[]"
value="${ qesitmList.qesitmEssntlAt }" class="essntlChk">
<input type="hidden" name="qesitmNmArr[]"
value="${ qesitmList.qesitmNm }">
<input type="hidden" name="qesitmAtArr[]"
class="answSelectAt qesitmAtChk" value="N">
<input type="hidden" name="qesitmInnbArr[]" class="answSelect"
value="${ qesitmList.qesitmInnb }" disabled>
<input type="hidden" name="answCnArr[]" class="answSelect" disabled>
<div class="select-box">
<select class="md answSelectC" name="itmInnbArr[]">
<option value="">전체</option>
<c:forEach items="${itmCnList}" var="itmCnList2">
<c:if test="${itmCnList2.qesitmInnb eq qesitmList.qesitmInnb}">
<c:set var="selected" value=""/>
<c:forEach var="qesitmAnswList2" items="${qesitmAnswList}">
<c:if test="${qesitmAnswList2.itmInnb eq itmCnList2.itmInnb}">
<c:set var="selected" value="selected"/>
</c:if>
</c:forEach>
<option value="${itmCnList2.itmInnb}"
itm-cn="${itmCnList2.itmCn}"
qesitm-innb="${itmCnList2.qesitmInnb}" ${selected}>
${itmCnList2.itmCn}
</option>
</c:if>
</c:forEach>
</select>
</div>
</td>
</c:if>
<c:if test="${ qesitmList.itmTyCd eq '03'}">
<th><c:out value="${ qesitmList.qesitmNm }"/><c:if
test="${qesitmList.qesitmEssntlAt eq 'Y'}"><span
class="required-asterisk">*</span></c:if></th>
<td>
<input type="hidden" name="qesitmEssntlAtArr[]"
value="${ qesitmList.qesitmEssntlAt }" class="essntlChk">
<input type="hidden" name="qesitmNmArr[]"
value="${ qesitmList.qesitmNm }">
<input type="hidden" name="qesitmAtArr[]"
class="answChkAt qesitmAtChk"
value="N">
<c:forEach items="${itmCnList}" var="itmCnList3">
<c:if test="${itmCnList3.qesitmInnb eq qesitmList.qesitmInnb}">
<div class="input-container">
<label class="b-checkbox checkbox">
<input type="hidden" class="answChk" name="qesitmInnbArr[]"
value="${ qesitmList.qesitmInnb }" disabled>
<input type="hidden" class="answChk" name="answCnArr[]"
value="${ itmCnList3.itmCn }" disabled>
<input type="checkbox" class="answChkC" name="itmInnbArr[]"
value="${ itmCnList3.itmInnb }"
itm-cn="${ itmCnList3.itmCn }"
qesitm-innb="${itmCnList3.qesitmInnb}"
<c:forEach var="qesitmAnswList3" items="${qesitmAnswList}">
<c:if test="${qesitmAnswList3.itmInnb eq itmCnList3.itmInnb}">checked</c:if>
</c:forEach>>
<span class="check"></span>
<span class="control-label">${ itmCnList3.itmCn }</span>
</label>
</div>
</c:if>
</c:forEach>
</td>
</c:if>
<c:if test="${ qesitmList.itmTyCd eq '04'}">
<th><c:out value="${ qesitmList.qesitmNm }"/><c:if
test="${qesitmList.qesitmEssntlAt eq 'Y'}"><span
class="required-asterisk">*</span></c:if></th>
<td>
<div class="td-inner">
<div class="input-grow-container">
<c:forEach items="${itmCnList}" var="itmCnList4">
<c:if test="${itmCnList4.qesitmInnb eq qesitmList.qesitmInnb}">
<div class="input-container">
<input type="hidden" name="qesitmEssntlAtArr[]"
value="${ qesitmList.qesitmEssntlAt }">
<input type="hidden" name="qesitmNmArr[]"
value="${ qesitmList.qesitmNm }">
<input type="hidden" name="qesitmAtArr[]"
class="answTxtAt" value="N">
<input type="hidden" class="answTxt"
name="qesitmInnbArr[]"
value="${ qesitmList.qesitmInnb }" disabled>
<input type="text" class="input-text mm answTxtC"
name="answCnArr[]" title="추가문항답변"
placeholder="${ itmCnList4.itmCn }"
maxlength="666"
itm-cn="${ itmCnList4.itmCn }"
qesitm-innb="${itmCnList4.qesitmInnb}"
itm-innb="${itmCnList4.itmInnb}"
<c:forEach var="qesitmAnswList4"
items="${qesitmAnswList}">
<c:if test="${qesitmAnswList4.itmInnb eq itmCnList4.itmInnb}">
value="<c:out value = '${qesitmAnswList4.answCn}'/>"
</c:if>
</c:forEach>>
<input type="hidden" class="answTxt" name="itmInnbArr[]"
value="${ itmCnList4.itmInnb }" disabled>
</div>
<br>
</c:if>
</c:forEach>
</div>
</div>
</td>
</c:if>
</tr>
</c:forEach>
</c:if>
<c:if test="${bbsInfo.answRegist eq 'Y'&& bbsInfo.bbscttSndngMthCd ne '03'}"><%--답변사용여부와 게시글 문자사용여부 체크--%>
<tr>
<th>답변받기</th>
<td>
<div class="td-inner">
<input class="input-text" type="text" title="해당 인풋에 대한 설명"
name="answMbtlnb"
id="answMbtlnb" maxlength="13"
value="<c:out value = '${bbscttInfo.answMbtlnb}'/>"
placeholder="'-'없이 입력">
<div class="b-checkbox-container">
<label class="b-checkbox checkbox">
<input type="checkbox" value="Y" name="answSmsRecptn"
class="chkAt"
<c:if test="${bbscttInfo.answSmsRecptn eq 'Y'}">checked</c:if>>
<span class="check"></span>
<span class="control-label">SMS 알림요청</span>
</label>
</div>
</div>
</td>
</tr>
</c:if>
<tr>
<th>제목</th>
<td>
<div class="td-inner">
<input class="input-text xl" type="text" title="해당 인풋에 대한 설명" name="sj"
placeholder="제목을 입력하세요." maxlength="100"
value="<c:out value = "${bbscttInfo.sj}"/>">
<c:if test="${bbsInfo.secretBbsctt eq 'Y'}">
<div class="b-checkbox-container">
<label class="b-checkbox checkbox">
<input type="checkbox" value="Y" name="secretBbscttAt"
<c:if test="${bbscttInfo.secretBbscttAt eq 'Y'}">checked</c:if>
<c:if test="${bbsInfo.bbsTyCd eq '05'}"> onclick="fn_prevent_click(event);"</c:if>>
<span class="check"></span>
<span class="control-label">비밀글</span>
</label>
</div>
</c:if>
</div>
</td>
</tr>
<tr>
<th>내용</th>
<td>
<textarea class="textarea" rows="12" title="내용 입력란" id="cnBbsUpdt" name = "cn">
<c:out value="${bbscttInfo.cn}"/>
</textarea>
</td>
</tr>
<%--게시판설정(파일첨부사용여부)--%>
<c:if test="${bbsInfo.filAtch eq 'Y'}">
<tr>
<th>이미지 등록</th>
<td>
<div class="dropzone-wrapper">
<div class="dropzone" id="contact-dropzone">
</div>
</div>
<ul class="contact-upload-info">
<li>사진 첨부는 최대 10MB 이하이며 3개까지 등록할 수 있습니다.</li>
<li>등록 가능 파일은 ${acceptFileExtensions} 파일만 가능합니다.</li>
<li>상품과 무관한 내용이거나 음란 불법적인 내용은 통보없이 삭제할 수 있습니다.</li>
</ul>
</td>
</tr>
</c:if>
</tbody>
</table>
</form>
</div>
<div class="sub-bottom-btn-container">
<button class="btn xl outline" id="cancelBtn" value="<c:out value = '${bbsInfo.bbsId}'/>">
<c:choose>
<c:when test="${bbscttVO.listAt eq 'list'}"><spring:message code="button.catalog"/></c:when>
<c:otherwise><spring:message code="button.cancel"/></c:otherwise>
</c:choose></button>
<button class="btn xl theme" id="updtBtn"><spring:message code="button.update"/></button>
</div>
<c:choose>
<c:when test="${bbscttVO.reqUrl eq 'subpage'}"> <%--서브페이지 등록 폼 분기 처리--%>
</div>
</c:when>
<c:otherwise> <%--고객센터 등록 폼 분기 처리--%>
</div>
</div>
</c:otherwise>
</c:choose>
<!-- 수정/등록 알림 -->
<div id="result-alert" class="modal alert">
<div class="alert-content">
<p class="alert-content__text--sm">
<spring:message code="success.common.update"/>
</p>
</div>
<div class="alert-btn-container">
<button class="alert-btn alert-btn--confirm" id = "alertBtn"><spring:message code="button.ok"/></button>
</div>
</div>
</main>
<%-- 공통 Footer --%>
<jsp:include page="/WEB-INF/views/comm/Footer.jsp"/>
<script>
// Dropzone 파일업로드
if ($("#contact-dropzone").length > 0) {
const maxFiles = 3;
Dropzone.autoDiscover = false;
var myDropzone = new Dropzone("#contact-dropzone", {
url: "/file-upload",
maxFilesize: 10,
maxFiles: maxFiles,
acceptedFiles: "${acceptFileExtensions}",
autoProcessQueue: false,
addRemoveLinks: true,
dictDefaultMessage: "",
dictRemoveFile: "삭제",
dictCancelUpload: "취소",
dictCancelUploadConfirmation: "업로드를 취소하시겠습니까?",
dictInvalidFileType: "이 파일은 업로드할 수 없습니다.",
dictFileTooBig: "파일이 너무 큽니다. ({{filesize}}MB). 최대 파일 크기: {{maxFilesize}}MB.",
dictMaxFilesExceeded: "파일을 더 이상 추가할 수 없습니다.",
dictResponseError: "서버에서 응답을 받지 못했습니다.",
init: function () {
let dropzoneInstance = this;
let imageData = ${fileInfoGson};
// 각 이미지를 Dropzone에 추가
<spring:eval expression="@environment.getProperty('sopmalfo.common.fileupload.cdnurl')" var="cdnurl"/>
$.each(imageData, function (index, image) {
// Dropzone 파일 객체 생성
let mockFile = {name: image.orginlFilNm, size: image.filMg};
dropzoneInstance.emit("addedfile", mockFile);
const imagePath = '${cdnurl}' + image.filCours + image.sysFilNm;
dropzoneInstance.emit("thumbnail", mockFile, imagePath);
// 이미지 오류 처리
$(mockFile.previewElement).find("img").on("error", function () {
this.src = '/pc/images/image_placeholder.png'; // 대체 이미지 경로로 설정
});
// Dropzone에 파일 추가
mockFile.customId = image.bbscttAtchmnfilInnb;
dropzoneInstance.files.push(mockFile);
});
// 파일이 삭제될 때마다 호출되는 이벤트 핸들러
this.on("removedfile", function (file) {
const result = dropzoneDeleteFiles("" + file.customId + "", '<c:out value="${bbscttVO.sopmalCd}"/>', "BDFL", 1);
if (result === "N") {//파일 삭제 안할 시 복원
file.customData = {restored: true, customId: file.customId}; //삭제 취소에 의한 구분자 부여
myDropzone.emit("addedfile", file); // 파일을 다시 추가하여 삭제 취소
myDropzone.emit("thumbnail", file, file.dataURL); // 파일의 썸네일을 복원
}
if (myDropzone.files.length < maxFiles) {
$(".dz-message").show();
}
});
//파일 추가
this.on("addedfile", function (file) {
let restoreAt = '';
if (file.customData) { //파일 삭제 복구시
restoreAt = true;
} else {//새파일 추가시
restoreAt = false;
}
if (restoreAt) {// 파일 삭제 복구시 해당 id 재부여
file.customId = file.customData.customId;
} else {//새파일 추가시 임시 id 부여
let fileLength = myDropzone.files.length;
file.customId = "temp" + fileLength;
if (fileLength > maxFiles) {
const dictMaxFilesExceeded = myDropzone.options.dictMaxFilesExceeded;
alert(dictMaxFilesExceeded);
this.removeFile(file);
$(file.previewElement).find(".dz-remove").attr("disabled", true);
}
// 파일 크기가 최대 파일 크기보다 큰 경우
if (file.size > this.options.maxFilesize * 1024 * 1024) {
this.removeFile(file);
alert("파일 크기가 너무 큽니다. 최대 " + this.options.maxFilesize + "MB까지 허용됩니다.");
}
}
});
// maxFiles 제한 관련 이벤트 핸들러
this.on("maxfilesexceeded", function (file) {
const dictMaxFilesExceeded = myDropzone.options.dictMaxFilesExceeded;
alert(dictMaxFilesExceeded);
this.removeFile(file);
});
}
});
var inputElement = $('input[type="file"].dz-hidden-input');
// name 부여
inputElement.attr('name', 'file');
// id 부여
inputElement.attr('id', 'fileUpload');
if (myDropzone.files.length < maxFiles) {
$(".dz-message").show();
} else {
$(".dz-message").hide();
}
}
</script>
</body>
</html>

View File

@@ -0,0 +1,353 @@
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@ taglib prefix="ui" uri="http://www.winbit.kr/ctl/ui"%>
<%@ taglib prefix="f" uri="/WEB-INF/tlds/f.tld"%>
<%--
Class Name : CmListR.jsp
Description : 댓글 조회
Modification Information
수정일 수정자 수정내용
------- -------- ---------------------------
2024-04-25 김혜인 최초 생성
--%>
<!DOCTYPE html>
<script>
$(".cmCn").each(function (){
if(!$(this).hasClass("secret")){
$(this).text($(this).text().trim());
}
});
$(".cmcmCn").each(function (){
if(!$(this).hasClass("secret")){
$(this).text($(this).text().trim());
}
});
</script>
<html lang="ko">
<%--(DEPTH0)댓글 목록--%>
<c:set value = "${resultMap.cmList.cmList}" var = "cmList"/>
<%--작성자 정보 추출(댓글 목록)--%>
<c:set value = "${resultMap.cmList.wrterList}" var = "wrterList"/>
<%--작성자 정보 (답글 등록자 정보)--%>
<c:set value = "${resultMap.regusrInfo}" var = "regusrInfo"/>
<%--게시글 정보 --%>
<c:set value = "${resultMap.cmVO}" var = "cmVO"/>
<%--게시판 설정 --%>
<c:set value="${resultMap.bbsInfo}" var="bbsInfo"/>
<input type = "hidden" id = "cmCntInfo" value = "<c:out value = "${ resultMap.paginationInfo.totalRecordCount }"/>">
<p id="comment_container"></p>
<c:choose>
<c:when test="${not empty cmList}">
<c:forEach var="cmList" items="${cmList}" varStatus="status">
<div class="comment-body__item mainCmContent">
<div class="comment-body__info">
<div class="comment-body__info-left">
<i class="icon icon_comment-user"></i>
<span class="comment-body__user">
<c:choose>
<c:when test="${cmList.regusrDvCd eq '99'}">
<c:out value="${cmList.maskingRegusrNm}"/>[비회원]
</c:when>
<c:when test="${cmList.regusrDvCd eq '02'}">
<c:out value="${cmList.mngrNm}"/>
</c:when>
<c:when test="${cmList.wrterIndictTyCd eq '01' && cmList.regusrDvCd eq '01'}">
<c:out value="${ cmList.maskingRegusrId}"/>(<c:out value="${ cmList.mbrGradNm}"/>)
</c:when>
<c:when test="${cmList.wrterIndictTyCd eq '02' && cmList.regusrDvCd eq '01'}">
<c:out value="${ cmList.maskingRegusrId}"/>
</c:when>
<c:when test="${cmList.wrterIndictTyCd eq '03' && cmList.regusrDvCd eq '01'}">
<c:out value="${ cmList.maskingRegusrNm}"/>(<c:out value="${ cmList.mbrGradNm}"/>)
</c:when>
<c:when test="${cmList.wrterIndictTyCd eq '04' && cmList.regusrDvCd eq '01'}">
<c:out value="${ cmList.maskingRegusrNm}"/>
</c:when>
<c:when test="${cmList.wrterIndictTyCd eq '05' && cmList.regusrDvCd eq '01'}">
<c:out value="${ cmList.maskingRegusrNm}"/><br>
(<c:out value="${ cmList.maskingRegusrId}"/>,<c:out value="${ cmList.mbrGradNm}"/>)
</c:when>
<c:when test="${cmList.wrterIndictTyCd eq '06' && cmList.regusrDvCd eq '01'}">
<c:out value="${ cmList.maskingRegusrNm}"/>(<c:out value="${ cmList.maskingRegusrId}"/>)
</c:when>
</c:choose>
</span>
<span class="comment-body__date"><c:out value="${cmList.registDt}"/></span>
<c:if test="${cmList.newAt eq 'Y'}">
<i class="icon icon_new-post"></i>
</c:if>
</div>
<div class="comment-body__info-right">
<c:if test = "${cmList.useAt eq 'Y'}">
<button type="button" class="comment-body__button cmUpdtBtn" value="<c:out value="${cmList.cmInnb}"/>">
<spring:message code="button.update"/>
</button>
<button type="button" class="comment-body__button cmDelBtn" value="<c:out value="${cmList.cmInnb}"/>">
<spring:message code="button.delete"/>
</button>
</c:if>
</div>
</div>
<div class="comment-body__content">
<div class="comment-edit">
<%--1. 삭제된 글은 비밀 댓글이여도 삭제됐다고 보여준다--%>
<choose>
<c:choose>
<c:when test = "${cmList.useAt eq 'Y'}">
<%--2. 삭제 안된 글 중 비밀 댓글인지 확인한다.--%>
<c:choose>
<c:when test="${cmList.secretBbscttAt eq 'Y'}"><%--비밀댓글 적용 시--%>
<c:choose>
<c:when test="${cmList.regusr eq cmVO.mbrInnb}"><%--본인 꺼는 비밀 댓글 내용 보임--%>
<p class = "cmCn" style="white-space: pre-wrap;">
<i class="icon icon_lock"></i>
<c:out value="${cmList.cn}"/>
</p>
</c:when>
<c:otherwise><%--비회원 댓글 조회--%>
<p class = "cmCn secret">
<i class="icon icon_lock"></i>
<button class="comment-body__privateComment comment-body__button secretCm"
value="<c:out value="${cmList.cmInnb}"/>">비밀 댓글입니다.</button>
</p>
</c:otherwise>
</c:choose>
</c:when>
<c:otherwise>
<p class = "cmCn" style="white-space: pre-wrap;">
<c:out value="${cmList.cn}"/>
</p>
</c:otherwise>
</c:choose>
</c:when>
<c:otherwise>
삭제된 댓글 입니다.
</c:otherwise>
</c:choose>
</choose>
</div>
<div class = dtlCmDiv>
<input type="hidden" name = 'secretBbscttAt' value = '<c:out value="${cmList.secretBbscttAt}"/>'/>
</div>
</div>
<div class="comment-body__reply-container">
<button class="comment-body__reply-button">
답글<em class="commentCnt">0</em>
</button>
<%--게시판설정(댓글평가사용여부)--%>
<c:if test="${bbsInfo.cmEvlUseAt eq 'Y'}">
<div class="comment-like">
<button class="comment-like__btn comment-like__btn--like" value = "<c:out value ='${cmList.cmInnb}'/>">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20"
viewBox="0 0 20 20" fill="none">
<path
d="M14.7749 16.583H5.6756V7.41637L11.3711 1.75293L11.7012 1.8747C11.9266 2.03069 12.0992 2.22513 12.2188 2.45803C12.3385 2.69094 12.3705 2.93292 12.315 3.18399L12.2941 3.20803L11.5345 7.41637H17.2429C17.6115 7.41637 17.9269 7.54751 18.1892 7.8098C18.4515 8.07208 18.5826 8.38752 18.5826 8.75612V9.62308C18.5826 9.72351 18.5749 9.81351 18.5594 9.8931C18.5439 9.97269 18.5153 10.0558 18.4736 10.1423L16.1052 15.7185C15.9865 15.9829 15.8075 16.193 15.5682 16.349C15.3289 16.505 15.0645 16.583 14.7749 16.583ZM6.75891 15.4997H14.7749C14.8337 15.4997 14.8938 15.4837 14.9552 15.4516C15.0167 15.4195 15.0634 15.3661 15.0955 15.2913L17.4993 9.68718V8.75612C17.4993 8.68133 17.4753 8.61989 17.4272 8.5718C17.3791 8.52372 17.3177 8.49968 17.2429 8.49968H10.2461L11.1868 3.4532L6.75891 7.86508V15.4997ZM5.6756 7.41637V8.49968H2.49931V15.4997H5.6756V16.583H1.41602V7.41637H5.6756Z"
fill="black"></path>
</svg>
<span class="comment-like__number recomendCnt"><c:out value="${cmList.recomendCnt}"/></span>
</button>
<%--게시판설정(댓글평가추천단계-비추천사용)--%>
<c:if test="${bbsInfo.cmEvlRecomendStep eq '02'}">
<button class="comment-like__btn comment-like__btn--dislike" value = "<c:out value ='${cmList.cmInnb}'/>">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20"
viewBox="0 0 20 20" fill="none">
<path
d="M14.7749 16.583H5.6756V7.41637L11.3711 1.75293L11.7012 1.8747C11.9266 2.03069 12.0992 2.22513 12.2188 2.45803C12.3385 2.69094 12.3705 2.93292 12.315 3.18399L12.2941 3.20803L11.5345 7.41637H17.2429C17.6115 7.41637 17.9269 7.54751 18.1892 7.8098C18.4515 8.07208 18.5826 8.38752 18.5826 8.75612V9.62308C18.5826 9.72351 18.5749 9.81351 18.5594 9.8931C18.5439 9.97269 18.5153 10.0558 18.4736 10.1423L16.1052 15.7185C15.9865 15.9829 15.8075 16.193 15.5682 16.349C15.3289 16.505 15.0645 16.583 14.7749 16.583ZM6.75891 15.4997H14.7749C14.8337 15.4997 14.8938 15.4837 14.9552 15.4516C15.0167 15.4195 15.0634 15.3661 15.0955 15.2913L17.4993 9.68718V8.75612C17.4993 8.68133 17.4753 8.61989 17.4272 8.5718C17.3791 8.52372 17.3177 8.49968 17.2429 8.49968H10.2461L11.1868 3.4532L6.75891 7.86508V15.4997ZM5.6756 7.41637V8.49968H2.49931V15.4997H5.6756V16.583H1.41602V7.41637H5.6756Z"
fill="black"></path>
</svg>
<span class="comment-like__number nonrecomendCnt"><c:out value="${cmList.nonrecomendCnt}"/></span>
</button>
</c:if>
</div>
</c:if>
</div>
<c:if test="${cmList.depth eq 0}">
<div class="comment-body__nested-container">
</c:if>
<c:if test = "${not empty resultMap.cmList.cmAnswList}">
<c:forEach var="item" items="${resultMap.cmList.cmAnswList}" varStatus="status1">
<c:if test="${cmList.cmInnb eq item.parntsCmInnb}">
<div class="comment-body__item commentDiv">
<div class="comment-body__info">
<div class="comment-body__info-left">
<i class="icon icon_comment-user"></i>
<span class="comment-body__user">
<c:choose>
<c:when test="${item.regusrDvCd eq '99'}">
<c:out value="${item.maskingRegusrNm}"/>[비회원]
</c:when>
<c:when test="${item.regusrDvCd eq '02'}">
<c:out value="${item.mngrNm}"/>
</c:when>
<c:when test="${item.wrterIndictTyCd eq '01' && item.regusrDvCd eq '01'}">
<c:out value="${ item.maskingRegusrId}"/>(<c:out value="${ item.mbrGradNm}"/>)
</c:when>
<c:when test="${item.wrterIndictTyCd eq '02' && item.regusrDvCd eq '01'}">
<c:out value="${ item.maskingRegusrId}"/>
</c:when>
<c:when test="${item.wrterIndictTyCd eq '03' && item.regusrDvCd eq '01'}">
<c:out value="${ item.maskingRegusrNm}"/>(<c:out value="${ item.mbrGradNm}"/>)
</c:when>
<c:when test="${item.wrterIndictTyCd eq '04' && item.regusrDvCd eq '01'}">
<c:out value="${ item.maskingRegusrNm}"/>
</c:when>
<c:when test="${item.wrterIndictTyCd eq '05' && item.regusrDvCd eq '01'}">
<c:out value="${ item.maskingRegusrNm}"/><br>
(<c:out value="${ item.maskingRegusrId}"/>,<c:out value="${ item.mbrGradNm}"/>)
</c:when>
<c:when test="${item.wrterIndictTyCd eq '06' && item.regusrDvCd eq '01'}">
<c:out value="${ item.maskingRegusrNm}"/>(<c:out value="${ item.maskingRegusrId}"/>)
</c:when>
</c:choose>
</span>
<span class="comment-body__date">${item.registDt}</span>
<c:if test="${item.newAt eq 'Y'}">
<i class="icon icon_new-post"></i>
</c:if>
</div>
<div class="comment-body__info-right">
<button class="comment-body__button cmcmUpdtBtn" value="${item.cmInnb}" re-at="Y">수정
</button>
<button class="comment-body__button cmDelBtn" value="${item.cmInnb}" re-at="Y">삭제
</button>
</div>
</div>
<div class="comment-body__content commentCnDiv">
<c:choose>
<c:when test="${item.secretBbscttAt eq 'Y'}">
<c:choose>
<c:when test="${item.regusr eq cmVO.mbrInnb}"><%--본인 꺼는 비밀 댓글 내용 보임--%>
<p class = "cmcmCn" style="white-space: pre-wrap;">
<i class="icon icon_lock"></i>
<c:out value="${item.cn}"/>
</p>
</c:when>
<c:otherwise>
<p class = "cmcmCn secret">
<i class="icon icon_lock"></i>
<button class="comment-body__privateComment secretCmCm"
value = "<c:out value = '${item.cmInnb}'/>">비밀 댓글입니다.</button>
<input type="hidden" value="<c:out value="${item.cn}"/>">
</p>
</c:otherwise>
</c:choose>
</c:when>
<c:otherwise>
<p class = "cmcmCn" style="white-space: pre-wrap;">
<c:out value="${item.cn}"/>
</p>
</c:otherwise>
</c:choose>
</div>
<%--게시판설정(댓글평가사용여부)--%>
<c:if test="${bbsInfo.cmEvlUseAt eq 'Y'}">
<div class="comment-like">
<button class="comment-like__btn comment-like__btn--like" value = "<c:out value ='${item.cmInnb}'/>">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20"
viewBox="0 0 20 20" fill="none">
<path
d="M14.7749 16.583H5.6756V7.41637L11.3711 1.75293L11.7012 1.8747C11.9266 2.03069 12.0992 2.22513 12.2188 2.45803C12.3385 2.69094 12.3705 2.93292 12.315 3.18399L12.2941 3.20803L11.5345 7.41637H17.2429C17.6115 7.41637 17.9269 7.54751 18.1892 7.8098C18.4515 8.07208 18.5826 8.38752 18.5826 8.75612V9.62308C18.5826 9.72351 18.5749 9.81351 18.5594 9.8931C18.5439 9.97269 18.5153 10.0558 18.4736 10.1423L16.1052 15.7185C15.9865 15.9829 15.8075 16.193 15.5682 16.349C15.3289 16.505 15.0645 16.583 14.7749 16.583ZM6.75891 15.4997H14.7749C14.8337 15.4997 14.8938 15.4837 14.9552 15.4516C15.0167 15.4195 15.0634 15.3661 15.0955 15.2913L17.4993 9.68718V8.75612C17.4993 8.68133 17.4753 8.61989 17.4272 8.5718C17.3791 8.52372 17.3177 8.49968 17.2429 8.49968H10.2461L11.1868 3.4532L6.75891 7.86508V15.4997ZM5.6756 7.41637V8.49968H2.49931V15.4997H5.6756V16.583H1.41602V7.41637H5.6756Z"
fill="black"></path>
</svg>
<span class="comment-like__number recomendCnt"><c:out value="${item.recomendCnt}"/></span>
</button>
<%--게시판설정(댓글평가추천단계-비추천사용)--%>
<c:if test="${bbsInfo.cmEvlRecomendStep eq '02'}">
<button class="comment-like__btn comment-like__btn--dislike" value = "<c:out value ='${item.cmInnb}'/>">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20"
viewBox="0 0 20 20" fill="none">
<path
d="M14.7749 16.583H5.6756V7.41637L11.3711 1.75293L11.7012 1.8747C11.9266 2.03069 12.0992 2.22513 12.2188 2.45803C12.3385 2.69094 12.3705 2.93292 12.315 3.18399L12.2941 3.20803L11.5345 7.41637H17.2429C17.6115 7.41637 17.9269 7.54751 18.1892 7.8098C18.4515 8.07208 18.5826 8.38752 18.5826 8.75612V9.62308C18.5826 9.72351 18.5749 9.81351 18.5594 9.8931C18.5439 9.97269 18.5153 10.0558 18.4736 10.1423L16.1052 15.7185C15.9865 15.9829 15.8075 16.193 15.5682 16.349C15.3289 16.505 15.0645 16.583 14.7749 16.583ZM6.75891 15.4997H14.7749C14.8337 15.4997 14.8938 15.4837 14.9552 15.4516C15.0167 15.4195 15.0634 15.3661 15.0955 15.2913L17.4993 9.68718V8.75612C17.4993 8.68133 17.4753 8.61989 17.4272 8.5718C17.3791 8.52372 17.3177 8.49968 17.2429 8.49968H10.2461L11.1868 3.4532L6.75891 7.86508V15.4997ZM5.6756 7.41637V8.49968H2.49931V15.4997H5.6756V16.583H1.41602V7.41637H5.6756Z"
fill="black"></path>
</svg>
<span class="comment-like__number nonrecomendCnt"><c:out value="${item.nonrecomendCnt}"/></span>
</button>
</c:if>
</div>
</c:if>
</div>
<div class="dtlCmDiv">
<input type="hidden" name="secretBbscttAt" value="${item.secretBbscttAt}">
</div>
</c:if>
</c:forEach>
</c:if>
<c:if test="${cmList.depth eq 0}">
<div class="comment-body__item">
<div class="comment-write">
<c:choose>
<c:when test = "${cmVO.authResult eq 'Y'}">
<div class="comment-write__textarea-container">
<textarea class="comment-write__textarea" placeholder="댓글을 입력하세요." title="댓글 입력"
name="cn"></textarea>
</div>
<button class="comment-write__button reCreBtn" value="<c:out value = '${cmList.cmInnb}'/>">
<spring:message code="button.insert"/>
</button>
<div class="comment-write__bottom">
<div class="comment-write__info">
<div class="comment-write__info-inner">
<div class="comment-write__info-item">
<input type="text" class="comment-write__info-input" maxlength="25"
placeholder="이름을 입력하세요." title="이름 입력" name="regusrNm"
value= "<c:out value="${cmVO.regusrNm}"/>">
</div>
<c:if test = "${cmVO.regusrDvCd eq '99'}">
<div class="comment-write__info-item password">
<input type="password" class="comment-write__info-input" maxlength="25"
placeholder="비밀번호를 입력하세요." title="비밀번호 입력" name="password">
</div>
</c:if>
</div>
</div>
<div class="b-checkbox-container">
<label class="b-checkbox checkbox is-medium">
<input type="checkbox" value="Y" name="secretBbscttAt">
<span class="check"></span>
<span class="control-label">비밀 댓글</span>
</label>
</div>
</div>
</c:when>
<c:otherwise>
<div class="comment-write__textarea-container">
<textarea class="comment-write__textarea" rows="5"
placeholder="로그인 또는 댓글권한이 있을 경우 등록하실 수 있습니다." readonly></textarea>
</div>
<button class="comment-write__button" id = "rejectAuthCmBtn"><spring:message code="button.insert"/></button>
</c:otherwise>
</c:choose>
</div>
<input type="hidden" name="bbscttInnb" value="<c:out value ='${cmList.bbscttInnb}'/>"/>
<input type="hidden" name="bbsId" value="<c:out value ='${cmList.bbsId}'/>"/>
<input type="hidden" name="cmInnb" value="<c:out value ='${cmList.cmInnb}'/>"
class="cmInnb"/>
</div>
<div class="comment-body__item close" tabindex="0">
답글접기
</div>
</div>
</c:if>
</div>
</c:forEach>
<input type="hidden" name = "pageIndex" value = "<c:out value = "${cmVO.pageIndex}"/>" id = "pageIndex" />
<div class="pagination__container">
<ui:pagination paginationInfo="${resultMap.paginationInfo}" type="image" jsFunction="fn_make_cm" />
</div>
</c:when>
<c:otherwise>
<div class="comment-body__content">
<div class="table__no-result">
<img src="/pc/images/icon__no-result.png" alt="댓글 없음">
<p class="table__no-result-text">
<spring:message code="common.nodata"/>
</p>
</div>
</div>
</c:otherwise>
</c:choose>
</html>

View File

@@ -0,0 +1,274 @@
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="ui" uri="http://www.winbit.kr/ctl/ui" %>
<%@ taglib prefix="f" uri="/WEB-INF/tlds/f.tld" %>
<%--
Class Name : CscAcordionTyR.jsp
Description : 공지사항 목록.jsp
Modification Information
수정일 수정자 수정내용
------- -------- ---------------------------
2024-04-18 김혜인 최초 생성
--%>
<!DOCTYPE html>
<html lang="ko">
<c:set var="bbsInfo" value="${resultMap.bbsInfo}"/>
<c:set var="bbscttVO" value="${resultMap.bbsctt}"/>
<form class="contentForm">
<div class="form-control-container">
<div class="left">
<div class="search-number">
<span class="search-number__text">총 <strong><c:out value="${ resultMap.paginationInfo.totalRecordCount }"/></strong>건</span>
</div>
</div>
<div class="center">
</div>
<div class="right">
</div>
</div>
<div class="table-wrapper">
<table class="table vertical">
<caption>해당 테이블에 대한 설명</caption>
<!-- 각 열 width 설정 -->
<colgroup>
<c:if test="${bbsInfo.innbYn eq 'Y'}">
<col style="width: 80px;">
</c:if>
<c:if test="${bbsInfo.sjYn eq 'Y'}">
<col style="width: auto;">
</c:if>
<c:if test="${bbsInfo.ntcDeYn eq 'Y'}">
<col style="width: 10%;">
</c:if>
<c:if test="${bbsInfo.regusrNmYn eq 'Y'}">
<col style="width: 10%">
</c:if>
<c:if test="${bbsInfo.inqireCntYn eq 'Y'}">
<col style="width: 10%">
</c:if>
<c:if test="${bbsInfo.registDtYn eq 'Y'}">
<col style="width: 10%">
</c:if>
</colgroup>
<thead>
<tr>
<c:if test="${bbsInfo.innbYn eq 'Y'}">
<th>번호</th>
</c:if>
<c:if test="${bbsInfo.sjYn eq 'Y'}">
<th>제목</th>
</c:if>
<c:if test="${bbsInfo.ntcDeYn eq 'Y'}">
<th>공지기간</th>
</c:if>
<c:if test="${bbsInfo.regusrNmYn eq 'Y'}">
<th>작성자</th>
</c:if>
<c:if test="${bbsInfo.inqireCntYn eq 'Y'}">
<th>조회수</th>
</c:if>
<c:if test="${bbsInfo.registDtYn eq 'Y'}">
<th>등록일</th>
</c:if>
</tr>
</thead>
<tbody>
<c:choose>
<c:when test = "${ not empty resultMap.resultList.resultList }">
<c:forEach var="resultList" items="${ resultMap.resultList.resultList}" varStatus = "status">
<tr class="tr-foldable-trigger"
password-at="<c:if test = "${resultList.secretBbscttAt eq 'Y'}">Y</c:if>"
regusr="<c:out value="${ resultList.regusr}"/>"
bbsctt="<c:out value="${ resultList.bbscttInnb }"/>"
regusr-dv-cd="<c:out value="${ resultList.regusrDvCd }"/>">
<c:if test="${bbsInfo.innbYn eq 'Y'}">
<td>
<c:choose>
<c:when test="${resultList.ntcAt eq 'Y'}">
<i class="icon icon_notice-fixed"></i>
</c:when>
<c:otherwise>
<c:out value="${resultList.rnum}"/>
</c:otherwise>
</c:choose>
</td>
</c:if>
<c:if test="${bbsInfo.sjYn eq 'Y'}">
<td class="text-left">
<button type="button" class="ellipsis">
<c:choose>
<c:when test="${resultList.secretBbscttAt eq 'Y'}">
<c:choose>
<c:when test = "${resultList.regusrDvCd ne '02'}">
<c:if test="${not empty resultList.answCn}">
<span class="customer-name">
[<c:out value="${ resultList.answCn }"/>]
</span>
</c:if>
<span>${ resultList.maskingRegusrNm}</span>님의 ${bbsInfo.bbsNm}
</c:when>
<c:otherwise>
비밀글입니다.
</c:otherwise>
</c:choose>
</c:when>
<c:otherwise>
<c:if test="${not empty resultList.answCn}">
<span class="customer-name">
[<c:out value="${ resultList.answCn }"/>]
</span>
</c:if>
<c:out value ="${resultList.sj}"/>
</c:otherwise>
</c:choose>
</button>
</td>
</c:if>
<c:if test="${bbsInfo.ntcDeYn eq 'Y'}">
<td>
<c:choose>
<c:when test="${resultList.ntcAt eq 'Y' && resultList.ntcPdSetupAt eq 'Y'}">
<span class="board-date"><c:out value="${ resultList.ntcBgnDe }"/> ~ <c:out
value="${ resultList.ntcEndDe }"/></span>
</c:when>
<c:when test="${ resultList.ntcAt eq 'Y' && resultList.ntcPdSetupAt eq 'N'}">
<p class="eventList__date">상시공지</p>
</c:when>
</c:choose>
</td>
</c:if>
<c:if test="${bbsInfo.regusrNmYn eq 'Y'}">
<td>
<span class="customer-name">
<c:choose>
<c:when test="${resultList.regusrDvCd eq '99'}">
<c:out value="${ resultList.maskingRegusrNm}"/>[비회원]
</c:when>
<c:when test="${resultList.regusrDvCd eq '03'&& not empty resultList.npayBbscttSnb}">
naverpay
</c:when>
<c:when test="${resultList.regusrDvCd eq '02'}">
<c:out value="${ resultList.mngrNm}"/>
</c:when>
<c:when test="${bbsInfo.wrterIndictTyCd eq '01' && resultList.regusrDvCd eq '01'}">
<c:out value="${ resultList.regusrId}"/>
(<c:out value="${ resultList.mbrGradNm}"/>)
</c:when>
<c:when test="${bbsInfo.wrterIndictTyCd eq '02' && resultList.regusrDvCd eq '01'}">
<c:out value="${ resultList.regusrId}"/>
</c:when>
<c:when test="${bbsInfo.wrterIndictTyCd eq '03' && resultList.regusrDvCd eq '01'}">
<c:out value="${ resultList.maskingRegusrNm}"/>(<c:out
value="${ resultList.mbrGradNm}"/>)
</c:when>
<c:when test="${bbsInfo.wrterIndictTyCd eq '04' && resultList.regusrDvCd eq '01'}">
<c:out value="${ resultList.maskingRegusrNm}"/>
</c:when>
<c:when test="${bbsInfo.wrterIndictTyCd eq '05' && resultList.regusrDvCd eq '01'}">
<c:out value="${ resultList.maskingRegusrNm}"/>
(<c:out value="${ resultList.regusrId}"/>,<c:out
value="${ resultList.mbrGradNm}"/>)
</c:when>
<c:when test="${bbsInfo.wrterIndictTyCd eq '06' && resultList.regusrDvCd eq '01'}">
<c:out value="${ resultList.maskingRegusrNm}"/>(<c:out
value="${ resultList.regusrId}"/>)
</c:when>
</c:choose>
</span>
</td>
</c:if>
<c:if test="${bbsInfo.inqireCntYn eq 'Y'}">
<td><span class="customer-name"><c:out value="${ resultList.inqireCnt}"/></span></td>
</c:if>
<c:if test="${bbsInfo.registDtYn eq 'Y'}">
<td><span class="customer-name"><c:out value="${ resultList.sumRegistDt }"/></span></td>
</c:if>
</tr>
<tr class="tr-foldable">
<td colspan="100%">
<div class="tr-foldable__content">
<div class="tr-foldable__qna">
<c:if test = "${bbsInfo.answRegist eq 'Y'}"><i class="icon icon_qna-q"></i></c:if>
<div class="tr-foldable__qna-content">
<p class="tr-foldable__qna-title sj"><c:out value="${resultList.sj}" escapeXml="false"/></p>
<div class = "cn"><c:out value="${resultList.cn}" escapeXml="false"/></div>
</div>
</div>
<c:if test = "${bbsInfo.answRegist eq 'Y'}">
<div class="tr-foldable__qna">
<i class="icon icon_qna-a"></i>
<div class="tr-foldable__qna-content">
<c:choose>
<c:when test = "${not empty resultList.answBbscttInnb}">
<p class="tr-foldable__qna-title"><c:out value="${resultList.answSj}" escapeXml="false"/></p>
<div><c:out value="${resultList.answBbscttCn}" escapeXml="false"/></div>
</c:when>
<c:otherwise>
<p class="tr-foldable__qna-title answSj">답변 등록 중입니다.</p>
</c:otherwise>
</c:choose>
</div>
</div>
<div class="tr-foldable__btn-container">
<input type = "hidden" name = "answAt"
value = <c:choose>
<c:when test = "${not empty resultList.answBbscttInnb}">
'Y'
</c:when>
<c:otherwise>
'N'
</c:otherwise>
</c:choose>>
<input type = "hidden" name = "bbscttInnb" value = <c:out value="${resultList.bbscttInnb}"/>>
<c:if test = "${resultList.regusr eq bbscttVO.regusr || resultList.regusrDvCd eq '99'}">
<button type = "button" class="btn theme outline updateBtn"
answ-at ="<c:if test = "${not empty resultList.answBbscttInnb}">Y</c:if>"
password-at="<c:if test = "${not empty resultList.secretBbscttAt}">Y</c:if>"
regusr="<c:out value="${ resultList.regusr}"/>"
regusr-dv-cd = "<c:out value="${ resultList.regusrDvCd }"/>"
value="<c:out value="${ resultList.bbscttInnb }"/>">수정</button>
<button type = "button" class="btn outline deleteBtn"
answ-at ="<c:if test = "${not empty resultList.answBbscttInnb}">Y</c:if>"
password-at="<c:if test = "${not empty resultList.secretBbscttAt}">Y</c:if>"
regusr="<c:out value="${ resultList.regusr}"/>"
regusr-dv-cd = "<c:out value="${ resultList.regusrDvCd }"/>"
value="<c:out value="${ resultList.bbscttInnb }"/>">삭제</button>
</c:if>
</div>
</c:if>
</div>
</td>
</tr>
</c:forEach>
</c:when>
<c:otherwise>
<tr>
<td colspan="4">
<div class="table__no-result">
<img src="/pc/images/icon__no-result.png" alt="조회 내역 없음">
<p class="table__no-result-text">
<spring:message code="common.nodata"/>
</p>
</div>
</td>
</tr>
</c:otherwise>
</c:choose>
</tbody>
</table>
<c:if test = "${bbsInfo.bbscttRegist eq 'Y'}">
<div class="sub-board__top-btn-container">
<button type = "button" class="btn outline theme" id = "regBtn"><spring:message code="button.insert"/></button>
</div>
</c:if>
</div>
<input type="hidden" name="pageIndex" id="pageIndex" value="<c:out value = "${bbscttVO.pageIndex}"/>">
<div class="pagination__container">
<ui:pagination paginationInfo="${resultMap.paginationInfo}" type="image" jsFunction="fn_select_List"/>
</div>
</form>
</html>

View File

@@ -0,0 +1,148 @@
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@ taglib prefix="ui" uri="http://www.winbit.kr/ctl/ui"%>
<%@ taglib prefix="f" uri="/WEB-INF/tlds/f.tld"%>
<%--
Class Name : EvtListR.jsp
Description : 이벤트 목록
Modification Information
수정일 수정자 수정내용
------- -------- ---------------------------
2024-04-30 김혜인 최초 생성
--%>
<!DOCTYPE html>
<html lang="ko">
<c:set var="bbscttVO" value="${resultMap.bbsctt}"/>
<div class="eventList col-<c:out value ='${bbscttVO.pgeWthCnt}'/>">
<c:choose>
<c:when test="${ not empty resultMap.resultList.resultList }">
<c:forEach var="resultList" items="${ resultMap.resultList.resultList}" varStatus="status">
<div class="eventList__item">
<a class="dtlBtn" style="cursor:pointer;">
<input type = "hidden" class ="passwordAt" value="<c:if test = "${resultList.secretBbscttAt eq 'Y'}">Y</c:if>">
<input type = "hidden" class ="regusr" value="<c:out value="${ resultList.regusr}"/>">
<input type = "hidden" class ="bbscttInnb" value="<c:out value="${ resultList.bbscttInnb }"/>">
<div class="eventList__image">
<spring:eval expression="@environment.getProperty('sopmalfo.common.fileupload.cdnurl')" var="cdnurl"/>
<img src="<c:out value ="${cdnurl}${resultList.reprsntImgSysFilNm}"/>"
onerror="this.src='/pc/images/image_placeholder.png'"
alt="해당 이미지에 대한 설명">
</div>
<div class="eventList__text">
<c:if test = "${resultMap.bbsInfo.sjYn eq 'Y'}">
<h4 class="eventList__title"> <%--댓글 수--%>
<c:choose>
<c:when test = "${resultList.secretBbscttAt eq 'Y'}">
비밀글입니다.
</c:when>
<c:otherwise>
<c:out value ="${resultList.sj}"/>
</c:otherwise>
</c:choose>
<c:if test="${resultList.isfiles eq 1}"><%--첨부파일여부--%>
<i class="icon icon_image-badge"></i>
</c:if>
<c:if test="${resultList.newAt eq 'Y'}"><%--새로운게시글여부--%>
<i class="icon icon_new-post"></i>
</c:if>
<c:if test="${resultList.popularAt eq 'Y'}"><%--인기게시글여부--%>
<i class="icon icon_hot-post"></i>
</c:if>
<c:if test="${ resultList.secretBbscttAt eq 'Y' }"><%--비밀글여부--%>
<i class="icon icon_lock"></i>
</c:if>
<c:if test="${resultList.cmtCnt > 0}"><%--댓글개수--%>
(<c:out value="${resultList.cmtCnt}"/>)
</c:if>
</h4>
</c:if>
<div class="eventList__bottom">
<c:if test = "${resultMap.bbsInfo.NtcDeYn eq 'Y'}">
<c:choose>
<c:when test="${resultList.ntcAt eq 'Y' && resultList.ntcPdSetupAt eq 'Y'}">
<p class="eventList__date"><c:out value="${ resultList.ntcBgnDe }"/>~<c:out value="${ resultList.ntcEndDe }"/></p>
</c:when>
<c:when test="${ resultList.ntcAt eq 'Y' && resultList.ntcPdSetupAt eq 'N'}">
<p class="eventList__date">상시공지</p>
</c:when>
</c:choose>
</c:if>
</div>
<ul class="eventList__list">
<c:if test = "${resultMap.bbsInfo.registDtYn eq 'Y'}">
<li><c:out value = '${resultList.sumRegistDt}'/></li>
</c:if>
<c:if test = "${resultMap.bbsInfo.inqireCntYn eq 'Y'}">
<li>조회 <c:out value = '${resultList.inqireCnt}'/></li>
</c:if>
<c:if test="${resultMap.bbsInfo.bbscttEvlUseAt eq 'Y'}"><%--게시글 설정 중 게시글 평가 여부에 따라 노출--%>
<c:choose>
<c:when test="${resultMap.bbsInfo.bbscttEvlRecomendStep eq '01'}"><%--게시글 평가 단계가 추천만 사용할 경우--%>
<li>추천 <c:out value="${resultList.recomendCnt}"/></li>
</c:when>
<c:otherwise><%--게시글 평가 단계가 추천,비추천으로 사용할 경우--%>
<li>추천/비추천 <c:out value="${resultList.recomendCnt}"/>/ <c:out value="${resultList.nonrecomendCnt}"/></li>
</c:otherwise>
</c:choose>
</c:if>
<c:if test="${resultMap.bbsInfo.regusrNmYn eq 'Y'}">
<li>
<c:choose>
<c:when test="${resultList.regusrDvCd eq '99'}">
<c:out value="${ resultList.maskingRegusrNm}"/>[비회원]
</c:when>
<c:when test="${resultList.regusrDvCd eq '03' && not empty resultList.npayBbscttSnb}">
naverpay
</c:when>
<c:when test="${resultList.regusrDvCd eq '02'}">
<c:out value="${ resultList.mngrNm}"/>
</c:when>
<c:when test="${bbsInfo.wrterIndictTyCd eq '01' && resultList.regusrDvCd eq '01'}">
<c:out value="${ resultList.regusrId}"/>
(<c:out value="${ resultList.mbrGradNm}"/>)
</c:when>
<c:when test="${bbsInfo.wrterIndictTyCd eq '02' && resultList.regusrDvCd eq '01'}">
<c:out value="${ resultList.regusrId}"/>
</c:when>
<c:when test="${bbsInfo.wrterIndictTyCd eq '03' && resultList.regusrDvCd eq '01'}">
<c:out value="${ resultList.maskingRegusrNm}"/>(<c:out
value="${ resultList.mbrGradNm}"/>)
</c:when>
<c:when test="${bbsInfo.wrterIndictTyCd eq '04' && resultList.regusrDvCd eq '01'}">
<c:out value="${ resultList.maskingRegusrNm}"/>
</c:when>
<c:when test="${bbsInfo.wrterIndictTyCd eq '05' && resultList.regusrDvCd eq '01'}">
<c:out value="${ resultList.maskingRegusrNm}"/>
(<c:out value="${ resultList.regusrId}"/>,<c:out
value="${ resultList.mbrGradNm}"/>)
</c:when>
<c:when test="${bbsInfo.wrterIndictTyCd eq '06' && resultList.regusrDvCd eq '01'}">
<c:out value="${ resultList.maskingRegusrNm}"/>(<c:out
value="${ resultList.regusrId}"/>)
</c:when>
</c:choose>
</li>
</c:if>
</ul>
</div>
</a>
</div>
</c:forEach>
</c:when>
<c:otherwise>
<div class="eventList__no-result">
<img src="/pc/images/icon__no-result.png"
alt="내역 없음">
<p class="eventList__no-result-text">
<spring:message code="common.nodata"/>
</p>
</div>
</c:otherwise>
</c:choose>
</div>
<input type="hidden" id="pageIndex" name="pageIndex" value="<c:out value = '${bbscttVO.pageIndex}'/>"/>
</html>

View File

@@ -0,0 +1,443 @@
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@ taglib prefix="ui" uri="http://www.winbit.kr/ctl/ui"%>
<%@ taglib prefix="f" uri="/WEB-INF/tlds/f.tld"%>
<%--
Class Name : MyRvwR.jsp
Description : 마이페이지 나의리뷰
Modification Information
수정일 수정자 수정내용
------- -------- ---------------------------
2024-04-11 김혜인 최초 생성
--%>
<!DOCTYPE html>
<html lang="ko">
<head>
<%-- 공통 include --%>
<jsp:include page="/WEB-INF/views/comm/Include.jsp"/>
</head>
<script>
$(document).ready(function () {
// 'sub-tab__trigger' 클래스를 가진 요소가 있는지 확인
$(".sub-tab__btn").eq(0).click(); //클래스 부여 로직 필요
fn_collect_event();
/*사이드바 current 부여*/
$(".cscMenu").each(function(){
if($(this).attr("id") === $("#bbsId").val()){
$(this).addClass("current");
}
});
});
/****************************************************************
이벤트 함수
*****************************************************************/
const fn_collect_event = () => {
//분류 선택
$(".sub-tab__btn").on("click", function () {
let idx = $(this).index();
$(".sub-tab__btn").not($(this)).removeClass("current");
$(this).addClass("current");
fn_select_List(1, idx);
});
//상세 조회
$(document).on("click", ".dtlBtn", function () {
const bbscttInnb = $(this).val();
fn_select_crud_posbl_at(bbscttInnb, '', '', 'R');
});
//검색
$(document).on("click", "#srchBtn", function () {
fn_select_List(1);
});
$(document).on('keydown', '#srchKeyword', function (event) {
if (event.keyCode === 13) {
event.preventDefault();
fn_select_List(1);
}
});
// 페이지가 로드될 때 초기 값을 설정
let initialValue = 0;
$('#valueDisplay').val(initialValue);
// 새로고침 이벤트 감지
$(window).on('beforeunload', function () {
$("#srchKeyword").val("");
});
// F5 키(새로고침) 이벤트 감지
$(document).keydown(function (event) {
if (event.keyCode == 116) {
$("#srchKeyword").val("");
}
});
//비밀번호 확인
$("#pwChkBtn").on("click", function () {
const password = $("#modalPw").val();
const bbscttInnb = $("#modalBbscttInnb").val();
const idx = $("#modalIdx").val();
const answAt = $("modalAnswAt").val();
fn_check_password(bbscttInnb, password, idx, answAt);
});
//초기 세팅
let pageIndex = '<c:out value="${ resultMap.bbsctt.pageIndex }"/>';
fn_select_List(pageIndex, 0);
}
//crud 가능 판단
const fn_select_crud_posbl_at = (bbsctt, idx, pwCnfirmAt, crudDv) => {
$.ajax({
type: 'post',
url: '<c:url value="/sopmal/csc/selectBbscttDtlMovePosblAt"/>',
data: {
"bbscttInnb": bbsctt,
"bbsId": $("#bbsId").val(),
"sknTyCd": $("#sknTyCd").val(),
"pwCnfirmAt": pwCnfirmAt,
"crudDv": crudDv
},
success: function (data) {
data = JSON.parse(data.resBody.result);
fn_branch_bbsctt_posble(data, idx);
}
});
}
//상세보기 가능 판단 여부에 따른 분기 처리
const fn_branch_bbsctt_posble = (data, idx) => {
const moveAt = data.result.moveAt;
const vo = data.vo;
if (moveAt === 'YES' || vo.pwCnfirmAt === 'Y') {//본인 o
if (vo.crudDv === 'R') {
if ($("#sknTyCd").val() === '03') {
fn_select_cn(vo.bbscttInnb, idx);
} else {
fn_move_dtl(vo.bbscttInnb);
}
}
} else if (moveAt === 'OTHER') {//다른이용자 o
$("#comment-update-pop").modal();
} else if (moveAt === 'LOGIN') {//로그인 o
$("#rejectLogin").modal();
} else {//비밀번호
$("#confirm_bbsctt_pw").modal();
$("#modalBbscttInnb").val(vo.bbscttInnb);
$("#modalIdx").val(idx);
$("#modalCrudDv").val(vo.crudDv);
}
}
//리스트 조회
const fn_select_List = (pageIndex, idx) => {
const sknTyCd = $("#sknTyCd").val();
const bbsTyCd = $("#bbsTyCd").val();
let url;
if (!pageIndex) {
$('#pageIndex').val(1);
} else {
$('#pageIndex').val(pageIndex);
}
if (bbsTyCd === '01') {
//일반게시글 스킨타입
if (sknTyCd === '01') {
url = '/sopmal/csc/selectCscListTy';//리스트
} else if (sknTyCd === '02') {
url = '/sopmal/csc/selectCscGalaryTy';//갤러리
} else {
url = '/sopmal/csc/selectCscAcordionTy';//아코디언
}
} else if (bbsTyCd === '02') {
url = '/sopmal/csc/selectNoticeListInqire'//공지사항
} else if (bbsTyCd === '04') {
url = '/sopmal/csc/selectFaqListInqire'//FAQ
}
let srchForm = $("#srchForm").serialize()+"&pageIndex="+pageIndex+"&useAt=Y&expsrAt=Y";
let itmInnb;
//분류 조회
if (idx !== 0 && idx !== undefined) { //분류 클릭
itmInnb = $(".sub-tab__btn").eq(idx).val();
srchForm = srchForm + "&srchitmInnb=" + itmInnb ;
} else {
if ($(".sub-tab__btn.current").index() > 0) { //검색어
srchForm = srchForm+"&srchitmInnb="+$(".sub-tab__btn.current").val();
}
}
$.ajax({
type: "post",
data: srchForm,
url: url,
success: function (data) {
if ($(".contentDiv").html()) {
$(".contentDiv").empty();
}
if($(".sub-tab__trigger").length>0){
$(".sub-tab__content.current").find(".contentDiv").html(data);
}else{
$(".contentDiv").html(data);
}
if (sknTyCd === '03') {
fn_arccodian_event();
}
}
});
}
//상세조회
const fn_move_dtl = (bbscttInnb) => {
const hiddenForm = $("#hiddenForm");
if (hiddenForm.length > 0) {
hiddenForm.remove();
}
const form = document.createElement("form");
form.id = "dtlForm";
form.action = "/sopmal/csc/selectBbscttAuth";
form.method = "GET";
let pageIndex = $("#pageIndex").val();
if (pageIndex === '') {
pageIndex = "1";
}
fn_create_input("pageIndex", pageIndex, form);
fn_create_input("bbscttInnb", bbscttInnb, form);
fn_create_input("bbsTyCd", $("#bbsTyCd").val(), form);
fn_create_input("bbsId", $("#bbsId").val(), form);
fn_create_input("srchKeyword", $("#srchKeyword").val(), form);
fn_create_input("srchDv", $("#srchDv").val(), form);
fn_create_input("useAt", "Y", form);
fn_create_input("expsrAt", "Y", form);
fn_create_input("reqUrl", "csc", form);
fn_create_input("prevNext",$("#prevNext").val(), form);
fn_create_input("recomendGoodsExpsrAt",$("#recomendGoodsExpsrAt").val(), form);
fn_create_input("authDv", "CM", form);
let pageUnit = '';
//페이지 유닛 계산
const pgeVtcCnt = $("#pgeVtcCnt").val();//ROW
const pgeWthCnt = $("#pgeWthCnt").val();//COL
pageUnit = pgeVtcCnt * pgeWthCnt;
if (pgeWthCnt === '') {
pageUnit = 10;
}
//현재 항목고유번호
const itmInnbIdx = $(".sub-tab__btn.current").index();
const itmVal = $(".sub-tab__btn").eq(itmInnbIdx).val();
if (itmVal !== undefined) {
fn_create_input("itmInnb", itmVal, form);
}
fn_create_input("pageUnit", pageUnit, form);
document.body.appendChild(form);
form.submit();
}
//input 생성 함수
const fn_create_input = (name, value, tgtForm) => {
const input = document.createElement('input');
input.setAttribute("type", "hidden");
input.setAttribute("name", name);
input.setAttribute("value", value);
tgtForm.appendChild(input);
}
//아코디언형 이벤트
const fn_arccodian_event = () => {
// 테이블 행 열기/닫기
var trFoldableTrigger = $(".tr-foldable-trigger");
var trFoldable = $(".tr-foldable");
trFoldableTrigger.on("click", function () {
trFoldable.not($(this).next()).removeClass("active");
$(this).next().toggleClass("active");
});
trFoldableTrigger.on("click", function () {
let idx = $(".tr-foldable-trigger").index(this);
let bbscttInnb = $(this).find("[name='bbscttInnb']").val();
//닫혀 있을 때만
if($(this).next().hasClass("active")){
fn_select_cn(bbscttInnb, idx);
}
});
}
//아코디언형 내용 조회
const fn_select_cn = (bbscttInnb, idx) => {
const bbsId = $("#bbsId").val();
$.ajax({
type: "post",
data: {
bbscttInnb: bbscttInnb
,bbsId: bbsId
},
url: '/sopmal/csc/selectBbscttCn',
success: function (data) {
const result = JSON.parse(data.resBody.result);
var trFoldableCntent = $(".tr-foldable__content");
trFoldableCntent.eq(idx).html(result.cn);
}
});
}
/********************************************************************
* 비밀번호 확인 (조회)
* success시
* 갤러리형,리스트형 : 상세 이동
* 아코디언형 : 해당 내용 노출
********************************************************************/
const fn_check_password = (bbscttInnb, password, idx, answAt) => {
if (password === '') {
alert("비밀번호를 입력해주세요");
} else {
$.ajax({
type: 'post',
url: '<c:url value="/sopmal/csc/selectBbscttComparPassword"/>',
data: {
"bbscttInnb": bbscttInnb,
"password": password
},
success: function (data) {
const result = JSON.parse(data.resBody.result);
const sknTyCd = $("#sknTyCd").val();
/*비밀번호 확인 결과*/
const resultVal = result["pw"];
if (resultVal > 0) {
if (sknTyCd == '01' || sknTyCd == '02') {
fn_move_dtl(bbscttInnb, answAt);
} else {
const trFoldableTrigger = $(".tr-foldable-trigger").eq(idx);
$(".tr-foldable").not(trFoldableTrigger.next()).removeClass("active");
trFoldableTrigger.next().toggleClass("active");
const cnHtml = trFoldableTrigger.next(".tr-foldable").find(".hiddenCn").val();
trFoldableTrigger.next(".tr-foldable").find(".cn").html(cnHtml);
}
} else {
openModal("failPwMatch");
}
/*모달 내 값 초기화*/
$("#modalPw").val("");
$("#modalBbscttInnb").val("");
$("#closeBtn").click();
}
});
}
}
</script>
<body>
<%-- 공통 Header --%>
<jsp:include page="/WEB-INF/views/comm/Header.jsp"/>
<!-- 메인 컨텐츠 영역 -->
<main>
<%--게시판 정보--%>
<c:set var="bbsInfo" value="${resultMap.bbsInfo}"/>
<%--분류 목록--%>
<c:set var="itmList" value="${resultMap.itmList}"/>
<%--vo--%>
<c:set var="bbscttVO" value="${resultMap.bbsctt}"/>
<div class="sub-wrapper">
<div class="sub-content">
<div class="sub-rl">
<jsp:include page="/WEB-INF/views/comm/csc/CscLeft.jsp"/>
<div class="sub-right-content">
<h3 class="sub-right-content__title" id = "bbsNm"><c:out value="${bbsInfo.bbsNm}"/></h3>
<form id="srchForm">
<%--게시판 정보--%>
<input type="hidden" name="bbsId" id = "bbsId" value = "<c:out value="${bbsInfo.bbsId}"/>">
<input type="hidden" name="sknTyCd" id = "sknTyCd" value = "<c:out value="${bbsInfo.sknTyCd}"/>">
<input type="hidden" name="bbsTyCd" id = "bbsTyCd" value = "<c:out value="${bbsInfo.bbsTyCd}"/>">
<input type="hidden" name="srchDv" id = "srchDv" value="any" >
<input type="hidden" name="pgeVtcCnt" id = "pgeVtcCnt" value = "<c:out value="${bbsInfo.pgeVtcCnt}"/>">
<input type="hidden" name="pgeWthCnt" id = "pgeWthCnt" value = "<c:out value="${bbsInfo.pgeWthCnt}"/>">
<input type="hidden" name="prevNext" id = "prevNext" value = "<c:out value="${bbsInfo.prevNext}"/>">
<input type="hidden" name="regusrDvCd" id = "regusrDvCd" value = "<c:out value="${bbscttVO.regusrDvCd}"/>">
<input type="hidden" name="slangFlterUseAt" id = "slangFlterUseAt" value = "<c:out value="${bbsInfo.slangFlterUseAt}"/>">
<input type="hidden" id = "valueDisplay">
<div class="customer-search">
<div class="customer-search__row">
<input class="input-text customer-search__search" type="search" title="검색어 입력"
id ="srchKeyword" name="srchKeyword" placeholder="궁금하신 내용을 입력해 주세요" value="${bbscttVO.srchKeyword}">
<button type="button" class="btn md dark" id = "srchBtn">검색</button>
</div>
</div>
</form>
<c:choose>
<c:when test="${not empty itmList}">
<div class="sub-tab">
<div class="sub-tab__trigger">
<button class="sub-tab__btn current">전체</button>
<c:forEach var="item" items="${itmList}">
<button class="sub-tab__btn" value="<c:out value="${item.itmInnb}"/>"><c:out value="${item.itmCn}"/></button>
</c:forEach>
</div>
<c:forEach var="i" begin="0" end="${fn:length(itmList)}">
<div class="sub-tab__content">
<div class="contentDiv"></div>
</div>
</c:forEach>
</div>
</c:when>
<c:otherwise>
<div class="contentDiv"></div>
</c:otherwise>
</c:choose>
</div>
</div>
</div>
</div>
<div id = "moveForm"></div>
</main>
<%-- 공통 Footer --%>
<jsp:include page="/WEB-INF/views/comm/Footer.jsp"/>
</body>
<%--비밀번호 확인 모달--%>
<div id="confirm_bbsctt_pw" class="modal alert">
<div class="alert-content">
<p class="alert-content__text--sm">
등록시에 입력했던 비밀번호를 입력해 주세요
</p>
<input class="input-text alert-content__pwInput" type="password" title="비밀번호 입력" placeholder="비밀번호 입력" name="password" id = "modalPw">
<input type="hidden" name="bbscttInnb" id = "modalBbscttInnb">
<input type="hidden" id = "modalIdx">
<input type="hidden" id = "modalAnswAt">
<input type="hidden" id = "reqAction">
<input type="hidden" id="modalcrudDv">
</div>
<div class="alert-btn-container">
<a href="#" rel="modal:close" class="alert-btn alert-btn--cancel" id = "closeBtn">취소</a>
<button type = "button" class="alert-btn alert-btn--confirm" id="pwChkBtn">확인</button>
</div>
</div>
<%--이용자가 회원인데 작성자와 다를 시--%>
<div id="comment-update-pop" class="modal alert">
<div class="alert-content">
<p class="alert-content__text--sm">
글작성자만 이용가능합니다.
</p>
</div>
<div class="alert-btn-container">
<a href="#" rel="modal:close" class="alert-btn alert-btn--confirm">확인</a>
</div>
</div>
<%--이용자가 로그인 상태가 아닐 때--%>
<div id="rejectLogin" class="modal alert">
<div class="alert-content">
<p class="alert-content__text--sm">
이용하시려면 로그인이 필요합니다!
<br>
로그인하시겠습니까?
</p>
</div>
<div class="alert-btn-container">
<a class="alert-btn alert-btn--confirm" onclick = "fn_move_login()"><spring:message code="button.yes"/></a>
<a href="#" rel="modal:close" class="alert-btn"><spring:message code="button.no"/></a>
</div>
</div>
</html>

View File

@@ -0,0 +1,306 @@
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="ui" uri="http://www.winbit.kr/ctl/ui" %>
<%@ taglib prefix="f" uri="/WEB-INF/tlds/f.tld" %>
<%--
Class Name : CscListTyR.jsp
Description : 리스트형 목록.jsp
Modification Information
수정일 수정자 수정내용
------- -------- ---------------------------
2024-04-18 김혜인 최초 생성
--%>
<!DOCTYPE html>
<html lang="ko">
<c:set var="bbsInfo" value="${resultMap.bbsInfo}"/>
<c:set var="bbscttVO" value="${resultMap.bbsctt}"/>
<form class="contentForm">
<div class="form-control-container">
<div class="left">
<div class="search-number">
<span class="search-number__text">총 <strong><c:out
value="${ resultMap.paginationInfo.totalRecordCount }"/></strong>건</span>
</div>
</div>
<div class="center">
</div>
<div class="right">
</div>
</div>
<div class="table-wrapper">
<table class="table vertical">
<caption>게시글 목록</caption>
<!-- 각 열 width 설정 -->
<colgroup>
<c:if test="${bbsInfo.innbYn eq 'Y'}">
<col style="width: 80px;">
</c:if>
<c:if test="${bbsInfo.sjYn eq 'Y'}">
<col style="width: auto;">
</c:if>
<c:if test="${bbsInfo.cnYn eq 'Y'}">
<col style="width: 23%;">
</c:if>
<c:if test="${bbsInfo.ntcDeYn eq 'Y'}">
<col style="width: 10%;">
</c:if>
<c:if test="${bbsInfo.regusrNmYn eq 'Y'}">
<col style="width: 10%">
</c:if>
<c:if test="${bbsInfo.inqireCntYn eq 'Y'}">
<col style="width: 10%">
</c:if>
<c:if test="${bbsInfo.registDtYn eq 'Y'}">
<col style="width: 10%">
</c:if>
</colgroup>
<thead>
<tr>
<c:if test="${bbsInfo.innbYn eq 'Y'}">
<th>번호</th>
</c:if>
<c:if test="${bbsInfo.sjYn eq 'Y'}">
<th>제목</th>
</c:if>
<c:if test="${bbsInfo.cnYn eq 'Y'}">
<th>내용</th>
</c:if>
<c:if test="${bbsInfo.ntcDeYn eq 'Y'}">
<th>공지기간</th>
</c:if>
<c:if test="${bbsInfo.regusrNmYn eq 'Y'}">
<th>작성자</th>
</c:if>
<c:if test="${bbsInfo.inqireCntYn eq 'Y'}">
<th>조회수</th>
</c:if>
<c:if test="${bbsInfo.registDtYn eq 'Y'}">
<th>등록일</th>
</c:if>
</tr>
</thead>
<tbody>
<c:choose>
<c:when test="${ not empty resultMap.resultList.resultList }">
<c:forEach var="resultList" items="${resultMap.resultList.resultList}" varStatus="status">
<tr>
<input type="hidden" name="bbscttInnb" value="${resultList.bbscttInnb}">
<c:if test="${bbsInfo.innbYn eq 'Y'}">
<td>
<c:choose>
<c:when test="${resultList.ntcAt eq 'Y'}">
<i class="icon icon_notice-fixed"></i>
</c:when>
<c:otherwise>
<c:out value="${resultList.rnum}"/>
</c:otherwise>
</c:choose>
</td>
</c:if>
<c:if test="${bbsInfo.sjYn eq 'Y'}">
<td class="text-left">
<a class="eclipsis dtlBtn" style="cursor:pointer;">
<input type="hidden" class="passwordAt" value="<c:if test = "${resultList.secretBbscttAt eq 'Y'}">Y</c:if>">
<input type="hidden" class="regusr" value="<c:out value="${ resultList.regusr}"/>">
<input type="hidden" class="bbscttInnb" value="<c:out value="${ resultList.bbscttInnb }"/>">
<input type="hidden" class="regusrDvCd" value="<c:out value="${ resultList.regusrDvCd }"/>">
<c:choose>
<c:when test="${resultList.secretBbscttAt eq 'Y'}">
<c:choose>
<c:when test = "${resultList.regusrDvCd ne '02'}">
<c:if test="${not empty resultList.answCn}">
<span class="customer-name">
[<c:out value="${ resultList.answCn }"/>]
</span>
</c:if>
<span>${ resultList.maskingRegusrNm}</span>님의 ${bbsInfo.bbsNm}
</c:when>
<c:otherwise>
비밀글입니다.
</c:otherwise>
</c:choose>
</c:when>
<c:otherwise>
<c:if test="${not empty resultList.answCn}">
<span class="customer-name">
[<c:out value="${ resultList.answCn }"/>]
</span>
</c:if>
<c:out value ="${resultList.sj}"/>
</c:otherwise>
</c:choose>
<c:if test="${resultList.isfiles eq 1}"><%--첨부파일여부--%>
<i class="icon icon_image-badge"></i>
</c:if>
<c:if test="${resultList.newAt eq 'Y'}"><%--새로운게시글여부--%>
<i class="icon icon_new-post"></i>
</c:if>
<c:if test="${resultList.popularAt eq 'Y'}"><%--인기게시글여부--%>
<i class="icon icon_hot-post"></i>
</c:if>
<c:if test="${ resultList.secretBbscttAt eq 'Y' }"><%--비밀글여부--%>
<i class="icon icon_lock"></i>
</c:if>
<c:if test="${resultList.cmtCnt > 0}"><%--댓글개수--%>
(<c:out value="${resultList.cmtCnt}"/>)
</c:if>
</a>
</td>
</c:if>
<c:if test="${bbsInfo.cnYn eq 'Y'}">
<td class="text-left">
<span>
<c:choose><%--내용이 리스트 항목 일 때 비밀글 여부에 따른 분기 처리--%>
<c:when test="${resultList.secretBbscttAt eq 'Y'}">
비밀글 입니다.
</c:when>
<c:otherwise>
<c:set var="cn" value="${resultList.cn}" />
<c:choose><%--내용이 20자 이상일 때 내용 추림--%>
<c:when test="${fn:length(cn) > 20}">
${fn:substring(cn, 0, 20)}...
</c:when>
<c:otherwise>
<c:out value="${cn}"/>
</c:otherwise>
</c:choose>
</c:otherwise>
</c:choose>
</span>
</td>
</c:if>
<c:if test="${bbsInfo.ntcDeYn eq 'Y'}">
<td>
<c:choose>
<c:when test="${resultList.expsrAt eq 'Y' && resultList.ntcePdSetupAt eq 'Y'}">
<span class="board-date"><c:out value="${ resultList.ntcBgnDe }"/> ~ <c:out value="${ resultList.ntcEndDe }"/></span>
</c:when>
<c:when test="${ resultList.expsrAt eq 'Y' && resultList.ntcePdSetupAt eq 'N'}">
<p class="eventList__date">상시공지</p>
</c:when>
</c:choose>
</td>
</c:if>
<c:if test="${bbsInfo.regusrNmYn eq 'Y'}">
<td>
<span class="customer-name">
<c:choose>
<c:when test="${resultList.regusrDvCd eq '99'}">
<c:out value="${ resultList.maskingRegusrNm}"/>[비회원]
</c:when>
<c:when test="${resultList.regusrDvCd eq '03'&& not empty resultList.npayBbscttSnb}">
naverpay
</c:when>
<c:when test="${resultList.regusrDvCd eq '02'}">
<c:out value="${ resultList.mngrNm}"/>
</c:when>
<c:when test="${bbsInfo.wrterIndictTyCd eq '01' && resultList.regusrDvCd eq '01'}">
<c:out value="${ resultList.regusrId}"/>
(<c:out value="${ resultList.mbrGradNm}"/>)
</c:when>
<c:when test="${bbsInfo.wrterIndictTyCd eq '02' && resultList.regusrDvCd eq '01'}">
<c:out value="${ resultList.regusrId}"/>
</c:when>
<c:when test="${bbsInfo.wrterIndictTyCd eq '03' && resultList.regusrDvCd eq '01'}">
<c:out value="${ resultList.maskingRegusrNm}"/>(<c:out
value="${ resultList.mbrGradNm}"/>)
</c:when>
<c:when test="${bbsInfo.wrterIndictTyCd eq '04' && resultList.regusrDvCd eq '01'}">
<c:out value="${ resultList.maskingRegusrNm}"/>
</c:when>
<c:when test="${bbsInfo.wrterIndictTyCd eq '05' && resultList.regusrDvCd eq '01'}">
<c:out value="${ resultList.maskingRegusrNm}"/>
(<c:out value="${ resultList.regusrId}"/>,<c:out
value="${ resultList.mbrGradNm}"/>)
</c:when>
<c:when test="${bbsInfo.wrterIndictTyCd eq '06' && resultList.regusrDvCd eq '01'}">
<c:out value="${ resultList.maskingRegusrNm}"/>(<c:out
value="${ resultList.regusrId}"/>)
</c:when>
</c:choose>
</span>
</td>
</c:if>
<c:if test="${bbsInfo.inqireCntYn eq 'Y'}">
<td><span class="customer-name"><c:out value="${ resultList.inqireCnt}"/></span></td>
</c:if>
<c:if test="${bbsInfo.registDtYn eq 'Y'}">
<td><span class="customer-name"><c:out value="${ resultList.sumRegistDt }"/></span></td>
</c:if>
</tr>
<c:if test="${bbsInfo.answRegist eq 'Y'}">
<c:if test="${not empty resultList.answBbscttInnb}">
<tr>
<c:if test="${bbsInfo.innbYn eq 'Y'}">
<td></td>
</c:if>
<c:if test="${bbsInfo.sjYn eq 'Y'}">
<td class="text-left">
<a type="button" class="ellipsis dtlBtn" style="cursor:pointer;">
<input type="hidden" class="passwordAt" value="<c:if test = "${resultList.secretBbscttAt eq 'Y'}">Y</c:if>">
<input type="hidden" class="regusr" value="<c:out value="${ resultList.regusr}"/>">
<input type="hidden" class="bbscttInnb" value="<c:out value="${ resultList.bbscttInnb }"/>">
<input type="hidden" class="regusrDvCd" value="<c:out value="${ resultList.regusrDvCd }"/>">
<i class="icon icon_reply"></i> <c:out value="${ resultList.maskingRegusrNm}"/>님의 소중한 문의입니다.
<c:if test="${resultList.newAt eq 'Y'}">
<i class="icon icon_new-post"></i>
</c:if>
<c:if test="${ resultList.secretBbscttAt eq 'Y' }">
<i class="icon icon_lock"></i>
</c:if>
</a>
</td>
</c:if>
<c:if test="${bbsInfo.cnYn eq 'Y'}">
<td></td>
</c:if>
<c:if test="${bbsInfo.ntcDeYn eq 'Y'}">
<td></td>
</c:if>
<c:if test="${bbsInfo.regusrNmYn eq 'Y'}">
<td><span class="board-date"><c:out
value="${resultList.mngrNm}"/></span></td>
</c:if>
<c:if test="${bbsInfo.inqireCntYn eq 'Y'}">
<td></td>
</c:if>
<c:if test="${bbsInfo.registDtYn eq 'Y'}">
<td><span class="board-date"><c:out value="${ resultList.sumAnswRegistDt}"/></span></td>
</c:if>
</tr>
</c:if>
</c:if>
</c:forEach>
</c:when>
<c:otherwise>
<tr>
<td colspan="100%">
<div class="table__no-result">
<img src="/pc/images/icon__no-result.png" alt="조회 내역 없음">
<p class="table__no-result-text">
<spring:message code="common.nodata"/>
</p>
</div>
</td>
</tr>
</c:otherwise>
</c:choose>
</tbody>
</table>
<c:if test = "${bbsInfo.bbscttRegist eq 'Y'}">
<div class="sub-board__top-btn-container">
<button type = "button" class="btn outline theme" id = "regBtn"><spring:message code="button.insert"/></button>
</div>
</c:if>
</div>
<input type="hidden" name="pageIndex" id="pageIndex" value="<c:out value = "${bbscttVO.pageIndex}"/>">
<div class="pagination__container">
<ui:pagination paginationInfo="${resultMap.paginationInfo}" type="image" jsFunction="fn_select_List"/>
</div>
</form>
</html>

View File

@@ -0,0 +1,112 @@
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@ taglib prefix="ui" uri="http://www.winbit.kr/ctl/ui"%>
<%@ taglib prefix="f" uri="/WEB-INF/tlds/f.tld"%>
<%--
Class Name : EvtListR.jsp
Description : 이벤트 목록
Modification Information
수정일 수정자 수정내용
------- -------- ---------------------------
2024-04-30 김혜인 최초 생성
--%>
<!DOCTYPE html>
<html lang="ko">
<c:set var = "bbscttVO" value = "${resultMap.bbsctt}"/>
<div class="eventList col-<c:out value ='${bbscttVO.pgeWthCnt}'/>">
<c:choose>
<c:when test="${ not empty resultMap.resultList.resultList }">
<c:forEach var="resultList" items="${ resultMap.resultList.resultList}">
<div class="eventList__item">
<a class="dtlBtn" style="cursor:pointer;">
<input type = "hidden" class ="bbscttInnb" value="<c:out value="${ resultList.bbscttInnb }"/>">
<div class="eventList__image">
<spring:eval expression="@environment.getProperty('sopmalfo.common.fileupload.cdnurl')" var="cdnurl"/>
<img src="${cdnurl}<c:out value ="${resultList.reprsntImgSysFilNm}"/>"
onerror = "javascript:img=new Image();img.src='/pc/images/image_placeholder.png';if(img.complete){this.src='/pc/images/image_placeholder.png'} else{this.style.display='none';}"
alt="해당 이미지에 대한 설명">
</div>
<div class="eventList__text">
<h4 class="eventList__title">
<c:out value ="${resultList.sj}" escapeXml="false"/>
<c:if test="${resultList.isfiles eq 1}"><%--첨부파일여부--%>
<i class="icon icon_image-badge"></i>
</c:if>
<c:if test="${resultList.newAt eq 'Y'}"><%--새로운게시글여부--%>
<i class="icon icon_new-post"></i>
</c:if>
<c:if test="${resultList.popularAt eq 'Y'}"><%--인기게시글여부--%>
<i class="icon icon_hot-post"></i>
</c:if>
<c:if test="${ resultList.secretBbscttAt eq 'Y' }"><%--비밀글여부--%>
<i class="icon icon_lock"></i>
</c:if>
<c:if test="${resultList.cmtCnt > 0}"><%--댓글개수--%>
(<fmt:formatNumber value="${resultList.cmtCnt}" pattern="#,###"/>)
</c:if>
</h4>
<div class="eventList__bottom">
<%--디데이 표시--%>
<span class="eventList__dDay">
<c:choose>
<c:when test="${resultList.expsrAt eq 'Y' && resultList.ntcePdSetupAt eq 'Y'}">
<c:choose>
<c:when test="${ resultList.dDay < 0}">종료</c:when>
<c:otherwise>D-<c:out value="${ resultList.dDay }"/></c:otherwise>
</c:choose>
</c:when>
<c:when test="${ resultList.expsrAt eq 'Y' && resultList.ntcePdSetupAt eq 'N'}">
상시
</c:when>
</c:choose>
</span>
<c:choose>
<c:when test="${resultList.expsrAt eq 'Y' && resultList.ntcePdSetupAt eq 'Y'}"><%--노출기간이 있는경우--%>
<p class="eventList__date">
<c:out value="${ resultList.ntceBgnDe }"/>~<c:out value="${ resultList.ntceEndDe }"/>
</p>
</c:when>
<c:when test="${ resultList.expsrAt eq 'Y' && resultList.ntcePdSetupAt eq 'N'}">
<p class="eventList__date"><c:out value="${ resultList.sumRegistDt }"/>~상시진행</p>
</c:when>
</c:choose>
</div>
<ul class="eventList__list">
<li><c:out value="${resultList.sumRegistDt}"/></li><%--등록일--%>
<li>조회 <fmt:formatNumber value="${resultList.inqireCnt}" pattern="#,###"/></li><%--조회수--%>
<c:if test="${bbsInfo.bbscttEvlUseAt eq 'Y'}"><%--게시글 설정 중 게시글 평가 여부에 따라 노출--%>
<c:choose>
<c:when test="${bbsInfo.bbscttEvlRecomendStep eq '01'}"><%--게시글 평가 단계가 추천만 사용할 경우--%>
<li>추천 <fmt:formatNumber value="${resultList.recomendCnt}" pattern="#,###"/></li>
</c:when>
<c:otherwise><%--게시글 평가 단계가 추천,비추천으로 사용할 경우--%>
<li>추천/비추천 <fmt:formatNumber value="${resultList.recomendCnt}" pattern="#,###"/>/<fmt:formatNumber value="${resultList.nonrecomendCnt}" pattern="#,###"/></li>
</c:otherwise>
</c:choose>
</c:if>
<li><c:out value="${resultList.mngrNm}"/></li><%--관리자명--%>
</ul>
</div>
</a>
</div>
</c:forEach>
</c:when>
<c:otherwise>
<div class="eventList__no-result">
<img src="/pc/images/icon__no-result.png" alt="내역 없음">
<p class="eventList__no-result-text">
<spring:message code="common.nodata"/>
</p>
</div>
</c:otherwise>
</c:choose>
</div>
<input type="hidden" id="pageIndex" name="pageIndex" value="<c:out value = '${bbscttVO.pageIndex}'/>"/>
<div class="pagination__container">
<ui:pagination paginationInfo="${resultMap.paginationInfo}" type="image" jsFunction="fn_select_List"/>
</div>
</html>

View File

@@ -0,0 +1,100 @@
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@ taglib prefix="ui" uri="http://www.winbit.kr/ctl/ui"%>
<%@ taglib prefix="f" uri="/WEB-INF/tlds/f.tld"%>
<%--
Class Name : EvtListR.jsp
Description : 이벤트 목록
Modification Information
수정일 수정자 수정내용
------- -------- ---------------------------
2024-04-30 김혜인 최초 생성
--%>
<!DOCTYPE html>
<c:set var = "bbscttVO" value = "${resultMap.bbsctt}"/>
<html lang="ko">
<div class="eventWinnerList">
<div class="customer-search">
<div class="customer-search__row justify-start">
<div class="customer-search__controls">
<input class="input-text customer-search__search" type="search" title="검색어 입력"
name="srchKeyword" id="srchKeyword"
placeholder="제목, 내용" value="${bbscttVO.srchKeyword}">
<input type="hidden" name="srchDv" value="any" id="srchDv">
</div>
<button class="btn md dark" id="srchBtn">검색</button>
</div>
</div>
<div class="table-wrapper">
<table class="table vertical">
<caption>당첨자발표리스트</caption>
<!-- 각 열 width 설정 -->
<colgroup>
<col style="width: auto;">
<col style="width: 15%;">
</colgroup>
<thead>
<tr>
<th>제목</th>
<th>등록일</th>
</tr>
</thead>
<tbody>
<c:choose>
<c:when test="${ not empty resultMap.resultList.resultList }">
<c:forEach var="resultList" items="${ resultMap.resultList.resultList}">
<tr>
<td class="text-left">
<a class="table__board-title dtlBtn" style="cursor:pointer;">
<input type="hidden" class="bbscttInnb" value="<c:out value="${ resultList.bbscttInnb }"/>">
<span class="table__badge table__badge--event">이벤트</span>
<c:out value ="${resultList.sj}" escapeXml="false"/>
<c:if test="${resultList.isfiles eq 1}"><%--첨부파일여부--%>
<i class="icon icon_image-badge"></i>
</c:if>
<c:if test="${resultList.newAt eq 'Y'}"><%--새로운게시글여부--%>
<i class="icon icon_new-post"></i>
</c:if>
<c:if test="${resultList.popularAt eq 'Y'}"><%--인기게시글여부--%>
<i class="icon icon_hot-post"></i>
</c:if>
<c:if test="${ resultList.secretBbscttAt eq 'Y' }"><%--비밀글여부--%>
<i class="icon icon_lock"></i>
</c:if>
<c:if test="${resultList.cmtCnt > 0}"><%--댓글개수--%>
(<c:out value="${resultList.cmtCnt}"/>)
</c:if>
</a>
</td>
<td><span class="board-date"><c:out value="${resultList.sumRegistDt}"/></span></td>
</tr>
</c:forEach>
</c:when>
<c:otherwise>
<tr>
<td colspan="2">
<div class="table__no-result">
<img src="/pc/images/icon__no-result.png" alt="">
<p class="table__no-result-text">
<spring:message code="common.nodata"/>
</p>
</div>
</td>
</tr>
</c:otherwise>
</c:choose>
</tbody>
</table>
</div>
<input type="hidden" id="pageIndex" name="pageIndex"
value="<c:out value = '${bbscttVO.pageIndex}'/>"/>
<div class="pagination__container">
<ui:pagination paginationInfo="${resultMap.paginationInfo}" type="image"
jsFunction="fn_select_List"/>
</div>
</div>
</html>

View File

@@ -0,0 +1,91 @@
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="ui" uri="http://www.winbit.kr/ctl/ui" %>
<%@ taglib prefix="f" uri="/WEB-INF/tlds/f.tld" %>
<%--
Class Name : FaqListR.jsp
Description : 자주묻는질문 목록.jsp
Modification Information
수정일 수정자 수정내용
------- -------- ---------------------------
2024-04-18 김혜인 최초 생성
--%>
<!DOCTYPE html>
<html lang="ko">
<div class="form-control-container">
<div class="left">
<div class="search-number">
<span class="search-number__text">총 <strong><c:out value="${ resultMap.paginationInfo.totalRecordCount }"/></strong>건</span>
</div>
</div>
<div class="center">
</div>
<div class="right">
</div>
</div>
<div class="table-wrapper">
<table class="table vertical">
<caption>해당 테이블에 대한 설명</caption>
<!-- 각 열 width 설정 -->
<colgroup>
<col style="width: 120px;">
<col style="width: auto;">
</colgroup>
<thead>
<tr>
<th>구분</th>
<th><c:out value = "${resultMap.bbsInfo.questionSj}"/></th>
</tr>
</thead>
<tbody>
<c:choose>
<c:when test = "${ not empty resultMap.resultList.resultList }">
<c:forEach var="resultList" items="${ resultMap.resultList.resultList}">
<tr class="tr-foldable-trigger">
<td>
<span class="board-number">
<c:out value="${resultList.answCn}" />
</span>
<input type = "hidden" name = "bbscttInnb" value = "${resultList.bbscttInnb}"/>
</td>
<td class="text-left">
<div class="table__board-title">
<p class="ellipsis">
<c:out value="${resultList.sj}" escapeXml="false"/>
</p>
</div>
</td>
</tr>
<tr class="tr-foldable">
<td colspan="2">
<div class="tr-foldable__content ck-content">
</div>
</td>
</tr>
</c:forEach>
</c:when>
<c:otherwise>
<tr>
<td colspan="2">
<div class="table__no-result">
<img src="/pc/images/icon__no-result.png" alt="">
<p class="table__no-result-text">
<spring:message code="common.nodata"/>
</p>
</div>
</td>
</tr>
</c:otherwise>
</c:choose>
</tbody>
</table>
</div>
<input type="hidden" id="pageIndex" name="pageIndex" value="1" />
<div class="pagination__container">
<ui:pagination paginationInfo="${resultMap.paginationInfo}" type="image" jsFunction="fn_select_List" />
</div>
</html>

View File

@@ -0,0 +1,87 @@
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="ui" uri="http://www.winbit.kr/ctl/ui" %>
<%@ taglib prefix="f" uri="/WEB-INF/tlds/f.tld" %>
<%--
Class Name : EvtListR.jsp
Description : 이벤트 목록
Modification Information
수정일 수정자 수정내용
------- -------- ---------------------------
2024-04-30 김혜인 최초 생성
--%>
<!DOCTYPE html>
<html lang="ko">
<c:set var="bbscttVO" value="${resultMap.bbsctt}"/>
<div class="eventList col-<c:out value ='${bbscttVO.pgeWthCnt}'/>">
<c:choose>
<c:when test="${ not empty resultMap.resultList.resultList }">
<c:forEach var="resultList" items="${ resultMap.resultList.resultList}">
<div class="eventList__item">
<a class="dtlBtn" style="cursor:pointer;">
<input type = "hidden" class ="bbscttInnb" value="<c:out value="${ resultList.bbscttInnb }"/>">
<div class="eventList__image">
<spring:eval expression="@environment.getProperty('sopmalfo.common.fileupload.cdnurl')" var="cdnurl"/>
<img src="<c:out value ="${cdnurl}${resultList.reprsntImgSysFilNm}"/>"
onerror = "javascript:img=new Image();img.src='/pc/images/image_placeholder.png';if(img.complete){this.src='/pc/images/image_placeholder.png'} else{this.style.display='none';}"
alt="해당 이미지에 대한 설명">
</div>
<div class="eventList__text">
<h4 class="eventList__title">
<c:out value="${resultList.sj}" escapeXml="false"/>
<c:if test="${resultList.isfiles eq 1}"><%--첨부파일여부--%>
<i class="icon icon_image-badge"></i>
</c:if>
<c:if test="${resultList.newAt eq 'Y'}"><%--새로운게시글여부--%>
<i class="icon icon_new-post"></i>
</c:if>
<c:if test="${resultList.popularAt eq 'Y'}"><%--인기게시글여부--%>
<i class="icon icon_hot-post"></i>
</c:if>
<c:if test="${ resultList.secretBbscttAt eq 'Y' }"><%--비밀글여부--%>
<i class="icon icon_lock"></i>
</c:if>
<c:if test="${resultList.cmtCnt > 0}"><%--댓글개수--%>
(<fmt:formatNumber value="${resultList.cmtCnt}" pattern="#,###"/>)
</c:if>
</h4>
<ul class="eventList__list">
<li><c:out value="${resultList.sumRegistDt}"/></li><%--등록일--%>
<li>조회 <fmt:formatNumber value="${resultList.inqireCnt}" pattern="#,###"/></li><%--조회수--%>
<c:if test = "${bbsInfo.bbscttEvlUseAt eq 'Y'}"><%--게시글 설정 중 게시글 평가 여부에 따라 노출--%>
<c:choose>
<c:when test = "${bbsInfo.bbscttEvlRecomendStep eq '01'}"><%--게시글 평가 단계가 추천만 사용할 경우--%>
<li>추천 <fmt:formatNumber value="${resultList.recomendCnt}" pattern="#,###"/></li>
</c:when>
<c:otherwise><%--게시글 평가 단계가 추천,비추천으로 사용할 경우--%>
<li>추천/비추천 <fmt:formatNumber value="${resultList.recomendCnt}" pattern="#,###"/>/<fmt:formatNumber value="${resultList.nonrecomendCnt}" pattern="#,###"/></li>
</c:otherwise>
</c:choose>
</c:if>
</ul>
</div>
</a>
</div>
</c:forEach>
</c:when>
<c:otherwise>
<div class="eventList">
<div class="eventList__no-result">
<img src="/pc/images/icon__no-result.png" alt="">
<p class="eventList__no-result-text">
<spring:message code="common.nodata"/>
</p>
</div>
</div>
</c:otherwise>
</c:choose>
</div>
<input type="hidden" id="pageIndex" name="pageIndex" value="<c:out value = '${bbscttVO.pageIndex}'/>"/>
<div class="pagination__container">
<ui:pagination paginationInfo="${resultMap.paginationInfo}" type="image" jsFunction="fn_select_List"/>
</div>
</html>

View File

@@ -0,0 +1,111 @@
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="ui" uri="http://www.winbit.kr/ctl/ui" %>
<%@ taglib prefix="f" uri="/WEB-INF/tlds/f.tld" %>
<%--
Class Name : NoticeListR.jsp
Description :공지사항 목록.jsp
Modification Information
수정일 수정자 수정내용
------- -------- ---------------------------
2024-04-18 김혜인 최초 생성
--%>
<c:set var="bbscttVO" value="${resultMap.bbsctt}"/>
<form class="contentForm">
<div class="form-control-container">
<div class="left">
<div class="search-number">
<span class="search-number__text">총 <strong><c:out
value="${ resultMap.paginationInfo.totalRecordCount }"/></strong>건</span>
</div>
</div>
<div class="center">
</div>
<div class="right">
</div>
</div>
<div class="table-wrapper">
<table class="table vertical">
<caption>해당 테이블에 대한 설명</caption>
<!-- 각 열 width 설정 -->
<colgroup>
<col style="width: 80px;">
<col style="width: auto;">
<col style="width: 12%;">
</colgroup>
<thead>
<tr>
<th>번호</th>
<th>제목</th>
<th>등록일</th>
</tr>
</thead>
<tbody>
<c:choose>
<c:when test="${ not empty resultMap.resultList.resultList }">
<c:forEach var="resultList" items="${resultMap.resultList.resultList}">
<tr>
<input type="hidden" name="bbscttInnb" value="${resultList.bbscttInnb}">
<td>
<c:choose>
<c:when test="${resultList.rnum eq 0}">
<i class="icon icon_notice-fixed"></i>
</c:when>
<c:otherwise>
<c:out value="${resultList.rnum}"/>
</c:otherwise>
</c:choose>
</td>
<td class="text-left">
<div class="table__board-title">
<button type="button" class="eclipse dtlBtn sj"
password-at="<c:if test = "${resultList.secretBbscttAt eq 'Y'}">Y</c:if>"
regusr="<c:out value="${ resultList.regusr}"/>"
value="<c:out value="${ resultList.bbscttInnb }"/>">
<c:out value="${resultList.sj}" escapeXml="false"/>
</button>
<c:if test="${resultList.isfiles eq 1}"><%--첨부파일여부--%>
<i class="icon icon_image-badge"></i>
</c:if>
<c:if test="${resultList.newAt eq 'Y'}"><%--새로운게시글여부--%>
<i class="icon icon_new-post"></i>
</c:if>
<c:if test="${resultList.popularAt eq 'Y'}"><%--인기게시글여부--%>
<i class="icon icon_hot-post"></i>
</c:if>
<c:if test="${ resultList.secretBbscttAt eq 'Y' }"><%--비밀글여부--%>
<i class="icon icon_lock"></i>
</c:if>
</div>
</td>
<c:set var="dateString" value="${resultList.registDt}" />
<fmt:parseDate var="parsedDate" value="${dateString}" pattern="yyyy-MM-dd HH:mm:ss" />
<td><span class="board-date"><fmt:formatDate value="${parsedDate}" pattern="yyyy-MM-dd" /></span></td>
</tr>
</c:forEach>
</c:when>
<c:otherwise>
<tr>
<td colspan="3">
<div class="table__no-result">
<img src="/pc/images/icon__no-result.png" alt="">
<p class="table__no-result-text">
<spring:message code="common.nodata"/>
</p>
</div>
</td>
</tr>
</c:otherwise>
</c:choose>
</tbody>
</table>
</div>
<input type="hidden" name="pageIndex" id="pageIndex" value="<c:out value = "${bbscttVO.pageIndex}"/>">
<div class="pagination__container">
<ui:pagination paginationInfo="${resultMap.paginationInfo}" type="image" jsFunction="fn_select_List"/>
</div>
</form>

View File

@@ -0,0 +1,73 @@
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@ taglib prefix="ui" uri="http://www.winbit.kr/ctl/ui"%>
<%@ taglib prefix="f" uri="/WEB-INF/tlds/f.tld"%>
<%--
Class Name : RejectAuthR.jsp
Description : 게시글 사용 권한 없을 시 권한 거부 페이지
Modification Information
수정일 수정자 수정내용
------- -------- ---------------------------
2024-05-29 김혜인 최초 생성
--%>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<%-- 공통 include --%>
<jsp:include page="/WEB-INF/views/comm/Include.jsp"/>
</head>
<script>
$(document).ready(function() {
const authDv = $("#authDv").val();
const authResult = $("#authResult").val();
const bbsNm = $("#bbsNm").val();
if (authResult === 'N') { //권한 없음
if (authDv === "REDNG") {
alert(bbsNm + "을(를) 읽을 권한이 없습니다.\n고객센터에 문의해주세요.");
} else if (authDv === "REGIST") {
alert(bbsNm + "을(를) 등록할 권한이 없습니다.\n고객센터에 문의해주세요.");
}
} else if (authResult === 'NN') { //사용 여부 N
if (authDv === "REDNG") {
if(bbsNm.length > 0){
alert(bbsNm + "은(는) 현재 사용하지 않는 게시판입니다.");
} else {
alert("현재 사용하지 않는 게시판입니다.");
}
} else if (authDv === "REGIST") {
alert(bbsNm + "등록 기능은 현재 사용하지 않습니다.");
}
}
history.back();
});
</script>
<body>
<%-- 공통 Header --%>
<jsp:include page="/WEB-INF/views/comm/Header.jsp"/>
<!-- 메인 컨텐츠 영역 -->
<main>
<div class="sub-wrapper">
<div class="sub-content">
<div class="page-title center">
<input type = "hidden" id = "authDv" value = "<c:out value="${bbscttVO.authDv}"/>">
<input type = "hidden" id = "bbsNm" value = "<c:out value="${bbscttVO.bbsNm}"/>">
<input type = "hidden" id = "authResult" value = "<c:out value="${bbscttVO.authResult}"/>">
</div>
<div class="boxTab__content contentDiv">
</div>
</div>
</div>
</main>
<%-- 공통 Footer --%>
<jsp:include page="/WEB-INF/views/comm/Footer.jsp"/>
</body>
</html>

View File

@@ -0,0 +1,716 @@
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@ taglib prefix="ui" uri="http://www.winbit.kr/ctl/ui"%>
<%@ taglib prefix="f" uri="/WEB-INF/tlds/f.tld"%>
<%--
Class Name : SubPageListRForm.jsp
Description : 서브페이지
Modification Information
수정일 수정자 수정내용
------- -------- ---------------------------
2024-04-30 김혜인 최초 생성
--%>
<!DOCTYPE html>
<html lang="ko">
<head>
<%-- 공통 include --%>
<jsp:include page="/WEB-INF/views/comm/Include.jsp"/>
</head>
<script>
$(document).ready(function () {
fn_collect_event();
});
/****************************************************************
이벤트 함수
*****************************************************************/
const fn_collect_event = () => {
fn_remove_tag();
let boxTabTabBtn = $(".boxTab__tabBtn");
let boxTabContent = $(".boxTab__content");
/*초기세팅*/
/*요청 이벤트 아이디와 같은 box_tab과 content 'current' class 부여*/
const bbsId = $("#bbsId").val(); //게시판아이디 값
let index = 0;
boxTabTabBtn.each(function (idx) {
if ($(this).val() === bbsId) { // 현재 버튼의 값과 bbsId가 같은지 확인 후 종료
index = idx;
return false;
}
});
boxTabTabBtn.eq(index).addClass("current");
boxTabContent.eq(index).addClass("current");
let pageIndex = '<c:out value="${ resultMap.bbsctt.pageIndex }"/>';
if(!fn_is_empty($(".sub-rl"))){
$(".sub-tab__btn").eq(0).click(); //클래스 부여 로직 필요
//분류 선택
$(".sub-tab__btn").on("click", function () {
let idx = $(this).index();
$(".sub-tab__btn").not($(this)).removeClass("current");
$(this).addClass("current");
$("#srchitmInnb").val($(this).val());
fn_select_List(1, idx);
});
/*사이드바 current 부여*/
$(".cscMenu").each(function(){
if($(this).attr("id") === $("#bbsId").val()){
$(this).addClass("current");
}
});
}
fn_select_List(pageIndex, index);
/*box_tab 클릭 이벤트*/
$(".boxTab__tabBtn").on("click", function () {
const bbsId = $(this).val();
const idx = $(this).index();
const pgeVtcCnt = $(this).attr("pge-vtc-cnt");
const pgeWthCnt = $(this).attr("pge-wth-cnt");
const bbsTyCd = $(this).attr("bbs-ty-cd");
const sknTyCd = $(this).attr("skn-ty-cd");
$("#bbsId").val(bbsId);
$("#bbsTyCd").val(bbsTyCd);
$("#pgeVtcCnt").val(pgeVtcCnt);
$("#pgeWthCnt").val(pgeWthCnt);
$("#sknTyCd").val(sknTyCd);
$("#srchKeyword2").val("");
fn_select_List(1, idx);
});
/*'당첨자 발표'게시판 검색 클릭 시 검색 조건 같이 전송*/
$(document).on("click", "#srchBtn", function () {
if($("#bbsTyCd").val() === '03'){
fn_select_List(1, '', 'evtResult');
}else{
fn_select_List(1, '');
}
});
$(document).on('keydown', '#srchKeyword', function (event) {
if (event.keyCode === 13) {
event.preventDefault();
if ($("#bbsTyCd").val() === '03') {
fn_select_List(1, '', 'evtResult');
} else {
fn_select_List(1, '');
}
}
});
// 새로고침 이벤트 감지
$(window).on('beforeunload', function () {
$("#srchKeyword2").val("");
});
// F5 키(새로고침) 이벤트 감지
$(document).keydown(function (event) {
if (event.keyCode == 116) {
$("#srchKeyword2").val("");
}
});
//상세 조회(리스트형,갤러리형)
$(document).on("click", ".dtlBtn", function () {
const target = $(this).closest("a");
const bbscttInnb = target.find(".bbscttInnb").val();
fn_select_crud_posbl_at(bbscttInnb,'','','R');
});
//상세 조회(당첨자 발표)
$(document).on("click", ".eventResultDtl", function () {
const bbscttInnb = $(this).find(".bbscttInnb").val();
fn_select_crud_posbl_at(bbscttInnb,'','','R');
});
//상세 조회(아코디언형)
$(document).on("click", ".tr-foldable-trigger", function () {
const idx = $(this).index(".tr-foldable-trigger");
const bbsctt = $(this).attr("bbsctt");
const bbsId = $("#bbsId").val();
if (!$(this).next(".tr-foldable").hasClass("active")) {
fn_select_crud_posbl_at(bbsctt, idx,'','R');
} else {
$(this).next(".tr-foldable").removeClass("active");
}
});
//비밀번호 확인
$("#pwChkBtn").on("click", function () {
fn_check_password();
});
//등록페이지 이동
$(document).on("click", "#regBtn", function () {
const bbsId = $("#bbsId").val();
fn_move_regist(bbsId);
});
//수정 폼 이동 버튼
$(document).on('click','.updateBtn',function(){
const bbscttInnb = $(this).val();
fn_select_crud_posbl_at(bbscttInnb, '', '','U');
});
//삭제 모달 버튼
$(document).on('click','.deleteBtn',function(){
const bbscttInnb = $(this).val();
/*답변 유무에 따라 수정 여부 판단*/
fn_select_crud_posbl_at(bbscttInnb, '', '', 'D');
});
//삭제 버튼
$(document).on('click','#alertDelBtn',function(){
const bbscttInnb = $(this).val();
const bbsId = $("#bbsId").val();
fn_delete_bbsctt(bbscttInnb,bbsId);
});
}
//crud 가능 판단
const fn_select_crud_posbl_at = (bbsctt, idx, pwCnfirmAt,crudDv) => {
$.ajax({
type: 'post',
url: '<c:url value="/sopmal/csc/selectBbscttDtlMovePosblAt"/>',
data: {
"bbscttInnb": bbsctt,
"bbsId": $("#bbsId").val(),
"sknTyCd": $("#sknTyCd").val(),
"pwCnfirmAt": pwCnfirmAt,
"crudDv" : crudDv
},
success: function (data) {
data = JSON.parse(data.resBody.result);
fn_branch_bbsctt_posble(data, idx);
}
});
}
//상세보기 가능 판단 여부에 따른 분기 처리
const fn_branch_bbsctt_posble = (data, idx) => {
const moveAt = data.result.moveAt;
const vo = data.vo;
if (moveAt === 'YES' || vo.pwCnfirmAt === 'Y') {//본인 o
if(vo.crudDv === 'R') {
if ($("#sknTyCd").val() === '03') {
fn_make_bbsctt_dtl_cn(data, idx);
} else {
fn_move_dtl(vo.bbscttInnb);
}
} else if (vo.crudDv === 'U') {
fn_move_qaUpdt(vo.bbscttInnb);
} else if (vo.crudDv === 'D') {
fn_delete_bbsctt(vo.bbscttInnb, vo.bbsId);
}
} else if (moveAt === 'OTHER') {//다른이용자 o
$("#comment-update-pop").modal();
} else if (moveAt === 'LOGIN') {//로그인 o
$("#rejectLogin").modal();
} else {//비밀번호
$("#confirm_bbsctt_pw").modal();
$("#modalBbscttInnb").val(vo.bbscttInnb);
$("#modalIdx").val(idx);
$("#modalCrudDv").val(vo.crudDv);
}
}
/*아코디언형 내용, 답변 펼침*/
const fn_make_bbsctt_dtl_cn = (data,idx) => {
if(data.dtl){
const dtl = data.dtl.dataMap;
const answ = data.answ;
const dtlSj = dtl.regusrDvCd == '02' ? dtl.sj : escapeHTML(dtl.sj);
const dtlCn = dtl.regusrDvCd == '02' ? dtl.sj : escapeHTML(dtl.cn);
let cn = `<td colspan="100%">
<div class="tr-foldable__content">
<div class="tr-foldable__qna">
<i class="icon icon_qna-q"></i>
<div class="tr-foldable__qna-content">
<p class="tr-foldable__qna-title">\${dtlSj}</p>
<div class="cn">\${dtlCn}</div>
<div class="file">`;
const cdnurl = '${cdnurl}';
if(data.dtl.fileInfo != null){
data.dtl.fileInfo.forEach(function(file){
cn += `<img src = '\${cdnurl}\${file.filCours}\${file.sysFilNm}' onerror ="this.src='/pc/images/image_placeholder.png'" alt="">`;
});
}
cn += ` </div>
</div>
</div>
<div class="tr-foldable__qna">
<i class="icon icon_qna-a"></i>
<div class="tr-foldable__qna-content">`;
let answAt;
if(answ != null){
cn += `<p class="tr-foldable__qna-title answSj">
\${answ.sj}
</p>
<div class="cn ck-content">
\${answ.cn}
</div>`;
answAt = 'Y';
}else{
cn += `답변 등록 중 입니다.`;
answAt = 'N';
}
cn += ` </div>
</div>
<div class="tr-foldable__btn-container">
<input type="hidden" name="answAt" value='\${answAt}'>
<input type="hidden" name="bbscttInnb" value='\${dtl.bbscttInnb}'>
<button type='button' class='btn theme outline updateBtn' answ-at='\${answAt}'>수정</button>
<button type='button' class='btn outline deleteBtn' value='\${dtl.bbscttInnb}'>삭제</button>
</div>
</div>
</td>`;
var trFoldable = $(".tr-foldable");
trFoldable.eq(idx).html(cn);
trFoldable.not(trFoldable.eq(idx)).removeClass("active");
trFoldable.eq(idx).toggleClass("active");
}
}
/********************************************************************
* 비밀번호 확인 (조회)
* success시
* 아코디언형 : 해당 내용 노출
********************************************************************/
const fn_check_password = () => {
const password = $("#modalPw").val();
if (password === '') {
alert("비밀번호를 입력해주세요");
} else {
$.ajax({
type: 'post',
url: '<c:url value="/sopmal/csc/selectBbscttComparPassword"/>',
data: {
"bbscttInnb": $("#modalBbscttInnb").val(),
"password": password
},
success: function (data) {
const result = JSON.parse(data.resBody.result);
/*비밀번호 확인 결과*/
const resultVal = result["pw"];
if (resultVal > 0) {
$("#closeBtn").click();
fn_select_crud_posbl_at($("#modalBbscttInnb").val(), $("#modalIdx").val(), 'Y',$("#modalCrudDv").val());
} else {
alert("비밀번호가 일치하지 않습니다.");
}
$("#modalPw").val("");
}
});
}
}
//리스트 내 내용 보일시 html 제거
const fn_remove_tag = () => {
let htmlTag = '';
let text = '';
const targetEle = $(".cn");
if (targetEle.length > 0) {
targetEle.each(function () {
htmlTag = $(this).val();
text = $(htmlTag).text();
if (text.length > 20) {
text = text.substring(0, 20) + "...";
}
$(this).closest("span").text(text);
});
}
}
//input 생성 함수
const fn_create_input = (name, value, tgtForm) => {
const input = document.createElement('input');
input.setAttribute("type", "hidden");
input.setAttribute("name", name);
input.setAttribute("value", value);
tgtForm.appendChild(input);
}
//등록페이지 이동 (c)
const fn_move_regist = (bbsId) => {
const form = document.createElement("form");
form.id = "registForm";
form.action = "/sopmal/csc/selectBbscttRegistForm";
form.method = "POST";
fn_create_input("bbsId", bbsId, form);
//요청페이지가 게시글 리스트 일 때
fn_create_input("listAt", 'list', form);
fn_create_input("authDv", 'REGIST', form);
fn_create_input("reqUrl", "subPage", form);
document.body.appendChild(form);
form.submit();
}
//상세조회 (R)
const fn_move_dtl = (bbscttInnb) => {
const hiddenForm = $("#hiddenForm");
if (hiddenForm.length > 0) {
hiddenForm.remove();
}
const form = document.createElement("form");
form.id = "hiddenForm";
//form.action = "/sopmal/csc/selectBbscttAuth";
form.action = "/sopmal/csc/selectBbscttAuth";
form.method = "GET";
let pageIndex = $("#pageIndex").val();
if (pageIndex === '') {
pageIndex = "1";
}
//fn_create_input("pageIndex", pageIndex, form);
if(!fn_is_empty($("#srchKeyword").val())){
fn_create_input("srchKeyword", $("#srchKeyword").val(), form);
fn_create_input("srchDv", $("#srchDv").val(), form);
}
//fn_create_input("useAt", "Y", form);
//fn_create_input("expsrAt", "Y", form);
//fn_create_input("prevNext",$("#prevNext").val(), form);
//fn_create_input("recomendGoodsExpsrAt",$("#recomendGoodsExpsrAt").val(), form);
fn_create_input("authDv", "CM", form); //권한체크
fn_create_input("bbsTyCd", $("#bbsTyCd").val(), form);
fn_create_input("bbscttInnb", bbscttInnb, form);
fn_create_input("reqUrl","subPage", form);
fn_create_input("bbsId", $("#bbsId").val(), form);
fn_create_input("cscAt", $("#cscAt").val(), form);
/*let pageUnit = '';
//페이지 유닛 계산
const pgeVtcCnt = $("#pgeVtcCnt").val();//ROW
const pgeWthCnt = $("#pgeWthCnt").val();//COL
pageUnit = pgeVtcCnt * pgeWthCnt;
if (pgeWthCnt === '') {
pageUnit = 10;
}
fn_create_input("pageUnit", pageUnit, form);*/
document.body.appendChild(form);
form.submit();
}
//리스트 조회(R)
const fn_select_List = (pageIndex, idx, reqDv) => {
//이벤트 게시판, 일반게시판 구분
if (idx === undefined || idx === '') {
const bbsId = $("#bbsId").val(); //게시판아이디 값
//이벤트 게시판
if ($(".boxTab__tabBtn").length > 0) {
$(".boxTab__tabBtn").each(function (index) {
if ($(this).val() === bbsId) {
idx = index;
return false;
}
});
} else { //일반 게시판
idx = 0;
}
}
//게시판 스킨 타입
const sknTyCd = $("#sknTyCd").val();
//게시판 타입
const bbsTyCd = $("#bbsTyCd").val();
//페이지 인덱스
if (!pageIndex) {
$('#pageIndex').val(1);
} else {
$('#pageIndex').val(pageIndex);
}
let url;
//페이지 유닛 구하기
let pageUnit = '';
let pgeVtcCnt = $("#pgeVtcCnt").val()
let pgeWthCnt = $("#pgeWthCnt").val();//열 개수
//갤러리 페이지 유닛 계산
if (sknTyCd === '02') {
pageUnit = pgeVtcCnt * pgeWthCnt;
} else {
if (pgeVtcCnt.length > 0) {
pageUnit = $("#pgeVtcCnt").val();
} else {
pageUnit = 10;
}
}
//게시판 타입, 스킨 타입에 따른 url 분기
if (bbsTyCd === '01' || bbsTyCd === '08') {
//일반게시글 스킨타입
if (sknTyCd === '01') {
url = '/sopmal/csc/selectCscListTy';//리스트
} else if (sknTyCd === '02') {
url = '/sopmal/csc/selectCscGalaryTy';//갤러리
} else {
url = '/sopmal/csc/selectCscAcordionTy';//아코디언
}
} else if (bbsTyCd === '03') {
url = '/sopmal/csc/selectEvtListInqire'//이벤트
} else if (bbsTyCd === '09') {
url = '/sopmal/csc/selectMgznListInqire'//매거진
} else if (bbsTyCd === '11') {
url = '/sopmal/csc/selectEvtResultListInqire'//이벤트결과
}
$("#srchKeyword2").val($("#srchKeyword").val());
//검색폼
let srchForm = $("#srchForm").serialize();
srchForm = srchForm + "&pageIndex=" + pageIndex + "&pageUnit=" + pageUnit;
$.ajax({
type: "post",
data: srchForm,
url: url,
success: function (data) {
$(".contentDiv").empty();
if(fn_is_empty($(".sub-rl"))){
if ($(".sub-tab__trigger").length > 0) {
$(".contentDiv").eq($(".sub-tab__content.current").index()).html(data);
} else {
$(".contentDiv").eq(idx).html(data);
}
}else{
$(".contentDiv").eq(idx).html(data);
}
if(sknTyCd === '03'){ /*아코디언 타입 내용 html로 변환 */
$(".cn").each(function(idx2){
$(".cn").eq(idx2).html(escapeHTML($(this).text()));
});
}
}
});
}
//게시글 수정폼 (U)
const fn_move_qaUpdt = (bbscttInnb) => {
const hiddenForm = $("#hiddenForm");
if (hiddenForm.length > 0) {
hiddenForm.remove();
}
const form = document.createElement("form");
form.id = "hiddenForm";
form.action = "/sopmal/csc/selectBbscttUpdtForm";
form.method = "POST";
fn_create_input("bbscttInnb", bbscttInnb, form);
fn_create_input("bbsId", $("#bbsId").val(), form);
fn_create_input("pageIndex", $("#pageIndex").val(), form);
fn_create_input("listAt", "list", form);
fn_create_input("reqUrl", "subpage", form);
document.body.appendChild(form);
form.submit();
}
//게시글 삭제
const fn_delete_bbsctt = (bbscttInnb, bbsId) => {
if(confirm('<spring:message code="confirm.common.delete"/>')){
$.ajax({
type: "post",
url: "/sopmal/csc/deleteBbscttDel",
data: {
"delBbscttInnbArr": bbscttInnb,
"bbsId": bbsId
},
success: function () {
alert('<spring:message code="success.common.delete"/>');
fn_select_List(1);
}
});
}
}
</script>
<body>
<%-- 공통 Header --%>
<jsp:include page="/WEB-INF/views/comm/Header.jsp"/>
<!-- 메인 컨텐츠 영역 -->
<main>
<%--게시판 정보--%>
<c:set var="bbsInfo" value="${resultMap.bbsInfo}"/>
<%--분류 목록--%>
<c:set var="itmList" value="${resultMap.itmList}"/>
<%--vo--%>
<c:set var="bbscttVO" value="${resultMap.bbsctt}"/>
<div class="sub-wrapper">
<div class="sub-content">
<form id="srchForm">
<%--게시판 정보--%>
<input type="hidden" name="bbsId" id = "bbsId" value = "<c:out value="${bbsInfo.bbsId}"/>">
<input type="hidden" name="sknTyCd" id = "sknTyCd" value = "<c:out value="${bbsInfo.sknTyCd}"/>">
<input type="hidden" name="bbsTyCd" id = "bbsTyCd" value = "<c:out value="${bbsInfo.bbsTyCd}"/>">
<%--갤러리 열,행 개수--%>
<input type="hidden" name="pgeVtcCnt" id = "pgeVtcCnt" value = "<c:out value="${bbsInfo.pgeVtcCnt}"/>">
<input type="hidden" name="pgeWthCnt" id = "pgeWthCnt" value = "<c:out value="${bbsInfo.pgeWthCnt}"/>">
<input type="hidden" name="recomendGoodsExpsrAt" id = "recomendGoodsExpsrAt" value = "<c:out value="${bbsInfo.recomendGoodsExpsrAt}"/>">
<input type="hidden" name="slangFlterUseAt" id = "slangFlterUseAt" value = "<c:out value="${bbsInfo.slangFlterUseAt}"/>">
<input type="hidden" name="useAt" id = "useAt" value = "Y">
<input type="hidden" name="ntcAt" id = "ntcAt" value = "Y">
<input type="hidden" name="expsrAt" id = "expsrAt" value = "Y">
<input type="hidden" name="srchDv" id = "srchDv2" value = "any">
<input type="hidden" name="srchitmInnb" id = "srchitmInnb" value = "">
<input type="hidden" name="prevNext" id = "prevNext" value = "<c:out value="${bbsInfo.prevNext}"/>">
<input type="hidden" name="srchKeyword" id = "srchKeyword2" value = "<c:out value="${bbscttVO.srchKeyword}"/>">
<input type="hidden" name="cscAt" id = "cscAt" value = "<c:out value="${bbscttVO.cscAt}"/>">
</form>
<c:choose>
<c:when test = "${bbscttVO.cscAt eq 'Y'}">
<div class="sub-rl">
<jsp:include page="/WEB-INF/views/comm/csc/CscLeft.jsp"/>
<div class="sub-right-content">
<h3 class="sub-right-content__title" id = "bbsNm"><c:out value="${bbsInfo.bbsNm}"/></h3>
<form id="srchForm">
<div class="customer-search">
<div class="customer-search__row">
<input class="input-text customer-search__search" type="search" title="검색어 입력"
id ="srchKeyword" name="srchKeyword" placeholder="궁금하신 내용을 입력해 주세요" value="${bbscttVO.srchKeyword}">
<button type="button" class="btn md dark" id = "srchBtn">검색</button>
</div>
</div>
</form>
<c:choose>
<c:when test="${not empty itmList}">
<div class="sub-tab">
<div class="sub-tab__trigger">
<button class="sub-tab__btn current">전체</button>
<c:forEach var="item" items="${itmList}">
<button class="sub-tab__btn" value="<c:out value="${item.itmInnb}"/>"><c:out value="${item.itmCn}"/></button>
</c:forEach>
</div>
<c:forEach var="i" begin="0" end="${fn:length(itmList)}">
<div class="sub-tab__content">
<div class="contentDiv"></div>
</div>
</c:forEach>
</div>
</c:when>
<c:otherwise>
<div class="contentDiv"></div>
</c:otherwise>
</c:choose>
</div>
</div>
</c:when>
<c:otherwise>
<div class="page-title center">
<c:choose>
<c:when test = "${bbsInfo.evt eq 'Y'}">
<h2 class="page-title__title">이벤트</h2>
</c:when>
<c:otherwise>
<h2 class="page-title__title" id = "bbsNm"><c:out value="${bbsInfo.bbsNm}"/></h2>
</c:otherwise>
</c:choose>
</div>
<%--이벤트게시판--%>
<c:if test = "${bbsInfo.bbsTyCd eq '03' || bbsInfo.bbsTyCd eq '11'}">
<c:set value="N" var="resultUsAt"/><%--당첨자발표 게시판이 있는 지 확인--%>
<c:forEach var = "evtBbsList" items="${resultMap.evtBbsList}">
<c:if test = "${evtBbsList.resultUsAt eq 'Y'}">
<c:set value="Y" var="resultUsAt"/>
</c:if>
</c:forEach>
<c:if test = "${resultUsAt eq 'Y'}">
<div class="boxTab">
<c:if test = "${not empty resultMap.evtBbsList}">
<c:forEach var = "evtBbsList" items="${resultMap.evtBbsList}">
<button type = "button" class="boxTab__tabBtn"
value="<c:out value="${evtBbsList.bbsId}"/>"
pge-vtc-cnt = "<c:out value="${evtBbsList.pgeVtcCnt}"/>"
pge-wth-cnt="<c:out value="${evtBbsList.pgeWthCnt}"/>"
bbs-ty-cd="<c:out value="${evtBbsList.bbsTyCd}"/>"
skn-ty-cd="<c:out value="${evtBbsList.sknTyCd}"/>">
<c:out value="${evtBbsList.bbsNm}"/>
</button>
</c:forEach>
</c:if>
</div>
</c:if>
</c:if>
<c:choose>
<c:when test = "${bbsInfo.bbsTyCd eq '03'||bbsInfo.bbsTyCd eq '11'}">
<c:if test = "${not empty resultMap.evtBbsList}">
<c:forEach var = "evtBbsList" items="${resultMap.evtBbsList}">
<div class="boxTab__content contentDiv">
</div>
</c:forEach>
</c:if>
</c:when>
<c:otherwise>
<div class="contentDiv">
</div>
</c:otherwise>
</c:choose>
</c:otherwise>
</c:choose>
</div>
</div>
</main>
<%-- 공통 Footer --%>
<jsp:include page="/WEB-INF/views/comm/Footer.jsp"/>
<%--비밀번호 확인 모달--%>
<div id="confirm_bbsctt_pw" class="modal alert">
<div class="alert-content">
<p class="alert-content__text--sm">
등록시에 입력했던 비밀번호를 입력해 주세요
</p>
<input class="input-text alert-content__pwInput" type="password" title="비밀번호 입력" placeholder="비밀번호 입력" name="password" id = "modalPw">
<input type="hidden" name="bbscttInnb" id = "modalBbscttInnb">
<input type="hidden" id = "modalIdx">
<input type="hidden" id = "modalAnswAt">
<input type="hidden" id = "reqAction">
<input type="hidden" id = "modalCrudDv">
</div>
<div class="alert-btn-container">
<a href="#" rel="modal:close" class="alert-btn alert-btn--cancel" id = "closeBtn">취소</a>
<button type = "button" class="alert-btn alert-btn--confirm" id="pwChkBtn">확인</button>
</div>
</div>
<%--<!-- 질문 수정 모달 -->--%>
<div id="qna-edit" class="modal alert">
<div class="alert-content">
<p class="alert-content__text--sm">
답변이 등록된 상태입니다.
<br>
수정하실 수 없습니다.
</p>
</div>
<div class="alert-btn-container">
<a href="#" rel="modal:close" class="alert-btn alert-btn--confirm">확인</a>
</div>
</div>
<%--이용자가 회원인데 작성자와 다를 시--%>
<div id="comment-update-pop" class="modal alert">
<div class="alert-content">
<p class="alert-content__text--sm">
글작성자만 이용가능합니다.
</p>
</div>
<div class="alert-btn-container">
<a href="#" rel="modal:close" class="alert-btn alert-btn--confirm">확인</a>
</div>
</div>
<%--이용자가 로그인 상태가 아닐 때--%>
<div id="rejectLogin" class="modal alert">
<div class="alert-content">
<p class="alert-content__text--sm">
이용하시려면 로그인이 필요합니다!
<br>
로그인하시겠습니까?
</p>
</div>
<div class="alert-btn-container">
<a class="alert-btn alert-btn--confirm" onclick = "fn_move_login()"><spring:message code="button.yes"/></a>
<a href="#" rel="modal:close" class="alert-btn"><spring:message code="button.no"/></a>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,137 @@
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@ taglib prefix="ui" uri="http://www.winbit.kr/ctl/ui"%>
<%@ taglib prefix="f" uri="/WEB-INF/tlds/f.tld"%>
<%--
Class Name : UseGuidanceR.jsp
Description : 이용안내 목록 폼
Modification Information
수정일 수정자 수정내용
------- -------- ---------------------------
2024-04-11 김혜인 최초 생성
--%>
<!DOCTYPE html>
<html lang="ko">
<head>
<%-- 공통 include --%>
<jsp:include page="/WEB-INF/views/comm/Include.jsp"/>
</head>
<script>
$(document).ready(function() {
let subTabBtn = $(".sub-tab__btn");
subTabBtn.on("click",function (){
let idx = $(this).index();
let itmInnb = $(this).val();
fn_select_cn(idx,itmInnb);
});
subTabBtn.eq(0).click();
/*사이드바 current 부여*/
$(".cscMenu").each(function () {
if ($(this).attr("id") === $("#bbsId").val()) {
$(this).addClass("current");
}
});
});
//내용 조회
const fn_select_cn = (idx,itmInnb) => {
$.ajax({
type: "post",
data: {
itmInnb : itmInnb,
bbsId : $("#bbsId").val(),
slangFlterUseAt : $("#slangFlterUseAt").val()
},
url: "/sopmal/csc/selectUseGuidanceInqire",
success: function (data) {
fn_set_cn(idx,data);
}
});
}
// 내용 set
const fn_set_cn = (idx, data) => {
let cn = '';
data = JSON.parse(data.resBody.result);
if (data.resultList.length > 0) {
data.resultList.forEach(function(item) {
if (item!== null && item.cn !== null) {
cn += `\${item.cn}\<br>`;
}
});
} else { /*분류는 있으나 해당 분류의 게시글이 없을 때*/
cn = `<div class="addressManage__no-result">
<img src="/pc/images/icon__no-result.png" alt="">
<p class="addressManage__no-result-text">
이용안내가 없습니다.
</p>
</div>
`;
}
const targetHtml = $(".sub-tab__content").eq(idx).find(".use-guide");
targetHtml.html(cn);
}
</script>
<body>
<%-- 공통 Header --%>
<jsp:include page="/WEB-INF/views/comm/Header.jsp"/>
<!-- 메인 컨텐츠 영역 -->
<main>
<%--게시판 정보--%>
<c:set var="bbsInfo" value="${resultMap.bbsInfo}"/>
<%--분류 목록--%>
<c:set var="itmList" value="${resultMap.itmList}"/>
<div class="sub-wrapper">
<div class="sub-content">
<div class="sub-rl">
<jsp:include page="/WEB-INF/views/comm/csc/CscLeft.jsp"/>
<div class="sub-right-content">
<h3 class="sub-right-content__title">이용안내</h3>
<input type="hidden" id = "bbsId" name="bbsId" value="<c:out value='${bbsInfo.bbsId}'/>">
<input type="hidden" id = "slangFlterUseAt" name="slangFlterUseAt" value="<c:out value='${bbsInfo.slangFlterUseAt}'/>">
<div class="sub-tab">
<c:choose>
<c:when test = "${not empty itmList}">
<div class="sub-tab__trigger type02">
<c:forEach var="itm" items="${itmList}">
<button class="sub-tab__btn" value="<c:out value='${itm.itmInnb}'/>"><c:out value="${itm.itmCn}"/></button>
</c:forEach>
</div>
<c:forEach var="i" begin="0" end="${fn:length(itmList)}">
<div class="sub-tab__content">
<div class="use-guide">
</div>
</div>
</c:forEach>
</c:when>
<c:otherwise><%--분류조차 없을 때 --%>
<div class="sub-tab__trigger type02">
<button class="sub-tab__btn" style="display:none;"></button>
</div>
<div class="sub-tab__content">
<div class="addressManage__no-result">
<img src="/pc/images/icon__no-result.png" alt="">
<p class="addressManage__no-result-text">
<spring:message code="common.nodata"/>
</p>
</div>
</div>
</c:otherwise>
</c:choose>
</div>
</div>
</div>
</div>
</div>
</main>
<%-- 공통 Footer --%>
<jsp:include page="/WEB-INF/views/comm/Footer.jsp"/>
</body>
</html>

View File

@@ -0,0 +1,273 @@
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@ taglib prefix="ui" uri="http://www.winbit.kr/ctl/ui"%>
<%@ taglib prefix="f" uri="/WEB-INF/tlds/f.tld"%>
<jsp:include page="/WEB-INF/views/comm/Include.jsp"/>
<%--
Class Name : temp.jsp
Description : 반품 환불 상품q&a 모달
Modification Information
수정일 수정자 수정내용
------- -------- ---------------------------
2024-04-25 김혜인 최초 생성
--%>
<%--
** 필요값 goodsInnb 상품고유번호
id = pop의 onclick 함수 적용하기
모달 div 영역 잡아주기
등록 스크립트 함수 부모jsp에 붙히기
--%>
<!DOCTYPE html>
<html lang="ko">
<script>
$(document).ready(function () {
fn_collect_event();
});
const fn_pop_regist = (goodsInnb) =>{
if(!goodsInnb){ /*나중에 지울거 (등록 대상 상품고유번호 연결시 삭제)*/
goodsInnb = '1023';
}
$.ajax({
type: "post",
data: {
authDv : "REGIST",
reqUrl : "refnd",
reqDv : "refnd",
bbsId : "goods_qna",
goodsInnb : goodsInnb,
regusr : "1325382", /*나중에 지울거*/
mbrDvCd : "GC" /*나중에 지울거*/
},
url: "/sopmal/csc/selectBbscttAuth",
success: function (data) {
/*파일중복제거*/
$(document).find("input[type=file]").remove();
/*모달중복제거*/
fn_close_modal("qna-pop");
$("#modalDv").html(data);
//내용 텍스트 <br>태그 엔터값으로 replace
const textarea = $("textarea[name=cn]");
let cn = textarea.attr("placeholder");
cn = fn_remove_tag(cn);
textarea.attr("placeholder", cn);
$("#qna-pop").modal();
fn_set_niceSelect_datePicker("#qna-pop");
}
});
}
/*textarea내 태그 제거 함수*/
const fn_remove_tag = (cn) => {
cn = cn.replaceAll(/<br>/ig, '\n');
cn = cn.replaceAll(/<\/br>/ig, '\n');
cn = cn.replaceAll(/<br \/>/ig, '\n');
//내용 내 태그 없애기
cn = cn.replace(/<\/?[^>]+(>|$)/g, "");
return cn;
}
/*********************************************************
* 게시글 등록
*********************************************************/
const fn_regist_bbsctt = function () {
let url = '<c:url value="/sopmal/csc/insertBbscttRegist"/>';
let saveForm = $('#bbsRegForm');
let formData = new FormData();
//파일 업로드
if($("#contact-dropzone").length > 0){
let myDropzone = Dropzone.forElement("#contact-dropzone");
myDropzone.files.forEach(function (file) {
formData.append("files", file);
});
}
$('.checkbox input[type="checkbox"]').each(function () {
if (!$(this).prop('checked')) {
fn_ctrl_disable([".checkbox"],);
}
});
//폼 내 input값 append
saveForm.serializeArray().forEach(function (item) {
formData.append(item.name, item.value);
});
//사용자 등록 시 노출 여부 Y
formData.append("expsrAt", "Y");
if($("#slangFlterUseAt").val() === 'Y'){
let mskgSlang = "<c:out value = "${resultMap.bbsInfo.maskSlang}"/>";
formData.append("mskgSlang", mskgSlang);
}
if (confirm('게시글을 <spring:message code="confirm.common.insert"/>')) {
$.ajax({
type: 'post',
url: url,
enctype:"multipart/form-data",
data: formData,
processData: false,
contentType: false,
success: function (result) {
$("#result-alert").modal();
},
error:function(){
fn_ctrl_disable("",[".checkbox"]);
}
});
}
}
/*************************************************************
이벤트 함수
*************************************************************/
const fn_collect_event = () => {
//분류 change시 hidden value값 set
$(document).on('change', '#qesitmNmC', function () {
$("#qesitmInnb").val("");
$("#qesitmNm").val("");
$("#answCn").val("");
const option = $('option:selected', this);
const qesitmInnb = $(option).attr('qesitm-innb');
const answCn = $(option).attr('answ-Cn');
const qesitmNm = $(option).attr('qesitm-nm');
if ($(this).val() !== "") {
$("#qesitmInnb").val(qesitmInnb);
$("#answCn").val(answCn);
$("#qesitmNm").val(qesitmNm);
$("#qesitmAt").val("Y");
} else {
$("#qesitmInnb").val("");
$("#answCn").val("");
$("#qesitmNm").val("");
$("#qesitmAt").val("N");
}
});
//추가입력 항목 라디오 'click' 이벤트
$(document).on('click', '.answRadioC', function () {
const radio = $(this);
//추가입력 항목 내용 요소 get
const answ = radio.closest(".custom-radio-container").find('[name="answCnArr[]"]');
//추가입력 항목 내용 요소 get
const qesitmInnb = radio.closest(".custom-radio-container").find('[name="qesitmInnbArr[]"]');
//라디오 클릭으로 인한 제어 요소 get
const contrlTarget = radio.closest(".custom-radio-container").find('.answRadio');
//항목 고유번호 내용 요소 get
const itmInnb = radio.closest(".custom-radio-container").find('[name="itmInnbArr[]"]');
//라디오 클릭 시 disabled 비활성
if (radio.is(":checked")) {
//답변 내용 초기화
answ.val("");
const radioVal = $(radio).attr('itm-cn');
answ.val(radioVal);
//항목 내용 set
qesitmInnb.val("");
const qesitmInnbVal = $(radio).attr('qesitm-innb');
qesitmInnb.val(qesitmInnbVal);
//항목고유번호 내용 set
itmInnb.val("");
const itmInnbVal = $(radio).val();
itmInnb.val(itmInnbVal);
//라디오 주위 input값 disable false처리
contrlTarget.each(function () {
contrlTarget.prop("disabled", false);
radio.closest(".custom-radio-container").find(".answRadioAt").val("Y");
});
} else {
contrlTarget.each(function () {
contrlTarget.prop("disabled", true);
radio.closest(".custom-radio-container").find(".answRadioAt").val("N");
});
}
});
//추가입력 항목 셀렉트 'change'이벤트
$(document).on('change', '.answSelectC', function () {
const select = $(this);
const answ = select.closest("td").find('[name="answCnArr[]"]');
const qesitmInnb = select.closest("td").find('[name="qesitmInnbArr[]"]');
const contrlTarget = select.closest("td").find('.answSelect');
const option = $('option:selected', this);
if (select.val() != "") {
//답변 내용 초기화
answ.val("");
const selectVal = $(option).attr('itm-cn');
answ.val(selectVal);
//항목 내용 set
qesitmInnb.val("");
const qesitmInnbVal = $(option).attr('qesitm-innb');
qesitmInnb.val(qesitmInnbVal);
//셀렉트 주위 input값 disable false처리
contrlTarget.each(function () {
contrlTarget.prop("disabled", false);
select.closest("td").find(".answSelectAt").val("Y");
});
} else {
contrlTarget.each(function () {
contrlTarget.prop("disabled", true);
select.closest("td").find(".answSelectAt").val("N");
});
}
});
//추가입력 항목 체크박스 'click'이벤트
$(document).on('click', '.answChkC', function () {
const check = $(this);
const contrlTarget = check.closest("div").find('.answChk');
var isChecked = $(this).is(":checked");
//클릭한 체크박스 주위 input값 disable false처리
contrlTarget.each(function () {
if (isChecked) {
$(this).prop("disabled", false);
} else {
$(this).prop("disabled", true);
}
});
// 체크된 체크박스가 하나라도 있는지 확인
let anyChecked = $('.answChkC:checked').length > 0;
contrlTarget.each(function () {
if (anyChecked) {
check.closest("td").find(".answChkAt").val("Y");
} else {
check.closest("td").find(".answChkAt").val("N");
}
});
});
//추가입력 항목 텍스트 'input'이벤트
$(document).on('input', '.answTxtC', function () {
const txt = $(this);
const contrlTarget = txt.closest(".input-grow-container").find('.answTxt');
const contrlAt = txt.closest(".input-grow-container").find('.answTxtAt');
//클릭한 체크박스 주위 input값 disable false처리
if (txt.val() != "") {
contrlTarget.each(function () {
contrlTarget.prop("disabled", false);
contrlAt.val("Y");
});
} else {
contrlTarget.each(function () {
contrlTarget.prop("disabled", true);
contrlAt.val("N");
});
}
});
//파일 업로드
$(document).on("change", "#fileUpload", function () {
addFiles(event, 0);
});
//등록 버튼 이벤트
$(document).on("click", "#regBtn", function () {
fn_regist_bbsctt();
});
//등록 완료 모달 > 확인 버튼 이벤트 (새로고침)
$(document).on("click","#alertBtn",function(){
$(".close").each(function (){
$(this).click();
});
});
}
</script>
<button id = "pop" onclick="fn_pop_regist()">pop</button>
<%--상품q&a등록팝업--%>
<div id = "modalDv"></div>
</html>