초기소스

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

View File

@@ -0,0 +1,338 @@
<%@ 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 : MyGoodsQaR.jsp
Description : 마이페이지 상품Q&A
Modification Information
수정일 수정자 수정내용
------- -------- ---------------------------
2024-04-11 김혜인 최초 생성
--%>
<!DOCTYPE html>
<html lang="ko">
<head>
<%-- 공통 include --%>
<jsp:include page="/WEB-INF/views/comm/Include.jsp"/>
</head>
<spring:eval expression="@environment.getProperty('sopmalfo.common.fileupload.cdnurl')" var="cdnurl"/>
<script>
$(document).ready(function() {
//아코디언 클릭 시 폼 제출 방지
$(".tr-foldable-trigger").click(function(event) {
if($(this).next().hasClass("active")){
const bbscttInnb = $(this).attr("bbsctt-innb");
const idx = $(this).index();
fn_select_fileInfo(bbscttInnb,idx);
}
event.preventDefault(); // 폼 제출 방지
});
//삭제 모달 버튼
$(document).on('click','.deleteBtn',function(){
const bbscttInnb = $(this).closest('div').find("[name='bbscttInnb']").val();
const goodsInnb = $(this).closest('div').find("[name='goodsInnb']").val();
$('#qna-delete').modal();
$('#alertDelBtn').attr('bbscttInnb', bbscttInnb);
$('#alertDelBtn').attr('goodsInnb', goodsInnb);
});
//삭제 버튼
$(document).on('click','#alertDelBtn',function(){
const bbscttInnb = $(this).attr("bbscttInnb");
const goodsInnb = $(this).attr("goodsInnb");
const bbsId = $("#bbsId").val();
const bbsTyCd = $("#bbsTyCd").val();
fn_delete_bbsctt(bbscttInnb,bbsId,bbsTyCd,goodsInnb);
});
//수정 폼 이동 버튼
$(document).on('click','.updateBtn',function(){
const answAt = $(this).closest('div').find("[name='answAt']").val();
const bbscttInnb = $(this).closest('div').find("[name='bbscttInnb']").val();
const bbsId = $("#bbsId").val();
fn_move_qaUpdt(bbscttInnb,answAt,bbsId);
});
});
//해당 게시물 파일정보 get
const fn_select_fileInfo = (bbscttInnb, idx) => {
$.ajax({
type: "post",
url: "/sopmal/mpage/act/selectFileInfo",
data: {"bbscttInnb": bbscttInnb},
success: function (data) {
const resultData = JSON.parse(data.resBody.result);
const fileInfo = resultData.fileInfo;
let img = '';
fileInfo.forEach(function (file) {
img += `<img src="${cdnurl}\${file.filCours}\${file.sysFilNm}\" alt="\${file.orginlFilNm}\"
onerror="this.src='/pc/images/image_placeholder.png'; this.style.width='150px'; this.style.height='150px';"/>`;
});
$(".tr-foldable").eq(idx).find(".file").html(img);
}
});
}
//게시글 삭제
const fn_delete_bbsctt =(bbscttInnb,bbsId,bbsTyCd,goodsInnb)=>{
$.ajax({
type: "post",
url: "/sopmal/csc/deleteBbscttDel",
data: {
"delBbscttInnbArr": bbscttInnb,
"bbsId": bbsId,
"bbsTyCd": bbsTyCd,
"goodsInnbArr": goodsInnb
},
success: function () {
alert('<spring:message code="success.common.delete"/>');
fn_close_modal('qna-delete');
location.reload();
}
});
}
//페이징 목록 조회
const fn_select_List = (pageIndex) => {
const form = $('<form>', {
'action': '/sopmal/mpage/act/selectGoodsQnaInqire',
'method': 'post'
}).append(
$('<input>', {
'type': 'hidden',
'name': 'bbsId',
'value': $("#bbsId").val()
})
).append(
$('<input>', {
'type': 'hidden',
'name': 'pageIndex',
'value': pageIndex
})
);
$('body').append(form);
form.submit();
}
//게시글 수정
const fn_move_qaUpdt =(bbscttInnb,answAt,bbsId)=>{
/* if(answAt == 'Y'){
//1.1 답변이 있는지 확인 있으면 수정 불가 모달 호출
$('#qna-edit').modal();
}else{*/
//1.2답변이 없는 경우 폼을 생성하고 전송
const form = $('<form>', {
'action': '/sopmal/mpage/act/selectGoodsQnaDtlUpdtForm',
'method': 'post'
}).append(
$('<input>', {
'type': 'hidden',
'name': 'bbscttInnb',
'value': bbscttInnb
})
).append(
$('<input>', {
'type': 'hidden',
'name': 'bbsId',
'value': bbsId
})
).append(
$('<input>', {
'type': 'hidden',
'name': 'pageIndex',
'value': $("#pageIndex").val()
})
);
$('body').append(form);
form.submit();
}
/*}*/
</script>
<body>
<%-- 공통 Header --%>
<jsp:include page="/WEB-INF/views/comm/Header.jsp"/>
<!-- 메인 컨텐츠 영역 -->
<main>
<div class="sub-wrapper">
<div class="sub-content">
<div class="sub-rl">
<%-- 마이페이지 Left 영역 --%>
<jsp:include page="/WEB-INF/views/comm/mpage/MypageLeft.jsp"/>
<div class="sub-right-content">
<%-- 마이페이지 Right 영역 --%>
<jsp:include page="/WEB-INF/views/comm/mpage/MypageRight.jsp"/>
<c:set value="${resultMap.bbsInfo}" var = "bbsInfo"/>
<input type = "hidden" value = "<c:out value="${bbsInfo.bbsId}"/>" id = "bbsId">
<input type = "hidden" value = "<c:out value="${bbsInfo.bbsTyCd}"/>" id = "bbsTyCd">
<input type="hidden" name="slangFlterUseAt" id = "slangFlterUseAt" value = "<c:out value="${bbsInfo.slangFlterUseAt}"/>">
<div class="sub-right-content__section">
<h3 class="sub-right-content__title"><c:out value="${bbsInfo.bbsNm}"/></h3>
<div class="table-wrapper">
<table class="table vertical">
<caption>해당 테이블에 대한 설명</caption>
<!-- 각 열 width 설정 -->
<colgroup>
<col style="width: 10%;">
<col style="width: 18%;">
<col style="width: auto;">
<col style="width: 15%;">
<col style="width: 10%">
</colgroup>
<thead>
<tr>
<th>번호</th>
<th>상품정보</th>
<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 class="tr-foldable-trigger" bbsctt-innb = "<c:out value = '${resultList.bbscttInnb}'/>">
<td><span class="board-number"><c:out value="${resultMap.paginationInfo.totalRecordCount - resultList.rnum+1 }" /></span></td>
<td class="text-left">
<div class="board-inner-product">
<div class="board-inner-product__right">
<a class="board-inner-product__name" href="" onclick = "fn_move_goods_dtl(<c:out value='${resultList.goodsInnb}'/>); return false;">
<c:out value="${resultList.goodsNm}"/>
</a>
</div>
</div>
</td>
<td class="text-left">
<div class="board-inner-product">
<div class="board-inner-product__right">
<p class="board-inner-product__title">
<span class="category"><c:if test = "${not empty resultList.answCn}">[<c:out value="${resultList.answCn}"/>]</c:if></span>
<c:out value="${resultList.sj}"/>
</p>
</div>
</div>
</td>
<td><span class="board-date"><c:out value="${resultList.sumRegistDt}"/></span></td>
<td>
<c:choose>
<c:when test = "${not empty resultList.answBbscttInnb}">
<span class="text-complete">답변완료</span>
</c:when>
<c:otherwise>
<span class="text-waiting">답변대기</span>
</c:otherwise>
</c:choose>
</td>
</tr>
<tr class="tr-foldable">
<td colspan="5">
<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"><c:out value="${resultList.sj}"/></p>
<div class = "cn" style="white-space: pre-wrap;"><c:out value="${resultList.cn}" /></div>
<br>
<div class = "file"></div>
</div>
</div>
<div class="tr-foldable__qna">
<i class="icon icon_qna-a"></i>
<div class="tr-foldable__qna-content">
<p class="tr-foldable__qna-title answSj"><c:out value="${resultList.answSj}"/></p>
<c:choose>
<c:when test = "${not empty resultList.answBbscttInnb}">
<div class = "cn ck-content"><c:out value="${resultList.answBbscttCn}" escapeXml="false"/></div>
</c:when>
<c:otherwise>
답변 등록 중 입니다.
</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}"/>>
<input type = "hidden" name = "goodsInnb" value = <c:out value="${resultList.goodsInnb}"/>>
<button type = "button" class="btn outline deleteBtn"><spring:message code="button.delete"/></button>
<c:if test = "${empty resultList.answBbscttInnb}">
<button type = "button" class="btn theme outline updateBtn"><spring:message code="button.update"/></button>
</c:if>
</div>
</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>
</div>
<input type="hidden" id="pageIndex" name="pageIndex" value="<c:out value = '${resultMap.bbsctt.pageIndex}'/>" />
<div class="pagination__container">
<ui:pagination paginationInfo="${resultMap.paginationInfo}" type="image" jsFunction="fn_select_List" />
</div>
</div>
</div>
</div>
</div>
</div>
</main>
<%-- 공통 Footer --%>
<jsp:include page="/WEB-INF/views/comm/Footer.jsp"/>
<!-- 질문 삭제 모달 -->
<div id="qna-delete" 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--cancel">취소</a>
<button type="button" class="alert-btn alert-btn--confirm" id = "alertDelBtn">확인</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>--%>
</body>
</html>

