feat: 암석시험의 일축압축,삼축압축에서 시험횟수 수정 시, 즉시 개수가 수정되도록 기능개선

main
thkim 2026-04-13 17:59:18 +09:00
parent ce4175e783
commit d874457ff3
6 changed files with 488 additions and 702 deletions

View File

@ -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<HashMap<String, Object>> list = new ArrayList<HashMap<String,Object>>();
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<String,Object> map = new HashMap<>();
map.put("PROJECT_CODE", _projectCode);
map.put("HOLE_CODE", _holeCode);

View File

@ -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: "<div class='td-data'>#= (fieldpresInspectedBy == null) ? '' : fieldpresInspectedBy #</div>" },
{ field: "fieldpresCheckedBy", title: "검수자", attributes: { style:"text-align: left" }, template: "<div class='td-data'>#= (fieldpresCheckedBy == null) ? '' : fieldpresCheckedBy #</div>" },
{ field: "fieldpresDepth", title: "심도(m)", editor: chooseEditor, attributes: { style:"text-align: right" }, template: "<div class='td-data'>#= (fieldpresDepth == null) ? '0' : fieldpresDepth #</div>" },
{ field: "fieldpresKp", title: "변형계수(${fieldpresKp})", editor: chooseEditor, attributes: { style:"text-align: right" }, template: "<div class='td-data'>#= (fieldpresKp == null) ? '0' : fieldpresKp #</div>" },
{ field: "fieldpresKp", title: "변형계수(${fieldpresKp})", format: "{0:G}", editor: chooseEditor, attributes: { style:"text-align: right" }, template: "<div class='td-data'>#= (fieldpresKp == null) ? '0' : fieldpresKp #</div>" },
{ field: "fieldpresEp", title: "탄성계수(${fieldpresEp})", editor: chooseEditor, attributes: { style:"text-align: right" }, template: "<div class='td-data'>#= (fieldpresEp == null) ? '0' : fieldpresEp #</div>" },
],
scrollable: true,

View File

@ -1024,7 +1024,7 @@
culture: "ko-KR",
format : "yyyyMMdd"
});
$("#PROJECT_START_DATE").attr("readonly",true);
$("#PROJECT_START_DATE").attr("readonly",false);
</script>
</td>
<th class="td-head">공사종료일</th>
@ -1036,7 +1036,7 @@
culture: "ko-KR",
format : "yyyyMMdd"
});
$("#PROJECT_END_DATE").attr("readonly",true);
$("#PROJECT_END_DATE").attr("readonly",false);
</script>
</td>
</tr>

View File

