This is an automated email from the ASF dual-hosted git repository. riemer pushed a commit to branch dev in repository https://gitbox.apache.org/repos/asf/incubator-streampipes.git
commit 31cefac0f45b8e57423c924ae8517bf67f54a184 Author: Dominik Riemer <[email protected]> AuthorDate: Fri May 21 23:10:25 2021 +0200 [STREAMPIPES-370] Improve modification of existing dashboard widgets --- .../streampipes/model/dashboard/DashboardItem.java | 16 +-- .../model/dashboard/DashboardWidgetModel.java | 8 ++ ui/src/app/core-model/gen/streampipes-model.ts | 10 +- .../components/grid/dashboard-grid.component.ts | 2 - .../widget/dashboard-widget.component.html | 30 ++-- .../widget/dashboard-widget.component.ts | 156 +++++++++++---------- ui/src/app/dashboard/dashboard.component.ts | 9 +- ui/src/app/dashboard/dashboard.module.ts | 2 + .../add-visualization-dialog.component.ts | 20 ++- ui/src/app/dashboard/services/edit-mode.service.ts | 31 ++++ 10 files changed, 173 insertions(+), 111 deletions(-) diff --git a/streampipes-model/src/main/java/org/apache/streampipes/model/dashboard/DashboardItem.java b/streampipes-model/src/main/java/org/apache/streampipes/model/dashboard/DashboardItem.java index f33485e..aab3ce2 100644 --- a/streampipes-model/src/main/java/org/apache/streampipes/model/dashboard/DashboardItem.java +++ b/streampipes-model/src/main/java/org/apache/streampipes/model/dashboard/DashboardItem.java @@ -24,7 +24,7 @@ public class DashboardItem { private String id; private String name; private String component; - private String widgetType; + //private String widgetType; private List<String> settings; @@ -61,13 +61,13 @@ public class DashboardItem { this.component = component; } - public String getWidgetType() { - return widgetType; - } - - public void setWidgetType(String widgetType) { - this.widgetType = widgetType; - } +// public String getWidgetType() { +// return widgetType; +// } +// +// public void setWidgetType(String widgetType) { +// this.widgetType = widgetType; +// } public List<String> getSettings() { return settings; diff --git a/streampipes-model/src/main/java/org/apache/streampipes/model/dashboard/DashboardWidgetModel.java b/streampipes-model/src/main/java/org/apache/streampipes/model/dashboard/DashboardWidgetModel.java index c529cff..7f7e732 100644 --- a/streampipes-model/src/main/java/org/apache/streampipes/model/dashboard/DashboardWidgetModel.java +++ b/streampipes-model/src/main/java/org/apache/streampipes/model/dashboard/DashboardWidgetModel.java @@ -67,4 +67,12 @@ public class DashboardWidgetModel extends DashboardEntity { public void setVisualizationName(String visualizationName) { this.visualizationName = visualizationName; } + + public String getWidgetType() { + return widgetType; + } + + public void setWidgetType(String widgetType) { + this.widgetType = widgetType; + } } diff --git a/ui/src/app/core-model/gen/streampipes-model.ts b/ui/src/app/core-model/gen/streampipes-model.ts index 4a7a270..b20443d 100644 --- a/ui/src/app/core-model/gen/streampipes-model.ts +++ b/ui/src/app/core-model/gen/streampipes-model.ts @@ -19,7 +19,7 @@ /* tslint:disable */ /* eslint-disable */ // @ts-nocheck -// Generated using typescript-generator version 2.27.744 on 2021-05-21 11:31:40. +// Generated using typescript-generator version 2.27.744 on 2021-05-21 21:59:41. export class AbstractStreamPipesEntity { "@class": "org.apache.streampipes.model.base.AbstractStreamPipesEntity" | "org.apache.streampipes.model.base.NamedStreamPipesEntity" | "org.apache.streampipes.model.connect.adapter.AdapterDescription" | "org.apache.streampipes.model.connect.adapter.AdapterSetDescription" | "org.apache.streampipes.model.connect.adapter.GenericAdapterSetDescription" | "org.apache.streampipes.model.connect.adapter.SpecificAdapterSetDescription" | "org.apache.streampipes.model.connect.adapter.AdapterStre [...] @@ -189,8 +189,8 @@ export class AdapterDescription extends NamedStreamPipesEntity { instance.rules = __getCopyArrayFn(TransformationRuleDescription.fromDataUnion)(data.rules); instance.category = __getCopyArrayFn(__identity<string>())(data.category); instance.createdAt = data.createdAt; - instance.streamRules = __getCopyArrayFn(__identity<any>())(data.streamRules); instance.valueRules = __getCopyArrayFn(__identity<any>())(data.valueRules); + instance.streamRules = __getCopyArrayFn(__identity<any>())(data.streamRules); instance.schemaRules = __getCopyArrayFn(__identity<any>())(data.schemaRules); instance.couchDBId = data.couchDBId; instance._rev = data._rev; @@ -826,7 +826,6 @@ export class DashboardItem { name: string; rows: number; settings: string[]; - widgetType: string; x: number; y: number; @@ -838,7 +837,6 @@ export class DashboardItem { instance.id = data.id; instance.name = data.name; instance.component = data.component; - instance.widgetType = data.widgetType; instance.settings = __getCopyArrayFn(__identity<string>())(data.settings); instance.cols = data.cols; instance.rows = data.rows; @@ -879,6 +877,7 @@ export class DashboardWidgetModel extends DashboardEntity { pipelineId: string; visualizationName: string; widgetId: string; + widgetType: string; static fromData(data: DashboardWidgetModel, target?: DashboardWidgetModel): DashboardWidgetModel { if (!data) { @@ -887,6 +886,7 @@ export class DashboardWidgetModel extends DashboardEntity { const instance = target || new DashboardWidgetModel(); super.fromData(data, instance); instance.widgetId = data.widgetId; + instance.widgetType = data.widgetType; instance.dashboardWidgetSettings = DashboardWidgetSettings.fromData(data.dashboardWidgetSettings); instance.pipelineId = data.pipelineId; instance.visualizationName = data.visualizationName; @@ -2672,8 +2672,8 @@ export class SpDataSet extends SpDataStream { instance.supportedGrounding = EventGrounding.fromData(data.supportedGrounding); instance.datasetInvocationId = data.datasetInvocationId; instance.correspondingPipeline = data.correspondingPipeline; - instance.brokerHostname = data.brokerHostname; instance.actualTopicName = data.actualTopicName; + instance.brokerHostname = data.brokerHostname; return instance; } } diff --git a/ui/src/app/dashboard/components/grid/dashboard-grid.component.ts b/ui/src/app/dashboard/components/grid/dashboard-grid.component.ts index 5ea24da..9c0a34a 100644 --- a/ui/src/app/dashboard/components/grid/dashboard-grid.component.ts +++ b/ui/src/app/dashboard/components/grid/dashboard-grid.component.ts @@ -88,8 +88,6 @@ export class DashboardGridComponent implements OnInit, OnChanges { this.options.resizable.enabled = this.editMode; this.options.displayGrid = this.editMode ? 'always' : 'none'; this.options.api.optionsChanged(); - console.log(this.options); - console.log(this.editMode); } } diff --git a/ui/src/app/dashboard/components/widget/dashboard-widget.component.html b/ui/src/app/dashboard/components/widget/dashboard-widget.component.html index 1aabc78..7dc7184 100644 --- a/ui/src/app/dashboard/components/widget/dashboard-widget.component.html +++ b/ui/src/app/dashboard/components/widget/dashboard-widget.component.html @@ -48,88 +48,88 @@ </button> </div> <div *ngIf="widgetLoaded && pipelineRunning" class="h-100"> - <div *ngIf="widget.widgetType === 'number'" class="h-100 p-0"> + <div *ngIf="configuredWidget.widgetType === 'number'" class="h-100 p-0"> <number-widget [gridsterItemComponent]="gridsterItemComponent" [gridsterItem]="item" [widget]="widget" [editMode]="editMode" [widgetConfig]="configuredWidget" [widgetDataConfig]="widgetDataConfig" class="h-100"></number-widget> </div> - <div *ngIf="widget.widgetType === 'line'" class="h-100 p-0"> + <div *ngIf="configuredWidget.widgetType === 'line'" class="h-100 p-0"> <line-widget [gridsterItemComponent]="gridsterItemComponent" [editMode]="editMode" [gridsterItem]="item" [widget]="widget" [widgetConfig]="configuredWidget" [widgetDataConfig]="widgetDataConfig" class="h-100"></line-widget> </div> - <div *ngIf="widget.widgetType === 'area'" class="h-100 p-0"> + <div *ngIf="configuredWidget.widgetType === 'area'" class="h-100 p-0"> <area-widget [gridsterItemComponent]="gridsterItemComponent" [editMode]="editMode" [gridsterItem]="item" [widget]="widget" [widgetConfig]="configuredWidget" [widgetDataConfig]="widgetDataConfig" class="h-100"></area-widget> </div> - <div *ngIf="widget.widgetType === 'table'" class="h-100 p-0"> + <div *ngIf="configuredWidget.widgetType === 'table'" class="h-100 p-0"> <table-widget [gridsterItemComponent]="gridsterItemComponent" [gridsterItem]="item" [widget]="widget" [editMode]="editMode" [widgetConfig]="configuredWidget" [widgetDataConfig]="widgetDataConfig" class="h-100"></table-widget> </div> - <div *ngIf="widget.widgetType === 'gauge'" class="h-100 p-0"> + <div *ngIf="configuredWidget.widgetType === 'gauge'" class="h-100 p-0"> <gauge-widget [gridsterItemComponent]="gridsterItemComponent" [gridsterItem]="item" [widget]="widget" [editMode]="editMode" [widgetConfig]="configuredWidget" [widgetDataConfig]="widgetDataConfig" class="h-100"></gauge-widget> </div> - <div *ngIf="widget.widgetType === 'image'" class="h-100 p-0"> + <div *ngIf="configuredWidget.widgetType === 'image'" class="h-100 p-0"> <image-widget [gridsterItemComponent]="gridsterItemComponent" [gridsterItem]="item" [widget]="widget" [editMode]="editMode" [widgetConfig]="configuredWidget" [widgetDataConfig]="widgetDataConfig" class="h-100"></image-widget> </div> - <div *ngIf="widget.widgetType === 'map'" class="h-100 p-0"> + <div *ngIf="configuredWidget.widgetType === 'map'" class="h-100 p-0"> <map-widget [gridsterItemComponent]="gridsterItemComponent" [gridsterItem]="item" [widget]="widget" [editMode]="editMode" [widgetConfig]="configuredWidget" [widgetDataConfig]="widgetDataConfig" class="h-100"></map-widget> </div> - <div *ngIf="widget.widgetType === 'raw'" class="h-100 p-0"> + <div *ngIf="configuredWidget.widgetType === 'raw'" class="h-100 p-0"> <raw-widget [gridsterItemComponent]="gridsterItemComponent" [gridsterItem]="item" [widget]="widget" [editMode]="editMode" [widgetConfig]="configuredWidget" [widgetDataConfig]="widgetDataConfig" class="h-100"></raw-widget> </div> - <div *ngIf="widget.widgetType === 'html'" class="h-100 p-0"> + <div *ngIf="configuredWidget.widgetType === 'html'" class="h-100 p-0"> <html-widget [gridsterItemComponent]="gridsterItemComponent" [gridsterItem]="item" [widget]="widget" [editMode]="editMode" [widgetConfig]="configuredWidget" [widgetDataConfig]="widgetDataConfig" class="h-100"></html-widget> </div> - <div *ngIf="widget.widgetType === 'trafficlight'" class="h-100 p-0"> + <div *ngIf="configuredWidget.widgetType === 'trafficlight'" class="h-100 p-0"> <traffic-light-widget [gridsterItemComponent]="gridsterItemComponent" [gridsterItem]="item" [widget]="widget" [editMode]="editMode" [widgetConfig]="configuredWidget" [widgetDataConfig]="widgetDataConfig" class="h-100"></traffic-light-widget> </div> - <div *ngIf="widget.widgetType === 'pallet'" class="h-100 p-0"> + <div *ngIf="configuredWidget.widgetType === 'pallet'" class="h-100 p-0"> <sp-pallet [gridsterItemComponent]="gridsterItemComponent" [gridsterItem]="item" [widget]="widget" [editMode]="editMode" [widgetConfig]="configuredWidget" [widgetDataConfig]="widgetDataConfig" class="h-100"></sp-pallet> </div> - <div *ngIf="widget.widgetType === 'wordcloud'" class="h-100 p-0"> + <div *ngIf="configuredWidget.widgetType === 'wordcloud'" class="h-100 p-0"> <wordcloud-widget [gridsterItemComponent]="gridsterItemComponent" [gridsterItem]="item" [widget]="widget" [editMode]="editMode" [widgetConfig]="configuredWidget" [widgetDataConfig]="widgetDataConfig" class="h-100"></wordcloud-widget> </div> - <div *ngIf="widget.widgetType === 'status'" class="h-100 p-0"> + <div *ngIf="configuredWidget.widgetType === 'status'" class="h-100 p-0"> <status-widget [gridsterItemComponent]="gridsterItemComponent" [gridsterItem]="item" [widget]="widget" [editMode]="editMode" [widgetConfig]="configuredWidget" [widgetDataConfig]="widgetDataConfig" class="h-100"></status-widget> </div> - <div *ngIf="widget.widgetType === 'bar-race'" class="h-100 p-0"> + <div *ngIf="configuredWidget.widgetType === 'bar-race'" class="h-100 p-0"> <bar-race-widget [gridsterItemComponent]="gridsterItemComponent" [gridsterItem]="item" [widget]="widget" [editMode]="editMode" [widgetConfig]="configuredWidget" [widgetDataConfig]="widgetDataConfig" class="h-100"></bar-race-widget> </div> - <div *ngIf="widget.widgetType === 'stacked-line-chart'" class="h-100 p-0"> + <div *ngIf="configuredWidget.widgetType === 'stacked-line-chart'" class="h-100 p-0"> <stacked-line-chart-widget [gridsterItemComponent]="gridsterItemComponent" [gridsterItem]="item" [widget]="widget" [editMode]="editMode" [widgetConfig]="configuredWidget" diff --git a/ui/src/app/dashboard/components/widget/dashboard-widget.component.ts b/ui/src/app/dashboard/components/widget/dashboard-widget.component.ts index 8149020..e005f22 100644 --- a/ui/src/app/dashboard/components/widget/dashboard-widget.component.ts +++ b/ui/src/app/dashboard/components/widget/dashboard-widget.component.ts @@ -22,99 +22,107 @@ import {DashboardService} from "../../services/dashboard.service"; import {GridsterItem, GridsterItemComponent} from "angular-gridster2"; import {AddVisualizationDialogComponent} from "../../dialogs/add-widget/add-visualization-dialog.component"; import { - DashboardWidgetModel, Pipeline, - VisualizablePipeline + DashboardWidgetModel, Pipeline, + VisualizablePipeline } from "../../../core-model/gen/streampipes-model"; import {PanelType} from "../../../core-ui/dialog/base-dialog/base-dialog.model"; import {DialogService} from "../../../core-ui/dialog/base-dialog/base-dialog.service"; import {PipelineService} from "../../../platform-services/apis/pipeline.service"; +import {EditModeService} from "../../services/edit-mode.service"; @Component({ - selector: 'dashboard-widget', - templateUrl: './dashboard-widget.component.html', - styleUrls: ['./dashboard-widget.component.css'] + selector: 'dashboard-widget', + templateUrl: './dashboard-widget.component.html', + styleUrls: ['./dashboard-widget.component.css'] }) export class DashboardWidgetComponent implements OnInit { - @Input() widget: DashboardItem; - @Input() editMode: boolean; - @Input() headerVisible: boolean = false; - @Input() item: GridsterItem; - @Input() gridsterItemComponent: GridsterItemComponent; + @Input() widget: DashboardItem; + @Input() editMode: boolean; + @Input() headerVisible: boolean = false; + @Input() item: GridsterItem; + @Input() gridsterItemComponent: GridsterItemComponent; - @Output() deleteCallback: EventEmitter<DashboardItem> = new EventEmitter<DashboardItem>(); - @Output() updateCallback: EventEmitter<DashboardWidgetModel> = new EventEmitter<DashboardWidgetModel>(); + @Output() deleteCallback: EventEmitter<DashboardItem> = new EventEmitter<DashboardItem>(); + @Output() updateCallback: EventEmitter<DashboardWidgetModel> = new EventEmitter<DashboardWidgetModel>(); - widgetLoaded: boolean = false; - configuredWidget: DashboardWidgetModel; - widgetDataConfig: VisualizablePipeline; - pipeline: Pipeline; + widgetLoaded: boolean = false; + configuredWidget: DashboardWidgetModel; + widgetDataConfig: VisualizablePipeline; + pipeline: Pipeline; - pipelineRunning: boolean = false; - widgetNotAvailable: boolean = false; + pipelineRunning: boolean = false; + widgetNotAvailable: boolean = false; - constructor(private dashboardService: DashboardService, - private dialogService: DialogService, - private pipelineService: PipelineService) { - } + constructor(private dashboardService: DashboardService, + private dialogService: DialogService, + private pipelineService: PipelineService, + private editModeService: EditModeService) { + } - ngOnInit(): void { - this.loadWidget(); - } + ngOnInit(): void { + this.loadWidget(); + } - loadWidget() { - this.dashboardService.getWidget(this.widget.id).subscribe(response => { - this.configuredWidget = response; - this.dashboardService.getVisualizablePipelineByPipelineIdAndVisualizationName(this.configuredWidget.pipelineId, - this.configuredWidget.visualizationName).subscribe(vizPipeline => { - this.widgetDataConfig = vizPipeline; - this.dashboardService.getPipelineById(vizPipeline.pipelineId).subscribe(pipeline => { - this.pipeline = pipeline; - this.pipelineRunning = pipeline.running; - this.widgetNotAvailable = false; - this.widgetLoaded = true; - }); - }, err => { - this.widgetLoaded = true; - this.widgetNotAvailable = true; - }); - }); - } + loadWidget() { + this.dashboardService.getWidget(this.widget.id).subscribe(response => { + this.configuredWidget = response; + this.loadVisualizablePipeline(); + }); + } - removeWidget() { - this.deleteCallback.emit(this.widget); - } + loadVisualizablePipeline() { + this.dashboardService.getVisualizablePipelineByPipelineIdAndVisualizationName(this.configuredWidget.pipelineId, + this.configuredWidget.visualizationName).subscribe(vizPipeline => { + this.widgetDataConfig = vizPipeline; + this.dashboardService.getPipelineById(vizPipeline.pipelineId).subscribe(pipeline => { + this.pipeline = pipeline; + this.pipelineRunning = pipeline.running; + this.widgetNotAvailable = false; + this.widgetLoaded = true; + }); + }, err => { + this.widgetLoaded = true; + this.widgetNotAvailable = true; + }); + } - startPipeline() { - if (!this.pipelineRunning) { - this.pipelineService - .startPipeline(this.pipeline._id) - .subscribe(status => this.loadWidget()); - } - } + removeWidget() { + this.deleteCallback.emit(this.widget); + } - modifyWidget() { - this.editMode = true; - this.editWidget(); + startPipeline() { + if (!this.pipelineRunning) { + this.pipelineService + .startPipeline(this.pipeline._id) + .subscribe(status => this.loadWidget()); } + } - editWidget(): void { - const dialogRef = this.dialogService.open(AddVisualizationDialogComponent,{ - panelType: PanelType.SLIDE_IN_PANEL, - title: "Edit widget", - width: "50vw", - data: { - "widget": this.configuredWidget, - "pipeline": this.widgetDataConfig, - "editMode": true - } - }); + modifyWidget() { + this.editModeService.notify(true); + this.editWidget(); + } - dialogRef.afterClosed().subscribe(widget => { - if (widget) { - this.configuredWidget = widget; - this.updateCallback.emit(this.configuredWidget); - } - }); - } + editWidget(): void { + const dialogRef = this.dialogService.open(AddVisualizationDialogComponent, { + panelType: PanelType.SLIDE_IN_PANEL, + title: "Edit widget", + width: "50vw", + data: { + "widget": this.configuredWidget, + "pipeline": this.widgetDataConfig, + "editMode": true, + "startPage": this.widgetNotAvailable ? "select-pipeline" : "configure-widget" + } + }); + + dialogRef.afterClosed().subscribe(widget => { + if (widget) { + this.configuredWidget = widget; + this.loadVisualizablePipeline(); + this.updateCallback.emit(this.configuredWidget); + } + }); + } } diff --git a/ui/src/app/dashboard/dashboard.component.ts b/ui/src/app/dashboard/dashboard.component.ts index 424d39a..041b6e6 100644 --- a/ui/src/app/dashboard/dashboard.component.ts +++ b/ui/src/app/dashboard/dashboard.component.ts @@ -21,6 +21,7 @@ import {Dashboard} from "./models/dashboard.model"; import {DashboardService} from "./services/dashboard.service"; import {RefreshDashboardService} from "./services/refresh-dashboard.service"; import {Tuple2} from "../core-model/base/Tuple2"; +import {EditModeService} from "./services/edit-mode.service"; @Component({ selector: 'dashboard', @@ -39,13 +40,17 @@ export class DashboardComponent implements OnInit { dashboards: Array<Dashboard>; constructor(private dashboardService: DashboardService, - private refreshDashboardService: RefreshDashboardService) {} + private refreshDashboardService: RefreshDashboardService, + private editModeService: EditModeService) {} - public ngOnInit() { + ngOnInit() { this.getDashboards(); this.refreshDashboardService.refreshSubject.subscribe(currentDashboardId => { this.getDashboards(currentDashboardId); }); + this.editModeService.editModeSubject.subscribe(editMode => { + this.editMode = editMode; + }) } diff --git a/ui/src/app/dashboard/dashboard.module.ts b/ui/src/app/dashboard/dashboard.module.ts index 9a31932..fcb638f 100644 --- a/ui/src/app/dashboard/dashboard.module.ts +++ b/ui/src/app/dashboard/dashboard.module.ts @@ -58,6 +58,7 @@ import {NgxEchartsModule} from "ngx-echarts"; import {StatusWidgetComponent} from "./components/widgets/status/status-widget.component"; import {BarRaceWidgetComponent} from "./components/widgets/bar-race/bar-race-widget.component"; import {StackedLineChartWidgetComponent} from "./components/widgets/stacked-line-chart/stacked-line-chart-widget.component"; +import {EditModeService} from "./services/edit-mode.service"; @NgModule({ imports: [ @@ -108,6 +109,7 @@ import {StackedLineChartWidgetComponent} from "./components/widgets/stacked-line ], providers: [ DashboardService, + EditModeService, ResizeService, RefreshDashboardService, SemanticTypeUtilsService, diff --git a/ui/src/app/dashboard/dialogs/add-widget/add-visualization-dialog.component.ts b/ui/src/app/dashboard/dialogs/add-widget/add-visualization-dialog.component.ts index 087625b..23b4241 100644 --- a/ui/src/app/dashboard/dialogs/add-widget/add-visualization-dialog.component.ts +++ b/ui/src/app/dashboard/dialogs/add-widget/add-visualization-dialog.component.ts @@ -83,6 +83,9 @@ export class AddVisualizationDialogComponent implements OnInit, AfterViewInit { @Input() editMode: boolean; + @Input() + startPage: string; + constructor( private dialogRef: DialogRef<AddVisualizationDialogComponent>, @@ -102,10 +105,11 @@ export class AddVisualizationDialogComponent implements OnInit, AfterViewInit { this.dialogTitle = 'Add widget'; this.loadVisualizablePipelines(); } else { + this.loadVisualizablePipelines(); this.dialogTitle = 'Edit widget'; this.selectedPipeline = this.pipeline; this.selectedWidget = this.widget.dashboardWidgetSettings; - this.page = 'configure-widget'; + this.page = this.startPage; } } @@ -181,12 +185,16 @@ export class AddVisualizationDialogComponent implements OnInit, AfterViewInit { return requiredSchema.eventProperties.find(ep => ep.runtimeName === internalName); } + loadAvailableWidgets() { + this.availableWidgets = WidgetRegistry.getCompatibleWidgetTemplates(this.selectedPipeline); + this.availableWidgets.sort((a, b) => { + return a.widgetLabel < b.widgetLabel ? -1 : 1; + }); + } + next() { if (this.page == 'select-pipeline') { - this.availableWidgets = WidgetRegistry.getCompatibleWidgetTemplates(this.selectedPipeline); - this.availableWidgets.sort((a, b) => { - return a.widgetLabel < b.widgetLabel ? -1 : 1; - }); + this.loadAvailableWidgets(); this.page = 'select-widget'; } else if (this.page == 'select-widget') { this.page = 'configure-widget'; @@ -197,6 +205,7 @@ export class AddVisualizationDialogComponent implements OnInit, AfterViewInit { configuredWidget.dashboardWidgetSettings["@class"] = "org.apache.streampipes.model.dashboard.DashboardWidgetSettings"; configuredWidget.visualizationName = this.selectedPipeline.visualizationName; configuredWidget.pipelineId = this.selectedPipeline.pipelineId; + configuredWidget.widgetType = configuredWidget.dashboardWidgetSettings.widgetName; if (!this.editMode) { this.dashboardService.saveWidget(configuredWidget).subscribe(response => { this.dialogRef.close(response); @@ -214,6 +223,7 @@ export class AddVisualizationDialogComponent implements OnInit, AfterViewInit { if (this.page == 'select-widget') { this.page = 'select-pipeline'; } else if (this.page == 'configure-widget') { + this.loadAvailableWidgets(); this.page = 'select-widget'; } } diff --git a/ui/src/app/dashboard/services/edit-mode.service.ts b/ui/src/app/dashboard/services/edit-mode.service.ts new file mode 100644 index 0000000..b8de16e --- /dev/null +++ b/ui/src/app/dashboard/services/edit-mode.service.ts @@ -0,0 +1,31 @@ +/* + * 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 {ReplaySubject} from "rxjs"; +import {Injectable} from "@angular/core"; +import {GridsterInfo} from "../models/gridster-info.model"; + +@Injectable() +export class EditModeService { + + public editModeSubject: ReplaySubject<boolean> = new ReplaySubject<boolean>(); + + public notify(editMode: boolean): void { + this.editModeSubject.next(editMode); + } +}
