Angular Hierarchical Grid 集計
Ignite UI for Angular の Angular UI グリッドには、グループ フッターとして列レベルで集計できる機能があります。Angular グリッド集計は、列内のデータ タイプに応じて、あるいは Hierarchical Grid にカスタム Angular テンプレートを実装することによって、定義済みのデフォルト集計項目を使用して別のコンテナーの列情報を表示できます。
Angular Hierarchical Grid 集計の例
import { NgModule } from "@angular/core";
import { FormsModule } from "@angular/forms";
import { BrowserModule } from "@angular/platform-browser";
import { BrowserAnimationsModule } from "@angular/platform-browser/animations";
import { AppComponent } from "./app.component";
import { IgxHierarchicalGridModule } from "igniteui-angular";
import { HGridSummarySampleComponent } from "./hierarchical-grid/hierarchical-grid-summary/hierarchical-grid-summary.component";
import { IgxPreventDocumentScrollModule } from "./directives/prevent-scroll.directive";
@NgModule({
bootstrap: [AppComponent],
declarations: [
AppComponent,
HGridSummarySampleComponent
],
imports: [
BrowserModule,
BrowserAnimationsModule,
FormsModule,
IgxPreventDocumentScrollModule,
IgxHierarchicalGridModule
],
providers: [],
entryComponents: [],
schemas: []
})
export class AppModule {}
ts
import { Component, ViewChild } from '@angular/core';
import { IgxHierarchicalGridComponent, IgxNumberSummaryOperand,
IgxSummaryResult } from 'igniteui-angular';
import { SINGERS } from '../../data/singersData';
class MySummary {
public operate(data?: any[]): IgxSummaryResult[] {
const result = [];
result.push(
{
key: 'min',
label: 'Min',
summaryResult: IgxNumberSummaryOperand.min(data)
},
{
key: 'max',
label: 'Max',
summaryResult: IgxNumberSummaryOperand.max(data)
},
{
key: 'avg',
label: 'Avg',
summaryResult: IgxNumberSummaryOperand.average(data)
});
return result;
}
}
class MyChildSummary {
public operate(data?: any[]): IgxSummaryResult[] {
const result = [];
result.push(
{
key: 'count',
label: 'Count',
summaryResult: IgxNumberSummaryOperand.count(data)
});
return result;
}
}
@Component({
selector: 'app-hierarchical-grid-summary',
styleUrls: ['./hierarchical-grid-summary.component.scss'],
templateUrl: 'hierarchical-grid-summary.component.html'
})
export class HGridSummarySampleComponent {
@ViewChild('hierarchicalGrid', { static: true })
private hierarchicalGrid: IgxHierarchicalGridComponent;
public localdata;
public mySummary = MySummary;
public myChildSummary = MyChildSummary;
constructor() {
this.localdata = SINGERS;
}
public formatter = (a) => a;
}
ts
<div class="hgrid-sample">
<igx-hierarchical-grid [igxPreventDocumentScroll]="true" class="hgrid" [data]="localdata" [autoGenerate]="false"
[height]="'600px'" [width]="'100%'" [rowHeight]="'65px'" #hierarchicalGrid>
<igx-column field="Artist" [hasSummary]='true'></igx-column>
<igx-column field="Photo">
<ng-template igxCell let-cell="cell">
<div class="cell__inner_2">
<img [src]="cell.value" class="photo" />
</div>
</ng-template>
</igx-column>
<igx-column field="Debut" [hasSummary]='true' [formatter]="formatter"></igx-column>
<igx-column field="GrammyNominations" header="Grammy Nominations" [hasSummary]='true' dataType="number" [summaries]="mySummary"></igx-column>
<igx-column field="GrammyAwards" header="Grammy Awards" [hasSummary]='true' [summaries]="mySummary" dataType="number"></igx-column>
<igx-row-island [height]="null" [key]="'Albums'" [autoGenerate]="false">
<igx-column field="Album"></igx-column>
<igx-column field="LaunchDate" header="Launch Date" [dataType]="'date'"></igx-column>
<igx-column field="BillboardReview" header="Billboard Review" [hasSummary]='true' dataType="number" [summaries]="mySummary"></igx-column>
<igx-column field="USBillboard200" header="US Billboard 200" [hasSummary]='true' dataType="number" [summaries]="mySummary"></igx-column>
<igx-row-island [height]="null" [key]="'Songs'" [autoGenerate]="false" >
<igx-column field="Number" header="No."></igx-column>
<igx-column field="Title" [hasSummary]='true' [summaries]="myChildSummary"></igx-column>
<igx-column field="Released" dataType="date"></igx-column>
<igx-column field="Genre"></igx-column>
</igx-row-island>
</igx-row-island>
<igx-row-island [height]="null" [key]="'Tours'" [autoGenerate]="false">
<igx-column field="Tour"></igx-column>
<igx-column field="StartedOn" header="Started on"></igx-column>
<igx-column field="Location"></igx-column>
<igx-column field="Headliner"></igx-column>
</igx-row-island>
</igx-hierarchical-grid>
</div>
html
.photo {
vertical-align: middle;
max-height: 62px;
}
.cell__inner_2 {
margin: 1px
}
.hgrid-sample{
padding: 16px;
}
scss
このサンプルが気に入りましたか? 完全な Ignite UI for Angularツールキットにアクセスして、すばやく独自のアプリの作成を開始します。無料でダウンロードできます。
列の集計は列値すべての関数ですが、フィルタリングが適用された場合、列の集計はフィルターされた結果値の関数になります。
Hierarchical Grid 集計を列ごとに有効にして必要な列のみアクティブ化できます。Hierarchical Grid 集計は、列のデータ型に基づいてデフォルト集計の定義済みセットを提供します。
string
と boolean
data types
の場合、データ型の場合、以下の関数が利用できます。
number
、currency
、および percent
データ型の場合、以下の関数を使用できます。
- count
- min
- max
- average
- sum
date
データ型の場合、以下の関数が利用できます。
すべての利用可能な列データ型は、公式の列タイプ トピックにあります。
hasSummary
プロパティを true
に設定すると Hierarchical Grid 集計が列レベルで有効になります。各列の集計は列のデータ型に基づいて解決されます。igx-hierarchical-grid
のデフォルトの列データ型は string
のため、number
または date
固有の集計を適用するには、dataType
プロパティを number
または date
に設定します。集計値は、グリッドの locale
および列 pipeArgs
に従ってローカライズされて表示されます。
<igx-hierarchical-grid class="hgrid" [data]="localdata" [autoGenerate]="false">
<igx-column field="Artist" [hasSummary]='true'></igx-column>
<igx-column field="Photo">
<ng-template igxCell let-cell="cell">
<div class="cell__inner_2">
<img [src]="cell.value" class="photo" />
</div>
</ng-template>
</igx-column>
<igx-column field="Debut" [hasSummary]='true'></igx-column>
<igx-column field="Grammy Nominations" [hasSummary]='true' [dataType]="'number'" [summaries]="mySummary"></igx-column>
<igx-column field="Grammy Awards" [hasSummary]='true' [dataType]="'number'"></igx-column>
</igx-hierarchical-grid>
html
特定の列や列のリストを有効または無効にする他の方法として igx-hierarchical-grid のパブリック メソッド enableSummaries
/disableSummaries
を使用する方法があります。
<igx-hierarchical-grid #hierarchicalGrid [data]="data" [autoGenerate]="false" height="800px" width="800px" (columnInit)="initColumn($event)" >
<igx-column field="Artist" [hasSummary]='true'></igx-column>
<igx-column field="Photo">
<ng-template igxCell let-cell="cell">
<div class="cell__inner_2">
<img [src]="cell.value" class="photo" />
</div>
</ng-template>
</igx-column>
<igx-column field="Debut" [hasSummary]='true'></igx-column>
<igx-column field="Grammy Nominations" [hasSummary]='true' [dataType]="'number'" [summaries]="mySummary"></igx-column>
<igx-column field="Grammy Awards" [hasSummary]='true' [dataType]="'number'"></igx-column>
</igx-hierarchical-grid>
<button (click)="enableSummary()">Enable Summary</button>
<button (click)="disableSummary()">Disable Summary </button>
html
public enableSummary() {
this.hierarchicalGrid.enableSummaries([
{fieldName: 'Grammy Nominations', customSummary: this.mySummary},
{fieldName: 'Artist'}
]);
}
public disableSummary() {
this.hierarchicalGrid.disableSummaries('Photo');
}
typescript
カスタム Hierarchical Grid 集計
この関数が要件に合わない場合、指定した列にカスタム集計を提供できます。これには、基本クラス IgxSummaryOperand
、IgxNumberSummaryOperand
、IgxDateSummaryOperand
のいずれかを列データ型や必要に応じてオーバーライドします。このように既存の関数を再定義、または新しい関数を追加できます。IgxSummaryOperand
クラスは、count
メソッドにデフォルト実装のみを提供します。IgxNumberSummaryOperand
は IgxSummaryOperand
を拡張し、min
、max
、sum
、average
を提供します。IgxDateSummaryOperand
は IgxSummaryOperand
を拡張し、追加で earliest
と latest
を提供します。
import { IgxRowIslandComponent, IgxHierarchicalGridComponent, IgxNumberSummaryOperand, IgxSummaryResult } from 'igniteui-angular';
class MySummary extends IgxNumberSummaryOperand {
constructor() {
super();
}
public operate(data?: any[]): IgxSummaryResult[] {
const result = super.operate(data);
result.push({
key: 'test',
label: 'More than 5',
summaryResult: data.filter((rec) => rec > 5).length
});
return result;
}
}
typescript
例に表示されるように、基本クラスは operate
メソッドを公開しているため、すべてのデフォルト集計を取得して結果を変更するか、まったく新しい集計結果を計算することができます。
このメソッドは IgxSummaryResult
のリストを返し、集計を計算するためのオプションのパラメーターを取得します。
interface IgxSummaryResult {
key: string;
label: string;
summaryResult: any;
}
typescript
以下の「すべてのデータにアクセスするカスタム集計」セクションを参照してください。
列 GramyNominations
にカスタム集計を追加します。summaries
プロパティを以下に作成するクラスに設定します。
<igx-hierarchical-grid class="hgrid" [data]="localdata" [autoGenerate]="false">
<igx-column field="Artist" [hasSummary]='true'></igx-column>
<igx-column field="Photo">
<ng-template igxCell let-cell="cell">
<div class="cell__inner_2">
<img [src]="cell.value" class="photo" />
</div>
</ng-template>
</igx-column>
<igx-column field="Debut" [hasSummary]='true'></igx-column>
<igx-column field="Grammy Nominations" [hasSummary]='true' [dataType]="'number'" [summaries]="mySummary"></igx-column>
<igx-column field="Grammy Awards" [hasSummary]='true' [dataType]="'number'"></igx-column>
</igx-hierarchical-grid>
html
...
export class HGridSummarySampleComponent implements OnInit {
mySummary = MySummary;
....
}
typescript
すべてのデータにアクセスするカスタム集計
カスタム列集計内のすべての Hierarchical Grid データにアクセスできます。IgxSummaryOperand operate
メソッドには、2 つの追加のオプション パラメーターが導入されています。
以下のコード スニペットで示されるように operate メソッドには以下の 3 つのパラメーターがあります。
- columnData - 現在の列の値のみを含む配列を提供します。
- allGridData - グリッド データソース全体を提供します。
- fieldName - 現在の列フィールド。
class MySummary extends IgxNumberSummaryOperand {
constructor() {
super();
}
operate(columnData: any[], allGridData = [], fieldName?): IgxSummaryResult[] {
const result = super.operate(allData.map(r => r[fieldName]));
result.push({ key: 'test', label: 'Total Discontinued', summaryResult: allData.filter((rec) => rec.Discontinued).length });
return result;
}
}
typescript
import { NgModule } from "@angular/core";
import { FormsModule } from "@angular/forms";
import { BrowserModule } from "@angular/platform-browser";
import { BrowserAnimationsModule } from "@angular/platform-browser/animations";
import { AppComponent } from "./app.component";
import { IgxHierarchicalGridModule } from "igniteui-angular";
import { HGridAllDataSummaryComponent } from "./hierarchical-grid/hierarchical-grid-allData-summary/hierarchical-grid-allData-summary.component";
import { IgxPreventDocumentScrollModule } from "./directives/prevent-scroll.directive";
@NgModule({
bootstrap: [AppComponent],
declarations: [
AppComponent,
HGridAllDataSummaryComponent
],
imports: [
BrowserModule,
BrowserAnimationsModule,
FormsModule,
IgxPreventDocumentScrollModule,
IgxHierarchicalGridModule
],
providers: [],
entryComponents: [],
schemas: []
})
export class AppModule {}
ts
import { Component, OnInit, ViewChild } from '@angular/core';
import { IgxHierarchicalGridComponent,
IgxNumberSummaryOperand,
IgxSummaryOperand,
IgxSummaryResult } from 'igniteui-angular';
import { SINGERS } from '../../data/singersData';
class CustomNumberSummary {
public operate(data?: any[]): IgxSummaryResult[] {
const result = new IgxNumberSummaryOperand().operate(data);
result.pop();
result.pop();
return result;
}
}
class GrammySummary {
public operate(data?: any[], allData = [], fieldName = ''): IgxSummaryResult[] {
const result = [];
result.push({
key: 'nominatedSingers',
label: 'Nominated Singers',
summaryResult: allData.filter((rec) => rec['GrammyNominations'] > 0).length
});
result.push({
key: 'singersWithAwards',
label: 'Singers with Awards',
summaryResult: allData.filter((rec) => rec['GrammyAwards'] > 0).length
});
result.push({
key: 'nominations',
label: 'Total Nominations',
summaryResult: IgxNumberSummaryOperand.sum(allData.map(r => r['GrammyNominations']))
});
result.push({
key: 'awards',
label: 'Total Awards',
summaryResult: IgxNumberSummaryOperand.sum(allData.map(r => r['GrammyAwards']))
});
return result;
}
}
@Component({
selector: 'app-hierarchical-grid-all-data-summary',
styleUrls: ['./hierarchical-grid-allData-summary.component.scss'],
templateUrl: 'hierarchical-grid-allData-summary.component.html'
})
export class HGridAllDataSummaryComponent implements OnInit {
@ViewChild('hierarchicalGrid', { static: true })
private hierarchicalGrid: IgxHierarchicalGridComponent;
public localdata;
public grammySummary = GrammySummary;
public numberSummary = CustomNumberSummary;
constructor() {}
public ngOnInit(): void {
this.localdata = SINGERS;
}
}
ts
<div class="hgrid-sample">
<igx-hierarchical-grid [igxPreventDocumentScroll]="true" class="hgrid" [data]="localdata"
[height]="'600px'" [width]="'100%'" [rowHeight]="'65px'" #hierarchicalGrid>
<igx-column field="Artist" [hasSummary]='true'></igx-column>
<igx-column field="Photo" [hasSummary]='true' [summaries]="grammySummary">
<ng-template igxCell let-cell="cell">
<div class="cell__inner_2">
<img [src]="cell.value" class="photo" />
</div>
</ng-template>
</igx-column>
<igx-column field="Debut"></igx-column>
<igx-column field="GrammyNominations" header="Grammy Nominations" [hasSummary]='true' [dataType]="'number'" [summaries]="numberSummary"></igx-column>
<igx-column field="GrammyAwards" header="Grammy Awards" [hasSummary]='true' [dataType]="'number'" [summaries]="numberSummary"></igx-column>
<igx-row-island [height]="null" [key]="'Albums'">
<igx-column field="Album" [hasSummary]='true'></igx-column>
<igx-column field="LaunchDate" header="Launch Date" [hasSummary]='true' [dataType]="'date'"></igx-column>
<igx-column field="BillboardReview" header="Billboard Review" [hasSummary]='true'></igx-column>
<igx-column field="USBillboard200" header="US Billboard 200" [hasSummary]='true'></igx-column>
<igx-row-island [height]="null" [key]="'Songs'">
<igx-column field="Number" header="No." [hasSummary]='true'></igx-column>
<igx-column field="Title" [hasSummary]='true'></igx-column>
<igx-column field="Released" dataType="date" [hasSummary]='true'></igx-column>
<igx-column field="Genre" [hasSummary]='true'></igx-column>
</igx-row-island>
</igx-row-island>
</igx-hierarchical-grid>
</div>
html
.hgrid-sample{
padding: 16px;
}
scss
集計テンプレート
igxSummary
は、列の集計の結果をコンテキストとして提供する列の集計を対象としています。
<igx-column ... [hasSummary]="true">
<ng-template igxSummary let-summaryResults>
<span> My custom summary template</span>
<span>{{ summaryResults[0].label }} - {{ summaryResults[0].summaryResult }}</span>
</ng-template>
</igx-column>
html
デフォルトの集計が定義されている場合、集計領域の高さは、集計の数が最も多い列とグリッドのサイズに応じてデザインにより計算されます。summaryRowHeight 入力プロパティを使用して、デフォルト値をオーバーライドします。引数として数値が必要であり、false 値を設定すると、グリッド フッターのデフォルトのサイズ設定動作がトリガーされます。
列の集計テンプレートは、列 summaryTemplate プロパティを必要な TemplateRef に設定することにより、API を介して定義できます。
import { NgModule } from "@angular/core";
import { FormsModule } from "@angular/forms";
import { BrowserModule } from "@angular/platform-browser";
import { BrowserAnimationsModule } from "@angular/platform-browser/animations";
import { AppComponent } from "./app.component";
import {
IgxHierarchicalGridModule,
IgxInputGroupModule,
IgxButtonGroupModule,
IgxSwitchModule
} from "igniteui-angular";
import { HGridSummaryTemplateComponent } from "./hierarchical-grid/hgrid-summary-template/hgrid-summary-template.component";
import { IgxPreventDocumentScrollModule } from "./directives/prevent-scroll.directive";
@NgModule({
bootstrap: [AppComponent],
declarations: [
AppComponent,
HGridSummaryTemplateComponent
],
imports: [
BrowserModule,
BrowserAnimationsModule,
FormsModule,
IgxPreventDocumentScrollModule,
IgxHierarchicalGridModule,
IgxInputGroupModule,
IgxButtonGroupModule,
IgxSwitchModule
],
providers: [],
entryComponents: [],
schemas: []
})
export class AppModule {}
ts
import { Component, OnInit } from '@angular/core';
import {
DisplayDensity,
IgxNumberSummaryOperand,
IgxSummaryResult
} from 'igniteui-angular';
import { SINGERS } from '../../data/singersData';
class CustomNumberSummary {
public operate(data?: any[]): IgxSummaryResult[] {
const result = new IgxNumberSummaryOperand().operate(data);
result.pop();
result.pop();
return result;
}
}
class GrammySummary {
public operate(data?: any[], allData = [], fieldName = ''): IgxSummaryResult[] {
const result = [];
result.push({
key: 'nominatedSingers',
label: 'Nominated Singers',
summaryResult: allData.filter((rec) => rec['GrammyNominations'] > 0).length
});
result.push({
key: 'singersWithAwards',
label: 'Singers with Awards',
summaryResult: allData.filter((rec) => rec['GrammyAwards'] > 0).length
});
result.push({
key: 'nominations',
label: 'Total Nominations',
summaryResult: IgxNumberSummaryOperand.sum(allData.map(r => r['GrammyNominations']))
});
result.push({
key: 'awards',
label: 'Total Awards',
summaryResult: IgxNumberSummaryOperand.sum(allData.map(r => r['GrammyAwards']))
});
return result;
}
}
@Component({
selector: 'app-hierarchical-grid-all-data-summary',
styleUrls: ['./hgrid-summary-template.component.scss'],
templateUrl: 'hgrid-summary-template.component.html'
})
export class HGridSummaryTemplateComponent implements OnInit {
public localdata;
public grammySummary = GrammySummary;
public numberSummary = CustomNumberSummary;
public summaryHeight = 120;
public displayDensity: DisplayDensity = 'cosy';
public displayDensities;
public hasSummary = true;
constructor() { }
public ngOnInit(): void {
this.localdata = SINGERS;
this.displayDensities = [
{ label: 'compact', selected: this.displayDensity === 'compact', togglable: true },
{ label: 'cosy', selected: this.displayDensity === 'cosy', togglable: true },
{ label: 'comfortable', selected: this.displayDensity === 'comfortable', togglable: true }
];
}
public selectDensity(event): void {
this.displayDensity = this.displayDensities[event.index].label;
}
}
ts
<div class="sample__wrapper">
<div class="controls-wrapper">
<igx-input-group>
<label igxLabel for="height">Summary Row Height</label>
<input igxInput name="height" type="number" [(ngModel)]="summaryHeight">
</igx-input-group>
<igx-switch [(ngModel)]="hasSummary">Toggle Summaries</igx-switch>
<igx-buttongroup [values]="displayDensities" (selected)="selectDensity($event)" [displayDensity]="displayDensity">
</igx-buttongroup>
</div>
<igx-hierarchical-grid [igxPreventDocumentScroll]="true" [data]="localdata" [displayDensity]="displayDensity"
[summaryRowHeight]="summaryHeight" [height]="'550px'" [width]="'100%'" [rowHeight]="'65px'" #hierarchicalGrid>
<igx-column field="Artist" [hasSummary]='hasSummary'></igx-column>
<igx-column field="Photo" [hasSummary]='hasSummary' [summaries]="grammySummary">
<ng-template igxCell let-cell="cell">
<div class="cell__inner_2">
<img [src]="cell.value" class="photo" />
</div>
</ng-template>
</igx-column>
<igx-column field="Debut"></igx-column>
<igx-column field="GrammyNominations" header="Grammy Nominations" [hasSummary]='hasSummary'
[dataType]="'number'" [summaries]="numberSummary">
<ng-template igxSummary let-summaryResults>
<div class="summary-temp">
<span><strong>{{ summaryResults[0].label }}</strong><span>{{ summaryResults[0].summaryResult }}</span></span>
<span><strong>{{ summaryResults[1].label }}</strong><span>{{ summaryResults[1].summaryResult }}</span></span>
<span><strong>{{ summaryResults[2].label }}</strong><span>{{ summaryResults[2].summaryResult }}</span></span>
</div>
</ng-template>
</igx-column>
<igx-column field="GrammyAwards" header="Grammy Awards" [hasSummary]='hasSummary' [dataType]="'number'"
[summaries]="numberSummary"></igx-column>
<igx-row-island [height]="null" [key]="'Albums'" [summaryRowHeight]="summaryHeight">
<igx-column field="Album" [hasSummary]='hasSummary'></igx-column>
<igx-column field="LaunchDate" header="Launch Date" [hasSummary]='hasSummary' [dataType]="'date'">
<ng-template igxSummary let-summaryResults>
<div class="summary-temp">
<span><strong>{{ summaryResults[0].label }}</strong><span>{{ summaryResults[0].summaryResult }}</span></span>
<span><strong>{{ summaryResults[1].label }}</strong><span>{{ summaryResults[1].summaryResult }}</span></span>
</div>
</ng-template>
</igx-column>
<igx-column field="BillboardReview" header="Billboard Review" [hasSummary]='hasSummary'></igx-column>
<igx-column field="USBillboard200" header="US Billboard 200" [hasSummary]='hasSummary'></igx-column>
<igx-row-island [height]="null" [key]="'Songs'">
<igx-column field="Number" header="No." [hasSummary]='hasSummary'></igx-column>
<igx-column field="Title" [hasSummary]='hasSummary'></igx-column>
<igx-column field="Released" dataType="date" [hasSummary]='hasSummary'></igx-column>
<igx-column field="Genre" [hasSummary]='hasSummary'></igx-column>
</igx-row-island>
</igx-row-island>
</igx-hierarchical-grid>
</div>
html
.sample__wrapper {
display: flex;
flex-direction: column;
gap: 16px;
padding: 16px;
height: 100%;
overflow-y: auto;
}
igx-buttongroup {
max-width: 450px;
flex: 1;
}
.summary-temp {
display: flex;
flex-direction: column;
margin: 0 1px;
font-size: 14px;
line-height: 24px;
height: 100%;
overflow-y: auto;
overflow-x: hidden;
span {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 4px;
justify-content: space-between;
color: hsla(var(--igx-gray-900));
span {
user-select: all;
max-width: 300px;
padding-right: 8px;
}
strong {
font-size: 12px;
text-transform: uppercase;
min-width: 70px;
justify-self: flex-start;
text-align: left;
color: hsla(var(--ig-secondary-600));
user-select: none;
}
}
> * {
padding: 8px 0;
line-height: 18px;
border-bottom: 1px dashed hsla(var(--igx-gray-400));
&:last-child {
border-bottom: none;
}
}
}
::-webkit-scrollbar {
width: 5px !important;
height: 5px !important;
}
.controls-wrapper {
display: flex;
align-items: center;
flex-direction: row;
gap: 16px;
}
scss
集計の無効化
disabledSummaries
プロパティは、Ignite UI for Angular グリッド集計機能に対して列ごとに正確な制御を提供します。このプロパティを使用すると、グリッド内の各列に表示される集計をカスタマイズして、最も関連性の高い意味のあるデータのみが表示されるようにすることができます。たとえば、配列で集計キーを指定することにより、['count', 'min', 'max']
などの特定の集計タイプを除外できます。
このプロパティは、コードを通じて実行時に動的に変更することもできるため、変化するアプリケーションの状態やユーザー操作に合わせてグリッドの集計を柔軟に調整できます。
次の例は、disabledSummaries
プロパティを使用してさまざまな列の集計を管理し、Ignite UI for Angular グリッドで特定のデフォルトおよびカスタムの集計タイプを除外する方法を示しています。
<igx-column
field="Photo"
[hasSummary]="true"
[summaries]="grammySummary"
[disabledSummaries]="['singersWithAwards', 'awards']"
>
<ng-template igxCell let-cell="cell">
<div class="cell__inner_2">
<img [src]="cell.value" class="photo" />
</div>
</ng-template>
</igx-column>
<igx-column
field="GrammyNominations"
header="Grammy Nominations"
dataType="number"
[hasSummary]="true"
[disabledSummaries]="['count', 'sum', 'average']"
></igx-column>
html
Photo
の場合、singersWithAwards
や awards
などのカスタム集計は disabledSummaries
プロパティを使用して除外されます。
GrammyNominations
の場合、count
、sum
、average
などのデフォルトの集計は無効になっており、min
や max
などの他の集計は有効のままになっています。
実行時に、disabledSummaries
プロパティを使用して集計を動的に無効にすることもできます。たとえば、特定の列のプロパティをプログラムで設定または更新して、ユーザー操作やアプリケーションの状態の変化に基づいて表示される集計を調整できます。
集計のフォーマット
デフォルトでは、組み込みの集計オペランドによって生成される集計結果は、グリッド locale
および列 pipeArgs
に従ってローカライズおよびフォーマットされます。カスタム オペランドを使用する場合、locale
と pipeArgs
は適用されません。集計結果のデフォルトの外観を変更する場合は、summaryFormatter
プロパティを使用してフォーマットできます。
public dateSummaryFormat(summary: IgxSummaryResult, summaryOperand: IgxSummaryOperand): string {
const result = summary.summaryResult;
if(summaryOperand instanceof IgxDateSummaryOperand && summary.key !== 'count'
&& result !== null && result !== undefined) {
const pipe = new DatePipe('en-US');
return pipe.transform(result,'MMM YYYY');
}
return result;
}
typescript
<igx-column ... [summaryFormatter]="dateSummaryFormat"></igx-column>
html
import { NgModule } from "@angular/core";
import { FormsModule } from "@angular/forms";
import { BrowserModule } from "@angular/platform-browser";
import { BrowserAnimationsModule } from "@angular/platform-browser/animations";
import { AppComponent } from "./app.component";
import { HGridSummaryFormatterComponent } from "./hierarchical-grid/hierarchical-grid-summary-formatter/hierarchical-grid-summary-formatter.component";
import { IgxHierarchicalGridModule } from "igniteui-angular";
import { IgxPreventDocumentScrollModule } from "./directives/prevent-scroll.directive";
@NgModule({
bootstrap: [AppComponent],
declarations: [
AppComponent,
HGridSummaryFormatterComponent
],
imports: [
BrowserModule,
BrowserAnimationsModule,
FormsModule,
IgxPreventDocumentScrollModule,
IgxHierarchicalGridModule
],
providers: [],
entryComponents: [],
schemas: []
})
export class AppModule {}
ts
import { DatePipe } from '@angular/common';
import { Component, ViewChild } from '@angular/core';
import { IgxDateSummaryOperand, IgxHierarchicalGridComponent, IgxSummaryOperand, IgxSummaryResult } from 'igniteui-angular';
import { SINGERS } from '../../data/singersData';
@Component({
selector: 'app-hierarchical-grid-summary-formatter',
styleUrls: ['./hierarchical-grid-summary-formatter.component.scss'],
templateUrl: 'hierarchical-grid-summary-formatter.component.html'
})
export class HGridSummaryFormatterComponent {
@ViewChild('hierarchicalGrid', { static: true })
public hierarchicalGrid: IgxHierarchicalGridComponent;
public localdata;
constructor() {
this.localdata = SINGERS;
}
public decadeFormatter = (value: number) => Math.floor(value / 10) * 10 + 's';
public dateSummaryFormat(summary: IgxSummaryResult, summaryOperand: IgxSummaryOperand): string {
const result = summary.summaryResult;
if (summaryOperand instanceof IgxDateSummaryOperand && summary.key !== 'count'
&& result !== null && result !== undefined) {
const pipe = new DatePipe('en-US');
return pipe.transform(result, 'MMM YYYY');
}
return result;
}
}
ts
<div class="wrapper">
<igx-hierarchical-grid [igxPreventDocumentScroll]="true" class="hgrid" [data]="localdata" [autoGenerate]="false"
[allowFiltering]='true' filterMode="excelStyleFilter" [expandChildren]="true"
height="600px" [width]="'100%'" #hierarchicalGrid>
<igx-column field="Artist" [sortable]="true" [disableHiding]="true"></igx-column>
<igx-column field="Debut" header="Debut Decade" [sortable]="true" [disableHiding]="true" [formatter]="decadeFormatter"></igx-column>
<igx-column field="GrammyNominations" header="Grammy Nominations" dataType="number" [sortable]="true" [disableHiding]="true"></igx-column>
<igx-column field="GrammyAwards" header="Grammy Awards" dataType="number" [sortable]="true" [disableHiding]="true"></igx-column>
<igx-row-island [height]="null" [key]="'Albums'" [autoGenerate]="false" [allowFiltering]='true' filterMode="excelStyleFilter">
<igx-column field="Album" [sortable]="true" [disableHiding]="true"></igx-column>
<igx-column field="LaunchDate" header="Launch Date" [sortable]="true" [disableHiding]="true" [dataType]="'date'" [hasSummary]="true"
[summaryFormatter]="dateSummaryFormat"></igx-column>
<igx-column field="BillboardReview" header="Billboard Review" [sortable]="true" [disableHiding]="true" dataType="number"></igx-column>
<igx-column field="USBillboard200" header="US Billboard 200" [sortable]="true" [disableHiding]="true" dataType="number"></igx-column>
<igx-row-island [height]="null" [key]="'Songs'" [autoGenerate]="false" >
<igx-column field="Number" header="No."></igx-column>
<igx-column field="Title"></igx-column>
<igx-column field="Released" dataType="date"></igx-column>
<igx-column field="Genre"></igx-column>
</igx-row-island>
</igx-row-island>
<igx-row-island [height]="null" [key]="'Tours'" [autoGenerate]="false">
<igx-column field="Tour"></igx-column>
<igx-column field="StartedOn" header="Started on"></igx-column>
<igx-column field="Location"></igx-column>
<igx-column field="Headliner"></igx-column>
</igx-row-island>
</igx-hierarchical-grid>
</div>
html
.wrapper {
margin: 16px;
}
scss

