RealGrid2 가이드
행과 행 그룹
행 그룹핑

행 그룹

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";