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,