集計のエクスポート
exportSummaries
オプションが IgxExcelExporterOptions
にあり、エクスポートされたデータにグリッドの集計を含めるかどうかを指定します。デフォルトの exportSummaries
値は false です。
IgxExcelExporterService
は、すべての列タイプのデフォルトの集計を同等の Excel 関数としてエクスポートするため、シートが変更された場合でも適切に機能し続けます。以下の例をご覧ください:
import { NgModule } from "@angular/core";
import { FormsModule } from "@angular/forms";
import { BrowserModule } from "@angular/platform-browser";
import { BrowserAnimationsModule } from "@angular/platform-browser/animations";
import { AppComponent } from "./app.component";
import {
IgxHierarchicalGridModule,
IgxExcelExporterService
} from "igniteui-angular";
import { HGridSummaryExportComponent } from "./hierarchical-grid/hgrid-summary-export/hgrid-summary-export.component";
import { IgxPreventDocumentScrollModule } from "./directives/prevent-scroll.directive";
@NgModule({
bootstrap: [AppComponent],
declarations: [
AppComponent,
HGridSummaryExportComponent
],
imports: [
BrowserModule,
BrowserAnimationsModule,
FormsModule,
IgxPreventDocumentScrollModule,
IgxHierarchicalGridModule
],
providers: [IgxExcelExporterService],
entryComponents: [],
schemas: []
})
export class AppModule {}
ts
import { Component, OnInit, ViewChild } from '@angular/core';
import { SINGERS } from '../../data/singersData';
import { IgxExcelExporterOptions, IgxExcelExporterService, IgxHierarchicalGridComponent, IgxNumberSummaryOperand, IgxSummaryResult } from 'igniteui-angular';
class MySummary {
public operate(data?: any[]): IgxSummaryResult[] {
const result = [];
result.push(
{
key: 'min',
label: 'Min',
summaryResult: IgxNumberSummaryOperand.min(data)
},
{
key: 'max',
label: 'Max',
summaryResult: IgxNumberSummaryOperand.max(data)
},
{
key: 'avg',
label: 'Avg',
summaryResult: IgxNumberSummaryOperand.average(data)
});
return result;
}
}
class MyChildSummary {
public operate(data?: any[]): IgxSummaryResult[] {
const result = [];
result.push(
{
key: 'count',
label: 'Count',
summaryResult: IgxNumberSummaryOperand.count(data)
});
return result;
}
}
@Component({
selector: 'app-hierarchical-grid-summary-export',
styleUrls: ['./hgrid-summary-export.component.scss'],
templateUrl: 'hgrid-summary-export.component.html'
})
export class HGridSummaryExportComponent {
@ViewChild('hGrid', { static: true })
private hGrid: IgxHierarchicalGridComponent;
public data;
public mySummary = MySummary;
public myChildSummary = MyChildSummary;
constructor(private excelExportService: IgxExcelExporterService) {
this.data = SINGERS;
}
public exportButtonHandler() {
this.excelExportService.export(this.hGrid, new IgxExcelExporterOptions('ExportedFile'));
}
}
ts
<div class="hgrid-sample">
<div class="button-container">
<button igxButton="raised" (click)="exportButtonHandler()">Export To Excel</button>
Press the button to export the Grid as a .xlsx file.
</div>
<igx-hierarchical-grid [igxPreventDocumentScroll]="true" class="hgrid" [data]="data" [autoGenerate]="false"
[height]="'650px'" [width]="'100%'" [rowHeight]="'65px'" #hGrid>
<igx-column field="Artist" [hasSummary]='true'></igx-column>
<igx-column field="Photo">
<ng-template igxCell let-cell="cell">
<div class="cell__inner_2">
<img [src]="cell.value" class="photo" />
</div>
</ng-template>
</igx-column>
<igx-column field="Debut" [hasSummary]='true'></igx-column>
<igx-column field="GrammyNominations" header="Grammy Nominations" [hasSummary]='true' dataType="number" [summaries]="mySummary"></igx-column>
<igx-column field="GrammyAwards" header="Grammy Awards" [hasSummary]='true' [summaries]="mySummary" dataType="number"></igx-column>
<igx-row-island [height]="null" [key]="'Albums'" [autoGenerate]="false">
<igx-column field="Album"></igx-column>
<igx-column field="LaunchDate" header="Launch Date" [dataType]="'date'"></igx-column>
<igx-column field="BillboardReview" header="Billboard Review" [hasSummary]='true' dataType="number" [summaries]="mySummary"></igx-column>
<igx-column field="USBillboard200" header="US Billboard 200" [hasSummary]='true' dataType="number" [summaries]="mySummary"></igx-column>
<igx-row-island [height]="null" [key]="'Songs'" [autoGenerate]="false" >
<igx-column field="Number" header="No."></igx-column>
<igx-column field="Title" [hasSummary]='true' [summaries]="myChildSummary"></igx-column>
<igx-column field="Released" dataType="date"></igx-column>
<igx-column field="Genre"></igx-column>
</igx-row-island>
</igx-row-island>
<igx-row-island [height]="null" [key]="'Tours'" [autoGenerate]="false">
<igx-column field="Tour"></igx-column>
<igx-column field="StartedOn" header="Started on"></igx-column>
<igx-column field="Location"></igx-column>
<igx-column field="Headliner"></igx-column>
</igx-row-island>
</igx-hierarchical-grid>
</div>
html
.sample__wrapper {
display: flex;
flex-direction: column;
gap: 16px;
padding: 16px;
height: 100%;
overflow-y: auto;
}
igx-buttongroup {
max-width: 450px;
flex: 1;
}
.summary-temp {
display: flex;
flex-direction: column;
margin: 0 1px;
font-size: 14px;
line-height: 24px;
height: 100%;
overflow-y: auto;
overflow-x: hidden;
span {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 4px;
justify-content: space-between;
color: hsla(var(--ig-gray-900));
span {
user-select: all;
max-width: 300px;
padding-right: 8px;
}
strong {
font-size: 12px;
text-transform: uppercase;
min-width: 70px;
justify-self: flex-start;
text-align: left;
color: hsla(var(--ig-secondary-600));
user-select: none;
}
}
> * {
padding: 8px 0;
line-height: 18px;
border-bottom: 1px dashed hsla(var(--ig-gray-400));
&:last-child {
border-bottom: none;
}
}
}
::-webkit-scrollbar {
width: 5px !important;
height: 5px !important;
}
.controls-wrapper {
display: flex;
align-items: center;
flex-direction: row;
gap: 16px;
}
.button-container {
margin: 25px auto;
}
scss
エクスポートされたファイルには、シート内の各 DataRecord
のレベルを保持する非表示の列が含まれています。このレベルは、集計関数に含める必要があるセルを除外するために集計で使用されます。
以下の表では、デフォルトの各集計に対応する Excel 式を見つけることができます。
データ型 |
関数 |
Excel 関数 |
string 、boolean |
count |
="Count: "&COUNTIF(start:end, recordLevel) |
number 、currency 、percent |
count |
="Count: "&COUNTIF(start:end, recordLevel) |
|
min |
="Min: "&MIN(IF(start:end=recordLevel, rangeStart:rangeEnd)) |
|
max |
="Max: "&MAX(IF(start:end=recordLevel, rangeStart:rangeEnd)) |
|
average |
="Avg: "&AVERAGEIF(start:end, recordLevel, rangeStart:rangeEnd) |
|
sum |
="Sum: "&SUMIF(start:end, recordLevel, rangeStart:rangeEnd) |
date |
count |
="Count: "&COUNTIF(start:end, recordLevel) |
|
earliest |
="Earliest: "& TEXT(MIN(IF(start:end=recordLevel, rangeStart:rangeEnd)), format) |
|
latest |
="Latest: "&TEXT(MAX(IF(start:end=recordLevel, rangeStart:rangeEnd)), format) |
既知の問題と制限
制限 |
説明 |
カスタム集計のエクスポート |
カスタム集計は、Excel 関数ではなく文字列としてエクスポートされます。 |
テンプレート化された集計のエクスポート |
テンプレート化された集計はサポートされておらず、デフォルトのものとしてエクスポートされます。 |
キーボード ナビゲーション
集計行は、以下のキーボード操作でナビゲーションできます。
- UP - 1 つ上のセルへ移動。
- DOWN - 1 つ下のセルへ移動。
- LEFT - 1 つ左のセルへ移動。
- RIGHT - 1 つ右のセルへ移動。
- CTRL + LEFT または HOME - 左端のセルへ移動。
- CTRL + RIGHT または END - 右端のセルへ移動。
スタイル設定
ソート動作のスタイル設定は、すべてのテーマ関数とコンポーネント ミックスインが存在する index
ファイルをインポートする必要があります。
@use "igniteui-angular/theming" as *;
scss
最も簡単な方法は、grid-summary-theme
を拡張する新しいテーマを作成し、$background-color
、$focus-background-color
、$label-color
、$result-color
、$pinned-border-width
、$pinned-border-style
、および $pinned-border-color
パラメーターを受け取る方法です。
$custom-theme: grid-summary-theme(
$background-color: #e0f3ff,
$focus-background-color: rgba(#94d1f7, .3),
$label-color: #e41c77,
$result-color: black,
$pinned-border-width: 2px,
$pinned-border-style: dotted,
$pinned-border-color: #e41c77
);
scss
上記のようにカラーの値をハードコーディングする代わりに、palette
および color
関数を使用してカラーに関してより高い柔軟性を実現することができます。使い方の詳細についてはパレット
のトピックをご覧ください。
最後にコンポーネントのカスタム テーマを含めます。
@include css-vars($custom-theme);
scss
コンポーネントが Emulated
ViewEncapsulation を使用している場合、::ng-deep
を使用してこのカプセル化を解除する必要があります。
:host {
::ng-deep {
@include css-vars($custom-theme);
}
}
scss
デモ
import { NgModule } from "@angular/core";
import { FormsModule } from "@angular/forms";
import { BrowserModule } from "@angular/platform-browser";
import { BrowserAnimationsModule } from "@angular/platform-browser/animations";
import { AppComponent } from "./app.component";
import { IgxHierarchicalGridModule } from "igniteui-angular";
import { HGridSummaryStylingComponent } from "./hierarchical-grid/hierarchical-grid-summary-styling/hierarchical-grid-summary-styling.component";
import { IgxPreventDocumentScrollModule } from "./directives/prevent-scroll.directive";
@NgModule({
bootstrap: [AppComponent],
declarations: [
AppComponent,
HGridSummaryStylingComponent
],
imports: [
BrowserModule,
BrowserAnimationsModule,
FormsModule,
IgxPreventDocumentScrollModule,
IgxHierarchicalGridModule
],
providers: [],
entryComponents: [],
schemas: []
})
export class AppModule {}
ts
import { Component } from '@angular/core';
import { IgxNumberSummaryOperand,
IgxSummaryResult } from 'igniteui-angular';
import { SINGERS } from '../../data/singersData';
class MySummary {
public operate(data?: any[]): IgxSummaryResult[] {
const result = [];
result.push(
{
key: 'min',
label: 'Min',
summaryResult: IgxNumberSummaryOperand.min(data)
},
{
key: 'max',
label: 'Max',
summaryResult: IgxNumberSummaryOperand.max(data)
},
{
key: 'avg',
label: 'Avg',
summaryResult: IgxNumberSummaryOperand.average(data)
});
return result;
}
}
class MyChildSummary {
public operate(data?: any[]): IgxSummaryResult[] {
const result = [];
result.push(
{
key: 'count',
label: 'Count',
summaryResult: IgxNumberSummaryOperand.count(data)
});
return result;
}
}
@Component({
selector: 'app-hierarchical-grid-summary-styling',
styleUrls: ['./hierarchical-grid-summary-styling.component.scss'],
templateUrl: 'hierarchical-grid-summary-styling.component.html'
})
export class HGridSummaryStylingComponent {
public localdata;
public mySummary = MySummary;
public myChildSummary = MyChildSummary;
constructor() {
this.localdata = SINGERS;
}
public formatter = (a) => a;
}
ts
<div class="hgrid-sample">
<igx-hierarchical-grid [igxPreventDocumentScroll]="true" class="hgrid" [data]="localdata" [autoGenerate]="false"
[height]="'650px'" [width]="'100%'" [rowHeight]="'65px'" #hierarchicalGrid>
<igx-column field="Artist" [hasSummary]='true'></igx-column>
<igx-column field="Photo">
<ng-template igxCell let-cell="cell">
<div class="cell__inner_2">
<img [src]="cell.value" class="photo" />
</div>
</ng-template>
</igx-column>
<igx-column field="Debut" [hasSummary]='true' [formatter]="formatter"></igx-column>
<igx-column field="GrammyNominations" header="Grammy Nominations" [hasSummary]='true' dataType="number" [summaries]="mySummary"></igx-column>
<igx-column field="GrammyAwards" header="Grammy Awards" [hasSummary]='true' [summaries]="mySummary" dataType="number"></igx-column>
<igx-row-island [height]="null" [key]="'Albums'" [autoGenerate]="false">
<igx-column field="Album"></igx-column>
<igx-column field="LaunchDate" header="Launch Date" [dataType]="'date'"></igx-column>
<igx-column field="BillboardReview" header="Billboard Review" [hasSummary]='true' dataType="number" [summaries]="mySummary"></igx-column>
<igx-column field="USBillboard200" header="US Billboard 200" [hasSummary]='true' dataType="number" [summaries]="mySummary"></igx-column>
<igx-row-island [height]="null" [key]="'Songs'" [autoGenerate]="false" >
<igx-column field="Number" header="No."></igx-column>
<igx-column field="Title" [hasSummary]='true' [summaries]="myChildSummary"></igx-column>
<igx-column field="Released" dataType="date"></igx-column>
<igx-column field="Genre"></igx-column>
</igx-row-island>
</igx-row-island>
<igx-row-island [height]="null" [key]="'Tours'" [autoGenerate]="false">
<igx-column field="Tour"></igx-column>
<igx-column field="StartedOn" header="Started on"></igx-column>
<igx-column field="Location"></igx-column>
<igx-column field="Headliner"></igx-column>
</igx-row-island>
</igx-hierarchical-grid>
</div>
html
@use '../../../variables' as *;
$custom-theme: grid-summary-theme(
$background-color: #e0f3ff,
$focus-background-color: rgba( #94d1f7, .3 ),
$label-color: #e41c77,
$result-color: black,
$pinned-border-width: 2px,
$pinned-border-style: dotted,
$pinned-border-color: #e41c77
);
:host ::ng-deep {
@include css-vars($custom-theme);
}
.photo {
vertical-align: middle;
max-height: 62px;
}
.cell__inner_2 {
margin: 1px
}
.hgrid-sample{
padding: 16px;
}
scss
API リファレンス
その他のリソース
コミュニティに参加して新しいアイデアをご提案ください。