Index: arms/detail.html =================================================================== diff -u -r34beb59d7a21ed444998f2d974072c7fae9973da -ra0d04c144b89cb5b9b45506b4ab322baed0c7f24 --- arms/detail.html (.../detail.html) (revision 34beb59d7a21ed444998f2d974072c7fae9973da) +++ arms/detail.html (.../detail.html) (revision a0d04c144b89cb5b9b45506b4ab322baed0c7f24) @@ -162,10 +162,6 @@ - - - - @@ -184,7 +180,6 @@ @@ -839,7 +833,7 @@
-
Index: arms/js/detail.js =================================================================== diff -u -rbd47d827ffe7da32f6b81b8462e748b7fd34f72b -ra0d04c144b89cb5b9b45506b4ab322baed0c7f24 --- arms/js/detail.js (.../detail.js) (revision bd47d827ffe7da32f6b81b8462e748b7fd34f72b) +++ arms/js/detail.js (.../detail.js) (revision a0d04c144b89cb5b9b45506b4ab322baed0c7f24) @@ -1,5 +1,5 @@ //////////////////////////////////////////////////////////////////////////////////////// -//Document Ready +// 요구사항 상세보기 페이지 Document Ready //////////////////////////////////////////////////////////////////////////////////////// var selectedJsTreeId; // 요구사항 아이디 var calledAPIs = {}; @@ -78,14 +78,14 @@ "../reference/jquery-plugins/jstree-v.pre1.0/jquery.jstree.js" ], - [ + /*[ // Template CSS File "../reference/jquery-plugins/MyResume/assets/vendor/boxicons/css/boxicons.css", "../reference/jquery-plugins/MyResume/assets/vendor/glightbox/css/glightbox.min.css", "../reference/jquery-plugins/MyResume/assets/vendor/swiper/swiper-bundle.min.css", // Template Main CSS File "../reference/jquery-plugins/MyResume/assets/css/style.css" - ], + ],*/ // 추가적인 플러그인 그룹들을 이곳에 추가하면 됩니다. [ // Chart @@ -102,10 +102,11 @@ loadPluginGroupsParallelAndSequential(pluginGroups) .then(function () { + // 스크롤 반응하여 API 호출 이벤트 window.addEventListener('scroll', scrollApiFunc); - // 계정 정보 + // 계정 정보 바인딩 bindAccountInfo(); // 메뉴 클릭 이벤트 @@ -136,65 +137,19 @@ // QnA 채팅 게시판 탭 클릭 이벤트 reqCommentListViewTabClick(); + // QnA 글 저장 req_comment_save_btn_click(); + // QnA 글 작성 시 확장 req_comment_message_size_change(); - - $('#comment-contents').on('input', function () { - this.style.height = 'auto'; - this.style.height = (this.scrollHeight) + 'px'; - }); - }) .catch(function (errorMessage) { console.error(errorMessage); console.error("플러그인 로드 중 오류 발생"); }); } -//////////////////////////////////////////////////////////////////////////////////////// -// 플러그인 로드 모듈 ( 병렬 시퀀스 ) -//////////////////////////////////////////////////////////////////////////////////////// - -/*function loadPlugin(url) { - return new Promise(function(resolve, reject) { - - if( isJavaScriptFile(url) ){ - $(".spinner").html(" " + getFileNameFromURL(url) + " 자바스크립트를 다운로드 중입니다..."); - $.ajax({ - url: url, - dataType: "script", - cache: true, - success: function() { - // The request was successful - - console.log( "[ common :: loadPlugin ] :: url = " + url + ' 자바 스크립트 플러그인 로드 성공'); - resolve(); // Promise를 성공 상태로 변경 - }, - error: function() { - // The request failed - console.error( "[ common :: loadPlugin ] :: url = " + url + ' 플러그인 로드 실패'); - reject(); // Promise를 실패 상태로 변경 - } - }); - } else { - $(".spinner").html(" " + getFileNameFromURL(url) + " 스타일시트를 다운로드 중입니다..."); - $("", { - rel: "stylesheet", - type: "text/css", - href: url - }).appendTo("head"); - console.log( "[ common :: loadPlugin ] :: url = " + url + ' 스타일시트 플러그인 로드 성공'); - resolve(); - } - }); -}*/ - -//////////////////////////////////////////////////////////////////////////////////////// -// 요구사항 상세보기 페이지 -//////////////////////////////////////////////////////////////////////////////////////// - -// ------------------ api 호출 여부 확인하기 ------------------ // +// ------------------ api 호출 여부 확인(여러번 발생시키지 않기 위하여) ------------------ // function callAPI(apiName) { if (calledAPIs[apiName]) { console.log("This API has already been called: " + apiName); @@ -204,8 +159,22 @@ return false; } -// ------------------ 스크롤 api 호출하기 ------------------ // +// ------------------ 잘린 텍스트 전체 확인 ------------------ // +function getFullTextFromTruncated(){ + var elements = document.querySelectorAll(".text-truncate, .text-truncate *"); + elements.forEach(element => { + element.addEventListener("mouseenter", () => { + element.classList.add("show-full"); + element.style.cursor = "help"; + }); + element.addEventListener("mouseleave", () => { + element.classList.remove("show-full"); + element.style.cursor = "default"; + }); + }); +} +// ------------------ 스크롤 api 호출하기 ------------------ // function checkVisible( element, check = 'visible' ) { const viewportHeight = $(window).height(); // Viewport Height const scrolltop = $(window).scrollTop(); // Scroll Top @@ -263,9 +232,9 @@ break; } } -}; +} -// ------------------ 계정 정보 ------------------ // +// ------------------ 계정 정보 바인딩 ------------------ // function bindAccountInfo() { $("#user-name").html(userName + ""); $("#user-name-detail").html(fullName + ' (' + userName + ')'); @@ -312,26 +281,14 @@ calledAPIs["statsAPI"] = true; } + // ------------------ 상세보기 ------------------ // function reqDetailViewTabClick() { $("#get_version_list").click(function () { getDetailViewTab(); }); } -// ------------------ 잘린 텍스트 전체 확인 ------------------ // -function getFullTextFromTruncated(){ - var elements = document.querySelectorAll(".text-truncate, .text-truncate *"); - elements.forEach(element => { - element.addEventListener("mouseenter", () => { - element.classList.add("show-full"); - element.style.cursor = "help"; - }); - element.addEventListener("mouseleave", () => { - element.classList.remove("show-full"); - element.style.cursor = "default"; - }); - }); -} + function getDetailViewTab() { if (callAPI("detailAPI")) { @@ -575,8 +532,6 @@ // common.js에 정의되어있는 함수 detailTreeBuild(jQueryElementID, serviceNameForURL); calledAPIs["allReqListAPI"] = true; - - } function detailTreeBuild(jQueryElementID, serviceNameForURL) { @@ -692,22 +647,19 @@ selectedJsTreeId = selectedNode.attr("id").replace("node_", "").replace("copy_", "");//요구사항 아이디 selectedJsTreeName = $("#req_tree").jstree("get_selected").text(); + console.log(selectedJsTreeName); if (selectedJsTreeId == 2) { $("#select_Req").text("루트 요구사항이 선택되었습니다."); } else { $("#select_Req").text($("#req_tree").jstree("get_selected").text()); } + var selectRel = selectedNode.attr("rel"); //요구사항 타입에 따라서 탭의 설정을 변경 (삭제예정) if (selectRel == "folder" || selectRel == "drive") { - /*$("#folder_tab").get(0).click(); - $(".newReqDiv").show(); - $(".widget-tabs").children("header").children("ul").children("li:nth-child(1)").show(); //상세보기 - $(".widget-tabs").children("header").children("ul").children("li:nth-child(3)").show(); //리스트보기 - $(".widget-tabs").children("header").children("ul").children("li:nth-child(4)").show(); //문서로보기 - */ + // 리스트로 보기(DataTable) 설정 ( 폴더나 루트니까 ) // 상세보기 탭 셋팅이 데이터테이블 렌더링 이후 시퀀스 호출 함. // 박현민 - 폴더 일 때 이부분 어떻게 바뀌는지 확인하고 어떻게 바꿀지 고민해야함 @@ -778,7 +730,6 @@ //console.table(ajaxData); var version_id_list = JSON.parse(ajaxData.c_req_pdservice_versionset_link); - var version_title_list = []; if (isEmpty(version_id_list)) { $("#allreq_pdservice_version").text("요구사항에 등록된 버전이 없습니다."); @@ -888,54 +839,66 @@ console.log(result.files); calledAPIs["fileAPI"] = true; - /* 데이터가 없을 때 처리 */ - if (result.files.length === 0) { - let $container = $('#files-container'); + bindFileList(result); - var $noDataHtml = $(`

