mirror of
https://github.com/aspnet/JavaScriptServices.git
synced 2025-12-23 01:58:29 +00:00
Improvements to form UI
This commit is contained in:
@@ -36,6 +36,7 @@
|
|||||||
</form-field>
|
</form-field>
|
||||||
|
|
||||||
<form-field>
|
<form-field>
|
||||||
|
<div *ng-if="changesSaved" class="alert alert-success"><b>Done!</b> Your changes were saved.</div>
|
||||||
<button type="submit" class="btn btn-primary">Submit</button>
|
<button type="submit" class="btn btn-primary">Submit</button>
|
||||||
<button type="button" class="btn btn-danger" (click)="deleteprompt.show(originalAlbum)">Delete</button>
|
<button type="button" class="btn btn-danger" (click)="deleteprompt.show(originalAlbum)">Delete</button>
|
||||||
<a class="btn btn-default" [router-link]="['/Admin/Albums']">Back to List</a>
|
<a class="btn btn-default" [router-link]="['/Admin/Albums']">Back to List</a>
|
||||||
|
|||||||
@@ -1,12 +1,10 @@
|
|||||||
import * as ng from 'angular2/angular2';
|
import * as ng from 'angular2/angular2';
|
||||||
import * as router from 'angular2/router';
|
import * as router from 'angular2/router';
|
||||||
import * as models from '../../../models/models';
|
import * as models from '../../../models/models';
|
||||||
import { Http, HTTP_BINDINGS, Headers } from 'angular2/http';
|
import { Http, HTTP_BINDINGS, Headers, Response } from 'angular2/http';
|
||||||
import { AlbumDeletePrompt } from '../album-delete-prompt/album-delete-prompt';
|
import { AlbumDeletePrompt } from '../album-delete-prompt/album-delete-prompt';
|
||||||
import { FormField } from '../form-field/form-field';
|
import { FormField } from '../form-field/form-field';
|
||||||
|
|
||||||
const ContentTypeJson = 'application/json';
|
|
||||||
|
|
||||||
@ng.Component({
|
@ng.Component({
|
||||||
selector: 'album-edit'
|
selector: 'album-edit'
|
||||||
})
|
})
|
||||||
@@ -19,6 +17,7 @@ export class AlbumEdit {
|
|||||||
public artists: models.Artist[];
|
public artists: models.Artist[];
|
||||||
public genres: models.Genre[];
|
public genres: models.Genre[];
|
||||||
public originalAlbum: models.Album;
|
public originalAlbum: models.Album;
|
||||||
|
public changesSaved: boolean;
|
||||||
|
|
||||||
private _http: Http;
|
private _http: Http;
|
||||||
|
|
||||||
@@ -52,6 +51,10 @@ export class AlbumEdit {
|
|||||||
Price: fb.control('', ng.Validators.compose([ng.Validators.required, AlbumEdit._validatePrice])),
|
Price: fb.control('', ng.Validators.compose([ng.Validators.required, AlbumEdit._validatePrice])),
|
||||||
AlbumArtUrl: fb.control('', ng.Validators.required)
|
AlbumArtUrl: fb.control('', ng.Validators.required)
|
||||||
});
|
});
|
||||||
|
|
||||||
|
this.form.valueChanges.observer({
|
||||||
|
next: _ => { this.changesSaved = false; }
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public onSubmitModelBased() {
|
public onSubmitModelBased() {
|
||||||
@@ -63,18 +66,14 @@ export class AlbumEdit {
|
|||||||
if (this.form.valid) {
|
if (this.form.valid) {
|
||||||
var controls = this.form.controls;
|
var controls = this.form.controls;
|
||||||
var albumId = this.originalAlbum.AlbumId;
|
var albumId = this.originalAlbum.AlbumId;
|
||||||
(<any>window).fetch(`/api/albums/${ albumId }/update`, {
|
|
||||||
method: 'put',
|
this._putJson(`/api/albums/${ albumId }/update`, this.form.value).then(response => {
|
||||||
headers: { 'Content-Type': ContentTypeJson },
|
if (response.status === 200) {
|
||||||
body: JSON.stringify(this.form.value)
|
this.changesSaved = true;
|
||||||
}).then(response => {
|
|
||||||
if (response.status >= 200 && response.status < 300) {
|
|
||||||
// TODO: Display success message
|
|
||||||
} else {
|
} else {
|
||||||
if (response.headers.get('Content-Type').indexOf(ContentTypeJson) === 0) {
|
var errors = (<ValidationResponse>(response.json())).ModelErrors;
|
||||||
return response.json().then((responseJson: ValidationResponse) => {
|
Object.keys(errors).forEach(key => {
|
||||||
Object.keys(responseJson.ModelErrors).forEach(key => {
|
errors[key].forEach(errorMessage => {
|
||||||
responseJson.ModelErrors[key].forEach(errorMessage => {
|
|
||||||
// TODO: There has to be a better API for this
|
// TODO: There has to be a better API for this
|
||||||
if (!this.form.controls[key].errors) {
|
if (!this.form.controls[key].errors) {
|
||||||
(<any>this.form.controls[key])._errors = {};
|
(<any>this.form.controls[key])._errors = {};
|
||||||
@@ -83,10 +82,6 @@ export class AlbumEdit {
|
|||||||
this.form.controls[key].errors[errorMessage] = true;
|
this.form.controls[key].errors[errorMessage] = true;
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
|
||||||
} else {
|
|
||||||
// TODO: Display generic 'unknown error'
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -95,6 +90,14 @@ export class AlbumEdit {
|
|||||||
private static _validatePrice(control: ng.Control): { [key: string]: boolean } {
|
private static _validatePrice(control: ng.Control): { [key: string]: boolean } {
|
||||||
return /^\d+\.\d+$/.test(control.value) ? null : { Price: true };
|
return /^\d+\.\d+$/.test(control.value) ? null : { Price: true };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private _putJson(url: string, body: any): Promise<Response> {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
this._http.put(url, JSON.stringify(body), {
|
||||||
|
headers: new Headers({ 'Content-Type': 'application/json' })
|
||||||
|
}).subscribe(resolve);
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
interface ValidationResponse {
|
interface ValidationResponse {
|
||||||
|
|||||||
Reference in New Issue
Block a user