Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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.0.0-beta.20260125.2038
BUILD_CHARTS_VERSION=13.0.0-beta.20260125
BUILD_GRID_VERSION=35.0.0-beta.20260127.914
BUILD_CHARTS_VERSION=13.0.0-beta.20260127
ENV=local
NX_BATCH_MODE=true
NX_ADD_PLUGINS=false
Expand Down
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.0.0-beta.20260125.2038",
"version": "35.0.0-beta.20260127.914",
"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.0.0-beta.20260125.2038",
"version": "35.0.0-beta.20260127.914",
"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.0.0-beta.20260125.2038",
"version": "35.0.0-beta.20260127.914",
"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.0.0-beta.20260125",
"ag-charts-community": "13.0.0-beta.20260125",
"ag-charts-enterprise": "13.0.0-beta.20260125",
"ag-charts-types": "13.0.0-beta.20260125",
"ag-charts-react": "13.0.0-beta.20260125",
"ag-charts-vue3": "13.0.0-beta.20260125",
"ag-grid-angular": "35.0.0-beta.20260125.2038",
"ag-grid-community": "35.0.0-beta.20260125.2038",
"ag-grid-enterprise": "35.0.0-beta.20260125.2038",
"ag-grid-react": "35.0.0-beta.20260125.2038",
"ag-grid-vue3": "35.0.0-beta.20260125.2038",
"ag-charts-angular": "13.0.0-beta.20260127",
"ag-charts-community": "13.0.0-beta.20260127",
"ag-charts-enterprise": "13.0.0-beta.20260127",
"ag-charts-types": "13.0.0-beta.20260127",
"ag-charts-react": "13.0.0-beta.20260127",
"ag-charts-vue3": "13.0.0-beta.20260127",
"ag-grid-angular": "35.0.0-beta.20260127.914",
"ag-grid-community": "35.0.0-beta.20260127.914",
"ag-grid-enterprise": "35.0.0-beta.20260127.914",
"ag-grid-react": "35.0.0-beta.20260127.914",
"ag-grid-vue3": "35.0.0-beta.20260127.914",
"algoliasearch": "^4.18.0",
"astro": "5.16.6",
"cheerio": "^1.0.0",
Expand Down
2 changes: 1 addition & 1 deletion documentation/update-algolia-indices/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "update-algolia-indices",
"version": "35.0.0-beta.20260125.2038",
"version": "35.0.0-beta.20260127.914",
"description": "Update algolia indices",
"main": "src/index.ts",
"type": "module",
Expand Down
4 changes: 2 additions & 2 deletions external/ag-website-shared/.gitrepo
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
[subrepo]
remote = git@github.com:ag-grid/ag-website-shared.git
branch = latest
commit = a013f797c3aaffd289e128a6785a098a73483c53
parent = ef4717b49c5f199a9275a1f7e981bbb629020c0f
commit = ef0ca8147898c5da17fe4c9c59c553203d2312af
parent = 75ed3bad6376e13579ea7f87895ce1ba720dc5e8
method = rebase
cmdver = 0.4.9
38 changes: 19 additions & 19 deletions external/ag-website-shared/src/content/policies/modern-slavery.mdoc
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
1. ### Introduction {% id="intro-modern-slavery" %}
1. ### Introduction {% id="intro-modern-slavery" %}

***

This statement is made pursuant to Section 54 of the Modern Slavery Act 2015. It sets out the steps that AG Grid Ltd has taken and is continuing to take to ensure that modern slavery or human trafficking is not taking place within our business or supply chain.

AG Grid Ltd has a zero-tolerance approach to modern slavery. We are committed to acting ethically and with integrity in all our business dealings and relationships and to implementing and enforcing effective systems and controls to ensure modern slavery is not taking place anywhere in our own business or in any of our supply chains.

2. ### Organisation Structure and Supply Chain {% id="organisation-structure" %}
2. ### Organisation Structure and Supply Chain {% id="organisation-structure" %}

***

Expand All @@ -16,61 +16,61 @@

However, we remain vigilant, particularly regarding indirect supply chains (such as hardware procurement and office services).

3. ### Policies in Relation to Modern Slavery {% id="policies-modern-slavery" %}
3. ### Policies in Relation to Modern Slavery {% id="policies-modern-slavery" %}

***

We operate several internal policies to ensure that we are conducting business in an ethical and transparent manner. These include:

