행 그룹
Row grouping은 데이터 행들을 하나 이상의 지정한 컬럼의 값을 기준으로 구분시켜 계층적인 구조로 표시합니다. 컬럼 헤더를 panel 영역으로 드래깅하면 그 컬럼으로 grouping 합니다. 또는 GridView.groupBy() 함수를 호출해서 grouping할 수도 있습니다.
그룹핑 하기
컬럼 헤더를 panel 영역으로 드래깅하면 그 컬럼으로 grouping 합니다.
또는 GridView.groupBy() 함수를 호출해서 grouping할 수도 있습니다.
gridView.groupPanel.visible = false;
gridView.groupPanel.visible = true;
gridView.groupBy(["Gender", "Monetary"]);
그룹 헤더 및 풋터의 표시
rowGrouping 상태일 때 그룹의 펼침 또는 접힘 상태에 따라 그룹푸터와 그룹헤더의 표시방법을 설정 할 수 있습니다.
- expandedAdornments: Row group이 펼쳐진 상태일 때, 그룹 header, footer의 표시 여부를 지정합니다.
- collapsedAdornments: Row group이 펼쳐지지 않은 상태일 때, 그룹 header, footer의 표시 여부를 지정합니다.
gridView.setRowGroup({
expandedAdornments: $(':radio[name="expanded"]:checked').val()
collapsedAdornments: $(':radio[name="collapsed"]:checked').val()
});
그룹핑 이벤트
Row grouping되면 Javascript 그리드의 onGrouping, onGrouped 이벤트가 발생됩니다.
gridView.onGrouping = function(grid) {
alert("onGrouping 이벤트가 발생했습니다. true를 반환합니다. false를 반환하면 그룹핑되지 않습니다.");
return true;
};
gridView.onGrouped = function(grid) {
alert(
"onGrouped : isGrouped = " +
grid.isGrouped() +
", isMergedGrouped = " +
grid.isMergedGrouped()
);
};
푸터와 그룹 푸터에 요약값 표시
dataType이 "number"인 경우 요약값을 표시할 수 있습니다. 표시할 수 있는 요약값은 SummaryType에서 확인하세요.
아래 데모는 나이 컬럼은 평균값, 만기금액은 합계로 계산하였습니다.
var columns = [
...
{
name: "Age",
fieldName: "Age",
width: "40",
header: {
text: "나이"
},
groupFooter: {
expression: "avg",
numberFormat: "#,##0.0",
styleName: "right-column"
},
footer: {
expression: "avg",
numberFormat: "#,##0.0",
styleName: "right-column"
},
styleName: "right-column"
},
{
name: "SaveMaturity",
fieldName: "SaveMaturity",
width: "80",
numberFormat: "#,##0",
header: {
text: "만기금액"
},
groupFooter: {
expression: "sum",
numberFormat: "#,##0",
styleName: "right-column"
},
footer: {
expression: "sum",
numberFormat: "#,##0",
styleName: "right-column"
},
styleName: "right-column"
},
...
];
gridView.setColumns(columns);
Group Footer의 동적계산
Group Footer에 표시되는 요약을 개발자가 계산하여 표시하고 싶은 경우는 column.groupFooter.valueCallback에 설정합니다.
(표시하고 싶은 값을 return 하여 처리합니다.)
4번째 인자인 group에 해당 group에 대한 정보들이 들어 있습니다. (ex: children에 해당 그룹의 자식들의 정보가 들어 있습니다.)
var columns = [
...
{
name: "Age",
fieldName: "Age",
width: "40",
header: {
text: "나이",
styleName: "orange-column"
},
groupFooter: {
valueCallback: function (grid, column, groupFooterIndex, group, value) {
//계산 후 표시하고 싶은 값을 return
var groupModel = grid.getGroupModel(group.index);
return grid.getGroupSummary(groupModel, "Age").count + ' 건';
},
styleName: "right-column"
},
styleName: "right-column"
},
...
];
gridView.setColumns(columns);
Group Footer의 동적계산2
아래는 각 그룹의 성별이 "남" 인 값의 나이 합계만 출력되는 예제입니다.
var columns = [
...
{
name: "Age",
fieldName: "Age",
width: "40",
header: {
text: "나이",
styleName: "orange-column",
},
groupFooter: {
valueCallback: function (grid, column, groupFooterIndex, group, value) {
let tot_cnt = 0;
console.log(group)
group.rows.forEach(function (row) {
if (row != -1) {
if (dataProvider.getValue(row, "Gender") === "남") {
tot_cnt += dataProvider.getValue(row, column.fieldName);
}
}
});
return tot_cnt;
},
styleName: "orange-column",
},
styleName: "right-column",
},
...
];
gridView.setColumns(columns);
Group Footer를 여러 줄로 표시
Group Footer를 두 줄로 표시하기 위해서는 아래와 같이 setFooters로 설정하시면 됩니다.
//두줄로 표시
gridView.rowGroup.setFooters([{},{}])
//세 줄로 표시하기 위해서는 [{},{},{}] 로 설정하시면 됩니다.
개별 설정 코드들은 column.groupFooters에서 처리하면 됩니다.
아래 데모는 첫번째 그룹풋터에는 sum을 두번째 그룹풋터에는 avg를 표시한 데모 입니다.
gridView.rowGroup.setFooters([{},{}])
var vc = function (grid, column, groupFooterIndex, group, value) {
var groupModel = grid.getGroupModel(group.index);
//첫번째 그룹풋터에는 sum을, 두번째 그룹풋터에는 avg를 표시
if (groupFooterIndex == 0) {
return grid.getGroupSummary(groupModel, "Age").sum;
} else if (groupFooterIndex == 1) {
return grid.getGroupSummary(groupModel, "Age").avg;
}
};
var columns = [
...
{
name: "Gender",
fieldName: "Gender",
width: "50",
header: {
text: "성별",
styleName: "orange-column"
},
groupFooters: [{
text: "합계 : ",
styleName: "orange-column"
}, {
text: "평균 : ",
styleName: "orange-column"
}],
},
{
name: "Age",
fieldName: "Age",
width: "40",
header: {
text: "나이",
styleName: "orange-column"
},
groupFooters: [{
valueCallback: vc,
numberFormat: "#,##0.#",
styleName: "orange-column"
}, {
valueCallback: vc,
numberFormat: "#,##0.#",
styleName: "orange-column"
}],
styleName: "right-column"
},
...
];
gridView.setColumns(columns);
그룹 푸터 값 표시
아래 옵션들의 설정에 따라 각 행 그룹들은 그룹 푸터
를 표시할 수 있습니다.
그룹 푸터에 표시하는 텍스트는 GridView.setRowGroup 함수에 전달되는 설정 개체의 footerStatement
값으로 지정합니다.
또한, SummaryMode를 통해 각 행 그룹의 푸터에 표시할 수 있는 값의 종류를 지정할 수도 있습니다.
gridView.setRowGroup({
footerStatement: "${groupValue}"
});
그룹 헤더 값 표시
아래 옵션들의 설정에 따라 각 행 그룹들은 그룹 헤더
를 표시할 수 있습니다.
그룹 헤더에 표시하는 텍스트는 GridView.setRowGroup 함수에 전달되는 설정 개체의 headerStatement
값으로 지정합니다.
headerStatement
의 기본값은 "${groupField}: ${groupValue} - ${rowCount} rows"
입니다.
headerStatement 속성으로는 아래와 같은 값들을 설정할 수 있습니다.
- groupField: 그룹핑된 필드의 필드명을 표시합니다.
- fieldHeader: 그룹핑된 필드에 설정한 헤더를 표시합니다.
- groupColumn: 그룹핑된 컬럼의 헤더를 표시합니다.
- columnHeader: 그룹핑된 컬럼의 헤더를 표시합니다.
- columnFooter: 그룹핑된 컬럼의 푸터값을 표시합니다.
- groupValue: 각 그룹별 value를 표시합니다.
- rowCount: 각 그룹별 행 수를 표시합니다.
gridView.setRowGroup({
headerStatement: "${groupField}: ${groupValue} - ${rowCount} rows"
});
rowGroup.Bar 표시여부 설정
rowGroup.indentVisible 설정으로 rowGroup.Bar 영역 표시여부를 설정할 수 있습니다. indentVisible이 false이면 expand 아이콘이 사라지기 때문에 접고 펼칠 수 없습니다.
gridView.rowGroup.indentVisible = false;
날짜 기준 행 그룹핑
행 그룹의 valueForGroupCallback 속성을 사용해서 날짜의 특정 단위기준으로 행 그룹핑을 적용할 수 있습니다.
※ 행 병합 그룹핑(mergeMode: true) 에서는 적용할 수 없습니다.
gridView.rowGroup.valueForGroupCallback = function(grid, dataRow, fieldName, value) {
if (grid.getDataSource().getOrgFieldName(dataProvider.getFieldIndex(fieldName)) === "StartDate" && value) {
return new Date(2000, value.getMonth());
}
return value;
}
gridView.columnByName("StartDate").groupFooter.valueCallback = function(grid, column, footerIndex, group) {
var row = group.firstDataItem.dataRow;
var val = grid.getDataSource().getValue(row, column.fieldName);
return val.getFullYear() + " - " + (val.getMonth()+1) + " 계"
};
// 추가적인 것들
gridView.rowGroup.indentVisible = false;
gridView.rowGroup.expandedAdornments = "footer";