Skip to content

Commit 5eb12e9

Browse files
authored
Merge pull request #1744 from Azure/dev
Sprint 9 merge
2 parents 0b94fe4 + a520d4c commit 5eb12e9

File tree

62 files changed

+872
-406
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

62 files changed

+872
-406
lines changed

AzureFunctions.AngularClient/src/app/api/api-details/api-details.component.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@
9797
</div>
9898

9999
<input [fnWriteAccess]="functionApp" type="text" name="backendUri" style="width: 720px" [formControl]="complexForm.controls['backendUri']"
100-
placeholder="{{ 'apiProxy_backendUrl' | translate }}" [ngClass]="{'input-error':!complexForm.controls['backendUri'].valid && complexForm.controls['backendUri'].touched}">
100+
placeholder="{{ 'optional' | translate }}" [ngClass]="{'input-error':!complexForm.controls['backendUri'].valid && complexForm.controls['backendUri'].touched}">
101101

102102
<pop-over *ngIf="!complexForm.controls['backendUri'].valid" [message]="complexForm.controls['backendUri'].errors['required'] ? ('filedRequired' | translate) : ('apiProxy_backanrUrlStart' | translate)"
103103
[isInputError]="true">

AzureFunctions.AngularClient/src/app/api/api-new/api-new.component.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@
9090
</div>
9191

9292
<input [fnWriteAccess]="functionApp" type="text" name="backendUri" class="long" [formControl]="complexForm.controls['backendUri']"
93-
placeholder="{{ 'apiProxy_backendUrl' | translate }}" [ngClass]="{'input-error':!complexForm.controls['backendUri'].valid && complexForm.controls['backendUri'].touched}">
93+
placeholder="{{ 'optional' | translate }}" [ngClass]="{'input-error':!complexForm.controls['backendUri'].valid && complexForm.controls['backendUri'].touched}">
9494

9595
<pop-over *ngIf="!complexForm.controls['backendUri'].valid" [message]="complexForm.controls['backendUri'].errors['required'] ? ('filedRequired' | translate) : ('apiProxy_backanrUrlStart' | translate)"
9696
[isInputError]="true">
Lines changed: 65 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,74 +1,87 @@
11
<div class="rr-container">
22
<hr>
3-
<div class="text-level1-heading">{{ 'rrOverride_request' | translate }}</div>
43

5-
<div>
6-
<div class="control-label">{{ 'httpRun_httpMethod' | translate }}</div>
4+
<span class="link" (click)="showRequestOverride()">
5+
<i class="fa" [class.fa-plus]="!showRequest" [class.fa-minus]="showRequest"></i>
6+
&nbsp;{{ 'rrOverride_request' | translate }}
7+
</span>
78

8-
<select *ngIf="model" [(ngModel)]="model.method" (ngModelChange)="changeValue()">
9-
<option value="no">{{ 'apiProxy_noOverride' | translate }}</option>
10-
<option *ngFor="let method of availableMethods" [value]="method">{{method.toUpperCase()}}</option>
11-
</select>
12-
</div>
9+
<div [class.non-visible]="!showRequest" [class.shown-container]="showRequest">
10+
<div>
11+
<div class="control-label">{{ 'httpRun_httpMethod' | translate }}</div>
1312

14-
<div>
15-
<pair-list *ngIf="paramsOptions"
16-
[options]="paramsOptions"
17-
addButtonLabel="{{ 'httpRun_addParameter' | translate}}"
18-
emptyLabel="{{ 'httpRun_noQuery' | translate }}"
19-
title="{{ 'httpRun_query' | translate }}"
20-
(valueChanges)="paramsValueChanges($event)">
13+
<select *ngIf="model" [(ngModel)]="model.method" (ngModelChange)="changeValue()">
14+
<option value="no">{{ 'apiProxy_noOverride' | translate }}</option>
15+
<option *ngFor="let method of availableMethods" [value]="method">{{method.toUpperCase()}}</option>
16+
</select>
17+
</div>
2118

