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

SvenO3 pushed a commit to branch 
4430-chart-settings-not-correctly-migrated-after-event-schema-changes
in repository https://gitbox.apache.org/repos/asf/streampipes.git


The following commit(s) were added to 
refs/heads/4430-chart-settings-not-correctly-migrated-after-event-schema-changes
 by this push:
     new 3668fd78ed Add warning panel when editing chart
3668fd78ed is described below

commit 3668fd78edeff62ef5a39bd89743cc53b26d6cd7
Author: Sven Oehler <[email protected]>
AuthorDate: Tue May 12 15:59:21 2026 +0200

    Add warning panel when editing chart
---
 .../model/datalake/DataExplorerWidgetModel.java    | 11 +++++++++++
 .../update/ChartSchemaUpdateCoordinator.java       | 16 ++++++++--------
 .../src/lib/model/gen/streampipes-model.ts         |  4 ++++
 .../chart-view/chart-view.component.html           | 12 ++++++++++++
 .../components/chart-view/chart-view.component.ts  | 22 ++++++++++++++++++++++
 5 files changed, 57 insertions(+), 8 deletions(-)

diff --git 
a/streampipes-model/src/main/java/org/apache/streampipes/model/datalake/DataExplorerWidgetModel.java
 
b/streampipes-model/src/main/java/org/apache/streampipes/model/datalake/DataExplorerWidgetModel.java
index c72a5a6d16..6894cc4e44 100644
--- 
a/streampipes-model/src/main/java/org/apache/streampipes/model/datalake/DataExplorerWidgetModel.java
+++ 
b/streampipes-model/src/main/java/org/apache/streampipes/model/datalake/DataExplorerWidgetModel.java
@@ -24,6 +24,7 @@ import org.apache.streampipes.model.shared.annotation.TsModel;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 @TsModel
@@ -47,6 +48,8 @@ public class DataExplorerWidgetModel extends DashboardEntity {
 
   private DataExplorerWidgetHealthStatus healthStatus;
 
+  private List<String> affectedSchemaUpdateFields;
+
   public DataExplorerWidgetModel() {
     super();
     this.baseAppearanceConfig = new HashMap<>();
@@ -112,4 +115,12 @@ public class DataExplorerWidgetModel extends 
DashboardEntity {
     this.healthStatus = healthStatus;
   }
 
+  public List<String> getAffectedSchemaUpdateFields() {
+    return affectedSchemaUpdateFields;
+  }
+
+  public void setAffectedSchemaUpdateFields(List<String> 
affectedSchemaUpdateFields) {
+    this.affectedSchemaUpdateFields = affectedSchemaUpdateFields;
+  }
+
 }
diff --git 
a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/pipeline/update/ChartSchemaUpdateCoordinator.java
 
b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/pipeline/update/ChartSchemaUpdateCoordinator.java
index 471bd2eafb..cbe2fd013c 100644
--- 
a/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/pipeline/update/ChartSchemaUpdateCoordinator.java
+++ 
b/streampipes-pipeline-management/src/main/java/org/apache/streampipes/manager/pipeline/update/ChartSchemaUpdateCoordinator.java
@@ -76,10 +76,13 @@ public class ChartSchemaUpdateCoordinator {
     widgetStorage
         .findAll()
         .stream()
-        .filter(widget -> makeUpdateInfo(widget, measureNames, 
updatedSchema).isPresent())
-        .forEach(widget -> {
-          
widget.setHealthStatus(DataExplorerWidgetHealthStatus.REQUIRES_ATTENTION);
-          widgetStorage.updateElement(widget);
+        .map(widget -> makeUpdateInfo(widget, measureNames, updatedSchema)
+            .map(updateInfo -> Map.entry(widget, updateInfo)))
+        .flatMap(Optional::stream)
+        .forEach(entry -> {
+          
entry.getKey().setHealthStatus(DataExplorerWidgetHealthStatus.REQUIRES_ATTENTION);
+          
entry.getKey().setAffectedSchemaUpdateFields(entry.getValue().getAffectedFields());
+          widgetStorage.updateElement(entry.getKey());
         });
   }
 
@@ -110,10 +113,7 @@ public class ChartSchemaUpdateCoordinator {
           .findFirst()
           .orElse(null));
       info.setCanAutoMigrate(false);
-      info.setAffectedFields(affectedFields
-          .stream()
-          .map("Referenced field '%s' no longer exists."::formatted)
-          .toList());
+      info.setAffectedFields(affectedFields.stream().toList());
       return Optional.of(info);
     }
   }
diff --git 
a/ui/projects/streampipes/platform-services/src/lib/model/gen/streampipes-model.ts
 
b/ui/projects/streampipes/platform-services/src/lib/model/gen/streampipes-model.ts
index b1bff83646..664bdcb10d 100644
--- 
a/ui/projects/streampipes/platform-services/src/lib/model/gen/streampipes-model.ts
+++ 
b/ui/projects/streampipes/platform-services/src/lib/model/gen/streampipes-model.ts
@@ -1300,6 +1300,7 @@ export class DashboardModel implements Storable, 
SpResource {
 }
 
 export class DataExplorerWidgetModel extends DashboardEntity {
+    affectedSchemaUpdateFields: string[];
     baseAppearanceConfig: { [index: string]: any };
     dataConfig: { [index: string]: any };
     healthStatus: DataExplorerWidgetHealthStatus;
@@ -1317,6 +1318,9 @@ export class DataExplorerWidgetModel extends 
DashboardEntity {
         }
         const instance = target || new DataExplorerWidgetModel();
         super.fromData(data, instance);
+        instance.affectedSchemaUpdateFields = __getCopyArrayFn(
+            __identity<string>(),
+        )(data.affectedSchemaUpdateFields);
         instance.baseAppearanceConfig = __getCopyObjectFn(__identity<any>())(
             data.baseAppearanceConfig,
         );
diff --git a/ui/src/app/chart/components/chart-view/chart-view.component.html 
b/ui/src/app/chart/components/chart-view/chart-view.component.html
index 18885ba522..2343f97d51 100644
--- a/ui/src/app/chart/components/chart-view/chart-view.component.html
+++ b/ui/src/app/chart/components/chart-view/chart-view.component.html
@@ -57,6 +57,18 @@
                         </sp-alert-banner>
                     </div>
                 }
+                @if (showRequiresAttentionWarning) {
+                    <div class="p-10">
+                        <sp-alert-banner
+                            type="warning"
+                            icon="warning"
+                            [title]="requiresAttentionWarningTitle | translate"
+                            [description]="
+                                requiresAttentionDescription | translate
+                            "
+                        ></sp-alert-banner>
+                    </div>
+                }
                 <mat-drawer-container
                     fxFlex="100"
                     fxLayout="column"
diff --git a/ui/src/app/chart/components/chart-view/chart-view.component.ts 
b/ui/src/app/chart/components/chart-view/chart-view.component.ts
index 8805971789..9a826876f8 100644
--- a/ui/src/app/chart/components/chart-view/chart-view.component.ts
+++ b/ui/src/app/chart/components/chart-view/chart-view.component.ts
@@ -116,6 +116,11 @@ export class ChartViewComponent
     readonly legacyMultiSourceWarningTitle = 'Legacy multi-source chart';
     readonly legacyMultiSourceWarningDescription =
         'This chart uses multiple data sources and cannot be edited in this 
release. Please migrate it manually before making changes.';
+    readonly requiresAttentionWarningTitle = 'Chart requires attention';
+    readonly requiresAttentionWarningDescription =
+        'The following fields used by this chart no longer exist in the 
dataset:';
+    readonly requiresAttentionFallbackDescription =
+        'Some fields used by this chart no longer exist in the dataset.';
 
     editMode = true;
     dataView: DataExplorerWidgetModel;
@@ -343,6 +348,21 @@ export class ChartViewComponent
         this.latestQueryResults = results ?? [];
     }
 
