From f73173bf4c5b7a79b5766083f98ec5bff23eecab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Tue, 1 Sep 2020 16:45:45 +0300 Subject: [PATCH] Update angular book UI for the proxy generation changes. --- docs/en/Tutorials/Part-2.md | 13 ++-- docs/en/Tutorials/Part-3.md | 56 +++++++----------- .../Tutorials/images/generated-proxies-3.png | Bin 0 -> 11889 bytes 3 files changed, 26 insertions(+), 43 deletions(-) create mode 100644 docs/en/Tutorials/images/generated-proxies-3.png diff --git a/docs/en/Tutorials/Part-2.md b/docs/en/Tutorials/Part-2.md index c947f4495d..bcec504886 100644 --- a/docs/en/Tutorials/Part-2.md +++ b/docs/en/Tutorials/Part-2.md @@ -347,9 +347,9 @@ This is a fully working, server side paged, sorted and localized table of books. ## Install NPM packages -> Notice: This tutorial is based on the ABP Framework v3.0.3+ If your project version is older, then please upgrade your solution. See the [migration guide](../UI/Angular/Migration-Guide-v3.md) if you are upgrading an existing project with v2.x. +> Notice: This tutorial is based on the ABP Framework v3.1.0+ If your project version is older, then please upgrade your solution. See the [migration guide](../UI/Angular/Migration-Guide-v3.md) if you are upgrading an existing project with v2.x. -If you haven't done it before, open a new command line interface (terminal window) and go to your `angular` folder and then run `yarn` command to install NPM packages: +If you haven't done it before, open a new command line interface (terminal window) and go to your `angular` folder and then run `yarn` command to install the NPM packages: ```bash yarn @@ -473,9 +473,9 @@ Run the following command in the `angular` folder: abp generate-proxy ``` -The generated files looks like below: +This command will create the following files under the `/src/app/proxy/books` folder: -![Generated files](./images/generated-proxies-2.png) +![Generated files](./images/generated-proxies-3.png) ### BookComponent @@ -484,8 +484,7 @@ Open the `/src/app/book/book.component.ts` file and replace the content as below ```js import { ListService, PagedResultDto } from '@abp/ng.core'; import { Component, OnInit } from '@angular/core'; -import { BookDto } from './models'; -import { BookService } from './services'; +import { BookService, BookDto } from '@proxy/books'; @Component({ selector: 'app-book', @@ -499,7 +498,7 @@ export class BookComponent implements OnInit { constructor(public readonly list: ListService, private bookService: BookService) {} ngOnInit() { - const bookStreamCreator = (query) => this.bookService.getListByInput(query); + const bookStreamCreator = (query) => this.bookService.getList(query); this.list.hookToQuery(bookStreamCreator).subscribe((response) => { this.book = response; diff --git a/docs/en/Tutorials/Part-3.md b/docs/en/Tutorials/Part-3.md index 13aa5df8c3..2eef56e79a 100644 --- a/docs/en/Tutorials/Part-3.md +++ b/docs/en/Tutorials/Part-3.md @@ -656,8 +656,7 @@ Open `/src/app/book/book.component.ts` and replace the content as below: ```js import { ListService, PagedResultDto } from '@abp/ng.core'; import { Component, OnInit } from '@angular/core'; -import { BookDto } from './models'; -import { BookService } from './services'; +import { BookService, BookDto } from '@proxy/books'; @Component({ selector: 'app-book', @@ -673,7 +672,7 @@ export class BookComponent implements OnInit { constructor(public readonly list: ListService, private bookService: BookService) {} ngOnInit() { - const bookStreamCreator = (query) => this.bookService.getListByInput(query); + const bookStreamCreator = (query) => this.bookService.getList(query); this.list.hookToQuery(bookStreamCreator).subscribe((response) => { this.book = response; @@ -749,8 +748,8 @@ Open `/src/app/book/book.component.ts` and replace the content as below: ```js import { ListService, PagedResultDto } from '@abp/ng.core'; import { Component, OnInit } from '@angular/core'; -import { BookDto, BookType } from './models'; // add BookType -import { BookService } from './services'; +// import bookTypeOptions from @proxy/books +import { BookService, BookDto, bookTypeOptions } from '@proxy/books'; import { FormGroup, FormBuilder, Validators } from '@angular/forms'; // add this @Component({ @@ -764,12 +763,8 @@ export class BookComponent implements OnInit { form: FormGroup; // add this line - bookType = BookType; // add this line - // add bookTypes as a list of BookType enum members - bookTypes = Object.keys(this.bookType).filter( - (key) => typeof this.bookType[key] === 'number' - ); + bookTypes = bookTypeOptions; isModalOpen = false; @@ -780,7 +775,7 @@ export class BookComponent implements OnInit { ) {} ngOnInit() { - const bookStreamCreator = (query) => this.bookService.getListByInput(query); + const bookStreamCreator = (query) => this.bookService.getList(query); this.list.hookToQuery(bookStreamCreator).subscribe((response) => { this.book = response; @@ -808,7 +803,7 @@ export class BookComponent implements OnInit { return; } - this.bookService.createByInput(this.form.value).subscribe(() => { + this.bookService.create(this.form.value).subscribe(() => { this.isModalOpen = false; this.form.reset(); this.list.get(); @@ -819,7 +814,6 @@ export class BookComponent implements OnInit { * Imported `FormGroup`, `FormBuilder` and `Validators` from `@angular/forms`. * Added `form: FormGroup` property. -* Added `bookType` property so that you can reach `BookType` enum members from template. * Added `bookTypes` property as a list of `BookType` enum members. That will be used in form options. * Injected `FormBuilder` into the constructor. [FormBuilder](https://angular.io/api/forms/FormBuilder) provides convenient methods for generating form controls. It reduces the amount of boilerplate needed to build complex forms. * Added `buildForm` method to the end of the file and executed the `buildForm()` in the `createBook` method. @@ -910,8 +904,7 @@ Open `/src/app/book/book.component.ts` and replace the content as below: ```js import { ListService, PagedResultDto } from '@abp/ng.core'; import { Component, OnInit } from '@angular/core'; -import { BookDto, BookType } from './models'; -import { BookService } from './services'; +import { BookService, BookDto, bookTypeOptions } from '@proxy/books'; import { FormGroup, FormBuilder, Validators } from '@angular/forms'; // added this line @@ -931,11 +924,7 @@ export class BookComponent implements OnInit { form: FormGroup; - bookType = BookType; - - bookTypes = Object.keys(this.bookType).filter( - (key) => typeof this.bookType[key] === 'number' - ); + bookTypes = bookTypeOptions; isModalOpen = false; @@ -946,7 +935,7 @@ export class BookComponent implements OnInit { ) {} ngOnInit() { - const bookStreamCreator = (query) => this.bookService.getListByInput(query); + const bookStreamCreator = (query) => this.bookService.getList(query); this.list.hookToQuery(bookStreamCreator).subscribe((response) => { this.book = response; @@ -972,7 +961,7 @@ export class BookComponent implements OnInit { return; } - this.bookService.createByInput(this.form.value).subscribe(() => { + this.bookService.create(this.form.value).subscribe(() => { this.isModalOpen = false; this.form.reset(); this.list.get(); @@ -995,8 +984,7 @@ Open `/src/app/book/book.component.ts` and replace the content as shown below: ```js import { ListService, PagedResultDto } from '@abp/ng.core'; import { Component, OnInit } from '@angular/core'; -import { BookDto, BookType, CreateUpdateBookDto } from './models'; -import { BookService } from './services'; +import { BookService, BookDto, bookTypeOptions } from '@proxy/books'; import { FormGroup, FormBuilder, Validators } from '@angular/forms'; import { NgbDateNativeAdapter, NgbDateAdapter } from '@ng-bootstrap/ng-bootstrap'; @@ -1009,15 +997,11 @@ import { NgbDateNativeAdapter, NgbDateAdapter } from '@ng-bootstrap/ng-bootstrap export class BookComponent implements OnInit { book = { items: [], totalCount: 0 } as PagedResultDto; - selectedBook = new BookDto(); // declare selectedBook + selectedBook = {} as BookDto; // declare selectedBook form: FormGroup; - bookType = BookType; - - bookTypes = Object.keys(this.bookType).filter( - (key) => typeof this.bookType[key] === 'number' - ); + bookTypes = bookTypeOptions; isModalOpen = false; @@ -1028,7 +1012,7 @@ export class BookComponent implements OnInit { ) {} ngOnInit() { - const bookStreamCreator = (query) => this.bookService.getListByInput(query); + const bookStreamCreator = (query) => this.bookService.getList(query); this.list.hookToQuery(bookStreamCreator).subscribe((response) => { this.book = response; @@ -1036,14 +1020,14 @@ export class BookComponent implements OnInit { } createBook() { - this.selectedBook = new BookDto(); // reset the selected book + this.selectedBook = {} as BookDto; // reset the selected book this.buildForm(); this.isModalOpen = true; } // Add editBook method editBook(id: string) { - this.bookService.getById(id).subscribe((book) => { + this.bookService.get(id).subscribe((book) => { this.selectedBook = book; this.buildForm(); this.isModalOpen = true; @@ -1069,8 +1053,8 @@ export class BookComponent implements OnInit { } const request = this.selectedBook.id - ? this.bookService.updateByIdAndInput(this.form.value, this.selectedBook.id) - : this.bookService.createByInput(this.form.value); + ? this.bookService.update(this.form.value, this.selectedBook.id) + : this.bookService.create(this.form.value); request.subscribe(() => { this.isModalOpen = false; @@ -1155,7 +1139,7 @@ constructor( delete(id: string) { this.confirmation.warn('::AreYouSureToDelete', '::AreYouSure').subscribe((status) => { if (status === Confirmation.Status.confirm) { - this.bookService.deleteById(id).subscribe(() => this.list.get()); + this.bookService.delete(id).subscribe(() => this.list.get()); } }); } diff --git a/docs/en/Tutorials/images/generated-proxies-3.png b/docs/en/Tutorials/images/generated-proxies-3.png new file mode 100644 index 0000000000000000000000000000000000000000..2a94f4e389bc46e006e43ad8e940d2a5d2c8d8f6 GIT binary patch literal 11889 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 P$$<~z@?zy81_A#AY)0!* literal 0 HcmV?d00001