22-
</pair-list>
23-
</div>
24-
25-
<div>
26-
<pair-list *ngIf="headerOptions"
27-
[options]="headerOptions"
28-
addButtonLabel="{{ 'httpRun_addHeader' | translate}}"
29-
emptyLabel="{{ 'httpRun_noHeaders' | translate }}"
30-
title="{{ 'httpRun_headers' | translate }}"
31-
(valueChanges)="headerValueChanges($event)">
19+
<div>
20+
<pair-list *ngIf="paramsOptions"
21+
[options]="paramsOptions"
22+
addButtonLabel="{{ 'httpRun_addParameter' | translate}}"
23+
emptyLabel="{{ 'httpRun_noQuery' | translate }}"
24+
title="{{ 'httpRun_query' | translate }}"
25+
(valueChanges)="paramsValueChanges($event)">
3226

33-
</pair-list>
27+
</pair-list>
28+
</div>
29+
30+
<div>
31+
<pair-list *ngIf="headerOptions"
32+
[options]="headerOptions"
33+
addButtonLabel="{{ 'httpRun_addHeader' | translate}}"
34+
emptyLabel="{{ 'httpRun_noHeaders' | translate }}"
35+
title="{{ 'httpRun_headers' | translate }}"
36+
(valueChanges)="headerValueChanges($event)">
37+
38+
</pair-list>
39+
</div>
3440
</div>
3541
<hr>
36-
<div class="text-level1-heading">{{ 'rrOverride_response' | translate }}</div>
3742

38-
<div class="response-status">
39-
<div>
43+
<span class="link" (click)="showResponseOverride()">
44+
<i class="fa" [class.fa-plus]="!showResponse" [class.fa-minus]="showResponse"></i>
45+
&nbsp;{{ 'rrOverride_response' | translate }}
46+
</span>
47+
48+
<div [class.non-visible]="!showResponse" [class.shown-container]="showResponse">
49+
<div class="response-status">
4050
<div>
41-
<label class="control-label">{{ 'rrOverride_code' | translate }}</label>
51+
<div>
52+
<label class="control-label">{{ 'rrOverride_code' | translate }}</label>
53+
</div>
54+
<input type="text" [(ngModel)]="model.statusCode" (ngModelChange)="changeValue()">
4255
</div>
43-
<input type="text" [(ngModel)]="model.statusCode" (ngModelChange)="changeValue()">
44-
</div>
45-
<div>
4656
<div>
47-
<label class="control-label">{{ 'rrOverride_message' | translate }}</label>
57+
<div>
58+
<label class="control-label">{{ 'rrOverride_message' | translate }}</label>
59+
</div>
60+
<input type="text" [(ngModel)]="model.statusReason" (ngModelChange)="changeValue()">
4861
</div>
49-
<input type="text" [(ngModel)]="model.statusReason" (ngModelChange)="changeValue()">
5062
</div>
51-
</div>
52-
53-
<div>
54-
<pair-list *ngIf="responseHeaderOptions"
55-
[options]="responseHeaderOptions"
56-
addButtonLabel="{{ 'httpRun_addHeader' | translate}}"
57-
emptyLabel="{{ 'httpRun_noHeaders' | translate }}"
58-
title="{{ 'httpRun_headers' | translate }}"
59-
(valueChanges)="responseHeaderValueChanges($event)">
63+
64+
<div>
65+
<pair-list *ngIf="responseHeaderOptions"
66+
[options]="responseHeaderOptions"
67+
addButtonLabel="{{ 'httpRun_addHeader' | translate}}"
68+
emptyLabel="{{ 'httpRun_noHeaders' | translate }}"
69+
title="{{ 'httpRun_headers' | translate }}"
70+
(valueChanges)="responseHeaderValueChanges($event)">
6071

61-
</pair-list>
62-
</div>
72+
</pair-list>
73+
</div>
6374

