diff --git a/.github/actions/yarn-nm-install/action.yml b/.github/actions/yarn-nm-install/action.yml index d88284249..e1a669e27 100644 --- a/.github/actions/yarn-nm-install/action.yml +++ b/.github/actions/yarn-nm-install/action.yml @@ -67,8 +67,9 @@ runs: with: path: ${{ steps.yarn-config.outputs.CACHE_FOLDER }} key: yarn-download-cache-${{ hashFiles(format('{0}/yarn.lock', inputs.cwd), format('{0}/.yarnrc.yml', inputs.cwd)) }} - restore-keys: | - yarn-download-cache- + # No restore-keys: avoid restoring a stale cache from a different lockfile. + # A stale cache can miss artifacts (e.g. react-data-grid git dependency zip) + # and cause ENOENT during `yarn install --immutable`. - name: Restore node_modules if: inputs.cache-node-modules == 'true' diff --git a/.github/workflows/node-ci.yml b/.github/workflows/node-ci.yml index 51f624f30..94da232ea 100644 --- a/.github/workflows/node-ci.yml +++ b/.github/workflows/node-ci.yml @@ -81,6 +81,14 @@ jobs: - name: Install dependencies uses: ./.github/actions/yarn-nm-install + with: + # Disable node_modules and install-state cache to avoid ENOENT when + # .yarn/cache (e.g. react-data-grid git dependency zip) is missing. + # The release job runs on a fresh runner; restoring node_modules without + # the matching .yarn/cache causes "stat .../react-data-grid-https-*.zip" + # to fail during the Fetch step. + cache-node-modules: false + cache-install-state: false - name: Build library run: yarn run lerna run build --no-private @@ -89,3 +97,8 @@ jobs: run: yarn auto shipit env: GITHUB_TOKEN: ${{ steps.generate-token.outputs.token }} + # Disable hardened mode so Lerna's `yarn install --mode update-lockfile` + # can access .yarn/cache. Hardened mode runs resolution in a sandbox where + # the react-data-grid git dependency artifact never reaches the cache, + # causing ENOENT during the Fetch step. + YARN_ENABLE_HARDENED_MODE: '0' diff --git a/package.json b/package.json index 943cbb313..c39ab0cb6 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,8 @@ }, "resolutions": { "@types/react": "18.2.74", - "@rollup/plugin-eslint/eslint": "^9.28.0" + "@rollup/plugin-eslint/eslint": "^9.28.0", + "rxjs": "7.8.1" }, "packageManager": "yarn@4.1.1", "workspaces": [ diff --git a/packages/scenes-app/package.json b/packages/scenes-app/package.json index c814e108a..86edaf614 100644 --- a/packages/scenes-app/package.json +++ b/packages/scenes-app/package.json @@ -20,12 +20,12 @@ "@babel/core": "^7.16.7", "@eslint/compat": "1.3.0", "@grafana/e2e": "9.2.1", - "@grafana/e2e-selectors": "^11.5.0", + "@grafana/e2e-selectors": "^12.3.0", "@grafana/eslint-config": "8.1.0", "@grafana/tsconfig": "1.3.0-rc1", "@stylistic/eslint-plugin-ts": "3.1.0", "@swc/core": "^1.2.144", - "@swc/helpers": "^0.3.6", + "@swc/helpers": "~0.5.0", "@swc/jest": "^0.2.36", "@testing-library/jest-dom": "^6.4.2", "@testing-library/react": "^12.1.3", @@ -64,13 +64,13 @@ }, "dependencies": { "@emotion/css": "^11.1.3", - "@grafana/data": "^11.6.0", - "@grafana/runtime": "^11.6.0", + "@grafana/data": "^12.3.0", + "@grafana/runtime": "^12.3.0", "@grafana/scenes": "workspace:*", - "@grafana/scenes-ml": "^0.2.0", + "@grafana/scenes-ml": "^0.5.0", "@grafana/scenes-react": "workspace:*", - "@grafana/schema": "^11.6.0", - "@grafana/ui": "^11.6.0", + "@grafana/schema": "^12.3.0", + "@grafana/ui": "^12.3.0", "@types/lodash": "latest", "react": "18.2.0", "react-dom": "18.2.0", diff --git a/packages/scenes-app/src/demos/filteringData.tsx b/packages/scenes-app/src/demos/filteringData.tsx index fdace1952..1f46d434d 100644 --- a/packages/scenes-app/src/demos/filteringData.tsx +++ b/packages/scenes-app/src/demos/filteringData.tsx @@ -2,7 +2,6 @@ import React from 'react'; import { EmbeddedScene, PanelBuilders, - PanelOptionsBuilders, SceneAppPage, SceneAppPageState, SceneComponentProps, @@ -10,12 +9,12 @@ import { SceneFlexItem, SceneFlexLayout, SceneObjectBase, - SceneObjectRef, SceneObjectState, SceneQueryRunner, + SceneObjectRef, VizPanel, } from '@grafana/scenes'; -import { InlineSwitch, Input } from '@grafana/ui'; +import { Input, InlineSwitch } from '@grafana/ui'; import { getEmbeddedSceneDefaults } from './utils'; import { ControlsLabel } from '@grafana/scenes/src/utils/ControlsLabel'; import { DataTransformerConfig, MatcherConfig } from '@grafana/schema'; @@ -54,7 +53,10 @@ export function getDataFilteringTest(defaults: SceneAppPageState) { }); const tablePanel = PanelBuilders.table().setData(filteredData).build(); - const paginationControl = new PaginationControl({ vizPanelRef: new SceneObjectRef(tablePanel) }); + + const paginationControl = new PaginationControl({ + vizPanelRef: new SceneObjectRef(tablePanel), + }); return new SceneAppPage({ ...defaults, @@ -86,7 +88,7 @@ interface PaginationControlState extends SceneObjectState { class PaginationControl extends SceneObjectBase { static Component = PaginationControlRenderer; - public constructor(initialState: Omit) { + public constructor(initialState: Omit & { isEnabled?: boolean }) { super({ isEnabled: false, ...initialState, @@ -97,13 +99,18 @@ class PaginationControl extends SceneObjectBase { const isEnabled = !this.state.isEnabled; this.setState({ isEnabled }); - const nextOptions = PanelOptionsBuilders.table() - .setOption('footer', { + const panel = this.state.vizPanelRef.resolve(); + const currentOptions = panel.state.options as Record; + const nextOptions = { + ...currentOptions, + enablePagination: isEnabled, + // Legacy path: some table panel versions still read from footer.enablePagination + footer: { + ...(typeof currentOptions.footer === 'object' && currentOptions.footer ? currentOptions.footer : {}), enablePagination: isEnabled, - }) - .build(); - - this.state.vizPanelRef.resolve().onOptionsChange(nextOptions); + }, + }; + panel.onOptionsChange(nextOptions, true); }; } diff --git a/packages/scenes-app/src/monitoring-app/scenes.tsx b/packages/scenes-app/src/monitoring-app/scenes.tsx index 4bc2ed6ae..60977a7f5 100644 --- a/packages/scenes-app/src/monitoring-app/scenes.tsx +++ b/packages/scenes-app/src/monitoring-app/scenes.tsx @@ -52,15 +52,10 @@ export function getHttpHandlerListScene(): EmbeddedScene { const httpHandlersTable = PanelBuilders.table() .setTitle('Handlers') .setData(httpHandlerQueriesFiltered) - .setOption('footer', { - enablePagination: true, - }) .setOverrides((b) => b .matchFieldsWithNameByRegex('.*') .overrideFilterable(false) - .matchFieldsWithName('Time') - .overrideCustomFieldConfig('hidden', true) .matchFieldsWithName('Value') .overrideDisplayName('Duration (Avg)') .matchFieldsWithName('handler') diff --git a/packages/scenes-app/src/monitoring-app/traffic.tsx b/packages/scenes-app/src/monitoring-app/traffic.tsx index 9f395c0a0..5dc1d4b60 100644 --- a/packages/scenes-app/src/monitoring-app/traffic.tsx +++ b/packages/scenes-app/src/monitoring-app/traffic.tsx @@ -29,13 +29,10 @@ export function getTrafficScene(): EmbeddedScene { }) ) .setTitle('Handlers') - .setOption('footer', { enablePagination: true }) .setOverrides((b) => b .matchFieldsWithNameByRegex('.*') .overrideFilterable(false) - .matchFieldsWithName('Time') - .overrideCustomFieldConfig('hidden', true) .matchFieldsWithName('Value') .overrideDisplayName('Duration (Avg)') .matchFieldsWithName('handler') @@ -103,7 +100,13 @@ export class HandlerDrilldownViewBehavior extends SceneObjectBase this.setState({ handler: undefined })} /> +