diff --git a/RELEASE.md b/RELEASE.md index 97d67b7052..295184a215 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -6,10 +6,10 @@ Please follow the established format: - Include the ID number for the related PR (or PRs) in parentheses --> -# Release 10.2.0 +# Release 10.2.0 - -## Major features and improvements +## Deprecations +- Added a deprecation warning for the removal of the Experiment Tracking feature, which will be deprecated in Kedro-Viz version 11.0.0. For more details, please refer to our [blog post](https://kedro.org/blog/deprecate-experiment-tracking-kedro-viz). (#2248, #2263) ## Bug fixes and other changes diff --git a/cypress/support/commands.js b/cypress/support/commands.js index 169fc93cc8..d1580155a0 100644 --- a/cypress/support/commands.js +++ b/cypress/support/commands.js @@ -1,5 +1,6 @@ // Add any reusable custom commands here import { join } from 'path'; +import { localStorageETDeprecationBannerSeen } from '../../src/config'; /** * Custom command for intercepting network requests using fixtures for GraphQL @@ -167,11 +168,19 @@ Cypress.Commands.add('__conditionalVisit__', () => { cy.__interceptGql__('getRunData'); cy.__interceptGql__('getMetricPlotData'); - cy.visit('/experiment-tracking'); + cy.visit('/experiment-tracking', { + onBeforeLoad(win) { + win.localStorage.setItem(localStorageETDeprecationBannerSeen, JSON.stringify(true)); + } + }); cy.wait(['@getRunsList', '@getRunData', '@getMetricPlotData']); } else { - cy.visit('/'); + cy.visit('/', { + onBeforeLoad(win) { + win.localStorage.setItem(localStorageETDeprecationBannerSeen, JSON.stringify(true)); + } + }); } }); diff --git a/cypress/tests/ui/flowchart/banners.cy.js b/cypress/tests/ui/flowchart/banners.cy.js index b7a66b4f54..0910fe2d68 100644 --- a/cypress/tests/ui/flowchart/banners.cy.js +++ b/cypress/tests/ui/flowchart/banners.cy.js @@ -1,8 +1,4 @@ describe('Banners in Kedro-Viz', () => { - beforeEach(() => { - // Clears localStorage before each test - cy.clearLocalStorage(); - }); it("shows a missing dependencies banner in viz lite mode if the kedro project dependencies are not installed.", () => { // Intercept the network request to mock with a fixture diff --git a/cypress/tests/ui/flowchart/shareable-urls.cy.js b/cypress/tests/ui/flowchart/shareable-urls.cy.js index 776e745ffc..ec39a6a94a 100644 --- a/cypress/tests/ui/flowchart/shareable-urls.cy.js +++ b/cypress/tests/ui/flowchart/shareable-urls.cy.js @@ -1,8 +1,4 @@ describe('Shareable URLs with empty localStorage', () => { - beforeEach(() => { - // Clears localStorage before each test - cy.clearLocalStorage(); - }); it('verifies that users can open the Deploy Kedro-Viz modal if the localStorage is empty. #TC-52', () => { // Intercept the network request to mock with a fixture diff --git a/cypress/tests/ui/toolbar/global-toolbar.cy.js b/cypress/tests/ui/toolbar/global-toolbar.cy.js index 64971aa1d7..f492e535b8 100644 --- a/cypress/tests/ui/toolbar/global-toolbar.cy.js +++ b/cypress/tests/ui/toolbar/global-toolbar.cy.js @@ -1,10 +1,15 @@ // All E2E Tests Related to global-toolbar goes here. import { prettifyName, stripNamespace } from '../../../../src/utils'; +import { localStorageETDeprecationBannerSeen } from '../../../../src/config'; describe('Global Toolbar', () => { before(() => { - cy.visit('/'); // Visit the application + cy.visit('/', { + onBeforeLoad(win) { + win.localStorage.setItem(localStorageETDeprecationBannerSeen, JSON.stringify(true)); + } + }); cy.enablePrettyNames(); // Enable pretty names using the custom command }); diff --git a/demo-project/.version b/demo-project/.version index 3b9bddfcc4..fe46e0dd39 100644 --- a/demo-project/.version +++ b/demo-project/.version @@ -1 +1 @@ -10.1.0 \ No newline at end of file +10.2.0 \ No newline at end of file diff --git a/demo-project/lightsail.json b/demo-project/lightsail.json index c45139fc99..4de2690973 100644 --- a/demo-project/lightsail.json +++ b/demo-project/lightsail.json @@ -2,7 +2,7 @@ "serviceName": "kedro-viz-live-demo", "containers": { "kedro-viz-live-demo": { - "image": "public.ecr.aws/g0x0s3o2/kedro-viz-live-demo:10.1.0", + "image": "public.ecr.aws/g0x0s3o2/kedro-viz-live-demo:10.2.0", "ports": { "4141": "HTTP" } diff --git a/docs/source/experiment_tracking.md b/docs/source/experiment_tracking.md index c06ca5a208..cb46fc9b24 100644 --- a/docs/source/experiment_tracking.md +++ b/docs/source/experiment_tracking.md @@ -1,7 +1,7 @@ # Experiment tracking in Kedro-Viz ```{important} -Starting from version 8.0.0 of Kedro-Viz, Experiment Tracking is exclusively supported for users with kedro-datasets version 2.1.0 or higher. +Starting from Kedro-Viz 11.0.0, native experiment tracking will be deprecated in Kedro and Kedro-Viz. To enable experiment tracking in Kedro with MLflow, follow the migrate to [`kedro-mlflow` documentation](./migrate_experiment_tracking.md). ``` Experiment tracking is the process of saving all the metadata related to an experiment each time you run it. It enables you to compare different runs of a machine-learning model as part of the experimentation process. diff --git a/docs/source/index.md b/docs/source/index.md index ea10570cfb..006a99a6de 100644 --- a/docs/source/index.md +++ b/docs/source/index.md @@ -31,6 +31,7 @@ share_kedro_viz preview_datasets slice_a_pipeline experiment_tracking +migrate_experiment_tracking ``` ```{toctree} diff --git a/docs/source/migrate_experiment_tracking.md b/docs/source/migrate_experiment_tracking.md new file mode 100644 index 0000000000..47b6acf83a --- /dev/null +++ b/docs/source/migrate_experiment_tracking.md @@ -0,0 +1,139 @@ +# Migration from Kedro-Viz native experiment tracking to `kedro-mlflow` + +With the deprecation of Kedro-Viz experiment tracking from version 11.0.0, transitioning to [`kedro-mlflow`](https://kedro-mlflow.readthedocs.io/en/stable/) offers enhanced experiment tracking and artifact management. This guide outlines the steps to: + +1. **Remove deprecated Kedro-Viz experiment tracking configurations.** +2. **Update existing dataset configurations in the catalog to use `kedro-mlflow`.** +3. **Optionally, delete old experiment tracking data.** + +## Remove deprecated Kedro-Viz experiment tracking configurations + +### 1. Remove session store setup + +In `src//settings.py`, locate and remove the session store configuration: + +```python +from kedro_viz.integrations.kedro.sqlite_store import SQLiteStore + +SESSION_STORE_CLASS = SQLiteStore +SESSION_STORE_ARGS = {"path": str(Path(__file__).parents[2] / "data")} +``` + +### 2. Remove environment variables +Remove any environment variables associated with collaborative tracking: + +```bash +unset KEDRO_SQLITE_STORE_USERNAME +``` + +### 3. Delete SQLite database +If a `session_store.db` SQLite database was created, you can delete it to clean up your project. This file is typically located in one of the following directories: + +- The project root +- The `.viz` folder within the project root +- The `data` folder + +## Update dataset configurations in catalog to use `kedro-mlflow` + +Update the dataset configurations in your `catalog.yml` to transition to `kedro-mlflow`. Refer to the table below for the changes: + +### Dataset migration table + +| Kedro-Viz Dataset Type | MLflow Dataset Type | Update Instructions | +|---------------------------------|----------------------------|---------------------------------------------------------| +| `tracking.MetricsDataset` | `MlflowMetricDataset` | Update type to [`MlflowMetricDataset`](https://kedro-mlflow.readthedocs.io/en/stable/source/31_API/kedro_mlflow.io.html#kedro_mlflow.io.metrics.mlflow_metric_dataset.MlflowMetricDataset). | +| `tracking.JSONDataset` | `MlflowArtifactDataset` | Wrap within [`MlflowArtifactDataset`](https://kedro-mlflow.readthedocs.io/en/stable/source/31_API/kedro_mlflow.io.html#kedro_mlflow.io.artifacts.mlflow_artifact_dataset.MlflowArtifactDataset) as `json.JSONDataset`. | +| `plotly.plotlyDataset` | `MlflowArtifactDataset` | Wrap within [`MlflowArtifactDataset`](https://kedro-mlflow.readthedocs.io/en/stable/source/31_API/kedro_mlflow.io.html#kedro_mlflow.io.artifacts.mlflow_artifact_dataset.MlflowArtifactDataset) as `plotly.HTMLDataset`. | +| `plotly.JSONDataset` | `MlflowArtifactDataset` | Wrap within [`MlflowArtifactDataset`](https://kedro-mlflow.readthedocs.io/en/stable/source/31_API/kedro_mlflow.io.html#kedro_mlflow.io.artifacts.mlflow_artifact_dataset.MlflowArtifactDataset) as `plotly.HTMLDataset`. | +| `matplotlib.MatplotlibWriter` | `MlflowArtifactDataset` | Wrap within [`MlflowArtifactDataset`](https://kedro-mlflow.readthedocs.io/en/stable/source/31_API/kedro_mlflow.io.html#kedro_mlflow.io.artifacts.mlflow_artifact_dataset.MlflowArtifactDataset). | + +### Metrics dataset +For `tracking.MetricsDataset`, update its type to [`MlflowMetricDataset`](https://kedro-mlflow.readthedocs.io/en/stable/source/31_API/kedro_mlflow.io.html#kedro_mlflow.io.metrics.mlflow_metric_dataset.MlflowMetricDataset): + +Before: +```yaml +metrics: + type: tracking.MetricsDataset + filepath: data/09_tracking/metrics.json + versioned: true +``` + +After: +```yaml +metrics: + type: kedro_mlflow.io.metrics.MlflowMetricDataset +``` + +### JSON dataset +For `tracking.JSONDataset`, wrap it within [`MlflowArtifactDataset`](https://kedro-mlflow.readthedocs.io/en/stable/source/31_API/kedro_mlflow.io.html#kedro_mlflow.io.artifacts.mlflow_artifact_dataset.MlflowArtifactDataset) and configure it as `json.JSONDataset`: + +Before: +```yaml +companies_columns: + type: tracking.JSONDataset + filepath: data/09_tracking/json_data.json + versioned: true +``` + +After: +```yaml +companies_columns: + type: kedro_mlflow.io.artifacts.MlflowArtifactDataset + dataset: + type: json.JSONDataset + filepath: data/02_intermediate/companies_columns.json +``` + +### Plotly dataset +For `plotly.plotlyDataset` and `plotly.JSONDataset`, wrap it within [`MlflowArtifactDataset`](https://kedro-mlflow.readthedocs.io/en/stable/source/31_API/kedro_mlflow.io.html#kedro_mlflow.io.artifacts.mlflow_artifact_dataset.MlflowArtifactDataset) and configure it as `plotly.HTMLDataset` to render interactive plots in the MLflow UI: + +Before: +```yaml +plotly_json_data: + type: plotly.JSONDataset + filepath: data/09_tracking/plotly.json +``` + +After: +```yaml +plotly_json_data: + type: kedro_mlflow.io.artifacts.MlflowArtifactDataset + dataset: + type: plotly.HTMLDataset + filepath: data/08_reporting/plotly.html +``` + +### Matplotlib writer +For `matplotlib.MatplotlibWriter`, wrap it within [`MlflowArtifactDataset`](https://kedro-mlflow.readthedocs.io/en/stable/source/31_API/kedro_mlflow.io.html#kedro_mlflow.io.artifacts.mlflow_artifact_dataset.MlflowArtifactDataset): + +Before: +```yaml +confusion_matrix: + type: matplotlib.MatplotlibWriter + filepath: data/09_tracking/confusion_matrix.png + versioned: true +``` + +After: +```yaml +confusion_matrix: + type: kedro_mlflow.io.artifacts.MlflowArtifactDataset + dataset: + type: matplotlib.MatplotlibWriter + filepath: data/08_reporting/confusion_matrix.png +``` + +## [Optional] Delete old tracking data + +Old experiment tracking data stored in `data/09_tracking/` is no longer needed. You can delete this directory to clean up your project: + +```bash +rm -rf data/09_tracking/ +``` + +## Refer to the `kedro-mlflow` documentation for further setup + +After completing these steps, follow the below MLflow documentation to complete your experiment tracking setup with MLflow. + +- [The official Kedro + MLflow guide in the Kedro documentation](https://docs.kedro.org/en/stable/integrations/mlflow.html) +- The documentation of [`kedro-mlflow`](https://docs.kedro.org/en/latest/integrations/mlflow.html) plugin \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 9de9baa9a4..87dc25742a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@quantumblack/kedro-viz", - "version": "10.1.0", + "version": "10.2.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@quantumblack/kedro-viz", - "version": "9.2.0", + "version": "10.1.0", "dependencies": { "@apollo/client": "^3.5.6", "@emotion/react": "^11.10.6", @@ -34816,4 +34816,4 @@ } } } -} \ No newline at end of file +} diff --git a/package.json b/package.json index 6bb5472a34..e37373a047 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@quantumblack/kedro-viz", - "version": "10.1.0", + "version": "10.2.0", "description": "Kedro-Viz is an interactive development tool for building data science pipelines with Kedro.", "main": "lib/components/app/index.js", "files": [ diff --git a/package/kedro_viz/__init__.py b/package/kedro_viz/__init__.py index 8ca1eb6e01..9d5c7ae24e 100644 --- a/package/kedro_viz/__init__.py +++ b/package/kedro_viz/__init__.py @@ -3,7 +3,7 @@ import sys import warnings -__version__ = "10.1.0" +__version__ = "10.2.0" class KedroVizPythonVersionWarning(UserWarning): diff --git a/package/kedro_viz/integrations/kedro/lite_parser.py b/package/kedro_viz/integrations/kedro/lite_parser.py index e3af8b42e6..aa531d2eea 100755 --- a/package/kedro_viz/integrations/kedro/lite_parser.py +++ b/package/kedro_viz/integrations/kedro/lite_parser.py @@ -240,9 +240,17 @@ def parse(self, target_path: Path) -> Union[Dict[str, Set[str]], None]: unresolved_imports: Dict[str, Set[str]] = {} if target_path.is_file(): - missing_dependencies = self._get_unresolved_imports(target_path) - if len(missing_dependencies) > 0: - unresolved_imports[str(target_path)] = missing_dependencies + try: + missing_dependencies = self._get_unresolved_imports(target_path) + if len(missing_dependencies) > 0: + unresolved_imports[str(target_path)] = missing_dependencies + except Exception as exc: # noqa: BLE001 + logger.error( + "An error occurred in LiteParser while mocking dependencies in %s : %s", + target_path, + exc, + ) + return unresolved_imports # handling directories @@ -263,7 +271,8 @@ def parse(self, target_path: Path) -> Union[Dict[str, Set[str]], None]: unresolved_imports[str(file_path)] = missing_dependencies except Exception as exc: # noqa: BLE001 # pragma: no cover logger.error( - "An error occurred in LiteParser while mocking dependencies : %s", + "An error occurred in LiteParser while mocking dependencies in %s : %s", + file_path, exc, ) continue diff --git a/package/kedro_viz/launchers/cli/run.py b/package/kedro_viz/launchers/cli/run.py index 4f73de8b62..d78c7e20b1 100644 --- a/package/kedro_viz/launchers/cli/run.py +++ b/package/kedro_viz/launchers/cli/run.py @@ -139,6 +139,12 @@ def run( # noqa: PLR0915 ) return + display_cli_message( + "WARNING: Experiment Tracking on Kedro-viz will be deprecated in Kedro-Viz 11.0.0. " + "Please refer to the Kedro documentation for migration guidance.", + "yellow", + ) + installed_version = parse(__version__) latest_version = get_latest_version() if is_running_outdated_version(installed_version, latest_version): diff --git a/package/pyproject.toml b/package/pyproject.toml index 3b9c0bab49..edfd217128 100644 --- a/package/pyproject.toml +++ b/package/pyproject.toml @@ -29,7 +29,7 @@ Tracker = "https://github.com/kedro-org/kedro-viz/issues" [project.optional-dependencies] docs = [ - "kedro-sphinx-theme==2024.10.2", + "kedro-sphinx-theme==2024.10.3", ] aws = ["s3fs>=2021.4"] azure = ["adlfs>=2021.4"] diff --git a/package/tests/test_integrations/test_lite_parser.py b/package/tests/test_integrations/test_lite_parser.py index b3ae1eedea..7e55010b23 100644 --- a/package/tests/test_integrations/test_lite_parser.py +++ b/package/tests/test_integrations/test_lite_parser.py @@ -179,6 +179,25 @@ def test_file_parse(self, lite_parser, sample_project_path): assert unresolved_imports == {str(file_path): {"nonexistentmodule"}} + def test_parse_logs_error_on_exception(self, lite_parser, tmp_path, caplog): + file_path = Path(tmp_path / "mock_spaceflights/data_processing_non_utf.py") + file_path.parent.mkdir(parents=True, exist_ok=True) + + # Write non-UTF characters (e.g., using ISO-8859-1 encoding) + non_utf_content = "This is a test with non-UTF characters: é, ñ, ü" + + # Write the file in ISO-8859-1 encoding + with open(file_path, "w", encoding="ISO-8859-1") as f: + f.write(non_utf_content) + + assert file_path.exists() + + lite_parser.parse(file_path) + assert ( + f"An error occurred in LiteParser while mocking dependencies in {str(file_path)}" + in caplog.text + ) + def test_directory_parse(self, lite_parser, sample_project_path): unresolved_imports = lite_parser.parse(sample_project_path) expected_file_path = Path( diff --git a/src/components/deprecation-banner/deprecation-banner.js b/src/components/deprecation-banner/deprecation-banner.js new file mode 100644 index 0000000000..2613aa6bb6 --- /dev/null +++ b/src/components/deprecation-banner/deprecation-banner.js @@ -0,0 +1,96 @@ +import React, { useState } from 'react'; +import Modal from '../ui/modal'; +import Button from '../ui/button'; +import { localStorageETDeprecationBannerSeen } from '../../config'; + +import './deprecation-banner.scss'; + +export const DeprecationBanner = () => { + const visible = !window.localStorage.getItem( + localStorageETDeprecationBannerSeen + ); + const [showModal, setShowModal] = useState(visible); + + const handleAcknowledgeAndDismiss = () => { + window.localStorage.setItem(localStorageETDeprecationBannerSeen, true); + setShowModal(false); + }; + + const handleProvideFeedbackClick = () => { + window.open('https://github.com/kedro-org/kedro-viz/issues/2247', '_blank'); + }; + + const renderLink = (url, text) => ( + + {text} + + ); + + return ( + +
+

