GoodsContentsForm.html 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850
  1. <!DOCTYPE html>
  2. <html lang="ko"
  3. xmlns:th="http://www.thymeleaf.org">
  4. <!--
  5. *******************************************************************************
  6. * @source : GoodsContentsForm.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.07.14 eskim 최초 작성
  15. *******************************************************************************
  16. -->
  17. <div id="main">
  18. <!-- 메인타이틀 영역 -->
  19. <div class="main-title">
  20. </div>
  21. <!-- //메인타이틀 영역 -->
  22. <!-- 메뉴 설명 -->
  23. <div class="infoBox menu-desc">
  24. </div>
  25. <!-- //메뉴 설명 -->
  26. <!-- 검색조건 영역 -->
  27. <div class="panelStyle">
  28. <!-- TITLE -->
  29. <div class="panelTitle">
  30. <h3><i class="fa fa-info-circle"></i>아래 검색조건 중 하나를 꼭 입력해 주세요.</h3>
  31. </div>
  32. <!-- //TITLE -->
  33. <form id="searchForm" name="searchForm" action="#" th:action="@{'/goods/contents/list'}" >
  34. <input type="hidden" id="searchGb" name="searchGb" />
  35. <div class="panelContent">
  36. <table class="frmStyle" aria-describedby="검색조건">
  37. <colgroup>
  38. <col width="8%"/>
  39. <col width="17%"/>
  40. <col width="8%"/>
  41. <col width="17%"/>
  42. <col width="8%"/>
  43. <col width="17%"/>
  44. <col width="8%"/>
  45. <col/>
  46. </colgroup>
  47. <tr>
  48. <th>컨텐츠유형</th>
  49. <td>
  50. <select name="goodsContentsType" id="goodsContentsType">
  51. <option th:if="${goodsContentsTypeList}" th:each="oneData, status : ${goodsContentsTypeList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}" th:selected="${status.first}"></option>
  52. </select>
  53. </td>
  54. <th>업체</th>
  55. <td>
  56. <input type="text" class="w100" name="supplyCompSearchTxt" id="supplyCompSearchTxt" maxlength="20" />
  57. <button type="button" class="btn icn" id="btnSearchSupplyComp"><i class="fa fa-search"></i></button>
  58. <span id="supplyCompText"></span>
  59. <input type="hidden" name="supplyCompList"/>
  60. </td>
  61. <th>브랜드</th>
  62. <td>
  63. <input type="text" class="w100" name="searchTxt" id="searchTxt" maxlength="20" />
  64. <button type="button" class="btn icn" id="btnSearchBrand"><i class="fa fa-search"></i></button>
  65. <span id="brandText"></span>
  66. <input type="hidden" name="brandList"/>
  67. </td>
  68. <th rowspan="3">키워드</th>
  69. <td rowspan="3">
  70. <select name="search" id="search">
  71. <option value="searchGoodsCd">상품코드</option>
  72. <option value="searchGoodsNm">상품명</option>
  73. </select>
  74. <textarea class="textareaR3 w60p" name="condition" id="condition"></textarea>
  75. </td>
  76. </tr>
  77. <tr>
  78. <th>컨텐츠제목</th>
  79. <td colspan="3">
  80. <input name="noticeTitle" type="text" maxlength="200"/>
  81. </td>
  82. <th>사용여부</th>
  83. <td>
  84. <select name="useYn">
  85. <option value="">[전체]</option>
  86. <option value="Y">[Y] Yes</option>
  87. <option value="N">[N] No</option>
  88. </select>
  89. </td>
  90. </tr>
  91. <tr>
  92. <th>노출기간</th>
  93. <td colspan="5" id="sellTerms">
  94. </td>
  95. </tr>
  96. </table>
  97. <ul class="panelBar">
  98. <li class="center">
  99. <button type="button" class="btn btn-gray btn-lg" onclick="$('#searchForm')[0].reset();">초기화</button>
  100. <button type="button" class="btn btn-base btn-lg" id="btnSearch">조회</button>
  101. </li>
  102. </ul>
  103. </div>
  104. </form>
  105. </div>
  106. <!-- 검색조건 영역 -->
  107. <!-- 리스트 영역 -->
  108. <div class="panelStyle">
  109. <div id="gridContentsList" style="width: 100%; height: 400px" class="ag-theme-balham"></div>
  110. </div>
  111. <!-- //리스트 영역 -->
  112. <form id="goodsContentsForm" name="goodsContentsForm" action="#" th:action="@{'/goods/contents/save'}">
  113. <input type="hidden" name="goodsList" />
  114. <!-- 등록/수정 -->
  115. <div class="panelStyle" >
  116. <ul>
  117. <li>
  118. <table class="w100p">
  119. <colgroup>
  120. <col style="width:65%;"/>
  121. <col style="width:1%;"/>
  122. <col/>
  123. </colgroup>
  124. <tr>
  125. <td style="vertical-align:top;">
  126. <table class="frmStyle" aria-describedby="등록/수정 폼">
  127. <colgroup>
  128. <col style="width:10%;"/>
  129. <col style="width:40%;"/>
  130. <col style="width:10%;"/>
  131. </colgroup>
  132. <tr>
  133. <th>컨텐츠번호</th>
  134. <td>
  135. <input type="text" class="w100" name="goodsContentsSq" placeholder="자동부여" readonly="readonly"/>
  136. </td>
  137. <th>컨텐츠유형<i class="required" title="필수"></i></th>
  138. <td>
  139. <select name="goodsContentsType" id="goodsContentsType">
  140. <option th:if="${goodsContentsTypeList}" th:each="oneData, status : ${goodsContentsTypeList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}" th:selected="${status.first}"></option>
  141. </select>
  142. </td>
  143. </tr>
  144. <tr>
  145. <th>노출기간<i class="required" title="필수"></i></th>
  146. <td>
  147. <input type="text" class="schDate w100" name="goodsContentsStdt" maxlength="10" th:value="${#calendars.format(#calendars.createNow(), 'yyyy-MM-dd')}"/>
  148. ~
  149. <input type="text" class="schDate w100" name="goodsContentsEddt" maxlength="10" th:value="${#calendars.format(#calendars.createNow(), 'yyyy-MM-dd')}"/>
  150. </td>
  151. <th>사용여부</th>
  152. <td>
  153. <input type="hidden" name="useYn"/>
  154. <label class="chkBox"><input type="checkbox" name="chkUseYn" checked="checked" value="Y"/>사용</label>
  155. </td>
  156. </tr>
  157. <tr>
  158. <th>제목<i class="required" title="필수"></i></th>
  159. <td colspan="3">
  160. <input type="text" name="goodsContentsTitle" required="required" data-valid-name="제목"/>
  161. </td>
  162. </tr>
  163. <tr id="videoArea">
  164. <th>동영상구분</th>
  165. <td colspan="3">
  166. <select name="goodsContentsVideoGubun" id="goodsContentsVideoGubun" data-valid-name="동영상구분">
  167. <!-- <option value="">[선택]</option> -->
  168. <option value="Y" selected="selected">[Y] 유투브</option>
  169. <option value="M">[M] MP4</option>
  170. </select>
  171. </td>
  172. </tr>
  173. <tr id="youtubeArea">
  174. <th>동영상URL<em class="required" title="필수"></em></th>
  175. <td class="infoTxt" colspan="3">
  176. <em><i class="fa fa-info-circle"></i>유투브의 경우 빨간색 표시로 되어있는 값만 넣으세요.</em><br/>
  177. 예시 : https://www.youtube.com/embed/<em><strong>5YqYG71bQ3s</strong></em>?showinfo=0&amp;rel=0&amp;vp=hd1080&amp;fs=0&amp;wmode=opaque&amp;enablejsapi=1
  178. <br/>
  179. <input type="text" class="w400" id="kmcKey" name="kmcKey" maxlength="100" >
  180. <button type="button" class="btn btn-dark btn-lg" onclick="cfnOpenGoodsVideoPopup('filmVideoView','kmcKey', '#detailForm', $('#videoGb').val());">미리보기</button>
  181. </td>
  182. </tr>
  183. <tr id="videofileArea" style="display:none;">
  184. <th>파일첨부<em class="required" title="필수"></em></th>
  185. <td class="infoTxt" colspan="3">
  186. <div class="uFile w300" id="videoFile">
  187. <input id="file" name="file" type="file" class="uFileInput w300"/>
  188. <label for="file" class="uFileLabel">파일선택</label>
  189. <input type="hidden" name="kufKey"/>
  190. <input type="hidden" name="kmcKey"/>
  191. </div>
  192. <div id="keyArea">미디어키 : <input type="text" class="w200" name="hkmcKey" disabled> upload키 : <input type="text" class="w200" name="hkufKey" disabled></div>
  193. <button type="button" class="btn btn-dark btn-lg" onclick="cfnOpenGoodsVideoPopup('filmVideoView','kmcKey', '#detailForm', $('#videoGb').val());">미리보기</button>
  194. </td>
  195. </tr>
  196. <tr id="imgfileArea" style="display:none;">
  197. <th>파일첨부<em class="required" title="필수"></em></th>
  198. <td class="infoTxt" colspan="3">
  199. 이미지파일 : <span class="uFile w300" id="imgFile">
  200. <input id="file_1" name="file" type="file" class="uFileInput w300" data-valid-name="이미지파일" onchange="fnFileUpload(this);"/>
  201. <label for="file_1" class="uFileLabel">파일선택</label>
  202. <input type="hidden" name="imgPath"/>
  203. <input type="hidden" name="newImgPath"/>
  204. </span>
  205. &nbsp;&nbsp;&nbsp;&nbsp;LINK : <input type="text" class="w400" name="linkUrl" maxlength="300" required="required" data-valid-name="LINK" value="#"/>
  206. <input type="hidden" name="uploadDefaultUrl" id="uploadDefaultUrl" th:value="${@environment.getProperty('upload.image.view')}"/>
  207. <span id="imgView" class="off">
  208. <img id="bannerPreViewUrl" src="" style="width:100px"/>
  209. </span>
  210. </td>
  211. </tr>
  212. <tr id="imglinkArea" style="display:none;">
  213. <th>링크새창구분<i class="required" title="필수"></i></th>
  214. <td>
  215. <label class="rdoBtn"><input type="radio" name="linkTarget" id="linkTargetS" value="S" checked="checked" />본창</label>
  216. <label class="rdoBtn"><input type="radio" name="linkTarget" id="linkTargetN" value="N"/>새창</label>
  217. </td>
  218. </tr>
  219. </table>
  220. </td>
  221. <td>&nbsp;</td>
  222. <td>
  223. <ul class="panelBar">
  224. <li class="left">
  225. <button type="button" class="btn btn-danger btn-lg" id="btnDeleteContentsGoods">삭제</button>
  226. </li>
  227. <li class="right">
  228. <button type="button" class="btn btn-base btn-lg" id="btnSearchExcel">엑셀조회</button>
  229. <button type="button" class="btn btn-info btn-lg" id="btnSearchGoods">상품조회</button>
  230. </li>
  231. </ul>
  232. <ul>
  233. <li id="gridContentsGoodsList" style="width: 100%; height: 450px;" class="ag-theme-balham"></li>
  234. </ul>
  235. </td>
  236. </tr>
  237. </table>
  238. </li>
  239. </ul>
  240. <!-- 버튼 배치 영역 -->
  241. <ul class="panelBar">
  242. <li class="right">
  243. <button type="button" class="btn btn-info btn-lg" id="btnNew">신규</button>
  244. <button type="button" class="btn btn-success btn-lg" id="btnSave">저장</button>
  245. </li>
  246. </ul>
  247. <!-- //버튼 배치 영역 -->
  248. </div>
  249. <!-- 등록/수정 -->
  250. </form>
  251. </div>
  252. <script th:inline="javascript">
  253. /*<![CDATA[*/
  254. var videoGbList = {'Y':'유투브', 'M':'MP4'};
  255. var goodsContentsTypeList = gagajf.convertToArray([[${goodsContentsTypeList}]]);
  256. var columnContentsDefs = [
  257. {headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
  258. {headerName: "컨텐츠번호", field: "goodsContentsSq", width: 90, cellClass: 'text-center'},
  259. {headerName: "컨텐츠제목", field: "goodsContentsTitle", width: 250,
  260. cellRenderer: function(params) { return '<a href="javascript:void(0);">' + params.value + '</a>'; }
  261. },
  262. {headerName: "컨텐츠유형", field: "goodsContentsType", width:150, cellClass: 'text-center',
  263. cellRenderer: function (params) { return !gagajf.isNull(params.value) ? gagaAgGrid.lookupValue(goodsContentsTypeList, params.value) : '';}
  264. },
  265. {headerName: "동영상구분", field: "goodsContentsVideoGubun", width:150, cellClass: 'text-center',
  266. cellRenderer: function (params) { return !gagajf.isNull(params.value) ? gagaAgGrid.lookupValue(videoGbList, params.value) : '';}
  267. },
  268. {headerName: "사용여부", field: "useYn", width:90, cellClass: 'text-center'},
  269. {headerName: "노출시작일", field: "goodsContentsStdt", width:150, cellClass: 'text-center',
  270. cellRenderer: function(params) { return gagaAgGrid.toDateFormat(params.value); }
  271. },
  272. {headerName: "노출종료일", field: "goodsContentsEddt", width:150, cellClass: 'text-center',
  273. cellRenderer: function(params) { return gagaAgGrid.toDateFormat(params.value); }
  274. },
  275. {headerName: "등록자", field: "regNm", width:90, cellClass: 'text-center'},
  276. {headerName: "등록일자", field: "regDt", width:150, cellClass: 'text-center',
  277. cellRenderer: function(params) { return gagaAgGrid.toDateFormat(params.value); }
  278. },
  279. {headerName: "수정자", field: "updNm", width:90, cellClass: 'text-center'},
  280. {headerName: "수정일자", field: "updDt", width:150, cellClass: 'text-center',
  281. cellRenderer: function(params) { return gagaAgGrid.toDateFormat(params.value); }
  282. }
  283. ];
  284. var columnContentsGoodsDefs = [
  285. {width: 40, minWidth: 40, cellClass: 'text-center', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
  286. {headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
  287. {headerName: "CRUD", field: "crud", width: 75, minWidth: 75, hide: true},
  288. {headerName: "상품코드", field: "goodsCd", width: 140, cellClass: 'text-center'},
  289. {headerName: "상품명", field: "goodsNm", width: 260, cellClass: 'text-left'}
  290. ];
  291. var gridContentsOptions = gagaAgGrid.getGridOptions(columnContentsDefs);
  292. var gridContentsGoodsOptions = gagaAgGrid.getGridOptions(columnContentsGoodsDefs);
  293. gridContentsGoodsOptions.rowSelection = 'multiple';
  294. gridContentsGoodsOptions.suppressRowClickSelection = true;
  295. // Cell click
  296. gridContentsOptions.onCellClicked = function(event) {
  297. $("#btnNew").click();
  298. if (event.colDef.field != 'goodsContentsTitle')
  299. return;
  300. $('#goodsContentsForm input[name=goodsContentsSq]').val(event.data.goodsContentsSq);
  301. $('#goodsContentsForm select[name=goodsContentsType]').val(event.data.goodsContentsType);
  302. if (event.data.useYn == 'Y') {
  303. $('#goodsContentsForm input:checkbox[name=chkUseYn]').prop('checked', true);
  304. $('#goodsContentsForm input:checkbox[name=chkUseYn]').parent("label").addClass("checked");
  305. } else {
  306. $('#goodsContentsForm input:checkbox[name=chkUseYn]').prop('checked', false);
  307. $('#goodsContentsForm input:checkbox[name=chkUseYn]').parent("label").removeClass("checked");
  308. }
  309. $('#goodsContentsForm input[name=goodsContentsStdt]').val(event.data.goodsContentsStdt);
  310. $('#goodsContentsForm input[name=goodsContentsEddt]').val(event.data.goodsContentsEddt);
  311. $('#goodsContentsForm input[name=goodsContentsTitle]').val(event.data.goodsContentsTitle);
  312. var contentsImg = event.data.imgPath;
  313. if(!gagajf.isNull(contentsImg)){
  314. $('#goodsContentsForm select[name=goodsContentsVideoGubun]').val('').trigger('click');
  315. $("#goodsContentsForm input[name=imgPath]").val(contentsImg);
  316. $("#bannerPreViewUrl").attr('src', $("#uploadDefaultUrl").val()+contentsImg);
  317. $("#imgView").removeClass("off").addClass("on");
  318. $("#goodsContentsForm input[name=linkUrl]").val(event.data.linkUrl);
  319. if (event.data.linkTarget == "S"){
  320. $("#goodsContentsForm input:radio[name=linkTarget]:input[value='S']").trigger('click');
  321. }else{
  322. $("#goodsContentsForm input:radio[name=linkTarget]:input[value='N']").trigger('click');
  323. }
  324. }else {
  325. $("#goodsContentsForm input[name=imgPath]").val('');
  326. $("#bannerPreViewUrl").attr('src', '');
  327. $("#imgView").removeClass("on").addClass("off");
  328. $('#goodsContentsForm select[name=goodsContentsVideoGubun]').val(event.data.goodsContentsVideoGubun).trigger('click');
  329. if ("Y" == event.data.goodsContentsVideoGubun){
  330. $('#goodsContentsForm input[name=kmcKey]').val(event.data.kmcKey);
  331. }else{
  332. $('#goodsContentsForm input[name=kmcKey]').val(event.data.kmcKey);
  333. $('#goodsContentsForm input[name=kufKey]').val(event.data.kufKey);
  334. $('#goodsContentsForm input[name=hkmcKey]').val(event.data.kmcKey);
  335. $('#goodsContentsForm input[name=hkufKey]').val(event.data.kufKey);
  336. }
  337. }
  338. $(".uFileLabel").text('');
  339. // 상품 목록
  340. fnGetContentsGoodsList(event.data.goodsContentsSq);
  341. fnUnEscapeHtml(); //XSS변환
  342. }
  343. // 검색
  344. $('#btnSearch').on('click', function() {
  345. if(!fnConditionCheck()) return;
  346. gagaAgGrid.fetch($('#searchForm').prop('action'), gridContentsOptions, '#searchForm');
  347. });
  348. //검색 조건 확인
  349. var fnConditionCheck = function(){
  350. var formId = '#searchForm';
  351. var form = document.searchForm;
  352. var searchFlag = false;
  353. var cnt = 0;
  354. for (i = 0; i < form.elements.length; i++ ) {
  355. var el = form.elements[i];
  356. if ($(el).prop("type") == "text" || ($(el).prop("type") == "select-one" && el.name != "search" && el.name != "pageSize")) {
  357. if (!(el.value == null || el.value == "")) {
  358. cnt++;
  359. }
  360. }
  361. }
  362. if(cnt > 0) searchFlag = true;
  363. if(searchFlag == false){
  364. mcxDialog.alert("검색조건을 입력하세요.");
  365. return false;
  366. }
  367. var fromDate = $('#searchForm input[name=stDate]').val();
  368. var toDate = $('#searchForm input[name=edDate]').val();
  369. if (!gagajf.isNull(fromDate) || !gagajf.isNull(toDate)) {
  370. if (gagajf.isNull(fromDate) || gagajf.isNull(toDate)) {
  371. mcxDialog.alertC("공지기간 조회시 시작일자와 종료일자를 입력하세요.", {
  372. sureBtnText: "확인",
  373. sureBtnClick: function(){
  374. $('#searchForm input[name=stDate]').focus();
  375. }
  376. });
  377. return false;
  378. }
  379. if (fromDate > toDate) {
  380. mcxDialog.alertC("공지기간 시작일자는 종료일자 보다 클 수 없습니다.", {
  381. sureBtnText: "확인",
  382. sureBtnClick: function(){
  383. $('#goodsContentsForm input[name=stDate]').focus();
  384. }
  385. });
  386. return false;
  387. }
  388. }
  389. return true;
  390. }
  391. // 상품 목록 조회
  392. var fnGetContentsGoodsList = function(goodsContentsSq) {
  393. var actionUrl = '/goods/contents/goods/list/' + goodsContentsSq;
  394. gagaAgGrid.fetch(actionUrl, gridContentsGoodsOptions);
  395. }
  396. // 컨텐츠유형 변경시
  397. $('#goodsContentsForm select[name=goodsContentsType]').on('change', function() {
  398. var goodsContentsType = $(this).val();
  399. //동영상
  400. if ("G086_1" == goodsContentsType){
  401. $('#goodsContentsForm select[name=goodsContentsVideoGubun]').val('Y').trigger('click');
  402. /* $('#videoArea').show();
  403. $('#imgfileArea').hide(); */
  404. }else{
  405. $('#goodsContentsForm select[name=goodsContentsVideoGubun]').val('').trigger('click');
  406. /* $('#videoArea').hide();
  407. $('#videofileArea').hide();
  408. $('#imgfileArea').show(); */
  409. }
  410. });
  411. // 동영상구분 변경시
  412. $('#goodsContentsForm select[name=goodsContentsVideoGubun]').on('click', function() {
  413. fnSetContents();
  414. });
  415. var fnSetContents = function(){
  416. var goodsContentsVideoGubun = $('#goodsContentsForm select[name=goodsContentsVideoGubun]').val();
  417. if ("Y" == goodsContentsVideoGubun){
  418. $('#videoArea').show();
  419. $('#youtubeArea').show();
  420. $('#videofileArea').hide();
  421. $('#keyArea').hide();
  422. $('#imgfileArea').hide();
  423. $('#imglinkArea').hide();
  424. }else if ("M" == goodsContentsVideoGubun){
  425. $('#videoArea').show();
  426. $('#youtubeArea').hide();
  427. $('#videofileArea').show();
  428. $('#keyArea').show();
  429. $('#imgfileArea').hide();
  430. $('#imglinkArea').hide();
  431. }else{
  432. $('#youtubeArea').hide();
  433. $('#videofileArea').hide();
  434. $('#keyArea').hide();
  435. $('#videoArea').hide();
  436. $('#imgfileArea').show();
  437. $('#imglinkArea').show();
  438. }
  439. }
  440. // 동영상파일 선택 시
  441. $('#goodsContentsForm input[name=file]').on('change', function() {
  442. var file = this.files[0];
  443. gagaKollus.upload('GoodsDesc', file, $('input[name=kufKey]'));
  444. });
  445. // 이미지 첨부
  446. var fnFileUpload = function (obj){
  447. var file = obj.files[0];
  448. file.name = 'test';
  449. if (typeof(file) == 'undefined'){
  450. return;
  451. }
  452. gagajf.ajaxFileUpload('/common/file/upload?subDir=/goodscontents'
  453. , file
  454. , function(result) {
  455. $(obj).closest('div').find('input:hidden[name=imgPath]').val(result.oldFileName);
  456. $(obj).closest('div').find('input:hidden[name=newImgPath]').val(result.newFileName);
  457. $("#bannerPreViewUrl").attr('src', $("#uploadDefaultUrl").val()+"/goodscontents/"+result.newFileName);
  458. $("#imgView").removeClass("off").addClass("on");
  459. }
  460. );
  461. };
  462. //이미지 클릭시 미리보기
  463. $("#bannerPreViewUrl").click(function(){
  464. cfnOpenImagePreViewPopup('bannerPreimgView',$('#bannerPreViewUrl').attr('src'));
  465. });
  466. // 업체 조회 선택시
  467. $('#btnSearchSupplyComp').on('click', function() {
  468. cfnOpenCompanyListPopup('fnSetSupplyCompInfo', 'M');
  469. });
  470. // 업체 조회 팝업에서 호출
  471. var fnSetSupplyCompInfo = function(result) {
  472. var arrSupplyComp = [];
  473. var supplyCompText = "";
  474. var sIndex = 0;
  475. var supplyCompNm = "";
  476. $('#searchForm').find('#supplyCompText').html('');
  477. $('#searchForm input[name=supplyCompSearchTxt]').val('');
  478. result.forEach(function(supplyComp){
  479. sIndex++;
  480. arrSupplyComp.push(supplyComp.supplyCompCd);
  481. supplyCompNm = supplyComp.supplyCompNm;
  482. });
  483. // 조회값이 하나일 경우 화면에 코드 노출 그외는 갯수 처리
  484. if (sIndex == 1) {
  485. $('#searchForm input[name=supplyCompSearchTxt]').val(supplyCompNm);
  486. }else{
  487. supplyCompText = sIndex + " 개";
  488. $('#searchForm').find('#supplyCompText').html(supplyCompText);
  489. }
  490. var jsonData = JSON.stringify(arrSupplyComp);
  491. $("#searchForm input[name=supplyCompList]").val(jsonData);
  492. }
  493. // 브랜드 조회 팝업에서 호출
  494. var fnSetBrandInfo = function(result) {
  495. var arrbrandCd = [];
  496. var brandText = "";
  497. var bIndex = 0;
  498. var brandNm = "";
  499. $('#searchForm').find('#brandText').html('');
  500. $('#searchForm input[name=searchTxt]').val('');
  501. result.forEach(function(brand){
  502. bIndex++;
  503. arrbrandCd.push(brand.brandCd);
  504. brandNm = brand.brandKnm;
  505. });
  506. // 조회값이 하나일 경우 화면에 코드 노출 그외는 갯수 처리
  507. if (bIndex == 1) {
  508. $('#searchForm input[name=searchTxt]').val(brandNm);
  509. }else{
  510. brandText = bIndex + " 개";
  511. $('#searchForm').find('#brandText').html(brandText);
  512. }
  513. var jsonData = JSON.stringify(arrbrandCd);
  514. $("#searchForm input[name=brandList]").val(jsonData);
  515. }
  516. // 브랜드 조회 선택시
  517. $('#btnSearchBrand').on('click', function() {
  518. /* if (gagajf.isNull($("#searchForm input[name=searchTxt]").val())){
  519. mcxDialog.alert('브랜드 검색어를 입력하세요.');
  520. return false;
  521. } */
  522. cfnOpenBrandListPopup('fnSetBrandInfo', 'M');
  523. });
  524. //엑셀 상품 조회
  525. $('#btnSearchExcel').on('click', function() {
  526. cfnExcelUploadPopup('goodsContentsExcelUpload', 'goodsContentsExcelUpload');
  527. });
  528. var goodsContentsExcelUpload = function(result){
  529. var data = {procJob : result.procJob
  530. ,excelFileNm : result.excelFileNm
  531. };
  532. var jsonData = JSON.stringify(data);
  533. gagajf.ajaxJsonSubmit('/goods/search/excelupload/save', jsonData, fnGoodsContentsExcelUploadCallBack);
  534. }
  535. var fnGoodsContentsExcelUploadCallBack = function(result){
  536. gagajf.ajaxJsonSubmit('/goods/excel/upload/goods/list', '', fnExcelSearchCallBack);
  537. }
  538. // 상품 엑셀 조회 콜백함수
  539. var fnExcelSearchCallBack = function(result) {
  540. if (result.goodsExcelList.length < 1) return;
  541. var oldData = gagaAgGrid.getAllRowData(gridContentsGoodsOptions);
  542. $.each(result.goodsExcelList, function(idx, item) {
  543. var isInvalid = false;
  544. if (oldData != null && oldData.length != 0){
  545. oldData.forEach(function(oneData){
  546. if(oneData.goodsCd == item.goodsCd){
  547. isInvalid = true;
  548. return true;
  549. }
  550. });
  551. if(isInvalid){
  552. return isInvalid;
  553. }
  554. }
  555. gagaAgGrid.addRowData(gridContentsGoodsOptions, {"goodsCd" : item.goodsCd, "goodsNm" : item.goodsNm, "crud" : "C"});
  556. });
  557. return;
  558. };
  559. // 상품 조회 클릭 시
  560. $('#btnSearchGoods').on('click', function() {
  561. cfnOpenGoodsPopup('fnSearchCallBack');
  562. });
  563. // 상품 조회 콜백함수
  564. var fnSearchCallBack = function(result) {
  565. if (result.length < 1) return;
  566. var oldData = gagaAgGrid.getAllRowData(gridContentsGoodsOptions);
  567. $.each(result, function(idx, item) {
  568. var isInvalid = false;
  569. if (oldData != null && oldData.length != 0){
  570. oldData.forEach(function(oneData){
  571. if(oneData.goodsCd == item.goodsCd){
  572. isInvalid = true;
  573. return true;
  574. }
  575. });
  576. if(isInvalid){
  577. return isInvalid;
  578. }
  579. }
  580. gagaAgGrid.addRowData(gridContentsGoodsOptions, {"goodsCd" : item.goodsCd, "goodsNm" : item.goodsNm, "crud" : "C"});
  581. });
  582. uifnPopupClose('popupGoods');
  583. return;
  584. };
  585. // 상품 삭제
  586. $('#btnDeleteContentsGoods').on('click', function() {
  587. var selectedData = gridContentsGoodsOptions.api.getSelectedRows();
  588. if (selectedData.length == 0) {
  589. mcxDialog.alert('선택된 행이 없습니다.');
  590. return;
  591. }
  592. // 신규 상세 공지일경우 화면에서만 삭제
  593. if (gagajf.isNull($('#goodsContentsForm input[name=goodsContentsSq]').val())){
  594. var removedData = gagaAgGrid.removeRowData(gridContentsGoodsOptions, false);
  595. return;
  596. }
  597. mcxDialog.confirm('삭제하시겠습니까?', {
  598. cancelBtnText: "취소",
  599. sureBtnText: "확인",
  600. sureBtnClick: function(){
  601. var removedData = gagaAgGrid.removeRowData(gridContentsGoodsOptions, false);
  602. var arrGoodsCd = [];
  603. $.each(selectedData, function(idx, item) {
  604. arrGoodsCd.push(item.goodsCd);
  605. });
  606. var data = {arrGoodsCd : arrGoodsCd
  607. ,goodsContentsSq : $('#goodsContentsForm input[name=goodsContentsSq]').val()
  608. };
  609. var jsonData = JSON.stringify(data);
  610. gagajf.ajaxJsonSubmit('/goods/contents/goods/delete', jsonData);
  611. }
  612. });
  613. });
  614. // 신규 버튼 클릭
  615. $("#btnNew").on("click", function(){
  616. $('#goodsContentsForm')[0].reset();
  617. // 그리드 초기화
  618. gridContentsGoodsOptions.api.setRowData(null);
  619. $('#goodsContentsForm input[name=goodsContentsSq]').val('');
  620. $('#goodsContentsForm input[name=goodsContentsStdt]').val(_today);
  621. $('#goodsContentsForm input[name=goodsContentsEddt]').val(_today);
  622. $('#goodsContentsForm select[name=goodsContentsVideoGubun]').val('Y').trigger('click');
  623. $('#videoArea').show();
  624. $('#imgfileArea').hide();
  625. $('#imglinkArea').hide();
  626. $(".uFileLabel").text('');
  627. });
  628. // 저장
  629. $("#btnSave").on("click", function() {
  630. // 날짜 체크
  631. if (gagajf.isNull($('#goodsContentsForm input[name=goodsContentsStdt]').val())) {
  632. mcxDialog.alertC('노출 시작일자를 입력해 주세요.', {
  633. sureBtnText: "확인",
  634. sureBtnClick: function() {
  635. $('#goodsContentsForm input[name=goodsContentsStdt]').focus();
  636. }
  637. });
  638. return;
  639. }
  640. if (gagajf.isNull($('#goodsContentsForm input[name=goodsContentsEddt]').val())) {
  641. mcxDialog.alertC('노출 종료일자를 입력해 주세요.', {
  642. sureBtnText: "확인",
  643. sureBtnClick: function() {
  644. $('#goodsContentsForm input[name=goodsContentsEddt]').focus();
  645. }
  646. });
  647. return;
  648. }
  649. var stDate = $('#goodsContentsForm input[name=goodsContentsStdt]').val().toDate('YYYY-MM-DD');
  650. var edDate = $('#goodsContentsForm input[name=goodsContentsEddt]').val().toDate('YYYY-MM-DD');
  651. if (stDate > edDate) {
  652. mcxDialog.alert("노출 종료일자는 시작일자 보다 클 수 없습니다.");
  653. return;
  654. }
  655. // validation
  656. /* if (!gagajf.validation('#goodsContentsForm'))
  657. return false; */
  658. if (gagajf.isNull($('#goodsContentsForm input[name=goodsContentsTitle]').val())) {
  659. mcxDialog.alertC('제목을 입력해 주세요.', {
  660. sureBtnText: "확인",
  661. sureBtnClick: function() {
  662. $('#goodsContentsForm input[name=goodsContentsTitle]').focus();
  663. }
  664. });
  665. return;
  666. }
  667. // 이미지 첨부확인
  668. if ("G086_2" == $('#goodsContentsForm select[name=goodsContentsType]').val() ){
  669. var orgFileNm = $('#goodsContentsForm input[name=imgPath]').val()
  670. var imgFileNm = $('#goodsContentsForm input[name=newImgPath]').val();
  671. if(gagajf.isNull(orgFileNm)){
  672. if(gagajf.isNull(imgFileNm)){
  673. mcxDialog.alert('이미지파일을 선택해 주세요.');
  674. return false;
  675. }
  676. }
  677. if(gagajf.isNull($('#goodsContentsForm input[name=linkUrl]').val())){
  678. mcxDialog.alert('링크 경로를 확인해 주세요. 없을시 #으로 입력해 주세요.');
  679. return false;
  680. }
  681. }else{
  682. if ("Y" == $('#goodsContentsForm select[name=goodsContentsVideoGubun]').val() ){
  683. if (gagajf.isNull($('#goodsContentsForm input[name=kmcKey]').val())){
  684. mcxDialog.alert('동영상 정보를 확인해 주세요.');
  685. return false;
  686. }
  687. if($('#goodsContentsForm input[name=kmcKey]').val().indexOf("http")>-1){
  688. mcxDialog.alert('동영상 정보를 확인해 주세요.');
  689. return;
  690. }
  691. }else{
  692. if (gagajf.isNull($('#goodsContentsForm input[name=kufKey]').val())){
  693. mcxDialog.alert('동영상 정보를 확인해 주세요.');
  694. return false;
  695. }
  696. }
  697. }
  698. $('#goodsContentsForm input[name=useYn]').val($('#goodsContentsForm input:checkbox[name=chkUseYn]').is(":checked") ? 'Y' : 'N');
  699. mcxDialog.confirm('저장하시겠습니까?', {
  700. cancelBtnText: "취소",
  701. sureBtnText: "확인",
  702. sureBtnClick: function(){
  703. var imgPath = $('#goodsContentsForm input[name=imgPath]').val();
  704. var newImgPath = $('#goodsContentsForm input[name=newImgPath]').val();
  705. var linkUrl = $('#goodsContentsForm input[name=linkUrl]').val();
  706. var linkTarget = $('#goodsContentsForm input[name=linkTarget]:checked').val();
  707. var kmcKey = $('#goodsContentsForm input[name=kmcKey]').val();
  708. var kufKey = $('#goodsContentsForm input[name=kufKey]').val();
  709. if ("G086_1" == $('#goodsContentsForm select[name=goodsContentsType]').val()){
  710. imgPath = "";
  711. newImgPath = "";
  712. linkUrl = "";
  713. linkTarget = "";
  714. }else{
  715. kmcKey = "";
  716. kufKey = "";
  717. }
  718. //var goodsAllData = gagaAgGrid.getAllRowData(gridContentsGoodsOptions);
  719. var goodsAllData = gagaAgGrid.getChangedData(gridContentsGoodsOptions);
  720. var jsonGoodsData = JSON.stringify(goodsAllData);
  721. $('#goodsContentsForm input[name=goodsList]').val(jsonGoodsData);
  722. var data = {
  723. goodsContentsSq : $('#goodsContentsForm input[name=goodsContentsSq]').val()
  724. ,goodsContentsType : $('#goodsContentsForm select[name=goodsContentsType]').val()
  725. ,goodsContentsTitle : $('#goodsContentsForm input[name=goodsContentsTitle]').val()
  726. ,goodsContentsStdt : $('#goodsContentsForm input[name=goodsContentsStdt]').val()
  727. ,goodsContentsEddt : $('#goodsContentsForm input[name=goodsContentsEddt]').val()
  728. ,goodsContentsVideoGubun : $('#goodsContentsForm select[name=goodsContentsVideoGubun]').val()
  729. ,useYn : $('#goodsContentsForm input[name=useYn]').val()
  730. ,imgPath : imgPath
  731. ,newImgPath : newImgPath
  732. ,linkUrl : linkUrl
  733. ,linkTarget : linkTarget
  734. ,kmcKey : kmcKey
  735. ,kufKey : kufKey
  736. ,goodsList : $('#goodsContentsForm input[name=goodsList]').val()
  737. };
  738. var jsonData = JSON.stringify(data);
  739. gagajf.ajaxJsonSubmit($('#goodsContentsForm').prop('action'), jsonData, function() {
  740. $('#btnSearch').trigger('click');
  741. $("#btnNew").trigger('click');
  742. //fnGetContentsGoodsList($('#goodsContentsForm input[name=goodsContentsSq]').val());
  743. });
  744. }
  745. });
  746. });
  747. var fnUnEscapeHtml = function(){ //XSS 변환
  748. $('#goodsContentsForm input[name=goodsContentsTitle]').val($('#goodsContentsForm input[name=goodsContentsTitle]').val().replaceXSS());
  749. $('#goodsContentsForm input[name=kmcKey]').val($('#goodsContentsForm input[name=kmcKey]').val().replaceXSS());
  750. }
  751. $(document).ready(function() {
  752. cfnCreateCalendar('#sellTerms', 'stDate', 'edDate', true, '공지일', 'X');
  753. // Create a agGrid
  754. gagaAgGrid.createGrid('gridContentsList', gridContentsOptions);
  755. gagaAgGrid.createGrid('gridContentsGoodsList', gridContentsGoodsOptions);
  756. });
  757. /*]]>*/
  758. </script>
  759. </html>