Angular Grid 集計

    Ignite UI for Angular の Angular UI グリッドには、グループ フッターとして列レベルで集計できる機能があります。Angular グリッド集計は、列内のデータ タイプに応じて、あるいは Grid にカスタム Angular テンプレートを実装することによって、定義済みのデフォルト集計項目を使用して別のコンテナーの列情報を表示できます。

    Angular Grid 集計の例

    Note

    列の集計は列値すべての関数ですが、フィルタリングが適用された場合、列の集計はフィルターされた結果値の関数になります。

    Grid 集計を列ごとに有効にして必要な列のみアクティブ化できます。Grid 集計は、列のデータ型に基づいてデフォルト集計の定義済みセットを提供します。

    stringboolean data types の場合、データ型の場合、以下の関数が利用できます。

    • count

    numbercurrency、および percent データ型の場合、以下の関数を使用できます。

    • count
    • min
    • max
    • average
    • sum

    date データ型の場合、以下の関数が利用できます。

    • count
    • earliest
    • latest

    すべての利用可能な列データ型は、公式の列タイプ トピックにあります。

    hasSummary プロパティを true に設定すると Grid 集計が列レベルで有効になります。各列の集計は列のデータ型に基づいて解決されます。igx-grid のデフォルトの列データ型は string のため、number または date 固有の集計を適用するには、dataType プロパティを number または date に設定します。集計値は、グリッドの locale および列 pipeArgs に従ってローカライズされて表示されます。

    <igx-grid #grid1 [data]="data" [autoGenerate]="false" height="800px" width="800px" (columnInit)="initColumn($event)">
        <igx-column field="ProductID" header="Product ID" width="200px" [sortable]="true"></igx-column>
        <igx-column field="ProductName" header="Product Name" width="200px" [sortable]="true" [hasSummary]="true"></igx-column>
        <igx-column field="ReorderLevel" width="200px" [editable]="true" [dataType]="'number'" [hasSummary]="true"></igx-column>
    </igx-grid>
    

    特定の列や列のリストを有効または無効にする他の方法として igx-grid のパブリック メソッド enableSummaries/disableSummaries を使用する方法があります。

    <igx-grid #grid1 [data]="data" [autoGenerate]="false" height="800px" width="800px" (columnInit)="initColumn($event)" >
        <igx-column field="ProductID" header="Product ID" width="200px"  [sortable]="true"></igx-column>
        <igx-column field="ProductName" header="Product Name" width="200px" [sortable]="true" [hasSummary]="true"></igx-column>
        <igx-column field="ReorderLevel" width="200px" [editable]="true" [dataType]="'number'" [hasSummary]="false"></igx-column>
    </igx-grid>
    <button (click)="enableSummary()">Enable Summary</button>
    <button (click)="disableSummary()">Disable Summary </button>
    
    public enableSummary() {
        this.grid1.enableSummaries([
            {fieldName: 'ReorderLevel', customSummary: this.mySummary},
            {fieldName: 'ProductID'}
        ]);
    }
    public disableSummary() {
        this.grid1.disableSummaries('ProductName');
    }
    

    カスタム Grid 集計

    この関数が要件に合わない場合、指定した列にカスタム集計を提供できます。これには、基本クラス IgxSummaryOperandIgxNumberSummaryOperandIgxDateSummaryOperand のいずれかを列データ型や必要に応じてオーバーライドします。このように既存の関数を再定義、または新しい関数を追加できます。IgxSummaryOperand クラスは、count メソッドにデフォルト実装のみを提供します。IgxNumberSummaryOperandIgxSummaryOperand を拡張し、minmaxsumaverage を提供します。IgxDateSummaryOperandIgxSummaryOperand を拡張し、追加で earliestlatest を提供します。

    import { IgxSummaryResult, IgxSummaryOperand, IgxNumberSummaryOperand, IgxDateSummaryOperand } from 'igniteui-angular';
    // import { IgxSummaryResult, IgxSummaryOperand, IgxNumberSummaryOperand, IgxDateSummaryOperand } from '@infragistics/igniteui-angular'; for licensed package
    
    class MySummary extends IgxNumberSummaryOperand {
        constructor() {
            super();
        }
    
        operate(data?: any[]): IgxSummaryResult[] {
            const result = super.operate(data);
            result.push({
                key: 'test',
                label: 'Test',
                summaryResult: data.filter(rec => rec > 10 && rec < 30).length
            });
            return result;
        }
    }
    

    例に表示されるように、基本クラスは operate メソッドを公開しているため、すべてのデフォルト集計を取得して結果を変更するか、まったく新しい集計結果を計算することができます。 このメソッドは IgxSummaryResult のリストを返し、集計を計算するためのオプションのパラメーターを取得します。

    interface IgxSummaryResult {
        key: string;
        label: string;
        summaryResult: any;
    }
    

    以下の「すべてのデータにアクセスするカスタム集計」セクションを参照してください。

    Note

    集計行の高さを正しく計算するために、Grid の operate メソッドでデータが空の場合も常に IgxSummaryResult 配列の正しい長さを返す必要があります。

    UnitsInStock 列にカスタム集計を追加します。summaries プロパティを以下に作成するクラスに設定します。

    <igx-grid #grid1 [data]="data" [autoGenerate]="false" height="800px" width="800px" (columnInit)="initColumn($event)" >
        <igx-column field="ProductID" width="200px"  [sortable]="true">
        </igx-column>
        <igx-column field="ProductName" width="200px" [sortable]="true" [hasSummary]="true">
        </igx-column>
        <igx-column field="UnitsInStock" width="200px" [dataType]="'number'" [hasSummary]="true" [summaries]="mySummary" [sortable]="true">
        </igx-column>
        <igx-column field="ReorderLevel" width="200px" [editable]="true" [dataType]="'number'" [hasSummary]="true">
        </igx-column>
    </igx-grid>
    
    ...
    export class GridComponent implements OnInit {
        mySummary = MySummary;
        ....
    }
    

    すべてのデータにアクセスするカスタム集計

    カスタム列集計内のすべての 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;
        }
    }
    

    集計テンプレート

    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>
    

    デフォルトの集計が定義されている場合、集計領域の高さは、集計の数が最も多い列とグリッドのサイズに応じてデザインにより計算されます。summaryRowHeight 入力プロパティを使用して、デフォルト値をオーバーライドします。引数として数値が必要であり、falsy の値を設定すると、グリッド フッターのデフォルトのサイズ設定動作がトリガーされます。

    Note

    列の集計テンプレートは、列 summaryTemplate プロパティを必要な TemplateRef に設定することにより、API を介して定義できます。

    集計のフォーマット

    デフォルトでは、組み込みの集計オペランドによって生成される集計結果は、グリッド locale および列 pipeArgs に従ってローカライズおよびフォーマットされます。カスタム オペランドを使用する場合、localepipeArgs は適用されません。集計結果のデフォルトの外観を変更する場合は、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;
    }
    
    <igx-column ... [summaryFormatter]="dateSummaryFormat"></igx-column>
    

    グループの集計

    列のグループがある場合、Grid はsummaryCalculationModesummaryPosition を使用して集計配置の変更やモードの計算をします。これら 2 つのプロパティに加えて、IgxGrid は、参照するグループ行が縮小されたときに集計行が表示されたままであるかどうかを決定できる showSummaryOnCollapse プロパティを公開します。

    以下は、使用可能な summaryCalculationMode プロパティの値です。

    • rootLevelOnly - ルート レベルのみ集計が計算されます。
    • childLevelsOnly - 子レベルのみ集計が計算されます。
    • rootAndChildLevels - ルートと子レベルの両方の集計が計算されます。これがデフォルト値です。

    以下は、使用可能な summaryPosition プロパティの値です。

    • top - 集計行はグループ列の子の前に表示されます。
    • bottom - 集計行はグループ列の子の後に表示されます。これがデフォルト値です。

    showSummaryOnCollapse プロパティはブール値です。デフォルト値は false に設定されています。これは、親行が縮小されたときに集計行が非表示になることを意味します。プロパティが true に設定されている場合、グループ行が縮小されたときに、集計行は表示されたままになります。

    Note

    summaryPosition プロパティは子レベルの集計のみに適用します。ルートレベルの集計は、Grid の下に常に固定されます。

    デモ

    集計のエクスポート

    exportSummaries オプションが IgxExcelExporterOptions にあり、エクスポートされたデータにグリッドの集計を含めるかどうかを指定します。デフォルトの exportSummaries 値は false です。

    IgxExcelExporterService は、すべての列タイプのデフォルトの集計を同等の Excel 関数としてエクスポートするため、シートが変更された場合でも適切に機能し続けます。以下の例をご覧ください:

    エクスポートされたファイルには、シート内の各 DataRecord のレベルを保持する非表示の列が含まれています。このレベルは、集計関数に含める必要があるセルを除外するために集計で使用されます。

    以下の表では、デフォルトの各集計に対応する Excel 式を見つけることができます。

    データ型 関数 Excel 関数
    stringboolean count ="Count: "&COUNTIF(start:end, recordLevel)
    numbercurrencypercent 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 *;
    
    // 重要: Ignite UI for Angular 13 より前のバージョンは、次を使用してください。
    // @import '~igniteui-angular/lib/core/styles/themes/index';
    

    最も簡単な方法は、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
    );
    

    最後にそれぞれのテーマを持つコンポーネント ミックスインを含めます

    @include grid-summary($custom-theme);
    
    Note

    コンポーネントが Emulated ViewEncapsulation を使用している場合、::ng-deep を使用してこのカプセル化を解除する必要があります。

    :host {
       ::ng-deep {
           @include grid-summary($custom-theme);
       }
    }
    

    カラーパレットの定義

    上記のように色の値をハードコーディングする代わりに、igx-palette および igx-color 関数を使用することによって色に関してより高い柔軟性を持つことができます。

    igx-palette は渡された一次色と二次色に基づいてカラーパレットを生成します。

    $blue-color: #7793b1;
    $green-color: #00ff2d;
    
    $my-custom-palette: palette($primary: $blue-color, $secondary: $green-color);
    

    また igx-color を使用してパレットから簡単に色を取り出すことができます。

    $custom-theme: grid-summary-theme(
        $background-color: color($my-custom-palette, "primary", 700),
        $focus-background-color: color($my-custom-palette, "primary", 800),
        $label-color: color($my-custom-palette, "secondary", 500),
        $result-color: color($my-custom-palette, "grays", 900),
        $pinned-border-width: 2px,
        $pinned-border-style: dotted,
        $pinned-border-color: color($my-custom-palette, "secondary", 500)
    );
    
    Note

    igx-color および igx-palette は、色を生成および取得するための重要な機能です。使い方の詳細についてはパレットのトピックを参照してください。

    スキーマの使用

    テーマ エンジンを使用してスキーマの利点を活用でき、堅牢で柔軟な構造を構築できます。スキーマはテーマを使用する方法のことです。

    すべてのコンポーネントに提供されている 2 つの定義済みスキーマ (ここでは _light-grid-summary の 1 つを拡張します。

    // Extending the light grid summary schema
    $my-summary-schema: extend($_light-grid-summary,
        (
            background-color: (igx-color: ('primary', 700)),
            focus-background-color: (igx-color: ('primary', 800)),
            label-color: (igx-color: ('secondary', 500)),
            result-color: (igx-color: ('grays', 900)),
            pinned-border-width: 2px,
            pinned-border-style: dotted,
            pinned-border-color: (igx-color: ('secondary', 500))
        )
    );
    

    カスタム スキーマを適用するには、グローバル light または dark の 1 つを拡張する必要があります。これは基本的にカスタム スキーマでコンポーネントを指し示し、その後それぞれのコンポーネント テーマに追加するものです。

    // Extending the global light-schema
    $my-custom-schema: extend($light-schema,
        (
            igx-grid-summary: $my-summary-schema
        )
    );
    
    // Defining our custom theme with the custom schema
    $custom-theme: grid-summary-theme(
        $palette: $my-custom-palette,
        $schema: $my-custom-schema
    );
    

    上記と同じ方法でテーマを含める必要があることに注意してください。

    デモ

    API リファレンス

    その他のリソース

    コミュニティに参加して新しいアイデアをご提案ください。