From acb3790473d2005ffb6b0df20a296398e0b32f47 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Wed, 7 Aug 2019 13:58:35 +0300 Subject: [PATCH] feature(book-store): add add & update book --- .../src/app/books/books.component.html | 77 +++++++++++++++++++ .../angular/src/app/books/books.component.ts | 50 +++++++++++- .../angular/src/app/books/books.module.ts | 3 +- .../src/app/books/services/books.service.ts | 29 +++++++ .../src/app/store/actions/books.actions.ts | 7 ++ .../angular/src/app/store/models/books.ts | 7 ++ .../src/app/store/states/books.state.ts | 11 ++- .../src/environments/environment.hmr.ts | 2 +- .../src/environments/environment.prod.ts | 2 +- .../angular/src/environments/environment.ts | 2 +- 10 files changed, 182 insertions(+), 8 deletions(-) diff --git a/samples/BookStore-Angular-MongoDb/angular/src/app/books/books.component.html b/samples/BookStore-Angular-MongoDb/angular/src/app/books/books.component.html index 5be870bad6..e68bf6f22e 100644 --- a/samples/BookStore-Angular-MongoDb/angular/src/app/books/books.component.html +++ b/samples/BookStore-Angular-MongoDb/angular/src/app/books/books.component.html @@ -6,12 +6,18 @@ Books +
+ +
+ Actions Book name Book type Publish date @@ -20,6 +26,24 @@ + +
+ +
+ + +
+
+ {{ data.name }} {{ bookType[data.type] }} {{ data.publishDate | date }} @@ -29,3 +53,56 @@
+ + + +

{{ selectedBook?.id ? 'Edit' : 'New Book' }}

