jqGrid 인라인 편집 및 데이터 저장 기능 구현

jqGrid 테이블의 인라인 편집, 저장 및 취소 기능 구현

HTML 구조

<div class="panel-body">
    
    <div id="gridPager"></div>
</div>

JavaScript 코드

$("#gridTable").jqGrid({
    colModel: [ //jqGrid 각 열의 구성 정보. 이름, 인덱스, 너비, 정렬 방식 등...
        {name: 'id', index: 'id', width: 100, align: 'right'},
        // 첫 번째 단계: upperLimit 열을 편집 가능하도록 설정
        {name: 'upperLimit', index: 'upperLimit', width: 150, align: "right", editable: true},
        {name: 'lowerLimit', index: 'lowerLimit', width: 150, align: "right", editable: true}, 
        {name: 'actions', index: 'actions', width: 100, height: 300, align: "right"}],
    gridComplete: function() { // 두 번째 단계: 데이터 로딩 완료 후 작업 버튼 추가  
        var rowIds = jQuery("#gridTable").jqGrid('getDataIDs'); // 테이블의 모든 행 ID 가져오기
        for (var i = 0; i < rowIds.length; i++) {
            var currentId = rowIds[i];
            var actionButtons = "<div class='btnBox'> " +
                               "<button type='button' onclick='modifyRowData(" +
                               currentId +
                               ")'>편집</button>" +
                               "<button type='button' onclick='saveRowData(" +
                               currentId +
                               ")'>저장</button>" +
                               "<button type='button' onclick='cancelRowEdit(" +
                               currentId + ")'>취소</button> </div>"

            jQuery("#gridTable").jqGrid('setRowData', rowIds[i], {actions: actionButtons}); // 각 행에 작업 버튼 추가
        }
    }
});

function modifyRowData(rowId) { // 세 번째 단계: 편집 작업 정의
    var configOptions = {
        oneditfunc: function(rowid) { // 행이 성공적으로 편집 모드로 전환될 때 트리거되는 이벤트
            //console.log("Editing row: " + rowid);
        }
    }
    
    jQuery("#gridTable").editRow(rowId); // 편집 모드 활성화
    jQuery('#gridTable').jqGrid('editRow', rowId, true, attachDatePicker); // 편집 모드 활성화 및 날짜 선택기 연결
}

// 네 번째 단계: 저장 작업 정의, 편집된 데이터를 키-값 쌍으로 백엔드로 전송
function saveRowData(rowId) {  
    var saveConfig = {
        url: "sensor/updateParameters", // jqGrid의 editurl 대체
        mtype: "POST",
        extraparam: { // 백엔드로 전송될 추가 데이터
            "extraParam1": "1",
            "extraParam2": "2"
        },
        successfunc: function(response) { // 요청 성공 후 즉시 호출되는 함수
            alert(response.responseText); // 백엔드에서 반환된 데이터 수신
            if (response.responseText === "false") {
                alert("상한값은 하한값보다 클 수 없습니다");
                return false; // false 반환 시 수정 전 데이터로 채우고 편집 모드를 종료합니다.
            } else {
                alert("편집 성공");
                return true; // true 반환 시 수정된 데이터로 현재 행을 채우고 편집 모드를 종료합니다.
            }
        }
    };
    
    jQuery('#gridTable').saveRow(rowId, saveConfig);
}

// 다섯 번째 단계: 취소 작업 정의
function cancelRowEdit(rowId) {
    jQuery('#gridTable').restoreRow(rowId); // 수정 전 데이터로 현재 행을 채웁니다
}

Java 컨트롤러 코드

/** 센서 매개변수 설정 
컨트롤러 메서드가 매개변수를 수신하고 반환값을 처리하는 방법에 중점을 둡니다 **/
@RequiresPermissions("sensor:create")
@ResponseBody
@RequestMapping(value = "sensor/updateParameters", method = RequestMethod.POST)
public boolean updateSensorParameters(Model model, long sensorId, Float upperBound, Float lowerBound, String extraParam1, String extraParam2) {
    if (upperBound > lowerBound) { // 데이터베이스에 저장하고 true 반환
        Sensor sensor = sensorService.findById(sensorId);
        sensor.setUpperLimit(upperBound);
        sensor.setLowerLimit(lowerBound);
        sensorService.save(sensor);
        return true;
    } else { // false 반환
        return false;
    }
}

매개변수 상세 설명 (1)url: 이 값이 정의된 경우 jqGrid의 editurl을 덮어씁니다 url="clientArray"로 설정하면 서버 측 요청이 트리거되지 않습니다 (2)extraparam: 요청 매개변수 목록 (3)successfunc: 요청 성공 후 즉시 호출되며, 이 함수 서명에는 서버에서 반환된 데이터가 포함됩니다. 동시에 이 함수는 true/false를 반환해야 합니다

인라인 편집 시 특정 셀에 날짜 선택기 바인딩

function modifyRowData(rowId) { // 세 번째 단계: 편집 작업 정의
    // 편집 모드를 활성화하고 pickdates() 함수에 rowId 매개변수 전달
    jQuery('#gridTable').jqGrid('editRow', rowId, true, attachDatePicker);
}

function attachDatePicker(id) {
    // ***jqGrid의 셀 ID는 행번호_열명 형식입니다***
    // ID가 gridTable인 테이블의 id번째 행 upperLimit 열에 click 이벤트 추가 및 날짜 선택기 바인딩
    jQuery("#" + id + "_upperLimit", "#gridTable").bind("click",
            function() {
                WdatePicker({
                    dateFmt: 'HH:mm'
                });
            });
    
    // ID가 gridTable인 테이블의 id번째 행 lowerLimit 열에 click 이벤트 추가 및 날짜 선택기 바인딩
    jQuery("#" + id + "_lowerLimit", "#gridTable").bind("click",
            function() {
                WdatePicker({
                    dateFmt: 'HH:mm'
                });
            });
}

태그: jqGrid JavaScript java 웹 프론트엔드 데이터 그리드

6월 29일 19:05에 게시됨