Index: arms/js/detail.js
===================================================================
diff -u -re6e12437d164831eb360b9d40a029057f4778399 -r3f2de85df1147da33d1a5d22ee3cc75e90870149
--- arms/js/detail.js (.../detail.js) (revision e6e12437d164831eb360b9d40a029057f4778399)
+++ arms/js/detail.js (.../detail.js) (revision 3f2de85df1147da33d1a5d22ee3cc75e90870149)
@@ -13,8 +13,9 @@
[
"../reference/lightblue4/docs/lib/widgster/widgster.js",
"../reference/light-blue/lib/vendor/jquery.ui.widget.js"
- ]
+ ],
// 추가적인 플러그인 그룹들을 이곳에 추가하면 됩니다.
+ [ "css/jiraServerCustom.css"]
];
loadPluginGroupsParallelAndSequential(pluginGroups)
@@ -113,6 +114,53 @@
$("#detailview_req_id").val(selectedJsTreeId);
$("#detailview_req_name").val(ajaxData.reqAdd_c_title);
+//radio 버튼 - 선택 초기화
+ $("#detailview_req_priority label").removeClass("active");
+ $("#detailview_req_difficulty label").removeClass("active");
+ $("#detailview_req_state label").removeClass("active");
+ //radio 버튼 - 상태 초기화
+ $("input[name='detailview_req_priority_options']:checked").prop("checked", false);
+ $("input[name='detailview_req_difficulty_options']:checked").prop("checked", false);
+ $("input[name='detailview_req_state_options']:checked").prop("checked", false);
+
+ //상세보기 - 우선순위 버튼
+ let priorityRadioButtons = $("#detailview_req_priority input[type='radio']");
+ priorityRadioButtons.each(function () {
+ if ( $(this).val() == ajaxData.reqAdd_c_req_priority_link) {
+ $(this).parent().addClass("active");
+ $(this).prop("checked", true);
+ } else {
+ $(this).prop("checked", false);
+ }
+ });
+ //상세보기 - 난이도 버튼
+ let difficultRadioButtons = $("#detailview_req_difficulty input[type='radio']");
+ difficultRadioButtons.each(function () {
+ if ($(this).val() == ajaxData.reqAdd_c_req_difficulty_link) {
+ $(this).parent().addClass("active");
+ $(this).prop("checked", true);
+ } else {
+ $(this).prop("checked", false);
+ }
+ });
+ //상세보기 - 상태 버튼
+ let stateRadioButtons = $("#detailview_req_state input[type='radio']");
+ stateRadioButtons.each(function () {
+ if ($(this).val() == ajaxData.reqAdd_c_req_state_link) {
+ $(this).parent().addClass("active");
+ $(this).prop("checked", true);
+ } else {
+ $(this).prop("checked", false);
+ }
+ });
+
+ if (ajaxData.reqAdd_c_req_start_date) {
+ $("#detailview_req_start_date").val(formatDate(new Date(ajaxData.reqAdd_c_req_start_date)));
+ }
+ if (ajaxData.reqAdd_c_req_end_date) {
+ $("#detailview_req_end_date").val(formatDate(new Date(ajaxData.reqAdd_c_req_end_date)));
+ }
+
//Version 데이터 바인딩
if (isEmpty(ajaxData.pdServiceVersion_c_title)) {
$("#detailview_req_pdservice_version").val("요구사항에 등록된 버전이 없습니다.");
@@ -153,3 +201,9 @@
CKEDITOR.instances.detailview_req_contents.setReadOnly(true);
}
+function formatDate(date) {
+ var year = date.getFullYear().toString(); // 연도의 마지막 두 자리를 얻습니다.
+ var month = (date.getMonth() + 1).toString().padStart(2, "0");
+ var day = date.getDate().toString().padStart(2, "0");
+ return year + "-" + month + "-" + day;
+}
\ No newline at end of file
Index: arms/js/detail_total_reqadd.js
===================================================================
diff -u -re6e12437d164831eb360b9d40a029057f4778399 -r3f2de85df1147da33d1a5d22ee3cc75e90870149
--- arms/js/detail_total_reqadd.js (.../detail_total_reqadd.js) (revision e6e12437d164831eb360b9d40a029057f4778399)
+++ arms/js/detail_total_reqadd.js (.../detail_total_reqadd.js) (revision 3f2de85df1147da33d1a5d22ee3cc75e90870149)
@@ -7,7 +7,7 @@
var selectedJiraServer;
var selectedJiraProject;
var selectedJsTreeId; // 요구사항 아이디
-
+var versionList;
function execDocReady() {
var pluginGroups = [
["../reference/lightblue4/docs/lib/widgster/widgster.js"],
@@ -16,14 +16,31 @@
"../reference/jquery-plugins/jstree-v.pre1.0/_lib/jquery.cookie.js",
"../reference/jquery-plugins/jstree-v.pre1.0/_lib/jquery.hotkeys.js",
"../reference/jquery-plugins/jstree-v.pre1.0/jquery.jstree.js"
- ]
+ ],
+ [
+ "../reference/jquery-plugins/jstree-v.pre1.0/_lib/jquery.cookie.js",
+ "../reference/jquery-plugins/jstree-v.pre1.0/_lib/jquery.hotkeys.js",
+ "../reference/jquery-plugins/jstree-v.pre1.0/jquery.jstree.js",
+ "../reference/jquery-plugins/dataTables-1.10.16/media/css/jquery.dataTables_lightblue4.css",
+ "../reference/jquery-plugins/dataTables-1.10.16/extensions/Responsive/css/responsive.dataTables_lightblue4.css",
+ "../reference/jquery-plugins/dataTables-1.10.16/extensions/Select/css/select.dataTables_lightblue4.css",
+ "../reference/jquery-plugins/dataTables-1.10.16/media/js/jquery.dataTables.min.js",
+ "../reference/jquery-plugins/dataTables-1.10.16/extensions/Responsive/js/dataTables.responsive.min.js",
+ "../reference/jquery-plugins/dataTables-1.10.16/extensions/Select/js/dataTables.select.min.js",
+ "../reference/jquery-plugins/dataTables-1.10.16/extensions/RowGroup/js/dataTables.rowsGroup.min.js",
+ "../reference/jquery-plugins/dataTables-1.10.16/extensions/Buttons/js/dataTables.buttons.min.js",
+ "../reference/jquery-plugins/dataTables-1.10.16/extensions/Buttons/js/buttons.html5.js",
+ "../reference/jquery-plugins/dataTables-1.10.16/extensions/Buttons/js/buttons.print.js",
+ "../reference/jquery-plugins/dataTables-1.10.16/extensions/Buttons/js/jszip.min.js"
+ ],
// 추가적인 플러그인 그룹들을 이곳에 추가하면 됩니다.
+ ["css/jiraServerCustom.css"]
];
loadPluginGroupsParallelAndSequential(pluginGroups)
.then(function () {
setUrlParams();
-
+ getVersionList();
$(".widget").widgster();
setSideMenu("sidebar_menu_product", "sidebar_menu_total_reqadd");
@@ -57,6 +74,20 @@
selectedJiraServer = urlParams.get("jiraServer");
selectedJiraProject = urlParams.get("jiraProject");
}
+function getVersionList(){
+ $.ajax({
+ url: `/auth-user/api/arms/pdService/getVersionList.do?c_id=${selectedPdService}`,
+ type: "GET",
+ contentType: "application/json;charset=UTF-8",
+ dataType: "json",
+ progress: true,
+ statusCode: {
+ 200: function (data) {
+ versionList = data.response;
+ }
+ }
+ });
+}
////////////////////////////////////////////////////////////////////////////////////////
//요구사항 :: jsTree
@@ -87,9 +118,184 @@
$("#select_Req").text($("#req_tree").jstree("get_selected").text());
}
- setDetailAndEditViewTab();
+//요구사항 타입에 따라서 탭의 설정을 변경
+ if (selectRel == "drive") {
+ $("#folder_tab").get(0).click();
+ $(".newReqDiv").show();
+ $(".widget-tabs").children("header").children("ul").children("li:nth-child(1)").hide(); //상세보기
+ $(".widget-tabs").children("header").children("ul").children("li:nth-child(2)").show(); //리스트보기
+ $(".widget-tabs").children("header").children("ul").children("li:nth-child(3)").show(); //문서로보기
+
+ // 리스트로 보기(DataTable) 설정 ( 폴더나 루트니까 )
+ // 상세보기 탭 셋팅이 데이터테이블 렌더링 이후 시퀀스 호출 함.
+ dataTableLoad(selectedJsTreeId, selectRel);
+ } else if (selectRel == "folder") {
+ $("#folder_tab").get(0).click();
+ $(".widget-tabs").children("header").children("ul").children("li:nth-child(1)").hide(); //상세보기
+ $(".widget-tabs").children("header").children("ul").children("li:nth-child(2)").show(); //리스트보기
+ $(".widget-tabs").children("header").children("ul").children("li:nth-child(3)").show(); //문서로보기
+
+ //상세보기 탭 셋팅
+ setDetailAndEditViewTab();
+
+ // 리스트로 보기(DataTable) 설정 ( 폴더나 루트니까 )
+ // 상세보기 탭 셋팅이 데이터테이블 렌더링 이후 시퀀스 호출 함.
+ dataTableLoad(selectedJsTreeId, selectRel);
+
+ } else {
+ $("#default_tab").get(0).click();
+ $(".widget-tabs").children("header").children("ul").children("li:nth-child(1)").show(); //상세보기
+ $(".widget-tabs").children("header").children("ul").children("li:nth-child(2)").hide(); //리스트보기
+ $(".widget-tabs").children("header").children("ul").children("li:nth-child(3)").hide(); //문서로보기
+
+ //이전에 화면에 렌더링된 데이터 초기화
+ //상세보기 탭 셋팅
+ setDetailAndEditViewTab();
+ }
}
+////////////////////////////////////////////////////////////////////////////////////////
+//리스트 :: DataTable
+////////////////////////////////////////////////////////////////////////////////////////
+// --- Root, Drive, Folder 데이터 테이블 설정 --- //
+function dataTableLoad(selectId, selectRel) {
+ console.log("dataTableLoad - selectRel:::" + selectRel);
+ console.log("dataTableLoad - selectId:::" + selectId);
+ // 데이터 테이블 컬럼 및 열그룹 구성
+ var tableName = "T_ARMS_REQADD_" +selectedPdService;
+ var c_type = $("#req_tree").jstree("get_selected").attr("rel");
+ console.log("dataTableLoad - c_type:::" + c_type);
+
+ var dataTableRef;
+ if (selectId == 2) {
+ // 데이터 테이블 컬럼 및 열그룹 구성
+ var columnList = [
+ { data: "c_id", defaultContent: "-" },
+ { data: "c_left", defaultContent: "-" },
+ { data: "c_title", defaultContent: "-" }
+ ];
+ var rowsGroupList = [];
+ var columnDefList = [];
+ var selectList = {};
+ var orderList = [[1, "asc"]];
+ var buttonList = [];
+
+ var jquerySelector = "#req_table";
+ var ajaxUrl = "/auth-user/api/arms/reqAdd/" + tableName + "/getMonitor.do";
+ var jsonRoot = "";
+ var isServerSide = false;
+
+ dataTableRef = dataTable_build(
+ jquerySelector,
+ ajaxUrl,
+ jsonRoot,
+ columnList,
+ rowsGroupList,
+ columnDefList,
+ selectList,
+ orderList,
+ buttonList,
+ isServerSide
+ );
+ } else if (selectRel !== "folder") {
+ //select node 정보를 가져온다.
+ console.log("tableName:: " + tableName);
+ $.ajax({
+ url: "/auth-user/api/arms/reqAdd/" + tableName + "/getNode.do?c_id=" + selectId,
+ type: "GET",
+ contentType: "application/json;charset=UTF-8",
+ dataType: "json",
+ progress: true,
+ success: function (data) {
+ // 데이터 테이블 컬럼 및 열그룹 구성
+ var columnList = [
+ { data: "c_id", defaultContent: "-" },
+ { data: "c_left", defaultContent: "-" },
+ { data: "c_title", defaultContent: "-" }
+ ];
+ var rowsGroupList = [];
+ var columnDefList = [];
+ var selectList = {};
+ var orderList = [[1, "asc"]];
+ var buttonList = [];
+
+ var jquerySelector = "#req_table";
+ var ajaxUrl = "/auth-user/api/arms/reqAdd/" + tableName + "/getChildNodeWithParent.do";
+ var jsonRoot = "";
+ var paramUrl = "?c_id=313&c_left=" + data.c_left + "&c_right=" + data.c_right;
+ ajaxUrl = ajaxUrl + paramUrl;
+ var isServerSide = false;
+
+ dataTableRef = dataTable_build(
+ jquerySelector,
+ ajaxUrl,
+ jsonRoot,
+ columnList,
+ rowsGroupList,
+ columnDefList,
+ selectList,
+ orderList,
+ buttonList,
+ isServerSide
+ );
+ }
+ })
+ .done(function (data) {})
+ .fail(function (e) {})
+ .always(function () {});
+ } else {
+ console.log("folder clicked");
+ var columnList = [
+ { data: "c_id", defaultContent: "-" },
+ { data: "c_left", defaultContent: "-" },
+ { data: "c_title", defaultContent: "-" }
+ ];
+ var rowsGroupList = [];
+ var columnDefList = [];
+ var selectList = {};
+ var orderList = [];
+ var buttonList = [];
+
+ var jquerySelector = "#req_table";
+ var ajaxUrl = "/auth-user/api/arms/reqAdd/" + tableName + "/getChildNodeWithParent.do?c_id=" + selectId;
+ var jsonRoot = "";
+ var isServerSide = false;
+
+ dataTableRef = dataTable_build(
+ jquerySelector,
+ ajaxUrl,
+ jsonRoot,
+ columnList,
+ rowsGroupList,
+ columnDefList,
+ selectList,
+ orderList,
+ buttonList,
+ isServerSide
+ );
+ }
+}
+
+// 데이터 테이블 구성 이후 꼭 구현해야 할 메소드 : 열 클릭시 이벤트
+function dataTableClick(tempDataTable, selectedData) {
+ console.log("dataTableClick");
+}
+
+// 데이터 테이블 데이터 렌더링 이후 콜백 함수.
+function dataTableCallBack(settings, json) {
+ setDocViewTab();
+}
+
+function dataTableDrawCallback(tableInfo) {
+ $("#" + tableInfo.sInstance)
+ .DataTable()
+ .columns.adjust()
+ .responsive.recalc();
+}
+
+/*
+ 상세 보기
+*/
function setDetailAndEditViewTab() {
console.log("Detail Tab ::::");
var tableName = "T_ARMS_REQADD_" + selectedPdService;
@@ -112,25 +318,80 @@
function bindDataDetailTab(ajaxData) {
console.log("bindDataDetailTab :::::::::::");
console.log(ajaxData);
+ // 제품 서비스 데이터 바인딩
+ if(ajaxData.pdServiceEntity){
+ $("#detailview_req_pdservice_name").val(ajaxData.pdServiceEntity.c_title);
+ }else{
+ $("#detailview_req_pdservice_name").val("");
+ }
//Version 데이터 바인딩
- var selectedVersionText = "BaseVersion";
- if (isEmpty(selectedVersionText)) {
- $("#detailview_req_pdservice_version").val("요구사항에 등록된 버전이 없습니다.");
- } else {
- $("#detailview_req_pdservice_version").val(selectedVersionText);
- }
+ let reqVersion = "";
+ if (ajaxData.c_req_pdservice_versionset_link) {
+ const selectedVersions = versionList.filter(version =>
+ ajaxData.c_req_pdservice_versionset_link.includes(version.c_id)
+ );
+ selectedVersions.sort((a, b) => b.c_id - a.c_id);
+
+ const titleArray = selectedVersions.map(version => version.c_title);
+ reqVersion = titleArray.join(", ");
+
+ $("#detailview_req_pdservice_version").val(reqVersion);
+ }else{
+ $("#detailview_req_pdservice_version").val("요구사항에 등록된 버전이 없습니다.");
+ }
+
$("#detailview_req_id").val(ajaxData.c_id);
$("#detailview_req_name").val(ajaxData.c_title);
- //우선순위 셋팅
- $("#detailview_req_priority").children(".btn.active").removeClass("active");
- var select_Req_Priority_ID = "detailView-req-priority-option" + ajaxData.c_priority;
- $("#" + select_Req_Priority_ID)
- .parent()
- .addClass("active");
+ //radio 버튼 - 선택 초기화
+ $("#detailview_req_priority label").removeClass("active");
+ $("#detailview_req_difficulty label").removeClass("active");
+ $("#detailview_req_state label").removeClass("active");
+ //radio 버튼 - 상태 초기화
+ $("input[name='detailview_req_priority_options']:checked").prop("checked", false);
+ $("input[name='detailview_req_difficulty_options']:checked").prop("checked", false);
+ $("input[name='detailview_req_state_options']:checked").prop("checked", false);
- $("#detailview_req_status").val(ajaxData.c_req_status);
+ //상세보기 - 우선순위 버튼
+ let priorityRadioButtons = $("#detailview_req_priority input[type='radio']");
+ priorityRadioButtons.each(function () {
+ if (ajaxData.reqPriorityEntity && $(this).val() == ajaxData.reqPriorityEntity["c_id"]) {
+ $(this).parent().addClass("active");
+ $(this).prop("checked", true);
+ console.log($(this));
+ } else {
+ $(this).prop("checked", false);
+ }
+ });
+ //상세보기 - 난이도 버튼
+ let difficultRadioButtons = $("#detailview_req_difficulty input[type='radio']");
+ difficultRadioButtons.each(function () {
+ if (ajaxData.reqDifficultyEntity && $(this).val() == ajaxData.reqDifficultyEntity["c_id"]) {
+ $(this).parent().addClass("active");
+ $(this).prop("checked", true);
+ } else {
+ $(this).prop("checked", false);
+ }
+ });
+ //상세보기 - 상태 버튼
+ let stateRadioButtons = $("#detailview_req_state input[type='radio']");
+ stateRadioButtons.each(function () {
+ if (ajaxData.reqStateEntity && $(this).val() == ajaxData.reqStateEntity["c_id"]) {
+ $(this).parent().addClass("active");
+ $(this).prop("checked", true);
+ } else {
+ $(this).prop("checked", false);
+ }
+ });
+
+ if (ajaxData.c_req_start_date) {
+ $("#detailview_req_start_date").val(formatDate(new Date(ajaxData.c_req_start_date)));
+ }
+ if (ajaxData.c_req_end_date) {
+ $("#detailview_req_end_date").val(formatDate(new Date(ajaxData.c_req_end_date)));
+ }
+
$("#detailview_req_writer").val(ajaxData.c_req_writer);
$("#detailview_req_write_date").val(new Date(ajaxData.c_req_create_date).toLocaleString());
@@ -162,3 +423,78 @@
CKEDITOR.instances.detailview_req_contents.setData(ajaxData.c_req_contents);
CKEDITOR.instances.detailview_req_contents.setReadOnly(true);
}
+///////////////////////////////////////////////////////////////////////////////
+//문서로 보기 탭
+///////////////////////////////////////////////////////////////////////////////
+function setDocViewTab() {
+ $(".dd-list").empty();
+ var data = $("#req_table").DataTable().rows().data().toArray();
+
+ let treeData = buildDocTreeData(data); // 데이터를 계층적 구조로 변환
+ console.log("setDocViewTab :: doc data -> ");
+ console.log(treeData);
+ treeData.forEach(rootNode => {
+ $(".dd-list").append(generateDocHTML(rootNode)); // HTML 생성 및 추가
+ });
+}
+
+function buildDocTreeData(data) {
+ let tree = {};
+ let roots = [];
+
+ // 먼저 모든 노드를 id를 키로 하는 객체로 변환
+ data.forEach(item => {
+ tree[item.c_id] = {...item, children: []};
+ });
+
+ // 각 노드의 자식 노드들을 찾아서 추가
+ Object.keys(tree).forEach(id => {
+ let item = tree[id];
+ if (item.c_parentid && tree[item.c_parentid]) {
+ tree[item.c_parentid].children.push(item);
+ } else {
+ roots.push(item);
+ }
+ });
+
+ return roots; // 최상위 노드 반환
+}
+
+function generateDocHTML(node) {
+
+ let iconHtml = getDocIcon(node.c_type);
+
+ let html = "
" +
+ "" + iconHtml + " " + node.c_title +
+ "
" + (node.c_contents || "") + "
";
+
+ if (node.children.length > 0) {
+ html += "";
+ node.children.forEach(child => {
+ html += generateDocHTML(child);
+ });
+ html += "
";
+ }
+
+ html += "";
+ return html;
+}
+
+function getDocIcon(type) {
+ switch (type) {
+ case "root":
+ case "drive":
+ return "
";
+ case "folder":
+ return "
";
+ default:
+ return "
";
+ }
+}
+
+function formatDate(date) {
+ var year = date.getFullYear().toString(); // 연도의 마지막 두 자리를 얻습니다.
+ var month = (date.getMonth() + 1).toString().padStart(2, "0");
+ var day = date.getDate().toString().padStart(2, "0");
+ return year + "-" + month + "-" + day;
+}