diff --git a/.stylelintrc.js b/.stylelintrc.js
index 27288369930..a29dc78b99d 100644
--- a/.stylelintrc.js
+++ b/.stylelintrc.js
@@ -46,6 +46,7 @@ module.exports = {
'.ag-layout-print',
'.ag-layout-normal',
'.ag-layout-auto-height',
+ '.ag-tool-panel-animating',
],
},
],
diff --git a/community-modules/styles/src/internal/base/_base-variables.scss b/community-modules/styles/src/internal/base/_base-variables.scss
index c64f12de102..7a49bdffb96 100644
--- a/community-modules/styles/src/internal/base/_base-variables.scss
+++ b/community-modules/styles/src/internal/base/_base-variables.scss
@@ -214,6 +214,7 @@
--ag-menu-min-width: 181px;
--ag-side-bar-panel-width: 200px;
+ --ag-side-bar-panel-animation-duration: 0s;
--ag-font-family: 'Helvetica Neue', sans-serif;
--ag-font-size: 14px;
diff --git a/community-modules/styles/src/internal/base/parts/_common-structural.scss b/community-modules/styles/src/internal/base/parts/_common-structural.scss
index e8ee8ca432e..816e5ba752b 100644
--- a/community-modules/styles/src/internal/base/parts/_common-structural.scss
+++ b/community-modules/styles/src/internal/base/parts/_common-structural.scss
@@ -1595,9 +1595,7 @@
// ****************************
// */
.ag-tool-panel-wrapper {
- display: flex;
- overflow-y: auto;
- overflow-x: hidden;
+ overflow: hidden;
cursor: default;
@include ag.selectable(none);
}
diff --git a/community-modules/styles/src/internal/base/parts/_sidebar.scss b/community-modules/styles/src/internal/base/parts/_sidebar.scss
index defb48df81c..cb2919e31ee 100644
--- a/community-modules/styles/src/internal/base/parts/_sidebar.scss
+++ b/community-modules/styles/src/internal/base/parts/_sidebar.scss
@@ -10,6 +10,24 @@
background-color: var(--ag-control-panel-background-color);
}
+ .ag-tool-panel-content {
+ display: flex;
+ height: 100%;
+ overflow: hidden auto;
+ }
+
+ .ag-tool-panel-wrapper.ag-tool-panel-animating {
+ // !important required to override .ag-hidden to tool panel remains visible while animating
+ display: block !important;
+ transition: width var(--ag-side-bar-panel-animation-duration) ease-in-out;
+ }
+
+ @media (prefers-reduced-motion: reduce) {
+ .ag-tool-panel-wrapper.ag-tool-panel-animating {
+ transition: none;
+ }
+ }
+
.ag-tool-panel-external {
display: flex;
flex-direction: row;
diff --git a/documentation/ag-grid-docs/src/content/api-documentation/theming-api/properties.json b/documentation/ag-grid-docs/src/content/api-documentation/theming-api/properties.json
index 3359dabd96f..fda3e4bc7b6 100644
--- a/documentation/ag-grid-docs/src/content/api-documentation/theming-api/properties.json
+++ b/documentation/ag-grid-docs/src/content/api-documentation/theming-api/properties.json
@@ -172,6 +172,7 @@
"description": "Style [Tool Panels](./tool-panel/), see also [Theming: Customising Tool Panels](./theming-tool-panels/)"
},
"sideBarBackgroundColor": {},
+ "sideBarPanelAnimationDuration": {},
"sideBarPanelWidth": {},
"sideButtonBackgroundColor": {},
"sideButtonBarBackgroundColor": {},
diff --git a/documentation/ag-grid-docs/src/content/docs/side-bar/_examples/animation/example.spec.ts b/documentation/ag-grid-docs/src/content/docs/side-bar/_examples/animation/example.spec.ts
new file mode 100644
index 00000000000..70f89aa9d01
--- /dev/null
+++ b/documentation/ag-grid-docs/src/content/docs/side-bar/_examples/animation/example.spec.ts
@@ -0,0 +1,10 @@
+import { ensureGridReady, test, waitForGridContent } from '@utils/grid/test-utils';
+
+test.agExample(import.meta, () => {
+ test.eachFramework('Example', async ({ page }) => {
+ // PLACEHOLDER - MINIMAL TEST TO ENSURE GRID LOADS WITHOUT ERRORS
+ await ensureGridReady(page);
+ await waitForGridContent(page);
+ // END PLACEHOLDER
+ });
+});
diff --git a/documentation/ag-grid-docs/src/content/docs/side-bar/_examples/animation/index.html b/documentation/ag-grid-docs/src/content/docs/side-bar/_examples/animation/index.html
new file mode 100644
index 00000000000..378fad58398
--- /dev/null
+++ b/documentation/ag-grid-docs/src/content/docs/side-bar/_examples/animation/index.html
@@ -0,0 +1 @@
+
diff --git a/documentation/ag-grid-docs/src/content/docs/side-bar/_examples/animation/main.ts b/documentation/ag-grid-docs/src/content/docs/side-bar/_examples/animation/main.ts
new file mode 100644
index 00000000000..4c16e73bdad
--- /dev/null
+++ b/documentation/ag-grid-docs/src/content/docs/side-bar/_examples/animation/main.ts
@@ -0,0 +1,42 @@
+import type { ColDef, GridApi, GridOptions } from 'ag-grid-community';
+import { ClientSideRowModelModule, ModuleRegistry, ValidationModule, createGrid, themeQuartz } from 'ag-grid-community';
+import { ColumnsToolPanelModule, FiltersToolPanelModule, SideBarModule } from 'ag-grid-enterprise';
+
+ModuleRegistry.registerModules([
+ ClientSideRowModelModule,
+ ColumnsToolPanelModule,
+ FiltersToolPanelModule,
+ SideBarModule,
+ ...(process.env.NODE_ENV !== 'production' ? [ValidationModule] : []),
+]);
+
+const myTheme = themeQuartz.withParams({
+ sideBarPanelAnimationDuration: 0.3,
+});
+
+const columnDefs: ColDef[] = [{ field: 'athlete' }, { field: 'country' }, { field: 'sport' }, { field: 'year' }];
+
+let gridApi: GridApi;
+
+const gridOptions: GridOptions = {
+ theme: myTheme,
+ columnDefs: columnDefs,
+ defaultColDef: {
+ flex: 1,
+ filter: true,
+ sortable: true,
+ resizable: true,
+ },
+ enableFilterHandlers: true,
+ sideBar: ['columns', 'filters-new'],
+};
+
+// setup the grid after the page has finished loading
+document.addEventListener('DOMContentLoaded', function () {
+ 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/side-bar/index.mdoc b/documentation/ag-grid-docs/src/content/docs/side-bar/index.mdoc
index 2b5ade6937a..e47c986152e 100644
--- a/documentation/ag-grid-docs/src/content/docs/side-bar/index.mdoc
+++ b/documentation/ag-grid-docs/src/content/docs/side-bar/index.mdoc
@@ -236,6 +236,18 @@ const gridOptions = {
See the [Columns Tool Panel](./tool-panel-columns/) documentation for the full list of possible parameters to this Tool Panel.
+## Animation
+
+By default, sidebar panels open and close instantly. You can enable a smooth slide animation using the [Theming API](./theming-api/) parameter `sideBarPanelAnimationDuration`. Set it to a value in seconds:
+
+```js
+const myTheme = themeQuartz.withParams({
+ sideBarPanelAnimationDuration: 0.3,
+});
+```
+
+{% gridExampleRunner title="Side Bar Animation" name="animation" exampleHeight=400 /%}
+
## Side Bar API
{% note %}
diff --git a/documentation/ag-grid-docs/src/content/docs/tree-data-paths/index.mdoc b/documentation/ag-grid-docs/src/content/docs/tree-data-paths/index.mdoc
index 71ad2d0e2f8..fb1c3bc1e86 100644
--- a/documentation/ag-grid-docs/src/content/docs/tree-data-paths/index.mdoc
+++ b/documentation/ag-grid-docs/src/content/docs/tree-data-paths/index.mdoc
@@ -114,4 +114,3 @@ const gridOptions = {
Refer to the [Aggregation](./aggregation/) page for more details, and [Editing Groups](./grouping-edit/)
for editing aggregated values with cascading updates to children.
-
diff --git a/documentation/ag-grid-docs/src/content/docs/tree-data-self-referential/index.mdoc b/documentation/ag-grid-docs/src/content/docs/tree-data-self-referential/index.mdoc
index 1e7db01a67d..803cabadfe6 100644
--- a/documentation/ag-grid-docs/src/content/docs/tree-data-self-referential/index.mdoc
+++ b/documentation/ag-grid-docs/src/content/docs/tree-data-self-referential/index.mdoc
@@ -100,4 +100,3 @@ const gridOptions = {
Refer to the [Aggregation](./aggregation/) page for more details, and [Editing Groups](./grouping-edit/)
for editing aggregated values with cascading updates to children.
-
diff --git a/external/ag-shared/.gitrepo b/external/ag-shared/.gitrepo
index 67a2682b476..83d2e9f0948 100644
--- a/external/ag-shared/.gitrepo
+++ b/external/ag-shared/.gitrepo
@@ -6,7 +6,7 @@
[subrepo]
remote = https://github.com/ag-grid/ag-shared.git
branch = latest
- commit = f999ddabe0d121bf65607f7c2bdab710335fab06
- parent = 7aceeb9566b3b77349ffc42d782830af8f155b08
+ commit = 4d82650c622e0433d9b58410adc1c88a00608f9d
+ parent = e95f2f1e806d05dad1435a1336724ed0b7d9c0e6
method = rebase
cmdver = 0.4.9
diff --git a/external/ag-shared/scripts/install-for-cloud/install-for-cloud.sh b/external/ag-shared/scripts/install-for-cloud/install-for-cloud.sh
index e4333761809..a6ff48f6780 100755
--- a/external/ag-shared/scripts/install-for-cloud/install-for-cloud.sh
+++ b/external/ag-shared/scripts/install-for-cloud/install-for-cloud.sh
@@ -95,21 +95,6 @@ install_nx() {
return 0
}
-opt_enable_direnv() {
- if ! command -v direnv &> /dev/null; then
- log_info "direnv is not installed, skipping enablement"
- return 0
- fi
-
- if direnv allow; then
- log_info "direnv enabled successfully"
- return 0
- else
- log_error "Failed to enable direnv"
- return 2
- fi
-}
-
# Function to install yarn and initial dependencies
install_yarn() {
# Create .yarnrc to ignore engine checks
@@ -258,10 +243,6 @@ main() {
fi
fi
- if ! opt_enable_direnv; then
- exit 2
- fi
-
# Verify nx is available after installation
if command -v nx &> /dev/null; then
log_info "Installation completed successfully - nx is available"
diff --git a/external/ag-shared/scripts/snyk/snyk-to-ctrf-command.mjs b/external/ag-shared/scripts/snyk/snyk-to-ctrf-command.mjs
index 186610ce79e..42c6154000c 100644
--- a/external/ag-shared/scripts/snyk/snyk-to-ctrf-command.mjs
+++ b/external/ag-shared/scripts/snyk/snyk-to-ctrf-command.mjs
@@ -22,7 +22,20 @@ if (!fs.existsSync(snykPath)) {
(async () => {
console.log(`Snyk JSON file: ${snykPath}`);
const snykJson = fs.readFileSync(snykPath, 'utf-8');
- const snykData = JSON.parse(snykJson);
+ let snykData;
+ try {
+ snykData = JSON.parse(snykJson);
+ } catch (e) {
+ // Newer Snyk CLI versions append error objects after the main JSON array
+ // when workspace paths fail (e.g. root with "Forbidden"). Extract first document.
+ const position = e.message.match(/at position (\d+)/)?.[1];
+ if (!position) {
+ throw e;
+ }
+
+ console.log(`::warning:: Failed to parse Snyk JSON (${SNYK_JSON_FILE}). Attempting to extract valid JSON portion up to position ${position} (${e.message})`);
+ snykData = JSON.parse(snykJson.slice(0, parseInt(position, 10)));
+ }
const ctrf = convertToCtrf(snykData);
fs.mkdirSync(path.dirname(ctrfPath), { recursive: true });
diff --git a/package.json b/package.json
index 58423ff3da9..87e72844d9c 100644
--- a/package.json
+++ b/package.json
@@ -118,6 +118,7 @@
"testing/vue-package-tests",
"testing/accessibility",
"testing/csp",
+ "testing/vue3-tests",
"testing/public-recipes/e2e",
"external/ag-shared"
],
diff --git a/packages/ag-grid-community/src/main-internal.ts b/packages/ag-grid-community/src/main-internal.ts
index 52e474b28bb..77efcbbc78d 100644
--- a/packages/ag-grid-community/src/main-internal.ts
+++ b/packages/ag-grid-community/src/main-internal.ts
@@ -447,7 +447,7 @@ export type { CellNavigationService } from './navigation/cellNavigationService';
export type { HeaderNavigationService } from './navigation/headerNavigationService';
export type { NavigationService } from './navigation/navigationService';
export type { PageBoundsService } from './pagination/pageBoundsService';
-export { _BOOLEAN_MIXED_GRID_OPTIONS, _GET_ALL_GRID_OPTIONS } from './propertyKeys';
+export { _BOOLEAN_MIXED_GRID_OPTIONS, _GET_ALL_GRID_OPTIONS, _GET_SHALLOW_GRID_OPTIONS } from './propertyKeys';
export { _PUBLIC_EVENT_HANDLERS_MAP } from './publicEventHandlersMap';
export type { CellCtrl, ICellComp } from './rendering/cell/cellCtrl';
export type { CheckboxCellRenderer } from './rendering/cellRenderers/checkboxCellRenderer';
diff --git a/packages/ag-grid-community/src/propertyKeys.ts b/packages/ag-grid-community/src/propertyKeys.ts
index d473c08c50d..fcf770a3b2c 100644
--- a/packages/ag-grid-community/src/propertyKeys.ts
+++ b/packages/ag-grid-community/src/propertyKeys.ts
@@ -422,3 +422,12 @@ export const _GET_ALL_GRID_OPTIONS: () => GridOptionKey[] = () => [
..._BOOLEAN_MIXED_GRID_OPTIONS,
...OTHER_GRID_OPTIONS,
];
+
+// Options that only need shallow (reference) watching (only Vue atm) — primitives and functions
+export const _GET_SHALLOW_GRID_OPTIONS: () => GridOptionKey[] = () => [
+ ...STRING_GRID_OPTIONS,
+ ..._NUMBER_GRID_OPTIONS,
+ ..._FUNCTION_GRID_OPTIONS,
+ ..._BOOLEAN_GRID_OPTIONS,
+ ..._BOOLEAN_MIXED_GRID_OPTIONS,
+];
diff --git a/packages/ag-grid-community/src/theming/core/core-css.ts b/packages/ag-grid-community/src/theming/core/core-css.ts
index b05d426937f..b8456c85240 100644
--- a/packages/ag-grid-community/src/theming/core/core-css.ts
+++ b/packages/ag-grid-community/src/theming/core/core-css.ts
@@ -478,6 +478,13 @@ export interface CoreParams extends SharedThemeParams {
*/
sideBarPanelWidth: LengthValue;
+ /**
+ * Duration of the animation when a sidebar panel opens or closes. Set to 0
+ * to disable animations. Automatically disabled if the user has requested
+ * reduced motion in their OS accessibility settings.
+ */
+ sideBarPanelAnimationDuration: DurationValue;
+
/**
* Borders between the grid and side panels including the column and filter tool bars, and chart settings
*/
@@ -627,6 +634,7 @@ export const coreDefaults: Readonly> =
pinnedRowBorder: true,
sidePanelBorder: true,
sideBarPanelWidth: 250,
+ sideBarPanelAnimationDuration: 0,
sideBarBackgroundColor: {
ref: 'chromeBackgroundColor',
},
diff --git a/packages/ag-grid-enterprise/src/sideBar/agSideBar.css b/packages/ag-grid-enterprise/src/sideBar/agSideBar.css
index 05053dbd0d0..b9b5b3eef3c 100644
--- a/packages/ag-grid-enterprise/src/sideBar/agSideBar.css
+++ b/packages/ag-grid-enterprise/src/sideBar/agSideBar.css
@@ -1,10 +1,27 @@
.ag-tool-panel-wrapper {
- display: flex;
- overflow: hidden auto;
+ overflow: hidden;
user-select: none;
width: var(--ag-side-bar-panel-width);
}
+.ag-tool-panel-content {
+ display: flex;
+ height: 100%;
+ overflow: hidden auto;
+}
+
+.ag-tool-panel-wrapper.ag-tool-panel-animating {
+ /* !important required to override .ag-hidden to tool panel remains visible while animating */
+ display: block !important;
+ transition: width var(--ag-side-bar-panel-animation-duration) ease-in-out;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .ag-tool-panel-wrapper.ag-tool-panel-animating {
+ transition: none;
+ }
+}
+
.ag-tool-panel-external {
display: flex;
flex-direction: row;
diff --git a/packages/ag-grid-enterprise/src/sideBar/agSideBar.ts b/packages/ag-grid-enterprise/src/sideBar/agSideBar.ts
index 9543530667b..46fd86efe62 100644
--- a/packages/ag-grid-enterprise/src/sideBar/agSideBar.ts
+++ b/packages/ag-grid-enterprise/src/sideBar/agSideBar.ts
@@ -387,9 +387,16 @@ class AgSideBar extends Component implements ISideBar, FocusableContainer {
return;
}
+ const switchingToolPanel = !!key && !!currentlyOpenedKey;
+ const skipAnimation = switchingToolPanel || source === 'sideBarInitializing';
+
for (const wrapper of this.toolPanelWrappers) {
const show = key === wrapper.getToolPanelId();
- wrapper.setDisplayed(show);
+ if (skipAnimation) {
+ wrapper.setDisplayed(show);
+ } else {
+ wrapper.animateDisplayed(show);
+ }
}
const newlyOpenedKey = this.openedItem();
diff --git a/packages/ag-grid-enterprise/src/sideBar/toolPanelWrapper.ts b/packages/ag-grid-enterprise/src/sideBar/toolPanelWrapper.ts
index 1a69322633a..ee213269d8e 100644
--- a/packages/ag-grid-enterprise/src/sideBar/toolPanelWrapper.ts
+++ b/packages/ag-grid-enterprise/src/sideBar/toolPanelWrapper.ts
@@ -7,7 +7,7 @@ import type {
UserCompDetails,
UserComponentFactory,
} from 'ag-grid-community';
-import { Component } from 'ag-grid-community';
+import { Component, RefPlaceholder } from 'ag-grid-community';
import { AgHorizontalResize } from './agHorizontalResize';
@@ -28,13 +28,23 @@ const ToolPanelElement: ElementParams = {
tag: 'div',
cls: 'ag-tool-panel-wrapper',
role: 'tabpanel',
+ children: [
+ {
+ tag: 'div',
+ cls: 'ag-tool-panel-content',
+ ref: 'eContent',
+ },
+ ],
};
+
export class ToolPanelWrapper extends Component {
+ private readonly eContent: HTMLElement = RefPlaceholder;
private toolPanelCompInstance: IToolPanelComp | undefined;
private toolPanelId: string;
private resizeBar: AgHorizontalResize;
private width: number | undefined;
private params: IToolPanelParams;
+ private animationId: number = 0;
constructor() {
super(ToolPanelElement);
@@ -85,7 +95,8 @@ export class ToolPanelWrapper extends Component {
private setToolPanelComponent(compInstance: IToolPanelComp): void {
this.toolPanelCompInstance = compInstance;
- this.appendChild(compInstance.getGui());
+ const { eContent } = this;
+ eContent.appendChild(compInstance.getGui());
this.addDestroyFunc(() => {
this.destroyBean(compInstance);
});
@@ -111,4 +122,53 @@ export class ToolPanelWrapper extends Component {
public refresh(): void {
this.toolPanelCompInstance?.refresh(this.params);
}
+
+ public animateDisplayed(displayed: boolean): void {
+ if (this.isDisplayed() === displayed) {
+ return;
+ }
+
+ const eGui = this.getGui();
+
+ const savedInlineWidth = eGui.style.width;
+ const durationStr = getComputedStyle(eGui).getPropertyValue('--ag-side-bar-panel-animation-duration').trim();
+ this.setDisplayed(displayed);
+
+ if (!parseFloat(durationStr)) {
+ return;
+ }
+
+ const id = ++this.animationId;
+ const { eContent } = this;
+
+ eGui.classList.add('ag-tool-panel-animating');
+ const fullWidth = eGui.offsetWidth;
+ const fromWidth = displayed ? 0 : fullWidth;
+ const toWidth = displayed ? fullWidth : 0;
+
+ eContent.style.minWidth = `${fullWidth}px`;
+
+ // disable transition, force reflow, and re-enable to synchronously start an animation
+ eGui.style.transition = 'none';
+ eGui.style.width = `${fromWidth}px`;
+ const _ = eGui.offsetWidth;
+ eGui.style.transition = '';
+
+ eGui.style.width = `${toWidth}px`;
+
+ const cleanup = () => {
+ if (this.animationId === id) {
+ eGui.classList.remove('ag-tool-panel-animating');
+ eContent.style.minWidth = '';
+ eGui.style.width = savedInlineWidth;
+ }
+ };
+
+ // Don't rely on the transition end event alone for cleanup because
+ // transitions might have been disabled by application or user CSS
+ // Note: the timeout needs to be long enough to fire after the transitionstart event
+ const fallbackTimeout = setTimeout(cleanup, 100);
+ eGui.addEventListener('transitionstart', () => clearTimeout(fallbackTimeout), { once: true });
+ eGui.addEventListener('transitionend', cleanup, { once: true });
+ }
}
diff --git a/packages/ag-grid-vue3/src/components/AgGridVue.vue b/packages/ag-grid-vue3/src/components/AgGridVue.vue
index 293a130b82c..a8eab321d03 100644
--- a/packages/ag-grid-vue3/src/components/AgGridVue.vue
+++ b/packages/ag-grid-vue3/src/components/AgGridVue.vue
@@ -5,7 +5,7 @@ import { VueFrameworkOverrides } from '@/components/VueFrameworkOverrides';
import type { Props } from '@/components/utils';
import { debounce, deepToRaw, getProps } from '@/components/utils';
import type { Ref } from 'vue';
-import { getCurrentInstance, markRaw, onMounted, onUnmounted, ref, toRaw, toRefs, useTemplateRef, watch } from 'vue';
+import { getCurrentInstance, markRaw, onMounted, onUnmounted, shallowRef, toRefs, useTemplateRef, watch } from 'vue';
import type { AgEventType, GridApi, GridOptions, IRowNode } from 'ag-grid-community';
import {
@@ -14,6 +14,7 @@ import {
RowApiModule,
_PUBLIC_EVENT_HANDLERS_MAP,
_GET_ALL_GRID_OPTIONS,
+ _GET_SHALLOW_GRID_OPTIONS,
_combineAttributesAndGridOptions,
_processOnChange,
_warn,
@@ -24,36 +25,45 @@ const props = withDefaults(defineProps>(), getProps());
const rootRef = useTemplateRef('root');
-const api: Ref = ref(undefined);
-const gridCreated: Ref = ref(false);
-const isDestroyed: Ref = ref(false);
-const gridReadyFired: Ref = ref(false);
-const batchChanges: Ref<{ [key: string]: any }> = ref({});
-const batchTimeout: Ref = ref(null);
+// shallowRef avoids deep reactive proxying — grid API and simple flags only change at the top level
+const api: Ref = shallowRef(undefined);
+const gridCreated = shallowRef(false);
+const isDestroyed = shallowRef(false);
+const gridReadyFired = shallowRef(false);
+// transient batch state doesn't need Vue reactivity tracking
+let batchChanges: { [key: string]: any } = {};
+let batchScheduled = false;
// setup up watches
const propsAsRefs = toRefs(props);
+// Per-option shallow vs deep watching — reduces overhead for options that don't need deep tracking
+const shallowOptions: Set = new Set(_GET_SHALLOW_GRID_OPTIONS());
+
_GET_ALL_GRID_OPTIONS()
.filter((propertyName: string) => propertyName != 'gridOptions') // dealt with in AgGridVue itself
.forEach((propertyName: string) => {
+ const propRef = propsAsRefs[propertyName];
+ if (!propRef) return; // skip options not declared as Vue props
watch(
- () => propsAsRefs[propertyName],
- (oldValue: any, newValue: any) => {
- if((propertyName === "rowData" && !emittingRowData.value) ||
+ propRef,
+ (newValue: any, oldValue: any) => {
+ if ((propertyName === "rowData" && !emittingRowData.value) ||
propertyName !== "rowData") {
- processChanges(propertyName, oldValue, newValue);
+ processChanges(propertyName, newValue, oldValue);
+ }
+ if (propertyName === "rowData") {
+ emittingRowData.value = false;
}
- emittingRowData.value = false;
},
- { deep: true }
+ shallowOptions.has(propertyName) ? undefined : { deep: true }
);
});
// v-model code start
const ROW_DATA_EVENTS: Set = new Set(['rowDataUpdated', 'cellValueChanged', 'rowValueChanged']);
const rowDataModel = defineModel();
-const rowDataUpdating: Ref = ref(false);
-const emittingRowData: Ref = ref(false);
+const rowDataUpdating = shallowRef(false);
+const emittingRowData = shallowRef(false);
const emits = defineEmits<{
'update:modelValue': [event: TData[]];
}>();
@@ -129,22 +139,26 @@ const globalEventListenerFactory = (restrictToSyncOnly?: boolean) => {
};
};
-const processChanges = (propertyName: string, currentValue: any, previousValue: any) => {
+const processChanges = (propertyName: string, currentValue: any, _previousValue?: any) => {
if (gridCreated.value) {
- let value = currentValue.value || currentValue;
+ let value = currentValue;
if (propertyName === 'rowData' && value != undefined) {
// Prevent the grids internal edits from being reactive
value = deepToRaw(value);
}
- batchChanges.value[propertyName] = value;
- if (batchTimeout.value == null) {
- batchTimeout.value = window.setTimeout(() => {
- // Clear the timeout before processing the changes in case processChanges triggers another change.
- batchTimeout.value = null;
- _processOnChange(batchChanges.value, api.value!);
- batchChanges.value = {};
- }, 0);
+ batchChanges[propertyName] = value;
+ if (!batchScheduled) {
+ batchScheduled = true;
+ // queueMicrotask fires sooner than setTimeout(0) (microtask vs macrotask), reducing latency
+ queueMicrotask(() => {
+ batchScheduled = false;
+ // Guard against updates after grid destruction (microtask may fire after unmount)
+ if (!isDestroyed.value && api.value) {
+ _processOnChange(batchChanges, api.value!);
+ }
+ batchChanges = {};
+ });
}
}
};
@@ -189,6 +203,8 @@ onMounted(() => {
onUnmounted(() => {
if (gridCreated.value) {
+ // Cancel pending debounced timer to prevent callbacks after grid destruction
+ emitRowModel.cancel();
api?.value?.destroy();
isDestroyed.value = true;
}
diff --git a/packages/ag-grid-vue3/src/components/VueComponentFactory.ts b/packages/ag-grid-vue3/src/components/VueComponentFactory.ts
index 6626be1484b..55776f233e1 100644
--- a/packages/ag-grid-vue3/src/components/VueComponentFactory.ts
+++ b/packages/ag-grid-vue3/src/components/VueComponentFactory.ts
@@ -3,6 +3,9 @@ import { createVNode, defineComponent, render } from 'vue';
import { _error } from 'ag-grid-community';
export class VueComponentFactory {
+ // WeakMap avoids repeat component tree traversals and allows GC of parent components
+ private static componentCache = new WeakMap>();
+
private static getComponentDefinition(component: any, parent: any) {
let componentDefinition: any;
@@ -85,6 +88,15 @@ export class VueComponentFactory {
}
public static searchForComponentInstance(parent: any, component: any, maxDepth = 10, suppressError = false) {
+ // Check cache first
+ let parentCache = this.componentCache.get(parent);
+ if (parentCache) {
+ const cached = parentCache.get(component);
+ if (cached !== undefined) {
+ return cached;
+ }
+ }
+
let componentInstance: any = null;
// options first
@@ -140,6 +152,16 @@ export class VueComponentFactory {
_error(114, { component });
return null;
}
+
+ // Cache the result
+ if (componentInstance) {
+ if (!parentCache) {
+ parentCache = new Map();
+ this.componentCache.set(parent, parentCache);
+ }
+ parentCache.set(component, componentInstance);
+ }
+
return componentInstance;
}
}
diff --git a/packages/ag-grid-vue3/src/components/VueFrameworkComponentWrapper.ts b/packages/ag-grid-vue3/src/components/VueFrameworkComponentWrapper.ts
index 1ef89409a1b..0a44f3d79bf 100644
--- a/packages/ag-grid-vue3/src/components/VueFrameworkComponentWrapper.ts
+++ b/packages/ag-grid-vue3/src/components/VueFrameworkComponentWrapper.ts
@@ -60,7 +60,8 @@ export class VueFrameworkComponentWrapper extends BaseComponentWrapper {
) {
this.getFrameworkComponentInstance().destroy();
}
- this.unmount();
+ this.unmount?.();
}
public getFrameworkComponentInstance(): any {
diff --git a/packages/ag-grid-vue3/src/components/VueFrameworkOverrides.ts b/packages/ag-grid-vue3/src/components/VueFrameworkOverrides.ts
index bcc924460cb..f9cfa289de3 100644
--- a/packages/ag-grid-vue3/src/components/VueFrameworkOverrides.ts
+++ b/packages/ag-grid-vue3/src/components/VueFrameworkOverrides.ts
@@ -28,6 +28,7 @@ export class VueFrameworkOverrides extends VanillaFrameworkOverrides {
}
public override isFrameworkComponent(comp: any): boolean {
- return typeof comp === 'object';
+ // Reject null (typeof null === 'object') and arrays (which pass typeof check but aren't Vue components)
+ return comp !== null && typeof comp === 'object' && !Array.isArray(comp);
}
}
diff --git a/packages/ag-grid-vue3/src/components/utils.ts b/packages/ag-grid-vue3/src/components/utils.ts
index eda197f78c5..0ab9883425b 100644
--- a/packages/ag-grid-vue3/src/components/utils.ts
+++ b/packages/ag-grid-vue3/src/components/utils.ts
@@ -2473,34 +2473,90 @@ export function getProps() {
export const debounce = (func: () => void, delay: number) => {
let timeout: number;
- return () => {
- const later = function () {
- func();
- };
+ const debounced = () => {
window.clearTimeout(timeout);
- timeout = window.setTimeout(later, delay);
+ timeout = window.setTimeout(func, delay);
};
+ debounced.cancel = () => {
+ window.clearTimeout(timeout);
+ };
+ return debounced;
};
function isInputClass(input: any) {
- return input &&
- input.constructor &&
- input.constructor.toString().substring(0, 5) === 'class';
+ if (!input || typeof input !== 'object' || Array.isArray(input)) {
+ return false;
+ }
+ const proto = Object.getPrototypeOf(input);
+ return proto !== null && proto !== Object.prototype;
}
// necessary for grid change detection to work - everything in vue is proxied
export function deepToRaw>(sourceObj: T): T {
+ // Fast path: primitives, null/undefined, and functions need no unwrapping
+ if (sourceObj === null || sourceObj === undefined || typeof sourceObj !== 'object') {
+ return sourceObj;
+ }
+
+ const seen = new WeakSet();
const objectIterator = (input: any): any => {
+ // Primitives and functions pass through immediately
+ if (input === null || input === undefined || typeof input !== 'object') {
+ return input;
+ }
+ if (isRef(input)) {
+ return objectIterator(input.value);
+ }
+ if (isReactive(input) || isProxy(input)) {
+ return objectIterator(toRaw(input));
+ }
if (isInputClass(input)) {
return toRaw(input);
}
if (Array.isArray(input)) {
- return input.map((item) => objectIterator(item));
+ // Check if any element needs unwrapping before allocating a new array
+ let needsCopy = false;
+ for (let i = 0; i < input.length; i++) {
+ const item = input[i];
+ if (item !== null && typeof item === 'object') {
+ if (isRef(item) || isReactive(item) || isProxy(item)) {
+ needsCopy = true;
+ break;
+ }
+ // Nested object/array — need to recurse
+ needsCopy = true;
+ break;
+ }
+ }
+ return needsCopy ? input.map((item) => objectIterator(item)) : input;
}
- if (isRef(input) || isReactive(input) || isProxy(input)) {
- return objectIterator(toRaw(input));
+ if (seen.has(input)) {
+ return input;
+ }
+ seen.add(input);
+ // Check if any value needs unwrapping before allocating a new object
+ const keys = Object.keys(input);
+ let needsCopy = false;
+ for (let i = 0; i < keys.length; i++) {
+ const val = input[keys[i]];
+ if (val !== null && typeof val === 'object') {
+ if (isRef(val) || isReactive(val) || isProxy(val)) {
+ needsCopy = true;
+ break;
+ }
+ // Nested object/array — need to recurse
+ needsCopy = true;
+ break;
+ }
+ }
+ if (!needsCopy) {
+ return input;
+ }
+ const result: Record = {};
+ for (let i = 0; i < keys.length; i++) {
+ result[keys[i]] = objectIterator(input[keys[i]]);
}
- return input;
+ return result;
};
return objectIterator(sourceObj);
diff --git a/testing/vue3-tests/.gitignore b/testing/vue3-tests/.gitignore
new file mode 100644
index 00000000000..06c2c8d2cc1
--- /dev/null
+++ b/testing/vue3-tests/.gitignore
@@ -0,0 +1,3 @@
+test-results
+http.log
+playwright-report
diff --git a/testing/vue3-tests/index.html b/testing/vue3-tests/index.html
new file mode 100644
index 00000000000..d0bb0a1cca8
--- /dev/null
+++ b/testing/vue3-tests/index.html
@@ -0,0 +1,12 @@
+
+
+
+
+
+ Vue 3 AG Grid Tests
+
+
+
+
+
+
diff --git a/testing/vue3-tests/package.json b/testing/vue3-tests/package.json
new file mode 100644
index 00000000000..8011b47da06
--- /dev/null
+++ b/testing/vue3-tests/package.json
@@ -0,0 +1,33 @@
+{
+ "name": "vue3-tests",
+ "private": true,
+ "version": "35.1.0-beta.20260218.1143",
+ "type": "module",
+ "scripts": {
+ "dev": "vite",
+ "build": "vue-tsc && vite build",
+ "start-server": "vite preview > http.log 2>&1 & echo $! > pid",
+ "stop-server": "kill $(cat pid) 2>/dev/null; rm -f pid",
+ "playwright": "npx playwright test --reporter=list",
+ "test:e2e": "run-s -c start-server playwright stop-server",
+ "preview": "vite preview --host"
+ },
+ "dependencies": {
+ "vue": "^3.5.0",
+ "vue-router": "^4.5.0",
+ "ag-grid-community": "35.1.0-beta.20260218.1143",
+ "ag-grid-enterprise": "35.1.0-beta.20260218.1143",
+ "ag-grid-vue3": "35.1.0-beta.20260218.1143",
+ "decimal.js": "^10.4.3"
+ },
+ "devDependencies": {
+ "@mobileaction/action-kit": "^1.31.3",
+ "playwright": "^1.56.0",
+ "@playwright/test": "^1.56.0",
+ "vite": "^6.0.0",
+ "@vitejs/plugin-vue": "^5.2.0",
+ "typescript": "~5.6.2",
+ "vue-tsc": "^2.0.0",
+ "npm-run-all": "^4.1.5"
+ }
+}
diff --git a/testing/vue3-tests/playwright.config.ts b/testing/vue3-tests/playwright.config.ts
new file mode 100644
index 00000000000..44794659a88
--- /dev/null
+++ b/testing/vue3-tests/playwright.config.ts
@@ -0,0 +1,69 @@
+import { defineConfig, devices } from '@playwright/test';
+
+/**
+ * Read environment variables from file.
+ * https://github.com/motdotla/dotenv
+ */
+// import dotenv from 'dotenv';
+// import path from 'path';
+// dotenv.config({ path: path.resolve(__dirname, '.env') });
+
+/**
+ * See https://playwright.dev/docs/test-configuration.
+ */
+export default defineConfig({
+ testDir: './tests',
+ /* Run tests in files in parallel */
+ fullyParallel: true,
+ /* Fail the build on CI if you accidentally left test.only in the source code. */
+ forbidOnly: !!process.env.CI,
+ /* Retry on CI only */
+ retries: process.env.CI ? 2 : 0,
+ /* Opt out of parallel tests on CI. */
+ workers: process.env.CI ? 1 : undefined,
+ /* Reporter to use. See https://playwright.dev/docs/test-reporters */
+ reporter: 'html',
+ /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */
+ use: {
+ /* Base URL to use in actions like `await page.goto('/')`. */
+ baseURL: 'http://localhost:8085',
+
+ /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */
+ trace: 'on-first-retry',
+ },
+
+ /* Configure projects for major browsers */
+ projects: [
+ {
+ name: 'chromium',
+ use: { ...devices['Desktop Chrome'] },
+ },
+
+ /* Test against mobile viewports. */
+ // {
+ // name: 'Mobile Chrome',
+ // use: { ...devices['Pixel 5'] },
+ // },
+ // {
+ // name: 'Mobile Safari',
+ // use: { ...devices['iPhone 12'] },
+ // },
+
+ /* Test against branded browsers. */
+ // {
+ // name: 'Microsoft Edge',
+ // use: { ...devices['Desktop Edge'], channel: 'msedge' },
+ // },
+ // {
+ // name: 'Google Chrome',
+ // use: { ...devices['Desktop Chrome'], channel: 'chrome' },
+ // },
+ ],
+
+ /* Run your local dev server before starting the tests */
+ // webServer: {
+ // command: 'npm run start',
+ // url: 'http://127.0.0.1:3000',
+ // reuseExistingServer: !process.env.CI,
+ // },
+});
diff --git a/testing/vue3-tests/project.json b/testing/vue3-tests/project.json
new file mode 100644
index 00000000000..132cf19849c
--- /dev/null
+++ b/testing/vue3-tests/project.json
@@ -0,0 +1,36 @@
+{
+ "name": "vue3-tests",
+ "$schema": "../../node_modules/nx/schemas/project-schema.json",
+ "sourceRoot": "testing/vue3-tests/src",
+ "projectType": "application",
+ "targets": {
+ "setup": {
+ "executor": "nx:run-commands",
+ "options": {
+ "commands": ["npx playwright install --with-deps chromium"],
+ "parallel": false,
+ "cwd": "testing/vue3-tests"
+ }
+ },
+ "dev": {
+ "command": "npx vite",
+ "options": {
+ "cwd": "testing/vue3-tests"
+ }
+ },
+ "build": {
+ "command": "npx vue-tsc && npx vite build",
+ "options": {
+ "cwd": "testing/vue3-tests"
+ }
+ },
+ "test:e2e": {
+ "dependsOn": ["^build", "build", "setup"],
+ "command": "npm run test:e2e",
+ "options": {
+ "cwd": "testing/vue3-tests"
+ }
+ }
+ },
+ "implicitDependencies": ["ag-grid-community", "ag-grid-enterprise", "ag-grid-vue3"]
+}
diff --git a/testing/vue3-tests/src/App.vue b/testing/vue3-tests/src/App.vue
new file mode 100644
index 00000000000..d8dc7cb9016
--- /dev/null
+++ b/testing/vue3-tests/src/App.vue
@@ -0,0 +1,83 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/testing/vue3-tests/src/env.d.ts b/testing/vue3-tests/src/env.d.ts
new file mode 100644
index 00000000000..a699b8a2dd5
--- /dev/null
+++ b/testing/vue3-tests/src/env.d.ts
@@ -0,0 +1,7 @@
+///
+
+declare module '*.vue' {
+ import type { DefineComponent } from 'vue';
+ const component: DefineComponent<{}, {}, any>;
+ export default component;
+}
diff --git a/testing/vue3-tests/src/main.ts b/testing/vue3-tests/src/main.ts
new file mode 100644
index 00000000000..3b806a016b8
--- /dev/null
+++ b/testing/vue3-tests/src/main.ts
@@ -0,0 +1,22 @@
+import { createApp } from 'vue';
+
+import { AllCommunityModule, ModuleRegistry } from 'ag-grid-community';
+import 'ag-grid-community/styles/ag-grid.css';
+import 'ag-grid-community/styles/ag-theme-alpine.css';
+import 'ag-grid-community/styles/ag-theme-quartz.css';
+import { AllEnterpriseModule } from 'ag-grid-enterprise';
+
+import App from './App.vue';
+import { router } from './router';
+import DemoRenderer from './test-cases/zd34301-inject-provide/DemoRenderer.vue';
+
+ModuleRegistry.registerModules([AllCommunityModule, AllEnterpriseModule]);
+
+const demoTablePlugin = {
+ install: (app: any) => app.component('DemoRenderer', DemoRenderer),
+};
+
+const app = createApp(App);
+app.use(router);
+app.use(demoTablePlugin);
+app.mount('#app');
diff --git a/testing/vue3-tests/src/router.ts b/testing/vue3-tests/src/router.ts
new file mode 100644
index 00000000000..3a10faab738
--- /dev/null
+++ b/testing/vue3-tests/src/router.ts
@@ -0,0 +1,98 @@
+import { createRouter, createWebHistory } from 'vue-router';
+
+const routes = [
+ {
+ path: '/',
+ redirect: '/ag-10731',
+ },
+ {
+ path: '/ag-10731',
+ name: 'AG-10731 Editor getValue',
+ component: () => import('./test-cases/AG-10731-editor-getvalue/IndexPage.vue'),
+ },
+ {
+ path: '/ag-11495',
+ name: 'AG-11495 Row Data',
+ component: () => import('./test-cases/AG-11495-rowdata/AgGrid.vue'),
+ },
+ {
+ path: '/ag-11760-expose',
+ name: 'AG-11760 Header Expose',
+ component: () => import('./test-cases/AG-11760-header-expose/Page.vue'),
+ },
+ {
+ path: '/ag-11760-support',
+ name: 'AG-11760 Header Support',
+ component: () => import('./test-cases/AG-11760-header-support/Page.vue'),
+ },
+ {
+ path: '/ag-13735',
+ name: 'AG-13735 Class Instances RowData',
+ component: () => import('./test-cases/AG-13735-class-instances-rowdata/Page.vue'),
+ },
+ {
+ path: '/ag-14083',
+ name: 'AG-14083 RowData Object Functions',
+ component: () => import('./test-cases/AG-14083-rowdata-object-functions/Page.vue'),
+ },
+ {
+ path: '/ag-14134',
+ name: 'AG-14134 Class Instance RowData',
+ component: () => import('./test-cases/AG-14134-class-instance-rowdata/Page.vue'),
+ },
+ {
+ path: '/ag-6753',
+ name: 'AG-6753 Reactive RowData Options',
+ component: () => import('./test-cases/AG-6753-reactive-rowdata-options/Page.vue'),
+ },
+ {
+ path: '/simple-v-model',
+ name: 'Simple v-model Reactivity',
+ component: () => import('./test-cases/simple-v-model-reactivity/Page.vue'),
+ },
+ {
+ path: '/simple-vue3-grid',
+ name: 'Simple Vue3 Grid',
+ component: () => import('./test-cases/simple-vue3-grid/Page.vue'),
+ },
+ {
+ path: '/ts-testcase',
+ name: 'TS Testcase',
+ component: () => import('./test-cases/ts-testcase/Page.vue'),
+ },
+ {
+ path: '/zd34301',
+ name: 'ZD34301 Inject/Provide',
+ component: () => import('./test-cases/zd34301-inject-provide/Page.vue'),
+ },
+ {
+ path: '/zd35354',
+ name: 'ZD35354 Row Data Reactivity',
+ component: () => import('./test-cases/zd35354-row-data-reactivity/Page.vue'),
+ },
+ {
+ path: '/zd36616',
+ name: 'ZD36616 Reactive RowData Editable',
+ component: () => import('./test-cases/zd36616-reactive-rowdata-editable/Page.vue'),
+ },
+ {
+ path: '/zd40289',
+ name: 'ZD40289 Immediate Watch',
+ component: () => import('./test-cases/zd40289-immediate-watch/Page.vue'),
+ },
+ {
+ path: '/ag-14250',
+ name: 'AG-14250 Lose Focus',
+ component: () => import('./test-cases/AG-14250-lose-focus/Page.vue'),
+ },
+ {
+ path: '/ag-14783',
+ name: 'AG-14783 Copy Paste',
+ component: () => import('./test-cases/AG-14783-copy-paste/Page.vue'),
+ },
+];
+
+export const router = createRouter({
+ history: createWebHistory(),
+ routes,
+});
diff --git a/testing/vue3-tests/src/test-cases/AG-10731-editor-getvalue/CustomCellEditor.vue b/testing/vue3-tests/src/test-cases/AG-10731-editor-getvalue/CustomCellEditor.vue
new file mode 100644
index 00000000000..7c680e6e8d9
--- /dev/null
+++ b/testing/vue3-tests/src/test-cases/AG-10731-editor-getvalue/CustomCellEditor.vue
@@ -0,0 +1,40 @@
+
+
+
+
+
diff --git a/testing/vue3-tests/src/test-cases/AG-10731-editor-getvalue/CustomCellEditorScriptSetup.vue b/testing/vue3-tests/src/test-cases/AG-10731-editor-getvalue/CustomCellEditorScriptSetup.vue
new file mode 100644
index 00000000000..92b43872e80
--- /dev/null
+++ b/testing/vue3-tests/src/test-cases/AG-10731-editor-getvalue/CustomCellEditorScriptSetup.vue
@@ -0,0 +1,38 @@
+
+
+
+
+
diff --git a/testing/vue3-tests/src/test-cases/AG-10731-editor-getvalue/IndexPage.vue b/testing/vue3-tests/src/test-cases/AG-10731-editor-getvalue/IndexPage.vue
new file mode 100644
index 00000000000..ced9c6736bf
--- /dev/null
+++ b/testing/vue3-tests/src/test-cases/AG-10731-editor-getvalue/IndexPage.vue
@@ -0,0 +1,83 @@
+
+ Edit cell value - new value should be double the value entered
+
+
+
+
diff --git a/testing/vue3-tests/src/test-cases/AG-11495-rowdata/AgGrid.vue b/testing/vue3-tests/src/test-cases/AG-11495-rowdata/AgGrid.vue
new file mode 100644
index 00000000000..2efec2d294c
--- /dev/null
+++ b/testing/vue3-tests/src/test-cases/AG-11495-rowdata/AgGrid.vue
@@ -0,0 +1,30 @@
+
+
+
+
+
diff --git a/testing/vue3-tests/src/test-cases/AG-11760-header-expose/HeaderComponent.vue b/testing/vue3-tests/src/test-cases/AG-11760-header-expose/HeaderComponent.vue
new file mode 100644
index 00000000000..3e479d8f2ec
--- /dev/null
+++ b/testing/vue3-tests/src/test-cases/AG-11760-header-expose/HeaderComponent.vue
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
diff --git a/testing/vue3-tests/src/test-cases/AG-11760-header-expose/Page.vue b/testing/vue3-tests/src/test-cases/AG-11760-header-expose/Page.vue
new file mode 100644
index 00000000000..a1a405d18b2
--- /dev/null
+++ b/testing/vue3-tests/src/test-cases/AG-11760-header-expose/Page.vue
@@ -0,0 +1,49 @@
+
+
+
Headers should render with a custom header component - with a star and name
+
+
+
+
+
diff --git a/testing/vue3-tests/src/test-cases/AG-11760-header-support/MaColumnHeader.vue b/testing/vue3-tests/src/test-cases/AG-11760-header-support/MaColumnHeader.vue
new file mode 100644
index 00000000000..f049f6a8820
--- /dev/null
+++ b/testing/vue3-tests/src/test-cases/AG-11760-header-support/MaColumnHeader.vue
@@ -0,0 +1,47 @@
+
+
+
+
+ {{ params.displayName }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/testing/vue3-tests/src/test-cases/AG-11760-header-support/Page.vue b/testing/vue3-tests/src/test-cases/AG-11760-header-support/Page.vue
new file mode 100644
index 00000000000..e1f8f8e913b
--- /dev/null
+++ b/testing/vue3-tests/src/test-cases/AG-11760-header-support/Page.vue
@@ -0,0 +1,37 @@
+
+ Custom header with menu and filter icon should render
+
+
+
+
diff --git a/testing/vue3-tests/src/test-cases/AG-13735-class-instances-rowdata/MissionRenderer.vue b/testing/vue3-tests/src/test-cases/AG-13735-class-instances-rowdata/MissionRenderer.vue
new file mode 100644
index 00000000000..90a29d671f3
--- /dev/null
+++ b/testing/vue3-tests/src/test-cases/AG-13735-class-instances-rowdata/MissionRenderer.vue
@@ -0,0 +1,14 @@
+
+ {{ cellValue }}
+
+
+
diff --git a/testing/vue3-tests/src/test-cases/AG-13735-class-instances-rowdata/Page.vue b/testing/vue3-tests/src/test-cases/AG-13735-class-instances-rowdata/Page.vue
new file mode 100644
index 00000000000..40aae25a317
--- /dev/null
+++ b/testing/vue3-tests/src/test-cases/AG-13735-class-instances-rowdata/Page.vue
@@ -0,0 +1,42 @@
+
+
+
+
+
diff --git a/testing/vue3-tests/src/test-cases/AG-14083-rowdata-object-functions/Page.vue b/testing/vue3-tests/src/test-cases/AG-14083-rowdata-object-functions/Page.vue
new file mode 100644
index 00000000000..18ab936e2f0
--- /dev/null
+++ b/testing/vue3-tests/src/test-cases/AG-14083-rowdata-object-functions/Page.vue
@@ -0,0 +1,25 @@
+
+
+
+
+
diff --git a/testing/vue3-tests/src/test-cases/AG-14134-class-instance-rowdata/NameRenderer.vue b/testing/vue3-tests/src/test-cases/AG-14134-class-instance-rowdata/NameRenderer.vue
new file mode 100644
index 00000000000..9b1cbd99eb4
--- /dev/null
+++ b/testing/vue3-tests/src/test-cases/AG-14134-class-instance-rowdata/NameRenderer.vue
@@ -0,0 +1,19 @@
+
+
+ {{ instance.name }}-{{ instance.formattedName }}-{{ isMission }}
+
+
+
+
diff --git a/testing/vue3-tests/src/test-cases/AG-14134-class-instance-rowdata/Page.vue b/testing/vue3-tests/src/test-cases/AG-14134-class-instance-rowdata/Page.vue
new file mode 100644
index 00000000000..475051e3622
--- /dev/null
+++ b/testing/vue3-tests/src/test-cases/AG-14134-class-instance-rowdata/Page.vue
@@ -0,0 +1,64 @@
+
+
+
+
{{ selectionCheck }}
+
+
+
+
diff --git a/testing/vue3-tests/src/test-cases/AG-14250-lose-focus/Page.vue b/testing/vue3-tests/src/test-cases/AG-14250-lose-focus/Page.vue
new file mode 100644
index 00000000000..c6d241af439
--- /dev/null
+++ b/testing/vue3-tests/src/test-cases/AG-14250-lose-focus/Page.vue
@@ -0,0 +1,50 @@
+
+
+
+
+
+
diff --git a/testing/vue3-tests/src/test-cases/AG-14783-copy-paste/Page.vue b/testing/vue3-tests/src/test-cases/AG-14783-copy-paste/Page.vue
new file mode 100644
index 00000000000..7104565b518
--- /dev/null
+++ b/testing/vue3-tests/src/test-cases/AG-14783-copy-paste/Page.vue
@@ -0,0 +1,111 @@
+
+
+
+
+
+
diff --git a/testing/vue3-tests/src/test-cases/AG-6753-reactive-rowdata-options/Page.vue b/testing/vue3-tests/src/test-cases/AG-6753-reactive-rowdata-options/Page.vue
new file mode 100644
index 00000000000..798b2a0ce8b
--- /dev/null
+++ b/testing/vue3-tests/src/test-cases/AG-6753-reactive-rowdata-options/Page.vue
@@ -0,0 +1,23 @@
+
+
+
+
+
diff --git a/testing/vue3-tests/src/test-cases/simple-v-model-reactivity/Page.vue b/testing/vue3-tests/src/test-cases/simple-v-model-reactivity/Page.vue
new file mode 100644
index 00000000000..7c0f0d0c471
--- /dev/null
+++ b/testing/vue3-tests/src/test-cases/simple-v-model-reactivity/Page.vue
@@ -0,0 +1,32 @@
+
+
+ [[{{ rowData }}]]
+
+
+
diff --git a/testing/vue3-tests/src/test-cases/simple-vue3-grid/Page.vue b/testing/vue3-tests/src/test-cases/simple-vue3-grid/Page.vue
new file mode 100644
index 00000000000..2d51e11b5e8
--- /dev/null
+++ b/testing/vue3-tests/src/test-cases/simple-vue3-grid/Page.vue
@@ -0,0 +1,58 @@
+
+ 1 rows should render with the price having custom pound icon renderer
+ when the button is clicked new row should be added
+ the json below the table should match the row data (except for price which will be a number in the json)
+
+
+
+ {{ rowData }}
+
+
+
+
diff --git a/testing/vue3-tests/src/test-cases/simple-vue3-grid/PriceRenderer.vue b/testing/vue3-tests/src/test-cases/simple-vue3-grid/PriceRenderer.vue
new file mode 100644
index 00000000000..2b348125975
--- /dev/null
+++ b/testing/vue3-tests/src/test-cases/simple-vue3-grid/PriceRenderer.vue
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
diff --git a/testing/vue3-tests/src/test-cases/simple-vue3-grid/SimpleEditor.vue b/testing/vue3-tests/src/test-cases/simple-vue3-grid/SimpleEditor.vue
new file mode 100644
index 00000000000..bc4d92f8e11
--- /dev/null
+++ b/testing/vue3-tests/src/test-cases/simple-vue3-grid/SimpleEditor.vue
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
diff --git a/testing/vue3-tests/src/test-cases/ts-testcase/Page.vue b/testing/vue3-tests/src/test-cases/ts-testcase/Page.vue
new file mode 100644
index 00000000000..342ed9c2f3a
--- /dev/null
+++ b/testing/vue3-tests/src/test-cases/ts-testcase/Page.vue
@@ -0,0 +1,50 @@
+
+
+
+
+
diff --git a/testing/vue3-tests/src/test-cases/zd34301-inject-provide/DemoRenderer.vue b/testing/vue3-tests/src/test-cases/zd34301-inject-provide/DemoRenderer.vue
new file mode 100644
index 00000000000..e567095b35c
--- /dev/null
+++ b/testing/vue3-tests/src/test-cases/zd34301-inject-provide/DemoRenderer.vue
@@ -0,0 +1,19 @@
+
+
+
+
+ {{ state.lastLoaded }} {{ someValue }}
+
+
diff --git a/testing/vue3-tests/src/test-cases/zd34301-inject-provide/DemoTable.vue b/testing/vue3-tests/src/test-cases/zd34301-inject-provide/DemoTable.vue
new file mode 100644
index 00000000000..bd74c3287d7
--- /dev/null
+++ b/testing/vue3-tests/src/test-cases/zd34301-inject-provide/DemoTable.vue
@@ -0,0 +1,44 @@
+
+
+
+
+ Time in DemoTable: {{ dateInDemoTable }} {{ someValue }}
+
+
+
+
+
diff --git a/testing/vue3-tests/src/test-cases/zd34301-inject-provide/Page.vue b/testing/vue3-tests/src/test-cases/zd34301-inject-provide/Page.vue
new file mode 100644
index 00000000000..6138769d414
--- /dev/null
+++ b/testing/vue3-tests/src/test-cases/zd34301-inject-provide/Page.vue
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
diff --git a/testing/vue3-tests/src/test-cases/zd34301-inject-provide/WrappedOne.vue b/testing/vue3-tests/src/test-cases/zd34301-inject-provide/WrappedOne.vue
new file mode 100644
index 00000000000..d18283df532
--- /dev/null
+++ b/testing/vue3-tests/src/test-cases/zd34301-inject-provide/WrappedOne.vue
@@ -0,0 +1,11 @@
+
+
+
+
+
diff --git a/testing/vue3-tests/src/test-cases/zd34301-inject-provide/WrappedTwo.vue b/testing/vue3-tests/src/test-cases/zd34301-inject-provide/WrappedTwo.vue
new file mode 100644
index 00000000000..504919b45da
--- /dev/null
+++ b/testing/vue3-tests/src/test-cases/zd34301-inject-provide/WrappedTwo.vue
@@ -0,0 +1,11 @@
+
+
+
+
+
diff --git a/testing/vue3-tests/src/test-cases/zd35354-row-data-reactivity/Page.vue b/testing/vue3-tests/src/test-cases/zd35354-row-data-reactivity/Page.vue
new file mode 100644
index 00000000000..0058a85b95f
--- /dev/null
+++ b/testing/vue3-tests/src/test-cases/zd35354-row-data-reactivity/Page.vue
@@ -0,0 +1,146 @@
+
+
+
+
+
+
+
+
+
diff --git a/testing/vue3-tests/src/test-cases/zd36616-reactive-rowdata-editable/Page.vue b/testing/vue3-tests/src/test-cases/zd36616-reactive-rowdata-editable/Page.vue
new file mode 100644
index 00000000000..2ea483e543f
--- /dev/null
+++ b/testing/vue3-tests/src/test-cases/zd36616-reactive-rowdata-editable/Page.vue
@@ -0,0 +1,19 @@
+
+
+ {{ rowData[0].value }}
+
+
+
diff --git a/testing/vue3-tests/src/test-cases/zd40289-immediate-watch/Page.vue b/testing/vue3-tests/src/test-cases/zd40289-immediate-watch/Page.vue
new file mode 100644
index 00000000000..13bdd8a0736
--- /dev/null
+++ b/testing/vue3-tests/src/test-cases/zd40289-immediate-watch/Page.vue
@@ -0,0 +1,51 @@
+
+ Should be no data changes
+
+ Data changes: {{ changeCount }}
+
+
+
+
+
diff --git a/testing/vue3-tests/tests/AG-10731.vue3.spec.ts b/testing/vue3-tests/tests/AG-10731.vue3.spec.ts
new file mode 100644
index 00000000000..33d40f96f21
--- /dev/null
+++ b/testing/vue3-tests/tests/AG-10731.vue3.spec.ts
@@ -0,0 +1,15 @@
+import { expect, test } from '@playwright/test';
+
+test('quasar get value', async ({ page }) => {
+ test.setTimeout(5_000);
+
+ await page.goto('/ag-10731');
+
+ await page.getByRole('gridcell').dblclick();
+
+ await expect(page.locator('#goldeditor')).toBeVisible();
+ await page.locator('#goldeditor').fill('10');
+ await page.locator('#goldeditor').press('Enter');
+
+ expect(await page.getByRole('gridcell').textContent()).toBe('20');
+});
diff --git a/testing/vue3-tests/tests/AG-11495.vue3.spec.ts b/testing/vue3-tests/tests/AG-11495.vue3.spec.ts
new file mode 100644
index 00000000000..7939734f9c4
--- /dev/null
+++ b/testing/vue3-tests/tests/AG-11495.vue3.spec.ts
@@ -0,0 +1,19 @@
+import { expect, test } from '@playwright/test';
+
+test('ensure no v-model/rowdata error message', async ({ page }) => {
+ test.setTimeout(5_000);
+
+ const errorLogs = [];
+ // page.on("console", (message) => {
+ // if (message.type() === "error") {
+ // errorLogs.push(message.text())
+ // }
+ // })
+
+ await page.goto('/ag-11495');
+
+ await expect(page.getByRole('row')).toHaveCount(4);
+ await expect(page.getByRole('gridcell')).toHaveCount(12);
+
+ expect(errorLogs.length).toEqual(0);
+});
diff --git a/testing/vue3-tests/tests/AG-11760-expose.vue3.spec.ts b/testing/vue3-tests/tests/AG-11760-expose.vue3.spec.ts
new file mode 100644
index 00000000000..ed5edde6518
--- /dev/null
+++ b/testing/vue3-tests/tests/AG-11760-expose.vue3.spec.ts
@@ -0,0 +1,25 @@
+import { expect, test } from '@playwright/test';
+
+test('header components exposed render', async ({ page }) => {
+ test.setTimeout(5_000);
+
+ const errorLogs = [];
+ // page.on("console", (message) => {
+ // if (message.type() === "error") {
+ // errorLogs.push(message.text())
+ // }
+ // })
+
+ await page.goto('/ag-11760-expose');
+
+ await expect(page.getByRole('row')).toHaveCount(2);
+ await expect(page.getByRole('gridcell')).toHaveCount(2);
+
+ const athlete = page.locator('.header_wrapper').first();
+ const age = page.locator('.header_wrapper').last();
+
+ expect(await athlete.textContent()).toBe('🌟athlete');
+ expect(await age.textContent()).toBe('🌟age');
+
+ expect(errorLogs.length).toEqual(0);
+});
diff --git a/testing/vue3-tests/tests/AG-11760-header.vue3.spec.ts b/testing/vue3-tests/tests/AG-11760-header.vue3.spec.ts
new file mode 100644
index 00000000000..0a63464ee53
--- /dev/null
+++ b/testing/vue3-tests/tests/AG-11760-header.vue3.spec.ts
@@ -0,0 +1,25 @@
+import { expect, test } from '@playwright/test';
+
+test('header components exposed render', async ({ page }) => {
+ test.setTimeout(5_000);
+
+ const errorLogs = [];
+ // page.on("console", (message) => {
+ // if (message.type() === "error") {
+ // errorLogs.push(message.text())
+ // }
+ // })
+
+ await page.goto('/ag-11760-support');
+
+ await expect(page.getByRole('row')).toHaveCount(4);
+ await expect(page.getByRole('gridcell')).toHaveCount(12);
+
+ const make = page.locator('.ag-header-cell-comp-wrapper').first();
+ expect(await make.textContent()).toBe('Make ');
+
+ await expect(page.locator('button.ml-auto > svg.ak-icon--menu')).toBeVisible();
+ await expect(page.locator('button.ml-auto > svg.ak-icon--filter')).toBeVisible();
+
+ expect(errorLogs.length).toEqual(0);
+});
diff --git a/testing/vue3-tests/tests/AG-13735.vue3.spec.ts b/testing/vue3-tests/tests/AG-13735.vue3.spec.ts
new file mode 100644
index 00000000000..a2be61bf916
--- /dev/null
+++ b/testing/vue3-tests/tests/AG-13735.vue3.spec.ts
@@ -0,0 +1,25 @@
+import { expect, test } from '@playwright/test';
+
+test('rowData is reactive', async ({ page }) => {
+ test.setTimeout(10_000);
+
+ const errorLogs = [];
+ // page.on("console", (message) => {
+ // if (message.type() === "error") {
+ // errorLogs.push(message.text())
+ // }
+ // })
+
+ await page.goto('/ag-13735');
+
+ const firstCell = page.locator('.ag-cell-value').first();
+ await firstCell.waitFor({ state: 'visible', timeout: 30000 });
+
+ await expect(page.getByRole('gridcell')).toHaveCount(3);
+
+ expect(await page.getByRole('gridcell').nth(0).textContent()).toBe('Mission: name 1');
+ expect(await page.getByRole('gridcell').nth(1).textContent()).toBe('Mission: name 2');
+ expect(await page.getByRole('gridcell').nth(2).textContent()).toBe('Mission: name 3');
+
+ expect(errorLogs.length).toEqual(0);
+});
diff --git a/testing/vue3-tests/tests/AG-14134-class-instance-rowdata.spec.ts b/testing/vue3-tests/tests/AG-14134-class-instance-rowdata.spec.ts
new file mode 100644
index 00000000000..6254bc75a86
--- /dev/null
+++ b/testing/vue3-tests/tests/AG-14134-class-instance-rowdata.spec.ts
@@ -0,0 +1,15 @@
+import { expect, test } from '@playwright/test';
+
+test('reactive rowdata', async ({ page }) => {
+ test.setTimeout(5_000);
+
+ await page.goto('/ag-14134');
+
+ await expect(page.getByLabel('cell-value')).toHaveText('name 1-Mission: name 1-true');
+ await expect(page.getByLabel('selection-check')).toHaveText('');
+
+ await page.getByLabel('Press Space to toggle row selection (unchecked)').click();
+
+ await expect(page.getByLabel('cell-value')).toHaveText('name 1-Mission: name 1-true');
+ await expect(page.getByLabel('selection-check')).toHaveText('true-true');
+});
diff --git a/testing/vue3-tests/tests/AG-14250-lose-focus.vue3.spec.ts b/testing/vue3-tests/tests/AG-14250-lose-focus.vue3.spec.ts
new file mode 100644
index 00000000000..98011ec828d
--- /dev/null
+++ b/testing/vue3-tests/tests/AG-14250-lose-focus.vue3.spec.ts
@@ -0,0 +1,30 @@
+import { expect, test } from '@playwright/test';
+
+test('focus is maintained when tabbing between cells', async ({ page }) => {
+ test.setTimeout(10_000);
+
+ await page.goto('/ag-14250');
+
+ // Wait for data to load (fetched from remote endpoint)
+ const firstCell = page.getByRole('gridcell').first();
+ await firstCell.waitFor();
+
+ // Double-click the first cell to enter edit mode
+ await firstCell.dblclick();
+
+ // Clear and type new value
+ const editor = page.locator('.ag-cell-inline-editing input');
+ await expect(editor).toBeVisible();
+ await editor.fill('100');
+
+ // Tab to next cell (age column)
+ await editor.press('Tab');
+
+ // Verify the age cell (value 23) is now in edit mode
+ const editingCell = page.locator('.ag-cell-inline-editing');
+ await expect(editingCell).toBeVisible();
+
+ const editingInput = editingCell.locator('input');
+ await expect(editingInput).toBeFocused();
+ await expect(editingInput).toHaveValue('23');
+});
diff --git a/testing/vue3-tests/tests/AG-14783-copy-paste.vue3.spec.ts b/testing/vue3-tests/tests/AG-14783-copy-paste.vue3.spec.ts
new file mode 100644
index 00000000000..acbc8fc9aed
--- /dev/null
+++ b/testing/vue3-tests/tests/AG-14783-copy-paste.vue3.spec.ts
@@ -0,0 +1,47 @@
+import { expect, test } from '@playwright/test';
+
+test('copy-paste selected rows overwrites last row and adds new rows', async ({ page, context }) => {
+ test.setTimeout(5_000);
+
+ await context.grantPermissions(['clipboard-read', 'clipboard-write']);
+
+ await page.goto('/ag-14783');
+
+ // Wait for data to load (10 rows from remote endpoint)
+ const firstCell = page.locator('.ag-row[row-index="0"] .ag-cell').first();
+ await firstCell.waitFor();
+
+ // Capture athlete names from first 3 rows for later verification
+ const row0Athlete = await page.locator('.ag-row[row-index="0"] .ag-cell').first().textContent();
+ const row1Athlete = await page.locator('.ag-row[row-index="1"] .ag-cell').first().textContent();
+ const row2Athlete = await page.locator('.ag-row[row-index="2"] .ag-cell').first().textContent();
+
+ // Select first row by clicking it
+ await firstCell.click();
+
+ // Shift+click third row to select rows 0-2
+ await page
+ .locator('.ag-row[row-index="2"] .ag-cell')
+ .first()
+ .click({ modifiers: ['Shift'] });
+
+ // Copy selected rows
+ const modifier = process.platform === 'darwin' ? 'Meta' : 'Control';
+ await page.keyboard.press(`${modifier}+c`);
+
+ // Click on the first cell of the last row to focus it
+ await page.locator('.ag-row[row-index="9"] .ag-cell').first().click();
+
+ // Paste
+ await page.keyboard.press(`${modifier}+v`);
+
+ // Verify that 2 new rows were added (12 total, indices 0-11)
+ await expect(page.locator('.ag-row[row-index="11"]').first()).toBeVisible();
+
+ // Verify the last row (index 9) was overwritten with first copied row's data
+ await expect(page.locator('.ag-row[row-index="9"] .ag-cell').first()).toHaveText(row0Athlete!);
+
+ // Verify new rows have the correct data from copied rows
+ await expect(page.locator('.ag-row[row-index="10"] .ag-cell').first()).toHaveText(row1Athlete!);
+ await expect(page.locator('.ag-row[row-index="11"] .ag-cell').first()).toHaveText(row2Athlete!);
+});
diff --git a/testing/vue3-tests/tests/AG-6753.vue3.spec.ts b/testing/vue3-tests/tests/AG-6753.vue3.spec.ts
new file mode 100644
index 00000000000..6a72d9fcd39
--- /dev/null
+++ b/testing/vue3-tests/tests/AG-6753.vue3.spec.ts
@@ -0,0 +1,25 @@
+import { expect, test } from '@playwright/test';
+
+test('AG-6753 rowData is reactive', async ({ page }) => {
+ const errorLogs = [];
+ // page.on("console", (message) => {
+ // if (message.type() === "error") {
+ // errorLogs.push(message.text())
+ // }
+ // })
+
+ await page.goto('/ag-6753');
+
+ // should start off with one row
+ await expect(page.getByRole('gridcell')).toHaveCount(1);
+
+ // when the first cell is clicked another row should be added
+ await page.getByRole('gridcell').first().click();
+ await expect(page.getByRole('gridcell')).toHaveCount(2);
+
+ // when the first cell is clicked a third row should be added
+ await page.getByRole('gridcell').first().click();
+ await expect(page.getByRole('gridcell')).toHaveCount(3);
+
+ expect(errorLogs.length).toEqual(0);
+});
diff --git a/testing/vue3-tests/tests/rowData-reactivity.vue3.spec.ts b/testing/vue3-tests/tests/rowData-reactivity.vue3.spec.ts
new file mode 100644
index 00000000000..a262157d0f6
--- /dev/null
+++ b/testing/vue3-tests/tests/rowData-reactivity.vue3.spec.ts
@@ -0,0 +1,32 @@
+import { expect, test } from '@playwright/test';
+
+test('rowData reactivity', async ({ page }) => {
+ test.setTimeout(5_000);
+
+ const errorLogs = [];
+ // page.on("console", (message) => {
+ // if (message.type() === "error") {
+ // errorLogs.push(message.text())
+ // }
+ // })
+
+ await page.goto('/simple-vue3-grid');
+
+ const firstCell = page.locator('.ag-cell-value').first();
+ await firstCell.waitFor();
+
+ // should start off with one row
+ expect(await page.getByRole('gridcell')).toHaveCount(3);
+ expect(await page.getByRole('gridcell').first().textContent()).toBe('Tesla');
+ expect(await page.getByRole('gridcell').locator('.priceIcon').count()).toBe(6);
+
+ await page.getByRole('button').click();
+
+ await page.waitForTimeout(2000); // waits for 2 seconds
+
+ expect(await page.getByRole('gridcell')).toHaveCount(6);
+ expect(await page.getByRole('gridcell').nth(3).textContent()).toBe('Wibble');
+ expect(await page.getByRole('gridcell').locator('.priceIcon').count()).toBe(8);
+
+ expect(errorLogs.length).toEqual(0);
+});
diff --git a/testing/vue3-tests/tests/ts-compiles.vue3.spec.ts b/testing/vue3-tests/tests/ts-compiles.vue3.spec.ts
new file mode 100644
index 00000000000..31cdd2b448e
--- /dev/null
+++ b/testing/vue3-tests/tests/ts-compiles.vue3.spec.ts
@@ -0,0 +1,22 @@
+import { expect, test } from '@playwright/test';
+
+test('ts examples compiles', async ({ page }) => {
+ test.setTimeout(5_000);
+
+ const errorLogs = [];
+ // page.on("console", (message) => {
+ // if (message.type() === "error") {
+ // errorLogs.push(message.text())
+ // }
+ // })
+
+ await page.goto('/ts-testcase');
+
+ const firstCell = page.locator('.ag-cell-value').first();
+ await firstCell.waitFor();
+
+ expect(await page.getByRole('gridcell')).toHaveCount(160);
+ expect(await page.getByRole('gridcell').first().textContent()).toBe('Natalie Coughlin');
+
+ expect(errorLogs.length).toEqual(0);
+});
diff --git a/testing/vue3-tests/tests/v-model-reactivity.vue3.spec.ts b/testing/vue3-tests/tests/v-model-reactivity.vue3.spec.ts
new file mode 100644
index 00000000000..b874c7d9dd8
--- /dev/null
+++ b/testing/vue3-tests/tests/v-model-reactivity.vue3.spec.ts
@@ -0,0 +1,26 @@
+import { expect, test } from '@playwright/test';
+
+test('v-model reactivity', async ({ page }) => {
+ test.setTimeout(5_000);
+
+ const errorLogs = [];
+ // page.on("console", (message) => {
+ // if (message.type() === "error") {
+ // errorLogs.push(message.text())
+ // }
+ // })
+
+ await page.goto('/simple-v-model');
+
+ // should start off with one row
+ await expect(page.getByRole('gridcell')).toHaveCount(2);
+
+ expect(await page.getByRole('gridcell').last().textContent()).toBe('row 2 col1');
+
+ await page.getByRole('button').click();
+ await page.waitForTimeout(50);
+
+ expect(await page.getByRole('gridcell').last().textContent()).toBe('row 2 new col1');
+
+ expect(errorLogs.length).toEqual(0);
+});
diff --git a/testing/vue3-tests/tests/zd34301-inject-provide.vue3.spec.ts b/testing/vue3-tests/tests/zd34301-inject-provide.vue3.spec.ts
new file mode 100644
index 00000000000..f7009583260
--- /dev/null
+++ b/testing/vue3-tests/tests/zd34301-inject-provide.vue3.spec.ts
@@ -0,0 +1,38 @@
+import { expect, test } from '@playwright/test';
+
+test('aligned grids', async ({ page }) => {
+ test.setTimeout(5_000);
+
+ const errorLogs = [];
+ // page.on("console", (message) => {
+ // if (message.type() === "error") {
+ // errorLogs.push(message.text())
+ // }
+ // })
+
+ await page.goto('/zd34301');
+
+ const firstCell = page.locator('.ag-cell-value').first();
+ await firstCell.waitFor();
+
+ expect(await page.locator('#grid-cell-renderer').count()).toBe(2);
+ expect(await page.locator('#table-timestamp').count()).toBe(2);
+
+ let cellTimestamps = await page.locator('#grid-cell-renderer').allInnerTexts();
+ let tableTimestamps = await page.locator('#table-timestamp').allInnerTexts();
+
+ const originalTimestamps = cellTimestamps.concat(tableTimestamps);
+ expect(originalTimestamps.every((v) => v === originalTimestamps[0])).toBeTruthy();
+
+ await page.locator('#unmount').click();
+ await page.waitForTimeout(500);
+
+ await page.locator('#mount').click();
+ await page.waitForTimeout(500);
+
+ cellTimestamps = await page.locator('#grid-cell-renderer').allInnerTexts();
+ tableTimestamps = await page.locator('#table-timestamp').allInnerTexts();
+
+ const newTimestamps = cellTimestamps.concat(tableTimestamps);
+ expect(newTimestamps.every((v) => v === newTimestamps[0])).toBeTruthy();
+});
diff --git a/testing/vue3-tests/tests/zd35354-row-data-reactivity.vue3.spec.ts b/testing/vue3-tests/tests/zd35354-row-data-reactivity.vue3.spec.ts
new file mode 100644
index 00000000000..e19830f2b20
--- /dev/null
+++ b/testing/vue3-tests/tests/zd35354-row-data-reactivity.vue3.spec.ts
@@ -0,0 +1,23 @@
+import { expect, test } from '@playwright/test';
+
+test('row data reactivity', async ({ page }) => {
+ test.setTimeout(5_000);
+
+ await page.goto('/zd35354');
+
+ expect(await page.getByRole('gridcell')).toHaveCount(35);
+ expect(await page.getByRole('gridcell').nth(1).textContent()).toBe('AO');
+ expect(await page.getByRole('gridcell').nth(8).textContent()).toBe('EC37B');
+
+ await page.locator('button').first().click();
+ await page.waitForTimeout(50);
+ expect(await page.getByRole('gridcell')).toHaveCount(35);
+ expect(await page.getByRole('gridcell').nth(1).textContent()).toBe('First Update');
+ expect(await page.getByRole('gridcell').nth(8).textContent()).toBe('EC37B');
+
+ await page.locator('button').last().click();
+ await page.waitForTimeout(50);
+ expect(await page.getByRole('gridcell')).toHaveCount(35);
+ expect(await page.getByRole('gridcell').nth(1).textContent()).toBe('First Update');
+ expect(await page.getByRole('gridcell').nth(8).textContent()).toBe('Second Update');
+});
diff --git a/testing/vue3-tests/tests/zd36616-reactive-rowdata-editable.spec.ts b/testing/vue3-tests/tests/zd36616-reactive-rowdata-editable.spec.ts
new file mode 100644
index 00000000000..22f52c19d7c
--- /dev/null
+++ b/testing/vue3-tests/tests/zd36616-reactive-rowdata-editable.spec.ts
@@ -0,0 +1,21 @@
+import { expect, test } from '@playwright/test';
+
+test('reactive rowdata', async ({ page }) => {
+ test.setTimeout(5_000);
+
+ await page.goto('/zd36616');
+
+ expect(await page.getByRole('gridcell').textContent()).toBe('2');
+ expect(await page.getByLabel('value').textContent()).toBe('2');
+
+ await page.getByRole('gridcell').dblclick();
+
+ await expect(page.getByLabel('Input Editor')).toBeVisible();
+ await expect(page.getByLabel('Input Editor')).toBeEditable();
+ await page.getByLabel('Input Editor').fill('10');
+ await page.getByLabel('Input Editor').press('Enter');
+
+ await page.waitForTimeout(50); // waits for 2 seconds
+ expect(await page.getByRole('gridcell').textContent()).toBe('10');
+ expect(await page.getByLabel('value').textContent()).toBe('10');
+});
diff --git a/testing/vue3-tests/tests/zd40289-immediate-watch.vue3.spec.ts b/testing/vue3-tests/tests/zd40289-immediate-watch.vue3.spec.ts
new file mode 100644
index 00000000000..208dc493352
--- /dev/null
+++ b/testing/vue3-tests/tests/zd40289-immediate-watch.vue3.spec.ts
@@ -0,0 +1,28 @@
+import { expect, test } from '@playwright/test';
+
+test('rowData reactivity', async ({ page }) => {
+ test.setTimeout(5_000);
+
+ const errorLogs = [];
+ // page.on("console", (message) => {
+ // if (message.type() === "error") {
+ // errorLogs.push(message.text())
+ // }
+ // })
+
+ await page.goto('/zd40289');
+
+ const firstCell = page.locator('.ag-cell-value').first();
+ await firstCell.waitFor({ state: 'visible', timeout: 30000 });
+
+ // should start off with one row
+ expect(await page.getByRole('gridcell')).toHaveCount(24);
+ expect(await page.getByRole('gridcell').first().textContent()).toBe('Tesla');
+ expect(await page.getByRole('gridcell').nth(1).textContent()).toBe('Model Y');
+
+ await page.waitForTimeout(500);
+
+ expect(await page.getByRole('watch')).toHaveCount(0);
+
+ expect(errorLogs.length).toEqual(0);
+});
diff --git a/testing/vue3-tests/tsconfig.json b/testing/vue3-tests/tsconfig.json
new file mode 100644
index 00000000000..56e8cd11801
--- /dev/null
+++ b/testing/vue3-tests/tsconfig.json
@@ -0,0 +1,23 @@
+{
+ "compilerOptions": {
+ "target": "ES2020",
+ "useDefineForClassFields": true,
+ "module": "ESNext",
+ "lib": ["ES2020", "DOM", "DOM.Iterable"],
+ "skipLibCheck": true,
+ "moduleResolution": "bundler",
+ "allowImportingTsExtensions": true,
+ "isolatedModules": true,
+ "moduleDetection": "force",
+ "noEmit": true,
+ "jsx": "preserve",
+ "strict": true,
+ "noUnusedLocals": false,
+ "noUnusedParameters": false,
+ "noFallthroughCasesInSwitch": true,
+ "paths": {
+ "@/*": ["./src/*"]
+ }
+ },
+ "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"]
+}
diff --git a/testing/vue3-tests/vite.config.ts b/testing/vue3-tests/vite.config.ts
new file mode 100644
index 00000000000..1991cc31cd3
--- /dev/null
+++ b/testing/vue3-tests/vite.config.ts
@@ -0,0 +1,21 @@
+import vue from '@vitejs/plugin-vue';
+import { URL, fileURLToPath } from 'node:url';
+import { defineConfig } from 'vite';
+
+export default defineConfig({
+ plugins: [vue()],
+ resolve: {
+ alias: {
+ '@': fileURLToPath(new URL('./src', import.meta.url)),
+ },
+ },
+ server: {
+ port: 8085,
+ },
+ preview: {
+ port: 8085,
+ },
+ build: {
+ minify: false,
+ },
+});
diff --git a/yarn.lock b/yarn.lock
index 35c76cf8b26..8c5abf08a1f 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -619,6 +619,26 @@
dependencies:
tslib "^2.3.0"
+"@ant-design/colors@^6.0.0":
+ version "6.0.0"
+ resolved "https://registry.ag-grid.com/@ant-design/colors/-/colors-6.0.0.tgz#9b9366257cffcc47db42b9d0203bb592c13c0298"
+ integrity sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ==
+ dependencies:
+ "@ctrl/tinycolor" "^3.4.0"
+
+"@ant-design/icons-svg@^4.2.1":
+ version "4.4.2"
+ resolved "https://registry.ag-grid.com/@ant-design/icons-svg/-/icons-svg-4.4.2.tgz#ed2be7fb4d82ac7e1d45a54a5b06d6cecf8be6f6"
+ integrity sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==
+
+"@ant-design/icons-vue@^6.1.0":
+ version "6.1.0"
+ resolved "https://registry.ag-grid.com/@ant-design/icons-vue/-/icons-vue-6.1.0.tgz#f9324fdc0eb4cea943cf626d2bf3db9a4ff4c074"
+ integrity sha512-EX6bYm56V+ZrKN7+3MT/ubDkvJ5rK/O2t380WFRflDcVFgsvl3NLH7Wxeau6R8DbrO5jWR6DSTC3B6gYFp77AA==
+ dependencies:
+ "@ant-design/colors" "^6.0.0"
+ "@ant-design/icons-svg" "^4.2.1"
+
"@antfu/utils@^0.7.10":
version "0.7.10"
resolved "http://52.50.158.57:4873/@antfu/utils/-/utils-0.7.10.tgz#ae829f170158e297a9b6a28f161a8e487d00814d"
@@ -2034,6 +2054,11 @@
dependencies:
regenerator-runtime "^0.14.0"
+"@babel/runtime@^7.10.5":
+ version "7.28.6"
+ resolved "https://registry.ag-grid.com/@babel/runtime/-/runtime-7.28.6.tgz#d267a43cb1836dc4d182cce93ae75ba954ef6d2b"
+ integrity sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==
+
"@babel/runtime@^7.12.5", "@babel/runtime@^7.16.3", "@babel/runtime@^7.16.7", "@babel/runtime@^7.18.3", "@babel/runtime@^7.20.13", "@babel/runtime@^7.22.6", "@babel/runtime@^7.24.5", "@babel/runtime@^7.27.1", "@babel/runtime@^7.27.6", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.6":
version "7.28.4"
resolved "http://52.50.158.57:4873/@babel/runtime/-/runtime-7.28.4.tgz#a70226016fabe25c5783b2f22d3e1c9bc5ca3326"
@@ -2520,6 +2545,11 @@
resolved "http://52.50.158.57:4873/@csstools/utilities/-/utilities-1.0.0.tgz#42f3c213f2fb929324d465684ab9f46a0febd4bb"
integrity sha512-tAgvZQe/t2mlvpNosA4+CkMiZ2azISW5WPAcdSalZlEjQvUfghHxfQcrCiK/7/CrfAWVxyM88kGFYO82heIGDg==
+"@ctrl/tinycolor@^3.4.0":
+ version "3.6.1"
+ resolved "https://registry.ag-grid.com/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz#b6c75a56a1947cc916ea058772d666a2c8932f31"
+ integrity sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==
+
"@discoveryjs/json-ext@0.6.1":
version "0.6.1"
resolved "http://52.50.158.57:4873/@discoveryjs/json-ext/-/json-ext-0.6.1.tgz#593da7a17a31a72a874e313677183334a49b01c9"
@@ -3648,6 +3678,13 @@
"@eslint/core" "^0.17.0"
levn "^0.4.1"
+"@floating-ui/core@^1.1.0":
+ version "1.7.4"
+ resolved "https://registry.ag-grid.com/@floating-ui/core/-/core-1.7.4.tgz#4a006a6e01565c0f87ba222c317b056a2cffd2f4"
+ integrity sha512-C3HlIdsBxszvm5McXlB8PeOEWfBhcGBTZGkGlWc2U0KFY5IwG5OQEuQ8rq52DZmcHDlPLd+YFBK+cZcytwIFWg==
+ dependencies:
+ "@floating-ui/utils" "^0.2.10"
+
"@floating-ui/core@^1.7.3":
version "1.7.3"
resolved "http://52.50.158.57:4873/@floating-ui/core/-/core-1.7.3.tgz#462d722f001e23e46d86fd2bd0d21b7693ccb8b7"
@@ -3663,6 +3700,13 @@
"@floating-ui/core" "^1.7.3"
"@floating-ui/utils" "^0.2.10"
+"@floating-ui/dom@~1.1.1":
+ version "1.1.1"
+ resolved "https://registry.ag-grid.com/@floating-ui/dom/-/dom-1.1.1.tgz#66aa747e15894910869bf9144fc54fc7d6e9f975"
+ integrity sha512-TpIO93+DIujg3g7SykEAGZMDtbJRrmnYRCNYSjJlvIbGhBjRSNTLVbNeDQBrzy9qDgUbiWdc7KA0uZHZ2tJmiw==
+ dependencies:
+ "@floating-ui/core" "^1.1.0"
+
"@floating-ui/react-dom@^2.0.0", "@floating-ui/react-dom@^2.1.2":
version "2.1.6"
resolved "http://52.50.158.57:4873/@floating-ui/react-dom/-/react-dom-2.1.6.tgz#189f681043c1400561f62972f461b93f01bf2231"
@@ -3689,6 +3733,13 @@
resolved "http://52.50.158.57:4873/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6"
integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==
+"@headlessui/vue@^1.7.22":
+ version "1.7.23"
+ resolved "https://registry.ag-grid.com/@headlessui/vue/-/vue-1.7.23.tgz#7fe19dbeca35de9e6270c82c78c4864e6a6f7391"
+ integrity sha512-JzdCNqurrtuu0YW6QaDtR2PIYCKPUWq28csDyMvN4zmGccmE7lz40Is6hc3LA4HFeCI7sekZ/PQMTNmn9I/4Wg==
+ dependencies:
+ "@tanstack/vue-virtual" "^3.0.0-beta.60"
+
"@hono/node-server@^1.19.9":
version "1.19.9"
resolved "https://registry.ag-grid.com/@hono/node-server/-/node-server-1.19.9.tgz#8f37119b1acf283fd3f6035f3d1356fdb97a09ac"
@@ -4621,6 +4672,23 @@
react-lifecycles-compat "~3.0.4"
react-textarea-autosize "~8.5.7"
+"@mobileaction/action-kit@^1.31.3":
+ version "1.58.0"
+ resolved "https://registry.ag-grid.com/@mobileaction/action-kit/-/action-kit-1.58.0.tgz#1a1fa71e3294506b2fc11a3479594edb18581311"
+ integrity sha512-SC7h0x9bdIaqqO0xTy8dcSChyn/MXWSAYbN5snwUaZhBCuNvwnoINb8Ya58pMO23k0fwxTjuYfj8PdXNNljh9A==
+ dependencies:
+ "@headlessui/vue" "^1.7.22"
+ "@vuepic/vue-datepicker" "^11.0.2"
+ "@vueuse/core" "^10.9.0"
+ ant-design-vue "3.2.16"
+ dayjs "^1.11.10"
+ floating-vue "^5.2.2"
+ highcharts "^12.5.0"
+ lottie-web "^5.12.2"
+ vue "^3.5.12"
+ vue-virtual-scroller "^2.0.0-beta.8"
+ vuedraggable "^4.1.0"
+
"@modelcontextprotocol/sdk@1.26.0", "@modelcontextprotocol/sdk@^1.24.0", "@modelcontextprotocol/sdk@^1.24.3":
version "1.26.0"
resolved "https://registry.ag-grid.com/@modelcontextprotocol/sdk/-/sdk-1.26.0.tgz#5b35d73062125f126cc70b0be83cbab53bcdde74"
@@ -7008,6 +7076,14 @@
"@sigstore/core" "^2.0.0"
"@sigstore/protobuf-specs" "^0.4.1"
+"@simonwep/pickr@~1.8.0":
+ version "1.8.2"
+ resolved "https://registry.ag-grid.com/@simonwep/pickr/-/pickr-1.8.2.tgz#96dc86675940d7cad63d69c22083dd1cbb9797cb"
+ integrity sha512-/l5w8BIkrpP6n1xsetx9MWPWlU6OblN5YgZZphxan0Tq4BByTCETL6lyIeY8lagalS2Nbt4F2W034KHLIiunKA==
+ dependencies:
+ core-js "^3.15.1"
+ nanopop "^2.1.0"
+
"@sinclair/typebox@^0.27.8":
version "0.27.8"
resolved "http://52.50.158.57:4873/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e"
@@ -7404,6 +7480,18 @@
dependencies:
"@tanstack/query-core" "5.90.6"
+"@tanstack/virtual-core@3.13.19":
+ version "3.13.19"
+ resolved "https://registry.ag-grid.com/@tanstack/virtual-core/-/virtual-core-3.13.19.tgz#ab7b5de0b7ba17f22530f4efda5bf2b771fbda9d"
+ integrity sha512-/BMP7kNhzKOd7wnDeB8NrIRNLwkf5AhCYCvtfZV2GXWbBieFm/el0n6LOAXlTi6ZwHICSNnQcIxRCWHrLzDY+g==
+
+"@tanstack/vue-virtual@^3.0.0-beta.60":
+ version "3.13.19"
+ resolved "https://registry.ag-grid.com/@tanstack/vue-virtual/-/vue-virtual-3.13.19.tgz#41e8c90414af366ffc6e1b00117c9e462f570202"
+ integrity sha512-07Fp1TYuIziB4zIDA/moeDKHODePy3K1fN4c4VIAGnkxo1+uOvBJP7m54CoxKiQX6Q9a1dZnznrwOg9C86yvvA==
+ dependencies:
+ "@tanstack/virtual-core" "3.13.19"
+
"@testim/chrome-version@^1.1.4":
version "1.1.4"
resolved "http://52.50.158.57:4873/@testim/chrome-version/-/chrome-version-1.1.4.tgz#86e04e677cd6c05fa230dd15ac223fa72d1d7090"
@@ -8163,6 +8251,11 @@
resolved "http://52.50.158.57:4873/@types/unist/-/unist-2.0.11.tgz#11af57b127e32487774841f7a4e54eab166d03c4"
integrity sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==
+"@types/web-bluetooth@^0.0.20":
+ version "0.0.20"
+ resolved "https://registry.ag-grid.com/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz#f066abfcd1cbe66267cdbbf0de010d8a41b41597"
+ integrity sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==
+
"@types/wrap-ansi@^3.0.0":
version "3.0.0"
resolved "http://52.50.158.57:4873/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz#18b97a972f94f60a679fd5c796d96421b9abb9fd"
@@ -8512,7 +8605,7 @@
"@rolldown/pluginutils" "^1.0.0-beta.9"
"@vue/babel-plugin-jsx" "^1.4.0"
-"@vitejs/plugin-vue@^5.0.5":
+"@vitejs/plugin-vue@^5.0.5", "@vitejs/plugin-vue@^5.2.0":
version "5.2.4"
resolved "http://52.50.158.57:4873/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz#9e8a512eb174bfc2a333ba959bbf9de428d89ad8"
integrity sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==
@@ -8723,6 +8816,17 @@
estree-walker "^2.0.2"
source-map-js "^1.2.1"
+"@vue/compiler-core@3.5.29":
+ version "3.5.29"
+ resolved "https://registry.ag-grid.com/@vue/compiler-core/-/compiler-core-3.5.29.tgz#3fb70630c62a2e715eeddc3c2a48f46aa4507adc"
+ integrity sha512-cuzPhD8fwRHk8IGfmYaR4eEe4cAyJEL66Ove/WZL7yWNL134nqLddSLwNRIsFlnnW1kK+p8Ck3viFnC0chXCXw==
+ dependencies:
+ "@babel/parser" "^7.29.0"
+ "@vue/shared" "3.5.29"
+ entities "^7.0.1"
+ estree-walker "^2.0.2"
+ source-map-js "^1.2.1"
+
"@vue/compiler-dom@3.5.13":
version "3.5.13"
resolved "http://52.50.158.57:4873/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz#bb1b8758dbc542b3658dda973b98a1c9311a8a58"
@@ -8739,6 +8843,14 @@
"@vue/compiler-core" "3.5.22"
"@vue/shared" "3.5.22"
+"@vue/compiler-dom@3.5.29":
+ version "3.5.29"
+ resolved "https://registry.ag-grid.com/@vue/compiler-dom/-/compiler-dom-3.5.29.tgz#055cf5492005249591c7fb45868a874468e4ffb3"
+ integrity sha512-n0G5o7R3uBVmVxjTIYcz7ovr8sy7QObFG8OQJ3xGCDNhbG60biP/P5KnyY8NLd81OuT1WJflG7N4KWYHaeeaIg==
+ dependencies:
+ "@vue/compiler-core" "3.5.29"
+ "@vue/shared" "3.5.29"
+
"@vue/compiler-sfc@3.5.13":
version "3.5.13"
resolved "http://52.50.158.57:4873/@vue/compiler-sfc/-/compiler-sfc-3.5.13.tgz#461f8bd343b5c06fac4189c4fef8af32dea82b46"
@@ -8769,6 +8881,21 @@
postcss "^8.5.6"
source-map-js "^1.2.1"
+"@vue/compiler-sfc@3.5.29":
+ version "3.5.29"
+ resolved "https://registry.ag-grid.com/@vue/compiler-sfc/-/compiler-sfc-3.5.29.tgz#8b1b0707fb53c122fedd566244a564eaf40ee71f"
+ integrity sha512-oJZhN5XJs35Gzr50E82jg2cYdZQ78wEwvRO6Y63TvLVTc+6xICzJHP1UIecdSPPYIbkautNBanDiWYa64QSFIA==
+ dependencies:
+ "@babel/parser" "^7.29.0"
+ "@vue/compiler-core" "3.5.29"
+ "@vue/compiler-dom" "3.5.29"
+ "@vue/compiler-ssr" "3.5.29"
+ "@vue/shared" "3.5.29"
+ estree-walker "^2.0.2"
+ magic-string "^0.30.21"
+ postcss "^8.5.6"
+ source-map-js "^1.2.1"
+
"@vue/compiler-ssr@3.5.13":
version "3.5.13"
resolved "http://52.50.158.57:4873/@vue/compiler-ssr/-/compiler-ssr-3.5.13.tgz#e771adcca6d3d000f91a4277c972a996d07f43ba"
@@ -8785,6 +8912,14 @@
"@vue/compiler-dom" "3.5.22"
"@vue/shared" "3.5.22"
+"@vue/compiler-ssr@3.5.29":
+ version "3.5.29"
+ resolved "https://registry.ag-grid.com/@vue/compiler-ssr/-/compiler-ssr-3.5.29.tgz#83ac28c860271bd1c9822d135ac78c388403f949"
+ integrity sha512-Y/ARJZE6fpjzL5GH/phJmsFwx3g6t2KmHKHx5q+MLl2kencADKIrhH5MLF6HHpRMmlRAYBRSvv347Mepf1zVNw==
+ dependencies:
+ "@vue/compiler-dom" "3.5.29"
+ "@vue/shared" "3.5.29"
+
"@vue/compiler-vue2@^2.7.16":
version "2.7.16"
resolved "http://52.50.158.57:4873/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz#2ba837cbd3f1b33c2bc865fbe1a3b53fb611e249"
@@ -8793,6 +8928,11 @@
de-indent "^1.0.2"
he "^1.2.0"
+"@vue/devtools-api@^6.6.4":
+ version "6.6.4"
+ resolved "https://registry.yarnpkg.com/@vue/devtools-api/-/devtools-api-6.6.4.tgz#cbe97fe0162b365edc1dba80e173f90492535343"
+ integrity sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==
+
"@vue/devtools-core@^7.7.7":
version "7.7.7"
resolved "http://52.50.158.57:4873/@vue/devtools-core/-/devtools-core-7.7.7.tgz#9885e2ecb7b462cca8e629d9cff0ab00bfd30d63"
@@ -8846,6 +8986,13 @@
dependencies:
"@vue/shared" "3.5.22"
+"@vue/reactivity@3.5.29":
+ version "3.5.29"
+ resolved "https://registry.ag-grid.com/@vue/reactivity/-/reactivity-3.5.29.tgz#68fbaedcc2584328060edceedc4d4370b49c9fab"
+ integrity sha512-zcrANcrRdcLtmGZETBxWqIkoQei8HaFpZWx/GHKxx79JZsiZ8j1du0VUJtu4eJjgFvU/iKL5lRXFXksVmI+5DA==
+ dependencies:
+ "@vue/shared" "3.5.29"
+
"@vue/runtime-core@3.5.22":
version "3.5.22"
resolved "http://52.50.158.57:4873/@vue/runtime-core/-/runtime-core-3.5.22.tgz#e004c1e35f423555a0e4c10646ef3e9d380643d1"
@@ -8854,6 +9001,14 @@
"@vue/reactivity" "3.5.22"
"@vue/shared" "3.5.22"
+"@vue/runtime-core@3.5.29":
+ version "3.5.29"
+ resolved "https://registry.ag-grid.com/@vue/runtime-core/-/runtime-core-3.5.29.tgz#fbd34110aa47e74a22fe430734018bec56913b40"
+ integrity sha512-8DpW2QfdwIWOLqtsNcds4s+QgwSaHSJY/SUe04LptianUQ/0xi6KVsu/pYVh+HO3NTVvVJjIPL2t6GdeKbS4Lg==
+ dependencies:
+ "@vue/reactivity" "3.5.29"
+ "@vue/shared" "3.5.29"
+
"@vue/runtime-dom@3.5.22":
version "3.5.22"
resolved "http://52.50.158.57:4873/@vue/runtime-dom/-/runtime-dom-3.5.22.tgz#01276cea7cb9ac2b9aba046adfb5903b494e2e7e"
@@ -8864,6 +9019,16 @@
"@vue/shared" "3.5.22"
csstype "^3.1.3"
+"@vue/runtime-dom@3.5.29":
+ version "3.5.29"
+ resolved "https://registry.ag-grid.com/@vue/runtime-dom/-/runtime-dom-3.5.29.tgz#4eb686b22178f13c262ea1d0d7171a3134ced21f"
+ integrity sha512-AHvvJEtcY9tw/uk+s/YRLSlxxQnqnAkjqvK25ZiM4CllCZWzElRAoQnCM42m9AHRLNJ6oe2kC5DCgD4AUdlvXg==
+ dependencies:
+ "@vue/reactivity" "3.5.29"
+ "@vue/runtime-core" "3.5.29"
+ "@vue/shared" "3.5.29"
+ csstype "^3.2.3"
+
"@vue/server-renderer@3.5.22":
version "3.5.22"
resolved "http://52.50.158.57:4873/@vue/server-renderer/-/server-renderer-3.5.22.tgz#d134e3409094044bd066d9803714677457756157"
@@ -8872,6 +9037,14 @@
"@vue/compiler-ssr" "3.5.22"
"@vue/shared" "3.5.22"
+"@vue/server-renderer@3.5.29":
+ version "3.5.29"
+ resolved "https://registry.ag-grid.com/@vue/server-renderer/-/server-renderer-3.5.29.tgz#9cbcbf676b2976fbb8171d5de79501894ba84cad"
+ integrity sha512-G/1k6WK5MusLlbxSE2YTcqAAezS+VuwHhOvLx2KnQU7G2zCH6KIb+5Wyt6UjMq7a3qPzNEjJXs1hvAxDclQH+g==
+ dependencies:
+ "@vue/compiler-ssr" "3.5.29"
+ "@vue/shared" "3.5.29"
+
"@vue/shared@3.5.13":
version "3.5.13"
resolved "http://52.50.158.57:4873/@vue/shared/-/shared-3.5.13.tgz#87b309a6379c22b926e696893237826f64339b6f"
@@ -8882,6 +9055,11 @@
resolved "http://52.50.158.57:4873/@vue/shared/-/shared-3.5.22.tgz#9d56a1644a3becb8af1e34655928b0e288d827f8"
integrity sha512-F4yc6palwq3TT0u+FYf0Ns4Tfl9GRFURDN2gWG7L1ecIaS/4fCIuFOjMTnCyjsu/OK6vaDKLCrGAa+KvvH+h4w==
+"@vue/shared@3.5.29":
+ version "3.5.29"
+ resolved "https://registry.ag-grid.com/@vue/shared/-/shared-3.5.29.tgz#0fe0d7637b05599d56ca58d83a77c637a1774110"
+ integrity sha512-w7SR0A5zyRByL9XUkCfdLs7t9XOHUyJ67qPGQjOou3p6GvBeBW+AVjUUmlxtZ4PIYaRvE+1LmK44O4uajlZwcg==
+
"@vue/test-utils@^2.4.6":
version "2.4.6"
resolved "http://52.50.158.57:4873/@vue/test-utils/-/test-utils-2.4.6.tgz#7d534e70c4319d2a587d6a3b45a39e9695ade03c"
@@ -8895,6 +9073,35 @@
resolved "http://52.50.158.57:4873/@vue/tsconfig/-/tsconfig-0.5.1.tgz#3124ec16cc0c7e04165b88dc091e6b97782fffa9"
integrity sha512-VcZK7MvpjuTPx2w6blwnwZAu5/LgBUtejFOi3pPGQFXQN5Ela03FUtd2Qtg4yWGGissVL0dr6Ro1LfOFh+PCuQ==
+"@vuepic/vue-datepicker@^11.0.2":
+ version "11.0.3"
+ resolved "https://registry.ag-grid.com/@vuepic/vue-datepicker/-/vue-datepicker-11.0.3.tgz#d8e49607d604bd75f7f724a15a195a7d139968b0"
+ integrity sha512-sb2adwqwK2PizLQOpxCYps2SwhVT6/ic2HMIOqHJXuYa6iAJZWGL5YVlS7O4aW+sk6ZyxlDURLO7kDZPL4HB/w==
+ dependencies:
+ date-fns "^4.1.0"
+
+"@vueuse/core@^10.9.0":
+ version "10.11.1"
+ resolved "https://registry.ag-grid.com/@vueuse/core/-/core-10.11.1.tgz#15d2c0b6448d2212235b23a7ba29c27173e0c2c6"
+ integrity sha512-guoy26JQktXPcz+0n3GukWIy/JDNKti9v6VEMu6kV2sYBsWuGiTU8OWdg+ADfUbHg3/3DlqySDe7JmdHrktiww==
+ dependencies:
+ "@types/web-bluetooth" "^0.0.20"
+ "@vueuse/metadata" "10.11.1"
+ "@vueuse/shared" "10.11.1"
+ vue-demi ">=0.14.8"
+
+"@vueuse/metadata@10.11.1":
+ version "10.11.1"
+ resolved "https://registry.ag-grid.com/@vueuse/metadata/-/metadata-10.11.1.tgz#209db7bb5915aa172a87510b6de2ca01cadbd2a7"
+ integrity sha512-IGa5FXd003Ug1qAZmyE8wF3sJ81xGLSqTqtQ6jaVfkeZ4i5kS2mwQF61yhVqojRnenVew5PldLyRgvdl4YYuSw==
+
+"@vueuse/shared@10.11.1":
+ version "10.11.1"
+ resolved "https://registry.ag-grid.com/@vueuse/shared/-/shared-10.11.1.tgz#62b84e3118ae6e1f3ff38f4fbe71b0c5d0f10938"
+ integrity sha512-LHpC8711VFZlDaYUXEBbFBCQ7GS3dVU9mjOhhMhXP6txTV4EhYQg/KGnQuvt/sPAtoUKq7VVUnL6mVtFoL42sA==
+ dependencies:
+ vue-demi ">=0.14.8"
+
"@vusion/webfonts-generator@0.8.0":
version "0.8.0"
resolved "http://52.50.158.57:4873/@vusion/webfonts-generator/-/webfonts-generator-0.8.0.tgz#3ff41b9ec4b83decd87650637ee050741741e794"
@@ -9470,6 +9677,29 @@ ansi-styles@^6.0.0, ansi-styles@^6.1.0, ansi-styles@^6.2.1:
resolved "http://52.50.158.57:4873/ansi-styles/-/ansi-styles-6.2.3.tgz#c044d5dcc521a076413472597a1acb1f103c4041"
integrity sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==
+ant-design-vue@3.2.16:
+ version "3.2.16"
+ resolved "https://registry.ag-grid.com/ant-design-vue/-/ant-design-vue-3.2.16.tgz#d79209537f93d6b87edff712b9cd50fbbea128bc"
+ integrity sha512-kBGxk4csoEi2iaWO62DpNECTnBLIf/CNYW8RdNjLPWo6TBWLQNqLchxRcg8KatOkDRpdWRaqdqeD5P+F6MDC3Q==
+ dependencies:
+ "@ant-design/colors" "^6.0.0"
+ "@ant-design/icons-vue" "^6.1.0"
+ "@babel/runtime" "^7.10.5"
+ "@ctrl/tinycolor" "^3.4.0"
+ "@simonwep/pickr" "~1.8.0"
+ array-tree-filter "^2.1.0"
+ async-validator "^4.0.0"
+ dayjs "^1.10.5"
+ dom-align "^1.12.1"
+ dom-scroll-into-view "^2.0.0"
+ lodash "^4.17.21"
+ lodash-es "^4.17.15"
+ resize-observer-polyfill "^1.5.1"
+ scroll-into-view-if-needed "^2.2.25"
+ shallow-equal "^1.0.0"
+ vue-types "^3.0.0"
+ warning "^4.0.0"
+
any-promise@^1.0.0:
version "1.3.0"
resolved "http://52.50.158.57:4873/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f"
@@ -9560,6 +9790,11 @@ array-iterate@^2.0.0:
resolved "http://52.50.158.57:4873/array-iterate/-/array-iterate-2.0.1.tgz#6efd43f8295b3fee06251d3d62ead4bd9805dd24"
integrity sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==
+array-tree-filter@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.ag-grid.com/array-tree-filter/-/array-tree-filter-2.1.0.tgz#873ac00fec83749f255ac8dd083814b4f6329190"
+ integrity sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==
+
array-union@^2.1.0:
version "2.1.0"
resolved "http://52.50.158.57:4873/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d"
@@ -9698,6 +9933,11 @@ async-generator-function@^1.0.0:
resolved "http://52.50.158.57:4873/async-generator-function/-/async-generator-function-1.0.0.tgz#9bcc76d7fd147171e7ead5d2a2cfc3579c99f28e"
integrity sha512-+NAXNqgCrB95ya4Sr66i1CL2hqLVckAk7xwRYWdcm39/ELQ6YNn1aw5r0bdQtqNZgQpEWzc5yc/igXc7aL5SLA==
+async-validator@^4.0.0:
+ version "4.2.5"
+ resolved "https://registry.ag-grid.com/async-validator/-/async-validator-4.2.5.tgz#c96ea3332a521699d0afaaceed510a54656c6339"
+ integrity sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==
+
async@^3.2.6:
version "3.2.6"
resolved "http://52.50.158.57:4873/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce"
@@ -11069,6 +11309,11 @@ compression@^1.7.4:
safe-buffer "5.2.1"
vary "~1.1.2"
+compute-scroll-into-view@^1.0.20:
+ version "1.0.20"
+ resolved "https://registry.ag-grid.com/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz#1768b5522d1172754f5d0c9b02de3af6be506a43"
+ integrity sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==
+
compute-scroll-into-view@^3.1.0:
version "3.1.1"
resolved "http://52.50.158.57:4873/compute-scroll-into-view/-/compute-scroll-into-view-3.1.1.tgz#02c3386ec531fb6a9881967388e53e8564f3e9aa"
@@ -11229,6 +11474,11 @@ core-js-compat@^3.40.0, core-js-compat@^3.43.0, core-js-compat@^3.44.0:
dependencies:
browserslist "^4.26.3"
+core-js@^3.15.1:
+ version "3.48.0"
+ resolved "https://registry.ag-grid.com/core-js/-/core-js-3.48.0.tgz#1f813220a47bbf0e667e3885c36cd6f0593bf14d"
+ integrity sha512-zpEHTy1fjTMZCKLHUZoVeylt9XrzaIN2rbPXEt0k+q7JE5CkCZdo6bNq55bn24a69CH7ErAVLKijxJja4fw+UQ==
+
core-js@^3.6.5:
version "3.46.0"
resolved "http://52.50.158.57:4873/core-js/-/core-js-3.46.0.tgz#323a092b96381a9184d0cd49ee9083b2f93373bb"
@@ -11686,6 +11936,11 @@ csstype@^3.0.10, csstype@^3.0.2, csstype@^3.1.3:
resolved "http://52.50.158.57:4873/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81"
integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==
+csstype@^3.2.3:
+ version "3.2.3"
+ resolved "https://registry.ag-grid.com/csstype/-/csstype-3.2.3.tgz#ec48c0f3e993e50648c86da559e2610995cf989a"
+ integrity sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==
+
cubic2quad@^1.2.1:
version "1.2.1"
resolved "http://52.50.158.57:4873/cubic2quad/-/cubic2quad-1.2.1.tgz#2442260b72c02ee4b6a2fe998fcc1c4073622286"
@@ -11769,11 +12024,21 @@ data-view-byte-offset@^1.0.1:
es-errors "^1.3.0"
is-data-view "^1.0.1"
+date-fns@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.ag-grid.com/date-fns/-/date-fns-4.1.0.tgz#64b3d83fff5aa80438f5b1a633c2e83b8a1c2d14"
+ integrity sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==
+
date-format@^4.0.14:
version "4.0.14"
resolved "http://52.50.158.57:4873/date-format/-/date-format-4.0.14.tgz#7a8e584434fb169a521c8b7aa481f355810d9400"
integrity sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==
+dayjs@^1.10.5, dayjs@^1.11.10:
+ version "1.11.19"
+ resolved "https://registry.ag-grid.com/dayjs/-/dayjs-1.11.19.tgz#15dc98e854bb43917f12021806af897c58ae2938"
+ integrity sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==
+
de-indent@^1.0.2:
version "1.0.2"
resolved "http://52.50.158.57:4873/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d"
@@ -12128,6 +12393,16 @@ dom-accessibility-api@^0.6.3:
resolved "http://52.50.158.57:4873/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz#993e925cc1d73f2c662e7d75dd5a5445259a8fd8"
integrity sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==
+dom-align@^1.12.1:
+ version "1.12.4"
+ resolved "https://registry.ag-grid.com/dom-align/-/dom-align-1.12.4.tgz#3503992eb2a7cfcb2ed3b2a6d21e0b9c00d54511"
+ integrity sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw==
+
+dom-scroll-into-view@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.ag-grid.com/dom-scroll-into-view/-/dom-scroll-into-view-2.0.1.tgz#0decc8522801fd8d3f1c6ba355a74d382c5f989b"
+ integrity sha512-bvVTQe1lfaUr1oFzZX80ce9KLDlZ3iU+XGNE/bz9HnGdklTieqsbmsLHe+rT2XWqopvL0PckkYqN7ksmm5pe3w==
+
dom-serialize@^2.2.1:
version "2.2.1"
resolved "http://52.50.158.57:4873/dom-serialize/-/dom-serialize-2.2.1.tgz#562ae8999f44be5ea3076f5419dcd59eb43ac95b"
@@ -12461,6 +12736,11 @@ entities@^6.0.0:
resolved "http://52.50.158.57:4873/entities/-/entities-6.0.1.tgz#c28c34a43379ca7f61d074130b2f5f7020a30694"
integrity sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==
+entities@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.ag-grid.com/entities/-/entities-7.0.1.tgz#26e8a88889db63417dcb9a1e79a3f1bc92b5976b"
+ integrity sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==
+
env-paths@^2.2.0, env-paths@^2.2.1:
version "2.2.1"
resolved "http://52.50.158.57:4873/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2"
@@ -13805,6 +14085,14 @@ flattie@^1.1.1:
resolved "http://52.50.158.57:4873/flattie/-/flattie-1.1.1.tgz#88182235723113667d36217fec55359275d6fe3d"
integrity sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==
+floating-vue@^5.2.2:
+ version "5.2.2"
+ resolved "https://registry.ag-grid.com/floating-vue/-/floating-vue-5.2.2.tgz#e263932042753f59f3e36e7c1188f3f3e272a539"
+ integrity sha512-afW+h2CFafo+7Y9Lvw/xsqjaQlKLdJV7h1fCHfcYQ1C4SVMlu7OAekqWgu5d4SgvkBVU0pVpLlVsrSTBURFRkg==
+ dependencies:
+ "@floating-ui/dom" "~1.1.1"
+ vue-resize "^2.0.0-alpha.1"
+
follow-redirects@^1.0.0, follow-redirects@^1.15.11, follow-redirects@^1.15.6:
version "1.15.11"
resolved "http://52.50.158.57:4873/follow-redirects/-/follow-redirects-1.15.11.tgz#777d73d72a92f8ec4d2e410eb47352a56b8e8340"
@@ -14712,6 +15000,11 @@ he@1.2.0, he@^1.2.0:
resolved "http://52.50.158.57:4873/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
+highcharts@^12.5.0:
+ version "12.5.0"
+ resolved "https://registry.ag-grid.com/highcharts/-/highcharts-12.5.0.tgz#1cf5bc1214bb7bbd717096420089d130e84847ff"
+ integrity sha512-uNSSv1KqRLNvkyXlf1FbeGWB1mJ/8/IYpVeqYiTIop5Wo8peUvNyzUfLa58vILsmXyz+XrETtgKIEOcSgBBKuQ==
+
history@^5.3.0:
version "5.3.0"
resolved "http://52.50.158.57:4873/history/-/history-5.3.0.tgz#1548abaa245ba47992f063a0783db91ef201c73b"
@@ -15646,6 +15939,11 @@ is-plain-obj@^4.0.0, is-plain-obj@^4.1.0:
resolved "http://52.50.158.57:4873/is-plain-obj/-/is-plain-obj-4.1.0.tgz#d65025edec3657ce032fd7db63c97883eaed71f0"
integrity sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==
+is-plain-object@3.0.1, is-plain-object@^3.0.0:
+ version "3.0.1"
+ resolved "http://52.50.158.57:4873/is-plain-object/-/is-plain-object-3.0.1.tgz#662d92d24c0aa4302407b0d45d21f2251c85f85b"
+ integrity sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==
+
is-plain-object@^2.0.4:
version "2.0.4"
resolved "http://52.50.158.57:4873/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
@@ -15653,11 +15951,6 @@ is-plain-object@^2.0.4:
dependencies:
isobject "^3.0.1"
-is-plain-object@^3.0.0:
- version "3.0.1"
- resolved "http://52.50.158.57:4873/is-plain-object/-/is-plain-object-3.0.1.tgz#662d92d24c0aa4302407b0d45d21f2251c85f85b"
- integrity sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==
-
is-plain-object@^5.0.0:
version "5.0.0"
resolved "http://52.50.158.57:4873/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344"
@@ -17140,6 +17433,11 @@ locate-path@^7.1.0:
dependencies:
p-locate "^6.0.0"
+lodash-es@^4.17.15:
+ version "4.17.23"
+ resolved "https://registry.ag-grid.com/lodash-es/-/lodash-es-4.17.23.tgz#58c4360fd1b5d33afc6c0bbd3d1149349b1138e0"
+ integrity sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==
+
lodash.camelcase@^4.3.0:
version "4.3.0"
resolved "http://52.50.158.57:4873/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6"
@@ -17230,13 +17528,18 @@ longest-streak@^3.0.0:
resolved "http://52.50.158.57:4873/longest-streak/-/longest-streak-3.1.0.tgz#62fa67cd958742a1574af9f39866364102d90cd4"
integrity sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==
-loose-envify@^1.1.0, loose-envify@^1.4.0:
+loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0:
version "1.4.0"
resolved "http://52.50.158.57:4873/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
dependencies:
js-tokens "^3.0.0 || ^4.0.0"
+lottie-web@^5.12.2:
+ version "5.13.0"
+ resolved "https://registry.ag-grid.com/lottie-web/-/lottie-web-5.13.0.tgz#441d3df217cc8ba302338c3f168e1a3af0f221d3"
+ integrity sha512-+gfBXl6sxXMPe8tKQm7qzLnUy5DUPJPKIyRHwtpCpyUEYjHYRJC/5gjUvdkuO2c3JllrPtHXH5UJJK8LRYl5yQ==
+
loupe@^3.1.0, loupe@^3.1.2:
version "3.2.1"
resolved "http://52.50.158.57:4873/loupe/-/loupe-3.2.1.tgz#0095cf56dc5b7a9a7c08ff5b1a8796ec8ad17e76"
@@ -18298,6 +18601,11 @@ minizlib@^3.0.1, minizlib@^3.1.0:
dependencies:
minipass "^7.1.2"
+mitt@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.ag-grid.com/mitt/-/mitt-2.1.0.tgz#f740577c23176c6205b121b2973514eade1b2230"
+ integrity sha512-ILj2TpLiysu2wkBbWjAmww7TkZb65aiQO+DkVdUTBpBXq+MHYiETENkKFMtsJZX1Lf4pe4QOrTSjIfUwN5lRdg==
+
mitt@^3.0.1:
version "3.0.1"
resolved "http://52.50.158.57:4873/mitt/-/mitt-3.0.1.tgz#ea36cf0cc30403601ae074c8f77b7092cdab36d1"
@@ -18430,6 +18738,11 @@ nanoid@^5.1.0:
resolved "http://52.50.158.57:4873/nanoid/-/nanoid-5.1.6.tgz#30363f664797e7d40429f6c16946d6bd7a3f26c9"
integrity sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg==
+nanopop@^2.1.0:
+ version "2.4.2"
+ resolved "https://registry.ag-grid.com/nanopop/-/nanopop-2.4.2.tgz#b55482135be7e64f2d0f5aa8ef51a58104ac7b13"
+ integrity sha512-NzOgmMQ+elxxHeIha+OG/Pv3Oc3p4RU2aBhwWwAqDpXrdTbtRylbRLQztLy8dMMwfl6pclznBdfUhccEn9ZIzw==
+
nanostores@^0.9.5:
version "0.9.5"
resolved "http://52.50.158.57:4873/nanostores/-/nanostores-0.9.5.tgz#4fcfce9786c4bf16e045a899cda2e46e90780a5b"
@@ -18934,7 +19247,7 @@ npm-run-all2@^6.2.0:
shell-quote "^1.7.3"
which "^3.0.1"
-npm-run-all@4.1.5:
+npm-run-all@4.1.5, npm-run-all@^4.1.5:
version "4.1.5"
resolved "http://52.50.158.57:4873/npm-run-all/-/npm-run-all-4.1.5.tgz#04476202a15ee0e2e214080861bff12a51d98fba"
integrity sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==
@@ -21756,6 +22069,11 @@ requires-port@^1.0.0:
resolved "http://52.50.158.57:4873/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==
+resize-observer-polyfill@^1.5.1:
+ version "1.5.1"
+ resolved "https://registry.ag-grid.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464"
+ integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==
+
resolve-alpn@^1.0.0:
version "1.2.1"
resolved "http://52.50.158.57:4873/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9"
@@ -22325,6 +22643,13 @@ schema-utils@^4.0.0, schema-utils@^4.2.0, schema-utils@^4.3.0:
ajv-formats "^2.1.1"
ajv-keywords "^5.1.0"
+scroll-into-view-if-needed@^2.2.25:
+ version "2.2.31"
+ resolved "https://registry.ag-grid.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.31.tgz#d3c482959dc483e37962d1521254e3295d0d1587"
+ integrity sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==
+ dependencies:
+ compute-scroll-into-view "^1.0.20"
+
scslre@0.3.0:
version "0.3.0"
resolved "http://52.50.158.57:4873/scslre/-/scslre-0.3.0.tgz#c3211e9bfc5547fc86b1eabaa34ed1a657060155"
@@ -22565,6 +22890,11 @@ shallow-clone@^3.0.0:
dependencies:
kind-of "^6.0.2"
+shallow-equal@^1.0.0:
+ version "1.2.1"
+ resolved "https://registry.ag-grid.com/shallow-equal/-/shallow-equal-1.2.1.tgz#4c16abfa56043aa20d050324efa68940b0da79da"
+ integrity sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==
+
sharp@^0.34.0:
version "0.34.5"
resolved "https://registry.ag-grid.com/sharp/-/sharp-0.34.5.tgz#b6f148e4b8c61f1797bde11a9d1cfebbae2c57b0"
@@ -22907,6 +23237,11 @@ sort-keys@^1.0.0:
dependencies:
is-plain-obj "^1.0.0"
+sortablejs@1.14.0:
+ version "1.14.0"
+ resolved "https://registry.ag-grid.com/sortablejs/-/sortablejs-1.14.0.tgz#6d2e17ccbdb25f464734df621d4f35d4ab35b3d8"
+ integrity sha512-pBXvQCs5/33fdN1/39pPL0NZF20LeRbLQ5jtnheIPN9JQAaufGjKdWduZn4U7wCtVuzKhmRkI0DFYHYRbB2H1w==
+
sorted-array-functions@^1.3.0:
version "1.3.0"
resolved "http://52.50.158.57:4873/sorted-array-functions/-/sorted-array-functions-1.3.0.tgz#8605695563294dffb2c9796d602bd8459f7a0dd5"
@@ -25042,7 +25377,7 @@ vite-plugin-vue-inspector@^5.3.1:
kolorist "^1.8.0"
magic-string "^0.30.4"
-vite@6.4.1, vite@^6.4.1:
+vite@6.4.1, vite@^6.0.0, vite@^6.4.1:
version "6.4.1"
resolved "http://52.50.158.57:4873/vite/-/vite-6.4.1.tgz#afbe14518cdd6887e240a4b0221ab6d0ce733f96"
integrity sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==
@@ -25241,7 +25576,29 @@ vue-component-type-helpers@^2.0.0:
resolved "http://52.50.158.57:4873/vue-component-type-helpers/-/vue-component-type-helpers-2.2.12.tgz#5014787aad185a22f460ad469cc51f14524308bc"
integrity sha512-YbGqHZ5/eW4SnkPNR44mKVc6ZKQoRs/Rux1sxC6rdwXb4qpbOSYfDr9DsTHolOTGmIKgM9j141mZbBeg05R1pw==
-vue-tsc@^2.0.21:
+vue-demi@>=0.14.8:
+ version "0.14.10"
+ resolved "https://registry.ag-grid.com/vue-demi/-/vue-demi-0.14.10.tgz#afc78de3d6f9e11bf78c55e8510ee12814522f04"
+ integrity sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==
+
+vue-observe-visibility@^2.0.0-alpha.1:
+ version "2.0.0-alpha.1"
+ resolved "https://registry.ag-grid.com/vue-observe-visibility/-/vue-observe-visibility-2.0.0-alpha.1.tgz#1e4eda7b12562161d58984b7e0dea676d83bdb13"
+ integrity sha512-flFbp/gs9pZniXR6fans8smv1kDScJ8RS7rEpMjhVabiKeq7Qz3D9+eGsypncjfIyyU84saU88XZ0zjbD6Gq/g==
+
+vue-resize@^2.0.0-alpha.1:
+ version "2.0.0-alpha.1"
+ resolved "https://registry.ag-grid.com/vue-resize/-/vue-resize-2.0.0-alpha.1.tgz#43eeb79e74febe932b9b20c5c57e0ebc14e2df3a"
+ integrity sha512-7+iqOueLU7uc9NrMfrzbG8hwMqchfVfSzpVlCMeJQe4pyibqyoifDNbKTZvwxZKDvGkB+PdFeKvnGZMoEb8esg==
+
+vue-router@^4.5.0:
+ version "4.6.4"
+ resolved "https://registry.yarnpkg.com/vue-router/-/vue-router-4.6.4.tgz#a0a9cb9ef811a106d249e4bb9313d286718020d8"
+ integrity sha512-Hz9q5sa33Yhduglwz6g9skT8OBPii+4bFn88w6J+J4MfEo4KRRpmiNG/hHHkdbRFlLBOqxN8y8gf2Fb0MTUgVg==
+ dependencies:
+ "@vue/devtools-api" "^6.6.4"
+
+vue-tsc@^2.0.0, vue-tsc@^2.0.21:
version "2.2.12"
resolved "http://52.50.158.57:4873/vue-tsc/-/vue-tsc-2.2.12.tgz#5f719b08ef7390a763c1a20169ca5c9d09d55688"
integrity sha512-P7OP77b2h/Pmk+lZdJ0YWs+5tJ6J2+uOQPo7tlBnY44QqQSPYvS0qVT4wqDJgwrZaLe47etJLLQRFia71GYITw==
@@ -25249,6 +25606,22 @@ vue-tsc@^2.0.21:
"@volar/typescript" "2.4.15"
"@vue/language-core" "2.2.12"
+vue-types@^3.0.0:
+ version "3.0.2"
+ resolved "https://registry.ag-grid.com/vue-types/-/vue-types-3.0.2.tgz#ec16e05d412c038262fc1efa4ceb9647e7fb601d"
+ integrity sha512-IwUC0Aq2zwaXqy74h4WCvFCUtoV0iSWr0snWnE9TnU18S66GAQyqQbRf2qfJtUuiFsBf6qp0MEwdonlwznlcrw==
+ dependencies:
+ is-plain-object "3.0.1"
+
+vue-virtual-scroller@^2.0.0-beta.8:
+ version "2.0.0-beta.8"
+ resolved "https://registry.ag-grid.com/vue-virtual-scroller/-/vue-virtual-scroller-2.0.0-beta.8.tgz#eeceda57e4faa5ba1763994c873923e2a956898b"
+ integrity sha512-b8/f5NQ5nIEBRTNi6GcPItE4s7kxNHw2AIHLtDp+2QvqdTjVN0FgONwX9cr53jWRgnu+HRLPaWDOR2JPI5MTfQ==
+ dependencies:
+ mitt "^2.1.0"
+ vue-observe-visibility "^2.0.0-alpha.1"
+ vue-resize "^2.0.0-alpha.1"
+
vue@^3.5.0, vue@^3.5.13:
version "3.5.22"
resolved "http://52.50.158.57:4873/vue/-/vue-3.5.22.tgz#2b8ddb94ee4b640ef12fe7f6efe1cf16f3b582e7"
@@ -25260,6 +25633,24 @@ vue@^3.5.0, vue@^3.5.13:
"@vue/server-renderer" "3.5.22"
"@vue/shared" "3.5.22"
+vue@^3.5.12:
+ version "3.5.29"
+ resolved "https://registry.ag-grid.com/vue/-/vue-3.5.29.tgz#859a1cc5219eb1228c7ce6f355b27de080517111"
+ integrity sha512-BZqN4Ze6mDQVNAni0IHeMJ5mwr8VAJ3MQC9FmprRhcBYENw+wOAAjRj8jfmN6FLl0j96OXbR+CjWhmAmM+QGnA==
+ dependencies:
+ "@vue/compiler-dom" "3.5.29"
+ "@vue/compiler-sfc" "3.5.29"
+ "@vue/runtime-dom" "3.5.29"
+ "@vue/server-renderer" "3.5.29"
+ "@vue/shared" "3.5.29"
+
+vuedraggable@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.ag-grid.com/vuedraggable/-/vuedraggable-4.1.0.tgz#edece68adb8a4d9e06accff9dfc9040e66852270"
+ integrity sha512-FU5HCWBmsf20GpP3eudURW3WdWTKIbEIQxh9/8GE806hydR9qZqRRxRE3RjqX7PkuLuMQG/A7n3cfj9rCEchww==
+ dependencies:
+ sortablejs "1.14.0"
+
w3c-xmlserializer@^4.0.0:
version "4.0.0"
resolved "http://52.50.158.57:4873/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz#aebdc84920d806222936e3cdce408e32488a3073"
@@ -25286,6 +25677,13 @@ walker@^1.0.8:
dependencies:
makeerror "1.0.12"
+warning@^4.0.0:
+ version "4.0.3"
+ resolved "https://registry.ag-grid.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3"
+ integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==
+ dependencies:
+ loose-envify "^1.0.0"
+
watchpack@2.4.1:
version "2.4.1"
resolved "http://52.50.158.57:4873/watchpack/-/watchpack-2.4.1.tgz#29308f2cac150fa8e4c92f90e0ec954a9fed7fff"