+ jSuccess("파일 조회가 완료 되었습니다."); + }); +} + +function bindFileList(result) { + if (result.files.length === 0) { + noFileMessage(); + return; + } + + let $portfolioContainer = $('.portfolio-container'); + if ($portfolioContainer.length) { + createFileList($portfolioContainer, result); + } +} + +function noFileMessage() { + let $container = $('#files-container'); + + var $noDataHtml = $(`


등록된 파일이 없습니다.

`); - $container.append($noDataHtml); - return; - } + $container.append($noDataHtml); +} - let $portfolioContainer = $('.portfolio-container'); - if ($portfolioContainer.length) { - let portfolioIsotope = new Isotope($portfolioContainer[0], { - itemSelector: '.portfolio-item' - }); +function createFileList($portfolioContainer, result) { - for (var key in result) { - if (result.hasOwnProperty(key)) { - var fileSet = result[key]; + let portfolioIsotope = new Isotope($portfolioContainer[0], { + itemSelector: '.portfolio-item' + }); - // 각 파일 정보(fileSet)을 처리 - fileSet.forEach(function (file) { - console.log(file.fileName); - var filterClass; - if (file.contentType.includes("image")) { - filterClass = 'filter-image'; - } else if (file.contentType.includes("text")) { - filterClass = 'filter-doc'; - } else if (file.contentType.includes("application")) { - filterClass = 'filter-doc'; - } else { - filterClass = 'filter-etc'; - } + for (var key in result) { + if (result.hasOwnProperty(key)) { + var fileSet = result[key]; - var imgSrc = iconsMap[file.contentType] || prefix + 'Default.png'; - var title = file.fileName; - var downloadUrl = file.url; - var thumbnailUrl = file.thumbnailUrl; - var fileSize = formatBytes(file.size, 3); - // var fileSize = file.size; - /* - var imageLinkHtml = file.contentType.includes("image") ? `` : ''; - */ - var imageLinkHtml = ''; + // 각 파일 정보(fileSet)을 처리 + fileSet.forEach(function (file) { + console.log(file.fileName); + var filterClass; + if (file.contentType.includes("image")) { + filterClass = 'filter-image'; + } else if (file.contentType.includes("text")) { + filterClass = 'filter-doc'; + } else if (file.contentType.includes("application")) { + filterClass = 'filter-doc'; + } else { + filterClass = 'filter-etc'; + } - var $newHtml = $(`
+ var imgSrc = iconsMap[file.contentType] || prefix + 'Default.png'; + var title = file.fileName; + var downloadUrl = file.url; + var thumbnailUrl = file.thumbnailUrl; + var fileSize = formatBytes(file.size, 3); + var imageLinkHtml = ''; + + var $newHtml = $(`
@@ -949,39 +912,36 @@
`); - let imgLoadCheck = new Image(); - imgLoadCheck.src = imgSrc; + let imgLoadCheck = new Image(); + imgLoadCheck.src = imgSrc; - imgLoadCheck.onload = function () { - $portfolioContainer.append($newHtml); - portfolioIsotope.appended($newHtml[0]); - portfolioIsotope.arrange(); - }; - }); - } - } + imgLoadCheck.onload = function () { + $portfolioContainer.append($newHtml); + portfolioIsotope.appended($newHtml[0]); + portfolioIsotope.arrange(); + }; + }); + } + } - /* data-filter 통해서 이미지, 문서, 기타 파일로 클릭 시 나눠지는 부분 */ - $('#portfolio-flters li').on('click', function(e){ - e.preventDefault(); - $('#portfolio-flters li').removeClass('filter-active'); - $(this).addClass('filter-active'); + /* data-filter 통해서 이미지, 문서, 기타 파일로 클릭 시 나눠지는 부분 */ + $('#portfolio-flters li').on('click', function(e){ + e.preventDefault(); + $('#portfolio-flters li').removeClass('filter-active'); + $(this).addClass('filter-active'); - portfolioIsotope.arrange({ - filter: $(this).attr('data-filter') - }); + portfolioIsotope.arrange({ + filter: $(this).attr('data-filter') + }); - portfolioIsotope.on( 'arrangeComplete', function() { - AOS.refresh(); - }); + portfolioIsotope.on( 'arrangeComplete', function() { + AOS.refresh(); + }); - portfolioIsotope.reloadItems(); - portfolioIsotope.arrange(); - }); - } - - jSuccess("파일 조회가 완료 되었습니다."); + portfolioIsotope.reloadItems(); + portfolioIsotope.arrange(); }); + } function formatBytes(bytes, decimals = 2) { @@ -1049,10 +1009,7 @@ var pageSize = 10; var totalPages = 0; var curPage = pageNum; - /* 전체 게시판 게시물 갯수 가져오는 API 호출 필요 */ - console.log(totalReqCommentCount); - if (totalReqCommentCount !== null && totalReqCommentCount > 0) { totalPages = Math.ceil(totalReqCommentCount / pageSize); console.log("totalPages : " + totalPages); @@ -1063,14 +1020,7 @@ $(".pagination").append(htmlStr); } else{ - //alert("검색되는 주소없음") - var $chatMessages = $('#chat_messages'); - $chatMessages.empty(); - - var $noDataHtml = $(`

- 등록된 글이 없습니다. -

`); - $chatMessages.append($noDataHtml); + noReqCommentMessage(); return; } @@ -1085,7 +1035,6 @@ type: "GET", data: { c_pdservice_link: selectedPdService, - /*c_version_link: selectedPdServiceVersion,*/ c_req_link: selectedJsTreeId, pageIndex: pageNum, pageUnit: pageSize @@ -1094,125 +1043,24 @@ dataType: "json", statusCode: { 200: function (data) { - //모달 팝업 끝내고 var $chatMessages = $('#chat_messages'); $chatMessages.empty(); console.log(data.response); if (data.response.length === 0) { /* 게시글이 없을 경우 처리 필요 */ - var $noDataHtml = $(`

- 등록된 글이 없습니다. -

`); - $chatMessages.append($noDataHtml); + noReqCommentMessage(); return; } - for (var k in data.response) { - var comment = data.response[k]; - - var c_id = comment.c_id; - var sender = comment.c_req_comment_sender; - var date = dateFormat(comment.c_req_comment_date); - var title = comment.c_title; - var req_comment_contents = comment.c_req_comment_contents.replace(/\n/g, '
'); - var contents = `

` + req_comment_contents +`

`; - var $newHtml; - - /* 로그인한 사용자 일 경우 우측으로 아닐 경우 좌측으로 보이게 하기 */ - var iconPosition = (sender !== userName) ? 'left' : 'right'; - var position = (sender !== userName) ? '' : 'on-left'; - var personIcon = (sender !== userName) ? 'bi-person-fill' : 'bi-person'; - var buttonsHtml = ''; - - if (sender === userName) { - buttonsHtml = ``; - } - - $newHtml = $(`
-
-
- -
-
-
- ${buttonsHtml} - -
- ${(position === "on-left") ? `${date}   \t` : ''} - ${sender} - ${(position === "") ? `   ${date}` : ''} -
-
- ${contents} -
- -
- -
`); - - $chatMessages.append($newHtml); - } - - $('.edit-chat-btn').on('click', function(e){ - var parentDiv = $(this).closest('.chat-message-body'); - var commentText = parentDiv.find('#contents').html(); - commentText = commentText.replace(/
/g, "\n"); - - parentDiv.find('.edit-text').val(commentText); - parentDiv.find('#contents').hide(); - parentDiv.find('.dropdown-button').hide(); - parentDiv.find('.dropdown-content').addClass('hide'); - parentDiv.find('.edit-comment').show(); - - $('.edit-text').on('input', function () { - this.style.height = 'auto'; - this.style.height = (this.scrollHeight) + 'px'; - }); - console.log(commentText); - // req_comment_edit_btn_click(c_id); + data.response.forEach(function(comment) { + var commentHtml = createReqCommentList(comment); + $chatMessages.append(commentHtml); }); - $('.delete-chat-btn').on('click', function(e){ - var c_id = $(this).val(); - req_comment_delete_btn_click(c_id); - }); + reqCommentRegisterEventHandlers(); - $('.cancel-button').on('click', function(e){ - var commentDiv = $(this).closest('.chat-message-body'); - commentDiv.find('#contents').show(); - commentDiv.find('.dropdown-button').show(); - commentDiv.find('.dropdown-content').removeClass('hide'); - commentDiv.find('.edit-comment').hide(); - }); - - $('.edit-save-button').on('click', function(e){ - var c_id = $(this).val(); - console.log(c_id); - var editText = $(this).closest('.edit-comment'); - var commentText = editText.find('.edit-text').val(); - console.log(commentText); - req_comment_edit_btn_click(c_id, commentText); - }); } }, beforeSend: function () { @@ -1271,6 +1119,123 @@ return pageUrl; } +function noReqCommentMessage() { + var $chatMessages = $('#chat_messages'); + $chatMessages.empty(); + + var $noDataHtml = $(`

+ 등록된 글이 없습니다. +

`); + $chatMessages.append($noDataHtml); +} + +function createReqCommentList(comment) { + var c_id = comment.c_id; + var sender = comment.c_req_comment_sender; + var date = dateFormat(comment.c_req_comment_date); + var title = comment.c_title; + var req_comment_contents = comment.c_req_comment_contents.replace(/\n/g, '
'); + var contents = `

` + req_comment_contents +`

`; + var $newHtml; + + /* 로그인한 사용자 일 경우 우측으로 아닐 경우 좌측으로 보이게 하기 */ + var iconPosition = (sender !== userName) ? 'left' : 'right'; + var position = (sender !== userName) ? '' : 'on-left'; + var personIcon = (sender !== userName) ? 'bi-person-fill' : 'bi-person'; + var buttonsHtml = ''; + + if (sender === userName) { + buttonsHtml = ``; + } + + $newHtml = $(`
+
+
+ +
+
+
+ ${buttonsHtml} + +
+ ${(position === "on-left") ? `${date}   \t` : ''} + ${sender} + ${(position === "") ? `   ${date}` : ''} +
+
+ ${contents} +
+ +
+ +
`); + + return $newHtml; +} + +function reqCommentRegisterEventHandlers() { + $('.edit-chat-btn').on('click', handleEditClick); + $('.delete-chat-btn').on('click', handleDeleteClick); + $('.cancel-button').on('click', handleCancelClick); + $('.edit-save-button').on('click', handleSaveClick); +} + +function handleEditClick(e){ + var parentDiv = $(this).closest('.chat-message-body'); + var commentText = parentDiv.find('#contents').html(); + commentText = commentText.replace(/
/g, "\n"); + + parentDiv.find('.edit-text').val(commentText); + parentDiv.find('#contents').hide(); + parentDiv.find('.dropdown-button').hide(); + parentDiv.find('.dropdown-content').addClass('hide'); + parentDiv.find('.edit-comment').show(); + + $('.edit-text').on('input', function () { + this.style.height = 'auto'; + this.style.height = (this.scrollHeight) + 'px'; + }); +} + +function handleDeleteClick(e){ + var c_id = $(this).val(); + req_comment_delete_btn_click(c_id); +} + +function handleCancelClick(e){ + var commentDiv = $(this).closest('.chat-message-body'); + commentDiv.find('#contents').show(); + commentDiv.find('.dropdown-button').show(); + commentDiv.find('.dropdown-content').removeClass('hide'); + commentDiv.find('.edit-comment').hide(); +} + +function handleSaveClick(e){ + var c_id = $(this).val(); + var editText = $(this).closest('.edit-comment'); + var commentText = editText.find('.edit-text').val(); + + req_comment_edit_btn_click(c_id, commentText); +} + function req_comment_save_btn_click() { addReqComment(); } @@ -1393,7 +1358,8 @@ } function req_comment_message_size_change() { - $('#comment-contents').on('input propertychange', function() { - $('.chat-footer').height($(this).height()); + $('#comment-contents').on('input', function () { + this.style.height = 'auto'; + this.style.height = (this.scrollHeight) + 'px'; }); }