+    get showRequiresAttentionWarning(): boolean {
+        return this.dataView?.healthStatus === 'REQUIRES_ATTENTION';
+    }
+
+    get chartSchemaUpdateMessages(): string[] {
+        return this.dataView?.affectedSchemaUpdateFields ?? [];
+    }
+
+    get requiresAttentionDescription(): string {
+        if (this.chartSchemaUpdateMessages.length > 0) {
+            return `${this.requiresAttentionWarningDescription} 
${this.chartSchemaUpdateMessages.join(', ')}`;
+        }
+        return this.requiresAttentionFallbackDescription;
+    }
+
     makeDefaultTimeSettings(): TimeSettings {
         return this.timeSelectionService.getDefaultTimeSettings();
     }
@@ -397,6 +417,7 @@ export class ChartViewComponent
         }
         this.dataView.timeSettings = this.timeSettings;
         this.dataView.healthStatus = 'OK';
+        this.dataView.affectedSchemaUpdateFields = undefined;
         this.dataView.metadata ??= {
             lastModifiedEpochMs: undefined,
             createdAtEpochMs: undefined,
@@ -475,6 +496,7 @@ export class ChartViewComponent
                         }
                         this.dataView.timeSettings = this.timeSettings;
                         this.dataView.healthStatus = 'OK';
+                        this.dataView.affectedSchemaUpdateFields = undefined;
                         return (
                             this.dataView.elementId !== undefined
                                 ? this.dataViewService.updateChart(

Reply via email to