Index: arms/html/reqAdd/content-container.html
===================================================================
diff -u -r6838beea00e7485c7171672bd320c843c8955696 -r098142f229be4ad927e823c43111cfcce052dfd9
--- arms/html/reqAdd/content-container.html (.../content-container.html) (revision 6838beea00e7485c7171672bd320c843c8955696)
+++ arms/html/reqAdd/content-container.html (.../content-container.html) (revision 098142f229be4ad927e823c43111cfcce052dfd9)
@@ -1811,7 +1811,8 @@
Index: arms/js/reqAdd.js
===================================================================
diff -u -r6838beea00e7485c7171672bd320c843c8955696 -r098142f229be4ad927e823c43111cfcce052dfd9
--- arms/js/reqAdd.js (.../reqAdd.js) (revision 6838beea00e7485c7171672bd320c843c8955696)
+++ arms/js/reqAdd.js (.../reqAdd.js) (revision 098142f229be4ad927e823c43111cfcce052dfd9)
@@ -1765,6 +1765,24 @@
}
});
},
+ onGetReqAssignee: async function (id) {
+ return await $.ajax({
+ url: `/auth-user/api/arms/reqAdd/getRequirementAssignee.do?c_id=${id}`,
+ type: "GET",
+ dataType: "json",
+ progress: true,
+ statusCode: {
+ 200: function (data) {
+ if (!isEmpty(data)) {
+ return data.response;
+ }
+ }
+ },
+ error: function (e) {
+ jError("버전 조회 중 에러가 발생했습니다.");
+ }
+ });
+ },
onGetData: async function (id) {
return await $.ajax({
url: `/auth-user/api/arms/reqAdd/T_ARMS_REQADD_${id}/getMonitor.do`,
Index: arms/js/reqAddTable.js
===================================================================
diff -u -r76fe4a43129743fbf226b02c2c7ee3317c471a71 -r098142f229be4ad927e823c43111cfcce052dfd9
--- arms/js/reqAddTable.js (.../reqAddTable.js) (revision 76fe4a43129743fbf226b02c2c7ee3317c471a71)
+++ arms/js/reqAddTable.js (.../reqAddTable.js) (revision 098142f229be4ad927e823c43111cfcce052dfd9)
@@ -9,8 +9,7 @@
const ContentType = {
normal: {
version: "버전",
- category: "구분",
- writer: "요구사항 작성자",
+ assignee: "요구사항 담당자",
depth1: "Depth 1",
depth2: "Depth 2",
depth3: "Depth 3",
@@ -24,7 +23,7 @@
},
version: {
version: "버전",
- writer: "요구사항 작성자",
+ assignee: "요구사항 담당자",
depth1: "Depth 1",
content: "요구사항 제목",
open: "열림",
@@ -34,7 +33,7 @@
statusTotal: "총계"
},
owner: {
- writer: "요구사항 작성자",
+ assignee: "요구사항 담당자",
version: "버전",
depth1: "Depth 1",
content: "요구사항 제목",
@@ -154,6 +153,7 @@
c_parentid,
c_title,
c_req_writer,
+ assignee,
c_req_contents,
reqStateEntity,
reqPriorityEntity,
@@ -169,11 +169,13 @@
const versions = (c_req_pdservice_versionset_link !== null) ? JSON.parse(c_req_pdservice_versionset_link) : [];
versions.forEach((vid) => {
+ const assigneeNames = assignee.length > 0 ? assignee.map(a => a.담당자_이름).join(', ') : "담당자 미배정";
+
acc.push({
version: getVersionTitle(vid),
id: c_id,
category: CategoryName[c_type],
- writer: c_type !== "folder" ? getReqWriterName(c_req_writer) : "",
+ assignee: assigneeNames ,
status: c_type !== "folder" ? reqStateEntity?.data ?? "" : "",
...Object.assign({ depth1: "", depth2: "", depth3: "" }, setDepth(data, c_parentid, [c_title])),
content: c_title,
@@ -201,6 +203,7 @@
c_parentid,
c_title,
c_req_writer,
+ assignee,
c_req_contents,
reqStateEntity,
reqPriorityEntity,
@@ -213,28 +216,53 @@
} = cur;
if (cur.c_parentid < 2) return acc;
- const versions = c_req_pdservice_versionset_link ? JSON.parse(c_req_pdservice_versionset_link) : [""];
+ if (assignee.length === 0) { // 담당자 데이터가 없는 경우 처리
+ const versions = c_req_pdservice_versionset_link ? JSON.parse(c_req_pdservice_versionset_link) : [""];
+ versions.forEach((version) => {
+ acc.push({
+ id: c_id,
+ version: version,
+ assignee: "담당자 미배정",
+ _assignee: "담당자 미배정",
+ open: reqStateEntity?.c_id === 10 ? 1 : "",
+ investigation: reqStateEntity?.c_id === 11 ? 1 : "",
+ resolved: reqStateEntity?.c_id === 12 ? 1 : "",
+ closeStatus: reqStateEntity?.c_id === 13 ? 1 : "",
+ statusTotal: "",
+ ...Object.assign({ depth1: "", depth2: "", depth3: "" }, setDepth(data, c_parentid, [c_title])),
+ content: c_title,
+ origin: cur,
+ c_parentid: c_parentid
+ });
+ });
- // 각 버전별로 데이터 생성
- versions.forEach((version) => {
- acc.push({
- id: c_id,
- version: version,
- writer: getReqWriterName(c_req_writer),
- _writer: c_req_writer,
- open: reqStateEntity?.c_id === 10 ? 1 : "",
- investigation: reqStateEntity?.c_id === 11 ? 1 : "",
- resolved: reqStateEntity?.c_id === 12 ? 1 : "",
- closeStatus: reqStateEntity?.c_id === 13 ? 1 : "",
- statusTotal: "",
- ...Object.assign({ depth1: "", depth2: "", depth3: "" }, setDepth(data, c_parentid, [c_title])),
- content: c_title,
- origin: cur,
- c_parentid: c_parentid
- });
- });
- return acc;
- }, []);
+ }else{
+ assignee.forEach(({ 담당자_아이디, 담당자_이름 }) => { // 담당자 별로 데이터 생성
+ const versions = c_req_pdservice_versionset_link ? JSON.parse(c_req_pdservice_versionset_link) : [""];
+ versions.forEach((version) => {// 각 버전별로 데이터 생성
+ acc.push({
+ id: c_id,
+ version: version,
+ assignee: 담당자_이름, //getReqWriterName(c_req_writer),
+ _assignee: 담당자_아이디,
+ open: reqStateEntity?.c_id === 10 ? 1 : "",
+ investigation: reqStateEntity?.c_id === 11 ? 1 : "",
+ resolved: reqStateEntity?.c_id === 12 ? 1 : "",
+ closeStatus: reqStateEntity?.c_id === 13 ? 1 : "",
+ statusTotal: "",
+ ...Object.assign({ depth1: "", depth2: "", depth3: "" }, setDepth(data, c_parentid, [c_title])),
+ content: c_title,
+ origin: cur,
+ c_parentid: c_parentid
+ });
+ });
+ });
+ }
+
+
+
+ return acc;
+ }, []);
};
const rearrangement = (
arr,
@@ -273,10 +301,10 @@
const filterItems = pivotTableData
.filter((item) => item.origin && item.origin.attr && item.origin.attr.rel !== "folder") // 폴더 제거
.filter((item) => item.version?.includes(`${version.c_id}`))
- .sort((a, b) => a.writer?.localeCompare(b.writer) ||
+ .sort((a, b) => a.assignee?.localeCompare(b.assignee) ||
a.c_parentid - b.c_parentid); // 데이터 정렬
- const childrenItem = rearrangement(filterItems, "writer", "writer", {
+ const childrenItem = rearrangement(filterItems, "assignee", "assignee", {
version: version.c_title,
_version: version.c_id
}).reduce((acc, cur) => {
@@ -287,8 +315,8 @@
children: cur.slice(1, cur.length),
lastChild: {
_version: version.c_id,
- writer: `${cur[0].writer} 총계`,
- _writer: cur[0].writer,
+ assignee: `${cur[0].assignee} 총계`,
+ _assignee: cur[0]._assignee,
col: 1,
colSpan: 3,
node:"leaf",
@@ -316,22 +344,23 @@
// Task Owner
const 모든_요구사항데이터 = pivotTableData
.filter((item) => item.origin && item.origin.attr && item.origin.attr.rel !== "folder") // 폴더 제외(요구사항만 포함)
- .flatMap((task) =>
- task.version.reduce((acc, cur) => {
- const versionItem = versionList.find((item) => item.c_id === Number(cur));
- return [...acc, { ...task, _version: versionItem.c_id, version: versionItem.c_title }];
- }, [])
- )
- .sort((a, b) => a.writer?.localeCompare(b.writer) ||
+ .flatMap(task => {
+ const versions = Array.isArray(task.version) ? task.version : [task.version];
+ return versions.reduce((acc, cur) => {
+ const versionItem = versionList.find(item => item.c_id === Number(cur));
+ return [...acc, { ...task, _version: versionItem.c_id, version: versionItem.c_title }];
+ }, []);
+ })
+ .sort((a, b) => a.assignee?.localeCompare(b.assignee) ||
a._version - b._version ||
a.c_parentid - b.c_parentid); // 데이터 정렬
- return rearrangement(모든_요구사항데이터, "writer", "writer").map((group) => ({
- writer: `${group[0].writer} 총계`,
- _writer: group[0].writer,
+ return rearrangement(모든_요구사항데이터, "assignee", "assignee").map((group) => ({
+ assignee: `${group[0].assignee} 총계`,
+ _assignee: group[0]._assignee,
col: 0,
colSpan: 4,
- root: "writer",
+ root: "assignee",
node:"root",
children: rearrangement(group, "version", "version").reduce((acc, cur) => {
return [
@@ -340,8 +369,8 @@
...cur[0],
children: cur.slice(1, cur.length),
lastChild: {
- writer: `${cur[0].version} 총계`,
- _writer: group[0].writer,
+ assignee: `${cur[0].version}의 총계`,
+ _assignee: group[0]._assignee,
col: 1,
colSpan: 3,
...calcStatus(cur)
@@ -413,10 +442,11 @@
let selector;
if(data.node === "root"){
selector = `[data-${data.root}="${data[`_${[data.root]}`]}"]`;
+
}else{
- const writer = `[data-writer="${data._writer}"]`;
+ const assignee = `[data-assignee="${data._assignee}"]`;
const version = `[data-version="${data._version}"]`;
- selector = `${writer}${version}`;
+ selector = `${assignee}${version}`;
}
const elements = document.querySelectorAll(selector);
if (data.node === "root") {
@@ -522,14 +552,14 @@
const $tr = this.makeElement("tr");
$tr.setAttribute("data-id", cur.id ?? "");
$tr.setAttribute("data-version", cur._version ?? "");
- $tr.setAttribute("data-writer", cur._writer ?? "");
+ $tr.setAttribute("data-assignee", cur._assignee ?? "");
const radioButtonName = `status_${cur.id}`;
Object.keys(ContentType[pivotType]).forEach((key, index) => {
const $col = this.makeElement(tag);
$col.className = key;
- if(['content'].includes($col.className)){
+ if(['content'].includes($col.className) && tag === "tr"){
$col.prepend(this.makeEditableButton(cur, key));
}else if (cur[key]) {
$col.innerHTML = cur[key];
@@ -551,7 +581,7 @@
if (cur.colSpan) {
$tr.classList.add("highlight");
if (pivotType === "version"){
- $tr.removeAttribute('data-writer');
+ $tr.removeAttribute('data-assignee');
}
}else{
if(['open', 'investigation', 'resolved', 'closeStatus'].includes($col.className)){
@@ -561,6 +591,10 @@
}
+ if (['assignee'].includes($col.className) && $col.innerHTML === "담당자 미배정") {
+ $col.style.color = "red";
+ }
+
if (cur.root === key) {
$col.prepend(this.makePivotButton($tr, cur));
$col.classList.add("root");
@@ -601,6 +635,11 @@
$col.innerHTML = cur[key];
}
+ // 담당자 미지정일 경우 빨간색으로 표시
+ if (['assignee'].includes($col.className) && $col.innerHTML === "담당자 미배정") {
+ $col.style.color = "red";
+ }
+
$tr.appendChild($col);
});
@@ -753,7 +792,7 @@
bindHeadEvent($el) {
$el.addEventListener("click", (e) => {
- !["writer", "depth1", "depth2", "depth3", "content"].includes(e.target.className) &&
+ !["assignee", "depth1", "depth2", "depth3", "content"].includes(e.target.className) &&
this.handleSorting(e, e.target.classList.item(0));
});
}
@@ -762,7 +801,7 @@
$el.addEventListener("click", (e) => {
const { tagName, classList, parentElement } = e.target;
- const $writer = this.getElement(e.target, "TD", "writer");
+ const $assignee = this.getElement(e.target, "TD", "assignee");
const $content = this.getElement(e.target, "TD", "content");
const $progress = this.getElement(e.target, "TD", "progress");
const $createDate = this.getElement(e.target, "TD", "createDate");
@@ -835,11 +874,15 @@
const makeReqTable = async (options) => {
tableOptions = options;
const data = await tableOptions.onGetVersion(tableOptions.id);
+ const assigneeData =await tableOptions.onGetReqAssignee(tableOptions.id);
+ const assigneeResponse = assigneeData.response;
res = await tableOptions.onGetData(tableOptions.id);
+ res = mergeData(res,assigneeResponse);
versionList = data.response.sort((a, b) => a.c_id - b.c_id);
tableData = mapperTableData([...res]);
pivotTableData = mapperPivotTableData([...res]);
+
TableInstance = new Table();
TableInstance.rendering();
@@ -850,3 +893,10 @@
TableInstance.rerenderTable();
tableSelect(tableOptions.id);
};
+
+const mergeData = (res, assigneeResponse) =>{
+ return res.map(res => {
+ const matchedAssignees = assigneeResponse.filter(assignee => assignee.요구사항_아이디 == res.c_id);
+ return { ...res, assignee: matchedAssignees };
+ });
+}