This is an automated email from the ASF dual-hosted git repository.

zehnder pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/streampipes.git


The following commit(s) were added to refs/heads/dev by this push:
     new 2e5d0c1a88 Add Assets during charts generation /edition (#3841)
2e5d0c1a88 is described below

commit 2e5d0c1a8882e42187ccdc82f83a275492907787
Author: Jacqueline Höllig <[email protected]>
AuthorDate: Thu Oct 16 16:04:27 2025 +0200

    Add Assets during charts generation /edition (#3841)
    
    Co-authored-by: Philipp Zehnder <[email protected]>
    Co-authored-by: Dominik Riemer <[email protected]>
---
 .../support/utils/DataDownloadDialogUtils.ts       |   6 +-
 .../support/utils/ProcessingElementTestUtils.ts    |   4 +-
 ui/cypress/support/utils/connect/ConnectUtils.ts   |   4 +-
 .../DataExplorerBtns.ts}                           |   0
 .../DataExplorerUtils.ts}                          |  92 +++++++++++-----
 .../DataExplorerWidgetTableUtils.ts}               |   2 +-
 ui/cypress/tests/connect/editAdapter.smoke.spec.ts |  14 +--
 .../editAdapterSettingsAndPipeline.smoke.spec.ts   |   6 +-
 .../connect/rules/addNumericalStaticValue.spec.ts  |   4 +-
 .../dataDownloadDialogTest.smoke.spec.ts           |   6 +-
 .../charts}/heatmap.spec.ts                        |   9 +-
 .../charts}/histogram.spec.ts                      |   8 +-
 .../charts}/indicator.spec.ts                      |   8 +-
 .../widgets => dataExplorer/charts}/map.spec.ts    |  10 +-
 .../charts}/scatter.smoke.spec.ts                  |  10 +-
 .../widgets => dataExplorer/charts}/table.spec.ts  |  10 +-
 .../charts}/timeSeriesSave.spec.ts                 |  16 +--
 .../configuration.smoke.spec.ts                    |  10 +-
 .../dataExplorer/dataViewAssets.smoke.spec.ts      |  60 +++++++++++
 .../dataExplorer/deleteViewAndDashboard.spec.ts    |  76 +++++++++++++
 .../filterNumericalStringProperties.spec.ts        |  36 +++----
 .../missingDataInDataLake.spec.ts                  |  12 +--
 .../timeOrderDataView.spec.ts                      |  32 +++---
 .../timeRangeSelectors.spec.ts                     |  14 +--
 .../widgetDataConfiguration.smoke.spec.ts          | 119 +++++++++++++++++++++
 .../tests/datalake/deleteViewAndDashboard.spec.ts  |  76 -------------
 ui/cypress/tests/datalake/deleteWidget.ts          |  61 -----------
 .../datalake/widgetDataConfiguration.smoke.spec.ts | 105 ------------------
 .../restartStreamPipes/restartStreamPipes2.ts      |   4 +-
 .../data-explorer-chart-view.component.ts          |  19 +++-
 ui/src/app/data-explorer/data-explorer.module.ts   |  10 +-
 .../dialog/asset-dialog.component.html             |  69 ++++++++++++
 .../data-explorer/dialog/asset-dialog.component.ts | 103 ++++++++++++++++++
 33 files changed, 634 insertions(+), 381 deletions(-)

diff --git a/ui/cypress/support/utils/DataDownloadDialogUtils.ts 
b/ui/cypress/support/utils/DataDownloadDialogUtils.ts
index b7cf5a148d..28e44ff751 100644
--- a/ui/cypress/support/utils/DataDownloadDialogUtils.ts
+++ b/ui/cypress/support/utils/DataDownloadDialogUtils.ts
@@ -17,7 +17,7 @@
  */
 
 import { ExportConfig } from 
'../../../projects/streampipes/shared-ui/src/lib/dialog/data-download-dialog/model/export-config.model';
-import { DataLakeUtils } from './datalake/DataLakeUtils';
+import { DataExplorerUtils } from './dataExplorer/DataExplorerUtils';
 import { FileNameService } from 
'../../../projects/streampipes/shared-ui/src/lib/dialog/data-download-dialog/services/file-name.service';
 import { CsvFormatExportConfig } from 
'../../../projects/streampipes/shared-ui/src/lib/dialog/data-download-dialog/model/format-export-config.model';
 import { GeneralUtils } from './GeneralUtils';
