Improvements to form UI

This commit is contained in:
SteveSandersonMS
2015-11-26 10:57:08 +00:00
parent 74bae91c3a
commit 6f840b60ca
2 changed files with 29 additions and 25 deletions

View File

@@ -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>

View File

@@ -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 {