64-
<div>
65-
<label class="control-label">{{ 'rrOverride_boby' | translate }}</label>
66-
<div monacoEditor class="monaco response-body"
67-
(onContentChanged)="contentChanged($event)"
68-
[content]="model.body"
69-
[functionAppInput]="functionApp">
75+
<div>
76+
<label class="control-label">{{ 'rrOverride_boby' | translate }}</label>
77+
<div monacoEditor class="monaco response-body"
78+
(onContentChanged)="contentChanged($event)"
79+
[content]="model.body"
80+
[functionAppInput]="functionApp">
81+
</div>
7082
</div>
7183
</div>
84+
<hr>
7285
</div>
7386

7487

AzureFunctions.AngularClient/src/app/api/request-respose-override/request-respose-override.component.scss

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,13 @@
1414
div:nth-child(2) {
1515
padding-left:65px;
1616
}
17+
}
18+
19+
.non-visible {
20+
visibility: hidden;
21+
height: 0px;
22+
}
23+
24+
.shown-container {
25+
padding-top: 15px;
1726
}

AzureFunctions.AngularClient/src/app/api/request-respose-override/request-respose-override.component.ts

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ export class RequestResposeOverrideComponent {
3737
model: RequestResponseOverrriedModel;
3838
@Input() functionApp: FunctionApp;
3939
@Output() valueChanges = new Subject<any>();
40+
showResponse = false;
41+
showRequest = false
4042
private _requestHeadersValid: boolean;
4143
private _requestParamsValid: boolean;
4244
private _responseHeadersValid: boolean;
@@ -71,7 +73,11 @@ export class RequestResposeOverrideComponent {
7173
this.model.statusReason = value.responseOverrides[prop];
7274
}
7375
if (prop.toLocaleLowerCase() === "response.body") {
74-
this.model.body = value.responseOverrides[prop];
76+
if (typeof value.responseOverrides[prop] === 'string') {
77+
this.model.body = value.responseOverrides[prop];
78+
} else {
79+
this.model.body = JSON.stringify(value.responseOverrides[prop]);
80+
}
7581
}
7682
}
7783
}
@@ -134,6 +140,14 @@ export class RequestResposeOverrideComponent {
134140
this.changeValue();
135141
}
136142

143+
showResponseOverride() {
144+
this.showResponse = !this.showResponse;
145+
}
146+
147+
showRequestOverride() {
148+
this.showRequest = !this.showRequest;
149+
}
150+
137151
get valid(): boolean {
138152
return this._requestHeadersValid && this._requestParamsValid && this._responseHeadersValid;
139153
}

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@ import { GeneralSettingsComponent } from './site/site-config/general-settings/ge
123123
import { AppSettingsComponent } from './site/site-config/app-settings/app-settings.component';
124124
import { ConnectionStringsComponent } from './site/site-config/connection-strings/connection-strings.component';
125125
import { BindingEventGridComponent } from './binding-event-grid/binding-event-grid.component';
126+
import { TopWarningComponent } from './top-warning/top-warning.component';
126127

