CartChangeOptionPopupWeb.html 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373
  1. <html lang="ko"
  2. xmlns:th="http://www.thymeleaf.org">
  3. <!-- 옵션변경 팝업 -->
  4. <div id="cartOptionModal" class="modal-dialog cartOptionModal" role="document" th:with="imgGoodsUrl=${@environment.getProperty('upload.goods.view')}, uxImgUrl=${@environment.getProperty('domain.uximage')}, imgUrl=${@environment.getProperty('upload.image.view')}">
  5. <div class="modal-content">
  6. <div class="modal-header">
  7. <h5 class="modal-title" id="optModifyLabel">옵션변경</h5>
  8. <div class="prod_title">
  9. <span class="name" th:text="${cart.goodsNm}"></span>
  10. </div>
  11. </div>
  12. <div class="modal-body">
  13. <div class="pop_cont">
  14. <div class="area_pic">
  15. <ul class="pic_list">
  16. <th:block th:if="${setType.equals(cart.goodsType) or cart.selfGoodsYn.equals('N')}">
  17. <li th:each="img, index : ${cart.cartImgList}">
  18. <span class="thumb">
  19. <img th:src="${cart.imgPath + '/' + img.sysImgNm} + '?RS=180'" src="/" th:onerror="'this.src=\''+@{${uxImgUrl}+ '/images/pc/thumb/bg_item_none.png'}+'\';'" th:alt="${img.sysImgNm}" alt="" />
  20. </span>
  21. </li>
  22. </th:block>
  23. <th:block th:if="${!setType.equals(cart.goodsType) and cart.selfGoodsYn.equals('Y')}">
  24. <th:block th:each="comp, status : ${cart.cartCompsList}">
  25. <th:block th:each="color, index : ${comp.cartColorList}">
  26. <th:block th:if="${color.cartOptCd1 != null and color.cartOptCd1.equals(color.optCd1)}">
  27. <li th:each="img, index : ${color.cartImgList}" th:if="${img.colorCd == color.cartOptCd1}">
  28. <span class="thumb">
  29. <img th:src="${cart.imgPath + '/' + img.sysImgNm} + '?RS=180'" src="/" th:onerror="'this.src=\''+@{${uxImgUrl}+ '/images/pc/thumb/bg_item_none.png'}+'\';'" th:alt="${img.sysImgNm}" alt="" />
  30. </span>
  31. </li>
  32. </th:block>
  33. </th:block>
  34. </th:block>
  35. </th:block>
  36. </ul>
  37. </div>
  38. <div class="area_order">
  39. <th:block th:each="comp, status : ${cart.cartCompsList}">
  40. <!-- 세트상품 옵션 -->
  41. <th:block th:if="${setType.equals(cart.goodsType)}">
  42. <span class="hiddenData">
  43. <input type="hidden" class="cartDtlSq" th:value="${comp.cartDtlSq}" />
  44. <input type="hidden" class="itemCd" th:value="${comp.goodsCd}" />
  45. <input type="hidden" class="optCd" th:classappend="|option_${comp.goodsCd}|" th:value="${comp.optCd}"/>
  46. <input type="hidden" class="optCd1" th:classappend="|option1_${comp.goodsCd}|" th:value="${comp.optCd1}"/>
  47. <input type="hidden" class="optCd2" th:classappend="|option2_${comp.goodsCd}|" th:value="${comp.optCd2}"/>
  48. </span>
  49. <div class="opt_select">
  50. <div class="opt_header">
  51. <span class="title" th:text="${comp.goodsNm}"></span>
  52. </div>
  53. <div class="opt_header">
  54. <span class="title">옵션1</span>
  55. <span class="text" th:classappend="|chooseColorNm_${comp.goodsCd}|" th:text="${comp.colorNm}"></span>
  56. </div>
  57. <form class="form_wrap">
  58. <div class="form_field">
  59. <div class="select_custom item_opt1 colorList">
  60. <div class="combo">
  61. <div class="select" th:text="${comp.colorNm}"></div>
  62. <ul class="list" th:data="${comp.goodsCd}">
  63. <th:block th:each="color, index : ${comp.cartColorList}">
  64. <li th:classappend="${color.cartColorNm != null} ? 'selected'" th:data="${color.optCd1}" th:text="${color.colorNm}" th:aria-disabled="${color.soldoutYn.equals('Y') ? true : false}"></li>
  65. </th:block>
  66. </ul>
  67. </div>
  68. </div>
  69. </div>
  70. </form>
  71. </div>
  72. <div class="opt_select">
  73. <div class="opt_header">
  74. <span class="title">옵션2</span>
  75. <span class="text" th:classappend="|chooseSizeNm_${comp.goodsCd}|" th:text="${comp.optCd2}"></span>
  76. </div>
  77. <form class="form_wrap">
  78. <div class="form_field">
  79. <th:block th:each="color, index : ${comp.cartColorList}">
  80. <div class="select_custom item_opt2 sizeList" th:classappend="|${comp.goodsCd}_${color.optCd1} sizeList${comp.goodsCd}|" th:style="${color.cartColorNm != null ? 'display:block' : 'display:none'}">
  81. <div class="combo">
  82. <div class="select" th:classappend="|size_${comp.goodsCd}_size_nm|" th:text="${comp.optCd2}" th:data="${color.goodsCd}"></div>
  83. <ul class="list setSizeSelect" th:classappend="|size_${comp.goodsCd}|" th:data="${comp.goodsCd}">
  84. <th:block th:each="size, i : ${color.cartSizeList}" th:if="${color.optCd1.equals(size.optCd1)}">
  85. <li th:classappend="${size.cartOptCd != null} ? selected" th:optCd="${size.optCd}" th:value="${size.optCd}" th:text="${size.optCd2}" th:aria-disabled="${color.soldoutYn.equals('Y') or size.soldoutYn.equals('Y') ? true : false}"></li>
  86. </th:block>
  87. </ul>
  88. </div>
  89. </div>
  90. </th:block>
  91. </div>
  92. </form>
  93. </div>
  94. </th:block>
  95. <!-- 자사 일반 상품 옵션 -->
  96. <th:block th:if="${!setType.equals(cart.goodsType) and 'Y'.equals(cart.selfGoodsYn)}">
  97. <div class="opt_color">
  98. <div class="opt_header">
  99. <span class="title">컬러</span>
  100. <th:block th:each="color, index : ${comp.cartColorList}">
  101. <th:block th:if="${color.cartColorNm != null}">
  102. <span class="color" th:text="${color.cartColorNm}"></span>
  103. </th:block>
  104. </th:block>
  105. </div>
  106. <ul>
  107. <li th:each="color, index : ${comp.cartColorList}" class="selfGoodsColor">
  108. <a href="javascript:void(0);" th:cartDtlSq="${color.cartDtlSq}" th:classappend="${color.cartColorNm != null} ? 'on'" class="selfGoodsColorSelect" th:data="${color.optCd1}">
  109. <img th:src="${cart.imgPath + '/' + color.sysImgNm} + '?RS=70'" src="#" th:onerror="'this.src=\''+@{${uxImgUrl}+ '/images/pc/thumb/bg_item_none.png'}+'\';'" th:alt="${color.colorNm}" alt="" />
  110. </a>
  111. </li>
  112. </ul>
  113. </div>
  114. <div class="opt_size">
  115. <div class="opt_header">
  116. <span class="title">사이즈</span>
  117. </div>
  118. <div class="form_field selfGoodsSize">
  119. <th:block th:each="color, index : ${comp.cartColorList}">
  120. <th:block th:if="${color.cartColorNm != null}">
  121. <th:block th:each="size, index : ${color.cartSizeList}">
  122. <div>
  123. <input type="radio" name="rdi-optsize" th:id="|${'rdi-optsize' + size.goodsCd + '-' + size.optCd}|" th:value="${size.optCd}" th:checked="${size.cartOptCd != null}" th:disabled="${size.soldoutYn == 'Y' or cart.goodsQty > size.currStockQty}">
  124. <label th:for="|${'rdi-optsize' + size.goodsCd + '-' + size.optCd}|"><span th:text="${size.optCd2}"></span></label>
  125. </div>
  126. </th:block>
  127. </th:block>
  128. </th:block>
  129. </div>
  130. </div>
  131. </th:block>
  132. <!-- 입점업체 -->
  133. <th:block th:if="${!setType.equals(cart.goodsType) and 'N'.equals(cart.selfGoodsYn)}">
  134. <span class="hiddenData">
  135. <input type="hidden" class="cartDtlSq" th:value="${comp.cartDtlSq}" />
  136. <input type="hidden" class="itemCd" th:value="${comp.goodsCd}" />
  137. <input type="hidden" class="optCd" th:classappend="|option_${comp.goodsCd}|" th:value="${comp.optCd}"/>
  138. <input type="hidden" class="optCd1" th:classappend="|option1_${comp.goodsCd}|" th:value="${comp.optCd1}"/>
  139. <input type="hidden" class="optCd2" th:classappend="|option2_${comp.goodsCd}|" th:value="${comp.optCd2}"/>
  140. </span>
  141. <div class="opt_select">
  142. <div class="opt_header">
  143. <span class="title">옵션1</span>
  144. <span class="text" th:classappend="|chooseColorNm_${comp.goodsCd}|" th:text="${comp.colorNm}"></span>
  145. </div>
  146. <form class="form_wrap">
  147. <div class="form_field">
  148. <div class="select_custom item_opt1 colorList">
  149. <div class="combo">
  150. <div class="select" th:text="${comp.colorNm}"></div>
  151. <ul class="list" th:data="${comp.goodsCd}">
  152. <th:block th:each="color, index : ${comp.cartColorList}">
  153. <li th:classappend="${color.cartColorNm != null} ? 'selected'" th:data="${color.optCd1}" th:text="${color.colorNm}" th:aria-disabled="${color.soldoutYn.equals('Y') ? true : false}"></li>
  154. </th:block>
  155. </ul>
  156. </div>
  157. </div>
  158. </div>
  159. </form>
  160. </div>
  161. <div class="opt_select">
  162. <div class="opt_header">
  163. <span class="title">옵션2</span>
  164. <span class="text" th:classappend="|chooseSizeNm_${comp.goodsCd}|" th:text="${comp.optCd2}"></span>
  165. </div>
  166. <form class="form_wrap">
  167. <div class="form_field">
  168. <th:block th:each="color, index : ${comp.cartColorList}">
  169. <div class="select_custom item_opt2 sizeList" th:classappend="|${comp.goodsCd}_${color.optCd1} sizeList${comp.goodsCd}|" th:style="${color.cartColorNm != null ? 'display:block' : 'display:none'}">
  170. <div class="combo">
  171. <div class="select" th:classappend="|size_${comp.goodsCd}_size_nm|" th:text="${comp.optCd2}" th:data="${color.goodsCd}"></div>
  172. <ul class="list setSizeSelect" th:classappend="|size_${comp.goodsCd}|" th:data="${comp.goodsCd}">
  173. <th:block th:each="size, i : ${color.cartSizeList}" th:if="${color.optCd1.equals(size.optCd1)}">
  174. <li th:classappend="${size.cartOptCd != null} ? selected" th:optCd="${size.optCd}" th:value="${size.optCd}" th:text="${size.optCd2}" th:aria-disabled="${color.soldoutYn.equals('Y') or size.soldoutYn.equals('Y') ? true : false}"></li>
  175. </th:block>
  176. </ul>
  177. </div>
  178. </div>
  179. </th:block>
  180. </div>
  181. </form>
  182. </div>
  183. </th:block>
  184. </th:block>
  185. <div class="opt_count">
  186. <div class="opt_header">
  187. <span class="title">수량</span>
  188. </div>
  189. <div class="number_count">
  190. <span class="minus"><em class="sr-only">감소</em></span>
  191. <input type="text" name="goodsQty" maxlength="3" style='ime-mode:disabled' th:value="${cart.goodsQty}" readonly/>
  192. <span class="plus"><em class="sr-only">추가</em></span>
  193. </div>
  194. </div>
  195. <div class="btn_group_block">
  196. <button class="btn btn_dark btn_block" th:onclick="|fnChangeCartOption(${cart.cartSq})|"><span>옵션변경</span></button>
  197. </div>
  198. </div>
  199. </div>
  200. </div>
  201. </div>
  202. <script th:inline="javascript">
  203. $(document).ready(function() {
  204. $(".select_custom").each(function() {
  205. new sCombo($(this));
  206. });
  207. });
  208. // 세트상품, 입점업체 상품 컬러 변경시
  209. $("#cartOptionModal .colorList > .combo > .list li").on("click", function(e) {
  210. let goodsCd = $(this).parent().attr("data");
  211. let optCd1 = $(this).attr("data");
  212. let firstSize = "";
  213. if(optCd1 != $(".option1_" + goodsCd).val()) {
  214. let firstOptCd = $("#cartOptionModal ." + goodsCd + "_" + optCd1 + " li:first").attr("optcd");
  215. let firstOptCd2 = $("#cartOptionModal ." + goodsCd + "_" + optCd1 + " li:first").text();
  216. $("#cartOptionModal .chooseColorNm_" + goodsCd).text($(this).text());
  217. $("#cartOptionModal .option_" + goodsCd).val(firstOptCd);
  218. $("#cartOptionModal .option1_" + goodsCd).val(optCd1);
  219. $("#cartOptionModal .option2_" + goodsCd).val(firstOptCd2);
  220. $("#cartOptionModal .sizeList" + goodsCd).hide();
  221. $("#cartOptionModal ." + goodsCd + "_" + optCd1).show();
  222. $("#cartOptionModal ." + goodsCd + "_" + optCd1 + " .select").text(firstOptCd2);
  223. $("#cartOptionModal .chooseSizeNm_" + goodsCd).text(firstOptCd2);
  224. }
  225. });
  226. // 세트상품, 입점업체 상품 사이즈 변경시
  227. $(".sizeList > .combo > .list li").on("click", function() {
  228. $(this).parent().parent().parent().parent().parent().parent().find(".opt_header .text").text($(this).text());
  229. $("#cartOptionModal .option_" + $(this).parent().attr("data")).val($(this).attr("optcd"));
  230. $("#cartOptionModal .option2_" + $(this).parent().attr("data")).val($(this).text());
  231. });
  232. /* 옵션변경 > 수량조절 */
  233. //수량1개 이하 감소버튼 비활성화
  234. var valItemCount = $('.optModify_pop .number_count input').val();
  235. if ( valItemCount == 1 ) {
  236. $('.optModify_pop .number_count .minus').addClass('min_val');
  237. }
  238. // 자사 일반 상품 컬러 선택시
  239. $(".selfGoodsColorSelect").on("click", function(e) {
  240. let sizeHtml = "";
  241. let imgHtml = "";
  242. let cart = [[${cart}]];
  243. let color = [[${cart.cartCompsList[0].cartColorList}]];
  244. let optCd1 = $(this).attr("data");
  245. for(let i = 0 ; i < color.length ; i++) {
  246. let size = color[i].cartSizeList;
  247. for(let j = 0 ; j < size.length ; j++) {
  248. if(optCd1 == size[j].optCd1) {
  249. sizeHtml += "<div>";
  250. sizeHtml += "<input type='radio' name='rdi-optsize' id='" + size[j].goodsCd + "-" + size[j].optCd + "' value='" + size[j].optCd + "' ";
  251. if(size[j].soldoutYn == "Y" || cart.goodsQty > size[j].currStockQty) {
  252. sizeHtml += "disabled = 'disabled'";
  253. }
  254. sizeHtml += " />\n";
  255. sizeHtml += "<label for='" + size[j].goodsCd + "-" + size[j].optCd + "'><span>" + size[j].optCd2 + "</span></label>\n"
  256. sizeHtml += "</div>\n";
  257. }
  258. }
  259. if(optCd1 == color[i].optCd1) {
  260. for (let j = 0; j < color[i].cartImgList.length; j++) {
  261. let img = color[i].cartImgList[j];
  262. if(optCd1 == img.colorCd) {
  263. imgHtml += "<li>\n<span class='thumb'>\n";
  264. imgHtml += "<img src='" + cart.imgPath + "/" + img.sysImgNm + "' onerror='this.src='" + [[${@environment.getProperty('domain.uximage')}]] + "/images/pc/thumb/bg_item_none.png' alt='" + img.sysImgNm + "' />\n";
  265. imgHtml += "</span>\n</li>\n";
  266. }
  267. }
  268. }
  269. }
  270. $(".cartOptionModal .pic_list").html(imgHtml);
  271. $(".cartOptionModal .selfGoodsSize").html(sizeHtml);
  272. });
  273. function fnChangeCartOption(cartSq) {
  274. let cart = [[${cart}]];
  275. var cartDtlSqArr = [], itemCds = [], optCds = [];
  276. var data;
  277. if(cart.goodsType == "G056_S") {
  278. $("#cartOptionModal .cartDtlSq").each(function() {
  279. optCds.push($(this).parent().find(".optCd").val());
  280. cartDtlSqArr.push($(this).parent().find(".cartDtlSq").val());
  281. itemCds.push($(this).parent().find(".itemCd").val());
  282. });
  283. data = {
  284. cartSq : cart.cartSq
  285. , goodsCd : cart.goodsCd
  286. , goodsType : cart.goodsType
  287. , cartDtlSqArr : cartDtlSqArr
  288. , itemCds : itemCds
  289. , optCds : optCds
  290. , goodsQty : $("input[name=goodsQty]").val()
  291. }
  292. } else if(cart.goodsType != "G056_S" && cart.selfGoodsYn == "Y") {
  293. if($(".selfGoodsSize").find("input[name=rdi-optsize]:checked").length < 1) {
  294. mcxDialog.alert("옵션을 선택해 주세요.");
  295. return false;
  296. }
  297. optCds.push($(".selfGoodsSize").find("input[name=rdi-optsize]:checked").val());
  298. itemCds.push(cart.goodsCd);
  299. $(".selfGoodsColorSelect").each(function() {
  300. if($(this).attr("cartDtlSq") > 0) {
  301. cartDtlSqArr.push($(this).attr("cartDtlSq"));
  302. }
  303. });
  304. data = {
  305. cartSq : cart.cartSq
  306. , goodsCd : cart.goodsCd
  307. , goodsType : cart.goodsType
  308. , cartDtlSqArr : cartDtlSqArr
  309. , itemCds : itemCds
  310. , optCds : optCds
  311. , goodsQty : $("input[name=goodsQty]").val()
  312. }
  313. } else {
  314. $("#cartOptionModal .cartDtlSq").each(function() {
  315. optCds.push($(this).parent().find(".optCd").val());
  316. cartDtlSqArr.push($(this).parent().find(".cartDtlSq").val());
  317. itemCds.push($(this).parent().find(".itemCd").val());
  318. });
  319. data = {
  320. cartSq : cart.cartSq
  321. , goodsCd : cart.goodsCd
  322. , goodsType : cart.goodsType
  323. , cartDtlSqArr : cartDtlSqArr
  324. , itemCds : itemCds
  325. , optCds : optCds
  326. , goodsQty : $("input[name=goodsQty]").val()
  327. }
  328. }
  329. $.ajax( {
  330. type: "POST",
  331. url : '/cart/change/option',
  332. contentType: 'application/json',
  333. dataType : 'json',
  334. data : JSON.stringify(data),
  335. error : function(e) {
  336. mcxDialog.alert(e.message);
  337. },
  338. success : function(result) {
  339. mcxDialog.alert(result.message);
  340. $(".closeCartOptionModal").trigger("click");
  341. if(result.status == "SUCCESS") {
  342. let data = {shotDelvUseYn : $("input[name=shotDelvUseYn]:checked").val()};
  343. getCartList(data);
  344. }
  345. }
  346. });
  347. }
  348. </script>
  349. <a href="#close-modal" rel="modal:close" id="optModifyPop_close" class="close-modal closeCartOptionModal">Close</a>
  350. </div>
  351. <!-- //옵션변경 팝업 -->
  352. </html>