### Clone Example Project
Source: https://www.ag-grid.com/angular-data-grid/server-side-operations-nodejs
Clone the reference implementation repository to get started.
```bash
git clone https://github.com/ag-grid/ag-grid-server-side-nodejs-example.git
```
--------------------------------
### Clone Example Project
Source: https://www.ag-grid.com/angular-data-grid/server-side-operations-spark
Clone the example project from GitHub to get started.
```bash
git clone https://github.com/ag-grid/ag-grid-server-side-apache-spark-example.git
```
--------------------------------
### Clone Example Project
Source: https://www.ag-grid.com/angular-data-grid/server-side-operations-graphql
Clone the reference implementation project from GitHub to get started.
```bash
git clone https://github.com/ag-grid/ag-grid-server-side-graphql-example.git
```
--------------------------------
### Clone and Build Server-Side Oracle Example Project
Source: https://www.ag-grid.com/angular-data-grid/server-side-operations-oracle
Clone the AG Grid server-side Oracle example project from GitHub and build it using Maven. This installs dependencies and compiles the project.
```bash
git clone https://github.com/ag-grid/ag-grid-server-side-oracle-example.git
cd ag-grid-server-side-oracle-example
mvn clean install
```
--------------------------------
### GraphQL & MySQL Server-Side Example
Source: https://www.ag-grid.com/angular-data-grid/server-side-operations-graphql
Illustrates a server-side setup using GraphQL and MySQL to serve data to AG Grid, focusing on the datasource and server implementation.
```javascript
const express = require('express');
const mysql = require('mysql');
const { graphqlHTTP } = require('express-graphql');
const { buildSchema } = require('graphql');
const app = express();
const port = 3000;
// Database connection
const connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: 'password',
database: 'aggrid'
});
connection.connect(err => {
if (err) throw err;
console.log('Connected to MySQL database');
});
// GraphQL schema
const schema = buildSchema(`
type Row {
id: Int
name: String
country: String
year: Int
date: String
balance: Float
}
type RowsResult {
totalRowCount: Int
rows: [Row]
}
type Query {
rows(firstRow: Int, lastRow: Int, sortModel: String, filterModel: String): RowsResult
}
`);
// Resolver function
const rootValue = {
rows: ({ firstRow, lastRow, sortModel, filterModel }) => {
return new Promise((resolve, reject) => {
let query = 'SELECT SQL_CALC_FOUND_ROWS * FROM grid_data';
let queryParams = [];
// Basic filtering (needs proper parsing of filterModel)
if (filterModel) {
// Example: filterModel = {"country":{"filterType":"text","type":"contains","filter":"USA"}}
const filters = JSON.parse(filterModel);
let filterClauses = [];
Object.keys(filters).forEach(key => {
const filter = filters[key];
if (filter.filterType === 'text') {
filterClauses.push(`${key} LIKE ?`);
queryParams.push(`%${filter.filter}%`);
}
// Add more filter types as needed
});
if (filterClauses.length > 0) {
query += ' WHERE ' + filterClauses.join(' AND ');
}
}
// Basic sorting (needs proper parsing of sortModel)
if (sortModel) {
// Example: sortModel = [{"colId":"name","sort":"asc"}]
const sorts = JSON.parse(sortModel);
let sortClauses = [];
sorts.forEach(sort => {
sortClauses.push(`${sort.colId} ${sort.sort.toUpperCase()}`);
});
if (sortClauses.length > 0) {
query += ' ORDER BY ' + sortClauses.join(', ');
}
}
// Pagination
const limit = lastRow - firstRow;
const offset = firstRow;
query += ` LIMIT ${limit} OFFSET ${offset}`;
console.log('Executing query:', query, queryParams);
connection.query(query, queryParams, (error, results) => {
if (error) {
console.error('Database query error:', error);
return reject(error);
}
connection.query('SELECT FOUND_ROWS() as totalRowCount', (err, countResult) => {
if (err) {
console.error('Database count error:', err);
return reject(err);
}
resolve({
totalRowCount: countResult[0].totalRowCount,
rows: results
});
});
});
});
}
};
app.use('/graphql', graphqlHTTP({
schema: schema,
rootValue: rootValue,
graphiql: true,
}));
app.listen(port, () => {
console.log(`Server running on port ${port}`);
});
```
--------------------------------
### Basic Row Selection Setup in Angular
Source: https://www.ag-grid.com/angular-data-grid/row-selection
This example demonstrates a basic AG Grid setup in an Angular component, including enabling row selection and fetching data. It allows switching between single and multi-row selection modes via a dropdown.
```typescript
import { Component } from "@angular/core";
import { HttpClient } from "@angular/common/http";
import { AgGridAngular } from "ag-grid-angular";
import "./styles.css";
import {
ClientSideRowModelModule,
ColDef,
ColGroupDef,
GridApi,
GridOptions,
GridReadyEvent,
ModuleRegistry,
RowSelectionMode,
RowSelectionModule,
RowSelectionOptions,
ValidationModule,
} from "ag-grid-community";
import {
ColumnMenuModule,
ColumnsToolPanelModule,
ContextMenuModule,
RowGroupingModule,
} from "ag-grid-enterprise";
ModuleRegistry.registerModules([
RowSelectionModule,
ClientSideRowModelModule,
ColumnsToolPanelModule,
ColumnMenuModule,
ContextMenuModule,
RowGroupingModule,
...(process.env.NODE_ENV !== "production" ? [ValidationModule] : []),
]);
import { IOlympicData } from "./interfaces";
@Component({
selector: "my-app",
standalone: true,
imports: [AgGridAngular],
template: `
`,
})
export class AppComponent {
private gridApi!: GridApi;
columnDefs: ColDef[] = [
{ field: "athlete", minWidth: 150 },
{ field: "age", maxWidth: 90 },
{ field: "country", minWidth: 150 },
{ field: "year", maxWidth: 90 },
{ field: "date", minWidth: 150 },
{ field: "sport", minWidth: 150 },
{ field: "gold" },
{ field: "silver" },
{ field: "bronze" },
{ field: "total" },
];
defaultColDef: ColDef = {
flex: 1,
minWidth: 100,
};
rowSelection: RowSelectionOptions | "single" | "multiple" = {
mode: "singleRow",
};
rowData!: IOlympicData[];
constructor(private http: HttpClient) {}
updateSelectionOptions() {
this.gridApi.setGridOption("rowSelection", {
mode: getSelectValue("#input-selection-mode"),
});
}
onGridReady(params: GridReadyEvent) {
this.gridApi = params.api;
this.http
.get<
IOlympicData[]
>("https://www.ag-grid.com/example-assets/small-olympic-winners.json")
.subscribe((data) => (this.rowData = data));
}
}
function getSelectValue(id: string): RowSelectionMode {
return (
(
document.querySelector(id)
?.value as RowSelectionMode
) ?? "singleRow"
);
}
```
--------------------------------
### Basic AG-Grid Angular Component Setup
Source: https://www.ag-grid.com/angular-data-grid/deep-dive
This snippet shows the essential setup for an AG-Grid Angular component. It includes importing necessary modules, defining row data and column definitions, and configuring the AgGridAngular component in the template. Ensure `ag-grid-angular` is installed.
```typescript
import { Component } from "@angular/core";
import { AgGridAngular } from "ag-grid-angular";
import type { ColDef } from "ag-grid-community";
import { AllCommunityModule, ModuleRegistry } from "ag-grid-community";
ModuleRegistry.registerModules([AllCommunityModule]);
// Row Data Interface
interface IRow {
make: string;
model: string;
price: number;
electric: boolean;
}
@Component({
standalone: true,
imports: [AgGridAngular],
selector: "my-app",
template: `
`,
})
export class AppComponent {
// Row Data: The data to be displayed.
rowData: IRow[] = [
{ make: "Tesla", model: "Model Y", price: 64950, electric: true },
{ make: "Ford", model: "F-Series", price: 33850, electric: false },
{ make: "Toyota", model: "Corolla", price: 29600, electric: false },
];
// Column Definitions: Defines & controls grid columns.
colDefs: ColDef[] = [
{ field: "make" },
{ field: "model" },
{ field: "price" },
{ field: "electric" },
];
}
```
--------------------------------
### Complete AG-Grid Angular Example
Source: https://www.ag-grid.com/angular-data-grid/getting-started
A full example demonstrating module registration, component setup, row data, column definitions, and default column settings. This includes defining an interface for row data and applying styles for full width and height.
```typescript
import { Component } from "@angular/core";
import { AgGridAngular } from "ag-grid-angular";
import type { ColDef } from "ag-grid-community";
import { AllCommunityModule, ModuleRegistry } from "ag-grid-community";
ModuleRegistry.registerModules([AllCommunityModule]);
// Row Data Interface
interface IRow {
make: string;
model: string;
price: number;
electric: boolean;
}
@Component({
standalone: true,
imports: [AgGridAngular],
selector: "my-app",
template: `
`,
})
export class AppComponent {
// Row Data: The data to be displayed.
rowData: IRow[] = [
{ make: "Tesla", model: "Model Y", price: 64950, electric: true },
{ make: "Ford", model: "F-Series", price: 33850, electric: false },
{ make: "Toyota", model: "Corolla", price: 29600, electric: false },
{ make: "Mercedes", model: "EQA", price: 48890, electric: true },
{ make: "Fiat", model: "500", price: 15774, electric: false },
{ make: "Nissan", model: "Juke", price: 20675, electric: false },
];
// Column Definitions: Defines & controls grid columns.
colDefs: ColDef[] = [
{ field: "make" },
{ field: "model" },
{ field: "price" },
{ field: "electric" },
];
defaultColDef: ColDef = {
flex: 1,
};
}
```
--------------------------------
### AG-Grid Angular Component Setup
Source: https://www.ag-grid.com/angular-data-grid/column-headers-styling
Set up an AG-Grid Angular component, including importing necessary modules and defining column definitions. This example demonstrates basic grid configuration and data fetching.
```typescript
import { Component } from "@angular/core";
import { HttpClient } from "@angular/common/http";
import { AgGridAngular } from "ag-grid-angular";
import "./styles.css";
import {
ClientSideRowModelModule,
ColDef,
ColGroupDef,
GridApi,
GridOptions,
GridReadyEvent,
ModuleRegistry,
NumberFilterModule,
TextFilterModule,
ValidationModule,
} from "ag-grid-community";
import { RowGroupingModule } from "ag-grid-enterprise";
ModuleRegistry.registerModules([
TextFilterModule,
ClientSideRowModelModule,
RowGroupingModule,
NumberFilterModule,
...(process.env.NODE_ENV !== "production" ? [ValidationModule] : []),
]);
import { IOlympicData } from "./interfaces";
@Component({
selector: "my-app",
standalone: true,
imports: [AgGridAngular],
template: ` `,
})
export class AppComponent {
columnDefs: (ColDef | ColGroupDef)[] = [
{
headerName: "Athlete Details",
children: [
{
field: "athlete",
width: 150,
suppressSizeToFit: true,
enableRowGroup: true,
rowGroupIndex: 0,
},
{
field: "age",
width: 90,
minWidth: 75,
maxWidth: 100,
enableRowGroup: true,
},
{
field: "country",
width: 120,
enableRowGroup: true,
},
{
field: "year",
width: 90,
enableRowGroup: true,
},
{ field: "sport", width: 110, enableRowGroup: true },
{
field: "gold",
width: 60,
enableValue: true,
suppressHeaderMenuButton: true,
suppressHeaderFilterButton: true,
filter: "agNumberColumnFilter",
aggFunc: "sum",
},
{
field: "silver",
width: 60,
enableValue: true,
suppressHeaderMenuButton: true,
suppressHeaderFilterButton: true,
filter: "agNumberColumnFilter",
aggFunc: "sum",
},
{
field: "bronze",
width: 60,
enableValue: true,
suppressHeaderMenuButton: true,
suppressHeaderFilterButton: true,
filter: "agNumberColumnFilter",
aggFunc: "sum",
},
{
field: "total",
width: 60,
enableValue: true,
suppressHeaderMenuButton: true,
suppressHeaderFilterButton: true,
filter: "agNumberColumnFilter",
aggFunc: "sum",
},
],
},
];
groupHeaderHeight = 75;
headerHeight = 150;
rowData!: IOlympicData[];
constructor(private http: HttpClient) {}
onGridReady(params: GridReadyEvent) {
this.http
.get("https://www.ag-grid.com/example-assets/olympic-winners.json")
.subscribe((data) => (this.rowData = data));
}
}
```
--------------------------------
### Complete AG Grid Angular Component Setup
Source: https://www.ag-grid.com/angular-data-grid/row-sorting
This example shows a full AG Grid Angular component setup, including module registration, column definitions with absolute sorting, default column definitions, and fetching row data. The `rankingChange` field is populated with random numbers between -5 and 5.
```typescript
import { Component } from "@angular/core";
import { HttpClient } from "@angular/common/http";
import { AgGridAngular } from "ag-grid-angular";
import {
ClientSideRowModelModule,
ColDef,
ColGroupDef,
GridApi,
GridOptions,
GridReadyEvent,
ModuleRegistry,
ValidationModule,
} from "ag-grid-community";
ModuleRegistry.registerModules([
ClientSideRowModelModule,
...(process.env.NODE_ENV !== "production" ? [ValidationModule] : []),
]);
import { any } from "./interfaces";
@Component({
selector: "my-app",
standalone: true,
imports: [AgGridAngular],
template: ` `,
})
export class AppComponent {
columnDefs: ColDef[] = [
{ field: "athlete", minWidth: 150 },
{ field: "year", maxWidth: 90 },
{
field: "rankingChange",
sort: { direction: "asc", type: "absolute" },
sortingOrder: [
{ direction: "asc", type: "absolute" },
{ direction: "desc", type: "absolute" },
null,
],
},
];
defaultColDef: ColDef = {
flex: 1,
minWidth: 100,
};
rowData!: any[];
constructor(private http: HttpClient) {}
onGridReady(params: GridReadyEvent) {
this.http
.get<
any[]
>("https://www.ag-grid.com/example-assets/small-olympic-winners.json")
.subscribe(
(data) =>
(this.rowData = data.map((item) => {
return {
...item,
rankingChange: Math.round(window.agRandom() * 10) - 5,
};
})),
);
}
}
```
--------------------------------
### AG-Grid Angular Component Setup
Source: https://www.ag-grid.com/angular-data-grid/column-groups
Sets up the AG-Grid Angular component, including module registration, HTTP client for data fetching, and basic grid options. Ensure 'ag-grid-angular' and 'ag-grid-community' are installed.
```typescript
import { Component } from "@angular/core";
import { HttpClient } from "@angular/common/http";
import { AgGridAngular } from "ag-grid-angular";
import "./styles.css";
import {
ClientSideRowModelModule,
ColDef,
ColGroupDef,
GridApi,
GridOptions,
GridReadyEvent,
ModuleRegistry,
ValidationModule,
} from "ag-grid-community";
ModuleRegistry.registerModules([
ClientSideRowModelModule,
...(process.env.NODE_ENV !== "production" ? [ValidationModule] : []),
]);
import { IOlympicData } from "./interfaces";
@Component({
selector: "my-app",
standalone: true,
imports: [AgGridAngular],
template: ` `,
})
export class AppComponent {
private gridApi!: GridApi;
defaultColDef: ColDef = {
width: 150,
};
columnDefs: ColDef[] = createNormalColDefs();
rowData!: IOlympicData[];
constructor(private http: HttpClient) {}
onBtNormalCols() {
this.gridApi.setGridOption("columnDefs", createNormalColDefs());
}
onBtExtraCols() {
this.gridApi.setGridOption("columnDefs", createExtraColDefs());
}
onGridReady(params: GridReadyEvent) {
this.gridApi = params.api;
this.http
.get("https://www.ag-grid.com/example-assets/olympic-winners.json")
.subscribe((data) => (this.rowData = data));
}
}
function createNormalColDefs(): (ColDef | ColGroupDef)[] {
return [
{
headerName: "Athlete Details",
headerClass: "participant-group",
children: [
{ field: "athlete", colId: "athlete" },
{ field: "country", colId: "country" },
],
},
{ field: "age", colId: "age" },
{
headerName: "Sports Results",
headerClass: "medals-group",
children: [
{ field: "sport", colId: "sport" },
{ field: "gold", colId: "gold" },
],
},
];
}
function createExtraColDefs(): (ColDef | ColGroupDef)[] {
return [
{
headerName: "Athlete Details",
headerClass: "participant-group",
children: [
{ field: "athlete", colId: "athlete" },
{ field: "country", colId: "country" },
{ field: "region1", colId: "region1" },
{ field: "region2", colId: "region2" },
],
},
{ field: "age", colId: "age" },
{ field: "distance", colId: "distance" },
{
headerName: "Sports Results",
headerClass: "medals-group",
children: [
{ field: "sport", colId: "sport" },
{ field: "gold", colId: "gold" },
],
},
];
}
```
--------------------------------
### Full AG-Grid Angular Example
Source: https://www.ag-grid.com/angular-data-grid/key-features
Demonstrates mapping and formatting values, cell components, and resizing columns within a complete AG-Grid Angular application setup. Includes module registration and component definitions.
```typescript
import { ChangeDetectionStrategy, Component } from "@angular/core";
import type { ICellRendererAngularComp } from "ag-grid-angular";
import { AgGridAngular } from "ag-grid-angular";
import type {
ColDef,
ICellRendererParams,
ValueGetterParams,
} from "ag-grid-community";
import { AllCommunityModule, ModuleRegistry } from "ag-grid-community";
ModuleRegistry.registerModules([AllCommunityModule]);
@Component({
standalone: true,
changeDetection: ChangeDetectionStrategy.OnPush,
template: ``,
})
export class CustomButtonComponent implements ICellRendererAngularComp {
agInit(params: ICellRendererParams): void {}
refresh(params: ICellRendererParams) {
return true;
}
buttonClicked() {
console.log("clicked");
}
}
@Component({
selector: "my-app",
standalone: true,
imports: [AgGridAngular],
template: ` `,
})
export class AppComponent {
public rowData: any[] | null = [
{ make: "Tesla", model: "Model Y", price: 64950, electric: true },
{ make: "Ford", model: "F-Series", price: 33850, electric: false },
{ make: "Toyota", model: "Corolla", price: 29600, electric: false },
{ make: "Mercedes", model: "EQA", price: 48890, electric: true },
{ make: "Fiat", model: "500", price: 15774, electric: false },
{ make: "Nissan", model: "Juke", price: 20675, electric: false },
];
public columnDefs: ColDef[] = [
{
headerName: "Make & Model",
valueGetter: (p: ValueGetterParams) => p.data.make + " " + p.data.model,
flex: 2,
},
{
field: "price",
valueFormatter: (p) => "£" + Math.floor(p.value).toLocaleString(),
flex: 1,
},
{ field: "electric", flex: 1 },
{ field: "button", cellRenderer: CustomButtonComponent, flex: 1 },
];
}
```
--------------------------------
### Database Setup Script
Source: https://www.ag-grid.com/angular-data-grid/server-side-operations-graphql
Import the SQL script to create and populate the 'sample_data' database and 'olympic_winners' table.
```bash
mysql -u root -p -D sample_data < ./data/olympic_winners.sql
```
--------------------------------
### Server-Side Model Grouping Example
Source: https://www.ag-grid.com/angular-data-grid/server-side-model-grouping
Example of server-side grouping configuration within the AG Grid server-side row model. This setup is used when data is too large to be handled client-side.
```javascript
const gridOptions = {
columnDefs: [
// column definitions here
],
defaultColDef: {
flex: 1,
},
rowModelType: 'serverSide',
serverSideStoreType: 'partial',
// other grid options
};
// ... grid initialization code
```
--------------------------------
### Full Example: Applying German Locale in AppComponent
Source: https://www.ag-grid.com/angular-data-grid/localisation
This example demonstrates the complete setup within an Angular component, including imports, module registration, and applying the localeText property.
```typescript
import { Component } from "@angular/core";
import { HttpClient } from "@angular/common/http";
import { AG_GRID_LOCALE_DE } from "@ag-grid-community/locale";
import { AgGridAngular } from "ag-grid-angular";
import { AgChartsEnterpriseModule } from "ag-charts-enterprise";
import {
ClientSideRowModelModule,
ColDef,
ColGroupDef,
CsvExportModule,
GridApi,
GridOptions,
GridReadyEvent,
ICellRendererComp,
ICellRendererParams,
LocaleModule,
LocaleText,
ModuleRegistry,
NumberEditorModule,
NumberFilterModule,
PaginationModule,
RowSelectionModule,
RowSelectionOptions,
SideBarDef,
StatusBar,
TextEditorModule,
TextFilterModule,
ValidationModule,
} from "ag-grid-community";
import {
CellSelectionModule,
ClipboardModule,
ColumnMenuModule,
ColumnsToolPanelModule,
ContextMenuModule,
ExcelExportModule,
FiltersToolPanelModule,
IntegratedChartsModule,
MultiFilterModule,
PivotModule,
RowGroupingPanelModule,
SetFilterModule,
SideBarModule,
StatusBarModule,
} from "ag-grid-enterprise";
ModuleRegistry.registerModules([
NumberEditorModule,
TextEditorModule,
RowSelectionModule,
LocaleModule,
PaginationModule,
ClientSideRowModelModule,
ClipboardModule,
ColumnsToolPanelModule,
CsvExportModule,
ExcelExportModule,
FiltersToolPanelModule,
ColumnMenuModule,
ContextMenuModule,
MultiFilterModule,
CellSelectionModule,
PivotModule,
SetFilterModule,
SideBarModule,
StatusBarModule,
RowGroupingPanelModule,
TextFilterModule,
NumberFilterModule,
IntegratedChartsModule.with(AgChartsEnterpriseModule),
...(process.env.NODE_ENV !== "production" ? [ValidationModule] : []),
]);
import { IOlympicData } from "./interfaces";
@Component({
selector: "my-app",
standalone: true,
imports: [AgGridAngular],
template: ` `,
})
export class AppComponent {
columnDefs: ColDef[] = [
// this row just shows the row index, doesn't use any data from the row
{
headerName: "#",
cellRenderer: NodeIdRenderer,
},
{
field: "athlete",
filterParams: { buttons: ["clear", "reset", "apply"] },
},
{
field: "age",
filterParams: { buttons: ["apply", "cancel"] },
enablePivot: true,
},
{ field: "country", enableRowGroup: true },
{ field: "year", filter: "agNumberColumnFilter" },
{ field: "date" },
{
field: "sport",
filter: "agMultiColumnFilter",
filterParams: {
filters: [
{
filter: "agTextColumnFilter",
display: "accordion",
},
{
filter: "agSetColumnFilter",
display: "accordion",
},
],
},
},
{ field: "gold", enableValue: true },
{ field: "silver", enableValue: true },
{ field: "bronze", enableValue: true },
{ field: "total", enableValue: true },
];
defaultColDef: ColDef = {
editable: true,
flex: 1,
minWidth: 100,
filter: true,
};
statusBar: StatusBar = {
statusPanels: [
{ statusPanel: "agTotalAndFilteredRowCountComponent", align: "left" },
{ statusPanel: "agAggregationComponent" },
],
};
rowGroupPanelShow: "always" | "onlyWhenGrouping" | "never" = "always";
paginationPageSize = 500;
paginationPageSizeSelector: number[] | boolean = [100, 500, 1000];
localeText: LocaleText = AG_GRID_LOCALE_DE;
}
```
--------------------------------
### Install Project Dependencies
Source: https://www.ag-grid.com/angular-data-grid/server-side-operations-graphql
Install all necessary project dependencies and build the project.
```bash
yarn install
```
--------------------------------
### Install Dependencies and Build Project
Source: https://www.ag-grid.com/angular-data-grid/server-side-operations-spark
Install project dependencies and build the project using Maven.
```bash
mvn clean install
```
--------------------------------
### Single Range Cell Selection Example
Source: https://www.ag-grid.com/angular-data-grid/cell-selection
This example demonstrates how to configure AG-Grid for single range cell selection by setting the `suppressMultiRanges` option. It includes necessary imports and component setup for an Angular application.
```typescript
import { Component } from "@angular/core";
import { HttpClient } from "@angular/common/http";
import { AgGridAngular } from "ag-grid-angular";
import {
CellSelectionOptions,
ClientSideRowModelModule,
ColDef,
ColGroupDef,
GridApi,
GridOptions,
GridReadyEvent,
ModuleRegistry,
NumberEditorModule,
TextEditorModule,
ValidationModule,
} from "ag-grid-community";
import {
CellSelectionModule,
ClipboardModule,
ColumnMenuModule,
ContextMenuModule,
} from "ag-grid-enterprise";
ModuleRegistry.registerModules([
NumberEditorModule,
TextEditorModule,
ClientSideRowModelModule,
ClipboardModule,
ColumnMenuModule,
ContextMenuModule,
CellSelectionModule,
...(process.env.NODE_ENV !== "production" ? [ValidationModule] : []),
]);
import { IOlympicData } from "./interfaces";
@Component({
selector: "my-app",
standalone: true,
imports: [AgGridAngular],
template: ` `,
})
export class AppComponent {
columnDefs: ColDef[] = [
{ field: "athlete", minWidth: 150 },
{ field: "age", maxWidth: 90 },
{ field: "country", minWidth: 150 },
{ field: "year", maxWidth: 90 },
{ field: "date", minWidth: 150 },
{ field: "sport", minWidth: 150 },
{ field: "gold" },
{ field: "silver" },
{ field: "bronze" },
{ field: "total" },
];
defaultColDef: ColDef = {
flex: 1,
minWidth: 100,
editable: true,
};
cellSelection: boolean | CellSelectionOptions = { suppressMultiRanges: true };
rowData!: IOlympicData[];
constructor(private http: HttpClient) {}
onGridReady(params: GridReadyEvent) {
this.http
.get("https://www.ag-grid.com/example-assets/small-olympic-winners.json")
.subscribe((data) => (this.rowData = data));
}
}
```
--------------------------------
### Start the Application
Source: https://www.ag-grid.com/angular-data-grid/server-side-operations-graphql
Run the application using yarn start and access it via your browser.
```bash
yarn start
```
--------------------------------
### AG-Grid Setup and Configuration for Pivoting
Source: https://www.ag-grid.com/angular-data-grid/pivoting
Sets up AG-Grid with necessary modules, column definitions, and default configurations for demonstrating pivot functionality. Includes HTTP client for data fetching.
```typescript
import { Component } from "@angular/core";
import { HttpClient } from "@angular/common/http";
import { AgGridAngular } from "ag-grid-angular";
import "./styles.css";
import {
AutoGroupColumnDef,
ClientSideRowModelModule,
ColDef,
ColGroupDef,
ColumnApiModule,
GridApi,
GridOptions,
GridReadyEvent,
ModuleRegistry,
SideBarDef,
ValidationModule,
} from "ag-grid-community";
import {
ColumnMenuModule,
ColumnsToolPanelModule,
ContextMenuModule,
FiltersToolPanelModule,
PivotModule,
RowGroupingPanelModule,
} from "ag-grid-enterprise";
ModuleRegistry.registerModules([
ClientSideRowModelModule,
ColumnApiModule,
ColumnsToolPanelModule,
ColumnMenuModule,
ContextMenuModule,
PivotModule,
FiltersToolPanelModule,
RowGroupingPanelModule,
...(process.env.NODE_ENV !== "production" ? [ValidationModule] : []),
]);
import { IOlympicData } from "./interfaces";
@Component({
selector: "my-app",
standalone: true,
imports: [AgGridAngular],
template: `
`,
})
export class AppComponent {
private gridApi!: GridApi;
columnDefs: ColDef[] = [
{ field: "country", rowGroup: true, enableRowGroup: true },
{ field: "year", rowGroup: true, enableRowGroup: true, enablePivot: true },
{ field: "date" },
{ field: "sport" },
{ field: "gold", aggFunc: "sum" },
{ field: "silver", aggFunc: "sum" },
{ field: "bronze", aggFunc: "sum" },
];
defaultColDef: ColDef = {
flex: 1,
minWidth: 150,
};
autoGroupColumnDef: AutoGroupColumnDef = {
minWidth: 250,
};
sideBar: SideBarDef | string | string[] | boolean | null = "columns";
rowData!: IOlympicData[];
constructor(private http: HttpClient) {}
onBtNormal() {
this.gridApi.setGridOption("pivotMode", false);
this.gridApi.applyColumnState({
state: [
{ colId: "country", rowGroup: true },
{ colId: "year", rowGroup: true },
],
defaultState: {
pivot: false,
rowGroup: false,
},
});
}
onBtPivotMode() {
this.gridApi.setGridOption("pivotMode", true);
this.gridApi.applyColumnState({
state: [
{ colId: "country", rowGroup: true },
{ colId: "year", rowGroup: true },
],
defaultState: {
pivot: false,
rowGroup: false,
},
});
}
onBtFullPivot() {
this.gridApi.setGridOption("pivotMode", true);
this.gridApi.applyColumnState({
state: [
{ colId: "country", rowGroup: true },
{ colId: "year", pivot: true },
],
defaultState: {
pivot: false,
rowGroup: false,
},
});
}
onGridReady(params: GridReadyEvent) {
this.gridApi = params.api;
this.http
.get("https://www.ag-grid.com/example-assets/olympic-winners.json")
```
--------------------------------
### AG-Grid Angular Component Setup for Skeleton Loading
Source: https://www.ag-grid.com/angular-data-grid/component-loading-cell-renderer
Configure an AG-Grid Angular component to use skeleton loading by setting `suppressServerSideFullWidthLoadingRow` to true. This example demonstrates the necessary imports, module registration, and component setup for a server-side row model.
```typescript
import { Component } from "@angular/core";
import { HttpClient } from "@angular/common/http";
import { AgGridAngular } from "ag-grid-angular";
import {
ColDef,
ColGroupDef,
GridApi,
GridOptions,
GridReadyEvent,
IServerSideDatasource,
IServerSideGetRowsRequest,
ModuleRegistry,
RowModelType,
ValidationModule,
} from "ag-grid-community";
import {
RowGroupingModule,
ServerSideRowModelModule,
} from "ag-grid-enterprise";
ModuleRegistry.registerModules([
ServerSideRowModelModule,
RowGroupingModule,
...(process.env.NODE_ENV !== "production" ? [ValidationModule] : []),
]);
import { IOlympicData } from "./interfaces";
@Component({
selector: "my-app",
standalone: true,
imports: [AgGridAngular],
template: ` `,
})
export class AppComponent {
columnDefs: ColDef[] = [
{ field: "country", flex: 4 },
{ field: "sport", flex: 4 },
{ field: "year", flex: 3 },
{ field: "gold", aggFunc: "sum", flex: 2 },
{ field: "silver", aggFunc: "sum", flex: 2 },
{ field: "bronze", aggFunc: "sum", flex: 2 },
];
defaultColDef: ColDef = {
minWidth: 75,
};
rowModelType: RowModelType = "serverSide";
cacheBlockSize = 5;
maxBlocksInCache = 0;
rowBuffer = 0;
maxConcurrentDatasourceRequests = 1;
blockLoadDebounceMillis = 200;
rowData!: IOlympicData[];
constructor(private http: HttpClient) {}
onGridReady(params: GridReadyEvent) {
this.http
.get<
IOlympicData[]
>("https://www.ag-grid.com/example-assets/olympic-winners.json")
.subscribe((data) => {
// add id to data
let idSequence = 0;
data.forEach((item: any) => {
item.id = idSequence++;
});
const server: any = getFakeServer(data);
const datasource: IServerSideDatasource =
getServerSideDatasource(server);
params.api!.setGridOption("serverSideDatasource", datasource);
});
}
}
function getServerSideDatasource(server: any): IServerSideDatasource {
return {
getRows: (params) => {
// adding delay to simulate real server call
setTimeout(() => {
const response = server.getResponse(params.request);
if (response.success) {
// call the success callback
params.success({
rowData: response.rows,
rowCount: response.lastRow,
});
} else {
// inform the grid request failed
params.fail();
}
}, 4000);
},
};
}
function getFakeServer(allData: any[]): any {
return {
getResponse: (request: IServerSideGetRowsRequest) => {
console.log(
"[Datasource] asking for rows: " +
request.startRow +
" to " +
request.endRow,
);
// take a slice of the total rows
const rowsThisPage = allData.slice(request.startRow, request.endRow);
const lastRow = allData.length;
return {
success: true,
rows: rowsThisPage,
lastRow: lastRow,
};
},
};
}
```
--------------------------------
### Trigger quick-start prompt in Cursor/Claude
Source: https://www.ag-grid.com/angular-data-grid/mcp-server
Initiate the `quick-start` prompt in Cursor or Claude to generate instructions for creating a new AG Grid project or adding AG Grid to an existing one.
```bash
/ag-mcp:quick-start {additional-context}
```
--------------------------------
### Get/Set Individual Filter Model
Source: https://www.ag-grid.com/angular-data-grid/filter-api
This example demonstrates how to get and set individual filter models, useful for saving and restoring filter states.
```typescript
onGridReady(params: GridReadyEvent) {
this.gridApi = params.api;
params.api.getToolPanelInstance("filters")!.expandFilters(["athlete"]);
this.http
.get<
IOlympicData[]
>("https://www.ag-grid.com/example-assets/olympic-winners.json")
.subscribe((data) => (this.rowData = data));
}
}
```
--------------------------------
### Setting up Server-Side Datasource
Source: https://www.ag-grid.com/angular-data-grid/server-side-model-updating-refresh
This code sets up the server-side datasource by fetching data, creating a fake server, and registering the datasource with the grid. It also initiates periodic data modification.
```typescript
.get("https://www.ag-grid.com/example-assets/olympic-winners.json")
.subscribe((data) => {
// give each data item an ID
const dataWithId = data.map((d: any, idx: number) => ({
...d,
id: idx,
}));
allData = dataWithId;
// setup the fake server with entire dataset
const fakeServer = new FakeServer(allData);
// create datasource with a reference to the fake server
const datasource = getServerSideDatasource(fakeServer);
// register the datasource with the grid
params.api!.setGridOption("serverSideDatasource", datasource);
beginPeriodicallyModifyingData();
});
}
}
let allData: any[];
let versionCounter = 1;
const updateChangeIndicator = () => {
const el = document.querySelector("#version-indicator") as HTMLInputElement;
el.textContent = `${versionCounter}`;
};
const beginPeriodicallyModifyingData = () => {
setInterval(() => {
versionCounter += 1;
allData = allData.map((data) => ({
...data,
version: versionCounter + " - " + versionCounter + " - " + versionCounter,
}));
updateChangeIndicator();
}, 4000);
};
```
--------------------------------
### Expand and Collapse Filter Groups Example
Source: https://www.ag-grid.com/angular-data-grid/tool-panel-filters
Demonstrates how to get the Filters Tool Panel instance and use its methods to expand and collapse filter groups, both all at once and individually.
```typescript
// lookup Filters Tool Panel instance by id, in this case using the default filter instance id
const filtersToolPanel = this.gridApi.getToolPanelInstance('filters');
// expands all filter groups in the Filters Tool Panel
filtersToolPanel.expandFilterGroups();
// collapses all filter groups in the Filters Tool Panel
filtersToolPanel.collapseFilterGroups();
// expands the 'athlete' and 'competition' filter groups in the Filters Tool Panel
filtersToolPanel.expandFilterGroups(['athleteGroupId', 'competitionGroupId']);
// collapses the 'competition' filter group in the Filters Tool Panel
filtersToolPanel.collapseFilters(['competitionGroupId']);
```
--------------------------------
### Server-Side Datasource Setup
Source: https://www.ag-grid.com/angular-data-grid/server-side-model-changing-columns
Sets up the server-side datasource with a fake server and registers it with the grid.
```typescript
fakeServer = new FakeServer(data);
const datasource: IServerSideDatasource =
getServerSideDatasource(fakeServer);
params.api!.setGridOption("serverSideDatasource", datasource);
```
--------------------------------
### Trigger quick-start prompt in VS Code (CoPilot)
Source: https://www.ag-grid.com/angular-data-grid/mcp-server
Activate the `quick-start` prompt within VS Code (CoPilot) to receive guidance on setting up an AG Grid project.
```bash
mcp.ag-mcp.quick-start {additional-context}
```