Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
4297f13
Release 35.2.0 Prep
AgGitDeployment Mar 20, 2026
b21b47f
Release 35.2.0 Prep
AgGitDeployment Mar 20, 2026
342c660
RTI-3267-fix-delta-sort-transaction (#13364)
SalvatorePreviti Mar 23, 2026
bc936c0
RTI-3257 groupRowEditable and distributeGroupValue remaining fixes (#…
SalvatorePreviti Mar 23, 2026
9578cb5
RTI-3264 Add links to Component Usage table entries (#13367)
StephenCooper Mar 23, 2026
b724b15
[RTI-3272] Fix(aggregation): throws an error on changing type (#13370)
sdwvit Mar 23, 2026
1dbbc5b
RTI-3293 group-to-leaf demotion must update count (#13371)
SalvatorePreviti Mar 23, 2026
f45c5d8
Fix(columns): tool panel drag interaction shows pin icon instead of r…
sdwvit Mar 23, 2026
70ddeb1
RTI-3263, RTI-3271, RTI-3275 Fix documentation example issues (#13373)
BernieSumption Mar 23, 2026
58c1579
RTI-3269-fix-aggregation-sum-examples (#13374)
SalvatorePreviti Mar 23, 2026
9866355
RTI-3300 - fixed enter on row number header cell moving focus (#13369)
gportela85 Mar 23, 2026
2f4d5fe
RTI-3301 - fixed custom phone editor example (#13375)
gportela85 Mar 23, 2026
3096d6f
RTI-3268-fix-change-detection-example (#13376)
SalvatorePreviti Mar 23, 2026
cfd023d
RTI-3283 - fixed tab navigation in and out of the grid header (#13377)
gportela85 Mar 23, 2026
77df9ab
RTI-3296 Fix redo shortcut for Mac (Cmd+Shift+Z instead of Cmd+Y) (#1…
StephenCooper Mar 23, 2026
8f1495b
[RTI-3259] Fix(columns): tool panel drag interaction shows pin icon i…
sdwvit Mar 23, 2026
533d2fa
Fix formatting (#13379)
seanlandsman Mar 23, 2026
a3204b6
RTI-3288 - fix waterfall chart warning (#13383)
peterjrreynolds Mar 23, 2026
9c3da91
Fix(columns): staged state equivalent to current still shows apply bu…
sdwvit Mar 23, 2026
5ffea63
RTI-3290 add Batching Data Requests section to SSRM grouping and pivo…
sdwvit Mar 23, 2026
97bc81d
RTI-3281 - added simple clipboard example to docs (#13385)
gportela85 Mar 23, 2026
37c163e
RTI-3270 Add note about Angular 21 zoneless default to NgZone docs (#…
StephenCooper Mar 23, 2026
f3229d3
[NR][Docs][Vue] Simplify vue property text (#13386)
seanlandsman Mar 23, 2026
0ee7940
Release 35.2.0 Prep
AgGitDeployment Mar 23, 2026
b52a25a
RTI-3266, RTI-3273, RTI-3274, RTI-3291, RTI-3276 Fix docs examples (#…
StephenCooper Mar 23, 2026
280f845
RTI-3287 Fix legacy theme CSS postcss-rtlcss double-wrapping (#13387)
BernieSumption Mar 23, 2026
f9213c5
RTI-3268 fix change detection example (#13388)
SalvatorePreviti Mar 23, 2026
d206377
RTI-3295 Fix SSRM grouping docs code snippet (#13390)
StephenCooper Mar 23, 2026
c484c52
RTI-3265 update defParent when reusing tool panel wrapper during setS…
sdwvit Mar 23, 2026
5a80b92
Release 35.2.0 Prep
AgGitDeployment Mar 23, 2026
a05a652
RTI-3257-more-fixes-to-group-row-editable (#13393)
SalvatorePreviti Mar 23, 2026
6ae1cce
Release 35.2.0 Prep
AgGitDeployment Mar 23, 2026
8e87b78
RTI-3258 Fix Doc tests for animations (#13368)
StephenCooper Mar 24, 2026
2016765
[RTI-3309] Fix(docs): restructure ctp deferred updates example and al…
sdwvit Mar 24, 2026
05a5047
RTI-3282-more-docs-fixes-for-group-edit (#13396)
SalvatorePreviti Mar 24, 2026
09be48d
[RTI-3260] Fix(columns): staged state equivalent to current still sho…
sdwvit Mar 24, 2026
7225619
Release 35.2.0 Prep
AgGitDeployment Mar 24, 2026
e33a8fd
Merge branch 'b35.2.0' into latest
seanlandsman Mar 24, 2026
b08c4cc
Reset baseUrl
seanlandsman Mar 24, 2026
6c3b787
git subrepo commit external/ag-shared
alantreadway Mar 24, 2026
2e0acfc
Apply ag-shared sync companion changes
alantreadway Mar 24, 2026
bea57e7
git subrepo commit external/ag-shared
alantreadway Mar 24, 2026
05b6665
Merge pull request #13400 from ag-grid/sync/ajt/ag-shared-20260324
alantreadway Mar 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .env
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Production Build
BUILD_GRID_VERSION=35.1.0-beta.20260320.1044
BUILD_CHARTS_VERSION=13.1.0-beta.20260320
BUILD_GRID_VERSION=35.2.0-beta.20260324.1227
BUILD_CHARTS_VERSION=13.2.0-beta.20260324
ENV=local
NX_BATCH_MODE=true
NX_ADD_PLUGINS=false
Expand Down
1 change: 1 addition & 0 deletions .rulesync/rules/browser-support.md
1 change: 1 addition & 0 deletions .rulesync/skills/run-gha-locally
5 changes: 0 additions & 5 deletions .run/BigInt support.run.xml

This file was deleted.

5 changes: 5 additions & 0 deletions .run/Column Tool Panel Icon bug.run.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Column Tool Panel Icon bug" type="JavascriptDebugType" engineId="98ca6316-2f89-46d9-a9e5-fa9e2b0625b3" uri="https://plnkr.co/edit/Kh56rmKKhKWuUmYB?open=main.js">
<method v="2" />
</configuration>
</component>
5 changes: 0 additions & 5 deletions .run/Mini filter value formatter.run.xml

This file was deleted.

2 changes: 1 addition & 1 deletion community-modules/locale/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@ag-grid-community/locale",
"version": "35.1.0-beta.20260320.1044",
"version": "35.2.0-beta.20260324.1227",
"description": "Localisation Module for AG Grid, providing translations in 31 languages.",
"main": "./dist/package/main.cjs.js",
"types": "./dist/types/src/main.d.ts",
Expand Down
2 changes: 1 addition & 1 deletion community-modules/styles/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@ag-grid-community/styles",
"version": "35.1.0-beta.20260320.1044",
"version": "35.2.0-beta.20260324.1227",
"description": "AG Grid Styles and Themes",
"main": "_index.scss",
"files": [
Expand Down
24 changes: 12 additions & 12 deletions documentation/ag-grid-docs/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"name": "ag-grid-docs",
"description": "Documentation for AG Grid",
"type": "module",
"version": "35.1.0-beta.20260320.1044",
"version": "35.2.0-beta.20260324.1227",
"repository": {
"type": "git",
"url": "https://github.com/ag-grid/ag-grid.git"
Expand Down Expand Up @@ -53,17 +53,17 @@
"@types/react": "^18.2.47",
"@types/react-dom": "^18.2.18",
"@pqina/flip": "^1.8.4",
"ag-charts-angular": "13.1.0-beta.20260320",
"ag-charts-community": "13.1.0-beta.20260320",
"ag-charts-enterprise": "13.1.0-beta.20260320",
"ag-charts-types": "13.1.0-beta.20260320",
"ag-charts-react": "13.1.0-beta.20260320",
"ag-charts-vue3": "13.1.0-beta.20260320",
"ag-grid-angular": "35.1.0-beta.20260320.1044",
"ag-grid-community": "35.1.0-beta.20260320.1044",
"ag-grid-enterprise": "35.1.0-beta.20260320.1044",
"ag-grid-react": "35.1.0-beta.20260320.1044",
"ag-grid-vue3": "35.1.0-beta.20260320.1044",
"ag-charts-angular": "13.2.0-beta.20260324",
"ag-charts-community": "13.2.0-beta.20260324",
"ag-charts-enterprise": "13.2.0-beta.20260324",
"ag-charts-types": "13.2.0-beta.20260324",
"ag-charts-react": "13.2.0-beta.20260324",
"ag-charts-vue3": "13.2.0-beta.20260324",
"ag-grid-angular": "35.2.0-beta.20260324.1227",
"ag-grid-community": "35.2.0-beta.20260324.1227",
"ag-grid-enterprise": "35.2.0-beta.20260324.1227",
"ag-grid-react": "35.2.0-beta.20260324.1227",
"ag-grid-vue3": "35.2.0-beta.20260324.1227",
"algoliasearch": "^4.18.0",
"astro": "5.16.6",
"cheerio": "^1.0.0",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -620,7 +620,7 @@
},
"getStructuredSchema": {
"more": {
"name": "CSV Export",
"name": "AI Toolkit",
"url": "./ai-toolkit/"
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,10 @@ frameworks: ["angular"]

Recommended NgZoneOptions and details of AG Grid's performance optimisations to avoid [Zone Pollution](https://angular.dev/best-practices/zone-pollution).

{% note %}
From Angular 21, new applications are zoneless by default. The optimisations on this page only apply to Zone based applications. See [Angular Zoneless](https://angular.dev/guide/zoneless) for more details.
{% /note %}

## Recommended NgZoneOptions

Angular supports coalescing of change detection cycles via [NgZoneOptions](https://angular.dev/api/core/NgZoneOptions). This can be set via `provideZoneChangeDetection` when bootstrapping your application. We recommend enabling `eventCoalescing` and `runCoalescing` for optimal AG Grid performance.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ export class PhoneEditor implements ICellEditorAngularComp, AfterViewInit {

const { cellStartedEdit, eventKey } = this.params;

if (cellStartedEdit && eventKey.length === 1) {
if (cellStartedEdit && eventKey?.length === 1) {
this.inputRef.nativeElement.value = eventKey;
}
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ export class PhoneEditor implements ICellEditorComp<string> {

const { cellStartedEdit, eventKey } = this.params;

if (cellStartedEdit && eventKey.length === 1) {
if (cellStartedEdit && eventKey?.length === 1) {
this.eInput.value = eventKey;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ export default {

const { cellStartedEdit, eventKey } = this.params;

if (cellStartedEdit && eventKey.length === 1) {
if (cellStartedEdit && eventKey?.length === 1) {
this.$refs.input.value = eventKey;
}
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ export default memo(({ value, onValueChange, validate, cellStartedEdit, eventKey
inputRef.current?.focus();
inputRef.current?.select();

if (cellStartedEdit && eventKey.length === 1) {
if (cellStartedEdit && eventKey?.length === 1) {
setInternalValue(eventKey);
}
}, []);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,6 @@ const gridOptions: GridOptions = {
headerName: 'Total',
type: 'totalColumn',
minWidth: 120,
aggFunc: 'sum',
valueGetter: 'getValue("a") + getValue("b") + getValue("c") + getValue("d")',
},
],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,6 @@ const gridOptions: GridOptions = {
{
headerName: 'Total',
type: 'totalColumn',
aggFunc: 'sum',
valueGetter: 'getValue("a") + getValue("b") + getValue("c") + getValue("d")',
},
],
Expand Down Expand Up @@ -68,9 +67,16 @@ const gridOptions: GridOptions = {
groupDefaultExpanded: 1,
suppressAggFuncInHeader: true,
allowShowChangeAfterFilter: true,
refreshAfterGroupEdit: true,
onCellValueChanged: onCellValueChanged,
};

function onCellValueChanged(params: CellValueChangedEvent) {
const data = params.data;
if (data) {
params.api.applyTransaction({ update: [data] });
}
}

function getRowData() {
const rowData = [];
for (let i = 1; i <= 10; i++) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,6 @@ const gridOptions: GridOptions = {
{
headerName: 'Total',
type: 'totalColumn',
aggFunc: 'sum',
valueGetter: 'getValue("a") + getValue("b") + getValue("c") + getValue("d")',
},
],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ The example below shows change detection impacting the result of groups. The gri

- Column 'Group' is marked as a [Row Group](./grouping/) and columns A to D are marked as [Aggregation](./aggregation/) columns so that their values are summed into the group level.

- Column 'Total' has a valueGetter which gives a sum of all columns A to D for the rows, and a `sum` aggregation for the groups.
- Column 'Total' has a valueGetter which gives a sum of all columns A to D.

- Columns A to D are editable. If you edit a cells value, then the aggregate value at the group level is also updated to reflect the change. This is because the grid is recalculating the aggregations as a result of the change.

Expand Down Expand Up @@ -165,14 +165,7 @@ For this reason, if you want to update the sorting, filtering or group grouping

### Example: Change Detection and Filter / Sort / Group

The following example is the same as the example above [Change Detection and Groups](#example-change-detection-groups) except it sets the flag `refreshAfterGroupEdit` to true.
This flag tells the grid to refresh the grouping, sorting and filtering if the group column changes.

See [Editing Groups](./grouping-edit/) for more on editing grouped data and `refreshAfterGroupEdit`.

{% gridExampleRunner title="Change Detection with Filter / Sort / Group" name="change-detection-filter-sort-group" /%}

From the example, the following can be noted:
The following example is the same as the example above [Change Detection and Groups](#example-change-detection-groups) except it gets the grid to do a transaction update so that the grouping, sorting and filtering are recomputed. From the example, the following can be noted:

- As before, updating any value will update the total column and aggregated group columns.

Expand All @@ -182,6 +175,8 @@ From the example, the following can be noted:

- If you set a filter (eg filter 'A' to be 'less than 50') and then change the data so that a row no longer passes the filter, the grid will fix itself so that the filtering is maintained. In other words, the updated row will be removed if it no longer passes the filter.

{% gridExampleRunner title="Change Detection with Filter / Sort / Group" name="change-detection-filter-sort-group" /%}

## Aggregation Path Selection

When data in the grid updates and aggregations are active, the grid will not recompute all aggregations again from scratch. Instead it will be selective as to what aggregations need to be re-computed.
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import { clickAllButtons, ensureGridReady, test, waitForGridContent } from '@utils/grid/test-utils';

test.agExample(import.meta, () => {
test.eachFramework('Example', async ({ page }) => {
// PLACEHOLDER - MINIMAL TEST TO ENSURE GRID LOADS WITHOUT ERRORS
await ensureGridReady(page);
await waitForGridContent(page);
await clickAllButtons(page);
// END PLACEHOLDER
});
});
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<div id="myGrid" style="height: 100%"></div>
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
import type { GridApi, GridOptions } from 'ag-grid-community';
import {
ClientSideRowModelModule,
ModuleRegistry,
NumberEditorModule,
TextEditorModule,
ValidationModule,
createGrid,
} 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] : []),
]);

let gridApi: GridApi<IOlympicData>;

const gridOptions: GridOptions<IOlympicData> = {
columnDefs: [
{ field: 'athlete', minWidth: 200 },
{ field: 'age' },
{ field: 'country', minWidth: 150 },
{ field: 'year' },
{ field: 'date', minWidth: 150 },
{ field: 'sport', minWidth: 150 },
{ field: 'gold' },
{ field: 'silver' },
{ field: 'bronze' },
{ field: 'total' },
],

defaultColDef: {
editable: true,
flex: 1,
minWidth: 100,
},

cellSelection: true,
copyHeadersToClipboard: true,
};

// setup the grid after the page has finished loading
document.addEventListener('DOMContentLoaded', () => {
const gridDiv = document.querySelector<HTMLElement>('#myGrid')!;
gridApi = createGrid(gridDiv, gridOptions);

fetch('https://www.ag-grid.com/example-assets/olympic-winners.json')
.then((response) => response.json())
.then((data: IOlympicData[]) => gridApi!.setGridOption('rowData', data));
});
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,6 @@ const gridOptions: GridOptions<IOlympicData> = {
},

cellSelection: true,
copyHeadersToClipboard: true,
};

// setup the grid after the page has finished loading
Expand Down
28 changes: 22 additions & 6 deletions documentation/ag-grid-docs/src/content/docs/clipboard/index.mdoc
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,11 @@ When [Cell Ranges](./cell-selection) are enabled by setting `gridOptions.cellSel

Multiple cell ranges can be selected at once using {% kbd "^ Ctrl" /%} and dragging with the mouse. When copying, all ranges will be copied to the clipboard. Note that the relative positions of multiple ranges is not preserved when copying, they are stacked vertically in the clipboard.

The column headers can be copied to the clipboard in addition to the cell contents by enabling the option `copyHeadersToClipboard`.

{% apiDocumentation source="grid-options/properties.json" section="clipboard" names=["copyHeadersToClipboard"] /%}

In the below example `copyHeadersToClipboard` has been enabled, try:
In the below example try:

- Select a cell range with click & drag
- Copy with {% kbd "^ Ctrl" /%}+{% kbd "C" /%}
- Paste into an external program / text editor, note that the column headers were also copied.
- Paste into an external program / text editor.

{% gridExampleRunner title="Copying Cell Ranges" name="copy-range" /%}

Expand Down Expand Up @@ -54,6 +50,26 @@ You can change this behaviour by toggling the "Copy Selected Rows" checkbox to e

{% gridExampleRunner title="Copying Rows" name="copy-row" /%}

## Copying Headers

The column headers can be copied to the clipboard in addition to the cell contents by enabling the option `copyHeadersToClipboard`.

```{% frameworkTransform=true %}
const gridOptions = {
copyHeadersToClipboard: true,
}
```

{% apiDocumentation source="grid-options/properties.json" section="clipboard" names=["copyHeadersToClipboard"] /%}

In the below example try:

- Select a cell range with click & drag
- Copy with {% kbd "^ Ctrl" /%}+{% kbd "C" /%}
- Paste into an external program / text editor, note that the column headers were also copied.

{% gridExampleRunner title="Copying Cell Ranges and Headers" name="copy-range-with-headers" /%}

## Custom Clipboard Interaction

If you want to do the copy to clipboard yourself (i.e. not use the grid's clipboard interaction) then implement the callback `sendToClipboard(params)`. Use this if you are in a non-standard web container that has a bespoke API for interacting with the clipboard. The callback gets the data to go into the clipboard, it's your job to call the bespoke API.
Expand Down
Loading
Loading