jquery dialog 기능을 이용해 정보를 출력하는 창을 띄우도록 작업했다.

resize 가능하도록 작업을 해뒀는데 

다이얼로그 화면 크기를 조절하면 자꾸만 jqgrid 작업중에 페이징 영역이 자꾸 테이블과 동떨어지게 

나타나는 현상이 있었다. 

 

개발자 도구를 열어 확인해보니 ui-pg-table 클래스를 가진 table에 입혀진  height 를 제거하니 원하는대로 

테이블 바로 아래 출력되는걸 확인했다~ 그럼 지워 봅시다~ 

 

Pager를 추적해보니 jquery.jqGrid.src.js 파일에서 설정되고 있는걸 확인!! 

 

저 height 를 지워주고 ~~ 캐시 날리고 다시 실행해본다!

 

굳!!  원하던대로 화면 사이즈를 조잘해도 잘 붙어서 나온다~~ 

작업환경 : Spring Framework + thymeleaf + jqgrid 

jqGrid 를 이용해 출력된 데이터를 바로바로 수정하고 싶다. 

jqGrid 의 수정기능을 사용해 적용했다 아래 코드로 하면 cell 더블 클릭 후 값을 입력하고 엔터키를 

누르면 즉시 수정되는 코드이다. 

 

 

나중에 다시 사용하기 위해 아주 간단한 흐름으로 정리했다~ !

 

* 미래의 나를위한 메모 *   

실제 파일에서 사용된 텍스트를 포스팅을 위해 customer 변경한 부분이 있음 에러가 있다면 알아서 수정해서 쓰기! 

 

Controller 

@Controller
@RequestMapping("/customer")
public class CustomerContorller {
	@Autowired CustomerService customerService;
		
	@RequestMapping(value = "/getList", method = RequestMethod.POST)
	public ModelAndView getList() {
		ModelAndView mv = new ModelAndView("jsonView");
        mv.addAllObjects(customerService.getList());
        return mv;
	}		
	
	@RequestMapping(value = "/mod", method = RequestMethod.POST)
	public @ResponseBody Map<String, Object> mod(customerVO customerVO) {
	        return customerService.mod(customerVO);
	}
	
	@RequestMapping(value="/getMainPage", method= RequestMethod.POST)
	public ModelAndView customerMain() {
        ModelAndView mv = new ModelAndView("customer/main");
        return mv;
    }
}

 

Service 

@Service
public class CustomerService {
	private static final Logger logger = LoggerFactory.getLogger(CustomerService.class);
	
	@Autowired protected CustomerDAO customerDAO;
	
	public ModelMap getList()  {
		ModelMap mv = new ModelMap();
        try {
            mv.addAttribute("rows", customerDAO.list());   
        } catch (Exception e) {
            logger.error("{}", " 리스트 조회 실패 - " + e.getMessage());
        }
		return mv;
	}
	
	 
	@Transactional
	public Map<String, Object> reg(CustomerVO customervo) { 
		Map<String,Object> resMap = new HashMap<String,Object>();
		try {
			if(StringUtils.isEmpty(customervo.getName()) || customervo.getAge() == null ) { 
				throw new Exception();
			}
			customerDAO.reg(customervo);
			resMap.put("res", "SUCCESS");
		 } catch (Exception e) {
			resMap.put("res", "FAIL");
			 logger.error("{}", "등록 실패 - " + e.getMessage());
        }
		return resMap;
	}
	
	@Transactional
	public Map<String, Object> mod(CustomerVO customervo){ 
		Map<String,Object> resMap = new HashMap<String,Object>();
		try {
			if(StringUtils.isEmpty(customervo.getName()) || customervo.getAge() == null ) { 
				throw new Exception();
			}
			
			customerDAO.mod(customervo);
			resMap.put("res", "SUCCESS");
		 } catch (Exception e) {
			resMap.put("res", "FAIL");
			 logger.error("{}", "수정 실패 - " + e.getMessage());
        }
		return resMap;
	}
}

 

DAO 

@Repository("CustomerDAO")
public interface CustomerDAO {
	  
