diff --git a/.playwright-mcp/structure_popup_main.png b/.playwright-mcp/structure_popup_main.png new file mode 100644 index 0000000..d398cfc Binary files /dev/null and b/.playwright-mcp/structure_popup_main.png differ diff --git a/WebContent/WEB-INF/view/partMng/structurePopupCenter.jsp b/WebContent/WEB-INF/view/partMng/structurePopupCenter.jsp index 8f0b59d..69748c1 100644 --- a/WebContent/WEB-INF/view/partMng/structurePopupCenter.jsp +++ b/WebContent/WEB-INF/view/partMng/structurePopupCenter.jsp @@ -14,70 +14,82 @@ $(function(){ //Part 연결 $("#moveLeft").click(function(){ - var rightPartArr = $(".partChks:checked", parent.frames['rightFrame'].document); + // Tabulator에서 선택된 오른쪽 행 데이터 가져오기 + var rightFrame = parent.frames['rightFrame']; + var rightSelectedRows = rightFrame.getSelectedRows ? rightFrame.getSelectedRows() : []; - // Tabulator에서 선택된 행 데이터 가져오기 - var leftPartNoObj = $("input[name=checkedPartNo]:checked", parent.frames['leftFrame'].document); - - if(leftPartNoObj.length === 0){ - // Tabulator 방식: 라디오가 선택되지 않았을 수 있으므로 체크 - var leftPartChildObjId = null; - var leftPartNo = null; - var leftPartNoQty = null; - var leftParentObjId = null; - var leftPartLastObjId = null; - var leftQtyParObjId = null; - } else { - var leftPartChildObjId = leftPartNoObj.val(); - var leftPartNo = leftPartNoObj.attr("data-PART_NO"); - var leftPartNoQty = leftPartNoObj.attr("data-PART_NO_QTY"); - var leftParentObjId = leftPartNoObj.attr("data-OBJID"); - var leftPartLastObjId = leftPartNoObj.attr("data-LAST_PART_OBJID"); - var leftQtyParObjId = leftPartNoObj.attr("data-PART_OBJID"); + if(rightSelectedRows.length === 0) { + alert("선택된 파트가 없습니다."); + return false; } - //같은 Part를 연결한건지 체크 + // 왼쪽 프레임에서 선택된 행 데이터 가져오기 + var leftPartNoObj = $("input[name=checkedPartNo]:checked", parent.frames['leftFrame'].document); + + var leftPartChildObjId = null; + var leftPartNo = null; + var leftPartNoQty = null; + var leftParentObjId = null; + var leftPartLastObjId = null; + var leftQtyParObjId = null; + var leftParentParts = ""; + + if(leftPartNoObj.length > 0) { + leftPartChildObjId = leftPartNoObj.val(); + leftPartNo = leftPartNoObj.attr("data-PART_NO"); + leftPartNoQty = leftPartNoObj.attr("data-PART_NO_QTY"); + leftParentObjId = leftPartNoObj.attr("data-OBJID"); + leftPartLastObjId = leftPartNoObj.attr("data-LAST_PART_OBJID"); + leftQtyParObjId = leftPartNoObj.attr("data-PART_OBJID"); + leftParentParts = leftPartNoObj.attr("data-PARENT_PARTS") || ""; + } + + // 같은 Part를 연결한건지 체크 var isSamePart = false; - $(rightPartArr).each(function(i){ - var rightPartNo = $(this).val(); + for(var i = 0; i < rightSelectedRows.length; i++){ + var rowData = rightSelectedRows[i].getData(); + var rightPartNo = rowData.PART_NO; if(rightPartNo == leftPartNo){ alert("오류 Part No : ["+rightPartNo+"]\n같은 Part No끼리 연결할 수 없습니다."); isSamePart = true; + break; } - }); + } if(isSamePart) return false; - //연결하려는 part가 상위에 있는 part인지 확인. - var leftParentParts = $("input[name=checkedPartNo]:checked", parent.frames['leftFrame'].document).attr("data-PARENT_PARTS"); + // 연결하려는 part가 상위에 있는 part인지 확인 var deniedPartArr = []; if(fnc_checkNull(leftParentParts).indexOf(",") > 0){ deniedPartArr = leftParentParts.split(","); } var isDeniedPart = false; - $(rightPartArr).each(function(i){ - var rightPartNo = $(this).val(); - var rightPartType = $(this).attr("data-PART_TYPE"); + for(var i = 0; i < rightSelectedRows.length; i++){ + var rowData = rightSelectedRows[i].getData(); + var rightPartNo = rowData.PART_NO; + var rightPartType = rowData.PART_TYPE; if("unique" == rightPartType){ - for(var i = 0 ; i < deniedPartArr.length ; i++){ - if(rightPartNo == deniedPartArr[i]){ + for(var j = 0 ; j < deniedPartArr.length ; j++){ + if(rightPartNo == deniedPartArr[j]){ alert("오류 Part No : "+"["+rightPartNo+"]\n이미 상위에 등록된 Part No 입니다."); isDeniedPart = true; - return; + break; } } + if(isDeniedPart) break; } - }); + } if(isDeniedPart) return; - //연결하려는 part가 상위에 있는 part인지 확인. end + // 선택된 파트의 OBJID 배열 생성 var rightCheckedArr = []; - $(rightPartArr).each(function(i){ - rightCheckedArr.push($(this).val()); - }); + for(var i = 0; i < rightSelectedRows.length; i++){ + var rowData = rightSelectedRows[i].getData(); + rightCheckedArr.push(rowData.OBJID); + } if(fnc_checkNull(leftPartNo) == ""){ var flag = fn_checkSameTopPartNo(rightCheckedArr); @@ -87,7 +99,7 @@ $(function(){ } } - fn_relatePartInfo(leftPartNoObj.val(), rightCheckedArr, leftPartNoQty, leftPartLastObjId, leftPartChildObjId, leftQtyParObjId); + fn_relatePartInfo(leftPartChildObjId, rightCheckedArr, leftPartNoQty, leftPartLastObjId, leftPartChildObjId, leftQtyParObjId); }); //end of Part 연결 @@ -107,36 +119,43 @@ $(function(){ //연결된 part 변경 $("#moveChange").click(function(){ var leftPartNoList = $("input[name=checkedPartNo]:checked", parent.frames['leftFrame'].document); - var leftPartNo = $("input[name=checkedPartNo]:checked", parent.frames['leftFrame'].document).attr("data-PART_NO"); - var leftPartObjid = $("input[name=checkedPartNo]:checked", parent.frames['leftFrame'].document).attr("data-BOM_LAST_PART_OBJID"); - var leftParentPartObjid = $("input[name=checkedPartNo]:checked", parent.frames['leftFrame'].document).attr("data-PARENT_PART_NO"); - var rightPartNoList = $(".partChks:checked", parent.frames['rightFrame'].document); - var rightPartNo = $(".partChks:checked", parent.frames['rightFrame'].document).attr("data-PART_NO"); - var rightPartRev = $(".partChks:checked", parent.frames['rightFrame'].document).attr("data-PART_REV"); - var leftPartChildObjId = leftPartNoList.val(); - //var leftPartNoQty = $("input[name=checkedPartNo]:checked", parent.frames['leftFrame'].document).attr("data-PART_NO_QTY"); - - //alert("leftPartObjid::"+leftPartObjid); - var leftPartBomQtyObjId = $("input[name=checkedPartNo]:checked", parent.frames['leftFrame'].document).attr("data-OBJID"); - - if(0 == leftPartNoList.length){ + if(leftPartNoList.length === 0){ alert("선택된 파트가 없습니다."); return false; - }else if(1 == leftPartNoList.length){ - if(0 == rightPartNoList.length){ - alert("선택된 파트가 없습니다."); - return false; - }else if(1 == rightPartNoList.length){ - fn_changeRelatePartInfo(leftPartBomQtyObjId,rightPartNoList.val(),leftPartNoList.val(),leftParentPartObjid,leftPartChildObjId,leftPartObjid,rightPartNo,rightPartRev); - }else{ - alert("한번에 1개의 파트만 변경가능합니다."); - return false; - } - }else{ + } + + if(leftPartNoList.length > 1){ alert("한번에 1개의 파트만 변경가능합니다."); return false; } + + var leftPartNo = leftPartNoList.attr("data-PART_NO"); + var leftPartObjid = leftPartNoList.attr("data-BOM_LAST_PART_OBJID"); + var leftParentPartObjid = leftPartNoList.attr("data-PARENT_PART_NO"); + var leftPartChildObjId = leftPartNoList.val(); + var leftPartBomQtyObjId = leftPartNoList.attr("data-OBJID"); + + // Tabulator에서 선택된 오른쪽 행 데이터 가져오기 + var rightFrame = parent.frames['rightFrame']; + var rightSelectedRows = rightFrame.getSelectedRows ? rightFrame.getSelectedRows() : []; + + if(rightSelectedRows.length === 0){ + alert("선택된 파트가 없습니다."); + return false; + } + + if(rightSelectedRows.length > 1){ + alert("한번에 1개의 파트만 변경가능합니다."); + return false; + } + + var rightRowData = rightSelectedRows[0].getData(); + var rightPartNo = rightRowData.PART_NO; + var rightPartRev = rightRowData.REVISION || ""; + var rightObjId = rightRowData.OBJID; + + fn_changeRelatePartInfo(leftPartBomQtyObjId, rightObjId, leftPartChildObjId, leftParentPartObjid, leftPartChildObjId, leftPartObjid, rightPartNo, rightPartRev); }); }); @@ -148,7 +167,8 @@ function fn_checkSameTopPartNo(rightCheckedArr){ $.ajax({ url: "/partMng/checkSameTopPartNo.do", method: 'post', - data: {"OBJID":$("#objId").val(), "rightCheckedArr":rightCheckedArr}, + traditional: true, // 배열 파라미터 처리를 위한 옵션 + data: {"OBJID":$("#objId").val(), "rightCheckedArr[]":rightCheckedArr}, // [] 추가 dataType: 'json', async:false, success: function(data) { @@ -210,26 +230,29 @@ function fn_relatePartInfo(leftObjId, rightCheckedArr, leftPartNoQty, leftPartLa $.ajax({ url: "/partMng/relatePartInfo.do", method: 'post', - data: {"leftObjId":leftObjId,"leftPartNoQty":leftPartNoQty, "OBJID":$("#objId").val(), "rightCheckedArr":rightCheckedArr, "partObjId":leftPartLastObjId, "BOM_REPORT_OBJID":$("#objId").val(), - "leftPartChildObjId":leftPartChildObjId, "leftQtyParObjId":leftQtyParObjId}, + traditional: true, // 배열 파라미터 처리를 위한 옵션 + data: { + "leftObjId": leftObjId, + "leftPartNoQty": leftPartNoQty, + "OBJID": $("#objId").val(), + "rightCheckedArr[]": rightCheckedArr, // Spring의 @RequestParam(value = "rightCheckedArr[]") 형식 + "partObjId": leftPartLastObjId, + "BOM_REPORT_OBJID": $("#objId").val(), + "leftPartChildObjId": leftPartChildObjId, + "leftQtyParObjId": leftQtyParObjId + }, dataType: 'json', async:false, success: function(data) { if(data.result){ + // 왼쪽 프레임 새로고침 $(parent.frames['leftFrame'].document.location.reload()); - //$(parent.frames['rightFrame'].fn_searchPart()); - $(".partChks", parent.frames['rightFrame'].document).prop("checked", false); - - //좌측에 선택된 정보를 유지하기위해 0.1초간의 딜레이(새로고침시간)을 주고 10번 기존에 선택된 정보를 선택하도록 한다. 10번사이 선택이 된다면 loop break; - // for(var i = 0 ; i < 10 ; i++){ - // var leftPartChkLength = $("input[name='checkecPartNo']:checked", parent.frames['leftFrame'].document).length; - // setTimeout(function(){ - // $("input[name='checkedPartNo']:radio[value='"+leftPartNo+"']", parent.frames['leftFrame'].document).prop("checked", true); - // }, 100); - // if(leftPartChkLength > 0) break; - // } - //end for + // 오른쪽 프레임 선택 해제 (Tabulator) + var rightFrame = parent.frames['rightFrame']; + if(rightFrame.clearSelection) { + rightFrame.clearSelection(); + } } } , error: function(jqxhr, status, error){ @@ -253,11 +276,19 @@ function fn_changeRelatePartInfo(objId,rightObjId,leftObjId,leftPartNoQty,leftPa async:false, success: function(data) { if(data.result){ + // 왼쪽 프레임 새로고침 $(parent.frames['leftFrame'].document.location.reload()); - $(parent.frames['rightFrame'].fn_searchPart()); + // 오른쪽 프레임 검색 다시 수행 + var rightFrame = parent.frames['rightFrame']; + if(rightFrame.fn_searchPart) { + rightFrame.fn_searchPart(); + } - $(".partChks", parent.frames['rightFrame'].document).prop("checked", false); + // 오른쪽 프레임 선택 해제 (Tabulator) + if(rightFrame.clearSelection) { + rightFrame.clearSelection(); + } } } , error: function(jqxhr, status, error){ diff --git a/WebContent/WEB-INF/view/partMng/structurePopupLeft.jsp b/WebContent/WEB-INF/view/partMng/structurePopupLeft.jsp index 2e1b4b3..699053b 100644 --- a/WebContent/WEB-INF/view/partMng/structurePopupLeft.jsp +++ b/WebContent/WEB-INF/view/partMng/structurePopupLeft.jsp @@ -8,7 +8,7 @@