From 1d70bfdeace395baab1bb53288ad07e7e00bdb35 Mon Sep 17 00:00:00 2001 From: Salvatore Previti Date: Fri, 8 May 2026 10:33:18 +0100 Subject: [PATCH 01/12] AG-17286 react rows flickering with transactions (#13693) * AG-17286-react-rows-flashing --- .../src/rendering/row/rowCtrl.ts | 24 +- .../src/reactUi/rows/rowComp.tsx | 8 +- .../bulk-add-cell-flicker-react.test.tsx | 209 ++++++++++++++++++ 3 files changed, 238 insertions(+), 3 deletions(-) create mode 100644 testing/behavioural/src/row-data/bulk-add-cell-flicker-react.test.tsx diff --git a/packages/ag-grid-community/src/rendering/row/rowCtrl.ts b/packages/ag-grid-community/src/rendering/row/rowCtrl.ts index 14095a149e2..856156fb28a 100644 --- a/packages/ag-grid-community/src/rendering/row/rowCtrl.ts +++ b/packages/ag-grid-community/src/rendering/row/rowCtrl.ts @@ -194,6 +194,14 @@ export class RowCtrl extends BeanStub { this.fullWidthNotesFeature = this.isFullWidth() ? beans.notesSvc?.createFullWidthNotesFeature(this) : undefined; this.addListeners(); + + // Pre-create CellCtrls so framework wrappers can seed their first render and + // avoid the bulk-add empty-row flash. + // The animation-frame path is left to handle deferred creation. + // We are disabling this also during scroll to not cause sluggishness. + if (!useAnimationFrameForCreate && !this.isFullWidth()) { + this.createAllCellCtrls(); + } } private initRowBusinessKey(): void { @@ -657,7 +665,7 @@ export class RowCtrl extends BeanStub { } } - private getCellCtrlsForContainer(containerType: RowContainerType) { + private getCellCtrlsForContainer(containerType: RowContainerType): CellCtrl[] { switch (containerType) { case 'left': return this.leftCellCtrls.list; @@ -689,6 +697,20 @@ export class RowCtrl extends BeanStub { } } + /** + * CellCtrls for the container if eagerly created in the constructor, or `null` + * when creation is deferred (animation-frame path) or skipped (full-width rows). + * We don't want to enable this during scrolling as well, as it can cause sluggishness + * during scroll. + * Used by framework wrappers to seed first render and avoid bulk-add flicker. + */ + public getInitialCellCtrls(containerType: RowContainerType): CellCtrl[] | null { + if (this.useAnimationFrameForCreate || this.isFullWidth()) { + return null; + } + return this.getCellCtrlsForContainer(containerType); + } + private isCellEligibleToBeRemoved(cellCtrl: CellCtrl, nextContainerPinned: ColumnPinnedType): boolean { const REMOVE_CELL = true; const KEEP_CELL = false; diff --git a/packages/ag-grid-react/src/reactUi/rows/rowComp.tsx b/packages/ag-grid-react/src/reactUi/rows/rowComp.tsx index 206b9733100..0436afd48b2 100644 --- a/packages/ag-grid-react/src/reactUi/rows/rowComp.tsx +++ b/packages/ag-grid-react/src/reactUi/rows/rowComp.tsx @@ -37,8 +37,12 @@ const RowComp = ({ rowCtrl, containerType }: { rowCtrl: RowCtrl; containerType: const [rowBusinessKey, setRowBusinessKey] = useState(() => rowCtrl.businessKey); const [userStyles, setUserStyles] = useState(() => rowCtrl.rowStyles); - const cellCtrlsRef = useRef(null); - const [cellCtrlsFlushSync, setCellCtrlsFlushSync] = useState(() => null); + // Seeded so bulk-add doesn't flash empty rows; getInitialCellCtrls returns + // null when creation is deferred or not applicable. + const [cellCtrlsFlushSync, setCellCtrlsFlushSync] = useState(() => + rowCtrl.getInitialCellCtrls(containerType) + ); + const cellCtrlsRef = useRef(cellCtrlsFlushSync); const [fullWidthCompDetails, setFullWidthCompDetails] = useState(); // these styles have initial values, so element is placed into the DOM with them, diff --git a/testing/behavioural/src/row-data/bulk-add-cell-flicker-react.test.tsx b/testing/behavioural/src/row-data/bulk-add-cell-flicker-react.test.tsx new file mode 100644 index 00000000000..2c1897104de --- /dev/null +++ b/testing/behavioural/src/row-data/bulk-add-cell-flicker-react.test.tsx @@ -0,0 +1,209 @@ +import { act, cleanup, render, waitFor } from '@testing-library/react'; +import React from 'react'; + +import type { ColDef, GridApi } from 'ag-grid-community'; +import { + ClientSideRowModelApiModule, + ClientSideRowModelModule, + ColumnApiModule, + ModuleRegistry, + RowApiModule, +} from 'ag-grid-community'; +import { AgGridReact } from 'ag-grid-react'; + +import { asyncSetTimeout, ignoreConsoleLicenseKeyError } from '../test-utils'; + +const ROW_SELECTOR = '[row-id]'; + +/** + * Detection strategy: a MutationObserver records mutations where an element is + * appended INTO an already-attached row. Pre-fix this fires for every newly-added + * row (RowComp mounts empty, fills cells on a later commit); post-fix RowCtrl + * pre-creates the cells so the row's first commit already contains them. + */ +describe('Eager row content seed (bulk-add flicker regression)', () => { + beforeAll(() => { + ModuleRegistry.registerModules([ + ClientSideRowModelModule, + ClientSideRowModelApiModule, + RowApiModule, + ColumnApiModule, + ]); + ignoreConsoleLicenseKeyError(); + }); + + afterEach(() => { + cleanup(); + }); + + type FlickerRecord = { rowId: string | null; addedElements: number }; + + /** Records every mutation where a child element is appended into an already-attached row. */ + async function recordContentAppendedIntoExistingRows( + root: HTMLElement, + mutate: () => Promise | void + ): Promise { + const records: FlickerRecord[] = []; + const observer = new MutationObserver((mutations) => { + for (const mutation of mutations) { + if (mutation.type !== 'childList' || mutation.addedNodes.length === 0) { + continue; + } + const target = mutation.target; + if (!(target instanceof HTMLElement) || !target.hasAttribute('row-id')) { + continue; + } + const addedElements = Array.from(mutation.addedNodes).filter( + (n): n is HTMLElement => n instanceof HTMLElement + ).length; + if (addedElements > 0) { + records.push({ rowId: target.getAttribute('row-id'), addedElements }); + } + } + }); + observer.observe(root, { childList: true, subtree: true }); + try { + await mutate(); + await asyncSetTimeout(0); // drain MutationObserver microtask queue + } finally { + observer.disconnect(); + } + return records; + } + + function expectNoFlicker(records: FlickerRecord[]) { + if (records.length === 0) { + return; + } + const total = records.reduce((acc, r) => acc + r.addedElements, 0); + throw new Error( + `Expected new rows to be inserted with content already attached, but ${total} element(s) were ` + + `appended into ${records.length} already-attached row(s). First: ${JSON.stringify(records.slice(0, 5))}` + ); + } + + test('center-only columns: bulk add inserts rows with cells attached', async () => { + const columnDefs: ColDef[] = [{ field: 'a' }, { field: 'b' }, { field: 'c' }]; + const initialRowData = Array.from({ length: 5 }, (_, i) => ({ a: `a${i}`, b: `b${i}`, c: `c${i}` })); + + let gridApi: GridApi | undefined; + const rendered = render( +
+ { + gridApi = p.api; + }} + /> +
+ ); + + await waitFor(() => expect(rendered.container.querySelectorAll(ROW_SELECTOR).length).toBeGreaterThan(0)); + + const records = await recordContentAppendedIntoExistingRows(rendered.container, async () => { + const additions = Array.from({ length: 20 }, (_, i) => ({ a: `na${i}`, b: `nb${i}`, c: `nc${i}` })); + act(() => { + gridApi!.applyTransaction({ add: additions }); + }); + await waitFor(() => + expect(rendered.container.querySelectorAll(ROW_SELECTOR).length).toBeGreaterThan(initialRowData.length) + ); + }); + + expectNoFlicker(records); + }); + + test('pinned columns: left and right containers also receive pre-created cells', async () => { + const columnDefs: ColDef[] = [ + { field: 'l1', pinned: 'left' }, + { field: 'l2', pinned: 'left' }, + { field: 'c1' }, + { field: 'c2' }, + { field: 'r1', pinned: 'right' }, + ]; + const makeRow = (i: number) => ({ + l1: `l1-${i}`, + l2: `l2-${i}`, + c1: `c1-${i}`, + c2: `c2-${i}`, + r1: `r1-${i}`, + }); + const initialRowData = Array.from({ length: 3 }, (_, i) => makeRow(i)); + + let gridApi: GridApi | undefined; + const rendered = render( +
+ { + gridApi = p.api; + }} + /> +
+ ); + + await waitFor(() => expect(rendered.container.querySelectorAll(ROW_SELECTOR).length).toBeGreaterThan(0)); + + // Each row appears 3 times in the DOM (left/center/right containers). + const records = await recordContentAppendedIntoExistingRows(rendered.container, async () => { + const additions = Array.from({ length: 20 }, (_, i) => makeRow(100 + i)); + act(() => { + gridApi!.applyTransaction({ add: additions }); + }); + await waitFor(() => + expect(rendered.container.querySelectorAll(ROW_SELECTOR).length).toBeGreaterThan( + initialRowData.length * 3 + ) + ); + }); + + expectNoFlicker(records); + }); + + test('column visibility toggle after bulk add still produces correct cells', async () => { + // Guards against a regression where the constructor pre-creation prevents the + // setComp-driven reconciliation from picking up subsequent column changes. + const columnDefs: ColDef[] = [{ field: 'a' }, { field: 'b' }, { field: 'c' }]; + const initialRowData = Array.from({ length: 3 }, (_, i) => ({ a: `a${i}`, b: `b${i}`, c: `c${i}` })); + + let gridApi: GridApi | undefined; + const rendered = render( +
+ { + gridApi = p.api; + }} + /> +
+ ); + + await waitFor(() => expect(rendered.container.querySelectorAll(ROW_SELECTOR).length).toBeGreaterThan(0)); + + act(() => { + gridApi!.applyTransaction({ + add: Array.from({ length: 20 }, (_, i) => ({ a: `na${i}`, b: `nb${i}`, c: `nc${i}` })), + }); + }); + await waitFor(() => + expect(rendered.container.querySelectorAll(ROW_SELECTOR).length).toBeGreaterThan(initialRowData.length) + ); + + act(() => { + gridApi!.setColumnsVisible(['b'], false); + }); + + await waitFor(() => { + const dataRows = Array.from(rendered.container.querySelectorAll(ROW_SELECTOR)).filter( + (r) => r.querySelectorAll('[role="gridcell"]').length > 0 + ); + expect(dataRows.length).toBeGreaterThan(0); + for (const row of dataRows) { + expect(row.querySelectorAll('[role="gridcell"]').length).toBe(2); + } + }); + }); +}); From bd75e11bc257958d4f8ba62f4652b9077c3c00da Mon Sep 17 00:00:00 2001 From: Victor Musienko <8777372+sdwvit@users.noreply.github.com> Date: Fri, 8 May 2026 12:17:18 +0200 Subject: [PATCH 02/12] AG-17161 Remove legacy theme toolbar shims, use legacy variables directly (#13697) --- .../src/internal/base/_base-variables.scss | 16 +---- .../src/internal/base/parts/_batch-edit.scss | 2 +- .../src/internal/base/parts/_toolbar.scss | 66 +++++++++---------- 3 files changed, 35 insertions(+), 49 deletions(-) diff --git a/community-modules/styles/src/internal/base/_base-variables.scss b/community-modules/styles/src/internal/base/_base-variables.scss index 58776acbed1..66f14452ceb 100644 --- a/community-modules/styles/src/internal/base/_base-variables.scss +++ b/community-modules/styles/src/internal/base/_base-variables.scss @@ -25,20 +25,6 @@ --ag-toolbar-separator-color: var(--ag-border-color); --ag-toolbar-separator-width: 1px; - // Shims mapping new Theming API variable names used by toolbar SCSS to legacy equivalents - --ag-spacing: var(--ag-grid-size); - --ag-text-color: var(--ag-foreground-color); - --ag-header-row-border: var(--ag-borders) var(--ag-border-color); - --ag-toolbar-separator-border: solid var(--ag-toolbar-separator-width) var(--ag-toolbar-separator-color); - --ag-input-border: var(--ag-borders-input) var(--ag-input-border-color); - --ag-input-border-radius: var(--ag-border-radius); - --ag-input-background-color: var(--ag-background-color); - --ag-input-placeholder-text-color: var(--ag-disabled-foreground-color); - --ag-input-focus-border: var(--ag-borders-input) var(--ag-input-focus-border-color); - --ag-focus-shadow: var(--ag-input-focus-box-shadow); - --ag-icon-button-hover-background-color: transparent; - --ag-icon-button-hover-color: var(--ag-foreground-color); - --ag-tooltip-background-color: transparent; --ag-tooltip-error-background-color: color-mix( @@ -295,7 +281,7 @@ --ag-note-popup-background-color: var(--ag-menu-background-color); --ag-note-popup-text-color: color-mix(in srgb, transparent, var(--ag-foreground-color) 75%); --ag-note-popup-input-text-color: var(--ag-input-text-color); - --ag-note-popup-input-background-color: var(--ag-input-background-color); + --ag-note-popup-input-background-color: var(--ag-background-color); --ag-note-popup-border: var(--ag-dialog-border); --ag-note-popup-padding: calc(var(--ag-grid-size) / 2); } diff --git a/community-modules/styles/src/internal/base/parts/_batch-edit.scss b/community-modules/styles/src/internal/base/parts/_batch-edit.scss index b9f3c019848..adcf32aa298 100644 --- a/community-modules/styles/src/internal/base/parts/_batch-edit.scss +++ b/community-modules/styles/src/internal/base/parts/_batch-edit.scss @@ -11,7 +11,7 @@ // if the user supplies a semi-transparent background the content of the // cell below won't be visible background-color: var(--ag-background-color); - background-image: linear-gradient(0deg, var(--ag-input-background-color), var(--ag-input-background-color)); + background-image: linear-gradient(0deg, var(--ag-background-color), var(--ag-background-color)); } .ag-row-batch-edit { diff --git a/community-modules/styles/src/internal/base/parts/_toolbar.scss b/community-modules/styles/src/internal/base/parts/_toolbar.scss index b75cccfaa26..225fabb4c4d 100644 --- a/community-modules/styles/src/internal/base/parts/_toolbar.scss +++ b/community-modules/styles/src/internal/base/parts/_toolbar.scss @@ -5,7 +5,7 @@ display: flex; align-items: center; overflow: hidden; - border-bottom: var(--ag-header-row-border); + border-bottom: var(--ag-borders) var(--ag-border-color); min-height: var(--ag-header-height); background-color: var(--ag-toolbar-background-color); color: var(--ag-toolbar-text-color); @@ -21,20 +21,20 @@ .ag-toolbar-item { display: inline-flex; - margin: 0 calc(var(--ag-spacing, 8px) * 2); + margin: 0 calc(var(--ag-grid-size, 8px) * 2); } .ag-toolbar-button-wrapper { display: inline-flex; - padding: calc(var(--ag-spacing) * 0.25); + padding: calc(var(--ag-grid-size) * 0.25); height: 100%; } .ag-toolbar-button { display: inline-flex; align-items: center; - gap: var(--ag-spacing); - padding: calc(var(--ag-spacing)); + gap: var(--ag-grid-size); + padding: calc(var(--ag-grid-size)); border: 0; background: transparent; color: var(--ag-toolbar-text-color); @@ -45,14 +45,14 @@ } .ag-toolbar-button-wrapper:hover { - background-color: var(--ag-icon-button-hover-background-color); - color: var(--ag-icon-button-hover-color); + background-color: transparent; + color: var(--ag-foreground-color); } // stylelint-disable-next-line selector-max-specificity .ag-toolbar-button-wrapper:hover .ag-toolbar-button, .ag-toolbar-button-wrapper:hover .ag-toolbar-button .ag-icon { - color: var(--ag-icon-button-hover-color); + color: var(--ag-foreground-color); } // stylelint-disable-next-line selector-max-specificity @@ -66,7 +66,7 @@ } .ag-toolbar-button:focus-visible { - box-shadow: var(--ag-focus-shadow); + box-shadow: var(--ag-input-focus-box-shadow); } .ag-toolbar-button:focus:not(:focus-visible) { @@ -83,7 +83,7 @@ display: inline-flex; flex: 1; min-width: 235px; - padding: 0 calc(var(--ag-spacing) * 2); + padding: 0 calc(var(--ag-grid-size) * 2); } .ag-toolbar-input { @@ -92,7 +92,7 @@ align-items: center; min-width: 200px; max-width: none; - margin: 0 calc(var(--ag-spacing) * 2); + margin: 0 calc(var(--ag-grid-size) * 2); } // stylelint-disable-next-line selector-max-specificity @@ -103,12 +103,12 @@ // stylelint-disable-next-line selector-max-specificity .ag-toolbar > .ag-toolbar-input:first-child, .ag-toolbar-right-start + .ag-toolbar-input { - margin-inline-start: var(--ag-spacing); + margin-inline-start: var(--ag-grid-size); } // stylelint-disable-next-line selector-max-specificity .ag-toolbar > .ag-toolbar-input:last-child { - margin-inline-end: var(--ag-spacing); + margin-inline-end: var(--ag-grid-size); } .ag-toolbar-input-icon { @@ -118,19 +118,19 @@ color: var(--ag-toolbar-text-color); opacity: 0.5; pointer-events: none; - inset-inline-start: var(--ag-spacing); + inset-inline-start: var(--ag-grid-size); } .ag-toolbar-input-field { - color: var(--ag-text-color); + color: var(--ag-foreground-color); font-size: var(--ag-font-size); line-height: 1.5; outline: none; - border: var(--ag-input-border); - border-radius: var(--ag-input-border-radius); + border: var(--ag-borders-input) var(--ag-input-border-color); + border-radius: var(--ag-border-radius); width: 100%; - padding-block: calc(var(--ag-spacing) * 0.5); - padding-inline: calc(var(--ag-icon-size) + var(--ag-spacing) * 2) var(--ag-spacing); + padding-block: calc(var(--ag-grid-size) * 0.5); + padding-inline: calc(var(--ag-icon-size) + var(--ag-grid-size) * 2) var(--ag-grid-size); } // High-specificity padding override — beats theme text-input padding-left rules @@ -140,20 +140,20 @@ input[class^='ag-'][type='text'].ag-toolbar-input-field { @include ag.unthemed-rtl( ( - padding-left: calc(var(--ag-icon-size) + var(--ag-spacing) * 2), - padding-right: var(--ag-spacing), + padding-left: calc(var(--ag-icon-size) + var(--ag-grid-size) * 2), + padding-right: var(--ag-grid-size), ) ); } } .ag-toolbar-input-field:focus { - box-shadow: var(--ag-focus-shadow); - border: var(--ag-input-focus-border); + box-shadow: var(--ag-input-focus-box-shadow); + border: var(--ag-borders-input) var(--ag-input-focus-border-color); } .ag-toolbar-input-field::placeholder { - color: var(--ag-input-placeholder-text-color); + color: var(--ag-disabled-foreground-color); } .ag-toolbar-panel .ag-column-drop-horizontal { @@ -175,23 +175,23 @@ .ag-toolbar-separator { align-self: stretch; width: 0; - margin: calc(var(--ag-spacing) * 1.75) 0; - border-inline-start: var(--ag-toolbar-separator-border); + margin: calc(var(--ag-grid-size) * 1.75) 0; + border-inline-start: solid var(--ag-toolbar-separator-width) var(--ag-toolbar-separator-color); } .ag-toolbar-find { - gap: calc(var(--ag-spacing) * 0.5); + gap: calc(var(--ag-grid-size) * 0.5); width: 280px; max-width: none; min-width: 220px; - border: var(--ag-input-border); - border-radius: var(--ag-input-border-radius); - background-color: var(--ag-input-background-color); + border: var(--ag-borders-input) var(--ag-input-border-color); + border-radius: var(--ag-border-radius); + background-color: var(--ag-background-color); } .ag-toolbar-find:focus-within { - box-shadow: var(--ag-focus-shadow); - border: var(--ag-input-focus-border); + box-shadow: var(--ag-input-focus-box-shadow); + border: var(--ag-borders-input) var(--ag-input-focus-border-color); } .ag-toolbar-find .ag-toolbar-input-field { @@ -226,6 +226,6 @@ .ag-toolbar-find-button { flex-shrink: 0; - padding: calc(var(--ag-spacing) * 0.5); + padding: calc(var(--ag-grid-size) * 0.5); } } From 770adba34b643392c40fdb05cfe871aa7244514f Mon Sep 17 00:00:00 2001 From: Stephen Cooper Date: Fri, 8 May 2026 11:36:57 +0100 Subject: [PATCH 03/12] AG-17280 Relax Toolbar key Requirements (#13696) * AG-17280 Toolbar key for api only * Doc updates * Fix lint * Fix link * Correct test behaviour * Update icon folders on the docs * Correcting test behaviour * Update example buttons --- .../theme-icons/alpine/alpine-icons.zip | Bin 92915 -> 66466 bytes .../public/theme-icons/alpine/search.svg | 4 +- .../theme-icons/balham/balham-icons.zip | Bin 78506 -> 59243 bytes .../public/theme-icons/balham/search.svg | 4 +- .../public/theme-icons/base/base-icons.zip | Bin 76019 -> 58967 bytes .../theme-icons/material/material-icons.zip | Bin 74821 -> 57482 bytes .../public/theme-icons/material/search.svg | 4 +- .../theme-icons/quartz/quartz-icons.zip | Bin 54270 -> 56928 bytes .../public/theme-icons/quartz/search.svg | 4 +- .../docs/grouping-group-panel/index.mdoc | 2 +- .../src/content/docs/pivoting/index.mdoc | 4 +- .../_examples/action-buttons/example.spec.ts | 4 +- .../toolbar/_examples/action-buttons/main.ts | 35 +++++++-- .../row-group-pivot-panels/example.spec.ts | 13 ++++ .../row-group-pivot-panels/index.html | 1 + .../_examples/row-group-pivot-panels/main.ts | 66 +++++++++++++++++ .../src/content/docs/toolbar/index.mdoc | 40 ++-------- packages/ag-grid-community/src/api/gridApi.ts | 3 +- .../src/interfaces/iToolbar.ts | 12 ++- .../src/validation/errorMessages/errorText.ts | 2 + .../src/pivot/pivotStage.ts | 3 +- .../src/toolbar/agToolbar.ts | 48 ++++++------ .../src/toolbar/toolbar-panel-items.test.ts | 3 +- .../behavioural/src/toolbar/toolbar.test.ts | 70 +++++++++++++++++- 24 files changed, 234 insertions(+), 88 deletions(-) create mode 100644 documentation/ag-grid-docs/src/content/docs/toolbar/_examples/row-group-pivot-panels/example.spec.ts create mode 100644 documentation/ag-grid-docs/src/content/docs/toolbar/_examples/row-group-pivot-panels/index.html create mode 100644 documentation/ag-grid-docs/src/content/docs/toolbar/_examples/row-group-pivot-panels/main.ts diff --git a/documentation/ag-grid-docs/public/theme-icons/alpine/alpine-icons.zip b/documentation/ag-grid-docs/public/theme-icons/alpine/alpine-icons.zip index 70c9a8e3eccd66cb6ca45e6b946efa77911652a6..d9b7747e09053a589ae25957cd54fe625307cbd2 100644 GIT binary patch delta 26839 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 IycvV}KOyyU_y7O^ delta 53951 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 MvjgayKp$ZKAG=u;A^-pY diff --git a/documentation/ag-grid-docs/public/theme-icons/alpine/search.svg b/documentation/ag-grid-docs/public/theme-icons/alpine/search.svg index f5d1da828b1..aab50730d6a 100644 --- a/documentation/ag-grid-docs/public/theme-icons/alpine/search.svg +++ b/documentation/ag-grid-docs/public/theme-icons/alpine/search.svg @@ -1,3 +1,3 @@ - - + + diff --git a/documentation/ag-grid-docs/public/theme-icons/balham/balham-icons.zip b/documentation/ag-grid-docs/public/theme-icons/balham/balham-icons.zip index 33a8a303c6e5cd04a9570db1c2b372a9bc1229cc..ac382218d1e630608695a2492061905e04aee027 100644 GIT binary patch delta 27094 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 - + + diff --git a/documentation/ag-grid-docs/public/theme-icons/base/base-icons.zip b/documentation/ag-grid-docs/public/theme-icons/base/base-icons.zip index b4aa3021d3a78650fddc1e2ad8a79624fa8f8643..26fcc7a0e544de2b4b7837b842fd04968b754a43 100644 GIT binary patch delta 26931 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 F`ybi4sImY6 delta 45184 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'fJ1F9OSgP+a*_cQQ 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 D5EC{) diff --git a/documentation/ag-grid-docs/public/theme-icons/material/search.svg b/documentation/ag-grid-docs/public/theme-icons/material/search.svg index f5d1da828b1..aab50730d6a 100644 --- a/documentation/ag-grid-docs/public/theme-icons/material/search.svg +++ b/documentation/ag-grid-docs/public/theme-icons/material/search.svg @@ -1,3 +1,3 @@ - - + + diff --git a/documentation/ag-grid-docs/public/theme-icons/quartz/quartz-icons.zip b/documentation/ag-grid-docs/public/theme-icons/quartz/quartz-icons.zip index 21d7ca82527d2155af785433015dfe46063c6614..97bfb4da525a8941ee6e825296b15053ba9c1fd4 100644 GIT binary patch delta 27084 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 diff --git a/documentation/ag-grid-docs/public/theme-icons/quartz/search.svg b/documentation/ag-grid-docs/public/theme-icons/quartz/search.svg index f5d1da828b1..aab50730d6a 100644 --- a/documentation/ag-grid-docs/public/theme-icons/quartz/search.svg +++ b/documentation/ag-grid-docs/public/theme-icons/quartz/search.svg @@ -1,3 +1,3 @@ - - + + diff --git a/documentation/ag-grid-docs/src/content/docs/grouping-group-panel/index.mdoc b/documentation/ag-grid-docs/src/content/docs/grouping-group-panel/index.mdoc index 6307e8d09d8..265d49b4a36 100644 --- a/documentation/ag-grid-docs/src/content/docs/grouping-group-panel/index.mdoc +++ b/documentation/ag-grid-docs/src/content/docs/grouping-group-panel/index.mdoc @@ -46,7 +46,7 @@ Refer to the [Side Bar](./side-bar/) documentation for further configuration opt ## Row Group Panel in the Toolbar -The Row Group Panel can be embedded in the [Quick Access Toolbar](./toolbar/#row-group-panel) using the `agRowGroupPanelToolbarItem` built-in item, configured independently of `rowGroupPanelShow`. +The Row Group Panel can be embedded in the [Quick Access Toolbar](./toolbar/#row-group-and-pivot-panels) using the `agRowGroupPanelToolbarItem` built-in item, configured independently of `rowGroupPanelShow`. ```{% frameworkTransform=true %} const gridOptions = { diff --git a/documentation/ag-grid-docs/src/content/docs/pivoting/index.mdoc b/documentation/ag-grid-docs/src/content/docs/pivoting/index.mdoc index e569a184426..0112ad086e0 100644 --- a/documentation/ag-grid-docs/src/content/docs/pivoting/index.mdoc +++ b/documentation/ag-grid-docs/src/content/docs/pivoting/index.mdoc @@ -87,9 +87,9 @@ const gridOptions = { }; ``` -## Pivot Panel in the Toolbar +### Pivot Panel in the Toolbar -The Pivot Panel can be embedded in the [Quick Access Toolbar](./toolbar/#pivot-panel) using the `agPivotPanelToolbarItem` built-in item, configured independently of `pivotPanelShow`. +The Pivot Panel can be embedded in the [Quick Access Toolbar](./toolbar/#row-group-and-pivot-panels) using the `agPivotPanelToolbarItem` built-in item, configured independently of `pivotPanelShow`. ```{% frameworkTransform=true %} const gridOptions = { diff --git a/documentation/ag-grid-docs/src/content/docs/toolbar/_examples/action-buttons/example.spec.ts b/documentation/ag-grid-docs/src/content/docs/toolbar/_examples/action-buttons/example.spec.ts index 6cd99a5c8ff..8439996b6d1 100644 --- a/documentation/ag-grid-docs/src/content/docs/toolbar/_examples/action-buttons/example.spec.ts +++ b/documentation/ag-grid-docs/src/content/docs/toolbar/_examples/action-buttons/example.spec.ts @@ -7,8 +7,8 @@ test.agExample(import.meta, () => { const toolbar = page.locator('.ag-toolbar'); await expect(toolbar).toBeVisible(); - await expect(toolbar.locator(':scope > .ag-toolbar-button-wrapper')).toHaveCount(6); - await expect(toolbar.locator(':scope > .ag-toolbar-separator')).toHaveCount(5); + await expect(toolbar.locator(':scope > .ag-toolbar-button-wrapper')).toHaveCount(7); + await expect(toolbar.locator(':scope > .ag-toolbar-separator')).toHaveCount(3); }); test.eachFramework('Action buttons have no visible label text', async ({ page }) => { diff --git a/documentation/ag-grid-docs/src/content/docs/toolbar/_examples/action-buttons/main.ts b/documentation/ag-grid-docs/src/content/docs/toolbar/_examples/action-buttons/main.ts index 5e1be459a41..90e6a5d6123 100644 --- a/documentation/ag-grid-docs/src/content/docs/toolbar/_examples/action-buttons/main.ts +++ b/documentation/ag-grid-docs/src/content/docs/toolbar/_examples/action-buttons/main.ts @@ -10,12 +10,13 @@ import { ValidationModule, createGrid, } from 'ag-grid-community'; -import { ContextMenuModule, ToolbarModule } from 'ag-grid-enterprise'; +import { ColumnMenuModule, ContextMenuModule, ToolbarModule } from 'ag-grid-enterprise'; ModuleRegistry.registerModules([ ClientSideRowModelModule, TextFilterModule, NumberFilterModule, + ColumnMenuModule, CsvExportModule, ColumnAutoSizeModule, ColumnApiModule, @@ -46,7 +47,6 @@ const gridOptions: GridOptions = { tooltip: 'Size Columns to Fit', action: (params) => params.api.sizeColumnsToFit(), }, - 'separator', { key: 'autoSizeAll', icon: 'minimize', @@ -64,19 +64,38 @@ const gridOptions: GridOptions = { defaultState: { sort: null }, }), }, + { + key: 'sortFirstColumnDesc', + icon: 'sortDescending', + tooltip: 'Sort First Column Descending', + action: (params) => + params.api.applyColumnState({ + state: [{ colId: 'athlete', sort: 'desc' }], + defaultState: { sort: null }, + }), + }, 'separator', { - key: 'resetFilters', - icon: 'clipboardCut', - tooltip: 'Reset All Filters', + key: 'addFilter', + icon: 'filter-add', + tooltip: 'Add Filter', + action: (params) => + params.api.setFilterModel({ + country: { filterType: 'text', type: 'contains', filter: 'Canada' }, + }), + }, + { + key: 'clearFilters', + icon: 'filterActive', + tooltip: 'Clear All Filters', action: (params) => params.api.setFilterModel(null), }, 'separator', { - key: 'resetColumns', + key: 'showColumnChooser', icon: 'columns', - tooltip: 'Reset Column State', - action: (params) => params.api.resetColumnState(), + tooltip: 'Open Column Chooser', + action: (params) => params.api.showColumnChooser(), }, ], }, diff --git a/documentation/ag-grid-docs/src/content/docs/toolbar/_examples/row-group-pivot-panels/example.spec.ts b/documentation/ag-grid-docs/src/content/docs/toolbar/_examples/row-group-pivot-panels/example.spec.ts new file mode 100644 index 00000000000..815d401fb71 --- /dev/null +++ b/documentation/ag-grid-docs/src/content/docs/toolbar/_examples/row-group-pivot-panels/example.spec.ts @@ -0,0 +1,13 @@ +import { expect, test, waitForGridContent } from '@utils/grid/test-utils'; + +test.agExample(import.meta, () => { + test.eachFramework('Row group and pivot panels render in toolbar', async ({ page }) => { + await waitForGridContent(page); + + const toolbar = page.locator('.ag-toolbar'); + await expect(toolbar).toBeVisible(); + + await expect(toolbar.locator('.ag-column-drop-horizontal')).toHaveCount(2); + await expect(toolbar.locator('.ag-toolbar-button-wrapper')).toHaveCount(1); + }); +}); diff --git a/documentation/ag-grid-docs/src/content/docs/toolbar/_examples/row-group-pivot-panels/index.html b/documentation/ag-grid-docs/src/content/docs/toolbar/_examples/row-group-pivot-panels/index.html new file mode 100644 index 00000000000..378fad58398 --- /dev/null +++ b/documentation/ag-grid-docs/src/content/docs/toolbar/_examples/row-group-pivot-panels/index.html @@ -0,0 +1 @@ +

diff --git a/documentation/ag-grid-docs/src/content/docs/toolbar/_examples/row-group-pivot-panels/main.ts b/documentation/ag-grid-docs/src/content/docs/toolbar/_examples/row-group-pivot-panels/main.ts new file mode 100644 index 00000000000..e58fdf107f4 --- /dev/null +++ b/documentation/ag-grid-docs/src/content/docs/toolbar/_examples/row-group-pivot-panels/main.ts @@ -0,0 +1,66 @@ +import type { GridApi, GridOptions } from 'ag-grid-community'; +import { + ClientSideRowModelModule, + ColumnApiModule, + ModuleRegistry, + ValidationModule, + createGrid, +} from 'ag-grid-community'; +import { PivotModule, RowGroupingModule, RowGroupingPanelModule, ToolbarModule } from 'ag-grid-enterprise'; + +ModuleRegistry.registerModules([ + ClientSideRowModelModule, + ColumnApiModule, + RowGroupingModule, + RowGroupingPanelModule, + PivotModule, + ToolbarModule, + ...(process.env.NODE_ENV !== 'production' ? [ValidationModule] : []), +]); + +let gridApi: GridApi; + +const gridOptions: GridOptions = { + columnDefs: [ + { field: 'country', enableRowGroup: true, rowGroup: true }, + { field: 'year', enableRowGroup: true, enablePivot: true, pivot: true }, + { field: 'sport', enableRowGroup: true, enablePivot: true }, + { field: 'gold', enableValue: true, aggFunc: 'sum' }, + { field: 'silver', enableValue: true, aggFunc: 'sum' }, + { field: 'total', enableValue: true, aggFunc: 'sum' }, + ], + defaultColDef: { + flex: 1, + minWidth: 120, + }, + autoGroupColumnDef: { + minWidth: 200, + }, + pivotMode: true, + toolbar: { + items: [ + 'agRowGroupPanelToolbarItem', + 'separator', + 'agPivotPanelToolbarItem', + 'separator', + { + icon: 'columns', + label: 'Reset', + alignment: 'right', + action: (params) => { + params.api.setGridOption('pivotMode', true); + params.api.resetColumnState(); + }, + }, + ], + }, +}; + +document.addEventListener('DOMContentLoaded', () => { + const gridDiv = document.querySelector('#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)); +}); diff --git a/documentation/ag-grid-docs/src/content/docs/toolbar/index.mdoc b/documentation/ag-grid-docs/src/content/docs/toolbar/index.mdoc index a907e5a2a08..a4ad48955de 100644 --- a/documentation/ag-grid-docs/src/content/docs/toolbar/index.mdoc +++ b/documentation/ag-grid-docs/src/content/docs/toolbar/index.mdoc @@ -67,43 +67,17 @@ A number of built-in toolbar items are provided for common use cases that integr | `agQuickFilterToolbarItem` | Text input that filters grid rows using the [Quick Filter](./filter-quick/). | `QuickFilterModule` | | `agFindToolbarItem` | Text input that searches within grid cells using [Find](./find/). | `FindModule` | | `agRowGroupPanelToolbarItem` | Embeds the [Row Group Panel](./grouping-group-panel/). | `RowGroupingPanelModule` | -| `agPivotPanelToolbarItem` | Embeds the [Pivot Panel](./pivoting/). | `RowGroupingPanelModule` | +| `agPivotPanelToolbarItem` | Embeds the [Pivot Panel](./pivoting/#enabling-the-pivot-panel/). | `RowGroupingPanelModule` | | [`agMenuToolbarItem`](#dropdown-menus) | Button that opens a [dropdown menu](#dropdown-menus). | `ContextMenuModule` or `ColumnMenuModule` | | `separator` | Vertical divider used to group items visually. Has no behaviour of its own. | None | -{% note %} -When the same built-in item appears more than once, set a unique `key` on each occurrence. Without a `key`, the item type is used as the key, so only the first duplicate will be rendered. -{% /note %} +### Row Group and Pivot Panels -### Row Group Panel +The Row Group Panel and Pivot Panel can both be embedded in the Quick Access Toolbar using `agRowGroupPanelToolbarItem` and `agPivotPanelToolbarItem`. Both panels are configured independently of the [Row Group Panel](./grouping-group-panel/) and the [Pivot Panel](./pivoting/#enabling-the-pivot-panel/), so you can display each panel in the Toolbar, above the grid, or both at the same time. -The Row Group Panel can be embedded in the Quick Access Toolbar using the `agRowGroupPanelToolbarItem` built-in item. +The example below shows both panels in the toolbar along with a reset action button. Use the panels to rearrange columns, then click Reset to restore the initial layout. -The Toolbar Row Group Panel is configured independently of `rowGroupPanelShow`. This means you can display the Row Group Panel in the Toolbar, above the grid, or both at the same time. In most cases, if you are using the Toolbar version, you would typically not also show the standard Row Group Panel above the grid. - -```{% frameworkTransform=true %} -const gridOptions = { - toolbar: { - items: ['agRowGroupPanelToolbarItem'], - }, - // other grid options ... -} -``` - -### Pivot Panel - -The Pivot Panel can be embedded in the Quick Access Toolbar using the `agPivotPanelToolbarItem` built-in item. - -The Toolbar Pivot Panel is configured independently of `pivotPanelShow`. This means you can display the Pivot Panel in the Toolbar, above the grid, or both at the same time. In most cases, if you are using the Toolbar version, you would typically not also show the standard Pivot Panel above the grid. - -```{% frameworkTransform=true %} -const gridOptions = { - toolbar: { - items: ['agPivotPanelToolbarItem'], - }, - // other grid options ... -} -``` +{% gridExampleRunner title="Row Group and Pivot Panels" name="row-group-pivot-panels" exampleHeight=350 /%} ### Dropdown Menus @@ -162,7 +136,7 @@ The example below shows icon-only buttons with tooltips for sizing columns, sort For controls beyond a button, such as toggles, inputs, or any stateful UI, set `toolbarItem` to a custom component. Custom components can render arbitrary HTML and call any grid API, so they suit cases that the [Action Button](#action-buttons) shorthand cannot express. -The example below defines two custom items: checkbox toggles that apply column filters on the left, and a radio group that opens [Side Bar](./tool-panel/) tool panels on the right. The radio group exposes a `setSelected` method, called from the grid's `onToolPanelVisibleChanged` callback via [`getToolbarItemInstance`](#reference-getToolbarItemInstance) to keep its state in sync when a panel is opened or closed elsewhere, for example by clicking a side bar tab. +The example below defines two custom items: checkbox toggles that apply column filters on the left, and a radio group that opens [Side Bar](./tool-panel/) tool panels on the right. The radio group's `setSelected` method is called via [`getToolbarItemInstance`](#reference-getToolbarItemInstance) in `onToolPanelVisibleChanged` to stay in sync when a panel is opened or closed elsewhere, such as via a sidebar tab. {% gridExampleRunner title="Custom Toolbar Item" name="toolbar-custom" /%} @@ -210,7 +184,7 @@ The toolbar exposes the following [Theme Parameters](./theming-parameters/): ## Accessing Toolbar Items -To access a toolbar item instance use the grid api method `getToolbarItemInstance(key)`. This is demonstrated in the [Custom Components](#custom-components) example above, where it's used to keep a toolbar radio in sync with side bar tool panel changes. +To access a toolbar item instance use the grid api method `getToolbarItemInstance(key)`. The `key` must match a `key` set on the item definition; items without an explicit key are not reachable via the API. This is demonstrated in the [Custom Components](#custom-components) example above, where it's used to keep a toolbar radio in sync with side bar tool panel changes. {% apiDocumentation source="grid-api/api.json" section="accessories" names=["getToolbarItemInstance"] /%} diff --git a/packages/ag-grid-community/src/api/gridApi.ts b/packages/ag-grid-community/src/api/gridApi.ts index f92d2f705b6..12607046076 100644 --- a/packages/ag-grid-community/src/api/gridApi.ts +++ b/packages/ag-grid-community/src/api/gridApi.ts @@ -1436,8 +1436,7 @@ export interface _SideBarGridApi { /** @internal AG_GRID_INTERNAL - Not for public use. Can change / be removed at any time. */ export interface _ToolbarGridApi { /** - * Gets the toolbar item instance for the given `key`. The key is either explicitly set in the item - * definition or derived from the item type when not specified. + * Gets the toolbar item instance for the given `key`. Only toolbar items configured with a `key` can be accessed. * @agModule `ToolbarModule` */ getToolbarItemInstance>(key: string): T | undefined; diff --git a/packages/ag-grid-community/src/interfaces/iToolbar.ts b/packages/ag-grid-community/src/interfaces/iToolbar.ts index 0e3dcdcd398..43aac8f64a3 100644 --- a/packages/ag-grid-community/src/interfaces/iToolbar.ts +++ b/packages/ag-grid-community/src/interfaces/iToolbar.ts @@ -39,7 +39,11 @@ export interface ToolbarItemActionParams extends Ag /** Properties common to every toolbar item definition variant. */ interface ToolbarItemDefBase { - /** Unique identifier for the item. Auto-generated if omitted. */ + /** + * Unique identifier used to look up this item via `api.getToolbarItemInstance(key)`. + * Optional — items without a key still render. Set a key only on items you want to + * access via the API. + */ key?: string; /** Alignment within the toolbar. Falls back to the toolbar-level `alignment`. */ alignment?: 'left' | 'right'; @@ -143,7 +147,11 @@ export type ToolbarItemDef extends AgGridCommon { - /** Unique identifier for the item. Auto-generated by the grid if the user did not set one. */ + /** + * Identifier for the item. Mirrors the `key` set on the item definition, or an + * auto-generated key when none was provided. Used internally; only items with an + * explicit key on the definition are reachable via `api.getToolbarItemInstance(key)`. + */ key: string; /** Explicit alignment, when set on the item definition. */ alignment?: 'left' | 'right'; diff --git a/packages/ag-grid-community/src/validation/errorMessages/errorText.ts b/packages/ag-grid-community/src/validation/errorMessages/errorText.ts index d6b14abefa2..19d566245d9 100644 --- a/packages/ag-grid-community/src/validation/errorMessages/errorText.ts +++ b/packages/ag-grid-community/src/validation/errorMessages/errorText.ts @@ -797,6 +797,8 @@ export const AG_GRID_ERRORS = { rowModelType, additionalText: 'The item will not be rendered.', }), + 303: ({ key }: { key: string }) => + `Multiple toolbar items share the explicit key '${key}'. Only the first item is rendered.` as const, }; export type ErrorMap = typeof AG_GRID_ERRORS; diff --git a/packages/ag-grid-enterprise/src/pivot/pivotStage.ts b/packages/ag-grid-enterprise/src/pivot/pivotStage.ts index 81848c593ef..9898f6a1827 100644 --- a/packages/ag-grid-enterprise/src/pivot/pivotStage.ts +++ b/packages/ag-grid-enterprise/src/pivot/pivotStage.ts @@ -145,8 +145,7 @@ export class PivotStage extends BeanStub implements NamedBean, _IRowNodePivotSta const aggregationColumnIds = aggregationColumns.map((column) => column.getId()); const lastIds = this.aggregationColumnIdsLastTime; const aggregationColumnsReordered = - lastIds != null && - lastIds.length === aggregationColumnIds.length && + lastIds?.length === aggregationColumnIds.length && !_areEqual(lastIds, aggregationColumnIds) && lastIds.every((id) => aggregationColumnIds.includes(id)); this.aggregationColumnIdsLastTime = aggregationColumnIds; diff --git a/packages/ag-grid-enterprise/src/toolbar/agToolbar.ts b/packages/ag-grid-enterprise/src/toolbar/agToolbar.ts index 7e3ab48dd9b..a2ba88a2d36 100644 --- a/packages/ag-grid-enterprise/src/toolbar/agToolbar.ts +++ b/packages/ag-grid-enterprise/src/toolbar/agToolbar.ts @@ -26,6 +26,7 @@ import { _findFocusableElements, _getActiveDomElement, _removeFromParent, + _warn, } from 'ag-grid-community'; import agToolbarCSS from './agToolbar.css'; @@ -68,9 +69,16 @@ function normaliseItem(item: ToolbarItemDef | string, nextKey: () => string): No ({ label, tooltip, icon } = item as ToolbarMenuBuiltInItemDef); } - const key = item.key ?? (typeof toolbarItem === 'string' ? toolbarItem : nextKey()); - - return { toolbarItem, toolbarItemParams, alignment: item.alignment, key, label, tooltip, icon, action }; + return { + toolbarItem, + toolbarItemParams, + alignment: item.alignment, + key: item.key ?? nextKey(), + label, + tooltip, + icon, + action, + }; } const ToolbarItemComponent: ComponentType = { @@ -86,7 +94,7 @@ const AgToolbarElement: ElementParams = { class AgToolbar extends Component implements FocusableContainer, IToolbarComp { private readonly toolbarItems: Map = new Map(); - private customKeyCounter: number = 0; + private nextKey: number = 0; // Incremented on each rebuild so stale async resolves from a previous generation can be discarded private generation: number = 0; @@ -189,22 +197,10 @@ class AgToolbar extends Component implements FocusableContainer, IToolbarComp { if (!toolbar?.items) { return undefined; } - // Reset counter so keyless custom items get stable positional keys across updates - this.customKeyCounter = 0; - const nextKey = () => `custom-toolbar-item-${this.customKeyCounter++}`; - const seen = new Set(); - return toolbar.items.reduce((acc, item) => { - const normalised = normaliseItem(item, nextKey); - if (normalised.toolbarItem === 'separator') { - acc.push(normalised); - return acc; - } - if (!seen.has(normalised.key)) { - seen.add(normalised.key); - acc.push(normalised); - } - return acc; - }, []); + // Reset counter so keyless items get stable positional keys across updates + this.nextKey = 0; + const nextKey = () => `toolbar-item-${this.nextKey++}`; + return toolbar.items.map((item) => normaliseItem(item, nextKey)); } private createItemParams(itemConfig: NormalisedToolbarItem, key: string): IToolbarItemParams { @@ -226,12 +222,12 @@ class AgToolbar extends Component implements FocusableContainer, IToolbarComp { const rightItems: NormalisedToolbarItem[] = []; // Alignment is semantic, not physical — flex mirrors layout in RTL automatically, so // the default is always 'left' regardless of direction. - const defaultAlignment: 'left' | 'right' = toolbar?.alignment ?? 'left'; + const defaultAlignment = toolbar?.alignment ?? 'left'; // Separators inherit the alignment of the preceding item, unless explicitly set - let lastAlignment: 'left' | 'right' = defaultAlignment; + let lastAlignment = defaultAlignment; for (const item of items) { const isSeparator = item.toolbarItem === 'separator'; - const alignment: 'left' | 'right' = item.alignment ?? (isSeparator ? lastAlignment : defaultAlignment); + const alignment = item.alignment ?? (isSeparator ? lastAlignment : defaultAlignment); (alignment === 'right' ? rightItems : leftItems).push(item); if (!isSeparator) { lastAlignment = alignment; @@ -343,9 +339,13 @@ class AgToolbar extends Component implements FocusableContainer, IToolbarComp { // Placeholder was discarded by a rebuild or destroy — clean up the orphan component. // Don't rely on isConnected: on initial render the grid is not yet in the document. - if (!this.isAlive() || placeholder.parentNode !== this.getGui()) { + const isDuplicate = this.toolbarItems.has(key); + if (isDuplicate || !this.isAlive() || placeholder.parentNode !== this.getGui()) { _removeFromParent(placeholder); this.destroyBean(component); + if (isDuplicate) { + _warn(303, { key }); + } return; } diff --git a/testing/behavioural/src/toolbar/toolbar-panel-items.test.ts b/testing/behavioural/src/toolbar/toolbar-panel-items.test.ts index ee8003082fc..0ba338cdc12 100644 --- a/testing/behavioural/src/toolbar/toolbar-panel-items.test.ts +++ b/testing/behavioural/src/toolbar/toolbar-panel-items.test.ts @@ -1,4 +1,4 @@ -import { ClientSideRowModelModule, QuickFilterModule } from 'ag-grid-community'; +import { ClientSideRowModelModule, CustomFilterModule, QuickFilterModule } from 'ag-grid-community'; import { ContextMenuModule, FindModule, @@ -21,6 +21,7 @@ describe('Toolbar panel items (rowGroupPanel and pivotPanel)', () => { RowGroupingModule, RowGroupingPanelModule, ToolbarModule, + CustomFilterModule, ], }); diff --git a/testing/behavioural/src/toolbar/toolbar.test.ts b/testing/behavioural/src/toolbar/toolbar.test.ts index 73f5eb5c6ca..6678ebae509 100644 --- a/testing/behavioural/src/toolbar/toolbar.test.ts +++ b/testing/behavioural/src/toolbar/toolbar.test.ts @@ -118,7 +118,7 @@ describe('Toolbar', () => { expect(instance).toBeDefined(); }); - test('returns the built-in item instance by derived key when string form is used', async () => { + test('returns built in item when string form is used (no explicit key)', async () => { const api = gridMgr.createGrid('get-instance-builtin-string-form', { columnDefs: [{ field: 'name' }], rowData: [{ name: 'Alice' }], @@ -130,7 +130,7 @@ describe('Toolbar', () => { expect(api.getToolbarItemInstance('agQuickFilterToolbarItem')).toBeDefined(); }); - test('returns the built-in item instance by derived key when no explicit key is given', async () => { + test('returns undefined when no explicit key is given on object form', async () => { const api = gridMgr.createGrid('get-instance-builtin-derived-key', { columnDefs: [{ field: 'name' }], rowData: [{ name: 'Alice' }], @@ -141,7 +141,7 @@ describe('Toolbar', () => { await waitForEvent('firstDataRendered', api); - expect(api.getToolbarItemInstance('agQuickFilterToolbarItem')).toBeDefined(); + expect(api.getToolbarItemInstance('agQuickFilterToolbarItem')).toBeUndefined(); }); test('returns undefined after toolbar items are cleared at runtime', async () => { @@ -163,6 +163,70 @@ describe('Toolbar', () => { }); }); + describe('duplicate items', () => { + test('does not render duplicate built-in items in string form', async () => { + const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => {}); + const api = gridMgr.createGrid('duplicate-string-form', { + columnDefs: [{ field: 'name' }], + rowData: [{ name: 'Alice' }], + toolbar: { items: ['agQuickFilterToolbarItem', 'agQuickFilterToolbarItem'] }, + }); + + await waitForEvent('firstDataRendered', api); + + const gridDiv = TestGridsManager.getHTMLElement(api)!; + const toolbar = gridDiv.querySelector('.ag-toolbar')!; + expect(toolbar.querySelectorAll('.ag-toolbar-input-field').length).toBe(1); + + const warnings = warnSpy.mock.calls.flat().join(' '); + expect(warnings).toContain('303'); + + warnSpy.mockRestore(); + }); + + test('renders duplicate built-in items when passed as objects without explicit keys', async () => { + const api = gridMgr.createGrid('duplicate-keyless-object-form', { + columnDefs: [{ field: 'name' }], + rowData: [{ name: 'Alice' }], + toolbar: { + items: [{ toolbarItem: 'agQuickFilterToolbarItem' }, { toolbarItem: 'agQuickFilterToolbarItem' }], + }, + }); + + await waitForEvent('firstDataRendered', api); + + const gridDiv = TestGridsManager.getHTMLElement(api)!; + const toolbar = gridDiv.querySelector('.ag-toolbar')!; + expect(toolbar.querySelectorAll('.ag-toolbar-input-field').length).toBe(2); + }); + + test('does not render both items when explicit keys collide and warns', async () => { + const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => {}); + + const api = gridMgr.createGrid('duplicate-explicit-key-collision', { + columnDefs: [{ field: 'name' }], + rowData: [{ name: 'Alice' }], + toolbar: { + items: [ + { toolbarItem: 'agQuickFilterToolbarItem', key: 'shared' }, + { toolbarItem: 'agQuickFilterToolbarItem', key: 'shared' }, + ], + }, + }); + + await waitForEvent('firstDataRendered', api); + + const gridDiv = TestGridsManager.getHTMLElement(api)!; + const toolbar = gridDiv.querySelector('.ag-toolbar')!; + expect(toolbar.querySelectorAll('.ag-toolbar-input-field').length).toBe(1); + + const warnings = warnSpy.mock.calls.flat().join(' '); + expect(warnings).toContain('303'); + + warnSpy.mockRestore(); + }); + }); + describe('runtime updates via setGridOption', () => { test('adds items when toolbar items are populated at runtime', async () => { // Start with an empty items array so the AG-TOOLBAR element is registered up-front From 47e769e09bc8658cdc07c2ea11931a6e981f063e Mon Sep 17 00:00:00 2001 From: Saba Ahang Date: Fri, 8 May 2026 12:01:09 +0100 Subject: [PATCH 04/12] AG-17289 Add release content for 35.3.0 (#13698) --- .../public/changelog/changelog.json | 14 +++++++ .../public/changelog/releaseVersionNotes.json | 4 ++ .../public/changelog/releases/35_3_0.md | 5 +++ .../docs/upgrading-to-ag-grid-35-3/index.mdoc | 37 +++++++++++++++++++ .../content/versions/ag-grid-versions.json | 27 ++++++++++++++ 5 files changed, 87 insertions(+) create mode 100644 documentation/ag-grid-docs/public/changelog/releases/35_3_0.md create mode 100644 documentation/ag-grid-docs/src/content/docs/upgrading-to-ag-grid-35-3/index.mdoc diff --git a/documentation/ag-grid-docs/public/changelog/changelog.json b/documentation/ag-grid-docs/public/changelog/changelog.json index 0d89bb0e454..8b20d07c59d 100644 --- a/documentation/ag-grid-docs/public/changelog/changelog.json +++ b/documentation/ag-grid-docs/public/changelog/changelog.json @@ -1,4 +1,18 @@ [ + { + "key": "AG-17289", + "issueType": "Task", + "manualEntry": true, + "summary": "Placeholder for 35.3.0", + "versions": ["35.3.0"], + "status": "Done", + "resolution": "Done", + "features": null, + "moreInformation": null, + "deprecationNotes": null, + "breakingChangesNotes": null, + "documentationUrl": null + }, { "key": "AG-17021", "issueType": "Bug", diff --git a/documentation/ag-grid-docs/public/changelog/releaseVersionNotes.json b/documentation/ag-grid-docs/public/changelog/releaseVersionNotes.json index e76d2dd5963..602a4090887 100644 --- a/documentation/ag-grid-docs/public/changelog/releaseVersionNotes.json +++ b/documentation/ag-grid-docs/public/changelog/releaseVersionNotes.json @@ -1,4 +1,8 @@ [ + { + "release version": "35.3.0", + "markdown": "/releases/35_3_0.md" + }, { "release version": "35.2.1", "markdown": "/releases/35_2_1.md" diff --git a/documentation/ag-grid-docs/public/changelog/releases/35_3_0.md b/documentation/ag-grid-docs/public/changelog/releases/35_3_0.md new file mode 100644 index 00000000000..df546d8359a --- /dev/null +++ b/documentation/ag-grid-docs/public/changelog/releases/35_3_0.md @@ -0,0 +1,5 @@ +#### 13th May 2026 - Grid v35.3.0 (Charts v13.3.0) + +See table below for changes included in this release. + +For more details see [v35.3 release post](https://blog.ag-grid.com/whats-new-in-ag-grid-35-3/). diff --git a/documentation/ag-grid-docs/src/content/docs/upgrading-to-ag-grid-35-3/index.mdoc b/documentation/ag-grid-docs/src/content/docs/upgrading-to-ag-grid-35-3/index.mdoc new file mode 100644 index 00000000000..5b10069acbc --- /dev/null +++ b/documentation/ag-grid-docs/src/content/docs/upgrading-to-ag-grid-35-3/index.mdoc @@ -0,0 +1,37 @@ +--- +title: "Upgrading to AG Grid 35.3" +description: "See what's new in AG Grid, view a full list of changes and migrate your $framework Data Grid to version v35.3." +migrationVersion: "35.3.0" +--- + +Quick Access Toolbar, Cell Notes, Grand Total Row for server-side row model, Performance Improvements, Quality Improvements + +## What's New + +AG Grid {% migrationVersion() %} adds important new features - [Quick Access Toolbar](./toolbar/), [Cell Notes](./notes/), [Grand Total Row for server-side row model](./server-side-model-grouping/#grand-total-row), Performance Improvements, Quality Improvements. +These improvements involve no breaking changes as listed below. + + + +{% documentationArchiveSection version=migrationVersionPatch() /%} + +## Breaking Changes + +There are no breaking changes in AG Grid version {% migrationVersion() %}. + +## Behaviour Changes + +There are no behaviour changes in AG Grid version {% migrationVersion() %}. + +## Removal of Deprecated APIs + +There are no deprecated API removals in AG Grid version {% migrationVersion() %}. + +## Deprecations + +There are no deprecations in AG Grid version {% migrationVersion() %}. + +{% changelogSection version=$migrationVersion /%} diff --git a/documentation/ag-grid-docs/src/content/versions/ag-grid-versions.json b/documentation/ag-grid-docs/src/content/versions/ag-grid-versions.json index 8e459bff7b6..20efb301f78 100644 --- a/documentation/ag-grid-docs/src/content/versions/ag-grid-versions.json +++ b/documentation/ag-grid-docs/src/content/versions/ag-grid-versions.json @@ -1,4 +1,31 @@ [ + { + "version": "35.3.0", + "date": "13th May 2026", + "landingPageHighlight": "Quick Access Toolbar, Cell Notes, Grand Total Row for server-side row model, Performance Improvements, Quality Improvements", + "highlights": [ + { + "text": "Quick Access Toolbar", + "path": "./toolbar/" + }, + { + "text": "Cell Notes", + "path": "./notes/" + }, + { + "text": "Grand Total Row for server-side row model", + "path": "./server-side-model-grouping/#grand-total-row" + }, + { + "text": "Performance Improvements" + }, + { + "text": "Quality Improvements" + } + ], + "notesPath": "./upgrading-to-ag-grid-35-3", + "hideBlogPostLink": false + }, { "version": "35.2.1", "date": "7th April 2026" From b20a50c54cef46f6d18e2362822f26967dc2b696 Mon Sep 17 00:00:00 2001 From: Salvatore Previti Date: Fri, 8 May 2026 12:17:50 +0100 Subject: [PATCH 05/12] AG-17197-disable-animation-on-rows-clear-fill (#13700) --- .../src/rendering/rowRenderer.ts | 6 +- .../bulk-add-cell-flicker-react.test.tsx | 85 +++++++++++++++++++ 2 files changed, 89 insertions(+), 2 deletions(-) diff --git a/packages/ag-grid-community/src/rendering/rowRenderer.ts b/packages/ag-grid-community/src/rendering/rowRenderer.ts index c6d7520315a..b3135563c03 100644 --- a/packages/ag-grid-community/src/rendering/rowRenderer.ts +++ b/packages/ag-grid-community/src/rendering/rowRenderer.ts @@ -649,7 +649,9 @@ export class RowRenderer extends BeanStub implements NamedBean { // however we can reuse the rows, so we keep them but index by rowNode.id const rowsToRecycle = recycleRows ? this.getRowsToRecycle() : null; if (!recycleRows) { - this.removeAllRowComps(); + // Forward !animate so the destroy path skips the fade-out when the + // redraw itself is non-animating; otherwise rapid replaces flicker via opacity:0. + this.removeAllRowComps(!animate); } this.workOutFirstAndLastRowsToRender(); @@ -1007,7 +1009,7 @@ export class RowRenderer extends BeanStub implements NamedBean { super.destroy(); } - private removeAllRowComps(suppressAnimation: boolean = false): void { + private removeAllRowComps(suppressAnimation: boolean): void { const rowIndexesToRemove = Object.keys(this.rowCtrlsByRowIndex); this.removeRowCtrls(rowIndexesToRemove, suppressAnimation); diff --git a/testing/behavioural/src/row-data/bulk-add-cell-flicker-react.test.tsx b/testing/behavioural/src/row-data/bulk-add-cell-flicker-react.test.tsx index 2c1897104de..786ffb29477 100644 --- a/testing/behavioural/src/row-data/bulk-add-cell-flicker-react.test.tsx +++ b/testing/behavioural/src/row-data/bulk-add-cell-flicker-react.test.tsx @@ -92,6 +92,7 @@ describe('Eager row content seed (bulk-add flicker regression)', () => { { gridApi = p.api; }} @@ -137,6 +138,7 @@ describe('Eager row content seed (bulk-add flicker regression)', () => { { gridApi = p.api; }} @@ -162,6 +164,88 @@ describe('Eager row content seed (bulk-add flicker regression)', () => { expectNoFlicker(records); }); + // Mirrors the staging demo (`updating-row-data-without-row-ids`): React-state-driven + // rowData with no getRowId. Each rerender replaces the rowData prop, every viewport + // RowCtrl is destroyed and a fresh one created. + type RowDatum = { a: string; b: string; c: string }; + let driveRowData: React.Dispatch> | undefined; + const initialData = (): RowDatum[] => Array.from({ length: 8 }, (_, i) => ({ a: `a${i}`, b: `b${i}`, c: `c${i}` })); + const cycleData = (cycle: number): RowDatum[] => + Array.from({ length: 8 }, (_, i) => ({ a: `c${cycle}-${i}`, b: `c${cycle}-${i}`, c: `c${cycle}-${i}` })); + + function StreamingWrapper({ renderingMode }: { renderingMode: 'default' | 'legacy' }) { + const [data, setData] = React.useState(initialData); + driveRowData = setData; + return ( +
+ +
+ ); + } + + async function streamRowDataCycles(cycles = 3): Promise { + for (let cycle = 0; cycle < cycles; cycle++) { + act(() => driveRowData!(cycleData(cycle))); + await asyncSetTimeout(20); // flush React commits + rAF before next cycle + } + } + + test.each(['default', 'legacy'] as const)( + 'setRowData via React prop without getRowId (%s): rows mount with cells', + async (renderingMode) => { + const rendered = render(); + await waitFor(() => expect(rendered.container.querySelectorAll(ROW_SELECTOR).length).toBeGreaterThan(0)); + + const records = await recordContentAppendedIntoExistingRows(rendered.container, streamRowDataCycles); + + expectNoFlicker(records); + } + ); + + // Detects the fade-out flicker directly: assert no row gains `ag-opacity-zero` + // during a non-animating wholesale-replace. + test.each(['default', 'legacy'] as const)( + 'setRowData wholesale-replace without getRowId (%s): no fade-out class toggling', + async (renderingMode) => { + const rendered = render(); + await waitFor(() => expect(rendered.container.querySelectorAll(ROW_SELECTOR).length).toBeGreaterThan(0)); + + const opacityToggles: { rowId: string | null; value: string }[] = []; + const observer = new MutationObserver((mutations) => { + for (const m of mutations) { + if (m.type !== 'attributes' || m.attributeName !== 'class') { + continue; + } + const target = m.target; + if (!(target instanceof HTMLElement) || !target.hasAttribute('row-id')) { + continue; + } + const cls = target.getAttribute('class') ?? ''; + if (cls.includes('ag-opacity-zero')) { + opacityToggles.push({ rowId: target.getAttribute('row-id'), value: cls }); + } + } + }); + observer.observe(rendered.container, { subtree: true, attributes: true, attributeFilter: ['class'] }); + + await streamRowDataCycles(); + observer.disconnect(); + + if (opacityToggles.length > 0) { + throw new Error( + `Expected no rows to receive ag-opacity-zero during wholesale-replace without getRowId, ` + + `but ${opacityToggles.length} row class change(s) included it. ` + + `First: ${JSON.stringify(opacityToggles.slice(0, 3))}` + ); + } + } + ); + test('column visibility toggle after bulk add still produces correct cells', async () => { // Guards against a regression where the constructor pre-creation prevents the // setComp-driven reconciliation from picking up subsequent column changes. @@ -174,6 +258,7 @@ describe('Eager row content seed (bulk-add flicker regression)', () => { { gridApi = p.api; }} From 5a46473d4aee23c60f6c2edacd0ec7252d39a211 Mon Sep 17 00:00:00 2001 From: Tak Tran Date: Fri, 8 May 2026 13:04:18 +0100 Subject: [PATCH 06/12] AG-3390 - Ignore #client-side link check for now to resolve CI issues (#13703) --- external/ag-website-shared/plugins/agLinkChecker.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/external/ag-website-shared/plugins/agLinkChecker.ts b/external/ag-website-shared/plugins/agLinkChecker.ts index ae30f0b88f3..ae720865c10 100644 --- a/external/ag-website-shared/plugins/agLinkChecker.ts +++ b/external/ag-website-shared/plugins/agLinkChecker.ts @@ -18,6 +18,7 @@ const HREF_PATTERNS_TO_IGNORE = [ '#reference-', // API references, as it is rendered client side '#example-', // Example references, as they aren't headings '#contact-section', // Contact form on about page + '#client-side', // TODO: Remove this once CI failure is resolved ]; const isCI = From 4eb1e876b620ed5aa366ff61289ecbac0935ef87 Mon Sep 17 00:00:00 2001 From: Stephen Cooper Date: Fri, 8 May 2026 13:23:42 +0100 Subject: [PATCH 07/12] Pin filter type (#13705) --- .../src/content/docs/toolbar/_examples/action-buttons/main.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/ag-grid-docs/src/content/docs/toolbar/_examples/action-buttons/main.ts b/documentation/ag-grid-docs/src/content/docs/toolbar/_examples/action-buttons/main.ts index 90e6a5d6123..9375db14e68 100644 --- a/documentation/ag-grid-docs/src/content/docs/toolbar/_examples/action-buttons/main.ts +++ b/documentation/ag-grid-docs/src/content/docs/toolbar/_examples/action-buttons/main.ts @@ -30,7 +30,7 @@ let gridApi: GridApi; const gridOptions: GridOptions = { columnDefs: [ { field: 'athlete' }, - { field: 'country' }, + { field: 'country', filter: 'agTextColumnFilter' }, { field: 'gold' }, { field: 'silver' }, { field: 'bronze' }, From d3a10ee5e8972b88b26b16c3cab6846835afa6be Mon Sep 17 00:00:00 2001 From: JamesSwinton <40694714+JamesSwinton@users.noreply.github.com> Date: Fri, 8 May 2026 14:29:40 +0200 Subject: [PATCH 08/12] AG-17117 - Add translations (#13699) * Add translations * update dutch --------- Co-authored-by: Stephen Cooper --- community-modules/locale/src/ar-EG.ts | 5 +++++ community-modules/locale/src/bg-BG.ts | 5 +++++ community-modules/locale/src/cs-CZ.ts | 5 +++++ community-modules/locale/src/da-DK.ts | 5 +++++ community-modules/locale/src/de-DE.ts | 5 +++++ community-modules/locale/src/el-GR.ts | 5 +++++ community-modules/locale/src/es-ES.ts | 5 +++++ community-modules/locale/src/fa-IR.ts | 5 +++++ community-modules/locale/src/fi-FI.ts | 5 +++++ community-modules/locale/src/fr-FR.ts | 5 +++++ community-modules/locale/src/he-IL.ts | 5 +++++ community-modules/locale/src/hr-HR.ts | 5 +++++ community-modules/locale/src/hu-HU.ts | 5 +++++ community-modules/locale/src/it-IT.ts | 5 +++++ community-modules/locale/src/ja-JP.ts | 5 +++++ community-modules/locale/src/ko-KR.ts | 5 +++++ community-modules/locale/src/nb-NO.ts | 5 +++++ community-modules/locale/src/nl-NL.ts | 5 +++++ community-modules/locale/src/pl-PL.ts | 5 +++++ community-modules/locale/src/pt-BR.ts | 5 +++++ community-modules/locale/src/pt-PT.ts | 5 +++++ community-modules/locale/src/ro-RO.ts | 5 +++++ community-modules/locale/src/sk-SK.ts | 5 +++++ community-modules/locale/src/sv-SE.ts | 5 +++++ community-modules/locale/src/tr-TR.ts | 5 +++++ community-modules/locale/src/uk-UA.ts | 5 +++++ community-modules/locale/src/ur-PK.ts | 5 +++++ community-modules/locale/src/vi-VN.ts | 5 +++++ community-modules/locale/src/zh-CN.ts | 5 +++++ community-modules/locale/src/zh-HK.ts | 5 +++++ community-modules/locale/src/zh-TW.ts | 5 +++++ 31 files changed, 155 insertions(+) diff --git a/community-modules/locale/src/ar-EG.ts b/community-modules/locale/src/ar-EG.ts index b282aa30d76..ea4fa75eb46 100644 --- a/community-modules/locale/src/ar-EG.ts +++ b/community-modules/locale/src/ar-EG.ts @@ -334,6 +334,11 @@ export const AG_GRID_LOCALE_EG = { sortAbsoluteDescending: 'ترتيب تنازلي مطلق', sortUnSort: 'إلغاء الترتيب', shiftF2: 'Shift+F2', + toolbarFind: 'بحث', + toolbarFindPreviousMatch: 'التطابق السابق', + toolbarFindNextMatch: 'التطابق التالي', + toolbarQuickFilter: 'تصفية', + toolbarMenu: 'قائمة', // Enterprise Menu Aggregation and Status Bar sum: 'المجموع', diff --git a/community-modules/locale/src/bg-BG.ts b/community-modules/locale/src/bg-BG.ts index 3d9b8e9638d..d7ec457af48 100644 --- a/community-modules/locale/src/bg-BG.ts +++ b/community-modules/locale/src/bg-BG.ts @@ -337,6 +337,11 @@ export const AG_GRID_LOCALE_BG = { sortAbsoluteDescending: 'Абсолютно сортиране низходящо', sortUnSort: 'Изчистване на сортирането', shiftF2: 'Shift+F2', + toolbarFind: 'Намиране', + toolbarFindPreviousMatch: 'Предишно съвпадение', + toolbarFindNextMatch: 'Следващо съвпадение', + toolbarQuickFilter: 'Филтър', + toolbarMenu: 'Меню', // Enterprise Menu Aggregation and Status Bar sum: 'Сума', diff --git a/community-modules/locale/src/cs-CZ.ts b/community-modules/locale/src/cs-CZ.ts index 466f81ef53c..af65b0d1b81 100644 --- a/community-modules/locale/src/cs-CZ.ts +++ b/community-modules/locale/src/cs-CZ.ts @@ -335,6 +335,11 @@ export const AG_GRID_LOCALE_CZ = { sortAbsoluteDescending: 'Řadit absolutně sestupně', sortUnSort: 'Zrušit třídění', shiftF2: 'Shift+F2', + toolbarFind: 'Najít', + toolbarFindPreviousMatch: 'Předchozí shoda', + toolbarFindNextMatch: 'Další shoda', + toolbarQuickFilter: 'Filtr', + toolbarMenu: 'Menu', // Enterprise Menu Aggregation and Status Bar sum: 'Součet', diff --git a/community-modules/locale/src/da-DK.ts b/community-modules/locale/src/da-DK.ts index 3310c360e73..500c41407aa 100644 --- a/community-modules/locale/src/da-DK.ts +++ b/community-modules/locale/src/da-DK.ts @@ -337,6 +337,11 @@ export const AG_GRID_LOCALE_DK = { sortAbsoluteDescending: 'Sorter Absolut Faldende', sortUnSort: 'Ryd Sortering', shiftF2: 'Shift+F2', + toolbarFind: 'Find', + toolbarFindPreviousMatch: 'Forrige fund', + toolbarFindNextMatch: 'Næste fund', + toolbarQuickFilter: 'Filter', + toolbarMenu: 'Menu', // Enterprise Menu Aggregation and Status Bar sum: 'Sum', diff --git a/community-modules/locale/src/de-DE.ts b/community-modules/locale/src/de-DE.ts index bba4c48e7c8..8ba34e0d48d 100644 --- a/community-modules/locale/src/de-DE.ts +++ b/community-modules/locale/src/de-DE.ts @@ -339,6 +339,11 @@ export const AG_GRID_LOCALE_DE = { sortAbsoluteDescending: 'Absolut absteigend sortieren', sortUnSort: 'Sortierung aufheben', shiftF2: 'Shift+F2', + toolbarFind: 'Finden', + toolbarFindPreviousMatch: 'Vorherige Übereinstimmung', + toolbarFindNextMatch: 'Nächste Übereinstimmung', + toolbarQuickFilter: 'Filter', + toolbarMenu: 'Menü', // Enterprise Menu Aggregation and Status Bar sum: 'Summe', diff --git a/community-modules/locale/src/el-GR.ts b/community-modules/locale/src/el-GR.ts index 9bea45657d9..13191db5d3e 100644 --- a/community-modules/locale/src/el-GR.ts +++ b/community-modules/locale/src/el-GR.ts @@ -340,6 +340,11 @@ export const AG_GRID_LOCALE_GR = { sortAbsoluteDescending: '"Απόλυτη φθίνουσα ταξινόμηση"', sortUnSort: 'Καθαρισμός Ταξινόμησης', shiftF2: 'Shift+F2', + toolbarFind: 'Εύρεση', + toolbarFindPreviousMatch: 'Προηγούμενη Αντιστοιχία', + toolbarFindNextMatch: 'Επόμενη Αντιστοιχία', + toolbarQuickFilter: 'Φίλτρο', + toolbarMenu: 'Μενού', // Enterprise Menu Aggregation and Status Bar sum: 'Άθροισμα', diff --git a/community-modules/locale/src/es-ES.ts b/community-modules/locale/src/es-ES.ts index fe917a9e668..f4f63f2cbce 100644 --- a/community-modules/locale/src/es-ES.ts +++ b/community-modules/locale/src/es-ES.ts @@ -338,6 +338,11 @@ export const AG_GRID_LOCALE_ES = { sortAbsoluteDescending: 'Ordenar absolutamente descendente', sortUnSort: 'Limpiar Orden', shiftF2: 'Shift+F2', + toolbarFind: 'Buscar', + toolbarFindPreviousMatch: 'Coincidencia Anterior', + toolbarFindNextMatch: 'Siguiente Coincidencia', + toolbarQuickFilter: 'Filtrar', + toolbarMenu: 'Menú', // Enterprise Menu Aggregation and Status Bar sum: 'Suma', diff --git a/community-modules/locale/src/fa-IR.ts b/community-modules/locale/src/fa-IR.ts index c7f0135d1ca..1c3c99680c0 100644 --- a/community-modules/locale/src/fa-IR.ts +++ b/community-modules/locale/src/fa-IR.ts @@ -335,6 +335,11 @@ export const AG_GRID_LOCALE_IR = { sortAbsoluteDescending: 'مرتب‌سازی مطلق به صورت نزولی', sortUnSort: 'پاک کردن مرتب‌سازی', shiftF2: 'Shift+F2', + toolbarFind: 'یافتن', + toolbarFindPreviousMatch: 'مطابقت قبلی', + toolbarFindNextMatch: 'مطابقت بعدی', + toolbarQuickFilter: 'فیلتر', + toolbarMenu: 'منو', // Enterprise Menu Aggregation and Status Bar sum: 'جمع', diff --git a/community-modules/locale/src/fi-FI.ts b/community-modules/locale/src/fi-FI.ts index 4b6dafb73a9..09ee139d364 100644 --- a/community-modules/locale/src/fi-FI.ts +++ b/community-modules/locale/src/fi-FI.ts @@ -338,6 +338,11 @@ export const AG_GRID_LOCALE_FI = { sortAbsoluteDescending: 'Lajittele ehdoton laskeva', sortUnSort: 'Tyhjennä lajittelu', shiftF2: 'Shift+F2', + toolbarFind: 'Etsi', + toolbarFindPreviousMatch: 'Edellinen osuma', + toolbarFindNextMatch: 'Seuraava osuma', + toolbarQuickFilter: 'Suodatus', + toolbarMenu: 'Valikko', // Enterprise Menu Aggregation and Status Bar sum: 'Summa', diff --git a/community-modules/locale/src/fr-FR.ts b/community-modules/locale/src/fr-FR.ts index 389e46b6e6a..428fc08c73c 100644 --- a/community-modules/locale/src/fr-FR.ts +++ b/community-modules/locale/src/fr-FR.ts @@ -340,6 +340,11 @@ export const AG_GRID_LOCALE_FR = { sortAbsoluteDescending: 'Trier par ordre décroissant absolu', sortUnSort: 'Effacer le tri', shiftF2: 'Shift+F2', + toolbarFind: 'Rechercher', + toolbarFindPreviousMatch: 'Correspondance précédente', + toolbarFindNextMatch: 'Correspondance suivante', + toolbarQuickFilter: 'Filtrer', + toolbarMenu: 'Menu', // Enterprise Menu Aggregation and Status Bar sum: 'Somme', diff --git a/community-modules/locale/src/he-IL.ts b/community-modules/locale/src/he-IL.ts index eadae51bc7f..994cfd0a9a2 100644 --- a/community-modules/locale/src/he-IL.ts +++ b/community-modules/locale/src/he-IL.ts @@ -334,6 +334,11 @@ export const AG_GRID_LOCALE_IL = { sortAbsoluteDescending: 'מיון יורד מוחלט', sortUnSort: 'נקה מיון', shiftF2: 'Shift+F2', + toolbarFind: 'חפש', + toolbarFindPreviousMatch: 'תאמה קודמת', + toolbarFindNextMatch: 'תאמה הבאה', + toolbarQuickFilter: 'סנן', + toolbarMenu: 'תפריט', // Enterprise Menu Aggregation and Status Bar sum: 'סכום', diff --git a/community-modules/locale/src/hr-HR.ts b/community-modules/locale/src/hr-HR.ts index 82e1a72c6b5..9ae2b67315c 100644 --- a/community-modules/locale/src/hr-HR.ts +++ b/community-modules/locale/src/hr-HR.ts @@ -336,6 +336,11 @@ export const AG_GRID_LOCALE_HR = { sortAbsoluteDescending: 'Sortiraj apsolutno silazno', sortUnSort: 'Očisti sortiranje', shiftF2: 'Shift+F2', + toolbarFind: 'Pronađi', + toolbarFindPreviousMatch: 'Prethodno podudaranje', + toolbarFindNextMatch: 'Sljedeće podudaranje', + toolbarQuickFilter: 'Filter', + toolbarMenu: 'Izbornik', // Enterprise Menu Aggregation and Status Bar sum: 'Zbroj', diff --git a/community-modules/locale/src/hu-HU.ts b/community-modules/locale/src/hu-HU.ts index 47a136ca734..b2e7d8f183f 100644 --- a/community-modules/locale/src/hu-HU.ts +++ b/community-modules/locale/src/hu-HU.ts @@ -339,6 +339,11 @@ export const AG_GRID_LOCALE_HU = { sortAbsoluteDescending: 'Abszolút csökkenő sorrendben rendez', sortUnSort: 'Rendezés törlése', shiftF2: 'Shift+F2', + toolbarFind: 'Keresés', + toolbarFindPreviousMatch: 'Előző találat', + toolbarFindNextMatch: 'Következő találat', + toolbarQuickFilter: 'Szűrő', + toolbarMenu: 'Menü', // Enterprise Menu Aggregation and Status Bar sum: 'Összeg', diff --git a/community-modules/locale/src/it-IT.ts b/community-modules/locale/src/it-IT.ts index d840f0d1d96..2c1ef20409f 100644 --- a/community-modules/locale/src/it-IT.ts +++ b/community-modules/locale/src/it-IT.ts @@ -338,6 +338,11 @@ export const AG_GRID_LOCALE_IT = { sortAbsoluteDescending: 'Ordina Assoluto Decrescente', sortUnSort: 'Annulla Ordinamento', shiftF2: 'Shift+F2', + toolbarFind: 'Trova', + toolbarFindPreviousMatch: 'Corrispondenza Precedente', + toolbarFindNextMatch: 'Corrispondenza Successiva', + toolbarQuickFilter: 'Filtro', + toolbarMenu: 'Menu', // Enterprise Menu Aggregation and Status Bar sum: 'Somma', diff --git a/community-modules/locale/src/ja-JP.ts b/community-modules/locale/src/ja-JP.ts index d73b72d0727..0692707cadb 100644 --- a/community-modules/locale/src/ja-JP.ts +++ b/community-modules/locale/src/ja-JP.ts @@ -334,6 +334,11 @@ export const AG_GRID_LOCALE_JP = { sortAbsoluteDescending: '絶対降順に並べ替え', sortUnSort: 'ソート解除', shiftF2: 'Shift+F2', + toolbarFind: '検索', + toolbarFindPreviousMatch: '前の一致', + toolbarFindNextMatch: '次の一致', + toolbarQuickFilter: 'フィルター', + toolbarMenu: 'メニュー', // Enterprise Menu Aggregation and Status Bar sum: '合計', diff --git a/community-modules/locale/src/ko-KR.ts b/community-modules/locale/src/ko-KR.ts index 69df5428131..042058d9c07 100644 --- a/community-modules/locale/src/ko-KR.ts +++ b/community-modules/locale/src/ko-KR.ts @@ -335,6 +335,11 @@ export const AG_GRID_LOCALE_KR = { sortAbsoluteDescending: '절대 내림차순 정렬', sortUnSort: '정렬 해제', shiftF2: 'Shift+F2', + toolbarFind: '찾기', + toolbarFindPreviousMatch: '이전 항목 찾기', + toolbarFindNextMatch: '다음 항목 찾기', + toolbarQuickFilter: '필터', + toolbarMenu: '메뉴', // Enterprise Menu Aggregation and Status Bar sum: '합계', diff --git a/community-modules/locale/src/nb-NO.ts b/community-modules/locale/src/nb-NO.ts index 42b486a5884..81a89fef150 100644 --- a/community-modules/locale/src/nb-NO.ts +++ b/community-modules/locale/src/nb-NO.ts @@ -336,6 +336,11 @@ export const AG_GRID_LOCALE_NO = { sortAbsoluteDescending: 'Sorter absolutt synkende', sortUnSort: 'Fjern Sortering', shiftF2: 'Shift+F2', + toolbarFind: 'Finn', + toolbarFindPreviousMatch: 'Forrige treff', + toolbarFindNextMatch: 'Neste treff', + toolbarQuickFilter: 'Filter', + toolbarMenu: 'Meny', // Enterprise Menu Aggregation and Status Bar sum: 'Sum', diff --git a/community-modules/locale/src/nl-NL.ts b/community-modules/locale/src/nl-NL.ts index 459c7bb6845..d6320bf92d9 100644 --- a/community-modules/locale/src/nl-NL.ts +++ b/community-modules/locale/src/nl-NL.ts @@ -335,6 +335,11 @@ export const AG_GRID_LOCALE_NL = { sortAbsoluteDescending: 'Sorteren absoluut aflopend', sortUnSort: 'Sortering wissen', shiftF2: 'Shift+F2', + toolbarFind: 'Zoeken', + toolbarFindPreviousMatch: 'Vorige resultaat', + toolbarFindNextMatch: 'Volgende resultaat', + toolbarQuickFilter: 'Filter', + toolbarMenu: 'Menu', // Enterprise Menu Aggregation and Status Bar sum: 'Som', diff --git a/community-modules/locale/src/pl-PL.ts b/community-modules/locale/src/pl-PL.ts index e2ec240a572..aadcc2b5132 100644 --- a/community-modules/locale/src/pl-PL.ts +++ b/community-modules/locale/src/pl-PL.ts @@ -338,6 +338,11 @@ export const AG_GRID_LOCALE_PL = { sortAbsoluteDescending: 'Sortuj bezwzględnie malejąco', sortUnSort: 'Usuń Sortowanie', shiftF2: 'Shift+F2', + toolbarFind: 'Znajdź', + toolbarFindPreviousMatch: 'Poprzednie Dopasowanie', + toolbarFindNextMatch: 'Następne Dopasowanie', + toolbarQuickFilter: 'Filtruj', + toolbarMenu: 'Menu', // Enterprise Menu Aggregation and Status Bar sum: 'Suma', diff --git a/community-modules/locale/src/pt-BR.ts b/community-modules/locale/src/pt-BR.ts index bc60b6d41ad..db4816d4dcc 100644 --- a/community-modules/locale/src/pt-BR.ts +++ b/community-modules/locale/src/pt-BR.ts @@ -338,6 +338,11 @@ export const AG_GRID_LOCALE_BR = { sortAbsoluteDescending: 'Ordenar Absoluto Descendente', sortUnSort: 'Limpar Ordenação', shiftF2: 'Shift+F2', + toolbarFind: 'Buscar', + toolbarFindPreviousMatch: 'Correspondência Anterior', + toolbarFindNextMatch: 'Próxima Correspondência', + toolbarQuickFilter: 'Filtro', + toolbarMenu: 'Menu', // Enterprise Menu Aggregation and Status Bar sum: 'Soma', diff --git a/community-modules/locale/src/pt-PT.ts b/community-modules/locale/src/pt-PT.ts index 4be09e7a1f3..f1dcedbbef1 100644 --- a/community-modules/locale/src/pt-PT.ts +++ b/community-modules/locale/src/pt-PT.ts @@ -338,6 +338,11 @@ export const AG_GRID_LOCALE_PT = { sortAbsoluteDescending: 'Ordenar Absolutamente Descendente', sortUnSort: 'Limpar Ordenação', shiftF2: 'Shift+F2', + toolbarFind: 'Localizar', + toolbarFindPreviousMatch: 'Correspondência Anterior', + toolbarFindNextMatch: 'Próxima Correspondência', + toolbarQuickFilter: 'Filtrar', + toolbarMenu: 'Menu', // Enterprise Menu Aggregation and Status Bar sum: 'Soma', diff --git a/community-modules/locale/src/ro-RO.ts b/community-modules/locale/src/ro-RO.ts index 3190ea21516..b5abfeff50e 100644 --- a/community-modules/locale/src/ro-RO.ts +++ b/community-modules/locale/src/ro-RO.ts @@ -337,6 +337,11 @@ export const AG_GRID_LOCALE_RO = { sortAbsoluteDescending: 'Sortează în ordine descendentă absolută', sortUnSort: 'Șterge Sortarea', shiftF2: 'Shift+F2', + toolbarFind: 'Caută', + toolbarFindPreviousMatch: 'Potrivire Anterioară', + toolbarFindNextMatch: 'Potrivire Următoare', + toolbarQuickFilter: 'Filtru', + toolbarMenu: 'Meniu', // Enterprise Menu Aggregation and Status Bar sum: 'Sumă', diff --git a/community-modules/locale/src/sk-SK.ts b/community-modules/locale/src/sk-SK.ts index 56ba0c398fd..f14c372b441 100644 --- a/community-modules/locale/src/sk-SK.ts +++ b/community-modules/locale/src/sk-SK.ts @@ -335,6 +335,11 @@ export const AG_GRID_LOCALE_SK = { sortAbsoluteDescending: 'Zoradiť absolútne zostupne', sortUnSort: 'Zrušiť zoradenie', shiftF2: 'Shift+F2', + toolbarFind: 'Nájsť', + toolbarFindPreviousMatch: 'Predchádzajúca zhoda', + toolbarFindNextMatch: 'Nasledujúca zhoda', + toolbarQuickFilter: 'Filter', + toolbarMenu: 'Menu', // Enterprise Menu Aggregation and Status Bar sum: 'Súčet', diff --git a/community-modules/locale/src/sv-SE.ts b/community-modules/locale/src/sv-SE.ts index 0794488842d..c1e896ef0f2 100644 --- a/community-modules/locale/src/sv-SE.ts +++ b/community-modules/locale/src/sv-SE.ts @@ -337,6 +337,11 @@ export const AG_GRID_LOCALE_SE = { sortAbsoluteDescending: 'Sortera Absolut Fallande', sortUnSort: 'Rensa Sortering', shiftF2: 'Shift+F2', + toolbarFind: 'Sök', + toolbarFindPreviousMatch: 'Föregående träff', + toolbarFindNextMatch: 'Nästa träff', + toolbarQuickFilter: 'Filter', + toolbarMenu: 'Meny', // Enterprise Menu Aggregation and Status Bar sum: 'Summa', diff --git a/community-modules/locale/src/tr-TR.ts b/community-modules/locale/src/tr-TR.ts index 4b19ddc1c51..5efc8e14411 100644 --- a/community-modules/locale/src/tr-TR.ts +++ b/community-modules/locale/src/tr-TR.ts @@ -338,6 +338,11 @@ export const AG_GRID_LOCALE_TR = { sortAbsoluteDescending: 'Mutlak Azalan Sırala', sortUnSort: 'Sıralamayı Temizle', shiftF2: 'Shift+F2', + toolbarFind: 'Bul', + toolbarFindPreviousMatch: 'Önceki Eşleşme', + toolbarFindNextMatch: 'Sonraki Eşleşme', + toolbarQuickFilter: 'Filtre', + toolbarMenu: 'Menü', // Enterprise Menu Aggregation and Status Bar sum: 'Toplam', diff --git a/community-modules/locale/src/uk-UA.ts b/community-modules/locale/src/uk-UA.ts index 3898eed4350..127a16c1c3c 100644 --- a/community-modules/locale/src/uk-UA.ts +++ b/community-modules/locale/src/uk-UA.ts @@ -336,6 +336,11 @@ export const AG_GRID_LOCALE_UA = { sortAbsoluteDescending: 'Сортувати за спаданням', sortUnSort: 'Очистити Сортування', shiftF2: 'Shift+F2', + toolbarFind: 'Знайти', + toolbarFindPreviousMatch: 'Попередній збіг', + toolbarFindNextMatch: 'Наступний збіг', + toolbarQuickFilter: 'Фільтр', + toolbarMenu: 'Меню', // Enterprise Menu Aggregation and Status Bar sum: 'Сума', diff --git a/community-modules/locale/src/ur-PK.ts b/community-modules/locale/src/ur-PK.ts index 3ba9ccf3cd8..9a2770e7c3c 100644 --- a/community-modules/locale/src/ur-PK.ts +++ b/community-modules/locale/src/ur-PK.ts @@ -335,6 +335,11 @@ export const AG_GRID_LOCALE_PK = { sortAbsoluteDescending: 'مکمل اُتری ابجدی ترتیب میں ترتیب دیں', sortUnSort: 'ترتیب مٹائیں', shiftF2: 'Shift+F2', + toolbarFind: 'تلاش', + toolbarFindPreviousMatch: 'پچھلا میچ', + toolbarFindNextMatch: 'اگلا میچ', + toolbarQuickFilter: 'فلٹر', + toolbarMenu: 'مینو', // Enterprise Menu Aggregation and Status Bar sum: 'مجموعہ', diff --git a/community-modules/locale/src/vi-VN.ts b/community-modules/locale/src/vi-VN.ts index af2f2f63d12..df624c10692 100644 --- a/community-modules/locale/src/vi-VN.ts +++ b/community-modules/locale/src/vi-VN.ts @@ -335,6 +335,11 @@ export const AG_GRID_LOCALE_VN = { sortAbsoluteDescending: 'Sắp Xếp Giảm Dần Tuyệt Đối', sortUnSort: 'Xóa Sắp Xếp', shiftF2: 'Shift+F2', + toolbarFind: 'Tìm kiếm', + toolbarFindPreviousMatch: 'Kết quả trùng khớp trước', + toolbarFindNextMatch: 'Kết quả trùng khớp tiếp theo', + toolbarQuickFilter: 'Bộ lọc', + toolbarMenu: 'Trình đơn', // Enterprise Menu Aggregation and Status Bar sum: 'Tổng', diff --git a/community-modules/locale/src/zh-CN.ts b/community-modules/locale/src/zh-CN.ts index 1d478e026d6..8cf852cb505 100644 --- a/community-modules/locale/src/zh-CN.ts +++ b/community-modules/locale/src/zh-CN.ts @@ -334,6 +334,11 @@ export const AG_GRID_LOCALE_CN = { sortAbsoluteDescending: '绝对降序排序', sortUnSort: '清除排序', shiftF2: 'Shift+F2', + toolbarFind: '查找', + toolbarFindPreviousMatch: '上一个匹配', + toolbarFindNextMatch: '下一个匹配', + toolbarQuickFilter: '筛选', + toolbarMenu: '菜单', // Enterprise Menu Aggregation and Status Bar sum: '总和', diff --git a/community-modules/locale/src/zh-HK.ts b/community-modules/locale/src/zh-HK.ts index 811234d7a9d..7fc85989f84 100644 --- a/community-modules/locale/src/zh-HK.ts +++ b/community-modules/locale/src/zh-HK.ts @@ -334,6 +334,11 @@ export const AG_GRID_LOCALE_HK = { sortAbsoluteDescending: '絕對降序排序', sortUnSort: '清除排序', shiftF2: 'Shift+F2', + toolbarFind: '尋找', + toolbarFindPreviousMatch: '上一個匹配', + toolbarFindNextMatch: '下一個匹配', + toolbarQuickFilter: '篩選', + toolbarMenu: '菜單', // Enterprise Menu Aggregation and Status Bar sum: '總和', diff --git a/community-modules/locale/src/zh-TW.ts b/community-modules/locale/src/zh-TW.ts index 8698929ce2e..f18fdd40df0 100644 --- a/community-modules/locale/src/zh-TW.ts +++ b/community-modules/locale/src/zh-TW.ts @@ -334,6 +334,11 @@ export const AG_GRID_LOCALE_TW = { sortAbsoluteDescending: '絕對遞減排序', sortUnSort: '清除排列', shiftF2: 'Shift+F2', + toolbarFind: '尋找', + toolbarFindPreviousMatch: '上一次匹配', + toolbarFindNextMatch: '下一個匹配', + toolbarQuickFilter: '篩選', + toolbarMenu: '選單', // Enterprise Menu Aggregation and Status Bar sum: '總和', From 01d4a6afdf2c5257610445f8865d62b9a8370999 Mon Sep 17 00:00:00 2001 From: Tak Tran Date: Fri, 8 May 2026 13:30:45 +0100 Subject: [PATCH 09/12] AG-3390 - Sync ag-website-shared (#13694) * git subrepo push external/ag-website-shared subrepo: subdir: "external/ag-website-shared" merged: "bb2db9f2eff" upstream: origin: "git@github.com:ag-grid/ag-website-shared.git" branch: "latest" commit: "bb2db9f2eff" git-subrepo: version: "0.4.9" origin: "https://github.com/ingydotnet/git-subrepo" commit: "5e0f401" * git subrepo pull external/ag-website-shared subrepo: subdir: "external/ag-website-shared" merged: "693fbe29f87" upstream: origin: "git@github.com:ag-grid/ag-website-shared.git" branch: "latest" commit: "693fbe29f87" git-subrepo: version: "0.4.9" origin: "https://github.com/ingydotnet/git-subrepo" commit: "5e0f401" * AG-3390 - Fix formatting differences * AG-3390 - Fix last name error in trial license form * git subrepo push external/ag-website-shared subrepo: subdir: "external/ag-website-shared" merged: "06ffba427e1" upstream: origin: "git@github.com:ag-grid/ag-website-shared.git" branch: "latest" commit: "06ffba427e1" git-subrepo: version: "0.4.9" origin: "https://github.com/ingydotnet/git-subrepo" commit: "30db3b8" * AG-3390 - Add missing framework text animation * AG-3390 - Add missing PRODUCTION_STUDIO_SITE_URL * AG-3390 - Add DEBUG_SCRIPT_FILE_NAME constant Not used in grid at the moment, but could be used in future. From studio, see https://github.com/ag-grid/ag-studio/pull/792 * git subrepo push external/ag-website-shared subrepo: subdir: "external/ag-website-shared" merged: "f4463362670" upstream: origin: "git@github.com:ag-grid/ag-website-shared.git" branch: "latest" commit: "f4463362670" git-subrepo: version: "0.4.9" origin: "https://github.com/ingydotnet/git-subrepo" commit: "30db3b8" * git subrepo pull external/ag-website-shared subrepo: subdir: "external/ag-website-shared" merged: "01e1bd87332" upstream: origin: "git@github.com:ag-grid/ag-website-shared.git" branch: "latest" commit: "01e1bd87332" git-subrepo: version: "0.4.9" origin: "https://github.com/ingydotnet/git-subrepo" commit: "30db3b8" --- documentation/ag-grid-docs/src/constants.ts | 3 + external/ag-website-shared/.gitrepo | 4 +- external/ag-website-shared/.prettierrc | 1 + .../plugins/agCssAsString.ts | 46 +++ .../plugins/agLinkChecker.ts | 4 +- .../plugins/agSvgAsString.ts | 47 +++ .../src/components/code/Code.tsx | 15 +- .../components/OpenInCodeSandbox.tsx | 3 - .../codeSandbox/utils/codeSandbox.ts | 14 +- .../DocsNavFromLocalStorage.tsx | 12 +- .../components/ExampleLogger.module.scss | 4 + .../example-runner/scripts/studio-debug.js | 203 +++++++++++ .../components/example-runner/scripts/sw.js | 37 ++ .../src/components/icon/Icon.tsx | 1 + .../LandingPageSection.module.scss | 3 - .../landing-pages/LandingPageSection.tsx | 4 +- .../components/major-table/MajorTable.astro | 17 +- .../plunkr/components/OpenInPlunkr.tsx | 12 +- .../product-dropdown/ProductDropdown.tsx | 2 +- .../ApiReference.module.scss | 1 + .../site-header/SiteHeader.module.scss | 3 +- .../TrialLicenceFormStudio.tsx | 319 ++++++++++++++++++ .../chartsFeaturesMatrix.json | 34 ++ .../src/design-system/core/_breakpoints.scss | 2 + .../images/inline-svgs/ag-charts-logomark.svg | 15 + .../src/utils/getArchiveUrl.ts | 4 +- .../src/utils/getChangelogUrl.ts | 11 +- 27 files changed, 773 insertions(+), 48 deletions(-) create mode 100644 external/ag-website-shared/plugins/agCssAsString.ts create mode 100644 external/ag-website-shared/plugins/agSvgAsString.ts create mode 100644 external/ag-website-shared/src/components/example-runner/scripts/studio-debug.js create mode 100644 external/ag-website-shared/src/components/example-runner/scripts/sw.js create mode 100644 external/ag-website-shared/src/components/trial-licence-form/TrialLicenceFormStudio.tsx create mode 100644 external/ag-website-shared/src/images/inline-svgs/ag-charts-logomark.svg diff --git a/documentation/ag-grid-docs/src/constants.ts b/documentation/ag-grid-docs/src/constants.ts index 8e21c63d3ba..837ed0d2d72 100644 --- a/documentation/ag-grid-docs/src/constants.ts +++ b/documentation/ag-grid-docs/src/constants.ts @@ -176,6 +176,8 @@ function calculateGridUrl() { export const GRID_URL = calculateGridUrl(); +export const PRODUCTION_STUDIO_SITE_URL = 'https://www.ag-grid.com/studio'; + export const LIVE_SITEMAP_URL = import.meta.env?.LIVE_SITEMAP_URL; export const EXAMPLE_RANDOM_SEED = 'AG Grid Random Seed'; @@ -183,6 +185,7 @@ export const EXAMPLE_RANDOM_SEED = 'AG Grid Random Seed'; export const TRIAL_LICENCE_FORM_URL = import.meta.env?.PUBLIC_TRIAL_LICENCE_FORM_URL; export const EXAMPLE_STYLE_FILE_NAME = 'ag-example-styles.css'; +export const DEBUG_SCRIPT_FILE_NAME = 'ag-grid-debug.js'; export const PRODUCTION_CHANGELOG_JSON_URL = 'https://www.ag-grid.com/changelog/changelog.json'; diff --git a/external/ag-website-shared/.gitrepo b/external/ag-website-shared/.gitrepo index 952e2e0f476..d0d709179a1 100644 --- a/external/ag-website-shared/.gitrepo +++ b/external/ag-website-shared/.gitrepo @@ -6,7 +6,7 @@ [subrepo] remote = git@github.com:ag-grid/ag-website-shared.git branch = latest - commit = 886dd2eccf0bc1359311d257544851f510b77aa7 - parent = 48d01a5528b8fbaa40f5b4e3e9f9b44c875db143 + commit = 01e1bd873328886ae6aa639e0c069ada9ca068c2 + parent = 46ce864be91ce5a79f57ddd6ffeb22c3bb2af1ed method = rebase cmdver = 0.4.9 diff --git a/external/ag-website-shared/.prettierrc b/external/ag-website-shared/.prettierrc index 81dfed058f4..57e5f02f085 100644 --- a/external/ag-website-shared/.prettierrc +++ b/external/ag-website-shared/.prettierrc @@ -7,6 +7,7 @@ "importOrderParserPlugins": ["typescript", "decorators-legacy"], "importOrderSeparation": true, "importOrderSortSpecifiers": true, + "importOrderImportAttributesKeyword": "with", "overrides": [ { "files": [ diff --git a/external/ag-website-shared/plugins/agCssAsString.ts b/external/ag-website-shared/plugins/agCssAsString.ts new file mode 100644 index 00000000000..502ec6f4b89 --- /dev/null +++ b/external/ag-website-shared/plugins/agCssAsString.ts @@ -0,0 +1,46 @@ +import type { Plugin } from 'vite'; + +type Options = { + /** + * Workspace package names whose `src/**` files should have CSS imports rewritten. + * e.g. ['ag-charts-community', 'ag-charts-enterprise', 'ag-charts-core'] + * ['ag-studio'] + */ + packages: string[]; +}; + +/* + * Vite 7 (pulled in by Astro 6) removed the default string export from plain `.css` imports. + * Library source files using `import STYLES from '.../styles.css'` as a string (fed into + * `addStyles()` / `enterpriseRegistry.styles`) relied on that deprecated behaviour. + * This plugin rewrites those imports to use `?inline` so Vite returns the CSS as a string. + * + * Remove a package from `packages` once its source files use `?inline` explicitly or stop + * importing CSS as a string (e.g. by moving style injection into their own build pipeline). + * + * Scope: only default-binding imports (`import X from '...css'`). Side-effect imports + * (`import '...css'`) are intentionally left alone — they rely on Vite's default + * stylesheet-injection behaviour (e.g. ag-grid's `main-umd-styles.ts`). + */ +export default function agCssAsString({ packages }: Options): Plugin { + const escaped = packages.map((p) => p.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')); + const SOURCE_PATTERN = new RegExp(`packages/(${escaped.join('|')})/src/`); + + // Match default-binding imports of plain `.css` only. The negative lookahead + // (?!\?) explicitly excludes imports that already carry a Vite query suffix + // (`./x.css?raw`, `./x.css?url`, etc.) so those pass through unchanged. + const PLAIN_CSS_IMPORT = /(from\s+['"][^'"]+\.css)(?!\?)(['"])/g; + + return { + name: 'ag-css-as-string', + enforce: 'pre', + transform(code, id) { + if (!SOURCE_PATTERN.test(id)) return null; + if (!PLAIN_CSS_IMPORT.test(code)) return null; + + // Reset lastIndex — RegExp objects with /g remember state across .test/.exec. + PLAIN_CSS_IMPORT.lastIndex = 0; + return code.replace(PLAIN_CSS_IMPORT, '$1?inline$2'); + }, + }; +} diff --git a/external/ag-website-shared/plugins/agLinkChecker.ts b/external/ag-website-shared/plugins/agLinkChecker.ts index ae720865c10..9f98d62b8a1 100644 --- a/external/ag-website-shared/plugins/agLinkChecker.ts +++ b/external/ag-website-shared/plugins/agLinkChecker.ts @@ -206,8 +206,8 @@ const checkLinks = async (dir: string, files: string[], options: Options) => { validationResults[link] = { error }; return; } else { - // check if the hash exists in the file - if (!anchors.has(linkWithoutPrefix)) { + // Check if the hash exists in the file + if (!anchors.has(linkWithoutPrefix) && !anchors.has(linkWithoutPrefix.replace('#', '/#'))) { errors.push( `Link to ${originalLink} could not be resolved in (${filePathsString(filePaths, options)}).` ); diff --git a/external/ag-website-shared/plugins/agSvgAsString.ts b/external/ag-website-shared/plugins/agSvgAsString.ts new file mode 100644 index 00000000000..19273eddef0 --- /dev/null +++ b/external/ag-website-shared/plugins/agSvgAsString.ts @@ -0,0 +1,47 @@ +import type { Plugin } from 'vite'; + +type Options = { + /** + * Workspace package names whose `src/**` files should have SVG imports rewritten. + * e.g. ['ag-studio'] + */ + packages: string[]; +}; + +/* + * Library source files use `import SVG from '.../icon.svg'` as a string (assigned to + * `element.innerHTML`). The library's own build pipeline (esbuild with `loader: 'text'`, + * see `esbuild.config.cjs`'s svgPlugin) returns the SVG markup as a raw string. + * + * Vite's default `.svg` import returns a URL, and Astro further wraps it as an asset + * metadata object — neither matches what the library source expects, producing + * `[object Object]` rendered text instead of the icon. + * + * This plugin rewrites those imports to use `?raw` so Vite returns the file content + * as a string. + * + * Scope: only default-binding imports (`import X from '...svg'`). Side-effect imports + * (`import '...svg'`) are intentionally left alone. + */ +export default function agSvgAsString({ packages }: Options): Plugin { + const escaped = packages.map((p) => p.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')); + const SOURCE_PATTERN = new RegExp(`packages/(${escaped.join('|')})/src/`); + + // Match default-binding imports of plain `.svg` only. The negative lookahead + // (?!\?) explicitly excludes imports that already carry a Vite query suffix + // (`./x.svg?url`, `./x.svg?react`, etc.) so those pass through unchanged. + const PLAIN_SVG_IMPORT = /(from\s+['"][^'"]+\.svg)(?!\?)(['"])/g; + + return { + name: 'ag-svg-as-string', + enforce: 'pre', + transform(code, id) { + if (!SOURCE_PATTERN.test(id)) return null; + if (!PLAIN_SVG_IMPORT.test(code)) return null; + + // Reset lastIndex — RegExp objects with /g remember state across .test/.exec. + PLAIN_SVG_IMPORT.lastIndex = 0; + return code.replace(PLAIN_SVG_IMPORT, '$1?raw$2'); + }, + }; +} diff --git a/external/ag-website-shared/src/components/code/Code.tsx b/external/ag-website-shared/src/components/code/Code.tsx index 06cdc7c392d..bc268e85f9a 100644 --- a/external/ag-website-shared/src/components/code/Code.tsx +++ b/external/ag-website-shared/src/components/code/Code.tsx @@ -31,6 +31,7 @@ const GrammarMap = { diff: Prism.languages.diff, scss: Prism.languages.scss, xml: Prism.languages.xml, + plain: Prism.languages.plain, }; export type Language = keyof typeof GrammarMap; @@ -92,6 +93,7 @@ function Code({ return (
 : {code};
+    return keepMarkup ? (
+        
+    ) : (
+        
+            {code}
+        
+    );
 };
 
 /**
@@ -134,7 +142,10 @@ const CodeWithPrismPlugins = ({ code, keepMarkup }: { code: string; keepMarkup:
  * small part of the Prism lifecycle.
  */
 const CodeWithoutPrismPlugins = ({ code, language }: { code: string; language: Language }) => (
-    
+    
 );
 
 export default memo(Code);
diff --git a/external/ag-website-shared/src/components/codeSandbox/components/OpenInCodeSandbox.tsx b/external/ag-website-shared/src/components/codeSandbox/components/OpenInCodeSandbox.tsx
index 28d781edee8..7fa2b1c9689 100644
--- a/external/ag-website-shared/src/components/codeSandbox/components/OpenInCodeSandbox.tsx
+++ b/external/ag-website-shared/src/components/codeSandbox/components/OpenInCodeSandbox.tsx
@@ -13,7 +13,6 @@ interface Props {
     internalFramework: InternalFramework;
     files: FileContents;
     htmlUrl: string;
-    boilerPlateFiles?: FileContents;
     packageJson: Record;
     isDev: boolean;
 }
@@ -23,7 +22,6 @@ export const OpenInCodeSandbox: FunctionComponent = ({
     internalFramework,
     files,
     htmlUrl,
-    boilerPlateFiles,
     packageJson,
     isDev,
 }) => {
@@ -44,7 +42,6 @@ export const OpenInCodeSandbox: FunctionComponent = ({
                 openCodeSandbox({
                     title,
                     files: sandboxFiles,
-                    boilerPlateFiles,
                     internalFramework,
                 });
             }}
diff --git a/external/ag-website-shared/src/components/codeSandbox/utils/codeSandbox.ts b/external/ag-website-shared/src/components/codeSandbox/utils/codeSandbox.ts
index d16a6e7e64f..0c33a92ac2a 100644
--- a/external/ag-website-shared/src/components/codeSandbox/utils/codeSandbox.ts
+++ b/external/ag-website-shared/src/components/codeSandbox/utils/codeSandbox.ts
@@ -1,6 +1,6 @@
 import type { InternalFramework } from '@ag-grid-types';
 import type { FileContents } from '@components/example-generator/types';
-import { EXAMPLE_STYLE_FILE_NAME } from '@constants';
+import { DEBUG_SCRIPT_FILE_NAME, EXAMPLE_STYLE_FILE_NAME } from '@constants';
 import { isReactInternalFramework } from '@utils/framework';
 import { getParameters } from 'codesandbox-import-utils/lib/api/define';
 
@@ -27,7 +27,9 @@ const getPathForFile = ({
         return `public/index.html`;
     }
 
-    if (fileName === EXAMPLE_STYLE_FILE_NAME) {
+    if (fileName === DEBUG_SCRIPT_FILE_NAME) {
+        return `public/${DEBUG_SCRIPT_FILE_NAME}`;
+    } else if (fileName === EXAMPLE_STYLE_FILE_NAME) {
         return `public/${EXAMPLE_STYLE_FILE_NAME}`;
     }
 
@@ -59,11 +61,9 @@ const getCodeSandboxRuntime = (internalFramework: InternalFramework) => {
 
 const getCodeSandboxFiles = ({
     files,
-    boilerPlateFiles,
     internalFramework,
 }: {
     files: FileContents;
-    boilerPlateFiles: FileContents;
     internalFramework: InternalFramework;
 }) => {
     const sandboxFiles: SandboxFiles = {};
@@ -107,12 +107,10 @@ const createHiddenInputFactory =
 const getCodeSandboxFilesToSubmit = ({
     title,
     files,
-    boilerPlateFiles,
     internalFramework,
 }: {
     title: string;
     files: FileContents;
-    boilerPlateFiles: FileContents;
     internalFramework: InternalFramework;
 }) => {
     const runtime = getCodeSandboxRuntime(internalFramework);
@@ -126,7 +124,6 @@ const getCodeSandboxFilesToSubmit = ({
         ...configFiles,
         ...getCodeSandboxFiles({
             files,
-            boilerPlateFiles,
             internalFramework,
         }),
     };
@@ -143,12 +140,10 @@ const getCodeSandboxFilesToSubmit = ({
 export const openCodeSandbox = ({
     title,
     files,
-    boilerPlateFiles,
     internalFramework,
 }: {
     title: string;
     files: FileContents;
-    boilerPlateFiles: FileContents;
     internalFramework: InternalFramework;
 }) => {
     const form = document.createElement('form');
@@ -162,7 +157,6 @@ export const openCodeSandbox = ({
         files: getCodeSandboxFilesToSubmit({
             title,
             files,
-            boilerPlateFiles,
             internalFramework,
         }),
         template: getCodeSandboxRuntime(internalFramework),
diff --git a/external/ag-website-shared/src/components/docs-navigation/DocsNavFromLocalStorage.tsx b/external/ag-website-shared/src/components/docs-navigation/DocsNavFromLocalStorage.tsx
index 2fbce79535e..2042fa15f7e 100644
--- a/external/ag-website-shared/src/components/docs-navigation/DocsNavFromLocalStorage.tsx
+++ b/external/ag-website-shared/src/components/docs-navigation/DocsNavFromLocalStorage.tsx
@@ -6,7 +6,15 @@ import { useEffect, useState } from 'react';
 
 import { DocsNav } from './DocsNav';
 
-export function DocsNavFromLocalStorage({ menuData, pageName }: { menuData: any; pageName?: string }) {
+export function DocsNavFromLocalStorage({
+    menuData,
+    pageName,
+    showWhatsNew = true,
+}: {
+    menuData: any;
+    pageName?: string;
+    showWhatsNew?: boolean;
+}) {
     const internalFramework = useStore($internalFramework);
     const [framework, setFramework] = useState();
 
@@ -18,5 +26,5 @@ export function DocsNavFromLocalStorage({ menuData, pageName }: { menuData: any;
         }
     }, [internalFramework]);
 
-    return ;
+    return ;
 }
diff --git a/external/ag-website-shared/src/components/example-runner/components/ExampleLogger.module.scss b/external/ag-website-shared/src/components/example-runner/components/ExampleLogger.module.scss
index de0db329aa5..f37092de3ba 100644
--- a/external/ag-website-shared/src/components/example-runner/components/ExampleLogger.module.scss
+++ b/external/ag-website-shared/src/components/example-runner/components/ExampleLogger.module.scss
@@ -11,6 +11,10 @@
     border-radius: var(--radius-md);
     border: 1px solid var(--color-border-primary);
     overflow: hidden;
+
+    @media screen and (max-width: $breakpoint-docs-search-medium) {
+        display: none;
+    }
 }
 
 .loggerHeader {
diff --git a/external/ag-website-shared/src/components/example-runner/scripts/studio-debug.js b/external/ag-website-shared/src/components/example-runner/scripts/studio-debug.js
new file mode 100644
index 00000000000..4b399a6b67b
--- /dev/null
+++ b/external/ag-website-shared/src/components/example-runner/scripts/studio-debug.js
@@ -0,0 +1,203 @@
+// @ts-check
+/** @typedef {import('ag-charts-enterprise').AgChartOptions} AgChartOptions */
+
+const html = String;
+
+const indexHtml = html`
+    
+        
+            JavaScript Example - Quick Start - Basic Example
+            
+            
+            
+            
+            
+        
+        
+            
+ + + + + `; + +/** + * @param {string} key + * @returns {string} + */ +function jsonKey(key) { + return `%%${key}%%`; +} + +/** + * @param {AgChartOptions} options + * @returns {string} + */ +function getMainJs(options) { + const replacements = new Map([ + ['data', 'getData()'], + ['container', `document.getElementById("myChart")`], + ['context', 'null'], + ]); + + for (const key of replacements.keys()) { + options = { ...options, [key]: jsonKey(key) }; + } + let optionsJs = JSON.stringify(options, null, 4); + for (const [key, value] of replacements) { + optionsJs = optionsJs.replace(JSON.stringify(jsonKey(key)), value); + } + + // Remove quotes from keys that are valid identifiers + optionsJs = optionsJs.replace(/^(\s+)"(\w+)":/gm, '$1$2:'); + + return [`const { AgCharts } = agCharts;`, `const options = ${optionsJs};`, `AgCharts.create(options);`].join( + '\n\n' + ); +} + +/** + * @param {AgChartOptions} options + * @returns {string} + */ +function getDataJs(options) { + const dataJs = JSON.stringify(options.data, null, 4).replace(/^/gm, ' ').trim(); + + return [`function getData() {`, ` return ${dataJs};`, `}`].join('\n'); +} + +/** + * @param {any} chartWidget + */ +function exportToPlunker({ widget }) { + /** @type {AgChartOptions} */ + const options = widget.getOptions(); + + const form = document.createElement('form'); + form.method = 'post'; + form.style.display = 'none'; + form.action = `https://plnkr.co/edit/?preview&open=main.js`; + form.target = '_blank'; + + /** + * @param {string} name + * @param {any} value + */ + const addHiddenInput = (name, value) => { + const input = document.createElement('input'); + input.type = 'hidden'; + input.name = name; + input.value = value; + form.appendChild(input); + }; + + addHiddenInput('private', true); + addHiddenInput('files[index.html]', indexHtml.replace(/^\s{4}/gm, '')); + addHiddenInput('files[main.js]', getMainJs(options)); + addHiddenInput('files[data.js]', getDataJs(options)); + + document.body.appendChild(form); + form.submit(); + document.body.removeChild(form); +} + +const exportToPlunkerToolbarButton = { + type: 'button', + text: 'Export to Plunker', + icon: 'linked', + action: exportToPlunker, +}; + +const logStateButton = { + type: 'button', + text: 'Log State', + icon: 'eye', + action: ({ api }) => console.log(api.getState()), +}; + +/** @type {any} */ +// eslint-disable-next-line @typescript-eslint/no-unused-vars +const debugOverrides = { + /** + * @param {any} widgetConfigs + * @return {any} widgetConfigs + */ + widgets: (widgetConfigs) => { + for (const [widgetId, widgetConfig] of Object.entries(widgetConfigs)) { + if (widgetId.includes('chart') && !widgetConfig.toolbar.includes(exportToPlunkerToolbarButton)) { + widgetConfig.toolbar.push(exportToPlunkerToolbarButton); + } + if (!widgetConfig.toolbar?.includes(logStateButton)) { + if (widgetConfig.toolbar == null) { + widgetConfig.toolbar = []; + } + widgetConfig.toolbar.push(logStateButton); + } + } + return widgetConfigs; + }, +}; + +// Propagate URL query params into window globals consumed by ag-studio. +// Runs before the example's main.js to ensure flags are visible at startup. +// Values are *appended* to any existing window.agStudioDebug / agStudioOpts. +// ?explain= → adds 'query:explain' to window.agStudioDebug, 'options' can include 'rows' and 'plain' to add 'query:explain:rows' and set window.agStudioOpts.explainFormat = 'plain', respectively +// ?batchLog=true → adds 'query:batch' to window.agStudioDebug +// ?sf= → sets window.agStudioOpts.scaleFactor (consumed by demoDataGenerator), 1.0 = ~4.5mil rows +// ?batching=false → sets window.agStudioOpts.queryBatching = false +(function () { + const urlParams = new URLSearchParams(window.location.search); + + const agStudioOpts = { ...(window.agStudioOpts ?? {}) }; + const agStudioDebug = Array.isArray(window.agStudioDebug) ? window.agStudioDebug.slice() : []; + + const explainParam = urlParams.get('explain'); + if (explainParam && !agStudioDebug.includes('query:explain')) { + agStudioDebug.push('query:explain'); + if (explainParam.includes('rows')) { + agStudioDebug.push('query:explain:rows'); + } + if (explainParam.includes('plain')) { + agStudioOpts.explainFormat = 'plain'; + } + } + if (urlParams.get('batchLog') === 'true' && !agStudioDebug.includes('query:batch')) { + agStudioDebug.push('query:batch'); + } + if (urlParams.get('tracing') === 'true') { + agStudioDebug.push('traceMarkers'); + } + + if (agStudioDebug.length > 0) { + window.agStudioDebug = agStudioDebug; + } + + const sfParam = urlParams.get('sf'); + if (sfParam != null) { + const sf = parseFloat(sfParam); + if (Number.isFinite(sf) && sf > 0) { + agStudioOpts.scaleFactor = sf; + } + } + const batchingParam = urlParams.get('batching'); + if (batchingParam != null) { + agStudioOpts.queryBatching = batchingParam !== 'false'; + } + window.agStudioOpts = agStudioOpts; +})(); diff --git a/external/ag-website-shared/src/components/example-runner/scripts/sw.js b/external/ag-website-shared/src/components/example-runner/scripts/sw.js new file mode 100644 index 00000000000..c1942a16e59 --- /dev/null +++ b/external/ag-website-shared/src/components/example-runner/scripts/sw.js @@ -0,0 +1,37 @@ +importScripts('https://cdn.jsdelivr.net/npm/typescript@5.4.5/lib/typescript.js'); + +self.addEventListener('install', () => self.skipWaiting()); +self.addEventListener('activate', (event) => event.waitUntil(self.clients.claim())); + +async function transpile(request, ext) { + const response = await fetch(request); + if (!response.ok) return response; + + const source = await response.text(); + + const result = ts.transpileModule(source, { + compilerOptions: { + module: ts.ModuleKind.ESNext, + target: ts.ScriptTarget.ESNext, + jsx: ext.endsWith('x') ? ts.JsxEmit.React : undefined, + experimentalDecorators: ext === 'ts', + emitDecoratorMetadata: ext === 'ts', + }, + }); + + return new Response(result.outputText, { + headers: { 'Content-Type': 'application/javascript' }, + }); +} + +self.addEventListener('fetch', (event) => { + const url = new URL(event.request.url); + const ext = url.pathname + .match(/\.([a-z0-9]+)$/i) + ?.at(1) + ?.toLowerCase(); + + if (['jsx', 'ts', 'tsx'].includes(ext)) { + event.respondWith(transpile(event.request, ext)); + } +}); diff --git a/external/ag-website-shared/src/components/icon/Icon.tsx b/external/ag-website-shared/src/components/icon/Icon.tsx index cd9806306a4..ff09af928db 100644 --- a/external/ag-website-shared/src/components/icon/Icon.tsx +++ b/external/ag-website-shared/src/components/icon/Icon.tsx @@ -154,6 +154,7 @@ export const ICON_MAP = { terminal: CarbonIcon.Terminal, pricingFeatures: CarbonIcon.CicsProgram, support: CarbonIcon.Chat, + edit: CarbonIcon.Edit, ...SOCIALS_ICON_MAP, ...CHARTS_ICON_MAP, }; diff --git a/external/ag-website-shared/src/components/landing-pages/LandingPageSection.module.scss b/external/ag-website-shared/src/components/landing-pages/LandingPageSection.module.scss index 392fbb37ef1..f1a7aec6614 100644 --- a/external/ag-website-shared/src/components/landing-pages/LandingPageSection.module.scss +++ b/external/ag-website-shared/src/components/landing-pages/LandingPageSection.module.scss @@ -54,7 +54,6 @@ font-size: var(--text-fs-lg); font-weight: var(--text-semibold); color: var(--color-util-brand-600); - text-transform: capitalize; #{$selector-darkmode} & { color: var(--color-util-brand-900); @@ -65,7 +64,6 @@ font-size: 40px; font-weight: var(--text-bold); letter-spacing: -1px; - text-transform: capitalize; @media screen and (max-width: $breakpoint-landing-page-medium) { padding: 0; @@ -246,7 +244,6 @@ } .frameworkName { - text-transform: capitalize; font-weight: 600; } diff --git a/external/ag-website-shared/src/components/landing-pages/LandingPageSection.tsx b/external/ag-website-shared/src/components/landing-pages/LandingPageSection.tsx index fba4e4902fb..d419cec6bed 100644 --- a/external/ag-website-shared/src/components/landing-pages/LandingPageSection.tsx +++ b/external/ag-website-shared/src/components/landing-pages/LandingPageSection.tsx @@ -46,6 +46,7 @@ interface Props { showBackgroundGradient?: boolean; children: ReactNode; isFramework?: boolean; + maxWidth?: string; } const CTAWithFrameworks: FunctionComponent<{ ctaId: string; ctaTitle: string; ctaUrl: string }> = ({ @@ -173,6 +174,7 @@ export const LandingPageSection: FunctionComponent = ({ sectionClass, showBackgroundGradient, children, + maxWidth, }) => { return (
= ({ [styles.withBackgroundGradient]: showBackgroundGradient, })} > -
+

{tag}

{headingHtml ? ( diff --git a/external/ag-website-shared/src/components/major-table/MajorTable.astro b/external/ag-website-shared/src/components/major-table/MajorTable.astro index 2d679505d7b..e0da71e42ee 100644 --- a/external/ag-website-shared/src/components/major-table/MajorTable.astro +++ b/external/ag-website-shared/src/components/major-table/MajorTable.astro @@ -13,13 +13,14 @@ interface Props { library: Library; major: Number; type: 'migration' | 'archive'; + suppressChangelog?: boolean; } interface Params { framework?: Framework; } -const { library, major, type } = Astro.props as Props; +const { library, major, type, suppressChangelog } = Astro.props as Props; const isMigration = type === 'migration'; @@ -72,12 +73,14 @@ const versions = isMigration ? allVersions.filter(filterMigrations) : allVersion {!isMigration && ( <> - -
- Changelog - - - + {!suppressChangelog && ( + + + Changelog + + + + )} diff --git a/external/ag-website-shared/src/components/plunkr/components/OpenInPlunkr.tsx b/external/ag-website-shared/src/components/plunkr/components/OpenInPlunkr.tsx index 5e6229acf1c..1e27c6670c7 100644 --- a/external/ag-website-shared/src/components/plunkr/components/OpenInPlunkr.tsx +++ b/external/ag-website-shared/src/components/plunkr/components/OpenInPlunkr.tsx @@ -11,21 +11,12 @@ interface Props { title: string; files: FileContents; htmlUrl: string; - boilerPlateFiles?: FileContents; packageJson: Record; fileToOpen: string; isDev: boolean; } -export const OpenInPlunkr: FunctionComponent = ({ - title, - files, - htmlUrl, - boilerPlateFiles, - packageJson, - fileToOpen, - isDev, -}) => { +export const OpenInPlunkr: FunctionComponent = ({ title, files, htmlUrl, packageJson, fileToOpen, isDev }) => { return ( = ({ stripOutExampleGeneratorCode(localFiles); const plunkrExampleFiles = { ...localFiles, - ...boilerPlateFiles, 'package.json': JSON.stringify(packageJson, null, 2), 'index.html': indexHtml, }; diff --git a/external/ag-website-shared/src/components/product-dropdown/ProductDropdown.tsx b/external/ag-website-shared/src/components/product-dropdown/ProductDropdown.tsx index 84e80e35b6f..6e2a2be03ee 100644 --- a/external/ag-website-shared/src/components/product-dropdown/ProductDropdown.tsx +++ b/external/ag-website-shared/src/components/product-dropdown/ProductDropdown.tsx @@ -10,7 +10,7 @@ import styles from './ProductDropdown.module.scss'; export const ProductDropdown = ({ items, children }) => { const [isOpen, setIsOpen] = useState(false); - const dropdownRef = useRef(null); + const dropdownRef = useRef(null); const handleMenuToggle = () => { setIsOpen(!isOpen); diff --git a/external/ag-website-shared/src/components/reference-documentation/ApiReference.module.scss b/external/ag-website-shared/src/components/reference-documentation/ApiReference.module.scss index 9f5909ebaa8..90b9210528d 100644 --- a/external/ag-website-shared/src/components/reference-documentation/ApiReference.module.scss +++ b/external/ag-website-shared/src/components/reference-documentation/ApiReference.module.scss @@ -267,6 +267,7 @@ padding-left: 8px; padding-right: 8px; border-radius: var(--radius-sm); + word-break: break-word; #{$selector-darkmode} & { background-color: color-mix(in srgb, var(--color-fg-code), var(--color-bg-primary) 90%); diff --git a/external/ag-website-shared/src/components/site-header/SiteHeader.module.scss b/external/ag-website-shared/src/components/site-header/SiteHeader.module.scss index 8e5e0ac78df..a5f50bfe2f1 100644 --- a/external/ag-website-shared/src/components/site-header/SiteHeader.module.scss +++ b/external/ag-website-shared/src/components/site-header/SiteHeader.module.scss @@ -10,7 +10,8 @@ @media screen and (min-width: $breakpoint-docs-nav-medium) { position: sticky; top: 0; - z-index: 10001; // needed in order to prevent grid z-indexes overlapping on small height + width: 100%; + z-index: 10002; // needed in order to prevent grid z-indexes overlapping on small height } #{$selector-darkmode}:has([data-is-homepage='false']) &, diff --git a/external/ag-website-shared/src/components/trial-licence-form/TrialLicenceFormStudio.tsx b/external/ag-website-shared/src/components/trial-licence-form/TrialLicenceFormStudio.tsx new file mode 100644 index 00000000000..fb506d56f35 --- /dev/null +++ b/external/ag-website-shared/src/components/trial-licence-form/TrialLicenceFormStudio.tsx @@ -0,0 +1,319 @@ +import { Icon } from '@ag-website-shared/components/icon/Icon'; +import { PRIVACY_POLICY_URL } from '@ag-website-shared/constants'; +import { TRIAL_LICENCE_FORM_URL, ZI_FORM_ID } from '@constants'; +import { trackTrialLicenseFormError, trackTrialLicenseFormSuccess } from '@utils/analytics'; +import classnames from 'classnames'; +import { useCallback, useState } from 'react'; +import type { ChangeEventHandler, FormEventHandler, FunctionComponent } from 'react'; + +import { MESSAGES } from './Messages'; +import styles from './TrialLicenceForm.module.scss'; + +interface Props { + submitUrl?: string; +} + +type TrialFormState = 'success' | 'error' | 'loading' | 'idle'; + +const getFormErrorMessage = (message: string) => { + let errorMessage = MESSAGES.formErrorDefault; + + if (message === 'invalid arguments provided') { + errorMessage = MESSAGES.formErrorInvalidArguments; + } else if (message.includes('INVALID_EMAIL_ADDRESS')) { + // eg, "Error: Unable to create a lead for a trial LK for email @bc.com. Error: Insert failed. First exception on row 0; first error: INVALID_EMAIL_ADDRESS, Email: invalid email address: @bc.com: [Email]" + errorMessage = MESSAGES.formErrorInvalidEmail; + } else if (message.includes('Duplicate email')) { + // eg, "Error: Unable to create a lead for a trial LK for email something@somewhere.com. Error: Duplicate email" + errorMessage = MESSAGES.formErrorDuplicateEmail; + } + + return errorMessage; +}; + +const isEmailValid = (email: string) => { + const emailPattern = /^([a-zA-Z0-9._-]|\+)+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,63}$/; + return emailPattern.test(email); +}; + +const validateEmail = (email: string) => { + let validation = ''; + + if (!email) { + validation = MESSAGES.validationEmailRequired; + } else if (!isEmailValid(email)) { + validation = MESSAGES.validationEmailInvalid; + } + + return validation; +}; + +const validateRequired = (value: string) => { + let validation = ''; + if (value === '') { + validation = MESSAGES.validationRequiredField; + } + + return validation; +}; + +function useEmailValidation(initialValue: string = '') { + const [email, setEmail] = useState(initialValue); + const [emailError, setEmailError] = useState(validateEmail(initialValue)); + + const handleEmailChange: ChangeEventHandler = useCallback((e) => { + const value = e.target?.value; + setEmail(value); + setEmailError(validateEmail(value)); + }, []); + + return { + emailError, + email, + handleEmailChange, + }; +} + +function useRequiredValidation(initialValue: string = '') { + const [value, setValue] = useState(initialValue); + const [valueError, setValueError] = useState(validateRequired(initialValue)); + + const handleValueChange: ChangeEventHandler = useCallback((e) => { + const value = e.target?.value; + setValue(value); + setValueError(validateRequired(value)); + }, []); + + return { + valueError, + value, + handleValueChange, + }; +} + +async function submitTrialLicenceFormData({ + submitUrl = TRIAL_LICENCE_FORM_URL, + firstName, + lastName, + email, + company, +}: { + submitUrl?: string; + firstName: string; + lastName: string; + email: string; + company: string; +}) { + const response = await fetch(submitUrl, { + method: 'POST', + body: JSON.stringify({ data: { firstName, lastName, email, company } }), + headers: { + 'Content-Type': 'application/json', + }, + }); + const json = await response.json(); + + return json; +} + +function useTrialForm({ submitUrl }: Props) { + const [formState, setFormState] = useState('idle'); + const [formError, setFormError] = useState(''); + const [wasValidated, setWasValidated] = useState(false); + const { emailError: validatedEmailError, email, handleEmailChange } = useEmailValidation(); + const emailError = wasValidated && validatedEmailError ? validatedEmailError : ''; + + const { + value: firstName, + valueError: validatedFirstNameError, + handleValueChange: handleFirstNameChange, + } = useRequiredValidation(); + const firstNameError = wasValidated && validatedFirstNameError ? validatedFirstNameError : ''; + + const { + value: lastName, + valueError: validatedLastNameError, + handleValueChange: handleLastNameChange, + } = useRequiredValidation(); + const lastNameError = wasValidated && validatedLastNameError ? validatedLastNameError : ''; + + const handleFormSubmit: FormEventHandler = useCallback( + async (e) => { + e.preventDefault(); + setWasValidated(true); + + if (validatedEmailError || validatedFirstNameError || validatedLastNameError) { + setFormState('error'); + return; + } + + setFormError(''); + setFormState('loading'); + + const currentPage = window.location.pathname; + + try { + const company = (document.getElementById('company') as HTMLInputElement)?.value || ''; + const response = await submitTrialLicenceFormData({ submitUrl, firstName, lastName, email, company }); + + if (response.error) { + setFormState('error'); + const errorMessage = getFormErrorMessage(response.error.message); + setFormError(errorMessage); + trackTrialLicenseFormError({ + error: response.error.message, + errorType: 'api_error', + page: currentPage, + }); + } else { + setFormState('success'); + trackTrialLicenseFormSuccess({ + page: currentPage, + }); + } + } catch (e) { + console.error(e); + const errorMessage = MESSAGES.formErrorDefault; + setFormError(errorMessage); + trackTrialLicenseFormError({ + error: e instanceof Error ? e.message : 'Unknown error', + errorType: 'system_error', + page: currentPage, + }); + setFormState('error'); + } + }, + [validatedEmailError, validatedFirstNameError, validatedLastNameError, firstName, lastName, email] + ); + + return { + formState, + formError, + emailError, + email, + handleEmailChange, + firstName, + firstNameError, + handleFirstNameChange, + lastName, + lastNameError, + handleLastNameChange, + handleFormSubmit, + }; +} + +export const TrialLicenceFormStudio: FunctionComponent = ({ submitUrl }: Props) => { + const { + formState, + formError, + emailError, + email, + handleEmailChange, + firstName, + firstNameError, + handleFirstNameChange, + lastName, + lastNameError, + handleLastNameChange, + handleFormSubmit, + } = useTrialForm({ submitUrl }); + const hasFormError = Boolean(emailError || firstNameError || lastNameError); + + return ( +
+
+ + +
+ + + +

+ First name required +

+
+ +
+ + + +

Last name required

+
+
+ +
+ + + + + +

+ {emailError ? emailError : 'Email required'} +

+
+ +
+ + +

+ By submitting this form you agree to our Privacy Policy. +

+ + {formState === 'success' && ( +

+ + + Thank you. Please check your inbox to validate your email and receive your AG Studio{' '} + trial licence. + +

+ )} + + {formError && ( +

+ + {formError} +

+ )} +
+
+ ); +}; diff --git a/external/ag-website-shared/src/content/license-features/chartsFeaturesMatrix.json b/external/ag-website-shared/src/content/license-features/chartsFeaturesMatrix.json index fd5de22b743..97829fb49f6 100644 --- a/external/ag-website-shared/src/content/license-features/chartsFeaturesMatrix.json +++ b/external/ag-website-shared/src/content/license-features/chartsFeaturesMatrix.json @@ -369,6 +369,22 @@ } ] }, + { + "group": { + "name": "Server-Side Rendering" + }, + "items": [ + { + "label": { + "name": "Server-Side Rendering", + "link": "https://www.ag-grid.com/charts/r/server-side-rendering/" + }, + "community": false, + "enterprise": true, + "chartsGrid": true + } + ] + }, { "group": { "name": "Data" @@ -550,6 +566,15 @@ "enterprise": true, "chartsGrid": true }, + { + "label": { + "name": "Flash On Update", + "link": "https://www.ag-grid.com/charts/r/flash-on-update/" + }, + "community": false, + "enterprise": true, + "chartsGrid": true + }, { "label": { "name": "Navigator", @@ -559,6 +584,15 @@ "enterprise": true, "chartsGrid": true }, + { + "label": { + "name": "Range Buttons", + "link": "https://www.ag-grid.com/charts/r/range-controls/" + }, + "community": false, + "enterprise": true, + "chartsGrid": true + }, { "label": { "name": "Scrollbar", diff --git a/external/ag-website-shared/src/design-system/core/_breakpoints.scss b/external/ag-website-shared/src/design-system/core/_breakpoints.scss index c9ef5dbeff7..d377a7e1fc4 100644 --- a/external/ag-website-shared/src/design-system/core/_breakpoints.scss +++ b/external/ag-website-shared/src/design-system/core/_breakpoints.scss @@ -49,6 +49,8 @@ $pricing-small: 620px; $pricing-medium: 820px; $pricing-large: 1260px; +$studio-pricing-large: 1040px; + $changelog-pipeline-large: 980px; $policy-page-extra-large: 1400px; diff --git a/external/ag-website-shared/src/images/inline-svgs/ag-charts-logomark.svg b/external/ag-website-shared/src/images/inline-svgs/ag-charts-logomark.svg new file mode 100644 index 00000000000..3f7d67956f5 --- /dev/null +++ b/external/ag-website-shared/src/images/inline-svgs/ag-charts-logomark.svg @@ -0,0 +1,15 @@ + + + + + + + + + + diff --git a/external/ag-website-shared/src/utils/getArchiveUrl.ts b/external/ag-website-shared/src/utils/getArchiveUrl.ts index 8b723e7e591..8880ee41297 100644 --- a/external/ag-website-shared/src/utils/getArchiveUrl.ts +++ b/external/ag-website-shared/src/utils/getArchiveUrl.ts @@ -1,7 +1,7 @@ import type { Library } from '@ag-grid-types'; import { parseVersion } from '@ag-website-shared/utils/parseVersion'; import { versionIsGreaterOrEqual } from '@ag-website-shared/utils/versionIsGreaterOrEqual'; -import { LEGACY_CHARTS_SITE_URL, PRODUCTION_CHARTS_SITE_URL } from '@constants'; +import { LEGACY_CHARTS_SITE_URL, PRODUCTION_CHARTS_SITE_URL, PRODUCTION_STUDIO_SITE_URL } from '@constants'; import { pathJoin } from '@utils/pathJoin'; const FIRST_GRID_VERSION_WITH_HOMEPAGE = '27.3.0'; @@ -20,6 +20,8 @@ export const getArchiveUrl = ({ version, site }: { version: string; site: Librar let baseUrl = 'https://www.ag-grid.com'; if (site === 'charts') { baseUrl = (major === 10 && minor >= 1) || major > 10 ? PRODUCTION_CHARTS_SITE_URL : LEGACY_CHARTS_SITE_URL; + } else if (site === 'studio') { + baseUrl = PRODUCTION_STUDIO_SITE_URL; } return pathJoin(baseUrl, archiveBaseUrl, version); diff --git a/external/ag-website-shared/src/utils/getChangelogUrl.ts b/external/ag-website-shared/src/utils/getChangelogUrl.ts index 6bdab315ed3..a545986db7b 100644 --- a/external/ag-website-shared/src/utils/getChangelogUrl.ts +++ b/external/ag-website-shared/src/utils/getChangelogUrl.ts @@ -1,5 +1,5 @@ import type { Library } from '@ag-grid-types'; -import { PRODUCTION_CHARTS_SITE_URL, PRODUCTION_GRID_SITE_URL } from '@constants'; +import { PRODUCTION_CHARTS_SITE_URL, PRODUCTION_GRID_SITE_URL, PRODUCTION_STUDIO_SITE_URL } from '@constants'; import { pathJoin } from '@utils/pathJoin'; interface Params { @@ -10,7 +10,14 @@ interface Params { export function getChangelogUrl({ site, version }: Params) { const changelogBaseUrl = `/changelog/?fixVersion=${version}`; - const baseUrl = site === 'charts' ? PRODUCTION_CHARTS_SITE_URL : PRODUCTION_GRID_SITE_URL; + let baseUrl: string; + if (site === 'charts') { + baseUrl = PRODUCTION_CHARTS_SITE_URL; + } else if (site === 'studio') { + baseUrl = PRODUCTION_STUDIO_SITE_URL; + } else { + baseUrl = PRODUCTION_GRID_SITE_URL; + } return pathJoin(baseUrl, changelogBaseUrl); } From 827bd8dbdc350ad9bccfda4550af64c1ec82f452 Mon Sep 17 00:00:00 2001 From: Victor Musienko <8777372+sdwvit@users.noreply.github.com> Date: Fri, 8 May 2026 14:35:59 +0200 Subject: [PATCH 10/12] [AG-17294] Fix(toolbar): legacy Alpine font weight and button hover (#13702) * AG-17294 Fix legacy Alpine toolbar font weight and button hover - Add --ag-header-font-weight: 700 to Alpine legacy variables so toolbar matches header - Restore --ag-icon-button-hover-color on button hover (was replaced with --ag-foreground-color, losing the blue active-color hover in Alpine) * AG-17294 Refactor Alpine toolbar font weight and fix group panel padding - Use direct font-weight: 700 rule on .ag-toolbar in Alpine _index.scss instead of declaring --ag-header-font-weight variable - Restore padding-left: var(--ag-cell-horizontal-padding) to .ag-column-drop-horizontal in legacy themes (_column-drop.scss); the toolbar zeroes it via .ag-toolbar-panel override in _toolbar.scss * AG-17294 Fix legacy toolbar: Alpine font-weight, group panel padding, toolbar-panel padding - Alpine toolbar font weight: direct font-weight: 700 on .ag-toolbar in _index.scss, no new variable - Group panel drop zone: restore padding-left in _column-drop.scss for standalone use - Toolbar panel: remove own horizontal padding (ag-toolbar-item margin provides spacing); keep padding: 0 on drop zone inside panel --- .../styles/src/internal/base/parts/_column-drop.scss | 6 ++++++ .../styles/src/internal/base/parts/_toolbar.scss | 10 ++++++---- .../styles/src/internal/themes/alpine/_index.scss | 4 ++++ packages/ag-grid-enterprise/src/toolbar/agToolbar.css | 3 +++ 4 files changed, 19 insertions(+), 4 deletions(-) diff --git a/community-modules/styles/src/internal/base/parts/_column-drop.scss b/community-modules/styles/src/internal/base/parts/_column-drop.scss index 5e93dfd36c3..cc54302a525 100644 --- a/community-modules/styles/src/internal/base/parts/_column-drop.scss +++ b/community-modules/styles/src/internal/base/parts/_column-drop.scss @@ -37,6 +37,12 @@ color: var(--ag-secondary-foreground-color); height: var(--ag-header-height); border-bottom: var(--ag-borders) var(--ag-border-color); + + @include ag.unthemed-rtl( + ( + padding-left: var(--ag-cell-horizontal-padding), + ) + ); } .ag-column-drop-horizontal-half-width:not(:last-child) { diff --git a/community-modules/styles/src/internal/base/parts/_toolbar.scss b/community-modules/styles/src/internal/base/parts/_toolbar.scss index 225fabb4c4d..c3e879213e9 100644 --- a/community-modules/styles/src/internal/base/parts/_toolbar.scss +++ b/community-modules/styles/src/internal/base/parts/_toolbar.scss @@ -45,14 +45,14 @@ } .ag-toolbar-button-wrapper:hover { - background-color: transparent; - color: var(--ag-foreground-color); + background-color: var(--ag-icon-button-hover-background-color, transparent); + color: var(--ag-icon-button-hover-color, var(--ag-foreground-color)); } // stylelint-disable-next-line selector-max-specificity .ag-toolbar-button-wrapper:hover .ag-toolbar-button, .ag-toolbar-button-wrapper:hover .ag-toolbar-button .ag-icon { - color: var(--ag-foreground-color); + color: var(--ag-icon-button-hover-color, var(--ag-foreground-color)); } // stylelint-disable-next-line selector-max-specificity @@ -83,7 +83,6 @@ display: inline-flex; flex: 1; min-width: 235px; - padding: 0 calc(var(--ag-grid-size) * 2); } .ag-toolbar-input { @@ -160,6 +159,9 @@ background-color: transparent; border-bottom: none; padding: 0; + font-weight: normal; + font-size: var(--ag-font-size); + font-family: var(--ag-font-family); } // stylelint-disable-next-line selector-max-specificity diff --git a/community-modules/styles/src/internal/themes/alpine/_index.scss b/community-modules/styles/src/internal/themes/alpine/_index.scss index 43a71534870..5146a38dfa4 100644 --- a/community-modules/styles/src/internal/themes/alpine/_index.scss +++ b/community-modules/styles/src/internal/themes/alpine/_index.scss @@ -17,6 +17,10 @@ color: var(--ag-header-foreground-color); } + .ag-toolbar { + font-weight: 700; + } + .ag-row { font-size: calc(var(--ag-font-size) + 1px); } diff --git a/packages/ag-grid-enterprise/src/toolbar/agToolbar.css b/packages/ag-grid-enterprise/src/toolbar/agToolbar.css index 783aac88cdf..7eba60759ab 100644 --- a/packages/ag-grid-enterprise/src/toolbar/agToolbar.css +++ b/packages/ag-grid-enterprise/src/toolbar/agToolbar.css @@ -150,6 +150,9 @@ background-color: transparent; border-bottom: none; padding: 0; + font-weight: var(--ag-cell-font-weight); + font-size: var(--ag-cell-font-size); + font-family: var(--ag-cell-font-family); } /* stylelint-disable-next-line selector-max-specificity */ From a8a5c3603b5f66a78d0fc16fb47536c6a236a07d Mon Sep 17 00:00:00 2001 From: Tak Tran Date: Fri, 8 May 2026 14:21:19 +0100 Subject: [PATCH 11/12] AG-3390 - Fix link checker readable state loss (#13706) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * AG-3390 - Fix link checker losing tags across stream-chunk boundaries The HTML anchor parser declared its state (prev/active/str) inside the 'readable' event handler, so the state reset every time the event fired. For files larger than the stream's high-water mark, readable fires more than once and any tag straddling a buffer boundary was silently dropped — producing false-positive "could not be resolved" errors for links whose target anchor exists on the page. Hoist the state into the surrounding closure and consume the stream via `for await…of` so it persists across all chunks. * AG-3390 - Remove temp fix for link checker issues --- .../plugins/agLinkChecker.ts | 68 ++++++++----------- 1 file changed, 30 insertions(+), 38 deletions(-) diff --git a/external/ag-website-shared/plugins/agLinkChecker.ts b/external/ag-website-shared/plugins/agLinkChecker.ts index 9f98d62b8a1..a86689823e4 100644 --- a/external/ag-website-shared/plugins/agLinkChecker.ts +++ b/external/ag-website-shared/plugins/agLinkChecker.ts @@ -18,7 +18,6 @@ const HREF_PATTERNS_TO_IGNORE = [ '#reference-', // API references, as it is rendered client side '#example-', // Example references, as they aren't headings '#contact-section', // Contact form on about page - '#client-side', // TODO: Remove this once CI failure is resolved ]; const isCI = @@ -92,46 +91,39 @@ const checkLinks = async (dir: string, files: string[], options: Options) => { const anchorTags: string[] = []; // uses a stream as ingesting the entire file was causing memory crashes. - const fileStream = fs.createReadStream(join(dir, filePath)); - await new Promise((resolve) => { - fileStream.on('readable', function () { - let prev; - let active = false; - let str = ''; - let chunk; - while (null !== (chunk = fileStream.read(16384))) { - const strChunk = chunk.toString(); - for (let i = 0; i < strChunk.length; i++) { - const chr = strChunk[i]; - if (!prev || prev === '<') { - if (chr === 'a') { - active = true; - } - } else if (active && chr === '>') { - active = false; - anchorTags.push(str); - str = ''; - } - - if (active) { - str += chr; - - if (str.length >= 2 && !str.startsWith('a ')) { - active = false; - str = ''; - } - } - - prev = chr; + // State is held in the closure here (not inside an event handler) so it + // survives across stream chunks — otherwise tags that straddle a chunk + // boundary are silently dropped. + const fileStream = fs.createReadStream(join(dir, filePath), { encoding: 'utf8' }); + let prev: string | undefined; + let active = false; + let str = ''; + for await (const chunk of fileStream) { + const strChunk = chunk as string; + for (let i = 0; i < strChunk.length; i++) { + const chr = strChunk[i]; + if (!prev || prev === '<') { + if (chr === 'a') { + active = true; } + } else if (active && chr === '>') { + active = false; + anchorTags.push(str); + str = ''; } - }); - fileStream.on('end', () => { - resolve(); - }); - }); - fileStream.close(); + if (active) { + str += chr; + + if (str.length >= 2 && !str.startsWith('a ')) { + active = false; + str = ''; + } + } + + prev = chr; + } + } anchorTags.forEach((tag) => { const regex = /.*href="(.*?)".*/g; From 966dbeea8090b87f5ced9fcc476b83ef6574ca6e Mon Sep 17 00:00:00 2001 From: Victor Musienko <8777372+sdwvit@users.noreply.github.com> Date: Fri, 8 May 2026 15:31:28 +0200 Subject: [PATCH 12/12] [AG-17295] Fix(styles): drop zone pill font weight (#13701) * AG-17295 Fix drop zone pill font weight inheriting from toolbar * Fix broken #client-side anchor in row-models page The Client-Side heading inside a list item did not generate an HTML anchor, causing link validation to fail for all pages referencing /row-models/#client-side. Added explicit Markdoc anchor tag. --- .../styles/src/internal/base/parts/_column-drop.scss | 1 + .../ag-grid-docs/src/content/docs/row-models/index.mdoc | 2 +- packages/ag-grid-enterprise/src/widgets/pillDropZonePanel.css | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/community-modules/styles/src/internal/base/parts/_column-drop.scss b/community-modules/styles/src/internal/base/parts/_column-drop.scss index cc54302a525..cddc6da54a8 100644 --- a/community-modules/styles/src/internal/base/parts/_column-drop.scss +++ b/community-modules/styles/src/internal/base/parts/_column-drop.scss @@ -7,6 +7,7 @@ height: calc(var(--ag-grid-size) * 4); padding: 0 calc(var(--ag-grid-size) * 0.5); border: 1px solid var(--ag-chip-border-color); + font-weight: normal; } @include ag.keyboard-focus((ag-column-drop-cell), 2px); diff --git a/documentation/ag-grid-docs/src/content/docs/row-models/index.mdoc b/documentation/ag-grid-docs/src/content/docs/row-models/index.mdoc index 9af4d064e7f..640bfb5cb83 100644 --- a/documentation/ag-grid-docs/src/content/docs/row-models/index.mdoc +++ b/documentation/ag-grid-docs/src/content/docs/row-models/index.mdoc @@ -15,7 +15,7 @@ The grid comes with four row models: The Client-Side Row Model deals with client-side data. The Server-Side, Infinite and Viewport Row Models deal with server-side data. The following is a summary of each: -- ## Client-Side +- ## Client-Side {% #client-side %} This is the default. The grid will load all of the data into the grid in one go. The grid can then perform filtering, sorting, grouping, pivoting and aggregation all in browser memory. diff --git a/packages/ag-grid-enterprise/src/widgets/pillDropZonePanel.css b/packages/ag-grid-enterprise/src/widgets/pillDropZonePanel.css index f2a30677509..40b30cde748 100644 --- a/packages/ag-grid-enterprise/src/widgets/pillDropZonePanel.css +++ b/packages/ag-grid-enterprise/src/widgets/pillDropZonePanel.css @@ -17,6 +17,7 @@ align-items: center; background-color: var(--ag-column-drop-cell-background-color); color: var(--ag-column-drop-cell-text-color); + font-weight: normal; border-radius: 500px; padding: calc(var(--ag-spacing) * 0.25); padding-left: calc(var(--ag-spacing) * 0.75);