+ We have decided to deprecate experiment tracking feature from + Kedro-Viz version 11.0.0 +

+ +

+ Find out more from{' '} + {renderLink( + 'https://kedro.org/blog/deprecate-experiment-tracking-kedro-viz', + 'this blog post' + )} + . +

+ +

+ Our documentation explains{' '} + {renderLink( + 'https://docs.kedro.org/en/stable/integrations/mlflow.html', + 'how to continue using Kedro with MLflow for experiment tracking ' + )} + and{' '} + {renderLink( + 'https://docs.kedro.org/projects/kedro-viz/en/latest/migrate_experiment_tracking.html', + 'how to migrate a Kedro project accordingly' + )} + . +

+ +

+ If you have any further feedback for us, feel free to share your + thoughts below. +

+
+ +
+ + +
+
+ ); +}; diff --git a/src/components/deprecation-banner/deprecation-banner.scss b/src/components/deprecation-banner/deprecation-banner.scss new file mode 100644 index 0000000000..22146d0c49 --- /dev/null +++ b/src/components/deprecation-banner/deprecation-banner.scss @@ -0,0 +1,84 @@ +@use '../../styles/variables' as variables; + +$modal-height: 416px; +$modal-margin: 48px; +$modal-width: 446px; +$text-margin: 24px; + +.kui-theme--light { + --secondary-text-color: #{variables.$black-500}; + --primary-button-background: #{variables.$black-900}; + --primary-button-text-color: #{variables.$white-0}; +} + +.kui-theme--dark { + --secondary-text-color: #{variables.$white-900}; + --primary-button-background: #{variables.$white-0}; + --primary-button-text-color: #{variables.$black-900}; +} + +.deprecation-banner-modal { + .modal__content { + max-width: calc(#{$modal-width} + 2 * #{$modal-margin}); + } + + .modal__wrapper { + width: $modal-width; + padding: 0; + margin: $modal-margin; + } + + .modal__title { + text-align: left; + margin-bottom: 0; + } + + .deprecation-banner-modal__message-wrapper { + p { + font-size: 14px; + font-style: normal; + font-weight: 400; + line-height: 20px; + margin-bottom: 0; + margin-top: $text-margin; + text-align: left; + } + + .deprecation-banner-modal__secondary-text { + color: var(--secondary-text-color); + } + } + + .deprecation-banner-modal__button-wrapper { + align-items: center; + display: flex; + justify-content: space-between; + margin-top: $modal-margin; + width: 100%; + + .button__btn--secondary { + padding-left: 0; + text-decoration: underline; + text-underline-offset: 3px; + + &:hover::after { + background-color: transparent; + } + } + + .button__btn--primary { + border-color: var(--primary-button-background); + + &:hover { + background-color: var(--primary-button-background); + color: var(--primary-button-text-color); + } + } + } + + .deprecation-banner-modal__link { + color: var(--secondary-text-color); + text-decoration: underline; + text-underline-offset: 3px; + } +} diff --git a/src/components/update-reminder/update-reminder-content.js b/src/components/update-reminder/update-reminder-content.js index 8aae70e745..4372a75000 100644 --- a/src/components/update-reminder/update-reminder-content.js +++ b/src/components/update-reminder/update-reminder-content.js @@ -1,38 +1,26 @@ export const updateContent = { - date: '21 November 2024', + date: '03 February 2025', features: [ { - title: 'Support for Python 3.12 and 3.13', + title: 'Deprecation warning for Experiment Tracking removal', image: '', - copy: 'Kedro-Viz now supports Python 3.12 and 3.13, ensuring compatibility with the latest Python version.', + copy: 'Experiment Tracking on Kedro-viz will be deprecated in Kedro-Viz 11.0.0. Please refer to the Kedro documentation for migration guidance.', buttonLink: - 'https://github.com/kedro-org/kedro-viz?tab=readme-ov-file#usage', - buttonText: 'Learn more', - }, - { - title: 'Consistent Flowchart Positioning', - image: '', - copy: 'Flowchart positions now remain consistent across renders. Previously, the flowchart layout would change every time users made changes to their Kedro project, especially when using the` --autoreload` function. This issue has been resolved, and the layout will only change for significant node or pipeline updates.', - buttonLink: '', - }, - { - title: 'Smarter `--autoreload` File Watcher', - image: '', - copy: 'The `--autoreload` watcher has been optimized to monitor only relevant files, reducing unnecessary reloads. It now excludes files listed in the user’s .gitignore and focuses on key files like `.py` and `.yaml`.', - buttonLink: - 'https://docs.kedro.org/projects/kedro-viz/en/latest/kedro-viz_visualisation.html#automatic-visualisation-updates', + 'https://docs.kedro.org/projects/kedro-viz/en/latest/migrate_experiment_tracking.html', buttonText: 'View the docs', }, { - title: 'Improved Port Management', + title: + 'Fix kedro viz `--load-file` to run from any directory without requiring a Kedro project. ', image: '', - copy: 'Kedro-Viz will now open on a new port if the default port 4141 is already in use. This fixes an issue where running multiple instances of Kedro-Viz caused one to overwrite the other. For example, if 4141 is occupied, the next instance will use 4142, and so on.', + copy: 'Kedro viz `--load-file` can run from anywhere as long as it has the correct path to the API data directory .', buttonLink: '', }, { - title: 'Fixed Tag Undefined Issue', + title: + 'Improved modular pipeline expand/collapse logic for better state synchronisation', image: '', - copy: 'Resolved a bug where the tag was occasionally undefined when pipelines were ordered differently in the pipeline registry. This was a user-reported issue, and it’s now fully addressed.', + copy: 'Previously the Expand All Pipelines button did a data reload every time it was clicked, now it purely relies on redux actions.', buttonLink: '', }, ], diff --git a/src/components/wrapper/wrapper.js b/src/components/wrapper/wrapper.js index 37f289fe0f..8b49abf0ab 100644 --- a/src/components/wrapper/wrapper.js +++ b/src/components/wrapper/wrapper.js @@ -15,6 +15,7 @@ import ExperimentWrapper from '../experiment-wrapper'; import SettingsModal from '../settings-modal'; import UpdateReminder from '../update-reminder'; import ShareableUrlModal from '../shareable-url-modal'; +import { DeprecationBanner } from '../deprecation-banner/deprecation-banner'; import './wrapper.scss'; @@ -53,6 +54,7 @@ export const Wrapper = ({ displayGlobalNavigation, theme }) => { latestVersion={latestVersion} /> {isRunningLocally() ? : null} + {versionData && (