ChangeOptionPopupFormWeb_20210406.html 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  1. <!-- 배송지변경 팝업 -->
  2. <div class="modal-header">
  3. <h5 class="modal-title" id="exchangeLabel">교환상품 옵션 변경</h5>
  4. </div>
  5. <div class="modal-body">
  6. <div class="pop_cont">
  7. <form class="form_wrap">
  8. <div class="select_option_area">
  9. <h6>옵션 변경 상품 선택</h6>
  10. <div class="form_field">
  11. <div th:if="${exchangeOptionInfo}" th:each="oneData, status : ${exchangeOptionInfo}">
  12. <input th:id="|chk_exchange_item_${oneData.ordDtlItemSq}|" th:attr="ordDtlItemSq=${oneData.ordDtlItemSq}" type="checkbox" onclick="fnSelectOptionChange(this);"><label th:for="|chk_exchange_item_${oneData.ordDtlItemSq}|"><span th:text="|${oneData.itemNm} / ${oneData.colorNm} / ${oneData.optCd2}|"></span></label>
  13. </div>
  14. </div>
  15. </div>
  16. <div class="modify_option_area" id="modifyOptionArea" style="display:none">
  17. <th:block th:if="${exchangeOptionInfo}" th:each="oneData, status : ${exchangeOptionInfo}">
  18. <th:block th:if="${chgQty > 0}" th:each="num, index : ${#numbers.sequence(1,chgQty)}">
  19. <div class="modify_box" th:attr="ordDtlItemSq=${oneData.ordDtlItemSq}, num=${num}" style="display:none">
  20. <div class="name_blk" th:text="|${oneData.itemNm} / ${oneData.colorNm}|"></div>
  21. <div class="select_blk">
  22. <!-- 옵션교환 라디오 형태 -->
  23. <div class="sel_radio" th:if="${oneData.selfGoodsYn == 'Y'}">
  24. <input type="hidden" name="chgOptCd2" th:attr="ordDtlItemSq=${oneData.ordDtlItemSq}, itemNm=${oneData.itemNm}, colorNm=${oneData.colorNm}, orgOptCd2=${oneData.optCd2}, goodsType=${oneData.goodsType}, num=${num}">
  25. <div th:class="|form_field ${oneData.ordDtlItemSq}|">
  26. <div th:if="${oneData.optCd2Arr.length > 0}" th:each="option, idx : ${oneData.optCd2Arr}">
  27. <input type="radio" th:name="|${oneData.ordDtlItemSq}_${num}|" th:id="|${oneData.ordDtlItemSq}_${option}_${num}|" th:value="${option}" th:attr="ordDtlItemSq=${oneData.ordDtlItemSq}, num=${num}" th:disabled="${#numbers.formatInteger(oneData.currStockQtyArr[idx.index], 0)} <= 0 or ${oneData.soldoutYnArr[idx.index] == 'Y'}" onclick="fnRadioOption(this);">
  28. <label th:for="|${oneData.ordDtlItemSq}_${option}_${num}|"><span th:text="${option}"></span></label>
  29. </div>
  30. </div>
  31. </div>
  32. <!-- //옵션교환 라디오 형태 -->
  33. <!-- 옵션교환 셀렉트박스 형태 -->
  34. <div class="sel_select" th:unless="${oneData.selfGoodsYn == 'Y'}">
  35. <div class="form_field">
  36. <div class="select_custom exchange_option">
  37. <div class="combo">
  38. <input type="hidden" name="chgOptCd2" th:attr="ordDtlItemSq=${oneData.ordDtlItemSq}, itemNm=${oneData.itemNm}, colorNm=${oneData.colorNm}, orgOptCd2=${oneData.optCd2}, goodsType=${oneData.goodsType}, num=${num}">
  39. <div class="select">옵션 선택</div>
  40. <ul class="list">
  41. <!-- 선택처리 class="selected" / 선택불가 aria-disabled="true" / 품절표기 data-soldout="true" 추가 -->
  42. <li class="selected" th:attr="ordDtlItemSq=${oneData.ordDtlItemSq}, num=${num}, optCd2=''" onclick="fnSelectOption(this);">옵션 선택</li>
  43. <th:block th:each="option, idx : ${oneData.optCd2Arr}">
  44. <li th:if="${oneData.optCd2Arr.length} > 0 and (${#numbers.formatInteger(oneData.currStockQtyArr[idx.index],0)} <= 0 or ${oneData.soldoutYnArr[idx.index]} == 'Y')" th:text="${option}" aria-disabled="true" data-soldout="true" th:attr="ordDtlItemSq=${oneData.ordDtlItemSq}, num=${num}, optCd2=''" onclick="fnSelectOption(this);"></li>
  45. <li th:if="${oneData.optCd2Arr.length} > 0 and ${#numbers.formatInteger(oneData.currStockQtyArr[idx.index],0)} > 0 and ${oneData.soldoutYnArr[idx.index]} == 'N'" th:text="${option}" th:attr="ordDtlItemSq=${oneData.ordDtlItemSq}, num=${num}, optCd2=${option}" onclick="fnSelectOption(this);"></li>
  46. </th:block>
  47. </ul>
  48. </div>
  49. </div>
  50. </div>
  51. </div>
  52. <!-- //옵션교환 셀렉트박스 형태 -->
  53. </div>
  54. <div class="allcheck_blk" th:if="${num} == 1">
  55. <div class="form_field">
  56. <div>
  57. <input th:id="|${oneData.ordDtlItemSq}_checkAll|" name="chk_exchange_all1" type="checkbox" checked="" onclick="fnSelectOptionChange();"><label th:for="|${oneData.ordDtlItemSq}_checkAll|"><span>선택 옵션으로 전체 교환</span></label>
  58. </div>
  59. </div>
  60. </div>
  61. </div>
  62. </th:block>
  63. </th:block>
  64. </div>
  65. </form>
  66. </div>
  67. </div>
  68. <div class="modal-footer">
  69. <button type="button" id="" class="btn btn_dark" onclick="fnSaveOption();"><span>옵션 저장</span></button>
  70. </div>
  71. <script th:inline="javascript">
  72. let exchangeOptionInfo = [[${exchangeOptionInfo}]];
  73. let oneData = [[${oneData}]];
  74. let chgQty = [[${chgQty}]];
  75. let checkedOrdDtlItemSqArr = [];
  76. $(document).ready( function() {
  77. // 셀렉트박스 활성화
  78. $('#exchangePop .select_custom.exchange_option').each(function() {
  79. new sCombo($(this));
  80. });
  81. });
  82. // 구성상품 선택 및 전체 적용 클릭 이벤트
  83. var fnSelectOptionChange = function() {
  84. checkedOrdDtlItemSqArr = [];
  85. let cnt = 0;
  86. // 체크 수량 조회
  87. $.each($('.select_option_area .form_field input:checkbox'), function(idx, item) {
  88. if ($(item).is(':checked')) {
  89. checkedOrdDtlItemSqArr.push($(item).attr('ordDtlItemSq'));
  90. cnt++;
  91. }
  92. });
  93. // 옵션변경영역 처리
  94. if (cnt > 0) {
  95. $('#modifyOptionArea').css('display', '');
  96. } else {
  97. $('#modifyOptionArea').css('display', 'none');
  98. }
  99. $.each($('.modify_box'), function(idx, item) {
  100. let ordDtlItemSq = $(item).attr('ordDtlItemSq');
  101. let num = $(item).attr('num');
  102. let id = '#' + ordDtlItemSq + '_checkAll';
  103. if (checkedOrdDtlItemSqArr.includes(ordDtlItemSq)) {
  104. if (num == 1) {
  105. $(item).css('display', '');
  106. if (oneData.selfGoodsYn == 'Y') {
  107. $.each($(item).find('input:radio'), function (index, radio) {
  108. if ($(radio).is(':checked')) {
  109. $(radio).click();
  110. }
  111. });
  112. } else {
  113. $.each($(item).find('li'), function (index, radio) {
  114. if ($(radio).hasClass('selected')) {
  115. $(radio).click();
  116. }
  117. });
  118. }
  119. } else if ($(id).is(':checked')) {
  120. $(item).css('display', 'none');
  121. } else {
  122. $(item).css('display', '');
  123. }
  124. } else {
  125. $(item).css('display', 'none');
  126. }
  127. });
  128. fnChangeCss();
  129. }
  130. // 라디오 클릭 이벤트
  131. var fnRadioOption = function(param) {
  132. let ordDtlItemSq = $(param).attr('ordDtlItemSq');
  133. let num = $(param).attr('num');
  134. let optCd2 = $(param).val();
  135. let checkAllId = '#' + ordDtlItemSq + '_checkAll';
  136. let radioId = '.' + ordDtlItemSq + ' input:radio';
  137. $(param).parent().parent().parent().find('input[name=chgOptCd2]').val(optCd2);
  138. if (num == 1 && $(checkAllId).is(':checked')) {
  139. $.each($(radioId), function(idx, item) {
  140. if ($(item).attr('num') != 1 && optCd2 == $(item).val()) {
  141. $(item).click();
  142. }
  143. });
  144. }
  145. }
  146. // 셀렉트박스 클릭 이벤트
  147. var fnSelectOption = function(param) {
  148. let ordDtlItemSq = $(param).attr('ordDtlItemSq');
  149. let num = $(param).attr('num');
  150. let optCd2 = $(param).attr('optCd2');
  151. let checkAllId = '#' + ordDtlItemSq + '_checkAll';
  152. $(param).parent().parent().find('input[name=chgOptCd2]').val(optCd2);
  153. if (num == 1 && $(checkAllId).is(':checked')) {
  154. $.each($('.exchange_option li'), function(idx, item) {
  155. if ($(item).attr('num') != 1 && optCd2 == $(item).attr('optCd2')) {
  156. $(item).click();
  157. }
  158. });
  159. }
  160. }
  161. // 옵션 저장 버튼 클릭 이벤트
  162. var fnSaveOption = function() {
  163. // 옵션 선택 여부 확인
  164. if (checkedOrdDtlItemSqArr.length <= 0) {
  165. mcxDialog.alert('교환 옵션을 선택해주세요.');
  166. return false;
  167. }
  168. // 변경 옵션 처리
  169. let dataArr = [];
  170. let ordDtlItemSq = 0;
  171. let colorNm = '';
  172. let itemNm = '';
  173. let goodsType = '';
  174. let chgOptCd2Arr = [];
  175. let selectOptionCheck = true;
  176. $.each($('input[name=chgOptCd2]'), function(idx, item) {
  177. let chgOrdDtlItemSq = $(item).attr('ordDtlItemSq');
  178. colorNm = $(item).attr('colorNm');
  179. itemNm = $(item).attr('itemNm');
  180. goodsType = $(item).attr('goodsType');
  181. let changeYn = checkedOrdDtlItemSqArr.includes(chgOrdDtlItemSq)
  182. let chgOptCd2 = changeYn ? $(item).val() : $(item).attr('orgOptCd2');
  183. let chgOptCd2Obj = {};
  184. chgOptCd2Obj.chgOptCd2 = chgOptCd2;
  185. chgOptCd2Obj.qty = 1;
  186. if (ordDtlItemSq != Number(chgOrdDtlItemSq)) {
  187. if (idx > 0) {
  188. let data = {};
  189. data.ordDtlNo = oneData.ordDtlNo;
  190. data.ordDtlItemSq = ordDtlItemSq;
  191. data.chgQty = chgQty;
  192. data.colorNm = colorNm;
  193. data.itemNm = itemNm;
  194. data.goodsType = goodsType;
  195. data.chgOptCd2Arr = fnOptionCount(chgOptCd2Arr);
  196. dataArr.push(data);
  197. }
  198. ordDtlItemSq = chgOrdDtlItemSq;
  199. chgOptCd2Arr = [];
  200. }
  201. chgOptCd2Arr.push(chgOptCd2Obj);
  202. // 옵션 선택 여부 설정
  203. if (changeYn && gagajf.isNull($(item).val())) {
  204. selectOptionCheck = false;
  205. }
  206. });
  207. // 옵션 선택 여부 체크
  208. if (!selectOptionCheck) {
  209. mcxDialog.alert('교환 옵션을 선택해주세요.');
  210. return false;
  211. }
  212. let data = {};
  213. data.ordDtlNo = oneData.ordDtlNo;
  214. data.ordDtlItemSq = ordDtlItemSq;
  215. data.chgQty = chgQty;
  216. data.colorNm = colorNm;
  217. data.itemNm = itemNm;
  218. data.goodsType = goodsType;
  219. data.chgOptCd2Arr = fnOptionCount(chgOptCd2Arr);
  220. dataArr.push(data);
  221. fnChangeOptionCallback(dataArr)
  222. $('.close-modal').trigger('click');
  223. }
  224. // 변경 옵션별 수량 처리
  225. var fnOptionCount = function(param) {
  226. var result = [];
  227. param.reduce(function(res, value) {
  228. if (!res[value.chgOptCd2]) {
  229. res[value.chgOptCd2] = { chgOptCd2: value.chgOptCd2, qty: 0 };
  230. result.push(res[value.chgOptCd2])
  231. }
  232. res[value.chgOptCd2].qty += value.qty;
  233. return res;
  234. }, {});
  235. return result;
  236. }
  237. // 옵션 선택 영역 CSS 수정
  238. var fnChangeCss = function() {
  239. let index = 0;
  240. $.each($('.modify_box'), function(idx, item) {
  241. if ($(item).css('display') == 'block') {
  242. index++;
  243. if (index == 1) {
  244. $(item).css('margin-top', '0');
  245. $(item).css('padding-top', '0');
  246. $(item).css('border-top', 'none');
  247. } else {
  248. $(item).css('margin-top', '30px');
  249. $(item).css('padding-top', '30px');
  250. $(item).css('border-top', '1px dashed #ddd');
  251. }
  252. }
  253. });
  254. }
  255. </script>