127128
export function ArmServiceFactory(
128129
http: Http,
@@ -244,7 +245,8 @@ export class AppModule {
244245
ConnectionStringsComponent,
245246
PairListComponent,
246247
RequestResposeOverrideComponent,
247-
BindingEventGridComponent
248+
BindingEventGridComponent,
249+
TopWarningComponent
248250
],
249251
imports: [
250252
FormsModule,

AzureFunctions.AngularClient/src/app/apps-list/apps-list.component.html

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,12 +56,13 @@
5656
</ng-container>
5757
</tr>
5858

59-
<tr *ngIf="isLoading">
60-
<td *ngIf="isLoading" colspan="4">{{'functionMonitor_loading' | translate}}</td>
61-
<td *ngIf="isLoading" colspan="4"></td>
59+
<tr *ngIf="appsNode?.isLoading">
60+
<td colspan="4">{{'functionMonitor_loading' | translate}}</td>
61+
<td colspan="4"></td>
6262
</tr>
6363
</tbl>
64-
<div *ngIf="!isLoading && table.items.length === 0" class="empty-browse">
64+
65+
<div *ngIf="!appsNode?.isLoading && initialized && table.items.length === 0" class="empty-browse">
6566
<img src="images/emptybrowse-functions.svg" />
6667
<h4>{{'emptyBrowse_title' | translate}}</h4>
6768
<span>{{'emptyBrowse' | translate}}</span>

AzureFunctions.AngularClient/src/app/apps-list/apps-list.component.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ export class AppsListComponent implements OnInit, OnDestroy {
3232
public appsNode: AppsNode;
3333
public Resources = PortalResources;
3434

35-
public isLoading = true;
35+
public initialized = false;
3636

3737
public allLocations = this.translateService.instant(PortalResources.allLocations);
3838
public numberLocations = this.translateService.instant(PortalResources.locationCount);
@@ -64,11 +64,12 @@ export class AppsListComponent implements OnInit, OnDestroy {
6464
.distinctUntilChanged()
6565
.switchMap(viewInfo => {
6666
this.appsNode = (<AppsNode>viewInfo.node);
67-
this.isLoading = true;
67+
this.initialized = false;
6868
return (<AppsNode>viewInfo.node).childrenStream;
6969
})
7070
.subscribe(children => {
7171
this.apps = children;
72+
this.initialized = true;
7273
this.tableItems = this.apps.map(app => (<AppTableItem>{
7374
title: app.title,
7475
subscription: app.subscription,
@@ -88,7 +89,6 @@ export class AppsListComponent implements OnInit, OnDestroy {
8889
displayLabel: resourceGroup,
8990
value: resourceGroup
9091
}));
91-
this.isLoading = false;
9292
});
9393
}
9494

AzureFunctions.AngularClient/src/app/busy-state/busy-state.component.ts

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ export class BusyStateComponent implements OnInit {
1818

1919
private busyStateMap: { [key: string]: boolean } = {};
2020
private reservedKey = '-';
21+
private timeouts: { [key: string]: number } = {};
2122

2223
ngOnInit() {
2324
this.isGlobal = this.name === 'global';
@@ -29,8 +30,10 @@ export class BusyStateComponent implements OnInit {
2930

3031
setScopedBusyState(key: string): string {
3132
key = key || Guid.newGuid();
32-
this.busyStateMap[key] = true;
33-
this.busy = true;
33+
this.timeouts[key] = window.setTimeout(() => {
34+
this.busyStateMap[key] = true;
35+
this.busy = true;
36+
}, 100); // 100 msec debounce
3437
return key;
3538
}
3639

@@ -39,11 +42,20 @@ export class BusyStateComponent implements OnInit {
3942
if (this.busyStateMap[key]) {
4043
delete this.busyStateMap[key];
4144
}
45+
if (this.timeouts[key]) {
46+
clearTimeout(this.timeouts[key]);
47+
delete this.timeouts[key]
48+
}
4249
this.busy = !this.isEmptyMap(this.busyStateMap);
4350
}
4451

4552
clearOverallBusyState() {
4653
this.busyStateMap = {};
54+
const keys = Object.keys(this.timeouts);
55+
for (let i = 0; i < keys.length; i++) {
56+
clearTimeout(this.timeouts[keys[i]]);
57+
delete this.timeouts[keys[i]];
58+
}
4759
this.clear.next(1);
4860
this.busy = false;
4961
}

AzureFunctions.AngularClient/src/app/controls/pair-list/pair-list.component.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
<input type="text" name="item{{i}}" placeholder="name" class="name" formControlName="name">
1515

16-
<pop-over *ngIf="!form.controls.items.controls[i].controls.name.valid" [isInputError]="true" class="error-fix">
16+
<pop-over *ngIf="!form.controls.items.controls[i].controls.name.valid" [message]="('notValidValue' | translate)" [isInputError]="true" class="error-fix">
1717
</pop-over>
1818

1919
<input type="text" placeholder="value" class="value" formControlName="value">

0 commit comments

Comments
 (0)