+
+ + +
+
+ * + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+
+
+ + + + Save + +
diff --git a/samples/BookStore-Angular-MongoDb/angular/src/app/books/books.component.ts b/samples/BookStore-Angular-MongoDb/angular/src/app/books/books.component.ts index 880e8dbd75..cab994e23c 100644 --- a/samples/BookStore-Angular-MongoDb/angular/src/app/books/books.component.ts +++ b/samples/BookStore-Angular-MongoDb/angular/src/app/books/books.component.ts @@ -3,12 +3,16 @@ import { Store, Select } from '@ngxs/store'; import { BooksState } from '../store/states'; import { Observable } from 'rxjs'; import { Books } from '../store/models'; -import { BooksGet } from '../store/actions'; +import { BooksGet, BooksSave } from '../store/actions'; +import { FormGroup, FormBuilder, Validators } from '@angular/forms'; +import { NgbDateAdapter, NgbDateNativeAdapter } from '@ng-bootstrap/ng-bootstrap'; +import { BooksService } from './services/books.service'; @Component({ selector: 'app-books', templateUrl: './books.component.html', styleUrls: ['./books.component.scss'], + providers: [{ provide: NgbDateAdapter, useClass: NgbDateNativeAdapter }], }) export class BooksComponent implements OnInit { @Select(BooksState.getBooks) @@ -16,12 +20,54 @@ export class BooksComponent implements OnInit { bookType = Books.Type; + bookTypes = Object.keys(Books.Type).filter(bookType => typeof this.bookType[bookType] === 'number'); + loading = false; - constructor(private store: Store) {} + isModalOpen = false; + + form: FormGroup; + + selectedBook = {} as Books.Item; + + constructor(private store: Store, private fb: FormBuilder, private booksService: BooksService) {} ngOnInit() { this.loading = true; this.store.dispatch(new BooksGet()).subscribe(() => (this.loading = false)); } + + buildForm() { + this.form = this.fb.group({ + name: [this.selectedBook.name || '', Validators.required], + type: this.selectedBook.type || null, + publishDate: this.selectedBook.publishDate ? new Date(this.selectedBook.publishDate) : null, + price: this.selectedBook.price || null, + }); + } + + onAdd() { + this.selectedBook = {} as Books.Item; + this.buildForm(); + this.isModalOpen = true; + } + + onEdit(id: string) { + this.booksService.getById(id).subscribe(book => { + this.selectedBook = book; + this.buildForm(); + this.isModalOpen = true; + }); + } + + save() { + if (this.form.invalid) { + return; + } + + this.store.dispatch(new BooksSave(this.form.value, this.selectedBook.id)).subscribe(() => { + this.isModalOpen = false; + this.form.reset(); + }); + } } diff --git a/samples/BookStore-Angular-MongoDb/angular/src/app/books/books.module.ts b/samples/BookStore-Angular-MongoDb/angular/src/app/books/books.module.ts index f7beabbab2..4dd8f39cfe 100644 --- a/samples/BookStore-Angular-MongoDb/angular/src/app/books/books.module.ts +++ b/samples/BookStore-Angular-MongoDb/angular/src/app/books/books.module.ts @@ -4,9 +4,10 @@ import { CommonModule } from '@angular/common'; import { BooksRoutingModule } from './books-routing.module'; import { BooksComponent } from './books.component'; import { SharedModule } from '../shared/shared.module'; +import { NgbDatepickerModule } from '@ng-bootstrap/ng-bootstrap'; @NgModule({ declarations: [BooksComponent], - imports: [CommonModule, BooksRoutingModule, SharedModule], + imports: [CommonModule, BooksRoutingModule, SharedModule, NgbDatepickerModule], }) export class BooksModule {} diff --git a/samples/BookStore-Angular-MongoDb/angular/src/app/books/services/books.service.ts b/samples/BookStore-Angular-MongoDb/angular/src/app/books/services/books.service.ts index f7c379a359..d65ac9d125 100644 --- a/samples/BookStore-Angular-MongoDb/angular/src/app/books/services/books.service.ts +++ b/samples/BookStore-Angular-MongoDb/angular/src/app/books/services/books.service.ts @@ -17,4 +17,33 @@ export class BooksService { return this.rest.request(request); } + + getById(id: string): Observable { + const request: Rest.Request = { + method: 'GET', + url: `/api/app/book/${id}`, + }; + + return this.rest.request(request); + } + + update(body: Books.SaveRequest, id: string): Observable { + const request: Rest.Request = { + method: 'PUT', + url: `/api/app/book/${id}`, + body, + }; + + return this.rest.request(request); + } + + add(body: Books.SaveRequest): Observable { + const request: Rest.Request = { + method: 'POST', + url: '/api/app/book', + body, + }; + + return this.rest.request(request); + } } diff --git a/samples/BookStore-Angular-MongoDb/angular/src/app/store/actions/books.actions.ts b/samples/BookStore-Angular-MongoDb/angular/src/app/store/actions/books.actions.ts index 82455b6141..e684890c6e 100644 --- a/samples/BookStore-Angular-MongoDb/angular/src/app/store/actions/books.actions.ts +++ b/samples/BookStore-Angular-MongoDb/angular/src/app/store/actions/books.actions.ts @@ -1,3 +1,10 @@ +import { Books } from '../models'; + export class BooksGet { static readonly type = '[Books] Get'; } + +export class BooksSave { + static readonly type = '[Books] Save'; + constructor(public payload: Books.SaveRequest, public id?: string) {} +} diff --git a/samples/BookStore-Angular-MongoDb/angular/src/app/store/models/books.ts b/samples/BookStore-Angular-MongoDb/angular/src/app/store/models/books.ts index 3c5e964e7b..8e74598b47 100644 --- a/samples/BookStore-Angular-MongoDb/angular/src/app/store/models/books.ts +++ b/samples/BookStore-Angular-MongoDb/angular/src/app/store/models/books.ts @@ -30,4 +30,11 @@ export namespace Books { ScienceFiction, Poetry, } + + export interface SaveRequest { + name: string; + type: Type; + publishDate: string; + price: number; + } } diff --git a/samples/BookStore-Angular-MongoDb/angular/src/app/store/states/books.state.ts b/samples/BookStore-Angular-MongoDb/angular/src/app/store/states/books.state.ts index 96443006a3..fe6a701ed1 100644 --- a/samples/BookStore-Angular-MongoDb/angular/src/app/store/states/books.state.ts +++ b/samples/BookStore-Angular-MongoDb/angular/src/app/store/states/books.state.ts @@ -1,8 +1,8 @@ import { State, Action, StateContext, Selector } from '@ngxs/store'; -import { BooksGet } from '../actions/books.actions'; +import { BooksGet, BooksSave } from '../actions/books.actions'; import { Books } from '../models/books'; import { BooksService } from '../../books/services/books.service'; -import { tap } from 'rxjs/operators'; +import { tap, switchMap } from 'rxjs/operators'; @State({ name: 'BooksState', @@ -26,4 +26,11 @@ export class BooksState { }), ); } + + @Action(BooksSave) + addBooks({ dispatch }: StateContext, { payload, id }: BooksSave) { + return (id ? this.booksService.update(payload, id) : this.booksService.add(payload)).pipe( + switchMap(() => dispatch(new BooksGet())), + ); + } } diff --git a/samples/BookStore-Angular-MongoDb/angular/src/environments/environment.hmr.ts b/samples/BookStore-Angular-MongoDb/angular/src/environments/environment.hmr.ts index 730ae1f969..65b05ebac2 100644 --- a/samples/BookStore-Angular-MongoDb/angular/src/environments/environment.hmr.ts +++ b/samples/BookStore-Angular-MongoDb/angular/src/environments/environment.hmr.ts @@ -3,7 +3,7 @@ export const environment = { hmr: true, oAuthConfig: { issuer: 'https://localhost:44359', - clientId: 'BookStore_App', + clientId: 'BookStore_ConsoleTestApp', dummyClientSecret: '1q2w3e*', scope: 'BookStore', showDebugInformation: true, diff --git a/samples/BookStore-Angular-MongoDb/angular/src/environments/environment.prod.ts b/samples/BookStore-Angular-MongoDb/angular/src/environments/environment.prod.ts index 501a1a049c..4848d1bd44 100644 --- a/samples/BookStore-Angular-MongoDb/angular/src/environments/environment.prod.ts +++ b/samples/BookStore-Angular-MongoDb/angular/src/environments/environment.prod.ts @@ -3,7 +3,7 @@ export const environment = { hmr: false, oAuthConfig: { issuer: 'https://localhost:44359', - clientId: 'BookStore_App', + clientId: 'BookStore_ConsoleTestApp', dummyClientSecret: '1q2w3e*', scope: 'BookStore', showDebugInformation: true, diff --git a/samples/BookStore-Angular-MongoDb/angular/src/environments/environment.ts b/samples/BookStore-Angular-MongoDb/angular/src/environments/environment.ts index 957ba8f2b7..e4bd2964f9 100644 --- a/samples/BookStore-Angular-MongoDb/angular/src/environments/environment.ts +++ b/samples/BookStore-Angular-MongoDb/angular/src/environments/environment.ts @@ -3,7 +3,7 @@ export const environment = { hmr: false, oAuthConfig: { issuer: 'https://localhost:44359', - clientId: 'BookStore_App', + clientId: 'BookStore_ConsoleTestApp', dummyClientSecret: '1q2w3e*', scope: 'BookStore', showDebugInformation: true,