- **Whistleblowing Policy:** We maintain a policy that encourages all employees to report any concerns related to the direct activities, or the supply chains of, the organisation. This includes any circumstances that may give rise to an enhanced risk of slavery or human trafficking.
- **Whistleblowing Policy:** We maintain a policy that encourages all employees to report any concerns related to the direct activities, or the supply chains of, the organisation. This includes any circumstances that may give rise to an enhanced risk of slavery or human trafficking.

- **Recruitment Policy:** We operate a robust recruitment policy, including conducting eligibility to work in the UK checks for all employees to safeguard against human trafficking or individuals being forced to work against their will.
- **Recruitment Policy:** We operate a robust recruitment policy, including conducting eligibility to work in the UK checks for all employees to safeguard against human trafficking or individuals being forced to work against their will.

- **Anti-Bribery and Corruption Policy:** We maintain strict policies against bribery and corruption, ensuring all business is conducted lawfully.
- **Anti-Bribery and Corruption Policy:** We maintain strict policies against bribery and corruption, ensuring all business is conducted lawfully.

4. ### Due Diligence Processes {% id="due-diligence" %}
4. ### Due Diligence Processes {% id="due-diligence" %}

***

We undertake due diligence when considering taking on new suppliers, and regularly review our existing suppliers. Our current due diligence process includes:

- Conducting internal research and review processes on prospective suppliers.
- Issuing questionnaires to key suppliers to assess their suitability and their own stance on modern slavery.
- Using only approved and reputable recruitment agencies for hiring staff, ensuring they adhere to UK employment laws.
- Conducting internal research and review processes on prospective suppliers.
- Issuing questionnaires to key suppliers to assess their suitability and their own stance on modern slavery.
- Using only approved and reputable recruitment agencies for hiring staff, ensuring they adhere to UK employment laws.

5. ### Risk Assessment {% id="risk-assessment" %}
5. ### Risk Assessment {% id="risk-assessment" %}

***

We consider the overall risk of modern slavery within our business to be low, primarily because:

1. Our business is in the high-skilled technology sector.
2. Our operations are based in the UK, a jurisdiction with strong employment protections.
1. Our business is in the high-skilled technology sector.
2. Our operations are based in the UK, a jurisdiction with strong employment protections.
3. Our supply chain consists mainly of professional services and low-volume procurement.

Despite this low risk, we understand that modern slavery can occur in any sector (particularly in indirect areas such as cleaning, catering, or hardware manufacturing) and we are committed to constant vigilance.

6. ### Training and Awareness {% id="training-awareness" %}
6. ### Training and Awareness {% id="training-awareness" %}

***

We have not yet implemented specific Modern Slavery training for all staff, given our low-risk profile. However, our HR and management teams are responsible for ensuring strict compliance with Right to Work checks and employment laws.

7. ### Key Performance Indicators and Future Steps {% id="kpis-future" %}
7. ### Key Performance Indicators and Future Steps {% id="kpis-future" %}

***

To ensure we continue to improve our approach to combatting modern slavery, we have set the following specific goal for the financial year 2026:

- **Creation of a Supplier Code of Conduct:** We will draft and implement a formal Supplier Code of Conduct. We will require our key suppliers to acknowledge and adhere to this code, which will explicitly prohibit the use of forced, compulsory, or trafficked labour.
- **Creation of a Supplier Code of Conduct:** We will draft and implement a formal Supplier Code of Conduct. We will require our key suppliers to acknowledge and adhere to this code, which will explicitly prohibit the use of forced, compulsory, or trafficked labour.

8. ### Approval {% id="approval-modern-slavery" %}
8. ### Approval {% id="approval-modern-slavery" %}

***

This statement was approved by the Board of Directors on 2026-01-20.

Signed,
Signed,