View File

@@ -0,0 +1,936 @@
<%@ 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 : MyGoodsQaR.jsp
Description : 마이페이지 상품Q&A
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() {
fn_collect_evt();
});
/*********************************************************
* 이벤트 함수
*********************************************************/
const fn_collect_evt = () =>{
//내용 set
fn_select_cn();
//분류 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);
});
//수정 이벤트
$("#updtBtn").on("click",function (){
fn_update_bbsctt();
});
//취소시 목록 이동
$("#canclBtn").on("click",function (){
const pageIndex = $("#pageIndex").val();
fn_select_List(pageIndex);
});
$("#updtComptBtn").on("click",function(){
const updtAt = $("#updtAt").val();
if(updtAt === 'Y'){
$("#pageIndex").val("1");
}
const form = $("#bbsUpdtForm");
form.attr("action","/sopmal/mpage/act/selectGoodsQnaDtlUpdtForm");
form.attr("method","post");
form.submit();
});
}
/*********************************************************
* 게시글 내용 조회
*********************************************************/
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);
}
});
}
/*********************************************************
* 게시글 수정
*********************************************************/
const 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);
});
}
//사용자 등록 시 노출 여부 Y
formData.append("expsrAt", "Y");
//입력항목 체크박스 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);
});
//사용자 등록 시 노출 여부 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) {
$("#result-alert").modal();
}
});
}else{
fn_ctrl_disable("", [".checkbox"]);
}
}
/*********************************************************
* 목록 이동
*********************************************************/
const fn_select_List = (pageIndex) => {
if(!pageIndex){
pageIndex = 1;
}
const form = $('<form>', {
'action': '/sopmal/mpage/act/selectGoodsQnaInqire',
'method': 'post'
}).append(
$('<input>', {
'type': 'hidden',
'name': 'bbsId',
'value': $("#bbsId").val()
})
).append(
$('<input>', {
'type': 'hidden',
'name': 'pageIndex',
'value': pageIndex
})
);
$('body').append(form);
form.submit();
}
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>
<form id = "bbsUpdtForm">
<input type="hidden" name="dftCnUseAt" value="<c:out value = '${bbsInfo.dftCnUseAt}'/>" id="dftCnUseAt">
<input type="hidden" name="dftCn" value="<c:out value = '${bbsInfo.dftCn}'/>" id="dftCn">
<input type="hidden" name="slangFlter" value="<c:out value = '${bbsInfo.slangFlter}'/>">
<input type="hidden" name="password" value="<c:out value = '${bbscttInfo.password}'/>">
<input type="hidden" name="cmUseAt" value="<c:out value = '${bbscttInfo.cmUseAt}'/>">
<input type="hidden" name="sortOrdr" value="<c:out value = '${bbscttInfo.sortOrdr}'/>">
<input type="hidden" name="bbscttInnb" value="<c:out value = '${bbscttInfo.bbscttInnb}'/>" id="bbscttInnb">
<input type="hidden" name="bbsId" value="<c:out value = '${bbscttInfo.bbsId}'/>" id="bbsId">
<input type="hidden" name="pageIndex" value="<c:out value = '${bbsctt.pageIndex}'/>" id="pageIndex">
<spring:eval expression="@environment.getProperty('sopmalfo.common.fileupload.extensions.images')" var="acceptFileExtensions"/> <%--허용 확장자--%>
<input type="hidden" name="acceptFileExtensions" value="<c:out value = '${acceptFileExtensions}'/>" id="acceptFileExtensions">
<input type="hidden" name="filAtch" value="${bbsInfo.filAtch }"/>
<input type="hidden" id="updtAt">
<input type="hidden" id="sopmalCd" value="<c:out value="${bbsInfo.sopmalCd}"/>" name="sopmalCd"/>
<input type="hidden" id="updtAt">
<%--존재 파일 여부 체크--%>
<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"/>
<spring:eval expression="@environment.getProperty('sopmalfo.common.fileupload.cdnurl')" var="cdnurl"/>
<div class="sub-wrapper">
<div class="sub-content">
<div class="sub-rl">
<%-- 마이페이지 Left 영역 --%>
<jsp:include page="/WEB-INF/views/comm/mpage/MypageLeft.jsp"/>
<div class="sub-right-content">
<%-- 마이페이지 Right 영역 --%>
<jsp:include page="/WEB-INF/views/comm/mpage/MypageRight.jsp"/>
<div class="sub-right-content__section">
<h3 class="sub-right-content__title">상품 Q&A</h3>
<div class="table-wrapper">
<table class="table write">
<caption>해당 테이블에 대한 설명</caption>
<!-- 각 열 width 설정 -->
<colgroup>
<col style="width: 140px;">
<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="${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>
<c:forEach var="goods" items="${goods}">
<td class="text-left">
<div class="board-inner-product">
<img src="${cdnurl}${goods.img}" width="64" alt="상품이미지" onerror="this.src='/pc/images/image_placeholder.png'">
<div class="board-inner-product__right">
<p class="board-inner-product__name">
<c:out value="${goods.goodsNm}"/>
<input type="hidden" name="goodsInnbArr[]" value="${goods.goodsInnb}"/>
</p>
</div>
</div>
</td>
</c:forEach>
</tr>
<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 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>
<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>
onclick="fn_prevent_click(event);">
<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="내용 입력란" name="cn"
id="cnBbsUpdt"><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>
</div>
<div class="sub-bottom-btn-container">
<button type="button" class="btn xl outline" id="canclBtn"><spring:message code="button.close"/></button>
<button type="button" class="btn xl theme" id="updtBtn"><spring:message code="button.update"/></button>
</div>
</div>
</div>
</div>
</div>
</div>
</form>
</main>
<%-- 공통 Footer --%>
<jsp:include page="/WEB-INF/views/comm/Footer.jsp"/>
<!-- 수정/등록 알림 -->
<div id="result-alert" 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" id = "updtComptBtn">확인</a>
</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: "서버에서 응답을 받지 못했습니다.",
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);
const cdnurl = '<c:out value="${cdnurl}"/>';
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 customId = file.customId;
const result = dropzoneDeleteFiles(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);
}
}
});
// 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>
</html>

