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(