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 @@ + + + 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 @@ + + + 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 @@ + + + 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 @@ + + + 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 @@ + + + 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 @@ + + + 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 @@ + + + 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 @@ + + + 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 @@ + + + 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 @@ + + + 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 @@ + + + + + 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 @@ + + + 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 @@ + + + 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"