View File

@@ -0,0 +1,97 @@
<%@ 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">
<c:choose>
<c:when test="${not empty resultMap.resultList.resultList}">
<div class="myReview">
<c:forEach var="resultList" items="${resultMap.resultList.resultList}">
<div class="myReview__item">
<div class="myReview__top">
<div class="cartItem">
<div class="cartItem__image">
<spring:eval expression="@environment.getProperty('sopmalfo.common.fileupload.cdnurl')"
var="cdnurl"/>
<img onclick="fn_move_goods_dtl(<c:out value="${resultList.goodsInnb}"/>)"
style="cursor:pointer;"
src="<c:out value="${cdnurl}${resultList.img}"/>"
onerror="this.src='/pc/images/image_placeholder.png'" alt="리뷰 상품 사진">
</div>
<div class="cartItem__productInfo">
<span class="myReview__date"><c:out value="${resultList.registDt}"/></span>
<a onclick="fn_move_goods_dtl(<c:out value="${resultList.goodsInnb}"/>)"
style="cursor:pointer;"
class="cartItem__productTitle"><c:out value="${resultList.goodsNm}"/></a>
</div>
</div>
<c:if test="${not empty resultMap.resultList.fileList}">
<div class="myReview__thumbs">
<c:forEach var="fileList" items="${resultMap.resultList.fileList}">
<c:if test="${fileList.bbscttInnb eq resultList.bbscttInnb}">
<img src="<c:out value = '${cdnurl}${fileList.filCours}${fileList.sysFilNm}'/>"
onerror="this.src='/pc/images/image_placeholder.png'" alt="리뷰사진">
</c:if>
</c:forEach>
</div>
</c:if>
</div>
<div class="myReview__body">
<c:if test="${not empty resultList.evlScore}">
<div class="reviewStars__wrapper">
<div class="reviewStars star-<fmt:formatNumber value="${resultList.evlScore}" pattern="##"/>"></div>
<span class="reviewStars__num"><fmt:formatNumber value="${resultList.evlScore}"
pattern="##"/></span>
</div>
</c:if>
<div class="myReview__content" style="white-space: pre-wrap;"><c:out value="${resultList.cn}"/></div>
<div class="myReview__btnWrapper">
<c:if test="${fn:length(resultList.cn) gt 500}">
<button class="myReview__moreBtn btn lg outline">더보기</button>
</c:if>
</div>
<div class="myReview__btnControls">
<button type="button" class="btn sm outline deleteBtn"
bbsctt-innb="<c:out value = '${resultList.bbscttInnb}'/>"
bbs-id="<c:out value = '${resultList.bbsId}'/>"
bbs-ty-cd="<c:out value = '${resultList.bbsTyCd}'/>"
goods-innb="<c:out value = '${resultList.goodsInnb}'/>">
<spring:message code="button.delete"/>
</button>
</div>
</div>
</div>
</c:forEach>
</div>
<input type="hidden" id="myRvwpageIndex" name="pageIndex"
value="<c:out value='${resultMap.bbscttVO.pageIndex}'/>"/>
<div class="pagination__container">
<ui:pagination paginationInfo="${resultMap.paginationInfo}" type="image" jsFunction="fn_move_myRvw"/>
</div>
</c:when>
<c:otherwise>
<div class="myReview">
<div class="myReview__no-result">
<img src="/pc/images/icon__no-result.png" alt="">
<p class="myReview__no-result-text">
<spring:message code="common.nodata"/>
</p>
</div>
</div>
</c:otherwise>
</c:choose>
</html>

View File

