초기소스
This commit is contained in:
@@ -0,0 +1,433 @@
|
||||
<%@ 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 : RelateGoodsPopupR.jsp
|
||||
Description : 장바구니 선택 팝업
|
||||
Modification Information
|
||||
|
||||
수정일 수정자 수정내용
|
||||
------- -------- ---------------------------
|
||||
2024-07-23 유재현 최초 생성
|
||||
--%>
|
||||
<script defer>
|
||||
fn_set_niceSelect_datePicker('.select-box')
|
||||
/*************************************************************
|
||||
장바구니 버튼 이벤트 (바텀시트)
|
||||
**************************************************************/
|
||||
|
||||
// 일반옵션
|
||||
// 라디오 버튼 클릭시, 상품 정보 배열에 추가 및 화면에 추가
|
||||
$(".productOption .product-option__item").each(function () {
|
||||
$(this).find("input[type=radio]").on("change", function () { // 라디오 버튼 클릭 시
|
||||
if ($(this).prop('checked') == false) return; // 체크 해제시 리턴
|
||||
const $title = $(this).closest(".product-option__item").find("label").text();
|
||||
const $price = $(this).closest(".product-option__item").find(".product-option__price").text();
|
||||
|
||||
const $goodsOptnInnb = $(this).closest(".product-option__item").find('input[name="goodsOptnInnb"]').val()
|
||||
const $goodsOptnTy = $(this).closest(".product-option__item").find('input[name="goodsOptnTy"]').val()
|
||||
const $optnInfo = $(this).closest(".product-option__item").find('.product-option__monthly-payment').text();
|
||||
|
||||
const $priceNum = parseInt($price.replace(/,/g, ""));
|
||||
|
||||
//이미 추가된 상품인지 확인
|
||||
var isItemAlreadyAdded = productArr.some(function (item) {
|
||||
return item[4] === $goodsOptnInnb;
|
||||
});
|
||||
if (isItemAlreadyAdded){
|
||||
fn_goods_duplicate_select_modal()
|
||||
return;
|
||||
}
|
||||
productArr.push([$title, 1, $priceNum, $priceNum * 1, $goodsOptnInnb, $goodsOptnTy]); // 배열에 상품 정보 추가
|
||||
$('#countContainer').append( // 화면에 상품 정보 추가
|
||||
'<div class="product-count">' +
|
||||
'<div class="product-count__amount-top">' +
|
||||
'<span class="product-count__amount-title">' + $title + '</span>' +
|
||||
'<button type="button" class="product-count__amount-delete"><span class="visually-hidden">삭제</span></button>' +
|
||||
'</div>' +
|
||||
'<div class="product-count__amount-bottom">' +
|
||||
'<div class="product-count__amount-counter">' +
|
||||
'<button type="button" class="product-count__amount-btn minus"><span class="visually-hidden">감소</span></button>' +
|
||||
'<span class="product-count__amount-number">1</span>' +
|
||||
'<button type="button" class="product-count__amount-btn plus"><span class="visually-hidden">추가</span></button>' +
|
||||
'</div>' +
|
||||
'<div class="product-count__amount-price-box">' +
|
||||
'<span class="product-count__amount-monthly-price">'+$optnInfo+'</span>' +
|
||||
'<span class="product-count__amount-price"><span class="comma product-count__priceNum">' + $price +
|
||||
'</div>' +
|
||||
'</div>' +
|
||||
'</div>'
|
||||
);
|
||||
updateCounters(); // 화면에 상품 정보 업데이트
|
||||
});
|
||||
});
|
||||
|
||||
//재고옵션
|
||||
$('#additionalSelect').on("change", "select", function () { // 셀렉트 선택 시
|
||||
if ($('#additionalSelect').find('.option.selected.disabled').length > 0) return;
|
||||
if ($('#additionalSelect').find('.option.selected').length == $('#additionalSelect').find('.nice-select').length) { // 모든 셀렉트가 선택되면
|
||||
|
||||
var $title = $('#addCartGoodsNm').val();
|
||||
var $optInfo = $(this).closest('.select-box').find(".option.selected").attr("data-value").split('|');
|
||||
|
||||
var $priceNum = $optInfo[0];
|
||||
var $goodsOptnInnb = $optInfo[1];
|
||||
var $goodsOptnInfo = $optInfo[2];
|
||||
var $goodsOptnTy = $optInfo[3];
|
||||
|
||||
var arr = [];
|
||||
for (var i = 0; i < $('#additionalSelect').find('.nice-select').length; i++) {
|
||||
arr.push($('#additionalSelect').find('.nice-select').eq(i).find('.option.selected').text());
|
||||
}
|
||||
|
||||
//이미 추가된 상품인지 확인
|
||||
var isItemAlreadyAdded = productArr.some(function (item) {
|
||||
return item[4] === $goodsOptnInnb;
|
||||
});
|
||||
if (isItemAlreadyAdded){
|
||||
fn_goods_duplicate_select_modal()
|
||||
return;
|
||||
}
|
||||
|
||||
productArr.push([$title, 1, $priceNum, $priceNum * 1, $goodsOptnInnb, $goodsOptnTy, arr]); // 배열에 상품 정보 추가
|
||||
let additionalSelectText = '옵션 : ' + arr.join(' / ').replace(/\(\+.*?\)/g, '') // 추가정보 텍스트로 변환
|
||||
$('#countContainer').append( // 화면에 상품 정보 추가
|
||||
'<div class="product-count">' +
|
||||
'<div class="product-count__amount-top">' +
|
||||
'<span class="product-count__amount-title">' + $title + '</span>' +
|
||||
'<div class="productDetailInfo__count__additionalSelect">' + additionalSelectText + '</div>' +
|
||||
'<button type="button" class="product-count__amount-delete"><span class="visually-hidden">삭제</span></button>' +
|
||||
'</div>' +
|
||||
'<div class="product-count__amount-bottom">' +
|
||||
'<div class="product-count__amount-counter">' +
|
||||
'<button type="button" class="product-count__amount-btn minus"><span class="visually-hidden">감소</span></button>' +
|
||||
'<span class="product-count__amount-number">1</span>' +
|
||||
'<button type="button" class="product-count__amount-btn plus"><span class="visually-hidden">추가</span></button>' +
|
||||
'</div>' +
|
||||
'<div class="product-count__amount-price-box">' +
|
||||
'<span class="product-count__amount-monthly-price">'+$goodsOptnInfo+'</span>' +
|
||||
'<span class="product-count__amount-price"><span class="comma product-count__priceNum">' + $priceNum +
|
||||
'</div>' +
|
||||
'</div>' +
|
||||
'</div>'
|
||||
);
|
||||
}
|
||||
updateCounters(); // 화면에 상품 정보 업데이트
|
||||
console.log(productArr); // 배열 정보확인
|
||||
|
||||
});
|
||||
|
||||
// 추가구성옵션
|
||||
$("#moreItemsSelect").on("change",'select', function () {
|
||||
const $moreItems = $('#moreItemsSelect').find(".select-box");
|
||||
const $optInfoOptn3 = $(this).closest(".select-box").find(".option.selected").attr('data-value').split('|');
|
||||
const $priceNumOptn3 = $optInfoOptn3[0];
|
||||
const $goodsOptnInnbOptn3 = $optInfoOptn3[1];
|
||||
const $goodsOptnInfoOptn3 = $optInfoOptn3[2];
|
||||
const $goodsOptnTyOptn3 = $optInfoOptn3[3];
|
||||
const $optnEssnlAtOptn3 = $(this).closest(".select-box").find('input[name="selectOptionItem__otpnEssntlAt__added"]').val();
|
||||
|
||||
var $title = $(this).closest(".select-box").find(".option.selected").text().replace('선택', ' ').replace(/\(\+.*?\)/g, '');
|
||||
var $priceNum = $(this).find(".option.selected").attr("data-value");
|
||||
|
||||
//이미 추가된 상품인지 확인
|
||||
var isItemAlreadyAdded = productArr.some(function (item) {
|
||||
return item[4] === $goodsOptnInnbOptn3;
|
||||
});
|
||||
if (isItemAlreadyAdded){
|
||||
fn_goods_duplicate_select_modal()
|
||||
return;
|
||||
}
|
||||
|
||||
productArr.push([$title, 1, $priceNumOptn3, $priceNumOptn3 * 1, $goodsOptnInnbOptn3, $goodsOptnTyOptn3, $optnEssnlAtOptn3]); // 배열에 상품 정보 추가
|
||||
$('#countContainer').append( // 화면에 상품 정보 추가
|
||||
'<div class="product-count">' +
|
||||
'<div class="product-count__amount-top">' +
|
||||
'<span class="product-count__amount-title">' + $title + '</span>' +
|
||||
'<button type="button" class="product-count__amount-delete"><span class="visually-hidden">삭제</span></button>' +
|
||||
'</div>' +
|
||||
'<div class="product-count__amount-bottom">' +
|
||||
'<div class="product-count__amount-counter">' +
|
||||
'<button type="button" class="product-count__amount-btn minus"><span class="visually-hidden">감소</span></button>' +
|
||||
'<span class="product-count__amount-number">1</span>' +
|
||||
'<button type="button" class="product-count__amount-btn plus"><span class="visually-hidden">추가</span></button>' +
|
||||
'</div>' +
|
||||
'<div class="product-count__amount-price-box">' +
|
||||
'<span class="product-count__amount-monthly-price">'+$goodsOptnInfoOptn3+'</span>' +
|
||||
'<span class="product-count__amount-price"><span class="comma product-count__priceNum">' + $priceNum +
|
||||
'</div>' +
|
||||
'</div>' +
|
||||
'</div>'
|
||||
);
|
||||
|
||||
$(this).val('').niceSelect('update')
|
||||
updateCounters(); // 화면에 상품 정보 업데이트
|
||||
|
||||
});
|
||||
|
||||
// 총 상품금액
|
||||
var $totalPrice = $(".productDetailInfo__priceTotal__totalPriceNum");
|
||||
|
||||
// 수량 "-", "+" 버튼 클릭 시, 수량 증감 및 가격 변경 및 총 상품금액 변경
|
||||
$("#countContainer").on("click", ".product-count__amount-btn", function () { // 수량 버튼 클릭 시
|
||||
var $counter = $(this);
|
||||
var $index = $counter.closest(".product-count").index(); // 해당 상품의 인덱스
|
||||
console.log($index); // 인덱스 확인
|
||||
if ($(this).hasClass("minus")) { // "-" 버튼 클릭 시
|
||||
if (productArr[$index][1] <= 1) return;
|
||||
productArr[$index][1]--; // 배열에서 해당 상품의 수량 감소
|
||||
productArr[$index][3] = productArr[$index][1] * productArr[$index][2]; // 배열에서 해당 상품의 총 가격 변경
|
||||
} else { // "+" 버튼 클릭 시
|
||||
productArr[$index][1]++; // 배열에서 해당 상품의 수량 증가
|
||||
productArr[$index][3] = productArr[$index][1] * productArr[$index][2]; // 배열에서 해당 상품의 총 가격 변경
|
||||
}
|
||||
updateCounters(); // 화면에 상품 정보 업데이트
|
||||
})
|
||||
|
||||
//배열 내용을 바탕으로 각 아이템 텍스트 변경
|
||||
function updateCounters() {
|
||||
$(".productOption .product-count").each(function () {
|
||||
var $counter = $(this);
|
||||
var $index = $counter.index();
|
||||
var $number = $counter.find(".product-count__amount-number");
|
||||
var $price = $counter.find(".product-count__priceNum");
|
||||
$number.text(productArr[$index][1]);
|
||||
$price.text(addComma(productArr[$index][3]) + "원");
|
||||
});
|
||||
updateTotalPrice(); // 총 상품금액 업데이트
|
||||
console.log(productArr); // 배열 정보확인
|
||||
}
|
||||
|
||||
// 3자리마다 "," 추가
|
||||
function addComma(num) {
|
||||
return num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
|
||||
}
|
||||
|
||||
// 총 상품금액 업데이트
|
||||
function updateTotalPrice() {
|
||||
var totalPrice = 0; // 총 상품금액
|
||||
for (var i = 0; i < productArr.length; i++) {
|
||||
totalPrice += productArr[i][3]; // 배열의 총 가격을 더함
|
||||
}
|
||||
$totalPrice.text(addComma(totalPrice)); // 총 상품금액 텍스트 변경
|
||||
}
|
||||
|
||||
// x버튼 클릭 시 삭제
|
||||
$("#countContainer").on("click", ".product-count__amount-delete", function () { // x 버튼 클릭 시
|
||||
var $index = $(this).closest(".product-count").index();
|
||||
productArr.splice($index, 1); // 배열에서 해당 상품 삭제
|
||||
$(this).closest(".product-count").remove(); // 화면에서 해당 상품 삭제
|
||||
updateCounters(); // 화면에 상품 정보 업데이트
|
||||
|
||||
//일반옵션이 하나일 경우 라디오 체크 해제(품절상품 제외) || 필수옵션 01이 상품 배열에 하나도 없을 경우
|
||||
if($('.productOption .product-option .custom-radio:not(:has(span))').length ===1
|
||||
|| productArr.filter(item => item[5] === '01').length === 0){
|
||||
$("input[name='r-group01']").prop('checked', false)
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
// 마지막으로 생성된 상품에 각인 정보 추가 TODO :: 입력옵션
|
||||
// $('#addTextBtn').on('click', function () {
|
||||
// var $index = $(".productOption .product-count").length - 1;
|
||||
// var $text = $('#addTextInput').val();
|
||||
// console.log(productArr[$index]); // 인덱스 확인
|
||||
// $(".productOption .product-count").eq($index).find(".product-count__amount-top").append('<div class="productDetailInfo__count__additionalSelect">각인문구 : ' + $text + '</div>');
|
||||
//
|
||||
// console.log(productArr); // 배열 정보확인
|
||||
// });
|
||||
|
||||
|
||||
</script>
|
||||
<!-- 상품옵션 선택 -->
|
||||
<div class="microModal microBottomSheet" id="product-option-sheet" aria-hidden="true">
|
||||
<div class="microModal__overlay" tabindex="-1">
|
||||
<div class="microModal__container" role="dialog" aria-modal="true">
|
||||
<div class="microModal__body">
|
||||
<div class="microModal__top">
|
||||
<button type="button" class="microModal__close" aria-label="창 닫기" onclick="closeModal('product-option-sheet')"></button>
|
||||
</div>
|
||||
<div class="microModal__content">
|
||||
<c:if test="${addCartResultMap.goodsDtl.goodsSttusCd eq '01'}">
|
||||
<input type="hidden" id="addCartGoodsInnb" value="${addCartResultMap.goodsDtl.goodsInnb}"/>
|
||||
<input type="hidden" id="sopmalCd" value="${addCartResultMap.goodsDtl.sopmalCd}"/>
|
||||
<input type="hidden" id="addCartGoodsNm" value="${addCartResultMap.goodsDtl.goodsNm}"/>
|
||||
<input type="hidden" id="slepricDscntAmt" value="${addCartResultMap.goodsDtl.slepric }"/>
|
||||
<c:forEach var="cardDv" items="${addCartResultMap.cartDvList}">
|
||||
<input type="hidden" value="${cardDv.cd}" id="cartDv-${cardDv.cdNm}"/>
|
||||
</c:forEach>
|
||||
<c:choose>
|
||||
<c:when test="${not empty addCartResultMap.optnList}">
|
||||
<div class="productOption">
|
||||
<c:if test="${not empty addCartResultMap.optnList.normalOptnList}">
|
||||
<p class="productOption__title">옵션 선택</p>
|
||||
<div class="product-option">
|
||||
<c:forEach var="goodsOpt01" items="${addCartResultMap.optnList.normalOptnList}" varStatus="optList01">
|
||||
<c:if test="${goodsOpt01.optnExpsrAt eq 'Y'}">
|
||||
<c:if test="${goodsOpt01.invntrySldoutExpsrAt eq 'Y'}">
|
||||
<div class="product-option__item">
|
||||
<c:if test="${not empty goodsOpt01.optnVal1}">
|
||||
<div class="custom-radio is-medium">
|
||||
<input type="radio" id="r-${goodsOpt01.optnOrdr}" name="r-group01" <c:if test="${goodsOpt01.disableAt eq 'Y'}"> disabled</c:if> >
|
||||
<label for="r-${goodsOpt01.optnOrdr}">${goodsOpt01.optnVal1}</label>
|
||||
<input type="hidden" name="optnCd" value="${goodsOpt01.optnCd1}">
|
||||
<input type="hidden" name="goodsOptnInnb" value="${goodsOpt01.goodsOptnInnb}"/>
|
||||
<input type="hidden" name="goodsOptnTy" value="${goodsOpt01.optnTy}"/>
|
||||
<input type="hidden" name="goodsSopmalCd" value="${goodsOpt01.sopmalCd}"/>
|
||||
<c:if test="${goodsOpt01.disableAt eq 'Y'}"> <span>(품절)</span></c:if>
|
||||
</div>
|
||||
<div class="product-option__right">
|
||||
<span class="product-option__price"><fmt:formatNumber value="${goodsOpt01.slepric}"/>원</span>
|
||||
<span class="product-option__monthly-payment">${goodsOpt01.optnInfo}</span>
|
||||
</div>
|
||||
</c:if>
|
||||
</div>
|
||||
</c:if>
|
||||
</c:if>
|
||||
</c:forEach>
|
||||
</div>
|
||||
</c:if>
|
||||
<c:if test="${not empty addCartResultMap.optnList.invntryOptnList}">
|
||||
<p class="productOption__title">옵션 선택</p>
|
||||
<div class="selectOptionItem" id="additionalSelect">
|
||||
<c:if test="${not empty addCartResultMap.optnList.invntryOptnList[0].optnNm1}">
|
||||
<div class="select-box">
|
||||
<select class="full" title="해당 셀렉트에 대한 설명" id="selectAddCartInvntryOptn1" name="selectAddCartInvntryOptn">
|
||||
<option value="" selected>선택</option>
|
||||
<c:forEach var="goodsOpt02" items="${addCartResultMap.optnList.invntryOptnList}" varStatus="optList02">
|
||||
<c:if test="${goodsOpt02.optnExpsrAt eq 'Y'}">
|
||||
<c:if test="${goodsOpt02.invntrySldoutExpsrAt eq 'Y'}">
|
||||
<c:if test="${goodsOpt02.optnVal1 ne addCartResultMap.optnList.invntryOptnList[optList02.index-1].optnVal1}">
|
||||
<option value="${goodsOpt02.slepric}|${goodsOpt02.goodsOptnInnb}|${goodsOpt02.optnInfo}|${goodsOpt02.optnTy}" <c:if test="${goodsOpt02.disableAt eq 'Y'}"> disabled </c:if> >
|
||||
<c:out value="${goodsOpt02.optnVal1}"/>
|
||||
</option>
|
||||
</c:if>
|
||||
</c:if>
|
||||
</c:if>
|
||||
</c:forEach>
|
||||
</select>
|
||||
</div>
|
||||
</c:if>
|
||||
<c:if test="${not empty addCartResultMap.optnList.invntryOptnList[0].optnNm2}">
|
||||
<div class="select-box">
|
||||
<select class="full" title="해당 셀렉트에 대한 설명" id="selectAddCartInvntryOptn2" name="selectAddCartInvntryOptn">
|
||||
<option value="" disabled selected>선택</option>
|
||||
</select>
|
||||
</div>
|
||||
</c:if>
|
||||
<c:if test="${not empty addCartResultMap.optnList.invntryOptnList[0].optnNm3}">
|
||||
<div class="select-box">
|
||||
<select class="full" title="해당 셀렉트에 대한 설명" id="selectAddCartInvntryOptn3" name="selectAddCartInvntryOptn">
|
||||
<option value="" disabled selected>선택</option>
|
||||
</select>
|
||||
</div>
|
||||
</c:if>
|
||||
<c:if test="${not empty addCartResultMap.optnList.invntryOptnList[0].optnNm4}">
|
||||
<div class="select-box">
|
||||
<select class="full" title="해당 셀렉트에 대한 설명" id="selectAddCartInvntryOptn4" name="selectAddCartInvntryOptn">
|
||||
<option value="" disabled selected>선택</option>
|
||||
</select>
|
||||
</div>
|
||||
</c:if>
|
||||
</div>
|
||||
</c:if>
|
||||
<c:if test="${not empty addCartResultMap.optnList.addedOptnList}">
|
||||
<p class="productOption__title">추가구성</p>
|
||||
<div class="selectOptionItem" id="moreItemsSelect">
|
||||
<c:forEach var="goodsOpt03" items="${addCartResultMap.optnList.addedOptnList}" varStatus="optList03">
|
||||
<c:if test="${not empty goodsOpt03.optnNm1}">
|
||||
<c:if test="${addCartResultMap.optnList.addedOptnList[optList03.index-1].optnNm1 ne goodsOpt03.optnNm1}">
|
||||
<div class="select-box">
|
||||
<input type="hidden" name="selectOptionItem__otpnEssntlAt__added" <c:if test="${goodsOpt03.optnEssntlAt eq 'Y'}"> value="Y"</c:if>/>
|
||||
<select class="full" title="해당 셀렉트에 대한 설명">
|
||||
<option value="" disabled selected>${goodsOpt03.optnNm1} 선택</option>
|
||||
<c:forEach var="goodsOptVal03" items="${addCartResultMap.optnList.addedOptnList}" varStatus="optVal03">
|
||||
<c:if test="${goodsOptVal03.optnNm1 eq goodsOpt03.optnNm1}">
|
||||
<c:if test="${goodsOptVal03.optnExpsrAt eq 'Y'}">
|
||||
<c:if test="${goodsOptVal03.invntrySldoutExpsrAt eq 'Y'}">
|
||||
<option value="${goodsOptVal03.slepric}|${goodsOptVal03.goodsOptnInnb}|${goodsOptVal03.optnInfo}|${goodsOptVal03.optnTy} " <c:if test="${goodsOptVal03.disableAt eq 'Y'}"> disabled</c:if> ><c:out value="${goodsOptVal03.optnVal1}"/> (+ <fmt:formatNumber value="${goodsOptVal03.slepric}"/>) <c:if test="${goodsOptVal03.disableAt eq 'Y'}"> <c:out value="(품절)"/> </c:if> </option>
|
||||
</c:if>
|
||||
</c:if>
|
||||
</c:if>
|
||||
</c:forEach>
|
||||
</select>
|
||||
</div>
|
||||
</c:if>
|
||||
</c:if>
|
||||
</c:forEach>
|
||||
</div>
|
||||
</c:if>
|
||||
<%-- <p class="productOption__title">상품정보 입력</p> TODO :: 입력옵션--%>
|
||||
<%-- <div class="inputOptionItem">--%>
|
||||
<%-- <input id="addTextInput" class="input-text full" type="text" title="해당 인풋에 대한 설명"--%>
|
||||
<%-- placeholder="각인 문구를 입력해주세요" value="">--%>
|
||||
<%-- <button type="button" id="addTextBtn" class="btn outline md">저장</button>--%>
|
||||
<%-- </div>--%>
|
||||
<div id="countContainer">
|
||||
</div>
|
||||
</div>
|
||||
</c:when>
|
||||
<c:otherwise>
|
||||
<%--옵션없음--%>
|
||||
</c:otherwise>
|
||||
</c:choose>
|
||||
</c:if>
|
||||
<div class="productOption__bottom">
|
||||
<div class="product-total__container">
|
||||
<span class="product-total__text">총 상품금액</span>
|
||||
<span class="product-total__price">
|
||||
<span class="productDetailInfo__priceTotal__totalPriceNum">0</span><span
|
||||
class="won">원</span></span>
|
||||
</div>
|
||||
<c:choose>
|
||||
<c:when test="${addCartResultMap.goodsDtl.buttonRplcWordsUseAt ne 'Y'}">
|
||||
<div class="product-btn-container">
|
||||
<%-- <button type="button" class="gift-btn">선물</button> TODO :: 선물하기 추후--%>
|
||||
<button type="button" class="btn theme outline addCart">장바구니</button>
|
||||
<button type="button" class="btn theme purchsOrdr">구매하기</button>
|
||||
</div>
|
||||
</c:when>
|
||||
<c:otherwise>
|
||||
<div class="product-btn-container">
|
||||
<a href="${addCartResultMap.goodsDtl.pcButtonRplcLink}"
|
||||
<c:if test="${addCartResultMap.goodsDtl.buttonRplcLinkBrwsrDvCd eq '01'}"> target="_blank" </c:if> >
|
||||
<button class="btn theme large"><c:out value="${addCartResultMap.goodsDtl.buttonRplcWords}"/></button>
|
||||
</a>
|
||||
</div>
|
||||
</c:otherwise>
|
||||
</c:choose>
|
||||
|
||||
<!-- 변경의 경우 -->
|
||||
<!-- <div class="product-btn-container">
|
||||
<button class="btn theme">변경하기</button>
|
||||
</div> -->
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<%--상품 중복담기 모달--%>
|
||||
<div class="microModal microAlert" id="modal-error-confirm-add-cart-duplicate" aria-hidden="true">
|
||||
<div class="microModal__overlay" tabindex="-1">
|
||||
<div class="microModal__container" role="dialog" aria-modal="true">
|
||||
<div class="microModal__body">
|
||||
<div class="microModal__top">
|
||||
<h2 class="microModal__title" id="modal-error-content-add-cart-duplicate">
|
||||
장바구니에 선택한 상품이 있습니다. <br/> 장바구니에 추가하시겠습니까?
|
||||
</h2>
|
||||
</div>
|
||||
</div>
|
||||
<div class="microModal__btnContainer">
|
||||
<button type="button" class="microModal__btn microModal__btn-primary" id="modal-error-confirm-yesButton" onclick="closeModal('modal-error-confirm-add-cart-duplicate');">예</button>
|
||||
<button type="button" class="microModal__btn" id="modal-error-confirm-noButton" onclick="closeModal('modal-error-confirm-add-cart-duplicate');">아니오</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
4800
src/main/webapp/WEB-INF/views/sopmal_m/goods/GoodsDtlR.jsp
Normal file
4800
src/main/webapp/WEB-INF/views/sopmal_m/goods/GoodsDtlR.jsp
Normal file
File diff suppressed because it is too large
Load Diff
214
src/main/webapp/WEB-INF/views/sopmal_m/goods/GoodsListR.jsp
Normal file
214
src/main/webapp/WEB-INF/views/sopmal_m/goods/GoodsListR.jsp
Normal file
@@ -0,0 +1,214 @@
|
||||
<%@ 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 : GoodsListR.jsp
|
||||
Description : 상품 목록 리스트
|
||||
Modification Information
|
||||
|
||||
수정일 수정자 수정내용
|
||||
------- -------- ---------------------------
|
||||
2024-05 리브가
|
||||
--%>
|
||||
|
||||
<div class="sub-page">
|
||||
<div class="sub-box">
|
||||
<!-- 상품 - 카테고리별 타입 (상품 2열) -->
|
||||
<section class="subList__productList">
|
||||
<div class="listTop">
|
||||
<span class="listTop__data">총
|
||||
<em><c:out value="${ resultMap.paginationInfo.totalRecordCount }" default="0"/> </em>건
|
||||
</span>
|
||||
<div class="subList__sort">
|
||||
<button type="button" class="categoryTriggerBtn" role="button"
|
||||
onclick="openModal('categorySelectPop01')">
|
||||
인기순
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<c:choose>
|
||||
<c:when test="${ not empty resultMap.list }">
|
||||
<div class="product-list-type-2cols">
|
||||
<div class="product-list-type-2cols__list">
|
||||
<c:forEach var="list" items="${resultMap.list}" varStatus="status">
|
||||
<div class="product-unit">
|
||||
<div class="product-unit-image">
|
||||
<c:if test="${(list.evtTmeExpsrAt eq 'Y' and list.remainTime ne 'N')
|
||||
or (list.rltmQyBannerExpsrAt eq 'Y' and list.remainQy > 0) }">
|
||||
<div class="time-sale__top">
|
||||
<c:if test="${list.evtTmeExpsrAt eq 'Y' and list.remainTime ne 'N'}">
|
||||
<span class="time" id="remainTime${status.index}" name="remainTime"><c:out
|
||||
value="${list.remainTime}"/> </span>
|
||||
<input type="hidden" id="evtTmeExpsrAt${status.index}" name="evtTmeExpsrAt"
|
||||
value="${list.evtTmeExpsrAt}">
|
||||
</c:if>
|
||||
<c:if test="${list.rltmQyBannerExpsrAt eq 'Y' and list.remainQy > 0 }">
|
||||
<span class="left">남은수량 <fmt:formatNumber value="${list.remainQy}"/> 개</span>
|
||||
</c:if>
|
||||
</div>
|
||||
</c:if>
|
||||
<c:choose>
|
||||
<c:when test="${list.goodsSttusCd eq '02'}">
|
||||
<div class="sold-out">
|
||||
<span>SOLD OUT</span>
|
||||
</div>
|
||||
</c:when>
|
||||
<c:when test="${list.goodsSttusCd eq '03'}">
|
||||
<div class="sold-out">
|
||||
<span>${list.goodsSttusNm}</span>
|
||||
</div>
|
||||
</c:when>
|
||||
<c:otherwise>
|
||||
<%--정상일 경우 처리없음--%>
|
||||
</c:otherwise>
|
||||
</c:choose>
|
||||
<form id="detailForm">
|
||||
<a class="product-detail" href="javascript:void(0);"
|
||||
onclick="fn_move_goods_dtl('<c:out value="${list.goodsInnb}"/>'); ">
|
||||
<spring:eval
|
||||
expression="@environment.getProperty('sopmalfo.common.fileupload.cdnurl')"
|
||||
var="cdnurl"/>
|
||||
<img src="<c:out value="${cdnurl}${list.goodsImgCours}"/>"
|
||||
onerror="this.src='/mobile/images/image_placeholder.png'"
|
||||
alt="${list.goodsNm}" loading="lazy"/>
|
||||
</a>
|
||||
</form>
|
||||
<c:if test="${not empty list.pricRplcWordsUseAt and list.pricRplcWordsUseAt ne 'Y'}">
|
||||
<button type="button" class="product-unit-addToCart" onclick="fn_mbl_open_modal
|
||||
('addGoodsCartDiv', 'product-option-sheet', '/sopmal/goods/selectAddCartGoodsPopup',
|
||||
JSON.stringify({'goodsInnb' : `${list.goodsInnb}`}))">
|
||||
<i class="icon icon_product-unit-addToCart"></i>
|
||||
<span class="visually-hidden">장바구니에 담기</span>
|
||||
</button>
|
||||
</c:if>
|
||||
</div>
|
||||
<div class="product-unit-info d-flex flex-column" style="flex-direction:column">
|
||||
<c:if test="${not empty list.iconCdNmList}">
|
||||
<c:if test="${list.iconExpsrAt eq 'Y'}">
|
||||
<div class="product-badge-container col order-${list.iconExpsrOrdr-1}" style="order: ${list.iconExpsrOrdr-1} ">
|
||||
<c:forEach items="${fn:split(list.iconCdNmList, ',')}" var="iconCdNm" varStatus="iconStatus">
|
||||
<c:choose>
|
||||
<c:when test="${fn:contains(iconCdNm, '-')}">
|
||||
<span class="product-badge ${fn:toLowerCase(iconCdNm)}">${fn:replace(fn:toUpperCase(iconCdNm), '-', ' ')}</span>
|
||||
</c:when>
|
||||
<c:otherwise>
|
||||
<span class="product-badge ${fn:toLowerCase(iconCdNm)}">${fn:toUpperCase(iconCdNm)}</span>
|
||||
</c:otherwise>
|
||||
</c:choose>
|
||||
</c:forEach>
|
||||
</div>
|
||||
</c:if>
|
||||
</c:if>
|
||||
<%-- <div class="product-unit-info__inner">--%>
|
||||
<c:if test="${list.goodsNmExpsrAt eq 'Y'}">
|
||||
<div class="product-unit-title col order-${list.goodsNmExpsrOrdr-1}" style="order:${list.goodsNmExpsrOrdr-1} ">
|
||||
<a href="javascript:void(0);" onclick="fn_move_goods_dtl('<c:out value="${list.goodsInnb}"/>'); "><c:out value="${list.goodsNm}"/></a>
|
||||
</div>
|
||||
</c:if>
|
||||
<c:if test="${list.pricExpsrAt eq 'Y'}">
|
||||
<c:choose>
|
||||
<c:when test="${not empty list.pricRplcWordsUseAt and list.pricRplcWordsUseAt ne 'Y'}">
|
||||
<div class="product-unit-price col order-${list.pricExpsrOrdr-1}" style="order: ${list.pricExpsrOrdr-1}">
|
||||
<div class="product-unit-price__price">
|
||||
<span class="product-unit-price__original"><fmt:formatNumber
|
||||
value="${list.cnsmrpric}"/> 원</span>
|
||||
<span class="product-unit-price__current"><fmt:formatNumber
|
||||
value="${list.slepric}"/> 원</span>
|
||||
</div>
|
||||
<div class="product-unit-price__sale">
|
||||
<span class="percent"> <c:out value="${list.slePercent}"/> %</span>
|
||||
</div>
|
||||
</div>
|
||||
</c:when>
|
||||
<c:otherwise>
|
||||
<div class="productDetailInfo__price">
|
||||
<a href="${list.mblPricRplcLink}" <c:if test="${list.pricRplcLinkBrwsrDvCd eq'01'}"> target="_blank" </c:if> >
|
||||
<span class="" style="font-size: 1rem;"> <c:out value="${list.pricRplcWords}"/></span>
|
||||
</a>
|
||||
</div>
|
||||
</c:otherwise>
|
||||
</c:choose>
|
||||
</c:if>
|
||||
<c:if test="${list.reprsntDcExpsrAt eq 'Y'}">
|
||||
<div class="product-unit-price__monthly-payment col order-${list.reprsntDcExpsrOrdr-1}" style="order: ${list.reprsntDcExpsrOrdr-1}"><c:out value="${list.reprsntDc}"/></div>
|
||||
</c:if>
|
||||
<%-- </div>--%>
|
||||
<c:if test="${list.rvwEvlScreExpsrAt eq 'Y'}">
|
||||
<div class="product-unit-rating col order-${list.rvwEvlScreExpsrOrdr-1}" style="order: ${list.rvwEvlScreExpsrOrdr-1}">
|
||||
<i class="icon icon_rating-star"></i>
|
||||
<span class="product-unit-rating__score"><c:out value="${list.avgEvlScore}" default="0.0"/> </span>
|
||||
<span class="product-unit-rating__count">(<fmt:formatNumber value="${list.cntEvlScor}"/>) </span>
|
||||
</div>
|
||||
</c:if>
|
||||
<c:if test="${list.dlvyExpsrAt eq 'Y'}">
|
||||
<div class="product-unit-price__monthly-payment col order-${list.dlvyExpsrOrdr-1}" style="order: ${list.dlvyExpsrOrdr-1}"><c:out value="${list.dlvyGroupNm}"/></div>
|
||||
</c:if>
|
||||
</div>
|
||||
</div>
|
||||
</c:forEach>
|
||||
<div id="infinityScrollGoodsList"></div>
|
||||
</div>
|
||||
</div>
|
||||
</c:when>
|
||||
<c:otherwise>
|
||||
<div class="product-list-type-2cols">
|
||||
<div class="noResult">
|
||||
<div class="noResult__image">
|
||||
<img src="/mobile/images/icon__no-result.png" alt="상품 이미지">
|
||||
</div>
|
||||
<p class="noResult__text">해당 상품이 없습니다.</p>
|
||||
</div>
|
||||
</div>
|
||||
</c:otherwise>
|
||||
</c:choose>
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 240709 정렬 바텀시트 -->
|
||||
<div class="microModal microBottomSheet" id="categorySelectPop01" aria-hidden="true">
|
||||
<div class="microModal__overlay" tabindex="-1">
|
||||
<div class="microModal__container" role="dialog" aria-modal="true">
|
||||
<div class="microModal__body">
|
||||
<div class="microModal__top">
|
||||
<button class="microModal__close" aria-label="창 닫기" data-micromodal-close></button>
|
||||
</div>
|
||||
<div class="microModal__content">
|
||||
<div class="modalSelect">
|
||||
<div class="modalSelect__list">
|
||||
<label class="modalSelect__item">
|
||||
<input type="radio" name="sortDv" value="avgEvlScore" >
|
||||
<span>인기순</span>
|
||||
</label>
|
||||
<label class="modalSelect__item">
|
||||
<input type="radio" name="sortDv" value="cntEvlScor" >
|
||||
<span>리뷰 많은순</span>
|
||||
</label>
|
||||
<label class="modalSelect__item">
|
||||
<input type="radio" name="sortDv" value="slepricAsc">
|
||||
<span>낮은 가격순</span>
|
||||
</label>
|
||||
<label class="modalSelect__item">
|
||||
<input type="radio" name="sortDv" value="slepricDesc">
|
||||
<span>높은 가격순</span>
|
||||
</label>
|
||||
<label class="modalSelect__item">
|
||||
<input type="radio" name="sortDv" value="goodsInnbDesc">
|
||||
<span>신상품순</span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<%--장바구니 버튼 선택 모달--%>
|
||||
<div id="addGoodsCartDiv"></div>
|
||||
<%--장바구니 담기 후 모달--%>
|
||||
<div id="addCartDiv"></div>
|
||||
<%--상품 중복선택 모달--%>
|
||||
<div id="goodsDuplicateDiv"></div>
|
||||
1261
src/main/webapp/WEB-INF/views/sopmal_m/goods/GoodsListRForm.jsp
Normal file
1261
src/main/webapp/WEB-INF/views/sopmal_m/goods/GoodsListRForm.jsp
Normal file
File diff suppressed because it is too large
Load Diff
210
src/main/webapp/WEB-INF/views/sopmal_m/goods/GoodsSrchR.jsp
Normal file
210
src/main/webapp/WEB-INF/views/sopmal_m/goods/GoodsSrchR.jsp
Normal file
@@ -0,0 +1,210 @@
|
||||
<%@ 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 : GoodsSrchR.jsp
|
||||
Description : 상품 검색 리스트
|
||||
Modification Information
|
||||
|
||||
수정일 수정자 수정내용
|
||||
------- -------- ---------------------------
|
||||
2024-05 리브가
|
||||
--%>
|
||||
<div class="sub-page">
|
||||
<div class="sub-box">
|
||||
<!-- 상품 - 카테고리별 타입 (상품 2열) -->
|
||||
<section class="subList__productList">
|
||||
<div class="listTop">
|
||||
<span class="listTop__data">총
|
||||
<em><c:out value="${ resultMap.paginationInfo.totalRecordCount }" default="0"/> </em>건
|
||||
</span>
|
||||
<div class="subList__sort">
|
||||
<button type="button" class="categoryTriggerBtn" role="button"
|
||||
onclick="openModal('categorySelectPop01')">
|
||||
인기순
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<c:choose>
|
||||
<c:when test="${ not empty resultMap.list }">
|
||||
<div class="product-list-type-2cols">
|
||||
<div class="product-list-type-2cols__list">
|
||||
<c:forEach var="list" items="${resultMap.list}" varStatus="status">
|
||||
<div class="product-unit">
|
||||
<div class="product-unit-image">
|
||||
<c:if test="${(list.evtTmeExpsrAt eq 'Y' and list.remainTime ne 'N')
|
||||
or (list.rltmQyBannerExpsrAt eq 'Y' and list.remainQy > 0) }">
|
||||
<div class="time-sale__top">
|
||||
<c:if test="${list.evtTmeExpsrAt eq 'Y' and list.remainTime ne 'N'}">
|
||||
<span class="time" id="remainTime${status.index}" name="remainTime"><c:out
|
||||
value="${list.remainTime}"/> </span>
|
||||
<input type="hidden" id="evtTmeExpsrAt${status.index}" name="evtTmeExpsrAt"
|
||||
value="${list.evtTmeExpsrAt}">
|
||||
</c:if>
|
||||
<c:if test="${list.rltmQyBannerExpsrAt eq 'Y' and list.remainQy > 0 }">
|
||||
<span class="left">남은수량 <fmt:formatNumber value="${list.remainQy}"/> 개</span>
|
||||
</c:if>
|
||||
</div>
|
||||
</c:if>
|
||||
<c:choose>
|
||||
<c:when test="${list.goodsSttusCd eq '02'}">
|
||||
<div class="sold-out">
|
||||
<span>SOLD OUT</span>
|
||||
</div>
|
||||
</c:when>
|
||||
<c:when test="${list.goodsSttusCd eq '03'}">
|
||||
<div class="sold-out">
|
||||
<span>${list.goodsSttusNm}</span>
|
||||
</div>
|
||||
</c:when>
|
||||
</c:choose>
|
||||
<form id="detailForm">
|
||||
<a class="product-detail" href="javascript:void(0);"
|
||||
onclick="fn_move_goods_dtl('<c:out value="${list.goodsInnb}"/>'); ">
|
||||
<spring:eval
|
||||
expression="@environment.getProperty('sopmalfo.common.fileupload.cdnurl')"
|
||||
var="cdnurl"/>
|
||||
<img src="<c:out value="${cdnurl}${list.goodsImgCours}"/>"
|
||||
onerror="this.src='/mobile/images/image_placeholder.png'"
|
||||
alt="${list.goodsNm}" loading="lazy"/>
|
||||
</a>
|
||||
</form>
|
||||
<c:if test="${not empty list.pricRplcWordsUseAt and list.pricRplcWordsUseAt ne 'Y'}">
|
||||
<button type="button" class="product-unit-addToCart" onclick="fn_mbl_open_modal
|
||||
('addGoodsCartDiv', 'product-option-sheet', '/sopmal/goods/selectAddCartGoodsPopup',
|
||||
JSON.stringify({'goodsInnb' : `${list.goodsInnb}`}))">
|
||||
<i class="icon icon_product-unit-addToCart"></i>
|
||||
<span class="visually-hidden">장바구니에 담기</span>
|
||||
</button>
|
||||
</c:if>
|
||||
</div>
|
||||
<div class="product-unit-info d-flex flex-column" style="flex-direction:column">
|
||||
<c:if test="${not empty list.iconCdNmList}">
|
||||
<c:if test="${list.iconExpsrAt eq 'Y'}">
|
||||
<div class="product-badge-container col order-${list.iconExpsrOrdr-1}" style="order: ${list.iconExpsrOrdr-1} ">
|
||||
<c:forEach items="${fn:split(list.iconCdNmList, ',')}" var="iconCdNm" varStatus="iconStatus">
|
||||
<c:choose>
|
||||
<c:when test="${fn:contains(iconCdNm, '-')}">
|
||||
<span class="product-badge ${fn:toLowerCase(iconCdNm)}">${fn:replace(fn:toUpperCase(iconCdNm), '-', ' ')}</span>
|
||||
</c:when>
|
||||
<c:otherwise>
|
||||
<span class="product-badge ${fn:toLowerCase(iconCdNm)}">${fn:toUpperCase(iconCdNm)}</span>
|
||||
</c:otherwise>
|
||||
</c:choose>
|
||||
</c:forEach>
|
||||
</div>
|
||||
</c:if>
|
||||
</c:if>
|
||||
<%-- <div class="product-unit-info__inner">--%>
|
||||
<c:if test="${list.goodsNmExpsrAt eq 'Y'}">
|
||||
<div class="product-unit-title col order-${list.goodsNmExpsrOrdr-1}" style="order:${list.goodsNmExpsrOrdr-1} ">
|
||||
<a href="javascript:void(0);"><c:out value="${list.goodsNm}"/></a>
|
||||
</div>
|
||||
</c:if>
|
||||
<c:if test="${list.pricExpsrAt eq 'Y'}">
|
||||
<c:choose>
|
||||
<c:when test="${not empty list.pricRplcWordsUseAt and list.pricRplcWordsUseAt ne 'Y'}">
|
||||
<div class="product-unit-price col order-${list.pricExpsrOrdr-1}" style="order: ${list.pricExpsrOrdr-1}">
|
||||
<div class="product-unit-price__price">
|
||||
<span class="product-unit-price__original"><fmt:formatNumber
|
||||
value="${list.cnsmrpric}"/> 원</span>
|
||||
<span class="product-unit-price__current"><fmt:formatNumber
|
||||
value="${list.slepric}"/> 원</span>
|
||||
</div>
|
||||
<div class="product-unit-price__sale">
|
||||
<span class="percent"> <c:out value="${list.slePercent}"/> %</span>
|
||||
</div>
|
||||
</div>
|
||||
</c:when>
|
||||
<c:otherwise>
|
||||
<div class="productDetailInfo__price">
|
||||
<a href="${list.mblPricRplcLink}" <c:if test="${list.pricRplcLinkBrwsrDvCd eq'01'}"> target="_blank" </c:if> >
|
||||
<span class="" style="font-size: 1rem;"> <c:out value="${list.pricRplcWords}"/></span>
|
||||
</a>
|
||||
</div>
|
||||
</c:otherwise>
|
||||
</c:choose>
|
||||
</c:if>
|
||||
<c:if test="${list.reprsntDcExpsrAt eq 'Y'}">
|
||||
<div class="product-unit-price__monthly-payment col order-${list.reprsntDcExpsrOrdr-1}" style="order: ${list.reprsntDcExpsrOrdr-1}"><c:out value="${list.reprsntDc}"/></div>
|
||||
</c:if>
|
||||
<%-- </div>--%>
|
||||
<c:if test="${list.rvwEvlScreExpsrAt eq 'Y'}">
|
||||
<div class="product-unit-rating col order-${list.rvwEvlScreExpsrOrdr-1}" style="order: ${list.rvwEvlScreExpsrOrdr-1}">
|
||||
<i class="icon icon_rating-star"></i>
|
||||
<span class="product-unit-rating__score"><c:out value="${list.avgEvlScore}" default="0.0"/> </span>
|
||||
<span class="product-unit-rating__count">(<fmt:formatNumber value="${list.cntEvlScor}"/>) </span>
|
||||
</div>
|
||||
</c:if>
|
||||
<c:if test="${list.dlvyExpsrAt eq 'Y'}">
|
||||
<div class="product-unit-price__monthly-payment col order-${list.dlvyExpsrOrdr-1}" style="order: ${list.dlvyExpsrOrdr-1}"><c:out value="${list.dlvyGroupNm}"/></div>
|
||||
</c:if>
|
||||
</div>
|
||||
</div>
|
||||
</c:forEach>
|
||||
<div id="infinityScrollGoodsList"></div>
|
||||
</div>
|
||||
</div>
|
||||
</c:when>
|
||||
<c:otherwise>
|
||||
<div class="product-list-type-2cols">
|
||||
<div class="noResult">
|
||||
<div class="noResult__image">
|
||||
<img src="/mobile/images/icon__no-result.png" alt="상품 이미지">
|
||||
</div>
|
||||
<p class="noResult__text">해당 상품이 없습니다.</p>
|
||||
</div>
|
||||
</div>
|
||||
</c:otherwise>
|
||||
</c:choose>
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 240709 정렬 바텀시트 -->
|
||||
<div class="microModal microBottomSheet" id="categorySelectPop01" aria-hidden="true">
|
||||
<div class="microModal__overlay" tabindex="-1">
|
||||
<div class="microModal__container" role="dialog" aria-modal="true">
|
||||
<div class="microModal__body">
|
||||
<div class="microModal__top">
|
||||
<button class="microModal__close" aria-label="창 닫기" data-micromodal-close></button>
|
||||
</div>
|
||||
<div class="microModal__content">
|
||||
<div class="modalSelect">
|
||||
<div class="modalSelect__list">
|
||||
<label class="modalSelect__item">
|
||||
<input type="radio" name="sortDv" value="avgEvlScore" >
|
||||
<span>인기순</span>
|
||||
</label>
|
||||
<label class="modalSelect__item">
|
||||
<input type="radio" name="sortDv" value="cntEvlScor" >
|
||||
<span>리뷰 많은순</span>
|
||||
</label>
|
||||
<label class="modalSelect__item">
|
||||
<input type="radio" name="sortDv" value="slepricAsc">
|
||||
<span>낮은 가격순</span>
|
||||
</label>
|
||||
<label class="modalSelect__item">
|
||||
<input type="radio" name="sortDv" value="slepricDesc">
|
||||
<span>높은 가격순</span>
|
||||
</label>
|
||||
<label class="modalSelect__item">
|
||||
<input type="radio" name="sortDv" value="goodsInnbDesc">
|
||||
<span>신상품순</span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<%--장바구니 버튼 선택 모달--%>
|
||||
<div id="addGoodsCartDiv"></div>
|
||||
<%--장바구니 담기 후 모달--%>
|
||||
<div id="addCartDiv"></div>
|
||||
<%--상품 중복선택 모달--%>
|
||||
<div id="goodsDuplicateDiv"></div>
|
||||
1268
src/main/webapp/WEB-INF/views/sopmal_m/goods/GoodsSrchRForm.jsp
Normal file
1268
src/main/webapp/WEB-INF/views/sopmal_m/goods/GoodsSrchRForm.jsp
Normal file
File diff suppressed because it is too large
Load Diff
131
src/main/webapp/WEB-INF/views/sopmal_m/goods/QnaListR.jsp
Normal file
131
src/main/webapp/WEB-INF/views/sopmal_m/goods/QnaListR.jsp
Normal file
@@ -0,0 +1,131 @@
|
||||
<%@ 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 : QnaListR.jsp
|
||||
Description : 상품qna 목록
|
||||
Modification Information
|
||||
|
||||
수정일 수정자 수정내용
|
||||
------- -------- ---------------------------
|
||||
2024-05 김혜인
|
||||
--%>
|
||||
<!DOCTYPE html>
|
||||
<html lang="ko">
|
||||
<script>
|
||||
$(document).ready(function(){
|
||||
let goodsQnaCnt = '<c:out value="${resultMap.paginationInfo.totalRecordCount}"/>';
|
||||
goodsQnaCnt = fn_format_comma(goodsQnaCnt);
|
||||
$("#goodsQnaCnt").text(goodsQnaCnt);
|
||||
});
|
||||
</script>
|
||||
<%--이미지 소스 url--%>
|
||||
<spring:eval expression="@environment.getProperty('sopmalfo.common.fileupload.cdnurl')" var="cdnurl"/>
|
||||
<div class="productQnaList">
|
||||
<div class="sub-box">
|
||||
<div class="productQnaList__controls">
|
||||
<button class="categoryTriggerBtn" id="srchitmInnbBtn">
|
||||
전체
|
||||
</button>
|
||||
<button class="btn theme" id = "registBtn">문의하기</button>
|
||||
</div>
|
||||
<c:choose>
|
||||
<c:when test="${ not empty resultMap.resultList.qnaList }">
|
||||
<c:forEach var="resultList" items="${ resultMap.resultList.qnaList}">
|
||||
<details class="productQnaList__item qnaList" bbsctt="<c:out value="${ resultList.bbscttInnb }"/>">
|
||||
<summary class="productQnaList__top">
|
||||
<div class="productQnaList__image">
|
||||
<img src="<c:out value="${cdnurl}${ resultList.img }"/>" onerror='this.src = "/mobile/images/image_placeholder.png"' alt="상품 이미지">
|
||||
</div>
|
||||
<div class="productQnaList__right ">
|
||||
<div class="productQnaList__info ">
|
||||
<p class="productQnaList__info__question ">
|
||||
<span class="category"><c:if test="${not empty resultList.answCn}">
|
||||
[<c:out value="${resultList.answCn}"/>]</c:if></span>
|
||||
<c:out value="${ resultList.regusrNm}"/>님의 소중한 질문입니다.
|
||||
<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.secretBbscttAt eq 'Y' }"><%--비밀글여부--%>
|
||||
<i class="icon icon_lock"></i>
|
||||
</c:if>
|
||||
</p>
|
||||
<p class="productQnaList__info__status ">
|
||||
<c:choose>
|
||||
<c:when test="${not empty resultList.answBbscttInnb}">
|
||||
<span>답변완료</span>
|
||||
</c:when>
|
||||
<c:otherwise>
|
||||
<span>답변대기</span>
|
||||
</c:otherwise>
|
||||
</c:choose>
|
||||
<span class="productQnaList__info__date"><c:out value="${resultList.registDt}"/></span>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</summary>
|
||||
<div class="productQnaList__answer">
|
||||
|
||||
</div>
|
||||
</details>
|
||||
</c:forEach>
|
||||
<div class="fullBtnSection" id = "qnaMoreDiv">
|
||||
<c:if test = "${resultMap.bbscttVO.pageUnit eq fn:length(resultMap.resultList.qnaList)}">
|
||||
<button class="btn md outline full" id = "qnaMore">
|
||||
<span class="fullBtnSection__more">
|
||||
더보기
|
||||
</span>
|
||||
</button>
|
||||
</c:if>
|
||||
</div>
|
||||
<input type="hidden" value = "<c:out value="${resultMap.bbscttVO.pageIndex}"/>" id = "qnaPageIndex">
|
||||
</c:when>
|
||||
<c:otherwise>
|
||||
<div class="noResult">
|
||||
<div class="noResult__image">
|
||||
<img src="/mobile/images/icon__no-result.png" alt="상품 이미지">
|
||||
</div>
|
||||
<p class="noResult__text">등록된 상품 문의가 없습니다.</p>
|
||||
</div>
|
||||
</c:otherwise>
|
||||
</c:choose>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<%-- 상품qna 분류 --%>
|
||||
<div class="microModal microBottomSheet" id="qnaItmPop" aria-hidden="true">
|
||||
<div class="microModal__overlay" tabindex="-1">
|
||||
<div class="microModal__container" role="dialog" aria-modal="true">
|
||||
<div class="microModal__body">
|
||||
<div class="microModal__top">
|
||||
<button class="microModal__close" aria-label="창 닫기" data-micromodal-close></button>
|
||||
</div>
|
||||
<div class="microModal__content">
|
||||
<div class="modalSelect">
|
||||
<div class="modalSelect__list">
|
||||
<input type="hidden" value="" id="srchitmInnbVal">
|
||||
<label class="modalSelect__item">
|
||||
<input type="radio" name="srchitmInnb" value="" class="srchitmInnb">
|
||||
<span>전체보기</span>
|
||||
</label>
|
||||
<c:forEach var="itm" items="${resultMap.itmList}">
|
||||
<label class="modalSelect__item">
|
||||
<input type="radio" name="srchitmInnb" value="<c:out value = '${itm.itmInnb}'/>" class="srchitmInnb">
|
||||
<span><c:out value='${itm.itmCn}'/></span>
|
||||
</label>
|
||||
</c:forEach>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</html>
|
||||
@@ -0,0 +1,440 @@
|
||||
<%@ 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 : RelateGoodsPopupR.jsp
|
||||
Description : 함께하면 좋은 상품(관련 상품) 팝업
|
||||
Modification Information
|
||||
|
||||
수정일 수정자 수정내용
|
||||
------- -------- ---------------------------
|
||||
2024-07-23 유재현 최초 생성
|
||||
--%>
|
||||
<script defer>
|
||||
/*************************************************************
|
||||
함께하면 좋은상품 이벤트 (모달)
|
||||
**************************************************************/
|
||||
fn_set_niceSelect_datePicker('.select-box')
|
||||
//일반옵션
|
||||
// // 라디오 버튼 클릭시, 상품 정보 배열에 추가 및 화면에 추가
|
||||
$("#relate-product-option-sheet .product-option__item").each(function () {
|
||||
$(this).find("input[type=radio]").on("change", function () { // 라디오 버튼 클릭 시
|
||||
if ($(this).prop('checked') == false) return; // 체크 해제시 리턴
|
||||
const $title = $(this).closest(".product-option__item").find("label").text();
|
||||
const $price = $(this).closest(".product-option__item").find(".product-option__price").text();
|
||||
const $goodsOptnInnb = $(this).closest(".product-option__item").find('input[name="goodsOptnInnb"]').val()
|
||||
const $goodsOptnTy = $(this).closest(".product-option__item").find('input[name="goodsOptnTy"]').val()
|
||||
const $optnInfo = $(this).closest(".product-option__item").find('.product-option__monthly-payment').text();
|
||||
|
||||
const $priceNum = parseInt($price.replace(/,/g, ""));
|
||||
|
||||
//이미 추가된 상품인지 확인
|
||||
var isItemAlreadyAdded = cartProductArr.some(function (item) {
|
||||
return item[4] === $goodsOptnInnb;
|
||||
});
|
||||
if (isItemAlreadyAdded){
|
||||
fn_goods_duplicate_select_modal()
|
||||
return;
|
||||
}
|
||||
|
||||
const $relateGoodsInnb = $(this).closest(".product-option__item").find('input[name="relateGoodsInnb"]').val()
|
||||
|
||||
cartProductArr.push([$title, 1, $priceNum, $priceNum * 1, $goodsOptnInnb, $goodsOptnTy, $relateGoodsInnb]); // 배열에 상품 정보 추가
|
||||
$('#cartCountContainer').append( // 화면에 상품 정보 추가
|
||||
'<div class="product-count">' +
|
||||
'<div class="product-count__amount-top">' +
|
||||
'<span class="product-count__amount-title">' + $title + '</span>' +
|
||||
'<button class="product-count__amount-delete"><span class="visually-hidden">삭제</span></button>' +
|
||||
'</div>' +
|
||||
'<div class="product-count__amount-bottom">' +
|
||||
'<div class="product-count__amount-counter">' +
|
||||
'<button class="product-count__amount-btn minus"><span class="visually-hidden">감소</span></button>' +
|
||||
'<span class="product-count__amount-number">1</span>' +
|
||||
'<button class="product-count__amount-btn plus"><span class="visually-hidden">추가</span></button>' +
|
||||
'</div>' +
|
||||
'<div class="product-count__amount-price-box">' +
|
||||
'<span class="product-count__amount-monthly-price">'+$optnInfo+'</span>' +
|
||||
'<span class="product-count__amount-price"><span class="comma product-count__amount-priceNum">' + $price +
|
||||
'</div>' +
|
||||
'</div>' +
|
||||
'</div>'
|
||||
);
|
||||
|
||||
updateCartCounters(); // 화면에 상품 정보 업데이트
|
||||
});
|
||||
});
|
||||
|
||||
// 총 상품금액
|
||||
var $cartTotalPrice = $(".product-total__price__totalPriceNum");
|
||||
|
||||
// 수량 "-", "+" 버튼 클릭 시, 수량 증감 및 가격 변경 및 총 상품금액 변경
|
||||
$("#cartCountContainer").on("click", ".product-count__amount-btn", function () { // 수량 버튼 클릭 시
|
||||
var $counter = $(this);
|
||||
var $index = $counter.closest(".product-count").index(); // 해당 상품의 인덱스
|
||||
if ($(this).hasClass("minus")) { // "-" 버튼 클릭 시
|
||||
if (cartProductArr[$index][1] <= 1) return;
|
||||
cartProductArr[$index][1]--; // 배열에서 해당 상품의 수량 감소
|
||||
cartProductArr[$index][3] = cartProductArr[$index][1] * cartProductArr[$index][2]; // 배열에서 해당 상품의 총 가격 변경
|
||||
} else { // "+" 버튼 클릭 시
|
||||
cartProductArr[$index][1]++; // 배열에서 해당 상품의 수량 증가
|
||||
cartProductArr[$index][3] = cartProductArr[$index][1] * cartProductArr[$index][2]; // 배열에서 해당 상품의 총 가격 변경
|
||||
}
|
||||
updateCartCounters(); // 화면에 상품 정보 업데이트
|
||||
})
|
||||
//
|
||||
//배열 내용을 바탕으로 각 아이템 텍스트 변경
|
||||
function updateCartCounters() {
|
||||
$("#cartCountContainer .product-count").each(function () {
|
||||
var $counter = $(this);
|
||||
var $index = $counter.index();
|
||||
var $number = $counter.find(".product-count__amount-number");
|
||||
var $price = $counter.find(".product-count__amount-priceNum");
|
||||
$number.text(cartProductArr[$index][1]);
|
||||
$price.text(addComma(cartProductArr[$index][3]) + "원");
|
||||
});
|
||||
updateCartTotalPrice(); // 총 상품금액 업데이트
|
||||
console.log(cartProductArr); // 배열 정보확인
|
||||
}
|
||||
|
||||
// 3자리마다 "," 추가
|
||||
function addComma(num) {
|
||||
return num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
|
||||
}
|
||||
|
||||
// 총 상품금액 업데이트
|
||||
function updateCartTotalPrice() {
|
||||
var totalPrice = 0; // 총 상품금액
|
||||
for (var i = 0; i < cartProductArr.length; i++) {
|
||||
totalPrice += cartProductArr[i][3]; // 배열의 총 가격을 더함
|
||||
}
|
||||
$cartTotalPrice.text(addComma(totalPrice)); // 총 상품금액 텍스트 변경
|
||||
}
|
||||
|
||||
// x버튼 클릭 시 삭제
|
||||
$("#cartCountContainer").on("click", ".product-count__amount-delete", function () { // x 버튼 클릭 시
|
||||
var $index = $(this).closest(".product-count").index();
|
||||
cartProductArr.splice($index, 1); // 배열에서 해당 상품 삭제
|
||||
$(this).closest(".product-count").remove(); // 화면에서 해당 상품 삭제
|
||||
updateCartCounters(); // 화면에 상품 정보 업데이트
|
||||
|
||||
//일반옵션이 하나일 경우 라디오 체크 해제(품절상품 제외) || 필수옵션 01이 상품 배열에 하나도 없을 경우
|
||||
if($('#relate-product-option-sheet .product-option .custom-radio:not(:has(span))').length ===1
|
||||
|| productArr.filter(item => item[5] === '01'&& $('#goodsInnb').val() ===item[6]).length === 0){
|
||||
$("input[name='r-group01']").prop('checked', false)
|
||||
}
|
||||
});
|
||||
|
||||
//TODO :: 입력옵션
|
||||
// // // 마지막으로 생성된 상품에 각인 정보 추가
|
||||
// // $('#cartAddTextBtn').on('click', function () {
|
||||
// // var $index = $(".modal .productDetailInfo__count").length - 1;
|
||||
// // var $text = $('#cartAddTextInput').val();
|
||||
// // console.log(cartProductArr[$index]); // 인덱스 확인
|
||||
// // $(".modal .productDetailInfo__count").eq($index).find(".productDetailInfo__count__amountTop").append('<div class="productDetailInfo__count__additionalSelect">각인문구 : ' + $text + '</div>');
|
||||
// //
|
||||
// // console.log(cartProductArr); // 배열 정보확인
|
||||
// // });
|
||||
//
|
||||
|
||||
//재고옵션
|
||||
$('#relateAdditionalSelect').on("change", "select", function () { // 셀렉트 선택 시
|
||||
if ($('#relateAdditionalSelect').find('.option.selected.disabled').length > 0) return;
|
||||
if ($('#relateAdditionalSelect').find('.option.selected').length == $('#relateAdditionalSelect').find('.nice-select').length) { // 모든 셀렉트가 선택되면
|
||||
|
||||
var $title =$(this).closest("#relateAdditionalSelect").find('input[name="relateGoodsNm"]').val()
|
||||
var $optInfo = $(this).siblings('.nice-select').find(".option.selected").attr("data-value").split('|');
|
||||
|
||||
var $priceNum = $optInfo[0];
|
||||
var $goodsOptnInnb = $optInfo[1];
|
||||
var $goodsOptnInfo = $optInfo[2];
|
||||
var $goodsOptnTy = $optInfo[3];
|
||||
|
||||
var arr = [];
|
||||
for (var i = 0; i < $('#relateAdditionalSelect').find('.nice-select').length; i++) {
|
||||
arr.push($('#relateAdditionalSelect').find('.nice-select').eq(i).find('.option.selected').text());
|
||||
}
|
||||
//이미 추가된 상품인지 확인
|
||||
var isItemAlreadyAdded = cartProductArr.some(function (item) {
|
||||
return item[4] === $goodsOptnInnb;
|
||||
});
|
||||
if (isItemAlreadyAdded) {
|
||||
fn_goods_duplicate_select_modal()
|
||||
return;
|
||||
}
|
||||
|
||||
const $relateGoodsInnb = $(this).closest("#relateAdditionalSelect").find('input[name="relateGoodsInnb"]').val()
|
||||
cartProductArr.push([$title, 1, $priceNum, $priceNum * 1, $goodsOptnInnb, $goodsOptnTy, $relateGoodsInnb, arr]); // 배열에 상품 정보 추가
|
||||
let cartAdditionalSelectText = '옵션 : ' + arr.join(' / ').replace(/\(\+.*?\)/g, ''); // 추가정보 텍스트로 변환
|
||||
$('#cartCountContainer').append( // 화면에 상품 정보 추가
|
||||
'<div class="product-count">' +
|
||||
'<div class="product-count__amount-top">' +
|
||||
'<span class="product-count__amount-title">' + $title + '</span>' +
|
||||
'<div class="productDetailInfo__count__additionalSelect">' + cartAdditionalSelectText + '</div>' +
|
||||
'<button class="product-count__amount-delete"><span class="visually-hidden">삭제</span></button>' +
|
||||
'</div>' +
|
||||
'<div class="product-count__amount-bottom">' +
|
||||
'<div class="product-count__amount-counter">' +
|
||||
'<button class="product-count__amount-btn minus"><span class="visually-hidden">감소</span></button>' +
|
||||
'<span class="product-count__amount-number">1</span>' +
|
||||
'<button class="product-count__amount-btn plus"><span class="visually-hidden">추가</span></button>' +
|
||||
'</div>' +
|
||||
'<div class="product-count__amount-price-box">' +
|
||||
'<span class="product-count__amount-monthly-price">'+$goodsOptnInfo+'</span>' +
|
||||
'<span class="product-count__amount-price"><span class="comma product-count__amount-priceNum">' + $priceNum +
|
||||
'</div>' +
|
||||
'</div>' +
|
||||
'</div>'
|
||||
);
|
||||
}
|
||||
updateCartCounters(); // 화면에 상품 정보 업데이트
|
||||
console.log(productArr); // 배열 정보확인
|
||||
});
|
||||
|
||||
// 추가구성옵션
|
||||
$("#relateMoreItemsSelect").on("change",'select', function () {
|
||||
var $moreItems = $('#relateMoreItemsSelect').find(".select-box");
|
||||
const $optInfoOptn3 = $(this).siblings(".nice-select").find(".option.selected").attr("data-value").split('|');
|
||||
|
||||
const $priceNumOptn3 = $optInfoOptn3[0];
|
||||
const $goodsOptnInnbOptn3 = $optInfoOptn3[1];
|
||||
const $goodsOptnInfoOptn3 = $optInfoOptn3[2];
|
||||
const $goodsOptnTyOptn3 = $optInfoOptn3[3];
|
||||
const $optnEssnlAtOptn3 = $(this).siblings('[name="selectOptionItem__otpnEssntlAt__added"]').val();
|
||||
|
||||
// $moreItems.each(function () {
|
||||
// if ($(this).find('.option.selected.disabled').length > 0) return;
|
||||
var $title = $(this).siblings('.nice-select').find('.option.selected').text().replace(' ', '').trim().replace('선택', ' ').replace(/\(\+.*?\)/g, '');
|
||||
|
||||
//이미 추가된 상품인지 확인
|
||||
var isItemAlreadyAdded = cartProductArr.some(function (item) {
|
||||
return item[4] === $goodsOptnInnbOptn3;
|
||||
});
|
||||
if (isItemAlreadyAdded){
|
||||
fn_goods_duplicate_select_modal()
|
||||
return;
|
||||
}
|
||||
|
||||
const $relateGoodsInnb = $(this).closest("#relateMoreItemsSelect").find('input[name="relateGoodsInnb"]').val()
|
||||
cartProductArr.push([$title, 1, $priceNumOptn3, $priceNumOptn3 * 1, $goodsOptnInnbOptn3, $goodsOptnTyOptn3, $relateGoodsInnb, $optnEssnlAtOptn3]); // 배열에 상품 정보 추가
|
||||
$('#cartCountContainer').append( // 화면에 상품 정보 추가
|
||||
'<div class="product-count">' +
|
||||
'<div class="product-count__amount-top">' +
|
||||
'<span class="product-count__amount-title">' + $title + '</span>' +
|
||||
'<button class="product-count__amount-delete"><span class="visually-hidden">삭제</span></button>' +
|
||||
'</div>' +
|
||||
'<div class="product-count__amount-bottom">' +
|
||||
'<div class="product-count__amount-counter">' +
|
||||
'<button class="product-count__amount-btn minus"><span class="visually-hidden">감소</span></button>' +
|
||||
'<span class="product-count__amount-number">1</span>' +
|
||||
'<button class="product-count__amount-btn plus"><span class="visually-hidden">추가</span></button>' +
|
||||
'</div>' +
|
||||
'<div class="product-count__amount-price-box">' +
|
||||
'<span class="product-count__amount-monthly-price">'+$goodsOptnInfoOptn3+'</span>' +
|
||||
'<span class="product-count__amount-price"><span class="comma product-count__amount-priceNum">' + $priceNumOptn3 +
|
||||
'</div>' +
|
||||
'</div>' +
|
||||
'</div>'
|
||||
);
|
||||
|
||||
$(this).val('').niceSelect('update')
|
||||
updateCartCounters(); // 화면에 상품 정보 업데이트
|
||||
});
|
||||
|
||||
//prodctArr에 추가시 중복제거
|
||||
function addUniqueProducts(productArr, cartProductArr) {
|
||||
// cartProductArr의 중복 제거
|
||||
var uniqueCartProductArr = cartProductArr.filter(function(cartProduct, index, self) {
|
||||
return index === self.findIndex(function(t) {
|
||||
return t[4] === cartProduct[4]; // 각 배열의 첫 번째 요소(goodsOptnInnb) 기준으로 중복 제거
|
||||
});
|
||||
});
|
||||
|
||||
// uniqueCartProductArr를 반복하면서 productArr에 없는 상품을 추가
|
||||
uniqueCartProductArr.forEach(function(cartProduct) {
|
||||
var existsInProductArr = productArr.some(function(product) {
|
||||
return product[4] === cartProduct[4]; // 각 배열의 첫 번째 요소(goodsOptnInnb) 비교
|
||||
});
|
||||
|
||||
// productArr에 존재하지 않는 경우에만 추가
|
||||
if (!existsInProductArr) {
|
||||
productArr.push(cartProduct);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
// //함께 구매하기 버튼 클릭시
|
||||
$(document).on('click', '#addGoodsDtl',function () {
|
||||
//상품 선택 확인
|
||||
// if(cartProductArr.length <= 0){
|
||||
// alert('상품옵션을 선택해 주세요');
|
||||
// return;
|
||||
// }
|
||||
|
||||
//추가구성옵션 - 필수추가구성옵션 있는지 확인
|
||||
var values = $('input[name="productDetailInfo__additionalSelect__otpnEssntlAt__relate"]').map(function() {
|
||||
return $(this).val();
|
||||
}).get();
|
||||
|
||||
if(values.includes('Y')){
|
||||
var isAddedOptnEssntlAt = cartProductArr.some(function (item) {
|
||||
return item[7] === 'Y'
|
||||
});
|
||||
|
||||
if(!isAddedOptnEssntlAt){
|
||||
alert('필수추가옵션을 선택해 주세요');
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
//일반옵션 라디오 버튼 체크 해제
|
||||
$('#relatedProductPop input[type="radio"]').prop('checked', false);
|
||||
|
||||
//상품 상세 화면에 추가
|
||||
addUniqueProducts(productArr, cartProductArr)
|
||||
$('#countContainer').append($('#cartCountContainer').find('.product-count'))
|
||||
updateTotalPriceProd() // 함께하면 좋은 상품 가격 더하기
|
||||
closeModal('relatedProductPop')
|
||||
|
||||
})
|
||||
|
||||
// 3자리마다 "," 추가
|
||||
function addComma(num) {
|
||||
return num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
|
||||
}
|
||||
|
||||
|
||||
//메인 상품 상세에 가격 더하기
|
||||
function updateTotalPriceProd() {
|
||||
var totalPrice = 0; // 총 상품금액
|
||||
for (var i = 0; i < productArr.length; i++) {
|
||||
totalPrice += productArr[i][3]; // 배열의 총 가격을 더함
|
||||
}
|
||||
$(".productDetailInfo__priceTotal__totalPriceNum").text(addComma(totalPrice)); // 총 상품금액 텍스트 변경
|
||||
}
|
||||
|
||||
|
||||
/*************************************************************
|
||||
함께하면 좋은상품 이벤트 (모달) END
|
||||
**************************************************************/
|
||||
|
||||
|
||||
</script>
|
||||
<div class="productOption" id="relate-product-option-sheet" style="padding-bottom: 0">
|
||||
<input type="hidden" id="relateSlepricDscntAmt" value="${relateResultMap.goodsDtl.slepric}"/>
|
||||
<c:if test="${not empty relateResultMap.optnList.normalOptnList}">
|
||||
<p class="productOption__title">옵션 선택</p>
|
||||
<div class="product-option">
|
||||
<c:forEach var="goodsOpt01" items="${relateResultMap.optnList.normalOptnList}" varStatus="optList01">
|
||||
<c:if test="${goodsOpt01.optnExpsrAt eq 'Y'}">
|
||||
<c:if test="${goodsOpt01.invntrySldoutExpsrAt eq 'Y'}">
|
||||
<div class="product-option__item">
|
||||
<c:if test="${not empty goodsOpt01.optnVal1}">
|
||||
<div class="custom-radio is-medium">
|
||||
<input type="hidden" name="relateGoodsInnb" value="${goodsOpt01.goodsInnb}" />
|
||||
<input type="radio" id="r-2${goodsOpt01.optnOrdr}" name="r-group01" <c:if test="${goodsOpt01.disableAt eq 'Y'}"> disabled</c:if> >
|
||||
<label for="r-2${goodsOpt01.optnOrdr}">${goodsOpt01.optnVal1}</label>
|
||||
<input type="hidden" name="optnCd" value="${goodsOpt01.optnCd1}">
|
||||
<input type="hidden" name="goodsOptnInnb" value="${goodsOpt01.goodsOptnInnb}"/>
|
||||
<input type="hidden" name="goodsOptnTy" value="${goodsOpt01.optnTy}"/>
|
||||
<input type="hidden" name="goodsSopmalCd" value="${goodsOpt01.sopmalCd}"/>
|
||||
<c:if test="${goodsOpt01.disableAt eq 'Y'}"> <span>(품절)</span></c:if>
|
||||
</div>
|
||||
<div class="product-option__right">
|
||||
<span class="product-option__price"><fmt:formatNumber value="${goodsOpt01.slepric}"/>원</span>
|
||||
<span class="product-option__monthly-payment">${goodsOpt01.optnInfo}</span>
|
||||
</div>
|
||||
</c:if>
|
||||
</div>
|
||||
</c:if>
|
||||
</c:if>
|
||||
</c:forEach>
|
||||
</div>
|
||||
</c:if>
|
||||
<c:if test="${not empty relateResultMap.optnList.invntryOptnList}">
|
||||
<p class="productOption__title">옵션 선택</p>
|
||||
<div class="selectOptionItem" id="relateAdditionalSelect">
|
||||
<c:if test="${not empty relateResultMap.optnList.invntryOptnList[0].optnNm1}">
|
||||
<div class="select-box">
|
||||
<input type="hidden" name="relateGoodsInnb" value="${relateResultMap.optnList.invntryOptnList[0].goodsInnb}" />
|
||||
<input type="hidden" name="relateGoodsNm" value="${relateResultMap.goodsDtl.goodsNm}" />
|
||||
<select class="full" title="해당 셀렉트에 대한 설명" id="selectRelateInvntryOptn1" name="selectRelateInvntryOptn">
|
||||
<option value="" selected>선택</option>
|
||||
<c:forEach var="goodsOpt02" items="${relateResultMap.optnList.invntryOptnList}" varStatus="optList02">
|
||||
<c:if test="${goodsOpt02.optnExpsrAt eq 'Y'}">
|
||||
<c:if test="${goodsOpt02.invntrySldoutExpsrAt eq 'Y'}">
|
||||
<c:if test="${goodsOpt02.optnVal1 ne relateResultMap.optnList.invntryOptnList[optList02.index-1].optnVal1}">
|
||||
<option value="${goodsOpt02.slepric}|${goodsOpt02.goodsOptnInnb}|${goodsOpt02.optnInfo}|${goodsOpt02.optnTy}" <c:if test="${goodsOpt02.disableAt eq 'Y'}"> disabled </c:if> >
|
||||
<c:out value="${goodsOpt02.optnVal1}"/>
|
||||
</option>
|
||||
</c:if>
|
||||
</c:if>
|
||||
</c:if>
|
||||
</c:forEach>
|
||||
</select>
|
||||
</div>
|
||||
</c:if>
|
||||
<c:if test="${not empty relateResultMap.optnList.invntryOptnList[0].optnNm2}">
|
||||
<div class="select-box">
|
||||
<select class="full" title="해당 셀렉트에 대한 설명" id="selectRelateInvntryOptn2" name="selectRelateInvntryOptn">
|
||||
<option value="" disabled selected>선택</option>
|
||||
</select>
|
||||
</div>
|
||||
</c:if>
|
||||
<c:if test="${not empty relateResultMap.optnList.invntryOptnList[0].optnNm3}">
|
||||
<div class="select-box">
|
||||
<select class="full" title="해당 셀렉트에 대한 설명" id="selectRelateInvntryOptn3" name="selectRelateInvntryOptn">
|
||||
<option value="" disabled selected>선택</option>
|
||||
</select>
|
||||
</div>
|
||||
</c:if>
|
||||
<c:if test="${not empty relateResultMap.optnList.invntryOptnList[0].optnNm4}">
|
||||
<div class="select-box">
|
||||
<select class="full" title="해당 셀렉트에 대한 설명" id="selectRelateInvntryOptn4" name="selectRelateInvntryOptn">
|
||||
<option value="" disabled selected>선택</option>
|
||||
</select>
|
||||
</div>
|
||||
</c:if>
|
||||
</div>
|
||||
</c:if>
|
||||
<c:if test="${not empty relateResultMap.optnList.addedOptnList}">
|
||||
<p class="productOption__title">추가구성</p>
|
||||
<div class="selectOptionItem" id="relateMoreItemsSelect">
|
||||
<input type="hidden" name="relateGoodsInnb" value="${relateResultMap.optnList.addedOptnList[0].goodsInnb}"/>
|
||||
<c:forEach var="goodsOpt03" items="${relateResultMap.optnList.addedOptnList}" varStatus="optList03">
|
||||
<c:if test="${not empty goodsOpt03.optnNm1}">
|
||||
<c:if test="${relateResultMap.optnList.addedOptnList[optList03.index-1].optnNm1 ne goodsOpt03.optnNm1}">
|
||||
<div class="select-box">
|
||||
<input type="hidden" name="selectOptionItem__otpnEssntlAt__added" <c:if test="${goodsOpt03.optnEssntlAt eq 'Y'}"> value="Y"</c:if>/>
|
||||
<select class="full" title="해당 셀렉트에 대한 설명" name="selectRelateAddedOptn">
|
||||
<option value="" disabled selected>${goodsOpt03.optnNm1} 선택</option>
|
||||
<c:forEach var="goodsOptVal03" items="${relateResultMap.optnList.addedOptnList}" varStatus="optVal03">
|
||||
<c:if test="${goodsOptVal03.optnNm1 eq goodsOpt03.optnNm1}">
|
||||
<c:if test="${goodsOptVal03.optnExpsrAt eq 'Y'}">
|
||||
<c:if test="${goodsOptVal03.invntrySldoutExpsrAt eq 'Y'}">
|
||||
<option value="${goodsOptVal03.slepric}|${goodsOptVal03.goodsOptnInnb}|${goodsOptVal03.optnInfo}|${goodsOptVal03.optnTy} " <c:if test="${goodsOptVal03.disableAt eq 'Y'}"> disabled</c:if> ><c:out value="${goodsOptVal03.optnVal1}"/> (+ <fmt:formatNumber value="${goodsOptVal03.slepric}"/>) <c:if test="${goodsOptVal03.disableAt eq 'Y'}"> <c:out value="(품절)"/> </c:if> </option>
|
||||
</c:if>
|
||||
</c:if>
|
||||
</c:if>
|
||||
</c:forEach>
|
||||
</select>
|
||||
</div>
|
||||
</c:if>
|
||||
</c:if>
|
||||
</c:forEach>
|
||||
</div>
|
||||
</c:if>
|
||||
<%-- <p class="productOption__title">상품정보 입력</p> TODO :: 입력옵션--%>
|
||||
<%-- <div class="inputOptionItem">--%>
|
||||
<%-- <input id="addTextInput" class="input-text full" type="text" title="해당 인풋에 대한 설명"--%>
|
||||
<%-- placeholder="각인 문구를 입력해주세요" value="">--%>
|
||||
<%-- <button type="button" id="addTextBtn" class="btn outline md">저장</button>--%>
|
||||
<%-- </div>--%>
|
||||
<div id="cartCountContainer">
|
||||
</div>
|
||||
</div>
|
||||
29
src/main/webapp/WEB-INF/views/sopmal_m/goods/ReturnInfoR.jsp
Normal file
29
src/main/webapp/WEB-INF/views/sopmal_m/goods/ReturnInfoR.jsp
Normal file
@@ -0,0 +1,29 @@
|
||||
<%@ 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 : QnaListR.jsp
|
||||
Description : 상품qna 목록
|
||||
Modification Information
|
||||
|
||||
수정일 수정자 수정내용
|
||||
------- -------- ---------------------------
|
||||
2024-05 김혜인
|
||||
--%>
|
||||
<!DOCTYPE html>
|
||||
<html lang="ko">
|
||||
<div class="sub-box">
|
||||
<div id="productRefund" class="productDetailcontent__item">
|
||||
<div class="userRefund">
|
||||
<h5 class="userRefund__title">반품/교환정보</h5>
|
||||
<div class="userRefund__inner">
|
||||
<c:out value="${resultMap.infoCn}" escapeXml="false"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</html>
|
||||
146
src/main/webapp/WEB-INF/views/sopmal_m/goods/RvwListR.jsp
Normal file
146
src/main/webapp/WEB-INF/views/sopmal_m/goods/RvwListR.jsp
Normal file
@@ -0,0 +1,146 @@
|
||||
<%@ 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 : RvwListR.jsp
|
||||
Description : 리뷰 리스트
|
||||
Modification Information
|
||||
|
||||
수정일 수정자 수정내용
|
||||
------- -------- ---------------------------
|
||||
2024-05 김혜인
|
||||
--%>
|
||||
<!DOCTYPE html>
|
||||
<html lang="ko">
|
||||
<spring:eval expression="@environment.getProperty('sopmalfo.common.fileupload.cdnurl')" var="cdnurl"/>
|
||||
<div class="userReview">
|
||||
<div class="productReview__subTitle">
|
||||
<span class="productReview__subTitle__title">리뷰</span>
|
||||
<span class="productReview__subTitle__num">
|
||||
<span class="comma" id = "totCnt">3506</span><span class="unit">건</span>
|
||||
</span>
|
||||
<div class="userReview__sort">
|
||||
<button class="categoryTriggerBtn rvwPop" id = "rvwSort">
|
||||
랭킹순
|
||||
</button>
|
||||
<button class="categoryTriggerBtn rvwPop" id = "rvwKnd">
|
||||
전체보기
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<%--검색 키워드--%>
|
||||
<div class="userReview__hashtag">
|
||||
<c:forEach var = "srchKeyword" items="${resultMap.resultList.srchKewordList}">
|
||||
<button type="button" class="userReview__hashtag__btn" value = "<c:out value = "${srchKeyword.qesitmNm}"/>">#<c:out value = "${srchKeyword.qesitmNm}"/></button>
|
||||
</c:forEach>
|
||||
<input type = "hidden" id = "hiddenSrch" value = "<c:out value = '${resultMap.bbscttVO.srchKeywordArr}'/>"/>
|
||||
</div>
|
||||
<c:choose>
|
||||
<c:when test = "${not empty resultMap.resultList.rvwList}">
|
||||
<c:forEach var="resultList" items="${resultMap.resultList.rvwList}">
|
||||
<div class="userReviewItem">
|
||||
<div class="userReviewItem__top">
|
||||
<div class="userReviewItem__userImage">
|
||||
<img src="/mobile/images/icon_user-info.png" alt="">
|
||||
</div>
|
||||
<div class="userReviewItem__top__info">
|
||||
<c:if test = "${not empty resultList.evlScore}">
|
||||
<div class="reviewStars__wrapper--sm">
|
||||
<fmt:formatNumber value="${resultList.evlScore}" pattern="##" var="evlScore"/>
|
||||
<div class="reviewStars star-<c:out value="${evlScore}"/>"></div>
|
||||
<span class="reviewStars__num"><c:out value="${evlScore}"/></span>
|
||||
</div>
|
||||
</c:if>
|
||||
<div class="userReviewItem__misc">
|
||||
<span class="userReviewItem__misc__id"><c:out value = "${resultList.regusrId}"/></span>
|
||||
<span class="userReviewItem__misc__date"><c:out value = "${resultList.registDt}"/></span>
|
||||
<c:if test = "${resultList.bstAt eq 'Y'}">
|
||||
<span class="reviewBadge reviewBadge--red">BEST</span>
|
||||
</c:if>
|
||||
<c:if test = "${resultList.bbsTyCd eq '07'}">
|
||||
<span class="reviewBadge">한달사용기</span>
|
||||
</c:if>
|
||||
<c:if test = "${resultList.reOrderAt eq 'Y'}">
|
||||
<span class="reviewBadge">재구매</span>
|
||||
</c:if>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="userReviewItem__body listPage">
|
||||
<div class="listCn">
|
||||
<c:out value="${resultList.cn}"/>
|
||||
</div>
|
||||
<c:forEach var="photoByBbsctt" items="${resultMap.resultList.photoByBbsctt}">
|
||||
<c:if test="${resultList.bbscttInnb eq photoByBbsctt.bbscttInnb}">
|
||||
<div class="userReviewItem__reviewImage listImage">
|
||||
<c:if test="${not empty resultList.filCours}">
|
||||
<img src="<c:out value = "${cdnurl}${photoByBbsctt.filCours}${photoByBbsctt.sysFilNm}"/>"
|
||||
onerror='this.src = "/mobile/images/image_placeholder.png"'
|
||||
alt="">
|
||||
<span class="userReviewItem__reviewImage__num listPageImg">
|
||||
<c:out value="${resultList.fileCnt}"/>
|
||||
</span>
|
||||
</c:if>
|
||||
</div>
|
||||
</c:if>
|
||||
</c:forEach>
|
||||
<c:if test="${resultList.bbscttEvlUseAt eq 'Y'}">
|
||||
<button class="userReviewItem__like"
|
||||
onclick = "fn_update_bbsctt_recomend('recommend', '<c:out value = '${resultList.bbscttInnb}'/>', this);">
|
||||
<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" />
|
||||
</svg>
|
||||
<em class="recommendCnt">
|
||||
<c:out value="${resultList.recomendCnt}"/>
|
||||
</em>
|
||||
</button>
|
||||
<c:if test="${resultList.bbscttEvlRecomendStep eq '02'}">
|
||||
<button class="userReviewItem__like userReviewItem__like--dislike"
|
||||
onclick = "fn_update_bbsctt_recomend('nonrecommend', '<c:out value = '${resultList.bbscttInnb}'/>', this);">
|
||||
<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" />
|
||||
</svg>
|
||||
<em class="nonrecommendCnt">
|
||||
<c:out value="${resultList.nonrecomendCnt}"/>
|
||||
</em>
|
||||
</button>
|
||||
</c:if>
|
||||
</c:if>
|
||||
<input type = "hidden" value = "<c:out value="${resultList.bbscttInnb}"/>"/>
|
||||
</div>
|
||||
</div>
|
||||
</c:forEach>
|
||||
<%--더보기 버튼--%>
|
||||
<c:if test = "${resultMap.bbscttVO.pageUnit eq fn:length(resultMap.resultList.rvwList)}">
|
||||
<div class="bottomBtnControls" id = "rvwMoreDiv">
|
||||
<button class="btn md outline full" id = "rvwMore">
|
||||
<span class="fullBtnSection__more">
|
||||
리뷰 더보기
|
||||
</span>
|
||||
</button>
|
||||
</div>
|
||||
</c:if>
|
||||
<input type="hidden" value = "<c:out value="${resultMap.bbscttVO.pageIndex}"/>" id = "rvwPageIndex">
|
||||
</c:when>
|
||||
<c:otherwise>
|
||||
<div class="noResult">
|
||||
<div class="noResult__image">
|
||||
<img src="/mobile/images/icon__no-result.png" alt="상품 이미지">
|
||||
</div>
|
||||
<p class="noResult__text"><spring:message code="common.nodata"/></p>
|
||||
</div>
|
||||
</c:otherwise>
|
||||
</c:choose>
|
||||
</div>
|
||||
|
||||
</html>
|
||||
346
src/main/webapp/WEB-INF/views/sopmal_m/goods/RvwListRForm.jsp
Normal file
346
src/main/webapp/WEB-INF/views/sopmal_m/goods/RvwListRForm.jsp
Normal file
@@ -0,0 +1,346 @@
|
||||
<%@ 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 : RvwListRForm.jsp
|
||||
Description : 리뷰 목록 폼
|
||||
Modification Information
|
||||
|
||||
수정일 수정자 수정내용
|
||||
------- -------- ---------------------------
|
||||
2024-04 김혜인
|
||||
--%>
|
||||
<!DOCTYPE html>
|
||||
<html lang="ko">
|
||||
<%--데이터 set--%>
|
||||
<%--상품 리뷰 평가 정보--%>
|
||||
<c:set value = "${resultMap.rvwInfo.evlInfo}" var = "evlInfo"/>
|
||||
<%--상품 리뷰 추가 평가 통계--%>
|
||||
<c:set value = "${resultMap.rvwInfo.itmStats}" var = "itmStats"/>
|
||||
<%--상품 포토 리뷰 이미지 건수--%>
|
||||
<c:set value = "${resultMap.rvwInfo.photoTot}" var = "photoTot"/>
|
||||
<%--상품 포토 리뷰 리스트--%>
|
||||
<c:set value = "${resultMap.rvwInfo.photoList}" var = "photoList"/>
|
||||
<%--베스트 후기 건수--%>
|
||||
<c:set value = "${resultMap.rvwInfo.bstTotCnt}" var = "bstTotCnt"/>
|
||||
<%--베스트 후기 목록--%>
|
||||
<c:set value = "${resultMap.rvwInfo.bstRvwList}" var = "bstRvwList"/>
|
||||
<%--마일리지 적립 금액 조회--%>
|
||||
<c:set value = "${resultMap.rvwBnefInfo}" var = "rvwBnefInfo"/>
|
||||
<spring:eval expression="@environment.getProperty('sopmalfo.common.fileupload.cdnurl')" var="cdnurl"/>
|
||||
<div class="sub-box">
|
||||
<div class="productReview__status">
|
||||
<div class="productReview__top">
|
||||
<div class="productReview__rating">
|
||||
<span class="productReview__status__title">사용자 총 평점</span>
|
||||
<div class="allReviewStars__wrapper">
|
||||
<span class="allReviewStars__numWrap">
|
||||
<span class="allReviewStars__num"><c:out value = "${evlInfo.avgEvlScore}"/></span>
|
||||
</span>
|
||||
<div class="allReviewStars">
|
||||
<!-- width 설정한 만큼 별에 노란색 생김 -->
|
||||
<div style="width: <c:out value = "${evlInfo.starWidth}"/>%;" class="allReviewStars__fill"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="productReview__ratingStats">
|
||||
<span class="productReview__status__title">평점 비율</span>
|
||||
<div class="productReview__ratingStats__inner">
|
||||
<div
|
||||
class="productReview__ratingStats__item productReview__ratingStats__topRating">
|
||||
<span class="productReview__ratingStats__star">5점</span>
|
||||
<div class="productReview__ratingStats__bar">
|
||||
<div style="width: <c:out value = "${evlInfo.fiveRate}"/>%;"
|
||||
class="productReview__ratingStats__fill">
|
||||
</div>
|
||||
</div>
|
||||
<span class="productReview__ratingStats__num"><fmt:formatNumber value="${evlInfo.fiveTot}" pattern="#,###"/></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="productReview__ratingStats__item">
|
||||
<span class="productReview__ratingStats__star">4점</span>
|
||||
<div class="productReview__ratingStats__bar">
|
||||
<div style="width: <c:out value = "${evlInfo.fourRate}"/>%;"
|
||||
class="productReview__ratingStats__fill">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="productReview__ratingStats__item">
|
||||
<span class="productReview__ratingStats__star">3점</span>
|
||||
<div class="productReview__ratingStats__bar">
|
||||
<div style="width: <c:out value = "${evlInfo.threeRate}"/>%;"
|
||||
class="productReview__ratingStats__fill">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="productReview__ratingStats__item">
|
||||
<span class="productReview__ratingStats__star">2점</span>
|
||||
<div class="productReview__ratingStats__bar">
|
||||
<div style="width: <c:out value = "${evlInfo.twoRate}"/>%;"
|
||||
class="productReview__ratingStats__fill">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="productReview__ratingStats__item">
|
||||
<span class="productReview__ratingStats__star">1점</span>
|
||||
<div class="productReview__ratingStats__bar">
|
||||
<div style="width: <c:out value = "${evlInfo.oneRate}"/>%;"
|
||||
class="productReview__ratingStats__fill"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<%--문항 별 항목 --%>
|
||||
<c:if test="${not empty itmStats}">
|
||||
<div class="productReview__reviewStats">
|
||||
<div class="productReview__reviewStats__item">
|
||||
<span class="productReview__status__title">다른 구매자들은 이렇게 평가했어요</span>
|
||||
<div class="otherReviews">
|
||||
<c:forEach var = "itmStat" items="${itmStats}">
|
||||
<div class="otherReviews__wrap">
|
||||
<div class="otherReviews__item">
|
||||
<span class="otherReviews__category"><c:out value = "${itmStat.key}"/></span>
|
||||
<span class="otherReviews__title"><c:out value = "${itmStat.value[0].itmCn}"/></span>
|
||||
<div class="otherReviews__line"></div>
|
||||
<span class="otherReviews__percent"><fmt:formatNumber value="${itmStat.value[0].rateAnsw}" pattern="##"/>%</span>
|
||||
</div>
|
||||
<div class="otherReviewsDetail">
|
||||
<c:forEach var = "itm" items="${itmStat.value}">
|
||||
<div class="otherReviewsDetail__item">
|
||||
<span class="otherReviewsDetail__title"><c:out value = "${itm.itmCn}"/></span>
|
||||
<div class="otherReviewsDetail__bar">
|
||||
<div style="width: <fmt:formatNumber value="${itm.rateAnsw}" pattern="##"/>%;"
|
||||
class="otherReviewsDetail__fill">
|
||||
</div>
|
||||
</div>
|
||||
<span class="otherReviewsDetail__num"><fmt:formatNumber value="${itm.rateAnsw}" pattern="##"/>%</span>
|
||||
</div>
|
||||
</c:forEach>
|
||||
</div>
|
||||
</div>
|
||||
</c:forEach>
|
||||
</div>
|
||||
<div class="otherReviews__moreWrap">
|
||||
<button class="otherReviews__moreBtn photo">더보기</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</c:if>
|
||||
</div>
|
||||
</div>
|
||||
<c:if test = "${not empty bstRvwList}">
|
||||
<div class="sub-box">
|
||||
<div class="storePick">
|
||||
<div class="productReview__subTitle">
|
||||
<span class="productReview__subTitle__title">스토어 PICK</span>
|
||||
<br>
|
||||
<span class="productReview__subTitle__subText">판매자가 직접 선정한 베스트리뷰입니다</span>
|
||||
</div>
|
||||
<div class="swiper storePick__swiper">
|
||||
<div class="swiper-pagination"></div>
|
||||
<div class="swiper-wrapper">
|
||||
<c:forEach var="bstList" items="${bstRvwList}" varStatus="status">
|
||||
<div class="swiper-slide storePick__item fullscreen-trigger storePickReview-index"
|
||||
data-micromodal-trigger="store-review-image">
|
||||
<a class="storePick__box">
|
||||
<input type = "hidden" name = "bbscttInnb" value = "<c:out value = "${bstList.bbscttInnb}"/>"/>
|
||||
<div class="storePick__top">
|
||||
<div class="storePick__top__info">
|
||||
<div class="reviewStars__wrapper--sm">
|
||||
<div class="reviewStars star-<fmt:formatNumber value="${bstList.evlScore}" pattern="##"/>"></div>
|
||||
<span class="reviewStars__num"><fmt:formatNumber value="${bstList.evlScore}" pattern="##"/></span>
|
||||
</div>
|
||||
<div class="storePick__misc">
|
||||
<span class="storePick__misc__id"><c:out value="${bstList.regusrId}"/>
|
||||
<c:if test="${bstList.rvwKingAt eq 'Y'}">
|
||||
<span class="storePick__misc__badge">리뷰왕</span>
|
||||
</c:if>
|
||||
</span>
|
||||
<span class="storePick__misc__date"><c:out value="${bstList.registDt}"/></span>
|
||||
<c:if test = "${bstList.bstAt eq 'Y'}">
|
||||
<span class="reviewBadge reviewBadge--red">BEST</span>
|
||||
</c:if>
|
||||
<c:if test = "${bstList.bbsTyCd eq '07'}">
|
||||
<span class="reviewBadge">한달사용기</span>
|
||||
</c:if>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="storePick__body">
|
||||
<c:if test = "${not empty bstList.sysFilNm}">
|
||||
<div class="storePick__reviewImage">
|
||||
<img src="<c:out value="${cdnurl}${bstList.filCours}${bstList.sysFilNm}"/>"
|
||||
onerror="this.src='/mobile/images/image_placeholder.png'" alt="">
|
||||
<span class="storePick__reviewImage__num"><c:out value="${bstList.fileCnt}"/></span>
|
||||
<input type="hidden" value="<c:out value="${bstList.sysFilNm}"/>"/>
|
||||
</div>
|
||||
</c:if>
|
||||
<div class="storePick__reviewText">
|
||||
<input type = "hidden" value = "${bstList.npayBbscttSnb}" class="npayBbscttSnb"/>
|
||||
<c:out value="${bstList.cn}" escapeXml="false"/>
|
||||
</div>
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
</c:forEach>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</c:if>
|
||||
<c:if test = "${not empty photoList}">
|
||||
<div class="sub-box">
|
||||
<div class="photoReview">
|
||||
<div class="productReview__subTitle">
|
||||
<input type="hidden" value = "<c:out value='${photo.bbscttInnb}'/>" class="bbscttInnb">
|
||||
<span class="productReview__subTitle__title">포토&동영상</span>
|
||||
<span class="productReview__subTitle__num">
|
||||
<span class="comma"><fmt:formatNumber value="${photoTot}" pattern="#,###"/></span><span class="unit">건</span>
|
||||
</span>
|
||||
<button class="productReview__more photoMore">더보기</button>
|
||||
</div>
|
||||
<div class="photoReview__thumbs">
|
||||
<c:forEach var="photo" items="${photoList}" varStatus="status">
|
||||
<c:choose>
|
||||
<c:when test = "${!status.last}">
|
||||
<a class="photoReview__thumbs__image photoReview-index photoImg photoDtl"
|
||||
data-micromodal-trigger="photo-review-image">
|
||||
<c:if test = "${not empty photo.sysFilNm}">
|
||||
<img src="<c:out value='${cdnurl}${photo.filCours}${photo.sysFilNm}'/>"
|
||||
onerror ="this.src='/mobile/images/image_placeholder.png'" alt="">
|
||||
<span class="photoReview__thumbs__num"><fmt:formatNumber value="${photo.fileCnt}" pattern="#,###"/></span>
|
||||
</c:if>
|
||||
</a>
|
||||
</c:when>
|
||||
<c:otherwise>
|
||||
<a class="photoReview__thumbs__moreImage photoImg photoMore"
|
||||
id="photo-gallery-moreImage-trigger"
|
||||
data-micromodal-trigger="photo-review-image">
|
||||
<c:if test = "${not empty photo.sysFilNm}">
|
||||
<img src="<c:out value='${cdnurl}${photo.filCours}${photo.sysFilNm}'/>"
|
||||
onerror ="this.src='/mobile/images/image_placeholder.png'"alt="">
|
||||
<span class="photoReview__thumbs__more">더보기</span>
|
||||
</c:if>
|
||||
</a>
|
||||
</c:otherwise>
|
||||
</c:choose>
|
||||
<div style="display: none" class="photoRvwCn">
|
||||
<input type="hidden" value="${photo.npayBbscttSnb}" class="npayBbscttSnb"/>
|
||||
<c:out value="${photo.cn}" escapeXml="false"/>
|
||||
</div>
|
||||
</c:forEach>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</c:if>
|
||||
<div class="sub-box rvwList">
|
||||
|
||||
</div>
|
||||
<%--전체 리뷰수, 포토 리뷰수, 한달 리뷰수 리뷰 jsp 삽입 시 값 set--%>
|
||||
<input type = "hidden" value = "<fmt:formatNumber value="${evlInfo.cntBbsctt}" pattern="#,###"/>" id = cntBbsctt>
|
||||
|
||||
|
||||
|
||||
<!-- 스토어 PICK 리뷰 -->
|
||||
<div class="microModal microFullScreen storePickReviewPop" id="store-review-image" aria-hidden="true">
|
||||
<div class="microModal__overlay" tabindex="-1">
|
||||
<div class="microModal__container" role="dialog" aria-modal="true">
|
||||
<div class="microModal__body">
|
||||
<div class="microModal__top">
|
||||
<h2 class="microModal__title">
|
||||
스토어 PICK
|
||||
<div class="swiper-pagination storePickReviewSlide__fraction"></div>
|
||||
</h2>
|
||||
<button class="microModal__close" aria-label="창 닫기"></button>
|
||||
</div>
|
||||
<div class="microModal__content">
|
||||
<div class="swiper storePickReviewSlide">
|
||||
<div class="swiper-wrapper">
|
||||
<c:forEach var="bstList" items="${resultMap.rvwInfo.bstRvwList}" varStatus="status">
|
||||
<div class="swiper-slide">
|
||||
<div class="storePickReviewSlide__content">
|
||||
<div class="photoReviewDetail">
|
||||
<div class="photoReviewDetail__rightTop">
|
||||
<div class="photoReviewDetail__top__info">
|
||||
<c:if test = "${not empty bstList.evlScore}">
|
||||
<div class="reviewStars__wrapper--sm">
|
||||
<div class="reviewStars star-<fmt:formatNumber value="${bstList.evlScore}" pattern="##"/>"></div>
|
||||
<span class="reviewStars__num">
|
||||
<fmt:formatNumber value="${bstList.evlScore}" pattern="##"/>
|
||||
</span>
|
||||
</div>
|
||||
</c:if>
|
||||
<div class="photoReviewDetail__misc">
|
||||
<span class="photoReviewDetail__misc__id">
|
||||
<c:out value="${bstList.regusrId}"/>
|
||||
<%--리뷰왕 여부--%>
|
||||
<c:if test="${bstList.rvwKingAt eq 'Y'}">
|
||||
<span class="storePick__misc__badge">리뷰왕</span>
|
||||
</c:if>
|
||||
</span>
|
||||
<span class="photoReviewDetail__misc__date"><c:out
|
||||
value="${bstList.registDt}"/></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="photoReviewDetail__reviewText storePickModalCn">
|
||||
<input type = "hidden" class = "npayBbscttSnb" value = "<c:out value = "${bstList.npayBbscttSnb}"/>"/>
|
||||
<c:out value="${bstList.cn}" escapeXml="false"/>
|
||||
</div>
|
||||
<ul class="storePickReviewSlide__imgList">
|
||||
<c:forEach items = "${resultMap.rvwInfo.bstRvwFileList}" var = "bstPhotoList">
|
||||
<c:forEach var = "photoList" items = "${bstPhotoList}">
|
||||
<c:if test="${bstList.bbscttInnb eq photoList.bbscttInnb}">
|
||||
<li>
|
||||
<img src="<c:out value = "${cdnurl}${photoList.filCours}${photoList.sysFilNm}"/>" alt="">
|
||||
</li>
|
||||
</c:if>
|
||||
</c:forEach>
|
||||
</c:forEach>
|
||||
</ul>
|
||||
</div><%--리뷰 내용에 있는 사진들 다 li로 이동 시켜야함--%>
|
||||
<c:if test="${bstList.bbscttEvlUseAt eq 'Y'}">
|
||||
<div class="photoReviewDetail__rightBottom">
|
||||
<span class="photoReviewDetail__reviewAsk">리뷰가 도움이 되었나요?</span>
|
||||
<button class="userReviewItem__like" tabindex="0">
|
||||
<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>
|
||||
<em>
|
||||
<c:out value="${bstList.recomendCnt}"/>
|
||||
</em>
|
||||
</button>
|
||||
<c:if test="${bstList.bbscttEvlRecomendStep eq '02'}">
|
||||
<button class="userReviewItem__like userReviewItem__like--dislike"
|
||||
tabindex="0">
|
||||
<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>
|
||||
<em>
|
||||
<c:out value="${bstList.nonrecomendCnt}"/>
|
||||
</em>
|
||||
</button>
|
||||
</c:if>
|
||||
</div>
|
||||
</c:if>
|
||||
</div>
|
||||
</div>
|
||||
</c:forEach>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</html>
|
||||
148
src/main/webapp/WEB-INF/views/sopmal_m/goods/RvwPhotoListR.jsp
Normal file
148
src/main/webapp/WEB-INF/views/sopmal_m/goods/RvwPhotoListR.jsp
Normal 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 : RvwPhotoListR.jsp
|
||||
Description : 포토 리뷰 리스트 모달
|
||||
Modification Information
|
||||
|
||||
수정일 수정자 수정내용
|
||||
------- -------- ---------------------------
|
||||
2024-05 김혜인
|
||||
--%>
|
||||
<!DOCTYPE html>
|
||||
<html lang="ko">
|
||||
<spring:eval expression="@environment.getProperty('sopmalfo.common.fileupload.cdnurl')" var="cdnurl"/>
|
||||
<!-- 포토&동영상 리뷰 -->
|
||||
<div class="microModal microFullScreen photoReviewPop" id="photo-review-image" aria-hidden="true">
|
||||
<div class="microModal__overlay" tabindex="-1">
|
||||
<div class="microModal__container" role="dialog" aria-modal="true">
|
||||
<div class="microModal__body">
|
||||
<div class="microModal__top">
|
||||
<h2 class="microModal__title">
|
||||
포토&동영상
|
||||
<div class="swiper-pagination photoReviewSlide__fraction"></div>
|
||||
</h2>
|
||||
<button class="microModal__close" id = "photoPickClose"></button>
|
||||
</div>
|
||||
<div class="microModal__content">
|
||||
<div class="swiper photoReviewSlide">
|
||||
<div class="swiper-wrapper" id = "photoSwiper">
|
||||
<c:forEach var="photoList" items="${resultMap.resultList.photoList}">
|
||||
<div class="swiper-slide">
|
||||
<div class="photoReviewSlide__content">
|
||||
<div class="photoReviewDetail">
|
||||
<div class="photoReviewDetail__rightTop">
|
||||
<div class="photoReviewDetail__top__info">
|
||||
<div class="reviewStars__wrapper--sm">
|
||||
<div class="reviewStars star-<fmt:formatNumber value="${photoList.evlScore}" pattern="##"/>"></div>
|
||||
<span class="reviewStars__num"><fmt:formatNumber
|
||||
value="${photoList.evlScore}" pattern="##"/></span>
|
||||
</div>
|
||||
<div class="photoReviewDetail__misc">
|
||||
<span class="photoReviewDetail__misc__id">
|
||||
<c:out value="${photoList.regusrId}"/>
|
||||
<%--리뷰왕 여부--%>
|
||||
<c:if test="${photoList.rvwKingAt eq 'Y'}">
|
||||
<span class="storePick__misc__badge">리뷰왕</span>
|
||||
</c:if>
|
||||
</span>
|
||||
<span class="photoReviewDetail__misc__date"><c:out
|
||||
value="${photoList.registDt}"/></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="photoReviewDetail__reviewText photoRvwModalCn">
|
||||
<input type="hidden"
|
||||
value="<c:out value = "${photoList.npayBbscttSnb}"/>"
|
||||
class="npayBbscttSnb"/>
|
||||
<c:out value="${photoList.cn}" escapeXml="false"/>
|
||||
</div>
|
||||
<ul class="photoReviewSlide__imgList">
|
||||
<c:if test="${not empty resultMap.resultList.photoByBbsctt}">
|
||||
<c:forEach items="${resultMap.resultList.photoByBbsctt}" var="photoRvwFile">
|
||||
<c:if test="${photoList.bbscttInnb eq photoRvwFile.bbscttInnb}">
|
||||
<li>
|
||||
<img src="<c:out value = "${cdnurl}${photoRvwFile.filCours}${photoRvwFile.sysFilNm}"/>"
|
||||
onerror="javascript:img=new Image();img.src='/mobile/images/image_placeholder.png';if(img.complete){this.src='/mobile/images/image_placeholder.png'} else{this.style.display='none';}"
|
||||
alt="">
|
||||
</li>
|
||||
</c:if>
|
||||
</c:forEach>
|
||||
</c:if>
|
||||
</ul>
|
||||
</div>
|
||||
<c:if test="${photoList.bbscttEvlUseAt eq 'Y'}">
|
||||
<div class="photoReviewDetail__rightBottom">
|
||||
<span class="photoReviewDetail__reviewAsk">리뷰가 도움이 되었나요?</span>
|
||||
<button class="userReviewItem__like" tabindex="0">
|
||||
<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>
|
||||
<em class="recommendCnt">
|
||||
<c:out value="${photoList.recomendCnt}"/>
|
||||
</em>
|
||||
</button>
|
||||
<button class="userReviewItem__like userReviewItem__like--dislike"
|
||||
tabindex="0">
|
||||
<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>
|
||||
<em class="nonrecomendCnt">
|
||||
<c:out value="${photoList.nonrecomendCnt}"/>
|
||||
</em>
|
||||
</button>
|
||||
</div>
|
||||
</c:if>
|
||||
</div>
|
||||
</div>
|
||||
</c:forEach>
|
||||
</div>
|
||||
<div class="bottomBtnControls">
|
||||
<button id="photo-gallery-trigger" class="btn md outline full">
|
||||
전체보기
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="photoReviewGallery">
|
||||
<ul class="photoReviewGallery__list">
|
||||
<c:forEach var="photoList" items="${resultMap.resultList.photoList}">
|
||||
<li class="photoReviewGallery__item" innb="${photoList.bbscttInnb}">
|
||||
<c:if test="${not empty photoList.filCours}">
|
||||
<button type = "button" class="photoReviewGallery__image">
|
||||
<img src="${cdnurl}${photoList.filCours}${photoList.sysFilNm}"
|
||||
onerror="/mobile/images/image_placeholder.png"
|
||||
alt="">
|
||||
<span class="photoReviewGallery__num">
|
||||
<c:out value='${photoList.fileCnt}'/>
|
||||
</span>
|
||||
</button>
|
||||
</c:if>
|
||||
</li>
|
||||
<div style="display: none" class="photoRvwModalGallaryCn" innb ="${photoList.bbscttInnb}">
|
||||
<input type="hidden" value="<c:out value = "${photoList.npayBbscttSnb}"/>"
|
||||
class="npayBbscttSnb"/>
|
||||
<c:out value="${photoList.cn}" escapeXml="false"/>
|
||||
</div>
|
||||
</c:forEach>
|
||||
<div id="end"></div>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<input type = "hidden" id = "photoRvwIndex" value = "<c:out value="${resultMap.bbscttVO.pageIndex}"/>"/>
|
||||
<input type = "hidden" id = "evtOccrrncAt" value = "<c:out value="${resultMap.bbscttVO.pageIndex}"/>"/>
|
||||
</html>
|
||||
@@ -0,0 +1,164 @@
|
||||
<%@ 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" %>
|
||||
|
||||
<script defer>
|
||||
|
||||
|
||||
//쿠폰받기 가능한 쿠폰이 없을경우 버튼, 전체선택버튼 비활성화
|
||||
$(document).ready(function () {
|
||||
|
||||
let couponUsedChk = 0;
|
||||
$('div .couponSelect__item.used').each(() => {
|
||||
couponUsedChk++;
|
||||
});
|
||||
|
||||
if ($('div .couponSelect__item.coupon__used__chk').length === couponUsedChk) {
|
||||
$('#couponCheckAll').prop('disabled', true)
|
||||
$('#selectCouponBtn').prop('disabled', true)
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
// 240729 1. 쿠폰 선택 우측 텍스트 영역 클릭해도, 체크박스 체크되도록 2. 전체선택 클릭 시, 전체 체크박스 체크/해제
|
||||
$('.couponSelect__item__right').click(function () {
|
||||
var checkbox = $(this).prev().find('input[type="checkbox"]');
|
||||
checkbox.trigger('click');
|
||||
});
|
||||
|
||||
$('#couponCheckAll').click(function () {
|
||||
if ($('#couponCheckAll').is(':checked')) {
|
||||
$('.couponCheck').prop('checked', true);
|
||||
} else {
|
||||
$('.couponCheck').prop('checked', false);
|
||||
}
|
||||
|
||||
if ($('.couponCheck').closest('.couponSelect__item').hasClass('used')) {
|
||||
$('.couponCheck:checked').prop('checked', false);
|
||||
}
|
||||
});
|
||||
|
||||
$('.couponCheck').click(function () {
|
||||
if ($('.couponCheck').length == $('.couponCheck:checked').length) {
|
||||
$('#couponCheckAll').prop('checked', true);
|
||||
} else {
|
||||
$('#couponCheckAll').prop('checked', false);
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<!-- 쿠폰 받기 모달 -->
|
||||
<!-- 240729 쿠폰 받기 바텀시트 -->
|
||||
<div class="microModal microBottomSheet" id="coupon-select-popUp" aria-hidden="true">
|
||||
<div class="microModal__overlay" tabindex="-1">
|
||||
<div class="microModal__container" role="dialog" aria-modal="true">
|
||||
<div class="microModal__body">
|
||||
<div class="microModal__top">
|
||||
<button class="microModal__close" aria-label="창 닫기" onclick="closeModal('coupon-select-popUp')"></button>
|
||||
</div>
|
||||
<div class="microModal__content">
|
||||
<div class="couponSelect" id="dwldCouponDiv">
|
||||
<div class="couponSelect__item couponSelect__item--checkAll">
|
||||
<div class="couponSelect__item__left">
|
||||
<div class="b-checkbox-container">
|
||||
<label class="b-checkbox checkbox">
|
||||
<input id="couponCheckAll" type="checkbox" value="">
|
||||
<span class="check"></span>
|
||||
<span class="control-label"></span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="couponSelect__item__right">
|
||||
<span class="couponSelect__item__checkAll">전체선택</span>
|
||||
</div>
|
||||
</div>
|
||||
<c:choose>
|
||||
<c:when test="${not empty resultMap.couponList}">
|
||||
<c:forEach var="couponInfo" items="${resultMap.couponList}">
|
||||
<c:choose>
|
||||
<c:when test="${couponInfo.couponTrgetAt eq '1'}">
|
||||
<div class="couponSelect__item coupon__used__chk <c:if test="${couponInfo.couponDownAt eq 'Y' }"> used</c:if>" > <%--사용한 쿠폰이거나 이미 다운로드 하였을 경우 used 클래스 적용--%>
|
||||
<div class="couponSelect__item__left">
|
||||
<div class="b-checkbox-container">
|
||||
<label class="b-checkbox checkbox is-medium">
|
||||
<input class="couponCheck dwldCheckBox" type="checkbox" value="">
|
||||
<span class="check"></span>
|
||||
<span class="control-label"></span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="couponSelect__item__right">
|
||||
<span class="couponSelect__item__price"><fmt:formatNumber value="${couponInfo.aditDscntAmt}" />원
|
||||
<c:if test="${couponInfo.couponDownAt eq 'Y'}"><span class="couponSelect__item__usedText">(이미 다운로드 한 쿠폰)</span></c:if>
|
||||
<p class="couponSelect__item__detail"><c:out value="${couponInfo.couponSndngNm}"/></p>
|
||||
<c:choose>
|
||||
<c:when test="${couponInfo.cvalidpdKndCd eq '01'}">
|
||||
<p class="couponSelect__item__date">~<c:out value="${couponInfo.validpdEndDt}"/> (<c:out value="${couponInfo.validpdDeCnt}"/> 일 남음)</p>
|
||||
<input type="hidden" name="couponInnb" value="<c:out value="${ couponInfo.couponInnb }"/>"/>
|
||||
<input type="hidden" name="couponSopmalCd" value="<c:out value="${ couponInfo.sopmalCd }"/>"/>
|
||||
<input type="hidden" name="couponSndngInnb" value="<c:out value="${ couponInfo.couponSndngInnb }"/>"/>
|
||||
</c:when>
|
||||
<c:otherwise>
|
||||
<p class="couponSelect__item__date">~<c:out value="${couponInfo.dwldEndDt}"/> (발급(다운로드)일로 부터 <c:out value="${couponInfo.validpdDeCnt}"/> 일)</p>
|
||||
<input type="hidden" name="couponInnb" value="<c:out value="${ couponInfo.couponInnb }"/>"/>
|
||||
<input type="hidden" name="couponSopmalCd" value="<c:out value="${ couponInfo.sopmalCd }"/>"/>
|
||||
<input type="hidden" name="couponSndngInnb" value="<c:out value="${ couponInfo.couponSndngInnb }"/>"/>
|
||||
</c:otherwise>
|
||||
</c:choose>
|
||||
</div>
|
||||
</div>
|
||||
</c:when>
|
||||
<c:otherwise>
|
||||
<div class="couponSelect__item used" >
|
||||
<div class="couponSelect__item__left">
|
||||
<div class="b-checkbox-container">
|
||||
<label class="b-checkbox checkbox is-medium">
|
||||
<input class="couponCheck dwldCheckBox" type="checkbox" value="">
|
||||
<span class="check"></span>
|
||||
<span class="control-label"></span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="couponSelect__item__right">
|
||||
<span class="couponSelect__item__price"><fmt:formatNumber value="${couponInfo.aditDscntAmt}" />원
|
||||
<span class="couponSelect__item__usedText">(쿠폰대상이 아닙니다)</span>
|
||||
<p class="couponSelect__item__detail"><c:out value="${couponInfo.couponSndngNm}"/></p>
|
||||
<c:choose>
|
||||
<c:when test="${couponInfo.cvalidpdKndCd eq '01'}">
|
||||
<p class="couponSelect__item__date">~<c:out value="${couponInfo.validpdEndDt}"/> (<c:out value="${couponInfo.validpdDeCnt}"/> 일 남음)</p>
|
||||
<input type="hidden" name="couponInnb" value="<c:out value="${ couponInfo.couponInnb }"/>"/>
|
||||
<input type="hidden" name="couponSopmalCd" value="<c:out value="${ couponInfo.sopmalCd }"/>"/>
|
||||
<input type="hidden" name="couponSndngInnb" value="<c:out value="${ couponInfo.couponSndngInnb }"/>"/>
|
||||
</c:when>
|
||||
<c:otherwise>
|
||||
<p class="couponSelect__item__date">~<c:out value="${couponInfo.dwldEndDt}"/> (발급(다운로드)일로 부터 <c:out value="${couponInfo.validpdDeCnt}"/> 일)</p>
|
||||
<input type="hidden" name="couponInnb" value="<c:out value="${ couponInfo.couponInnb }"/>"/>
|
||||
<input type="hidden" name="couponSopmalCd" value="<c:out value="${ couponInfo.sopmalCd }"/>"/>
|
||||
<input type="hidden" name="couponSndngInnb" value="<c:out value="${ couponInfo.couponSndngInnb }"/>"/>
|
||||
</c:otherwise>
|
||||
</c:choose>
|
||||
</div>
|
||||
</div>
|
||||
</c:otherwise>
|
||||
</c:choose>
|
||||
</c:forEach>
|
||||
</c:when>
|
||||
<c:otherwise>
|
||||
<c:out value="다운로드 가능한 쿠폰이 없습니다."/>
|
||||
</c:otherwise>
|
||||
</c:choose>
|
||||
</div>
|
||||
<div class="productOption__bottom">
|
||||
<div class="product-btn-container">
|
||||
<button type="button" id="selectCouponBtn" class="btn theme" onclick="fn_coupon_dwld_regist();">선택한 쿠폰 받기</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
37
src/main/webapp/WEB-INF/views/sopmal_m/goods/loginPopR.jsp
Normal file
37
src/main/webapp/WEB-INF/views/sopmal_m/goods/loginPopR.jsp
Normal file
@@ -0,0 +1,37 @@
|
||||
<%@ 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 : StorePickDtlR.jsp
|
||||
Description : 리뷰 상세 모달
|
||||
Modification Information
|
||||
|
||||
수정일 수정자 수정내용
|
||||
------- -------- ---------------------------
|
||||
2024-05 김혜인
|
||||
--%>
|
||||
<!DOCTYPE html>
|
||||
<html lang="ko">
|
||||
<%--상품 qna 작성 할 때 회원이 아닐 시--%>
|
||||
<div class="microModal microAlert" id="authPop" aria-hidden="true">
|
||||
<div class="microModal__overlay" tabindex="-1">
|
||||
<div class="microModal__container" role="dialog" aria-modal="true">
|
||||
<div class="microModal__body">
|
||||
<div class="microModal__top">
|
||||
이용하시려면 로그인이 필요합니다!
|
||||
<br>
|
||||
로그인하시겠습니까?
|
||||
</div>
|
||||
</div>
|
||||
<div class="microModal__btnContainer">
|
||||
<button class="microModal__btn microModal__btn-primary" onclick = "fn_move_login()"><spring:message code="button.yes"/></button>
|
||||
<button class="microModal__btn" data-micromodal-close="" aria-label="창 닫기"><spring:message code="button.no"/></button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</html>
|
||||
Reference in New Issue
Block a user