    public List<CustomerVO> list();
    public int reg(CustomerVO customervo);
    public int mod(CustomerVO customervo);
    public int del(CustomerVO customervo);
    
}

 

 

main.html

<script src="/js/customer.js?20210126"></script>

<div id="div_customer">
    <br/>
    <div id="div_customer_jqgrid">
        <table border="1" id="tbl_customer" style="overflow: auto" summary="고객 목록 조회."></table>
        <div id="pager_customer"></div>
    </div>
    <div id="div_customer_page"></div>
</div>

 

customer.js 

$(function(){
	selectCustomer();
});


var selectCustomer = function () {
    $("#tbl_customer").jqGrid('GridUnload');
    
    $("#tbl_customer").jqGrid({
        url: '/customer/getList',
        ajaxGridOptions: {contentType: 'application/json; charset=utf-8'},
        mtype: "POST",
        postData: {},
        serializeGridData: function (postData) {
            return JSON.stringify(postData);
        },
        datatype: 'json',
        height: 'auto',
        
        cellEdit: true, 	 
        cellsubmit: "remote",
        cellurl: "/customer/mod",
        beforeSubmitCell : function(rowid, cellname, value) {   // submit 전
            return {"name":rowid, "age":value}
        },
        width: '50%',
        shrinkToFit: false,
        multiselect: false,
        gridview: true,
        colNames: ['이름', '나이'],
        colModel: [
            {
                name: 'name',
                index: 'name',
                width: 120,
                align: 'center',
                title: false,
                sortable: false,
                resizable: true,
                key: true
                
            },
            {
                name: 'age',
                index: 'age',
                width: 120,
                align: 'center',
                title: false,
                sortable: false,
                resizable: true,
                editable:true,
                editoptions:{ dataInit: function(element) {userClassCode_number(element);}}
            },
        ],
        viewrecord: true,
        rowNum: 20,
        pager: "#pager_customer",
        emptyrecords: "Nothing to display",
        jsonReader: {
            page: 'page',
            total: 'total',
            root: 'rows',
            records: 'records',
            repeatitems: false,
        },
        beforeRequest: function () {
            $("#pager_customer").hide();
        },
        gridComplete: function () {
            $("#pager_customer").appendTo('#div_customer_page');
            $("#pager_customer").show();
        },
        loadComplete: function (data) {
            $("#div_customer_jqgrid").css("visibility", "visible");
        },
        loadError: function (xhr, status, error) {
            console.log(xhr);
        },
    });
}

//숫자만 입력 가능하게
function userClassCode_number(element){
    $(element).keyup(function(){
        var val1 = element.value;
        var num = new Number(val1);
        if(isNaN(num)){
         element.value = '';
        }
       });
}

 

1번 동그라미를 보자 

cellEdit: true,  수정기능을 사용학 위한 옵션이다.
cellsubmit: "remote", cellsubmit은 두 가지 속성 'remote'와 'clientArray'가 있는데 remote는
저장하는 순간 cellurl로 ajax를 타고 간다.
clientArray는 ajax를 타지 않고 어떤 다른 이벤트 (클릭해서 저장같은) 를 통해서 데이터를 처리해줘야한다. 즉, 바로 ajax태우지 않을 것이라는 것이다.
cellurl: "/customer/mod" AJAX 통신할 url 
beforeSubmitCell : function(rowid, cellname, value) { 
            return {"name":rowid, "age":value}
},
AJAX 통신전에 보낼값을 담아준다. 
controller 에서 받을 값들을 정리해 넣는다. 

 

2번 스탬프를 보면 key : true 설정이 되어있는데 row에서 key 값으로 사용할 데이터에 넣어준다. 

이건 나중에 데이터를 수정하는 경우 DB에 pk 키로 사용된다고 보면된다. 

즉 where 절에 사용될 값으로 설정한다고 생각하면 쉽겠다.

 

3 수정기능을 사용할 cell 에 설정을 추가해준다. editeditoptions 는 입력받은 데이터 타입을 설정하기 위해서 사용했다. 

나이를 숫자로만 받기위해서 사용함~ 

 

 

# 참고 

1004lucifer.blogspot.com/2019/05/jqgrid-cell.html

areumtb.tistory.com/153

+ Recent posts