@@ -0,0 +1,639 @@
<%@ 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() {
// /pc/script.js에 변수 선언됨
let boxTabs = $(".boxTab__tabBtn");
boxTabs.each(function (index) {
$(this).on("click", function () {
const divDv = $(this).attr('div-dv');
if(divDv == 'posblRvw'){
fn_move_writngPosblRvw(1);
}else if(divDv == 'myRvw'){
fn_move_myRvw(1);
}
});
});
const divDv = '<c:out value="${vo.divDv}"/>';
if (divDv === 'myRvw') {
$(".boxTab__tabBtn").eq(1).click();
} else {
$(".boxTab__tabBtn").eq(0).click();
}
// 작성 가능한 리뷰 이벤트 함수
fn_bind_writngPosblRvw();
// 리뷰 이벤트 함수
fn_bind_myRvwEvent();
$(document).on("click",".moveGoodsDtl",function(){
const goodsInnb = $(this).val();
fn_move_goods_dtl(goodsInnb);
});
});
//작성가능리뷰 조회
const fn_move_writngPosblRvw = (pageIndex) => {
//작성 가능 리뷰 조회 div
let posblRvwDiv = $("#posblRvwDiv");
if (!pageIndex) {
$('#wringPosblpageIndex').val(1);
} else {
$('#wringPosblpageIndex').val(pageIndex);
}
$.ajax({
type: "post",
url: "/sopmal/mpage/act/selectWritngPosblRvwInqire",
data:{"pageIndex":pageIndex},
success: function (data) {
if(posblRvwDiv.html()){
posblRvwDiv.empty();
}
posblRvwDiv.html(data);
}
});
}
//나의리뷰 조회
const fn_move_myRvw = (pageIndex) => {
//나의 리뷰 조회 div
let posblRvwDiv = $("#myRvwDiv");
if (!pageIndex) {
$('#myRvwpageIndex').val(1);
} else {
$('#myRvwpageIndex').val(pageIndex);
}
$.ajax({
type: "post",
url: "/sopmal/mpage/act/selectMyRvwInqire",
data:{"pageIndex":pageIndex},
success: function (data) {
if(posblRvwDiv.html()){
posblRvwDiv.empty();
}
posblRvwDiv.html(data);
//내용 html로 전환
$(".myReview__content").each(function(){
let cn = $('<div>').html($(this).text());
$(this).text(cn.text().trim());
});
}
});
}
//리뷰작성
const fn_move_writeRvw = (ordrGoodsOptnInnb,bbsTyCd,goodsInnb) => {
$.ajax({
type: "post",
url: "/sopmal/mpage/act/selectRvwWritngPopupForm",
data : {"ordrGoodsOptnInnb" : ordrGoodsOptnInnb,
"bbsTyCd" : bbsTyCd,
"goodsInnb" :goodsInnb},
success: function (data) {
if($("#modalDiv").html()){
fn_close_modal("orderReview-pop");
$(".dz-hidden-input").remove();
}
$("#modalDiv").html(data);
$("#orderReview-pop").modal();
$(".answSelectC").niceSelect();
}
});
}
/*********************************************************
* 작성 가능한 리뷰 이벤트 함수
*********************************************************/
const fn_bind_writngPosblRvw = () => {
//리뷰작성 클릭 시 모달 호출
$(document).on("click",".rvwBtn",function(){
/*주문 상품 옵션 고유번호*/
const ordrGoodsOptnInnb = $(this).attr("ordr-goods-optn-innb");
/*게시판 타입*/
const bbsTyCd = $(this).attr("bbs-ty-cd");
/*주문 상품 옵션 고유번호*/
const goodsInnb = $(this).val();
fn_move_writeRvw(ordrGoodsOptnInnb,bbsTyCd,goodsInnb);
});
/*리뷰 답변 항목 이벤트 제어*/
$(document).on('click','.rvwAnswRadioC',function(){
const radio = $(this);
//리뷰 항목 내용 요소 get
const score = radio.closest("div").find('[name="evlScoreArr[]"]');
//추가입력 항목 내용 요소 get
const qesitmInnb = radio.closest("div").find('[name="rvwQesitmInnbArr[]"]');
//항목 고유번호 내용 요소 get
const itmInnb = radio.closest("div").find('[name="rvwItmInnbArr[]"]');
//라디오 클릭으로 인한 제어 요소 get
const contrlTarget = radio.closest("div").find('.rvwAnswRadio');
//라디오 클릭 시 disabled 비활성
if(radio.is(":checked")){
const radioVal = $(radio).attr('itm-cn');
//평가 내용 set
score.val("");
score.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("div").find(".rvwAnswRadioAt").val("Y");
});
}else{
contrlTarget.each(function() {
contrlTarget.prop("disabled",true);
radio.closest("div").find(".rvwAnswRadioAt").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(".reviewRadio__item").find('[name="answCnArr[]"]');
const qesitmInnb = select.closest(".reviewRadio__item").find('[name="qesitmInnbArr[]"]');
const contrlTarget = select.closest(".reviewRadio__item").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(".reviewRadio__item").find(".answSelectAt").val("Y");
});
}else{
contrlTarget.each(function() {
contrlTarget.prop("disabled",true);
select.closest(".reviewRadio__item").find(".answSelectAt").val("N");
});
}
});
//추가입력 항목 체크박스 'click'이벤트
$(document).on('click','.answChkC',function(){
const check = $(this);
const contrlTarget = check.closest(".reviewRadio__item").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(".reviewRadio__item").find(".answChkAt").val("Y");
} else {
check.closest(".reviewRadio__item").find(".answChkAt").val("N");
}
});
});
//추가입력 항목 텍스트 '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('change keyup', "#bbsRegForm" ,function(){
fn_validation_rvw();
});
//리뷰 등록 버튼 이벤트
$(document).on("click","#regBtn",function(){
const bbsId = $("#bbsId").val();
fn_regist_bbsctt(bbsId);
});
}
/*********************************************************
* 나의 리뷰 이벤트 함수
*********************************************************/
/*validation 체크*/
function fn_validation_rvw() {
//등록 조건 충족시 버튼 활성화
const essntlChkCnt = $(".essntlChk[value='Y']").length;
const qesitmAtChkCnt = $(".qesitmAtChk[value='Y']").length;
let writngChrCnt = '';
let writngChrAt = false;
const cnLength = $("#cn").val().length;
if ($("#writngChrCntAt").val() === "Y") {
writngChrCnt = parseInt($("#writngChrCnt").val(), 0);
if (writngChrCnt > cnLength) {
writngChrAt = false;
} else {
writngChrAt = true;
}
} else {
if (cnLength >= 1) {
writngChrAt = true;
}
}
//한달리뷰는 포토리뷰만 허용
let photoAt = false;
if ($("#bbsTyCd").val() === '06' || ($("#bbsTyCd").val() === '07' && $("#filExtAt").val() === 'Y')) {
photoAt = true;
}
if (essntlChkCnt === qesitmAtChkCnt && writngChrAt && photoAt && $("#regProccess").val() === 'N') {
$("#regBtn").prop("disabled", false);
} else {
$("#regBtn").prop("disabled", true);
}
}
const fn_bind_myRvwEvent = () => {
// 리뷰 상세보기
$(document).on('click','.myReview__moreBtn', function () {
if ($(this).hasClass('opened')) {
$(this).closest('.myReview__body').find('.myReview__content').removeClass('opened');
$(this).removeClass('opened');
$(this).text('더보기');
return;
}
$(this).closest('.myReview__body').find('.myReview__content').addClass('opened');
$(this).addClass('opened');
$(this).text('닫기');
})
// 리뷰 이미지 상세보기
$(document).on('click','.myReview__thumbs > img', function () {
// 클릭한 이미지의 인덱스
var index = $(this).index();
// 모달 생성 후, 이미지 슬라이더 초기화
$('#reviewImage-pop').modal();
$(document).on($.modal.BEFORE_OPEN, '#reviewImage-pop',function (event, modal) {
if ($('.slider-for').hasClass('slick-initialized')) {
//slick 이미지 중복 제거
let targetSlick = $('.slider-for, .slider-nav');
targetSlick.slick('slickRemove', null, null, true);
targetSlick.slick('unslick');
}
return false;
});
const div = $(this).closest('.myReview__item');
const img = $(div).find('.myReview__thumbs').html();
// const img = $(div).find('.myReview__thumbs').html();
$('.slider-for, .slider-nav').append(img);
$(document).off($.modal.OPEN).on($.modal.OPEN,'#reviewImage-pop',function (event, modal) {
// 메인 리뷰 이미지
$('.slider-for').slick({
slidesToShow: 1,
slidesToScroll: 1,
arrows: true,
fade: true,
infinite: false,
speed: 0,
asNavFor: '.slider-nav',
initialSlide: index // 클릭한 이미지의 인덱스
});
// 썸네일 리뷰 이미지
$('.slider-nav').slick({
slidesToShow: 3,
slidesToScroll: 3,
dots: false,
infinite: false,
asNavFor: '.slider-for',
focusOnSelect: true,
initialSlide: index, // 클릭한 이미지의 인덱스
useTransform: false
});
});
});
$(document).on("click",".deleteBtn", function(){
const bbscttInnb = $(this).attr("bbsctt-innb");
const bbsId = $(this).attr("bbs-id");
const bbsTyCd = $(this).attr("bbs-ty-cd");
const goodsInnb = $(this).attr("goods-innb");
$("#qna-delete").modal();
$("#modalBbsctt").val(bbscttInnb);
$("#modalBbsId").val(bbsId);
$("#modalBbsTyCd").val(bbsTyCd);
$("#modalGoodsInnb").val(goodsInnb);
});
$("#alertDelBtn").on("click",function(){
const bbscttInnb = $("#modalBbsctt").val();
const bbsId = $("#modalBbsId").val();
const bbsTyCd = $("#modalBbsTyCd").val();
const goodsInnb = $("#modalGoodsInnb").val();
fn_delete_bbsctt(bbscttInnb,bbsId, bbsTyCd, goodsInnb);
});
}
//게시글 삭제
const fn_delete_bbsctt = (bbscttInnb, bbsId, bbsTyCd, goodsInnb) => {
let delBbscttInnbArr = [];
let delInfoArr = [];
const delInfo = {
"bbscttInnb": bbscttInnb,
"goodsInnb": goodsInnb,
"regusrDvCd": '01'
}
delBbscttInnbArr.push(bbscttInnb);
delInfoArr.push(delInfo);
const data = {
"delBbscttInnbArr": delBbscttInnbArr,
"bbsId": bbsId,
"bbsTyCd": bbsTyCd,
"delInfoArr": delInfoArr, /*선택 삭제시 각 게시글 정보*/
};
$.ajax({
type: 'post',
url: "/sopmal/mpage/act/deleteRvwBbscttDel",
data: JSON.stringify(data),
dataType: "json",
contentType: 'application/json',
success: function () {
alert('<spring:message code="success.common.delete"/>');
fn_close_modal('qna-delete');
fn_move_myRvw(1);
}
});
}
/*********************************************************
* 게시글 등록
*********************************************************/
const fn_regist_bbsctt = function(bbsId) {
$('#regBtn').unbind('click');
let url = '<c:url value="/sopmal/csc/insertBbscttRegist"/>';
let saveForm = $('#bbsRegForm');
let formData = new FormData();
//파일 업로드
let myDropzone = Dropzone.forElement("#contact-dropzone");
myDropzone.files.forEach(function(file){
formData.append("files",file);
/*한달리뷰시 파일존재여부 체크(validation)*/
});
if(formData.get("files") == null){
$("#filExtAt").val("N");
}
//내용 get해서 sj
$("[name='sj']").val("");
const cn = $("#cn").val();
const removeTag = cn.replace(/<[^>]+>/g, ''); // HTML 태그 제거
let truncatedSj = removeTag.slice(0, 28); // 28글자로 제한
if (truncatedSj.length > 28) {
truncatedSj += "..."; // 28글자가 넘으면 뒤에 ... 추가
}
//제목
formData.append('sj',truncatedSj);
//체크박스
$('.checkbox input[type="checkbox"]').each(function() {
if (!$(this).prop('checked')) {
fn_ctrl_disable([".checkbox"],);
}
});
//설정정보
formData.append('setupInfoInnb',$("setupInfoInnb").val());
//폼 내 input값 append
saveForm.serializeArray().forEach(function(item) {
formData.append(item.name, item.value);
});
disableButton('#regBtn');
$("#regProccess").val("Y");
$.ajax({
type: 'post',
url: url,
data: formData,
processData: false,
contentType: false,
success: function (result) {
result = JSON.parse(result.resBody.result);
if(result.denyRvw === '0'){
alert("해당 주문건은\n리뷰가 모두 작성되었습니다.");
}else{
if (result.result == '1') {
alert('<spring:message code="success.common.insert"/>');
} else {
alert('<spring:message code="fail.common.insert"/>');
}
}
$('#boardFormItmC').empty();
fn_close_modal("orderReview-pop");
fn_move_writngPosblRvw();
fn_mpage_info_refresh();
$("#regProccess").val("N");
},
error: function (data, status, error) {
fn_ajax_error(data, status, error); /*공통 처리 함수*/
$("#regProccess").val("N");
}
});
}
//마이페이지 리프레쉬
const fn_mpage_info_refresh = function () {
$.ajax({
type: 'post',
url: '<c:url value="/sopmal/mpage/ordr/selectMpageInfoRefreshInqire"/>',
success: function (data) {
$('#mypageRightContainer').empty();
$('#mypageRightContainer').html(data);
}
});
}
</script>
<body>
<%-- 공통 Header --%>
<jsp:include page="/WEB-INF/views/comm/Header.jsp"/>
<!-- 메인 컨텐츠 영역 -->
<main>
<div class="sub-wrapper">
<div class="sub-content">
<div class="sub-rl">
<%-- 마이페이지 Left 영역 --%>
<jsp:include page="/WEB-INF/views/comm/mpage/MypageLeft.jsp"/>
<div class="sub-right-content">
<%-- 마이페이지 Right 영역 --%>
<div id="mypageRightContainer">
<jsp:include page="/WEB-INF/views/comm/mpage/MypageRight.jsp"/>
</div>
<div class="sub-right-content__section">
<h3 class="sub-right-content__title">나의 리뷰</h3>
<div class="infoBox">
<h6 class="infoBox__title">안내사항</h6>
<ol class="infoBox__list">
<li>리뷰는 구매 확정 후 6개월 이내 작성 하실 수 있습니다.</li>
<li>한달리뷰는 포토리뷰이므로 사진첨부는 필수 입니다.</li>
<c:if test = "${mlgAccmlNtc.goodsRvwMlgPymntAt eq 'Y'}">
<li>텍스트 리뷰는 <fmt:formatNumber value="${mlgAccmlNtc.gnrlRvwMlgAccmlmnyAmt}" pattern="#,###"/>원/
포토 리뷰는 <fmt:formatNumber value="${mlgAccmlNtc.photoRvwMlgAccmlmnyAmt}" pattern="#,###"/>
<c:if test = "${mlgAccmlNtc.monthBbsExpsrAt eq 'Y' && mlgAccmlNtc.goodsRvwMlgPymntMtAt eq 'Y'}"><%--한달리뷰 사용여부에 따른 분기처리--%>
/ 한달 리뷰는 <fmt:formatNumber value="${mlgAccmlNtc.monthPhotoRvwMlgAccmlmnyAmt}" pattern="#,###"/>원
</c:if>
적립금이 적립되며
리뷰 작성 후 수정이 불가하니 참고 부탁드립니다.</li>
<c:if test ="${mlgAccmlNtc.aditPymntMlgAccmlmnyAmt > 0}">
<li>
텍스트 리뷰 / 포토 리뷰 작성시 추가 마일리지 <fmt:formatNumber value="${mlgAccmlNtc.aditPymntMlgAccmlmnyAmt}" pattern="#,###"/> 적립됩니다.
(<c:out value = "${mlgAccmlNtc.aditMlgPymntBgnDe}"/>~<c:out value = "${mlgAccmlNtc.aditMlgPymntEndDe}"/>)
</li>
</c:if>
<c:if test = "${mlgAccmlNtc.monthAditPymntMlgAccmlmnyAmt > 0 && mlgAccmlNtc.goodsRvwMlgPymntMtAt eq 'Y'}">
<li>
한달 리뷰 작성시 추가 마일리지 <fmt:formatNumber value="${mlgAccmlNtc.monthAditPymntMlgAccmlmnyAmt}" pattern="#,###"/> 적립됩니다.
(<c:out value = "${mlgAccmlNtc.monthAditMlgPymntBgnDe}"/>~<c:out value = "${mlgAccmlNtc.monthAditMlgPymntEndDe}"/>)
</li>
</c:if>
</c:if>
</ol>
</div>
<div class="boxTab">
<button class="boxTab__tabBtn current" div-dv = 'posblRvw'>작성 가능한 리뷰</button>
<button class="boxTab__tabBtn" div-dv = 'myRvw'>나의 리뷰</button>
</div>
<div class="boxTab__content current">
<div id = "posblRvwDiv"></div>
</div>
<div class="boxTab__content" >
<div id = "myRvwDiv"></div>
</div>
</div>
</div>
</div>
</div>
</div>
</main>
<%-- 공통 Footer --%>
<jsp:include page="/WEB-INF/views/comm/Footer.jsp"/>
<div id = "modalDiv"></div>
<!-- 질문 삭제 모달 -->
<div id="qna-delete" class="modal alert">
<input type = "hidden" id="modalBbsctt">
<input type = "hidden" id="modalBbsId">
<input type = "hidden" id="modalBbsTyCd">
<input type = "hidden" id="modalGoodsInnb">
<div class="alert-content">
<p class="alert-content__text--sm">
삭제된 리뷰는 복구할 수 없으며
<br>
재작성은 불가합니다.
<br>
정말로 삭제 하시겠습니까?
</p>
</div>
<div class="alert-btn-container">
<a href="#" rel="modal:close" class="alert-btn alert-btn--cancel">취소</a>
<button type="button" class="alert-btn alert-btn--confirm" id = "alertDelBtn">확인</button>
</div>
</div>
<!-- 리뷰이미지 상세보기 -->
<div id="reviewImage-pop" class="modal modal--reviewImage" style="max-width: 1000px;">
<div class="modal-content">
<div class="reviewImage">
<div class="reviewImage__current">
<div class="slider-for"></div>
</div>
<div class="reviewImage__thumbs">
<div class="slider-nav"></div>
</div>
</div>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,334 @@
<%@ 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"%>
<!DOCTYPE html>
<script>
$(document).ready(function(){
let placeholder = $("#cn").attr("placeholder");
placeholder = placeholder.replace(/<br\s*\/?>/gi, '\n');
$("#cn").attr("placeholder",placeholder);
$("#cn").val($("#cn").val().trimStart());
});
</script>
<html>
<c:set value = "${resultMap.regusrInfo}" var = "regusrInfo"/>
<c:set value = "${resultMap.bbsInfo}" var = "bbsInfo"/>
<c:set value = "${resultMap.mlgInfo}" var = "mlgInfo"/>
<c:set value = "${resultMap.qesitmList.qesitmList}" var = "qesitmList"/>
<c:set value = "${resultMap.qesitmList.itmCnList}" var = "itmCnList"/>
<c:set value = "${resultMap.rvwQesitmList.starQesitmList}" var = "starQesitmList"/>
<c:set value = "${resultMap.rvwQesitmList.starItmCnList}" var = "starItmCnList"/>
<c:set value = "${resultMap.itmList}" var = "itmList"/>
<c:set value = "${resultMap.rvwGoodsInfo}" var = "rvwGoodsInfo"/>
<!-- 리뷰작성 -->
<div id="orderReview-pop" class="modal default" style="max-width: 640px;">
<div class="modal-header">
<div class="modal-header__title">리뷰 작성</div>
</div>
<div class="modal-content">
<form id="bbsRegForm">
<div class="orderReviewPop">
<c:if test = "${mlgInfo.goodsRvwMlgPymntAt eq 'Y'}">
<div class="infoBox">
<p class="textInfo">
<%--마일리지 안내--%>
<i class="icon icon_textInfo--sm"></i>
텍스트 리뷰 <fmt:formatNumber value="${mlgInfo.gnrlRvwMlgAccmlmnyAmt}" pattern="#,###"/>원/
포토 리뷰 <fmt:formatNumber value="${mlgInfo.photoRvwMlgAccmlmnyAmt}" pattern="#,###"/>원
<c:if test="${mlgInfo.monthBbsExpsrAt eq 'Y' || mlgInfo.goodsRvwMlgPymntMtAt eq 'Y'}"><%--한달리뷰 사용여부에 따른 분기처리--%>
/한달 리뷰 <fmt:formatNumber value="${mlgInfo.monthPhotoRvwMlgAccmlmnyAmt}" pattern="#,###"/>원
</c:if>
적립<br>
<c:if test="${mlgInfo.aditPymntMlgAccmlmnyAmt > 0}">
텍스트 리뷰 / 포토 리뷰 작성시 추가 마일리지 <fmt:formatNumber value="${mlgInfo.aditPymntMlgAccmlmnyAmt}" pattern="#,###"/>
(<c:out value="${mlgInfo.aditMlgPymntBgnDe}"/>~<c:out value="${mlgInfo.aditMlgPymntEndDe}"/>)<br>
</c:if>
<c:if test="${mlgInfo.monthAditPymntMlgAccmlmnyAmt > 0}">
한달 리뷰 작성시 추가 마일리지 <fmt:formatNumber value="${mlgInfo.monthAditPymntMlgAccmlmnyAmt}" pattern="#,###"/><br>
(<c:out value="${mlgInfo.monthAditMlgPymntBgnDe}"/>~<c:out value="${mlgInfo.monthAditMlgPymntEndDe}"/>)
</c:if>
</p>
</div>
</c:if>
<div class="orderReviewPop__product">
<div class="cartItem">
<div class="cartItem__image">
<div><spring:eval expression="@environment.getProperty('sopmalfo.common.fileupload.cdnurl')" var="cdnurl"/>
<img src="<c:out value = '${cdnurl}${rvwGoodsInfo.img}'/>" alt="상품이미지" id = "goodsImg" onerror="this.src='/pc/images/image_placeholder.png'">
</div>
</div>
<div class="cartItem__productInfo">
<div class="cartItem__productTitle"><c:out value = '${rvwGoodsInfo.goodsNm}'/></div>
</div>
</div>
</div>
<input type = "hidden" name = "bbsId" value = "${bbsInfo.bbsId}" id = "bbsId"/>
<input type = "hidden" name = "bbsTyCd" value = "${bbsInfo.bbsTyCd}" id = "bbsTyCd"/>
<input type = "hidden" name = "sopmalCd" value = "${bbsInfo.sopmalCd}" id = "sopmalCd"/>
<input type = "hidden" name = "regusrDvCd" value = "01"/>
<input type = "hidden" name = "ordrGoodsOptnInnb" value = "<c:out value = '${rvwGoodsInfo.ordrGoodsOptnInnb}'/>"/>
<input type = "hidden" name = "filExtAt" id = "filExtAt"/>
<input type = "hidden" name = "ordrInnb" id = "ordrInnb" value = "<c:out value = '${rvwGoodsInfo.ordrInnb}'/>"/>
<input type = "hidden" name = "goodsInnb" value = "<c:out value = '${rvwGoodsInfo.goodsInnb}'/>"/>
<spring:eval expression="@environment.getProperty('sopmalfo.common.fileupload.extensions.images')" var="acceptFileExtensions"/>
<input type = "hidden" name = "acceptFileExtensions" id = "acceptFileExtensions" value = "${acceptFileExtensions}"/>
<input type = "hidden" name = "goodsInnbArr[]" value = "<c:out value = '${rvwGoodsInfo.goodsInnb}'/>"/>
<c:if test = "${not empty starQesitmList}">
<c:forEach items="${starQesitmList}" var="starQesitm" varStatus="status">
<c:choose>
<c:when test="${starQesitm.scoreIndictMthCd eq '01'}">
<div class="reviewRating">
<span class="reviewRating__title"><c:out value="${starQesitm.qesitmNm}"/></span>
<div class="reviewRating__inner">
<input type="hidden" name="rvwQesitmEssntlAtArr[]" value="${starQesitm.qesitmEssntlAt}"
class="essntlChk">
<input type="hidden" name="rvwQesitmNmArr[]" value="${starQesitm.qesitmNm}">
<input type="hidden" name="rvwQesitmAtArr[]" class="rvwAnswRadioAt qesitmAtChk" value="N">
<input type="hidden" name="rvwQesitmInnbArr[]" class="rvwAnswRadio"
value="${starQesitm.qesitmInnb}" disabled>
<input type="hidden" name="evlScoreArr[]" class="rvwAnswRadio" disabled>
<input type="hidden" name="rvwItmInnbArr[]" class="rvwAnswRadio" disabled>
<c:forEach items="${resultMap.starItmList}" var="starItmCn" varStatus="status">
<c:if test="${starItmCn.qesitmInnb eq starQesitm.qesitmInnb}">
<input type="radio"
name="itmInnbArr<c:out value = '${starItmCn.qesitmInnb}'/>[]"
id="rvwCn<c:out value = '${status.index}'/>"
class="rvwAnswRadioC"
value="<c:out value='${starItmCn.itmInnb}'/>"
qesitm-innb='<c:out value = '${starItmCn.qesitmInnb}'/>'
itm-cn="<c:out value='${starItmCn.itmCn}'/>">
<label for="rvwCn${status.index}"></label>
</c:if>
</c:forEach>
</div>
</div>
</c:when>
<c:when test="${starQesitm.scoreIndictMthCd eq '02'}">
<div class="reviewRating">
<div class="reviewRating__title"><c:out value="${starQesitm.qesitmNm}"/></div>
<div class="custom-radio-container custom-radio-container--reviewRating">
<div class="custom-radio is-medium">
<input type="hidden" name="rvwQesitmEssntlAtArr[]" value="${starQesitm.qesitmEssntlAt}"
class="essntlChk">
<input type="hidden" name="rvwQesitmNmArr[]" value="${starQesitm.qesitmNm}">
<input type="hidden" name="rvwQesitmAtArr[]" class="rvwAnswRadioAt qesitmAtChk" value="N">
<input type="hidden" name="rvwQesitmInnbArr[]" class="rvwAnswRadio"
value="${starQesitm.qesitmInnb}" disabled>
<input type="hidden" name="evlScoreArr[]" class="rvwAnswRadio" disabled>
<input type="hidden" name="rvwItmInnbArr[]" class="rvwAnswRadio" disabled>
<c:forEach items="${starItmCnList}" var="starItmCn" varStatus="status">
<c:if test="${starItmCn.qesitmInnb eq starQesitm.qesitmInnb}">
<input type="radio"
name="itmInnbArr<c:out value = '${starItmCn.qesitmInnb}'/>[]"
id="rvwCn<c:out value = '${starItmCn.itmInnb}'/>"
class="rvwAnswRadioC"
value="<c:out value='${starItmCn.itmInnb}'/>"
qesitm-innb='<c:out value = '${starItmCn.qesitmInnb}'/>'
itm-cn="<c:out value='${starItmCn.itmCn}'/>">
<label for="rvwCn${starItmCn.itmInnb}"><c:out
value='${starItmCn.itmCn}'/>점&nbsp;</label>
</c:if>
</c:forEach>
</div>
</div>
</div>
</c:when>
</c:choose>
</c:forEach>
</c:if>
<c:if test = "${not empty qesitmList}">
<div class="reviewRadio">
<c:forEach items="${ qesitmList }" var="qesitmList" varStatus="status">
<c:if test="${ qesitmList.itmTyCd eq '01'}">
<div class="reviewRadio__item">
<div class="reviewRadio__title"><c:out value="${ qesitmList.qesitmNm }"/></div>
<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>
</c:if>
<c:if test="${ qesitmList.itmTyCd eq '02'}">
<div class="reviewRadio__item">
<div class="reviewRadio__title"><c:out value="${ qesitmList.qesitmNm }"/></div>
<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>
</div>
</c:if>
<c:if test="${ qesitmList.itmTyCd eq '03' }">
<div class="reviewRadio__item">
<div class="reviewRadio__title"><c:out value="${ qesitmList.qesitmNm }"/></div>
<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="b-checkbox-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>
</div>
</c:if>
<c:if test="${ qesitmList.itmTyCd eq '04' }">
<div class="reviewRadio__item">
<div class="reviewRadio__title"><c:out value="${ qesitmList.qesitmNm }"/></div>
<div class="reviewRadio__inputRow">
<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="answTxtC input-text full" 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>
</c:if>
</c:forEach>
</div>
</c:if>
<div class="orderRefundReason">
<div class="orderRefundReason__item">
<div class="orderRefundReason__itemTitle">상품 리뷰를 작성해주세요.</div>
<textarea class="textarea" rows="6" title="상품 리뷰" name = "cn" id = "cn"
<c:choose>
<c:when test="${bbsInfo.dftCnUseAt eq 'Y'}">
placeholder= "<c:out value='${bbsInfo.dftCn}'/>"
</c:when>
<c:otherwise>
<c:if test="${not empty bbsInfo.writngChrCnt}">
placeholder="최소 <c:out value="${bbsInfo.writngChrCnt}"/>자 이상으로 입력해 주세요."
</c:if>
</c:otherwise>
</c:choose>>
</textarea>
<c:if test = "${not empty bbsInfo.writngChrCnt}">
<input type="hidden" id = "writngChrCntAt" value ="Y">
</c:if>
<input type="hidden" id = "writngChrCnt" value ="<c:out value = "${bbsInfo.writngChrCnt}"/>">
</div>
</div>
<c:if test="${bbsInfo.filAtch eq 'Y'}">
<div class="reviewImageUpload">
<div class="reviewImageUpload__title">이미지 등록(3장) <c:if test = "${bbsInfo.bbsTyCd eq '07'}"><span style="color:red">*</span></c:if></div>
<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>
<input type="hidden" name="filAtch" id="filAtch" value="Y"/>
</div>
</c:if>
</div>
</form>
</div>
<div class="modal-footer">
<a href="#" rel="modal:close" class="btn large outline">닫기</a>
<button type = "button" class="btn large theme" id = "regBtn" disabled>리뷰 등록</button>
<input type = "hidden" id = "regProccess" value = "N"/>
</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: "서버에서 응답을 받지 못했습니다.",
});
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();
}
$("#filExtAt").val("Y");
fn_validation_rvw();
});
myDropzone.on("removedfile", function(file) {
if (myDropzone.files.length < maxFiles) {
$(".dz-message").show();
}
if(myDropzone.files.length == 0){
$("#filExtAt").val("N");
fn_validation_rvw();
}
});
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,79 @@
<%@ 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"%>
<!DOCTYPE html>
<html lang="ko">
<c:choose>
<c:when test="${not empty resultMap.resultList}">
<div class="orderList">
<c:forEach var = "resultList" items="${resultMap.resultList}">
<div class="orderList__item">
<div class="orderList__item__inner">
<button type="button" class="orderList__image moveGoodsDtl" value="<c:out value ='${resultList.goodsInnb}'/>">
<spring:eval expression="@environment.getProperty('sopmalfo.common.fileupload.cdnurl')" var="cdnurl"/>
<img src="<c:out value ='${cdnurl}${resultList.img}'/>" alt="" onerror="this.src='/pc/images/image_placeholder.png'">
</button>
<div class="orderList__description">
<div class="orderList__description__first">
<div class="orderList__item__top">
<a onclick="" style="cursor:pointer;" class="orderList__orderNum"><c:out value='${resultList.ordrInnb}'/>
</a>
</div>
<a href="" class="orderList__productTitle"><c:out value='${resultList.goodsNm}'/></a>
<c:if test = "${not empty resultList.optnNm}">
<span class="orderList__option">옵션: <c:out value='${resultList.optnNm}'/></span>
</c:if>
</div>
<div class="orderList__description__second">
</div>
<div class="orderList__description__third">
<span class="orderList__orderQuantity">
작성리뷰수:
<span class="comma rvwCnt"><c:out value ='${resultList.rvwCnt}'/></span><br>/
구매확정수량:
<span class="comma ordrGoodsQy"><c:out value ='${resultList.purchsDcsnQy}'/></span>
</span>
</div>
<div class="orderList__btnControls">
<%--구매확정수량이 리뷰 작성 수 보다 클 때만 노출--%>
<c:if test = "${resultList.purchsDcsnQy > resultList.rvwCnt}">
<button type = "button" class="btn outline sm full rvwBtn"
ordr-goods-optn-innb = "<c:out value ='${resultList.ordrGoodsOptnInnb}'/>"
bbs-ty-cd = "06"
value='<c:out value ='${resultList.goodsInnb}'/>'>리뷰작성</button>
</c:if>
<c:if test = "${resultList.mtRvwAt eq 'Y'}">
<button type = "button" class="btn theme sm full rvwBtn"
ordr-goods-optn-innb = "<c:out value ='${resultList.ordrGoodsOptnInnb}'/>"
bbs-ty-cd = "07"
value='<c:out value ='${resultList.goodsInnb}'/>'>한달리뷰작성</button>
</c:if>
</div>
</div>
</div>
</div>
</c:forEach>
</div>
<input type="hidden" id="setupInfoInnb" name="setupInfoInnb" value="<c:out value='${resultMap.bbsInfo.setupInfoInnb}'/>" />
<input type="hidden" id="wringPosblpageIndex" name="pageIndex" value="<c:out value='${resultMap.bbscttVO.pageIndex}'/>" />
<div class="pagination__container">
<ui:pagination paginationInfo="${resultMap.paginationInfo}" type="image" jsFunction="fn_move_writngPosblRvw" />
</div>
</c:when>
<c:otherwise>
<div class="orderList">
<div class="orderList__no-result">
<img src="/pc/images/icon__no-result.png" alt="">
<p class="orderList__no-result-text">
작성 가능한 리뷰가 없습니다.
</p>
</div>
</div>
</c:otherwise>
</c:choose>
</html>