**John Masterson**{% br /%}
CEO AG Grid Ltd
CEO AG Grid Ltd
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "ag-grid",
"version": "35.0.0-beta.20260125.2038",
"version": "35.0.0-beta.20260127.914",
"license": "MIT",
"scripts": {
"compressVideo": "tsx external/ag-website-shared/scripts/compress-video",
Expand Down
6 changes: 3 additions & 3 deletions packages/ag-grid-angular/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "ag-grid-angular",
"version": "35.0.0-beta.20260125.2038",
"version": "35.0.0-beta.20260127.914",
"description": "AG Grid Angular Component",
"scripts": {
"clean": "rimraf dist",
Expand All @@ -15,7 +15,7 @@
"module": "./dist/ag-grid-angular/fesm2022/ag-grid-angular.mjs",
"typings": "./dist/ag-grid-angular/index.d.ts",
"dependencies": {
"ag-grid-community": "35.0.0-beta.20260125.2038",
"ag-grid-community": "35.0.0-beta.20260127.914",
"@angular/animations": "^18.0.7",
"@angular/common": "^18.0.7",
"@angular/compiler": "^18.0.7",
Expand All @@ -27,7 +27,7 @@
"zone.js": "~0.15.1"
},
"devDependencies": {
"ag-grid-community": "35.0.0-beta.20260125.2038",
"ag-grid-community": "35.0.0-beta.20260127.914",
"@angular-devkit/build-angular": "^18.0.7",
"@angular/cli": "^18.0.7",
"@angular/forms": "^18.0.7",
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
{
"name": "ag-grid-angular",
"version": "35.0.0-beta.20260125.2038",
"version": "35.0.0-beta.20260127.914",
"description": "AG Grid Angular Component",
"license": "MIT",
"peerDependencies": {
"@angular/common": ">= 18.0.0",
"@angular/core": ">= 18.0.0"
},
"dependencies": {
"ag-grid-community": "35.0.0-beta.20260125.2038",
"ag-grid-community": "35.0.0-beta.20260127.914",
"tslib": "^2.3.0"
},
"repository": {
Expand Down
4 changes: 2 additions & 2 deletions packages/ag-grid-community/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "ag-grid-community",
"version": "35.0.0-beta.20260125.2038",
"version": "35.0.0-beta.20260127.914",
"description": "Advanced Data Grid / Data Table supporting Javascript / Typescript / React / Angular / Vue",
"main": "./dist/package/main.cjs.js",
"types": "./dist/types/src/main.d.ts",
Expand Down Expand Up @@ -119,7 +119,7 @@
],
"homepage": "https://www.ag-grid.com/",
"dependencies": {
"ag-charts-types": "13.0.0-beta.20260125"
"ag-charts-types": "13.0.0-beta.20260127"
},
"devDependencies": {
"source-map-loader": "^5.0.0",
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { presetDateFilterTypeRelativeFromToMap } from './dateFilterHandler';
import type { ISimpleFilterModelPresetType } from '../iSimpleFilter';
import { DateFilterHandler, presetDateFilterTypeRelativeFromToMap } from './dateFilterHandler';

describe('presetDateFilterTypeRelativeFromToMap', () => {
const BASE = 'Wed Apr 08 2020 12:34:56 GMT+0000 (Coordinated Universal Time)';
Expand Down Expand Up @@ -98,3 +99,61 @@ describe('presetDateFilterTypeRelativeFromToMap', () => {
it('works', () => expect(presetDateFilterTypeRelativeFromToMap[fnName](FROM).toString()).toContain(expected))
);
});

describe('getOrRefreshRangeCacheItem', () => {
const key = 'today' as ISimpleFilterModelPresetType;

beforeEach(() => {
jest.useFakeTimers();
jest.setSystemTime(new Date(0));
});

afterEach(() => {
jest.useRealTimers();
});

it('returns cached range for the same key before expiry', () => {
const handler = new DateFilterHandler();
const rangeFn = jest.fn(() => [new Date(1), new Date(2)] as [Date, Date]);

const first = handler.getOrRefreshRangeCacheItem(key, rangeFn);
const second = handler.getOrRefreshRangeCacheItem(key, rangeFn);

expect(rangeFn).toHaveBeenCalledTimes(1);
expect(first[0]).toBe(second[0]);
expect(first[1]).toBe(second[1]);
});

it('refreshes the cache when expired', () => {
const handler = new DateFilterHandler();
const rangeFn = jest
.fn()
.mockImplementationOnce(() => [new Date(1), new Date(2)] as [Date, Date])
.mockImplementationOnce(() => [new Date(3), new Date(4)] as [Date, Date]);

const first = handler.getOrRefreshRangeCacheItem(key, rangeFn);

jest.setSystemTime(new Date(86_400_001));

const second = handler.getOrRefreshRangeCacheItem(key, rangeFn);

expect(rangeFn).toHaveBeenCalledTimes(2);
expect(first.from).not.toBe(second.from);
expect(first.to).not.toBe(second.to);
expect([second.from, second.to].map((date) => date.getTime())).toStrictEqual([3, 4]);
});

it('keeps separate caches per key', () => {
const handler = new DateFilterHandler();
const rangeFnToday = jest.fn(() => [new Date(10), new Date(20)] as [Date, Date]);
const rangeFnYesterday = jest.fn(() => [new Date(30), new Date(40)] as [Date, Date]);

const today = handler.getOrRefreshRangeCacheItem('today', rangeFnToday);
const yesterday = handler.getOrRefreshRangeCacheItem('yesterday', rangeFnYesterday);

expect(rangeFnToday).toHaveBeenCalledTimes(1);
expect(rangeFnYesterday).toHaveBeenCalledTimes(1);
expect([today.from, today.to].map((date) => date.getTime())).toStrictEqual([10, 20]);
expect([yesterday.from, yesterday.to].map((date) => date.getTime())).toStrictEqual([30, 40]);
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -20,26 +20,34 @@ function defaultDateComparator(filterDate: Date, cellValue: any): number {
return 0;
}

type Range = { from: Date; to: Date };

interface RangeCacheItem extends Range {
expires: number;
}

export class DateFilterHandler extends ScalarFilterHandler<DateFilterModel, Date, IDateFilterParams> {
public readonly filterType = 'date' as const;
protected readonly FilterModelFormatterClass = DateFilterModelFormatter;
private readonly filterTypeToRangeCache = new Map<ISimpleFilterModelPresetType, [Date, Date]>();
private readonly filterTypeToRangeCache = new Map<ISimpleFilterModelPresetType, RangeCacheItem>();

constructor() {
super(mapValuesFromDateFilterModel, DEFAULT_DATE_FILTER_OPTIONS);
this.refreshFilterBaseDate();
}

private refreshFilterBaseDate(): void {
if (this.isAlive()) {
this.filterTypeToRangeCache.clear();
const filterBaseDateTimeout = setTimeout(
() => this.refreshFilterBaseDate(),
// this evaluates to a number of ms between NOW and beginning of tomorrow MINUS 1 minute
setStartOfNextDay(new Date()).getTime() - Date.now() - 60 * 1000
);
this.addDestroyFunc(() => clearTimeout(filterBaseDateTimeout));
getOrRefreshRangeCacheItem(key: ISimpleFilterModelPresetType, rangeFn: (s: Date, e: Date) => [Date, Date]): Range {
const { filterTypeToRangeCache } = this;
const now = Date.now();
let cache = filterTypeToRangeCache.get(key);
if (cache && cache.expires < now) {
cache = undefined;
}
if (!cache) {
const [from, to] = rangeFn(new Date(now), new Date(now));
cache = { from, to, expires: setStartOfNextDay(new Date(now)).getTime() - now };
filterTypeToRangeCache.set(key, cache);
}
return cache;
}

protected override comparator(): Comparator<Date> {
Expand All @@ -62,16 +70,13 @@ export class DateFilterHandler extends ScalarFilterHandler<DateFilterModel, Date
if (!this.isValid(cellValue)) {
return type === 'notEqual' || type === 'notBlank';
}
const typeAsPreset = type as ISimpleFilterModelPresetType;
const presetDateRangeFn = presetDateFilterTypeRelativeFromToMap[typeAsPreset] as RelativeRangeFn;
const maybeTypeAsPreset = type as ISimpleFilterModelPresetType;
const presetDateRangeFn = presetDateFilterTypeRelativeFromToMap[maybeTypeAsPreset] as
| RelativeRangeFn
| undefined;
if (presetDateRangeFn) {
// indicates we are in preset time ranges space
let cache = this.filterTypeToRangeCache.get(typeAsPreset);
if (!cache) {
cache = presetDateRangeFn(new Date(), new Date());
this.filterTypeToRangeCache.set(typeAsPreset, cache);
}
const [from, to] = cache;
// user selected a preset, calculate what they mean
const { from, to } = this.getOrRefreshRangeCacheItem(maybeTypeAsPreset, presetDateRangeFn);
return comparator(from, cellValue) >= 0 && comparator(to, cellValue) < 0;
}

Expand Down
2 changes: 1 addition & 1 deletion packages/ag-grid-community/src/version.ts
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
// DO NOT UPDATE MANUALLY: Generated from script during build time
export const VERSION = '35.0.0-beta.20260125.2038';
export const VERSION = '35.0.0-beta.20260127.914';
Loading
Loading