Index: arms/html/mapping/content-container.html =================================================================== diff -u -rfebc8a28bfbf8457830dd594d1cd38abf9641854 -rca314d094db69ffcf31139ba9ab27e7c09806641 --- arms/html/mapping/content-container.html (.../content-container.html) (revision febc8a28bfbf8457830dd594d1cd38abf9641854) +++ arms/html/mapping/content-container.html (.../content-container.html) (revision ca314d094db69ffcf31139ba9ab27e7c09806641) @@ -45,6 +45,17 @@ -->
+
+
+ +
+
@@ -196,146 +207,6 @@
-
@@ -344,10 +215,13 @@
- -
+ +

+ +
+
+
+ +
+ + + +
+ + +
+
+
+
+ +
+
+ +
+
+
+ + +
+ + + + + + + + - - - \ No newline at end of file +--> \ No newline at end of file Index: arms/js/mapping.js =================================================================== diff -u -r93989ff95a9062ad5337d77673d9ddd3372e13db -rca314d094db69ffcf31139ba9ab27e7c09806641 --- arms/js/mapping.js (.../mapping.js) (revision 93989ff95a9062ad5337d77673d9ddd3372e13db) +++ arms/js/mapping.js (.../mapping.js) (revision ca314d094db69ffcf31139ba9ab27e7c09806641) @@ -92,8 +92,8 @@ "../reference/jquery-plugins/jquery.flowchart-master/jquery.flowchart.js", "https://cdnjs.cloudflare.com/ajax/libs/jquery.panzoom/3.2.2/jquery.panzoom.min.js", "../reference/jquery-plugins/jquery-mousewheel-main/jquery.mousewheel.js",*/ + // "../reference/gojs/go.css", "../reference/gojs/go-debug.js", - "../reference/gojs/go.css", "../arms/js/mapping/gojs_setup.js" ] // 추가적인 플러그인 그룹들을 이곳에 추가하면 됩니다. @@ -365,106 +365,110 @@ console.log('ARMS State List:', arms_state_list); console.log('ALM Status List:', alm_status_list); - let diagram_data = generate_diagram_data(req_state_category_list, arms_state_list, alm_status_list); - gojs.load(diagram_data); + let gojs_mapping_data = generate_gojs_mapping_data(req_state_category_list, arms_state_list, alm_status_list); + gojs.load(gojs_mapping_data); }) .catch((error) => { console.error('Error fetching data:', error); }); } } -function generate_diagram_data(req_state_category_list, arms_state_list, alm_status_list) { +function generate_gojs_mapping_data(req_state_category_list, arms_state_list, alm_status_list) { const node_data_array = []; const link_data_array = []; - const categoryX = 0; - const armsX = 300; - const almX = 600; + const category_x_position = 0; + const arms_state_x_position = 300; + const alm_status_x_position = 600; - const ySpacing = 40; - const categoryySpacing = 100; + const y_spacing = 40; + const category_y_spacing = 100; - // Keep track of Y positions for each depth - let categoryY = 0; - let armsY = 0; - let almY = 0; + let category_y_position = 0; + let arms_state_y_position = 0; + let alm_status_y_position = 0; - const categoryNodes = {}; - const armsNodes = {}; + const category_nodes = {}; + const arms_state_nodes = {}; Object.entries(req_state_category_list).forEach(([key, value]) => { - const categoryNodeKey = `카테고리 ${value}`; + const category_type = "arms-category"; + const category_node_key = category_type+ "-"+key; const node = { - key: categoryNodeKey, + key: category_node_key, text: `카테고리 ${value}`, - type: 'arms-category', + type: category_type, c_id: key, category: 'Loading', - loc: `${categoryX} ${categoryY}` + loc: `${category_x_position} ${category_y_position}` }; + node_data_array.push(node); - categoryNodes[key] = node; - categoryY += categoryySpacing; + category_nodes[key] = node; + category_y_position += category_y_spacing; }); arms_state_list.forEach((state) => { - const armsNodeKey = `A-RMS ${state.c_title}`; + const arms_state_type = "arms-state"; + const arms_node_key = arms_state_type+"-"+state.c_id; const node = { - key: armsNodeKey, + key: arms_node_key, text: `A-RMS ${state.c_title}`, - type: 'arms-state', + type: arms_state_type, c_id: state.c_id, mapping_id: state.c_etc, category: 'NoAdd', - loc: `${armsX} ${armsY}` + loc: `${arms_state_x_position} ${arms_state_y_position}` }; node_data_array.push(node); - armsNodes[state.c_id] = node; - armsY += ySpacing; + arms_state_nodes[state.c_id] = node; + arms_state_y_position += y_spacing; }); alm_status_list.forEach((status) => { - const almNodeKey = `ALM ${status.c_issue_status_name}`; + const alm_status_type = "alm-status"; + const alm_node_key = alm_status_type + "-" + status.c_id; const node = { - key: almNodeKey, + key: alm_node_key, text: `ALM ${status.c_issue_status_name}`, - type: 'alm-status', + type: alm_status_type, c_id: status.c_id, mapping_id: status.c_req_state_mapping_link, category: 'End', - loc: `${almX} ${almY}` + loc: `${alm_status_x_position} ${alm_status_y_position}` }; + node_data_array.push(node); - almY += ySpacing; + alm_status_y_position += y_spacing; }); // 링크 데이터 생성 node_data_array.forEach((node) => { if (node.type === 'arms-state' && node.mapping_id) { - const fromNode = categoryNodes[node.mapping_id]; + const fromNode = category_nodes[node.mapping_id]; if (fromNode) { - link_data_array.push({ from: fromNode.key, to: node.key }); + link_data_array.push({ from: fromNode.key, to: node.key, fromNode: fromNode, toNode: node }); } } else if (node.type === 'alm-status' && node.mapping_id) { - const fromNode = armsNodes[node.mapping_id]; + const fromNode = arms_state_nodes[node.mapping_id]; if (fromNode) { - link_data_array.push({ from: fromNode.key, to: node.key }); + link_data_array.push({ from: fromNode.key, to: node.key, fromNode: fromNode, toNode: node }); } } }); - const sortedArmsNodes = Object.values(armsNodes).sort((a, b) => { + const sorted_arms_state_nodes = Object.values(arms_state_nodes).sort((a, b) => { const mappingA = a.mapping_id || "9999"; const mappingB = b.mapping_id || "9999"; // mapping_id를 기준으로 오름차순 정렬 return mappingA.localeCompare(mappingB); }); - armsY = 0; - sortedArmsNodes.forEach(node => { - node.loc = `${armsX} ${armsY}`; - armsY += ySpacing; + arms_state_y_position = 0; + sorted_arms_state_nodes.forEach(node => { + node.loc = `${arms_state_x_position} ${arms_state_y_position}`; + arms_state_y_position += y_spacing; }); return { @@ -794,13 +798,13 @@ statusCode: { 200: function () { jSuccess('"' + state_name + '"' + " 상태가 생성되었습니다."); - let active_tab_name = getActiveTab(); +/* let active_tab_name = getActiveTab(); if (active_tab_name === "#board") { setKanban(); } else if (active_tab_name === "#table") { dataTableLoad(); - } + }*/ $("#close_modal_popup").trigger("click"); } @@ -837,13 +841,13 @@ statusCode: { 200: function () { jSuccess('"' + state_name + '"' + " 상태가 수정되었습니다."); - let active_tab_name = getActiveTab(); +/* let active_tab_name = getActiveTab(); if (active_tab_name === "#board") { setKanban(); } else if (active_tab_name === "#table") { dataTableLoad(); - } + }*/ $("#close_modal_popup").trigger("click"); } @@ -873,13 +877,13 @@ statusCode: { 200: function () { jSuccess('"' + state_name + '"' + " 상태가 삭제되었습니다."); - let active_tab_name = getActiveTab(); +/* let active_tab_name = getActiveTab(); if (active_tab_name === "#board") { setKanban(); } else if (active_tab_name === "#table") { dataTableLoad(); - } + }*/ $("#close_modal_popup").trigger("click"); } @@ -1541,191 +1545,4 @@ let $container = $("#flow_chart_container"); $flowchart.flowchart('setData', newData); } - - -// mapping_id를 기준으로 노드의 키를 찾는 함수 -function find_category_mapping_id(node_data_array, mappingId) { - const node = node_data_array.find(node => node.type === "arms-category" && node.c_id === mappingId); - return node ? node.key : null; -} - -function find_arms_state_mapping_id(node_data_array, mappingId) { - const node = node_data_array.find(node => node.type === "arms-state" && node.c_id === mappingId); - return node ? node.key : null; -} -function generate_node_and_link_data(req_state_category_list, arms_state_list, alm_status_list) { - const node_data_array = []; - const link_data_array = []; - - const categoryX = 0; - const armsX = 300; - const almX = 600; - - const ySpacing = 40; - - // Keep track of Y positions for each depth - let categoryY = 0; - let armsY = 0; - let almY = 0; - - // 카테고리 열림, 진행중, 해결됨, 닫힘 노드 생성 - Object.entries(req_state_category_list).forEach(([key, value]) => { - const categoryNodeKey = `카테고리 ${value}`; - node_data_array.push({ - key: categoryNodeKey, - text: `카테고리 ${value}`, - type: 'arms-category', - c_id: key, - category: 'Loading', - loc: `${categoryX} ${categoryY}` - }); - categoryY += ySpacing; - }); - - // A-RMS OPEN, PROGRESS, RESOLVED, CLOSED 노드 생성 - arms_state_list.forEach((state) => { - const armsNodeKey = `A-RMS ${state.c_title}`; - node_data_array.push({ - key: armsNodeKey, - text: `A-RMS ${state.c_title}`, - type: 'arms-state', - c_id: state.c_id, - mapping_id: state.c_etc, - category: 'NoAdd', - loc: `${armsX} ${armsY}` - }); - armsY += ySpacing; - }); - - // ALM 열림, 진행중, 해결됨, 닫힘 노드 생성 - alm_status_list.forEach((status) => { - const almNodeKey = `ALM ${status.c_issue_status_name}`; - node_data_array.push({ - key: almNodeKey, - text: `ALM ${status.c_issue_status_name}`, - type: 'alm-status', - c_id: status.c_id, - mapping_id: status.c_req_state_mapping_link, - category: 'End', - loc: `${almX} ${almY}` - }); - almY += ySpacing; - }); - - // 링크 데이터 생성 - node_data_array.forEach((node) => { - if (node.type === 'arms-state' && node.mapping_id) { - const fromNode = node_data_array.find(n => n.c_id === node.mapping_id); - if (fromNode) { - link_data_array.push({ from: fromNode.key, to: node.key }); - } - } else if (node.type === 'alm-status' && node.mapping_id) { - const fromNode = node_data_array.find(n => n.c_id === node.mapping_id); - if (fromNode) { - link_data_array.push({ from: fromNode.key, to: node.key }); - } - } - }); - - return { - class: 'GraphLinksModel', - nodeDataArray: node_data_array, - linkDataArray: link_data_array - }; -} - -function generate_node_and_link_data(req_state_category_list, arms_state_list, alm_status_list) { - const node_data_array = []; - const link_data_array = []; - const armsNodeMap = new Map(); - - // 카테고리 열림, 진행중, 해결됨, 닫힘 노드 생성 - Object.entries(req_state_category_list).forEach(([key, value], index) => { - const categoryNodeKey = `카테고리 ${value}`; - node_data_array.push({ - key: categoryNodeKey, - text: `카테고리 ${value}`, - type: 'arms-category', - c_id: key, - category: 'Loading', - loc: `0 ${40 + index * 40}` - }); - - // A-RMS 노드 생성 및 연결 - arms_state_list.forEach((state, armsIndex) => { - if (state.c_etc === key) { - const armsNodeKey = `A-RMS ${state.c_title}`; - armsNodeMap.set(state.c_id, armsNodeKey); - node_data_array.push({ - key: armsNodeKey, - text: `A-RMS ${state.c_title}`, - type: 'arms-state', - c_id: state.c_id, - mapping_id: state.c_etc, - category: 'NoAdd', - loc: `300 ${40 + armsIndex * 40}` - }); - - // 링크 생성 - link_data_array.push({ from: categoryNodeKey, to: armsNodeKey }); - } - }); - }); - - // A-RMS 노드 생성 및 연결 - arms_state_list.forEach((state, armsIndex) => { - const armsNodeKey = `A-RMS ${state.c_title}`; - if (!armsNodeMap.has(state.c_id)) { - node_data_array.push({ - key: armsNodeKey, - text: `A-RMS ${state.c_title}`, - type: 'arms-state', - c_id: state.c_id, - mapping_id: state.c_etc, - category: 'NoAdd', - loc: `300 ${40 + armsIndex * 40}` - }); - } - - // ALM 노드 생성 및 연결 - alm_status_list.forEach((status, almIndex) => { - if (status.c_req_state_mapping_link === state.c_id) { - const almNodeKey = `ALM ${status.c_issue_status_name}`; - node_data_array.push({ - key: almNodeKey, - text: `ALM ${status.c_issue_status_name}`, - type: 'alm-status', - c_id: status.c_id, - mapping_id: status.c_req_state_mapping_link, - category: 'End', - loc: `600 ${40 + almIndex * 40}` - }); - - // 링크 생성 - link_data_array.push({ from: armsNodeKey, to: almNodeKey }); - } - }); - }); - - // ALM 노드 생성 - alm_status_list.forEach((status, almIndex) => { - const almNodeKey = `ALM ${status.c_issue_status_name}`; - if (!node_data_array.some(node => node.key === almNodeKey)) { - node_data_array.push({ - key: almNodeKey, - text: `ALM ${status.c_issue_status_name}`, - type: 'alm-status', - c_id: status.c_id, - mapping_id: status.c_req_state_mapping_link, - category: 'End', - loc: `600 ${40 + almIndex * 40}` - }); - } - }); - - return { - class: 'GraphLinksModel', - nodeDataArray: node_data_array, - linkDataArray: link_data_array - }; -}*/ \ No newline at end of file +*/ \ No newline at end of file Index: arms/js/mapping/gojs_setup.js =================================================================== diff -u -rfebc8a28bfbf8457830dd594d1cd38abf9641854 -rca314d094db69ffcf31139ba9ab27e7c09806641 --- arms/js/mapping/gojs_setup.js (.../gojs_setup.js) (revision febc8a28bfbf8457830dd594d1cd38abf9641854) +++ arms/js/mapping/gojs_setup.js (.../gojs_setup.js) (revision ca314d094db69ffcf31139ba9ab27e7c09806641) @@ -21,7 +21,7 @@ // when the document is modified, add a "*" to the title and enable the "Save" button myDiagram.addDiagramListener('Modified', (e) => { - const button = document.getElementById('SaveButton'); + const button = document.getElementById('mapping_save_button'); if (button) button.disabled = !myDiagram.isModified; const idx = document.title.indexOf('*'); if (myDiagram.isModified) { @@ -197,7 +197,7 @@ const fromData = fromNode.data; const category = fromData.category; const c_id = fromData.c_id; - alert(c_id); + const type = fromData.type; if (category === 'NoAdd') { // 중간 노드의 경우 ALM 상태의 Node는 생성 못하도록 처리 @@ -208,10 +208,29 @@ // create a new "State" data object, positioned off to the right of the fromNode const p = fromNode.location.copy(); p.x += diagram.toolManager.draggingTool.gridSnapCellSize.width; - const toData = { +/* const toData = { text: 'new', loc: go.Point.stringify(p), - }; + };*/ + + let toData; + + if (type === 'arms-category') { + toData = { + key: 'arms-state-' + (diagram.model.nodeDataArray.length + 1), + text: 'new', + type: 'arms-state', + mapping_id: fromData.c_id, + category: 'NoAdd', + loc: go.Point.stringify(p), + }; + } else { + toData = { + text: 'new', + loc: go.Point.stringify(p), + }; + } + // add the new node data to the model const model = diagram.model; model.addNodeData(toData); @@ -389,11 +408,33 @@ function save() { let data = myDiagram.model.toJson(); console.log(data); + let jsonData = JSON.parse(data); + decodeObject(jsonData); + console.log(jsonData); - document.getElementById('mySavedModel').value = myDiagram.model.toJson(); + document.getElementById('mySavedModel').value = JSON.stringify(jsonData, null, 2); myDiagram.isModified = false; } + function isEncoded(str) { + try { + return str !== decodeURIComponent(str); + } catch (e) { + return false; + } + } + + // 객체의 모든 문자열을 디코딩하는 재귀 함수 + function decodeObject(obj) { + for (let key in obj) { + if (typeof obj[key] === 'string' && isEncoded(obj[key])) { + obj[key] = decodeURIComponent(obj[key]); + } else if (typeof obj[key] === 'object') { + decodeObject(obj[key]); + } + } + } + function load(data) { // let data = document.getElementById('mySavedModel').value;