From d874457ff39eb53109e0e0dee5112e3341c448cd Mon Sep 17 00:00:00 2001 From: thkim Date: Mon, 13 Apr 2026 17:59:18 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EC=95=94=EC=84=9D=EC=8B=9C=ED=97=98?= =?UTF-8?q?=EC=9D=98=20=EC=9D=BC=EC=B6=95=EC=95=95=EC=B6=95,=EC=82=BC?= =?UTF-8?q?=EC=B6=95=EC=95=95=EC=B6=95=EC=97=90=EC=84=9C=20=EC=8B=9C?= =?UTF-8?q?=ED=97=98=ED=9A=9F=EC=88=98=20=EC=88=98=EC=A0=95=20=EC=8B=9C,?= =?UTF-8?q?=20=EC=A6=89=EC=8B=9C=20=EA=B0=9C=EC=88=98=EA=B0=80=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=EB=90=98=EB=8F=84=EB=A1=9D=20=EA=B8=B0=EB=8A=A5?= =?UTF-8?q?=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ManageExcelUploadProc03Controller.java | 35 +- .../input/basic/labInfoFieldPressuremeter.jsp | 8 +- .../WEB-INF/views/web/input/projectInfo.jsp | 4 +- .../views/web/input/rock/rockTriaxial.jsp | 414 +++++------ .../views/web/input/uniaxial/rockUniaxial.jsp | 702 +++++++----------- src/main/webapp/kendo-ui/js/common.js | 27 +- 6 files changed, 488 insertions(+), 702 deletions(-) diff --git a/src/main/java/geoinfo/regi/manageList/ManageExcelUploadProc03Controller.java b/src/main/java/geoinfo/regi/manageList/ManageExcelUploadProc03Controller.java index 261b276a..52c57ce7 100644 --- a/src/main/java/geoinfo/regi/manageList/ManageExcelUploadProc03Controller.java +++ b/src/main/java/geoinfo/regi/manageList/ManageExcelUploadProc03Controller.java @@ -68,6 +68,7 @@ import geoinfo.regi.status.service.RegiPageService; import geoinfo.regi.surface.service.SurfaceService; import geoinfo.util.DateUtil; import geoinfo.util.ExcelUtil; +import geoinfo.util.MyUtil; import geoinfo.util.RsWrapper; import geoinfo.util.StringUtil; import ictway.comm.util.strUtil; @@ -3510,7 +3511,14 @@ public class ManageExcelUploadProc03Controller { if(!StringUtil.containsCharOnly(excelWp.get("col1",i).trim(),"0123456789.")){ resultMsg += String.format(fmtMsg, "시험횟수는 실수만 입력이 가능합니다."); } - testNo2 = Integer.valueOf(excelWp.get("col0",i).trim()); + String strTestNo2 = excelWp.get("col0",i).trim(); + if( MyUtil.isNumeric(strTestNo2) ) { + testNo2 = Integer.valueOf(strTestNo2); + } else { + String errMessage = "시험횟수는 실수만 입력이 가능합니다."; + resultMsg += String.format(fmtMsg, errMessage); + throw new Exception(errMessage); + } testNo = testNo2 > testNo ? testNo2 : testNo; testNoCheck[i] = (String)(excelWp.get("col0",i).trim())+(String)(excelWp.get("col1",i).trim()); @@ -4566,20 +4574,25 @@ public class ManageExcelUploadProc03Controller { WebUtil wUtil = new WebUtil(); strUtil sUtil = new strUtil(); - String resultMsg = ""; - String fmtMsg = "[토사시험정보 - 압밀시험정보] %s|"; - String testNoCheck[] = new String[excelWp.getLength()]; - if(excelWp.getLength() != _sampleInfoList.size()){ - params.put("resultMsg", String.format(fmtMsg, "기본물성시험정보의 시료 갯수"+excelWp.getLength() != _sampleInfoList.size()+"개와 같지 않습니다.")); + String resultMsg = ""; + String fmtMsg = "[토사시험정보 - 압밀시험정보] %s|"; + final int consolidationTestCount = excelWp.getLength(); + final int sampleInfoCount = _sampleInfoList.size(); + String testNoCheck[] = new String[consolidationTestCount]; + + /* + if( consolidationTestCount != sampleInfoCount){ + params.put("resultMsg", String.format(fmtMsg, "기본물성시험정보의 시료 갯수"+consolidationTestCount != sampleInfoCount+"개와 같지 않습니다.")); return params; }; + */ int testNo2 =1; int testNo = 1; try{ List> list = new ArrayList>(); - resultMsg = imageUpload(params,"압밀시험정보 그래프", savePath, strFile, resultMsg, "[토사시험정보 - 압밀시험 그래프] %s|", "압밀시험결과 그래프",excelWp.getLength()); - for(int i=0; i < excelWp.getLength(); i++){ + resultMsg = imageUpload(params,"압밀시험정보 그래프", savePath, strFile, resultMsg, "[토사시험정보 - 압밀시험 그래프] %s|", "압밀시험결과 그래프",consolidationTestCount); + for(int i=0; i < consolidationTestCount; i++){ testNo2 = Integer.valueOf(excelWp.get("col0",i).trim()); testNo = testNo2 > testNo ? testNo2 : testNo; @@ -4629,8 +4642,8 @@ public class ManageExcelUploadProc03Controller { } } - if(testNo != _sampleInfoList.size()) { - params.put("resultMsg", String.format(fmtMsg, "최대 테스트 번호가 기본물성시험정보의 시료 갯수"+excelWp.getLength() != _sampleInfoList.size()+"와 같지 않습니다.")); + if( sampleInfoCount < testNo ) { + params.put("resultMsg", String.format(fmtMsg, "최대 테스트 번호가 기본물성시험정보의 시료 갯수"+consolidationTestCount != sampleInfoCount+"와 같지 않습니다.")); return params; } @@ -4646,7 +4659,7 @@ public class ManageExcelUploadProc03Controller { } - for(int i=0; i < excelWp.getLength(); i++){ + for(int i=0; i < consolidationTestCount; i++){ HashMap map = new HashMap<>(); map.put("PROJECT_CODE", _projectCode); map.put("HOLE_CODE", _holeCode); diff --git a/src/main/webapp/WEB-INF/views/web/input/basic/labInfoFieldPressuremeter.jsp b/src/main/webapp/WEB-INF/views/web/input/basic/labInfoFieldPressuremeter.jsp index 4d535ea6..01b9dab3 100644 --- a/src/main/webapp/WEB-INF/views/web/input/basic/labInfoFieldPressuremeter.jsp +++ b/src/main/webapp/WEB-INF/views/web/input/basic/labInfoFieldPressuremeter.jsp @@ -545,15 +545,15 @@ function fn_grid_refresh(){ var kendoJQuery = jQuery.noConflict(); // web/js/tree/lib/jquery.js 와 kendoUI jquery.js의 충돌방지 변수 + kendoJQuery(document).ready(function () { fn_onLoad(); fn_kendoGrid(); fn_kendoGridStyle(); - fn_setGridCombo(); - - fn_setHeaderText(); //기준계 조회 해서 SetHeaderText + fn_setGridCombo(); var grid = kendoJQuery("#kictGrid").data("kendoGrid"); + var dataSource = grid.dataSource; // 콤보박스 데이터 추출을 위한 refresh @@ -635,7 +635,7 @@ function fn_grid_refresh(){ { field: "fieldpresInspectedBy", title: "조사자", attributes: { style:"text-align: left" }, template: "
#= (fieldpresInspectedBy == null) ? '' : fieldpresInspectedBy #
" }, { field: "fieldpresCheckedBy", title: "검수자", attributes: { style:"text-align: left" }, template: "
#= (fieldpresCheckedBy == null) ? '' : fieldpresCheckedBy #
" }, { field: "fieldpresDepth", title: "심도(m)", editor: chooseEditor, attributes: { style:"text-align: right" }, template: "
#= (fieldpresDepth == null) ? '0' : fieldpresDepth #
" }, - { field: "fieldpresKp", title: "변형계수(${fieldpresKp})", editor: chooseEditor, attributes: { style:"text-align: right" }, template: "
#= (fieldpresKp == null) ? '0' : fieldpresKp #
" }, + { field: "fieldpresKp", title: "변형계수(${fieldpresKp})", format: "{0:G}", editor: chooseEditor, attributes: { style:"text-align: right" }, template: "
#= (fieldpresKp == null) ? '0' : fieldpresKp #
" }, { field: "fieldpresEp", title: "탄성계수(${fieldpresEp})", editor: chooseEditor, attributes: { style:"text-align: right" }, template: "
#= (fieldpresEp == null) ? '0' : fieldpresEp #
" }, ], scrollable: true, diff --git a/src/main/webapp/WEB-INF/views/web/input/projectInfo.jsp b/src/main/webapp/WEB-INF/views/web/input/projectInfo.jsp index 5159783b..7b32f5cb 100644 --- a/src/main/webapp/WEB-INF/views/web/input/projectInfo.jsp +++ b/src/main/webapp/WEB-INF/views/web/input/projectInfo.jsp @@ -1024,7 +1024,7 @@ culture: "ko-KR", format : "yyyyMMdd" }); - $("#PROJECT_START_DATE").attr("readonly",true); + $("#PROJECT_START_DATE").attr("readonly",false); 공사종료일 @@ -1036,7 +1036,7 @@ culture: "ko-KR", format : "yyyyMMdd" }); - $("#PROJECT_END_DATE").attr("readonly",true); + $("#PROJECT_END_DATE").attr("readonly",false); diff --git a/src/main/webapp/WEB-INF/views/web/input/rock/rockTriaxial.jsp b/src/main/webapp/WEB-INF/views/web/input/rock/rockTriaxial.jsp index 510bc738..d09a297b 100644 --- a/src/main/webapp/WEB-INF/views/web/input/rock/rockTriaxial.jsp +++ b/src/main/webapp/WEB-INF/views/web/input/rock/rockTriaxial.jsp @@ -12,7 +12,6 @@ var extFile = "<%=fileCmmn.getFileList("IMG")%>"; var extFileList = extFile.split(","); - @@ -20,7 +19,6 @@ var extFileList = extFile.split(","); - - - - -
- - - -
-
  • @@ -583,23 +574,17 @@ function fn_openClipReport2(table,project,hole,sample,etc1,etc2,gbn){ 도움말
- -

삼축압축

-
-
-
@@ -637,7 +622,6 @@ function fn_openClipReport2(table,project,hole,sample,etc1,etc2,gbn){ var nowColumnIndex = colIdx - 2; var nowColLength = grid.columns.length - 2; // 타이틀 수 제외 - fn_kendoFileDisplayCol(nowColumnIndex, nowColLength, "TR_GRAPH_IMAGE_", 0); }); fn_kendoGridStyle(); @@ -837,42 +821,32 @@ function fn_openClipReport2(table,project,hole,sample,etc1,etc2,gbn){
-
- -
- - - -
삼축압축시험결과 그래프를 입력하세요. (최대크기: 500KB)
- - - - - - - - - - - - + +
+ +
+
삼축압축시험결과 그래프 (1회)를(을) 입력하세요. (최대크기: 500KB) 파일은 JPEG 또는 PNG 형태로 올려주셔야 합니다.
+
+ + + + + + + + - + + - - - - - - - - - - -
- 첨부파일입력 - 삼축압축시험결과
그래프 입력
    -
  • - 시험결과 그래프는 필수입력입니다. -
  • -
  • - 파일크기는 "최대 500KB" 입니다. -
  • +
  • 시험결과 그래프는 필수입력입니다.
  • +
  • 파일크기는 "최대 500KB" 입니다.
첨부된 파일정보 @@ -889,56 +863,30 @@ function fn_openClipReport2(table,project,hole,sample,etc1,etc2,gbn){
- 첨부파일입력 - - -
    -
  • - 시험결과 그래프는 필수입력입니다. -
  • -
  • - 파일크기는 "최대 500KB" 입니다. -
  • -
-
+
+ + +
- ' /> - ' /> - - - - +
+ + + + + + + +
- - +
- - -
- - - +
- - - - - + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/views/web/input/uniaxial/rockUniaxial.jsp b/src/main/webapp/WEB-INF/views/web/input/uniaxial/rockUniaxial.jsp index d4565abe..06ed556e 100644 --- a/src/main/webapp/WEB-INF/views/web/input/uniaxial/rockUniaxial.jsp +++ b/src/main/webapp/WEB-INF/views/web/input/uniaxial/rockUniaxial.jsp @@ -61,132 +61,124 @@ function fn_MakeData(){ //저장 function fn_save(rUrl){ - // ----------------------- kendoGrid XML 구조저장 시작 ----------------------- - var grid = kendoJQuery("#kictGrid").data("kendoGrid"); - var dataSource = grid.dataSource; - var data = dataSource.data(); + // ----------------------- kendoGrid XML 구조저장 시작 ----------------------- + var grid = kendoJQuery("#kictGrid").data("kendoGrid"); + var dataSource = grid.dataSource; + var data = dataSource.data(); - var kendoRowCount = dataSource.view().length; // 가로(행) 갯수 - var kendoColCount = grid.columns.length; // 세로(열) 갯수 - var kendoStartIndex = 3; + var kendoRowCount = dataSource.view().length; // 가로(행) 갯수 + var kendoColCount = grid.columns.length; // 전체 컬럼 수 (고정3 + 데이터n) + var kendoStartIndex = 3; // VALUE1이 시작되는 인덱스 + var dynamicColCount = kendoColCount - kendoStartIndex; // 실제 시험 횟수(데이터 열 개수) - //변경여부 확인 - /* if(rUrl == ""){ - var dirty = $.grep(data, function(item) { - return item.dirty; - }); - if (dirty.length === 0) { - alert("변경된 자료가 없습니다"); - fn_progressbarHideKendo(); - return false; - } - } */ + // 숫자체크 (유효성 검사) + var colInfo = { + "1_idx":1 , "1_title" :"From", "1_start_num":10, "1_end_num":4, + "2_idx":2 , "2_title" :"심도(to)", "2_start_num":10, "2_end_num":4, + "3_idx":3 , "3_title" :"시료직경", "3_start_num":10, "3_end_num":8, + "4_idx":4 , "4_title" :"시료길이", "4_start_num":10, "4_end_num":8, + "5_idx":5 , "5_title" :"비중", "5_start_num":10, "5_end_num":8, + "6_idx":6 , "6_title" :"탄성파속도(p파속도)", "6_start_num":10, "6_end_num":8, + "7_idx":7 , "7_title" :"탄성파속도(s파속도)", "7_start_num":10, "7_end_num":8, + "8_idx":8 , "8_title" :"흡수율", "8_start_num":10, "8_end_num":8, + "9_idx":9 , "9_title" :"일축압축강도", "9_start_num":10, "9_end_num":10, + "11_idx":11, "11_title":"포아송비", "11_start_num":10, "11_end_num":8 + }; - //숫자체크 - var colInfo = { - "1_idx":1 , "1_title" :"From", "1_start_num":10, "1_end_num":4, - "2_idx":2 , "2_title" :"심도(to)", "2_start_num":10, "2_end_num":4, - "3_idx":3 , "3_title" :"시료직경", "3_start_num":10, "3_end_num":8, - "4_idx":4 , "4_title" :"시료길이", "4_start_num":10, "4_end_num":8, - "5_idx":5 , "5_title" :"비중", "5_start_num":10, "5_end_num":8, - "6_idx":6 , "6_title" :"탄성파속도(p파속도)", "6_start_num":10, "6_end_num":8, - "7_idx":7 , "7_title" :"탄성파속도(s파속도)", "7_start_num":10, "7_end_num":8, - "8_idx":8 , "8_title" :"흡수율", "8_start_num":10, "8_end_num":8, - "9_idx":9 , "9_title" :"일축압축강도", "9_start_num":10, "9_end_num":10, - "11_idx":11, "11_title":"포아송비", "11_start_num":10, "11_end_num":8 - }; + if(fn_saveNumberCheckKendo("COL", dataSource, grid, "grid1", 3, colInfo, grid.columns, true, "rockUniaxial") == false){ + $("#RUNICODE").val(prevRuniCode); + return false; + } - if(fn_saveNumberCheckKendo("COL", dataSource, grid, "grid1", 3, colInfo, grid.columns, true, "rockUniaxial") == false){ - $("#RUNICODE").val(prevRuniCode); - return false; - } + // [수정] 비고(Remark) 입력체크 (12번 인덱스가 '비고' 행) + // i는 1부터 실제 데이터 열의 개수(dynamicColCount)까지 돕니다. + for(var i=1; i <= dynamicColCount; i++){ + var remarkVal = data[12]["VALUE" + i]; + + // 값이 없거나, null이거나, 공백만 있는 경우 체크 + if(remarkVal === undefined || remarkVal === null || String(remarkVal).trim() === ""){ + alert(i + "번째 시험의 비고를 입력해주세요."); + return false; + } + } - //비고 입력체크 - for(var i=1; i <= Math.floor(kendoColCount/2); i++){ - if(gridData['12']['VALUE'+i] == " " && dataSource._data[12]["VALUE"+i] == " "){ - alert("비고를 입력해주세요"); - return false; - } - } + var s = ""; + var m = ""; + for(var i=0; i"; - for(var i=0; i"; + m = m + "<"+dataField+">" + isNumNullBlank(row[ dataField ]) + ""; + } + m = m + "" + row.COLUMN + ""; + m = m + ""; + } + var e = ""; + var strData = s+m+e; + // ----------------------- kendoGrid XML 구조저장 끝 ----------------------- - for(var j=kendoStartIndex; j" + isNumNullBlank(row[ dataField ]) + ""; + // 삭제 되는 시료에 대한 처리 + if(Number(runi_code.substr(11)) > Number($("#SAMPLECNT").val())){ + re_runi_code = ""; + $("#table_file").html(''); + } - } - m = m + "" + row.COLUMN + ""; - m = m + ""; + // 현재 선택된 열 인덱스 (파일 업로드 체크용) + var _seq = nowColumnIndex; - } - var e = ""; - var strData = s+m+e; - // ----------------------- kendoGrid XML 구조저장 끝 ----------------------- + // 이미지 업로드 필수 체크 로직 + var testOrderVal = data[0]["VALUE" + _seq]; // 시험횟수 행의 값 + var fileImgID1 = "GRAPH_IMAGE1_" + testOrderVal; + var fileImgID2 = "GRAPH_IMAGE2_" + testOrderVal; + var fileImg1 = $("#GRAPH_IMAGE1_" + testOrderVal).val(); + var fileImg2 = $("#GRAPH_IMAGE2_" + testOrderVal).val(); + var fileImg_bk1 = $("#OLD_GRAPH_IMAGE1_" + testOrderVal).val(); + var fileImg_bk2 = $("#OLD_GRAPH_IMAGE2_" + testOrderVal).val(); - var runi_code = prevRuniCode; - var re_runi_code = prevRuniCode; + const fileImgCheck1 = fileImg1 == "" || fileImg1 === "null" || fileImg1 === null; + const fileImgCheck2 = fileImg2 == "" || fileImg2 === "null" || fileImg2 === null; + const fileImgBkCheck1 = fileImg_bk1 == "" || fileImg_bk1 === "null" || fileImg_bk1 === null; + const fileImgBkCheck2 = fileImg_bk2 == "" || fileImg_bk2 === "null" || fileImg_bk2 === null; - //삭제 되는 시료에 대한 처리 - if(Number(runi_code.substr(11)) > Number($("#SAMPLECNT").val())){ - re_runi_code = ""; - $("#table_file").html(''); - } + if(fileImgBkCheck1 === false || fileImgBkCheck2 === false){ + fn_fileTotalCheck(fileImgID1); + fn_fileTotalCheck(fileImgID2); + } - var _seq = nowColumnIndex; + if( fileImgBkCheck1 && fileImgCheck1 ) { + alert("파괴형태 그림 첨부는 필수입니다."); + return false; + } else if( fileImgBkCheck2 && fileImgCheck2 ) { + alert("Stress-Strain 그래프 첨부는 필수입니다."); + return false; + } - // 2019.10.10 이미지 업로드 필수 수정 - var fileImgID1 = "GRAPH_IMAGE1_"+dataSource._data[0]["VALUE"+_seq]; - var fileImgID2 = "GRAPH_IMAGE2_"+dataSource._data[0]["VALUE"+_seq]; - var fileImg1 = $("#GRAPH_IMAGE1_"+dataSource._data[0]["VALUE"+_seq]).val(); - var fileImg2 = $("#GRAPH_IMAGE2_"+dataSource._data[0]["VALUE"+_seq]).val(); - var fileImg_bk1 = $("#OLD_GRAPH_IMAGE1_"+dataSource._data[0]["VALUE"+_seq]).val(); - var fileImg_bk2 = $("#OLD_GRAPH_IMAGE2_"+dataSource._data[0]["VALUE"+_seq]).val(); - const fileImgCheck1 = fileImg1 == "" || fileImg1 === "null" || fileImg1 === null; - const fileImgCheck2 = fileImg2 == "" || fileImg2 === "null" || fileImg2 === null; - const fileImgBkCheck1 = fileImg_bk1 == "" || fileImg_bk1 === "null" || fileImg_bk1 === null; - const fileImgBkCheck2 = fileImg_bk2 == "" || fileImg_bk2 === "null" || fileImg_bk2 === null; + // 저장 파라미터 세팅 + var projectCode = ''; + var holeCode = ''; + var param_code = "?REPORT_TYPE=CH&PROJECT_CODE="+projectCode+"&HOLE_CODE="+holeCode; + var dbUrl = "/web/input/rockUniaxialDb.do"+param_code+"&srhRUNI_CODE="+fn_isNull($("#RUNICODE").val()); - if(fileImgBkCheck1 === false || fileImgBkCheck2 === false){ - //첨부파일이 있을경우 확장자 체크 - fn_fileTotalCheck(fileImgID1); - fn_fileTotalCheck(fileImgID2); - } + document.getElementById("PROJECT_CODE").value = projectCode; + document.getElementById("HOLE_CODE").value = holeCode; + document.getElementById("RUNI_CODE").value = runi_code; + document.getElementById("SAMPLE_CNT").value = document.getElementById("SAMPLECNT").value; + + // [수정] TOTALCNT는 실제 데이터 열의 개수(dynamicColCount)로 설정 + //document.getElementById("TOTALCNT").value = dynamicColCount; + document.getElementById("TOTALCNT").value = kendoColCount - 1; + document.getElementById("rowDelFileArr").value = rowDelFileArr; - if( fileImgBkCheck1 && fileImgCheck1 ) { - alert("파괴형태 그림 첨부는 필수입니다."); - return false; - } else if( fileImgBkCheck2 && fileImgCheck2 ) { - alert("Stress-Strain 그래프 첨부는 필수입니다."); - return false; - } - /* if(fileImgBkCheck1 === true || fileImgBkCheck2 === true){ */ - /* } */ - //그리드 저장 - - var projectCode = ''; - var holeCode = ''; - - var param_code = "?REPORT_TYPE=CH&PROJECT_CODE="+projectCode+"&HOLE_CODE="+holeCode; - var dbUrl = "/web/input/rockUniaxialDb.do"+param_code+"&srhRUNI_CODE="+fn_isNull($("#RUNICODE").val()); - - document.getElementById("PROJECT_CODE").value = ''; - document.getElementById("HOLE_CODE").value = ''; - document.getElementById("RUNI_CODE").value = runi_code; - document.getElementById("SAMPLE_CNT").value = document.getElementById("SAMPLECNT").value; - document.getElementById("TOTALCNT").value = kendoColCount - 1; - document.getElementById("rowDelFileArr").value = rowDelFileArr; - - fn_submitAll(dbUrl, rUrl, strData, document.frmRock); + fn_submitAll(dbUrl, rUrl, strData, document.frmRock); } //kendoGrid submitAll @@ -317,168 +309,73 @@ function setData(arrayRockColumn,arrayRock){ } function fn_setFile(arrayRock){ + $("#table_file").html(''); + var file = ''; + + for(var i = 0; i < arrayRock.length; i++){ + var testOrder = arrayRock[i].testOrder; + + var img1 = (arrayRock[i].graphImage1 == 'null' || arrayRock[i].graphImage1 == null) ? '' : arrayRock[i].graphImage1; + var loc1 = (arrayRock[i].graphLocal1 == 'null' || arrayRock[i].graphLocal1 == null) ? '' : arrayRock[i].graphLocal1; + var img2 = (arrayRock[i].graphImage2 == 'null' || arrayRock[i].graphImage2 == null) ? '' : arrayRock[i].graphImage2; + var loc2 = (arrayRock[i].graphLocal2 == 'null' || arrayRock[i].graphLocal2 == null) ? '' : arrayRock[i].graphLocal2; - //file init - $("#table_file").html(''); + // 파괴형태 그림 + file += '
'; + file += '
파괴형태 그림 (' + testOrder + '회)를(을) 입력하세요. (최대크기: 500KB)
'; + file += ' '; + file += '
첨부파일입력'; + file += ' '; + file += '
  • 시험결과 그래프는 필수입력입니다.
  • 파일크기는 "최대 500KB" 입니다.
'; + if(img1 !== ''){ + file += '
첨부파일 : ' + loc1 + '
'; + file += ' '; + } + file += ' '; + file += ' '; + file += '
'; - //file content - var file = '
'; - - for(var i =0; i < arrayRock.length; i++){ - - - file += '
일축압축시험결과 그래프를 입력하세요. (최대크기: 500KB) 파일은 JPEG 또는 PNG 형태로 올려주셔야 합니다.
'; - file += ' '; - file += ' '; - file += ' '; - file += ' '; - file += ' '; - if(i == 0){ - file += ' '; - }else{ - file += ' '; - } - - file += ' '; - file += ' '; - file += ' '; - file += ' '; - - if(arrayRock[i].graphImage1 != '' && arrayRock[i].graphImage1 != null && arrayRock[i].graphImage1 != 'null'){ - file += ' '; - file += ' '; - file += ' '; - file += ' '; - file += ' '; - file += ' '; - file += ' '; - file += ' '; - } - - if(arrayRock[i].graphImage1 == '' || arrayRock[i].graphImage1 == null || arrayRock[i].graphImage1 == 'null'){ - file += ' '; - file += ' '; - file += ' '; - file += ' '; - } - file += ' '; - - if(i == 0){ - file += ' '; - }else{ - file += ' '; - } - - if(arrayRock[i].graphImage2 != '' && arrayRock[i].graphImage2 != null && arrayRock[i].graphImage2 != 'null'){ - file += ' '; - file += ' '; - file += ' '; - file += ' '; - file += ' '; - file += ' '; - file += ' '; - file += ' '; - } - - if(arrayRock[i].graphImage2 == '' || arrayRock[i].graphImage2 == null || arrayRock[i].graphImage2 == 'null'){ - - file += ' '; - file += ' '; - file += ' '; - file += ' '; - } - - file += ' '; - file += '
'; - } - - - file += ' '; - file += ' '; - file += ' '; - file += ' '; - file += ' '; - file += ' '; - file += ' '; - file += '
'; - - $("#table_file").html(file); - - $("#GridRowCnt").val(arrayRock.length); + // Stress-Strain 그래프 + file += '
'; + file += '
Stress-Strain 그래프 (' + testOrder + '회)를(을) 입력하세요. (최대크기: 500KB)
'; + file += ' '; + file += '
첨부파일입력'; + file += ' '; + file += '
  • 시험결과 그래프는 필수입력입니다.
  • 파일크기는 "최대 500KB" 입니다.
'; + if(img2 !== ''){ + file += '
첨부파일 : ' + loc2 + '
'; + file += ' '; + } + file += ' '; + file += ' '; + file += '
'; + } + $("#table_file").html(file); + $("#GridRowCnt").val(arrayRock.length); } +//열추가삭제 +function fn_ColAddInput(nowColCount, nowColLength, cnt){ + var oldCnt = nowColCount; + if(cnt>=0){ + if(cnt < oldCnt){ //삭제 + for(var i = oldCnt ; i >= cnt + 1; i--){ + // 실제 물리적인 파일 삭제 하기 위해 파일명 Arr 세팅 + rowDelFileArr += $("#OLD_GRAPH_IMAGE1_"+i).val() + ","; + rowDelFileArr += $("#OLD_GRAPH_IMAGE2_"+i).val() + ","; + + // 해당 회차의 DOM을 직접 제거 (전체 삭제 후 재생성 방지) + $("#TR_GRAPH_IMAGE1_" + i).remove(); + $("#TR_GRAPH_IMAGE2_" + i).remove(); + } + }else if(cnt > oldCnt){ //추가 + for(var i = oldCnt+1 ; i <= cnt; i++){ + fn_FileAddRow("table_file", i, "GRAPH_IMAGE1_", "TR_GRAPH_IMAGE1_", "파괴형태 그림 ("+i+"회)"); + fn_FileAddRow("table_file", i, "GRAPH_IMAGE2_", "TR_GRAPH_IMAGE2_", "Stress-Strain 그래프 ("+i+"회)"); + } + } + } +} //ajax 리턴 function fn_SelectLoad(data){ @@ -567,13 +464,6 @@ function fn_add(){ fn_FileAddRow("table_file",nowColCount,"GRAPH_IMAGE1_", "TR_GRAPH_IMAGE1_","파괴형태 그림"); fn_FileAddRow("table_file",nowColCount,"GRAPH_IMAGE2_", "TR_GRAPH_IMAGE2_","Stress-Strain 그래프"); - //첨부추가 - /* fn_gridAddRow("TR_GRAPH_IMAGE1_","GRAPH_IMAGE1_", nowColCount, "파괴형태 그림"); - fn_gridAddRow("TR_GRAPH_IMAGE2_","GRAPH_IMAGE2_", nowColCount, "Stress-Strain 그래프"); */ - - //display controll - fn_kendoFileDisplayCol(nowColLength + 1, nowColCount, "TR_GRAPH_IMAGE1_",0); - fn_kendoFileDisplayCol(nowColLength + 1, nowColCount, "TR_GRAPH_IMAGE2_",0); myFields = grid.dataSource.options.schema.model.fields; @@ -605,45 +495,39 @@ function fn_add(){ //열 삭제 function removeItemAt() { + var grid = kendoJQuery("#kictGrid").data("kendoGrid"); + var nowColLength = grid.columns.length - 3; // 타이틀 수 제외 - var grid = kendoJQuery("#kictGrid").data("kendoGrid"); - var dataSource = grid.dataSource; - var data = dataSource.data(); + if($("#RUNICODE").val() == "" || $("#RUNICODE").val() == null){ + alert("시료번호를 선택하세요."); + return false; + } - var nowColLength = grid.columns.length - 3; // 타이틀 수 제외 - var nowRowLength = grid.dataSource.options.data.length - var nowColCount = nowColLength + 1; - var nowRowCount = nowRowLength; + if( nowColLength <= 1 ) { // 최소 1개는 유지 + return false; + } else { + grid.columns.pop(); + kendoJQuery("#kictGrid").find("tr td:nth-last-child(1)").each(function(){ + kendoJQuery(this).remove(); + }); + } - if($("#RUNICODE").val() == "" || $("#RUNICODE").val() == null){ - alert("시료번호를 선택하세요."); - return false; - } + var nowColCount = nowColLength - 1; + $("#GridRowCnt").val(nowColCount); + + // 실제 파일 삭제 배열에 추가 + rowDelFileArr += $("#OLD_GRAPH_IMAGE1_"+nowColLength).val() + ","; + rowDelFileArr += $("#OLD_GRAPH_IMAGE2_"+nowColLength).val() + ","; - if( nowColCount == 2 ) { - return false; - } else { - nowColCount = nowColLength - 1 - grid.columns.pop(); - kendoJQuery("#kictGrid").find("tr td:nth-last-child(1)").each(function(){ - kendoJQuery(this).remove(); - }); - } - - $("#GridRowCnt").val(nowColCount); - var dataItem = grid._data[nowColCount-1]; - return dataItem.dirty = true; - - //첨부삭제 - fn_FileRemoveRow("table_file",nowColLength*2, 2); - - //display controll - fn_kendoFileDisplayCol(nowColLength - 1, nowColCount, "TR_GRAPH_IMAGE1_",0); - fn_kendoFileDisplayCol(nowColLength - 1, nowColCount, "TR_GRAPH_IMAGE2_",0); - - $("#table_file").find("div").last().remove(); //20211219 ssheo - $("#table_file").find("table:last-child").remove(); //20211219 ssheo + // DOM에서 해당 회차의 첨부파일 DIV 영역 직접 완전 삭제 + $("#TR_GRAPH_IMAGE1_" + nowColLength).remove(); + $("#TR_GRAPH_IMAGE2_" + nowColLength).remove(); + // return 문을 DOM 삭제 로직 아래인 제일 마지막으로 이동 + var dataItem = grid._data[nowColCount-1]; + if(dataItem) { + return dataItem.dirty = true; + } } //그리드 col수 이벤트 @@ -730,38 +614,30 @@ function fn_rowChange(){ } } + //열추가삭제 +// 열 추가/삭제에 따른 파일 업로드 UI 제어 함수 function fn_ColAddInput(nowColCount, nowColLength, cnt){ - var oldCnt = nowColCount; - if(cnt>=0){ - if(cnt < oldCnt){ //삭제 - for(var i = oldCnt ; i>= cnt + 1; i--){ - //실제 물리적인 파일 삭제 하기 위해 파일명 Arr - rowDelFileArr += $("#OLD_GRAPH_IMAGE1_"+i).val() + ","; - rowDelFileArr += $("#OLD_GRAPH_IMAGE2_"+i).val() + ","; - $("#OLD_GRAPH_IMAGE1_"+i).val(""); - $("#OLD_GRAPH_IMAGE2_"+i).val(""); + var oldCnt = nowColCount; + if(cnt>=0){ + if(cnt < oldCnt){ //삭제 + for(var i = oldCnt ; i >= cnt + 1; i--){ + //실제 물리적인 파일 삭제 하기 위해 파일명 Arr + rowDelFileArr += $("#OLD_GRAPH_IMAGE1_"+i).val() + ","; + rowDelFileArr += $("#OLD_GRAPH_IMAGE2_"+i).val() + ","; - //file del - fn_FileRemoveRow("table_file",(i)*2, 2); // 모든 파일 삭제 - - //display controll - fn_kendoFileDisplayCol(i-1, i-1, "TR_GRAPH_IMAGE1_",0); - fn_kendoFileDisplayCol(i-1, i-1, "TR_GRAPH_IMAGE2_",0); - } - }else if(cnt > oldCnt){ //추가 - var nowColAddCount = cnt - oldCnt; - var nowColAddLength = nowColLength + nowColAddCount; - for(var i = oldCnt+1 ; i<= cnt; i++){ - fn_FileAddRow("table_file",i,"GRAPH_IMAGE1_", "TR_GRAPH_IMAGE1_","파괴형태 그림"); - fn_FileAddRow("table_file",i,"GRAPH_IMAGE2_", "TR_GRAPH_IMAGE2_","Stress-Strain 그래프"); - - //display controll - fn_kendoFileDisplayCol(i, i, "TR_GRAPH_IMAGE1_",0); - fn_kendoFileDisplayCol(i, i, "TR_GRAPH_IMAGE2_",0); - } - } - } + // [핵심] fn_FileRemoveRow 대신 jQuery remove()를 사용하여 해당 회차 DIV 통째로 삭제 + $("#TR_GRAPH_IMAGE1_" + i).remove(); + $("#TR_GRAPH_IMAGE2_" + i).remove(); + } + }else if(cnt > oldCnt){ //추가 + for(var i = oldCnt+1 ; i <= cnt; i++){ + // common.js에 정의된 공통 함수를 사용해 HTML append + fn_FileAddRow("table_file", i, "GRAPH_IMAGE1_", "TR_GRAPH_IMAGE1_", "파괴형태 그림"); + fn_FileAddRow("table_file", i, "GRAPH_IMAGE2_", "TR_GRAPH_IMAGE2_", "Stress-Strain 그래프"); + } + } + } } /* 도움말 시작 */ @@ -922,8 +798,6 @@ function fn_openClipReport2(table,project,hole,sample,etc1,etc2,gbn){ nowColumnIndex = colIdx - 2; var nowColLength = grid.columns.length - 2; // 타이틀 수 제외 - fn_kendoFileDisplayCol(nowColumnIndex, nowColLength, "TR_GRAPH_IMAGE1_", 0); - fn_kendoFileDisplayCol(nowColumnIndex, nowColLength, "TR_GRAPH_IMAGE2_", 0); }); fn_kendoGridStyle(); @@ -964,10 +838,6 @@ function fn_openClipReport2(table,project,hole,sample,etc1,etc2,gbn){ var nowColCount = nowColLength + 1; var nowRowCount = nowRowLength; - //display controll - fn_kendoFileDisplayCol(nowColLength + 1, nowColCount, "TR_GRAPH_IMAGE1_",0); - fn_kendoFileDisplayCol(nowColLength + 1, nowColCount, "TR_GRAPH_IMAGE2_",0); - fn_kendoGridStyle(); } @@ -1223,43 +1093,28 @@ function fn_openClipReport2(table,project,hole,sample,etc1,etc2,gbn){
-
일축압축시험결과 그래프를 입력하세요. (최대크기: 500KB) 파일은 JPEG 또는 PNG 형태로 올려주셔야 합니다.
- - - - - - - - - - - - - - - - - - - - +
+
파괴형태 그림 (${mapFile.testOrder}회)를(을) 입력하세요. (최대크기: 500KB) 파일은 JPEG 또는 PNG 형태로 올려주셔야 합니다.
+
+ + + + + + + + - + + - - + + +
- 파괴형태
그림 입력 -
파괴형태
그림 입력
    -
  • - 시험결과 그래프는 필수입력입니다. -
  • -
  • - 파일크기는 "최대 500KB" 입니다. -
  • +
  • 시험결과 그래프는 필수입력입니다.
  • +
  • 파일크기는 "최대 500KB" 입니다.
파괴형태
첨부된 파일정보
@@ -1276,53 +1131,33 @@ function fn_openClipReport2(table,project,hole,sample,etc1,etc2,gbn){
+
+ +
+
Stress-Strain 그래프 (${mapFile.testOrder}회)를(을) 입력하세요. (최대크기: 500KB)
+ + + + + + + + + - - - - - - - - - - - - - - - - - - + + - - - - - - - - - -
- 파괴형태
그림 입력 -
- -
    -
  • - 시험결과 그래프는 필수입력입니다. -
  • -
  • - 파일크기는 "최대 500KB" 입니다. -
  • -
-
+ + + +
- - ' /> - ' /> - '/> - - - - + +
+ + + + + + + +
+ diff --git a/src/main/webapp/kendo-ui/js/common.js b/src/main/webapp/kendo-ui/js/common.js index 973e4891..490d4398 100644 --- a/src/main/webapp/kendo-ui/js/common.js +++ b/src/main/webapp/kendo-ui/js/common.js @@ -14,31 +14,36 @@ function textEditor(container, options) { // 입력 type number로 변경 function numericEditor(container, options, isHyphenAllowed = false) { - // 1. 하이픈 허용 여부에 따라 타입을 결정합니다. - // 하이픈을 문자로서 입력받으려면 'text' 타입이 필요합니다. - var inputType = isHyphenAllowed ? "text" : "number"; - var input = kendoJQuery(''); + // 소수점을 입력받아야 하므로 항상 text 타입을 권장합니다. (number 타입의 브라우저 간섭 방지) + var inputType = "text"; + + var input = kendoJQuery(''); input.appendTo(container) .val(options.model[options.field]) .on("focus", function() { this.select(); }) + .on("keydown", function(e) { + // 필요시, 숫자, 소수점(.), 하이픈(-), 백스페이스, 탭 등 필수 키만 허용하는 로직을 추가 + }) .on("blur", function() { var valStr = this.value.trim(); - // 2. 하이픈 허용인 경우 '-' 입력을 그대로 모델에 저장합니다. if (isHyphenAllowed && valStr === "-") { options.model.set(options.field, "-"); - // 기존 common.js 로직에 따라 result 값도 세팅이 필요하다면 아래 추가 - // options.model.set("result", "-"); + } else if (valStr === "") { + options.model.set(options.field, null); } else { - // 숫자로 변환하여 모델에 저장 + // parseFloat은 "3.23"을 숫자 3.23으로 정확히 변환합니다. var valNum = parseFloat(valStr); - var finalVal = isNaN(valNum) ? null : valNum; - options.model.set(options.field, finalVal); - // options.model.set("result", finalVal); // 필요시 추가 + if (isNaN(valNum)) { + options.model.set(options.field, null); + } else { + // Kendo Model에 숫자로 반영 (이때 소수점이 유지됩니다) + options.model.set(options.field, valNum); + } } });