////////////////////////////////////////////////////////////////////////////////////////
//Document Ready
////////////////////////////////////////////////////////////////////////////////////////
var selectedId; // 요구사항 아이디
var selectedType;
var parentIdOfSelected;
var selectedPdServiceId; // 제품(서비스) 아이디
var selectedVersionId; // 선택된 버전 아이디
// 최상단 메뉴 변수
var req_state, resource_info, issue_info, period_info, total_days_progress;
var dataTableRef;
var gantt;
var ganttTasks;
var monthlyProgressTable;
function execDocReady() {
var pluginGroups = [
[
// Apache Echarts
"../reference/jquery-plugins/echarts-5.4.3/dist/echarts.min.js",
// 최상단 메뉴
"js/analysis/topmenu/topMenuApi.js",
"./js/common/chart/eCharts/basicRadar.js",
"../reference/lightblue4/docs/lib/slimScroll/jquery.slimscroll.min.js",
"../reference/lightblue4/docs/lib/widgster/widgster.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/select2-4.0.2/dist/css/select2_lightblue4.css",
"../reference/jquery-plugins/lou-multi-select-0.9.12/css/multiselect-lightblue4.css",
"../reference/jquery-plugins/multiple-select-1.5.2/dist/multiple-select-bluelight.css",
"../reference/jquery-plugins/select2-4.0.2/dist/js/select2.min.js",
"../reference/jquery-plugins/lou-multi-select-0.9.12/js/jquery.quicksearch.js",
"../reference/jquery-plugins/lou-multi-select-0.9.12/js/jquery.multi-select.js",
"../reference/jquery-plugins/multiple-select-1.5.2/dist/multiple-select.min.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/gantt-0.6.1/dist/frappe-gantt.js",
"../reference/jquery-plugins/gantt-0.6.1/dist/frappe-gantt.css",
"../reference/jquery-plugins/datetimepicker-2.5.20/build/jquery.datetimepicker.min.css",
"../reference/light-blue/lib/bootstrap-datepicker.js",
"../reference/jquery-plugins/datetimepicker-2.5.20/build/jquery.datetimepicker.full.min.js"
] // 추가적인 플러그인 그룹들을 이곳에 추가하면 됩니다.
];
loadPluginGroupsParallelAndSequential(pluginGroups)
.then(function () {
console.log("모든 플러그인 로드 완료");
//vfs_fonts 파일이 커서 defer 처리 함.
setTimeout(function () {
var script = document.createElement("script");
script.src = "../reference/jquery-plugins/dataTables-1.10.16/extensions/Buttons/js/vfs_fonts.js";
script.defer = true; // defer 속성 설정
document.head.appendChild(script);
}, 5000); // 5초 후에 실행됩니다.
//사이드 메뉴 처리
$(".widget").widgster();
setSideMenu("sidebar_menu_requirement", "sidebar_menu_requirement_gantt");
// --- 에디터 설정 --- //
var waitCKEDITOR = setInterval(function () {
try {
if (window.CKEDITOR) {
if (window.CKEDITOR.status == "loaded") {
// CKEDITOR.replace("detailview_req_contents", { skin: "office2013" });
CKEDITOR.replace("edit_tabmodal_editor", { skin: "office2013" });
CKEDITOR.replace("add_tabmodal_editor", { skin: "office2013" });
clearInterval(waitCKEDITOR);
}
}
} catch (err) {
console.log("CKEDITOR 로드가 완료되지 않아서 초기화 재시도 중...");
}
}, 313 /*milli*/);
//제품(서비스) 셀렉트 박스 이니시에이터
makePdServiceSelectBox();
//버전 멀티 셀렉트 박스 이니시에이터
makeVersionMultiSelectBox();
// 높이 조정
$(".top-menu-div").matchHeight({
target: $(".top-menu-div-scope")
});
popup_size_setting();
autoCompleteForUser();
// 스크립트 실행 로직을 이곳에 추가합니다.
click_btn_for_req_add();
click_btn_for_req_update();
click_btn_for_search_history();
change_tab_action();
change_form_with_req_type();
// 월별 진척율 (임시)
drawMonthlyProgressChart();
drawMonthlyProgressTable();
drawWeeklyProgressChart();
// Workload
drawMonthlyWorkloadChart();
drawWeeklyWorkloadChart();
// 담당자
drawWorkloadByAssigneeChart();
drawProgressByAssigneeChart();
openPanel();
openMonthlyWorkloadPanel();
closePanel();
resizePanel();
$("#progress_status").slimScroll({
height: "195px",
railVisible: true,
railColor: "#222",
railOpacity: 0.3,
wheelStep: 10,
allowPageScroll: false,
disableFadeOut: false
});
var 라따적용_클래스이름_배열 = [".ladda_shcedule_update"];
laddaBtnSetting(라따적용_클래스이름_배열);
})
.catch(function (e) {
console.error("플러그인 로드 중 오류 발생");
console.error(e);
});
}
////////////////////////////////////////////////////////////////////////////////////////
//제품 서비스 셀렉트 박스
////////////////////////////////////////////////////////////////////////////////////////
function makePdServiceSelectBox() {
//제품 서비스 셀렉트 박스 이니시에이터
$(".chzn-select").each(function () {
$(this).select2($(this).data());
});
//제품 서비스 셀렉트 박스 데이터 바인딩
$.ajax({
url: "/auth-user/api/arms/pdServicePure/getPdServiceMonitor.do",
type: "GET",
contentType: "application/json;charset=UTF-8",
dataType: "json",
progress: true,
statusCode: {
200: function (data) {
//////////////////////////////////////////////////////////
for (var k in data.response) {
var obj = data.response[k];
var newOption = new Option(obj.c_title, obj.c_id, false, false);
$("#selected_pdService").append(newOption).trigger("change");
}
//////////////////////////////////////////////////////////
}
}
});
$("#selected_pdService").on("select2:open", function () {
//슬림스크롤
makeSlimScroll(".select2-results__options");
});
// --- select2 ( 제품(서비스) 검색 및 선택 ) 이벤트 --- //
$("#selected_pdService").on("select2:select", function (e) {
selectedPdServiceId = $("#selected_pdService").val();
// 제품( 서비스 ) 선택했으니까 자동으로 버전을 선택할 수 있게 유도
// 디폴트는 base version 을 선택하게 하고 ( select all )
// 선택된 제품(서비스) 데이터 바인딩
var selectedService = $("#selected_pdService").select2("data")[0].text;
$("#select_PdService").text(selectedService);
$("#select_Service").text(selectedService); // 선택된 제품(서비스)
//~> 이벤트 연계 함수 :: Version 표시 jsTree 빌드
bind_VersionData_By_PdService();
resetProjectProgress();
});
} // end makePdServiceSelectBox()
////////////////////////////////////////////////////////////////////////////////////////
//버전 멀티 셀렉트 박스
////////////////////////////////////////////////////////////////////////////////////////
function makeVersionMultiSelectBox() {
//버전 선택 셀렉트 박스 이니시에이터
$("#multiversion").multipleSelect({
filter: true,
onClose: function () {
console.log("onOpen event fire!\n");
var versionTag = $(".multiple-select").val();
if (versionTag === null || versionTag == "") {
jError("버전이 선택되지 않았습니다.");
$(".ms-parent").css("z-index", 1000);
return;
}
console.log("[ reqGantt :: makeVersionMultiSelectBox ] :: versionTag");
console.log(versionTag);
selectedVersionId = versionTag.join(",");
// 최상단 메뉴 세팅
TopMenuApi.톱메뉴_초기화();
TopMenuApi.톱메뉴_세팅();
getMonitorData($("#selected_pdService").val(), selectedVersionId);
resetProjectProgress();
$(".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 = [];
for (var k in data.response) {
var obj = data.response[k];
pdServiceVersionIds.push(obj.c_id);
var newOption = new Option(obj.c_title, obj.c_id, true, false);
$(".multiple-select").append(newOption);
}
if (data.length > 0) {
console.log("display 재설정.");
}
var versionTag = $(".multiple-select").val();
console.log("[ reqGantt :: bind_VersionData_By_PdService ] :: versionTag");
console.log(versionTag);
console.log(pdServiceVersionIds);
selectedVersionId = pdServiceVersionIds.join(",");
console.log("bind_VersionData_By_PdService :: selectedVersionId");
console.log(selectedVersionId);
// 최상단 메뉴 세팅
TopMenuApi.톱메뉴_초기화();
TopMenuApi.톱메뉴_세팅();
$(".multiple-select").multipleSelect("refresh");
//////////////////////////////////////////////////////////
getMonitorData($("#selected_pdService").val(), selectedVersionId);
}
}
});
}
function openPanel() {
$("#monthlyProgressSlidePanel").addClass("open").show();
}
function openMonthlyWorkloadPanel() {
$("#monthlyWorkloadSlidePanel").addClass("open").show();
}
function closePanel() {
$(".slidePanel").removeClass("open").hide();
}
function resizePanel() {
let isResizing = false;
$(".resizer").on("mousedown", function () {
isResizing = true;
$("body").css("cursor", "ew-resize");
});
$(document).on("mousemove", function (e) {
if (!isResizing) return;
const newWidth = $(window).width() - e.clientX;
if (newWidth >= 200 && newWidth <= $(window).width() * 0.9) {
$(".slidePanel").css("width", newWidth + "px");
}
});
$(document).on("mouseup", function () {
if (isResizing) {
isResizing = false;
$("body").css("cursor", "default");
}
});
}
///////////////////////////////////////////////////////////////
// 프로젝트 월별 진척율 차트
///////////////////////////////////////////////////////////////
function drawMonthlyProgressChart() {
const chartDom = document.getElementById("monthlyProgressChart");
const myChart = echarts.init(chartDom);
const option = {
grid: {
left: 35,
top: 20,
bottom: 20,
right: 20
},
tooltip: {
trigger: "axis",
formatter: (params) => {
return params.map((p) => `${p.seriesName}: ${p.value}%`).join("
");
}
},
legend: {
textStyle: {
color: "#fff"
},
data: ["계획작업량 진척율", "실적기성 진척율", "실제작업량 진척율"]
},
xAxis: {
type: "category",
boundaryGap: false,
data: ["2025-01", "2025-02", "2025-03", "2025-04", "2025-05", "2025-06"],
axisLabel: {
color: "#fff"
},
axisLine: {
lineStyle: {
color: "#fff"
}
}
},
yAxis: {
type: "value",
axisLabel: {
formatter: "{value}%",
color: "#fff"
},
axisLine: {
lineStyle: {
color: "#fff"
}
}
},
series: [
{
name: "계획작업량 진척율",
type: "line",
symbol: "diamond",
data: [0, 25, 45, 70, 90, 100]
},
{
name: "실적기성 진척율",
type: "line",
symbol: "rect",
data: [0, 15, 35, 40, null, null]
},
{
name: "실제작업량 진척율",
type: "line",
symbol: "triangle",
data: [0, 5, 10, null, null, null]
}
]
};
myChart.setOption(option);
window.addEventListener("resize", () => myChart.resize());
}
///////////////////////////////////////////////////////////////
// 프로젝트 월별 진척율 테이블 데이터
///////////////////////////////////////////////////////////////
function drawMonthlyProgressTable() {
var columnList = [
{
name: "startDate",
title: "시작일",
data: "startDate",
render: function (data, type, row, meta) {
return data;
},
className: "dt-body-left",
visible: true
},
{
name: "endDate",
title: "완료일",
data: "endDate",
render: function (data, type, row, meta) {
return data;
},
className: "dt-body-left",
visible: true
},
{
name: "planWorkload",
title: "계획작업량(Man-Day)",
data: "planWorkload",
render: function (data, type, row, meta) {
return data;
},
className: "dt-body-left",
visible: true
},
{
name: "planWorkloadStack",
title: "계획작업량 누적(Man-Day)",
data: "planWorkloadStack",
render: function (data, type, row, meta) {
return data;
},
className: "dt-body-left",
visible: true
},
{
name: "planWorkloadProgressRate",
title: "계획작업량 진척율",
data: "planWorkloadProgressRate",
render: function (data, type, row, meta) {
return data;
},
className: "dt-body-left",
visible: true
},
{
name: "",
title: "실적기성(Man-Day)",
data: "",
render: function (data, type, row, meta) {
return data;
},
className: "dt-body-left",
visible: true
},
{
name: "",
title: "실적기성 누적(Man-Day)",
data: "",
render: function (data, type, row, meta) {
return data;
},
className: "dt-body-left",
visible: true
},
{
name: "",
title: "실적기성 진척율",
data: "",
render: function (data, type, row, meta) {
return data;
},
className: "dt-body-left",
visible: true
},
{
name: "",
title: "실제작업량(Man-Day)",
data: "",
render: function (data, type, row, meta) {
return data;
},
className: "dt-body-left",
visible: true
},
{
name: "",
title: "실제작업량 누적(Man-Day)",
data: "",
render: function (data, type, row, meta) {
return data;
},
className: "dt-body-left",
visible: true
},
{
name: "",
title: "실제작업량 진척율",
data: "",
render: function (data, type, row, meta) {
return data;
},
className: "dt-body-left",
visible: true
}
];
var rowsGroupList = [];
var columnDefList = [];
var orderList = [];
var jquerySelector = "#monthlyProgressTable";
var ajaxUrl = "";
var jsonRoot = "";
var buttonList = [];
var selectList = {};
var isServerSide = false;
var isAjax = false;
monthlyProgressTable = dataTable_build(
jquerySelector,
ajaxUrl,
jsonRoot,
columnList,
rowsGroupList,
columnDefList,
selectList,
orderList,
buttonList,
isServerSide,
600,
null,
isAjax
);
monthlyProgressTable.columns.adjust();
}
///////////////////////////////////////////////////////////////
// 프로젝트 주별 진척율 테이블 데이터
///////////////////////////////////////////////////////////////
function drawWeeklyProgressChart() {
const chartDom = document.getElementById("weeklyProgressChart");
const myChart = echarts.init(chartDom);
const option = {
grid: {
left: 35,
top: 20,
bottom: 20,
right: 20
},
tooltip: {
trigger: "axis",
formatter: (params) => {
return params.map((p) => `${p.seriesName}: ${p.value}%`).join("
");
}
},
legend: {
textStyle: {
color: "#fff"
},
data: ["계획작업량 진척율", "실적기성 진척율", "실제작업량 진척율"]
},
xAxis: {
type: "category",
boundaryGap: false,
data: ["2025-01-04", "2025-03-04", "2025-05-04", "2025-07-04", "2025-09-04", "2025-11-04"],
axisLabel: {
rotate: 45,
color: "#fff"
},
axisLine: {
lineStyle: {
color: "#fff"
}
}
},
yAxis: {
type: "value",
axisLabel: {
formatter: "{value}%",
color: "#fff"
},
axisLine: {
lineStyle: {
color: "#fff"
}
}
},
series: [
{
name: "계획작업량 진척율",
type: "line",
symbol: "diamond",
data: [0, 25, 45, 70, 90, 100]
},
{
name: "실적기성 진척율",
type: "line",
symbol: "rect",
data: [0, 15, 35, 40, null, null]
},
{
name: "실제작업량 진척율",
type: "line",
symbol: "triangle",
data: [0, 5, 10, null, null, null]
}
]
};
myChart.setOption(option);
window.addEventListener("resize", function () {
myChart.resize();
});
}
///////////////////////////////////////////////////////////////
// 월별 Workload
///////////////////////////////////////////////////////////////
function drawMonthlyWorkloadChart() {
const chartDom = document.getElementById("monthlyWorkloadChart");
const myChart = echarts.init(chartDom);
const option = {
grid: {
left: 35,
top: 20,
bottom: 20,
right: 20
},
xAxis: {
type: "category",
data: ["2025-01", "2025-02", "2025-03", "2025-04", "2025-05", "2025-06"],
axisLine: {
lineStyle: {
color: "#fff"
}
}
},
yAxis: {
type: "value",
axisLine: {
lineStyle: {
color: "#fff"
}
}
},
series: [
{
data: [3, 4, 8, 2, 1, 9],
type: "bar"
}
]
};
myChart.setOption(option);
window.addEventListener("resize", () => myChart.resize());
}
///////////////////////////////////////////////////////////////
// 주별 Workload
///////////////////////////////////////////////////////////////
function drawWeeklyWorkloadChart() {
const chartDom = document.getElementById("weeklyWorkloadChart");
const myChart = echarts.init(chartDom);
const option = {
grid: {
left: 35,
top: 20,
bottom: 20,
right: 20
},
xAxis: {
type: "category",
data: ["2025-01", "2025-02", "2025-03", "2025-04", "2025-05", "2025-06"],
axisLine: {
lineStyle: {
color: "#fff"
}
}
},
yAxis: {
type: "value",
axisLine: {
lineStyle: {
color: "#fff"
}
}
},
series: [
{
data: [3, 4, 8, 2, 1, 9],
type: "bar"
}
]
};
myChart.setOption(option);
window.addEventListener("resize", () => myChart.resize());
}
///////////////////////////////////////////////////////////////
// 담당자별 Workload
///////////////////////////////////////////////////////////////
function drawWorkloadByAssigneeChart() {
const chartDom = document.getElementById("workloadByAssigneeChart");
const myChart = echarts.init(chartDom);
const option = {
grid: {
left: 65,
top: 20,
bottom: 20,
right: 20
},
xAxis: {
type: "value",
axisLine: {
lineStyle: {
color: "#fff"
}
}
},
yAxis: {
type: "category",
data: ["TEST1", "TEST2", "TEST3", "TEST4", "TEST5", "TEST6", "TEST7"],
axisLine: {
lineStyle: {
color: "#fff"
}
}
},
series: [
{
data: [120, 200, 150, 80, 70, 110, 130],
type: "bar",
orient: "horizontal"
}
]
};
myChart.setOption(option);
window.addEventListener("resize", () => myChart.resize());
}
///////////////////////////////////////////////////////////////
// 담당자별 진척율
///////////////////////////////////////////////////////////////
function drawProgressByAssigneeChart() {
const chartDom = document.getElementById("progressByAssigneeChart");
const myChart = echarts.init(chartDom);
const option = {
/*tooltip: {
trigger: 'axis',
axisPointer: {
type: 'shadow'
},
textStyle: {
color: '#fff'
}
},*/
legend: {
textStyle: {
color: "#fff"
}
},
grid: {
left: "3%",
right: "4%",
bottom: "3%",
containLabel: true
},
xAxis: {
type: "value",
boundaryGap: [0, 0.01],
axisLine: {
lineStyle: {
color: "#fff"
}
},
axisLabel: {
color: "#fff"
}
},
yAxis: {
type: "category",
data: ["TEST2", "TEST3", "TEST4", "TEST5", "TEST6", "TEST7"],
axisLine: {
lineStyle: {
color: "#fff"
}
},
axisLabel: {
color: "#fff"
}
},
series: [
{
name: "실제",
type: "bar",
data: [10, 20, 32, 11, 13, 21]
},
{
name: "계획",
type: "bar",
data: [24, 17, 27, 18, 13, 18]
}
]
};
myChart.setOption(option);
window.addEventListener("resize", () => myChart.resize());
}
////////////////////////////////////////////////////////////////////////////////////////
//리스트 :: DataTable
////////////////////////////////////////////////////////////////////////////////////////
// --- Root, Drive, Folder 데이터 테이블 설정 --- //
function dataTableLoad() {
console.log("dataTableLoad - selectRel:::" + selectedType);
console.log("dataTableLoad - selectId:::" + selectedId);
// 데이터 테이블 컬럼 및 열그룹 구성
var tableName = "T_ARMS_REQADD_" + $("#selected_pdService").val();
var dataTableRef;
if (selectedType !== "folder") {
//select node 정보를 가져온다.
console.log("tableName:: " + tableName);
$.ajax({
url: "/auth-user/api/arms/reqAdd/" + tableName + "/getNode.do?c_id=" + selectedId,
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) {
$("#my_modal").modal("show");
$("#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(2)").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(); //문서로보기
})
.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=" + selectedId;
var jsonRoot = "";
var isServerSide = false;
dataTableRef = dataTable_build(
jquerySelector,
ajaxUrl,
jsonRoot,
columnList,
rowsGroupList,
columnDefList,
selectList,
orderList,
buttonList,
isServerSide
);
}
}
// 데이터 테이블 구성 이후 꼭 구현해야 할 메소드 : 열 클릭시 이벤트
function dataTableClick(tempDataTable, selectedData) {}
// 데이터 테이블 데이터 렌더링 이후 콜백 함수.
function dataTableCallBack(settings, json) {
console.log("데이터테이블콜백");
setDocViewTab();
}
function dataTableDrawCallback(tableInfo) {
$("#" + tableInfo.sInstance)
.DataTable()
.columns.adjust()
.responsive.recalc();
}
////////////////////////////////////////////////////////////////////////////////////////
//상세 보기 탭 & 편집 탭
////////////////////////////////////////////////////////////////////////////////////////
function setEditViewTab() {
console.log("Detail Tab ::::");
var tableName = "T_ARMS_REQADD_" + $("#selected_pdService").val();
$.ajax({
url: "/auth-user/api/arms/reqAdd/" + tableName + "/getNode.do?c_id=" + selectedId,
type: "GET",
contentType: "application/json;charset=UTF-8",
dataType: "json",
progress: true
})
.done(function (data) {
// ------------------ 편집하기 ------------------ //
bindDataEditTab(data);
})
.fail(function (e) {})
.always(function () {});
}
// ------------------ 편집하기 ------------------ //
function bindDataEditTab(ajaxData) {
//제품(서비스) 데이터 바인딩
var selectedPdServiceText = $("#selected_pdService").select2("data")[0].text;
var datepickerOption = {
theme: "dark",
lang: "kr",
format: "Y/m/d",
formatDate: "Y/m/d",
scrollInput: false,
value: null
};
if (isEmpty(selectedPdServiceText)) {
$("#editview_req_pdservice_name").val("");
} else {
$("#editview_req_pdservice_name").val(selectedPdServiceText);
}
$("#editview_req_type").val(ajaxData.c_type);
// 버전 데이터 바인딩
if (!isEmpty(ajaxData.c_req_pdservice_versionset_link)) {
$("#edit_multi_version").multipleSelect("setSelects", JSON.parse(ajaxData.c_req_pdservice_versionset_link));
} else {
$("#edit_multi_version").multipleSelect("uncheckAll");
}
$("#editview_req_id").val(ajaxData.c_id);
$("#editview_req_title").val(ajaxData.c_title);
$("#editview_req_priority").children(".btn.active").removeClass("active");
if (!isEmpty(ajaxData.reqPriorityEntity)) {
var selectReqPriorityID = "editview_req_priority_options" + ajaxData.reqPriorityEntity.c_id;
$("#" + selectReqPriorityID)
.parent()
.addClass("active");
}
$("#editview_req_difficulty").children(".btn.active").removeClass("active");
if (!isEmpty(ajaxData.reqDifficultyEntity)) {
var selectReqDifficultyID = "editview_req_difficulty_options" + ajaxData.reqDifficultyEntity.c_id;
$("#" + selectReqDifficultyID)
.parent()
.addClass("active");
}
$("#editview_req_state input[name='editview_req_state_options']:checked").prop("checked", false);
let stateRadioButtons = $("#editview_req_state input[type='radio']");
stateRadioButtons.each(function () {
if (ajaxData.reqStateEntity && ajaxData.reqStateEntity.c_id == $(this).val()) {
$(this).parent().addClass("active");
$(this).prop("checked", true);
} else {
$(this).prop("checked", false);
}
});
// -------------------- reviewer setting -------------------- //
//reviewer clear
$("#editview_req_reviewers").val(null).trigger("change");
var selectedReviewerArr = [];
if (ajaxData.c_req_reviewer01 == null || ajaxData.c_req_reviewer01 == "none") {
console.log("bindDataEditTab :: ajaxData.c_req_reviewer01 empty");
} else {
selectedReviewerArr.push(ajaxData.c_req_reviewer01);
// Set the value, creating a new option if necessary
if ($("#editview_req_reviewers").find("option[value='" + ajaxData.c_req_reviewer01 + "']").length) {
console.log('option[value=\'" + ajaxData.c_req_reviewer01 + "\']"' + "already exist");
} else {
// Create a DOM Option and pre-select by default
var newOption01 = new Option(ajaxData.c_req_reviewer01, ajaxData.c_req_reviewer01, true, true);
// Append it to the select
$("#editview_req_reviewers").append(newOption01).trigger("change");
}
}
if (ajaxData.c_req_reviewer02 == null || ajaxData.c_req_reviewer02 == "none") {
console.log("bindDataEditTab :: ajaxData.c_req_reviewer02 empty");
} else {
selectedReviewerArr.push(ajaxData.c_req_reviewer02);
// Set the value, creating a new option if necessary
if ($("#editview_req_reviewers").find("option[value='" + ajaxData.c_req_reviewer02 + "']").length) {
console.log('option[value=\'" + ajaxData.c_req_reviewer02 + "\']"' + "already exist");
} else {
// Create a DOM Option and pre-select by default
var newOption02 = new Option(ajaxData.c_req_reviewer02, ajaxData.c_req_reviewer02, true, true);
// Append it to the select
$("#editview_req_reviewers").append(newOption02).trigger("change");
}
}
if (ajaxData.c_req_reviewer03 == null || ajaxData.c_req_reviewer03 == "none") {
console.log("bindDataEditTab :: ajaxData.c_req_reviewer03 empty");
} else {
selectedReviewerArr.push(ajaxData.c_req_reviewer03);
// Set the value, creating a new option if necessary
if ($("#editview_req_reviewers").find("option[value='" + ajaxData.c_req_reviewer03 + "']").length) {
console.log('option[value=\'" + ajaxData.c_req_reviewer03 + "\']"' + "already exist");
} else {
// Create a DOM Option and pre-select by default
var newOption03 = new Option(ajaxData.c_req_reviewer03, ajaxData.c_req_reviewer03, true, true);
// Append it to the select
$("#editview_req_reviewers").append(newOption03).trigger("change");
}
}
if (ajaxData.c_req_reviewer04 == null || ajaxData.c_req_reviewer04 == "none") {
console.log("bindDataEditTab :: ajaxData.c_req_reviewer04 empty");
} else {
selectedReviewerArr.push(ajaxData.c_req_reviewer04);
// Set the value, creating a new option if necessary
if ($("#editview_req_reviewers").find("option[value='" + ajaxData.c_req_reviewer04 + "']").length) {
console.log('option[value=\'" + ajaxData.c_req_reviewer04 + "\']"' + "already exist");
} else {
// Create a DOM Option and pre-select by default
var newOption04 = new Option(ajaxData.c_req_reviewer04, ajaxData.c_req_reviewer04, true, true);
// Append it to the select
$("#editview_req_reviewers").append(newOption04).trigger("change");
}
}
if (ajaxData.c_req_reviewer05 == null || ajaxData.c_req_reviewer05 == "none") {
console.log("bindDataEditTab :: ajaxData.c_req_reviewer05 empty");
} else {
selectedReviewerArr.push(ajaxData.c_req_reviewer05);
// Set the value, creating a new option if necessary
if ($("#editview_req_reviewers").find("option[value='" + ajaxData.c_req_reviewer05 + "']").length) {
console.log('option[value=\'" + ajaxData.c_req_reviewer05 + "\']"' + "already exist");
} else {
// Create a DOM Option and pre-select by default
var newOption05 = new Option(ajaxData.c_req_reviewer05, ajaxData.c_req_reviewer05, true, true);
// Append it to the select
$("#editview_req_reviewers").append(newOption05).trigger("change");
}
}
$("#editview_req_reviewers").val(selectedReviewerArr).trigger("change");
// ------------------------- reviewer end --------------------------------//
$("#editview_req_writer").val(ajaxData.c_req_writer); //ajaxData.c_req_reviewer01
$("#editview_req_write_date").val(new Date(ajaxData.c_req_create_date).toLocaleString());
if (ajaxData.c_req_start_date) {
$("#editview_req_start_date").datetimepicker(
$.extend({}, datepickerOption, { value: new Date(ajaxData.c_req_start_date) })
);
} else {
$("#editview_req_start_date").val(null);
$("#editview_req_start_date").datetimepicker(datepickerOption);
}
if (ajaxData.c_req_end_date) {
$("#editview_req_end_date").datetimepicker(
$.extend({}, datepickerOption, { value: new Date(ajaxData.c_req_end_date) })
);
} else {
$("#editview_req_end_date").val(null);
$("#editview_req_end_date").datetimepicker(datepickerOption);
}
CKEDITOR.instances.edit_tabmodal_editor.setData(ajaxData.c_req_contents);
}
///////////////////////////////////////////////////////////////////////////////
//문서로 보기 탭
///////////////////////////////////////////////////////////////////////////////
function setDocViewTab() {
$(".dd-list").empty();
var data = $("#req_table").DataTable().rows().data().toArray();
let treeData = buildDocTree(data); // 데이터를 계층적 구조로 변환
console.log("setDocViewTab :: doc data -> ");
console.log(treeData);
treeData.forEach((rootNode) => {
$(".dd-list").append(generateDocHTML(rootNode)); // HTML 생성 및 추가
});
}
function buildDocTree(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 = getDocIconHtml(node.c_type);
let html =
"
" + (node.c_contents || "") + "