Skip to content

Commit 9f587fb

Browse files
authored
Adding support for updating Ibiza dirty state (#1910)
1 parent 3940106 commit 9f587fb

File tree

7 files changed

+88
-9
lines changed

7 files changed

+88
-9
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import { PortalService } from './../services/portal.service';
2+
import { Directive, Input, SimpleChange, OnChanges, OnDestroy } from '@angular/core';
3+
import { Subject } from 'rxjs/Subject';
4+
import 'rxjs/add/operator/debounceTime';
5+
import 'rxjs/add/operator/switchMap';
6+
7+
8+
@Directive({
9+
selector: '[is-dirty]',
10+
})
11+
export class IsDirtyDirective implements OnChanges, OnDestroy {
12+
13+
@Input('is-dirty') dirty: boolean;
14+
15+
// If dirtyMessage is null, we'll just use the default Ibiza message
16+
@Input('is-dirty-message') dirtyMessage: string;
17+
18+
private _dirtyStream = new Subject<boolean>();
19+
private _ngUnsubscribe = new Subject();
20+
21+
constructor(private _portalService: PortalService) {
22+
23+
this._dirtyStream
24+
.takeUntil(this._ngUnsubscribe)
25+
.debounceTime(100) // Give some time for message changes
26+
.subscribe(dirty => {
27+
28+
this._portalService.updateDirtyState(
29+
dirty,
30+
this.dirtyMessage);
31+
32+
});
33+
}
34+
35+
ngOnChanges(changes: { [key: string]: SimpleChange }) {
36+
if (this.dirty !== undefined) {
37+
this._dirtyStream.next(this.dirty);
38+
}
39+
}
40+
41+
ngOnDestroy() {
42+
this._portalService.updateDirtyState(
43+
false,
44+
this.dirtyMessage);
45+
46+
this._ngUnsubscribe.next();
47+
}
48+
}

AzureFunctions.AngularClient/src/app/shared/models/portal.ts

+7-1
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,8 @@ export class Verbs {
6464
public static logAction = 'log-action';
6565
public static logMessage = 'log-message';
6666
public static logTimerEvent = 'log-timer-event';
67-
public static setDirtyState = 'set-dirtystate';
67+
public static setDirtyState = 'set-dirtystate'; // Deprecated
68+
public static updateDirtyState = 'update-dirtystate';
6869
public static setupOAuth = 'setup-oauth';
6970
public static pinPart = 'pin-part';
7071
public static setNotification = 'set-notification';
@@ -127,6 +128,11 @@ export interface NotificationStartedInfo {
127128
id: string
128129
}
129130

131+
export interface DirtyStateInfo{
132+
dirty: boolean;
133+
message?: string;
134+
}
135+
130136
export enum PartSize {
131137
/**
132138
* A tile that is 1 column x 1 row.

AzureFunctions.AngularClient/src/app/shared/services/portal.service.ts

+11-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { Injectable } from '@angular/core';
44
import { Subject } from 'rxjs/Subject';
55
import { ReplaySubject } from 'rxjs/ReplaySubject';
66

7-
import { PinPartInfo, GetStartupInfo, NotificationInfo, NotificationStartedInfo, DataMessage, BladeResult } from './../models/portal';
7+
import { PinPartInfo, GetStartupInfo, NotificationInfo, NotificationStartedInfo, DataMessage, BladeResult, DirtyStateInfo } from './../models/portal';
88
import { Event, Data, Verbs, Action, LogEntryLevel, Message, UpdateBladeInfo, OpenBladeInfo, StartupInfo, TimerEvent } from '../models/portal';
99
import { ErrorEvent } from '../models/error-event';
1010
import { BroadcastService } from './broadcast.service';
@@ -308,10 +308,20 @@ export class PortalService {
308308
this.postMessage(Verbs.logAction, actionStr);
309309
}
310310

311+
// Deprecated
311312
setDirtyState(dirty: boolean): void {
312313
this.postMessage(Verbs.setDirtyState, JSON.stringify(dirty));
313314
}
314315

316+
updateDirtyState(dirty: boolean, message?: string): void {
317+
const info: DirtyStateInfo = {
318+
dirty: dirty,
319+
message: message
320+
};
321+
322+
this.postMessage(Verbs.updateDirtyState, JSON.stringify(info));
323+
}
324+
315325
logMessage(level: LogEntryLevel, message: string, ...restArgs: any[]) {
316326
const messageStr = JSON.stringify(<Message>{
317327
level: level,

AzureFunctions.AngularClient/src/app/shared/shared.module.ts

+3
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { IsDirtyDirective } from './directives/is-dirty.directive';
12
import { LoadImageDirective } from './../controls/load-image/load-image.directive';
23
import { SlideToggleComponent } from './../controls/slide-toggle/slide-toggle.component';
34
import { TryNowBusyStateComponent } from './../try-now-busy-state/try-now-busy-state.component';
@@ -79,6 +80,7 @@ export function AiServiceFactory() {
7980
CommandComponent,
8081
CheckScenarioDirective,
8182
DynamicLoaderDirective,
83+
IsDirtyDirective,
8284
RadioSelectorComponent,
8385
PopOverComponent,
8486
TextboxComponent,
@@ -107,6 +109,7 @@ export function AiServiceFactory() {
107109
CommandComponent,
108110
CheckScenarioDirective,
109111
DynamicLoaderDirective,
112+
IsDirtyDirective,
110113
RadioSelectorComponent,
111114
PopOverComponent,
112115
TextboxComponent,

AzureFunctions.AngularClient/src/app/site/site-config/site-config.component.html

+11-7
Original file line numberDiff line numberDiff line change
@@ -15,18 +15,22 @@
1515

1616
<!-- <a (click)="scaleUp()" >SCALE UP!!!</a> -->
1717

18-
<div *ngIf="!!mainForm" id="site-config-wrapper">
18+
<div
19+
*ngIf="!!mainForm"
20+
id="site-config-wrapper"
21+
[is-dirty]="mainForm.dirty"
22+
[is-dirty-message]="dirtyMessage">
1923

20-
<general-settings [mainForm]="mainForm" [resourceId]="resourceId"></general-settings>
24+
<general-settings [mainForm]="mainForm" [resourceId]="resourceId"></general-settings>
2125

22-
<app-settings [mainForm]="mainForm" [resourceId]="resourceId"></app-settings>
26+
<app-settings [mainForm]="mainForm" [resourceId]="resourceId"></app-settings>
2327

24-
<connection-strings [mainForm]="mainForm" [resourceId]="resourceId"></connection-strings>
28+
<connection-strings [mainForm]="mainForm" [resourceId]="resourceId"></connection-strings>
2529

26-
<default-documents [mainForm]="mainForm" [resourceId]="resourceId"></default-documents>
30+
<default-documents [mainForm]="mainForm" [resourceId]="resourceId"></default-documents>
2731

28-
<handler-mappings [mainForm]="mainForm" [resourceId]="resourceId"></handler-mappings>
32+
<handler-mappings [mainForm]="mainForm" [resourceId]="resourceId"></handler-mappings>
2933

30-
<virtual-directories [mainForm]="mainForm" [resourceId]="resourceId"></virtual-directories>
34+
<virtual-directories [mainForm]="mainForm" [resourceId]="resourceId"></virtual-directories>
3135

3236
</div>

AzureFunctions.AngularClient/src/app/site/site-config/site-config.component.ts

+5
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ export class SiteConfigComponent implements OnDestroy {
4545
private _valueSubscription: RxSubscription;
4646
public resourceId: string;
4747
public resourceType: string;
48+
public dirtyMessage: string;
4849

4950
private _busyManager: BusyStateScopeManager;
5051

@@ -178,6 +179,8 @@ export class SiteConfigComponent implements OnDestroy {
178179
}
179180

180181
save() {
182+
this.dirtyMessage = this._translateService.instant(PortalResources.saveOperationInProgressWarning);
183+
181184
this.generalSettings.validate();
182185
this.appSettings.validate();
183186
this.connectionStrings.validate();
@@ -241,6 +244,7 @@ export class SiteConfigComponent implements OnDestroy {
241244
);
242245
})
243246
.do(null, error => {
247+
this.dirtyMessage = null;
244248
this._logService.error(LogCategories.siteConfig, '/site-config', error);
245249
this._busyManager.clearBusy();
246250
if (saveAttempted) {
@@ -253,6 +257,7 @@ export class SiteConfigComponent implements OnDestroy {
253257
this._translateService.instant(PortalResources.configUpdateFailure) + JSON.stringify(error));
254258
})
255259
.subscribe(r => {
260+
this.dirtyMessage = null;
256261
this._busyManager.clearBusy();
257262

258263
const saveResults: SaveOrValidationResult[] = [

AzureFunctions/ResourcesPortal/Resources.resx

+3
Original file line numberDiff line numberDiff line change
@@ -331,6 +331,9 @@
331331
<data name="save" xml:space="preserve">
332332
<value>Save</value>
333333
</data>
334+
<data name="saveOperationInProgressWarning" xml:space="preserve">
335+
<value>A save operation is currently in progress. Navigating away may cause some changes to be lost.</value>
336+
</data>
334337
<data name="addNewSetting" xml:space="preserve">
335338
<value>+ Add new setting</value>
336339
</data>

0 commit comments

Comments
 (0)