@ -12,7 +12,6 @@ var extFile = "<%=fileCmmn.getFileList("IMG")%>";
var extFileList = extFile.split(",");
</script>
<!-- 기준계정보 가져오기 위한 Param -->
<jsp:include page="/web/common/referenceCodeCsDb.do?TEST_INFO_CODE=ROCK_TRIAXIAL&TYPEOFTEST=">
<jsp:param name="PROJECT_CODE" value="${params.PROJECT_CODE}" />
<jsp:param name="HOLE_CODE" value="${params.HOLE_CODE}" />
@ -20,7 +19,6 @@ var extFileList = extFile.split(",");
<jsp:param name="TYPEOFTEST" value="" />
</jsp:include>
<!-- 사용자 정의 설정 시작 -->
<script type="text/javascript">
var gridData = new Array(); //데이터 배열객체
@ -30,7 +28,7 @@ function fn_MakeData(){
title = [
{"TITLE1" : "시험횟수" , "TITLE2" : "" },
{"TITLE1" : "심도" , "TITLE2" : "From(m)" },
{"TITLE1" : "심도" , "TITLE2" : "From(m)" },
{"TITLE1" : "심도" , "TITLE2" : "To(m)" },
{"TITLE1" : "내부마찰각(Φ, °)" , "TITLE2" : "" },
{"TITLE1" : "점착력(c,MPa)" , "TITLE2" : "" },
@ -48,7 +46,6 @@ function fn_MakeData(){
{"TITLE1" : "150" , "TITLE2" : "구속압(σ3,MPa)" },
{"TITLE1" : "150" , "TITLE2" : "최대압축강도(σ1,MPa)"},
{"TITLE1" : "비고" , "TITLE2" : "" }
];
//title
@ -80,10 +77,8 @@ function fn_MakeData(){
//----------------------- 기타 -----------------------
//저장
function fn_save(rUrl){
// ----------------------- kendoGrid XML 구조저장 시작 -----------------------
var grid = kendoJQuery("#kictGrid").data("kendoGrid");
var dataSource = grid.dataSource;
@ -92,18 +87,7 @@ function fn_save(rUrl){
var kendoRowCount = dataSource.view().length; // 가로(행) 갯수
var kendoColCount = grid.columns.length; // 세로(열) 갯수
var kendoStartIndex = 3;
//변경여부 확인
/* if(rUrl == ""){
var dirty = $.grep(data, function(item) {
return item.dirty;
});
if (dirty.length === 0) {
alert("변경된 자료가 없습니다");
fn_progressbarHideKendo();
return false;
}
} */
var dynamicColCount = kendoColCount - kendoStartIndex; // 실제 데이터 열 수
//숫자체크
var colInfo = {
@ -132,9 +116,10 @@ function fn_save(rUrl){
}
//비고 입력체크
for(var i=1; i <= Math.floor(kendoColCount/2); i++){
if(gridData['18']['VALUE'+i] == " " || dataSource._data[18]["VALUE"+i] == " "){
alert("비고를 입력해주세요");
for(var i=1; i <= dynamicColCount; i++){
var remarkVal = data[18]["VALUE" + i];
if(remarkVal === undefined || remarkVal === null || String(remarkVal).trim() === ""){
alert(i + "번째 시험의 비고를 입력해주세요.");
return false;
}
}
@ -144,47 +129,41 @@ function fn_save(rUrl){
for(var i=0; i<kendoRowCount; i++){
var row = data[i];
m = m + "<data>";
for(var j=kendoStartIndex; j<kendoColCount; j++){
var column = grid.columns[j];
var dataField = column.field;
//var data = grid.dataSource._data;
//var data = grid.dataSource.options.data[j];
m = m + "<"+dataField+">" + isNumNullBlank(row[ dataField ]) + "</"+dataField+">";
}
m = m + "<COLUMN>" + row.COLUMN + "</COLUMN>";
m = m + "</data>";
}
var e = "</changedData>";
var strData = s+m+e;
// ----------------------- kendoGrid XML 구조저장 끝 -----------------------
var tri_code = prevRtriCode;
var re_tri_code = prevRtriCode;
var tri_code = prevRtriCode;
// 2019.10.10 이미지 업로드 필수 수정
var fileImgID = "GRAPH_IMAGE_"+prevRtriCode;
var fileImg = $("#GRAPH_IMAGE_"+prevRtriCode).val();
var fileImg_bk = $("#OLD_GRAPH_IMAGE_"+prevRtriCode).val();
const fileImgCheck = fileImg === "" || fileImg === "null" || fileImg == null;
const fileImg_bkCheck = fileImg_bk === "" || fileImg_bk === "null" || fileImg_bk == null;
// [수정] 삼축압축은 그래프 1개만 업로드하므로 1번만 체크
if (dynamicColCount > 0) {
var fileImgID = "GRAPH_IMAGE_" + tri_code;
var fileImg = $("#" + fileImgID).val();
var fileImg_bk = $("#OLD_GRAPH_IMAGE_" + tri_code).val();
if(fileImg_bkCheck === false){
if(fileImgCheck === false){
//첨부파일이 있을경우 확장자 체크
fn_fileTotalCheck(fileImgID);
const fileImgCheck = fileImg === "" || fileImg === "null" || fileImg == null;
const fileImg_bkCheck = fileImg_bk === "" || fileImg_bk === "null" || fileImg_bk == null;
if(fileImg_bkCheck === false){
if(fileImgCheck === false){
fn_fileTotalCheck(fileImgID);
}
}
}
if(fileImg_bkCheck === true){
if(fileImgCheck === true){
alert("그래프 업로드는 필수입니다.");
return false;
if(fileImg_bkCheck === true){
if(fileImgCheck === true){
alert("삼축압축시험결과 그래프 (1회) 업로드는 필수입니다.");
return false;
}
}
}
@ -194,11 +173,12 @@ function fn_save(rUrl){
var param_code = "?REPORT_TYPE=CH&PROJECT_CODE="+projectCode+"&HOLE_CODE="+holeCode;
var dbUrl = "/web/input/rockTriaxialDb.do"+param_code+"&srhRTRI_CODE="+$("#RTRICODE").val();
$("#PROJECT_CODE").val('<c:out value='${params.PROJECT_CODE}'/>');
$("#HOLE_CODE").val('<c:out value='${params.HOLE_CODE}'/>');
$("#RTRI_CODE").val(tri_code);
$("#SAMPLE_CNT").val($("#SAMPLECNT").val());
$("#TOTALCNT").val(kendoColCount - 1);
document.getElementById("PROJECT_CODE").value = projectCode;
document.getElementById("HOLE_CODE").value = holeCode;
document.getElementById("RTRI_CODE").value = tri_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.frmTri);
}
@ -206,7 +186,6 @@ function fn_save(rUrl){
//kendoGrid submitAll
function fn_submitAll(strUrl, rUrl, strData, frm) {
document.getElementById("dataAll").value = "<changedData>"+strData+"</changedData>";
var $form = $(frm);
$form.append("<input type=\"hidden\" name=\"rUrl\" id=\"rUrl\" value=\""+rUrl+"\"/>");
frm.action = strUrl;
@ -216,23 +195,10 @@ function fn_submitAll(strUrl, rUrl, strData, frm) {
//시료번호 change
function fn_Reload(value){
/* if(Is_GridUpdate(gridRoot) || Is_FileUpdateOne("GRAPH_IMAGE_",prevRtriCode,"FILE_DEL_")){
if(confirm("변경내용이 있습니다. 저장하시겠습니까? ")){
fn_save_loading('');
return false;
}else{
fn_select(value);
}
}else{
fn_select(value);
} */
fn_select(value);
}
function fn_select(value){
$.ajax({
type: 'GET',
url: "/rockTriaxialSelect.do",
@ -247,28 +213,21 @@ function fn_select(value){
console.log(e);
},
complete:function(e){
//file
//fn_setFile();
kendoJQuery("#kictGrid").kendoGrid('destroy').empty();
fn_kendoGrid();
fn_kendoGridStyle();
//전역변수 변경
prevRuniCode = $("#RUNICODE").val();
}
});
}
//ajax 리턴
function fn_SelectPointLoad(data){
$("head").append(data);
//file
fn_setFile();
// [중요] 기존 구형 서버 HTML이 덮어쓰여도 피할 수 있도록 독립적인 렌더링 함수 사용
renderDynamicFileUI();
//전역변수 변경
prevRtriCode = $("#RTRICODE").val();
}
@ -276,25 +235,19 @@ function fn_SelectPointLoad(data){
function fn_addCode(){
var samplecnt = $("#SAMPLECNT").val();
var cnt = 0;
if(samplecnt == "" || samplecnt == "0"){
$("#SAMPLECNT").val(1);
cnt = 1;
}else{
cnt = Number(samplecnt);
}
//add option
$("#RTRICODE").html("");
var projectCode = '<c:out value='${params.PROJECT_CODE}'/>';
var holeCode = '<c:out value='${params.HOLE_CODE}'/>';
for(var i=0; i<cnt; i++){
$("#RTRICODE").append("<option value = \"" + holeCode+"T"+fn_setZero(i+1)+"\">"+holeCode.substr(5,5)+"T"+fn_setZero(i+1)+"</option>");
}
$("#RTRICODE option:eq(0)").attr("selected", "selected");
//data init
fn_Reload($("#RTRICODE").val());
}
@ -307,19 +260,59 @@ function fn_onLoad(){
//selectbox 전역변수
var prevRtriCode = '<c:out value='${params.RTRI_CODE}'/>';
//열 추가
function fn_add(){
// [신규] 삼축압축은 그래프 1개만! (1회)가 고정으로 적힌 완벽한 HTML 생성기
function buildFileHtml(img1, loc1) {
var rtriCode = $("#RTRICODE").val();
var html = '';
html += '<div id="TR_GRAPH_IMAGE_' + rtriCode + '" class="table-file-wrapper">';
html += ' <div class="contents-title-1depth marT20"><span>삼축압축시험결과 그래프 (1회)를(을) 입력하세요. (최대크기: 500KB) 파일은 <span class="textR">JPEG 또는 PNG</span> 형태로 올려주셔야 합니다.</span></div>';
html += ' <table class="table table-file marT0" data-target="form-file"><colgroup><col width="160px" /><col width="auto" /></colgroup>';
html += ' <tbody>';
html += ' <input type="hidden" id="OLD_GRAPH_IMAGE_' + rtriCode + '" name="OLD_GRAPH_IMAGE_' + rtriCode + '" value="' + img1 + '" />';
html += ' <input type="hidden" id="OLD_GRAPH_LOCAL_' + rtriCode + '" name="OLD_GRAPH_LOCAL_' + rtriCode + '" value="' + loc1 + '" />';
html += ' <tr><td class="td-head">삼축압축시험결과<br>그래프 입력</td>';
html += ' <td class="plus_file"><input type="file" id="GRAPH_IMAGE_' + rtriCode + '" name="GRAPH_IMAGE_' + rtriCode + '" class="gg-input file-input" />';
html += ' <ul class="content-ul-list marT5"><li>시험결과 그래프는 <span class="textR">필수입력</span>입니다.</li><li>파일크기는 "최대 500KB" 입니다.</li></ul></td></tr>';
if(img1 && img1 !== '' && img1 !== 'null'){
html += ' <tr><td class="td-head">첨부된 파일정보</td><td class="plus_img">';
html += ' <div class="marB10"><b>첨부파일</b> : <a href="#" onClick=\'fn_imgPlus("/files/web/${params.REPORT_TYPE}/${params.PROJECT_CODE}/${params.HOLE_CODE}/ROCK_TRIAXIAL/' + img1 + '", event.x,event.y); return false;\'>' + loc1 + '</a>';
html += ' <label class="gg-checkbox gg-checkbox-outline marL20"><input type="checkbox" id="FILE_DEL_' + rtriCode + '" name="FILE_DEL_' + rtriCode + '" value="Y" class="checkbox_T" /> 파일삭제<span></span></label></div>';
html += ' <a href="#" onClick=\'fn_imgPlus("/files/web/${params.REPORT_TYPE}/${params.PROJECT_CODE}/${params.HOLE_CODE}/ROCK_TRIAXIAL/' + img1 + '", event.x,event.y); return false;\'><img src="/files/web/${params.REPORT_TYPE}/${params.PROJECT_CODE}/${params.HOLE_CODE}/ROCK_TRIAXIAL/' + img1 + '" class="file-preview-img" /></a>';
html += ' </td></tr>';
}
html += ' </tbody></table></div>';
return html;
}
// kendo 열 추가
// 구형 서버 통신 찌꺼기를 날리고 새로 그리는 무적 렌더링 함수
function renderDynamicFileUI(){
var rtriCode = $("#RTRICODE").val();
// 서버가 방금 그린 DOM에서 기존 파일 정보 픽업 (AJAX에서 넘어온 데이터 살리기)
var img1 = $("#OLD_GRAPH_IMAGE_" + rtriCode).val() || '';
var loc1 = $("#OLD_GRAPH_LOCAL_" + rtriCode).val() || '';
$("#table_file").empty(); // 기존 껍데기 폼 완벽 초기화
var cnt = Number($("#GridRowCnt").val());
if (isNaN(cnt) || cnt <= 0) {
$("#GridRowCnt").val(0);
return; // 0일 경우 화면에 아무것도 그리지 않고 종료
}
// 1 이상이면 무조건 1개의 폼만 렌더링
$("#table_file").html(buildFileHtml(img1, loc1));
}
//열 추가 (+ 버튼)
function fn_add(){
var grid = kendoJQuery("#kictGrid").data("kendoGrid");
var dataSource = grid.dataSource;
var data = dataSource.data();
var nowColLength = grid.columns.length - 3; // 타이틀 수 제외
var nowRowLength = grid.dataSource.options.data.length
var nowColCount = nowColLength + 1;
var nowRowCount = nowRowLength;
var nowColCountVALUE = 'VALUE' + nowColCount;
if($("#RTRICODE").val() == "" || $("#RTRICODE").val() == null){
@ -329,34 +322,34 @@ function fn_add(){
$("#GridRowCnt").val(nowColCount);
var data = dataSource.data();
var maxRcSeq = 0;
for(var i=0; i<data.length; i++){
if (data[i].RT_SEQ > maxRcSeq){
maxRcSeq = data[i].RT_SEQ;
}
}
var RT_SEQ = nowColLength + 1;
//첨부추가
//fn_gridAddRow("TR_GRAPH_IMAGE_","GRAPH_IMAGE_", RT_SEQ, "삼축시험결과 그래프를 입력하세요. (최대크기: 500KB)");
// [수정] DOM 폼 동기화 제어
fn_ColAddInput(nowColCount);
myFields = grid.dataSource.options.schema.model.fields;
for (var i = 0; i < 1; i++) {
var row = data[i];
var fieldsAdd = new Object();
var optionAdd = new Object();
var optionAdd = {"editable": true, "defaultValue": 0, nullable: true};
// 중복 컬럼 추가 방지
var isExist = false;
for(var c=0; c<grid.columns.length; c++) {
if (grid.columns[c].field === nowColCountVALUE) {
isExist = true; break;
}
}
grid.setOptions({
columns: grid.columns.concat([
{ field: nowColCountVALUE, editor: chooseEditor }
]),
});
if(!isExist) {
grid.setOptions({
columns: grid.columns.concat([
{ field: nowColCountVALUE, editor: chooseEditor }
]),
});
}
for (var j = 0; j < nowRowCount; j++) {
for (var j = 0; j < nowRowLength; j++) {
dataSource.data()[j].set(nowColCountVALUE, 0);
if (grid.dataSource.options.data[j].COLUMN === "TEST_ORDER") {
dataSource.data()[j].set(nowColCountVALUE, RT_SEQ)
@ -364,94 +357,85 @@ function fn_add(){
dataSource.data()[j].set(nowColCountVALUE, " ")
}
}
optionAdd = {"editable": true, "defaultValue": 0, nullable: true};
fieldsAdd[nowColCountVALUE] = optionAdd;
myFields[nowColCountVALUE] = optionAdd;
}
}
//열 삭제
// 열 삭제 (- 버튼)
function removeItemAt() {
var grid = kendoJQuery("#kictGrid").data("kendoGrid");
var dataSource = grid.dataSource;
var data = dataSource.data();
var nowColLength = grid.columns.length - 3; // 타이틀 수 제외
var nowRowLength = grid.dataSource.options.data.length
var nowColCount = nowColLength + 1;
var nowRowCount = nowRowLength;
if(nowColLength == 0){return false;} // 20211219 ssheo 행 (-) 차단
if($("#RTRICODE").val() == "" || $("#RTRICODE").val() == null){
alert("시료번호를 선택하세요.");
return false;
}
if( nowColCount == 2 ) {
// 0개까지 지울 수 있도록 허용 (최소 0개 유지)
if( nowColLength <= 0 ) {
return false;
} else {
nowColCount = nowColLength - 1
grid.columns.pop();
kendoJQuery("#kictGrid").find("tr td:nth-last-child(1)").each(function(){
kendoJQuery(this).remove();
});
}
var nowColCount = nowColLength - 1;
$("#GridRowCnt").val(nowColCount);
var dataItem = grid._data[nowColCount-1];
return dataItem.dirty = true;
// [수정] DOM 폼 동기화 제어
fn_ColAddInput(nowColCount);
var dataItem = grid._data[nowColCount-1];
if(dataItem) {
return dataItem.dirty = true;
}
}
//그리드 col수 이벤트
//그리드 col수 이벤트 (텍스트박스 숫자 입력 시)
function fn_rowChange(){
var grid = kendoJQuery("#kictGrid").data("kendoGrid");
var dataSource = grid.dataSource;
// 1. 현재 정보 파악
var currentColumns = grid.columns.slice(); // 기존 컬럼 배열 복사
var baseColCount = 3; // TITLE1, TITLE2, COLUMN (고정 컬럼 수)
var nowColLength = currentColumns.length - baseColCount;
var cnt = Number($("#GridRowCnt").val()) || 0;
var cnt = Number($("#GridRowCnt").val());
cnt = Number(cnt); // number로 형변환
if(cnt == null || cnt == ""){
if(isNaN(cnt) || cnt < 0){
cnt = 0;
}
if(cnt>=0){
if(cnt >= 0){
if($("#RTRICODE").val() == "" || $("#RTRICODE").val() == null){
alert("시료번호를 선택하세요.");
$("#GridRowCnt").val("0");
return false;
}
if(cnt == 0){
alert("1건 이상 입력하세요.");
$("#GridRowCnt").val(1);
$("#GridRowCnt").focus();
return false;
}
// 폼 추가삭제 로직 (0이더라도 깨끗하게 지우기 위해 호출)
fn_ColAddInput(cnt);
}
myFields = grid.dataSource.options.schema.model.fields;
// 2. 컬럼 배열 재구성
if (cnt > nowColLength) {
// 추가가 필요한 만큼 루프
var addCount = cnt - nowColLength;
for (var i = 1; i <= addCount; i++) {
var newIdx = nowColLength + i;
currentColumns.push({
field: "VALUE" + newIdx,
editor: chooseEditor
});
var colExists = false;
for(var c=0; c<currentColumns.length; c++) {
if(currentColumns[c].field === "VALUE" + newIdx) {
colExists = true; break;
}
}
if(!colExists) {
currentColumns.push({
field: "VALUE" + newIdx,
editor: chooseEditor
});
}
}
} else if (cnt < nowColLength) {
// 삭제가 필요한 만큼 제거 (최소 1개 유지 조건 등 추가 가능)
var removeCount = nowColLength - cnt;
for (var i = 0; i < removeCount; i++) {
currentColumns.pop();
@ -460,20 +444,16 @@ function fn_rowChange(){
return; // 변경 사항 없음
}
// 3. setOptions를 단 한 번 호출하여 그리드 전체 갱신
// 이 과정에서 Kendo가 HTML과 내부 객체를 모두 동기화합니다.
grid.setOptions({
columns: currentColumns
});
// 4. 데이터 세팅 (필요시)
// setOptions 후에는 데이터 소스를 다시 체크하여 신규 컬럼에 기본값 할당
var newData = dataSource.data();
for (var j = 0; j < newData.length; j++) {
for (var k = 1; k <= cnt; k++) {
var colName = "VALUE" + k;
if (newData[j][colName] === undefined) {
newData[j].set(colName, 0); // 기본값 0 세팅
newData[j].set(colName, 0);
if (newData[j].COLUMN === "TEST_ORDER") newData[j].set(colName, k);
if (newData[j].COLUMN === "RTRI_REMARK") newData[j].set(colName, " ");
}
@ -481,6 +461,26 @@ function fn_rowChange(){
}
}
// [수정] 폼 추가/삭제 제어 (0이면 삭제, 1이상이면 무조건 1개만 렌더링 유지)
function fn_ColAddInput(cnt){
var rtriCode = $("#RTRICODE").val();
// 이중 생성 막기 위해 구형 찌꺼기 완벽 제거
$("#table_file").children().not(".table-file-wrapper").remove();
if (cnt <= 0) {
// 0이면 무조건 삭제 (기존 파일 정보 지우기 배열에 저장)
var oldImg = $("#OLD_GRAPH_IMAGE_" + rtriCode).val();
if(oldImg) rowDelFileArr += oldImg + ",";
$("#table_file").empty();
} else {
// 1이상이면 무조건 폼은 딱 1개만 존재해야 함!
if ($("#TR_GRAPH_IMAGE_" + rtriCode).length === 0) {
$("#table_file").append(buildFileHtml('', ''));
}
}
}
/* 도움말 시작 */
function fn_help_tour_confirm(){
var answer;
@ -555,25 +555,16 @@ function fn_openClipReport2(table,project,hole,sample,etc1,etc2,gbn){
</script>
<!-- header start-->
<c:import url="/manage/includeTopInput.do" />
<!-- header end-->
<!-- 페이지 컨테이너 시작 -->
<section class="page-container">
<div class="page-content-wrapper">
<!-- 서브메뉴 시작 -->
<c:import url="/include_left_tree_input.do" />
<!-- 서브메뉴 끝 -->
<!-- 컨텐츠 시작 -->
<div class="page-content">
<div class="page-content-inner">
<!-- 카테고리 시작 -->
<div class="category-wrapper">
<ul class="page-category">
<li class="category-item" id="category_1dep"></li>
@ -583,23 +574,17 @@ function fn_openClipReport2(table,project,hole,sample,etc1,etc2,gbn){
<a href="javascript:;" class="btn btn-help start-tour" onClick="fn_help_tour_confirm();">도움말</a>
</div>
<!-- 카테고리 끝 -->
<h1 class="page-title-1depth"><span>삼축압축</span></h1>
<!-- 내용 시작 -->
<div class="content-wrapper">
<!-- contents start-->
<div class="contents">
<!-- 기본정보 출력 -->
<c:import url="/web/include/includeProjectRockInfo.do" />
<div class="table-top-control">
<div class="table-info-group form-inline" data-target="grid-row-cnt">
<input type="text" name="GridRowCnt" id="GridRowCnt" value="${fn:length(items)}" maxlength="2" onkeypress="fn_gridAddEnterKey(event);return isNumberKey(event);" onChange="fn_rowChange()"
onkeyup="fn_rowChange()"
onclick="this.select()"
onfocus="this.select()"
class="gg-input row-control-input" />
@ -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){
</div>
</div>
<!-- 첨부파일 -->
<form id="frmTri" name="frmTri" enctype="multipart/form-data">
<div id="table_file">
<c:if test="${params.RTRI_CODE != null and params.RTRI_CODE != '' and params.RTRI_CODE != 'null'}">
<div class="contents-title-1depth marT20"><span>삼축압축시험결과 그래프를 입력하세요. (최대크기: 500KB)</span></div>
<table class="table table-file marT0" data-target="form-file">
<colgroup>
<col width="160px" />
<col width="auto" />
</colgroup>
<tbody id="TR_GRAPH_IMAGE_${params.RTRI_CODE}">
<input type="hidden" id="OLD_GRAPH_IMAGE_${params.RTRI_CODE}" name="OLD_GRAPH_IMAGE_${params.RTRI_CODE}" value="${items[0].GRAPH_IMAGE}" />
<input type="hidden" id="OLD_GRAPH_LOCAL_${params.RTRI_CODE}" name="OLD_GRAPH_LOCAL_${params.RTRI_CODE}" value="${items[0].GRAPH_LOCAL}" />
<c:if test="${items[0].GRAPH_LOCAL != null and items[0].GRAPH_LOCAL != '' and items[0].GRAPH_LOCAL != 'null'}">
<div id="table_file" class="table-file">
<c:if test="${fn:length(items) > 0 and params.RTRI_CODE != null and params.RTRI_CODE != ''}">
<div id="TR_GRAPH_IMAGE_${params.RTRI_CODE}" class="table-file-wrapper">
<div class="contents-title-1depth marT20"><span>삼축압축시험결과 그래프 (1회)를(을) 입력하세요. (최대크기: 500KB) 파일은 <span class='textR'>JPEG 또는 PNG</span> 형태로 올려주셔야 합니다.</span></div>
<table class="table table-file marT0" data-target="form-file">
<colgroup>
<col width="160px" />
<col width="auto" />
</colgroup>
<tbody>
<input type="hidden" id="OLD_GRAPH_IMAGE_${params.RTRI_CODE}" name="OLD_GRAPH_IMAGE_${params.RTRI_CODE}" value="${items[0].GRAPH_IMAGE}" />
<input type="hidden" id="OLD_GRAPH_LOCAL_${params.RTRI_CODE}" name="OLD_GRAPH_LOCAL_${params.RTRI_CODE}" value="${items[0].GRAPH_LOCAL}" />
<tr>
<td class="td-head">
첨부파일입력
</td>
<td class="td-head">삼축압축시험결과<br>그래프 입력</td>
<td class="plus_file">
<input type="file" id="GRAPH_IMAGE_${params.RTRI_CODE}" name="GRAPH_IMAGE_${params.RTRI_CODE}" class="gg-input file-input" />
<ul class="content-ul-list marT5">
<li>
시험결과 그래프는 <span class="textR">필수입력</span>입니다.
</li>
<li>
파일크기는 "최대 500KB" 입니다.
</li>
<li>시험결과 그래프는 <span class="textR">필수입력</span>입니다.</li>
<li>파일크기는 "최대 500KB" 입니다.</li>
</ul>
</td>
</tr>
<c:if test="${items[0].GRAPH_IMAGE != '' and items[0].GRAPH_IMAGE != null and items[0].GRAPH_IMAGE != 'null'}">
<tr>
<td class="td-head">첨부된 파일정보</td>
<td class="plus_img">
@ -889,56 +863,30 @@ function fn_openClipReport2(table,project,hole,sample,etc1,etc2,gbn){
</a>
</td>
</tr>
</c:if>
<c:if test="${items[0].GRAPH_LOCAL == null or items[0].GRAPH_LOCAL == '' or items[0].GRAPH_LOCAL == 'null'}">
<tr>
<td class="td-head">
첨부파일입력
</td>
<td class="plus_file" colspan="3">
<input type="file" id="GRAPH_IMAGE_${params.RTRI_CODE}" name="GRAPH_IMAGE_${params.RTRI_CODE}" class="gg-input file-input" />
<ul class="content-ul-list marT5">
<li>
시험결과 그래프는 <span class="textR">필수입력</span>입니다.
</li>
<li>
파일크기는 "최대 500KB" 입니다.
</li>
</ul>
</td>
</tr>
</c:if>
</tbody>
</table>
</c:if>
</tbody>
</table>
</div>
</c:if>
</div>
<input type="hidden" id="PROJECT_CODE" name="PROJECT_CODE" value='<c:out value='${params.PROJECT_CODE}'/>' />
<input type="hidden" id="HOLE_CODE" name="HOLE_CODE" value='<c:out value='${params.HOLE_CODE}'/>' />
<input type="hidden" id="RTRI_CODE" name="RTRI_CODE" />
<input type="hidden" id="SAMPLE_CNT" name="SAMPLE_CNT" />
<input type="hidden" id="TOTALCNT" name="TOTALCNT" value="" />
<input type="hidden" id="dataAll" name="dataAll" />
<div id="hidden_params">
<input type="hidden" id="PROJECT_CODE" name="PROJECT_CODE" value='<c:out value="${params.PROJECT_CODE}"/>' />
<input type="hidden" id="HOLE_CODE" name="HOLE_CODE" value='<c:out value="${params.HOLE_CODE}"/>' />
<input type="hidden" id="RTRI_CODE" name="RTRI_CODE" />
<input type="hidden" id="SAMPLE_CNT" name="SAMPLE_CNT" />
<input type="hidden" id="TOTALCNT" name="TOTALCNT" value="" />
<input type="hidden" id="dataAll" name="dataAll" />
<input type="hidden" id="rowDelFileArr" name="rowDelFileArr" />
</div>
</form>
</div>
<!-- contents end-->
</div>
</div>
<!-- 내용 끝 -->
</div>
</div>
<!-- 컨텐츠 끝 -->
</div>
</div>
</section>
<!-- 페이지 컨테이너 끝 -->
<!-- footer start-->
<c:import url="/com/includeFooterInput.do?projectCode=${params.PROJECT_CODE}" />
<!-- footer end-->
<c:import url="/com/includeFooterInput.do?projectCode=${params.PROJECT_CODE}" />

View File

@ -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 = "<changedData>";
var m = "";
for(var i=0; i<kendoRowCount; i++){
var row = data[i];
var s = "<changedData>";
var m = "";
m = m + "<data>";
for(var i=0; i<kendoRowCount; i++){
var row = data[i];
for(var j=kendoStartIndex; j<kendoColCount; j++){
var column = grid.columns[j];
var dataField = column.field;
m = m + "<data>";
m = m + "<"+dataField+">" + isNumNullBlank(row[ dataField ]) + "</"+dataField+">";
}
m = m + "<COLUMN>" + row.COLUMN + "</COLUMN>";
m = m + "</data>";
}
var e = "</changedData>";
var strData = s+m+e;
// ----------------------- kendoGrid XML 구조저장 끝 -----------------------
for(var j=kendoStartIndex; j<kendoColCount; j++){
var column = grid.columns[j];
var dataField = column.field;
var runi_code = prevRuniCode;
var re_runi_code = prevRuniCode;
m = m + "<"+dataField+">" + isNumNullBlank(row[ dataField ]) + "</"+dataField+">";
// 삭제 되는 시료에 대한 처리
if(Number(runi_code.substr(11)) > Number($("#SAMPLECNT").val())){
re_runi_code = "";
$("#table_file").html('');
}
}
m = m + "<COLUMN>" + row.COLUMN + "</COLUMN>";
m = m + "</data>";
// 현재 선택된 열 인덱스 (파일 업로드 체크용)
var _seq = nowColumnIndex;
}
var e = "</changedData>";
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 = '<c:out value='${params.PROJECT_CODE}'/>';
var holeCode = '<c:out value='${params.HOLE_CODE}'/>';
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 = '<c:out value='${params.PROJECT_CODE}'/>';
var holeCode = '<c:out value='${params.HOLE_CODE}'/>';
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 = '<c:out value='${params.PROJECT_CODE}'/>';
document.getElementById("HOLE_CODE").value = '<c:out value='${params.HOLE_CODE}'/>';
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 += '<div id="TR_GRAPH_IMAGE1_' + testOrder + '" class="table-file-wrapper">';
file += ' <div class="contents-title-1depth marT20"><span>파괴형태 그림 (' + testOrder + '회)를(을) 입력하세요. (최대크기: 500KB)</span></div>';
file += ' <table class="table table-file marT0" data-target="form-file"><colgroup><col width="160px" /><col width="auto" /></colgroup>';
file += ' <tr><td class="td-head">첨부파일입력</td><td class="plus_file" colspan="3">';
file += ' <input type="file" id="GRAPH_IMAGE1_' + testOrder + '" name="GRAPH_IMAGE1_' + testOrder + '" class="gg-input file-input" />';
file += ' <ul class="content-ul-list marT5"><li>시험결과 그래프는 <span class="textR">필수입력</span>입니다.</li><li>파일크기는 "최대 500KB" 입니다.</li></ul>';
if(img1 !== ''){
file += ' <div class="marT10 marB10"><b>첨부파일</b> : <a href="#" onClick=\'fn_imgPlus("/files/web/${params.REPORT_TYPE}/${params.PROJECT_CODE}/${params.HOLE_CODE}/ROCK_UNIAXIAL/' + img1 + '", event.x,event.y); return false;\'>' + loc1 + '</a><label class="gg-checkbox gg-checkbox-outline marL20"><input type="checkbox" id="FILE_DEL1_' + testOrder + '" name="FILE_DEL1_' + testOrder + '" value="Y" class="checkbox_T" /> 파일삭제<span></span></label></div>';
file += ' <img src="/files/web/${params.REPORT_TYPE}/${params.PROJECT_CODE}/${params.HOLE_CODE}/ROCK_UNIAXIAL/' + img1 + '" class="file-preview-img" />';
}
file += ' <input type="hidden" id="OLD_GRAPH_IMAGE1_' + testOrder + '" name="OLD_GRAPH_IMAGE1_' + testOrder + '" value="' + img1 + '" />';
file += ' <input type="hidden" id="OLD_GRAPH_LOCAL1_' + testOrder + '" name="OLD_GRAPH_LOCAL1_' + testOrder + '" value="' + loc1 + '" />';
file += ' </td></tr></table></div>';
//file content
var file = '<div id="table_file" class="table-file">';
for(var i =0; i < arrayRock.length; i++){
file += ' <div class="contents-title-1depth marT20"><span>일축압축시험결과 그래프를 입력하세요. (최대크기: 500KB) 파일은 <span class="textR">JPEG 또는 PNG</span> 형태로 올려주셔야 합니다.</span></div>';
file += ' <table class="table table-file marT0" data-target="form-file">';
file += ' <colgroup>';
file += ' <col width="160px" />';
file += ' <col width="auto" />';
file += ' </colgroup>';
if(i == 0){
file += ' <tbody id="TR_GRAPH_IMAGE1_'+arrayRock[i].testOrder+'" style="display:\'\'">';
}else{
file += ' <tbody id="TR_GRAPH_IMAGE1_'+arrayRock[i].testOrder+'" style="display:none">';
}
file += ' <input type="hidden" id="OLD_GRAPH_IMAGE1_'+arrayRock[i].testOrder+'" name="OLD_GRAPH_IMAGE1_'+arrayRock[i].testOrder+'" value="'+arrayRock[i].graphImage1+'" />';
file += ' <input type="hidden" id="OLD_GRAPH_LOCAL1_'+arrayRock[i].testOrder+'" name="OLD_GRAPH_LOCAL1_'+arrayRock[i].testOrder+'" value="'+arrayRock[i].graphLocal1+'" />';
file += ' <input type="hidden" id="OLD_GRAPH_IMAGE2_'+arrayRock[i].testOrder+'" name="OLD_GRAPH_IMAGE2_'+arrayRock[i].testOrder+'" value="'+arrayRock[i].graphImage2+'" />';
file += ' <input type="hidden" id="OLD_GRAPH_LOCAL2_'+arrayRock[i].testOrder+'" name="OLD_GRAPH_LOCAL2_'+arrayRock[i].testOrder+'" value="'+arrayRock[i].graphLocal2+'" />';
if(arrayRock[i].graphImage1 != '' && arrayRock[i].graphImage1 != null && arrayRock[i].graphImage1 != 'null'){
file += ' <tr>';
file += ' <td class="td-head">';
file += ' 파괴형태<br>그림 입력';
file += ' </td>';
file += ' <td class="plus_file">';
file += ' <input type="file" id="GRAPH_IMAGE1_'+arrayRock[i].testOrder+'" name="GRAPH_IMAGE1_'+arrayRock[i].testOrder+'" class="gg-input file-input" />';
file += ' <ul class="content-ul-list marT5">';
file += ' <li>';
file += ' 시험결과 그래프는 <span class="textR">필수입력</span>입니다.';
file += ' </li>';
file += ' <li>';
file += ' 파일크기는 "최대 500KB" 입니다.';
file += ' </li>';
file += ' </ul>';
file += ' </td>';
file += ' </tr>';
file += ' <tr>';
file += ' <td class="td-head">파괴형태<br>첨부된 파일정보</td>';
file += ' <td class="plus_img">';
file += ' <div class="marB10">';
file += ' <b>첨부파일</b> :';
file += ' <a href="#" onClick=\'fn_imgPlus("/files/web/CH/${params.PROJECT_CODE}/${params.HOLE_CODE}/ROCK_UNIAXIAL/'+arrayRock[i].graphImage1+'", event.x,event.y); return false;\'>'+arrayRock[i].graphLocal1+'</a>';
file += ' <label class="gg-checkbox gg-checkbox-outline marL20">';
file += ' <input type="checkbox" id="FILE_DEL1_'+arrayRock[i].testOrder+'" name="FILE_DEL1_'+arrayRock[i].testOrder+'" value="Y" class="checkbox_T" /> 파일삭제';
file += ' <span></span>';
file += ' </label>';
file += ' </div>';
file += ' <a href="#" onClick=\'fn_imgPlus("/files/web/CH/${params.PROJECT_CODE}/${params.HOLE_CODE}/ROCK_UNIAXIAL/'+arrayRock[i].graphImage1+'", event.x,event.y); return false;\'>';
file += ' <img src="/files/web/CH/${params.PROJECT_CODE}/${params.HOLE_CODE}/ROCK_UNIAXIAL/'+arrayRock[i].graphImage1+'" class="file-preview-img" />';
file += ' </a>';
file += ' </td>';
file += ' </tr>';
}
if(arrayRock[i].graphImage1 == '' || arrayRock[i].graphImage1 == null || arrayRock[i].graphImage1 == 'null'){
file += ' <tr>';
file += ' <td class="td-head">';
file += ' 파괴형태<br>그림 입력';
file += ' </td>';
file += ' <td class="plus_file" colspan="3">';
file += ' <input type="file" id="GRAPH_IMAGE1_'+arrayRock[i].testOrder+'" name="GRAPH_IMAGE1_'+arrayRock[i].testOrder+'" class="gg-input file-input" />';
file += ' <ul class="content-ul-list marT5">';
file += ' <li>';
file += ' 시험결과 그래프는 <span class="textR">필수입력</span>입니다.';
file += ' </li>';
file += ' <li>';
file += ' 파일크기는 "최대 500KB" 입니다.';
file += ' </li>';
file += ' </ul>';
file += ' </td>';
file += ' </tr>';
}
file += ' </tbody>';
if(i == 0){
file += ' <tbody id="TR_GRAPH_IMAGE2_'+arrayRock[i].testOrder+'" style="display:\'\'">';
}else{
file += ' <tbody id="TR_GRAPH_IMAGE2_'+arrayRock[i].testOrder+'" style="display:none">';
}
if(arrayRock[i].graphImage2 != '' && arrayRock[i].graphImage2 != null && arrayRock[i].graphImage2 != 'null'){
file += ' <tr>';
file += ' <td class="td-head">';
file += ' Stress-Strain<br>그래프 입력';
file += ' </td>';
file += ' <td class="plus_file">';
file += ' <input type="file" id="GRAPH_IMAGE2_'+arrayRock[i].testOrder+'" name="GRAPH_IMAGE2_'+arrayRock[i].testOrder+'" class="gg-input file-input" />';
file += ' <ul class="content-ul-list marT5">';
file += ' <li>';
file += ' 시험결과 그래프는 <span class="textR">필수입력</span>입니다.';
file += ' </li>';
file += ' <li>';
file += ' 파일크기는 "최대 500KB" 입니다.';
file += ' </li>';
file += ' </ul>';
file += ' </td>';
file += ' </tr>';
file += ' <tr>';
file += ' <td class="td-head">Stress-Strain<br>첨부된 파일정보</td>';
file += ' <td class="plus_img">';
file += ' <div class="marB10">';
file += ' <b>첨부파일</b> :';
file += ' <a href="#" onClick=\'fn_imgPlus("/files/web/CH/${params.PROJECT_CODE}/${params.HOLE_CODE}/ROCK_UNIAXIAL/'+arrayRock[i].graphImage2+'", event.x,event.y); return false;\'>'+arrayRock[i].graphLocal2+'</a>';
file += ' <label class="gg-checkbox gg-checkbox-outline marL20">';
file += ' <input type="checkbox" id="FILE_DEL2_'+arrayRock[i].testOrder+'" name="FILE_DEL2_'+arrayRock[i].testOrder+'" value="Y" class="checkbox_T" /> 파일삭제';
file += ' <span></span>';
file += ' </label>';
file += ' </div>';
file += ' <a href="#" onClick=\'fn_imgPlus("/files/web/CH/${params.PROJECT_CODE}/${params.HOLE_CODE}/ROCK_UNIAXIAL/'+arrayRock[i].graphImage2+'", event.x,event.y); return false;\'>';
file += ' <img src="/files/web/CH/${params.PROJECT_CODE}/${params.HOLE_CODE}/ROCK_UNIAXIAL/'+arrayRock[i].graphImage2+'" class="file-preview-img" />';
file += ' </a>';
file += ' </td>';
file += ' </tr>';
}
if(arrayRock[i].graphImage2 == '' || arrayRock[i].graphImage2 == null || arrayRock[i].graphImage2 == 'null'){
file += ' <tr>';
file += ' <td class="td-head">';
file += ' Stress-Strain<br>그래프 입력';
file += ' </td>';
file += ' <td class="plus_file" colspan="3">';
file += ' <input type="file" id="GRAPH_IMAGE2_'+arrayRock[i].testOrder+'" name="GRAPH_IMAGE2_'+arrayRock[i].testOrder+'" class="gg-input file-input" />';
file += ' <ul class="content-ul-list marT5">';
file += ' <li>';
file += ' 시험결과 그래프는 <span class="textR">필수입력</span>입니다.';
file += ' </li>';
file += ' <li>';
file += ' 파일크기는 "최대 500KB" 입니다.';
file += ' </li>';
file += ' </ul>';
file += ' </td>';
file += ' </tr>';
}
file += ' </tbody>';
file += ' </table>';
}
file += ' <input type="hidden" id="PROJECT_CODE" name="PROJECT_CODE" value="${params.PROJECT_CODE}" />';
file += ' <input type="hidden" id="HOLE_CODE" name="HOLE_CODE" value="${params.HOLE_CODE}" />';
file += ' <input type="hidden" id="RUNI_CODE" name="RUNI_CODE" value="${params.RUNI_CODE}"/>';
file += ' <input type="hidden" id="SAMPLE_CNT" name="SAMPLE_CNT"/>';
file += ' <input type="hidden" id="TOTALCNT" name="TOTALCNT" value="" />';
file += ' <input type="hidden" id="dataAll" name="dataAll" />';
file += ' <input type="hidden" id="rowDelFileArr" name="rowDelFileArr" />';
file += '</div>';
$("#table_file").html(file);
$("#GridRowCnt").val(arrayRock.length);
// Stress-Strain 그래프
file += '<div id="TR_GRAPH_IMAGE2_' + testOrder + '" class="table-file-wrapper">';
file += ' <div class="contents-title-1depth marT20"><span>Stress-Strain 그래프 (' + testOrder + '회)를(을) 입력하세요. (최대크기: 500KB)</span></div>';
file += ' <table class="table table-file marT0" data-target="form-file"><colgroup><col width="160px" /><col width="auto" /></colgroup>';
file += ' <tr><td class="td-head">첨부파일입력</td><td class="plus_file" colspan="3">';
file += ' <input type="file" id="GRAPH_IMAGE2_' + testOrder + '" name="GRAPH_IMAGE2_' + testOrder + '" class="gg-input file-input" />';
file += ' <ul class="content-ul-list marT5"><li>시험결과 그래프는 <span class="textR">필수입력</span>입니다.</li><li>파일크기는 "최대 500KB" 입니다.</li></ul>';
if(img2 !== ''){
file += ' <div class="marT10 marB10"><b>첨부파일</b> : <a href="#" onClick=\'fn_imgPlus("/files/web/${params.REPORT_TYPE}/${params.PROJECT_CODE}/${params.HOLE_CODE}/ROCK_UNIAXIAL/' + img2 + '", event.x,event.y); return false;\'>' + loc2 + '</a><label class="gg-checkbox gg-checkbox-outline marL20"><input type="checkbox" id="FILE_DEL2_' + testOrder + '" name="FILE_DEL2_' + testOrder + '" value="Y" class="checkbox_T" /> 파일삭제<span></span></label></div>';
file += ' <img src="/files/web/${params.REPORT_TYPE}/${params.PROJECT_CODE}/${params.HOLE_CODE}/ROCK_UNIAXIAL/' + img2 + '" class="file-preview-img" />';
}
file += ' <input type="hidden" id="OLD_GRAPH_IMAGE2_' + testOrder + '" name="OLD_GRAPH_IMAGE2_' + testOrder + '" value="' + img2 + '" />';
file += ' <input type="hidden" id="OLD_GRAPH_LOCAL2_' + testOrder + '" name="OLD_GRAPH_LOCAL2_' + testOrder + '" value="' + loc2 + '" />';
file += ' </td></tr></table></div>';
}
$("#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){
<div id="table_file" class="table-file">
<c:forEach var="mapFile" items="${arrayRock}" varStatus="status">
<div class="contents-title-1depth marT20"><span>일축압축시험결과 그래프를 입력하세요. (최대크기: 500KB) 파일은 <span class='textR'>JPEG 또는 PNG</span> 형태로 올려주셔야 합니다.</span></span></div>
<table class="table table-file marT0" data-target="form-file">
<colgroup>
<col width="160px" />
<col width="auto" />
</colgroup>
<!-- 이미지 1 -->
<c:if test="${status.index == 0 }">
<tbody id="TR_GRAPH_IMAGE1_${mapFile.testOrder}" style="display:''">
</c:if>
<c:if test="${status.index != 0 }">
<tbody id="TR_GRAPH_IMAGE1_${mapFile.testOrder}" style="display:none">
</c:if>
<input type="hidden" id="OLD_GRAPH_IMAGE1_${mapFile.testOrder}" name="OLD_GRAPH_IMAGE1_${mapFile.testOrder}" value="${mapFile.graphImage1}" />
<input type="hidden" id="OLD_GRAPH_LOCAL1_${mapFile.testOrder}" name="OLD_GRAPH_LOCAL1_${mapFile.testOrder}" value="${mapFile.graphLocal1}" />
<input type="hidden" id="OLD_GRAPH_IMAGE2_${mapFile.testOrder}" name="OLD_GRAPH_IMAGE2_${mapFile.testOrder}" value="${mapFile.graphImage2}" />
<input type="hidden" id="OLD_GRAPH_LOCAL2_${mapFile.testOrder}" name="OLD_GRAPH_LOCAL2_${mapFile.testOrder}" value="${mapFile.graphLocal2}" />
<c:if test="${mapFile.graphImage1 != '' and mapFile.graphImage1 != null and mapFile.graphImage1 != 'null'}">
<div id="TR_GRAPH_IMAGE1_${mapFile.testOrder}" class="table-file-wrapper">
<div class="contents-title-1depth marT20"><span>파괴형태 그림 (${mapFile.testOrder}회)를(을) 입력하세요. (최대크기: 500KB) 파일은 <span class='textR'>JPEG 또는 PNG</span> 형태로 올려주셔야 합니다.</span></div>
<table class="table table-file marT0" data-target="form-file">
<colgroup>
<col width="160px" />
<col width="auto" />
</colgroup>
<tbody>
<input type="hidden" id="OLD_GRAPH_IMAGE1_${mapFile.testOrder}" name="OLD_GRAPH_IMAGE1_${mapFile.testOrder}" value="${mapFile.graphImage1}" />
<input type="hidden" id="OLD_GRAPH_LOCAL1_${mapFile.testOrder}" name="OLD_GRAPH_LOCAL1_${mapFile.testOrder}" value="${mapFile.graphLocal1}" />
<tr>
<td class="td-head">
파괴형태<br>그림 입력
</td>
<td class="td-head">파괴형태<br>그림 입력</td>
<td class="plus_file">
<input type="file" id="GRAPH_IMAGE1_${mapFile.testOrder}" name="GRAPH_IMAGE1_${mapFile.testOrder}" class="gg-input file-input" />
<ul class="content-ul-list marT5">
<li>
시험결과 그래프는 <span class="textR">필수입력</span>입니다.
</li>
<li>
파일크기는 "최대 500KB" 입니다.
</li>
<li>시험결과 그래프는 <span class="textR">필수입력</span>입니다.</li>
<li>파일크기는 "최대 500KB" 입니다.</li>
</ul>
</td>
</tr>
<c:if test="${mapFile.graphImage1 != '' and mapFile.graphImage1 != null and mapFile.graphImage1 != 'null'}">
<tr>
<td class="td-head">파괴형태<br>첨부된 파일정보</td>
<td class="plus_img">
@ -1276,53 +1131,33 @@ function fn_openClipReport2(table,project,hole,sample,etc1,etc2,gbn){
</a>
</td>
</tr>
</c:if>
<c:if test="${mapFile.graphImage1 == '' or mapFile.graphImage1 == null or mapFile.graphImage1 == 'null'}">
</c:if>
</tbody>
</table>
</div>
<div id="TR_GRAPH_IMAGE2_${mapFile.testOrder}" class="table-file-wrapper">
<div class="contents-title-1depth marT20"><span>Stress-Strain 그래프 (${mapFile.testOrder}회)를(을) 입력하세요. (최대크기: 500KB)</span></div>
<table class="table table-file marT0" data-target="form-file">
<colgroup>
<col width="160px" />
<col width="auto" />
</colgroup>
<tbody>
<input type="hidden" id="OLD_GRAPH_IMAGE2_${mapFile.testOrder}" name="OLD_GRAPH_IMAGE2_${mapFile.testOrder}" value="${mapFile.graphImage2}" />
<input type="hidden" id="OLD_GRAPH_LOCAL2_${mapFile.testOrder}" name="OLD_GRAPH_LOCAL2_${mapFile.testOrder}" value="${mapFile.graphLocal2}" />
<tr>
<td class="td-head">
파괴형태<br>그림 입력
</td>
<td class="plus_file" colspan="3">
<input type="file" id="GRAPH_IMAGE1_${mapFile.testOrder}" name="GRAPH_IMAGE1_${mapFile.testOrder}" class="gg-input file-input" />
<ul class="content-ul-list marT5">
<li>
시험결과 그래프는 <span class="textR">필수입력</span>입니다.
</li>
<li>
파일크기는 "최대 500KB" 입니다.
</li>
</ul>
</td>
</tr>
</c:if>
</tbody>
<!-- 이미지 2 -->
<c:if test="${status.index == 0 }">
<tbody id="TR_GRAPH_IMAGE2_${mapFile.testOrder}" style="display:''">
</c:if>
<c:if test="${status.index != 0 }">
<tbody id="TR_GRAPH_IMAGE2_${mapFile.testOrder}" style="display:none">
</c:if>
<c:if test="${mapFile.graphImage2 != '' and mapFile.graphImage2 != null and mapFile.graphImage2 != 'null'}">
<tr>
<td class="td-head">
Stress-Strain<br>그래프 입력
</td>
<td class="td-head">Stress-Strain<br>그래프 입력</td>
<td class="plus_file">
<input type="file" id="GRAPH_IMAGE2_${mapFile.testOrder}" name="GRAPH_IMAGE2_${mapFile.testOrder}" class="gg-input file-input" />
<ul class="content-ul-list marT5">
<li>
시험결과 그래프는 <span class="textR">필수입력</span>입니다.
</li>
<li>
파일크기는 "최대 500KB" 입니다.
</li>
<li>시험결과 그래프는 <span class="textR">필수입력</span>입니다.</li>
<li>파일크기는 "최대 500KB" 입니다.</li>
</ul>
</td>
</tr>
<c:if test="${mapFile.graphImage2 != '' and mapFile.graphImage2 != null and mapFile.graphImage2 != 'null'}">
<tr>
<td class="td-head">Stress-Strain<br>첨부된 파일정보</td>
<td class="plus_img">
@ -1339,38 +1174,23 @@ function fn_openClipReport2(table,project,hole,sample,etc1,etc2,gbn){
</a>
</td>
</tr>
</c:if>
<c:if test="${mapFile.graphImage2 == '' or mapFile.graphImage2 == null or mapFile.graphImage2 == 'null'}">
<tr>
<td class="td-head">
Stress-Strain<br>그래프 입력
</td>
<td class="plus_file" colspan="3">
<input type="file" id="GRAPH_IMAGE2_${mapFile.testOrder}" name="GRAPH_IMAGE2_${mapFile.testOrder}" class="gg-input file-input" />
<ul class="content-ul-list marT5">
<li>
시험결과 그래프는 <span class="textR">필수입력</span>입니다.
</li>
<li>
파일크기는 "최대 500KB" 입니다.
</li>
</ul>
</td>
</tr>
</c:if>
</tbody>
</table>
</c:if>
</tbody>
</table>
</div>
</c:forEach>
<input type="hidden" id="PROJECT_CODE" name="PROJECT_CODE" value='<c:out value='${params.PROJECT_CODE}'/>' />
<input type="hidden" id="HOLE_CODE" name="HOLE_CODE" value='<c:out value='${params.HOLE_CODE}'/>' />
<input type="hidden" id="RUNI_CODE" name="RUNI_CODE" value='<c:out value='${params.RUNI_CODE}'/>'/>
<input type="hidden" id="SAMPLE_CNT" name="SAMPLE_CNT"/>
<input type="hidden" id="TOTALCNT" name="TOTALCNT" value="" />
<input type="hidden" id="dataAll" name="dataAll" />
<input type="hidden" id="rowDelFileArr" name="rowDelFileArr" />
</div>
<div id="hidden_params">
<input type="hidden" id="PROJECT_CODE" name="PROJECT_CODE" value="${params.PROJECT_CODE}" />
<input type="hidden" id="HOLE_CODE" name="HOLE_CODE" value="${params.HOLE_CODE}" />
<input type="hidden" id="RUNI_CODE" name="RUNI_CODE" value="${params.RUNI_CODE}" />
<input type="hidden" id="SAMPLE_CNT" name="SAMPLE_CNT" value="" />
<input type="hidden" id="TOTALCNT" name="TOTALCNT" value="" />
<input type="hidden" id="dataAll" name="dataAll" />
<input type="hidden" id="rowDelFileArr" name="rowDelFileArr" />
</div>
</form>
</div>
<!-- contents end-->

View File

@ -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('<input type="' + inputType + '" step="any" name="' + options.field + '" class="k-textbox" style="width:100%; text-align:right;" />');
// 소수점을 입력받아야 하므로 항상 text 타입을 권장합니다. (number 타입의 브라우저 간섭 방지)
var inputType = "text";
var input = kendoJQuery('<input type="' + inputType + '" name="' + options.field + '" class="k-textbox" style="width:100%; text-align:right;" />');
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);
}
}
});