From ce4175e783bc89a00fcf88c79a5cf5ed4993ec65 Mon Sep 17 00:00:00 2001 From: thkim Date: Thu, 26 Mar 2026 11:45:34 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EC=95=94=EC=84=9D=EC=8B=9C=ED=97=98?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=20>=20=EC=82=BC=EC=B6=95=EC=95=95=EC=B6=95?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EA=B0=92=20=EC=9E=85=EB=A0=A5=EC=8B=9C,?= =?UTF-8?q?=20=EB=94=9C=EB=A0=88=EC=9D=B4=ED=98=84=EC=83=81=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../views/web/input/rock/rockTriaxial.jsp | 120 +++++++++--------- src/main/webapp/kendo-ui/js/common.js | 47 ++++--- 2 files changed, 88 insertions(+), 79 deletions(-) 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 05be866a..510bc738 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 @@ -408,16 +408,15 @@ function removeItemAt() { //그리드 col수 이벤트 function fn_rowChange(){ var grid = kendoJQuery("#kictGrid").data("kendoGrid"); - var dataSource = grid.dataSource; - var data = dataSource.data(); + var dataSource = grid.dataSource; + + // 1. 현재 정보 파악 + var currentColumns = grid.columns.slice(); // 기존 컬럼 배열 복사 + var baseColCount = 3; // TITLE1, TITLE2, COLUMN (고정 컬럼 수) + var nowColLength = currentColumns.length - baseColCount; - var nowColLength = grid.columns.length - 3; // 타이틀 & COLUMN 수 제외 - var nowRowLength = grid.dataSource.options.data.length - var nowColCount = nowColLength; - var nowRowCount = nowRowLength; - - //입력한 수 - var cnt = $("#GridRowCnt").val(); + var cnt = Number($("#GridRowCnt").val()) || 0; + cnt = Number(cnt); // number로 형변환 if(cnt == null || cnt == ""){ cnt = 0; @@ -432,7 +431,7 @@ function fn_rowChange(){ if(cnt == 0){ alert("1건 이상 입력하세요."); - $("#GridRowCnt").val(nowColCount-2); + $("#GridRowCnt").val(1); $("#GridRowCnt").focus(); return false; } @@ -440,48 +439,46 @@ function fn_rowChange(){ myFields = grid.dataSource.options.schema.model.fields; - if( cnt >= nowColLength ){ - var nowColCount = cnt - nowColLength + // 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 + }); + } + } else if (cnt < nowColLength) { + // 삭제가 필요한 만큼 제거 (최소 1개 유지 조건 등 추가 가능) + var removeCount = nowColLength - cnt; + for (var i = 0; i < removeCount; i++) { + currentColumns.pop(); + } + } else { + return; // 변경 사항 없음 + } - var fieldsAdd = new Object(); - var optionAdd = new Object(); + // 3. setOptions를 단 한 번 호출하여 그리드 전체 갱신 + // 이 과정에서 Kendo가 HTML과 내부 객체를 모두 동기화합니다. + grid.setOptions({ + columns: currentColumns + }); - for (var i = 1; i < nowColCount + 1; i++) { - var nowColCountAdd = nowColLength + i - var nowColCountVALUE = 'VALUE' + nowColCountAdd; - grid.setOptions({ - columns: grid.columns.concat([ - { field: nowColCountVALUE, editor: chooseEditor } - ]) - }); - for (var j = 0; j < nowRowCount; j++) { - dataSource.data()[j].set(nowColCountVALUE, 0); - if (grid.dataSource.options.data[j].COLUMN === "TEST_ORDER") { - dataSource.data()[j].set(nowColCountVALUE, nowColCountAdd) - } else if (grid.dataSource.options.data[j].COLUMN === "RTRI_REMARK") { - dataSource.data()[j].set(nowColCountVALUE, " ") - } - } - } - - optionAdd = {"editable": true, "defaultValue": 0, nullable: true}; - fieldsAdd[nowColCountVALUE] = optionAdd; - myFields[nowColCountVALUE] = optionAdd; - - } else { - var nowColCount = nowColLength - cnt - - if( nowColCount == 3 ) { // 타이틀 & COLUMN & 첫번째 VALUE 수 제외 - return false; - } else { - for (var i = 0; i < nowColCount; i++) { - grid.columns.pop(); - kendoJQuery("#kictGrid").find("tr td:nth-last-child(1)").each(function(){ - kendoJQuery(this).remove(); - }); - } - } - } + // 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 세팅 + if (newData[j].COLUMN === "TEST_ORDER") newData[j].set(colName, k); + if (newData[j].COLUMN === "RTRI_REMARK") newData[j].set(colName, " "); + } + } + } } /* 도움말 시작 */ @@ -677,18 +674,19 @@ function fn_openClipReport2(table,project,hole,sample,etc1,etc2,gbn){ function onEdit(e) { var data = e.model; - if (data.COLUMN === "TEST_ORDER") { - this.closeCell(); - } - e.preventDefault(); + if (data.COLUMN === "TEST_ORDER") { + this.closeCell(); + return; + } - // input focus select 옵션 - var input = e.container.find("input"); - input.focus(function (e) { - setTimeout(function () { - input.select(); - }); - }); + // 에디터 활성화 시 즉시 선택 로직 + var input = e.container.find("input.k-input"); + if (input.length > 0) { + // Kendo 포맷팅 처리가 끝난 직후에 select가 실행되도록 딜레이 조정 + setTimeout(function () { + input.select(); + }, 1); + } } function fn_kendoGrid() { diff --git a/src/main/webapp/kendo-ui/js/common.js b/src/main/webapp/kendo-ui/js/common.js index 35a9d112..973e4891 100644 --- a/src/main/webapp/kendo-ui/js/common.js +++ b/src/main/webapp/kendo-ui/js/common.js @@ -14,24 +14,35 @@ function textEditor(container, options) { // 입력 type number로 변경 function numericEditor(container, options, isHyphenAllowed = false) { - /*kendoJQuery('')*/ - kendoJQuery('') - .appendTo(container) - .kendoNumericTextBox({ - format : "n20", - decimals: 20, - round: false, - //restrictDecimals: true, - change: function (e) { - if (e.sender.value() == null) { - options.model.set("result", null); - } else { - options.model.set("result", e.sender.value()); - } - } - }) - // NumericTextBox from 텍스트 길이 제한 - //numericLengthControl(); + // 1. 하이픈 허용 여부에 따라 타입을 결정합니다. + // 하이픈을 문자로서 입력받으려면 'text' 타입이 필요합니다. + var inputType = isHyphenAllowed ? "text" : "number"; + var input = kendoJQuery(''); + + input.appendTo(container) + .val(options.model[options.field]) + .on("focus", function() { + this.select(); + }) + .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 { + // 숫자로 변환하여 모델에 저장 + var valNum = parseFloat(valStr); + var finalVal = isNaN(valNum) ? null : valNum; + + options.model.set(options.field, finalVal); + // options.model.set("result", finalVal); // 필요시 추가 + } + }); + + input.focus(); }