@@ -29,11 +29,11 @@ export class DataDownloadDialogUtils {
         dataViewName: string,
     ) {
         // const exportDate: Date;
-        DataLakeUtils.goToDatalake();
+        DataExplorerUtils.goToDatalake();
 
         GeneralUtils.openMenuForRow(dataViewName);
         // select data view in edit mode
-        DataLakeUtils.editDataView(dataViewName);
+        DataExplorerUtils.editDataView(dataViewName);
 
         // select download button
         cy.dataCy('data-view-data-download-btn').click();
diff --git a/ui/cypress/support/utils/ProcessingElementTestUtils.ts 
b/ui/cypress/support/utils/ProcessingElementTestUtils.ts
index 6340635b48..5baed8ff61 100644
--- a/ui/cypress/support/utils/ProcessingElementTestUtils.ts
+++ b/ui/cypress/support/utils/ProcessingElementTestUtils.ts
@@ -19,7 +19,7 @@
 import { FileManagementUtils } from './FileManagementUtils';
 import { ConnectUtils } from './connect/ConnectUtils';
 import { PipelineUtils } from './pipeline/PipelineUtils';
-import { DataLakeUtils } from './datalake/DataLakeUtils';
+import { DataExplorerUtils } from './dataExplorer/DataExplorerUtils';
 import { PipelineBuilder } from '../builder/PipelineBuilder';
 import { PipelineElementBuilder } from '../builder/PipelineElementBuilder';
 import { ProcessorTest } from '../model/ProcessorTest';
@@ -96,7 +96,7 @@ export class ProcessingElementTestUtils {
 
         cy.wait(3000);
 
-        DataLakeUtils.checkResults(
+        DataExplorerUtils.checkResults(
             dataLakeIndex,
             'cypress/fixtures/' + expectedResultFile,
             pipelineElementTest.processor.ignoreTimestamp,
diff --git a/ui/cypress/support/utils/connect/ConnectUtils.ts 
b/ui/cypress/support/utils/connect/ConnectUtils.ts
index fcb4d0a779..db144b1765 100644
--- a/ui/cypress/support/utils/connect/ConnectUtils.ts
+++ b/ui/cypress/support/utils/connect/ConnectUtils.ts
@@ -19,7 +19,7 @@
 import { StaticPropertyUtils } from '../userInput/StaticPropertyUtils';
 import { AdapterInput } from '../../model/AdapterInput';
 import { ConnectEventSchemaUtils } from './ConnectEventSchemaUtils';
-import { DataLakeUtils } from '../datalake/DataLakeUtils';
+import { DataExplorerUtils } from '../dataExplorer/DataExplorerUtils';
 import { ConnectBtns } from './ConnectBtns';
 import { AdapterBuilder } from '../../builder/AdapterBuilder';
 import { UserUtils } from '../UserUtils';
@@ -492,7 +492,7 @@ export class ConnectUtils {
         // Wait till data is stored
         cy.wait(waitTime);
 
-        DataLakeUtils.checkResults(
+        DataExplorerUtils.checkResults(
             'Adapter to test rules',
             expectedFile,
             ignoreTime,
diff --git a/ui/cypress/support/utils/datalake/DataLakeBtns.ts 
b/ui/cypress/support/utils/dataExplorer/DataExplorerBtns.ts
similarity index 100%
rename from ui/cypress/support/utils/datalake/DataLakeBtns.ts
rename to ui/cypress/support/utils/dataExplorer/DataExplorerBtns.ts
diff --git a/ui/cypress/support/utils/datalake/DataLakeUtils.ts 
b/ui/cypress/support/utils/dataExplorer/DataExplorerUtils.ts
similarity index 85%
rename from ui/cypress/support/utils/datalake/DataLakeUtils.ts
rename to ui/cypress/support/utils/dataExplorer/DataExplorerUtils.ts
index 0aafa64f91..3bdaf3a855 100644
--- a/ui/cypress/support/utils/datalake/DataLakeUtils.ts
+++ b/ui/cypress/support/utils/dataExplorer/DataExplorerUtils.ts
@@ -27,7 +27,7 @@ import { AdapterBuilder } from '../../builder/AdapterBuilder';
 import { differenceInMonths } from 'date-fns';
 import { GeneralUtils } from '../GeneralUtils';
 
-export class DataLakeUtils {
+export class DataExplorerUtils {
     public static goToDatalake() {
         cy.visit('#/dataexplorer');
     }
@@ -39,7 +39,7 @@ export class DataLakeUtils {
 
     public static initDataLakeTests() {
         cy.initStreamPipesTest();
-        DataLakeUtils.loadRandomDataSetIntoDataLake();
+        DataExplorerUtils.loadRandomDataSetIntoDataLake();
     }
 
     public static getDataLakeTestSetAdapter(
@@ -95,22 +95,22 @@ export class DataLakeUtils {
         dataSet: string,
         widgetType: string,
     ) {
-        DataLakeUtils.goToDatalake();
-        DataLakeUtils.createAndEditDataView();
+        DataExplorerUtils.goToDatalake();
+        DataExplorerUtils.createAndEditDataView();
 
-        DataLakeUtils.selectTimeRange(
+        DataExplorerUtils.selectTimeRange(
             new Date(2020, 10, 20, 22, 44),
-            DataLakeUtils.getFutureDate(),
+            DataExplorerUtils.getFutureDate(),
         );
-        // DataLakeUtils.addNewWidget();
-        DataLakeUtils.selectDataSet(dataSet);
-        DataLakeUtils.dataConfigSelectAllFields();
+        // DataExplorerUtils.addNewWidget();
+        DataExplorerUtils.selectDataSet(dataSet);
+        DataExplorerUtils.dataConfigSelectAllFields();
 
-        DataLakeUtils.selectAppearanceConfig();
-        DataLakeUtils.selectDataViewName(dataViewName);
+        DataExplorerUtils.selectAppearanceConfig();
+        DataExplorerUtils.selectDataViewName(dataViewName);
 
-        DataLakeUtils.openVisualizationConfig();
-        DataLakeUtils.selectVisualizationType(widgetType);
+        DataExplorerUtils.openVisualizationConfig();
+        DataExplorerUtils.selectVisualizationType(widgetType);
 
         cy.wait(1000);
     }
@@ -136,6 +136,13 @@ export class DataLakeUtils {
             DataExplorerWidget.TIME_SERIES,
         );
     }
+    public static renameWidget(newName: string) {
+        cy.dataCy('appearance-config-widget-title').clear().type(newName);
+        cy.dataCy('appearance-config-widget-title').should(
+            'have.value',
+            newName,
+        );
+    }
 
     public static loadRandomDataSetIntoDataLake() {
         PrepareTestDataUtils.loadDataIntoDataLake('fileTest/random.csv');
@@ -190,6 +197,15 @@ export class DataLakeUtils {
         cy.dataCy('save-data-view-btn', { timeout: 10000 }).click({
             force: true,
         });
+        cy.dataCy('asset-dialog-cancel-delete', { timeout: 10000 }).click({
+            force: true,
+        });
+    }
+
+    public static saveToAddAssets() {
+        cy.dataCy('save-data-view-btn', { timeout: 10000 }).click({
+            force: true,
+        });
     }
 
     public static saveDashboardConfiguration() {
@@ -200,6 +216,21 @@ export class DataLakeUtils {
         return cy.dataCy('empty-dashboard');
     }
 
+    public static addToAsset(assetNameList = []) {
+        cy.get('mat-tree.asset-tree', { timeout: 10000 }).should('exist');
+
+        assetNameList.forEach(assetName => {
+            cy.get('mat-tree.asset-tree')
+                .find('.mat-tree-node')
+                .contains(assetName)
+                .click();
+        });
+
+        cy.dataCy('asset-dialog-confirm-delete', { timeout: 10000 }).click({
+            force: true,
+        });
+    }
+
     public static deleteDashboard(dashboardName: string) {
         GeneralUtils.openMenuForRow(dashboardName);
         cy.dataCy('delete-dashboard-' + dashboardName, {
@@ -243,14 +274,14 @@ export class DataLakeUtils {
 
     public static saveAndReEditWidget(dataViewName: string) {
         // Save data view configuration
-        DataLakeUtils.saveDataViewConfiguration();
-        DataLakeUtils.editDataView(dataViewName);
+        DataExplorerUtils.saveDataViewConfiguration();
+        DataExplorerUtils.editDataView(dataViewName);
     }
 
     public static saveAndReEditDashboard(dashboardName: string) {
         // Save dashboard configuration
-        DataLakeUtils.saveDashboardConfiguration();
-        DataLakeUtils.editDashboard(dashboardName);
+        DataExplorerUtils.saveDashboardConfiguration();
+        DataExplorerUtils.editDashboard(dashboardName);
     }
 
     public static clickTab(tabName: string) {
@@ -483,19 +514,19 @@ export class DataLakeUtils {
     }
 
     public static selectTimeRange(from: Date, to: Date) {
-        DataLakeUtils.openTimeSelectorMenu();
+        DataExplorerUtils.openTimeSelectorMenu();
         const monthsBack = Math.abs(differenceInMonths(from, new Date())) + 1;
-        DataLakeUtils.navigateCalendar('previous', monthsBack);
-        DataLakeUtils.selectDay(from.getDate());
+        DataExplorerUtils.navigateCalendar('previous', monthsBack);
+        DataExplorerUtils.selectDay(from.getDate());
 
         const monthsForward = Math.abs(differenceInMonths(from, to));
-        DataLakeUtils.navigateCalendar('next', monthsForward);
+        DataExplorerUtils.navigateCalendar('next', monthsForward);
 
-        DataLakeUtils.selectDay(to.getDate());
+        DataExplorerUtils.selectDay(to.getDate());
 
-        DataLakeUtils.setTimeInput('time-selector-start-time', from);
-        DataLakeUtils.setTimeInput('time-selector-end-time', to);
-        DataLakeUtils.applyCustomTimeSelection();
+        DataExplorerUtils.setTimeInput('time-selector-start-time', from);
+        DataExplorerUtils.setTimeInput('time-selector-end-time', to);
+        DataExplorerUtils.applyCustomTimeSelection();
     }
 
     public static navigateCalendar(direction: string, numberOfMonths: number) {
@@ -521,7 +552,7 @@ export class DataLakeUtils {
     }
 
     public static setTimeInput(field: string, date: Date) {
-        cy.dataCy(field).type(DataLakeUtils.makeTimeString(date));
+        cy.dataCy(field).type(DataExplorerUtils.makeTimeString(date));
     }
 
     public static makeTimeString(date: Date) {
@@ -567,4 +598,13 @@ export class DataLakeUtils {
     public static checkIfConfirmationDialogIsShowing(): void {
         cy.get('confirmation-dialog').should('be.visible');
     }
+    public static createDataViewWithAssets(assetNames) {
+        DataExplorerUtils.loadDataIntoDataLake('datalake/sample.csv');
+
+        // Create Diagram
+        DataExplorerUtils.addDataViewAndTableWidget('NewWidget', 'Persist');
+        //Save
+        DataExplorerUtils.saveToAddAssets();
+        DataExplorerUtils.addToAsset(assetNames);
+    }
 }
diff --git a/ui/cypress/support/utils/datalake/DataLakeWidgetTableUtils.ts 
b/ui/cypress/support/utils/dataExplorer/DataExplorerWidgetTableUtils.ts
similarity index 96%
rename from ui/cypress/support/utils/datalake/DataLakeWidgetTableUtils.ts
rename to ui/cypress/support/utils/dataExplorer/DataExplorerWidgetTableUtils.ts
index d09177c6ea..cf977fad47 100644
--- a/ui/cypress/support/utils/datalake/DataLakeWidgetTableUtils.ts
+++ b/ui/cypress/support/utils/dataExplorer/DataExplorerWidgetTableUtils.ts
@@ -16,7 +16,7 @@
  *
  */
 
-export class DataLakeWidgetTableUtils {
+export class DataExplorerWidgetTableUtils {
     public static dataExplorerTableRowTimestamp() {
         return cy.dataCy('data-explorer-table-row-timestamp', {
             timeout: 10000,
diff --git a/ui/cypress/tests/connect/editAdapter.smoke.spec.ts 
b/ui/cypress/tests/connect/editAdapter.smoke.spec.ts
index 91c960c129..3348b683fe 100644
--- a/ui/cypress/tests/connect/editAdapter.smoke.spec.ts
+++ b/ui/cypress/tests/connect/editAdapter.smoke.spec.ts
@@ -20,8 +20,8 @@ import { ConnectUtils } from 
'../../support/utils/connect/ConnectUtils';
 import { ConnectBtns } from '../../support/utils/connect/ConnectBtns';
 import { AdapterBuilder } from '../../support/builder/AdapterBuilder';
 import { ConnectEventSchemaUtils } from 
'../../support/utils/connect/ConnectEventSchemaUtils';
-import { DataLakeUtils } from '../../support/utils/datalake/DataLakeUtils';
-import { DataLakeBtns } from '../../support/utils/datalake/DataLakeBtns';
+import { DataExplorerUtils } from 
'../../support/utils/dataExplorer/DataExplorerUtils';
+import { DataLakeBtns } from 
'../../support/utils/dataExplorer/DataExplorerBtns';
 
 describe('Test Edit Adapter', () => {
     beforeEach('Setup Test', () => {
@@ -98,13 +98,13 @@ describe('Test Edit Adapter', () => {
         ConnectUtils.storeAndStartEditedAdapter();
 
         // Validate that the data is further persisted in the database by 
checking if the amount of events in the data lake changes
-        DataLakeUtils.goToDatalakeConfiguration();
+        DataExplorerUtils.goToDatalakeConfiguration();
 
-        DataLakeUtils.waitForCountingResults();
+        DataExplorerUtils.waitForCountingResults();
 
         let initialValue;
 
-        DataLakeUtils.getDatalakeNumberOfEvents().then(value => {
+        DataExplorerUtils.getDatalakeNumberOfEvents().then(value => {
             initialValue = value;
         });
 
@@ -112,9 +112,9 @@ describe('Test Edit Adapter', () => {
 
         DataLakeBtns.refreshDataLakeMeasures().click();
 
-        DataLakeUtils.waitForCountingResults();
+        DataExplorerUtils.waitForCountingResults();
 
-        DataLakeUtils.getDatalakeNumberOfEvents().then(newValue => {
+        DataExplorerUtils.getDatalakeNumberOfEvents().then(newValue => {
             expect(newValue).not.equal(initialValue);
         });
     });
diff --git 
a/ui/cypress/tests/connect/editAdapterSettingsAndPipeline.smoke.spec.ts 
b/ui/cypress/tests/connect/editAdapterSettingsAndPipeline.smoke.spec.ts
index 3b1e63e37c..8c26ec3f7f 100644
--- a/ui/cypress/tests/connect/editAdapterSettingsAndPipeline.smoke.spec.ts
+++ b/ui/cypress/tests/connect/editAdapterSettingsAndPipeline.smoke.spec.ts
@@ -23,7 +23,7 @@ import { PipelineElementBuilder } from 
'../../support/builder/PipelineElementBui
 import { PipelineBuilder } from '../../support/builder/PipelineBuilder';
 import { AdapterBuilder } from '../../support/builder/AdapterBuilder';
 import { DashboardUtils } from '../../support/utils/DashboardUtils';
-import { DataLakeUtils } from '../../support/utils/datalake/DataLakeUtils';
+import { DataExplorerUtils } from 
'../../support/utils/dataExplorer/DataExplorerUtils';
 import { GeneralUtils } from '../../support/utils/GeneralUtils';
 
 describe('Test Edit Adapter and Pipeline', () => {
@@ -102,8 +102,8 @@ describe('Test Edit Adapter and Pipeline', () => {
 
         // Visit dashboard
         cy.wait(5000);
-        DataLakeUtils.goToDatalake();
-        DataLakeUtils.createAndEditDataView();
+        DataExplorerUtils.goToDatalake();
+        DataExplorerUtils.createAndEditDataView();
 
         cy.dataCy('data-explorer-field-selection-panel').should(
             'include.text',
diff --git a/ui/cypress/tests/connect/rules/addNumericalStaticValue.spec.ts 
b/ui/cypress/tests/connect/rules/addNumericalStaticValue.spec.ts
index f4962830bd..4fb2992ddd 100644
--- a/ui/cypress/tests/connect/rules/addNumericalStaticValue.spec.ts
+++ b/ui/cypress/tests/connect/rules/addNumericalStaticValue.spec.ts
@@ -19,7 +19,7 @@
 import { ConnectUtils } from '../../../support/utils/connect/ConnectUtils';
 import { FileManagementUtils } from 
'../../../support/utils/FileManagementUtils';
 import { ConnectEventSchemaUtils } from 
'../../../support/utils/connect/ConnectEventSchemaUtils';
-import { DataLakeUtils } from '../../../support/utils/datalake/DataLakeUtils';
+import { DataExplorerUtils } from 
'../../../support/utils/dataExplorer/DataExplorerUtils';
 import { ConnectBtns } from '../../../support/utils/connect/ConnectBtns';
 import { GeneralUtils } from '../../../support/utils/GeneralUtils';
 
@@ -55,7 +55,7 @@ describe('Connect schema rule transformations', () => {
 
         cy.wait(1000);
 
-        DataLakeUtils.checkResults(
+        DataExplorerUtils.checkResults(
             'Adapter to test rules',
             'cypress/fixtures/connect/addNumericalStaticValue/expected.json',
             true,
diff --git 
a/ui/cypress/tests/dataDownloadDialog/dataDownloadDialogTest.smoke.spec.ts 
b/ui/cypress/tests/dataDownloadDialog/dataDownloadDialogTest.smoke.spec.ts
index 19646718da..618c96c8d3 100644
--- a/ui/cypress/tests/dataDownloadDialog/dataDownloadDialogTest.smoke.spec.ts
+++ b/ui/cypress/tests/dataDownloadDialog/dataDownloadDialogTest.smoke.spec.ts
@@ -18,7 +18,7 @@
 
 import { ExportConfig } from 
'../../../projects/streampipes/shared-ui/src/lib/dialog/data-download-dialog/model/export-config.model';
 import { DataDownloadDialogUtils } from 
'../../support/utils/DataDownloadDialogUtils';
-import { DataLakeUtils } from '../../support/utils/datalake/DataLakeUtils';
+import { DataExplorerUtils } from 
'../../support/utils/dataExplorer/DataExplorerUtils';
 import { PrepareTestDataUtils } from 
'../../support/utils/PrepareTestDataUtils';
 
 describe('Test data explorer data download dialog', () => {
@@ -29,8 +29,8 @@ describe('Test data explorer data download dialog', () => {
             'json_array',
         );
 
-        DataLakeUtils.addDataViewAndTableWidget(dataViewName, 'Persist');
-        DataLakeUtils.saveDataViewConfiguration();
+        DataExplorerUtils.addDataViewAndTableWidget(dataViewName, 'Persist');
+        DataExplorerUtils.saveDataViewConfiguration();
     });
 
     beforeEach('Setup Test', () => {
diff --git a/ui/cypress/tests/datalake/widgets/heatmap.spec.ts 
b/ui/cypress/tests/dataExplorer/charts/heatmap.spec.ts
similarity index 77%
rename from ui/cypress/tests/datalake/widgets/heatmap.spec.ts
rename to ui/cypress/tests/dataExplorer/charts/heatmap.spec.ts
index ac463a9647..080176a99f 100644
--- a/ui/cypress/tests/datalake/widgets/heatmap.spec.ts
+++ b/ui/cypress/tests/dataExplorer/charts/heatmap.spec.ts
@@ -16,19 +16,18 @@
  *
  */
 
-import { DataLakeUtils } from '../../../support/utils/datalake/DataLakeUtils';
+import { DataExplorerUtils } from 
'../../../support/utils/dataExplorer/DataExplorerUtils';
 
 describe('Test Heatmap View in Data Explorer', () => {
     beforeEach('Setup Test', () => {
-        DataLakeUtils.initDataLakeTests();
+        DataExplorerUtils.initDataLakeTests();
     });
 
     it('Perform Test', () => {
-        DataLakeUtils.addDataViewAndWidget('view', 'Persist', 'heatmap');
+        DataExplorerUtils.addDataViewAndWidget('view', 'Persist', 'heatmap');
 
         // Check checkbox
-        DataLakeUtils.openVisualizationConfig();
-        cy.get('mat-checkbox input').click({ force: true });
+        DataExplorerUtils.openVisualizationConfig();
 
         // Check if heatmap chart is visible
         cy.dataCy('heatmap').should('be.visible');
diff --git a/ui/cypress/tests/datalake/widgets/histogram.spec.ts 
b/ui/cypress/tests/dataExplorer/charts/histogram.spec.ts
similarity index 83%
rename from ui/cypress/tests/datalake/widgets/histogram.spec.ts
rename to ui/cypress/tests/dataExplorer/charts/histogram.spec.ts
index eb31c64a10..6e955a5097 100644
--- a/ui/cypress/tests/datalake/widgets/histogram.spec.ts
+++ b/ui/cypress/tests/dataExplorer/charts/histogram.spec.ts
@@ -16,22 +16,22 @@
  *
  */
 
-import { DataLakeUtils } from '../../../support/utils/datalake/DataLakeUtils';
+import { DataExplorerUtils } from 
'../../../support/utils/dataExplorer/DataExplorerUtils';
 
 describe('Test Histogram View in Data Explorer', () => {
     beforeEach('Setup Test', () => {
-        DataLakeUtils.initDataLakeTests();
+        DataExplorerUtils.initDataLakeTests();
     });
 
     it('Perform Test', () => {
-        DataLakeUtils.addDataViewAndWidget(
+        DataExplorerUtils.addDataViewAndWidget(
             'view',
             'Persist',
             'histogram-chart',
         );
 
         // Change field for histogram
-        DataLakeUtils.openVisualizationConfig();
+        DataExplorerUtils.openVisualizationConfig();
 
         // Check if histogram chart is displayed
         cy.dataCy('histogram-chart').should('be.visible');
diff --git a/ui/cypress/tests/datalake/widgets/indicator.spec.ts 
b/ui/cypress/tests/dataExplorer/charts/indicator.spec.ts
similarity index 83%
rename from ui/cypress/tests/datalake/widgets/indicator.spec.ts
rename to ui/cypress/tests/dataExplorer/charts/indicator.spec.ts
index 0fb0bfc00c..047206a4a6 100644
--- a/ui/cypress/tests/datalake/widgets/indicator.spec.ts
+++ b/ui/cypress/tests/dataExplorer/charts/indicator.spec.ts
@@ -16,22 +16,22 @@
  *
  */
 
-import { DataLakeUtils } from '../../../support/utils/datalake/DataLakeUtils';
+import { DataExplorerUtils } from 
'../../../support/utils/dataExplorer/DataExplorerUtils';
 
 describe('Test Indicator View in Data Explorer', () => {
     beforeEach('Setup Test', () => {
-        DataLakeUtils.initDataLakeTests();
+        DataExplorerUtils.initDataLakeTests();
     });
 
     it('Perform Test', () => {
-        DataLakeUtils.addDataViewAndWidget(
+        DataExplorerUtils.addDataViewAndWidget(
             'view',
             'Persist',
             'indicator-chart',
         );
 
         // Check checkbox
-        DataLakeUtils.openVisualizationConfig();
+        DataExplorerUtils.openVisualizationConfig();
         cy.dataCy('data-explorer-select-delta-checkbox').click();
 
         cy.dataCy('indicator-chart').should('be.visible');
diff --git a/ui/cypress/tests/datalake/widgets/map.spec.ts 
b/ui/cypress/tests/dataExplorer/charts/map.spec.ts
similarity index 85%
rename from ui/cypress/tests/datalake/widgets/map.spec.ts
rename to ui/cypress/tests/dataExplorer/charts/map.spec.ts
index e5e13c2b4a..574628226c 100644
--- a/ui/cypress/tests/datalake/widgets/map.spec.ts
+++ b/ui/cypress/tests/dataExplorer/charts/map.spec.ts
@@ -16,18 +16,18 @@
  *
  */
 
-import { DataLakeUtils } from '../../../support/utils/datalake/DataLakeUtils';
+import { DataExplorerUtils } from 
'../../../support/utils/dataExplorer/DataExplorerUtils';
 
 describe('Test Map View in Data Explorer', () => {
     beforeEach('Setup Test', () => {
-        DataLakeUtils.initDataLakeTests();
+        DataExplorerUtils.initDataLakeTests();
     });
 
     it('Perform Test', () => {
-        DataLakeUtils.addDataViewAndWidget('view', 'Persist', 'map');
+        DataExplorerUtils.addDataViewAndWidget('view', 'Persist', 'map');
 
         // Change marker positions
-        DataLakeUtils.openVisualizationConfig();
+        DataExplorerUtils.openVisualizationConfig();
         cy.dataCy('data-view-map-select-latitude')
             .click()
             .get('mat-option')
@@ -48,7 +48,7 @@ describe('Test Map View in Data Explorer', () => {
         );
 
         // Change from markers to trace
-        DataLakeUtils.openVisualizationConfig();
+        DataExplorerUtils.openVisualizationConfig();
         cy.dataCy('data-view-map-select-marker-or-trace')
             .click()
             .get('mat-option')
diff --git a/ui/cypress/tests/datalake/widgets/scatter.smoke.spec.ts 
b/ui/cypress/tests/dataExplorer/charts/scatter.smoke.spec.ts
similarity index 79%
rename from ui/cypress/tests/datalake/widgets/scatter.smoke.spec.ts
rename to ui/cypress/tests/dataExplorer/charts/scatter.smoke.spec.ts
index e92dbe872a..c402f928b4 100644
--- a/ui/cypress/tests/datalake/widgets/scatter.smoke.spec.ts
+++ b/ui/cypress/tests/dataExplorer/charts/scatter.smoke.spec.ts
@@ -16,15 +16,19 @@
  *
  */
 
-import { DataLakeUtils } from '../../../support/utils/datalake/DataLakeUtils';
+import { DataExplorerUtils } from 
'../../../support/utils/dataExplorer/DataExplorerUtils';
 
 describe('Test Scatter View in Data Explorer', () => {
     beforeEach('Setup Test', () => {
-        DataLakeUtils.initDataLakeTests();
+        DataExplorerUtils.initDataLakeTests();
     });
 
     it('Perform Test', () => {
-        DataLakeUtils.addDataViewAndWidget('view', 'Persist', 'scatter-chart');
+        DataExplorerUtils.addDataViewAndWidget(
+            'view',
+            'Persist',
+            'scatter-chart',
+        );
 
         // Check if scatter plot is displayed
         cy.dataCy('scatter-chart').should('be.visible');
diff --git a/ui/cypress/tests/datalake/widgets/table.spec.ts 
b/ui/cypress/tests/dataExplorer/charts/table.spec.ts
similarity index 76%
rename from ui/cypress/tests/datalake/widgets/table.spec.ts
rename to ui/cypress/tests/dataExplorer/charts/table.spec.ts
index 3a501efa68..8149e021d6 100644
--- a/ui/cypress/tests/datalake/widgets/table.spec.ts
+++ b/ui/cypress/tests/dataExplorer/charts/table.spec.ts
@@ -16,23 +16,23 @@
  *
  */
 
-import { DataLakeUtils } from '../../../support/utils/datalake/DataLakeUtils';
-import { DataLakeWidgetTableUtils } from 
'../../../support/utils/datalake/DataLakeWidgetTableUtils';
+import { DataExplorerUtils } from 
'../../../support/utils/dataExplorer/DataExplorerUtils';
+import { DataExplorerWidgetTableUtils } from 
'../../../support/utils/dataExplorer/DataExplorerWidgetTableUtils';
 import { DataExplorerWidget } from '../../../support/model/DataExplorerWidget';
 
 describe('Test Table View in Data Explorer', () => {
     beforeEach('Setup Test', () => {
-        DataLakeUtils.initDataLakeTests();
+        DataExplorerUtils.initDataLakeTests();
     });
 
     it('Perform Test', () => {
-        DataLakeUtils.addDataViewAndWidget(
+        DataExplorerUtils.addDataViewAndWidget(
             'view',
             'Persist',
             DataExplorerWidget.TABLE,
         );
 
         // Check if table is displayed correctly
-        DataLakeWidgetTableUtils.checkAmountOfRows(10);
+        DataExplorerWidgetTableUtils.checkAmountOfRows(10);
     });
 });
diff --git a/ui/cypress/tests/datalake/widgets/timeSeriesSave.spec.ts 
b/ui/cypress/tests/dataExplorer/charts/timeSeriesSave.spec.ts
similarity index 79%
rename from ui/cypress/tests/datalake/widgets/timeSeriesSave.spec.ts
rename to ui/cypress/tests/dataExplorer/charts/timeSeriesSave.spec.ts
index 760c65fd2c..d789f280f1 100644
--- a/ui/cypress/tests/datalake/widgets/timeSeriesSave.spec.ts
+++ b/ui/cypress/tests/dataExplorer/charts/timeSeriesSave.spec.ts
@@ -16,7 +16,7 @@
  *
  */
 
-import { DataLakeUtils } from '../../../support/utils/datalake/DataLakeUtils';
+import { DataExplorerUtils } from 
'../../../support/utils/dataExplorer/DataExplorerUtils';
 
 const testView1 = 'TestView1';
 const testView2 = 'TestView2';
@@ -24,16 +24,16 @@ const dataSet = 'Persist';
 
 describe('Test if widget configuration is updated correctly', () => {
     beforeEach('Setup Test', () => {
-        DataLakeUtils.initDataLakeTests();
+        DataExplorerUtils.initDataLakeTests();
 
         // Create first test data view with one time series widget
-        DataLakeUtils.addDataViewAndTimeSeriesWidget(testView1, dataSet);
-        DataLakeUtils.saveDataViewConfiguration();
+        DataExplorerUtils.addDataViewAndTimeSeriesWidget(testView1, dataSet);
+        DataExplorerUtils.saveDataViewConfiguration();
 
         cy.wait(1000);
         // Create second test data view with one time series widget
-        DataLakeUtils.addDataViewAndTimeSeriesWidget(testView2, dataSet);
-        DataLakeUtils.saveDataViewConfiguration();
+        DataExplorerUtils.addDataViewAndTimeSeriesWidget(testView2, dataSet);
+        DataExplorerUtils.saveDataViewConfiguration();
     });
 
     it('Perform Test', () => {
@@ -43,10 +43,10 @@ describe('Test if widget configuration is updated 
correctly', () => {
 
 const runTestCase = () => {
     // Visit settings of widget
-    DataLakeUtils.editDataView(testView1);
+    DataExplorerUtils.editDataView(testView1);
 
     // Change first field from line plot to scatter plot
-    DataLakeUtils.openVisualizationConfig();
+    DataExplorerUtils.openVisualizationConfig();
 
     // select type scatter
     cy.dataCy('time-series-item-config-toggle').first().click();
diff --git a/ui/cypress/tests/datalake/configuration.smoke.spec.ts 
b/ui/cypress/tests/dataExplorer/configuration.smoke.spec.ts
similarity index 89%
rename from ui/cypress/tests/datalake/configuration.smoke.spec.ts
rename to ui/cypress/tests/dataExplorer/configuration.smoke.spec.ts
index a8fd3129a6..aae4ddf7f5 100644
--- a/ui/cypress/tests/datalake/configuration.smoke.spec.ts
+++ b/ui/cypress/tests/dataExplorer/configuration.smoke.spec.ts
@@ -17,16 +17,16 @@
  */
 
 import { PipelineUtils } from '../../support/utils/pipeline/PipelineUtils';
-import { DataLakeUtils } from '../../support/utils/datalake/DataLakeUtils';
+import { DataExplorerUtils } from 
'../../support/utils/dataExplorer/DataExplorerUtils';
 
 describe('Test Truncate data in datalake', () => {
     beforeEach('Setup Test', () => {
         cy.initStreamPipesTest();
-        DataLakeUtils.loadRandomDataSetIntoDataLake();
+        DataExplorerUtils.loadRandomDataSetIntoDataLake();
     });
 
     it('Perform Test', () => {
-        DataLakeUtils.goToDatalakeConfiguration();
+        DataExplorerUtils.goToDatalakeConfiguration();
 
         // Check if amount of events is correct
         cy.dataCy('datalake-number-of-events', { timeout: 10000 })
@@ -52,12 +52,12 @@ describe('Test Truncate data in datalake', () => {
 describe('Delete data in datalake', () => {
     before('Setup Test', () => {
         cy.initStreamPipesTest();
-        DataLakeUtils.loadRandomDataSetIntoDataLake();
+        DataExplorerUtils.loadRandomDataSetIntoDataLake();
         PipelineUtils.deletePipeline('Persist prepared_data');
     });
 
     it('Perform Test', () => {
-        DataLakeUtils.goToDatalakeConfiguration();
+        DataExplorerUtils.goToDatalakeConfiguration();
 
         // Check if amount of events is correct
         cy.dataCy('datalake-number-of-events', { timeout: 10000 })
diff --git a/ui/cypress/tests/dataExplorer/dataViewAssets.smoke.spec.ts 
b/ui/cypress/tests/dataExplorer/dataViewAssets.smoke.spec.ts
new file mode 100644
index 0000000000..8cf59a59b9
--- /dev/null
+++ b/ui/cypress/tests/dataExplorer/dataViewAssets.smoke.spec.ts
@@ -0,0 +1,60 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+import { AssetUtils } from '../../support/utils/asset/AssetUtils';
+import { DataExplorerUtils } from 
'../../support/utils/dataExplorer/DataExplorerUtils';
+
+describe('Creates a new adapter with a linked asset', () => {
+    const assetName1 = 'TestAsset1';
+    const assetName2 = 'TestAsset2';
+    const assetName3 = 'TestAsset3';
+
+    beforeEach('Setup Test', () => {
+        cy.initStreamPipesTest();
+        AssetUtils.goToAssets();
+        AssetUtils.addAndSaveAsset(assetName3);
+        AssetUtils.addAndSaveAsset(assetName2);
+        AssetUtils.addAndSaveAsset(assetName1);
+    });
+
+    it('Add Assets during Chart generation', () => {
+        DataExplorerUtils.createDataViewWithAssets([assetName1, assetName2]);
+        //Test
+        AssetUtils.checkAmountOfLinkedResourcesByAssetName(assetName1, 1);
+        AssetUtils.checkAmountOfLinkedResourcesByAssetName(assetName2, 1);
+    });
+
+    it('Edit Assets during Chart generation', () => {
+        DataExplorerUtils.createDataViewWithAssets([assetName1, assetName2]);
+        //Test
+        AssetUtils.checkAmountOfLinkedResourcesByAssetName(assetName1, 1);
+        AssetUtils.checkAmountOfLinkedResourcesByAssetName(assetName2, 1);
+
+        // Go To Chart and Edit
+        DataExplorerUtils.goToDatalake();
+        DataExplorerUtils.editDataView('NewWidget');
+        DataExplorerUtils.renameWidget('Rename');
+
+        DataExplorerUtils.saveToAddAssets();
+        DataExplorerUtils.addToAsset([assetName1, assetName3]);
+
+        AssetUtils.checkAmountOfLinkedResourcesByAssetName(assetName2, 1);
+        AssetUtils.checkAmountOfLinkedResourcesByAssetName(assetName3, 1);
+        AssetUtils.checkResourceNamingByAssetName(assetName2, 'Rename');
+    });
+});
diff --git a/ui/cypress/tests/dataExplorer/deleteViewAndDashboard.spec.ts 
b/ui/cypress/tests/dataExplorer/deleteViewAndDashboard.spec.ts
new file mode 100644
index 0000000000..8dbef56943
--- /dev/null
+++ b/ui/cypress/tests/dataExplorer/deleteViewAndDashboard.spec.ts
@@ -0,0 +1,76 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+import { DataExplorerUtils } from 
'../../support/utils/dataExplorer/DataExplorerUtils';
+
+describe('Test Deletion of Data View and Dashboard', () => {
+    beforeEach('Setup Test', () => {
+        cy.initStreamPipesTest();
+        DataExplorerUtils.loadDataIntoDataLake('datalake/sample.csv');
+    });
+
+    it('Perform Test', () => {
+        const dashboard = 'TestDashboard';
+        const dataView = 'TestView';
+
+        DataExplorerUtils.goToDatalake();
+
+        DataExplorerUtils.addDataViewAndTableWidget(dataView, 'Persist');
+
+        DataExplorerUtils.saveDataViewConfiguration();
+
+        DataExplorerUtils.checkRowsViewsTable(1);
+
+        DataExplorerUtils.goToDashboard();
+
+        DataExplorerUtils.createAndEditDashboard(dashboard);
+
+        DataExplorerUtils.addDataViewToDashboard(dataView, true);
+
+        DataExplorerUtils.saveDashboardConfiguration();
+
+        DataExplorerUtils.checkRowsDashboardTable(1);
+
+        // Click "Delete" but cancel action and check if dashboard and view 
are still displayed
+        DataExplorerUtils.cancelDeleteDashboard(dashboard);
+
+        DataExplorerUtils.checkRowsDashboardTable(1);
+
+        DataExplorerUtils.goToDatalake();
+
+        DataExplorerUtils.cancelDeleteDataView(dataView);
+
+        DataExplorerUtils.checkRowsViewsTable(1);
+
+        DataExplorerUtils.deleteDataView(dataView);
+
+        DataExplorerUtils.checkRowsViewsTable(0);
+
+        DataExplorerUtils.goToDashboard();
+
+        DataExplorerUtils.editDashboard(dashboard);
+
+        // Validate that data view is removed from dashboard
+        DataExplorerUtils.getEmptyDashboardInformation().should('be.visible');
+
+        DataExplorerUtils.saveDashboardConfiguration();
+
+        DataExplorerUtils.deleteDashboard(dashboard);
+
+        DataExplorerUtils.checkRowsDashboardTable(0);
+    });
+});
diff --git a/ui/cypress/tests/datalake/filterNumericalStringProperties.spec.ts 
b/ui/cypress/tests/dataExplorer/filterNumericalStringProperties.spec.ts
similarity index 71%
rename from ui/cypress/tests/datalake/filterNumericalStringProperties.spec.ts
rename to ui/cypress/tests/dataExplorer/filterNumericalStringProperties.spec.ts
index 40b179a5f3..647f8b0b26 100644
--- a/ui/cypress/tests/datalake/filterNumericalStringProperties.spec.ts
+++ b/ui/cypress/tests/dataExplorer/filterNumericalStringProperties.spec.ts
@@ -16,8 +16,8 @@
  *
  */
 
-import { DataLakeUtils } from '../../support/utils/datalake/DataLakeUtils';
-import { DataLakeWidgetTableUtils } from 
'../../support/utils/datalake/DataLakeWidgetTableUtils';
+import { DataExplorerUtils } from 
'../../support/utils/dataExplorer/DataExplorerUtils';
+import { DataExplorerWidgetTableUtils } from 
'../../support/utils/dataExplorer/DataExplorerWidgetTableUtils';
 import { DataLakeFilterConfig } from 
'../../support/model/DataLakeFilterConfig';
 import { AdapterBuilder } from '../../support/builder/AdapterBuilder';
 import { ConnectBtns } from '../../support/utils/connect/ConnectBtns';
@@ -46,46 +46,46 @@ describe('Validate that filter works for numerical 
dimension property', () => {
     });
 
     it('Perform Test', () => {
-        DataLakeUtils.goToDatalake();
-        DataLakeUtils.createAndEditDataView();
+        DataExplorerUtils.goToDatalake();
+        DataExplorerUtils.createAndEditDataView();
 
         // create table widget and select time range
         const startDate = new Date(1737029442000);
         const endDate = new Date(1742220659000);
 
-        DataLakeUtils.clickOrderBy('descending');
+        DataExplorerUtils.clickOrderBy('descending');
 
-        DataLakeUtils.openVisualizationConfig();
-        DataLakeUtils.selectVisualizationType(DataExplorerWidget.TABLE);
-        DataLakeUtils.selectTimeRange(startDate, endDate);
+        DataExplorerUtils.openVisualizationConfig();
+        DataExplorerUtils.selectVisualizationType(DataExplorerWidget.TABLE);
+        DataExplorerUtils.selectTimeRange(startDate, endDate);
         cy.wait(1000);
 
         // validate data in table
-        DataLakeWidgetTableUtils.checkAmountOfRows(2);
+        DataExplorerWidgetTableUtils.checkAmountOfRows(2);
 
         // select filter for tag
-        DataLakeUtils.selectDataConfig();
+        DataExplorerUtils.selectDataConfig();
         var filterConfig = new DataLakeFilterConfig('dimensionKey', '1', '=');
-        DataLakeUtils.dataConfigAddFilter(filterConfig);
+        DataExplorerUtils.dataConfigAddFilter(filterConfig);
 
         // validate data in table is filtered
-        DataLakeWidgetTableUtils.checkAmountOfRows(1);
+        DataExplorerWidgetTableUtils.checkAmountOfRows(1);
 
         // remove filter
-        DataLakeUtils.dataConfigRemoveFilter();
+        DataExplorerUtils.dataConfigRemoveFilter();
 
-        DataLakeUtils.selectDataConfig();
+        DataExplorerUtils.selectDataConfig();
 
         filterConfig = new DataLakeFilterConfig('v1', '20', '=');
-        DataLakeUtils.dataConfigAddFilter(filterConfig);
+        DataExplorerUtils.dataConfigAddFilter(filterConfig);
 
         // validate data in table is filtered
-        DataLakeWidgetTableUtils.checkAmountOfRows(1);
+        DataExplorerWidgetTableUtils.checkAmountOfRows(1);
 
         // remove filter
-        DataLakeUtils.dataConfigRemoveFilter();
+        DataExplorerUtils.dataConfigRemoveFilter();
 
         // validate data again
-        DataLakeWidgetTableUtils.checkAmountOfRows(2);
+        DataExplorerWidgetTableUtils.checkAmountOfRows(2);
     });
 });
diff --git a/ui/cypress/tests/datalake/missingDataInDataLake.spec.ts 
b/ui/cypress/tests/dataExplorer/missingDataInDataLake.spec.ts
similarity index 75%
rename from ui/cypress/tests/datalake/missingDataInDataLake.spec.ts
rename to ui/cypress/tests/dataExplorer/missingDataInDataLake.spec.ts
index 77e57710b1..f8327105f4 100644
--- a/ui/cypress/tests/datalake/missingDataInDataLake.spec.ts
+++ b/ui/cypress/tests/dataExplorer/missingDataInDataLake.spec.ts
@@ -16,9 +16,9 @@
  *
  */
 
-import { DataLakeUtils } from '../../support/utils/datalake/DataLakeUtils';
+import { DataExplorerUtils } from 
'../../support/utils/dataExplorer/DataExplorerUtils';
 import { PrepareTestDataUtils } from 
'../../support/utils/PrepareTestDataUtils';
-import { DataLakeWidgetTableUtils } from 
'../../support/utils/datalake/DataLakeWidgetTableUtils';
+import { DataExplorerWidgetTableUtils } from 
'../../support/utils/dataExplorer/DataExplorerWidgetTableUtils';
 
 describe('Test missing properties in data lake', () => {
     const dataViewName = 'TestView';
@@ -32,15 +32,15 @@ describe('Test missing properties in data lake', () => {
     });
 
     it('Test table with missing properties', () => {
-        DataLakeUtils.addDataViewAndTableWidget(dataViewName, 'Persist');
+        DataExplorerUtils.addDataViewAndTableWidget(dataViewName, 'Persist');
 
-        DataLakeWidgetTableUtils.checkAmountOfRows(5);
+        DataExplorerWidgetTableUtils.checkAmountOfRows(5);
 
-        DataLakeUtils.selectDataConfig();
+        DataExplorerUtils.selectDataConfig();
         cy.dataCy('data-explorer-ignore-missing-values-checkbox')
             .children()
             .click();
 
-        DataLakeWidgetTableUtils.checkAmountOfRows(3);
+        DataExplorerWidgetTableUtils.checkAmountOfRows(3);
     });
 });
diff --git a/ui/cypress/tests/datalake/timeOrderDataView.spec.ts 
b/ui/cypress/tests/dataExplorer/timeOrderDataView.spec.ts
similarity index 72%
rename from ui/cypress/tests/datalake/timeOrderDataView.spec.ts
rename to ui/cypress/tests/dataExplorer/timeOrderDataView.spec.ts
index 2144304754..a02c8a7a8f 100644
--- a/ui/cypress/tests/datalake/timeOrderDataView.spec.ts
+++ b/ui/cypress/tests/dataExplorer/timeOrderDataView.spec.ts
@@ -16,27 +16,27 @@
  *
  */
 
-import { DataLakeUtils } from '../../support/utils/datalake/DataLakeUtils';
-import { DataLakeBtns } from '../../support/utils/datalake/DataLakeBtns';
+import { DataExplorerUtils } from 
'../../support/utils/dataExplorer/DataExplorerUtils';
+import { DataLakeBtns } from 
'../../support/utils/dataExplorer/DataExplorerBtns';
 import { DataExplorerWidget } from '../../support/model/DataExplorerWidget';
 
 describe('Test Time Order in Data Explorer', () => {
     beforeEach('Setup Test', () => {
         cy.initStreamPipesTest();
-        DataLakeUtils.loadDataIntoDataLake('datalake/sample.csv');
-        DataLakeUtils.goToDatalake();
-        DataLakeUtils.createAndEditDataView();
+        DataExplorerUtils.loadDataIntoDataLake('datalake/sample.csv');
+        DataExplorerUtils.goToDatalake();
+        DataExplorerUtils.createAndEditDataView();
     });
 
     it('Perform Test with ascending and descending order', () => {
         const startDate = new Date('2022-04-01T00:00:00Z');
         const endDate = new Date('2022-07-01T23:59:59Z');
 
-        DataLakeUtils.clickOrderBy('descending');
+        DataExplorerUtils.clickOrderBy('descending');
 
-        DataLakeUtils.openVisualizationConfig();
-        DataLakeUtils.selectVisualizationType(DataExplorerWidget.TABLE);
-        DataLakeUtils.selectTimeRange(startDate, endDate);
+        DataExplorerUtils.openVisualizationConfig();
+        DataExplorerUtils.selectVisualizationType(DataExplorerWidget.TABLE);
+        DataExplorerUtils.selectTimeRange(startDate, endDate);
         cy.wait(1000);
 
         cy.dataCy('data-explorer-table').then($cells => {
@@ -52,12 +52,12 @@ describe('Test Time Order in Data Explorer', () => {
         });
 
         // Save and leave view, edit view again and check ascending order
-        DataLakeBtns.saveDataViewButton();
+        DataExplorerUtils.saveDataViewConfiguration();
         DataLakeBtns.editDataViewButton('New chart');
-        DataLakeUtils.clickOrderBy('ascending');
-        DataLakeUtils.openVisualizationConfig();
-        DataLakeUtils.selectVisualizationType(DataExplorerWidget.TABLE);
-        DataLakeUtils.selectTimeRange(startDate, endDate);
+        DataExplorerUtils.clickOrderBy('ascending');
+        DataExplorerUtils.openVisualizationConfig();
+        DataExplorerUtils.selectVisualizationType(DataExplorerWidget.TABLE);
+        DataExplorerUtils.selectTimeRange(startDate, endDate);
         cy.wait(1000);
 
         cy.dataCy('data-explorer-table').then($cells => {
@@ -73,7 +73,7 @@ describe('Test Time Order in Data Explorer', () => {
         });
 
         // Check if dialog window is showing after applying changes to time 
settings
-        DataLakeUtils.goToDatalake();
-        DataLakeUtils.checkIfConfirmationDialogIsShowing();
+        DataExplorerUtils.goToDatalake();
+        DataExplorerUtils.checkIfConfirmationDialogIsShowing();
     });
 });
diff --git a/ui/cypress/tests/datalake/timeRangeSelectors.spec.ts 
b/ui/cypress/tests/dataExplorer/timeRangeSelectors.spec.ts
similarity index 92%
rename from ui/cypress/tests/datalake/timeRangeSelectors.spec.ts
rename to ui/cypress/tests/dataExplorer/timeRangeSelectors.spec.ts
index 3688e7f789..38de9e38a9 100644
--- a/ui/cypress/tests/datalake/timeRangeSelectors.spec.ts
+++ b/ui/cypress/tests/dataExplorer/timeRangeSelectors.spec.ts
@@ -16,7 +16,7 @@
  *
  */
 
-import { DataLakeUtils } from '../../support/utils/datalake/DataLakeUtils';
+import { DataExplorerUtils } from 
'../../support/utils/dataExplorer/DataExplorerUtils';
 import {
     subDays,
     subHours,
@@ -46,20 +46,20 @@ describe('Test Time Range Selectors in Data Explorer', () 
=> {
 
     before('Setup Tests', () => {
         cy.initStreamPipesTest();
-        DataLakeUtils.loadDataIntoDataLake('datalake/sample.csv');
+        DataExplorerUtils.loadDataIntoDataLake('datalake/sample.csv');
     });
 
     it('Perform Test', () => {
-        DataLakeUtils.goToDatalake();
-        DataLakeUtils.createAndEditDataView();
+        DataExplorerUtils.goToDatalake();
+        DataExplorerUtils.createAndEditDataView();
 
         periods.forEach(period => {
             cy.log('Testing period: ' + period.selector);
-            DataLakeUtils.openTimeSelectorMenu();
+            DataExplorerUtils.openTimeSelectorMenu();
             // Choosing time period and saving initial start and end dates
             cy.dataCy(`time-selector-quick-${period.selector}`).click();
             const expectedEndDate = new Date();
-            DataLakeUtils.openTimeSelectorMenu();
+            DataExplorerUtils.openTimeSelectorMenu();
             // check if dates can differ from the selected dates
             const expectedStartDate = getExpectedStartDate(
                 expectedEndDate,
@@ -101,7 +101,7 @@ describe('Test Time Range Selectors in Data Explorer', () 
=> {
                     ).to.be.true;
                 });
 
-            DataLakeUtils.applyCustomTimeSelection();
+            DataExplorerUtils.applyCustomTimeSelection();
         });
     });
 });
diff --git 
a/ui/cypress/tests/dataExplorer/widgetDataConfiguration.smoke.spec.ts 
b/ui/cypress/tests/dataExplorer/widgetDataConfiguration.smoke.spec.ts
new file mode 100644
index 0000000000..91ee753bb0
--- /dev/null
+++ b/ui/cypress/tests/dataExplorer/widgetDataConfiguration.smoke.spec.ts
@@ -0,0 +1,119 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+import { DataLakeFilterConfig } from 
'../../support/model/DataLakeFilterConfig';
+import { DataExplorerUtils } from 
'../../support/utils/dataExplorer/DataExplorerUtils';
+import { DataExplorerWidgetTableUtils } from 
'../../support/utils/dataExplorer/DataExplorerWidgetTableUtils';
+
+describe('Test Table View in Data Explorer', () => {
+    beforeEach('Setup Test', () => {
+        cy.initStreamPipesTest();
+        DataExplorerUtils.loadDataIntoDataLake('datalake/sample.csv');
+    });
+
+    it('Perform Test', () => {
+        /**
+         * Prepare tests
+         */
+        DataExplorerUtils.addDataViewAndTableWidget('NewWidget', 'Persist');
+
+        // Validate that X lines are available
+        DataExplorerWidgetTableUtils.checkAmountOfRows(10);
+
+        // Go back to data configuration
+        DataExplorerUtils.selectDataConfig();
+
+        /**
+         * Test filter configuration
+         */
+        // Test number
+        let filterConfig = new DataLakeFilterConfig('randomnumber', '22', '=');
+        DataExplorerUtils.dataConfigAddFilter(filterConfig);
+        DataExplorerWidgetTableUtils.checkAmountOfRows(2);
+        DataExplorerUtils.validateFilterOptions([
+            '=',
+            '<',
+            '<=',
+            '>=',
+            '>',
+            '!=',
+        ]);
+        DataExplorerUtils.dataConfigRemoveFilter();
+        DataExplorerWidgetTableUtils.checkAmountOfRows(10);
+
+        // Test number greater then
+        filterConfig = new DataLakeFilterConfig('randomnumber', '50', '>');
+        DataExplorerUtils.dataConfigAddFilter(filterConfig);
+        DataExplorerWidgetTableUtils.checkAmountOfRows(5);
+        DataExplorerUtils.validateFilterOptions([
+            '=',
+            '<',
+            '<=',
+            '>=',
+            '>',
+            '!=',
+        ]);
+        DataExplorerUtils.dataConfigRemoveFilter();
+
+        // Test number smaller then
+        filterConfig = new DataLakeFilterConfig('randomnumber', '50', '<');
+        DataExplorerUtils.dataConfigAddFilter(filterConfig);
+        DataExplorerWidgetTableUtils.checkAmountOfRows(5);
+        DataExplorerUtils.dataConfigRemoveFilter();
+
+        // Test boolean
+        filterConfig = new DataLakeFilterConfig('randombool', 'true', '=');
+        DataExplorerUtils.dataConfigAddFilter(filterConfig);
+        DataExplorerWidgetTableUtils.checkAmountOfRows(6);
+        DataExplorerUtils.validateFilterOptions(['=', '!=']);
+        DataExplorerUtils.validateAutoCompleteOptions(['true', 'false']);
+        DataExplorerUtils.dataConfigRemoveFilter();
+
+        // Test string & if filter is persisted correctly
+        filterConfig = new DataLakeFilterConfig('randomtext', 'a', '=');
+        DataExplorerUtils.checkIfFilterIsSet(0);
+        DataExplorerUtils.dataConfigAddFilter(filterConfig);
+        DataExplorerUtils.checkIfFilterIsSet(1);
+        DataExplorerWidgetTableUtils.checkAmountOfRows(4);
+        DataExplorerUtils.validateFilterOptions(['=', '!=']);
+        DataExplorerUtils.validateAutoCompleteOptions(['a', 'b', 'c']);
+        DataExplorerUtils.saveAndReEditWidget('NewWidget');
+        DataExplorerUtils.checkIfFilterIsSet(1);
+        DataExplorerWidgetTableUtils.checkAmountOfRows(4);
+        DataExplorerUtils.dataConfigRemoveFilter();
+
+        /**
+         * Test groupBy configuration and if it is persisted correctly
+         */
+        cy.wait(1000);
+        DataExplorerUtils.clickGroupBy('randomtext');
+        cy.wait(1000);
+        cy.dataCy('data-explorer-table-row-randomtext', { timeout: 10000 })
+            .last({ timeout: 10000 })
+            .contains('a', { timeout: 10000 });
+        cy.dataCy('data-explorer-table-row-randomtext', { timeout: 10000 })
+            .first({ timeout: 10000 })
+            .contains('c', { timeout: 10000 });
+        DataExplorerWidgetTableUtils.checkAmountOfRows(10);
+        DataExplorerUtils.saveAndReEditWidget('NewWidget');
+        cy.dataCy('data-explorer-group-by-randomtext')
+            .find('input')
+            .should('be.checked');
+        DataExplorerUtils.clickGroupBy('randomtext');
+    });
+});
diff --git a/ui/cypress/tests/datalake/deleteViewAndDashboard.spec.ts 
b/ui/cypress/tests/datalake/deleteViewAndDashboard.spec.ts
deleted file mode 100644
index 800b459277..0000000000
--- a/ui/cypress/tests/datalake/deleteViewAndDashboard.spec.ts
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-import { DataLakeUtils } from '../../support/utils/datalake/DataLakeUtils';
-
-describe('Test Deletion of Data View and Dashboard', () => {
-    beforeEach('Setup Test', () => {
-        cy.initStreamPipesTest();
-        DataLakeUtils.loadDataIntoDataLake('datalake/sample.csv');
-    });
-
-    it('Perform Test', () => {
-        const dashboard = 'TestDashboard';
-        const dataView = 'TestView';
-
-        DataLakeUtils.goToDatalake();
-
-        DataLakeUtils.addDataViewAndTableWidget(dataView, 'Persist');
-
-        DataLakeUtils.saveDataViewConfiguration();
-
-        DataLakeUtils.checkRowsViewsTable(1);
-
-        DataLakeUtils.goToDashboard();
-
-        DataLakeUtils.createAndEditDashboard(dashboard);
-
-        DataLakeUtils.addDataViewToDashboard(dataView, true);
-
-        DataLakeUtils.saveDashboardConfiguration();
-
-        DataLakeUtils.checkRowsDashboardTable(1);
-
-        // Click "Delete" but cancel action and check if dashboard and view 
are still displayed
-        DataLakeUtils.cancelDeleteDashboard(dashboard);
-
-        DataLakeUtils.checkRowsDashboardTable(1);
-
-        DataLakeUtils.goToDatalake();
-
-        DataLakeUtils.cancelDeleteDataView(dataView);
-
-        DataLakeUtils.checkRowsViewsTable(1);
-
-        DataLakeUtils.deleteDataView(dataView);
-
-        DataLakeUtils.checkRowsViewsTable(0);
-
-        DataLakeUtils.goToDashboard();
-
-        DataLakeUtils.editDashboard(dashboard);
-
-        // Validate that data view is removed from dashboard
-        DataLakeUtils.getEmptyDashboardInformation().should('be.visible');
-
-        DataLakeUtils.saveDashboardConfiguration();
-
-        DataLakeUtils.deleteDashboard(dashboard);
-
-        DataLakeUtils.checkRowsDashboardTable(0);
-    });
-});
diff --git a/ui/cypress/tests/datalake/deleteWidget.ts 
b/ui/cypress/tests/datalake/deleteWidget.ts
deleted file mode 100644
index 6c7b2aeadf..0000000000
--- a/ui/cypress/tests/datalake/deleteWidget.ts
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-import { DataLakeUtils } from '../../support/utils/datalake/DataLakeUtils';
-
-describe('Test Table View in Data Explorer', () => {
-    beforeEach('Setup Test', () => {
-        cy.initStreamPipesTest();
-        DataLakeUtils.loadDataIntoDataLake('datalake/sample.csv');
-    });
-
-    it('Perform Test', () => {
-        /**
-         * Prepare tests
-         */
-        DataLakeUtils.addDataViewAndTableWidget('TestView', 'Persist');
-        DataLakeUtils.saveDataViewConfiguration();
-        DataLakeUtils.goToDashboard();
-        DataLakeUtils.createAndEditDashboard('TestDashboard');
-        DataLakeUtils.addDataViewToDashboard('TestView');
-
-        // Check that widget is visible
-        cy.dataCy('widget-TestView', { timeout: 10000 }).should('be.visible');
-
-        // Activate edit mode
-        DataLakeUtils.saveAndReEditDashboard('TestDashboard');
-
-        // Delete widget
-        DataLakeUtils.removeWidget('TestView');
-
-        // Go back to dashboard
-        DataLakeUtils.saveAndReEditDashboard('TestDashboard');
-
-        // Check that widget is gone
-        cy.dataCy('widget-TestView', { timeout: 10000 }).should('not.exist');
-
-        DataLakeUtils.goBackToOverview();
-
-        DataLakeUtils.checkRowsDashboardTable(1);
-
-        // Delete dashboard
-        DataLakeUtils.deleteDashboard('TestDashboard');
-
-        // Check that dashboard is gone
-        DataLakeUtils.checkRowsDashboardTable(0);
-    });
-});
diff --git a/ui/cypress/tests/datalake/widgetDataConfiguration.smoke.spec.ts 
b/ui/cypress/tests/datalake/widgetDataConfiguration.smoke.spec.ts
deleted file mode 100644
index 3b9eb2f858..0000000000
--- a/ui/cypress/tests/datalake/widgetDataConfiguration.smoke.spec.ts
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-import { DataLakeFilterConfig } from 
'../../support/model/DataLakeFilterConfig';
-import { DataLakeUtils } from '../../support/utils/datalake/DataLakeUtils';
-import { DataLakeWidgetTableUtils } from 
'../../support/utils/datalake/DataLakeWidgetTableUtils';
-
-describe('Test Table View in Data Explorer', () => {
-    beforeEach('Setup Test', () => {
-        cy.initStreamPipesTest();
-        DataLakeUtils.loadDataIntoDataLake('datalake/sample.csv');
-    });
-
-    it('Perform Test', () => {
-        /**
-         * Prepare tests
-         */
-        DataLakeUtils.addDataViewAndTableWidget('NewWidget', 'Persist');
-
-        // Validate that X lines are available
-        DataLakeWidgetTableUtils.checkAmountOfRows(10);
-
-        // Go back to data configuration
-        DataLakeUtils.selectDataConfig();
-
-        /**
-         * Test filter configuration
-         */
-        // Test number
-        let filterConfig = new DataLakeFilterConfig('randomnumber', '22', '=');
-        DataLakeUtils.dataConfigAddFilter(filterConfig);
-        DataLakeWidgetTableUtils.checkAmountOfRows(2);
-        DataLakeUtils.validateFilterOptions(['=', '<', '<=', '>=', '>', '!=']);
-        DataLakeUtils.dataConfigRemoveFilter();
-        DataLakeWidgetTableUtils.checkAmountOfRows(10);
-
-        // Test number greater then
-        filterConfig = new DataLakeFilterConfig('randomnumber', '50', '>');
-        DataLakeUtils.dataConfigAddFilter(filterConfig);
-        DataLakeWidgetTableUtils.checkAmountOfRows(5);
-        DataLakeUtils.validateFilterOptions(['=', '<', '<=', '>=', '>', '!=']);
-        DataLakeUtils.dataConfigRemoveFilter();
-
-        // Test number smaller then
-        filterConfig = new DataLakeFilterConfig('randomnumber', '50', '<');
-        DataLakeUtils.dataConfigAddFilter(filterConfig);
-        DataLakeWidgetTableUtils.checkAmountOfRows(5);
-        DataLakeUtils.dataConfigRemoveFilter();
-
-        // Test boolean
-        filterConfig = new DataLakeFilterConfig('randombool', 'true', '=');
-        DataLakeUtils.dataConfigAddFilter(filterConfig);
-        DataLakeWidgetTableUtils.checkAmountOfRows(6);
-        DataLakeUtils.validateFilterOptions(['=', '!=']);
-        DataLakeUtils.validateAutoCompleteOptions(['true', 'false']);
-        DataLakeUtils.dataConfigRemoveFilter();
-
-        // Test string & if filter is persisted correctly
-        filterConfig = new DataLakeFilterConfig('randomtext', 'a', '=');
-        DataLakeUtils.checkIfFilterIsSet(0);
-        DataLakeUtils.dataConfigAddFilter(filterConfig);
-        DataLakeUtils.checkIfFilterIsSet(1);
-        DataLakeWidgetTableUtils.checkAmountOfRows(4);
-        DataLakeUtils.validateFilterOptions(['=', '!=']);
-        DataLakeUtils.validateAutoCompleteOptions(['a', 'b', 'c']);
-        DataLakeUtils.saveAndReEditWidget('NewWidget');
-        DataLakeUtils.checkIfFilterIsSet(1);
-        DataLakeWidgetTableUtils.checkAmountOfRows(4);
-        DataLakeUtils.dataConfigRemoveFilter();
-
-        /**
-         * Test groupBy configuration and if it is persisted correctly
-         */
-        cy.wait(1000);
-        DataLakeUtils.clickGroupBy('randomtext');
-        cy.wait(1000);
-        cy.dataCy('data-explorer-table-row-randomtext', { timeout: 10000 })
-            .last({ timeout: 10000 })
-            .contains('a', { timeout: 10000 });
-        cy.dataCy('data-explorer-table-row-randomtext', { timeout: 10000 })
-            .first({ timeout: 10000 })
-            .contains('c', { timeout: 10000 });
-        DataLakeWidgetTableUtils.checkAmountOfRows(10);
-        DataLakeUtils.saveAndReEditWidget('NewWidget');
-        cy.dataCy('data-explorer-group-by-randomtext')
-            .find('input')
-            .should('be.checked');
-        DataLakeUtils.clickGroupBy('randomtext');
-    });
-});
diff --git 
a/ui/cypress/tests/experimental/restartStreamPipes/restartStreamPipes2.ts 
b/ui/cypress/tests/experimental/restartStreamPipes/restartStreamPipes2.ts
index c55366f9d3..81bbb8bee2 100644
--- a/ui/cypress/tests/experimental/restartStreamPipes/restartStreamPipes2.ts
+++ b/ui/cypress/tests/experimental/restartStreamPipes/restartStreamPipes2.ts
@@ -17,7 +17,7 @@
  */
 
 import { DashboardUtils } from '../../../support/utils/DashboardUtils';
-import { DataLakeUtils } from '../../../support/utils/datalake/DataLakeUtils';
+import { DataExplorerUtils } from 
'../../../support/utils/dataExplorer/DataExplorerUtils';
 
 describe('Validate StreamPipes after restart', () => {
     beforeEach('Setup Test', () => {
@@ -26,7 +26,7 @@ describe('Validate StreamPipes after restart', () => {
 
     it('Perform Test', () => {
         // Truncate data in db
-        DataLakeUtils.goToDatalakeConfiguration();
+        DataExplorerUtils.goToDatalakeConfiguration();
         cy.dataCy('datalake-truncate-btn').should('be.visible').click();
         cy.dataCy('confirm-truncate-data-btn', { timeout: 10000 })
             .should('be.visible')
diff --git 
a/ui/src/app/data-explorer/components/chart-view/data-explorer-chart-view.component.ts
 
b/ui/src/app/data-explorer/components/chart-view/data-explorer-chart-view.component.ts
index 62028c22ef..e86cb7090f 100644
--- 
a/ui/src/app/data-explorer/components/chart-view/data-explorer-chart-view.component.ts
+++ 
b/ui/src/app/data-explorer/components/chart-view/data-explorer-chart-view.component.ts
@@ -48,6 +48,7 @@ import { MatDialog } from '@angular/material/dialog';
 import { map } from 'rxjs/operators';
 import { TranslateService } from '@ngx-translate/core';
 import { ResizeEchartsService } from 
'../../../data-explorer-shared/services/resize-echarts.service';
+import { AssetDialogComponent } from '../../dialog/asset-dialog.component';
 
 @Component({
     selector: 'sp-data-explorer-data-view',
@@ -181,7 +182,23 @@ export class DataExplorerChartViewComponent
             this.dataView.elementId !== undefined
                 ? this.dataViewService.updateChart(this.dataView)
                 : this.dataViewService.saveChart(this.dataView);
-        observable.subscribe(() => {
+        observable.subscribe(data => {
+            const dialogRef = this.dialog.open(AssetDialogComponent, {
+                width: '500px',
+                data: {
+                    title: this.translateService.instant(
+                        'Do you want to link the chart to an Asset?',
+                    ),
+                    subtitle: this.translateService.instant(
+                        'Update asset links or close.',
+                    ),
+                    cancelTitle: this.translateService.instant('Close'),
+                    okTitle: this.translateService.instant('Update'),
+                    confirmAndCancel: true,
+                    editMode: this.editMode,
+                    dataInput: data,
+                },
+            });
             this.routingService.navigateToDataViewOverview(true);
         });
     }
diff --git a/ui/src/app/data-explorer/data-explorer.module.ts 
b/ui/src/app/data-explorer/data-explorer.module.ts
index 3d152dc565..ac4ab4fe07 100644
--- a/ui/src/app/data-explorer/data-explorer.module.ts
+++ b/ui/src/app/data-explorer/data-explorer.module.ts
@@ -51,7 +51,11 @@ import { NgxEchartsModule } from 'ngx-echarts';
 import { MatButtonModule } from '@angular/material/button';
 import { MatCardModule } from '@angular/material/card';
 import { MatCheckboxModule } from '@angular/material/checkbox';
-import { MatDialogModule } from '@angular/material/dialog';
+import {
+    MatDialogActions,
+    MatDialogContent,
+    MatDialogModule,
+} from '@angular/material/dialog';
 import { MatIconModule } from '@angular/material/icon';
 import { MatInputModule } from '@angular/material/input';
 import { MatListModule } from '@angular/material/list';
@@ -82,6 +86,7 @@ import { FilterSelectionPanelRowValueAutocompleteComponent } 
from './components/
 import { DataExplorerSharedModule } from 
'../data-explorer-shared/data-explorer-shared.module';
 import { AggregateConfigurationComponent } from 
'./components/chart-view/designer-panel/data-settings/aggregate-configuration/aggregate-configuration.component';
 import { TranslateModule } from '@ngx-translate/core';
+import { AssetDialogComponent } from './dialog/asset-dialog.component';
 
 @NgModule({
     imports: [
@@ -89,6 +94,8 @@ import { TranslateModule } from '@ngx-translate/core';
         MatCardModule,
         MatCheckboxModule,
         MatDialogModule,
+        MatDialogContent,
+        MatDialogActions,
         MatIconModule,
         MatInputModule,
         MatListModule,
@@ -173,6 +180,7 @@ import { TranslateModule } from '@ngx-translate/core';
         FilterSelectionPanelRowOperationSelectionComponent,
         FilterSelectionPanelRowValueInputComponent,
         FilterSelectionPanelRowValueAutocompleteComponent,
+        AssetDialogComponent,
     ],
     exports: [],
 })
diff --git a/ui/src/app/data-explorer/dialog/asset-dialog.component.html 
b/ui/src/app/data-explorer/dialog/asset-dialog.component.html
new file mode 100644
index 0000000000..bab116961a
--- /dev/null
+++ b/ui/src/app/data-explorer/dialog/asset-dialog.component.html
@@ -0,0 +1,69 @@
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one or more
+  ~ contributor license agreements.  See the NOTICE file distributed with
+  ~ this work for additional information regarding copyright ownership.
+  ~ The ASF licenses this file to You under the Apache License, Version 2.0
+  ~ (the "License"); you may not use this file except in compliance with
+  ~ the License.  You may obtain a copy of the License at
+  ~
+  ~    http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  ~
+  -->
+
+<div fxFlex="100" fxLayout="column">
+    <mat-dialog-content>
+        <div>
+            <h4>{{ data.title }}</h4>
+            <mat-checkbox
+                [(ngModel)]="addToAssets"
+                color="accent"
+                data-cy="sp-show-chart-asset-checkbox"
+            >
+                Add Pipeline to Assets
+            </mat-checkbox>
+            @if (addToAssets) {
+                <div class="mt-10">
+                    <sp-asset-link-configuration
+                        [isEdit]="data.editMode"
+                        [itemId]="data.dataInput.elementId"
+                        (selectedAssetsChange)="onSelectedAssetsChange($event)"
+                        (deselectedAssetsChange)="
+                            onDeselectedAssetsChange($event)
+                        "
+                        (originalAssetsEmitter)="
+                            onOriginalAssetsEmitted($event)
+                        "
+                    >
+                    </sp-asset-link-configuration>
+                </div>
+            }
+        </div>
+    </mat-dialog-content>
+    <mat-dialog-actions>
+        <div fxFlex="100" fxLayoutAlign="end center" class="footer">
+            <button
+                mat-button
+                (click)="onCancel()"
+                *ngIf="data.confirmAndCancel"
+                data-cy="asset-dialog-cancel-delete"
+            >
+                {{ data.cancelTitle }}
+            </button>
+            <button
+                mat-flat-button
+                color="accent"
+                (click)="saveToAssets()"
+                cdkFocusInitial
+                data-cy="asset-dialog-confirm-delete"
+            >
+                {{ data.okTitle }}
+            </button>
+        </div>
+    </mat-dialog-actions>
+</div>
diff --git a/ui/src/app/data-explorer/dialog/asset-dialog.component.ts 
b/ui/src/app/data-explorer/dialog/asset-dialog.component.ts
new file mode 100644
index 0000000000..f48e41b492
--- /dev/null
+++ b/ui/src/app/data-explorer/dialog/asset-dialog.component.ts
@@ -0,0 +1,103 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+import {
+    Component,
+    EventEmitter,
+    inject,
+    Inject,
+    Input,
+    Output,
+} from '@angular/core';
+import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
+import {
+    DataExplorerWidgetModel,
+    LinkageData,
+    SpAssetTreeNode,
+} from '@streampipes/platform-services';
+import { AssetSaveService } from '@streampipes/shared-ui';
+
+@Component({
+    selector: 'sp-asset-dialog',
+    templateUrl: './asset-dialog.component.html',
+    standalone: false,
+})
+export class AssetDialogComponent {
+    private assetSaveService = inject(AssetSaveService);
+
+    selectedAssets: SpAssetTreeNode[];
+    deselectedAssets: SpAssetTreeNode[];
+    originalAssets: SpAssetTreeNode[];
+
+    addToAssets = false;
+
+    constructor(
+        public dialogRef: MatDialogRef<AssetDialogComponent>,
+        @Inject(MAT_DIALOG_DATA) public data: any,
+    ) {
+        if (this.data.editMode) {
+            this.addToAssets = true;
+        }
+    }
+
+    onSelectedAssetsChange(updatedAssets: SpAssetTreeNode[]): void {
+        this.selectedAssets = updatedAssets;
+    }
+
+    onDeselectedAssetsChange(updatedAssets: SpAssetTreeNode[]): void {
+        this.deselectedAssets = updatedAssets;
+    }
+
+    onOriginalAssetsEmitted(updatedAssets: SpAssetTreeNode[]): void {
+        this.originalAssets = updatedAssets;
+    }
+
+    saveToAssets(): void {
+        let linkageData: LinkageData[];
+        try {
+            linkageData = this.createLinkageData();
+
+            this.saveAssets(linkageData);
+        } catch (err) {
+            console.error('Error in addToAsset:', err);
+        }
+    }
+    private createLinkageData(): LinkageData[] {
+        return [
+            {
+                type: 'chart',
+                id: this.data.dataInput.elementId,
+                name: this.data.dataInput.baseAppearanceConfig.widgetTitle,
+            },
+        ];
+    }
+
+    private async saveAssets(linkageData: LinkageData[]): Promise<void> {
+        await this.assetSaveService.saveSelectedAssets(
+            this.selectedAssets,
+            linkageData,
+            this.deselectedAssets,
+            this.originalAssets,
+        );
+        this.dialogRef.close(true);
+    }
+
+    onCancel(): void {
+        this.dialogRef.close();
+    }
+}

Reply via email to