Merge pull request #9472 from vvlladd28/improvement/widget-editor/confirm-to-exit
Improved show confirm on exit dialog in widget editor
This commit is contained in:
commit
c32b638be5
@ -28,10 +28,12 @@ import { isDefined } from '../utils';
|
||||
|
||||
export interface HasConfirmForm {
|
||||
confirmForm(): UntypedFormGroup;
|
||||
confirmOnExitMessage?: string;
|
||||
}
|
||||
|
||||
export interface HasDirtyFlag {
|
||||
isDirty: boolean;
|
||||
confirmOnExitMessage?: string;
|
||||
}
|
||||
|
||||
@Injectable({
|
||||
@ -66,9 +68,10 @@ export class ConfirmOnExitGuard implements CanDeactivate<HasConfirmForm & HasDir
|
||||
isDirty = component.isDirty;
|
||||
}
|
||||
if (isDirty) {
|
||||
const message = this.getMessage(component);
|
||||
return this.dialogService.confirm(
|
||||
this.translate.instant('confirm-on-exit.title'),
|
||||
this.translate.instant('confirm-on-exit.html-message')
|
||||
message
|
||||
).pipe(
|
||||
map((dialogResult) => {
|
||||
if (dialogResult) {
|
||||
@ -85,4 +88,10 @@ export class ConfirmOnExitGuard implements CanDeactivate<HasConfirmForm & HasDir
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private getMessage(component: HasConfirmForm & HasDirtyFlag): string {
|
||||
return component.confirmOnExitMessage
|
||||
? component.confirmOnExitMessage
|
||||
: this.translate.instant('confirm-on-exit.html-message');
|
||||
}
|
||||
}
|
||||
|
||||
@ -956,6 +956,7 @@ export class DashboardPageComponent extends PageComponent implements IDashboardC
|
||||
|
||||
public toggleDashboardEditMode() {
|
||||
this.setEditMode(!this.isEdit, true);
|
||||
this.notifyDashboardToggleEditMode();
|
||||
}
|
||||
|
||||
public saveDashboard() {
|
||||
@ -1063,6 +1064,16 @@ export class DashboardPageComponent extends PageComponent implements IDashboardC
|
||||
this.dashboardCtx.aliasController.updateFilters(this.dashboard.configuration.filters);
|
||||
}
|
||||
|
||||
private notifyDashboardToggleEditMode() {
|
||||
if (this.widgetEditMode) {
|
||||
const message: WindowMessage = {
|
||||
type: 'widgetEditModeToggle',
|
||||
data: this.isEdit
|
||||
};
|
||||
this.window.parent.postMessage(JSON.stringify(message), '*');
|
||||
}
|
||||
}
|
||||
|
||||
private notifyDashboardUpdated() {
|
||||
if (this.widgetEditMode) {
|
||||
const widget = this.layouts.main.layoutCtx.widgets.widgetByIndex(0);
|
||||
|
||||
@ -122,7 +122,19 @@ export class WidgetEditorComponent extends PageComponent implements OnInit, OnDe
|
||||
widget: WidgetInfo;
|
||||
origWidget: WidgetInfo;
|
||||
|
||||
isDirty = false;
|
||||
private isEditModeWidget = false;
|
||||
private _isDirty = false;
|
||||
|
||||
get isDirty(): boolean {
|
||||
return this._isDirty || this.isEditModeWidget;
|
||||
}
|
||||
|
||||
set isDirty(value: boolean) {
|
||||
if (!value) {
|
||||
this.isEditModeWidget = false;
|
||||
}
|
||||
this._isDirty = value;
|
||||
}
|
||||
|
||||
fullscreen = false;
|
||||
htmlFullscreen = false;
|
||||
@ -450,6 +462,10 @@ export class WidgetEditorComponent extends PageComponent implements OnInit, OnDe
|
||||
break;
|
||||
case 'widgetEditUpdated':
|
||||
this.onWidgetEditUpdated(message.data);
|
||||
this.onWidgetEditModeToggled(false);
|
||||
break;
|
||||
case 'widgetEditModeToggle':
|
||||
this.onWidgetEditModeToggled(message.data);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -486,6 +502,10 @@ export class WidgetEditorComponent extends PageComponent implements OnInit, OnDe
|
||||
this.isDirty = true;
|
||||
}
|
||||
|
||||
private onWidgetEditModeToggled(mode: boolean) {
|
||||
this.isEditModeWidget = mode;
|
||||
}
|
||||
|
||||
private onWidgetException(details: ExceptionData) {
|
||||
if (!this.gotError) {
|
||||
this.gotError = true;
|
||||
@ -639,7 +659,7 @@ export class WidgetEditorComponent extends PageComponent implements OnInit, OnDe
|
||||
}
|
||||
|
||||
undoDisabled(): boolean {
|
||||
return !this.isDirty
|
||||
return !this._isDirty
|
||||
|| !this.iframeWidgetEditModeInited
|
||||
|| this.saveWidgetPending
|
||||
|| this.saveWidgetAsPending;
|
||||
@ -647,7 +667,7 @@ export class WidgetEditorComponent extends PageComponent implements OnInit, OnDe
|
||||
|
||||
saveDisabled(): boolean {
|
||||
return this.isReadOnly
|
||||
|| !this.isDirty
|
||||
|| !this._isDirty
|
||||
|| !this.iframeWidgetEditModeInited
|
||||
|| this.saveWidgetPending
|
||||
|| this.saveWidgetAsPending;
|
||||
@ -799,4 +819,11 @@ export class WidgetEditorComponent extends PageComponent implements OnInit, OnDe
|
||||
this.widget.defaultConfig = JSON.stringify(config);
|
||||
this.isDirty = true;
|
||||
}
|
||||
|
||||
get confirmOnExitMessage(): string {
|
||||
if (this.isEditModeWidget && !this._isDirty) {
|
||||
return this.translate.instant('widget.confirm-to-exit-editor-html');
|
||||
}
|
||||
return '';
|
||||
}
|
||||
}
|
||||
|
||||
@ -14,7 +14,8 @@
|
||||
/// limitations under the License.
|
||||
///
|
||||
|
||||
export type WindowMessageType = 'widgetException' | 'widgetEditModeInited' | 'widgetEditUpdated' | 'openDashboardMessage' | 'reloadUserMessage' | 'toggleDashboardLayout';
|
||||
export type WindowMessageType = 'widgetException' | 'widgetEditModeInited' | 'widgetEditUpdated' | 'openDashboardMessage'
|
||||
| 'reloadUserMessage' | 'toggleDashboardLayout' | 'widgetEditModeToggle';
|
||||
|
||||
export interface WindowMessage {
|
||||
type: WindowMessageType;
|
||||
|
||||
@ -4759,6 +4759,7 @@
|
||||
"no-widgets-text": "No widgets found",
|
||||
"management": "Widget management",
|
||||
"editor": "Widget Editor",
|
||||
"confirm-to-exit-editor-html": "You have unsaved default widget settings.<br>Are you sure you want to leave this page?",
|
||||
"widget-type-not-found": "Problem loading widget configuration.<br>Probably associated\n widget type was removed.",
|
||||
"widget-type-load-error": "Widget wasn't loaded due to the following errors:",
|
||||
"remove": "Remove widget",
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user