";
if (key === "No Status") {
noStatusHtml = html_piece;
} else {
// 일반적인 경우 그대로 append
$("#progress_status").append(html_piece);
}
}
// loop 마무리후 기입
if (noStatusHtml) {
$("#progress_status").append(noStatusHtml);
}
}
function drawResourceIssueCount(resourceMap) {
$("#assign_status").empty(); // 모든 자식 요소 삭제
var notAssignedHtml = null;
for (var key in resourceMap) {
var value = resourceMap[key];
// console.log(key + "=" + value);
var html_piece =
'
";
if (key === "Not Assigned") {
notAssignedHtml = html_piece;
} else {
// 일반적인 경우 그대로 append
$("#assign_status").append(html_piece);
}
}
// loop 마무리후 기입
if (notAssignedHtml) {
$("#assign_status").append(notAssignedHtml);
}
}
function statisticsLoad(pdservice_id, pdservice_version_id) {
//제품 서비스 셀렉트 박스 데이터 바인딩
$.ajax({
url: `/auth-user/api/arms/reqStatus/T_ARMS_REQSTATUS_${pdservice_id}/getStatistics.do?version=${pdservice_version_id}`,
type: "GET",
contentType: "application/json;charset=UTF-8",
dataType: "json",
progress: true,
statusCode: {
200: function (data) {
console.log("statisticsLoad :: data => ", data);
for (var key in data) {
var value = data[key];
}
$("#version_count").text(data["version"]); // 버전수
}
}
});
}
////////////////////////////////////////////////////////////////////////////////////////
//버전 멀티 셀렉트 박스
////////////////////////////////////////////////////////////////////////////////////////
function makeVersionMultiSelectBox() {
//버전 선택 셀렉트 박스 이니시에이터
$(".multiple-select").multipleSelect({
filter: true,
onClose: function () {
console.log("onOpen event fire!\n");
var checked = $("#checkbox1").is(":checked");
var endPointUrl = "";
var versionTag = $(".multiple-select").val();
console.log("[ reqStatus :: makeVersionMultiSelectBox ] :: versionTag");
console.log(versionTag);
selectedVersionId = versionTag.join(",");
if (versionTag === null || versionTag == "") {
jError("버전이 선택되지 않았습니다.");
$(".ms-parent").css("z-index", 1000);
return;
}
// 통계로드
statisticsLoad($("#selected_pdService").val(), selectedVersionId);
// 진행상태, 작업자 로드
reqStatusDashboard($("#selected_pdService").val(), selectedVersionId);
// active tab 확인 및 API 호출
callActiveTabApi();
$(".ms-parent").css("z-index", 1000);
},
onOpen: function () {
console.log("open event");
$(".ms-parent").css("z-index", 9999);
}
});
}
function bind_VersionData_By_PdService() {
$(".multiple-select option").remove();
$.ajax({
url: "/auth-user/api/arms/pdService/getVersionList?c_id=" + $("#selected_pdService").val(),
type: "GET",
dataType: "json",
progress: true,
statusCode: {
200: function (data) {
//////////////////////////////////////////////////////////
var pdServiceVersionIds = [];
versionListData = [];
for (var k in data.response) {
var obj = data.response[k];
pdServiceVersionIds.push(obj.c_id);
versionListData.push(obj);
var newOption = new Option(obj.c_title, obj.c_id, true, false);
$(".multiple-select").append(newOption);
}
if (data.length > 0) {
console.log("display 재설정.");
}
console.log(pdServiceVersionIds);
selectedVersionId = pdServiceVersionIds.join(",");
console.log("bind_VersionData_By_PdService :: selectedVersionId");
console.log(selectedVersionId);
// 통계로드 (버전수)
statisticsLoad($("#selected_pdService").val(), selectedVersionId);
// 진행상태, 작업자 로드
reqStatusDashboard($("#selected_pdService").val(), selectedVersionId);
var endPointUrl = "";
// issueList > issueList1 - click trigger
// 버전 바인드 時 event trigger
if ($("#nav-issueList1").hasClass("active")) {
$('a[href="#issueList1"]').trigger("shown.bs.tab");
} else {
$("#nav-issueList1>a").click();
}
$("#deleted_issue_report_modal").on("shown.bs.modal", function (event) {
endPointUrl =
"/T_ARMS_REQSTATUS_" +
$("#selected_pdService").val() +
"/deletedIssueList?pdServiceVersionLinks=" +
selectedVersionId;
getDeletedIssueData($("#selected_pdService").val(), endPointUrl);
});
$(".multiple-select").multipleSelect("refresh");
//////////////////////////////////////////////////////////
}
}
});
}
////////////////////////////////////////////////////////////////////////////////////////
// issueList 가져오기 (Req - Subtask)
////////////////////////////////////////////////////////////////////////////////////////
function getReqStatusTableData(pdServiceId, pdServiceVersionLinks) {
let urlBuilder = new UrlBuilder().setBaseUrl(
`/auth-user/api/arms/reqStatus/T_ARMS_REQSTATUS_${pdServiceId}/issue-list-by-updated`
);
// getHierarchicalAlmIssues
if (pdServiceVersionLinks !== undefined) {
urlBuilder.addQueryParam("pdServiceVersionLinks", pdServiceVersionLinks);
}
const url = urlBuilder.build();
$.ajax({
url: url,
type: "GET",
contentType: "application/json;charset=UTF-8",
dataType: "json",
success: function (apiResponse) {
let data = apiResponse;
console.log("[ reqStatus :: getReqStatusTableData ] :: data => ", data);
dataTableLoad(data.response);
},
error: function (xhr, status, error) {
console.error(error);
}
});
}
////////////////////////////////////////////////////////////////////////////////////////
// issueList - (issueList order by created desc regardless isReq)
////////////////////////////////////////////////////////////////////////////////////////
function getIssueList2TableData(pdServiceId, pdServiceVersionLinks) {
$.ajax({
url: `/auth-user/api/arms/reqStatus/issue-list-by-updated-2nd`,
type: "GET",
data: {
"pdServiceAndIsReq.pdServiceLink": pdServiceId,
"pdServiceAndIsReq.pdServiceVersionLinks": pdServiceVersionLinks
},
contentType: "application/json;charset=UTF-8",
dataType: "json",
success: function (apiResponse) {
let data = apiResponse;
console.log("[ reqStatus :: getIssueList2TableData ] :: data.length ===> ", data ? data.length : 0);
$("#issueList2Table").table().reDraw(data);
},
error: function (xhr, status, error) {
console.error(error);
}
});
}
function format() {
return `
요구사항 구분
ALM Issue Key
Version
ALM Issue Title
ALM project
ALM Assignee
ALM Issue Type
ALM Priority
ALM Status
ALM Overall Update
ALM Created
ALM Updated
ALM Resolution
ALM Deleted
`;
}
function initializeChildTable(childrenData, container, upperIsReqName) {
var columnList = [
{
name: "icon",
title: "",
data: null,
render: function (data, type, row) {
console.log("upperIsReqName => ", upperIsReqName);
if (upperIsReqName && upperIsReqName.includes(row.almIssue.key)) {
console.log("상위 이슈의 키와 중복됩니다. 하위 표시X. 해당 이슈 키 =>", row.almIssue.key);
return "";
} else if (row.subtaskCount > 0 || row.linkedIssueCount > 0) {
return "";
} else {
return "";
}
},
className: "details-control",
orderable: false,
visible: true
},
{
name: "isReqName",
title: "요구사항 구분",
data: "isReqName",
render: function (data, type, row) {
var deletedDate = row.almIssue.deleted;
if (isEmpty(data) || data === "false") {
return "
N/A
";
} else {
let displayText = formatIsReqName(data);
let color = "#f8f8f8"; // 기본 텍스트 색상
if (deletedDate && deletedDate !== "") {
color = "#808080";
}
return "
" + displayText + "
";
}
},
className: "dt-body-left",
orderable: false,
visible: true
},
{
name: "key",
title: "ALM Issue Key",
data: "almIssue.key",
render: function (data, type, row, meta) {
var deletedDate = row.almIssue.deleted;
if (isEmpty(data) || data === "false") {
return "
N/A
";
} else {
let displayText = data;
let color = "#f8f8f8"; // 기본 텍스트 색상
if (deletedDate && deletedDate !== "") {
color = "#808080";
}
return "
" + displayText + "
";
}
},
className: "dt-body-left",
orderable: false,
visible: true
},
{
name: "pdServiceVersionNames",
title: "Version",
data: "pdServiceVersionNames",
render: function (data, type, row) {
var deletedDate = row.almIssue.deleted;
if (isEmpty(data) || data === "false") {
return "
N/A
";
} else {
let color = "#f8f8f8"; // 기본 텍스트 색상
if (deletedDate && deletedDate !== "") {
color = "#808080";
}
return "
" + data + "
";
}
},
className: "dt-body-left",
orderable: false,
visible: true
},
{
name: "summary",
title: "ALM Issue Title",
data: "almIssue.summary",
render: function (data, type, row, meta) {
var deletedDate = row.almIssue.deleted;
if (isEmpty(data) || data === "false") {
return "
N/A
";
} else {
let color = "#f8f8f8"; // 기본 텍스트 색상
if (deletedDate && deletedDate !== "") {
color = "#808080";
}
return "
" + data + "
";
}
},
className: "dt-body-left",
orderable: false,
visible: true
},
{
name: "project_name",
title: "ALM project",
data: "almIssue.project.project_name",
render: function (data, type, row, meta) {
var deletedDate = row.almIssue.deleted;
if (isEmpty(data) || data === "false") {
return "
N/A
";
} else {
let displayText = data;
let color = "#f8f8f8"; // 기본 텍스트 색상
if (deletedDate && deletedDate !== "") {
color = "#808080";
}
return "
" + displayText + "
";
}
},
className: "dt-body-left",
orderable: false,
visible: true
},
{
name: "assignee_displayName",
title: "ALM Assignee",
data: "almIssue.assignee.assignee_displayName",
render: function (data, type, row, meta) {
var deletedDate = row.almIssue.deleted;
if (isEmpty(data) || data === "false") {
return "
N/A
";
} else {
let displayText = data;
let color = "#f8f8f8"; // 기본 텍스트 색상
if (deletedDate && deletedDate !== "") {
color = "#808080";
}
return "
" + displayText + "
";
}
},
className: "dt-body-left",
orderable: false,
visible: true
},
{
name: "issuetype_name",
title: "ALM Issue Type",
data: "almIssue.issuetype.issuetype_name",
render: function (data, type, row, meta) {
var deletedDate = row.almIssue.deleted;
if (isEmpty(data) || data === "false") {
return "
N/A
";
} else {
let displayText = data;
let color = "#f8f8f8"; // 기본 텍스트 색상
if (deletedDate && deletedDate !== "") {
color = "#808080";
}
return "
" + displayText + "
";
}
},
className: "dt-body-left",
orderable: false,
visible: true
},
{
name: "priority_name",
title: "ALM Priority",
data: "almIssue.priority.priority_name",
render: function (data, type, row, meta) {
var deletedDate = row.almIssue.deleted;
if (isEmpty(data) || data === "false") {
return "
N/A
";
} else {
let displayText = data;
let color = "#f8f8f8"; // 기본 텍스트 색상
if (deletedDate && deletedDate !== "") {
color = "#808080";
}
return "
" + displayText + "
";
}
},
className: "dt-body-left",
orderable: false,
visible: true
},
{
name: "status_name",
title: "ALM Status",
data: "almIssue.status.status_name",
render: function (data, type, row, meta) {
var deletedDate = row.almIssue.deleted;
if (isEmpty(data) || data === "false") {
return "
N/A
";
} else {
let displayText = data;
let color = "#f8f8f8"; // 기본 텍스트 색상
if (deletedDate && deletedDate !== "") {
color = "#808080";
}
return "
" + displayText + "
";
}
},
className: "dt-body-left",
orderable: false,
visible: true
},
{
name: "overallUpdatedDate",
title: "ALM Overall Update",
data: "almIssue.overallUpdatedDate",
render: function (data, type, row, meta) {
var deletedDate = row.almIssue.deleted;
if (isEmpty(data) || data === "false") {
return "
N/A
";
} else {
let displayText = dateFormatSlash(data);
let color = "#f8f8f8"; // 기본 텍스트 색상
if (deletedDate && deletedDate !== "") {
color = "#808080";
}
return "
" + displayText + "
";
}
},
className: "dt-body-left",
orderable: false,
visible: false
},
{
name: "almIssue.created",
title: "ALM Created",
data: "almIssue.created",
render: function (data, type, row, meta) {
var deletedDate = row.almIssue.deleted;
if (isEmpty(data) || data === "false") {
return "
N/A
";
} else {
let displayText = dateFormatSlash(data);
let color = "#f8f8f8"; // 기본 텍스트 색상
if (deletedDate && deletedDate !== "") {
color = "#808080";
}
return "
" + displayText + "
";
}
},
className: "dt-body-left",
orderable: false,
visible: true
},
{
name: "almIssue.updated",
title: "ALM Updated",
data: "almIssue.updated",
render: function (data, type, row, meta) {
var deletedDate = row.almIssue.deleted;
if (isEmpty(data) || data === "false") {
return "
N/A
";
} else {
let displayText = dateFormatSlash(data);
let color = "#f8f8f8"; // 기본 텍스트 색상
if (deletedDate && deletedDate !== "") {
color = "#808080";
}
return "
" + displayText + "
";
}
return data;
},
className: "dt-body-left",
orderable: false,
visible: true
},
{
name: "resolutiondate",
title: "ALM Resolution",
data: "almIssue.resolutiondate",
render: function (data, type, row, meta) {
var deletedDate = row.almIssue.deleted;
if (isEmpty(data) || data === "false") {
return "
N/A
";
} else {
let displayText = dateFormatSlash(data);
let color = "#f8f8f8"; // 기본 텍스트 색상
if (deletedDate && deletedDate !== "") {
color = "#808080";
}
return "
",
targets: "_all"
}
];
var orderList = [];
var rowsGroupList = [];
var buttonList = [];
var childTable = container.find("table.child-table").DataTable({
data: childrenData,
columns: columnList,
columnDefs: columnDefList,
order: orderList,
rowsGroup: rowsGroupList,
buttons: buttonList,
paging: false,
searching: false,
info: false,
responsive: {
details: false // 기본 동작 비활성화
},
autoWidth: false
});
container
.find("tbody")
.off("click", "tr, td.details-control")
.on("click", "tr, td.details-control", function (event) {
// 이벤트 전파 중지
event.stopPropagation();
var tr = $(this).closest("tr");
var row = childTable.row(tr);
let rowData = row.data();
if (row.child.isShown()) {
row.child.hide();
tr.removeClass("shown");
} else {
let rowIsReqName = rowData.isReqName;
if (row.data().children && row.data().children.length > 0) {
row.child(format(row.data())).show();
tr.addClass("shown");
initializeChildTable(row.data().children, tr.next("tr").find("div.child-table-container"), rowIsReqName);
} else {
if (!row.data().fetchingChildren) {
row.data().fetchingChildren = true;
fetchChildren(
rowData.almIssue.key,
rowData.almIssue.parentReqKey ? rowData.almIssue.parentReqKey : "",
rowData.almIssue.upperKey ? rowData.almIssue.upperKey : "",
rowData.subtaskCount ? rowData.subtaskCount : 0,
rowData.linkedIssueCount ? rowData.linkedIssueCount : 0,
rowData.almIssue.linkedIssues ? rowData.almIssue.linkedIssues : null
)
.then((children) => {
row.data().fetchingChildren = false;
// 가져온데이터를 row.data().children 에 추가(대입)
row.data().children = children;
// 데이터 랜더링
row.child(format(row.data())).show();
tr.addClass("shown");
initializeChildTable(children, tr.next("tr").find("div.child-table-container"), rowIsReqName);
})
.catch((error) => {
row.data().fetchingChildren = false;
console.error("Failed to fetch children:", error);
});
}
}
}
});
}
////////////////////////////////////////////////////////////////////////////////////////
//데이터 테이블
////////////////////////////////////////////////////////////////////////////////////////
// -------------------- 데이터 테이블을 만드는 템플릿으로 쓰기에 적당하게 리팩토링 함. ------------------ //
function dataTableLoad(tableData) {
var columnList = [
{
name: "icon",
title: "",
data: null,
render: function (data, type, row) {
if (containsRequirement(row.isReqName)) {
return "";
} else if (row.subtaskCount > 0 || row.linkedIssueCount > 0) {
return "";
} else {
return "";
}
},
className: "details-control",
orderable: false,
visible: true
},
{
name: "isReqName",
title: "요구사항 구분",
data: "isReqName",
render: function (data, type, row) {
var isReqSort = row.almIssue.isReq;
var deletedDate = row.almIssue.deleted;
if (isEmpty(data)) {
return "
N/A
";
} else {
let displayText = data;
let color;
displayText = formatLinkIssue(displayText);
if (data.endsWith("_link")) {
color = "#f8f8f8"; // 기본 텍스트 색상
} else if (!isEmpty(isReqSort) && isReqSort === true) {
color = "#a4c6ff";
} else {
color = "#f8f8f8"; // 기본 텍스트 색상
}
if (deletedDate && deletedDate !== "") {
color = "#808080";
}
return "
" + displayText + "
";
}
},
className: "dt-body-left",
orderable: false,
visible: true
},
{
name: "key",
title: "ALM Issue Key",
data: "almIssue.key",
render: function (data, type, row, meta) {
var isReqSort = row.almIssue.isReq;
var deletedDate = row.almIssue.deleted;
if (isEmpty(data) || data === "false") {
return "
N/A
";
} else {
let displayText = data;
let color = textColor(row.isReqName, isReqSort);
// 삭제 여부
if (deletedDate && deletedDate !== "") {
color = "#808080";
}
// 요구사항 이슈 여부
if (!isEmpty(isReqSort) && isReqSort) {
let btn_data_row1 = {
pdServiceVersions: row.almIssue.pdServiceVersions.join(","),
cReqLink: row.almIssue.creqLink
};
return (
"
";
} else {
var date = new Date(data);
date.setDate(date.getDate() + 2);
let year = date.getFullYear();
let month = String(date.getMonth() + 1).padStart(2, "0");
let day = String(date.getDate()).padStart(2, "0");
let newDateString = `${year}-${month}-${day}`;
if (isEmpty(row.isReq) || row.isReq == false) {
return "
";
} else {
let displayText = data;
let color = "#f8f8f8"; // 기본 텍스트 색상
if (!isEmpty(row.isReq) && row.isReq == true && !row.etc) {
color = "#a4c6ff";
} else {
color = "#f8f8f8"; // 기본 텍스트 색상
}
if (row.deleted && row.deleted.deleted_isDeleted === true) {
displayText = "" + data + "";
} else if (row.deleted && row.deleted.deleted_isDeleted === false) {
color = "#808080";
}
return "
";
} else {
let displayText = data;
let color = "#f8f8f8"; // 기본 텍스트 색상
if (!isEmpty(row.isReq) && row.isReq == true && !row.etc) {
color = "#a4c6ff";
} else {
color = "#f8f8f8"; // 기본 텍스트 색상
}
if (row.deleted && row.deleted.deleted_isDeleted === true) {
displayText = "" + data + "";
} else if (row.deleted && row.deleted.deleted_isDeleted === false) {
color = "#808080";
}
return "
";
} else {
let displayText = data;
let color = "#f8f8f8"; // 기본 텍스트 색상
if (!isEmpty(row.isReq) && row.isReq == true && !row.etc) {
color = "#a4c6ff";
} else {
color = "#f8f8f8"; // 기본 텍스트 색상
}
if (row.deleted && row.deleted.deleted_isDeleted === true) {
displayText = "" + data + "";
} else if (row.deleted && row.deleted.deleted_isDeleted === false) {
color = "#808080";
}
return "
";
} else {
let displayText = data;
let color = "#f8f8f8"; // 기본 텍스트 색상
if (!isEmpty(row.isReq) && row.isReq == true && !row.etc) {
color = "#a4c6ff";
} else {
color = "#f8f8f8"; // 기본 텍스트 색상
}
if (row.deleted && row.deleted.deleted_isDeleted === true) {
displayText = "" + data + "";
} else if (row.deleted && row.deleted.deleted_isDeleted === false) {
color = "#808080";
}
return "
";
} else {
let displayText = data;
let color = "#f8f8f8"; // 기본 텍스트 색상
if (!isEmpty(row.isReq) && row.isReq == true && !row.etc) {
color = "#a4c6ff";
} else {
color = "#f8f8f8"; // 기본 텍스트 색상
}
if (row.deleted && row.deleted.deleted_isDeleted === true) {
displayText = "" + data + "";
} else if (row.deleted && row.deleted.deleted_isDeleted === false) {
color = "#808080";
}
return "
";
} else {
let displayText = data;
let color = "#f8f8f8"; // 기본 텍스트 색상
if (!isEmpty(row.isReq) && row.isReq == true && !row.etc) {
color = "#a4c6ff";
} else {
color = "#f8f8f8"; // 기본 텍스트 색상
}
if (row.deleted && row.deleted.deleted_isDeleted === true) {
displayText = "" + data + "";
} else if (row.deleted && row.deleted.deleted_isDeleted === false) {
color = "#808080";
}
return "