ReviewDetailForm.html 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282
  1. <!DOCTYPE html>
  2. <html lang="ko"
  3. xmlns:th="http://www.thymeleaf.org">
  4. <!--
  5. *******************************************************************************
  6. * @source : ReviewDetailForm.html
  7. * @desc : 리뷰 상세 팝업 Page
  8. *============================================================================
  9. * STYLE24
  10. * Copyright(C) 2020 TSIT, All rights reserved.
  11. *============================================================================
  12. * VER DATE AUTHOR DESCRIPTION
  13. * === =========== ========== =============================================
  14. * 1.0 2021.04.22 gagamel 최초 작성
  15. *******************************************************************************
  16. -->
  17. <div class="modalPopup" data-width="1200" id="popupReviewDetail">
  18. <div class="panelStyle">
  19. <!-- TITLE -->
  20. <div class="panelTitle">
  21. <strong>리뷰 상세</strong>
  22. <button type="button" class="close" onclick="uifnPopupClose('popupReviewDetail');"><em class="fa fa-times"></em></button>
  23. </div>
  24. <!-- //TITLE -->
  25. <!-- CONTENT -->
  26. <div class="panelContent">
  27. <form id="reviewDetailForm" name="reviewDetailForm" action="#" th:action="@{'/marketing/review/user/reply/save'}" th:method="post" th:object="${reviewInfo}">
  28. <input type="hidden" name="reviewSq" th:value="*{reviewSq}"/>
  29. <div class="reviewWrap">
  30. <div class="user_review">
  31. <div class="prodInfo">
  32. <div class="prodImg">
  33. <img th:src="${@environment.getProperty('upload.goods.view') + '/' + reviewInfo.goodsImg}" onerror="this.src=\'/image/no.gif\';"/>
  34. </div>
  35. <dl>
  36. <dt>상품코드</dt>
  37. <dd class="cBk" style="width: 100px;"><strong th:text="*{goodsCd}">ABC123456</strong></dd>
  38. <dt>상품명</dt>
  39. <dd class="cBk" th:text="*{goodsNm}"></dd>
  40. </dl>
  41. <dl>
  42. <dt>주문번호</dt>
  43. <dd class="cBk" style="width: 100px;"><strong th:text="*{ordNo}"></strong></dd>
  44. <dt>고객명</dt>
  45. <dd class="cBk" style="width: 100px;"><span th:text="*{custNm}"></span> <strong th:text="*{'(' + custNo + ')'}"></strong></dd>
  46. <dt>구매옵션</dt>
  47. <dd style="width: 100px;">베이지 / 100</dd>
  48. </dl>
  49. <dl>
  50. <dt>고객별점</dt>
  51. <dd>
  52. <div class="star_score">
  53. <span class="star">
  54. <em class="progbar" style="width:70%;"></em>
  55. </span>
  56. </div>
  57. </dd>
  58. <dt>키/몸무게</dt><dd th:text="*{height + '/' + weight}">178cm/71kg</dd>
  59. <dt th:if="*{scoreSize != null}">사이즈</dt><dd th:text="*{scoreSize}">작음</dd>
  60. <dt th:if="*{scoreColor != null}">컬러</dt><dd th:text="*{scoreColor}">밝음</dd>
  61. <dt th:if="*{scoreFit != null}">핏</dt><dd th:text="*{scoreFit}">레귤러</dd>
  62. <dt th:if="*{scoreThick != null}">두께감</dt><dd th:text="*{scoreThick}">적당함</dd>
  63. <dt th:if="*{scoreWeight != null}">무게감</dt><dd th:text="*{scoreWeight}"></dd>
  64. <dt th:if="*{scoreBall != null}">볼넓이</dt><dd th:text="*{scoreBall}"></dd>
  65. </dl>
  66. </div>
  67. <!-- 리뷰 파일 -->
  68. <dl class="rvPic">
  69. <dt>등록파일</dt>
  70. <dd>
  71. <div class="picList" id="divPicList">
  72. <th:block th:if="*{attachList != null}" th:each="oneData, status : *{attachList}">
  73. <a th:if="${oneData.fileGb == 'M'}" href="javascript:void(0);" class="mov" onclick="fnPopupOpen('layer_review_pic', this);">
  74. <iframe class="player" th:src="${kollusMediaUrl + '/' + oneData.kmcKey + '?enable_initialize_focus=false&mute'}"></iframe>
  75. </a>
  76. <a th:if="${oneData.fileGb == 'I'}" href="javascript:void(0);" onclick="fnPopupOpen('layer_review_pic', this);">
  77. <span th:style="${'background-image:url(' + @environment.getProperty('upload.default.view') + oneData.sysFileNm + ');'}">사진</span>
  78. </a>
  79. </th:block>
  80. </div>
  81. <div class="chk">
  82. <i>동영상 노출 상태 설정</i>
  83. <span class="switchBox switch-base">
  84. <input type="checkbox" id="chkConfirmYn" value="Y" th:checked="*{confirmYn == 'Y' ? true : false}" th:disabled="*{confirmYn == 'Y' ? true : false}" onclick="fnUpdateVideoReviewDisplay(this);"><label for="chkConfirmYn"><span>Ball</span></label><!-- default: 영상 숨김 -->
  85. </span>
  86. </div>
  87. </dd>
  88. </dl>
  89. <dl class="rvTxt">
  90. <dt>구매후기</dt>
  91. <dd th:utext="*{reviewContent}"></dd>
  92. </dl>
  93. <!-- //리뷰 파일 -->
  94. <!-- 포인트 지급 정보 -->
  95. <!-- <dl class="orderInfo"> -->
  96. <!-- <dt>포인트</dt> -->
  97. <!-- <dd class="cBk"><strong th:text="*{giveDuePnt}"></strong> <span th:text="*{pntGiveStat}"></span></dd> -->
  98. <!-- <dt th:if="*{bestYn != null}">베스트포인트</dt> -->
  99. <!-- <dd class="cBk" th:if="*{bestYn != null}"><strong th:text="*{giveDueBpnt}"></strong> <span th:text="*{bpntGiveYn}"></span></dd> -->
  100. <!-- </dl> -->
  101. <!-- //포인트 지급 정보 -->
  102. <!-- 관리자 답변 등록 -->
  103. <ul class="panelBar">
  104. <li>
  105. <i class="fa fa-smile-o" aria-hidden="true"></i> 관리자
  106. <strong th:if="*{admRplRegNm != null}" th:text="*{admRplRegNm}"></strong>
  107. <span class="date" th:if="*{admRplDt != null}" th:text="*{admRplDt}"></span>
  108. </li>
  109. <li class="right">
  110. <button type="button" class="btn btn-base btn-lg" id="btnSaveReply">저장</button>
  111. </li>
  112. </ul>
  113. <table class="frmStyle">
  114. <colgroup>
  115. <col width="110px"/>
  116. <col/>
  117. </colgroup>
  118. <tbody>
  119. <tr>
  120. <th>관리자 답변<br/><span id="dpLocAdmRpt">0</span>/4,000</th>
  121. <td>
  122. <textarea th:if="*{rplCfmYn != null and rplCfmYn == 'Y'}" class="textareaR3" name="admRpl" th:text="*{admRpl}" disabled="disabled"></textarea>
  123. <textarea th:if="*{rplCfmYn == null or rplCfmYn == 'N'}" class="textareaR3" name="admRpl" th:text="*{admRpl}" onkeyup="cfnGetTextLength(this, 4000, $('#dpLocAdmRpt'));"></textarea>
  124. </td>
  125. </tr>
  126. </tbody>
  127. </table>
  128. <!-- //관리자 답변 등록 -->
  129. </div>
  130. </div>
  131. </form>
  132. </div>
  133. </div>
  134. </div>
  135. <!-- 사용자 레이어팝업 : 등록 파일 출력 -->
  136. <div class="uPopupWrap off" id="layer_review_pic">
  137. <div class="area reviewPic" style="width:500px; height:500px;">
  138. <ul class="picList" th:object="${reviewInfo}">
  139. <th:block th:if="*{attachList != null}" th:each="oneData, status : *{attachList}">
  140. <li th:if="${oneData.fileGb == 'M'}"><iframe class="player" th:src="${kollusMediaUrl + '/' + oneData.kmcKey + '?enable_initialize_focus=false&mute'}"></iframe></li>
  141. <li th:if="${oneData.fileGb == 'I'}"><div class="img" th:style="${'background-image:url(' + @environment.getProperty('upload.default.view') + oneData.sysFileNm + ');'}"></div></li>
  142. </th:block>
  143. </ul>
  144. <button type="button" class="btnArr prev" onclick="fnPicPrev('layer_review_pic');">이전</button>
  145. <button type="button" class="btnArr next" onclick="fnPicNext('layer_review_pic');">다음</button>
  146. <button type="button" class="btnClose">닫기</button>
  147. </div>
  148. </div>
  149. <!-- //사용자 레이어팝업 : 등록 파일 출력 -->
  150. <script th:inline="javascript">
  151. /*<![CDATA[*/
  152. //동영상 플레이어
  153. var controller;
  154. var player = document.getElementsByClassName("player");
  155. player.onload = function() {
  156. try {
  157. var controller = new VgControllerClient({
  158. target_window: document.getElementById('pdThumbVideo').contentWindow
  159. });
  160. controller.on('ready', function() { //플레이어 준비 완료
  161. controller.set_ratio('fill');
  162. //contain : 비율에 맞게 채웁니다.
  163. //fill : 화면에 꽉 차게 채웁니다.
  164. //enlargement : 세로 높이를 꽉 차게 맞춥니다. 좌우로 스크롤이 가능합니다
  165. controller.play();
  166. });
  167. controller.on('done', function() { //플레이어 재생 완료
  168. controller.play();
  169. });
  170. } catch (e) {
  171. // Videogateweay Controller Library는 window.postMessage API를 이용하기 때문에
  172. // 해당 기능을 지원하지 않는 웹브라우져에서는 동작하지 않습니다.
  173. // 이 부분에 적절한 fail-over 코드를 추가하여 주십시요.
  174. mcxDialog.alert("해당 기능을 지원하지 않는 웹브라우져에서는 동작하지 않습니다.");
  175. }
  176. }
  177. // 팝업 열기
  178. function fnPopupOpen(id,el,kind) {
  179. $("#"+id).removeClass("off"); //레이어 Open
  180. $("#"+id).find(".picList li").removeClass("on");
  181. let onIdx = $(el).index();
  182. $("#"+id).find(".picList li").eq(onIdx).addClass("on");
  183. let picTot = $("#"+id).find(".picList li").length - 1;
  184. //console.log(onIdx +', '+ picTot);
  185. if (onIdx == 0) {
  186. $("#"+id).find("button.prev").addClass("off");
  187. }
  188. if (onIdx == picTot) {
  189. $("#"+id).find("button.next").addClass("off");
  190. }
  191. }
  192. // 팝업 닫기 버튼 //uifnPopupClose 함수로 닫으면 remove 되어서 테스트 불가능하며 임시로 사용, 추후 바꾸세요
  193. $("#layer_review_pic .btnClose").click(function() {
  194. $("#layer_review_pic").addClass("off"); //레이어 닫기
  195. $("#layer_review_pic").find("button.btnArr").removeClass("off"); //버튼 초기화
  196. });
  197. // 팝업 레이어 : 이전 버튼
  198. function fnPicPrev(id){
  199. let onIdx = $("#"+id).find(".picList li.on").index() - 1;
  200. let picTot = $("#"+id).find(".picList li").length - 1;
  201. //console.log(onIdx +', '+ picTot);
  202. if (onIdx >= 0 ) {
  203. $("#"+id).find(".picList li").removeClass("on");
  204. $("#"+id).find(".picList li").eq(onIdx).addClass("on");
  205. }
  206. //화살표버튼
  207. if (onIdx <= 0) {
  208. $("#"+id).find("button.prev").addClass("off");
  209. }
  210. if (onIdx < picTot) {
  211. $("#"+id).find("button.next").removeClass("off");
  212. }
  213. }
  214. // 팝업 레이어 : 다음 버튼
  215. function fnPicNext(id){
  216. let onIdx = $("#"+id).find(".picList li.on").index() + 1;
  217. let picTot = $("#"+id).find(".picList li").length - 1;
  218. //console.log(onIdx +', '+ picTot);
  219. if (onIdx <= picTot) {
  220. $("#"+id).find(".picList li").removeClass("on");
  221. $("#"+id).find(".picList li").eq(onIdx).addClass("on");
  222. }
  223. //화살표버튼
  224. if (onIdx >= picTot) {
  225. $("#"+id).find("button.next").addClass("off");
  226. }
  227. if (onIdx > 0 ) {
  228. $("#"+id).find("button.prev").removeClass("off");
  229. }
  230. }
  231. // 관리자 댓글 저장
  232. $('#btnSaveReply').on('click', function() {
  233. if (gagajf.isNull($('textarea[name=admRpl]').val())) {
  234. mcxDialog.alert("관리자 답변 내용을 입력해 주세요.");
  235. return false;
  236. }
  237. mcxDialog.confirm("저장하시겠습니까?", {
  238. cancelBtnText: "취소",
  239. sureBtnText: "확인",
  240. sureBtnClick: function() {
  241. gagajf.ajaxFormSubmit($('#reviewDetailForm').prop('action'), '#reviewDetailForm', function() {
  242. uifnPopupClose('popupReviewDetail');
  243. $('#btnSearch').trigger('click');
  244. });
  245. }
  246. });
  247. });
  248. // 상품 동영상 노출 처리
  249. var fnUpdateVideoReviewDisplay = function(obj) {
  250. if ($('#divPicList').find('iframe').length > 0 && $(obj).is(':checked')) {
  251. var actionUrl = '/marketing/review/video/display/update/' + $('#reviewDetailForm input[name=reviewSq]').val();
  252. $.post(actionUrl
  253. , null
  254. , function(result) {
  255. $(obj).attr('disabled', true);
  256. }
  257. , 'json');
  258. }
  259. }
  260. $(document).ready(function() {
  261. cfnGetTextLength($('textarea[name=admRpl]'), 4000, $('#dpLocAdmRpt'));
  262. });
  263. /*]]>*/
  264. </script>
  265. </html>