OneToOneQnaFormMob.html 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496
  1. <!DOCTYPE html>
  2. <html lang="ko"
  3. xmlns:th="http://www.thymeleaf.org"
  4. xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
  5. layout:decorator="mob/common/layout/CallcenterLayoutMob">
  6. <!--
  7. *******************************************************************************
  8. * @source : OneToOneQnaFormWeb.html
  9. * @desc : 1:1문의 Page
  10. *============================================================================
  11. * STYLE24
  12. * Copyright(C) 2020 TSIT, All rights reserved.
  13. *============================================================================
  14. * VER DATE AUTHOR DESCRIPTION
  15. * === =========== ========== =============================================
  16. * 1.0 2021.02.19 gagamel 최초 작성
  17. *******************************************************************************
  18. -->
  19. <body>
  20. <th:block layout:fragment="content">
  21. <main role="" id="" class="container cs">
  22. <!-- 고객센터 Gnb -->
  23. <nav class="pnb" id="callcenterGnb">
  24. </nav>
  25. <!-- //고객센터 Gnb -->
  26. <!-- ★ 컨텐츠 시작 -->
  27. <section class="content cs_contactUs_1">
  28. <div class="inner sr-only"><h2 class="title">1:1문의</h2></div>
  29. <div class="inner wide">
  30. <!-- 게시판info -->
  31. <ul class="inquiry_box">
  32. <li>
  33. <p th:text="${qnaCountInfo.totCnt}" id="qnaTotCnt">999</p>
  34. <p>총 문의</p>
  35. </li>
  36. <li>
  37. <p th:text="${qnaCountInfo.ansCnt}" id="qnaAnsCnt">456</p>
  38. <p>답변완료</p>
  39. </li>
  40. <li>
  41. <p th:text="${qnaCountInfo.ingCnt}" id="qnaIngCnt">690</p>
  42. <p>처리 중</p>
  43. </li>
  44. </ul>
  45. <!-- //게시판info -->
  46. </div>
  47. <div class="inner wide">
  48. <!-- 폴딩리스트2 -->
  49. <div class="ui_row" id="divQna"> <!-- 데이터 없을시 클래스 nodata 추가 -->
  50. <div class="foldGroup case2">
  51. <!-- list2 -->
  52. <ul id="ulQna">
  53. </ul>
  54. <!-- //list2 -->
  55. </div>
  56. </div>
  57. <div class="ui_foot">
  58. <button class="btn btnM btnIcon_more" id="btnQnaMore">더보기</button>
  59. </div>
  60. </div>
  61. </section>
  62. <!-- ★ 컨텐츠 종료 -->
  63. <div class="cs_contactUs_my_footer">
  64. <a href="#none;" class="questionMy"><p>1:1문의</p></a>
  65. </div>
  66. </main>
  67. <!-- 모달영역 -->
  68. <div>
  69. <!-- 문의이미지슬라이드 -->
  70. <div class="modal pop_full fade" id="thumb_pic" tabindex="-1" role="dialog" aria-labelledby="exampleFullLabel" aria-hidden="true" style="display: none;">
  71. <div class="modal-dialog" role="document">
  72. <div class="modal-content">
  73. <div class="modal-header">
  74. <h5 class="modal-title sr-only">문의이미지슬라이드</h5>
  75. </div>
  76. <div class="modal-body">
  77. <div class="pop_cont">
  78. <!-- Swiper -->
  79. <div class="swiper-container cs_pop">
  80. <div class="swiper-wrapper" id="qnaImg">
  81. <div class="swiper-slide"><div class="pop_img" style="background-image: url(/images/mo/cs_pop_people.png);"></div></div>
  82. <div class="swiper-slide"><div class="pop_img" style="background-image: url(/images/mo/cs_pop_people2.png);"></div></div>
  83. </div>
  84. <!-- Add Pagination -->
  85. <div class="swiper-pagination"></div>
  86. </div>
  87. </div>
  88. </div>
  89. </div>
  90. </div>
  91. </div>
  92. <!-- //문의이미지슬라이드 -->
  93. <!-- 문의등록 -->
  94. <div class="modal pop_full fade" id="myQuestion" tabindex="-1" role="dialog" aria-labelledby="exampleFullLabel" aria-hidden="true">
  95. <div class="modal-dialog" role="document">
  96. <div class="modal-content">
  97. <div class="modal-header">
  98. <h5 class="modal-title">1:1문의</h5>
  99. </div>
  100. <div class="modal-body">
  101. <div class="pop_cont">
  102. <div class="content cs_contactUs_my">
  103. <form class="form_wrap" role="form" name="qnaRegisterForm" id="qnaRegisterForm" th:action="@{'/callcenter/onetoone/qna/create'}" method="post" onsubmit="$('#qnaRegisterForm').trigger('click'); return false;">
  104. <div class="form_field">
  105. <div class="ui_col_12 form_full">
  106. <div class="input_wrap">
  107. <div class="select">
  108. <select class="select_hidden" name="counselClsf" required="required" data-valid-name="문의유형">
  109. <option value="">문의 유형을 선택해 주세요 (필수)</option>
  110. <option th:if="${counselClsfList}" th:each="oneData, status : ${counselClsfList}" th:value="${oneData.cd}" th:text="${oneData.cdNm}"></option>
  111. </select>
  112. <!-- <div class="select_dress">문의 유형을 선택해 주세요 (필수)<span></span></div> -->
  113. <ul class="select_options">
  114. <li rel="">문의 유형을 선택해 주세요 (필수)</li>
  115. <li th:if="${counselClsfList}" th:each="oneData, status : ${counselClsfList}" th:rel="${oneData.cd}" th:text="${oneData.cdNm}"></li>
  116. </ul>
  117. </div>
  118. </div>
  119. </div>
  120. </div>
  121. <div class="form_field">
  122. <div class="ui_col_12 form_full">
  123. <div class="input_wrap test">
  124. <span class="input_group_addon"><span class="ico"></span></span>
  125. <input type="text" class="form_control" placeholder="제목을 입력해 주세요 (필수)" maxlength="30" name="questTitle" required="required" data-valid-name="제목"/>
  126. </div>
  127. <!-- 숫자, 특수문자, 불완성형 한글 제외하여 입력 -->
  128. </div>
  129. </div>
  130. <div class="form_field">
  131. <div class="ui_col_12 form_full">
  132. <div class="input_wrap">
  133. <textarea class="doc_contactus" name="questContent" cols="30" rows="10" style="resize: none;" placeholder="내용을 입력해 주세요. (필수)" required="required" data-valid-name="내용"></textarea>
  134. <p class="txt_cnt">
  135. <span id="contactus_cnt" class="contactus_cnt"><em class="c_primary">0</em>/500</span>
  136. </p>
  137. </div>
  138. <!-- 특수문자 : \ / : < > 사용 불가 > 입력 시, “특수문자 \ / : < > 는 사용할 수 없습니다.” 얼럿 호출 스크립트 입력 불가능 -->
  139. </div>
  140. </div>
  141. <div class="form_field">
  142. <div class="ui_col_12 form_full">
  143. <div class="input_wrap">
  144. <!-- 이미지첨부 -->
  145. <div class="form_field">
  146. <div class="imgUpload">
  147. <label for="fileAdd" class="fileAdd">업로드</label>
  148. <input type="file" id="fileAdd" name="file1">
  149. <input type="hidden" name="file1OrgFileNm"/>
  150. <input type="hidden" name="file1SysFileNm"/>
  151. </div>
  152. <div class="imgUpload">
  153. <label for="fileAdds" class="fileAdd">업로드</label>
  154. <input type="file" id="fileAdds" name="file2">
  155. <input type="hidden" name="file2OrgFileNm"/>
  156. <input type="hidden" name="file2SysFileNm"/>
  157. </div>
  158. </div>
  159. <!-- //이미지첨부 -->
  160. <div class="info_addfile">
  161. <ul>
  162. <li>사진은 이미지당 10MB 이하의 JPEG, JPG, PNG 파일 2장까지 첨부 가능합니다.</li>
  163. <li>파일명에 한글은 사용 불가입니다.</li>
  164. <li>첨부된 사진은 문의 외의 목적으로는 사용되지 않습니다.</li>
  165. </ul>
  166. </div>
  167. </div>
  168. </div>
  169. </div>
  170. <div class="form_field">
  171. <div class="form_field">
  172. <div class="ui_col_12 cellphone">
  173. <div class="input_wrap">
  174. <span class="tt">알림톡 수신 여부</span>
  175. <!-- 알림 신청 체크박스(선택 _ 기본값) -->
  176. <div>
  177. <div class="ck_box">
  178. <input type="radio" name="smsReqYn" id="smsReqYn1" value="Y" checked="checked"/>
  179. <label for="smsReqYn1"><span>수신</span></label>
  180. </div>
  181. <div class="ck_box">
  182. <input type="radio" name="smsReqYn" id="smsReqYn2" value="N">
  183. <label for="smsReqYn2"><span>미수신</span></label>
  184. </div>
  185. </div>
  186. </div>
  187. </div>
  188. </div>
  189. </div>
  190. </form>
  191. </div>
  192. </div>
  193. </div>
  194. </div>
  195. <div class="cs_contactUs_my_footer">
  196. <a href="#none" class="myQuestion" id="btnSaveQna"><p>등록</p></a>
  197. </div>
  198. </div>
  199. </div>
  200. <!-- //문의등록 -->
  201. </div>
  202. <!-- //모달끝 -->
  203. <form id="qnaForm" name="qnaForm" action="#" th:action="@{'/callcenter/onetoone/qna/list'}">
  204. <input type="hidden" name="pageNo" value ="1"/>
  205. <input type="hidden" name="pageSize" value ="10"/>
  206. </form>
  207. <script th:inline="javascript">
  208. /*<![CDATA[*/
  209. // JQUERY를 이용한 버튼 모달 팝업
  210. $(document).on('click', '.thumb_pic', function() {
  211. let oImg = $(this).parent('.img_group').find('.thumb_pic');
  212. $('#qnaImg').html('');
  213. for (let i = 0; i < oImg.length; i++) {
  214. $('#qnaImg').append('<div class="swiper-slide"><div class="pop_img"><img src="' + oImg.find('img').eq(i).attr("src") + '"/></div></div>');
  215. }
  216. $("#thumb_pic").modal("show");
  217. // 슬라이더_팝업에 이미지슬라이드
  218. var swiper = new Swiper('#thumb_pic .swiper-container.cs_pop', {
  219. observer: true,
  220. observeParents: true,
  221. pagination: {
  222. el: '#thumb_pic .swiper-pagination',
  223. }
  224. });
  225. });
  226. $(document).ready(function() {
  227. $('select').each(function() {
  228. var $this = $(this), numberOfOptions = $(this).children('option').length;
  229. $this.addClass('select_hidden');
  230. $this.wrap('<div class="select"></div>');
  231. $this.after('<div class="select_dress"></div>');
  232. var $dressSelect = $this.next('div.select_dress');
  233. $dressSelect.text($this.children('option').eq(0).text());
  234. var $selList = $('<ul />', {
  235. 'class': 'select_options'
  236. }).insertAfter($dressSelect);
  237. for (var i = 0; i < numberOfOptions; i++) {
  238. $('<li />', {
  239. text: $this.children('option').eq(i).text(),
  240. rel: $this.children('option').eq(i).val(),
  241. class: $this.children('option').eq(i).attr('disabled')
  242. }).appendTo($selList);
  243. }
  244. var $selListItems = $selList.children('li');
  245. $dressSelect.click(function(e) {
  246. e.stopPropagation();
  247. $('div.select_dress.active').not(this).each(function(){
  248. $(this).removeClass('active').next('ul.select_options').hide();
  249. });
  250. $(this).toggleClass('active').next('ul.select_options').toggle();
  251. });
  252. $selListItems.click(function(e) {
  253. e.stopPropagation();
  254. if($(this).hasClass('disabled')){
  255. $this.val($(this).attr('rel',false));
  256. } else {
  257. $dressSelect.text($(this).text()).removeClass('active');
  258. $this.val($(this).attr('rel'));
  259. $selList.hide();
  260. }
  261. });
  262. $(document).click(function() {
  263. $dressSelect.removeClass('active');
  264. $selList.hide();
  265. });
  266. });
  267. // 타이틀명
  268. $('#htopTitle').text('고객센터');
  269. // 고객센터 GNB 설정
  270. fnSetCallcenterGnb(2);
  271. $('#btnQnaMore').trigger('click');
  272. });
  273. // 더보기
  274. $('#btnQnaMore').on('click', function() {
  275. gagajf.ajaxFormSubmit($('#qnaForm').prop('action'), '#qnaForm', fnGetListCallback);
  276. });
  277. // QNA 콜백함수
  278. var fnGetListCallback = function(result) {
  279. // 목록
  280. if (result.dataList != null && result.dataList.length > 0) {
  281. $.each(result.dataList, function(idx, item) {
  282. let tag = '<li>\n';
  283. tag += ' <div class="fold_head">\n';
  284. tag += ' <a href="javascript:void(0)">\n';
  285. tag += ' <div>\n';
  286. tag += ' <div class="fold_tit">\n';
  287. tag += ' <div class="lap1">\n';
  288. tag += ' <span class="fold_state ' + (item.ansStat == "G060_10" ? "doing" : "done") + '">' + item.ansStatNm + '</span>\n'; //답변완료 : done / 처리중 : doing
  289. tag += ' <span class="prod">' + item.counselClsfNm + '</span>\n';
  290. tag += ' </div>\n';
  291. tag += ' <div class="lap2"><span>' + item.questTitle + '</span></div>\n';
  292. tag += ' </div>\n';
  293. tag += ' <span class="data">' + item.questDt + '</span>\n';
  294. tag += ' </div>\n';
  295. tag += ' </a>\n';
  296. tag += ' </div>\n';
  297. tag += ' <div class="fold_cont">\n';
  298. tag += ' <div class="fold_detail">\n';
  299. tag += ' <div><p>' + item.questContent.escapeHtml() + '</p></div>\n';
  300. if (!gagajf.isNull(item.sysFileNm1) || !gagajf.isNull(item.sysFileNm2)) {
  301. tag += ' <p class="img_group">\n';
  302. if (!gagajf.isNull(item.sysFileNm1)) {
  303. tag += ' <span class="thumb_pic">\n';
  304. // tag += ' <img src="' + _uploadImageUrl + '/counsel/' + item.sysFileNm1 + '" alt="" onerror="this.src=\'/image/bg_profile.png\'">\n';
  305. tag += ' <img src="' + _uploadImageUrl + '/counsel/' + item.sysFileNm1 + '" alt="">\n';
  306. tag += ' </span>\n';
  307. }
  308. if (!gagajf.isNull(item.sysFileNm2)) {
  309. tag += ' <span class="thumb_pic">\n';
  310. // tag += ' <img src="' + _uploadImageUrl + '/counsel/' + item.sysFileNm2 + '" alt="" onerror="this.src=\'/image/bg_profile.png\'">\n';
  311. tag += ' <img src="' + _uploadImageUrl + '/counsel/' + item.sysFileNm2 + '" alt="">\n';
  312. tag += ' </span>\n';
  313. }
  314. tag += ' </p>\n';
  315. }
  316. tag += ' </div>\n';
  317. if (item.ansStat == 'G060_20') { // 답변완료 상태일 때
  318. tag += ' <div class="fold_answer">\n';
  319. tag += ' <div>\n';
  320. tag += ' <div class="answer_body">' + item.ansContent + '</div>\n';
  321. tag += ' <div class="answer_foot">\n';
  322. tag += ' <span class="data">' + item.ansDt + '</span>\n';
  323. if (item.ansStat == 'G060_20') { // 답변완료일 때
  324. tag += ' <button type="button" class="btn_delete" onclick="fnDeleteQna(' + item.counselSq + ');"><span>삭제</span></button>\n';
  325. }
  326. tag += ' </div>\n';
  327. tag += ' </div>\n';
  328. tag += ' </div>\n';
  329. }
  330. tag += ' </div>\n';
  331. tag += '</li>\n';
  332. $('#ulQna').append(tag);
  333. });
  334. $('#divQna').removeClass('nodata');
  335. } else {
  336. // let tag = '<li>내역이 없습니다.</li>\n';
  337. // $('#ulQna').append(tag);
  338. $('#divQna').addClass('nodata');
  339. }
  340. if (result.paging.pageable.totalPage > result.paging.pageable.pageNo) {
  341. $('#btnQnaMore').parent().show();
  342. $('#qnaForm input[name=pageNo]').val(result.paging.pageable.pageNo + 1);
  343. } else {
  344. $('#btnQnaMore').parent().hide();
  345. }
  346. }
  347. // 삭제
  348. let fnDeleteQna = function(counselSq) {
  349. mcxDialog.confirm("등록된 내용을 삭제하시겠습니까?", {
  350. cancelBtnText: "취소",
  351. sureBtnText: "확인",
  352. sureBtnClick: function() {
  353. let params = new Object();
  354. params.counselSq = counselSq;
  355. var jsonData = JSON.stringify(params);
  356. gagajf.ajaxJsonSubmit('/callcenter/onetoone/qna/delete'
  357. , jsonData
  358. , function() {
  359. $('#qnaForm input[name=pageNo]').val(1);
  360. $('#ulQna').html('');
  361. $('#btnQnaMore').trigger('click');
  362. $.get('/callcenter/onetoone/qna/count/info'
  363. , function(result) {
  364. $('#qnaTotCnt').html(result.totCnt);
  365. $('#qnaAnsCnt').html(result.ansCnt);
  366. $('#qnaIngCnt').html(result.ingCnt);
  367. }
  368. );
  369. });
  370. }
  371. });
  372. }
  373. // JQUERY를 이용한 버튼 모달 팝업
  374. $(".questionMy").click(function() {
  375. $("#myQuestion").modal("show");
  376. });
  377. // text_area
  378. $('.doc_contactus').keyup(function (e) {
  379. var content = $(this).val();
  380. $('#contactus_cnt').html("(<em class='c_primary'>" + content.length + "</em>/500자)");
  381. if (content.length > 500) {
  382. alert("최대 500자까지 입력 가능합니다.");
  383. $(this).val(content.substring(0, 500));
  384. $('#contactus_cnt').html("(<em class='c_primary'>500</em>/500자)");
  385. }
  386. });
  387. // 파일첨부 선택 시
  388. $('#fileAdd').on('change', function() { fnChooseFile(this); });
  389. $('#fileAdds').on('change', function() { fnChooseFile(this); });
  390. var fnChooseFile = function(obj) {
  391. // multiple 속성이 있으면 files에는 다수의 객체가 할당됨
  392. var file = obj.files[0];
  393. if (!gagajf.isNull(file.name)) {
  394. var extension = "\.(jpg|jpeg|png)$";
  395. if (!(new RegExp(extension, "i")).test(file.name)) {
  396. mcxDialog.alertC('이미지는 [jpg, jpeg, png] 파일만 가능합니다.', {
  397. sureBtnText: "확인",
  398. sureBtnClick: function() {
  399. $(obj).parent('.imgUpload').find('.removes').trigger('click');
  400. }
  401. });
  402. return false;
  403. }
  404. }
  405. if (!gagajf.isNull(file.size) && Number(file.size) > 20 * 1000000) {
  406. mcxDialog.alertC('이미지는 최대 20MB 이하 파일만 가능합니다.', {
  407. sureBtnText: "확인",
  408. sureBtnClick: function() {
  409. $(obj).parent('.imgUpload').find('.removes').trigger('click');
  410. }
  411. });
  412. return false;
  413. }
  414. // 파일 업로드
  415. gagajf.ajaxFileUpload('/common/file/upload?subDir=/counsel'
  416. , file
  417. , function(result) {
  418. // 업로드한 파일명 설정
  419. $('input[name=' + obj.name + 'OrgFileNm]').val(result.oldFileName);
  420. $('input[name=' + obj.name + 'SysFileNm]').val(result.newFileName);
  421. }
  422. );
  423. }
  424. // 저장
  425. $('#btnSaveQna').on('click', function() {
  426. // 입력 값 체크
  427. if (!gagajf.validation('#qnaRegisterForm'))
  428. return false;
  429. mcxDialog.confirm("저장하시겠습니까?", {
  430. cancelBtnText: "취소",
  431. sureBtnText: "확인",
  432. sureBtnClick: function() {
  433. gagajf.ajaxFormSubmit($('#qnaRegisterForm').prop('action')
  434. , '#qnaRegisterForm'
  435. , function() {
  436. cfnGoToPage(_PAGE_ONETOONE_QNA);
  437. }
  438. );
  439. }
  440. });
  441. });
  442. /*]]>*/
  443. </script>
  444. </th:block>
  445. </body>
  446. </html>