Jqxgrid Grouping
조회된 데이터들을 특정한 조건에 맞게 그룹화하여 보고 싶을때가 있습니다.
데이터를 분석하는데 필수적인 기능 중 하나죠.
엑셀에서는 이런 강력한 기능들이 잘 구현이 되어있습니다.
jqxgrid도 못지 않게 훌륭한 기능을 가지고 있습니다.
그럼 굳이 엑셀이 필요하지 않을 수도 있지 않을까요?
적어도 조회(SELECT)를 하는 기능에서만큼요.
Example
$(document).ready(function () {
// grouping 구현을 더 잘 보여드리기 위해 주소 정보를 간소화 시키고, 성별 컬럼을 추가하였습니다.
var data = '\[{ "name": "홍길동", "age": "23", "address": "경기","phone": "010-1234-XXXX", "birthday": "1990-02-05","allowance": 5000, "gender":"남"}]';
var source = {
datatype: "json",
datafields:[
{name: 'name',type: 'string'},
{name: 'age',type: 'int'},
{name: 'address',type: 'string'},
{name: 'phone',type: 'string'},
{name: 'birthday',type: 'date'},
{name: 'allowance',type: 'number'},
{name: 'gender',type: 'string'}
],
localdata: data
};
var dataAdapter = new $.jqx.dataAdapter(source);
// 그룹화했을때 보여질 정보를 함수형태로 구현합니다.
// 매개변수로 지정된 text,group,expanded,data는 console.log로 찍으면
// 자세하게 살펴보실 수 있습니다.
var groupsrenderer = function (text, group, expanded, data) {
var allowance\_sum; // 그룹했을때 용돈합계를 구해보도록 하겠습니다.
if (data.subItems.length > 0) {
// 그룹화된 데이터의 용돈 합계를 구해 allowance\_sum 변수에 넣어줍니다.
allowance\_sum = this.getcolumnaggregateddata('allowance',['sum'], true, data.subItems);
} else {
// rows 배열을 선언합니다.
// 만약 이 변수를 선언하지 않으면 두개 이상의 컬럼을 그룹화 했을때 디자인이 깨지는
// 버그가 발생합니다.
var rows = new Array();
var getRows = function (group, rows) {
if (group.subGroups.length > 0) {
for (var i = 0; i < group.subGroups.length; i++) {
// 각 그룹의 정보를 재귀함수 형태로 호출합니다.
// 최종 그룹에 도달할때까지 계속 호출합니다.
getRows(group.subGroups\[i], rows);
}
} else {
for (var k = 0; k < group.subItems.length; k++) {
//마지막 그룹에 도달했을때 해당 item(row)정보를 rows 배열에 넣습니다.
rows.push(group.subItems\[k]);
}
}
}
//최종적으로 getRows 함수를 다시한번 호출합니다.
getRows(data, rows);
// 위와같이 그룹화된 데이터의 용돈 합계를 구해 allowance\_sum 변수에 넣어줍니다.
allowance\_sum = this.getcolumnaggregateddata('allowance',['sum'], true, rows);
}
//그룹내에 row 수를 아이템 또는 그룹의 길이로 확인합니다.
var count = data.subItems.length || data.subGroups.length;
// 리턴할 결과를 html tag 형태로 보여줍니다.
return '<div style="margin-top:5px;"><span style="font-weight: bold; width:150px; display: inline-block;">'+text+'</span>'+
'Row수: <span style="width:10px; display: inline-block; text-align:right; margin-right:20px;">'\+ count+'</span>'+
'용돈합계: <span style="width:30px; display: inline-block; text-align:right; margin-right:20px;">'\+ allowance\_sum.sum+'</span></div>';
}
$("#jqxgrid").jqxGrid({
width: '100%',
height: '300',
source: dataAdapter,
sortable: true,
filterable: true,
showstatusbar: true,
columnsresize: true,
groupable: true, // 그룹핑을 사용하기 위해 groupable 속성을 true로 만들고
groupsrenderer: groupsrenderer, //그룹정보를 렌더링하여 그룹집계를 Custom 할 수 있습니다.
//groupsrenderer는 상단처럼 함수형태로 구현해줍니다.
theme: 'energyblue',
columns:[
{text: '이름',datafield: 'name',width: "10%", align:"center"},
{text: '나이',datafield: 'age',width: "10%", align:"center"},
{text: '주소',datafield: 'address',width: "10%", align:"center"},
{text: '전화번호',datafield: 'phone',width: "20%", align:"center"},
{text: '생일',datafield: 'birthday',cellsformat: "yyyy-MM-dd",width: "20%", align:"center"},
{text: '용돈',datafield: 'allowance',cellsformat : 'd',cellsalign: 'right',width: "20%", align:"center"},
{text: '성별',datafield: 'gender',width: "10%", align:"center"}
],
groups:['address','gender'] //처음 출력될때 주소와 성별을 미리 그룹핑합니다.
});
마치며…
groupsrenderer을 구현할때 Parameter로 쓰이는 group,data의 구조를
정확하게 파악하지 못하면 해당 내용을 이해하기 어렵울 수 있습니다.
저도 주석을 작성하는 과정에서 다시 한번 공부하게 되었네요.
만약 처음부터 여기까지 오셨다면 jqxgrid의 절반 이상은 알고 계신다고
보셔도 될 것 같습니다. 더 다양하고 많은 기능들이 있지만
핵심적인 기능들을 위주로 알아보았으니까요.
다음 시간에는 Row를 선택(select),클릭(click) 했을때 발생하는
Event들에 대해 알아보도록 하겠습니다.