From 4d3860f9ebf5d0a5ff3cd11c38b5d57b782de97e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Fri, 3 Jul 2020 18:00:45 +0300 Subject: [PATCH 01/58] Added book and book type --- docs/en/Tutorials/Part-1.md | 131 ++++-------------- .../images/bookstore-book-and-booktype.png | Bin 0 -> 43075 bytes 2 files changed, 29 insertions(+), 102 deletions(-) create mode 100644 docs/en/Tutorials/images/bookstore-book-and-booktype.png diff --git a/docs/en/Tutorials/Part-1.md b/docs/en/Tutorials/Part-1.md index f7b062aa6e..0a3a14f947 100644 --- a/docs/en/Tutorials/Part-1.md +++ b/docs/en/Tutorials/Part-1.md @@ -1,4 +1,4 @@ -## ASP.NET Core {{UI_Value}} Tutorial - Part 1 +# ASP.NET Core {{UI_Value}} Tutorial - Part 1 ````json //[doc-params] { @@ -20,108 +20,43 @@ else end }} -### About this tutorial: +## About This Tutorial -In this tutorial series, you will build an ABP application named `Acme.BookStore`. In this sample project, we will manage a list of books and authors. **{{DB_Text}}** will be used as the ORM provider. And on the front-end side {{UI_Value}} and JavaScript will be used. +In this tutorial series, you will build an ABP based web application named `Acme.BookStore`. This application is used to manage a list of books and their authors. It is developed using the following technologies: -The ASP.NET Core {{UI_Value}} tutorial series consists of 3 parts: +* **{{DB_Text}}** as the ORM provider. +* **{{UI_Value}}** as the UI Framework. -- **Part-1: Creating the project and book list page (this tutorial)** +This tutorial is organized as the following parts; + +- **Part-1: Creating the project and book list page (this part)** - [Part-2: Creating, updating and deleting books](part-2.md) - [Part-3: Integration tests](part-3.md) -*You can also check out [the video course](https://amazingsolutions.teachable.com/p/lets-build-the-bookstore-application) prepared by the community, based on this tutorial.* - -### Creating the project - -Create a new project named `Acme.BookStore` where `Acme` is the company name and `BookStore` is the project name. You can check out [creating a new project](../Getting-Started-{{if UI == 'NG'}}Angular{{else}}AspNetCore-MVC{{end}}-Template#creating-a-new-project) document to see how you can create a new project. We will create the project with ABP CLI. - -#### Create the project - -By running the below command, it creates a new ABP project with the database provider `{{DB_Text}}` and UI option `{{UI_Value}}`. To see the other CLI options, check out [ABP CLI](https://docs.abp.io/en/abp/latest/CLI) document. - -```bash -abp new Acme.BookStore --template app --database-provider {{DB}} --ui {{UI_Text}} --mobile none -``` -![Creating project](./images/bookstore-create-project-{{UI_Text}}.png) - -### Apply migrations - -After creating the project, you need to apply the initial migrations and create the database. To apply migrations, right click on the `Acme.BookStore.DbMigrator` and click **Debug** > **Start New Instance**. This will run the application and apply all migrations. You will see the below result when it successfully completes the process. The application database is ready! - -![Migrations applied](./images/bookstore-migrations-applied-{{UI_Text}}.png) - -> Alternatively, you can run `Update-Database` command in the Visual Studio > Package Manager Console to apply migrations. - -#### Initial database tables +### Source Code -![Initial database tables](./images/bookstore-database-tables-{{DB}}.png) +You can find the completed solution on {{if UI == "MVC"}}[the GitHub repository](https://github.com/abpframework/abp-samples/tree/master/BookStore-Mvc-EfCore){{else}}[the GitHub repository](https://github.com/abpframework/abp-samples/tree/master/BookStore-Angular-MongoDb){{end}}. -### Run the application +## Creating the Solution -To run the project, right click to the {{if UI == "MVC"}} `Acme.BookStore.Web`{{end}} {{if UI == "NG"}} `Acme.BookStore.HttpApi.Host` {{end}} project and click **Set As StartUp Project**. And run the web project by pressing **CTRL+F5** (*without debugging and fast*) or press **F5** (*with debugging and slow*). {{if UI == "NG"}}You will see the Swagger UI for BookStore API.{{end}} +Before starting to the development, create a new solution named `Acme.BookStore` and run it by following the [getting started tutorial](../Getting-Started-{{if UI == 'NG'}}Angular{{else}}AspNetCore-MVC{{end}}-Template#creating-a-new-project). -Further information, see the [running the application section](../Getting-Started?UI={{UI}}#run-the-application). - -![Set as startup project](./images/bookstore-start-project-{{UI_Text}}.png) - -{{if UI == "NG"}} - -To start Angular project, go to the `angular` folder, open a command line terminal, execute the `yarn` command: - -```bash -yarn -``` - -Once all node modules are loaded, execute the `yarn start` command: - -```bash -yarn start -``` +## Create the Book Entity -The website will be accessible from the following default URL: +**Domain layer** in the startup template is separated into two projects: -http://localhost:4200/ - -If you see the website's landing page successfully, you can exit Angular hosting by pressing `ctrl-c`. (We'll later start it again.) - -> Be aware that, Firefox does not use the Windows Certificate Store, so you'll need to add the self-signed developer certificate to Firefox manually. To do this, open Firefox and navigate to the below URL: -> -> https://localhost:44322/api/abp/application-configuration -> -> If you see the below screen, click the **Accept the Risk and Continue** button to bypass this warning. -> -> ![Set as startup project](./images/mozilla-self-signed-cert-error.png) - -{{end}} - -The default login credentials are; - -* **Username**: admin -* **Password**: 1q2w3E* - -### Solution structure - -This is how the layered solution structure looks like: - -![bookstore-visual-studio-solution](./images/bookstore-solution-structure-{{UI_Text}}.png) - -Check out the [solution structure](../startup-templates/application#solution-structure) section to understand the structure in details. - -### Create the book entity - -Domain layer in the startup template is separated into two projects: - -- `Acme.BookStore.Domain` contains your [entities](https://docs.abp.io/en/abp/latest/Entities), [domain services](https://docs.abp.io/en/abp/latest/Domain-Services) and other core domain objects. +- `Acme.BookStore.Domain` contains your [entities](../Entities.md), [domain services](../Domain-Services.md) and other core domain objects. - `Acme.BookStore.Domain.Shared` contains `constants`, `enums` or other domain related objects those can be shared with clients. -Define [entities](https://docs.abp.io/en/abp/latest/Entities) in the **domain layer** (`Acme.BookStore.Domain` project) of the solution. The main entity of the application is the `Book`. Create a class, named `Book`, in the `Acme.BookStore.Domain` project as shown below: +So, define your entities in the domain layer (`Acme.BookStore.Domain` project) of the solution. + +The main entity of the application is the `Book`. Create a `Books` folder (namespace) in the `Acme.BookStore.Domain` project and add a `Book` class inside it: ````csharp using System; using Volo.Abp.Domain.Entities.Auditing; -namespace Acme.BookStore +namespace Acme.BookStore.Books { public class Book : AuditedAggregateRoot { @@ -132,31 +67,19 @@ namespace Acme.BookStore public DateTime PublishDate { get; set; } public float Price { get; set; } - - protected Book() - { - - } - - public Book(Guid id, string name, BookType type, DateTime publishDate, float price) : - base(id) - { - Name = name; - Type = type; - PublishDate = publishDate; - Price = price; - } } } ```` -* ABP has 2 fundamental base classes for entities: `AggregateRoot` and `Entity`. **Aggregate Root** is one of the **Domain Driven Design (DDD)** concepts. See [entity document](https://docs.abp.io/en/abp/latest/Entities) for details and best practices. -* `Book` entity inherits `AuditedAggregateRoot` which adds some auditing properties (`CreationTime`, `CreatorId`, `LastModificationTime`... etc.) on top of the `AggregateRoot` class. +* ABP Framework has two fundamental base classes for entities: `AggregateRoot` and `Entity`. **Aggregate Root** is a [Domain Driven Design](../Domain-Driven-Design.md) concept which can be thought as a root entity that is directly queried and worked on (see the [entities document](../Entities.md) for more). +* `Book` entity inherits from the `AuditedAggregateRoot` which adds some base [auditing](../Audit-Logging.md) properties (like `CreationTime`, `CreatorId`, `LastModificationTime`...) on top of the `AggregateRoot` class. ABP automatically manages these properties for you. * `Guid` is the **primary key type** of the `Book` entity. -#### BookType enum +> This tutorials leaves the entity properties with **public get/set** for the sake of simplicity. See the [entities document](../Entities.md) if you learn more about DDD best practices. -Create the `BookType` enum in the `Acme.BookStore.Domain.Shared` project: +#### BookType Enum + +The `Book` entity uses the `BookType` enum. Create the `BookType` in the `Acme.BookStore.Domain.Shared` project: ````csharp namespace Acme.BookStore @@ -176,6 +99,10 @@ namespace Acme.BookStore } ```` +The final folder/file structure should be as shown below: + +![bookstore-book-and-booktype](images/bookstore-book-and-booktype.png) + #### Add book entity to the DbContext {{if DB == "ef"}} diff --git a/docs/en/Tutorials/images/bookstore-book-and-booktype.png b/docs/en/Tutorials/images/bookstore-book-and-booktype.png new file mode 100644 index 0000000000000000000000000000000000000000..1620ebf150e0531baab78a1f0d0785417f813839 GIT binary patch literal 43075 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 literal 0 HcmV?d00001 From 1da80929c9fbeea4e1365440a71dd9a2f07923ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Fri, 3 Jul 2020 20:29:58 +0300 Subject: [PATCH 02/58] Complete the database migration part --- docs/en/Tutorials/Part-1.md | 161 +++++++++--------- .../bookstore-dbmigrator-on-solution.png | Bin 0 -> 41421 bytes 2 files changed, 85 insertions(+), 76 deletions(-) create mode 100644 docs/en/Tutorials/images/bookstore-dbmigrator-on-solution.png diff --git a/docs/en/Tutorials/Part-1.md b/docs/en/Tutorials/Part-1.md index 0a3a14f947..0c2944346e 100644 --- a/docs/en/Tutorials/Part-1.md +++ b/docs/en/Tutorials/Part-1.md @@ -77,7 +77,7 @@ namespace Acme.BookStore.Books > This tutorials leaves the entity properties with **public get/set** for the sake of simplicity. See the [entities document](../Entities.md) if you learn more about DDD best practices. -#### BookType Enum +### BookType Enum The `Book` entity uses the `BookType` enum. Create the `BookType` in the `Acme.BookStore.Domain.Shared` project: @@ -103,19 +103,18 @@ The final folder/file structure should be as shown below: ![bookstore-book-and-booktype](images/bookstore-book-and-booktype.png) -#### Add book entity to the DbContext +### Add Book Entity to the DbContext {{if DB == "ef"}} EF Core requires to relate entities with your `DbContext`. The easiest way to do this is to add a `DbSet` property to the `BookStoreDbContext` class in the `Acme.BookStore.EntityFrameworkCore` project, as shown below: ````csharp - public class BookStoreDbContext : AbpDbContext - { - public DbSet Users { get; set; } - public DbSet Books { get; set; } //<--added this line--> - //... - } +public class BookStoreDbContext : AbpDbContext +{ + public DbSet Books { get; set; } + //... +} ```` {{end}} @@ -127,9 +126,8 @@ Add a `IMongoCollection Books` property to the `BookStoreMongoDbContext` i ```csharp public class BookStoreMongoDbContext : AbpMongoDbContext { - public IMongoCollection Users => Collection(); - public IMongoCollection Books => Collection();//<--added this line--> - //... + public IMongoCollection Books => Collection(); + //... } ``` @@ -137,36 +135,76 @@ public class BookStoreMongoDbContext : AbpMongoDbContext {{if DB == "ef"}} -#### Configure the book entity +### Map the Book Entity to a Database Table -Open `BookStoreDbContextModelCreatingExtensions.cs` file in the `Acme.BookStore.EntityFrameworkCore` project and add following code to the end of the `ConfigureBookStore` method to configure the Book entity: +Open `BookStoreDbContextModelCreatingExtensions.cs` file in the `Acme.BookStore.EntityFrameworkCore` project and add the mapping code for the `Book` entity. The final class should be the following: ````csharp -builder.Entity(b => +using Acme.BookStore.Books; +using Microsoft.EntityFrameworkCore; +using Volo.Abp; +using Volo.Abp.EntityFrameworkCore.Modeling; + +namespace Acme.BookStore.EntityFrameworkCore { - b.ToTable(BookStoreConsts.DbTablePrefix + "Books", BookStoreConsts.DbSchema); - b.ConfigureByConvention(); //auto configure for the base class props - b.Property(x => x.Name).IsRequired().HasMaxLength(128); -}); + public static class BookStoreDbContextModelCreatingExtensions + { + public static void ConfigureBookStore(this ModelBuilder builder) + { + Check.NotNull(builder, nameof(builder)); + + /* Configure your own tables/entities inside here */ + + builder.Entity(b => + { + b.ToTable(BookStoreConsts.DbTablePrefix + "Books", + BookStoreConsts.DbSchema); + b.ConfigureByConvention(); //auto configure for the base class props + b.Property(x => x.Name).IsRequired().HasMaxLength(128); + }); + } + } +} ```` -Add the `using Volo.Abp.EntityFrameworkCore.Modeling;` statement to resolve `ConfigureByConvention` extension method. +* `BookStoreConsts` has constant values for schema and table prefixes for your tables. You don't have to use it, but suggested to control the table prefixes in a single point. +* `ConfigureByConvention()` method gracefully configures/maps the inherited properties. Always use it for all your entities. + +### Add Database Migration + +The startup template uses [EF Core Code First Migrations](https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations/) to create and maintain the database schema. Open the **Package Manager Console (PMC)** under the menu *Tools > NuGet Package Manager*. + +![Open Package Manager Console](images/bookstore-open-package-manager-console.png) + +Select the `Acme.BookStore.EntityFrameworkCore.DbMigrations` as the **default project** and execute the following command: + +```bash +Add-Migration "Created_Book_Entity" +``` + +![bookstore-pmc-add-book-migration](./images/bookstore-pmc-add-book-migration-v2.png) + +This will create a new migration class inside the `Migrations` folder of the `Acme.BookStore.EntityFrameworkCore.DbMigrations` project. + +Before updating the database, you will learn how to seed initial data to the database. + +> If you are using another IDE than the Visual Studio, you can use `dotnet-ef` tool as [documented here](https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations/?tabs=dotnet-core-cli#create-a-migration). {{end}} -{{if DB == "mongodb"}} +### Add Sample Seed Data -#### Add seed (sample) data +> It's good to have some initial data in the database before running the application. This section introduces the [Data Seeding](../Data-Seeding.md) system of the ABP framework. You can skip this section if you don't want to create seed data, but it is suggested to follow it to learn this useful ABP Framework feature. -Adding sample data is optional, but it's good to have initial data in the database for the first run. ABP provides a [data seed system](https://docs.abp.io/en/abp/latest/Data-Seeding). Create a class deriving from the `IDataSeedContributor` in the `*.Domain` project: +Create a class deriving from the `IDataSeedContributor` in the `*.Domain` project and copy the following code: ```csharp using System; using System.Threading.Tasks; +using Acme.BookStore.Books; using Volo.Abp.Data; using Volo.Abp.DependencyInjection; using Volo.Abp.Domain.Repositories; -using Volo.Abp.Guids; namespace Acme.BookStore { @@ -174,14 +212,10 @@ namespace Acme.BookStore : IDataSeedContributor, ITransientDependency { private readonly IRepository _bookRepository; - private readonly IGuidGenerator _guidGenerator; - public BookStoreDataSeederContributor( - IRepository bookRepository, - IGuidGenerator guidGenerator) + public BookStoreDataSeederContributor(IRepository bookRepository) { _bookRepository = bookRepository; - _guidGenerator = guidGenerator; } public async Task SeedAsync(DataSeedContext context) @@ -192,71 +226,46 @@ namespace Acme.BookStore } await _bookRepository.InsertAsync( - new Book( - id: _guidGenerator.Create(), - name: "1984", - type: BookType.Dystopia, - publishDate: new DateTime(1949, 6, 8), - price: 19.84f - ) + new Book + { + Name = "1984", + Type = BookType.Dystopia, + PublishDate = new DateTime(1949, 6, 8), + Price = 19.84f + } ); await _bookRepository.InsertAsync( - new Book( - id: _guidGenerator.Create(), - name: "The Hitchhiker's Guide to the Galaxy", - type: BookType.ScienceFiction, - publishDate: new DateTime(1995, 9, 27), - price: 42.0f - ) + new Book + { + Name = "The Hitchhiker's Guide to the Galaxy", + Type = BookType.ScienceFiction, + PublishDate = new DateTime(1995, 9, 27), + Price = 42.0f + } ); } } } ``` -{{end}} +* This code simply uses the `IRepository` (the default [repository](../Repositories.md)) to insert two books to the database, if there is no book currently in the database. -{{if DB == "ef"}} +### Update the Database -#### Add new migration & update the database +Run the `Acme.BookStore.DbMigrator` application to update the database: -The startup template uses [EF Core Code First Migrations](https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations/) to create and maintain the database schema. Open the **Package Manager Console (PMC)** under the menu *Tools > NuGet Package Manager*. +![bookstore-dbmigrator-on-solution](images/bookstore-dbmigrator-on-solution.png) -![Open Package Manager Console](./images/bookstore-open-package-manager-console.png) - -Select the `Acme.BookStore.EntityFrameworkCore.DbMigrations` as the **default project** and execute the following command: - -```bash -Add-Migration "Created_Book_Entity" -``` - -![bookstore-pmc-add-book-migration](./images/bookstore-pmc-add-book-migration-v2.png) - -This will create a new migration class inside the `Migrations` folder of the `Acme.BookStore.EntityFrameworkCore.DbMigrations` project. Then execute the `Update-Database` command to update the database schema: - -````bash -Update-Database -```` - -![bookstore-update-database-after-book-entity](./images/bookstore-update-database-after-book-entity.png) - -#### Add initial (sample) data - -`Update-Database` command has created the `AppBooks` table in the database. Open your database and enter a few sample rows, so you can show them on the listing page. +{{if DB == "ef"}} -```mssql -INSERT INTO AppBooks (Id,CreationTime,[Name],[Type],PublishDate,Price) VALUES -('f3c04764-6bfd-49e2-859e-3f9bfda6183e', '2018-07-01', '1984',3,'1949-06-08','19.84') +`.DbMigrator` is a console application that can be run to **migrate the database schema** and **seed the data** on **development** and **production** environments. -INSERT INTO AppBooks (Id,CreationTime,[Name],[Type],PublishDate,Price) VALUES -('13024066-35c9-473c-997b-83cd8d3e29dc', '2018-07-01', 'The Hitchhiker`s Guide to the Galaxy',7,'1995-09-27','42') +{{end}} -INSERT INTO AppBooks (Id,CreationTime,[Name],[Type],PublishDate,Price) VALUES -('4fa024a1-95ac-49c6-a709-6af9e4d54b54', '2018-07-02', 'Pet Sematary',5,'1983-11-14','23.7') -``` +{{if DB == "mongodb"}} -![bookstore-books-table](./images/bookstore-books-table.png) +While MongoDB **doesn't require** a database schema migration, it is still good to run this application since it **seeds the initial data** on the database. This application can be used on **development** and **production** environments. {{end}} diff --git a/docs/en/Tutorials/images/bookstore-dbmigrator-on-solution.png b/docs/en/Tutorials/images/bookstore-dbmigrator-on-solution.png new file mode 100644 index 0000000000000000000000000000000000000000..0b81900307caecffbbf096d0d7c577aa1ca84437 GIT binary patch literal 41421 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˿|)v{ujg7-(lRTEwjI8$wb5Ekb|dVwvv}+AR5LEH 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 I;ik|21soqaIRF3v literal 0 HcmV?d00001 From 134219f43f7ac9ec423bb2980f7726044247d7a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Fri, 3 Jul 2020 20:55:12 +0300 Subject: [PATCH 03/58] Cpmpleted the app service part. --- docs/en/Tutorials/Part-1.md | 71 +++++++++++++++++++++---------------- 1 file changed, 40 insertions(+), 31 deletions(-) diff --git a/docs/en/Tutorials/Part-1.md b/docs/en/Tutorials/Part-1.md index 0c2944346e..070630daef 100644 --- a/docs/en/Tutorials/Part-1.md +++ b/docs/en/Tutorials/Part-1.md @@ -269,22 +269,24 @@ While MongoDB **doesn't require** a database schema migration, it is still good {{end}} -### Create the application service +## Create the Application Service -The next step is to create an [application service](../Application-Services.md) to manage the books which will allow us the four basic functions: creating, reading, updating and deleting. Application layer is separated into two projects: +The application layer is separated into two projects: -* `Acme.BookStore.Application.Contracts` mainly contains your `DTO`s and application service interfaces. +* `Acme.BookStore.Application.Contracts` contains your [DTO](../Data-Transfer-Objects.md)s and [application service](../Application-Services.md) interfaces. * `Acme.BookStore.Application` contains the implementations of your application services. -#### BookDto +In this section, you will create an application service to get, create, update and delete books using the `CrudAppService` base class of the ABP Framework. -Create a DTO class named `BookDto` into the `Acme.BookStore.Application.Contracts` project: +### BookDto + +`CrudAppService` base class requires to define the fundamental DTOs for the entity. Create a DTO class named `BookDto` into the `Acme.BookStore.Application.Contracts` project: ````csharp using System; using Volo.Abp.Application.Dtos; -namespace Acme.BookStore +namespace Acme.BookStore.Books { public class BookDto : AuditedEntityDto { @@ -301,11 +303,12 @@ namespace Acme.BookStore * **DTO** classes are used to **transfer data** between the *presentation layer* and the *application layer*. See the [Data Transfer Objects document](https://docs.abp.io/en/abp/latest/Data-Transfer-Objects) for more details. * `BookDto` is used to transfer book data to the presentation layer in order to show the book information on the UI. -* `BookDto` is derived from the `AuditedEntityDto` which has audit properties just like the `Book` class defined above. +* `BookDto` is derived from the `AuditedEntityDto` which has audit properties just like the `Book` entity defined above. -It will be needed to map `Book` entities to `BookDto` objects while returning books to the presentation layer. [AutoMapper](https://automapper.org) library can automate this conversion when you define the proper mapping. The startup template comes with AutoMapper configured, so you can just define the mapping in the `BookStoreApplicationAutoMapperProfile` class in the `Acme.BookStore.Application` project: +It will be needed to map `Book` entities to `BookDto` objects while returning books to the presentation layer. [AutoMapper](https://automapper.org) library can automate this conversion when you define the proper mapping. The startup template comes with AutoMapper pre-configured. So, you can just define the mapping in the `BookStoreApplicationAutoMapperProfile` class in the `Acme.BookStore.Application` project: ````csharp +using Acme.BookStore.Books; using AutoMapper; namespace Acme.BookStore @@ -320,15 +323,17 @@ namespace Acme.BookStore } ```` -#### CreateUpdateBookDto +> See the [object to object mapping](../Object-To-Object-Mapping.md) document for details. -Create a DTO class named `CreateUpdateBookDto` into the `Acme.BookStore.Application.Contracts` project: +### CreateUpdateBookDto + +Create another DTO class named `CreateUpdateBookDto` into the `Acme.BookStore.Application.Contracts` project: ````csharp using System; using System.ComponentModel.DataAnnotations; -namespace Acme.BookStore +namespace Acme.BookStore.Books { public class CreateUpdateBookDto { @@ -351,9 +356,10 @@ namespace Acme.BookStore * This `DTO` class is used to get book information from the user interface while creating or updating a book. * It defines data annotation attributes (like `[Required]`) to define validations for the properties. `DTO`s are [automatically validated](https://docs.abp.io/en/abp/latest/Validation) by the ABP framework. -Next, add a mapping in `BookStoreApplicationAutoMapperProfile` from the `CreateUpdateBookDto` object to the `Book` entity with the `CreateMap();` command: +Just like done for the `BookDto` above, we should define the mapping from the `CreateUpdateBookDto` object to the `Book` entity. The final class will be like shown below: ````csharp +using Acme.BookStore.Books; using AutoMapper; namespace Acme.BookStore @@ -363,30 +369,29 @@ namespace Acme.BookStore public BookStoreApplicationAutoMapperProfile() { CreateMap(); - CreateMap(); //<--added this line--> + CreateMap(); } } } ```` -#### IBookAppService +### IBookAppService -Create an interface named `IBookAppService` in the `Acme.BookStore.Application.Contracts` project: +Next step is to define an interface for the application service. Create an interface named `IBookAppService` in the `Acme.BookStore.Application.Contracts` project: ````csharp using System; using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Services; -namespace Acme.BookStore +namespace Acme.BookStore.Books { public interface IBookAppService : ICrudAppService< //Defines CRUD methods BookDto, //Used to show books Guid, //Primary key of the book entity - PagedAndSortedResultRequestDto, //Used for paging/sorting on getting a list of books - CreateUpdateBookDto, //Used to create a new book - CreateUpdateBookDto> //Used to update a book + PagedAndSortedResultRequestDto, //Used for paging/sorting + CreateUpdateBookDto> //Used to create/update a book { } @@ -394,12 +399,12 @@ namespace Acme.BookStore ```` * Defining interfaces for the application services **are not required** by the framework. However, it's suggested as a best practice. -* `ICrudAppService` defines common **CRUD** methods: `GetAsync`, `GetListAsync`, `CreateAsync`, `UpdateAsync` and `DeleteAsync`. It's not required to extend it. Instead, you could inherit from the empty `IApplicationService` interface and define your own methods manually. -* There are some variations of the `ICrudAppService` where you can use separated DTOs for each method. +* `ICrudAppService` defines common **CRUD** methods: `GetAsync`, `GetListAsync`, `CreateAsync`, `UpdateAsync` and `DeleteAsync`. It's not required to extend it. Instead, you could inherit from the empty `IApplicationService` interface and define your own methods manually (which will be done for the authors in the next parts). +* There are some variations of the `ICrudAppService` where you can use separated DTOs for each method (like using different DTOs for create and update). -#### BookAppService +### BookAppService -Implement the `IBookAppService` as named `BookAppService` in the `Acme.BookStore.Application` project: +Implement the `IBookAppService`, as named `BookAppService`, in the `Acme.BookStore.Application` project: ````csharp using System; @@ -407,12 +412,16 @@ using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Services; using Volo.Abp.Domain.Repositories; -namespace Acme.BookStore +namespace Acme.BookStore.Books { public class BookAppService : - CrudAppService, - IBookAppService + CrudAppService< + Book, //The Book entity + BookDto, //Used to show books + Guid, //Primary key of the book entity + PagedAndSortedResultRequestDto, //Used for paging/sorting + CreateUpdateBookDto>, //Used to create/update a book + IBookAppService //implement the IBookAppService { public BookAppService(IRepository repository) : base(repository) @@ -423,13 +432,13 @@ namespace Acme.BookStore } ```` -* `BookAppService` is derived from `CrudAppService<...>` which implements all the CRUD (create, read, update, delete) methods defined above. +* `BookAppService` is derived from `CrudAppService<...>` which implements all the CRUD (create, read, update, delete) methods defined by the `ICrudAppService`. * `BookAppService` injects `IRepository` which is the default repository for the `Book` entity. ABP automatically creates default repositories for each aggregate root (or entity). See the [repository document](https://docs.abp.io/en/abp/latest/Repositories). -* `BookAppService` uses `IObjectMapper` to map `Book` objects to `BookDto` objects and `CreateUpdateBookDto` objects to `Book` objects. The Startup template uses the [AutoMapper](http://automapper.org/) library as the object mapping provider. We have defined the mappings before, so it will work as expected. +* `BookAppService` uses `IObjectMapper` service ([see](../Object-To-Object-Mapping.md)) to map `Book` objects to `BookDto` objects and `CreateUpdateBookDto` objects to `Book` objects. The Startup template uses the [AutoMapper](http://automapper.org/) library as the object mapping provider. We have defined the mappings before, so it will work as expected. -### Auto API Controllers +## Auto API Controllers -We normally create **Controllers** to expose application services as **HTTP API** endpoints. This allows browsers or 3rd-party clients to call them via AJAX. ABP can [**automagically**](https://docs.abp.io/en/abp/latest/API/Auto-API-Controllers) configures your application services as MVC API Controllers by convention. +In a typical ASP.NET Core application, you create **API Controllers** to expose application services as **HTTP API** endpoints. This allows browsers or 3rd-party clients to call them over HTTP. ABP can [**automagically**](https://docs.abp.io/en/abp/latest/API/Auto-API-Controllers) configures your application services as MVC API Controllers by convention. #### Swagger UI From a6e5595878fda31ae90d96e367320f515f01d828 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Fri, 3 Jul 2020 21:08:41 +0300 Subject: [PATCH 04/58] completed the api part. --- docs/en/Tutorials/Part-1.md | 50 ++++++++++++++++++++++++++++++++----- 1 file changed, 44 insertions(+), 6 deletions(-) diff --git a/docs/en/Tutorials/Part-1.md b/docs/en/Tutorials/Part-1.md index 070630daef..d0ec1bee9c 100644 --- a/docs/en/Tutorials/Part-1.md +++ b/docs/en/Tutorials/Part-1.md @@ -186,7 +186,7 @@ Add-Migration "Created_Book_Entity" This will create a new migration class inside the `Migrations` folder of the `Acme.BookStore.EntityFrameworkCore.DbMigrations` project. -Before updating the database, you will learn how to seed initial data to the database. +Before updating the database, read the section below to learn how to seed some initial data to the database. > If you are using another IDE than the Visual Studio, you can use `dotnet-ef` tool as [documented here](https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations/?tabs=dotnet-core-cli#create-a-migration). @@ -232,7 +232,8 @@ namespace Acme.BookStore Type = BookType.Dystopia, PublishDate = new DateTime(1949, 6, 8), Price = 19.84f - } + }, + autoSave: true ); await _bookRepository.InsertAsync( @@ -242,7 +243,8 @@ namespace Acme.BookStore Type = BookType.ScienceFiction, PublishDate = new DateTime(1995, 9, 27), Price = 42.0f - } + }, + autoSave: true ); } } @@ -438,7 +440,9 @@ namespace Acme.BookStore.Books ## Auto API Controllers -In a typical ASP.NET Core application, you create **API Controllers** to expose application services as **HTTP API** endpoints. This allows browsers or 3rd-party clients to call them over HTTP. ABP can [**automagically**](https://docs.abp.io/en/abp/latest/API/Auto-API-Controllers) configures your application services as MVC API Controllers by convention. +In a typical ASP.NET Core application, you create **API Controllers** to expose application services as **HTTP API** endpoints. This allows browsers or 3rd-party clients to call them over HTTP. + +ABP can [**automagically**](https://docs.abp.io/en/abp/latest/API/Auto-API-Controllers) configures your application services as MVC API Controllers by convention. #### Swagger UI @@ -448,11 +452,45 @@ You will see some built-in service endpoints as well as the `Book` service and i ![bookstore-swagger](./images/bookstore-swagger.png) -Swagger has a nice interface to test the APIs. You can try to execute the `[GET] /api/app/book` API to get a list of books. +Swagger has a nice interface to test the APIs. + +If you try to execute the `[GET] /api/app/book` API to get a list of books, the server returns such a JSON result: + +````json +{ + "totalCount": 2, + "items": [ + { + "name": "The Hitchhiker's Guide to the Galaxy", + "type": 7, + "publishDate": "1995-09-27T00:00:00", + "price": 42, + "lastModificationTime": null, + "lastModifierId": null, + "creationTime": "2020-07-03T21:04:18.4607218", + "creatorId": null, + "id": "86100bb6-cbc1-25be-6643-39f62806969c" + }, + { + "name": "1984", + "type": 3, + "publishDate": "1949-06-08T00:00:00", + "price": 19.84, + "lastModificationTime": null, + "lastModifierId": null, + "creationTime": "2020-07-03T21:04:18.3174016", + "creatorId": null, + "id": "41055277-cce8-37d7-bb37-39f62806960b" + } + ] +} +```` + +That's pretty cool since we haven't written a single line of code to create the API controller, but now we have a fully working REST API! {{if UI == "MVC"}} -### Dynamic JavaScript proxies +## Dynamic JavaScript proxies It's common to call HTTP API endpoints via AJAX from the **JavaScript** side. You can use `$.ajax` or another tool to call the endpoints. However, ABP offers a better way. From 89b4d5d48fd6a4a366ec7acac78ec1a41195e6ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Fri, 3 Jul 2020 21:27:37 +0300 Subject: [PATCH 05/58] Dynamic JavaScript Proxies section completed. --- docs/en/Tutorials/Part-1.md | 39 +++++++++++------- .../bookstore-getlist-result-network.png | Bin 0 -> 27382 bytes .../bookstore-javascript-proxy-console.png | Bin 0 -> 73671 bytes 3 files changed, 24 insertions(+), 15 deletions(-) create mode 100644 docs/en/Tutorials/images/bookstore-getlist-result-network.png create mode 100644 docs/en/Tutorials/images/bookstore-javascript-proxy-console.png diff --git a/docs/en/Tutorials/Part-1.md b/docs/en/Tutorials/Part-1.md index d0ec1bee9c..bace3bc76f 100644 --- a/docs/en/Tutorials/Part-1.md +++ b/docs/en/Tutorials/Part-1.md @@ -442,7 +442,7 @@ namespace Acme.BookStore.Books In a typical ASP.NET Core application, you create **API Controllers** to expose application services as **HTTP API** endpoints. This allows browsers or 3rd-party clients to call them over HTTP. -ABP can [**automagically**](https://docs.abp.io/en/abp/latest/API/Auto-API-Controllers) configures your application services as MVC API Controllers by convention. +ABP can [**automagically**](../API/Auto-API-Controllers.md) configures your application services as MVC API Controllers by convention. #### Swagger UI @@ -490,38 +490,45 @@ That's pretty cool since we haven't written a single line of code to create the {{if UI == "MVC"}} -## Dynamic JavaScript proxies +## Dynamic JavaScript Proxies -It's common to call HTTP API endpoints via AJAX from the **JavaScript** side. You can use `$.ajax` or another tool to call the endpoints. However, ABP offers a better way. +It's common to call the HTTP API endpoints via AJAX from the **JavaScript** side. You can use `$.ajax` or another tool to call the endpoints. However, ABP offers a better way. -ABP **dynamically** creates JavaScript **proxies** for all API endpoints. So, you can use any **endpoint** just like calling a **JavaScript function**. +ABP **dynamically** creates **[JavaScript Proxies](../UI/AspNetCore/)** for all API endpoints. So, you can use any **endpoint** just like calling a **JavaScript function**. -#### Testing in developer console of the browser +### Testing in Developer Console of the Browser -You can easily test the JavaScript proxies using your favorite browser's **Developer Console**. Run the application, open your browser's **developer tools** (*shortcut is F12 for Chrome*), switch to the **Console** tab, type the following code and press enter: +You can easily test the JavaScript proxies using your favorite browser's **Developer Console**. Run the application, open your browser's **developer tools** (*shortcut is generally F12*), switch to the **Console** tab, type the following code and press enter: ````js -acme.bookStore.book.getList({}).done(function (result) { console.log(result); }); +acme.bookStore.books.book.getList({}).done(function (result) { console.log(result); }); ```` -* `acme.bookStore` is the namespace of the `BookAppService` converted to [camelCase](https://en.wikipedia.org/wiki/Camel_case). +* `acme.bookStore.books` is the namespace of the `BookAppService` converted to [camelCase](https://en.wikipedia.org/wiki/Camel_case). * `book` is the conventional name for the `BookAppService` (removed `AppService` postfix and converted to camelCase). -* `getList` is the conventional name for the `GetListAsync` method defined in the `AsyncCrudAppService` base class (removed `Async` postfix and converted to camelCase). -* `{}` argument is used to send an empty object to the `GetListAsync` method which normally expects an object of type `PagedAndSortedResultRequestDto` that is used to send paging and sorting options to the server (all properties are optional, so you can send an empty object). -* `getList` function returns a `promise`. You can pass a callback to the `done` (or `then`) function to get the result from the server. +* `getList` is the conventional name for the `GetListAsync` method defined in the `CrudAppService` base class (removed `Async` postfix and converted to camelCase). +* `{}` argument is used to send an empty object to the `GetListAsync` method which normally expects an object of type `PagedAndSortedResultRequestDto` that is used to send paging and sorting options to the server (all properties are optional with default values, so you can send an empty object). +* `getList` function returns a `promise`. You can pass a callback to the `then` (or `done`) function to get the result returned from the server. Running this code produces the following output: -![bookstore-test-js-proxy-getlist](./images/bookstore-test-js-proxy-getlist.png) +![bookstore-javascript-proxy-console](images/bookstore-javascript-proxy-console.png) You can see the **book list** returned from the server. You can also check the **network** tab of the developer tools to see the client to server communication: -![bookstore-test-js-proxy-getlist-network](./images/bookstore-test-js-proxy-getlist-network.png) +![bookstore-getlist-result-network](images/bookstore-getlist-result-network.png) Let's **create a new book** using the `create` function: ````js -acme.bookStore.book.create({ name: 'Foundation', type: 7, publishDate: '1951-05-24', price: 21.5 }).done(function (result) { console.log('successfully created the book with id: ' + result.id); }); +acme.bookStore.books.book.create({ + name: 'Foundation', + type: 7, + publishDate: '1951-05-24', + price: 21.5 + }).then(function (result) { + console.log('successfully created the book with id: ' + result.id); + }); ```` You should see a message in the console something like that: @@ -532,9 +539,11 @@ successfully created the book with id: 439b0ea8-923e-8e1e-5d97-39f2c7ac4246 Check the `Books` table in the database to see the new book row. You can try `get`, `update` and `delete` functions yourself. +We will use these dynamic proxy functions in the next sections to communicate to the server. + ### Create the books page -It's time to create something visible and usable! Instead of classic MVC, we will use the new [Razor Pages UI](https://docs.microsoft.com/en-us/aspnet/core/tutorials/razor-pages/razor-pages-start) approach which is recommended by Microsoft. +It's time to create something visible and usable! Instead of classic MVC, we will use the [Razor Pages UI](https://docs.microsoft.com/en-us/aspnet/core/tutorials/razor-pages/razor-pages-start) approach which is recommended by Microsoft. Create `Books` folder under the `Pages` folder of the `Acme.BookStore.Web` project. Add a new Razor Page by right clicking the Books folder then selecting **Add > Razor Page** menu item. Name it as `Index`: diff --git a/docs/en/Tutorials/images/bookstore-getlist-result-network.png b/docs/en/Tutorials/images/bookstore-getlist-result-network.png new file mode 100644 index 0000000000000000000000000000000000000000..141f9d14eeb330f78ad7dcbf3955f6bcccd96cf0 GIT binary patch literal 27382 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 literal 0 HcmV?d00001 diff --git a/docs/en/Tutorials/images/bookstore-javascript-proxy-console.png b/docs/en/Tutorials/images/bookstore-javascript-proxy-console.png new file mode 100644 index 0000000000000000000000000000000000000000..f393c47875bba10b8bd0f42bb2fa2f5fe9725830 GIT binary patch literal 73671 zcmbrmc{Er1`!?R3RFb4bgbYPQG7p8K$Pk508A38;o;4s6LdcvsGGxd+BqUR2nT5>r zRA$fRob&m7zi0ja_^oF>d!2R8=^cB&_iNv;`@Zh$y6){ED=mJQ@D$;W9Xk%+kPy4Q zW5+(f9XobDCfJ2fwhkuaKWBE_5WA{i6E@jntt$Uxjc4{40l$kEiP&ozT2W%#jAGa!}8$S$h&CVtw4SRowiMzF$-1bq@wDKdU)`bhkzoszw?##F8_0->iRtM48gKn@>((uLwn>Hi_uqMVRCRuO z6zA;uCh5Zm=gk#8)*wk1IYmY4%LXm)u0CfXCG@OFN==oPmL8t7DJOJubEDug936Ht zH#1|oaN&XdOo~cQgplJ);*iUa+7`!}=e`87X$aZ>X5r>OK_eE^_|=DcW_UP0I$ES~ zVzMKXoSd9dI?QHymd2^T)wSXk`K9ZxPBzwQ@4T{)mzS4-Cb)hVJ0%e#4GoQ;U{Pvn zYK$f4<;&teRDxEMN{tKA{ISBG=SXiB)KCjMg}r%`WivO>U-rU!)u1aNCMHH(OUvyr zMSNOX{g9bneS{Y=pZT!Vty_n^u3zHd5Fxm8=gx65GCLa^sW6_SG>e-XYma`U=H=!t zFE4*HtHmQBHZU}N)33I2(Iav3O3gC2PilD|KVD>IonBcODG%xG?F|VD zDgPk6K3n$1^neO_AU4EVCOUeZed5P51-)+ z;-vTQa~)PP-dNxN`t_@15G!tdYFN79ShoLRqOPOXx;qxrA`W*QB_t%QuBkbA@E|WG zk$QA=GzY%>?%mH>)y!iXXEga;8oVgDGcq%eiv0flo5!$HH&a_%yRXRpMOrQAsk*kd zw$|3;X-72qckCDy>iA-{efb?5(f%KMMjK;3Wo5a$?%liB)zww&Aph~BM;q;NLSoN~ zeDe_^Z#s#e)6>%v6J2!nE+0=X`%J`rRMQxDYA4#U<8vj!-=|u3e@$N!77@WZ^u3}^9e;ou-fq{WoeXh_HL|IBoPuJSs|2fCIO3Rbk%}q_?O%m-- zMXz4HDkGCtBKf~BGRaqKv>(54)fjib+_x)lYWufmkNQr`Y;W%W9_3fJ@996slbs3v z!8$v4{1hf~lmE}@Mo%WGS^1sJENl(kA0K`|G$@h;`FuOw0PsU%83&}E-o%Y?WZH_h3$VEiix?% zG8wKJV5?eKEUvFCT)1!{$GE4u-_$+G&(E*6wpLYD)tg%QyADTJkIkJst*L4SH*emw z`>?nnZdT+dmfJd+n`gagwizCv*46i5MFmN-x5%E~Kw*o*MMP6csXfwpvub3apyV=@ zkM%@b%ERXP;NW1ywWag(cN$k}W)K`#b#-+!_3DeAx17Y+Zc0e-*v{*io13Qv?%BRa zLCK_#YG!5}K{ZoT(TA=evkg}I)YsHZv=*82gdux=59iOxwt6QZ`a8R`vop_pYVqCb0y=;8O1D7i%Pt;)q2!Q9iKj(8`@AKb0I#@#MGW`q~he{Bq=HB z92Dmm6-9mMu*pwne@5Y|dXv|hbi1BDDZNk0WBL|)z% zxA^XRnN@v+pro`k(ZPe-=}L~WXBv*;NzC*XxgI=mPgz;{-aV()v4o>Xj|x!9ScD_n zZLIxqUYp7(IxW0w2aSTVa-QWx+c8GzthJ=YIek%4QEO{!H8nN-yW=LUV~vleC;#Jt za)ibD`ntqfzxEHRtlS(Nx9{A!%)`UO$T+e*H;7zb{(+U16%RosQpnQ6;+3~ID-)A` zfup>9bJ>d{ig)fHATD3NTxG>W5cTon$2iHL-@i@vHTkQWh&VkO-aL_3?3GflvnV-7 zK%M%aqBghZHC%fR%*}I*y4u21o;vNkP*REK ze1VaXk%vd=&Yh(ye?~7aFD>TR60zi$bocDrr=DvXWuoQ2y~3kM!(FCwRau{xULjyV z`3lu!aO-)oqKZnvgPK4DXMBA8yp4cRWaQhoxyC*Ds5mcEzYfkdH8*Q6?;fQ%eE4wg zRV#CTEYS<1)7V+3_^px+RbFQdIWN!l&-RxgDsdQT%Mj2Iy^vQ`ot&7M7#h09;NO*c zh1M6v`A3?D2A1)66aj^h!?L1=qvh7-#_X&qx%b|hy1I?o{^zwOGs@v@D%wtJW8vMU z@>20d%Dg2`H4bfoE6Eq^rrjJh6z<+NlGj|@*m>ZlUDBZFh|~@B>!+i7xZ}p%Wtr9o zeT0z;ikAmGpHk+%<^PeJY^bT+@ufLIjXpUrvi>}4AZZeVe--oHAni<-m*#c*?W-e*U0vTVX*Oz*| zFY2!pxkxeC+uPR%UrNZ&&+kdoCGp^V)W#w#T;k6tGdwc#NBze3x;H%M%j>&y`}X|8 z0tLI)9ufD-L031o?5@&1i`nk(?j@V6kE;CWA3uJKphH4``0(M{?1EJ%Kg$s*|VO&O?CM6r!6Ph2e&3!&| ztLU<#c{}}K21)UxQ}S~Bnt~0*0|NuEU%y7q;p6B3W39aEj^|xcvW3U|rL641^ducI z!LmbfM1*>M;NeAb++7YGM=(q0jlv7pu2mdozI(<6J7=Hh1C)*@J|ZK+^33PX+1lG5 z^DUU2olQCGEdSKL(j_1X7L9hrKe!NI&dJd=GT8ri+ic&-Wd zeviH3FCr>>&BVe~j@z*P{(}b(baip(St>ck9vk1PbTge-hJtSRGxYm8;D0JADoB1~ zSA4RW)7roP#oC{l!LEWYUqoCQfJOB=PfbrnCno0URQZiHC&X+CpK3%6sj3=l{h;_~ zx+gO|oyM=lUDxVZ$}wi<4?w(yP8;_YiTor+6jfCVAJmXBGc)6?s0J^8Ya19Dd3k!S zEjG)bDy1YRXB&3Vu9%*^fAJ))YHe!zx$7MBnj%NC^u(=@>JutkZ7C`MB|x7@CFS!t z=)}Eqb93JY2iw}%?AgD+hU;utoo=L{eH(6~scAm5UdVo7*lYAd_+259_rS3QGsR_f zy=7&C0NRFJDqpCMk&sYQQX)e0No7tDx~6HAsAuXPPR+48#(0Cr(Vay?K0!LJd2Hl+ z_^}>|+qeA|=}W8j)0YI*kBDEtPBLXw7jpUBxpTR_u_h}7QB6%vh>P!U*>`Ky*#*3O zSslh}-do~KO-|ks$4z3JjLa{d(3~J0ev?wV>zBu&ecFA+j(7h$_^l?1jhfzP9z2tp z|L)zH0m^c(-^kNi*Zhim-&k~c=-#ai@)*iH_HpIL2WrL?CzksQ9>RT-cHdL9N;;|R ztw%e$IuizmUD7iQ%5z%JC%;-I=4ND3m^q~WBKWR{3jvM7qCJE3`yg}L0JWys@-b`L z3aWIv##UoF88?-!rfH>nSLG$AgI`s~I2TV0qUuggB6H4n&%k$gnCLW}N~KFe0)50>inqi3)5(KE|Sv7RQae>>OGF#C19 zbt)Mig?Pt}{a71ft z++9slnMSZ{{_znpd;2xys$QyM11+tA!NFrxRK0RkZr{FrOV_T9;IkwgutQS%e5K(# z(?=_8V2V?xu8WDCaiOK9J$dLWYT$!*>KA1lIVRM;%t4id6_u5Y3=9#7#OCH>Y@~#) zIVOEXhYp=JKG9q3SYST#y(Wk)G&FRO{zs~sr-w(WiLmYbuNZM3C6>De1_m}Z%V^VP zy`9$QDw!2ie=aGrv<=k+#Y9Jcj}$i1)n#yenx{Gq+(JS^VygM_<;!j0_u#=0u-7M* zmawp}Cr_S~mzU3!Y*GD@N=!=X%y=LPfF2{u+nA_3KqmYae!6i{@gdkV0wvylQ+Y$#yp?>;}>jf{Wn^cvZ*W9FOdwhn#u zgLB@Lyw8Z||NLR}m2eQ+%IS0BcUZpo_!|ih;5hEMh5#i2$ z;laT{B#`=Wemz6OSFs<~kqlAWNsg9b?;#oBro#kmGkP?|Y#a|B^u&UmA}7D0(Q<-K z-F^CfN(7%{z6=wodZEqHoGUEn&nF@E4pew{cB)bIFaMtELLNXl$nI%O;~*v|kE|B! zXm4-t?2M0#s|)3pG3(pk;T|r8CnicT)%oe*pJQ+4k2$O_&ow8=c)T@na9BsGmyQ&= z(CKqSq^PK4Nnk|m{G48GmP+}S7nzbb@6?5~^G0`qdTZi@YfZjw*o#zEe;Zg#kxMO+ zmZw^@W|IA8;%LpoJ25N#v2*OO=Iu3UBG3mdNfuouPq4t9Z*Ur9jUK+on zsv2fkzG)e2a4|0K!PTofBNn;NpC1Pig#9NaB~@ErUte1* z;IwW7OtUocqhN6mVEh)&7Jn-gu?KX?rj{R@lw|j3S}m;Yys+@ruPT30w?lbO8+M?E z&^4hwIeq%{Okau5NcpdY6~#35Thh{~Hn;8pp*w8?SXxhYR_JE3spd8`oQe3Ho0K#j zYEpcTiHU%SC_=!NW6tIxiZ(EofX(dv`CnD&t5D{mxplBLL4Gi1G}VS&J}CT9TWtB9 zfPerCi{aN-!a|dPqM5D2>1>eTc(&t1(MCb_so{mrpak8`DkdXKs z=ZL+Hm1C5Npgev&ASfuv-+uw^2b#yN)rmB-hQm`v(Sc+5esdH}vY& zp>q={&DAI9NePiItfsriMne_o~4eL;LvMy9^5PSA1H0xe2!BSIlIHMKWR`zk?^ z{U7hr`(eV)LfF!mE}0_*<>lpx>3xu9E&=1yk|<9QbxH5L4iekY5bm_@Ejt}A?+U7@ zk#*4P*B>n>?(*{&;3q83>HcVGu|O;kx|+=mR3HK3z=DRpeOnvKJ(E_l`9&thPllTI zU=uK=K4(ZtiF2_#>opTKRn^&o&Gm(PE5*-wBZ7j08ih8#k&%(1p%h1tvOjD(8`f~M zI?xA*>F{Yjg)helq{)MWg2ZDQ&z=aq9)mu&C--qoMn(omI8IJOBO^4m{2_Lq)WoQm zk;P7V{r**TY{0a9xKct=^3lVGrRP>a!XXMGg`K6tzTH;eA?&dHSt}h48lwXdQimWN zohVC!dcsm0T?pa0?UHJaux{;#4XwMrTd(uV9{JT!9NZk!khc;RUekXWIC#cq|H5#q z6MKnqrp#BpeZ^(O9xlWj%DP_1#+99TueVA#8dP(vk2tiE1xX5tae65kNqw~L;viT_ zSvjG8DI(}_pMV`sjYffY@$m1fRO?>@!{i@cSlU`VuT}Jc=EFIg%}@88dUX4KFk7k~ zHjroLd7u{hAOjFMHnzN}$xkH8BJ2Cg0&ipEP=a*c@JKxylhQ}W0=1ijbj%-!Xv&AO zfzs8TgeJQ4(pOd%YO2YK?Jnyr4Eu7Mkdd4o8lSLDPd}cicf@hU%nA*MpPvi~NxZ$y zA!9b-s7d#A4Gm|bOJ=dUhLfD@dieXY7nMIRzI^LTCvKpxUugeF+O6j@H+N-41<1Rq zuwyCB_J_`uFw;j0`K777pUByNdMvTvbXDxim%5sog2#hy2?>nFwx3@-XACDUa=2P! zk~1Wq*n+JAUYAYj;}ucS82-JPpFY)9SKH10eCpzmhGv<>YVlIR9QqCK zP^%;fQnpE~cl8!DhLuBRnVFe$TgQ(d2ZYsWj|A|`HtJ%KiI9rBeN;q;1Kgx-`$tVm zqW#utM+sfgtsf)Uv!94^c5Y7Y?p+373FOavpA3#qKXwDdizpYBk&(f@|N7<|=`ins zYK#cGaz@|CsG?{Vfeq;H;{509#^7*m@B%WFH%V2FVmtJ2JA%jLw2Wbof2l@y(ZR z_pV*D5-KPN)YOq|CF>-8&pcDtmwsqO@>y1wm%E739;V+6ezdQv$YxGNMP&^c zj-1be$wQ3RzY1R(Oe~gveB3?3;}|3A^y9_RMjZ}id3p1t@m4-QJ|08HTSb=lR-)JN zh)Rnc*T~q^3(ZHQ)4gp#4e4;Kpz*h~w6qZiZeN<48*55G<8s}b(srmi01eJLWJ+dc zXV4)4-PpaVtcoGk&TGGoZr-d8(r_9Z9E^GYUV_$FpYz_8E1z*kU^vT9;cstVx$>l_ zNO1aOdz_hBUN;ce<3UsmZf_~{#X92R;z)9Zg#rTZiThgEqHO*7y3r~%UYn>h>rkdA%_;96FQR9MoVS9bO%zT^MA@U5+3RziM zK%FnWS;)WxEG;gMPfXY+e#OHB^W!N$PeD$8D~!jteq`{&`^CsJUf21-Vj*45@s3VR zNE+?|tCDSB+0XP=eA&U}wfOS7)$<2UvX^gLuNj5(OI;#SmX=eo{YGg{Q*wuCd2N;9 z{z47auMa2R^X`>t3%%$f7AR_V_GNHPZo#%7< zgY%f*TA}UN>gxHMH_fyw$3G*T^l9I5($bQWLImx(ifv`(-d1?M$ak0O>2LJ-lDF_lqRxQ?v~NX&HM0zKKlQx}4$ z;bC3Aa3QU70)Bq}0~F+fc3GeijEpXb=mS%7o;timt)1C{0u5@z+uK{qgcAG2zv|6q zu!g8;S!ZWRt}FHo`r+kxY8nMKH6ueqsY5*#sBTZ6?kpyUQj?sP7Kz)_pSi#hETC2H z4k+W^ds|UK!LYA*179&gCeq5x%s_>Nmp5;2u(F__An45-)dH(2AS7%=BmUw~bOKaq z`T3n~ZFenRUGNb5GDufG|ML}zKff8VRBf;k^H{m^jkvEq1&&1BS_%g)2I zJX{y5{qcNNXgIe@Qb(mfnA#nCNxt^3BEOmZm1O6kA}x z^f%vu2Y7LW`V<8P5SB*Pt~eyTbEMS^BlYs~@{jpufBpIeSo4aKm&AEg&}P*lG9;uE zbV3P8FOU?Y4< zM*e)ut_|(PU9roXKQN;=U#2o3{=ruLd-ilr+g;L<@|r~vYs4=fvSkZ8?M{nJRqm=6 zxjGoBXOGR-e4Tq{BU;UaQ5lDOX%TnrA>)iV*wT*Hk8*8@9 zTLA%K$;qoNEg?nr8ZV0;Et?vcXI@cOR=*Qa_|PAjgPu*DQd>7(NZYM3Sy>d1w7P0( zp^ygYn#As&Wl~;VaFq^dFLEuy@Lp|+Ewytii(`wO^cz!8_c&VR1)?dwapT6VTT`Xa z_X7|@yENni=hTIgg_LsC@kG}8=7rtyU?j>m{*qW$T@`$a5ACDlzmb#gG}( zDsi@{Axad5u3PcD_mYF8q-T3V+ry$8^2iq0;?m)K zmuYDSAT=7TG5S^gLT@I1?b_ZwdpNncoEGZ1zkmPUQ-7eRv-4%;qhow24nS`YiGUIw z;PFCTm5C7WjS5HQ2V?c4t&LSByA}W*5WXYh0a##k0pw0$qpi*2`%wEqX`v(OV}K%y zbpbh?teTgh=if0{nvMF==lG{5oZp&C$brdr15BZIr8h4>KWJrK%|o!7WHnchR`Z?X zGr?=pa>dN2%O9Lg>s;aGAoo8^QrW|Xe}!~JG%~Lk5!|1y*tlbEo9@mRKlN=J?p9Ev3XXOm*yU5L`;S|^>?JI8LzZ>6LjG z#qGRxl83K^8HG3BX@jr0{v^9rIj;4OIzFX zUf1POdhu-K(;)GEC4+{hf4w0(EVLRFo)nq6J#`W{(&wvjI4Xxv$D7(6~Cm(V(9TnIl zus-D%--}?-qHz`JKz;`&3Xrzl{agK!j%mD`a?cXa+TEQ%MWsuct|t8ag$s@wtDgXM zk=r-}WTIrTr)E!T?((myt*N=h#YI*$1)a6~qh=Z00e_~ttichcx}D&q{Eo~D)*liI z5Frk970w$=irn1Xg(5TILLBl63Y5^Pq00OF`2jfjzkO>1-RyfG!!B+$BrTfeFf_fj z!Ix4}QgH9TQtl`ykRCr?7b&bEVzO5#QbScWIVOfKL?Yc}@h2nGt)d&x)#mHh8JB_& z>0W=qyR(ZvfhjFHt-AL8ue(bF=J8=9%IdDQHtN+T>v}D3U-#Yn6BuO>o0|NiY~khT z=xBp}mY*Ln2*(X)km1`+O>cet{cpb znzp>5Z&9uZV}x?ouisLSVDbMZ znZ|!X!w%t!pplQ4qH(*G)!N>!boVYS3~Y9p+w$R)r-}X_PY2b|$48i2S^fTP%;;qu z^wUX4^aW9zEECocc=QCT>bL4@+Pi1`tI&&o`t%9dRtgPo{}+^KR7FxUvYUA)@T}lw zz>*-vp!vz(90ttOX*l zrA0v~vJZvX*EbyuUwk|R3St=h{`x6mO3GLA370uJ*U@UC@juOPW!R;Hh{!>_f|Ems z5t4l0HRC|x78(c92YmeS{B|z`R{;Qr)A};I zPvtQ}S3DLV4bUaw;2GM}hOmo4s-c@dbm$OdPphtP;V#u|%*^&^=o2EH>{d~@78d~n zJx{Q8c61!Q%&;-`oSHvUz}7D$jEb z{Lc|C?qBIXpN);PnS1f^H5+YpwUHUptMN<*{1h!ksnT7il>g-4`(|=Yr2L%GH=)4l z4;zYq$oD4E7Q{x){*h`VKN}mX^)7x;>x#3&+v9Iuad+LWuMrCIbMF7NDMokM-DT12#e8B5ii7iH7a8}m(R7zGO7R2VSw9~XK5@gqCaXkCG|rGPrKh{V;WI*&d) zFqEReF zU(sJ7pdobaZYg(O&3aWg%*}mJL{!+YFXG-^hMFV01)JvQ1l_{J)$ZTFugJJ;05w|L zY!w`0#=wAEp-BV7uzA{<1neG32W{7!w=IX+7Ny-W~9>hHJm;Nkv7) zZcAsBsM9Hf{r&wTBPU2mG7LL7v}nAp(+#HwxTU3;h>4Y>Pi0lhKbzm(*XN8-jg|y_ zF!dV)Tc5pAfkYk1qD-4#j=p=WDUK)ZI~0OhpQ?i=SkG>!019s7ay0_%cI?D(#6N6E z*sez>l$4ad$LT^(vZoqtvN`T>ASMv_{O=}{2i(F+dn)cBm{|BX6> zlbt2ogxq$azoQjh999t-0xbs*)lAQ}i>fG^9$&BV z<#A@y9~aNbL|%Qq4^T&=!0Of_-SR@c@HIw%$EEQArPQwwdesVT; z(y7yazuc{VRAkrFpGXOSGh{ux0&XtN&JwH9MhzWv9{4;8dbHAuf-&ldh)n5%2sHe6 zJv(puvGEhoAWxnTutOTa&L5yRl3_m(Te8C{DRk*NdvnWUE~bJ=4Xdr0{`HoloqVbL z)Vc@{1hb?kd0$Ahxvel4>#me6sQYnDuPvH+T;}5K1_e9k^BWt97KP>dPlw(%_s%Ej zs2^r@DlO`4A=DaTlr9>ZVb1+V-jBNYA?M&;!4WZo?;g$rr*MI?5>tFm8W*sW z=m?M>E6f{4S{c%bNq#{r?6)MflhxK#C*%078F+ceXkG59xXMH}$waLG$O>?COPZc` zPB;pOmbrQJ)G!uDY4{$2=skoritJoH#Z;}phsE7aL}+Ts+jO@`HF2ovg!D&j$S*akj+2|c%Zwzn}2lrE2TKe?q({Q1a%PT7oW&k~N4tw+P z@)~tyRDAuqug@4n`aXC!@+~}0&Ru2j=QirJ7$`r`7`@FSp+J?N9tU}~tuS2kBC8u8^K47gpe7+P1M7tH4Gui5c=cx1S@8JV!4JZ^d^iTX98L&m zB;p0)AQQHlWrRV?9}r(P-FV^R;$C-;IT#G!pFU?92R@QEQ0w^BqY-agKmXK_86zcp zu(7%XfKg#75_db{R;U%&r^d3etlro}2X@F8NDm3JOgne(gsg1S56kGTUAs)Ze5-UI znq!M>H@7T8(Q$E~kQC1cfEZ#Xdxri>Dc7_gCW6NmV7T%N3N-S}u33;}qg@uG1yGm) zr-3K7{Iu@t*I{H2`#;lD`gVJuxg))+Uh#z2fMBmErR-%0^b3X&gKNKS!2oJ4GJgDG-yxbr<)c^ehg4}Ce_bdzizT?x0D_@)s{~{!%J^lraTeS@#uEneBq7OVX*ThU?R8 zt7I!vPR{qissum(ls}`IUhPFc0S!F^gK;EX2M32$GcyV~wAzc`tm8O;KxZFHY#`kIMLJ7|D{8&99#8EPoK-ToPgEO0qMoc-WGQm91R9`V z6B-h{Lm~whmX?PP9Ww4K?y*-V;cWp5Ht1mwsGfJR zq4f3j9UKZ>UH49pF?4xrX=&jLCMP8PFqScjlC?pJg)t7C@<7;GqdA*GU}bnmB5%f# znBUpB04Hz5^7A)|q^mkfR} z9djnH_ergVg@tMS4`6^T6FujVg%#M*N=*Ajfb_(lSH{I+%MT5qL(RfxP~3qrBhH_F zP3|f}&TDoyTv{VT$0Hyh09*;+c4p=R+K|b~Nz-R)jZ0BOo^V&gJdKaB6p$2YO95s!j*L>f+Gw}B%HFDi0G6~Ydt;72N>Cy?0H2Kj-OAh_d z^)YymPn;doJO;ZTsFfnc5LP4~m=8iPYCcO$90SX{R=~64$<_k^Owcjt4jkuyd2D;Q z2k@b$rY5qCKf^7;!-ripYW_a&GMhh_A?#R}E?ru2a6$sVV)OESQqnzaaY%wUB_)v@ z06o?U#CGq6PuObmEqE$i3voDRVMl%9CsgHoxu%+Sc6QV=)@MflRL|^&PL0_Q9_LL5 z4Y$;G!{2CA7;c5=;N-)@zhPq#>beZ^iyd@(TpT?e-Sf)9CC8mQ4JAu~0Rf*Z#+pE2 z{~nUI7c0r(b{Jz~Vd=&Q#5&X8w)@Y{~O(v2eY&moRyH00=r5H<)Bu@ zX8zX=JG=anzYat8g6&>cCNfpMs1ppruvVen(l|(0u)2?}tO9N61aYqhXh$GYEz4j{ z30<3l_QExZe&p1tQ@AO|yuPRJ`j|Ct_86`l+82|Z-S(G+w`9}N+1k>Qg~1R^e5^CN zieMCGCREKcT9ye(30x3(3WU9*#*@_X=XM`p6|`GQ0@?nz>!L#a!nt$(3oBq}raHoZ zXFqM|d|ZM?QOeodkFBkn`T3Kh?UKq9P*d z#SSY~jFI1nJMU+9;0}&4NGV~n2HXsY+JVYJPw!eeXn86BO+>`^`xn6{9o0!Zvd9axBP(q7Civv0CkNu4J?x^{=#*IJ_Y>@T5UcIu*zE1*2k$~Nz zKAIQ=nWDV>MCQgz-=H83d;@^0wGTVgTK6x(KnmkPx%d}M^b$_nv0%A1gAp?YTnH z`?bD$^@`Q9;KTd(OsuR_>{?<4Ws7J@Q8|tsI~FX(K=rafzmc|^CN)3b4#f_Xp-mku zoaN&}F(84z*tbL)&R%50ZsHBogeEiZeBHU0Rpy_&Fr6<8U;S}!Xrd-pC`dLeO3TM07hGT zK{3DpPzC7vv9MRpyt|!+gVE8*H*J2gOpq16Fdkbphx zr?dhY1Jg~Qv7@QUdcUAJ?ApEC$jE4pq|g_(v81H)swVTg~)Njf^lZxOc+YjR%92HaP$UF;g1 z=jBq|D%1EBdP=BtXE(dy-UnEZh!=(bHUxW{f>iXgY%QnkIdNsH>IkC1Ri$3{#{QXApdpAt!#j}m9J4C9);dSxbp}j%u+_ly z(gc1~Vj=T{ctzhC8lRhclBUI&iy2}hq$;kXQCH6VG|M9;-0Nc$lay56=YCTvXi0cx8X6id#2|Gqo& zcdPH$vw?1$qMsaCp@j{Pj6%c3g=~0Sk|l^=~gPsJ+f~?H8%3tOz5^aZ+FUpV;nLIw$~RP1lJe$xdjaMNZ`|0nv4icZFuIM7MNI4@IeGuS8%$uK*OwpTQJ}+9 zEVFWK>&i0!k2zATpf5 zgTVpUMKl8s)G|Om^ZD}*j*bAZi76>{BMWH00qK2qyJBfEM|y=|18BZvecn_52-~wO zXO^MZV>HFX3*!**FRSKToI{7jVmR{i=l!`Y%TK)+w*ddx)zTuy(otm3E%L3lc5>Sq zlPDw3MB1BY4p;M6^bsh2AkSd}#O3+Sei4A3r9Eh~=Ye=f@}6BgT}4WdMnk!PBX`f9 zJxa>Tm~}+40Kp8&(BdBAm5z=MlaJUI(TX5gS+@Oum*{@4ftCAcvDr48v zcYn>5rW*CdJ=K8xi!zG*>3OFHrVH##(^_xo1o-^}Ylc{rGs>Hr{cpy>pM!}Fz#kB- zbYtMOm;?nkP^^D8-LPWU0sd+%qlD#sRXV1hRbUp8`!LSpKFqmc>))aQcy56 zGUnVb-GzMuJrWtd^6OW?yZ&JvP0jR&%?xl=BOjww9o(~voXamL$h!Z_wx|l4W^jiE zz z_Y=lWFnczxz`MwI*i0T=omeU%o7pGQ34kzdh4 zd+fav*Qhs@BDrVRRcs&x)2&-x-rmxYbvyo=x8x3;ytbn_x0C5+oI{-|ke@$K7_+S-E`RI-VWq@zh@A(OPY zE+_CTBgXJ976&1L1C`B(T6ox$XK87PAPOMh-!2 z1(H>(g0TCvkF17s-`tG*9&*`JX}|R=4lXVt0)o#M zo{G_;aC|Bvef^iy!KAlP*-cb8U1`cnAMrNXQDqAR0P+R~Bba9@Uy(om@V%u4RtU1R zcTrL4nq~XeoxA(ww^ijI&S%NNrG$6;(p-YEydD(>NW_Ey0J#o-V zLL!%yln~%k<=#DT+fEy+mW@I1`GBa1O*%McV{3byl$5~r3pGeJ6jH@hRdS%)BgWJy zBPg<1l4Dag&(8&(rL1)1y2!#k>6y$nz4Vqt6p^oQIql7+iCx84Xi^r2qcwn8 zv^>SLW{822@u2G$Or8GxUbE-Ki4&BB2@OW>AwSI*$(fNrze+B@*!la^M6u9&?!_(b+|zaEUYVcC&&?(FZ#}bpGw#OQlXsJ}H{xz%q2pyD zjZI8^9+8-o*VTFHtNE?*Sj+ddgf2p}K^%J1O9m!uloZFL{=)`6*|H5k@|fPg3cM!) z4P~A^fXKF>VP(iNt;2XLZ5v>r5@7+e$>Rx-+~FpKYYU#FW^_fE>w+8Sn&^4#O=SJs zR_Y*G3N6NN!(yiNaW|tX2Ad5iq6f_K4(%(0s{zuo(TnomZpiZ37*Izu|HQK&ujn_0 z_^fdIww9hAV@N4X-%?kvM#YRCr)s_jIz~<|U8jl!<2Rw9DtGU?**`|(1t_1MW1+Bu zs)eBo^bCNo+kB9a5V}>ZnZMm8=qbSXEg@7_K{5db$yO6R2Y>=N z6E%uA@{J#od|1H<|YSlf_x5)YIiR0WKa$6@bblrXNE6aBY^e0&|#&i zw^x1AosY0tGSj!Z`ld?*P(=anO!gbQg5HaiWv2yfObdc|1f1Gn+0swf+MNX&0@c&y zz%ik%^#$+MhXYOLGdE`+!2;t~6hA+V66KDR75q_3PNmnny9BEo| z0OAtWs}4jXR&4ucZhMo$`vKI8G-wp5g9n7Z76q)Usp;7doy?A@uV-ezpn`hSl3MVc zu73)t!3O>mfy2>C2Ogh{L&>ifX1b}Y-0}JIyR585j7a8QJPkex$e8M~fr7sNdysy= ze)69oB?NduQ3?+WWo}v9iLqqt=Dqeuk)f5m-MaCGV;6T_NVMjEnIB@wuK zp%nzx96oYH*m0H9rxLDlVo&xP#w$FVW+UHEuU|d5=NSSI1_R>D9`^DthdCygUfuqS zY5xN40yFhhrr(sn)IE3*hkn83pfu)FL9wGmb=~4%A`h*LZyrO^$mPmaHO5U-eH?>Y z7|588BQfy+wXUV*5~k%%HxLaV$T9nls)Dprbs@!M+^c>hlGpqzY%`%3G|mwJ)L`o@ z?zCEGp?YVeukYR!i);`dk9n#Hmx+tL?)t=s_sd*MC@qC6Pe4%c!J~aH>M1#pGvEcl z-P3GONx}hv*&t#O@Fiea%C=5`yI+`}udS=2(f#|~7oVL~PwXp(EZN`MrgII)=5VOA=nBJ;k zD=B9~#&VdiV#NL>wRiZ^a~+gDOm~+Gbznrrc?f8b9-%lVBqYEcA+dOY^OO)udhCjj5bLdHx>i`nrp^sl|Wz1UN3 zr;!*298u^tYVUNR_p%oB!ufhYFsmktIp;K$qdd~S2Y-bEI4B8s_`)GMsW z=nag*T}x<2cic{KX_FbBS$1@?+P26VWhtCrb5cg!bcJUGx7VQ}*l!1@# zaJgdA0NzodwaH8ASC!D?s^%D~63KWlql^~h`7{bE#2YwHpQVAwBR@()XZ)Q8PXbc$2I`pr3x1T}k@kI=e(^*+t4 z`Fa>G>Bn!L-i&)`N$2Ml6Eg_!4juujF1SpDG+-vI?-d;8x87bXMYz0WLzlnMWm0my z#%_3Q%)@^b8WN%F!04#NVt{|~JiZV3bRbMrnhLXYxx^OS;IX{fUqeH6wYA&n9A%A3!G9gG`L53{pjg~9(Ydy=vS#wuDUN@qCZr6 zBA{v5*&91Ll;_>AK@tP}JRfkrOy7bpytlhMIV$R@N-~&H6jo4}K|zXLrQdkCI@+#g>YYWA_pdju$e2Vk& zfS5}IU^n((PfyQL5%|u5>0!Ut3VMe+jCITI*Zw=aK0ABQ#`yXAYHDjQ;5Rl|zg>|- zJ8#1M0YPhBf@@|QRZCl1my+yN^FMiaGsDkV40`XSvMIeGESrArH* zRR7Sj4J)5Us!23<3JIU`tRV3an<`-WnzM~X(a3M>PIcRFZ2kyGnzha>mQqK93s1FYlBbiw;eu&MhBtl2{A z@Rl{ZN8)zXDX$y2rfye_Ji1eYT_l8o^#wwsXhWhzM!)4Ifv9Wa-pe$BWGi%$Q z1;QkPUHfavnexP#m`e`Jrf8&z!V))xyH+$pFc*(!ahzqFN*x+n+W6DQ&&zxH6qgZI zvB)!|zmc{`dR8!ihZU zbgeBY{@3+(L_RV6-!ItWJH5+I^K{R@UJ1r{=3nm|`@g;Bzuq}EYVj{c{7S;V-|zMR zx!u=%`B=S%8;@<2$WkKe%9cfvgS8Ymu1W^{)Jc@0KURFN>pyq1KH*r_VFfDQuW#A3R3g}7)c+1Q|2s=P)k_h=>*k~2mPkxt_Yp)=#% z8&+^2gBnapDtSxeT}}E%Q8L5_6Ck*F;l26ucVugcnbn2=bKQnQlgoyR=yfm!iV}#1 zYjkYv;iE^^7M`d6V7381f6O+2jG>sPhCAequWzXi2c{|c@-Mu5jQs~QC+z9FJz4^P z^`UJ6^^g7_G4VB}*L6{Xp^*`j&a4}A%R(<+#F72*ym!p?n1`IfV@FSRq5oX}%GExD z_GzGin^IC>u^+-t19J@s=}C14e_PCkg3wOSovLC3$%I)7;4glk%17q(fTIL7l9DyL z)gL=1!3U?P=0Rh$hPxbp02YTFYO-*(D_LzdGiQ4lm^Z zuTp(|`t1K9?Y+aX?)(37S5rj^nVBKkBeGJ-9@!%^dnJ)185I#iLPDsJm5d@IBs(js zG9t>}qilYU^SbZrzCXwBdmP`-A76jmM^|?^&-48n&*x)3$(4+a2|Rje$XwKa_`)1~)re06Tm8GVgW0$^h$jL+Ur{9ugK&TAhEj z8vpZgY%32~eG5bGNKFlHCOd+aX`~y)1~f@v5m+O>jU)@uJU}%D?JsbJ!Y*d25FBkF zSpj;|^WHW$z!8r^8lW#Q@OfU?8-a6GYWtVxyN|!KxkTf6^i!e~r(=%qMbno=EK7Wk zm#dmShWHB6$y)XV!nb(o(htCGzzyhlAHrLFNdQ!7dHrC81f)%n832JpjfrNr(7b8< ztH1fT>E3sM6E;zz<;m+y8zGNHG~8q*XgJ!eNMgTz~O&BkcW$E0n;E{(V~Fxh4wFbH~almdWGVXal$5^ufo~ z>(wXf7~|u(=gw`nrJ$cL$E3Umcq{q~G^RXPGZJE>7beq0rX~(Pp?vlFb(nlITCPbn zAe+g)`@rs?^Mb(v^-|XB*E0{Fs@0^vd^v-{7OM|Xz^;$SL&P;WDdFx!jfl9XQN)6# zre+)D-K`pY?=kg1^1jvA6G~I4u&S49tE-V^ch<8GPYfRu$#w-u6Z{ZuP0dQ~hL)Cc z#9r9gywu=K(aHe0wBrsgzTNm;RgG^9c=q_Uy>m9>itd@?u{+s=2M(iVrf!z!pQ#hy zuRzjfSxYjmCY=OhXBGN-EE?1f0HdMOS62A$D)tnlao6Y1gvPI3^#!gmI5%zZyH9&A zeQ<{Q*B-FVt{sCAoB%J8Wpx1uODJdPUtX#h1mg{&yEn(|4AfMx^t@zDe(6D?wM>)3 zS2o_KQlN6`NFH$&TXuGa5;g`N85SQe4-fLw62W7`VPn0x7Ych&KA?s8zN3PZ8Q;eK zoWfC1m5EdECJ)9^|ve2BgBP-VrZXE?Wy$ucvCkHIxm#c!1ae=T5AJnhl3(?r4qw$h9^PEO4 z&x@9$s>%{+RM0vB21ZuNR8PSq2!T{;-+xsaID~*#;dd27lrZP<9%nStPr90#NOJa8 z<#u*>jeeg`e`RseJ1UTcpn1gNa1 z_ZWZ1!+R^0m}3jKHMMEA(fY>fHI7JeAjeWgU(#`sLl6xdfAAFarGTh#w&5+!)tew5 zH>76bd+EEAba&04^wsy_^x1#!(bK11NPY35d~U#V@X#UP9yCbAySvHp8y;q$7ZHkB zK3_JfQtp2=KDTyjYh_%*A(Wl30KqRkc)s)7_hbgKq=#o__~KMqE;17Ibp5OFgdoQ$1VA^wK+7qzfn)0gmQ5xDL>Ls+3W+1oVWd3b#OI+hD{)hD zS0k55@BvSW?*Pc&eLm*#?I$5I6Ms96og@yS}h1`)tElO#!GdcX96|*7fHJ!^KV+ZdrbeF*V zLT9?r{K5)2QBEGTE6JoBYY*I8ekt*;kB@*T^IQZ4@*XD_>|!9x&1Pn>NFa{OF)ed- zb2CQvBZx{_)}RLuq!4xp$qr0E*krJ$z_(c>|K?i?J~#?GI#}#c`+iMUI3#6y^~Z<5 z@F8})lmgsDMH3n(ZvCbkI6X8xXdy}cJjDPgVK?9wLJ3BocN`pmxkIXWFE9`m!=L7* z=oou?47(%Vdr2qBCpUyOS?3ub>iOi!xA<3h*;w&_Uk;Fvptje|9k9Xy@V)q&Eq-YG zQkG~|O31;z?a>YXd65MTzuX(m;IbtoE8iIKPD@U{1|XuSNG#}Aq_H#uLjn@ic8Vyf zMBNMQC8wYOYxr||IvYX35sHX4L>H3~8ENV4%uf|^Q_9rP5UhI-a*nVu63_UySmZ%% zl!W~e73F{C6&9YLpdbui;K8bPX5e$ew*#PeRlqu#Us{5umjTTUeG5`d7H}Nmg!{lx z@;A|r-hp0>g;z4I&7{wXt_X^-E|O@NvTz6YH6^fRnv#2_?D6`D{udu`zWhJ7lKYyw9)u2FiE2RlS0 zkDHu3SBc{vxBg<)p))`H_6EtmC@ozF*h51SFtt(|aPhJho;x;{ksOdn0c@TuVU&YJ4frwyTvl%ue<5rU@qw3c$fNqK-ARfUjpCdjtIjj< zhz0crtOB_Bco|e+a&q_ZzD8dk8-;($co+e&RyJj99H_n@tP9K^8 zh}I$$J3;;dX#J^l71)dp7w)?UGS7AN^>I8leEi7D$yr}n`Bx5AD?!g+Q+iL8LsCpk z>einJ4OT-j*7&s0yI>W%&56mR;|5}9uYss3!=A}nomWW66^2znc3|$+vS&V83C#<* zC38}K0;JaX>C^kNGC9^ZB-DV9p`7SezbW?cw@5UZOu_YUjg;r;9sXHCM3i6uLhkoN z)Nx3ilAcie@{r|xT%4CO0d;Rg5ke4gCG=%KM=k=Cfbt3eKbBu3(yXt@h4gs*G4h~% zaWPVyNsugqH$_qbXZ(!5fkC~MkaZ)plc>Ic44x{vLO|ki4^*+FYaz}L1^`en9UX7X zX}w;G+FNP3kD1{b(bbK1v$}$RhKSdIfLg5TRPDAS)YKueti`Xdyd3B;xe&m7>3YNZ zuKuv9k^T<1a*YLwEwU$Zamtn%`E)PYmCb1o4X6!q1V1@zX=8ssW77Rx++{Cc)cyiWh>z!{e{}8Y)k{LLZW7-c8uqckVvhsO4avgYv1D)Z^YL+F>GXRI z#pA8x57@rwtbMjOZ`i-eW$}7;L;Kw6AX)G+QIU~&2#Rc4y*5RY4$9;zpZ)wL4(-h^ zEO`{mm>1Rk*JS!X&w6EcEH@f7Wt@L_W~9)`lTdEEX%ElOowKlb5fk$j1@0V;?D^(j zMf-N$l}}4WP#*d@pi%ke_W*Jh^N41E%m+n-+rz&4PV49y-z{Ul5%d9wjno!A#uy%m z*bImKZK!QSR;lVN8e*hGwm;eU zYPIi!J6puFz*AY&7n-7kS0N@&CxbsAA~!a)X(m3M9bLy zK(zApt5*%sxmQ%2NsOZ z&@T`~O$ZPVOA9jphCK>>{qj_|C1iC3|F~mFj>Ds*r0|%^<2QuyQNc2w-2G~7c6S^g zLSqvXdftc8(KW-ac$lgB(lL!?*G9uo*5O)u`vjyk^fl!}d;Kbl+{PaP^v52)tm`IW zqOP73Yo7hLjtutAE8lV}A<6^_eTD06F(b50BErIsTyabc3}sHeqKL6VJBV!$&6Q19 zZelH@#P5cCT6gTk@XAsisP|NviKr{`Dr1aPm z`Q!*iw(i^fcg}v$=Z4G171#!v3q;)YZ|u68{U|>E7WSq54ZuLeyLRBv{)y1X1vGoz zsxN5E&n|))pfqMSU?WeEy19UQ7;W4`(hq3ekX-&aDhk3IY+`^HuqqZ8Z-8>Z6-`H) zHUy<20=@rWU!wX)8CS8|n2!)5R#uA-xBm(anD&<$guVv(Thu%TpF8V4YsT$4Gqj@} zR>^JD)_HwM{@Ii#UsmN$lMx0uv>y=$rk(NQ?jzKHIJ4BeH){n{d8mFKrY$xBXoG+_ zsH{-bLJU@wiy{vtBqa5}$2%1GV$k=XiTXV5Hg1>)6}qbciKPII2PvWU(3SEEs7gzM ztLUS^tMYPbNy&A%Ji4&(u_}ipP3^ENJQ1)@A(bx$&!oAnDzN-h%d@X`k1q;u za@342B3QBu2nOu&FF&13PSGgxyf8Se^2*zmXF1S7gyKzOYb&OiL?tCbvM5J?kPRma z#+pPcquarAKo3quycHWxawrJTqy9=YM4aH+(Cnf$Y-sV|ym$Qg(6MLemEc*x+hhEN zyuHYSM!*2pfTeU_7WFv-N0U@z{&T!QP|cSC?zxLf$bp2w+lFnS++&_qT^>mjAt4B# zAno@-#h|0Z7Nf;=97@Z^VNqeSBQZ#Mh)^7JTLa#Jc?Dr)pjaM-ej=pX_ViF4IZ_5( z9pxpE?day3D#(7mc6EtN-Sj65Fo(YoOfOJJT%EA)+6hJxvbaFZqNx!z9^1)M{c|2q zti)}6VO0=U@&4GetgMVFJ^wTqD+>}ly$4T0m5!uKu4oB><#L~pdWE=HRFx+s%#X?_ z;wkp^Ng*K@w@mfBrHL*_G~*~y6xmQA04=FkGZ+~gD}n=}yP8QT_VSf0iBVC%W@p2l z1)(y4&nGbvP#`KXPxylY#T@fTvw})s%nkD4$E3Z32lTM*5uI~1pkWAj!gm#BGFXq;rnynW;I$DLJfz+Z2wByW?eROuOg5)X z$FLS$H{l~cQr9#2$jdeffN%XDkP97b(tN$Z|vg7 zjuYT3_8&MfKg=+vqr96y6rMZ@$5g6okPWK3PoKDuACDnCCMF5;$!JLkirI|fUjihJ z_4T=L-(KeM?0;jcjuscE{?J!8ID$_(o4U9N0%j~*P-4@y~Z^s|EN4V5b-_`$9B6xhgtWeH+L(8gKF*8$Rlbf1LIA=MAb?M|ajv3}G7 zLPCbvIDpvYSR;@~-=E~+)&S;R)C{MDqWglR+#0DZ6171NSX+y@{!-k{n5EwN<$hx@ zy^_&+;#i}|jLanCKrH$yg~Gz3Cc8xlIZNE9gUKMh#{C69#p|h^u+Wu2uV}xbg-Ty^ z6Ijn753M2uF1JrX@ z#IAfr4-F&}U9)TBx@b6rE|NFky0QbV=Gw}PN0O?ABMBhPVHxyR=%Ca>spWn5Rzpq| zf3c?sGy#}F4|XU6foGZKTPfYVS&TlvZ{s$qB;w~F<00YAYRg!{)dS)gxJIu)d^FV8 zlPV`Wb2kyO0%{f+lPGM}c$Yu}LxUZlzBfZmt*h27f<}Zqf~GtEQTb$+mQkRHarBD} z$^XpD$(FNoAhR1?Lf-_b$gbVHy)Tecjr{_M3L_G_4InhXK88G7L_;kJKmxlDCuM)< zLnA=zIE>N1V;2?PoVSQjbVC*s@_*|tiHP2Y9Be6c=7NIf+Rnw#T1la*jI2UkhqNH}}<==}_89*(;=8HfDZElSa*%vsf2xbxh z%Gt`6vc&e8% zseiWj+q8qGk6sk~|0&q9j}bq5u}z@r0=zyoKHe=rwNpYIl_RCPFgetQSys!V~w~x^b7!>}` z2}s+!AATl8W&Qi>f2AM)-`LjwJM+1ibf9;hYxQf|_tVoiBO)$#wK@Hz2EirvrVp+K z{nBIqyiB6AX$$zrf^RYxlBk7*vh4N^GkmA|EQYm=wS%h$H}IE!Ok%)Sj?p_lZth8y zxBsP?e@w2l-kV-J>gE(+IDVr`WZJRM?oN~=t-hB`?8WUz#!@6z$gQ`)VL3P$K^O0tP5>hT{@&TSm!M<20bK+Brs=78M`h)6lolvg)KQEHs1`l|;0+xUA^-^M1fX6{ z@4v=-5nldncf#Aupwmb*Ny-&)E%ed!dAAxF^@*DQQuB|GzOC9_;?%yon?21k#N@dj0 zPe@Y(D>CT&ErGcGjGOznuJ^XPpZxkMre>qpb&-GK7|KM4 zFF1*x8aAwDazD=JeIqhjpEo-tKyTf_wliX;^4wbB)|9uXgYWy>ymsG4Flq%*FZ6xs zP8Tg{0?K?gdmz?mX?YE(5_&|OM)|v;{Fla=iP$SByx`==jo1u%77BG#Q0+o65Q3sp z3EL zS=-};XkXl;K*!LSeM&fR=j;>2pyFGwkjP{JqT$54;pWy|AyI8K3rF*-O zN5~qEd@qi=|BNQ@tnpkvCoAVj_hbDXh0oXm9=n{P=hsMREtmd%p^0f<-+o4!`zF;l zDQFT_ne}H302SbK1FwSBiMQ!w=Y(bkDmutb!Ke~UylBM^o{%Fh^ICNUHHdgySjdka z#L;~kYNq^awb(%D-k<`*;fZn|`fs&((bG26LI-a@ft?O#RZeG zMmC_V%FfJuME?S#Y-pL7;2K5twbOWQeZ3+;8bT5869x_*tsv<;ql*_Y`vqAb`Q6)z zEUo`JJXU5`{(N-DJr28=vm5oDvvZ4!k@UtVx~}Ohhd$7yr_HK8dbGc(-zRI$F3yoB zI4*RcuijwT+afBTYafeFU1kVzFuT_M@>9pRbjn>Vhci?6T`LWnU6?W6e{3yvrVL^bjAM@2&NHeLQ5mOfl&#SwW9YL!As z*M4%wSrv0YZHM~>lPL&dJpu{ljfm*T#Kf7A5qV}Z^n2Jh@RLJ|Z`Fu#ekfj0Q*)y( zI(2HfEm;A85XAo=8`_1Kq`kgjNCGqqKxr{!00lRm5ayU2quhVyk7;WndbbNOmo+v5 z96Ufw3^hM;0FIP@1+LWG3@?^#d$mM_A{q!`dir=|dMSkiz(#uxzdcwVO7T*x*Qu$? zfa%ag1l-Ed$wZ3=`@>Cf9@_tO(6^mi-%%HyCq^t_NpZ1ApESI=h4O||Ssc_O4 zwN-iMrjje|JN&S)KyRDrI~%K#-2U^1O)n}klEeK-{EC0=`qkB2;(?XdaE zRYP6xOmd}+IkkNinFm>9_4M6oY`=DuM%*dG>VPH9w7@}EJFnj6$8$lPrC#;9*iX12 zQB8sIH*P=+MfhxLYXi8J9t}%M zR@OT72p%3D8W}qN4{@eL6pX9EZHh1_1n@FajgsQm1(P3EUIN06AuuouDTjX?T|`1E zYI06Wz1J|CpL*A!#io@sDG ztQMK23>zDcA#j`R@n~os@;<~U7;^Fjtb;v%cj$y+ltu9fsu06JAq-zx@c=!Fws*%J zW?q8U^J(Dgq9Q_SDb^pcH`2jzu?cL0RK1O67M zpwzssV!tCy<4R0eLSbIkV51r9f*EDkA|+i*cY0BB5EEb8JdKxB z*@b4s=J!eVr_I>N>%Y=s`VjylXiZLtdFt$EVu6e$9$Vq~PNqJ(!-rW)HKs-}sT5}r z#P%OQ-i0n%_63d#bQD0qiXWlxgtp%kfG;X0Ahh&+)GDc37~qP{2Vk9^5h441Ww&l1 zmLJ`HKhz*0f|AcQodgz55fksmvjypMw8t;0QI+yraC9br9& zySLZ`2q?tN`5`4fyoOn zavW$4luIa?I&@;G2BUclaxbA-c6$Ba^77eE@5OHSAMwoOLGX0xXB%Qp!g19npH(>t zDFO)L6oWJZ60=?^?bqq)#QXOH-is5z#_``4jc6|P?z25B`KS=6_>7-Ge@E8d*@>u^ zbkwZE!%A%JXsPi9=+qkdJ?Paks{qiTkA!Lm!CmibthxXDR3vzbd++4jQRM)SO<=4@ z(|R4jCQKvW9%QX^6>BbrSeTg+?5?1>$L1cQl~2%L1GJk$2^&%~6m|ty9y4K{aSzNA5If?-l!W?I8;nLG znkwuvGInv|?GN1^n*4P}k(q3RKw)qGiN_q5@&~g6aVL2G4hS*&JADAt zntOX{3Dc#p85p*vha4YCcVBEx9GbOb*oxZw?B>9boDrDDgallG|5DKo1mJK|F!Zf_% z1;n>vgI7R60GT1LiSVQl-SM^wO{HW?LOx0<5Oip@%S6APb*TH|#f>BnNMKNZBR2CS zx}us{1CtM7;!hsB@GE?vqA8~NW7JkUxx%NM!cV@|)Y5_!lhv8hS(thptgM#U54PRp zJi&d;KPp{kN04kmzC3XTyha%shh@m6`E55#K1n_g?bj^RcTQWRRx0r{OG|hKIV6fRons(W)-=p-TJ|tpK-A&v$~)_?v^k0*DpOY-!f!%H|esS z9dl2smm zjt1Ye&dMB@+SGGdl&|@nVhOqVE8JN!firtFN1ZK(;@>|HiuiJZ;eY$ zzt4VHpON zIH_%n(6-K3o$2sd8c%&8dAX=&qQIf0Wt&oC?!~k!khbaR9pVF=|7ZcG31L`RyKPRI zite7@gK2kaDohU%%k%Jfn%G0Avy&c-nW{2jv^#f||+c2M`QTFRBG(bX|UX+ki*< zUuWQ%v`6l3sufD!ZQK>PxmTf+6%h&b>N!UoiunrI=k4*Zn&8`@Oz_4g>n&sdaqTj2 z9n?;!dcR}u0`dV6+52a8x`L*#3R+>L=AvyNNGXG((kgODe&70VVs)kI`EmU|Bl3~h zVd+a{>oNEHpku(`1!!zGCN05C2d8=!`9G7D&0fFzdED*~(~m7a$bX+`d{DYyXBm}n zr}9_Ep2#$JH*PYS`zcu}q9W`M@86%3lV%Mn?)x~fqp@X|%DYZ|y~jtz**H&(=ie}M zOx8?D8Ssduy}o<5*&1iU@QWIO+A>M;_*22%Ou|P6@7!J;Gk0>$9~$t%KIS{bc+6i` zw@Ig>+bp+WzlNYAS@*V(xg*NG*w|Gw5B1d%yjs8lEdJm!fV{==6Nc45G42)Zj+w}d z@Cu-f#aPv!(4Ybg3m$lf2}jCYlt+X^;#OAF3qK{^m;D$P#J6R6MpEcShVsP1qOd++ zmUoQ*03{{$k(vIQ)|Pxy64uNN7Jq?=^eNS=IKG*VtC9s747Q5xn-4pFw_wjfhq{i+ zU3Wj0ox|YCp;I-NMK>4Z+*PA2uikg~dSykvcJr2ayw9U@nJ@3v6q9DZvfJf6pLI(y zn9|*HBePJDa~-lMojQF9)o6C(+u=cxbH{l( zRGmi$+W+>yH_`Zi1{F&X{FX;ILc@94XHE}oJjSLlKDBt$ZFbV6v8G1uPu=qX^n@s> z;KjtTWo~8FImR!~i%Z&Y>Qra!YcB+~0m~1&Qll^AiKaDK;g~-Hd+5rH!5cvp7*1x9 zXMhc~)idpQTb30oofS2sI6!;K!n{X+oI2hinGfmUf+tR7)V!7aOM#~N)MKLt`qlM^ zjKW8QC@t)byOXZYHO^ZgKstE-!40%s;Y#t|L@>{iS|U62ITYjYO!aMW<)V zUMGE2_$B6m(YEB+*kS&F?gl3-o%^CZd_pHRMc=U9P|VuGY=@IzKad3=K=Sjd7);=Z z_av0`_#22-BulP4$qEYVfBC9F91;59^T3JMMI|p@JPn=PEhopZIKn+iPdUA5GE@FU zQOA9Y=hW$DK7sm6pLAZt#oe#r5_e5sYPFO&A2_Z)caC@-+N5o%m))&Z?zYbysBfvV zX55T_SmvWPKj`Psa@s1=wscDJvp}@EOP8~0$A!et3rqRE46+3U6kj_jnWQwYo8h=N z8qZ_=%EJD{;m$UGvrpUX&lbL@l|>}qH#E#oYEGFuWPewPuIu#ynR?Hxir;#^Ui#Q$ z4@z&)ZRN9$Tn+v+OCiKHy~B^h+dI0R@`8-lpAsf}+q>5TNV>*4^dq#d#Q12Zu=9SD zW$kI8D42cJ^f>43in)m9dB3EX__CS0Pm=Gh2ZVPnGlr85z4YP~-`LyrrDbNhEY5pP z*?-4-XO%F9h*F)nV!O&wvY^kykxe&T`m!tH6D8&v$W&Mli;HD6ZC73zu{eE=JOA0i z17!xkCrjED-hDe?i})1pswBZUEto)%=Rg&L`f4s063si{rEx9`l1x72fQ=C9dyt%U z--bu80p7Uk7Hh^OPr!Y`vA22BMb()2L><-yCOV{!mw!R^X>>=)X+~8xldl z17ka6duSnGRUrgi8IE+W&2Z~&78)Q}7pp@KbUjZ`;Naq5kScvKS6vOp$)ft z3pp9YG0TXA0uu(P7!C&3tq_R-bIdG50S+}SGAvx(-J$6%2Z3oEDZL$~+tif0&8^9) z%*FL7Kpy{_oxL|w(V(^Jfcx|h>y#|_Yj4-={btey^DB58NquvBax=QBgA3Su3G(s*7|2Z1()N@vOJ z5{x*&;@!XFM*gv5^)FviaqH7J$MLR{HHI?g8x$MPKW6r?Hs+gNI#=p~b1L!}fZBud4UQ zB!-XsODwMvclB`CHr7s1x0af{&*Ttxlc~0_<}vXnn{a2P*$xP>eKK?_n$v1WYX11H1il2cx2#V_d@8#(^&;Lr_xP0Vul z(IcBPhq8Xt=j&zvvbMD^S$1@KL(e|A$mJaPDD(l&>7c+`*xEf*z6rL;c#7Aw2PY-y zu1gnB=AB91t9yOS;f)CM^~e0jSxhV8f>3n)!5sUGKXdTyc$ahkRc&qmBW?~9v&B>O zinV^X+|S*LI>K03tEOgt?~KU0Pw`TMOh;K#*BWVTV}-4Pyxr1xR{aSTM~Wy)+nkGP z%n?)DVycgo7Ijh{Q5muJPGzR4yPn##l5z}N&1AA3_<>66iFx?%T5sF=pN3NJ!W_Qt zp52)EnzJMy%E8Gk%-Bb0%Vy7{kB@{cXV1S9FUUC2w7$HudXrAV`{531r_v8*S}-_5 zT<8we1PLj525|nohpWo|5f9^uCr||9_?qo2_N(y1A;x<#U)E6G-Ky;5*udOX9;!+3 zQa~kSw6FGl@9e{ zo1;mY5gfB@@!uaU;8Sv8D!ylFdE=97+t)+AB8$r0yd6!B<$Wo8k>~tyi(irm0qz|= zJ&;fmW{t6tpWxtl38EG#9q?kv0r{bL-iB}s)O7o}8~m2A*+Y$i<*i%Do_|O%LNV&r zK*TLaJC|Lr3k%(=LWA|&H-5vL&&0&EjkkFB?v6YIG@}AAtHXIXxSMk7l-z6hKnNx{ z&}n%FJVLQROqWqrC=HCvjsC!b1h)#|ANq7M84wx9NK8sJ zqz-P{z<>ZlBO?My4oe0^a!|;FkrZ5CFW5c%7PU1d1i}*nknbS9D2Z=J%y045b5hIA zPy{tJj6;%%w@GmDRDse^s+0V=&kb@qh+XoR5mJ|Uy40_(&W&f~G!u(|k?{;Hu7LSF zI(M}$MJYep-{$jxm+?&%8x8OCjqmp;{mG6cXC^MU#xdjR0bT%tj6iwYH%5u6JpgobWr+1gLyS$o5_yh?3cg6VCiyuy#0c%mMdI%RB$>keiA0#E8sv#pFj z2fcsx7t%;MC~E1)Y)}4KTJ?GVz|EhG|JZ5A>2Q%CXE;^JhqPZ_cwtt4Km6#Rk4KWI zt<5~sy5uO`GZ~4~*ISx4%yxK;+Y_@0#;YBWzUaB2-YvwNC?s>Af+=3eNeG9&D)Wb3 zcX1_#{MiT-IW6oNlKs)r{ovk%%9ifr(m9vDhP^t{Sj5z?62Iot?%{Lc&+!{nA>;Zv z?~_hGU;E9i%0}L9CqDUAfa%O5$z48wi5)%NfAzfsDwT;>hD%E{*gU6{FS}%pZKq{#~&n{mE3-(*JKl7z|*}W_)o9x$J}5?{m2UX zDz7Cn-@cpU_T7&9qn8bq*}sVKkxKveY2W4bD)ym#Bd{1aXhG-$Grsw!U6hUHv1O2wGBrkg#VmznijOFV}Ck|9#_iZmn9^ zc$a$iaCgKC>M*!B=ie;mB}ccv|* zn>ao&8CCOrMzC)!Muy`*O)=9hSz%$8dOr)99{6KXXcJy5!;8x2rc7 zw5{L8rpG}{-nlh!DRa7xU)bVc8lFT?)S->1m(SUskWs9*Ip%-gA?ZQavnTOc21biQ z!gOD{xtdi=PmEms#BbI;r+)iIQ!gIR9$19Ogj>L>{l#ID-~nL=!wuO)8z_3uz4wKIH?P zE47uQi?G_Nr*)v(=U%^(TC~us>2?;?Bx^JEf%E~Z?>SVR(A4aTc`L)r5 zj1(A2fMb6Y+BO%LdA$0$9ay+X1wOE)xp#AOdpu&+I)cgA)=98H)4|0wh%e z7>S4Baf2Z{d>LTEW{r3|UH;H%IUH;lxIwt>5>+2FS!k<_Iy_0w8qZ=S(X|m6m}X4Vg436joZV;LIQoVnYTgCJh6|M&5YzruQq83#*G=!n9rd zW>35;`Ye9aA-8jFSfx1rRPM*5!HS4rgI6!SZxK`GcSKJb?v&amYhj|PdG1FTPV(yt z;ku5^CtonVTshg7zO{T@V7&gYeeh$RaZ@Ri5C`k;V_ptV&T72(fbnF*-|! zhc|D{^TK74GyLlF+O=KPby?qf{uFtuzsZSzmLhhoD|q5m&V;h^97{uX+@K12pzW2N zXHF?x$xqC*ZT-}8?+Krw1*|RB=g%uKB(1J!&U|Sej^Q(O{vESLX0k3F8~@lr>Q>n5 zp);r+GtJ7H49b^&&bE>!x`Ym~RWIfXm2TZsc5X7*5yUp)iftsbzv7QMtES1hzckg< z%52rWLZrXZ`YDGOgppy6Y?ZBMYoGN(tIk5opk!Wsof&&I}q z?#~Z@OG#Z@)%x=0IPMItjPy%8&W$J4p)x$E5H=o4o0TGyos-Tf?pZW7MY}mq0ieJs zkDZvs{N~Nmkr^yeMT8)b7YiZ{7PdE#>kavHhIZV7Fz>Zext*Sh-=M%4Q+G z8sgxXChT$lZu5#)`^}EIf$Q^3`olg62=c&@{s3%!Xy|l%>H)?Sguiav&c3gDA=X1A zeXH#1(Y*?@3e;rhb{*z9ESIPMD$l!+#*#lMsP+nv-4xv|Y7r`pHkv77Vq(RZenekQ z9C|F<+IJ2v){o*L$+8h~I~VJN7IyB{emo`$nMcfgoe7_Qcrdpq&Agenv-V zPdp;6pw-A=U^)`rI{L=o6)NLpcvmuXOtJM~N(LPSnhDx_+qYK`N5Ln09*4Zy^5rJRX~rX1k|&H~VjT;fogwgr#hBFuRr>1%t~-#O>4 zd)lp$_|^ZCkgizz!&|v|_T=-w5^PzxDSk0YTKs9`$SnVhCsJ2Vj_Rox2X__|^$G9a zpO(6~S;<zn;IspuGvDUfLTkI+KT@~eV^M!~ zh{0Z0A_3vxFPzT~y8cBHqNVNnXNu4F=mSxO6I7P=LR_KKGtXy6E<9`d#+aC?U&)$M z6Zh;5Dsy8&e zp31IT%D78{;j!|)R+;=lr*r2!g6Y}LPwhe>ixImZ;6RUZlLx^JLy(SwHAPMG!uqbC zU-#udkQ1&ijpH#v;7Se?TT+sBQlLdUL=uHlEf#Vn=iM z>R7h8_nI4YQ|GSyHYqk1US*5R4@4%zA|tiWo+Yxo zS%}Ax=n;{W#2>A^Z`Vf@m+<^TNic>~l~gU%##rhE#|!eM%p_{(ks0aWC+axJxg>uG_)B7M||*blSLll zE55-0^6L#;rXbYY=I<+~X0El61<69`!570Ft*l$egOE$SFDs3+3)QKZ{3`GuDhS4L zq1g1g{qPH1zm8c!H!*VNEVBlKa!>cKupO)s4`Om;8K}hk_O$V4M+wm`=)36ITz88a zHuVktYiGo*pBN-tycYFjPyeOKnaRja+qq#_(o2^` zO!M|%d_`gBHZzvj)z;P}*cLqD;I>;GbA%;tOsYP)@4=oW{@cR9h+B@;fF+QKqk!R} z$^q60uJdMZ);%8<6a=YqP-SAO>#ule#xSJiK2dpdhrSFhS{!tzJO+m!lIMJx6agCre&0S^Y9ye?F_fE_8Tk zf8!A%y&XgoD>c!B<^dt)9gL^`%5z|u9HZeg)uN>`WLTxj>bam1{Pdfb;Is>cPDMK} zPuF_Uftl~Rg*MCNA!LR6zKfw1HXB7@4wnqJmdy;ykC9ZYGfr!f2PTVH=(Myr4K2Cp zB_Rt7{v_)$?wO+bw=ds3x_(58u@x8vrfigyz*5RU^bi>}WW-36dN#p|ftWDtAm$-7 z{SO!k$N=f7sWB;}_L2acl<*;rHph=nthp?nMf(CRF95gJ`g#rT^@$Hb$M{QUW<&;y z#^c;COz)>_r$i-2fTs1QA>0Ma-%wwFwk%LWO)&&$x^ike5>uf!l}HF1lb?*f!)ynH z4x`x5Zo~nxKuUsGxl!`c z%yeH_DSLM}S+qmR*71N)wT1WM^=4gD3~%eydCI*6N8(4c%+qIXGM{{NL$_|!_Da93 z@F*>xY5Q0d3-$gGev?bfi=8wA#43xrEcpi4Q&WrgZm2kK?`s^MxH7|$^@Y-`j7L+@ z%CWqG^W?Q_b&_|~Ow#383>@x06LEO^CA}@wOwKQvGUS^3G^f~g^2f^dHa72hd$~<3 zxNfa<3*Sz8ZA$xx!*+Hi?#T_Zpp-MVuSWz1mPAY_RQh{*JQ0z6Um~%_0?J?()Tv<3 zbe)h=QwH->wPSdLm4u|^F}_$DexP0vv9aRtjX+gGMe9E1hN*x_Ri2lU5KTd_&&Tg! z3OF~H5Ih>5wVWvQrLF4i!inL=Whbtoiybz;Ip0@l&*eUNYf!r}qRADFu?P?e!wD@R z5vQCAkPBS*!N6lNjZhxSvT9<~Ir6HIIQq5#`c7;x_|m{v0=Q{yY5CI8!HuMf3l|s# zE)m5QL+<%bk6REU(0)x9n2!bNwGA!qA)5R1M{g5xDVJgErsH)d#&@IHf`c#~vu0jA z$7DAEbqGNUzJH&She!5$4txiM1!i*^ClZ1wKq(e>GiRNEeW+q}gq}4b{q^e>D@4oS=RsU!KF#PHQ#J2bn6x7sp+S@ZvFN^VUD0MI^ zXD<S^p6++YZ^WmFZ0&R&egp1ki`BSR&(wl8Ekmo71r zlm3OlYr8OmW9*AWNR6wDi)I<3U@_H`djCCA?e?=|h!4Nxz4uwiv#|*mh46FKQ2)P%m(&+pW+^&^{nFL2CN)y^u)vSky)7OGh zDlvcjdBiTIqZe9BmyL8uL$`L~d~cHUxa~U~ToPXzHlUMjUKKPkVbB^#OcsoL@aDd@bNNwVsF0`SZbdo*Q%eTVH3$D(r|oN$YLLvOo3} zdHi`pW1fbVPu~}fW)cS`5^CN~K95q&^?xI4;mR#7C#DAq4C2y`{&=T=`J|5o3p|P3sBC69wL=Zk_-pRYjLuJA6WmU$o zx~}f{v131hC&3v4r4H8NH5ZqRG%84=>BX)x(}h4Z{x{A2XaD;)Q2sth)TIgiT zyImx*=SHVpet>-c^MR~>c_O0D?|r{*e7K4CzoLj@?Y2}r8rGagaW74s<&GpWJ4&=) zw%w!}pVUi^-Sv=+tlrjuF9ttwZT3iCX;p>$k>q#+p6(QlE%c3`a*^%aKbxRf=rt|0gc-Pnm_wK zj!224(WP*)W4Kw_Kq-9j4k^6A#ql*2!-*k4L`85FLJ``$~+ z%lewHzm?{trx+A&KMg9p^7TFcJF#{P+C?LOj7<%y1~-JyIZ&3BMf3;!yO^dW%ew!b z*2RnVSFXHX%inj7EMN3&-x;KnNipW=cGp&r^Gc&F$?-Qse;B>zioj%oMJKdLM z1wQZO)U0!n3P1=X))4WgPnbd{p_3+cVQ=>Kq&bwr85u#KNcx9OulfoW^~@wkm@JALW$^4LI$QPhv_}YaYwrU^_8ml4 z1^EjkEMMg#WoL7PzF>kcHY_){BW#Qq`|f)6s@VY9F1{Rc)PHjDAY0hTXho&6LBCS(F|r`5_YR>go%Ytt ze#%$2V+)4@-MG43m!%VwBJ()U5uc>%`mCtOL1vpG%y6{A-D#hW!?hgqgm2EfxOTJN z@av1)FSq_vv0YV_nLI;OeBWc`cx9{Slp#W*plOdiJ5B8nO;%m4i!fO36MvZnsHM=+ z+8>Ws8BAX=pWWn!YD&<-NvrJ#s{GeYrm zYeL1vxCA~@60)$T)p^%9xL&%G;>r?=eU-p}oPjlk#ZAH+B1Zth1cy5`7s%$jkk%2y zYcw)6)Xtb^ZEX$U3C^neN!iPnUsY82N@kO9nLCmYXWGv3;lj@`wlU~_7UxN>&|x+0 z8CfvdCUp1K4PqUxO_iEug_~^T-#>ozSPjmsC%&k(uf*@J{3Sa|46lFI!9uQdqlYAU zHbyJ-jAu@WurSofe;Q&F&L-3I7+B?AI_zn2-74k1O#PI3IODlxsW=5ggNNmw)+R1_ z(+$FEHU7~MYV{El%8j{+0lPakXCDlpSQw%A9rpSe`d}is$I!)QPgPIc*)+?`u8Wrr zw_B(Qh$w{aCSrDUjDKaEEZlvl!7PO`C}s7g6$3;5OAc9PX6uuIt8uT5T66Q{^!TsW z)U@CAqRW{~+k=ivB*29{s8e-pttD2Bygw-NCtJKe_Pdt3tIufO?f&wns~Ri)n~ zX2?|cYiLLJNc8RvneK974n231H*|GE?Shfmt&BuQl7wWW$OuV_vPU+_CVOibNs=UG&#df~ofJt%_6S+o zl)as&`~LpU}!#%H{*_jSEq&)0K2na>GnP7{ZYb$ zI2w=Zk3PC2?DcC8I%{RP-vB}a*dPHew0zvn1wjkj(YW%3n6BFw1CXK)3#jMM8{iL? zcYZW~s-a1?o5@~AKfJdqsK zDS3BZ_ZRiIntjp-58ggo-aR}#v7G%rO4caMlK6T+Vsd(j=QoNygyf-lz&jfx;O z4tY~k3mKlPr$poPVq!9~#Hw2S#U@!~_Y)p`A5l0IKuX2M^QI!JUfh`V-S-nqcPkIu zC&^uF{=+XB5yV7#KyPu}pr|HV&%~R?shzjR?4M`ix<#eGR^$if@8O+tUAASf@eE84 z$v536h8Osp=1YZ5iXi*T>fB_f)lW8oqD$Y4BA+3%0rEuH3IGwu^)cqtXuS21F&yI& zgt}pBx$p5V0=U2g!h6jkg|^CxNv6=pcc|;`+W$#V57Vh_&0vB%2&S;O45?OorDH6; zAbP^M_P0bHAA5qt1IDk&0Rao3-(%fEL819SgUP!V7QGvNhP-S?pW;X*_7;a?}=O|2-m=XD&G|Ii0iI?V+iDYP(Ee zZg)b$;r?^1+%yGAjm!tsj_>l>ySyhYK7Ohp!s>AfeM|OfNoJEk`o?2(m-HoM&CM+o z;$F`Z?+$1$VC~rB|ANZw(TF%-)ZVMAq0<8?L!-XM$NhPm)0jV9>XSeR$w*G);LtW3 zNBXr-#@OaE#5}_l5*a4^j6q=PUX|;fH%`|oz(I3>DN56FYT-P156Q-D?731 z$}VP~&tt+JU2FJ>8>)Qkq3T0zp$9o2Hq1qI3+ywn$=A<5w)bT%B(9H0YHvB?T2t_p zx-mN`eZxgelHz)R@)n2W%7Tf+5th{0e_Hy=$37LI;_INK-b3RvGB=U@b&zDVBrb<8>ZmwC83RvU&TW0saxO^Se&| zPA&W=OY^xB>t>Dp(=gh4CXsZTHuJ4mi+@lXYcxi!UL!j&(<`6HZ_9R7RrOv@bX?9{ z)pCD`@Q1+5zFC@NY3A3?N-{g&-K*UHATE6mF;UTNHJeS1uBvutLj#K4Rf&a`zZpb~ z^9;|_xIU>3vyVH>VB=ts85$P~vybWr53!X1L2RXqY*pr|&U*^~TlHKcXBQV}`|>r5 z&%gNM2)7PddbgM*J) zBw=6H+R;$~=T1XI!+GZ>LBm1m8!s;xE1q{N^-&IF)k*E?htvK}-fOKRwjKv$j3TUP zVBlfrH>S+9@Z>?JQS5CmZ|~Lhb%8twRZ7ISDc+LyWekx4Z=RZ#_UW*zHzV#DKTeYQ^6Gvh5I-8WafXE}VuD**;(r(;#tuv!$gcULH9O>S76DKI z@~8SBt;-PU|gIr+g;%Rmf|=3VzYt?=D=bHU9fj z>g1)5_Vyu}+D022!KFF7UA0-EO9snF<3)77g+B}Lk&jt%sqC}A9?sQN{tSv|+vlUB zz2`M-qwn1cHj+DA=2~ODCC*2oQ}@wYxiftDQojN$d~ZdXDBRosATRj^gLS}=uu^Y5 zeVR38>lD3OnHEW7G-uJVm{(68DyT1BV79GeeVTECqNG4s_Vw@4Q#YetT&&NWsiQnc z#l+bz88Ua;^Xihrx1Ng3J|$@Z0Rva3gERYqgl8nD?&jubkZ$b!a7A7*Uf763GFFV` z~hEd zWKkC0rx+U|XRwLJmi`fTh}W;%A*+IUMv%bKw>N=e`n=2fEOMVf5EmDRx(&X5ELJ0e zh8v`ECw|^o?4Lg>By_raBHhK=I(Bkr!uPNdKGtLqNCLwLTiN9)H!XbBh~-3wRLH0Q)X%>aBMJWG&gS(Uedh!JV3*# zt`Q#b%JHM<>;qAakJh!#&r?tD-d=0NSmj41|M}S$-%|s8-}x|3Uk|3FxZa*wA;!WJ z=KMg&RB1K1#`|<2b=2hyji1)F3c1k&4!Rboyt{e|T7{B_1iYVK3jRl4t9NQt2e9a; z7Zu)2o@rZtf5-E^EE^0K9XLrm)TlQ83`M`Uc;U92jdSUE6;hwZvIgs@^ZMsC7>qc?yVdu&77Mcp&1cOcf zRP0rj4>~k-qurmni;g^j_iot5vuR^fCT*sKkYrmsURxC_)hoY*uly>LA|a4ElKa2t z_F9P$F1gqzv3Re37x`zKaf>`dlZFg>C4(bFlxZUSBjJM-Uz5P4PCC<9uprv>)cBc> zf|?o)EHB~JijZJfGcLB*;WESc7{C%n4)C*Mv#|yzN}8RI2q}{YCqxaFqxK%_THt32 z9CQ}vUcC(qdwz^}pSD18BI3$tFe=b39sSw-!E&?ejDVSBy47(4J zk%@S2m710S-PjGkEBK56!u=TfjP6p7@;e74FoKn(DE!GNw*rY(EV10cXYK3|1hwP0 z8y?!SG4JCZ5cKNRQ5qUzf)hN1K<3OAAUY}iK*R8zl-SF%-620d41CWR=ly9ul$ku> zEWspsp~t4fvfydIu>=#E&b6UN+VtA9_4L98>{GI}>ES=v72mk%94_m!{c-*p|8+qZ zN(=KJEabzV=HAoyBa9b26RK>_dM4RUPk=i*k! z%~WD99b=@ZMfS*c{F&D1$rHbM*!N1nD^ES0xz%7I4;927sx6je1fZANcR z|2<;D{!bXOozIV)k+xX_+vVxn-opLDmZdiQf;B0w3lgk%S)QNR9ZL9A2H~sia2#i3!@rxIMX}1j%V64YEah-{HZgJ5aIwCu}yi`_1 zA|rr|Nih|tE^LJ%F@n3<)2*GPDQ6g!Xq>3y>tI&%%3CQtMoSy^<_&C-wfQ|y8gqQo zP~4PCRJc?67#J^7?|@kX1-rs(M#RaP4(?x&5Z8-SFO>vXS@#J)a*!|EtIgXqzGI?y z;-Yno-jiCFqATS~R^$X-Jv~ejgCZl#z+W0B*7xibI7Ey=1yP^qk>p{0{qnLHSU1 zai9G~*q*@xU$WHf%uyNKWcY9m&8%vHb9 zKIS{JF{x_n(c`B^8C2Bmkkk;iU7VOwV0ToipY!~>^AQ`$CzAS$4*4Q3Kj#X|(ly30 z2%@*@E127kZ0n&^f8WB%afph8XHD;2VFZ1V-V%;P`(o-H$ z!d%+&ZD;i?l}Qd;_$RwAD7vTi>gk4lC>yR-b2e=7$^UA0#kNj;YOb zCGqRCNG38*=L~;MXxeGpzAMeSz%*n>aruw&{nvCcQY{0?pwc)k&!;T6G966C**C7C>JE$ul z0;PaCAJStv&hv0es`;%&=oY=tQsXzP&1u!wN@gcn5sT3!35h?9b-p7sH~%Fp?qHCf zotyiZamQv55h%Fz3JRj*9|TD!pc5@ADq=FLl=8L%u49kA7=!LbE-#}NGtPh00&QUE zj+i!UyA8U-b~wN>nZEXOY|O40tPE5RoV0+Bww$ZVtD$PAJ+DtR=XqS?NA~RiS-W>~ zwx#wpORdLv3WFT3D5U}?$0)EYy5je9`u0kcK8K{n3pc5D1xeqmiDFIbC@ytt=}yy?d>PzwLQ#kagTR^xcTyjxZ;qG= zD!z-;@-3@1cRXw_;D}LJ*NLdbEw8K6{`^-Mn~q^dh_hdC=(NIdwy|Ru3YJ1MC*`93 zZr;KlzEC5VEcXF>??#o)WPHur=fb;QCONI$^feO*J4oM2iitWt66EF)9xV050bIdn zjuc|3kU$al?%i(~E&^f&`bu;K*(WfQ$V~bqVVv5}t#4^r4#5Co zo+YnKCbeKp1R+Cgs^5%AjAQ!hlj_Jn$B}`(w77URFPVj+wy)0vrsz87EUuzvRaFPbvd<#EtOsd#TqsbgL{ ze{ZX4)5NxdDZG>Lz-37XKXb7cmp>2oeDFqISzq7b?2Q~z68r8wH9dV?S?yPzw5uS) z{{2boO$XA<2oE&5uxGi#V;6UB9C0Wwo_Iy%78Y8qdRg8YT{sSd0=ZFC zGslk}g&G+~{b>$H{?#U&PNPG=Hb}!4oH5p;3e zVR_A{9cKM=x0D8Sdr;jsNuJdS#`gdFH@r{^Gdhc+MA>nt6sDz@Tdx#i*gvWxmXuBb zsc(QJsbt){JocYi>>s)_!s8Hrj(r7x626bO_~S3&eUUYY?tLQDws1nf)O>GCW%fw3 ztOO%D+?I9>s}Kl#!Kx*nI8u&*&$tOmB0;)>+q(sm{(W{q2Ch&cl=jfZ51Ga{?4Na` zi}2hPStMfz|LZK>UDYg10gq}5s&*E~|MnPn_?11q^ZNhyM=||}ZnFLV_eWCC!?gdu z{BZF(g!W()g}nLliE{|C4S@xq( zcfKiC^F5^Z-lq_mL@bABv^=0P{|WoWCxgVgz#6a(dSF|HsNRVQlrwgYTmGgcFln0+ zb%mqYdyV`FNbTS;o;EqxR@;}&*?L=GKJ-wQW-0w+knjBtca7VR+B&q6&zkfK)#x*rHdGCTvi$JSOBS$bwwoEm|yF!r+ ze^00<%*-BXCLSBumicVL5ckuiV%kI}oIG&r=SoMWgMFE`br{jxf|sKWDsVORE<3>A z8elWYDYxF#wrEO`qC`ti&ly|`3hwv;{c{j zU@Cz(NJ&NY`t95CnVBu+a~=8QUkwR_hjPB~Wl1?kcwl6HGv-GHTY^$M1T7qImaAK{ zemFXTRx;DqYvp>$i*`b4aXQ#@_=N&X>gm|QFY}*GJgl5p@rmRACS=|@S>I@uClmK- zn60ocAbFT^wt2kz4WMScAi@s#%qGD^%k#IVFGF7>+h&@7(rI+TZ zed|-5snE^e>H!K}ZEb67@Re4>e9pvV5i+zY?~axea_~pTG!@&TWzS${$z>}dW=UoW zW4?b!Frs9{K2nP^XHrw2p3{0VHT3htQ=OFePJb`!&3OsD^T8{mR}*L~7ambIMtk3xr>EnPevN5M3$t?J4f0IZzacC z;vWEXneG)oXn;WOx`~1Zc83tlX|F6Ux%;EB>uZ{wR@^vqir`@55tqKT-lC4-I*c z*l(K@A1OmlP72?aiEnmPO6>XA)eL#Mz>kxag|lD_9XIJ*&ZNVZ+E_B>_Ikmf&tA#= zZ~irV#>%wzI_L( zZ%;*@-8SFz)~MReaNQI!$f-g#7|ulU-2Dbj1P`H79<|@!0JK0VanI0@?=JJ2@@dVZ z9JYxFKSAA&x(F_CzN(D>Ia(=(#YC~sr?nF$34bUl!7pr}SHwZ+v9;lhLtC|j7^l}A ziHV7WcE<)_atjYwPc=cPe7}9b@aZ#Z20UT=H=OBkaCq5*xw=ZmFsk+Gccm z-mInVPB3-OLWcncC?v?MiJashyYlZTx~S-|*C_)cwky ze%QC-{HYIaU5rhBPeizFw>WYA!N^=(Zc?tJ`TB}MXdUno)vH&#BQMv_h{kB^0g`Wj zt#e!@URgZsN?3I0+NNWhJi|58>qbWHzh(0e{EhZyCA^}z-}i8H@9F3HR|*$XimiWm z&#Q+E#N~6kuEa1eT}XmF^`SthAekp z(uhZu&3+RfpT$#0{K#YPSos471T`sEOUwWF1HBhf%$KqYhbz;cc286bID6fFnw~~t zsl|4!+~}RmVauV@6`>mr&1!e3C#&{V{rYsia^{ftm@Ss1$RMuDk-#z8FWlcjL%+ZgJ3(c zi-2G#_&`N!RqPWZhf93<`b-J7_934})NS=G>7gMy$FU8s&fVoOatyho9H=5%fB3B3 zs?M!UhII$=UPGR@5I6|*@0(Q{qe5Z?v;WohL2(x52O=U7FMs}ASTsvz{SoOA@gI8>7E`Lz< zX&wJAY2xx)szNu)M?3g9@e07V-@#wb`Fn>XqCIEuU)?~f6MEAyhMBR zqpwFPeD?%NNAnMHYub(L<9skAt1;ca^3I^qXY{Fv8{5VEH+##@%^A#wD*i$fsea?^ z?4K*Ep#ug-^YfkeFYO|HzhGgR`@#qd{gbF%`{!yJF7|qsHSImZRDsE)t_~buae&wdzgp>tJcQu4>z9}SMMHTO}4y0+3Lut@|&h$4BOPT6rrzSlNUP44!)V{d-*QJ#z0D0R4^?o{=%F z`lFVC&&=_`gY?IDBJ@&H}Ih1A^jSzS}p9Z=h_58nhFA|8t1qFpfSnw>Z} zm`Ck}!|MN)0ho3ejk}Nr)anD~DP#2Yxw#)G%m9PXv2gWZ(^cxIgsb)IX$Ea4i91 z^R2d)iJTa-r#jT!fGE_z=QiW&76u$ z#nmX`mg(_mrqzTz1hB^ai&8g2+dfxNiyZnv_xnc758bzPDqq`NF19#RJrEQ7mRwQ< z-ja_taV(I^zh6j7W$(1o+Ojb=jU6p(EWR8UMr+*K8b|;6%a`e&MMpMM*SbD_)CB{@ z{DKfd4q)7f&Jtd9x3wx@?zDiAGJh&gTFATfiQAKIF@V|)G!J>(a0|Je5E#4-FKb=XfIRqD$wjVBJM6#`r@&F z@NzI2-nT=~s)r1C;LvWui&{f8j2Hr=mKEaS;^O6PX=orbx#8yKrmKquXsV?Z3D_Vh zX%r3CKTK*-0(rC`{Q-eU1B z&jL<4JA>RN$=o!4R7;qrTbsD~&%`apVCK!03 zrhPMp9?}4^DnF&)$CZ1{YAaT4Ch_I~cOQk!8UJV;3KBf3c-kS8B~BA$4R z_K0yh4ObS9O*-`Uu(W~*5RMP9P`AApfzjLHV?0EWdr@#lzIn4UnOOllhLcs)!Lx5bGNj7(HjQJwwT*)bw@pBaewNrEQliWp2J$Kf~z3k+{OC`cX}LL_=B zNG+ZRa|>WOwjfn^xsOSHC;9mD&{9aVT!@g${vN`{L6tU;@L21K>0Q(X2*<^U`C5`E zX)R{LkTU`9h>na*zs&|XWIxiEVX2uwsP@3zxvzP5*=^oUpZk&h%=H~aWlsUe1B?W# z8W1OKZm1wEWg575t*ier7#EuB_+Q>OCZG z!MhK6T<>FJfBXp9OL%}13EncXe!lR>-H{PNLW%oxHvt4LtOWyo5tnDo8Ma$nTR`2G z|NIdn!?ZUFd(pXbhySg-AmBkqOc0ZnmPTwfh8>g#zwAg*dW*fy^8f>2CxZ4qUAwF} z$|HAE)@YgGm-@$RA}#6fwfd#fwkYEi0#q|Bf7>NWCy@I+vGYmIWe@tIuhyefQ_XfY zpNKX99@PA9k{R25#roy76Zv+wwv|=;i(Ebay#-URf=rk1PEykoF68i@uj0I~F)>fi zN?KQSptgOnV$!5sWMB7E0mF$v(C4w9)wH!U($fRzB;C~TQeBre%pW1~Z4rat1$jSz zew7?Hj zr~4{AGm9NE5!eXWrJ+H)#DQ~3xDTmt*z~C=-51D?9Q1|~$UiVpr@;KJsRiU+w{Me2 zH&&pPgy2hK@%ckBU2gN|+YdeX*PY|L8jmZJWVw_ucSlPxe@5qoOtpWE?RIaH*kA7b z^zw5%`8}f;+QR>)q6?$nm6yj<>DBvJN#bAp4jLW?>AYURLP~4#l)Cy}PdXIa`L)-d zhMB&6r(z*q`mC`dT(~emP>6sE5WEyMt_+URz;nDil~+26Qpa zk9Mc}naJwzekjvMcVQ!*RVn5Db7xhz5gvlrtFY9g{=^G`8sbG+5uUta@>=y39?G^~ zZ?{QX?@*SHC}~*ei;wsA5FX^LUwNh+4Lai5p*ngZ0=K#Ox}-;h_4P0fx#h>_9Zbv+ zR*R$0SVe_uj&k*wLW+{|aU7cr!Y-JEJ|WeCkHw)nzCiI<gn*Z_O#CjKoSZ zp!1Th<}Zu>a{5Sq=nt?Yux`kg?@WPnCgMEDA|%vPUCk;Y(g%~N_wR3}!2DN+u;W$; zTW{2k8o`*VLB+OHEn=+uRr76da4rgoJl2EW;!5YntZ%fo2m?yOpCVfQ8TUN%1i&+F zHd3Jy=#kJifnjT0xYPM3&m1N|yX}HP2ygtVKb3uqJHu;_J)G(DLQnA#VBC1(fQr-l zl0~-K_tE)X1l$Yw{lc&?je8js2)Fo-AZ1H%+VLy6ei8eF|ZfbF3ksr~+a=bTDc(jbX$^jw;HizKwTJ0{X_$%>Ri+NTLN zDM{uZ_)XZ`!G^kNJfd!d3oehfwbx~3Wx+)9@!8qlE?@rH)<)^v11nV&Dmzo~+qZ8^ zOQYaeoi6N;i;sti-YIfoY$C`S+6i~1xd*M|nUHUQu5f_t-?y*3vol#Pj=p(#Nlf4D z_TnKK%YOak#ioU0n6TNqd5llr+38YF8YEy&c+7o!&%?^EUGsNVhjf9BCx*ROyUXp# zWNIFF)Zb=#hP7$@-K0Rw?CZ$D|Kx}(d9FXlR5&B$mgnXKAy9C0+kj*+=rOo-U<6>S zrJ)h6WB>o965UOJW1n`p+a;L1Lu&Y+Vha;i1omy=a9W&Nfg=w@m=cK!K}UMTq*513 z&ZyVkryxAA)v2!ZfA{2)gfDQ*9lL9QnFwK7Sg`Z-+=ihPDe8wdD}AQ(=d&ZlHAv;X zh8>ZytCnZ{Po$hG+fgi-F@+PS&YcUa8rYbtJBR8Wcnb~~P!910#=Ejw-ObH-qSVg+ z!q42?-4TF_(U2G;fP)RgUa#UdOGbNo`R2z7=ahyXFE{U%bQ5_&);x4=Sv zc2X~EtVC*0hTcET%=V8In1lT~^{&s`%m@5e15RgrQQmRySly>h zD<3mny?ZL4rX`yH+H8;dV#^%gF3r>FXF2t{7a5zzvy|A~s9x?+$Apfrrd>R_XElcR zK7}N+k;N*1r4=)ffuIE=53^Ez{$uke)00zPt12}=3t&2U^$bPG&(a`Q-RSpu3q#&E zJEG;bzpF>x_Z$o*(N%jD_7Wr#o<8Qi;4%v4QM7e+4^{iOwAdxdopvwkYKbG~;J=c1 z-rW2{e9aRD#eAs%ON$D19j)LU-g7^L3* zC~_Y_?v4Q@C#MDUfAoFF`2;IJzHytjd+X|%f4}7tDQm2FvJ;i2{pQWd=B6Wlx_vwr zf{%Yyq>MHCixVFBu-@-F=fX>6dj1VV`t&!Mk#zy;#lH&SWnMiaWMQ0Ke<&y@zJ2?) zgUCR2bHoqUQFN4)i5sto4%WTFM2VCD*Dx?yVRnZ|02T@mH{#cC5*~~;Mk6pn2xd}h zS!h(hjm%-?Mxa5%L<}b?()zHpAe_b9$L+lQ_b;SF_zs=}_lRnlim%tanY=X0DaeZ1 z+1ar~k)9o&lA@k@=l`NjmcCelG7QEXtSl@@a6)pq!MH%%OnQ(a{Us$Q1W?=zanx8+vK@)Tc3fh1Rs4Fp;#m$Q!$Nxfe@3UFq zNd+YmDl;s7RIuCL4}PO|wAiEC<6ezfW@BTfFwS2B^6pTJKn&C4-~!TEo=FRVfH@}; zjVw%8(B>f}Na9(l8prGZ(FcFo4@I!OE5!8Z4>h?|*+WvfZolYo8XocN%+dp>3o#ux z>B+mWuS3@C1mz7D3P?L`ZEWBf2V-j`<$crUHtS3|UB$dcDn8!tI8tY)9;ZS!MgI1C zRzd8<NTkbfti4xlBtS?GHTWh^?F#KT~D z$4m1J9Cs+mj~_q&S#jTw4=HhpiTMao`WyqLZ2y-pBiIGMwHpqACxwS(1tO`DorLNa zrz1EZ)!Igfg4u0nSY;xtdJB6x-OI_khosZ zAiS>gZ-@@2qMR$3HvU$fewB$BT#^>mOeJCc4~8kJ&WzXpUqz;bGcm7fO^5nV%gsyN zy7KbGla?0eJB25;w`H=~-0Mw087)d+L_2(O0dEX|CW-8PP~u?Cz1BMPUo0%7O_b-D}%p@X;;L>HbYyDi9)Jb-Fx5{|Bp6#gB0uN z|I{Y?q)vY|oI@4>Aj+q&unK;(wWSNJ3p`e0KXmx8s-ohZayJNnF4=&wV~u=>ucIom zbO?fhE_D0@*~;#NduatCkGPfSZ+#}iTHS91a8_2?JEJ;Bh(2tfJ*>};;Gw`ARcNHq9zqA>$2NY8T!LN}|2(2V_L6_xcXJJicpu zvLj2=Q?PH>>k)DUSQ8A;LDAk45 z3Vn-R1d8)?e^ZTS&t1KvI&%CcUtzXYFLU`--0@0|4-kkZf7k9biOC5J|6!O1QN$+D zPCBwASpVTa+FDxDmV+H3;uD^6(u(i>=`<3ySWS>8BGf7dgHFA z6P+|BS3JO5zEt9ne30v+L&C4lfB5fFult7zbur-dAfEg4hxovO>(bIlYWWJkH7+ix z!k}<*uF&|W$7y^@437s(`R-fGVkG|lr&jtYr6VXcC+Kr-^*s!qPQ}?qC+cw-)emg- zPyizK&Dzm%8&MD4M{4)_3?wA55C{~GQn9x+VJuYn*g<{YnGhKoSM6#`f?vEzjzd{( z_u|+;n1&OvhcpcBBCw0=oMk_YnYy&r#+NkdwTY1NG*#2UaNVNDXt8^I=ZIog$6mAW zQxP7(%PGeupute|GlR|c za-t&T!>m~T-n029CCm=m7|z$+Z4zP2Yzu`o$AEgGf{C;9rMY8&gW)F~VA-y~_Uc{KkykUhDTt{Jt9{85 zB7;~Ppk-|b_$!;OdLPa#8Eh9K*S!Qe2w26@o?Ght-@q&KH^*pFeMp zUKbs;Dq3km5%G;eaRI~+aAPDEJgUR}X}-rSrcKuXafMvPJH(B}jN z6Ud*Ad)Xa*5-kV!$S?YTF)D_f#Rc4KBWtrgXp+$CVm1N)U%~^p{(*Z;=9_C+O98IG zWLjF7-C+`d9~@M59UYEvptZxEG=#3FUZUIT?~AOts?O;_Ct5{HTJNukRx|HaPFGIKe;v z-MPUw>YmTrze4x^QBi4lyzlG`akJsQ@zk_Lqt6aJssbf3j9SXd>n68of^&*CRuke+GG_zv4(B8_$$Z7HqLLEPm0yn!i>&;@#S__D8A8EL^ShmUl&zY< z@)SiaI-ZPkP?k|1yox7+U92AKMJ6xpOc+mvO0)RHBfm=R&K>Hb8NPeuD$-I)Eira+zEL(i$|5m_&CpfHHa ztZzO1*P$3f9WX)eSe0Eh+W(7HqcT&t9uZ7=>TyEW5Wx!!eb zGuNi-!ghO1hJ#C)2fVlN&viP#qjf@x>(afImkSsGg?UW!L%{1k8tI7k3C5b-&`o8O z%oLZ0sz3{j;Ol|YEg1f0s%3xb>njJwEKXdc*@st(C>sPC{~jIf-zb7HRv1D~U!76J z%|q)bDAlIC7JQ98v^2V-q+%{i`ApbwF}iINK3XO(jdX3`bU3<8z%dweK?QLtv+1fPR+9Im9Gteg*ec#BNfjyu$;vg^vzRHa_!LIn8S4w5FaSbIR*aw9ssr=#r&qCbjs_zXNgjfFsM* z+}fVsMbhR1x$&RwjpggBUupS<@a_NlN&n~mASK#5OBTe}a}cx`#s zN-)#&aVtF5UcI7G(coZbUqfjCxMn9V&&&S?W<%&XV2kFl)O8QH3o0>}G7(YH?HUG8 zKDT`1rv2BPomWZDm0B6Prn$R( zTD?-~SCM|M>|L!wisZPi{Zx$L$*Ts^X);eI$)?yE>wdU60sFb3{icIUvA=4e!hZd+ z7kPBXTwUw($}9y#ONIk(amRjl#O~VhM&?}7`2#lR4wt*RS)nR-XkwxpKJ{oS&58p$ z*6D{b4e#AM8}bcI_20w896IGc|L`;!^C8-+2S*KTSPxY&7MGMjZvfIbr-%qH>kjyg zKCt6liJdEwaM7VL$91fUX^1w(r%?tj`ye6tN$Nx3`!&dn`WSVgb*~rs z&hGL#C*(pUIV)W(*BmPs`OGVShxXJ-@yIaKDh|60p8fNVf<#K zg`nQzW?DNwV;`ImLtyMSvJy&ExP*L&eS019L%REQeg#n^vaxq!UxZVaX`ZO5*k5j9k(BL ztrE7;bBit6$E$M=1b6k_- zI)T2d7c3rolS9r4v7B-mf~YfLB_%dwG={#(#@-$|)vdOT!uL9Nhz|mNPE~eAeMq{% zeN1^)#mUvxalCnCO$Lp!;aVgLmdk5n@zpCPp!Va>_2SZDt;sGIPiB;4yj@(yP4Ckm zfeg|3`1s>?%-D$pv`ZH@RaMhxs5{lS`Z`2Jwp2Gu3a@AMygUU(iMoF2a; z+S!1fF#f~4-U50J_uLyyUXsj^ihe6~$=L{3WzLvPe+|(SZ0GgnI`qc25UOgyG5_ss zCXFRcXmpEdeouh~@076%qr|yO^ID4V(>=yx_~gDYu#7;s6{4)B)^-~Bz4&u@@!f5< z9q%dQA90!GYZGai|C(ueudHtRN}F*vEOQhnKjX+s@~#*Ov8Qj;^o`& z|Fn*;Ig+Nt57CqKnKk8w$SU}Se9EYr&;52Qx^$)TlRpCopXIXi-{|T#mMKB|xd^^X zwm*Dp9L*~x)Mm@?ZFOHvE#K_EU$zt9@_|?!6Hy%aFQU z{C1u+>>RYYTwHSLDkxwtBGvq#7I6f!=;SgdL`UmD^0sR0+qT|^;#KMy&3(W?xaRf1 zGSqTl0$eR%I4^n;n-5$b*}OV)?$!ZL`Yx*YIB?r`wQ4mqz)>{9b0p)wX6pFv5!LPs zp9cD83munBm+Gdsrbj9=&io@jwHj~!RXW6^iRx$l(!*<-J|df~yo$7SO0wi0ryzlpDUU{^A}b(NtcHWB3)j4Xxd`MV=%I2oEuO zcEk20y732cwGCa4)lP%JW0trRpg2Y<;#ye8pGDsHy~DW*@jo~;^4Pez8q_*h_OIi| zdT}HD)+}U|x4QBD{pgb04L)C_2FfI|v$3rV`ky1c1B)YB)r%>qscXn9ls#!avG#;pveTff5K zKG>92IKW`zWg;-+OxQ5dRp9{t1j`yZOdB5EQ0a``7VG zAgb{uM~Xt}>K6gK-!7Bsg;LMyOx(l~Uc0k{AX~u2SNxi!By2100f@%SJ0u#CCV41l zdwKt~fy3Ubhe{p9YgvmdrPxCzqFiUxvvePhv(z~DIgch>4<@x$$6%oxpD{kR+=4Az zGFMU23eYUpS5|1YPPtXdgh_%ghTN4l$SKXpTE|4(F^rJ#A$3OW73DHe;A-=Ss?zNqOmzZ_i1n_LXkEv(Swp|J2>vJL(-;%%Nqu#x-&ASA(VK z=9J)swx1?fP%Yj1;$ij0_!^1BI=15p?AMmpYh>u@E;B^2l+4sbxtu+pbZVbNq)E2sisnJx~{DHyK!(CSd-rThKXziQ5 zZA~`C!C+S?W9iy<&89Y z|JFTiZT1+|EdR6(9PrjN{tn+o6iy~=j6u>T-2PPJ9)saw)zd5O=Xe^{0N z_4(_Dm5NAE80zXufXp0vjMoSgZJ9&`Kgq$_Sy8~3$1^m{8XR-Olb4ItUs0{Tc9Otw zXSv_A0unvgo8{!pEiXr3un6<@y=F^y<7an|J-C`6E@0|6F*Zg+NjZWP+zL-mB==xe z=IZPWuG5q6WMU_!HQba=TC%aS{ubR{ZG?uv759F##T5f3^p8=(>qx=f#9jq4(VcCw z00mI{^}jqtS+PSmuq%`QyImpb>*e+Hk89GG;*d!gg`}Vy>)41M+x5#q5Pte611~qD zD%jqf^*l8Fb_;ko%&wQ#3SHE~P%Ts}b(^6ha7VGodGE?T!XdP~9fxwT9i5JH8bnQL zZoHp_U?GEzr-Pk{hzM?f;3o>$$qB0M&etddzYsSKSpWR}=aMl`?suE7M_}zfGP=$| z;qb7}(?ym9>+o^A;)R6;{2mDtX&JXh@l|6Njr66@en&(%7lLoHB2$FsEqxPhZ$Y6M z+P9z};OYleRaL9l$O$WFE$&;Es4zkM%Fb^3Zz!Ar6Wr>;&KpRz zWEkk`3W~}@EB@@r+kDf)f#O{sr&X1d_|TWYE9n4}4+<{qMB%rDAGWjc^P@0I!BAcN z$u$P|1r;iy{Y?s%Jw1y+JWtD&@)RxYIeb~ygybb5i|?}o6&SPQ@qr>c#l!{k&ZZ|{ zQk!yiqIXcufC?yJwlq97bs2z->ulMw6|ZddfA1TA-rLt#6g3sj0P~-()Uw=o-kM_r zyd|<~2(%>qJx#;zJek6I#B{3Xoy|M!&|oj%5zJCBcp zUp0z%rAxI3MewE_IaEm5P*9fSdqy~fvnQcKAwtDw#s5f9<05Q=TbqIR?>xi|ntC#n zQ(Ib3Sx8@6SJc;%)v7B<;MQ6H;%U2o@98yZxjyQUjo!gWGWi*I!~aX2{v#k}C1mS- z%?bYwFy%ZSPS^_ikrR-TmVUN@E!#HNtjj3kvc~GSVCo~cly!<+Kg4=eBqCiTyDil3yo|Wr+bsLvM_}AL zX3_D=PD5*EeB+rgbsbOL-Ggr(qaEmdS9>mY(ws<7NxoFR@XD%!tbsmKp&(&2s+L+j zkHmJ?P3MK?T?38la+))%_`Te=cOkBe3sXD=ii2yz5l4!AI1{Ps0t&s!dr!>hj~#{v zMm?(ZQa*R0+JND4?(dCBR<3?+%8|cd_ybSiP;fy(N`qek|AJeu@ZEXQg$sSt$L=mS zDRrnuH{86DI@5RKM^pE|?~kA>Y2INtVLE}=6Wt$f@*yp~S-aCUg)y6ZqG-RnoJFu9n*V>|!+JNgQY`t>8wl9 zy}7ba!jEf+x-P0wvrt889E*-t8~bNM@6>v3mDcUsP08}{82Ex{VLz!FQ+m^JO83iy z0kU0J3JSIVXIb2lGVkECvoHQMtUvl(?#jvCcO7_`yh8FrR6pDs|B~~PB+&& zk`s}idZ3;4I%{`Phft1ecTv%na9r2^;A=FI{?}@0>ZuFluOm;UboB-}&omS-Y-8-Q z25A==`W?z|7o(gr3nqS;M zagtd~{^0BcW4ipk$OB|^b`_4~=*Z}_D)N$KzT78~7>l~S!^>66*}tTpuM--Mn6e;g z8#Wai7u@46F8^f0ulPrvRd45L8i#z(YNzqQH5oz1*>dmDdAyc5VU@vkiE*=)M?K;; zZkZxoX}`oCd?Q%*NE3DV!T6?}`O9*a@#PPXrR(#MvdE-5+cf-D;= zVyz3t8gxo90&Q;SnieqcapoBrcv|%b-|~wM?Sbu#L+Lc@O|k4f>Q?+k*Q`3TCW_vA zaWIapgPta>T@n)(s|#J>gHFZ~;~b(j8BIl;wc>v(a5n{+-jtNE%D?idpGCB-{!~rZ zp8Cq2f}vtjn*)6N)T2)B8kxJjdx9xrL$rpJR4Itd4_UOp3>7k0e=x@?wfwc@PX|8V zhb+H&#YI?6>@X_$mUz!U`jbZ{7h^{a>r)%Iep`BF^J-IUM_P5*?~mrHq&5232S)ex znek++IMb?kYDiJDYNi7D>W%hQ3G)w0zMtRqgvXO<^JYwB3+i2?s4z2rRz%3fj8=+0 z$L)u@iON0htBt);F;ASFz7}WgBkE=xzjRETB-kzSj-P%YBuxG`$apT#NY5zIza*!n z*2*7Ykuo8Y${kG2sT~2nhMJ1erDY*Cj41NV?}nAwuluuulM6WonGLyC``!sLpIJyD zT+Fe4s?PXPALk7IPBly>CKucloM?O+)#z(TNUOu7$0-|=9%8hU=Wd-Jk)~tYKf}uj z%6~Ty{ZC?B!{Z#yF-Xklt_7_l962w6e7?Hz2BU)_ll8wpuh*rdvNi#D7$D2w@7lb) zVoK_;E?)Qy=mF!dEx!~aZG^+n+VY?zM*l>yx7GwU~OIl&JqtC-_xu0^{bjNl-w;Ukjw zWPOjJ4MwD)-=ASB7(gqJB`YTnW;~7p$1!$fK+qS1YbpS@mqz}4wj$jUB!bXP(^*}? za!rr$c7PS2IA3X2RgMNP6ptLd6sV!VhHC;zHa$5JD4uG90wk@na&q~8wT#q+KSQy? zal_=~B<`VbE8WMkdGF#klf}7dY8iF%q%3W4ylb&)T$Qh%=u6Bv8n|p8p+u}EKz;e< zd5>O)v%QV>b)!5}wcv+pUhM83rh_pQ<^*d=Jq=akJ4vEx1M{JdtE-K5$aNmFJSq{@ z&s|!Q7h`t2o0IUOJW4J?TV1^c1!sanc;lDJ7@(`rQUkPteMKgTBw;)7Ug!x*(rDm% z&|*Qa@Bi0dUz(Gfvg^-A1_v7+o9=d<@Z%ICzk2l*ojTmz5dJ`(w^icXV?!SwpJK?p zP%-@i(%Ht1%He{BsGAAVN=#V82qV)<(FC2}(%}~eR~A>it_0aWGz0LoZ}+&(|FUtT zp51=%?|P750}#OYnBI>cQPyA~g8l=$`S~##NIeFc*A4|@-i;hnrvBRvO^)AB_Io7~ zH^sO;FB7TI@fS*TjZgLc>M!73{kXP8-PA!-2gy!&Y(P%129Kc7aEB*pux>dlsV-xO z)Xs#Rv8yMaXFaR>YN9Xq;ms3&b~6^KtE_5=tz{)wOH`@x?9-7S4hDx!02>6w2%zZ` zKR?TN#QQgoJ_~9?Vt6|6< zm6r3D=a1$ldNQbHpu_=?%61r0fBO>q6_7>?-SFZmvr8lGP$Dk}2hz+{j>*r!me^}-b#6%POh3kwbw0wM6iadAeyfz|IP z9T*g3zXA=x0+xBSsLhM*Bbwj$=Dn7Y4u$9ZPz9_Z*Vlur$|(AD+JIDeUx)y+p2D|`lkykQDOwYWs@Y9{Uev^!l~YjFlMjFF`O1xSxMwZ!kP zQm9TMh|ak4c8Zl&S9Mg$8GY(#FGGx?HgDpt5(s8Z4BgQn zhZ+?4yn&VIr;is-E0HwQJ}kF;Tu#1PJm2k_QL+lL9-zu0ga{Dfv4)}GV}W%icK8xn zflxw7F@1MNV`E{taqNbH!6~!mBoH8QaC7jcCMC5&XVm4?!?|O}O>rOTmz7mj7&+}| zZ(rCugl-0YUeVg>5=KL77c-JJpOyAM2-*|I(IJfJ`D zcl?|HT_D66_wpS zkS!VAx+T6a5O`QA>Jqx~%F2>xGtEBj!~z9D1kW8!<1OZ;gfluqFoJykb!rMC=i=V| zJ1{m8ezjm!x_-RBkzQTU&0i7KojPqE+4v?S{Gy%Sb>ah~n)cAJ6e0h*X;U~b-Z8d4 z<|*W?mRDA(x{1dXj-I8QR2x6yG%~6(;lE*9_cl4FKRU>dJDV2r3DGPs1WN?nYxApa3R#sP=H~4#P&%z>dog0-E!MWs(7lN*N zgZ=Y1t*hGF$2`Bz&XOpU)**XDK{|yjLwO6%ckI7>>z=c3H)lhTTTq+=37t;i9gNMK z-@^CSsy)kas4*VBI5bIdhqWR-SBX@ZFBQ9+l_7}WiDJs|$*XV|0B2J;o_||_8gDS% zCyH0@N1y-vd=wR8d4almz~7tR$SKE%7tr#K{`_d6qT*m#ny5j3(S^8Btybbq&W+X^ zmmI62ayz4PwcqZN(R-w;?AhK%3)7QTJ#+ixIfy1%_5+tE5IUAQ(TCr*PrR+b$+}5) z#FGUAbZDc#p~;H`3Yq}wK|e6tmOn>YL!tq8ePQHIOw_;{*G3Sm7b+4u2di{zTRAO-H};oj{+#89VqTWw<_zxsb2p1m4oet0)ucrc3;sw3euaU<)a z4K*?j=np0^Ey?_)!OR@qx1l#RJot1l(p)r7w(L3aJA%@AF_88lfCth(5%E=i|I;md zMK8bnu$N$eDZ{#L;GRc3WJy?Fpv6VYRIe+$JJ zzV4Oq$*TUbFG)l3kJ`!jMC}LKgf3cUJnc^{FtEf7%C`Vf#!xl*t8;|p-R><#g8~G? z!W(aXj&JPj4r-;FAOVwuykK=SyIz;;M>s0UB)8GFnVgPR3JnODLMsIBi@>&mzT$i$;voN$bL{%OwMPO^r_4xw1b!Nl!Oy zXQlE)L8*NwiPM2_}%Rq&0N)G2P>Gx))LxP=skUZ#egn*;jb z^Z+tfCpG~dR_EPNv^DW?kLecX0wM;Z=f(r+JTUU<9d=|kNLd~2>VLIu zGg%j|(1KQzag1{UDu&te+khx>8e#^Ah&H+JGsX_#bfY(4ke&*WGwDxt-7{7LtA9rj z|948f@4si=4Vzp1UH8aGrq8u78?>-bD0O_jr|dDY%i>2>d`yw%GsY`GbSld1Y45Rl z9hDT4_HHj}xFfJ9T4LHj%3bRDRe{-|5za|%<+bx?cksz(@0)j_3Qq3o1C1shH8&MW&wYpg$-yG1W^a$J>F)29w`?dWSgNEOSa zHqgcw^Tu|x@>oZ$y0#tQe%sA<%W^*SgIVQ5W1F%+kEH@N$ZW5hnnZ%LTKb99WH``GhribTd_GNV}w`}IFvy@xWujw$*i*61w zv)Ale=-N$LH4i0Fvd&|GJN(9Qx@ch{4cv+`m!P3*%_sDUgR0t(YxT+TKA*K&qbw+m zc@y{MK;N5(EWQY)H+@`K$vFD5X}B*WwoW{ZbyB;&`1lOj0Y2eLSf8bJ&P&@o++XN0 zE8Fp&y#1BTHQ!~@v)XMdlcz+KU*KP%>~@S>4*4wECS!IWjY1*~N0bKLl+g>WS~@-$ zpgO3&@6OsQmcG?bFUR+={Z0xAF$|q>?>`5m`kRpK(^IbD9yW47UF!*BEGd_7ZMl{AySfi>q@l9sHrX=%P4&!D_SK|!SI6H;`|XkxJvzRpd7)U$^CA=X)$VN%dcNp|X+}95Ohg%8-rad1 znIQUD_bx@bXHJSq%b51@%dhByi-VX?xKRh;lLw(-E zv#m{U(*&9s?sxB}Ja`aYkmuGQ=%{-{iSMM+--lN{B-E$1ZobSh-8~*YrRCCCzH>f3 zT|JBA7{`96SINhcst6GV1ba$KZp!a@@6!T(6()_pU2{q999**=JiKcls%Cb$*VNs> zD$&Qbt2D1&OC+RtC9nQ{rvEKQXXzQgxfWj~dsZHTl|Y%%h=Yb=k5P|Od+`&EVJ^0f zk^~hUZGP-aDxjJ+?@x&<8x}Vm1dfgT&Dd-^NavG>cn35N0!gbbBLYP_XHiGGK*-^hkL)2hNaX`pmNb`P8> zTDRw8^5m3&`QX{mJY(~P7p(3-Zf%_6Lk4zPjJ@D`!J*TkBz*5Unj9WBK|VW_+ZQlH3FO zV`ut9xXM$7I&%jDd%M;?s4?}j4+!3IUz1!Vjl9chIvf%$9CFp+Hq+kEhdpmkIgN@D z=O>PjEgKH+YN{$&dud*={U;SPUS4nDr?`%KeBFXxie2u6f3KmvQ&asalPr$7MQq2g3r{yig73n^Oz59IIRn%J2Fss%jAM?7-A)#oy40ikazje%wmYu`?SW9S(F+v zXtrFx9sg%@I zZ5YD!6w`FfLqkHyw|k{v)eq?D5K8BS1iBwTENY?5)uUMH$Ws_?hu1quecg`I47hi% zh?O?(F=F&_1{QM$$G_WQ1LKI)wzQ=t+cG=a7t0nIj&^Ct4vqEce5pp$4?cF zeHm#O@jk)f8tKAkYD>ow7F$c;6}ge??#JF<{Z)ULqE%2k>T7FtVATp3aVrN5NKkcp zpq2zP6|VDedS@e#*yn?q<}vd@2JdJq6VsjXyg|fLO#Nkfk(6WttUFODS};u<>>|{m zFmx*CCq$2WHt@S*PF;>s#rhHc#TQYSRRPpW@D<|j4Ut~hx8I~KF6LSb@0*3|WYm{X> zr34jeR)W_3nq%i z@CoqMHgiLgfEt31+)h71U52rvk-&I>Rhp4HP)Gg|4xI#9^avJ8Fo z8=!)GV!EGAGe8p)b&p4kWfJSYID`(41sWZ9Wsc@u{yaeRaVaLg%t%Sk7tmkH z8|}|48+^)4`* zV(^#1Pprm57#kbY(bjIs(6jC=0zeBOyy$lCpQh3D&!gZ3C36xC*l*vyHB+g0dh`YY zpL#0O)~!McFPt#f4Gg)8rlx69t1bt~u-XFk)z!2@=WKYDNnMndW}hm6uLj21F9Q?= zr^>I$==<7P=QmIB8Dk)04XFTsN{f8WDUS-;MBA9S8F1<^gFbS{gTl)lQ?_mEI^^i^ zH9xEEPjlnY8P44~5d`jw?eSSSp#%)XoV|3|%*;k^(H4sR(IyU;Vg)Yd>-vKj?H8fg1 zRz~!^u4FPuGeBil!K<8}n)>d%v9Sd%*2Q6JjL^<~4t4eUnp2 ziY7I_P0xCkmEMy2E{%>6!b=<^M>Vxzbz;%kJfJb^>Kf8!a6!N(Wfv5CdjZEU5Y8kb z@zmfscE3YFJ)srGdDqGn|LocCzyJOWYIaz|ii+mq9x0AL(!AP{2^Ja~p*_5vn^-wy z?_%R%q;Z_joR4oPt&X=10P6-6;aFAxB++gvk3a0mqM0U)0o9;ff%4`-vc@GXY{c+6 zqYZaqeHF&a*e}--S~zK4bxMvN@#2Xu_REZQRaDnZ3Fe{6MMm2qX^=RFS>+sHRu@O=1yk(or(%1Lq znBsNCmwcwYIIjZ%qX-)M*z{_gs=Sp2NsT*w4sVO?$WN^ln7-`z`ME{E4j-TF zd(Rv3iH$W~W1Tzizg_M(2%vKcy1Ka=tKnQVwCg{BhJ2MzUuIm$I9zHmYFU#Jm%JBK zZ!r^zX*+xqz#M(%2Jtx;2Jiymv%q-qazAVdP}~z%CUDRI{58opfHMV55=V5ZOLLaN zUHeKG-*n_u+Ph*56@O}aN{H` zoFHN8+~!9NERDyu_swb8)q_qD_48gKLm^b$x``SKqW_TD_{)~bqJ+>W?6T~VKynH> z|0>F3PZqNO)SLv3%_sc2tSTmy!gvG_HDI^gOpmB==zO7pbe$b`K%RuwQ1z`WfWv6# zM*`vkTqx8s0i$SjqOXsSJwXQzaXJ78OGp}MdtMHRIcPuxg@j;8Q2E~#o46r!!n}$* z6`W33B2c)0u_wHp15X(Q!Oo5jO_a0-2AbtnRlNK6-$b7b3g~j`2~QRfJ^{h<9z9xF zTT3-LE%g_m%MB<3Tgg%ICM#F*N*ysR2UlwO|@H zs}P@l|Auv^W7WkeoE$;IB?k68O*=r-0ZL9OJ0im1Cs;h4q?C=JFxK!lgTgoV9tfKlO{dD0byb zH=3M=PbmzFifzzj(ZRAYAY?IW`j6HRx*bh8(Q%<4qxbHumkoXh<6>U-HPHT_)IhjEwesGw{Fp-T$OKMlBi?4D9V%;R-oC_{Hji`H$=S%f+Bz^ybQ`YCc=J znfhZHqA^#TTss(is&zRwv+o?oqIuRoNPEb_O6_a^G+cYw%vzrKEco_+7Z_y?BjnWg`Yvl;e$HTaev!TGx4sFUHHQSZn3 z)Qv*5O$UGcjx_Ug7L Date: Fri, 3 Jul 2020 21:54:23 +0300 Subject: [PATCH 06/58] Create a Books Page --- docs/en/Tutorials/Part-1.md | 66 ++++++++++++++++--------------------- 1 file changed, 29 insertions(+), 37 deletions(-) diff --git a/docs/en/Tutorials/Part-1.md b/docs/en/Tutorials/Part-1.md index bace3bc76f..ecb477beb3 100644 --- a/docs/en/Tutorials/Part-1.md +++ b/docs/en/Tutorials/Part-1.md @@ -541,7 +541,7 @@ Check the `Books` table in the database to see the new book row. You can try `ge We will use these dynamic proxy functions in the next sections to communicate to the server. -### Create the books page +## Create a Books Page It's time to create something visible and usable! Instead of classic MVC, we will use the [Razor Pages UI](https://docs.microsoft.com/en-us/aspnet/core/tutorials/razor-pages/razor-pages-start) approach which is recommended by Microsoft. @@ -551,8 +551,6 @@ Create `Books` folder under the `Pages` folder of the `Acme.BookStore.Web` proje Open the `Index.cshtml` and change the whole content as shown below: -**Index.cshtml:** - ````html @page @using Acme.BookStore.Web.Pages.Books @@ -561,12 +559,7 @@ Open the `Index.cshtml` and change the whole content as shown below:

Books

```` - -* Set the `IndexModel`'s namespace to `Acme.BookStore.Pages.Books` in `Index.cshtml.cs`. - - - -**Index.cshtml.cs:** +`Index.cshtml.cs` content should be like that: ```csharp using Microsoft.AspNetCore.Mvc.RazorPages; @@ -577,46 +570,41 @@ namespace Acme.BookStore.Web.Pages.Books { public void OnGet() { - + } } } ``` -#### Add books page to the main menu +### Add Books Page to the Main Menu Open the `BookStoreMenuContributor` class in the `Menus` folder and add the following code to the end of the `ConfigureMainMenuAsync` method: ````csharp -//... -namespace Acme.BookStore.Web.Menus -{ - public class BookStoreMenuContributor : IMenuContributor - { - private async Task ConfigureMainMenuAsync(MenuConfigurationContext context) - { - //<-- added the below code - context.Menu.AddItem( - new ApplicationMenuItem("BooksStore", l["Menu:BookStore"], icon: "fa fa-book") - .AddItem( - new ApplicationMenuItem("BooksStore.Books", l["Menu:Books"], url: "/Books") - ) - ); - //--> - } - } -} +context.Menu.AddItem( + new ApplicationMenuItem( + "BooksStore", + l["Menu:BookStore"], + icon: "fa fa-book" + ).AddItem( + new ApplicationMenuItem( + "BooksStore.Books", + l["Menu:Books"], + url: "/Books" + ) + ) +); ```` {{end}} -#### Localize the menu items +### Localization Localization texts are located under the `Localization/BookStore` folder of the `Acme.BookStore.Domain.Shared` project: ![bookstore-localization-files](./images/bookstore-localization-files-v2.png) -Open the `en.json` (*English translations*) file and add the below localization texts to the end of the file: +Open the `en.json` (*the English translations*) file and change the content as below: ````json { @@ -625,7 +613,6 @@ Open the `en.json` (*English translations*) file and add the below localization "Menu:Home": "Home", "Welcome": "Welcome", "LongWelcomeMessage": "Welcome to the application. This is a startup project based on the ABP framework. For more information, visit abp.io.", - "Menu:BookStore": "Book Store", "Menu:Books": "Books", "Actions": "Actions", @@ -650,18 +637,23 @@ Open the `en.json` (*English translations*) file and add the below localization } ```` -* ABP's localization system is built on [ASP.NET Core's standard localization](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/localization) system and extends it in many ways. See the [localization document](https://docs.abp.io/en/abp/latest/Localization) for details. -* Localization key names are arbitrary. You can set any name. As a best practice, we prefer to add `Menu:` prefix for menu items to distinguish from other texts. If a text is not defined in the localization file, it **fallbacks** to the localization key (as ASP.NET Core's standard behavior). +* Localization key names are arbitrary. You can set any name. We prefer some conventions for specific text types; + * Add `Menu:` prefix for menu items. + * Use `Enum::` naming convention to localize the enum members. When you do it like that, ABP can automatically localize the enums. + +If a text is not defined in the localization file, it **fallbacks** to the localization key (as ASP.NET Core's standard behavior). + +> ABP's localization system is built on [ASP.NET Core's standard localization](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/localization) system and extends it in many ways. See the [localization document](../Localization.md) for details. {{if UI == "MVC"}} -Run the project, login to the application with the username `admin` and password `1q2w3E*` and see the new menu item has been added to the menu. +Run the project, login to the application with the username `admin` and the password `1q2w3E*` and see the new menu item has been added to the main menu: ![bookstore-menu-items](./images/bookstore-new-menu-item.png) -When you click to the Books menu item under the Book Store parent, you are being redirected to the new Books page. +When you click to the Books menu item under the Book Store parent, you are being redirected to the new empty Books Page. -#### Book list +### Book list We will use the [Datatables.net](https://datatables.net/) jQuery plugin to show the book list. [Datatables](https://datatables.net/) can completely work via AJAX, it is fast, popular and provides a good user experience. [Datatables](https://datatables.net/) plugin is configured in the startup template, so you can directly use it in any page without including any style or script file to your page. From 5b98bee7d252bdf215b4f00e88691c723535651f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Fri, 3 Jul 2020 22:24:58 +0300 Subject: [PATCH 07/58] Completed the MVC part. --- docs/en/Tutorials/Part-1.md | 126 +++++++++++------- .../images/bookstore-book-list-3.png | Bin 0 -> 75431 bytes .../images/bookstore-index-js-file-v3.png | Bin 0 -> 9763 bytes 3 files changed, 81 insertions(+), 45 deletions(-) create mode 100644 docs/en/Tutorials/images/bookstore-book-list-3.png create mode 100644 docs/en/Tutorials/images/bookstore-index-js-file-v3.png diff --git a/docs/en/Tutorials/Part-1.md b/docs/en/Tutorials/Part-1.md index ecb477beb3..6ca1e802ba 100644 --- a/docs/en/Tutorials/Part-1.md +++ b/docs/en/Tutorials/Part-1.md @@ -631,7 +631,7 @@ Open the `en.json` (*the English translations*) file and change the content as b "Enum:BookType:4": "Fantastic", "Enum:BookType:5": "Horror", "Enum:BookType:6": "Science", - "Enum:BookType:7": "ScienceFiction", + "Enum:BookType:7": "Science fiction", "Enum:BookType:8": "Poetry" } } @@ -639,7 +639,7 @@ Open the `en.json` (*the English translations*) file and change the content as b * Localization key names are arbitrary. You can set any name. We prefer some conventions for specific text types; * Add `Menu:` prefix for menu items. - * Use `Enum::` naming convention to localize the enum members. When you do it like that, ABP can automatically localize the enums. + * Use `Enum::` naming convention to localize the enum members. When you do it like that, ABP can automatically localize the enums in some proper cases. If a text is not defined in the localization file, it **fallbacks** to the localization key (as ASP.NET Core's standard behavior). @@ -653,80 +653,116 @@ Run the project, login to the application with the username `admin` and the pass When you click to the Books menu item under the Book Store parent, you are being redirected to the new empty Books Page. -### Book list +### Book List -We will use the [Datatables.net](https://datatables.net/) jQuery plugin to show the book list. [Datatables](https://datatables.net/) can completely work via AJAX, it is fast, popular and provides a good user experience. [Datatables](https://datatables.net/) plugin is configured in the startup template, so you can directly use it in any page without including any style or script file to your page. +We will use the [Datatables.net](https://datatables.net/) jQuery library to show the book list. Datatables library completely work via AJAX, it is fast, popular and provides a good user experience. -##### Index.cshtml +> Datatables library is configured in the startup template, so you can directly use it in any page without including any style or script file to your page. + +#### Index.cshtml Change the `Pages/Books/Index.cshtml` as following: ````html @page -@model Acme.BookStore.Web.Pages.Books.IndexModel +@using Acme.BookStore.Localization +@using Acme.BookStore.Web.Pages.Books +@using Microsoft.Extensions.Localization +@model IndexModel +@inject IStringLocalizer L @section scripts { - + }

@L["Books"]

- - - - @L["Name"] - @L["Type"] - @L["PublishDate"] - @L["Price"] - @L["CreationTime"] - - - +
```` -* `abp-script` [tag helper](https://docs.microsoft.com/en-us/aspnet/core/mvc/views/tag-helpers/intro) is used to add external **scripts** to the page. It has many additional features compared to standard `script` tag. It handles **minification** and **versioning**. See the [bundling & minification document](https://docs.abp.io/en/abp/latest/UI/AspNetCore/Bundling-Minification) for details. -* `abp-card` and `abp-table` are **tag helpers** for Twitter Bootstrap's [card component](http://getbootstrap.com/docs/4.1/components/card/). There are other useful tag helpers in ABP to easily use most of the [bootstrap](https://getbootstrap.com/) components. You can also use regular HTML tags instead of these tag helpers, but using tag helpers reduces HTML code and prevents errors by help the of IntelliSense and compile time type checking. Further information, see the [tag helpers](https://docs.abp.io/en/abp/latest/UI/AspNetCore/Tag-Helpers/Index) document. -* You can **localize** the column names in the localization file as you did for the menu items above. +* `abp-script` [tag helper](https://docs.microsoft.com/en-us/aspnet/core/mvc/views/tag-helpers/intro) is used to add external **scripts** to the page. It has many additional features compared to standard `script` tag. It handles **minification** and **versioning**. See the [bundling & minification document](../UI/AspNetCore/Bundling-Minification.md) for details. +* `abp-card` is a tag helper for Twitter Bootstrap's [card component](https://getbootstrap.com/docs/4.5/components/card/). There are other useful tag helpers provided by the ABP Framework to easily use most of the [bootstrap](https://getbootstrap.com/) components. You could use the regular HTML tags instead of these tag helpers, but using tag helpers reduces HTML code and prevents errors by help the of IntelliSense and compile time type checking. Further information, see the [tag helpers](../UI/AspNetCore/Tag-Helpers/Index.md) document. -##### Add a Script File +#### Index.js -Create `index.js` JavaScript file under the `Pages/Books/` folder: +Create an `Index.js` file under the `Pages/Books` folder: -![bookstore-index-js-file](./images/bookstore-index-js-file-v2.png) +![bookstore-index-js-file](./images/bookstore-index-js-file-v3.png) -`index.js` content is shown below: +The content of the file is shown below: ````js $(function () { - var dataTable = $('#BooksTable').DataTable(abp.libs.datatables.normalizeConfiguration({ - ajax: abp.libs.datatables.createAjax(acme.bookStore.book.getList), - columnDefs: [ - { data: "name" }, - { data: "type", - render: function(data){ - return l('Enum:BookType:' + data); - } - }, - { data: "publishDate" }, - { data: "price" }, - { data: "creationTime" } - ] - })); + var l = abp.localization.getResource('BookStore'); + + var dataTable = $('#BooksTable').DataTable( + abp.libs.datatables.normalizeConfiguration({ + ajax: abp.libs.datatables.createAjax(acme.bookStore.books.book.getList), + columnDefs: [ + { + title: l('Name'), + data: "name" + }, + { + title: l('Type'), + data: "type", + render: function (data) { + console.log(data); + return l('Enum:BookType:' + data); + } + }, + { + title: l('PublishDate'), + data: "publishDate", + render: function (data) { + return luxon + .DateTime + .fromISO(data, { + locale: abp.localization.currentCulture.name + }).toLocaleString(); + } + }, + { + title: l('Price'), + data: "price" + }, + { + title: l('CreationTime'), data: "creationTime", + render: function (data) { + return luxon + .DateTime + .fromISO(data, { + locale: abp.localization.currentCulture.name + }).toLocaleString(luxon.DateTime.DATETIME_SHORT); + } + } + ] + } + ) + ); + }); ```` -* `abp.libs.datatables.createAjax` is a helper function to adapt ABP's dynamic JavaScript API proxies to [Datatable](https://datatables.net/)'s format. -* `abp.libs.datatables.normalizeConfiguration` is another helper function. There's no requirement to use it, but it simplifies the [Datatables](https://datatables.net/) configuration by providing conventional values for missing options. -* `acme.bookStore.book.getList` is the function to get list of books (as described in [dynamic JavaScript proxies](#dynamic-javascript-proxies)). -* See [Datatables documentation](https://datatables.net/manual/) for all configuration options. +* `abp.localization.getResource` gets a function that is used to localize text using the same JSON file defined in the server side. In this way, you can share the localization values with the client side. +* `abp.libs.datatables.normalizeConfiguration` is a helper function defined by the ABP Framework. There's no requirement to use it, but it simplifies the [Datatables](https://datatables.net/) configuration by providing conventional default values for missing options. +* `abp.libs.datatables.createAjax` is another helper function to adapt ABP's dynamic JavaScript API proxies to [Datatable](https://datatables.net/)'s expected parameter format +* `acme.bookStore.books.book.getList` is the dynamic JavaScript proxy function introduced before. +* [luxon](https://moment.github.io/luxon/) library is also a standard library that is pre-configured in the solution, so you can use to perform date/time operations easily. + +> See [Datatables documentation](https://datatables.net/manual/) for all configuration options. + +## Run the Final Application + +You can run the application! The final UI of this part is shown below: -It's end of this part. The final UI of this work is shown as below: +![Book list](images/bookstore-book-list-3.png) -![Book list](./images/bookstore-book-list-2.png) +This is a fully working, server side paged, sorted and localized table of books. {{end}} diff --git a/docs/en/Tutorials/images/bookstore-book-list-3.png b/docs/en/Tutorials/images/bookstore-book-list-3.png new file mode 100644 index 0000000000000000000000000000000000000000..cbd7ec4a6a1207b780bfa0a871b50af4cfa74531 GIT binary patch literal 75431 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 z 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 Date: Fri, 3 Jul 2020 22:27:36 +0300 Subject: [PATCH 08/58] Update Part-1.md --- docs/en/Tutorials/Part-1.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/en/Tutorials/Part-1.md b/docs/en/Tutorials/Part-1.md index 6ca1e802ba..10b0a3360d 100644 --- a/docs/en/Tutorials/Part-1.md +++ b/docs/en/Tutorials/Part-1.md @@ -768,8 +768,8 @@ This is a fully working, server side paged, sorted and localized table of books. {{if UI == "NG"}} -### Angular development -#### Create the books page +## Angular UI Development +### Create the books page It's time to create something visible and usable! There are some tools that we will use when developing ABP Angular frontend application: @@ -778,7 +778,7 @@ It's time to create something visible and usable! There are some tools that we w - [ngx-datatable](https://swimlane.gitbook.io/ngx-datatable/) will be used as the datatable library. - [Visual Studio Code](https://code.visualstudio.com/) will be used as the code editor (you can use your favorite editor). -#### Install NPM packages +### Install NPM packages Open a new command line interface (terminal window) and go to your `angular` folder and then run `yarn` command to install NPM packages: @@ -786,7 +786,7 @@ Open a new command line interface (terminal window) and go to your `angular` fol yarn ``` -#### BookModule +### BookModule Run the following command line to create a new module, named `BookModule`: @@ -796,7 +796,7 @@ yarn ng generate module book --routing true ![Generating books module](./images/bookstore-creating-book-module-terminal.png) -#### Routing +### Routing Open the `app-routing.module.ts` file in `src\app` folder and add a route as shown below: @@ -849,7 +849,7 @@ function configureRoutes(routes: RoutesService) { For more information, see the [RoutesService document](https://docs.abp.io/en/abp/latest/UI/Angular/Modifying-the-Menu.md#via-routesservice). -#### Book list component +#### Book List Component Run the command below on the terminal in the root folder to generate a new component, named book-list: @@ -915,7 +915,7 @@ Open the browser and navigate to http://localhost:4200/books. We'll see **book-l ![Initial book list page](./images/bookstore-initial-book-list-page.png) -#### Generate proxies +### Generate Proxies ABP CLI provides `generate-proxy` command that generates client proxies for your HTTP APIs to make easy to consume your services from the client side. Before running generate-proxy command, your host must be up and running. See the [CLI documentation](../CLI.md) @@ -931,7 +931,7 @@ The generated files looks like below: ![Generated files](./images/generated-proxies.png) -#### BookListComponent +### BookListComponent Open the `book-list.component.ts` file in `app\book\book-list` folder and replace the content as below: @@ -1018,6 +1018,6 @@ In this tutorial we have applied the rules of official [Angular Style Guide](htt {{end}} -### Next Part +## Next Part See the [part 2](./Part-2.md) for creating, updating and deleting books. From 430e0049c85a704946ad5ddb39355ec001d23347 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Sat, 4 Jul 2020 22:38:26 +0300 Subject: [PATCH 09/58] Revised Creating a New Book section --- docs/en/Tutorials/Part-1.md | 5 +- docs/en/Tutorials/Part-2.md | 96 +++++++++++++----- .../images/bookstore-new-book-button-2.png | Bin 0 -> 84177 bytes 3 files changed, 74 insertions(+), 27 deletions(-) create mode 100644 docs/en/Tutorials/images/bookstore-new-book-button-2.png diff --git a/docs/en/Tutorials/Part-1.md b/docs/en/Tutorials/Part-1.md index 10b0a3360d..00e0852d37 100644 --- a/docs/en/Tutorials/Part-1.md +++ b/docs/en/Tutorials/Part-1.md @@ -347,7 +347,8 @@ namespace Acme.BookStore.Books public BookType Type { get; set; } = BookType.Undefined; [Required] - public DateTime PublishDate { get; set; } + [DataType(DataType.Date)] + public DateTime PublishDate { get; set; } = DateTime.Now; [Required] public float Price { get; set; } @@ -1020,4 +1021,4 @@ In this tutorial we have applied the rules of official [Angular Style Guide](htt ## Next Part -See the [part 2](./Part-2.md) for creating, updating and deleting books. +See the [part 2](Part-2.md) for creating, updating and deleting books. diff --git a/docs/en/Tutorials/Part-2.md b/docs/en/Tutorials/Part-2.md index 0a48866956..77b8986dd5 100644 --- a/docs/en/Tutorials/Part-2.md +++ b/docs/en/Tutorials/Part-2.md @@ -1,4 +1,4 @@ -## ASP.NET Core {{UI_Value}} Tutorial - Part 2 +# ASP.NET Core {{UI_Value}} Tutorial - Part 2 ````json //[doc-params] { @@ -21,36 +21,40 @@ else end }} -### About this tutorial +## About This Tutorial -This is the second part of the ASP.NET Core {{UI_Value}} tutorial series. All parts: +In this tutorial series, you will build an ABP based web application named `Acme.BookStore`. This application is used to manage a list of books and their authors. It is developed using the following technologies: -* [Part I: Creating the project and book list page](part-1.md) -* **Part II: Creating, updating and deleting books (this tutorial)** -* [Part III: Integration tests](part-3.md) +* **{{DB_Text}}** as the ORM provider. +* **{{UI_Value}}** as the UI Framework. -*You can also watch [this video course](https://amazingsolutions.teachable.com/p/lets-build-the-bookstore-application) prepared by an ABP community member, based on this tutorial.* +This tutorial is organized as the following parts; + +- [Part I: Creating the project and book list page](part-1.md) +- **Part-2: Creating, updating and deleting books (this part)** +- [Part-3: Integration tests](part-3.md) {{if UI == "MVC"}} -### Creating a new book +## Creating a New Book -In this section, you will learn how to create a new modal dialog form to create a new book. The modal dialog will look like in the below image: +In this section, you will learn how to create a new modal dialog form to create a new book. The modal dialog will look like in the image below: ![bookstore-create-dialog](./images/bookstore-create-dialog-2.png) -#### Create the modal form +### Create the Modal Form Create a new razor page, named `CreateModal.cshtml` under the `Pages/Books` folder of the `Acme.BookStore.Web` project. ![bookstore-add-create-dialog](./images/bookstore-add-create-dialog-v2.png) -##### CreateModal.cshtml.cs +#### CreateModal.cshtml.cs Open the `CreateModal.cshtml.cs` file (`CreateModalModel` class) and replace with the following code: ````C# using System.Threading.Tasks; +using Acme.BookStore.Books; using Microsoft.AspNetCore.Mvc; namespace Acme.BookStore.Web.Pages.Books @@ -67,6 +71,11 @@ namespace Acme.BookStore.Web.Pages.Books _bookAppService = bookAppService; } + public void OnGet() + { + Book = new CreateUpdateBookDto(); + } + public async Task OnPostAsync() { await _bookAppService.CreateAsync(Book); @@ -76,21 +85,24 @@ namespace Acme.BookStore.Web.Pages.Books } ```` -* This class is derived from the `BookStorePageModel` instead of standard `PageModel`. `BookStorePageModel` inherits the `PageModel` and adds some common properties & methods that can be used in your page model classes. +* This class is derived from the `BookStorePageModel` instead of standard `PageModel`. `BookStorePageModel` indirectly inherits the `PageModel` and adds some common properties & methods that can be shared in your page model classes. * `[BindProperty]` attribute on the `Book` property binds post request data to this property. * This class simply injects the `IBookAppService` in the constructor and calls the `CreateAsync` method in the `OnPostAsync` handler. +* It creates a new `CreateUpdateBookDto` object in the `OnGet` method. ASP.NET Core can work without creating a new instance like that. However, it doesn't create an instance for you and if your class has some default value assignments or code execution in the class constructor, they won't work. For this case, we set default values for some of the `CreateUpdateBookDto` properties. -##### CreateModal.cshtml +#### CreateModal.cshtml Open the `CreateModal.cshtml` file and paste the code below: ````html @page +@using Acme.BookStore.Localization +@using Acme.BookStore.Web.Pages.Books +@using Microsoft.Extensions.Localization @using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Modal -@model Acme.BookStore.Web.Pages.Books.CreateModalModel -@{ - Layout = null; -} +@model CreateModalModel +@inject IStringLocalizer L + @@ -102,12 +114,12 @@ Open the `CreateModal.cshtml` file and paste the code below: ```` -* This modal uses `abp-dynamic-form` tag helper to automatically create the form from the model `CreateBookViewModel`. +* This modal uses `abp-dynamic-form` [tag helper](../UI/AspNetCore/Tag-Helpers/Dynamic-Forms.md) to automatically create the form from the `CreateBookViewModel` model class. * `abp-model` attribute indicates the model object where it's the `Book` property in this case. * `data-ajaxForm` attribute sets the form to submit via AJAX, instead of a classic page post. * `abp-form-content` tag helper is a placeholder to render the form controls (it is optional and needed only if you have added some other content in the `abp-dynamic-form` tag, just like in this page). -#### Add the "New book" button +### Add the "New book" Button Open the `Pages/Books/Index.cshtml` and set the content of `abp-card-header` tag as below: @@ -115,23 +127,57 @@ Open the `Pages/Books/Index.cshtml` and set the content of `abp-card-header` tag -

@L["Books"]

+ @L["Books"] + button-type="Primary"/> ```` +The final content of the `Index.cshtml` is shown below: + +````html +@page +@using Acme.BookStore.Localization +@using Acme.BookStore.Web.Pages.Books +@using Microsoft.Extensions.Localization +@model IndexModel +@inject IStringLocalizer L +@section scripts +{ + +} + + + + + + @L["Books"] + + + + + + + + + + +```` + This adds a new button called **New book** to the **top-right** of the table: -![bookstore-new-book-button](./images/bookstore-new-book-button.png) +![bookstore-new-book-button](./images/bookstore-new-book-button-2.png) -Open the `pages/books/index.js` and add the following code just after the `Datatable` configuration: +Open the `Pages/Books/Index.js` and add the following code just after the `Datatable` configuration: ````js var createModal = new abp.ModalManager(abp.appPath + 'Books/CreateModal'); @@ -148,9 +194,9 @@ $('#NewBookButton').click(function (e) { * `abp.ModalManager` is a helper class to manage modals in the client side. It internally uses Twitter Bootstrap's standard modal, but abstracts many details by providing a simple API. -Now, you can **run the application** and add new books using the new modal form. +Now, you can **run the application** and add some new books using the new modal form. -### Updating a book +## Updating a Book Create a new razor page, named `EditModal.cshtml` under the `Pages/Books` folder of the `Acme.BookStore.Web` project: diff --git a/docs/en/Tutorials/images/bookstore-new-book-button-2.png b/docs/en/Tutorials/images/bookstore-new-book-button-2.png new file mode 100644 index 0000000000000000000000000000000000000000..12f18196888ad8ff03f1d7e062f99d74fa61aa5c GIT binary patch literal 84177 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

+%VocP>a)?sWz=K~W0Z|%3Ew^DG?tR0bX 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 D|7}&+ literal 0 HcmV?d00001 From 86218ad0644c121bf26b7249f45ba39b0ea80374 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Sat, 4 Jul 2020 23:35:21 +0300 Subject: [PATCH 10/58] Finalize the part-2 for the mvc ui --- docs/en/Tutorials/Part-2.md | 394 +++++++++++------- .../images/bookstore-edit-button-2.png | Bin 0 -> 94543 bytes 2 files changed, 254 insertions(+), 140 deletions(-) create mode 100644 docs/en/Tutorials/images/bookstore-edit-button-2.png diff --git a/docs/en/Tutorials/Part-2.md b/docs/en/Tutorials/Part-2.md index 77b8986dd5..694d20ed09 100644 --- a/docs/en/Tutorials/Part-2.md +++ b/docs/en/Tutorials/Part-2.md @@ -102,8 +102,10 @@ Open the `CreateModal.cshtml` file and paste the code below: @using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Modal @model CreateModalModel @inject IStringLocalizer L - - +@{ + Layout = null; +} + @@ -115,9 +117,10 @@ Open the `CreateModal.cshtml` file and paste the code below: ```` * This modal uses `abp-dynamic-form` [tag helper](../UI/AspNetCore/Tag-Helpers/Dynamic-Forms.md) to automatically create the form from the `CreateBookViewModel` model class. - * `abp-model` attribute indicates the model object where it's the `Book` property in this case. - * `data-ajaxForm` attribute sets the form to submit via AJAX, instead of a classic page post. - * `abp-form-content` tag helper is a placeholder to render the form controls (it is optional and needed only if you have added some other content in the `abp-dynamic-form` tag, just like in this page). +* `abp-model` attribute indicates the model object where it's the `Book` property in this case. +* `abp-form-content` tag helper is a placeholder to render the form controls (it is optional and needed only if you have added some other content in the `abp-dynamic-form` tag, just like in this page). + +> Tip: `Layout` should be `null` just as done in this example since we don't want to include all the layout for the modals when they are loaded via AJAX. ### Add the "New book" Button @@ -193,6 +196,73 @@ $('#NewBookButton').click(function (e) { ```` * `abp.ModalManager` is a helper class to manage modals in the client side. It internally uses Twitter Bootstrap's standard modal, but abstracts many details by providing a simple API. +* `createModal.onResult(...)` used to refresh the data table after creating a new book. +* `createModal.open();` is used to open the model to create a new book. + +The final content of the `Index.js` should be like that: + +````js +$(function () { + var l = abp.localization.getResource('BookStore'); + + var dataTable = $('#BooksTable').DataTable( + abp.libs.datatables.normalizeConfiguration({ + ajax: abp.libs.datatables.createAjax(acme.bookStore.books.book.getList), + columnDefs: [ + { + title: l('Name'), + data: "name" + }, + { + title: l('Type'), + data: "type", + render: function (data) { + return l('Enum:BookType:' + data); + } + }, + { + title: l('PublishDate'), + data: "publishDate", + render: function (data) { + return luxon + .DateTime + .fromISO(data, { + locale: abp.localization.currentCulture.name + }).toLocaleString(); + } + }, + { + title: l('Price'), + data: "price" + }, + { + title: l('CreationTime'), data: "creationTime", + render: function (data) { + return luxon + .DateTime + .fromISO(data, { + locale: abp.localization.currentCulture.name + }).toLocaleString(luxon.DateTime.DATETIME_SHORT); + } + } + ] + } + ) + ); + + var createModal = new abp.ModalManager(abp.appPath + 'Books/CreateModal'); + + createModal.onResult(function () { + dataTable.ajax.reload(); + }); + + $('#NewBookButton').click(function (e) { + e.preventDefault(); + createModal.open(); + }); + +}); +```` Now, you can **run the application** and add some new books using the new modal form. @@ -202,13 +272,14 @@ Create a new razor page, named `EditModal.cshtml` under the `Pages/Books` folder ![bookstore-add-edit-dialog](./images/bookstore-add-edit-dialog.png) -#### EditModal.cshtml.cs +### EditModal.cshtml.cs Open the `EditModal.cshtml.cs` file (`EditModalModel` class) and replace with the following code: ````csharp using System; using System.Threading.Tasks; +using Acme.BookStore.Books; using Microsoft.AspNetCore.Mvc; namespace Acme.BookStore.Web.Pages.Books @@ -245,10 +316,10 @@ namespace Acme.BookStore.Web.Pages.Books ```` * `[HiddenInput]` and `[BindProperty]` are standard ASP.NET Core MVC attributes. `SupportsGet` is used to be able to get `Id` value from query string parameter of the request. -* In the `GetAsync` method, we get `BookDto `from `BookAppService` and this is being mapped to the DTO object `CreateUpdateBookDto`. -* The `OnPostAsync` uses `BookAppService.UpdateAsync()` to update the entity. +* In the `OnGetAsync` method, we get `BookDto ` from the `BookAppService` and this is being mapped to the DTO object `CreateUpdateBookDto`. +* The `OnPostAsync` uses `BookAppService.UpdateAsync(...)` to update the entity. -#### Mapping from BookDto to CreateUpdateBookDto +### Mapping from BookDto to CreateUpdateBookDto To be able to map the `BookDto` to `CreateUpdateBookDto`, configure a new mapping. To do this, open the `BookStoreWebAutoMapperProfile.cs` in the `Acme.BookStore.Web` project and change it as shown below: @@ -269,19 +340,24 @@ namespace Acme.BookStore.Web * We have just added `CreateMap();` to define this mapping. -#### EditModal.cshtml +> Notice that we do the mapping definition in the web layer as a best practice since it is only needed in this layer. + +### EditModal.cshtml Replace `EditModal.cshtml` content with the following content: ````html @page +@using Acme.BookStore.Localization @using Acme.BookStore.Web.Pages.Books +@using Microsoft.Extensions.Localization @using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Modal @model EditModalModel +@inject IStringLocalizer L @{ Layout = null; } - + @@ -296,71 +372,78 @@ Replace `EditModal.cshtml` content with the following content: This page is very similar to the `CreateModal.cshtml`, except: * It includes an `abp-input` for the `Id` property to store `Id` of the editing book (which is a hidden input). -* It uses `Books/EditModal` as the post URL and *Update* text as the modal header. +* It uses `Books/EditModal` as the post URL. -#### Add "Actions" dropdown to the table +### Add "Actions" Dropdown to the Table We will add a dropdown button to the table named *Actions*. -Open the `Pages/Books/Index.cshtml` page and change the `` section as shown below: - -````html - - - - @L["Actions"] - @L["Name"] - @L["Type"] - @L["PublishDate"] - @L["Price"] - @L["CreationTime"] - - - -```` - -* We just added a new `th` tag for the "*Actions*" button. - -Open the `pages/books/index.js` and replace the content as below: +Open the `Pages/Books/Index.js` and replace the content as below: ````js $(function () { - var l = abp.localization.getResource('BookStore'); - var createModal = new abp.ModalManager(abp.appPath + 'Books/CreateModal'); var editModal = new abp.ModalManager(abp.appPath + 'Books/EditModal'); - var dataTable = $('#BooksTable').DataTable(abp.libs.datatables.normalizeConfiguration({ - processing: true, - serverSide: true, - paging: true, - searching: false, - autoWidth: false, - scrollCollapse: true, - order: [[1, "asc"]], - ajax: abp.libs.datatables.createAjax(acme.bookStore.book.getList), - columnDefs: [ - { - rowAction: { - items: - [ - { - text: l('Edit'), - action: function (data) { - editModal.open({ id: data.record.id }); - } - } - ] - } - }, - { data: "name" }, - { data: "type" }, - { data: "publishDate" }, - { data: "price" }, - { data: "creationTime" } - ] - })); + var dataTable = $('#BooksTable').DataTable( + abp.libs.datatables.normalizeConfiguration({ + ajax: abp.libs.datatables.createAjax(acme.bookStore.books.book.getList), + columnDefs: [ + { + title: l('Actions'), + rowAction: { + items: + [ + { + text: l('Edit'), + action: function (data) { + editModal.open({ id: data.record.id }); + } + } + ] + } + }, + { + title: l('Name'), + data: "name" + }, + { + title: l('Type'), + data: "type", + render: function (data) { + return l('Enum:BookType:' + data); + } + }, + { + title: l('PublishDate'), + data: "publishDate", + render: function (data) { + return luxon + .DateTime + .fromISO(data, { + locale: abp.localization.currentCulture.name + }).toLocaleString(); + } + }, + { + title: l('Price'), + data: "price" + }, + { + title: l('CreationTime'), data: "creationTime", + render: function (data) { + return luxon + .DateTime + .fromISO(data, { + locale: abp.localization.currentCulture.name + }).toLocaleString(luxon.DateTime.DATETIME_SHORT); + } + } + ] + } + ) + ); createModal.onResult(function () { dataTable.ajax.reload(); @@ -377,20 +460,20 @@ $(function () { }); ```` -* Used `abp.localization.getResource('BookStore')` to be able to use the same localization texts defined on the server-side. -* Added a new `ModalManager` named `createModal` to open the create modal dialog. * Added a new `ModalManager` named `editModal` to open the edit modal dialog. * Added a new column at the beginning of the `columnDefs` section. This column is used for the "*Actions*" dropdown button. -* "*New Book*" action simply calls `createModal.open()` to open the create dialog. * "*Edit*" action simply calls `editModal.open()` to open the edit dialog. +* `editModal.onResult(...)` callback refreshes the data table when you close the edit modal. -You can run the application and edit any book by selecting the edit action. The final UI looks as below: +You can run the application and edit any book by selecting the edit action on a book. -![bookstore-books-table-actions](./images/bookstore-edit-button.png) +The final UI looks as below: -### Deleting a book +![bookstore-books-table-actions](./images/bookstore-edit-button-2.png) -Open the `pages/books/index.js` and add a new item to the `rowAction` `items`: +## Deleting a Book + +Open the `Pages/Books/Index.js` and add a new item to the `rowAction` `items`: ````js { @@ -399,7 +482,7 @@ Open the `pages/books/index.js` and add a new item to the `rowAction` `items`: return l('BookDeletionConfirmationMessage', data.record.name); }, action: function (data) { - acme.bookStore.book + acme.bookStore.books.book .delete(data.record.id) .then(function() { abp.notify.info(l('SuccessfullyDeleted')); @@ -410,63 +493,101 @@ Open the `pages/books/index.js` and add a new item to the `rowAction` `items`: ```` * `confirmMessage` option is used to ask a confirmation question before executing the `action`. -* `acme.bookStore.book.delete()` method makes an AJAX request to JavaScript proxy function to delete a book. +* `acme.bookStore.books.book.delete(...)` method makes an AJAX request to the server to delete a book. * `abp.notify.info()` shows a notification after the delete operation. -The final `index.js` content is shown below: +Since we've used two new localization texts (`BookDeletionConfirmationMessage` and `SuccessfullyDeleted`) you need to add these to the localization file (`en.json` under the `Localization/BookStore` folder of the `Acme.BookStore.Domain.Shared` project): + +````json +"BookDeletionConfirmationMessage": "Are you sure to delete the book '{0}'?", +"SuccessfullyDeleted": "Successfully deleted!" +```` + +The final `Index.js` content is shown below: ````js $(function () { - var l = abp.localization.getResource('BookStore'); - var createModal = new abp.ModalManager(abp.appPath + 'Books/CreateModal'); var editModal = new abp.ModalManager(abp.appPath + 'Books/EditModal'); - var dataTable = $('#BooksTable').DataTable(abp.libs.datatables.normalizeConfiguration({ - processing: true, - serverSide: true, - paging: true, - searching: false, - autoWidth: false, - scrollCollapse: true, - order: [[1, "asc"]], - ajax: abp.libs.datatables.createAjax(acme.bookStore.book.getList), - columnDefs: [ - { - rowAction: { - items: - [ - { - text: l('Edit'), - action: function (data) { - editModal.open({ id: data.record.id }); - } - }, - { - text: l('Delete'), - confirmMessage: function (data) { - return l('BookDeletionConfirmationMessage', data.record.name); - }, - action: function (data) { - acme.bookStore.book - .delete(data.record.id) - .then(function() { - abp.notify.info(l('SuccessfullyDeleted')); - dataTable.ajax.reload(); - }); - } + var dataTable = $('#BooksTable').DataTable( + abp.libs.datatables.normalizeConfiguration({ + ajax: abp.libs.datatables.createAjax(acme.bookStore.books.book.getList), + columnDefs: [ + { + title: l('Actions'), + rowAction: { + items: + [ + { + text: l('Edit'), + action: function (data) { + editModal.open({ id: data.record.id }); + } + }, + { + text: l('Delete'), + confirmMessage: function (data) { + return l( + 'BookDeletionConfirmationMessage', + data.record.name + ); + }, + action: function (data) { + acme.bookStore.books.book + .delete(data.record.id) + .then(function() { + abp.notify.info( + l('SuccessfullyDeleted') + ); + dataTable.ajax.reload(); + }); + } + } + ] } - ] - } - }, - { data: "name" }, - { data: "type" }, - { data: "publishDate" }, - { data: "price" }, - { data: "creationTime" } - ] - })); + }, + { + title: l('Name'), + data: "name" + }, + { + title: l('Type'), + data: "type", + render: function (data) { + return l('Enum:BookType:' + data); + } + }, + { + title: l('PublishDate'), + data: "publishDate", + render: function (data) { + return luxon + .DateTime + .fromISO(data, { + locale: abp.localization.currentCulture.name + }).toLocaleString(); + } + }, + { + title: l('Price'), + data: "price" + }, + { + title: l('CreationTime'), data: "creationTime", + render: function (data) { + return luxon + .DateTime + .fromISO(data, { + locale: abp.localization.currentCulture.name + }).toLocaleString(luxon.DateTime.DATETIME_SHORT); + } + } + ] + } + ) + ); createModal.onResult(function () { dataTable.ajax.reload(); @@ -483,24 +604,17 @@ $(function () { }); ```` -Open the `en.json` in the `Acme.BookStore.Domain.Shared` project and add the following translations: - -````json -"BookDeletionConfirmationMessage": "Are you sure to delete the book {0}?", -"SuccessfullyDeleted": "Successfully deleted" -```` - -Run the application and try to delete a book. +You can run the application and try to delete a book. {{end}} {{if UI == "NG"}} -### Creating a new book +## Creating a new book In this section, you will learn how to create a new modal dialog form to create a new book. -#### Add a modal to BookListComponent +### Add a modal to BookListComponent Open `book-list.component.ts` file in `app\book\book-list` folder and replace the content as below: @@ -610,7 +724,7 @@ You can open your browser and click **New book** button to see the new modal. ![Empty modal for new book](./images/bookstore-empty-new-book-modal.png) -#### Create a reactive form +### Create a reactive form [Reactive forms](https://angular.io/guide/reactive-forms) provide a model-driven approach to handling form inputs whose values change over time. @@ -676,7 +790,7 @@ export class BookListComponent implements OnInit { * The `group` method of `FormBuilder`, `fb` creates a `FormGroup`. * Added `Validators.required` static method which validates the relevant form element. -#### Create the DOM elements of the form +### Create the DOM elements of the form Open `book-list.component.html` in `app\books\book-list` folder and replace ` ` with the following code part: @@ -719,7 +833,7 @@ Open `book-list.component.html` in `app\books\book-list` folder and replace `` tag as below: @@ -1099,9 +1213,9 @@ Open `book-list.component.html` in `app\book\book-list` folder and find the `?P+@Dkp-^A3mldzke%rM=bdf&T}xq`yq=cJxA{YS?=#&Jx&c<#rD^$4Yxwax1pwh zdb0|QxnE-sdBR643+Wb;CCM-WFrdze@YM?gFZ8#!YOdv$%H!okRZ{iRg)92$J8~D)l9@46+*`oHs zMFoy5+E}tf%c<<`ifT`~pV;nJ)~=tT;LW^C0rjJ1maUjru3DnQf|~{1*1oV~(OIdC zL7NktsbRI<9}uh2TO~#r9{cBTeXSiT#^lm8%2@ ze6RNuMrkl4Xn;OAxPxlO1qTJPqoY@$BzosC$YgPtn&ZR5)^;LvxAfj1=t`rcnh$YQ z1umT^e9oCk9j2Ba-$R9fa08-*xP|o;JS}vqY&1t1m{t<(lm;@aEY$p)5~U?9zNSva z3uST>D7w)&!WjhxYGl9?1#@Syj+A|vu_`8C0W}`0*QdBjsQ_X1pN_bj*)8S&7kg%)Gn|E)m6p$f&EG zKQr)e^IYhM=n@^4V<9{l0k#eB9o*{5Vj~^B)%gLzmXbeA$34%*4At`}z$8Ni54=F9pcZ5H`spDWn; z(8|NLYMZ%go4V(@qGHSkmIikn9o;7LV>XkqSW%h~^KwVTXYeIki(N$3*7GHtMc9o; zK`fV9zix}+8MYB#Z0F!}yRn*i9AyyonptF}&m-VqHNE-l4zuI_TJg!5gK|i$$2lC# zy`r9TIc%>wU3-p63i~s9zE_Yb?)mPA3vK*C_9oi^y0EYS!*nuYFV*sJ|9T0(0B)kG z)mZJ9W+IBIr>2@Z?bIscutpn=jbhLbf&L=n)+2vqEKqX99hs-svsaeR;5%`IAxdOTrB2EY$y{9A9t&

Books

-```` - -`Index.cshtml.cs` content should be like that: - -```csharp -using Microsoft.AspNetCore.Mvc.RazorPages; - -namespace Acme.BookStore.Web.Pages.Books -{ - public class IndexModel : PageModel - { - public void OnGet() - { - - } - } -} -``` - -### Add Books Page to the Main Menu - -Open the `BookStoreMenuContributor` class in the `Menus` folder and add the following code to the end of the `ConfigureMainMenuAsync` method: - -````csharp -context.Menu.AddItem( - new ApplicationMenuItem( - "BooksStore", - l["Menu:BookStore"], - icon: "fa fa-book" - ).AddItem( - new ApplicationMenuItem( - "BooksStore.Books", - l["Menu:Books"], - url: "/Books" - ) - ) -); -```` - -{{end}} - -### Localization - -Localization texts are located under the `Localization/BookStore` folder of the `Acme.BookStore.Domain.Shared` project: - -![bookstore-localization-files](./images/bookstore-localization-files-v2.png) - -Open the `en.json` (*the English translations*) file and change the content as below: - -````json -{ - "Culture": "en", - "Texts": { - "Menu:Home": "Home", - "Welcome": "Welcome", - "LongWelcomeMessage": "Welcome to the application. This is a startup project based on the ABP framework. For more information, visit abp.io.", - "Menu:BookStore": "Book Store", - "Menu:Books": "Books", - "Actions": "Actions", - "Edit": "Edit", - "PublishDate": "Publish date", - "NewBook": "New book", - "Name": "Name", - "Type": "Type", - "Price": "Price", - "CreationTime": "Creation time", - "AreYouSureToDelete": "Are you sure you want to delete this item?", - "Enum:BookType:0": "Undefined", - "Enum:BookType:1": "Adventure", - "Enum:BookType:2": "Biography", - "Enum:BookType:3": "Dystopia", - "Enum:BookType:4": "Fantastic", - "Enum:BookType:5": "Horror", - "Enum:BookType:6": "Science", - "Enum:BookType:7": "Science fiction", - "Enum:BookType:8": "Poetry" - } -} -```` - -* Localization key names are arbitrary. You can set any name. We prefer some conventions for specific text types; - * Add `Menu:` prefix for menu items. - * Use `Enum::` naming convention to localize the enum members. When you do it like that, ABP can automatically localize the enums in some proper cases. - -If a text is not defined in the localization file, it **fallbacks** to the localization key (as ASP.NET Core's standard behavior). - -> ABP's localization system is built on [ASP.NET Core's standard localization](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/localization) system and extends it in many ways. See the [localization document](../Localization.md) for details. - -{{if UI == "MVC"}} - -Run the project, login to the application with the username `admin` and the password `1q2w3E*` and see the new menu item has been added to the main menu: - -![bookstore-menu-items](./images/bookstore-new-menu-item.png) - -When you click to the Books menu item under the Book Store parent, you are being redirected to the new empty Books Page. - -### Book List - -We will use the [Datatables.net](https://datatables.net/) jQuery library to show the book list. Datatables library completely work via AJAX, it is fast, popular and provides a good user experience. - -> Datatables library is configured in the startup template, so you can directly use it in any page without including any style or script file to your page. - -#### Index.cshtml - -Change the `Pages/Books/Index.cshtml` as following: - -````html -@page -@using Acme.BookStore.Localization -@using Acme.BookStore.Web.Pages.Books -@using Microsoft.Extensions.Localization -@model IndexModel -@inject IStringLocalizer L -@section scripts -{ - -} - - -

@L["Books"]

-
- - - -
-```` - -* `abp-script` [tag helper](https://docs.microsoft.com/en-us/aspnet/core/mvc/views/tag-helpers/intro) is used to add external **scripts** to the page. It has many additional features compared to standard `script` tag. It handles **minification** and **versioning**. See the [bundling & minification document](../UI/AspNetCore/Bundling-Minification.md) for details. -* `abp-card` is a tag helper for Twitter Bootstrap's [card component](https://getbootstrap.com/docs/4.5/components/card/). There are other useful tag helpers provided by the ABP Framework to easily use most of the [bootstrap](https://getbootstrap.com/) components. You could use the regular HTML tags instead of these tag helpers, but using tag helpers reduces HTML code and prevents errors by help the of IntelliSense and compile time type checking. Further information, see the [tag helpers](../UI/AspNetCore/Tag-Helpers/Index.md) document. - -#### Index.js - -Create an `Index.js` file under the `Pages/Books` folder: - -![bookstore-index-js-file](./images/bookstore-index-js-file-v3.png) - -The content of the file is shown below: - -````js -$(function () { - var l = abp.localization.getResource('BookStore'); - - var dataTable = $('#BooksTable').DataTable( - abp.libs.datatables.normalizeConfiguration({ - serverSide: true, - paging: true, - order: [[1, "asc"]], - searching: false, - scrollX: true, - ajax: abp.libs.datatables.createAjax(acme.bookStore.books.book.getList), - columnDefs: [ - { - title: l('Name'), - data: "name" - }, - { - title: l('Type'), - data: "type", - render: function (data) { - return l('Enum:BookType:' + data); - } - }, - { - title: l('PublishDate'), - data: "publishDate", - render: function (data) { - return luxon - .DateTime - .fromISO(data, { - locale: abp.localization.currentCulture.name - }).toLocaleString(); - } - }, - { - title: l('Price'), - data: "price" - }, - { - title: l('CreationTime'), data: "creationTime", - render: function (data) { - return luxon - .DateTime - .fromISO(data, { - locale: abp.localization.currentCulture.name - }).toLocaleString(luxon.DateTime.DATETIME_SHORT); - } - } - ] - }) - ); -}); -```` - -* `abp.localization.getResource` gets a function that is used to localize text using the same JSON file defined in the server side. In this way, you can share the localization values with the client side. -* `abp.libs.datatables.normalizeConfiguration` is a helper function defined by the ABP Framework. There's no requirement to use it, but it simplifies the [Datatables](https://datatables.net/) configuration by providing conventional default values for missing options. -* `abp.libs.datatables.createAjax` is another helper function to adapt ABP's dynamic JavaScript API proxies to [Datatable](https://datatables.net/)'s expected parameter format -* `acme.bookStore.books.book.getList` is the dynamic JavaScript proxy function introduced before. -* [luxon](https://moment.github.io/luxon/) library is also a standard library that is pre-configured in the solution, so you can use to perform date/time operations easily. - -> See [Datatables documentation](https://datatables.net/manual/) for all configuration options. - -## Run the Final Application - -You can run the application! The final UI of this part is shown below: - -![Book list](images/bookstore-book-list-3.png) - -This is a fully working, server side paged, sorted and localized table of books. - -{{end}} - -{{if UI == "NG"}} - -## Angular UI Development -### Create the books page - -It's time to create something visible and usable! There are some tools that we will use when developing ABP Angular frontend application: - -- [Angular CLI](https://angular.io/cli) will be used to create modules, components and services. -- [Ng Bootstrap](https://ng-bootstrap.github.io/#/home) will be used as the UI component library. -- [ngx-datatable](https://swimlane.gitbook.io/ngx-datatable/) will be used as the datatable library. -- [Visual Studio Code](https://code.visualstudio.com/) will be used as the code editor (you can use your favorite editor). - -### Install NPM packages - -Open a new command line interface (terminal window) and go to your `angular` folder and then run `yarn` command to install NPM packages: - -```bash -yarn -``` - -### BookModule - -Run the following command line to create a new module, named `BookModule`: - -```bash -yarn ng generate module book --routing true -``` - -![Generating books module](./images/bookstore-creating-book-module-terminal.png) - -### Routing - -Open the `app-routing.module.ts` file in `src\app` folder and add a route as shown below: - -```js -const routes: Routes = [ -// ... -// added a new route to the routes array - { - path: 'books', - loadChildren: () => import('./book/book.module').then(m => m.BookModule) - } -] -``` - -* We added a lazy-loaded route. See the [Lazy-Loading Feature Modules](https://angular.io/guide/lazy-loading-ngmodules#lazy-loading-feature-modules). - -Open the `route.provider.ts` file in `src\app` folder and replace the content as below: - -```js -import { RoutesService, eLayoutType } from '@abp/ng.core'; -import { APP_INITIALIZER } from '@angular/core'; - -export const APP_ROUTE_PROVIDER = [ - { provide: APP_INITIALIZER, useFactory: configureRoutes, deps: [RoutesService], multi: true }, -]; - -function configureRoutes(routes: RoutesService) { - return () => { - routes.add([ - //... - // added below element - { - path: '/books', - name: '::Menu:Books', - iconClass: 'fas fa-book', - order: 101, - layout: eLayoutType.application, - }, - ]); - }; -} -``` - -* We added a new route element to show a navigation element labeled "Books" on the menu. - * `path` is the URL of the route. - * `name` is the menu item name. A Localization key can be passed. - * `iconClass` is the icon of the menu item. - * `order` is the order of the menu item. We define 101 to show the route after the "Administration" item. - * `layout` is the layout of the BooksModule's routes. `eLayoutType.application`, `eLayoutType.account` or `eLayoutType.empty` can be defined. - -For more information, see the [RoutesService document](https://docs.abp.io/en/abp/latest/UI/Angular/Modifying-the-Menu.md#via-routesservice). - -#### Book List Component - -Run the command below on the terminal in the root folder to generate a new component, named book-list: - -```bash -yarn ng generate component book/book-list -``` - -![Creating books list](./images/bookstore-creating-book-list-terminal.png) - -Open `book.module.ts` file in the `app\book` folder and replace the content as below: - -```js -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { BookRoutingModule } from './book-routing.module'; -import { BookListComponent } from './book-list/book-list.component'; -import { SharedModule } from '../shared/shared.module'; //<== added this line ==> - -@NgModule({ - declarations: [BookListComponent], - imports: [ - CommonModule, - BookRoutingModule, - SharedModule, //<== added this line ==> - ], -}) -export class BookModule {} -``` - -* We imported `SharedModule` and added to `imports` array. - -Open `book-routing.module.ts` file in the `app\book` folder and replace the content as below: - -```js -import { NgModule } from '@angular/core'; -import { Routes, RouterModule } from '@angular/router'; -import { BookListComponent } from './book-list/book-list.component'; // <== added this line ==> - -// <== replaced routes ==> -const routes: Routes = [ - { - path: '', - component: BookListComponent, - }, -]; - -@NgModule({ - imports: [RouterModule.forChild(routes)], - exports: [RouterModule] -}) -export class BookRoutingModule { } -``` - -* We imported `BookListComponent` and replaced `routes` const. - -Run `yarn start` and wait for Angular to serve the application: - -```bash -yarn start -``` - -Open the browser and navigate to http://localhost:4200/books. We'll see **book-list works!** text on the books page: - -![Initial book list page](./images/bookstore-initial-book-list-page.png) - -### Generate Proxies - -ABP CLI provides `generate-proxy` command that generates client proxies for your HTTP APIs to make easy to consume your services from the client side. Before running generate-proxy command, your host must be up and running. See the [CLI documentation](../CLI.md) - -Run the following command in the `angular` folder: - -```bash -abp generate-proxy --module app -``` - -![Generate proxy command](./images/generate-proxy-command.png) - -The generated files looks like below: - -![Generated files](./images/generated-proxies.png) - -### BookListComponent - -Open the `book-list.component.ts` file in `app\book\book-list` folder 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'; - -@Component({ - selector: 'app-book-list', - templateUrl: './book-list.component.html', - styleUrls: ['./book-list.component.scss'], - providers: [ListService], -}) -export class BookListComponent implements OnInit { - book = { items: [], totalCount: 0 } as PagedResultDto; - - booksType = BookType; - - constructor(public readonly list: ListService, private bookService: BookService) {} - - ngOnInit() { - const bookStreamCreator = (query) => this.bookService.getListByInput(query); - - this.list.hookToQuery(bookStreamCreator).subscribe((response) => { - this.book = response; - }); - } -} -``` - -* We imported and injected the generated `BookService`. -* We implemented the [ListService](https://docs.abp.io/en/abp/latest/UI/Angular/List-Service) that is a utility service to provide easy pagination, sorting, and search implementation. - -Open the `book-list.component.html` file in `app\book\book-list` folder and replace the content as below: - -```html -
-
-
-
-
- {%{{{ '::Menu:Books' | abpLocalization }}}%} -
-
-
-
-
-
- - - - - {%{{{ booksType[row.type] }}}%} - - - - - {%{{{ row.publishDate | date }}}%} - - - - - {%{{{ row.price | currency }}}%} - - - -
-
-``` - -* We added HTML code of book list page. - -Now you can see the final result on your browser: - -![Book list final result](./images/bookstore-book-list.png) - -The file system structure of the project: - -![Book list final result](./images/bookstore-angular-file-tree.png) - -In this tutorial we have applied the rules of official [Angular Style Guide](https://angular.io/guide/styleguide#file-tree). - -{{end}} - -## Next Part - -See the [part 2](Part-2.md) for creating, updating and deleting books. +See the [next part](Part-2.md) of this tutorial. diff --git a/docs/en/Tutorials/Part-2.md b/docs/en/Tutorials/Part-2.md index c744d85229..1a3c2db7fd 100644 --- a/docs/en/Tutorials/Part-2.md +++ b/docs/en/Tutorials/Part-2.md @@ -1,11 +1,10 @@ -# ASP.NET Core {{UI_Value}} Tutorial - Part 2 +# Web Application Development Tutorial - Part 2: The Book List Page ````json //[doc-params] { "UI": ["MVC","NG"] } ```` - {{ if UI == "MVC" DB="ef" @@ -30,10 +29,11 @@ In this tutorial series, you will build an ABP based web application named `Acme This tutorial is organized as the following parts; -- [Part I: Creating the project and book list page](part-1.md) -- **Part-2: Creating, updating and deleting books (this part)** -- [Part-3: Integration tests](part-3.md) -- [Part-4: Authorization](Part-4.md) +- [Part 1: Creating the server side](Part-1.md) +- **Part 2: The book list page (this part)** +- [Part 3: Creating, updating and deleting books](Part-3.md) +- [Part 4: Integration tests](Part-4.md) +- [Part 5: Authorization](Part-5.md) ### Source Code @@ -41,113 +41,178 @@ You can find the completed solution on {{if UI == "MVC"}}[the GitHub repository] {{if UI == "MVC"}} -## Creating a New Book +## Dynamic JavaScript Proxies -In this section, you will learn how to create a new modal dialog form to create a new book. The modal dialog will look like in the image below: +It's common to call the HTTP API endpoints via AJAX from the **JavaScript** side. You can use `$.ajax` or another tool to call the endpoints. However, ABP offers a better way. -![bookstore-create-dialog](./images/bookstore-create-dialog-2.png) +ABP **dynamically** creates **[JavaScript Proxies](../UI/AspNetCore/)** for all API endpoints. So, you can use any **endpoint** just like calling a **JavaScript function**. -### Create the Modal Form +### Testing in Developer Console of the Browser -Create a new razor page, named `CreateModal.cshtml` under the `Pages/Books` folder of the `Acme.BookStore.Web` project. +You can easily test the JavaScript proxies using your favorite browser's **Developer Console**. Run the application, open your browser's **developer tools** (*shortcut is generally F12*), switch to the **Console** tab, type the following code and press enter: -![bookstore-add-create-dialog](./images/bookstore-add-create-dialog-v2.png) +````js +acme.bookStore.books.book.getList({}).done(function (result) { console.log(result); }); +```` -#### CreateModal.cshtml.cs +* `acme.bookStore.books` is the namespace of the `BookAppService` converted to [camelCase](https://en.wikipedia.org/wiki/Camel_case). +* `book` is the conventional name for the `BookAppService` (removed `AppService` postfix and converted to camelCase). +* `getList` is the conventional name for the `GetListAsync` method defined in the `CrudAppService` base class (removed `Async` postfix and converted to camelCase). +* `{}` argument is used to send an empty object to the `GetListAsync` method which normally expects an object of type `PagedAndSortedResultRequestDto` that is used to send paging and sorting options to the server (all properties are optional with default values, so you can send an empty object). +* `getList` function returns a `promise`. You can pass a callback to the `then` (or `done`) function to get the result returned from the server. -Open the `CreateModal.cshtml.cs` file (`CreateModalModel` class) and replace with the following code: +Running this code produces the following output: -````C# -using System.Threading.Tasks; -using Acme.BookStore.Books; -using Microsoft.AspNetCore.Mvc; +![bookstore-javascript-proxy-console](images/bookstore-javascript-proxy-console.png) -namespace Acme.BookStore.Web.Pages.Books -{ - public class CreateModalModel : BookStorePageModel - { - [BindProperty] - public CreateUpdateBookDto Book { get; set; } +You can see the **book list** returned from the server. You can also check the **network** tab of the developer tools to see the client to server communication: - private readonly IBookAppService _bookAppService; +![bookstore-getlist-result-network](images/bookstore-getlist-result-network.png) - public CreateModalModel(IBookAppService bookAppService) - { - _bookAppService = bookAppService; - } +Let's **create a new book** using the `create` function: - public void OnGet() - { - Book = new CreateUpdateBookDto(); - } +````js +acme.bookStore.books.book.create({ + name: 'Foundation', + type: 7, + publishDate: '1951-05-24', + price: 21.5 + }).then(function (result) { + console.log('successfully created the book with id: ' + result.id); + }); +```` - public async Task OnPostAsync() - { - await _bookAppService.CreateAsync(Book); - return NoContent(); - } - } -} +You should see a message in the console something like that: + +````text +successfully created the book with id: 439b0ea8-923e-8e1e-5d97-39f2c7ac4246 ```` -* This class is derived from the `BookStorePageModel` instead of standard `PageModel`. `BookStorePageModel` indirectly inherits the `PageModel` and adds some common properties & methods that can be shared in your page model classes. -* `[BindProperty]` attribute on the `Book` property binds post request data to this property. -* This class simply injects the `IBookAppService` in the constructor and calls the `CreateAsync` method in the `OnPostAsync` handler. -* It creates a new `CreateUpdateBookDto` object in the `OnGet` method. ASP.NET Core can work without creating a new instance like that. However, it doesn't create an instance for you and if your class has some default value assignments or code execution in the class constructor, they won't work. For this case, we set default values for some of the `CreateUpdateBookDto` properties. +Check the `Books` table in the database to see the new book row. You can try `get`, `update` and `delete` functions yourself. + +We will use these dynamic proxy functions in the next sections to communicate to the server. -#### CreateModal.cshtml +## Create a Books Page -Open the `CreateModal.cshtml` file and paste the code below: +It's time to create something visible and usable! Instead of classic MVC, we will use the [Razor Pages UI](https://docs.microsoft.com/en-us/aspnet/core/tutorials/razor-pages/razor-pages-start) approach which is recommended by Microsoft. + +Create `Books` folder under the `Pages` folder of the `Acme.BookStore.Web` project. Add a new Razor Page by right clicking the Books folder then selecting **Add > Razor Page** menu item. Name it as `Index`: + +![bookstore-add-index-page](./images/bookstore-add-index-page-v2.png) + +Open the `Index.cshtml` and change the whole content as shown below: ````html @page -@using Acme.BookStore.Localization @using Acme.BookStore.Web.Pages.Books -@using Microsoft.Extensions.Localization -@using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Modal -@model CreateModalModel -@inject IStringLocalizer L -@{ - Layout = null; +@model IndexModel + +

Books

+```` + +`Index.cshtml.cs` content should be like that: + +```csharp +using Microsoft.AspNetCore.Mvc.RazorPages; + +namespace Acme.BookStore.Web.Pages.Books +{ + public class IndexModel : PageModel + { + public void OnGet() + { + + } + } } - - - - - - - - - +``` + +### Add Books Page to the Main Menu + +Open the `BookStoreMenuContributor` class in the `Menus` folder and add the following code to the end of the `ConfigureMainMenuAsync` method: + +````csharp +context.Menu.AddItem( + new ApplicationMenuItem( + "BooksStore", + l["Menu:BookStore"], + icon: "fa fa-book" + ).AddItem( + new ApplicationMenuItem( + "BooksStore.Books", + l["Menu:Books"], + url: "/Books" + ) + ) +); ```` -* This modal uses `abp-dynamic-form` [tag helper](../UI/AspNetCore/Tag-Helpers/Dynamic-Forms.md) to automatically create the form from the `CreateBookViewModel` model class. -* `abp-model` attribute indicates the model object where it's the `Book` property in this case. -* `abp-form-content` tag helper is a placeholder to render the form controls (it is optional and needed only if you have added some other content in the `abp-dynamic-form` tag, just like in this page). +{{end}} -> Tip: `Layout` should be `null` just as done in this example since we don't want to include all the layout for the modals when they are loaded via AJAX. +### Localization -### Add the "New book" Button +Localization texts are located under the `Localization/BookStore` folder of the `Acme.BookStore.Domain.Shared` project: -Open the `Pages/Books/Index.cshtml` and set the content of `abp-card-header` tag as below: +![bookstore-localization-files](./images/bookstore-localization-files-v2.png) -````html - - - - @L["Books"] - - - - - - +Open the `en.json` (*the English translations*) file and change the content as below: + +````json +{ + "Culture": "en", + "Texts": { + "Menu:Home": "Home", + "Welcome": "Welcome", + "LongWelcomeMessage": "Welcome to the application. This is a startup project based on the ABP framework. For more information, visit abp.io.", + "Menu:BookStore": "Book Store", + "Menu:Books": "Books", + "Actions": "Actions", + "Edit": "Edit", + "PublishDate": "Publish date", + "NewBook": "New book", + "Name": "Name", + "Type": "Type", + "Price": "Price", + "CreationTime": "Creation time", + "AreYouSureToDelete": "Are you sure you want to delete this item?", + "Enum:BookType:0": "Undefined", + "Enum:BookType:1": "Adventure", + "Enum:BookType:2": "Biography", + "Enum:BookType:3": "Dystopia", + "Enum:BookType:4": "Fantastic", + "Enum:BookType:5": "Horror", + "Enum:BookType:6": "Science", + "Enum:BookType:7": "Science fiction", + "Enum:BookType:8": "Poetry" + } +} ```` -The final content of the `Index.cshtml` is shown below: +* Localization key names are arbitrary. You can set any name. We prefer some conventions for specific text types; + * Add `Menu:` prefix for menu items. + * Use `Enum::` naming convention to localize the enum members. When you do it like that, ABP can automatically localize the enums in some proper cases. + +If a text is not defined in the localization file, it **fallbacks** to the localization key (as ASP.NET Core's standard behavior). + +> ABP's localization system is built on [ASP.NET Core's standard localization](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/localization) system and extends it in many ways. See the [localization document](../Localization.md) for details. + +{{if UI == "MVC"}} + +Run the project, login to the application with the username `admin` and the password `1q2w3E*` and see the new menu item has been added to the main menu: + +![bookstore-menu-items](./images/bookstore-new-menu-item.png) + +When you click to the Books menu item under the Book Store parent, you are being redirected to the new empty Books Page. + +### Book List + +We will use the [Datatables.net](https://datatables.net/) jQuery library to show the book list. Datatables library completely work via AJAX, it is fast, popular and provides a good user experience. + +> Datatables library is configured in the startup template, so you can directly use it in any page without including any style or script file to your page. + +#### Index.cshtml + +Change the `Pages/Books/Index.cshtml` as following: ````html @page @@ -158,22 +223,11 @@ The final content of the `Index.cshtml` is shown below: @inject IStringLocalizer L @section scripts { - + } - - - - @L["Books"] - - - - - +

@L["Books"]

@@ -181,30 +235,16 @@ The final content of the `Index.cshtml` is shown below:
```` -This adds a new button called **New book** to the **top-right** of the table: +* `abp-script` [tag helper](https://docs.microsoft.com/en-us/aspnet/core/mvc/views/tag-helpers/intro) is used to add external **scripts** to the page. It has many additional features compared to standard `script` tag. It handles **minification** and **versioning**. See the [bundling & minification document](../UI/AspNetCore/Bundling-Minification.md) for details. +* `abp-card` is a tag helper for Twitter Bootstrap's [card component](https://getbootstrap.com/docs/4.5/components/card/). There are other useful tag helpers provided by the ABP Framework to easily use most of the [bootstrap](https://getbootstrap.com/) components. You could use the regular HTML tags instead of these tag helpers, but using tag helpers reduces HTML code and prevents errors by help the of IntelliSense and compile time type checking. Further information, see the [tag helpers](../UI/AspNetCore/Tag-Helpers/Index.md) document. -![bookstore-new-book-button](./images/bookstore-new-book-button-2.png) +#### Index.js -Open the `Pages/Books/Index.js` and add the following code just after the `Datatable` configuration: +Create an `Index.js` file under the `Pages/Books` folder: -````js -var createModal = new abp.ModalManager(abp.appPath + 'Books/CreateModal'); - -createModal.onResult(function () { - dataTable.ajax.reload(); -}); - -$('#NewBookButton').click(function (e) { - e.preventDefault(); - createModal.open(); -}); -```` +![bookstore-index-js-file](./images/bookstore-index-js-file-v3.png) -* `abp.ModalManager` is a helper class to manage modals in the client side. It internally uses Twitter Bootstrap's standard modal, but abstracts many details by providing a simple API. -* `createModal.onResult(...)` used to refresh the data table after creating a new book. -* `createModal.open();` is used to open the model to create a new book. - -The final content of the `Index.js` should be like that: +The content of the file is shown below: ````js $(function () { @@ -258,381 +298,195 @@ $(function () { ] }) ); - - var createModal = new abp.ModalManager(abp.appPath + 'Books/CreateModal'); - - createModal.onResult(function () { - dataTable.ajax.reload(); - }); - - $('#NewBookButton').click(function (e) { - e.preventDefault(); - createModal.open(); - }); }); ```` -Now, you can **run the application** and add some new books using the new modal form. +* `abp.localization.getResource` gets a function that is used to localize text using the same JSON file defined in the server side. In this way, you can share the localization values with the client side. +* `abp.libs.datatables.normalizeConfiguration` is a helper function defined by the ABP Framework. There's no requirement to use it, but it simplifies the [Datatables](https://datatables.net/) configuration by providing conventional default values for missing options. +* `abp.libs.datatables.createAjax` is another helper function to adapt ABP's dynamic JavaScript API proxies to [Datatable](https://datatables.net/)'s expected parameter format +* `acme.bookStore.books.book.getList` is the dynamic JavaScript proxy function introduced before. +* [luxon](https://moment.github.io/luxon/) library is also a standard library that is pre-configured in the solution, so you can use to perform date/time operations easily. -## Updating a Book +> See [Datatables documentation](https://datatables.net/manual/) for all configuration options. -Create a new razor page, named `EditModal.cshtml` under the `Pages/Books` folder of the `Acme.BookStore.Web` project: +## Run the Final Application -![bookstore-add-edit-dialog](./images/bookstore-add-edit-dialog.png) +You can run the application! The final UI of this part is shown below: -### EditModal.cshtml.cs +![Book list](images/bookstore-book-list-3.png) -Open the `EditModal.cshtml.cs` file (`EditModalModel` class) and replace with the following code: +This is a fully working, server side paged, sorted and localized table of books. -````csharp -using System; -using System.Threading.Tasks; -using Acme.BookStore.Books; -using Microsoft.AspNetCore.Mvc; +{{end}} -namespace Acme.BookStore.Web.Pages.Books -{ - public class EditModalModel : BookStorePageModel - { - [HiddenInput] - [BindProperty(SupportsGet = true)] - public Guid Id { get; set; } +{{if UI == "NG"}} - [BindProperty] - public CreateUpdateBookDto Book { get; set; } +## Angular UI Development +### Create the books page - private readonly IBookAppService _bookAppService; +It's time to create something visible and usable! There are some tools that we will use when developing ABP Angular frontend application: - public EditModalModel(IBookAppService bookAppService) - { - _bookAppService = bookAppService; - } +- [Angular CLI](https://angular.io/cli) will be used to create modules, components and services. +- [Ng Bootstrap](https://ng-bootstrap.github.io/#/home) will be used as the UI component library. +- [ngx-datatable](https://swimlane.gitbook.io/ngx-datatable/) will be used as the datatable library. +- [Visual Studio Code](https://code.visualstudio.com/) will be used as the code editor (you can use your favorite editor). - public async Task OnGetAsync() - { - var bookDto = await _bookAppService.GetAsync(Id); - Book = ObjectMapper.Map(bookDto); - } +### Install NPM packages - public async Task OnPostAsync() - { - await _bookAppService.UpdateAsync(Id, Book); - return NoContent(); - } - } -} -```` +Open a new command line interface (terminal window) and go to your `angular` folder and then run `yarn` command to install NPM packages: -* `[HiddenInput]` and `[BindProperty]` are standard ASP.NET Core MVC attributes. `SupportsGet` is used to be able to get `Id` value from query string parameter of the request. -* In the `OnGetAsync` method, we get `BookDto ` from the `BookAppService` and this is being mapped to the DTO object `CreateUpdateBookDto`. -* The `OnPostAsync` uses `BookAppService.UpdateAsync(...)` to update the entity. +```bash +yarn +``` -### Mapping from BookDto to CreateUpdateBookDto +### BookModule -To be able to map the `BookDto` to `CreateUpdateBookDto`, configure a new mapping. To do this, open the `BookStoreWebAutoMapperProfile.cs` in the `Acme.BookStore.Web` project and change it as shown below: +Run the following command line to create a new module, named `BookModule`: -````csharp -using AutoMapper; +```bash +yarn ng generate module book --routing true +``` -namespace Acme.BookStore.Web -{ - public class BookStoreWebAutoMapperProfile : Profile - { - public BookStoreWebAutoMapperProfile() - { - CreateMap(); - } - } -} -```` +![Generating books module](./images/bookstore-creating-book-module-terminal.png) + +### Routing -* We have just added `CreateMap();` to define this mapping. +Open the `app-routing.module.ts` file in `src\app` folder and add a route as shown below: -> Notice that we do the mapping definition in the web layer as a best practice since it is only needed in this layer. +```js +const routes: Routes = [ +// ... +// added a new route to the routes array + { + path: 'books', + loadChildren: () => import('./book/book.module').then(m => m.BookModule) + } +] +``` -### EditModal.cshtml +* We added a lazy-loaded route. See the [Lazy-Loading Feature Modules](https://angular.io/guide/lazy-loading-ngmodules#lazy-loading-feature-modules). -Replace `EditModal.cshtml` content with the following content: +Open the `route.provider.ts` file in `src\app` folder and replace the content as below: -````html -@page -@using Acme.BookStore.Localization -@using Acme.BookStore.Web.Pages.Books -@using Microsoft.Extensions.Localization -@using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Modal -@model EditModalModel -@inject IStringLocalizer L -@{ - Layout = null; +```js +import { RoutesService, eLayoutType } from '@abp/ng.core'; +import { APP_INITIALIZER } from '@angular/core'; + +export const APP_ROUTE_PROVIDER = [ + { provide: APP_INITIALIZER, useFactory: configureRoutes, deps: [RoutesService], multi: true }, +]; + +function configureRoutes(routes: RoutesService) { + return () => { + routes.add([ + //... + // added below element + { + path: '/books', + name: '::Menu:Books', + iconClass: 'fas fa-book', + order: 101, + layout: eLayoutType.application, + }, + ]); + }; } - - - - - - - - - - -```` +``` -This page is very similar to the `CreateModal.cshtml`, except: +* We added a new route element to show a navigation element labeled "Books" on the menu. + * `path` is the URL of the route. + * `name` is the menu item name. A Localization key can be passed. + * `iconClass` is the icon of the menu item. + * `order` is the order of the menu item. We define 101 to show the route after the "Administration" item. + * `layout` is the layout of the BooksModule's routes. `eLayoutType.application`, `eLayoutType.account` or `eLayoutType.empty` can be defined. -* It includes an `abp-input` for the `Id` property to store `Id` of the editing book (which is a hidden input). -* It uses `Books/EditModal` as the post URL. +For more information, see the [RoutesService document](https://docs.abp.io/en/abp/latest/UI/Angular/Modifying-the-Menu.md#via-routesservice). -### Add "Actions" Dropdown to the Table +#### Book List Component -We will add a dropdown button to the table named *Actions*. +Run the command below on the terminal in the root folder to generate a new component, named book-list: -Open the `Pages/Books/Index.js` and replace the content as below: +```bash +yarn ng generate component book/book-list +``` -````js -$(function () { - var l = abp.localization.getResource('BookStore'); - var createModal = new abp.ModalManager(abp.appPath + 'Books/CreateModal'); - var editModal = new abp.ModalManager(abp.appPath + 'Books/EditModal'); +![Creating books list](./images/bookstore-creating-book-list-terminal.png) - var dataTable = $('#BooksTable').DataTable( - abp.libs.datatables.normalizeConfiguration({ - serverSide: true, - paging: true, - order: [[1, "asc"]], - searching: false, - scrollX: true, - ajax: abp.libs.datatables.createAjax(acme.bookStore.books.book.getList), - columnDefs: [ - { - title: l('Actions'), - rowAction: { - items: - [ - { - text: l('Edit'), - action: function (data) { - editModal.open({ id: data.record.id }); - } - } - ] - } - }, - { - title: l('Name'), - data: "name" - }, - { - title: l('Type'), - data: "type", - render: function (data) { - return l('Enum:BookType:' + data); - } - }, - { - title: l('PublishDate'), - data: "publishDate", - render: function (data) { - return luxon - .DateTime - .fromISO(data, { - locale: abp.localization.currentCulture.name - }).toLocaleString(); - } - }, - { - title: l('Price'), - data: "price" - }, - { - title: l('CreationTime'), data: "creationTime", - render: function (data) { - return luxon - .DateTime - .fromISO(data, { - locale: abp.localization.currentCulture.name - }).toLocaleString(luxon.DateTime.DATETIME_SHORT); - } - } - ] - }) - ); +Open `book.module.ts` file in the `app\book` folder and replace the content as below: - createModal.onResult(function () { - dataTable.ajax.reload(); - }); +```js +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { BookRoutingModule } from './book-routing.module'; +import { BookListComponent } from './book-list/book-list.component'; +import { SharedModule } from '../shared/shared.module'; //<== added this line ==> - editModal.onResult(function () { - dataTable.ajax.reload(); - }); +@NgModule({ + declarations: [BookListComponent], + imports: [ + CommonModule, + BookRoutingModule, + SharedModule, //<== added this line ==> + ], +}) +export class BookModule {} +``` - $('#NewBookButton').click(function (e) { - e.preventDefault(); - createModal.open(); - }); -}); -```` +* We imported `SharedModule` and added to `imports` array. -* Added a new `ModalManager` named `editModal` to open the edit modal dialog. -* Added a new column at the beginning of the `columnDefs` section. This column is used for the "*Actions*" dropdown button. -* "*Edit*" action simply calls `editModal.open()` to open the edit dialog. -* `editModal.onResult(...)` callback refreshes the data table when you close the edit modal. +Open `book-routing.module.ts` file in the `app\book` folder and replace the content as below: -You can run the application and edit any book by selecting the edit action on a book. +```js +import { NgModule } from '@angular/core'; +import { Routes, RouterModule } from '@angular/router'; +import { BookListComponent } from './book-list/book-list.component'; // <== added this line ==> -The final UI looks as below: +// <== replaced routes ==> +const routes: Routes = [ + { + path: '', + component: BookListComponent, + }, +]; -![bookstore-books-table-actions](./images/bookstore-edit-button-2.png) +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule] +}) +export class BookRoutingModule { } +``` -## Deleting a Book +* We imported `BookListComponent` and replaced `routes` const. -Open the `Pages/Books/Index.js` and add a new item to the `rowAction` `items`: +Run `yarn start` and wait for Angular to serve the application: -````js -{ - text: l('Delete'), - confirmMessage: function (data) { - return l('BookDeletionConfirmationMessage', data.record.name); - }, - action: function (data) { - acme.bookStore.books.book - .delete(data.record.id) - .then(function() { - abp.notify.info(l('SuccessfullyDeleted')); - dataTable.ajax.reload(); - }); - } -} -```` +```bash +yarn start +``` -* `confirmMessage` option is used to ask a confirmation question before executing the `action`. -* `acme.bookStore.books.book.delete(...)` method makes an AJAX request to the server to delete a book. -* `abp.notify.info()` shows a notification after the delete operation. +Open the browser and navigate to http://localhost:4200/books. We'll see **book-list works!** text on the books page: -Since we've used two new localization texts (`BookDeletionConfirmationMessage` and `SuccessfullyDeleted`) you need to add these to the localization file (`en.json` under the `Localization/BookStore` folder of the `Acme.BookStore.Domain.Shared` project): +![Initial book list page](./images/bookstore-initial-book-list-page.png) -````json -"BookDeletionConfirmationMessage": "Are you sure to delete the book '{0}'?", -"SuccessfullyDeleted": "Successfully deleted!" -```` +### Generate Proxies -The final `Index.js` content is shown below: +ABP CLI provides `generate-proxy` command that generates client proxies for your HTTP APIs to make easy to consume your services from the client side. Before running generate-proxy command, your host must be up and running. See the [CLI documentation](../CLI.md) -````js -$(function () { - var l = abp.localization.getResource('BookStore'); - var createModal = new abp.ModalManager(abp.appPath + 'Books/CreateModal'); - var editModal = new abp.ModalManager(abp.appPath + 'Books/EditModal'); +Run the following command in the `angular` folder: - var dataTable = $('#BooksTable').DataTable( - abp.libs.datatables.normalizeConfiguration({ - serverSide: true, - paging: true, - order: [[1, "asc"]], - searching: false, - scrollX: true, - ajax: abp.libs.datatables.createAjax(acme.bookStore.books.book.getList), - columnDefs: [ - { - title: l('Actions'), - rowAction: { - items: - [ - { - text: l('Edit'), - action: function (data) { - editModal.open({ id: data.record.id }); - } - }, - { - text: l('Delete'), - confirmMessage: function (data) { - return l( - 'BookDeletionConfirmationMessage', - data.record.name - ); - }, - action: function (data) { - acme.bookStore.books.book - .delete(data.record.id) - .then(function() { - abp.notify.info( - l('SuccessfullyDeleted') - ); - dataTable.ajax.reload(); - }); - } - } - ] - } - }, - { - title: l('Name'), - data: "name" - }, - { - title: l('Type'), - data: "type", - render: function (data) { - return l('Enum:BookType:' + data); - } - }, - { - title: l('PublishDate'), - data: "publishDate", - render: function (data) { - return luxon - .DateTime - .fromISO(data, { - locale: abp.localization.currentCulture.name - }).toLocaleString(); - } - }, - { - title: l('Price'), - data: "price" - }, - { - title: l('CreationTime'), data: "creationTime", - render: function (data) { - return luxon - .DateTime - .fromISO(data, { - locale: abp.localization.currentCulture.name - }).toLocaleString(luxon.DateTime.DATETIME_SHORT); - } - } - ] - }) - ); +```bash +abp generate-proxy --module app +``` - createModal.onResult(function () { - dataTable.ajax.reload(); - }); - - editModal.onResult(function () { - dataTable.ajax.reload(); - }); - - $('#NewBookButton').click(function (e) { - e.preventDefault(); - createModal.open(); - }); -}); -```` - -You can run the application and try to delete a book. - -{{end}} - -{{if UI == "NG"}} +![Generate proxy command](./images/generate-proxy-command.png) -## Creating a new book +The generated files looks like below: -In this section, you will learn how to create a new modal dialog form to create a new book. +![Generated files](./images/generated-proxies.png) -### Add a modal to BookListComponent +### BookListComponent -Open `book-list.component.ts` file in `app\book\book-list` folder and replace the content as below: +Open the `book-list.component.ts` file in `app\book\book-list` folder and replace the content as below: ```js import { ListService, PagedResultDto } from '@abp/ng.core'; @@ -651,8 +505,6 @@ export class BookListComponent implements OnInit { booksType = BookType; - isModalOpen = false; // <== added this line ==> - constructor(public readonly list: ListService, private bookService: BookService) {} ngOnInit() { @@ -662,36 +514,24 @@ export class BookListComponent implements OnInit { this.book = response; }); } - - // added createBook method - createBook() { - this.isModalOpen = true; - } } ``` -* We defined a variable called `isModalOpen` and `createBook` method. -* We added the `createBook` method. - +* We imported and injected the generated `BookService`. +* We implemented the [ListService](https://docs.abp.io/en/abp/latest/UI/Angular/List-Service) that is a utility service to provide easy pagination, sorting, and search implementation. -Open `book-list.component.html` file in `books\book-list` folder and replace the content as below: +Open the `book-list.component.html` file in `app\book\book-list` folder and replace the content as below: ```html
-
{%{{{ '::Menu:Books' | abpLocalization }}}%}
-
- -
-
- -
+
+ {%{{{ '::Menu:Books' | abpLocalization }}}%} +
+
@@ -715,587 +555,22 @@ Open `book-list.component.html` file in `books\book-list` folder and replace the
- - - - -

{%{{{ '::NewBook' | abpLocalization }}}%}

-
- - - - - - -
-``` - -* We added the `abp-modal` which renders a modal to allow user to create a new book. -* `abp-modal` is a pre-built component to show modals. While you could use another approach to show a modal, `abp-modal` provides additional benefits. -* We added `New book` button to the `AbpContentToolbar`. - -You can open your browser and click **New book** button to see the new modal. - -![Empty modal for new book](./images/bookstore-empty-new-book-modal.png) - -### Create a reactive form - -[Reactive forms](https://angular.io/guide/reactive-forms) provide a model-driven approach to handling form inputs whose values change over time. - -Open `book-list.component.ts` file in `app\book\book-list` folder 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 { FormGroup, FormBuilder, Validators } from '@angular/forms'; // <== added this line ==> - -@Component({ - selector: 'app-book-list', - templateUrl: './book-list.component.html', - styleUrls: ['./book-list.component.scss'], - providers: [ListService], -}) -export class BookListComponent implements OnInit { - book = { items: [], totalCount: 0 } as PagedResultDto; - - booksType = BookType; - - isModalOpen = false; - - form: FormGroup; // <== added this line ==> - - constructor( - public readonly list: ListService, - private bookService: BookService, - private fb: FormBuilder // <== injected FormBuilder ==> - ) {} - - ngOnInit() { - const bookStreamCreator = (query) => this.bookService.getListByInput(query); - - this.list.hookToQuery(bookStreamCreator).subscribe((response) => { - this.book = response; - }); - } - - createBook() { - this.buildForm(); // <== added this line ==> - this.isModalOpen = true; - } - - // added buildForm method - buildForm() { - this.form = this.fb.group({ - name: ['', Validators.required], - type: [null, Validators.required], - publishDate: [null, Validators.required], - price: [null, Validators.required], - }); - } -} -``` - -* We imported `FormGroup, FormBuilder and Validators`. -* We added `form: FormGroup` variable. -* We injected `fb: FormBuilder` service to the constructor. The [FormBuilder](https://angular.io/api/forms/FormBuilder) service provides convenient methods for generating controls. It reduces the amount of boilerplate needed to build complex forms. -* We added `buildForm` method to the end of the file and executed `buildForm()` in the `createBook` method. This method creates a reactive form to be able to create a new book. - * The `group` method of `FormBuilder`, `fb` creates a `FormGroup`. - * Added `Validators.required` static method which validates the relevant form element. - -### Create the DOM elements of the form - -Open `book-list.component.html` in `app\books\book-list` folder and replace ` ` with the following code part: - -```html - -
-
- * - -
- -
- * - -
- -
- * - -
- -
- * - -
-
-
-``` - -- This template creates a form with `Name`, `Price`, `Type` and `Publish` date fields. -- We've used [NgBootstrap datepicker](https://ng-bootstrap.github.io/#/components/datepicker/overview) in this component. - -### Datepicker requirements - -Open `book.module.ts` file in `app\book` folder and replace the content as below: - -```js -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { BookRoutingModule } from './book-routing.module'; -import { BookListComponent } from './book-list/book-list.component'; -import { SharedModule } from '../shared/shared.module'; -import { NgbDatepickerModule } from '@ng-bootstrap/ng-bootstrap'; //<== added this line ==> - -@NgModule({ - declarations: [BookListComponent], - imports: [ - CommonModule, - BookRoutingModule, - SharedModule, - NgbDatepickerModule, //<== added this line ==> - ], -}) -export class BookModule {} -``` - -* We imported `NgbDatepickerModule` to be able to use the date picker. - -Open `book-list.component.ts` file in `app\book\book-list` folder 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 { FormGroup, FormBuilder, Validators } from '@angular/forms'; -import { NgbDateNativeAdapter, NgbDateAdapter } from '@ng-bootstrap/ng-bootstrap'; // <== added this line ==> - -@Component({ - selector: 'app-book-list', - templateUrl: './book-list.component.html', - styleUrls: ['./book-list.component.scss'], - providers: [ListService, { provide: NgbDateAdapter, useClass: NgbDateNativeAdapter }], // <== added a provide ==> -}) -export class BookListComponent implements OnInit { - book = { items: [], totalCount: 0 } as PagedResultDto; - - booksType = BookType; - - // <== added bookTypeArr array ==> - bookTypeArr = Object.keys(BookType).filter( - (bookType) => typeof this.booksType[bookType] === 'number' - ); - - isModalOpen = false; - - form: FormGroup; - - constructor( - public readonly list: ListService, - private bookService: BookService, - private fb: FormBuilder - ) {} - - ngOnInit() { - const bookStreamCreator = (query) => this.bookService.getListByInput(query); - - this.list.hookToQuery(bookStreamCreator).subscribe((response) => { - this.book = response; - }); - } - - createBook() { - this.buildForm(); - this.isModalOpen = true; - } - - buildForm() { - this.form = this.fb.group({ - name: ['', Validators.required], - type: [null, Validators.required], - publishDate: [null, Validators.required], - price: [null, Validators.required], - }); - } -} ``` -* We imported ` NgbDateNativeAdapter, NgbDateAdapter` - -* We added a new provider `NgbDateAdapter` that converts Datepicker value to `Date` type. See the [datepicker adapters](https://ng-bootstrap.github.io/#/components/datepicker/overview) for more details. - -* We added `bookTypeArr` array to be able to use it in the combobox values. The `bookTypeArr` contains the fields of the `BookType` enum. Resulting array is shown below: +* We added HTML code of book list page. - ```js - ['Adventure', 'Biography', 'Dystopia', 'Fantastic' ...] - ``` +Now you can see the final result on your browser: - This array was used in the previous form template in the `ngFor` loop. +![Book list final result](./images/bookstore-book-list.png) -Now, you can open your browser to see the changes: - - -![New book modal](./images/bookstore-new-book-form.png) - -### Saving the book - -Open `book-list.component.ts` file in `app\book\book-list` folder 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 { FormGroup, FormBuilder, Validators } from '@angular/forms'; -import { NgbDateNativeAdapter, NgbDateAdapter } from '@ng-bootstrap/ng-bootstrap'; - -@Component({ - selector: 'app-book-list', - templateUrl: './book-list.component.html', - styleUrls: ['./book-list.component.scss'], - providers: [ListService, { provide: NgbDateAdapter, useClass: NgbDateNativeAdapter }], -}) -export class BookListComponent implements OnInit { - book = { items: [], totalCount: 0 } as PagedResultDto; - - booksType = BookType; - - bookTypeArr = Object.keys(BookType).filter( - (bookType) => typeof this.booksType[bookType] === 'number' - ); - - isModalOpen = false; - - form: FormGroup; - - constructor( - public readonly list: ListService, - private bookService: BookService, - private fb: FormBuilder - ) {} - - ngOnInit() { - const bookStreamCreator = (query) => this.bookService.getListByInput(query); - - this.list.hookToQuery(bookStreamCreator).subscribe((response) => { - this.book = response; - }); - } - - createBook() { - this.buildForm(); - this.isModalOpen = true; - } - - buildForm() { - this.form = this.fb.group({ - name: ['', Validators.required], - type: [null, Validators.required], - publishDate: [null, Validators.required], - price: [null, Validators.required], - }); - } - - // <== added save ==> - save() { - if (this.form.invalid) { - return; - } - - this.bookService.createByInput(this.form.value).subscribe(() => { - this.isModalOpen = false; - this.form.reset(); - this.list.get(); - }); - } -} -``` - -* We added `save` method - -Open `book-list.component.html` in `app\book\book-list` folder, find the `` element and replace this element with the following to create a new book. - -```html - - - - - - -``` - -Find the `
` tag and replace below content: - -```html - -``` - - -* We added the `(ngSubmit)="save()"` to `` element to save a new book by pressing the enter. -* We added `abp-button` to the bottom area of the modal to save a new book. - -The final modal UI looks like below: - -![Save button to the modal](./images/bookstore-new-book-form-v2.png) - -## Updating a book - -Open `book-list.component.ts` in `app\book\book-list` folder and add a variable named `selectedBook`. - -```js -import { ListService, PagedResultDto } from '@abp/ng.core'; -import { Component, OnInit } from '@angular/core'; -import { BookDto, BookType } from '../models'; -import { BookService } from '../services'; -import { FormGroup, FormBuilder, Validators } from '@angular/forms'; -import { NgbDateNativeAdapter, NgbDateAdapter } from '@ng-bootstrap/ng-bootstrap'; - -@Component({ - selector: 'app-book-list', - templateUrl: './book-list.component.html', - styleUrls: ['./book-list.component.scss'], - providers: [ListService, { provide: NgbDateAdapter, useClass: NgbDateNativeAdapter }], -}) -export class BookListComponent implements OnInit { - book = { items: [], totalCount: 0 } as PagedResultDto; - - booksType = BookType; - - bookTypeArr = Object.keys(BookType).filter( - (bookType) => typeof this.booksType[bookType] === 'number' - ); - - isModalOpen = false; - - form: FormGroup; - - selectedBook = {} as BookDto; // <== declared selectedBook ==> - - constructor( - public readonly list: ListService, - private bookService: BookService, - private fb: FormBuilder - ) {} - - ngOnInit() { - const bookStreamCreator = (query) => this.bookService.getListByInput(query); - - this.list.hookToQuery(bookStreamCreator).subscribe((response) => { - this.book = response; - }); - } - - // <== this method is replaced ==> - createBook() { - this.selectedBook = {} as BookDto; // <== added ==> - this.buildForm(); - this.isModalOpen = true; - } - - // <== added editBook method ==> - editBook(id: string) { - this.bookService.getById(id).subscribe((book) => { - this.selectedBook = book; - this.buildForm(); - this.isModalOpen = true; - }); - } - - // <== this method is replaced ==> - buildForm() { - this.form = this.fb.group({ - name: [this.selectedBook.name || '', Validators.required], - type: [this.selectedBook.type || null, Validators.required], - publishDate: [ - this.selectedBook.publishDate ? new Date(this.selectedBook.publishDate) : null, - Validators.required, - ], - price: [this.selectedBook.price || null, Validators.required], - }); - } - - // <== this method is replaced ==> - save() { - if (this.form.invalid) { - return; - } - - // <== added request ==> - const request = this.selectedBook.id - ? this.bookService.updateByIdAndInput(this.form.value, this.selectedBook.id) - : this.bookService.createByInput(this.form.value); - - request.subscribe(() => { - this.isModalOpen = false; - this.form.reset(); - this.list.get(); - }); - } -} -``` - -* We declared a variable named `selectedBook` as `BookDto`. -* We added `editBook` method. This method fetches the book with the given `Id` and sets it to `selectedBook` object. -* We replaced the `buildForm` method so that it creates the form with the `selectedBook` data. -* We replaced the `createBook` method so it sets `selectedBook` to an empty object. -* We replaced the `save` method. - -### Add "Actions" dropdown to the table - -Open the `book-list.component.html` in `app\book\book-list` folder and replace the `
` tag as below: - -```html -
- - - - -
- -
- -
-
-
-
- - - - {%{{{ booksType[row.type] }}}%} - - - - - {%{{{ row.publishDate | date }}}%} - - - - - {%{{{ row.price | currency }}}%} - - -
-
-``` - -- We added a `ngx-datatable-column` for the "Actions" column. -- We added `button` with `ngbDropdownToggle` to open actions when clicked the button. -- We have used to [NgbDropdown](https://ng-bootstrap.github.io/#/components/dropdown/examples) for the dropdown menu of actions. - -The final UI looks like as below: - -![Action buttons](./images/bookstore-actions-buttons.png) - -Open `book-list.component.html` in `app\book\book-list` folder and find the `` tag and replace the content as below. - -```html - -

{%{{{ (selectedBook.id ? '::Edit' : '::NewBook' ) | abpLocalization }}}%}

-
-``` - -* This template will show **Edit** text for edit record operation, **New Book** for new record operation in the title. - -## Deleting a book - -### Delete confirmation popup - -Open `book-list.component.ts` in `app\book\book-list` folder and inject the `ConfirmationService`. - -Replace the constructor as below: - -```js -import { ConfirmationService } from '@abp/ng.theme.shared'; -//... - -constructor( - public readonly list: ListService, - private bookService: BookService, - private fb: FormBuilder, - private confirmation: ConfirmationService // <== added this line ==> -) {} -``` - -* We imported `ConfirmationService`. -* We injected `ConfirmationService` to the constructor. - -See the [Confirmation Popup documentation](https://docs.abp.io/en/abp/latest/UI/Angular/Confirmation-Service) - -In the `book-list.component.ts` add a delete method: - -```js -import { ConfirmationService, Confirmation } from '@abp/ng.theme.shared'; //<== imported Confirmation namespace ==> - -//... - -delete(id: string) { - this.confirmation.warn('::AreYouSureToDelete', 'AbpAccount::AreYouSure').subscribe((status) => { - if (status === Confirmation.Status.confirm) { - this.bookService.deleteById(id).subscribe(() => this.list.get()); - } - }); -} -``` - - -The `delete` method shows a confirmation popup and subscribes for the user response. The `deleteById` method of `BookService` called only if user clicks to the `Yes` button. The confirmation popup looks like below: - -![bookstore-confirmation-popup](./images/bookstore-confirmation-popup.png) - - -### Add a delete button - - -Open `book-list.component.html` in `app\book\book-list` folder and modify the `ngbDropdownMenu` to add the delete button as shown below: - -```html -
- - -
-``` +The file system structure of the project: -The final actions dropdown UI looks like below: +![Book list final result](./images/bookstore-angular-file-tree.png) -![bookstore-final-actions-dropdown](./images/bookstore-final-actions-dropdown.png) +In this tutorial we have applied the rules of official [Angular Style Guide](https://angular.io/guide/styleguide#file-tree). {{end}} -## Next Part +## The Next Part -See the [next part](part-3.md) of this tutorial. +See the [next part](Part-3.md) of this tutorial. diff --git a/docs/en/Tutorials/Part-3.md b/docs/en/Tutorials/Part-3.md index 22e3cd4a5b..1a861f76bd 100644 --- a/docs/en/Tutorials/Part-3.md +++ b/docs/en/Tutorials/Part-3.md @@ -1,4 +1,4 @@ -# ASP.NET Core {{UI_Value}} Tutorial - Part 3 +# Web Application Development Tutorial - Part 3: Creating, Updating and Deleting Books ````json //[doc-params] { @@ -15,7 +15,7 @@ else if UI == "NG" DB="mongodb" DB_Text="MongoDB" UI_Text="angular" -else +else DB ="?" UI_Text="?" end @@ -30,213 +30,1273 @@ In this tutorial series, you will build an ABP based web application named `Acme This tutorial is organized as the following parts; -- [Part I: Creating the project and book list page](part-1.md) -- [Part-2: Creating, updating and deleting books](Part-2.md) -- **Part-3: Integration tests (this part)** -- [Part-4: Authorization](Part-4.md) +- [Part 1: Creating the project and book list page](Part-1.md) +- [Part 2: The book list page](Part-2.md) +- **Part 3: Creating, updating and deleting books (this part)** +- [Part 4: Integration tests](Part-4.md) +- [Part 5: Authorization](Part-5.md) ### Source Code You can find the completed solution on {{if UI == "MVC"}}[the GitHub repository](https://github.com/abpframework/abp-samples/tree/master/BookStore-Mvc-EfCore){{else}}[the GitHub repository](https://github.com/abpframework/abp-samples/tree/master/BookStore-Angular-MongoDb){{end}}. -## Test Projects in the Solution +{{if UI == "MVC"}} -This part covers the **server side** tests. There are several test projects in the solution: +## Creating a New Book -![bookstore-test-projects-v2](./images/bookstore-test-projects-{{UI_Text}}.png) +In this section, you will learn how to create a new modal dialog form to create a new book. The modal dialog will look like in the image below: -Each project is used to test the related project. Test projects use the following libraries for testing: +![bookstore-create-dialog](./images/bookstore-create-dialog-2.png) -* [Xunit](https://xunit.github.io/) as the main test framework. -* [Shoudly](http://shouldly.readthedocs.io/en/latest/) as the assertion library. -* [NSubstitute](http://nsubstitute.github.io/) as the mocking library. +### Create the Modal Form -{{if DB="ef"}} +Create a new razor page, named `CreateModal.cshtml` under the `Pages/Books` folder of the `Acme.BookStore.Web` project. -> The test projects are configured to use **SQLite in-memory** as the database. A separate database instance is created and seeded (with the data seed system) to prepare a fresh database for every test. +![bookstore-add-create-dialog](./images/bookstore-add-create-dialog-v2.png) -{{else if DB="mongodb"}} +#### CreateModal.cshtml.cs -> **[Mongo2Go](https://github.com/Mongo2Go/Mongo2Go)** library is used to mock the MongoDB database. A separate database instance is created and seeded (with the data seed system) to prepare a fresh database for every test. +Open the `CreateModal.cshtml.cs` file (`CreateModalModel` class) and replace with the following code: -{{end}} - -## Adding Test Data - -If you had created a data seed contributor as described in the [first part](Part-1.md), the same data will be available in your tests. So, you can skip this section. If you haven't created the seed contributor, you can use the `BookStoreTestDataSeedContributor` to seed the same data to be used in the tests below. - -## Testing The Application Service: BookAppService - -Create a test class named `BookAppService_Tests` in the `Acme.BookStore.Application.Tests` project: - -````csharp +````C# using System.Threading.Tasks; -using Shouldly; -using Volo.Abp.Application.Dtos; -using Xunit; +using Acme.BookStore.Books; +using Microsoft.AspNetCore.Mvc; -namespace Acme.BookStore.Books +namespace Acme.BookStore.Web.Pages.Books { - public class BookAppService_Tests : BookStoreApplicationTestBase + public class CreateModalModel : BookStorePageModel { + [BindProperty] + public CreateUpdateBookDto Book { get; set; } + private readonly IBookAppService _bookAppService; - public BookAppService_Tests() + public CreateModalModel(IBookAppService bookAppService) + { + _bookAppService = bookAppService; + } + + public void OnGet() { - _bookAppService = GetRequiredService(); + Book = new CreateUpdateBookDto(); } - [Fact] - public async Task Should_Get_List_Of_Books() + public async Task OnPostAsync() { - //Act - var result = await _bookAppService.GetListAsync( - new PagedAndSortedResultRequestDto() - ); - - //Assert - result.TotalCount.ShouldBeGreaterThan(0); - result.Items.ShouldContain(b => b.Name == "1984"); + await _bookAppService.CreateAsync(Book); + return NoContent(); } } } ```` -* `Should_Get_List_Of_Books` test simply uses `BookAppService.GetListAsync` method to get and check the list of books. -* We can safely check the book "1984" by its name, because we know that this books is available in the database since we've added it in the seed data. +* This class is derived from the `BookStorePageModel` instead of standard `PageModel`. `BookStorePageModel` indirectly inherits the `PageModel` and adds some common properties & methods that can be shared in your page model classes. +* `[BindProperty]` attribute on the `Book` property binds post request data to this property. +* This class simply injects the `IBookAppService` in the constructor and calls the `CreateAsync` method in the `OnPostAsync` handler. +* It creates a new `CreateUpdateBookDto` object in the `OnGet` method. ASP.NET Core can work without creating a new instance like that. However, it doesn't create an instance for you and if your class has some default value assignments or code execution in the class constructor, they won't work. For this case, we set default values for some of the `CreateUpdateBookDto` properties. -Add a new test method to the `BookAppService_Tests` class that creates a new **valid** book: +#### CreateModal.cshtml -````csharp -[Fact] -public async Task Should_Create_A_Valid_Book() -{ - //Act - var result = await _bookAppService.CreateAsync( - new CreateUpdateBookDto - { - Name = "New test book 42", - Price = 10, - PublishDate = System.DateTime.Now, - Type = BookType.ScienceFiction - } - ); +Open the `CreateModal.cshtml` file and paste the code below: - //Assert - result.Id.ShouldNotBe(Guid.Empty); - result.Name.ShouldBe("New test book 42"); +````html +@page +@using Acme.BookStore.Localization +@using Acme.BookStore.Web.Pages.Books +@using Microsoft.Extensions.Localization +@using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Modal +@model CreateModalModel +@inject IStringLocalizer L +@{ + Layout = null; } + + + + + + + + + ```` -Add a new test that tries to create an invalid book and fails: +* This modal uses `abp-dynamic-form` [tag helper](../UI/AspNetCore/Tag-Helpers/Dynamic-Forms.md) to automatically create the form from the `CreateBookViewModel` model class. +* `abp-model` attribute indicates the model object where it's the `Book` property in this case. +* `abp-form-content` tag helper is a placeholder to render the form controls (it is optional and needed only if you have added some other content in the `abp-dynamic-form` tag, just like in this page). -````csharp -[Fact] -public async Task Should_Not_Create_A_Book_Without_Name() +> Tip: `Layout` should be `null` just as done in this example since we don't want to include all the layout for the modals when they are loaded via AJAX. + +### Add the "New book" Button + +Open the `Pages/Books/Index.cshtml` and set the content of `abp-card-header` tag as below: + +````html + + + + @L["Books"] + + + + + + +```` + +The final content of the `Index.cshtml` is shown below: + +````html +@page +@using Acme.BookStore.Localization +@using Acme.BookStore.Web.Pages.Books +@using Microsoft.Extensions.Localization +@model IndexModel +@inject IStringLocalizer L +@section scripts { - var exception = await Assert.ThrowsAsync(async () => - { - await _bookAppService.CreateAsync( - new CreateUpdateBookDto - { - Name = "", - Price = 10, - PublishDate = DateTime.Now, - Type = BookType.ScienceFiction - } - ); - }); - - exception.ValidationErrors - .ShouldContain(err => err.MemberNames.Any(mem => mem == "Name")); + } + + + + + + @L["Books"] + + + + + + + + + + +```` + +This adds a new button called **New book** to the **top-right** of the table: + +![bookstore-new-book-button](./images/bookstore-new-book-button-2.png) + +Open the `Pages/Books/Index.js` and add the following code just after the `Datatable` configuration: + +````js +var createModal = new abp.ModalManager(abp.appPath + 'Books/CreateModal'); + +createModal.onResult(function () { + dataTable.ajax.reload(); +}); + +$('#NewBookButton').click(function (e) { + e.preventDefault(); + createModal.open(); +}); +```` + +* `abp.ModalManager` is a helper class to manage modals in the client side. It internally uses Twitter Bootstrap's standard modal, but abstracts many details by providing a simple API. +* `createModal.onResult(...)` used to refresh the data table after creating a new book. +* `createModal.open();` is used to open the model to create a new book. + +The final content of the `Index.js` should be like that: + +````js +$(function () { + var l = abp.localization.getResource('BookStore'); + + var dataTable = $('#BooksTable').DataTable( + abp.libs.datatables.normalizeConfiguration({ + serverSide: true, + paging: true, + order: [[1, "asc"]], + searching: false, + scrollX: true, + ajax: abp.libs.datatables.createAjax(acme.bookStore.books.book.getList), + columnDefs: [ + { + title: l('Name'), + data: "name" + }, + { + title: l('Type'), + data: "type", + render: function (data) { + return l('Enum:BookType:' + data); + } + }, + { + title: l('PublishDate'), + data: "publishDate", + render: function (data) { + return luxon + .DateTime + .fromISO(data, { + locale: abp.localization.currentCulture.name + }).toLocaleString(); + } + }, + { + title: l('Price'), + data: "price" + }, + { + title: l('CreationTime'), data: "creationTime", + render: function (data) { + return luxon + .DateTime + .fromISO(data, { + locale: abp.localization.currentCulture.name + }).toLocaleString(luxon.DateTime.DATETIME_SHORT); + } + } + ] + }) + ); + + var createModal = new abp.ModalManager(abp.appPath + 'Books/CreateModal'); + + createModal.onResult(function () { + dataTable.ajax.reload(); + }); + + $('#NewBookButton').click(function (e) { + e.preventDefault(); + createModal.open(); + }); +}); ```` -* Since the `Name` is empty, ABP will throw an `AbpValidationException`. +Now, you can **run the application** and add some new books using the new modal form. + +## Updating a Book + +Create a new razor page, named `EditModal.cshtml` under the `Pages/Books` folder of the `Acme.BookStore.Web` project: -The final test class should be as shown below: +![bookstore-add-edit-dialog](./images/bookstore-add-edit-dialog.png) + +### EditModal.cshtml.cs + +Open the `EditModal.cshtml.cs` file (`EditModalModel` class) and replace with the following code: ````csharp using System; -using System.Linq; using System.Threading.Tasks; -using Shouldly; -using Volo.Abp.Application.Dtos; -using Volo.Abp.Validation; -using Xunit; +using Acme.BookStore.Books; +using Microsoft.AspNetCore.Mvc; -namespace Acme.BookStore.Books +namespace Acme.BookStore.Web.Pages.Books { - public class BookAppService_Tests : BookStoreApplicationTestBase + public class EditModalModel : BookStorePageModel { + [HiddenInput] + [BindProperty(SupportsGet = true)] + public Guid Id { get; set; } + + [BindProperty] + public CreateUpdateBookDto Book { get; set; } + private readonly IBookAppService _bookAppService; - public BookAppService_Tests() + public EditModalModel(IBookAppService bookAppService) { - _bookAppService = GetRequiredService(); + _bookAppService = bookAppService; } - [Fact] - public async Task Should_Get_List_Of_Books() + public async Task OnGetAsync() { - //Act - var result = await _bookAppService.GetListAsync( - new PagedAndSortedResultRequestDto() - ); - - //Assert - result.TotalCount.ShouldBeGreaterThan(0); - result.Items.ShouldContain(b => b.Name == "1984"); + var bookDto = await _bookAppService.GetAsync(Id); + Book = ObjectMapper.Map(bookDto); } - - [Fact] - public async Task Should_Create_A_Valid_Book() - { - //Act - var result = await _bookAppService.CreateAsync( - new CreateUpdateBookDto - { - Name = "New test book 42", - Price = 10, - PublishDate = System.DateTime.Now, - Type = BookType.ScienceFiction - } - ); - //Assert - result.Id.ShouldNotBe(Guid.Empty); - result.Name.ShouldBe("New test book 42"); + public async Task OnPostAsync() + { + await _bookAppService.UpdateAsync(Id, Book); + return NoContent(); } - - [Fact] - public async Task Should_Not_Create_A_Book_Without_Name() + } +} +```` + +* `[HiddenInput]` and `[BindProperty]` are standard ASP.NET Core MVC attributes. `SupportsGet` is used to be able to get `Id` value from query string parameter of the request. +* In the `OnGetAsync` method, we get `BookDto ` from the `BookAppService` and this is being mapped to the DTO object `CreateUpdateBookDto`. +* The `OnPostAsync` uses `BookAppService.UpdateAsync(...)` to update the entity. + +### Mapping from BookDto to CreateUpdateBookDto + +To be able to map the `BookDto` to `CreateUpdateBookDto`, configure a new mapping. To do this, open the `BookStoreWebAutoMapperProfile.cs` in the `Acme.BookStore.Web` project and change it as shown below: + +````csharp +using AutoMapper; + +namespace Acme.BookStore.Web +{ + public class BookStoreWebAutoMapperProfile : Profile + { + public BookStoreWebAutoMapperProfile() { - var exception = await Assert.ThrowsAsync(async () => - { - await _bookAppService.CreateAsync( - new CreateUpdateBookDto - { - Name = "", - Price = 10, - PublishDate = DateTime.Now, - Type = BookType.ScienceFiction + CreateMap(); + } + } +} +```` + +* We have just added `CreateMap();` to define this mapping. + +> Notice that we do the mapping definition in the web layer as a best practice since it is only needed in this layer. + +### EditModal.cshtml + +Replace `EditModal.cshtml` content with the following content: + +````html +@page +@using Acme.BookStore.Localization +@using Acme.BookStore.Web.Pages.Books +@using Microsoft.Extensions.Localization +@using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Modal +@model EditModalModel +@inject IStringLocalizer L +@{ + Layout = null; +} + + + + + + + + + + +```` + +This page is very similar to the `CreateModal.cshtml`, except: + +* It includes an `abp-input` for the `Id` property to store `Id` of the editing book (which is a hidden input). +* It uses `Books/EditModal` as the post URL. + +### Add "Actions" Dropdown to the Table + +We will add a dropdown button to the table named *Actions*. + +Open the `Pages/Books/Index.js` and replace the content as below: + +````js +$(function () { + var l = abp.localization.getResource('BookStore'); + var createModal = new abp.ModalManager(abp.appPath + 'Books/CreateModal'); + var editModal = new abp.ModalManager(abp.appPath + 'Books/EditModal'); + + var dataTable = $('#BooksTable').DataTable( + abp.libs.datatables.normalizeConfiguration({ + serverSide: true, + paging: true, + order: [[1, "asc"]], + searching: false, + scrollX: true, + ajax: abp.libs.datatables.createAjax(acme.bookStore.books.book.getList), + columnDefs: [ + { + title: l('Actions'), + rowAction: { + items: + [ + { + text: l('Edit'), + action: function (data) { + editModal.open({ id: data.record.id }); + } + } + ] } - ); - }); + }, + { + title: l('Name'), + data: "name" + }, + { + title: l('Type'), + data: "type", + render: function (data) { + return l('Enum:BookType:' + data); + } + }, + { + title: l('PublishDate'), + data: "publishDate", + render: function (data) { + return luxon + .DateTime + .fromISO(data, { + locale: abp.localization.currentCulture.name + }).toLocaleString(); + } + }, + { + title: l('Price'), + data: "price" + }, + { + title: l('CreationTime'), data: "creationTime", + render: function (data) { + return luxon + .DateTime + .fromISO(data, { + locale: abp.localization.currentCulture.name + }).toLocaleString(luxon.DateTime.DATETIME_SHORT); + } + } + ] + }) + ); - exception.ValidationErrors - .ShouldContain(err => err.MemberNames.Any(mem => mem == "Name")); - } + createModal.onResult(function () { + dataTable.ajax.reload(); + }); + + editModal.onResult(function () { + dataTable.ajax.reload(); + }); + + $('#NewBookButton').click(function (e) { + e.preventDefault(); + createModal.open(); + }); +}); +```` + +* Added a new `ModalManager` named `editModal` to open the edit modal dialog. +* Added a new column at the beginning of the `columnDefs` section. This column is used for the "*Actions*" dropdown button. +* "*Edit*" action simply calls `editModal.open()` to open the edit dialog. +* `editModal.onResult(...)` callback refreshes the data table when you close the edit modal. + +You can run the application and edit any book by selecting the edit action on a book. + +The final UI looks as below: + +![bookstore-books-table-actions](./images/bookstore-edit-button-2.png) + +## Deleting a Book + +Open the `Pages/Books/Index.js` and add a new item to the `rowAction` `items`: + +````js +{ + text: l('Delete'), + confirmMessage: function (data) { + return l('BookDeletionConfirmationMessage', data.record.name); + }, + action: function (data) { + acme.bookStore.books.book + .delete(data.record.id) + .then(function() { + abp.notify.info(l('SuccessfullyDeleted')); + dataTable.ajax.reload(); + }); } } ```` -Open the **Test Explorer Window** (use Test -> Windows -> Test Explorer menu if it is not visible) and **Run All** tests: +* `confirmMessage` option is used to ask a confirmation question before executing the `action`. +* `acme.bookStore.books.book.delete(...)` method makes an AJAX request to the server to delete a book. +* `abp.notify.info()` shows a notification after the delete operation. + +Since we've used two new localization texts (`BookDeletionConfirmationMessage` and `SuccessfullyDeleted`) you need to add these to the localization file (`en.json` under the `Localization/BookStore` folder of the `Acme.BookStore.Domain.Shared` project): + +````json +"BookDeletionConfirmationMessage": "Are you sure to delete the book '{0}'?", +"SuccessfullyDeleted": "Successfully deleted!" +```` + +The final `Index.js` content is shown below: + +````js +$(function () { + var l = abp.localization.getResource('BookStore'); + var createModal = new abp.ModalManager(abp.appPath + 'Books/CreateModal'); + var editModal = new abp.ModalManager(abp.appPath + 'Books/EditModal'); + + var dataTable = $('#BooksTable').DataTable( + abp.libs.datatables.normalizeConfiguration({ + serverSide: true, + paging: true, + order: [[1, "asc"]], + searching: false, + scrollX: true, + ajax: abp.libs.datatables.createAjax(acme.bookStore.books.book.getList), + columnDefs: [ + { + title: l('Actions'), + rowAction: { + items: + [ + { + text: l('Edit'), + action: function (data) { + editModal.open({ id: data.record.id }); + } + }, + { + text: l('Delete'), + confirmMessage: function (data) { + return l( + 'BookDeletionConfirmationMessage', + data.record.name + ); + }, + action: function (data) { + acme.bookStore.books.book + .delete(data.record.id) + .then(function() { + abp.notify.info( + l('SuccessfullyDeleted') + ); + dataTable.ajax.reload(); + }); + } + } + ] + } + }, + { + title: l('Name'), + data: "name" + }, + { + title: l('Type'), + data: "type", + render: function (data) { + return l('Enum:BookType:' + data); + } + }, + { + title: l('PublishDate'), + data: "publishDate", + render: function (data) { + return luxon + .DateTime + .fromISO(data, { + locale: abp.localization.currentCulture.name + }).toLocaleString(); + } + }, + { + title: l('Price'), + data: "price" + }, + { + title: l('CreationTime'), data: "creationTime", + render: function (data) { + return luxon + .DateTime + .fromISO(data, { + locale: abp.localization.currentCulture.name + }).toLocaleString(luxon.DateTime.DATETIME_SHORT); + } + } + ] + }) + ); + + createModal.onResult(function () { + dataTable.ajax.reload(); + }); + + editModal.onResult(function () { + dataTable.ajax.reload(); + }); + + $('#NewBookButton').click(function (e) { + e.preventDefault(); + createModal.open(); + }); +}); +```` + +You can run the application and try to delete a book. + +{{end}} + +{{if UI == "NG"}} + +## Creating a new book + +In this section, you will learn how to create a new modal dialog form to create a new book. + +### Add a modal to BookListComponent + +Open `book-list.component.ts` file in `app\book\book-list` folder 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'; + +@Component({ + selector: 'app-book-list', + templateUrl: './book-list.component.html', + styleUrls: ['./book-list.component.scss'], + providers: [ListService], +}) +export class BookListComponent implements OnInit { + book = { items: [], totalCount: 0 } as PagedResultDto; + + booksType = BookType; + + isModalOpen = false; // <== added this line ==> -![bookstore-appservice-tests](./images/bookstore-appservice-tests.png) + constructor(public readonly list: ListService, private bookService: BookService) {} -Congratulations, the **green icons** indicates that the tests have been successfully passed! + ngOnInit() { + const bookStreamCreator = (query) => this.bookService.getListByInput(query); + + this.list.hookToQuery(bookStreamCreator).subscribe((response) => { + this.book = response; + }); + } + + // added createBook method + createBook() { + this.isModalOpen = true; + } +} +``` + +* We defined a variable called `isModalOpen` and `createBook` method. +* We added the `createBook` method. + + +Open `book-list.component.html` file in `books\book-list` folder and replace the content as below: + +```html +
+
+
+
+
{%{{{ '::Menu:Books' | abpLocalization }}}%}
+
+ +
+
+ +
+
+
+
+
+ + + + + {%{{{ booksType[row.type] }}}%} + + + + + {%{{{ row.publishDate | date }}}%} + + + + + {%{{{ row.price | currency }}}%} + + + +
+
+ + + + +

{%{{{ '::NewBook' | abpLocalization }}}%}

+
+ + + + + + +
+``` + +* We added the `abp-modal` which renders a modal to allow user to create a new book. +* `abp-modal` is a pre-built component to show modals. While you could use another approach to show a modal, `abp-modal` provides additional benefits. +* We added `New book` button to the `AbpContentToolbar`. + +You can open your browser and click **New book** button to see the new modal. + +![Empty modal for new book](./images/bookstore-empty-new-book-modal.png) + +### Create a reactive form + +[Reactive forms](https://angular.io/guide/reactive-forms) provide a model-driven approach to handling form inputs whose values change over time. + +Open `book-list.component.ts` file in `app\book\book-list` folder 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 { FormGroup, FormBuilder, Validators } from '@angular/forms'; // <== added this line ==> + +@Component({ + selector: 'app-book-list', + templateUrl: './book-list.component.html', + styleUrls: ['./book-list.component.scss'], + providers: [ListService], +}) +export class BookListComponent implements OnInit { + book = { items: [], totalCount: 0 } as PagedResultDto; + + booksType = BookType; + + isModalOpen = false; + + form: FormGroup; // <== added this line ==> + + constructor( + public readonly list: ListService, + private bookService: BookService, + private fb: FormBuilder // <== injected FormBuilder ==> + ) {} + + ngOnInit() { + const bookStreamCreator = (query) => this.bookService.getListByInput(query); + + this.list.hookToQuery(bookStreamCreator).subscribe((response) => { + this.book = response; + }); + } + + createBook() { + this.buildForm(); // <== added this line ==> + this.isModalOpen = true; + } + + // added buildForm method + buildForm() { + this.form = this.fb.group({ + name: ['', Validators.required], + type: [null, Validators.required], + publishDate: [null, Validators.required], + price: [null, Validators.required], + }); + } +} +``` + +* We imported `FormGroup, FormBuilder and Validators`. +* We added `form: FormGroup` variable. +* We injected `fb: FormBuilder` service to the constructor. The [FormBuilder](https://angular.io/api/forms/FormBuilder) service provides convenient methods for generating controls. It reduces the amount of boilerplate needed to build complex forms. +* We added `buildForm` method to the end of the file and executed `buildForm()` in the `createBook` method. This method creates a reactive form to be able to create a new book. + * The `group` method of `FormBuilder`, `fb` creates a `FormGroup`. + * Added `Validators.required` static method which validates the relevant form element. + +### Create the DOM elements of the form + +Open `book-list.component.html` in `app\books\book-list` folder and replace ` ` with the following code part: + +```html + + +
+ * + +
+ +
+ * + +
+ +
+ * + +
+ +
+ * + +
+ +
+``` + +- This template creates a form with `Name`, `Price`, `Type` and `Publish` date fields. +- We've used [NgBootstrap datepicker](https://ng-bootstrap.github.io/#/components/datepicker/overview) in this component. + +### Datepicker requirements + +Open `book.module.ts` file in `app\book` folder and replace the content as below: + +```js +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { BookRoutingModule } from './book-routing.module'; +import { BookListComponent } from './book-list/book-list.component'; +import { SharedModule } from '../shared/shared.module'; +import { NgbDatepickerModule } from '@ng-bootstrap/ng-bootstrap'; //<== added this line ==> + +@NgModule({ + declarations: [BookListComponent], + imports: [ + CommonModule, + BookRoutingModule, + SharedModule, + NgbDatepickerModule, //<== added this line ==> + ], +}) +export class BookModule {} +``` + +* We imported `NgbDatepickerModule` to be able to use the date picker. + +Open `book-list.component.ts` file in `app\book\book-list` folder 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 { FormGroup, FormBuilder, Validators } from '@angular/forms'; +import { NgbDateNativeAdapter, NgbDateAdapter } from '@ng-bootstrap/ng-bootstrap'; // <== added this line ==> + +@Component({ + selector: 'app-book-list', + templateUrl: './book-list.component.html', + styleUrls: ['./book-list.component.scss'], + providers: [ListService, { provide: NgbDateAdapter, useClass: NgbDateNativeAdapter }], // <== added a provide ==> +}) +export class BookListComponent implements OnInit { + book = { items: [], totalCount: 0 } as PagedResultDto; + + booksType = BookType; + + // <== added bookTypeArr array ==> + bookTypeArr = Object.keys(BookType).filter( + (bookType) => typeof this.booksType[bookType] === 'number' + ); + + isModalOpen = false; + + form: FormGroup; + + constructor( + public readonly list: ListService, + private bookService: BookService, + private fb: FormBuilder + ) {} + + ngOnInit() { + const bookStreamCreator = (query) => this.bookService.getListByInput(query); + + this.list.hookToQuery(bookStreamCreator).subscribe((response) => { + this.book = response; + }); + } + + createBook() { + this.buildForm(); + this.isModalOpen = true; + } + + buildForm() { + this.form = this.fb.group({ + name: ['', Validators.required], + type: [null, Validators.required], + publishDate: [null, Validators.required], + price: [null, Validators.required], + }); + } +} +``` + +* We imported ` NgbDateNativeAdapter, NgbDateAdapter` + +* We added a new provider `NgbDateAdapter` that converts Datepicker value to `Date` type. See the [datepicker adapters](https://ng-bootstrap.github.io/#/components/datepicker/overview) for more details. + +* We added `bookTypeArr` array to be able to use it in the combobox values. The `bookTypeArr` contains the fields of the `BookType` enum. Resulting array is shown below: + + ```js + ['Adventure', 'Biography', 'Dystopia', 'Fantastic' ...] + ``` + + This array was used in the previous form template in the `ngFor` loop. + +Now, you can open your browser to see the changes: + + +![New book modal](./images/bookstore-new-book-form.png) + +### Saving the book + +Open `book-list.component.ts` file in `app\book\book-list` folder 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 { FormGroup, FormBuilder, Validators } from '@angular/forms'; +import { NgbDateNativeAdapter, NgbDateAdapter } from '@ng-bootstrap/ng-bootstrap'; + +@Component({ + selector: 'app-book-list', + templateUrl: './book-list.component.html', + styleUrls: ['./book-list.component.scss'], + providers: [ListService, { provide: NgbDateAdapter, useClass: NgbDateNativeAdapter }], +}) +export class BookListComponent implements OnInit { + book = { items: [], totalCount: 0 } as PagedResultDto; + + booksType = BookType; + + bookTypeArr = Object.keys(BookType).filter( + (bookType) => typeof this.booksType[bookType] === 'number' + ); + + isModalOpen = false; + + form: FormGroup; + + constructor( + public readonly list: ListService, + private bookService: BookService, + private fb: FormBuilder + ) {} + + ngOnInit() { + const bookStreamCreator = (query) => this.bookService.getListByInput(query); + + this.list.hookToQuery(bookStreamCreator).subscribe((response) => { + this.book = response; + }); + } + + createBook() { + this.buildForm(); + this.isModalOpen = true; + } + + buildForm() { + this.form = this.fb.group({ + name: ['', Validators.required], + type: [null, Validators.required], + publishDate: [null, Validators.required], + price: [null, Validators.required], + }); + } + + // <== added save ==> + save() { + if (this.form.invalid) { + return; + } + + this.bookService.createByInput(this.form.value).subscribe(() => { + this.isModalOpen = false; + this.form.reset(); + this.list.get(); + }); + } +} +``` + +* We added `save` method + +Open `book-list.component.html` in `app\book\book-list` folder, find the `` element and replace this element with the following to create a new book. + +```html + + + + + + +``` + +Find the `
` tag and replace below content: + +```html + +``` + + +* We added the `(ngSubmit)="save()"` to `` element to save a new book by pressing the enter. +* We added `abp-button` to the bottom area of the modal to save a new book. + +The final modal UI looks like below: + +![Save button to the modal](./images/bookstore-new-book-form-v2.png) + +## Updating a book + +Open `book-list.component.ts` in `app\book\book-list` folder and add a variable named `selectedBook`. + +```js +import { ListService, PagedResultDto } from '@abp/ng.core'; +import { Component, OnInit } from '@angular/core'; +import { BookDto, BookType } from '../models'; +import { BookService } from '../services'; +import { FormGroup, FormBuilder, Validators } from '@angular/forms'; +import { NgbDateNativeAdapter, NgbDateAdapter } from '@ng-bootstrap/ng-bootstrap'; + +@Component({ + selector: 'app-book-list', + templateUrl: './book-list.component.html', + styleUrls: ['./book-list.component.scss'], + providers: [ListService, { provide: NgbDateAdapter, useClass: NgbDateNativeAdapter }], +}) +export class BookListComponent implements OnInit { + book = { items: [], totalCount: 0 } as PagedResultDto; + + booksType = BookType; + + bookTypeArr = Object.keys(BookType).filter( + (bookType) => typeof this.booksType[bookType] === 'number' + ); + + isModalOpen = false; + + form: FormGroup; + + selectedBook = {} as BookDto; // <== declared selectedBook ==> + + constructor( + public readonly list: ListService, + private bookService: BookService, + private fb: FormBuilder + ) {} + + ngOnInit() { + const bookStreamCreator = (query) => this.bookService.getListByInput(query); + + this.list.hookToQuery(bookStreamCreator).subscribe((response) => { + this.book = response; + }); + } + + // <== this method is replaced ==> + createBook() { + this.selectedBook = {} as BookDto; // <== added ==> + this.buildForm(); + this.isModalOpen = true; + } + + // <== added editBook method ==> + editBook(id: string) { + this.bookService.getById(id).subscribe((book) => { + this.selectedBook = book; + this.buildForm(); + this.isModalOpen = true; + }); + } + + // <== this method is replaced ==> + buildForm() { + this.form = this.fb.group({ + name: [this.selectedBook.name || '', Validators.required], + type: [this.selectedBook.type || null, Validators.required], + publishDate: [ + this.selectedBook.publishDate ? new Date(this.selectedBook.publishDate) : null, + Validators.required, + ], + price: [this.selectedBook.price || null, Validators.required], + }); + } + + // <== this method is replaced ==> + save() { + if (this.form.invalid) { + return; + } + + // <== added request ==> + const request = this.selectedBook.id + ? this.bookService.updateByIdAndInput(this.form.value, this.selectedBook.id) + : this.bookService.createByInput(this.form.value); + + request.subscribe(() => { + this.isModalOpen = false; + this.form.reset(); + this.list.get(); + }); + } +} +``` + +* We declared a variable named `selectedBook` as `BookDto`. +* We added `editBook` method. This method fetches the book with the given `Id` and sets it to `selectedBook` object. +* We replaced the `buildForm` method so that it creates the form with the `selectedBook` data. +* We replaced the `createBook` method so it sets `selectedBook` to an empty object. +* We replaced the `save` method. + +### Add "Actions" dropdown to the table + +Open the `book-list.component.html` in `app\book\book-list` folder and replace the `
` tag as below: + +```html +
+ + + + +
+ +
+ +
+
+
+
+ + + + {%{{{ booksType[row.type] }}}%} + + + + + {%{{{ row.publishDate | date }}}%} + + + + + {%{{{ row.price | currency }}}%} + + +
+
+``` + +- We added a `ngx-datatable-column` for the "Actions" column. +- We added `button` with `ngbDropdownToggle` to open actions when clicked the button. +- We have used to [NgbDropdown](https://ng-bootstrap.github.io/#/components/dropdown/examples) for the dropdown menu of actions. + +The final UI looks like as below: + +![Action buttons](./images/bookstore-actions-buttons.png) + +Open `book-list.component.html` in `app\book\book-list` folder and find the `` tag and replace the content as below. + +```html + +

{%{{{ (selectedBook.id ? '::Edit' : '::NewBook' ) | abpLocalization }}}%}

+
+``` + +* This template will show **Edit** text for edit record operation, **New Book** for new record operation in the title. + +## Deleting a book + +### Delete confirmation popup + +Open `book-list.component.ts` in `app\book\book-list` folder and inject the `ConfirmationService`. + +Replace the constructor as below: + +```js +import { ConfirmationService } from '@abp/ng.theme.shared'; +//... + +constructor( + public readonly list: ListService, + private bookService: BookService, + private fb: FormBuilder, + private confirmation: ConfirmationService // <== added this line ==> +) {} +``` + +* We imported `ConfirmationService`. +* We injected `ConfirmationService` to the constructor. + +See the [Confirmation Popup documentation](https://docs.abp.io/en/abp/latest/UI/Angular/Confirmation-Service) + +In the `book-list.component.ts` add a delete method: + +```js +import { ConfirmationService, Confirmation } from '@abp/ng.theme.shared'; //<== imported Confirmation namespace ==> + +//... + +delete(id: string) { + this.confirmation.warn('::AreYouSureToDelete', 'AbpAccount::AreYouSure').subscribe((status) => { + if (status === Confirmation.Status.confirm) { + this.bookService.deleteById(id).subscribe(() => this.list.get()); + } + }); +} +``` + + +The `delete` method shows a confirmation popup and subscribes for the user response. The `deleteById` method of `BookService` called only if user clicks to the `Yes` button. The confirmation popup looks like below: + +![bookstore-confirmation-popup](./images/bookstore-confirmation-popup.png) + + +### Add a delete button + + +Open `book-list.component.html` in `app\book\book-list` folder and modify the `ngbDropdownMenu` to add the delete button as shown below: + +```html +
+ + +
+``` + +The final actions dropdown UI looks like below: + +![bookstore-final-actions-dropdown](./images/bookstore-final-actions-dropdown.png) + +{{end}} -## Next Part +## The Next Part -See the [next part](part-4.md) of this tutorial. \ No newline at end of file +See the [next part](part-4.md) of this tutorial. diff --git a/docs/en/Tutorials/Part-4.md b/docs/en/Tutorials/Part-4.md index 43523440db..c2c0c2b530 100644 --- a/docs/en/Tutorials/Part-4.md +++ b/docs/en/Tutorials/Part-4.md @@ -1,4 +1,4 @@ -# ASP.NET Core {{UI_Value}} Tutorial - Part 4 +# Web Application Development Tutorial - Part 4: Integration Tests ````json //[doc-params] { @@ -30,286 +30,214 @@ In this tutorial series, you will build an ABP based web application named `Acme This tutorial is organized as the following parts; -- [Part I: Creating the project and book list page](part-1.md) -- [Part-2: Creating, updating and deleting books](Part-2.md) -- [Part-3: Integration tests](Part-3.md) -- **Part-4: Authorization (this part)** +- [Part 1: Creating the project and book list page](Part-1.md) +- [Part 2: The book list page](Part-2.md) +- [Part 3: Creating, updating and deleting books](Part-3.md) +- **Part 4: Integration tests (this part)** +- [Part 5: Authorization](Part-5.md) ### Source Code You can find the completed solution on {{if UI == "MVC"}}[the GitHub repository](https://github.com/abpframework/abp-samples/tree/master/BookStore-Mvc-EfCore){{else}}[the GitHub repository](https://github.com/abpframework/abp-samples/tree/master/BookStore-Angular-MongoDb){{end}}. -## Permissions +## Test Projects in the Solution -ABP Framework provides an [authorization system](../Authorization.md) based on the ASP.NET Core's [authorization infrastructure](https://docs.microsoft.com/en-us/aspnet/core/security/authorization/introduction). One major feature added on top of the standard authorization infrastructure is the **permission system** which allows to define permissions and enable/disable per role, user or client. +This part covers the **server side** tests. There are several test projects in the solution: -### Permission Names +![bookstore-test-projects-v2](./images/bookstore-test-projects-{{UI_Text}}.png) -A permission must have a unique name (a `string`). The best way is to define it as a `const`, so we can reuse the permission name. +Each project is used to test the related project. Test projects use the following libraries for testing: -Open the `BookStorePermissions` class and change the content as shown below: +* [Xunit](https://xunit.github.io/) as the main test framework. +* [Shoudly](http://shouldly.readthedocs.io/en/latest/) as the assertion library. +* [NSubstitute](http://nsubstitute.github.io/) as the mocking library. -````csharp -namespace Acme.BookStore.Permissions -{ - public static class BookStorePermissions - { - public const string GroupName = "BookStore"; +{{if DB="ef"}} - public static class Books - { - public const string Default = GroupName + ".Books"; - public const string Create = Default + ".Create"; - public const string Edit = Default + ".Edit"; - public const string Delete = Default + ".Delete"; - } - } -} -```` +> The test projects are configured to use **SQLite in-memory** as the database. A separate database instance is created and seeded (with the data seed system) to prepare a fresh database for every test. + +{{else if DB="mongodb"}} + +> **[Mongo2Go](https://github.com/Mongo2Go/Mongo2Go)** library is used to mock the MongoDB database. A separate database instance is created and seeded (with the data seed system) to prepare a fresh database for every test. + +{{end}} -This is a hierarchical way of defining permission names. For example, "create book" permission name was defined as `BookStore.Books.Create`. +## Adding Test Data -### Permission Definitions +If you had created a data seed contributor as described in the [first part](Part-1.md), the same data will be available in your tests. So, you can skip this section. If you haven't created the seed contributor, you can use the `BookStoreTestDataSeedContributor` to seed the same data to be used in the tests below. -You should define permissions before using them. +## Testing The Application Service: BookAppService -Open the `BookStorePermissionDefinitionProvider` class inside the `Acme.BookStore.Application.Contracts` project and change the content as shown below: +Create a test class named `BookAppService_Tests` in the `Acme.BookStore.Application.Tests` project: ````csharp -using Acme.BookStore.Localization; -using Volo.Abp.Authorization.Permissions; -using Volo.Abp.Localization; +using System.Threading.Tasks; +using Shouldly; +using Volo.Abp.Application.Dtos; +using Xunit; -namespace Acme.BookStore.Permissions +namespace Acme.BookStore.Books { - public class BookStorePermissionDefinitionProvider : PermissionDefinitionProvider + public class BookAppService_Tests : BookStoreApplicationTestBase { - public override void Define(IPermissionDefinitionContext context) - { - var bookStoreGroup = context.AddGroup(BookStorePermissions.GroupName, L("Permission:BookStore")); + private readonly IBookAppService _bookAppService; - var booksPermission = bookStoreGroup.AddPermission(BookStorePermissions.Books.Default, L("Permission:Books")); - booksPermission.AddChild(BookStorePermissions.Books.Create, L("Permission:Books.Create")); - booksPermission.AddChild(BookStorePermissions.Books.Edit, L("Permission:Books.Edit")); - booksPermission.AddChild(BookStorePermissions.Books.Delete, L("Permission:Books.Delete")); + public BookAppService_Tests() + { + _bookAppService = GetRequiredService(); } - private static LocalizableString L(string name) + [Fact] + public async Task Should_Get_List_Of_Books() { - return LocalizableString.Create(name); + //Act + var result = await _bookAppService.GetListAsync( + new PagedAndSortedResultRequestDto() + ); + + //Assert + result.TotalCount.ShouldBeGreaterThan(0); + result.Items.ShouldContain(b => b.Name == "1984"); } } } ```` -This class defines a **permission group** (to group permissions on the UI, will be seen below) and **4 permissions** inside this group. Also, **Create**, **Edit** and **Delete** are children of the `BookStorePermissions.Books.Default` permission. A child permission can be selected **only if the parent was selected**. - -Finally, edit the localization file (`en.json` under the `Localization/BookStore` folder of the `Acme.BookStore.Domain.Shared` project) to define the localization keys used above: - -````json -"Permission:BookStore": "Book Store", -"Permission:Books": "Book Management", -"Permission:Books.Create": "Creating new books", -"Permission:Books.Edit": "Editing the books", -"Permission:Books.Delete": "Deleting the books" -```` - -> Localization key names are arbitrary and no forcing rule. But we prefer the convention used above. - -### Permission Management UI +* `Should_Get_List_Of_Books` test simply uses `BookAppService.GetListAsync` method to get and check the list of books. +* We can safely check the book "1984" by its name, because we know that this books is available in the database since we've added it in the seed data. -Once you define the permissions, you can see them on the **permission management modal**. - -Go to the *Administration -> Identity -> Roles* page, select *Permissions* action for the admin role to open the permission management modal: - -![bookstore-permissions-ui](images/bookstore-permissions-ui.png) - -Grant the permissions you want and save the modal. - -## Authorization - -Now, you can use the permissions to authorize the book management. - -### Application Layer & HTTP API - -Open the `BookAppService` class and add set the policy names as the permission names defined above: +Add a new test method to the `BookAppService_Tests` class that creates a new **valid** book: ````csharp -using System; -using Acme.BookStore.Permissions; -using Volo.Abp.Application.Dtos; -using Volo.Abp.Application.Services; -using Volo.Abp.Domain.Repositories; - -namespace Acme.BookStore.Books +[Fact] +public async Task Should_Create_A_Valid_Book() { - public class BookAppService : - CrudAppService< - Book, //The Book entity - BookDto, //Used to show books - Guid, //Primary key of the book entity - PagedAndSortedResultRequestDto, //Used for paging/sorting - CreateUpdateBookDto>, //Used to create/update a book - IBookAppService //implement the IBookAppService - { - public BookAppService(IRepository repository) - : base(repository) + //Act + var result = await _bookAppService.CreateAsync( + new CreateUpdateBookDto { - GetPolicyName = BookStorePermissions.Books.Default; - GetListPolicyName = BookStorePermissions.Books.Default; - CreatePolicyName = BookStorePermissions.Books.Create; - UpdatePolicyName = BookStorePermissions.Books.Edit; - DeletePolicyName = BookStorePermissions.Books.Create; + Name = "New test book 42", + Price = 10, + PublishDate = System.DateTime.Now, + Type = BookType.ScienceFiction } - } + ); + + //Assert + result.Id.ShouldNotBe(Guid.Empty); + result.Name.ShouldBe("New test book 42"); } ```` -Added code to the constructor. Base `CrudAppService` automatically uses these permissions on the CRUD operations. This makes the **application service** secure, but also makes the **HTTP API** secure since this service is automatically used as an HTTP API as explained before (see [auto API controllers](../API/Auto-API-Controllers.md)). - -{{if UI == "MVC"}} - -### Razor Page - -While securing the HTTP API & the application service prevents unauthorized users to use the services, they can still navigate to the book management page. While they will get authorization exception when the page makes the first AJAX call to the server, we should also authorize the page for a better user experience and security. - -Open the `BookStoreWebModule` and add the following code block inside the `ConfigureServices` method: +Add a new test that tries to create an invalid book and fails: ````csharp -Configure(options => +[Fact] +public async Task Should_Not_Create_A_Book_Without_Name() { - options.Conventions.AuthorizePage("/Books/Index", BookStorePermissions.Books.Default); - options.Conventions.AuthorizePage("/Books/CreateModal", BookStorePermissions.Books.Create); - options.Conventions.AuthorizePage("/Books/EditModal", BookStorePermissions.Books.Edit); -}); + var exception = await Assert.ThrowsAsync(async () => + { + await _bookAppService.CreateAsync( + new CreateUpdateBookDto + { + Name = "", + Price = 10, + PublishDate = DateTime.Now, + Type = BookType.ScienceFiction + } + ); + }); + + exception.ValidationErrors + .ShouldContain(err => err.MemberNames.Any(mem => mem == "Name")); +} ```` -Now, unauthorized users are redirected to the **login page**. +* Since the `Name` is empty, ABP will throw an `AbpValidationException`. -#### Hide the New Book Button +The final test class should be as shown below: -The book management page has a *New Book* button that should be invisible if the current user has no *Book Creation* permission. - -![bookstore-new-book-button-small](images/bookstore-new-book-button-small.png) - -Open the `Pages/Books/Index.cshtml` file and change the content as shown below: +````csharp +using System; +using System.Linq; +using System.Threading.Tasks; +using Shouldly; +using Volo.Abp.Application.Dtos; +using Volo.Abp.Validation; +using Xunit; -````html -@page -@using Acme.BookStore.Localization -@using Acme.BookStore.Permissions -@using Acme.BookStore.Web.Pages.Books -@using Microsoft.AspNetCore.Authorization -@using Microsoft.Extensions.Localization -@model IndexModel -@inject IStringLocalizer L -@inject IAuthorizationService AuthorizationService -@section scripts +namespace Acme.BookStore.Books { - -} + public class BookAppService_Tests : BookStoreApplicationTestBase + { + private readonly IBookAppService _bookAppService; + + public BookAppService_Tests() + { + _bookAppService = GetRequiredService(); + } - - - - - @L["Books"] - - - @if (await AuthorizationService.IsGrantedAsync(BookStorePermissions.Books.Create)) + [Fact] + public async Task Should_Get_List_Of_Books() + { + //Act + var result = await _bookAppService.GetListAsync( + new PagedAndSortedResultRequestDto() + ); + + //Assert + result.TotalCount.ShouldBeGreaterThan(0); + result.Items.ShouldContain(b => b.Name == "1984"); + } + + [Fact] + public async Task Should_Create_A_Valid_Book() + { + //Act + var result = await _bookAppService.CreateAsync( + new CreateUpdateBookDto { - + Name = "New test book 42", + Price = 10, + PublishDate = System.DateTime.Now, + Type = BookType.ScienceFiction } - - - - - - - -```` - -* Added `@inject IAuthorizationService AuthorizationService` to access to the authorization service. -* Used `@if (await AuthorizationService.IsGrantedAsync(BookStorePermissions.Books.Create))` to check the book creation permission to conditionally render the *New Book* button. - -### JavaScript Side - -Books table in the book management page has an actions button for each row. The actions button includes *Edit* and *Delete* action: - -![bookstore-edit-delete-actions](images/bookstore-edit-delete-actions.png) - -We should hide an action if the current user has not granted for the related permission. Datatables row actions has a `visible` option that can be set to `false` to hide the action item. - -Open the `Pages/Books/Index.js` inside the `Acme.BookStore.Web` project and add a `visible` option to the `Edit` action as shown below: + ); -````js -{ - text: l('Edit'), - visible: abp.auth.isGranted('BookStore.Books.Edit'), //CHECK for the PERMISSION - action: function (data) { - editModal.open({ id: data.record.id }); + //Assert + result.Id.ShouldNotBe(Guid.Empty); + result.Name.ShouldBe("New test book 42"); + } + + [Fact] + public async Task Should_Not_Create_A_Book_Without_Name() + { + var exception = await Assert.ThrowsAsync(async () => + { + await _bookAppService.CreateAsync( + new CreateUpdateBookDto + { + Name = "", + Price = 10, + PublishDate = DateTime.Now, + Type = BookType.ScienceFiction + } + ); + }); + + exception.ValidationErrors + .ShouldContain(err => err.MemberNames.Any(mem => mem == "Name")); + } } } ```` -Do same for the `Delete` action: - -````js -visible: abp.auth.isGranted('BookStore.Books.Delete') -```` - -* `abp.auth.isGranted(...)` is used to check a permission that is defined before. -* `visible` could also be get a function that returns a `bool` if the value will be calculated later, based on some conditions. - -### Menu Item - -Even we have secured all the layers of the book management page, it is still visible on the main menu of the application. We should hide the menu item if the current user has no permission. - -Open the `BookStoreMenuContributor` class, find the code block below: - -````csharp -context.Menu.AddItem( - new ApplicationMenuItem( - "BooksStore", - l["Menu:BookStore"], - icon: "fa fa-book" - ).AddItem( - new ApplicationMenuItem( - "BooksStore.Books", - l["Menu:Books"], - url: "/Books" - ) - ) -); -```` - -And replace this code block with the following: - -````csharp -var bookStoreMenu = new ApplicationMenuItem( - "BooksStore", - l["Menu:BookStore"], - icon: "fa fa-book" -); - -context.Menu.AddItem(bookStoreMenu); +Open the **Test Explorer Window** (use Test -> Windows -> Test Explorer menu if it is not visible) and **Run All** tests: -//CHECK the PERMISSION -if (await context.IsGrantedAsync(BookStorePermissions.Books.Default)) -{ - bookStoreMenu.AddItem(new ApplicationMenuItem( - "BooksStore.Books", - l["Menu:Books"], - url: "/Books" - )); -} -```` +![bookstore-appservice-tests](./images/bookstore-appservice-tests.png) -{{else if UI == "NG"}} +Congratulations, the **green icons** indicates that the tests have been successfully passed! -***Angular UI authorization document is being prepared...*** +## The Next Part -{{end}} \ No newline at end of file +See the [next part](part-5.md) of this tutorial. \ No newline at end of file diff --git a/docs/en/Tutorials/Part-5.md b/docs/en/Tutorials/Part-5.md new file mode 100644 index 0000000000..17dacbd4f7 --- /dev/null +++ b/docs/en/Tutorials/Part-5.md @@ -0,0 +1,316 @@ +# Web Application Development Tutorial - Part 5: Authorization +````json +//[doc-params] +{ + "UI": ["MVC","NG"] +} +```` + +{{ +if UI == "MVC" + DB="ef" + DB_Text="Entity Framework Core" + UI_Text="mvc" +else if UI == "NG" + DB="mongodb" + DB_Text="MongoDB" + UI_Text="angular" +else + DB ="?" + UI_Text="?" +end +}} + +## About This Tutorial + +In this tutorial series, you will build an ABP based web application named `Acme.BookStore`. This application is used to manage a list of books and their authors. It is developed using the following technologies: + +* **{{DB_Text}}** as the ORM provider. +* **{{UI_Value}}** as the UI Framework. + +This tutorial is organized as the following parts; + +- [Part 1: Creating the project and book list page](Part-1.md) +- [Part 2: The book list page](Part-2.md) +- [Part 3: Creating, updating and deleting books](Part-3.md) +- [Part 4: Integration tests](Part-4.md) +- **Part 5: Authorization (this part)** + +### Source Code + +You can find the completed solution on {{if UI == "MVC"}}[the GitHub repository](https://github.com/abpframework/abp-samples/tree/master/BookStore-Mvc-EfCore){{else}}[the GitHub repository](https://github.com/abpframework/abp-samples/tree/master/BookStore-Angular-MongoDb){{end}}. + +## Permissions + +ABP Framework provides an [authorization system](../Authorization.md) based on the ASP.NET Core's [authorization infrastructure](https://docs.microsoft.com/en-us/aspnet/core/security/authorization/introduction). One major feature added on top of the standard authorization infrastructure is the **permission system** which allows to define permissions and enable/disable per role, user or client. + +### Permission Names + +A permission must have a unique name (a `string`). The best way is to define it as a `const`, so we can reuse the permission name. + +Open the `BookStorePermissions` class and change the content as shown below: + +````csharp +namespace Acme.BookStore.Permissions +{ + public static class BookStorePermissions + { + public const string GroupName = "BookStore"; + + public static class Books + { + public const string Default = GroupName + ".Books"; + public const string Create = Default + ".Create"; + public const string Edit = Default + ".Edit"; + public const string Delete = Default + ".Delete"; + } + } +} +```` + +This is a hierarchical way of defining permission names. For example, "create book" permission name was defined as `BookStore.Books.Create`. + +### Permission Definitions + +You should define permissions before using them. + +Open the `BookStorePermissionDefinitionProvider` class inside the `Acme.BookStore.Application.Contracts` project and change the content as shown below: + +````csharp +using Acme.BookStore.Localization; +using Volo.Abp.Authorization.Permissions; +using Volo.Abp.Localization; + +namespace Acme.BookStore.Permissions +{ + public class BookStorePermissionDefinitionProvider : PermissionDefinitionProvider + { + public override void Define(IPermissionDefinitionContext context) + { + var bookStoreGroup = context.AddGroup(BookStorePermissions.GroupName, L("Permission:BookStore")); + + var booksPermission = bookStoreGroup.AddPermission(BookStorePermissions.Books.Default, L("Permission:Books")); + booksPermission.AddChild(BookStorePermissions.Books.Create, L("Permission:Books.Create")); + booksPermission.AddChild(BookStorePermissions.Books.Edit, L("Permission:Books.Edit")); + booksPermission.AddChild(BookStorePermissions.Books.Delete, L("Permission:Books.Delete")); + } + + private static LocalizableString L(string name) + { + return LocalizableString.Create(name); + } + } +} +```` + +This class defines a **permission group** (to group permissions on the UI, will be seen below) and **4 permissions** inside this group. Also, **Create**, **Edit** and **Delete** are children of the `BookStorePermissions.Books.Default` permission. A child permission can be selected **only if the parent was selected**. + +Finally, edit the localization file (`en.json` under the `Localization/BookStore` folder of the `Acme.BookStore.Domain.Shared` project) to define the localization keys used above: + +````json +"Permission:BookStore": "Book Store", +"Permission:Books": "Book Management", +"Permission:Books.Create": "Creating new books", +"Permission:Books.Edit": "Editing the books", +"Permission:Books.Delete": "Deleting the books" +```` + +> Localization key names are arbitrary and no forcing rule. But we prefer the convention used above. + +### Permission Management UI + +Once you define the permissions, you can see them on the **permission management modal**. + +Go to the *Administration -> Identity -> Roles* page, select *Permissions* action for the admin role to open the permission management modal: + +![bookstore-permissions-ui](images/bookstore-permissions-ui.png) + +Grant the permissions you want and save the modal. + +## Authorization + +Now, you can use the permissions to authorize the book management. + +### Application Layer & HTTP API + +Open the `BookAppService` class and add set the policy names as the permission names defined above: + +````csharp +using System; +using Acme.BookStore.Permissions; +using Volo.Abp.Application.Dtos; +using Volo.Abp.Application.Services; +using Volo.Abp.Domain.Repositories; + +namespace Acme.BookStore.Books +{ + public class BookAppService : + CrudAppService< + Book, //The Book entity + BookDto, //Used to show books + Guid, //Primary key of the book entity + PagedAndSortedResultRequestDto, //Used for paging/sorting + CreateUpdateBookDto>, //Used to create/update a book + IBookAppService //implement the IBookAppService + { + public BookAppService(IRepository repository) + : base(repository) + { + GetPolicyName = BookStorePermissions.Books.Default; + GetListPolicyName = BookStorePermissions.Books.Default; + CreatePolicyName = BookStorePermissions.Books.Create; + UpdatePolicyName = BookStorePermissions.Books.Edit; + DeletePolicyName = BookStorePermissions.Books.Create; + } + } +} +```` + +Added code to the constructor. Base `CrudAppService` automatically uses these permissions on the CRUD operations. This makes the **application service** secure, but also makes the **HTTP API** secure since this service is automatically used as an HTTP API as explained before (see [auto API controllers](../API/Auto-API-Controllers.md)). + +{{if UI == "MVC"}} + +### Razor Page + +While securing the HTTP API & the application service prevents unauthorized users to use the services, they can still navigate to the book management page. While they will get authorization exception when the page makes the first AJAX call to the server, we should also authorize the page for a better user experience and security. + +Open the `BookStoreWebModule` and add the following code block inside the `ConfigureServices` method: + +````csharp +Configure(options => +{ + options.Conventions.AuthorizePage("/Books/Index", BookStorePermissions.Books.Default); + options.Conventions.AuthorizePage("/Books/CreateModal", BookStorePermissions.Books.Create); + options.Conventions.AuthorizePage("/Books/EditModal", BookStorePermissions.Books.Edit); +}); +```` + +Now, unauthorized users are redirected to the **login page**. + +#### Hide the New Book Button + +The book management page has a *New Book* button that should be invisible if the current user has no *Book Creation* permission. + +![bookstore-new-book-button-small](images/bookstore-new-book-button-small.png) + +Open the `Pages/Books/Index.cshtml` file and change the content as shown below: + +````html +@page +@using Acme.BookStore.Localization +@using Acme.BookStore.Permissions +@using Acme.BookStore.Web.Pages.Books +@using Microsoft.AspNetCore.Authorization +@using Microsoft.Extensions.Localization +@model IndexModel +@inject IStringLocalizer L +@inject IAuthorizationService AuthorizationService +@section scripts +{ + +} + + + + + + @L["Books"] + + + @if (await AuthorizationService.IsGrantedAsync(BookStorePermissions.Books.Create)) + { + + } + + + + + + + +```` + +* Added `@inject IAuthorizationService AuthorizationService` to access to the authorization service. +* Used `@if (await AuthorizationService.IsGrantedAsync(BookStorePermissions.Books.Create))` to check the book creation permission to conditionally render the *New Book* button. + +### JavaScript Side + +Books table in the book management page has an actions button for each row. The actions button includes *Edit* and *Delete* action: + +![bookstore-edit-delete-actions](images/bookstore-edit-delete-actions.png) + +We should hide an action if the current user has not granted for the related permission. Datatables row actions has a `visible` option that can be set to `false` to hide the action item. + +Open the `Pages/Books/Index.js` inside the `Acme.BookStore.Web` project and add a `visible` option to the `Edit` action as shown below: + +````js +{ + text: l('Edit'), + visible: abp.auth.isGranted('BookStore.Books.Edit'), //CHECK for the PERMISSION + action: function (data) { + editModal.open({ id: data.record.id }); + } +} +```` + +Do same for the `Delete` action: + +````js +visible: abp.auth.isGranted('BookStore.Books.Delete') +```` + +* `abp.auth.isGranted(...)` is used to check a permission that is defined before. +* `visible` could also be get a function that returns a `bool` if the value will be calculated later, based on some conditions. + +### Menu Item + +Even we have secured all the layers of the book management page, it is still visible on the main menu of the application. We should hide the menu item if the current user has no permission. + +Open the `BookStoreMenuContributor` class, find the code block below: + +````csharp +context.Menu.AddItem( + new ApplicationMenuItem( + "BooksStore", + l["Menu:BookStore"], + icon: "fa fa-book" + ).AddItem( + new ApplicationMenuItem( + "BooksStore.Books", + l["Menu:Books"], + url: "/Books" + ) + ) +); +```` + +And replace this code block with the following: + +````csharp +var bookStoreMenu = new ApplicationMenuItem( + "BooksStore", + l["Menu:BookStore"], + icon: "fa fa-book" +); + +context.Menu.AddItem(bookStoreMenu); + +//CHECK the PERMISSION +if (await context.IsGrantedAsync(BookStorePermissions.Books.Default)) +{ + bookStoreMenu.AddItem(new ApplicationMenuItem( + "BooksStore.Books", + l["Menu:Books"], + url: "/Books" + )); +} +```` + +{{else if UI == "NG"}} + +***Angular UI authorization document is being prepared...*** + +{{end}} \ No newline at end of file diff --git a/docs/en/docs-nav.json b/docs/en/docs-nav.json index b691ea9b07..239f071619 100644 --- a/docs/en/docs-nav.json +++ b/docs/en/docs-nav.json @@ -26,19 +26,27 @@ "text": "Tutorials", "items": [ { - "text": "Application Development", + "text": "Web Application Development", "items": [ { - "text": "Part-1: Creating a new solution and listing items", + "text": "1: Creating the Server Side", "path": "Tutorials/Part-1.md" }, { - "text": "Part-2: CRUD operations", + "text": "2: The Book List Page", "path": "Tutorials/Part-2.md" }, { - "text": "Part-3: Integration tests", + "text": "3: Creating, Updating and Deleting Books", "path": "Tutorials/Part-3.md" + }, + { + "text": "4: Integration Tests", + "path": "Tutorials/Part-4.md" + }, + { + "text": "5: Authorization", + "path": "Tutorials/Part-5.md" } ] } From b329520312b8771b7c08d69870e8160ce6e98723 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Sun, 5 Jul 2020 21:38:04 +0300 Subject: [PATCH 19/58] Fix db provider naming --- docs/en/Tutorials/Part-1.md | 27 +++++++++++++++------------ docs/en/Tutorials/Part-2.md | 15 +++++++++------ docs/en/Tutorials/Part-3.md | 16 +++++++++------- docs/en/Tutorials/Part-4.md | 22 ++++++++++++---------- docs/en/Tutorials/Part-5.md | 18 ++++++++++-------- 5 files changed, 55 insertions(+), 43 deletions(-) diff --git a/docs/en/Tutorials/Part-1.md b/docs/en/Tutorials/Part-1.md index c74f7d8c85..89236e2a85 100644 --- a/docs/en/Tutorials/Part-1.md +++ b/docs/en/Tutorials/Part-1.md @@ -2,22 +2,25 @@ ````json //[doc-params] { - "UI": ["MVC","NG"] + "UI": ["MVC","NG"], + "DB": ["EF","Mongo"] } ```` {{ if UI == "MVC" - DB="ef" - DB_Text="Entity Framework Core" UI_Text="mvc" else if UI == "NG" - DB="mongodb" - DB_Text="MongoDB" UI_Text="angular" else - DB ="?" UI_Text="?" end +if DB == "EF" + DB_Text="Entity Framework Core" +else if DB == "Mongo" + DB_Text="MongoDB" +else + DB_Text="?" +end }} ## About This Tutorial @@ -41,7 +44,7 @@ You can find the completed solution on {{if UI == "MVC"}}[the GitHub repository] ## Creating the Solution -Before starting to the development, create a new solution named `Acme.BookStore` and run it by following the [getting started tutorial](../Getting-Started-{{if UI == 'NG'}}Angular{{else}}AspNetCore-MVC{{end}}-Template#creating-a-new-project). +Before starting to the development, create a new solution named `Acme.BookStore` and run it by following the [getting started tutorial](../Getting-Started.md). ## Create the Book Entity @@ -107,7 +110,7 @@ The final folder/file structure should be as shown below: ### Add Book Entity to the DbContext -{{if DB == "ef"}} +{{if DB == "EF"}} EF Core requires to relate entities with your `DbContext`. The easiest way to do this is to add a `DbSet` property to the `BookStoreDbContext` class in the `Acme.BookStore.EntityFrameworkCore` project, as shown below: @@ -121,7 +124,7 @@ public class BookStoreDbContext : AbpDbContext {{end}} -{{if DB == "mongodb"}} +{{if DB == "Mongo"}} Add a `IMongoCollection Books` property to the `BookStoreMongoDbContext` inside the `Acme.BookStore.MongoDB` project: @@ -135,7 +138,7 @@ public class BookStoreMongoDbContext : AbpMongoDbContext {{end}} -{{if DB == "ef"}} +{{if DB == "EF"}} ### Map the Book Entity to a Database Table @@ -261,13 +264,13 @@ Run the `Acme.BookStore.DbMigrator` application to update the database: ![bookstore-dbmigrator-on-solution](images/bookstore-dbmigrator-on-solution.png) -{{if DB == "ef"}} +{{if DB == "EF"}} `.DbMigrator` is a console application that can be run to **migrate the database schema** and **seed the data** on **development** and **production** environments. {{end}} -{{if DB == "mongodb"}} +{{if DB == "Mongo"}} While MongoDB **doesn't require** a database schema migration, it is still good to run this application since it **seeds the initial data** on the database. This application can be used on **development** and **production** environments. diff --git a/docs/en/Tutorials/Part-2.md b/docs/en/Tutorials/Part-2.md index 1a3c2db7fd..904d68aa7f 100644 --- a/docs/en/Tutorials/Part-2.md +++ b/docs/en/Tutorials/Part-2.md @@ -2,22 +2,25 @@ ````json //[doc-params] { - "UI": ["MVC","NG"] + "UI": ["MVC","NG"], + "DB": ["EF","Mongo"] } ```` {{ if UI == "MVC" - DB="ef" - DB_Text="Entity Framework Core" UI_Text="mvc" else if UI == "NG" - DB="mongodb" - DB_Text="MongoDB" UI_Text="angular" else - DB ="?" UI_Text="?" end +if DB == "EF" + DB_Text="Entity Framework Core" +else if DB == "Mongo" + DB_Text="MongoDB" +else + DB_Text="?" +end }} ## About This Tutorial diff --git a/docs/en/Tutorials/Part-3.md b/docs/en/Tutorials/Part-3.md index 1a861f76bd..c19f621ecf 100644 --- a/docs/en/Tutorials/Part-3.md +++ b/docs/en/Tutorials/Part-3.md @@ -2,23 +2,25 @@ ````json //[doc-params] { - "UI": ["MVC","NG"] + "UI": ["MVC","NG"], + "DB": ["EF","Mongo"] } ```` - {{ if UI == "MVC" - DB="ef" - DB_Text="Entity Framework Core" UI_Text="mvc" else if UI == "NG" - DB="mongodb" - DB_Text="MongoDB" UI_Text="angular" else - DB ="?" UI_Text="?" end +if DB == "EF" + DB_Text="Entity Framework Core" +else if DB == "Mongo" + DB_Text="MongoDB" +else + DB_Text="?" +end }} ## About This Tutorial diff --git a/docs/en/Tutorials/Part-4.md b/docs/en/Tutorials/Part-4.md index c2c0c2b530..98900abff8 100644 --- a/docs/en/Tutorials/Part-4.md +++ b/docs/en/Tutorials/Part-4.md @@ -2,23 +2,25 @@ ````json //[doc-params] { - "UI": ["MVC","NG"] + "UI": ["MVC","NG"], + "DB": ["EF","Mongo"] } ```` - {{ if UI == "MVC" - DB="ef" - DB_Text="Entity Framework Core" UI_Text="mvc" else if UI == "NG" - DB="mongodb" - DB_Text="MongoDB" UI_Text="angular" -else - DB ="?" +else UI_Text="?" end +if DB == "EF" + DB_Text="Entity Framework Core" +else if DB == "Mongo" + DB_Text="MongoDB" +else + DB_Text="?" +end }} ## About This Tutorial @@ -52,11 +54,11 @@ Each project is used to test the related project. Test projects use the followin * [Shoudly](http://shouldly.readthedocs.io/en/latest/) as the assertion library. * [NSubstitute](http://nsubstitute.github.io/) as the mocking library. -{{if DB="ef"}} +{{if DB="EF"}} > The test projects are configured to use **SQLite in-memory** as the database. A separate database instance is created and seeded (with the data seed system) to prepare a fresh database for every test. -{{else if DB="mongodb"}} +{{else if DB="Mongo"}} > **[Mongo2Go](https://github.com/Mongo2Go/Mongo2Go)** library is used to mock the MongoDB database. A separate database instance is created and seeded (with the data seed system) to prepare a fresh database for every test. diff --git a/docs/en/Tutorials/Part-5.md b/docs/en/Tutorials/Part-5.md index 17dacbd4f7..fcf359d974 100644 --- a/docs/en/Tutorials/Part-5.md +++ b/docs/en/Tutorials/Part-5.md @@ -2,23 +2,25 @@ ````json //[doc-params] { - "UI": ["MVC","NG"] + "UI": ["MVC","NG"], + "DB": ["EF","Mongo"] } ```` - {{ if UI == "MVC" - DB="ef" - DB_Text="Entity Framework Core" UI_Text="mvc" else if UI == "NG" - DB="mongodb" - DB_Text="MongoDB" UI_Text="angular" -else - DB ="?" +else UI_Text="?" end +if DB == "EF" + DB_Text="Entity Framework Core" +else if DB == "Mongo" + DB_Text="MongoDB" +else + DB_Text="?" +end }} ## About This Tutorial From 06cfb503869424186462d489b8b56439b67f01a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Sun, 5 Jul 2020 21:42:17 +0300 Subject: [PATCH 20/58] Update Part-4.md --- docs/en/Tutorials/Part-4.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/en/Tutorials/Part-4.md b/docs/en/Tutorials/Part-4.md index 98900abff8..3f14123cd9 100644 --- a/docs/en/Tutorials/Part-4.md +++ b/docs/en/Tutorials/Part-4.md @@ -54,11 +54,11 @@ Each project is used to test the related project. Test projects use the followin * [Shoudly](http://shouldly.readthedocs.io/en/latest/) as the assertion library. * [NSubstitute](http://nsubstitute.github.io/) as the mocking library. -{{if DB="EF"}} +{{if DB=="EF"}} > The test projects are configured to use **SQLite in-memory** as the database. A separate database instance is created and seeded (with the data seed system) to prepare a fresh database for every test. -{{else if DB="Mongo"}} +{{else if DB=="Mongo"}} > **[Mongo2Go](https://github.com/Mongo2Go/Mongo2Go)** library is used to mock the MongoDB database. A separate database instance is created and seeded (with the data seed system) to prepare a fresh database for every test. From fe20970c322768305f8c83e7dd01aa6bee69be3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Sun, 5 Jul 2020 21:53:38 +0300 Subject: [PATCH 21/58] Update source code sections. --- docs/en/Tutorials/Part-1.md | 7 +++++-- docs/en/Tutorials/Part-2.md | 9 ++++++--- docs/en/Tutorials/Part-3.md | 7 +++++-- docs/en/Tutorials/Part-4.md | 9 ++++++--- docs/en/Tutorials/Part-5.md | 7 +++++-- 5 files changed, 27 insertions(+), 12 deletions(-) diff --git a/docs/en/Tutorials/Part-1.md b/docs/en/Tutorials/Part-1.md index 89236e2a85..c1bd36c74e 100644 --- a/docs/en/Tutorials/Part-1.md +++ b/docs/en/Tutorials/Part-1.md @@ -38,9 +38,12 @@ This tutorial is organized as the following parts; - [Part 4: Integration tests](Part-4.md) - [Part 5: Authorization](Part-5.md) -### Source Code +### Download the Source Code -You can find the completed solution on {{if UI == "MVC"}}[the GitHub repository](https://github.com/abpframework/abp-samples/tree/master/BookStore-Mvc-EfCore){{else}}[the GitHub repository](https://github.com/abpframework/abp-samples/tree/master/BookStore-Angular-MongoDb){{end}}. +This tutorials has multiple versions based on your **UI** and **Database** preferences. We've prepared two combinations of the source code to be downloaded: + +* [MVC (Razor Pages) UI with EF Core](https://github.com/abpframework/abp-samples/tree/master/BookStore-Mvc-EfCore) +* [Angular UI with MongoDB](https://github.com/abpframework/abp-samples/tree/master/BookStore-Angular-MongoDb) ## Creating the Solution diff --git a/docs/en/Tutorials/Part-2.md b/docs/en/Tutorials/Part-2.md index 904d68aa7f..5c8f7ace9a 100644 --- a/docs/en/Tutorials/Part-2.md +++ b/docs/en/Tutorials/Part-2.md @@ -38,9 +38,12 @@ This tutorial is organized as the following parts; - [Part 4: Integration tests](Part-4.md) - [Part 5: Authorization](Part-5.md) -### Source Code +### Download the Source Code -You can find the completed solution on {{if UI == "MVC"}}[the GitHub repository](https://github.com/abpframework/abp-samples/tree/master/BookStore-Mvc-EfCore){{else}}[the GitHub repository](https://github.com/abpframework/abp-samples/tree/master/BookStore-Angular-MongoDb){{end}}. +This tutorials has multiple versions based on your **UI** and **Database** preferences. We've prepared two combinations of the source code to be downloaded: + +* [MVC (Razor Pages) UI with EF Core](https://github.com/abpframework/abp-samples/tree/master/BookStore-Mvc-EfCore) +* [Angular UI with MongoDB](https://github.com/abpframework/abp-samples/tree/master/BookStore-Angular-MongoDb) {{if UI == "MVC"}} @@ -50,7 +53,7 @@ It's common to call the HTTP API endpoints via AJAX from the **JavaScript** side ABP **dynamically** creates **[JavaScript Proxies](../UI/AspNetCore/)** for all API endpoints. So, you can use any **endpoint** just like calling a **JavaScript function**. -### Testing in Developer Console of the Browser +### Testing in the Developer Console You can easily test the JavaScript proxies using your favorite browser's **Developer Console**. Run the application, open your browser's **developer tools** (*shortcut is generally F12*), switch to the **Console** tab, type the following code and press enter: diff --git a/docs/en/Tutorials/Part-3.md b/docs/en/Tutorials/Part-3.md index c19f621ecf..2890db181b 100644 --- a/docs/en/Tutorials/Part-3.md +++ b/docs/en/Tutorials/Part-3.md @@ -38,9 +38,12 @@ This tutorial is organized as the following parts; - [Part 4: Integration tests](Part-4.md) - [Part 5: Authorization](Part-5.md) -### Source Code +### Download the Source Code -You can find the completed solution on {{if UI == "MVC"}}[the GitHub repository](https://github.com/abpframework/abp-samples/tree/master/BookStore-Mvc-EfCore){{else}}[the GitHub repository](https://github.com/abpframework/abp-samples/tree/master/BookStore-Angular-MongoDb){{end}}. +This tutorials has multiple versions based on your **UI** and **Database** preferences. We've prepared two combinations of the source code to be downloaded: + +* [MVC (Razor Pages) UI with EF Core](https://github.com/abpframework/abp-samples/tree/master/BookStore-Mvc-EfCore) +* [Angular UI with MongoDB](https://github.com/abpframework/abp-samples/tree/master/BookStore-Angular-MongoDb) {{if UI == "MVC"}} diff --git a/docs/en/Tutorials/Part-4.md b/docs/en/Tutorials/Part-4.md index 3f14123cd9..0325f3f60a 100644 --- a/docs/en/Tutorials/Part-4.md +++ b/docs/en/Tutorials/Part-4.md @@ -38,9 +38,12 @@ This tutorial is organized as the following parts; - **Part 4: Integration tests (this part)** - [Part 5: Authorization](Part-5.md) -### Source Code +### Download the Source Code -You can find the completed solution on {{if UI == "MVC"}}[the GitHub repository](https://github.com/abpframework/abp-samples/tree/master/BookStore-Mvc-EfCore){{else}}[the GitHub repository](https://github.com/abpframework/abp-samples/tree/master/BookStore-Angular-MongoDb){{end}}. +This tutorials has multiple versions based on your **UI** and **Database** preferences. We've prepared two combinations of the source code to be downloaded: + +* [MVC (Razor Pages) UI with EF Core](https://github.com/abpframework/abp-samples/tree/master/BookStore-Mvc-EfCore) +* [Angular UI with MongoDB](https://github.com/abpframework/abp-samples/tree/master/BookStore-Angular-MongoDb) ## Test Projects in the Solution @@ -68,7 +71,7 @@ Each project is used to test the related project. Test projects use the followin If you had created a data seed contributor as described in the [first part](Part-1.md), the same data will be available in your tests. So, you can skip this section. If you haven't created the seed contributor, you can use the `BookStoreTestDataSeedContributor` to seed the same data to be used in the tests below. -## Testing The Application Service: BookAppService +## Testing the BookAppService Create a test class named `BookAppService_Tests` in the `Acme.BookStore.Application.Tests` project: diff --git a/docs/en/Tutorials/Part-5.md b/docs/en/Tutorials/Part-5.md index fcf359d974..61bb16c534 100644 --- a/docs/en/Tutorials/Part-5.md +++ b/docs/en/Tutorials/Part-5.md @@ -38,9 +38,12 @@ This tutorial is organized as the following parts; - [Part 4: Integration tests](Part-4.md) - **Part 5: Authorization (this part)** -### Source Code +### Download the Source Code -You can find the completed solution on {{if UI == "MVC"}}[the GitHub repository](https://github.com/abpframework/abp-samples/tree/master/BookStore-Mvc-EfCore){{else}}[the GitHub repository](https://github.com/abpframework/abp-samples/tree/master/BookStore-Angular-MongoDb){{end}}. +This tutorials has multiple versions based on your **UI** and **Database** preferences. We've prepared two combinations of the source code to be downloaded: + +* [MVC (Razor Pages) UI with EF Core](https://github.com/abpframework/abp-samples/tree/master/BookStore-Mvc-EfCore) +* [Angular UI with MongoDB](https://github.com/abpframework/abp-samples/tree/master/BookStore-Angular-MongoDb) ## Permissions From 775e1a4252cdf3f2aa71b1520a2a38492c4afacd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Sun, 5 Jul 2020 22:06:26 +0300 Subject: [PATCH 22/58] Update Part-2.md --- docs/en/Tutorials/Part-2.md | 127 ++++++++++++++++++------------------ 1 file changed, 64 insertions(+), 63 deletions(-) diff --git a/docs/en/Tutorials/Part-2.md b/docs/en/Tutorials/Part-2.md index 5c8f7ace9a..90059c4831 100644 --- a/docs/en/Tutorials/Part-2.md +++ b/docs/en/Tutorials/Part-2.md @@ -98,6 +98,59 @@ Check the `Books` table in the database to see the new book row. You can try `ge We will use these dynamic proxy functions in the next sections to communicate to the server. +{{end}} + +## Localization + +Before starting to the UI development, we first want to prepare the localization texts (you normally do when needed while developing your application). + +Localization texts are located under the `Localization/BookStore` folder of the `Acme.BookStore.Domain.Shared` project: + +![bookstore-localization-files](./images/bookstore-localization-files-v2.png) + +Open the `en.json` (*the English translations*) file and change the content as below: + +````json +{ + "Culture": "en", + "Texts": { + "Menu:Home": "Home", + "Welcome": "Welcome", + "LongWelcomeMessage": "Welcome to the application. This is a startup project based on the ABP framework. For more information, visit abp.io.", + "Menu:BookStore": "Book Store", + "Menu:Books": "Books", + "Actions": "Actions", + "Edit": "Edit", + "PublishDate": "Publish date", + "NewBook": "New book", + "Name": "Name", + "Type": "Type", + "Price": "Price", + "CreationTime": "Creation time", + "AreYouSureToDelete": "Are you sure you want to delete this item?", + "Enum:BookType:0": "Undefined", + "Enum:BookType:1": "Adventure", + "Enum:BookType:2": "Biography", + "Enum:BookType:3": "Dystopia", + "Enum:BookType:4": "Fantastic", + "Enum:BookType:5": "Horror", + "Enum:BookType:6": "Science", + "Enum:BookType:7": "Science fiction", + "Enum:BookType:8": "Poetry" + } +} +```` + +* Localization key names are arbitrary. You can set any name. We prefer some conventions for specific text types; + * Add `Menu:` prefix for menu items. + * Use `Enum::` naming convention to localize the enum members. When you do it like that, ABP can automatically localize the enums in some proper cases. + +If a text is not defined in the localization file, it **fallbacks** to the localization key (as ASP.NET Core's standard behavior). + +> ABP's localization system is built on [ASP.NET Core's standard localization](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/localization) system and extends it in many ways. See the [localization document](../Localization.md) for details. + +{{if UI == "MVC"}} + ## Create a Books Page It's time to create something visible and usable! Instead of classic MVC, we will use the [Razor Pages UI](https://docs.microsoft.com/en-us/aspnet/core/tutorials/razor-pages/razor-pages-start) approach which is recommended by Microsoft. @@ -153,57 +206,6 @@ context.Menu.AddItem( ); ```` -{{end}} - -### Localization - -Localization texts are located under the `Localization/BookStore` folder of the `Acme.BookStore.Domain.Shared` project: - -![bookstore-localization-files](./images/bookstore-localization-files-v2.png) - -Open the `en.json` (*the English translations*) file and change the content as below: - -````json -{ - "Culture": "en", - "Texts": { - "Menu:Home": "Home", - "Welcome": "Welcome", - "LongWelcomeMessage": "Welcome to the application. This is a startup project based on the ABP framework. For more information, visit abp.io.", - "Menu:BookStore": "Book Store", - "Menu:Books": "Books", - "Actions": "Actions", - "Edit": "Edit", - "PublishDate": "Publish date", - "NewBook": "New book", - "Name": "Name", - "Type": "Type", - "Price": "Price", - "CreationTime": "Creation time", - "AreYouSureToDelete": "Are you sure you want to delete this item?", - "Enum:BookType:0": "Undefined", - "Enum:BookType:1": "Adventure", - "Enum:BookType:2": "Biography", - "Enum:BookType:3": "Dystopia", - "Enum:BookType:4": "Fantastic", - "Enum:BookType:5": "Horror", - "Enum:BookType:6": "Science", - "Enum:BookType:7": "Science fiction", - "Enum:BookType:8": "Poetry" - } -} -```` - -* Localization key names are arbitrary. You can set any name. We prefer some conventions for specific text types; - * Add `Menu:` prefix for menu items. - * Use `Enum::` naming convention to localize the enum members. When you do it like that, ABP can automatically localize the enums in some proper cases. - -If a text is not defined in the localization file, it **fallbacks** to the localization key (as ASP.NET Core's standard behavior). - -> ABP's localization system is built on [ASP.NET Core's standard localization](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/localization) system and extends it in many ways. See the [localization document](../Localization.md) for details. - -{{if UI == "MVC"}} - Run the project, login to the application with the username `admin` and the password `1q2w3E*` and see the new menu item has been added to the main menu: ![bookstore-menu-items](./images/bookstore-new-menu-item.png) @@ -327,24 +329,23 @@ This is a fully working, server side paged, sorted and localized table of books. {{if UI == "NG"}} -## Angular UI Development -### Create the books page +## 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 NPM packages: + +```bash +yarn +``` + +## Create a Books Page -It's time to create something visible and usable! There are some tools that we will use when developing ABP Angular frontend application: +It's time to create something visible and usable! There are some tools that we will use when developing the Angular frontend application: - [Angular CLI](https://angular.io/cli) will be used to create modules, components and services. - [Ng Bootstrap](https://ng-bootstrap.github.io/#/home) will be used as the UI component library. - [ngx-datatable](https://swimlane.gitbook.io/ngx-datatable/) will be used as the datatable library. - [Visual Studio Code](https://code.visualstudio.com/) will be used as the code editor (you can use your favorite editor). -### Install NPM packages - -Open a new command line interface (terminal window) and go to your `angular` folder and then run `yarn` command to install NPM packages: - -```bash -yarn -``` - ### BookModule Run the following command line to create a new module, named `BookModule`: @@ -408,7 +409,7 @@ function configureRoutes(routes: RoutesService) { For more information, see the [RoutesService document](https://docs.abp.io/en/abp/latest/UI/Angular/Modifying-the-Menu.md#via-routesservice). -#### Book List Component +### Book List Component Run the command below on the terminal in the root folder to generate a new component, named book-list: From 472077998f570a777300fd187318765e4b6dbcda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Mon, 6 Jul 2020 14:31:00 +0300 Subject: [PATCH 23/58] Fix tutorial --- docs/en/Getting-Started.md | 1 - docs/en/Tutorials/Part-1.md | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/en/Getting-Started.md b/docs/en/Getting-Started.md index 952abc9b70..5f3d79d94a 100644 --- a/docs/en/Getting-Started.md +++ b/docs/en/Getting-Started.md @@ -322,7 +322,6 @@ Once all node modules are loaded, execute `yarn start` (or `npm start`) command: yarn start ``` -Wait `Angular CLI` to launch `Webpack` dev-server with `BrowserSync`. This will take care of compiling your `TypeScript` code, and automatically reloading your browser. After it finishes, `Angular Live Development Server` will be listening on localhost:4200, open your web browser and navigate to [localhost:4200](http://localhost:4200/) diff --git a/docs/en/Tutorials/Part-1.md b/docs/en/Tutorials/Part-1.md index c1bd36c74e..2f21b99e4b 100644 --- a/docs/en/Tutorials/Part-1.md +++ b/docs/en/Tutorials/Part-1.md @@ -90,7 +90,7 @@ namespace Acme.BookStore.Books The `Book` entity uses the `BookType` enum. Create the `BookType` in the `Acme.BookStore.Domain.Shared` project: ````csharp -namespace Acme.BookStore +namespace Acme.BookStore.Books { public enum BookType { From 08bb559b45527b73712cfae3bb126d329f076352 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Mon, 6 Jul 2020 15:20:52 +0300 Subject: [PATCH 24/58] Completed until the menu item. --- docs/en/Tutorials/Part-2.md | 88 +++++++++++------- ...kstore-creating-book-module-terminal-2.png | Bin 0 -> 102672 bytes 2 files changed, 54 insertions(+), 34 deletions(-) create mode 100644 docs/en/Tutorials/images/bookstore-creating-book-module-terminal-2.png diff --git a/docs/en/Tutorials/Part-2.md b/docs/en/Tutorials/Part-2.md index 90059c4831..f96425835e 100644 --- a/docs/en/Tutorials/Part-2.md +++ b/docs/en/Tutorials/Part-2.md @@ -341,58 +341,77 @@ yarn It's time to create something visible and usable! There are some tools that we will use when developing the Angular frontend application: -- [Angular CLI](https://angular.io/cli) will be used to create modules, components and services. - [Ng Bootstrap](https://ng-bootstrap.github.io/#/home) will be used as the UI component library. -- [ngx-datatable](https://swimlane.gitbook.io/ngx-datatable/) will be used as the datatable library. -- [Visual Studio Code](https://code.visualstudio.com/) will be used as the code editor (you can use your favorite editor). +- [Ngx-Datatable](https://swimlane.gitbook.io/ngx-datatable/) will be used as the datatable library. ### BookModule -Run the following command line to create a new module, named `BookModule`: +Run the following command line to create a new module, named `BookModule` in the root folder of the angular application: ```bash -yarn ng generate module book --routing true +yarn ng generate module books --module app --routing --route books ``` -![Generating books module](./images/bookstore-creating-book-module-terminal.png) +This command should produce the following output: + +![Generating books module](./images/bookstore-creating-book-module-terminal-2.png) ### Routing -Open the `app-routing.module.ts` file in `src\app` folder and add a route as shown below: +Generated code places the new route definition to the `src/app/app-routing.module.ts` file as shown below: -```js +````js const routes: Routes = [ -// ... -// added a new route to the routes array { - path: 'books', - loadChildren: () => import('./book/book.module').then(m => m.BookModule) - } -] -``` - -* We added a lazy-loaded route. See the [Lazy-Loading Feature Modules](https://angular.io/guide/lazy-loading-ngmodules#lazy-loading-feature-modules). - -Open the `route.provider.ts` file in `src\app` folder and replace the content as below: + path: '', + component: DynamicLayoutComponent, + children: [ + // ... + ], + }, + { path: 'books', loadChildren: () => import('./books/books.module').then(m => m.BooksModule) }, +]; +```` -```js -import { RoutesService, eLayoutType } from '@abp/ng.core'; -import { APP_INITIALIZER } from '@angular/core'; +We need to **move this route** definition inside the `children` array, so it can use the application layout: -export const APP_ROUTE_PROVIDER = [ - { provide: APP_INITIALIZER, useFactory: configureRoutes, deps: [RoutesService], multi: true }, +````js +const routes: Routes = [ + { + path: '', + component: DynamicLayoutComponent, + children: [ + // ... + { path: 'books', loadChildren: () => import('./books/books.module').then(m => m.BooksModule) }, + ], + }, ]; +```` + +Finally, open the `src/app/route.provider.ts` file replace the `configureRoutes` function declaration as shown below: +```js function configureRoutes(routes: RoutesService) { return () => { routes.add([ - //... - // added below element + { + path: '/', + name: '::Menu:Home', + iconClass: 'fas fa-home', + order: 1, + layout: eLayoutType.application, + }, + { + path: '/book-store', + name: '::Menu:BookStore', + iconClass: 'fas fa-book', + order: 2, + layout: eLayoutType.application, + }, { path: '/books', name: '::Menu:Books', - iconClass: 'fas fa-book', - order: 101, + parentName: '::Menu:BookStore', layout: eLayoutType.application, }, ]); @@ -400,12 +419,13 @@ function configureRoutes(routes: RoutesService) { } ``` -* We added a new route element to show a navigation element labeled "Books" on the menu. - * `path` is the URL of the route. - * `name` is the menu item name. A Localization key can be passed. - * `iconClass` is the icon of the menu item. - * `order` is the order of the menu item. We define 101 to show the route after the "Administration" item. - * `layout` is the layout of the BooksModule's routes. `eLayoutType.application`, `eLayoutType.account` or `eLayoutType.empty` can be defined. +`RoutesService` is a service provided by the ABP Framework to configure the main menu and the routes. + +* `path` is the URL of the route. +* `name` is the localized menu item name (see the [localization document](../UI/Angular/Localization.md) for details). +* `iconClass` is the icon of the menu item (you can use [Font Awesome](https://fontawesome.com/) icons by default). +* `order` is the order of the menu item. +* `layout` is the layout of the BooksModule's routes. `eLayoutType.application`, `eLayoutType.account` or `eLayoutType.empty` can be used. For more information, see the [RoutesService document](https://docs.abp.io/en/abp/latest/UI/Angular/Modifying-the-Menu.md#via-routesservice). diff --git a/docs/en/Tutorials/images/bookstore-creating-book-module-terminal-2.png b/docs/en/Tutorials/images/bookstore-creating-book-module-terminal-2.png new file mode 100644 index 0000000000000000000000000000000000000000..88c4b34bd14d738b077c1b6e26e2142215929cef GIT binary patch literal 102672 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%0AHFEOdt@j1A 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 literal 0 HcmV?d00001 From ccdb83b00dae650292f7869a8232dfb8987cee54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Mon, 6 Jul 2020 15:45:14 +0300 Subject: [PATCH 25/58] Update Part-2.md --- docs/en/Tutorials/Part-2.md | 70 ++----------------------------------- 1 file changed, 2 insertions(+), 68 deletions(-) diff --git a/docs/en/Tutorials/Part-2.md b/docs/en/Tutorials/Part-2.md index f96425835e..1f6223f5c9 100644 --- a/docs/en/Tutorials/Part-2.md +++ b/docs/en/Tutorials/Part-2.md @@ -425,79 +425,13 @@ function configureRoutes(routes: RoutesService) { * `name` is the localized menu item name (see the [localization document](../UI/Angular/Localization.md) for details). * `iconClass` is the icon of the menu item (you can use [Font Awesome](https://fontawesome.com/) icons by default). * `order` is the order of the menu item. -* `layout` is the layout of the BooksModule's routes. `eLayoutType.application`, `eLayoutType.account` or `eLayoutType.empty` can be used. +* `layout` is the layout of the BooksModule's routes (there are three types of pre-defined layouts: `eLayoutType.application`, `eLayoutType.account` or `eLayoutType.empty`). For more information, see the [RoutesService document](https://docs.abp.io/en/abp/latest/UI/Angular/Modifying-the-Menu.md#via-routesservice). -### Book List Component - -Run the command below on the terminal in the root folder to generate a new component, named book-list: - -```bash -yarn ng generate component book/book-list -``` - -![Creating books list](./images/bookstore-creating-book-list-terminal.png) - -Open `book.module.ts` file in the `app\book` folder and replace the content as below: - -```js -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { BookRoutingModule } from './book-routing.module'; -import { BookListComponent } from './book-list/book-list.component'; -import { SharedModule } from '../shared/shared.module'; //<== added this line ==> - -@NgModule({ - declarations: [BookListComponent], - imports: [ - CommonModule, - BookRoutingModule, - SharedModule, //<== added this line ==> - ], -}) -export class BookModule {} -``` - -* We imported `SharedModule` and added to `imports` array. - -Open `book-routing.module.ts` file in the `app\book` folder and replace the content as below: - -```js -import { NgModule } from '@angular/core'; -import { Routes, RouterModule } from '@angular/router'; -import { BookListComponent } from './book-list/book-list.component'; // <== added this line ==> - -// <== replaced routes ==> -const routes: Routes = [ - { - path: '', - component: BookListComponent, - }, -]; - -@NgModule({ - imports: [RouterModule.forChild(routes)], - exports: [RouterModule] -}) -export class BookRoutingModule { } -``` - -* We imported `BookListComponent` and replaced `routes` const. - -Run `yarn start` and wait for Angular to serve the application: - -```bash -yarn start -``` - -Open the browser and navigate to http://localhost:4200/books. We'll see **book-list works!** text on the books page: - -![Initial book list page](./images/bookstore-initial-book-list-page.png) - ### Generate Proxies -ABP CLI provides `generate-proxy` command that generates client proxies for your HTTP APIs to make easy to consume your services from the client side. Before running generate-proxy command, your host must be up and running. See the [CLI documentation](../CLI.md) +[ABP CLI](../CLI.md) provides `generate-proxy` command that generates client proxies for your HTTP APIs to make easy to consume your HTTP APIs from the client side. Before running `generate-proxy` command, your host must be up and running. Run the following command in the `angular` folder: From b6f7991ae13eb03c4b8fd197964fd561b211b607 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Mon, 6 Jul 2020 16:15:05 +0300 Subject: [PATCH 26/58] Fix module name --- docs/en/Tutorials/Part-2.md | 26 ++++++++++++++---- ...kstore-creating-book-module-terminal-2.png | Bin 102672 -> 0 bytes 2 files changed, 21 insertions(+), 5 deletions(-) delete mode 100644 docs/en/Tutorials/images/bookstore-creating-book-module-terminal-2.png diff --git a/docs/en/Tutorials/Part-2.md b/docs/en/Tutorials/Part-2.md index 1f6223f5c9..43541847e7 100644 --- a/docs/en/Tutorials/Part-2.md +++ b/docs/en/Tutorials/Part-2.md @@ -349,12 +349,25 @@ It's time to create something visible and usable! There are some tools that we w Run the following command line to create a new module, named `BookModule` in the root folder of the angular application: ```bash -yarn ng generate module books --module app --routing --route books +yarn ng generate module book --module app --routing --route books ``` This command should produce the following output: -![Generating books module](./images/bookstore-creating-book-module-terminal-2.png) +````bash +> yarn ng generate module book --module app --routing --route books + +yarn run v1.19.1 +$ ng generate module book --module app --routing --route books +CREATE src/app/book/book-routing.module.ts (336 bytes) +CREATE src/app/book/book.module.ts (335 bytes) +CREATE src/app/book/book.component.html (19 bytes) +CREATE src/app/book/book.component.spec.ts (614 bytes) +CREATE src/app/book/book.component.ts (268 bytes) +CREATE src/app/book/book.component.scss (0 bytes) +UPDATE src/app/app-routing.module.ts (1289 bytes) +Done in 3.88s. +```` ### Routing @@ -369,7 +382,7 @@ const routes: Routes = [ // ... ], }, - { path: 'books', loadChildren: () => import('./books/books.module').then(m => m.BooksModule) }, + { path: 'books', loadChildren: () => import('./book/book.module').then(m => m.BookModule) }, ]; ```` @@ -382,7 +395,7 @@ const routes: Routes = [ component: DynamicLayoutComponent, children: [ // ... - { path: 'books', loadChildren: () => import('./books/books.module').then(m => m.BooksModule) }, + { path: 'books', loadChildren: () => import('./book/book.module').then(m => m.BookModule) }, ], }, ]; @@ -436,9 +449,12 @@ For more information, see the [RoutesService document](https://docs.abp.io/en/ab Run the following command in the `angular` folder: ```bash -abp generate-proxy --module app +abp generate-proxy --module app --apiUrl https://localhost:XXXXX ``` +* XXXXX should be replaced with the backend port of your application. +* If you don't specify the `--apiUrl` parameter, it will try to get the URL from the `src/environments/environment.ts` file. + ![Generate proxy command](./images/generate-proxy-command.png) The generated files looks like below: diff --git a/docs/en/Tutorials/images/bookstore-creating-book-module-terminal-2.png b/docs/en/Tutorials/images/bookstore-creating-book-module-terminal-2.png deleted file mode 100644 index 88c4b34bd14d738b077c1b6e26e2142215929cef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 102672 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%0AHFEOdt@j1A zGGClF@^-6IFUrX2emXyP?8J2f&&Y`k)1|K1WN!f+yba4*uQ(-##pqjcKJ$8=3(0x| z4ssob{4jkwTHvU}uYB9SX#Q6E-sbR@{Hd}`*4ySpCFyA3eK0>=F!gj)pFay%*{wio zDE%Y{P?ZEu9GgNm|Jn>Mq)XVa&UeTsGJF-h?Rv%epg>fscVA%*YBo7}doG6o^!Q!d z-HHi5DBX>d#wSeSzOy%6mIx6;FqE|7gw4nkt#0bpA2weFX-;Z9H{O7UiH_tQyg9Zo zj5bpim8W^n)-T&x-mJ!ceIpCj^h-^1KpwfNGxyET>nK$a^xI3^+lf+3lC>Ks-^R*h z!liO~_%dvz(H+M91;QxMT-bnQ7uJ|ywFGAN_UQ1g$FuawMN&w z2tUGVixC1rtyfuZkFL!xOVfit4-J;1vM9b$D(sz=0H+0Z`SkRm&~&?Rk~=eTM3XAi z*|hCzq+gp{qJ}o@7oA$Wz-p6thCoAg9xdmy$&Py3p>6)kq?6^TwcGaYL-Tf>at0S_ zTK-X7bWEbI8l$CDNJ)hryUT3HLlG%dm*(v-n##jh!N;|tyxKety_?W;;Mi#epYwsS ze;P)E+i@i5*$Hz094uPKuqo0}Qy(0 z9@vedMjFl z5?wc|>kRgf;M-y(=^4?}h8L#^>-nY(>vWM?Ph3e2HLSuk%%F>$LTDsoDHk(I>Q8 z-0zE7`jB2sau4(B8ka6p&-*s6KV$I9Q(CbOJacg4!`mYwJ&{W(19T?B8B&Qj%&nDK zDK$Zr1+{A|oZ~-C;a|o@7+c-bKGks~jg*s^9v{r}YB9v#n(B+MY`)4yYO9!P=_<@C zHnLJ+kU(uL?EfZ7-uFq~!ATrw+H8OT{N*^So-cEoWjCF(8{-F_acM+W6sPpP=dN zp72Wf!FEgPSw{L~gHRoH6c#r9NM9~sUOzNk%JswvcIiIjmQR=vK9#0@vTxifi#MXp zcj_yD${aZT)k~+Hh(l{#T**OK*6~+m&Gun2@J^4l=|);9Le$vCBOV>VWT2y!)Gx@) z{s$4z`DvgpkXhZrTxueG0`H}46}hpdHMeBw1U6Vi&b4)%GD0$B4+g-57)$l_qlx_k z*KWP+4ci^^#JR|p?J?D?lf>`Au&ip_e~-U{3KT)$AFg!>Dv^KbCeow&a3A;zx=oLi zZ|hp}l!I$5BSQp^Pv9Txn%#3-ZCUuTi5SwXSolS&dS%amXO5GAZ03k4cY{RnrW0O>N2f z<-G?EpbHN>Y!g=^X5?ij$Gj~szf?Fi@5^oQ$OI=D+f2vEqZ$Afx}t!dFEd@;txAzn z2n4gJ6XEGF;eT@1M9tHy>GQwClXjB&ocxLDIhay(5bqPNhSoLQM9M8ek~JOHDMyMG z9Zpo2?j#%jCZj_!>EA-Py6H^Bf_^M8X=jca6hwd0DXN8fg5-4WD| zuK7i_E)EbHdIps*JF%zc3HIi3V=U%%`gY!eKM(=g1PZ_F&;j9C;62w4&NK<$1mR^M z`&6f{{UTr;;Qh5Q>$j9q=3Q#MIV+_au#*_%q2(WZ7Y*`4vcjX z(LMVy@uwlA{Wf0=#tJ`Ode!3!l1xsVG7aItGmePAnt_K_X{#(>NZ4pgJjqB{)6fsIwI`8Iq z@~yIstCI8L4@2mzKG=U?0X&mvnjH&upuZR8oCd*S30f%5gl^Pr*9>HgB5J3o$lhi+ zz5nG_3dBTrfebP`_z0H|rxVuqd`2$l02exSwBGB0FI6cdZ-^_&wtqz{Wd88<1O(a-u9uWGMzAjK?z5lbmh)G`SD}@U$86DNsI=1&L;^1xDSuydO;WvlRPh z++G)TB^{kaWfUE@E36quN(5dX`v}4;pfce2NfzRI;DUrQ6EfK*?OdcdOEY}QBbIC5 zG?*{~-SD@ao!j`6UNNhJ*1b+zL@E@U(swVBu`6b-Hq6ThrS6^p$L@>t*Xq zOwy;R{75o*-Mfi~lTtuHz-+g*xjDf^fWDH{&91^Y+w309gEJk)ZGsmB#dp8jh$q2f z>v82iil)Gf>~5)V|C>$Pm6!^&#Pb-`TXdAkWHoQvK z61-Dk-Br$22Q_Pf3vu3=TtkBlo{o}0m+Q5eqVv1)6`B6MieKos1K+dH}z(lW|GMZ=fK#zd3(bRJEw4Ym$Rj?fSPHn6#p7@FI; z-0s3y?ZjFaP|e>e3W9j@k7s%9ySr;Bjx>UbMh6b?W|5r&D2(9XSJQu+WyzWK6|829 zH}veHXwuz-{9~F1B;lySL`82Wm^%+1Q>cTiwMq2e3+BhpmNFwB+gGN`s|6gxKEK_8ID5u6URyWcb}q|RxlCiXH$MSXNR!2tN+VpCCO zl#`b{rY%D0L6B9h2lMvC3i$+BL(2r0AU74xTwz!zjGU%!YVTS3Nl*{r7f4K>Am-%l!kBdwkRnb6%0gtdApOa`OBg}e<>%M>?{dR!|Fxma1z3W z0?L5EYQ(@EBmfuf=f$WTe4=UtydJ$-f-n4u}J&DXCqxqjs*~y7foCAD$+wWiN(q}bpg=bU%UGdmuE2)^FTDQ=MWRyQv^8jHLY?z2@=E{U&{Mn$*KY} zyAT;x8Ysgp1Uw%G|2itmm_{Y_BfKDvd|Pw`H!@@y+x422a#~M}BX_Knd8-Rfno%Vz z_e+1off;oz31D3e85!Z&6>VJSe(oD9d~|1dHBc%1iOjiiqBs%3M~NZXV71o0z(K_2 z^}YC!G|(TAyU7G)Oh}xT{IbELJj2(-|^;mhjr$UVnCXjY-IoBySRW8J~{`M=xPzpqv z9v_!TGzx@4G3SlU;|?ZM$b>3eehbm(KI1oq0W^v%EHB|UH0dgdLKF75cvV|)?%2hEC!Ecfh&;U~}Nr{XVtg!#f^7u#ciTRs?` z?#kA4pqn+Eny!+bggK}@0^LzyKw~~Z&zbsg(5{~b`*Q``3CD1-`%nDZVWZCw8 zdm!NpqB|b?e+L7O!}7^5mria zVynwp9?HyOm47tdkc1w~pA_Dj9Sm+YNoZKQ_h4Zo!?tac2_CEMEZ`}g%E73l`SMGk zNP`xqJ>~U&L{^23n}7DDtiOm6X|w5Ufn)Tn9r?tkiI~^v=e7ZSWTwJjdOQyA z1#1180Eh=h5Z2XV__iNqLuN^ERHmJa*s{j$$)B3(glzMZlw{&HIqk7UysxNQ>6o0f z-=oTl%j0m9s~Sub{*3iANzo)4Rt_dsi34;W#rBOEuI|@re8@1LfNJ(&QK#Q_`Mvyn zOn!;?|JGRzeFq6~8S&fFVG$pzEH+bm&S_fnc7G>1D;T=icIOf!Urfqm)Zb5czR0RS z-3qVG=O>W)qu`Wxsc?7sOU63IOL=zdmA@)IPevm;z&XuHK zS^6_~7d}TVPExt4b6xZ{$BDZBXu6X^tNebx%~DWr;Pnwh$2OXYjPS5Mxk-jBfzdLK z?xF-A%F5~v=A7R$CD7y7_-0kOnd-+=`1Iv+1zn$A$}O}<_EcBOTVs453E!x!k#)kD3V&^d`LGuZW`5s0iH!U&k&ZSYV)1g zV;X?wcJU&xmf9TN0gz2-%IzlKR^D_``Q}O->91VSCj(g>TvJdii5bar|O(XOv0GKEK^_+}CuOn`tsDq2@_! zgd=*h-c;5svqv;4ZZ);b+Gb8NSwRp(3I<$W` zbl9LB-nIm_EDOH8l(}i6@uyWh*G|YlE_f@?mpV?bg-xCumHp`HY3P^gbw**APdU)) zm9<-Jyp740$5Ig!`UDZ+KGk+h+L(`%^60L$+1{R=Tk2JJp3aAJX7KSK05% zPR2HFLAQL}VB4E|_P4WP5v0x^RJ_}LjBisNbnw}lI99^9`?$2ro;p3bC;V;?qw}{G z8_yl3Hbgh6m++s880H0A_lvCRb}zm{3b$XJyC$YzXEl(2R&K43Kv640;>mTNB;n3WaLy+3Ckg24KIQ~XLeKjh zpG2GY_qaw{od)8g+gQ|uhXxb41UE}O08y= zo;3~k$~Q#Mr~m%`_PV^TW=J>M?Phvnr#K?!*lEM7mn^v;$=p;-u{*;lbU3Kkrwy%E zZjB3)2C!rZd%vk#jqHf|!YPfeVUvwU&+KM8KmUYS`lVl(jigzV&7b)O}xBl>LC24HrV)U+BK#*!H${j60UzgW~XuD5`Cm9mZeO@VoZhbKA% zOzX>MQav-O^X}+cp-SsJo_U+&tfsPNZrBcnw;x?_7}2z(q3+ zeh3F{@F$n3yB1Eu6j@Rzv1rEB9`xt9P^VL^Z@kVG9;*k1Aen#al+TeNV*8da^DO}y zyCzR_sHt`u$SwGiY};f@Y3uYTkFOJNOonb!vB;=86qr?b6sYkd#`A~LXZQu-dQv$* zsdi!jb#sQZX>_b`1u@Ven!N_Pc#HI+8C`t*;Sobvk73Pj5z9w60DwO=V*HgBhrhZ- zA%H3UYjh|q5eF)pNb?OrhSfKYo|Nv`g?3!CX6FmV0!QuV5B@z^p#hd~AuziQ8g)G2 z(K6_MbP2;BBrrY=DG_dYMtfB}={rM)`W#qAW|eZKtSh7+?!I*B3T*xU=BN$mWQyTa z9n6j3i5S}JwkZ_)vTeTvJBhu^V(O?okj@l~{%Z%C!<1@v+;wapHjX|{(o=ZAQaNMX zG;17VeDiszR|-y4j>KQo#E}QeN4IJh;>B_Lr%y!u1)8Z<#=?`)NxwNjq?nB-DhUqIFgPJAE*1Vaot4r3y(}A7 zjZXphUa2J*8&ypsyS)aZ0}Jf5#iRh~Lov@1YFwxQl3-VTJ3Y7bKHNVd9#oMtbpt^5 z!<+g2gHMqdF-u0)R@#b}OD2sxg`#*^C!Ipv2IGU=!+B{fKYcf0;Yaw5#{%@69s;&J zsx`Y!#w2=;rb=(3Qe2GZD=36%5^a{GFnegCda~!#O*q}a0adyK?R1a}U-Dgo6@%1c zJR)C3Dt&!CKvTI}0kFUOM!z_Epc|@YjpVU>QnoCvMDCWYrBJF`_y2#077C9O<_->{tz%|FqQtNs~+dh9ZjqcH_c(~DGw{_&m*t~yRxWjPX_xtl+-j!Z+BOp2V!Ie zPVv0e;D?!A)o6clVl%c}uIQ+sj%A4+({`bTzm01=r)MMy@G8|$QmOnak3t7be+0z0 zI_sJm0V#?^FT>%%gK>J1TRN}cj>!pk{Ym|XaNtfg`UG2r(JRRzEGBgCt8kyu^e9{(!^V-<~zGUbxWJsK@K6*e`* z{XfCjASXi3jG6lK^61Nhp9^F#8EEWH-nasqWN-e5^7QW$Ey%vJTu%uQLi*9eS59%m zU=#9RPuxEr@5mD46A-`w*iM_Aa}IaYa-sg;x6ol9OLQfZ7(Ayr*ou+=|Mz7v+wBg2 z*`UoUX)L$Ldza?@-)kO&K4W2GdRE3KHz55F5^e+U@5q75pU?Ps(yk!wr{iB3m{ zQ7ghQ09^`+>AL;C!l*4+30>`|q}+~GJ?8Mw;^B90ZL^BXAnkJ`ZRNDj5=5p^`^UT= z21k&3da&eetTwWjUnrvjuqb>%iVL4GFw+{c5Ap1yE4T&}#WYI746r+oGx6TdC7-qd=3V$AOPVF@8fG zzZ+II9k@xAv{mK5yHu=BWa%mM(o~-FYsP;@(fQ(9x3EK+#L+^88j4F9A(d92Fpx)Y zzA*Be{0mn%z4hDq?)SvIaps9yL5Tj&iHr5yQFP%E2Xznz@>}EE)*BUASo(DtH~FWy z@!>{$?HtP@dv2p=3Yf_V!`kDVF&9zfK030$U;`5D{mUSN?WROWQNVK^^a!^81jql^ z+%flqVkYTO5+#G$&t!I-1tiqjHv}6|)#21v_fWoNNM;PaMFr+)=U~7MWk^m=7g2Ws zyDF{?ozvM}<2pllnfKzMgW%g3T+h$%%(ik6j*L5z1lsZKLfk}4x?y${=WxOd#=Y!+ z>%AVV(Rz9q?J6>9+Ij5!wO&6yx_+(fdwPx|NeeCnAS_qPOeyA2FP1e$O#O&j)4u@t zR`*F+y#2iG`d)_= z{O8u!cf|#)WlTWT-xCJv51USCc(-niOz#J0RZIN(mLgPxvn!evI!57BCA`>JqMc@k z_8y31f%tnvNk8JUH7EWXwqI8C;thJmp_60>;il~8)(!Et!BJ3aV$xfSu-RkWxg-Os zdYz-a_QI`!$}t=XXk>G*a;brZw%d%|9S<6+^k97nrcr%>Pv?*r)`Vi;ng(Iob9u$c z_4`C9P0{W8h?SmWd*V`@!#^(A-r01_C9cDU$nWa1vk>mzOs!QP@aTG zA>^jYI?*nV0Xh4xz*lOShrv5X?yvU@N50=haYTy};Y29Iof~8XD+*`l{FQcP&CB)S z7`MzU62ezEv+?E?g${^8%Yts7075lRmmOzj>uXaKcA z1lLb{^&($`8Rl9+6YKwi8PQ<@gB{PU9qJE7A8dWA&Dwj^p#Dz_u(~dc;y>o}5#Zxg zQXW;z)69QF;@?A$`(STl!;n8b5uOBBwOStWtwM+(acjU+x8Aewm9Ed0+o-QJHt$6Z z&xkWzN6`HRIP#Zqth0a@Quy<3s_542I7~hl+NP);(!azAoP8$XP1)W|u=rIoy}e5m zv|vPJ*?v1U#cTi3my{ss6Mb>J!?M5{b@(R59*&i2CJy@Ne%n2Hf93ZQed ze+L_=R?GK$u-~+(rtcWUuAihbA-=?}KZQ;2*%NaUUWr6@ zk(&^_cb1`#IeXb|HnPL;03Z$b5EjF_+#xKL4Mh=6y78}8w6|)wvZSb&Y;JHV&f86k|f3lx; zOzH&(ZC-~zEE?alMV-ToH|4QH;8X2^nwQnjWCPj6Z5}rl{$BLbS0A0*{t^4Q57)eU zzm7No097=tXdVyGP_L`g$&%`5-S+A6RU{Mjo7BMzhyBtz=&ox$O?e~U5&Wf=pw74yjeH&+R0a6m2BF;u1UHH&9 z4V5Me9-lxt)V!;wX0UUbs4?UledxSoeOQNt>L-nt5jv_a*D+J-OQ81@ zK74cMXBKX-q(`i-_kMu{yK(xHMx#$)V>0m&8|b$EJ>_*hy><3-%%^sm+uMF|X zAZLiB-MATsC>DdRR;!=d_58ldipR&W@tgcn*Ps8`ZlB#OefwA3wlH9~2(oOSDGifVBhV3YmBwYJH4i!`MMXB4vctc48}K!v2GA$dmA@#tqO znO9#>O@zj*0V!uBfpH;?In3lHmIayut0O=h>}i>)VS>NqUiq~ZP)KrQr-@UG!; zEn@Sj`jY-xU%fp$De(`2ZULOKWu-N&HxCmB1;(=CHVCsH#b! z`|c^6j#29YZeR~1JlB4x^NOaFq+6-mt5@L`e7(g0bTYm9{djjBilqCt)apvErs2Gt zUgKyhue#d8ETd=m+vf1F^T(p^DI>5{3|qnZgIXm%|N`bdV?gh z>f`mi)oPnj>3c?rG*TMQbo=1OW9s4*?2T84*l@C1?R9#Uh{nLhfA@@w+Mr1uC?RqV zlxViwyhi~$0kYeGwTEhf{uuot-Tv0D?>C4~5re9q(x?^2MB(uq9acr;?BfRgGAzDZ5*6)Uso; zcmoAl>`b#fvDK#CMqH}@fR-r38v!( ze@J%^=s_--%k8=oJ`4rew3UGfsX~3VK2Zg~qiA|Ac{pj!t<)~pGcH!pCQOM)bm6Sm zAUm&74nVjCL4gqRFS>?zTGRZR8`B`4J5kUPJ!=|55eM z;c@L;_~T9mnk8Ruge=}Jw?)Eu(^$O@bi7K!?eV4UKgEAp~c9up|Ysu)hW7LE>O+;9{l2ELpvFtzGIFj zlNKRa+;+K*8XU^s^SMS^aM`H`79oN4Z>uf7bbVx=1!$+{S%c0~MbE3eA^&zI2os!%xdUv@{kdDZKjJQ(jtlqcb=PRbx*9?UY_#N?U9BZgHDT@BFWy4ObL z;V-@tH?m+DiB3`VJK~1(*bA_!W^8^=D<7p$u8>f}F!mfjsbEo0FuI45+<_eiMC(00AN<9+V*s2rpTu?gdC$lF z9{uWT_FGZ}(ne0?qHB&`=Bi1y`7}Z?k(Y@jLVfwev`Fc{LyGBvHgN%|R+^3N0S)-8X+iOBv{yf2kw~dL0dQPC;Kb3_6cCD5U1}sJew$h0qC^C?&4~ZcZWKcI&@^h>F&Yc}z zO{)fO-~bPN^luQ98IvZ=T~WV6pt;2D?&ajHwyLQ@=g$ka3}r1~5RtnEynUvL03Nob z#0Bi+ED6!ZNyEwmQTl30DZBcfyYZ{zwZ{eM$Yr>!JDmOp7sj|34+uc_Izcv`eUtF7 z*_os&jSFKZUd1@))9F5%uBG)}YEfbRM&O%}l&Qqr-`0`}znMc&mUdHf;Dar8I3-bVgdX zZLo7KEU%mWWh|EKpA?ks$vtnZTPA`*3+_msN#hZR77wdqap2;Ihlm-$WJ-e8){EZ$xmk!qnAuXc}&WOw>i%}K~ zfPZ`c5Uo#)AqF9T$&3fM9X>J&nlGZKje!Pia&iBP=V`|@;3Gn48S5Rm8mmN&fQs8? z+(+RP;`*WQYkf4^+WApbwcfnSw6w9xZU7gP%|pjSq4+(tYW*Z?tiH7KW#TL=?{4yy zE4QSjesT`9Zj>$C(&L!Pz9=*EAo$Rmy|AE$h=}O!@<7ky93fuO6Ev5x3Yn$Rc(#lm zBK?qxyxw7cdrA+qz*4uEGWtL zyiv=rv>OKBFLlLCw^Rc+ie>=-Wc`o}{DGAps>i6&QUyBMXg@w8w46P6MM89Gyw~2h z7&p^gAcPaY@#x#W2me=@Gij?$nmj;{DDVk@7BFJ|&IwTh9*z=pv#aA!AH$a6TJ|Db zmK8;N8F%? zODWSH_98(xcdT-1T6)cNeZ}hc^ZI!3T~0^9HOeQ7x{O)>2z z^lRP5uSY56=a6|QI=htnG0g`!Hu$%Z1&G$Oi)nz)c-*a}7~@7{F_VtiW3m(7VEs%& zzsbOu?qMbza}6W`Xn0t%FJ?>DJXiNsFQW^L<1|YNtzMwCxH3wGx%*{9W(^L>apo-m z@W!0XaEmL#Fp!LZ=NAkR9TJEN2`d!Gx@bm~1{OD|PbEkjBZ0g;7k8w?~Hyco$nS6glA*$!G0H{OV|@wMNfclOxY z{5r@KM+C_tC+|0H;wu3SEitHfDAaU*N||)tcCAXQo^Vi6wlw8%b{JAxxp|vS2i!UA zk1qSyUx&mIF~WulW@6;+HSB1Zf`rW|+ZZelTR4C_L%cEH+R+%~uPxEZuA`85oZUiV zz$ldxb;LpY4KL%b!Bl`EpG{i5_KHUNJ4d8ry|8q>kVnRwr5gh3ZB9MnK*T9q<27{&7t zO+MS}X7Tth!=SL$oyegCD=-A0Z4jBO6F2th{jgAAZrdVI_jku_JLu(sd*ii>%`=pn zT?Z$B(6C*WEW^_Lf0_51lu{W8>&4&(G{ig;$>4+-qWe;jf2$`u zt?^3v@@*QQ!+VPG`84z6P*3IKmGK;pL zwiX+y+2J%|%qEzx1~7gJ8gNYJo8uuq6RnF1>}x3f6#ExmRu6^rW#@JHNWeQTQ_CXL z!{hJ=dzd^YIJMLDPD@*c9N}ibuiM-p<#J z&Zmt6>E42s+%JS$IuEj;U^K4kZcc%a2Vek-De1iJFRTac`6T?wQHIrYo+UQjp{SY} zI$y;aI%ger>(hVfw|YL-r%Qa48d^~0jmDtCbe0d3dBFL4NoU9k0e;vmhJkn&o~*j} zzZce)42zK2ELT$yOM?SGi%1I6Z5uA)($X|)XzlK}wyfEM!B){Q2W#^1y@7Nzxp_v> z(tH(rkwlPApL(aFD}8so3)l1yrKW&#jD8qn&s<|qEpZvaQ-)ANHs*?PiJ* z`|`6aXGzqsU?*ZJaB5jvs!znnuB5EaTLW-tReHcC)1ZbC2KzZ-`z4*zEaE4p9S4|@ zzH__8?|SDGmM__mo90#8jiQWAzGc9y8O&~$Eo}+Ga-2L)!3Q5r;W?8JHdP%jrHnM> zt{K1DSrj-hS;Vg%5%VVz5Eb?K=iJ|9gV9yxhIN&+ey=F%TRPSPra&qR)HjXx8YJWn zQ7C)%YrjeJ?bd7{1O5(9&w#R`t5}F_U$V}uIc&UbbO+`p=|cs2sZ_P9nJG0# zNdW;x3xj23Bmfw$G25R>K{be9sHe#SB)_(rSvU8rdbRoim;5*c6lk_?zz)O;_EgI! z8XGoFnP&k^b6WPj%I-Fd(=eWZwz-*_I1D*o+q0k&55!D4JwB_Qq-dI07=Q<#o{n^c z8nK?NDIlOB1uu$>oKdbXJ0IFe*6(V;_GHm+xxIwT>slmgm$J~*5u68+$Oc9O);ckODWUhO8A(Kw27n z%5X8vnye+c-)sS1zut>@FKwX?3Qb^lY>=crN2e!eQ5z^pus>x~-ceefO@= zJx&O!Cm$8%BLKjNZO@gf3@?dMEEW{?4MUOv&KzTw_&T`#tAdZ)>NM<%i!O+fK5aZd zyFwdwyZ&#BjND0XEA)Yy5P4?#{N4KsFTn~F2mGmtTgIADOc~B|h}==E>7#A!NV5hm zJ<`4#?E)7brHVSOG@i!iq6hU3#dkllm+=%$tRZctR`8oPUUy-mZy(X5ze;~WMWDYN zk_i(X)uYZ!xtf|@wX}M)*Yh4JJ1nzutaU>+xjD*Y#c|{saE*F>7Z};`& zlbtG?@H1WDxaa;SjXzNlAONWXq@3a&FE*blqhkyASOy?qrV8p5PyS#(3G8%?9u@04@MZO)`LN>p*PZ#%l*f4q-JbcY_ z8WJL}nOfG4Me=H9yUi$V>KD>qP zh=)yTJFk90W}{Jm@hb$Enn)DQ@FX*`(fd>FSoZH$&rwwHh3)!_kLDDz4{8j2CXeR? zMylts2Oa${V2Pf$*=W{aJ0W4Gz_+}-xMYD2p4fbBB&JPxvaNL)_2WVUQ64-vNRo1t zo99A8?awLd@c1BK-VWzWu}(o*R_pC#RTyj^+=2KzPyQlH0w~cx9rtzO+7$kr2_>n0qzdCf>gW zJ1O2xM>?i6=ksO$zv~k6EI(2G0sp&4$8>K+L`g6S1y|#XmH8LF;nguF8wZ!e-SGUv zaHOJGAtF38jg0%}3;kg(>M@4pI6{dUHfR7}HP@1NS?MsFpP)yyxqOD#=~ab7=Vja^ zp&2%UvF(At+t^nahyW4}`^m!cE7qPJ8I6;~*~YS>H;<6cF3GjpkvnOUbCs#(}eP2Sc|w}~iG;Fvd>dk>=5zfcmJKnS>tras*w z>j8hTQDX!aeGCnsbW<}9@GYD-_-!1sjrY3?rn{Q6=-S@xleco7e!O4HfdT&3>pgE8 z!2?)lT=tB-gpXD-sYhwCllqyEkkbX(5MHQ5DPur?o!f&a9q9n_lA^D?>OgEWHb}I% zoj99mD1z z-7FI+(oNUW4hDscve+PMQj4N}z?WE}Tp?-{dFtpw`f;SHpfqa!x;SW@EgR-fxOktelmYzMWu13|6;jcYMwYS=2Xz zO)Mun9yJ>Q&?s~K>u(X9YV*50*pZq$eA);Px^;PKQBYP653b~M)>VvkYTfQ05=;m! zQ!SzLVHsMBH<}GF5#L`xF(69q*`<_FRaLtxfMbT9SO20x8D@&jJtvqwe2XoUYNovf zR~Hd+hy1kL;db}T$iO|e;*5HBP{K@3%ULXa>{3i{&nX)`PIFv&yei>#q^Znr2H~eZ z#RW2|nwl34LxSf}rPsGEZf0N?hhFtPuZ@wF1m_(6@HcOq-va}5NG8^jEv_rFqiq)K zVW3V_BE>T@*9v`)uDgq3A_6_E#J~@4!Pn~oZ2CA?rl;BYnYK>QYn8W6xRB&qOB&6o z_&WGy2{JRjGG3fnxIS6}P%O}r%}<`wwdB@`008-7Bc<86I&g&i;v8FxE(3zr5*S-) zwbBebs}ooyIzTbHvlCh{y=wG%$wla6+-VzKfrcpH2bj8qcG-bng(yz5Cyn3cdV2$P za|Tm~N_tXa4hkG>PCJ9P!sHJkK6(fAAvSJqOEdyxsu823Q$n|xGq})5W2JZ_R~j%V zwlmh-`_$71MpvajQp1uzM#;#Sz&i6A%Qk8c%UOh^8wq_pP3!j5Kdu8!pGUt1F@8FG z#i$Nzj+h@`;M6@G&>GX|kjYC*M=Fg5V~hXFc+&-`T||w*$Pn;0v9sUqul|a1Ms&fj zHez9k`vVCE@UvDheh}@nR>Drt$U>-BVXdS)aJ;=e&$7;wOn|LeW3WuHfpuR%`5FgL&0!KdmV3ndWi zX5_(6{vEy~N!?T=(9%YA)*p%q=5Co9~%6LPT^ zn)ZIPL%SvT3@zlSvX1Qk>M{!b;n^`>bJ^JG`sYRO#WCq+K(NjG3|Tkco+6y*V3|;W z9H-^(eyeO^Gnspk8h{cM6~z9MUEK6AY(L39Zm0F3bcyl&ld-+jL9O#<-|~R)B?jz2 zLBc$rG2H)H03v_Up-)MF^MV4nI!#>Z66Hi&c()|s{h!t6vlp-H{6_D`9K&CZC-Ez9 zcuD+kKZ|U^zP%FbkD0CxiV$@uyVKXatw{JCkK5=cG!f81kj^PyD6$-te&gNMD`cW9 z1mOl+Zq3(jCLqb&HnxEGgizns4gd0~dFXBKl6wgQPvv zhRL%cVJQ87Z+hN zHb0f(e@NK(j_5GcqpOC?wKrkKnD$XDz$y8$W`&y*t`VVzyZ1h zmNax1zxr)9qQfmFk~0-4tiwb>N4#bvo?P#(?<89V7BOtJ5L@vnS}xfUlvY_gLQ{Qe zr7==%B<5oQ>2F%_bnn=G^Ve}=45WSao>ur`7hU$P>KR2L00Bh4Pa~!!Et+3p8+1CS z%^dr8lamhyWOX;$*z~KcV)#xCAJKl39NnAip}G-1U&_v^V`hE5cs%DZJ?MPf-zDrt z^+<3KPF73!8p#f-bXInzOD@`{AD4t125+=V|AnU?(;h>;@|r)M=KnFci1-e@;RXn{ zcuIocO`-&XT(Q<)Pi`t=EP&X7boR?mB}HY0^N$vA8NuRX^O znSPSG&bO*AAAxMfpuKX>SN}JEf4!tX-C#@zGDCVv*@f^gJ_7n0`1-dqlYZ|#6Z1}} z%=MS$?CD7bMF$nS@g^FVlf^!_^3$KG*P`MwRym#sqqF>%$v8rr!m40aHV3VhN@eI!;uKHii{$z&hA%yA2D))c#Z_`OD$I}lpq40Y`aO#_WPi2HyNp#OBPM7v%Xo$ zz~1ZG@WBQ(PPX~y87{wLEtrZ5uEhPn_`PVBp#L)}rnyD4YoQf3lPqZJ=C*dyW~rv- z?M>O3@wz?fJkopu8bJD`CUk~=@_eaf+Kx|+m8pY5u!Bi?Mpc(uv!0fbvtxR00vsR; zm0kv&4hBFQfgFvS!L`?G=RM765evOuZ+2>#y}8uYc2p`{uu4P&hoCvcXV&id%hjBYLG`i!dT(#;`B>u_{**325*J^o4$_+=z%B+G6AKo4z zcf#}7zm=$j8EW)h)N56I_bS)MrcgYpLmRVkrDmIUqRxhWiKdv<@D;tL%2cwzua;zI zhARQ2T>dqr5}jNlGI)K>E6A9g5@2%r5DBVMEJ=ie1@6dlnKY*H=U%mM$|Nvr?G;<5 z6osjc_H$w3FeAPQBLFTTYf_pl8cVX#t?OxUkP^mioSv}0TEHewU(p!lY>+G*A&e3XK<4r`J(AReuylbM-<9TKlIs4G%4rd}OtutgqnyAGc!vfUsbZS=zV zzkDPnf$3mSWBdviV93W&3&L&ECk^^-nO6@73ucob%~PNuoc^0AcMW3yYE&CNorDxz z{HJLp)U>99aOupE3K||)_NZ9{T<)$G7gViSv+5E`1RtoVQjda7;H;8#3BK$Fn7 zibbhM$iE5Zb5`!qn9H?s3H>%JEeum``8CFm??u>IZFM$cmHP|T4@U`S-XnR1Reei{ zBIZbqYz;`iG}Pt{9;dVU6syfF$GcPkn@4b*RkC*6PtVn*dJ+AqcbU-smpWpa3lhmI z*a00Qq#`zC*gylWWhOkov*A6@E3ENMpxFFZK(9kRhhhZ^0G|y3IR@meBv-CC+?XnN z9!^Vm5V>P?moRv2*vHKCr4qP>`pLO4kQ$%fI;n}oc<1HDqKxF_*P{ub!oF0P$uP0h zCj%&yM33@zeeldl{95OaVdY!1p|z_vtmO6EeXXnB^1lz}O$h#b4h|h~DEu77>T^Wu zb*LI{;1;LcydmbhOAXEM%~~i;4~^JMebVen3#_L6ELLf;?UbF{s#_%|o9#<$HJ@f8^`#SuGKTzFZ%i96?yDLK-NcXrgS{Z5aP9C zZUO*g)yu8!HgXCPnDN*$&=Sz+ulIMXfk!{-Rbef0c&Ew`o-{003k94P!prR%HoAqi%GaJ4PZszdFwJ&`wSH`W?0YHz}CsvSzXbw zM2Utdu(H)__jca<{V0FPBd)lI+%lB+LX!{OIEIPObh&VF5mUT`4D!1}Y*<0n{n^80 z3l1iL4K@V2qqef(*lVE1DN{*!TXrxrl2Trsrzb-t{k`uY>$urTMZbxdSy~?L)WCZ_ zRzX2K2wnoBg&bFZo#^edHgHCc+>r*hdpdLeK!Dqmb_fhmC^ZV|w3SiP!2oXQblD#^ zy{*TV2_*G0Emt1so0V;Nz3I>bP)PbieK%&8s@mSVRb!~^E^49gj0C=4JIGc)7>sC; zhn5OHjfaZ^Hpzw+Iv>jsdST;kkw9-3je>06gS5Slc@b}nqPUgF(l^P45|NTKC#O8u z&y@K20-vV4sb zg09phaBg+2i}Ifx*qs{WJ0##fSpk)YEfQRDPRzFra9j5#t|+3g{tn`vfNaecPxJj5 zs)FB}!tM-&{L0ICIozs7@2oG2YcHpnlUCk?_umtnc8|;(8#6u2@EQH=CaS*z}2LRO-{*PzAZu#^39lNY%! zRd=*pV>vmQ!sh$nc71&mvtf5Sy7svHpQPm5#oGDZ4F>F_zz0a9^rJ7m)9#Rv;_>)a z_U#n<;x+LrxcLo;gC1WJsL=_PPU&E-ZF{z z6!Y9M6oC(&wRWYUFlZ1-4+${R-ELvozMcNWbX|%PFMKU;fLnUKXC2ce+H+Wy!)Vxk z${@jd@*ubLiA=lG6IL;j*D=-AEZZ5z zO^tOVoh4fnLPEt-zSmvfbD!=n-j6s%7#JE|MmsXo@0)D0b?p3v0HL0(A8!{QP#)Xk zlWh&c9FP0Bgy}zLJ2&m#{5v1NT$-e3z4|Td@Ds+5G=!Y%Jx+Fhe61LJ+$v*KEgwJU zR+E58t#{iPpxb+~|L|7MmWgkDFZhWY%INdBRevvbnpb0@`W)W)Ay zPi)moQm;FD`bqmGa%l~`uUe*~)!X)O(Y3yx>+;~ysQa1sYdED&r*|u8+q+Av7m@O# zVTEl%anald~a?14_z+#Euu%n5peBDh}Pm|CL=cA>ktUHwDIC>KMQ;6 z%s|&iSC3Q37PvoYvC}^fz2NKgJTQ2e!v8rsHP2!|OHVV#rMfuy7Z0$TkRa15;+_sA zyA{}3!43XQ-ubxY*E=7x-nzi7xb!$txqN@Sk}#F}@LpdyiksbjT>`;NaHA>6Gm8NQ z=rCJtpqEP7%JhFR&8F{Jq&Vo8G{aY$n02h0ZRf6{I`Qd6u_F1GY3|D0?a8uAUT(9@ z)NJSTXlwhtH)op%n{{B5tU-4NX&0q{{YlIeae z;k(l`{$K(yp-Py`XgfSBGv-dv45QSoS*9)6$J{q^a3FkI4r2z~aL&zpQ|mBbDlnLX zdIymSn`fCv#M|UJt!#riXl?mAwqEa@B?Oy6HiabJz>!tb6dGFJl}8dCJlzJek_){Z zNe}5kc_6zByPHc22`V5ApwQ{Ka()>TFKcBs%ENV{K8q*Lb4OrD$P6F=IWt3 z!~qW8x~6iC?5vau0vksK3%|yN{Vtk?&eqZn z`^s^expo$7e0)YvS8x*{RJhLlP`;v@5Mc{EH()22=IwfI_q>I6{s93aU~<{_NjOnE zO)I0a?{Q{3NatmD%lt< z4-hnos83WsDc$gaVaDX=1{lE5QfV{<#!H-t>dpRrx!I>0a8SHzsb_u_QnfuM>|)aIzLxM~dDL1tWRXFA1w0ZlUn6_(c3PoK zyTXNRN=ws}Vovi&3jpYBuC$emQ~OQQ0|?lm#4w|IK3_<|vLe|_ST2Ki10e%V4jC|0{X3fck2i zBr66ofL&N}Lvam0qk*D=m!eYCmL%$2+1TOLl?-#W|kI%`1 z&*wT}+vkJ=peIFxehbHvv-v^j%8X+lquCO&Hl z%RQP*f)n$y9RaKYLc@(WB7fmjek8g*cg+y6v+5XTiiF zBe+j8MEdHB41q=Y>6owCi!!76gBuRib7`q{MkK!+ODcwW>SVSyXJw9$x>(@R#8u1s zXIlmm8p+?~vo5$Oc+-;&5aXtYQm|P0F**IdaDqxI1?L>8ZtwYO8Rh$-H9C|LGAR@S zfi(CS1BK=22_Dah#k;0vu6JXkS6O)g)Xa=6$+wZvMugAet7Z@%ho-TfM^_XB00OMH z_k;<^QQ*4J!9Nb8S5=px-2@(dTt0qRmtDDuBs24=qc<;J3_5I&dK&-wx8s~PG=zp^ zCWaI?Q&)N9(CP;au(vTYux;Ve^0+n!ggKLpHIu%??CcLmx@$$xwN)LFS2Ndy6^))l z0Q|aZKI=%N(zJ9k1^|FCn4z?v-svYQ7ott3L9w)~aq|gh6%W)B-mbUT*O-_(&BU3@ zEV^yH-|n!wcJ#}>i_OM9#ULw`YIe{yRvj7d+}fZBtBwR-@F!DWHM$~8U?-V!r+i== zV`p>P*WzRgvIdecHrjkKth7JPzV8B}#@TN8y4tqn6y*=1=LLFiQUnfC9`J^eWplnY zyPVP~yk={g6vi%Z^z1)h(h9FaM^%!%RVMrU1WXozpYM;{6qR{*Sd`qHO(Zv`<2fLp z7m~ym^{wjY+T!5(Zc4+$uRIGp&I=Y|RZx!&QR&ncwHb|9H?EiCYmC8T(Fi-nO}2u@ z61B6|sx9lDURR4s!Ijf?%JJtr&x;9O1R0dhJhvpuoxAv_;V#(R=D&dfN-x+1pH>vq zDjDrhxJ-P7^mm)DJo!=(O!ynN7W9;_uCGfcoR^!q7dpJ#F(0-^3`xFwZ4(&Uie!@N zrBiaLF&W#n+$%uP_ml6Hgb#anyu@F3q+j@ZIQ4N#WEKCa;QxQqJ0?uGA8%$7h8<)A z6dewGrO1Ll$%O}gae1T|lxoF~OdMEv1M#K1L5k^#rpwh~xt;GbMXJ5dmEMG*GRjG2 zWjQzUwYUL4j%(5L!Rd6{@@!74aY&y~h|4$_w_4tl2p7)K29y3IT@&pyv?+b9v+Ri57fBt@UyJx-0^7+g z2?h|CG|WI^V~_MV3d~7W5?{;OCPEgcq~ z=$P?f=oM|mMUYu*b+JF6+cEM0)P*05mB9i497t#=DEalKlt8#C#*SPVM%Wa$+!StD z$J=?2bD-fDhVAy%r5ZbbKXGXz@rcT^+Sb`TjwI7&?v+b$%-YBS31};z&RJR&oMFt{ zeZfvWxM%kWy*J110flNz-Gs&DZvPRxp-hbLIrx8zJp@eBcLHk4vwU z4*Oa1SbdeN8rc24-12oMx}I6`b0EPny7%SCNd=9L`_1@tD(jbu(C>h$ZbQd?M7Rt$3W>%tP09-?^+^|2rTT?xmYfXXs-W(iOy_NLM zuucG?$F$QRzG;)6#QM!friOp>s|Q(G-Jz&4Za!&FE(8ZTpL3wCb>g0vR%37e^H*F&91dv z;b9?}BQrY~i_N;e>H0zfRuZ9R^d2y3!jfiN%UVcvJ4{{{IpYLJD;e+ivU;@L)3F|C=xQXdX2wUUV&~(d?^xrtQd*hA*Fhvjy(?q9 zaN%ti?&pXlIO^hB_ctzuUc0eWlmvhhF8V|paThT>%y$)BFbeOie3P6=H=M#wHg3x4 zRs8r`P)#!(MLzt+G?iKl3@|#C@SAer?+>ECO?Ej^hEqecWP|*>7{13*GY1_v*v7@a zCzoOme6ty0qNRJd1m4@Jwi^1XrnQ~}+@z2zuW@o;!h<@z$0z!AE6IrQTATZ(Ems?p zclPg}D~J0k%j@&|A=B!$8wXj=++PYi>7BHq1vsj6B&#sw->{t@79KpE)$M7=rMsCB z1|4;co@avks@?7XsMNYF*I0z0Km&nO!72f)E=(+}Bl`(B+>U(?8$=^iKmWCslB0dB z)Q2gtP7b`L1)#n4-=-BXS{pAuH2Z4<3GhbP(M8Yq(VmfwzlpWMon;{CLODs9r{C~OzP(hb#h`b^~*or_1|VqM9r)OK3*QG z=(rYOdqbYe+)sIOFi{~#L;2lqN_q#QB8LL78yY&^76y46tNichv*WQRLSGBJOF7fD z29m7MoNHZQM@Z{Y&Gu1oEL+tQzbW58DyR!g`~dS7@$b}6<++0orr0V`_j@KAtgiDn z$=S$kartY-H2V!$8cwrw zN2!DFbYLfgcLZ#cS5&*%OI_+RQ()8UQL;MWCKtmt%R?rgUui#=Bk^Y6wJ#$*sMkrz zn+`&KvQ2%qb*V1;26pL1@a=Kw+!j~wsox3#I(u$X7biXAK2f(W@?TvqP&xvzOP?Rr2XO&Jj(Z*I4+-D^c@(a`kKHOb z?tmNnx3febwBDE7p?0^En&`c%w?8RRoA8iq_@|boJg)mSnz2;h=el%o2<{ag;ckXFCn6#)Yup8Zf(fmGTSwAVQFT7f%Q#yCS;D2}E zFXIFN6!|?w;`$;0B-u)M2{uaO!eI?aQ9G-jPLIlLBTs)WuR4GX6*kKf?Tz6J&pGnw4M$Vet39BK?1NTb{o>I1%30c^*%^Shdnb% zNmVBHvHWkbfwi(-0&7p}yp(cTFN)Zh%&Ka4f~~|Q`;V{}QK&5mcQgIC3THY`f__*2 zFi2cL{`-^8a-1Fj$s(|AaHGR{r(1BjcaR&1=wWl0tN{EFH~1q^c3S=R(oY79x91+S zpwHvgX#SiK9&GS*%o6Tx;piRsF9^L3G5ENCF3NWYs_@)SCSP9EufVHU`96R+sUpAw z{saHizQo0T%hY4|w7h_PV@L-{vEl(X|NI~%l;MtQSgx&uCvwp<6!rdV!z!cMTcz|)-+*G za|nffrKy)58FUPfke3GlP*|iyzpDWAee84$Soke1)( zk_h=!JznKilWH@$pv5&B@BDb%;x>=p4^OD(VGne68M1W>&8trfm_5D?0UOFdR1nZE zo#8C7iMfMJY^_f(8ZyiO`CnME=gXmJ!`vp43+0a#eow?|I zy`4&YIDzs3L`_-}x;~kUH94bGxj267sJ8dW0)_;ultd~;IN$|=RgLpVD`thfCUKUM$ZnJ*$h|`I6!Ftgg@o% zax!|=KJBMNOYXwa#_TzkHC?aWvw4f%T=819L?FcDOkDJi8rYxcv)i3d)fW4{ic{s^ zN;9X(?W6E(qAF!447JFrxl7_?5cx;%FZgI@nJ+I~pXj#P1=MlUQ?3xX!I)^AN`T$;#!3!qVvo4=XP z{qlUy_|Kii=20VT?PK>S*)zEzQNDq#=0Q9tejwQ7t{zXJtFQ@9)%bSiTH|!#yER}b=0Kc)wp}icauJ*%K%r9TiL2z<`uIH^eJiJBzI_ZG@CAOa@N)MIi)+# zIZ!&V@4`6Cg+PPI1Q%^6v@%$Q!iv-L#R zQ_OzYr~RO*4o9SQr7bIQwx`8JQ$j(I-Rx!?C#(WNyX6CBZo!t0DQyJQzsC3z+;2Va z)#?~?HyLSc4oE5u1 z&8@WM?~L+CGJkQHOqd|lk?qVmMoS#@(E67oCP=bk=NHKCL;W#n7gg~%{toW@&qc@zZ(<7wCjr0>Y&ezz81Zr0(&4PLXKwrZ!VFZ zs_UaVXKQ;*Y0v+yNj3y5ATXe_`AJV%*_aB$>$33)tyvm_&u`ZXKq_`TCTC4JIXue! zdPE6I+EiCsZDxw~R*!l1o=fU}mr(f>>H|%*kM7v(wpt>KU8`5FzRiK1Ry>qFOJM1+ zQWT|J;5Dr&jiXB>R?>dhwOy-sa+@H|0J`GI5-PQ8X#^)O5X$DQm?n0;#Oo)R+m+;fr9Pteih@OUX}~^c0anOpa`IX}$l9|W6o^?bi( z)T7c*RG-&x-b|x6U$;wr>?9_7tu5KLf~-m!6PI%6fWqjWIjRHlY}+W}%Lf z8D`R{f2pRMc}3m{6A?l%fweVc-~TpIv3d>`B&lSOpw?fHIu z?fSx*V5Gt%87Nz-adGT%05Yb~hXg41@7b*@C1fS0qvS_Vr6}RolYPG)uEw=Xg8&GZ zYqma=s8TC+GKQhf+?C1LWpQgQbJQ4o`J)&v6XE39^nf z?B?kd#4bv`Ie9H;%>t?Azs zYBguadmTf;GC4P@Vf2{rxGHx4>C2Dvn){EdCDcNekQD?!z~6qV^$Aw&upk+lFG20l zV)5m220DmmU}rpfXzk_IS}S7KWB>4@gy=h$HwKQm!P?Z@&TXk4l+@Nr>7t6mNNp1! zlgU&SkXo`C6FvQdLKPsilIsvo(l<79+%uLLds8r+5x-#7*kWg#&3oyW)v@Rg1qiz$ z7H^=u&dlUxjL9;j>syC%x4Gq!?(JRvSnD41S?HB6WkP5-8NZG*4ev+T({1EU%)Vi7 zCZpb!nt`5o+_0!v6IhA_qr$b@c-M!eRlSb;Ml|IBz$HmL2wd-@!}Mr9cW}YW8uWb6 zKOc?a>)$qkSXzoOgOI`Y;yS3o_t#KaD-K}LDQg1Oh#Db}1j;2irDPW9kZwNQp$GV? zCl`HIS7VZ{as6r5^eOH;V%qNUak)TvQxaUI3A6(Vl8;-*9^8a+sau)5tx-CKJ{Rd3 zo9a!S8KQ{XbUAa)SA(`6h@C)|e903$yP{CF=+~3a>Tx}bLF4%?k`xBp)7@j#l%wd3 zAx~=lnEWe4S{li;;jqojFB7?GJ~_%%$=Pc!5yj5NiMEMM9YV0Sf?B7M0mGS`oc|(% zA#A!HAk!UR(^U)rC+fmQDfFm58HOUv!???3l}L}P_>Mi4s^wRcG>_9MhCV|XstoQt^f~E`wUPn5eG+beT8FM zTj-&-3D(a0zy1PvKR{)?8BCjDb0q)7r!j*rEEDBRKCgzJ`jY8C0_oWjOq%`RPGnya zzGi~9zxU7z8@QpHKU9z9FSR2;R4KtF`4%INVA(3wxaLcj5v-QRJ{wwdk$P_STLaqV zVeLsvn{-N?YcsKKb-v+9yzp27guZDTbhq}#al+eDe55AMJoSXxmKu|=KJ_^Ziaxa; zP;{fAKZgB$8sb>6sV=V7J`#o&9a6@hqU>iINh$RxBA$oNRuOra`p9FP3ybvtvg8?5 zW3q#)TmBsc9?)|--HeCqI=(Z5rhV6q8l=(jDZ&Y}tGv0r%hgN?>lqyS97lg!cD+wh z{7fC4mQQ09X`wJgeURXy{FA`yX(=9mJoiGnwb<^<9>rMBhyK_3nu*YBt|RKSU1d zY*#U@@O9_L)@xEW%bxdGrCN#(S7HZ4%BhXfl!hT+C5a<#VX*bN!kOU+*c>I^I>*;o z$;V7Ex#%{WC@onz@ThZk-cRtN&)w~uwnW`;0jIhZFRR#|9e}Nn?cdMOS-O2)=~Pp$ zTx=AKir&)ska@wD)-vyWT{TYM$FO*}y0A6GUflX84CXZCo}7-!ps6~_3H)MJh|U!q za;OreSa!Or07sm7h2={uwguaS1Mwwz>rwC`Di>g9*oh_<=@6M)EL}&j z(BYAVxX~X{T}Yq#^ak{yu$_=~AbjES09PhGIUAW7yivf8HYzJC!!`sZ908bfB?Zdn z5(N-ZQovoCB!7ycO0!K4>(dy}^!ufxB3%;AbQ|0%MvT$2RCS`v z*@NpW&q(Y&$wENg6kdoj{t-aT!AhWi1Dxilx*i+xBY&+Bf3{Iq|HnpM{IiYv|0lwq hF`>>s(@u%2A_?=}i>ijb8o_{g*&-c|mcxA${{knm;EMnN From e08e951acf259275a6f1805afad982ce836d3b3c Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Mon, 6 Jul 2020 16:18:01 +0300 Subject: [PATCH 27/58] Update AngularEnvironmentFilePortChangeForSeparatedIdentityServersStep.cs --- ...ironmentFilePortChangeForSeparatedIdentityServersStep.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AngularEnvironmentFilePortChangeForSeparatedIdentityServersStep.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AngularEnvironmentFilePortChangeForSeparatedIdentityServersStep.cs index b69ce479ac..9a76f9ee21 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AngularEnvironmentFilePortChangeForSeparatedIdentityServersStep.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AngularEnvironmentFilePortChangeForSeparatedIdentityServersStep.cs @@ -10,9 +10,9 @@ namespace Volo.Abp.Cli.ProjectBuilding.Templates.App { var fileEntries = context.Files.Where(x => !x.IsDirectory && - (x.Name.EndsWith("angular/projects/dev-app/src/environments/environment.ts", StringComparison.InvariantCultureIgnoreCase) || - x.Name.EndsWith("angular/projects/dev-app/src/environments/environment.hmr.ts", StringComparison.InvariantCultureIgnoreCase) || - x.Name.EndsWith("angular/projects/dev-app/src/environments/environment.prod.ts", StringComparison.InvariantCultureIgnoreCase)) + (x.Name.EndsWith("angular/src/environments/environment.ts", StringComparison.InvariantCultureIgnoreCase) || + x.Name.EndsWith("angular/src/environments/environment.hmr.ts", StringComparison.InvariantCultureIgnoreCase) || + x.Name.EndsWith("angular/src/environments/environment.prod.ts", StringComparison.InvariantCultureIgnoreCase)) ) .ToList(); From f7cba9a9a029d2efc22a0205226bebb916cb844d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Mon, 6 Jul 2020 16:42:46 +0300 Subject: [PATCH 28/58] Completed the 2nd part of the tutorial for angular UI --- docs/en/Tutorials/Part-2.md | 60 +++++++++++------- .../Tutorials/images/bookstore-book-list.png | Bin 56461 -> 36056 bytes .../Tutorials/images/generated-proxies-2.png | Bin 0 -> 33917 bytes 3 files changed, 37 insertions(+), 23 deletions(-) create mode 100644 docs/en/Tutorials/images/generated-proxies-2.png diff --git a/docs/en/Tutorials/Part-2.md b/docs/en/Tutorials/Part-2.md index 43541847e7..b88a194852 100644 --- a/docs/en/Tutorials/Part-2.md +++ b/docs/en/Tutorials/Part-2.md @@ -369,6 +369,30 @@ UPDATE src/app/app-routing.module.ts (1289 bytes) Done in 3.88s. ```` +### BookModule + +Open the `/src/app/book/book.module.ts` and replace the content as shown below: + +````js +import { NgModule } from '@angular/core'; +import { SharedModule } from '../shared/shared.module'; +import { BookRoutingModule } from './book-routing.module'; +import { BookComponent } from './book.component'; + +@NgModule({ + declarations: [BookComponent], + imports: [ + BookRoutingModule, + SharedModule + ] +}) +export class BookModule { } + +```` + +* Added the `SharedModule`. `SharedModule` exports some common modules needed to create user interfaces. +* `SharedModule` already exports the `CommonModule`, so we've removed the `CommonModule`. + ### Routing Generated code places the new route definition to the `src/app/app-routing.module.ts` file as shown below: @@ -442,42 +466,40 @@ function configureRoutes(routes: RoutesService) { For more information, see the [RoutesService document](https://docs.abp.io/en/abp/latest/UI/Angular/Modifying-the-Menu.md#via-routesservice). -### Generate Proxies +### Service Proxy Generation [ABP CLI](../CLI.md) provides `generate-proxy` command that generates client proxies for your HTTP APIs to make easy to consume your HTTP APIs from the client side. Before running `generate-proxy` command, your host must be up and running. Run the following command in the `angular` folder: ```bash -abp generate-proxy --module app --apiUrl https://localhost:XXXXX +abp generate-proxy --apiUrl https://localhost:XXXXX ``` * XXXXX should be replaced with the backend port of your application. * If you don't specify the `--apiUrl` parameter, it will try to get the URL from the `src/environments/environment.ts` file. -![Generate proxy command](./images/generate-proxy-command.png) - The generated files looks like below: -![Generated files](./images/generated-proxies.png) +![Generated files](./images/generated-proxies-2.png) -### BookListComponent +### BookComponent -Open the `book-list.component.ts` file in `app\book\book-list` folder and replace the content as below: +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, BookType } from '../models'; -import { BookService } from '../services'; +import { BookDto, BookType } from './models'; +import { BookService } from './services'; @Component({ - selector: 'app-book-list', - templateUrl: './book-list.component.html', - styleUrls: ['./book-list.component.scss'], + selector: 'app-book', + templateUrl: './book.component.html', + styleUrls: ['./book.component.scss'], providers: [ListService], }) -export class BookListComponent implements OnInit { +export class BookComponent implements OnInit { book = { items: [], totalCount: 0 } as PagedResultDto; booksType = BookType; @@ -495,9 +517,9 @@ export class BookListComponent implements OnInit { ``` * We imported and injected the generated `BookService`. -* We implemented the [ListService](https://docs.abp.io/en/abp/latest/UI/Angular/List-Service) that is a utility service to provide easy pagination, sorting, and search implementation. +* We are using the [ListService](https://docs.abp.io/en/abp/latest/UI/Angular/List-Service), a utility service of the ABP Framework which provides easy pagination, sorting and searching. -Open the `book-list.component.html` file in `app\book\book-list` folder and replace the content as below: +Open the `/src/app/book/book.component.html` and replace the content as below: ```html
@@ -534,18 +556,10 @@ Open the `book-list.component.html` file in `app\book\book-list` folder and repl
``` -* We added HTML code of book list page. - Now you can see the final result on your browser: ![Book list final result](./images/bookstore-book-list.png) -The file system structure of the project: - -![Book list final result](./images/bookstore-angular-file-tree.png) - -In this tutorial we have applied the rules of official [Angular Style Guide](https://angular.io/guide/styleguide#file-tree). - {{end}} ## The Next Part diff --git a/docs/en/Tutorials/images/bookstore-book-list.png b/docs/en/Tutorials/images/bookstore-book-list.png index ecdb87c737c26af3b187deb4a08eebbbea50505d..4982032e64e5c4f45035b938c4029a7c04f6c581 100644 GIT binary patch literal 36056 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 literal 56461 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Μ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 diff --git a/docs/en/Tutorials/images/generated-proxies-2.png b/docs/en/Tutorials/images/generated-proxies-2.png new file mode 100644 index 0000000000000000000000000000000000000000..adad417c3d98ef1ace1f5367ca8e8e977a64f97c GIT binary patch literal 33917 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 Date: Mon, 6 Jul 2020 16:47:17 +0300 Subject: [PATCH 29/58] Update Part-2.md --- docs/en/Tutorials/Part-2.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/Tutorials/Part-2.md b/docs/en/Tutorials/Part-2.md index b88a194852..892847ca49 100644 --- a/docs/en/Tutorials/Part-2.md +++ b/docs/en/Tutorials/Part-2.md @@ -538,7 +538,7 @@ Open the `/src/app/book/book.component.html` and replace the content as below: - {%{{{ booksType[row.type] }}}%} + {%{{{ '::Enum:BookType:' + row.type | abpLocalization }}}%} From 7290e881f52d5287360b7a26402e1a9c45210b34 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Mon, 6 Jul 2020 17:12:04 +0300 Subject: [PATCH 30/58] fix: add ar locale to webpackInclude comment resolves #4643 --- npm/ng-packs/packages/core/src/lib/utils/initial-utils.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/npm/ng-packs/packages/core/src/lib/utils/initial-utils.ts b/npm/ng-packs/packages/core/src/lib/utils/initial-utils.ts index e8e62ef057..bfca50bcd2 100644 --- a/npm/ng-packs/packages/core/src/lib/utils/initial-utils.ts +++ b/npm/ng-packs/packages/core/src/lib/utils/initial-utils.ts @@ -58,7 +58,8 @@ export function localeInitializer(injector: Injector) { export function registerLocale(locale: string) { return import( - /* webpackInclude: /(af|am|ar-SA|as|az-Latn|be|bg|bn-BD|bn-IN|bs|ca|ca-ES-VALENCIA|cs|cy|da|de|de|el|en-GB|en|es|en|es-US|es-MX|et|eu|fa|fi|en|fr|fr|fr-CA|ga|gd|gl|gu|ha|he|hi|hr|hu|hy|id|ig|is|it|it|ja|ka|kk|km|kn|ko|kok|en|en|lb|lt|lv|en|mk|ml|mn|mr|ms|mt|nb|ne|nl|nl-BE|nn|en|or|pa|pa-Arab|pl|en|pt|pt-PT|en|en|ro|ru|rw|pa-Arab|si|sk|sl|sq|sr-Cyrl-BA|sr-Cyrl|sr-Latn|sv|sw|ta|te|tg|th|ti|tk|tn|tr|tt|ug|uk|ur|uz-Latn|vi|wo|xh|yo|zh-Hans|zh-Hant|zu)\.js$/ */ + /* webpackInclude: /(af|ar|am|ar-SA|as|az-Latn|be|bg|bn-BD|bn-IN|bs|ca|ca-ES-VALENCIA|cs|cy|da|de|de|el|en-GB|en|es|en|es-US|es-MX|et|eu|fa|fi|en|fr|fr|fr-CA|ga|gd|gl|gu|ha|he|hi|hr|hu|hy|id|ig|is|it|it|ja|ka|kk|km|kn|ko|kok|en|en|lb|lt|lv|en|mk|ml|mn|mr|ms|mt|nb|ne|nl|nl-BE|nn|en|or|pa|pa-Arab|pl|en|pt|pt-PT|en|en|ro|ru|rw|pa-Arab|si|sk|sl|sq|sr-Cyrl-BA|sr-Cyrl|sr-Latn|sv|sw|ta|te|tg|th|ti|tk|tn|tr|tt|ug|uk|ur|uz-Latn|vi|wo|xh|yo|zh-Hans|zh-Hant|zu)\.js$/ */ + /* webpackChunkName: "[request]"*/ `@angular/common/locales/${differentLocales[locale] || locale}.js` ).then(module => { registerLocaleData(module.default); From 083de0c1af4a2b5a856a694d498626edcddf0405 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Mon, 6 Jul 2020 17:30:04 +0300 Subject: [PATCH 31/58] Update Part-3.md --- docs/en/Tutorials/Part-3.md | 67 ++++++++++++++----------------------- 1 file changed, 25 insertions(+), 42 deletions(-) diff --git a/docs/en/Tutorials/Part-3.md b/docs/en/Tutorials/Part-3.md index 2890db181b..d7df0a8568 100644 --- a/docs/en/Tutorials/Part-3.md +++ b/docs/en/Tutorials/Part-3.md @@ -632,32 +632,32 @@ You can run the application and try to delete a book. {{if UI == "NG"}} -## Creating a new book +## Creating a New Book In this section, you will learn how to create a new modal dialog form to create a new book. -### Add a modal to BookListComponent +### BookComponent -Open `book-list.component.ts` file in `app\book\book-list` folder and replace the content as below: +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 { BookDto, BookType } from './models'; +import { BookService } from './services'; @Component({ - selector: 'app-book-list', - templateUrl: './book-list.component.html', - styleUrls: ['./book-list.component.scss'], + selector: 'app-book', + templateUrl: './book.component.html', + styleUrls: ['./book.component.scss'], providers: [ListService], }) -export class BookListComponent implements OnInit { +export class BookComponent implements OnInit { book = { items: [], totalCount: 0 } as PagedResultDto; booksType = BookType; - isModalOpen = false; // <== added this line ==> + isModalOpen = false; // add this line constructor(public readonly list: ListService, private bookService: BookService) {} @@ -669,18 +669,17 @@ export class BookListComponent implements OnInit { }); } - // added createBook method + // add new method createBook() { this.isModalOpen = true; } } ``` -* We defined a variable called `isModalOpen` and `createBook` method. -* We added the `createBook` method. +* We defined a property called `isModalOpen` and a method called `createBook`. -Open `book-list.component.html` file in `books\book-list` folder and replace the content as below: +Open `/src/app/book/book.component.html` and make the following changes: ```html
@@ -688,41 +687,26 @@ Open `book-list.component.html` file in `books\book-list` folder and replace the
{%{{{ '::Menu:Books' | abpLocalization }}}%}
-
- +
+ +
+
- - - - - {%{{{ booksType[row.type] }}}%} - - - - - {%{{{ row.publishDate | date }}}%} - - - - - {%{{{ row.price | currency }}}%} - - - +
- +

{%{{{ '::NewBook' | abpLocalization }}}%}

@@ -738,26 +722,25 @@ Open `book-list.component.html` file in `books\book-list` folder and replace the
``` -* We added the `abp-modal` which renders a modal to allow user to create a new book. -* `abp-modal` is a pre-built component to show modals. While you could use another approach to show a modal, `abp-modal` provides additional benefits. -* We added `New book` button to the `AbpContentToolbar`. +* Added `New book` button to the card header.. +* Added the `abp-modal` which renders a modal to allow user to create a new book. `abp-modal` is a pre-built component to show modals. While you could use another approach to show a modal, `abp-modal` provides additional benefits. You can open your browser and click **New book** button to see the new modal. ![Empty modal for new book](./images/bookstore-empty-new-book-modal.png) -### Create a reactive form +### Create a Reactive Form [Reactive forms](https://angular.io/guide/reactive-forms) provide a model-driven approach to handling form inputs whose values change over time. -Open `book-list.component.ts` file in `app\book\book-list` folder and replace the content as below: +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 { FormGroup, FormBuilder, Validators } from '@angular/forms'; // <== added this line ==> +import { FormGroup, FormBuilder, Validators } from '@angular/forms'; // <== added this @Component({ selector: 'app-book-list', @@ -789,7 +772,7 @@ export class BookListComponent implements OnInit { } createBook() { - this.buildForm(); // <== added this line ==> + this.buildForm(); // <== added this line this.isModalOpen = true; } From 9be83bd7e14d566b97bed0c75d22207832288919 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Mon, 6 Jul 2020 18:08:30 +0300 Subject: [PATCH 32/58] Completed adding new book. --- docs/en/Tutorials/Part-3.md | 236 +++++++++++++----------------------- 1 file changed, 83 insertions(+), 153 deletions(-) diff --git a/docs/en/Tutorials/Part-3.md b/docs/en/Tutorials/Part-3.md index d7df0a8568..247dc8ce18 100644 --- a/docs/en/Tutorials/Part-3.md +++ b/docs/en/Tutorials/Part-3.md @@ -738,29 +738,34 @@ 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 { FormGroup, FormBuilder, Validators } from '@angular/forms'; // <== added this +import { BookDto, BookType } from './models'; +import { BookService } from './services'; +import { FormGroup, FormBuilder, Validators } from '@angular/forms'; // add this @Component({ - selector: 'app-book-list', - templateUrl: './book-list.component.html', - styleUrls: ['./book-list.component.scss'], + selector: 'app-book', + templateUrl: './book.component.html', + styleUrls: ['./book.component.scss'], providers: [ListService], }) -export class BookListComponent implements OnInit { +export class BookComponent implements OnInit { book = { items: [], totalCount: 0 } as PagedResultDto; booksType = BookType; - isModalOpen = false; + form: FormGroup; // add this line + + // add bookTypes as a list of enum members + bookTypes = Object.keys(BookType).filter( + (bookType) => typeof this.booksType[bookType] === 'number' + ); - form: FormGroup; // <== added this line ==> + isModalOpen = false; constructor( public readonly list: ListService, private bookService: BookService, - private fb: FormBuilder // <== injected FormBuilder ==> + private fb: FormBuilder // inject FormBuilder ) {} ngOnInit() { @@ -772,11 +777,11 @@ export class BookListComponent implements OnInit { } createBook() { - this.buildForm(); // <== added this line + this.buildForm(); // add this line this.isModalOpen = true; } - // added buildForm method + // add buildForm method buildForm() { this.form = this.fb.group({ name: ['', Validators.required], @@ -785,23 +790,34 @@ export class BookListComponent implements OnInit { price: [null, Validators.required], }); } + + // add save method + save() { + if (this.form.invalid) { + return; + } + + this.bookService.createByInput(this.form.value).subscribe(() => { + this.isModalOpen = false; + this.form.reset(); + this.list.get(); + }); + } } ``` -* We imported `FormGroup, FormBuilder and Validators`. -* We added `form: FormGroup` variable. -* We injected `fb: FormBuilder` service to the constructor. The [FormBuilder](https://angular.io/api/forms/FormBuilder) service provides convenient methods for generating controls. It reduces the amount of boilerplate needed to build complex forms. -* We added `buildForm` method to the end of the file and executed `buildForm()` in the `createBook` method. This method creates a reactive form to be able to create a new book. - * The `group` method of `FormBuilder`, `fb` creates a `FormGroup`. - * Added `Validators.required` static method which validates the relevant form element. - -### Create the DOM elements of the form +* Imported `FormGroup`, `FormBuilder` and `Validators` from `@angular/forms`. +* Added `form: FormGroup` property. +* Add `bookTypes` as a list of `BookType` enum members. +* 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. +* Added `save` method. -Open `book-list.component.html` in `app\books\book-list` folder and replace ` ` with the following code part: +Open `/src/app/book/book.component.html` and replace ` ` with the following code part: ```html - +
* @@ -835,143 +851,83 @@ Open `book-list.component.html` in `app\books\book-list` folder and replace ` ``` -- This template creates a form with `Name`, `Price`, `Type` and `Publish` date fields. -- We've used [NgBootstrap datepicker](https://ng-bootstrap.github.io/#/components/datepicker/overview) in this component. +Also replace ` ` with the following code part: + +````html + + + + + + +```` + +### Datepicker -### Datepicker requirements +We've used [NgBootstrap datepicker](https://ng-bootstrap.github.io/#/components/datepicker/overview) in this component. So, need to arrange dependencies related to this component. -Open `book.module.ts` file in `app\book` folder and replace the content as below: +Open `/src/app/book/book.module.ts` and replace the content as below: ```js import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { BookRoutingModule } from './book-routing.module'; -import { BookListComponent } from './book-list/book-list.component'; import { SharedModule } from '../shared/shared.module'; -import { NgbDatepickerModule } from '@ng-bootstrap/ng-bootstrap'; //<== added this line ==> +import { BookRoutingModule } from './book-routing.module'; +import { BookComponent } from './book.component'; +import { NgbDatepickerModule } from '@ng-bootstrap/ng-bootstrap'; // add this line @NgModule({ - declarations: [BookListComponent], + declarations: [BookComponent], imports: [ - CommonModule, BookRoutingModule, SharedModule, - NgbDatepickerModule, //<== added this line ==> - ], + NgbDatepickerModule, // add this line + ] }) -export class BookModule {} +export class BookModule { } ``` * We imported `NgbDatepickerModule` to be able to use the date picker. -Open `book-list.component.ts` file in `app\book\book-list` folder and replace the content as below: +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 { BookDto, BookType } from './models'; +import { BookService } from './services'; import { FormGroup, FormBuilder, Validators } from '@angular/forms'; -import { NgbDateNativeAdapter, NgbDateAdapter } from '@ng-bootstrap/ng-bootstrap'; // <== added this line ==> - -@Component({ - selector: 'app-book-list', - templateUrl: './book-list.component.html', - styleUrls: ['./book-list.component.scss'], - providers: [ListService, { provide: NgbDateAdapter, useClass: NgbDateNativeAdapter }], // <== added a provide ==> -}) -export class BookListComponent implements OnInit { - book = { items: [], totalCount: 0 } as PagedResultDto; - - booksType = BookType; - - // <== added bookTypeArr array ==> - bookTypeArr = Object.keys(BookType).filter( - (bookType) => typeof this.booksType[bookType] === 'number' - ); - - isModalOpen = false; - form: FormGroup; - - constructor( - public readonly list: ListService, - private bookService: BookService, - private fb: FormBuilder - ) {} - - ngOnInit() { - const bookStreamCreator = (query) => this.bookService.getListByInput(query); - - this.list.hookToQuery(bookStreamCreator).subscribe((response) => { - this.book = response; - }); - } - - createBook() { - this.buildForm(); - this.isModalOpen = true; - } - - buildForm() { - this.form = this.fb.group({ - name: ['', Validators.required], - type: [null, Validators.required], - publishDate: [null, Validators.required], - price: [null, Validators.required], - }); - } -} -``` - -* We imported ` NgbDateNativeAdapter, NgbDateAdapter` - -* We added a new provider `NgbDateAdapter` that converts Datepicker value to `Date` type. See the [datepicker adapters](https://ng-bootstrap.github.io/#/components/datepicker/overview) for more details. - -* We added `bookTypeArr` array to be able to use it in the combobox values. The `bookTypeArr` contains the fields of the `BookType` enum. Resulting array is shown below: - - ```js - ['Adventure', 'Biography', 'Dystopia', 'Fantastic' ...] - ``` - - This array was used in the previous form template in the `ngFor` loop. - -Now, you can open your browser to see the changes: - - -![New book modal](./images/bookstore-new-book-form.png) - -### Saving the book - -Open `book-list.component.ts` file in `app\book\book-list` folder 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 { FormGroup, FormBuilder, Validators } from '@angular/forms'; +// added this line import { NgbDateNativeAdapter, NgbDateAdapter } from '@ng-bootstrap/ng-bootstrap'; @Component({ - selector: 'app-book-list', - templateUrl: './book-list.component.html', - styleUrls: ['./book-list.component.scss'], - providers: [ListService, { provide: NgbDateAdapter, useClass: NgbDateNativeAdapter }], + selector: 'app-book', + templateUrl: './book.component.html', + styleUrls: ['./book.component.scss'], + providers: [ + ListService, + { provide: NgbDateAdapter, useClass: NgbDateNativeAdapter } // add this line + ], }) -export class BookListComponent implements OnInit { +export class BookComponent implements OnInit { book = { items: [], totalCount: 0 } as PagedResultDto; booksType = BookType; - bookTypeArr = Object.keys(BookType).filter( + form: FormGroup; + + // <== added bookTypeArr array ==> + bookTypes = Object.keys(BookType).filter( (bookType) => typeof this.booksType[bookType] === 'number' ); isModalOpen = false; - form: FormGroup; - constructor( public readonly list: ListService, private bookService: BookService, @@ -1000,7 +956,6 @@ export class BookListComponent implements OnInit { }); } - // <== added save ==> save() { if (this.form.invalid) { return; @@ -1015,35 +970,10 @@ export class BookListComponent implements OnInit { } ``` -* We added `save` method - -Open `book-list.component.html` in `app\book\book-list` folder, find the `` element and replace this element with the following to create a new book. - -```html - - - - - - -``` - -Find the `` tag and replace below content: - -```html - -``` - - -* We added the `(ngSubmit)="save()"` to `` element to save a new book by pressing the enter. -* We added `abp-button` to the bottom area of the modal to save a new book. +* Imported ` NgbDateNativeAdapter` and `NgbDateAdapter`. +* We added a new provider `NgbDateAdapter` that converts Datepicker value to `Date` type. See the [datepicker adapters](https://ng-bootstrap.github.io/#/components/datepicker/overview) for more details. -The final modal UI looks like below: +Now, you can open your browser to see the changes: ![Save button to the modal](./images/bookstore-new-book-form-v2.png) From a4869cc0f9cd71d18b917f0ca25cf1d2961a68fd Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Mon, 6 Jul 2020 23:39:39 +0300 Subject: [PATCH 33/58] refactor: place abp-dynamic-layout to the app.component --- npm/ng-packs/apps/dev-app/src/app/app.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/npm/ng-packs/apps/dev-app/src/app/app.component.ts b/npm/ng-packs/apps/dev-app/src/app/app.component.ts index bf2a27962a..a26e745334 100644 --- a/npm/ng-packs/apps/dev-app/src/app/app.component.ts +++ b/npm/ng-packs/apps/dev-app/src/app/app.component.ts @@ -4,7 +4,7 @@ import { Component } from '@angular/core'; selector: 'app-root', template: ` - + `, }) export class AppComponent {} From d904e8df6cee346a911ed12710364f31c30452a6 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Mon, 6 Jul 2020 23:40:00 +0300 Subject: [PATCH 34/58] refactor: remove DynamicLayoutComponent from app-routing.module --- .../dev-app/src/app/app-routing.module.ts | 48 ++++++++----------- 1 file changed, 21 insertions(+), 27 deletions(-) diff --git a/npm/ng-packs/apps/dev-app/src/app/app-routing.module.ts b/npm/ng-packs/apps/dev-app/src/app/app-routing.module.ts index 8f6973079d..6394c6dd1b 100644 --- a/npm/ng-packs/apps/dev-app/src/app/app-routing.module.ts +++ b/npm/ng-packs/apps/dev-app/src/app/app-routing.module.ts @@ -5,33 +5,27 @@ import { RouterModule, Routes } from '@angular/router'; const routes: Routes = [ { path: '', - component: DynamicLayoutComponent, - children: [ - { - path: '', - pathMatch: 'full', - loadChildren: () => import('./home/home.module').then(m => m.HomeModule), - }, - { - path: 'account', - loadChildren: () => - import('@abp/ng.account').then(m => m.AccountModule.forLazy({ redirectUrl: '/' })), - }, - { - path: 'identity', - loadChildren: () => import('@abp/ng.identity').then(m => m.IdentityModule.forLazy()), - }, - { - path: 'tenant-management', - loadChildren: () => - import('@abp/ng.tenant-management').then(m => m.TenantManagementModule.forLazy()), - }, - { - path: 'setting-management', - loadChildren: () => - import('@abp/ng.setting-management').then(m => m.SettingManagementModule.forLazy()), - }, - ], + pathMatch: 'full', + loadChildren: () => import('./home/home.module').then(m => m.HomeModule), + }, + { + path: 'account', + loadChildren: () => + import('@abp/ng.account').then(m => m.AccountModule.forLazy({ redirectUrl: '/' })), + }, + { + path: 'identity', + loadChildren: () => import('@abp/ng.identity').then(m => m.IdentityModule.forLazy()), + }, + { + path: 'tenant-management', + loadChildren: () => + import('@abp/ng.tenant-management').then(m => m.TenantManagementModule.forLazy()), + }, + { + path: 'setting-management', + loadChildren: () => + import('@abp/ng.setting-management').then(m => m.SettingManagementModule.forLazy()), }, ]; From aac30ceeca1dd9f12a6a3efd164be54cb09e83fa Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Mon, 6 Jul 2020 23:57:16 +0300 Subject: [PATCH 35/58] chore: organize imports --- npm/ng-packs/apps/dev-app/src/app/app-routing.module.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/npm/ng-packs/apps/dev-app/src/app/app-routing.module.ts b/npm/ng-packs/apps/dev-app/src/app/app-routing.module.ts index 6394c6dd1b..5bfedf645b 100644 --- a/npm/ng-packs/apps/dev-app/src/app/app-routing.module.ts +++ b/npm/ng-packs/apps/dev-app/src/app/app-routing.module.ts @@ -1,4 +1,3 @@ -import { ABP, DynamicLayoutComponent } from '@abp/ng.core'; import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; From 06c148ad210d794aad4436735a3b64dbbc938849 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Mon, 6 Jul 2020 23:57:40 +0300 Subject: [PATCH 36/58] docs: update the v2.9 to v3.0 Angular UI Migration Guide --- docs/en/UI/Angular/Migration-Guide-v3.md | 71 +++++++++++++----------- 1 file changed, 39 insertions(+), 32 deletions(-) diff --git a/docs/en/UI/Angular/Migration-Guide-v3.md b/docs/en/UI/Angular/Migration-Guide-v3.md index 987632571a..6c56536065 100644 --- a/docs/en/UI/Angular/Migration-Guide-v3.md +++ b/docs/en/UI/Angular/Migration-Guide-v3.md @@ -145,42 +145,33 @@ export class AppModule {} AppRoutingModule: ```js -import { DynamicLayoutComponent } from '@abp/ng.core'; import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; const routes: Routes = [ { path: '', - component: DynamicLayoutComponent, - children: [ - { - path: '', - pathMatch: 'full', - loadChildren: () => import('./home/home.module') - .then(m => m.HomeModule), - }, - { - path: 'account', - loadChildren: () => import('@abp/ng.account') - .then(m => m.AccountModule.forLazy({ redirectUrl: '/' })), - }, - { - path: 'identity', - loadChildren: () => import('@abp/ng.identity') - .then(m => m.IdentityModule.forLazy()), - }, - { - path: 'tenant-management', - loadChildren: () => import('@abp/ng.tenant-management') - .then(m => m.TenantManagementModule.forLazy()), - }, - { - path: 'setting-management', - loadChildren: () => import('@abp/ng.setting-management') - .then(m => m.SettingManagementModule.forLazy()), - }, - ], + pathMatch: 'full', + loadChildren: () => import('./home/home.module').then(m => m.HomeModule), + }, + { + path: 'account', + loadChildren: () => + import('@abp/ng.account').then(m => m.AccountModule.forLazy({ redirectUrl: '/' })), + }, + { + path: 'identity', + loadChildren: () => import('@abp/ng.identity').then(m => m.IdentityModule.forLazy()), + }, + { + path: 'tenant-management', + loadChildren: () => + import('@abp/ng.tenant-management').then(m => m.TenantManagementModule.forLazy()), + }, + { + path: 'setting-management', + loadChildren: () => + import('@abp/ng.setting-management').then(m => m.SettingManagementModule.forLazy()), }, ]; @@ -191,7 +182,23 @@ const routes: Routes = [ export class AppRoutingModule {} ``` -> You may have noticed that we used `DynamicLayoutComponent` at top level route component. We made this change in order to avoid unnecessary renders and flickering. It is not mandatory, but we recommend doing the same in your app routing. +AppComponent: + +```js +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-root', + template: ` + + + `, +}) +export class AppComponent {} +``` + + +> You may have noticed that we used `` instead of `` in the AppComponent template. We made this change in order to avoid unnecessary renders and flickering. It is not mandatory, but we recommend doing the same in your AppComponent. #### What to Do When Migrating? @@ -201,7 +208,7 @@ export class AppRoutingModule {} - Call static `forRoot` method of `ThemeBasicModule` (or `ThemeLeptonModule` if commercial) and remove `SharedModule` from imports (unless you have added anything that is necessary for your root module in it). - Import lazy ABP modules directly in app routing module (e.g. `() => import('@abp/ng.identity').then(...)`). - Call static `forLazy` method of all lazy modules inside `then`, even if a configuration is not passed. -- [OPTIONAL] Add an empty parent route with `DynamicLayoutComponent` for better performance and UX. +- [OPTIONAL] Add the `` to the AppComponent template and remove the `` for better performance and UX. ### RoutesService From 250b7b845a298877fde9fd0ae714045ee49cede5 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Tue, 7 Jul 2020 00:04:33 +0300 Subject: [PATCH 37/58] refactor(module-template): add dynamic layout to app.component --- .../dev-app/src/app/app-routing.module.ts | 78 +++++++++---------- .../projects/dev-app/src/app/app.component.ts | 2 +- 2 files changed, 36 insertions(+), 44 deletions(-) diff --git a/templates/module/angular/projects/dev-app/src/app/app-routing.module.ts b/templates/module/angular/projects/dev-app/src/app/app-routing.module.ts index 47b7ce8ecd..759fad9ebc 100644 --- a/templates/module/angular/projects/dev-app/src/app/app-routing.module.ts +++ b/templates/module/angular/projects/dev-app/src/app/app-routing.module.ts @@ -1,52 +1,44 @@ -import { ABP, DynamicLayoutComponent } from '@abp/ng.core'; import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; const routes: Routes = [ { path: '', - component: DynamicLayoutComponent, - children: [ - { - path: '', - pathMatch: 'full', - loadChildren: () => - import('./home/home.module').then((m) => m.HomeModule), - }, - { - path: 'account', - loadChildren: () => - import('@abp/ng.account').then((m) => - m.AccountModule.forLazy({ redirectUrl: '/' }) - ), - }, - { - path: 'identity', - loadChildren: () => - import('@abp/ng.identity').then((m) => m.IdentityModule.forLazy()), - }, - { - path: 'tenant-management', - loadChildren: () => - import('@abp/ng.tenant-management').then((m) => - m.TenantManagementModule.forLazy() - ), - }, - { - path: 'setting-management', - loadChildren: () => - import('@abp/ng.setting-management').then((m) => - m.SettingManagementModule.forLazy() - ), - }, - { - path: 'my-project-name', - loadChildren: () => - import('@my-company-name/my-project-name').then((m) => - m.MyProjectNameModule.forLazy() - ), - }, - ], + pathMatch: 'full', + loadChildren: () => import('./home/home.module').then((m) => m.HomeModule), + }, + { + path: 'account', + loadChildren: () => + import('@abp/ng.account').then((m) => + m.AccountModule.forLazy({ redirectUrl: '/' }) + ), + }, + { + path: 'identity', + loadChildren: () => + import('@abp/ng.identity').then((m) => m.IdentityModule.forLazy()), + }, + { + path: 'tenant-management', + loadChildren: () => + import('@abp/ng.tenant-management').then((m) => + m.TenantManagementModule.forLazy() + ), + }, + { + path: 'setting-management', + loadChildren: () => + import('@abp/ng.setting-management').then((m) => + m.SettingManagementModule.forLazy() + ), + }, + { + path: 'my-project-name', + loadChildren: () => + import('@my-company-name/my-project-name').then((m) => + m.MyProjectNameModule.forLazy() + ), }, ]; diff --git a/templates/module/angular/projects/dev-app/src/app/app.component.ts b/templates/module/angular/projects/dev-app/src/app/app.component.ts index bf2a27962a..a26e745334 100644 --- a/templates/module/angular/projects/dev-app/src/app/app.component.ts +++ b/templates/module/angular/projects/dev-app/src/app/app.component.ts @@ -4,7 +4,7 @@ import { Component } from '@angular/core'; selector: 'app-root', template: ` - + `, }) export class AppComponent {} From 27d1f11b964570262cd39e6c84d1b83e4da30bda Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Tue, 7 Jul 2020 00:05:35 +0300 Subject: [PATCH 38/58] refactor: define DynamicLayoutComponent as root component --- .../src/lib/my-project-name-routing.module.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/templates/module/angular/projects/my-project-name/src/lib/my-project-name-routing.module.ts b/templates/module/angular/projects/my-project-name/src/lib/my-project-name-routing.module.ts index e698be1973..75934a9b70 100644 --- a/templates/module/angular/projects/my-project-name/src/lib/my-project-name-routing.module.ts +++ b/templates/module/angular/projects/my-project-name/src/lib/my-project-name-routing.module.ts @@ -7,7 +7,13 @@ const routes: Routes = [ { path: '', pathMatch: 'full', - component: MyProjectNameComponent, + component: DynamicLayoutComponent, + children: [ + { + path: '', + component: MyProjectNameComponent, + }, + ], }, ]; From a9695fac6c3a677d891131b5dad0b0b0398a6445 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Tue, 7 Jul 2020 00:12:32 +0300 Subject: [PATCH 39/58] refactor(module-template): add dynamic layout to app.component --- .../app/angular/src/app/app-routing.module.ts | 49 ++++++++----------- .../app/angular/src/app/app.component.ts | 2 +- 2 files changed, 22 insertions(+), 29 deletions(-) diff --git a/templates/app/angular/src/app/app-routing.module.ts b/templates/app/angular/src/app/app-routing.module.ts index 793703a3ad..7e731d1f47 100644 --- a/templates/app/angular/src/app/app-routing.module.ts +++ b/templates/app/angular/src/app/app-routing.module.ts @@ -1,37 +1,30 @@ -import { ABP, DynamicLayoutComponent } from '@abp/ng.core'; import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; const routes: Routes = [ { path: '', - component: DynamicLayoutComponent, - children: [ - { - path: '', - pathMatch: 'full', - loadChildren: () => import('./home/home.module').then((m) => m.HomeModule), - }, - { - path: 'account', - loadChildren: () => - import('@abp/ng.account').then((m) => m.AccountModule.forLazy({ redirectUrl: '/' })), - }, - { - path: 'identity', - loadChildren: () => import('@abp/ng.identity').then((m) => m.IdentityModule.forLazy()), - }, - { - path: 'tenant-management', - loadChildren: () => - import('@abp/ng.tenant-management').then((m) => m.TenantManagementModule.forLazy()), - }, - { - path: 'setting-management', - loadChildren: () => - import('@abp/ng.setting-management').then((m) => m.SettingManagementModule.forLazy()), - }, - ], + pathMatch: 'full', + loadChildren: () => import('./home/home.module').then((m) => m.HomeModule), + }, + { + path: 'account', + loadChildren: () => + import('@abp/ng.account').then((m) => m.AccountModule.forLazy({ redirectUrl: '/' })), + }, + { + path: 'identity', + loadChildren: () => import('@abp/ng.identity').then((m) => m.IdentityModule.forLazy()), + }, + { + path: 'tenant-management', + loadChildren: () => + import('@abp/ng.tenant-management').then((m) => m.TenantManagementModule.forLazy()), + }, + { + path: 'setting-management', + loadChildren: () => + import('@abp/ng.setting-management').then((m) => m.SettingManagementModule.forLazy()), }, ]; diff --git a/templates/app/angular/src/app/app.component.ts b/templates/app/angular/src/app/app.component.ts index bf2a27962a..a26e745334 100644 --- a/templates/app/angular/src/app/app.component.ts +++ b/templates/app/angular/src/app/app.component.ts @@ -4,7 +4,7 @@ import { Component } from '@angular/core'; selector: 'app-root', template: ` - + `, }) export class AppComponent {} From 5d599066359c6214f31c714278b10cbe184a876d Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Tue, 7 Jul 2020 00:51:45 +0300 Subject: [PATCH 40/58] chore: remove a blank line --- templates/app/angular/angular.json | 1 - 1 file changed, 1 deletion(-) diff --git a/templates/app/angular/angular.json b/templates/app/angular/angular.json index 09eb7f4cc7..e3c0dbb2c3 100644 --- a/templates/app/angular/angular.json +++ b/templates/app/angular/angular.json @@ -51,7 +51,6 @@ "inject": true, "bundleName": "ngx-datatable-material" }, - { "input": "node_modules/@abp/ng.theme.shared/styles/bootstrap-rtl.min.css", "inject": false, From 6f62b277d3f79a5425bc93b5a80c0e025226807f Mon Sep 17 00:00:00 2001 From: htlsmile Date: Tue, 7 Jul 2020 11:44:38 +0800 Subject: [PATCH 41/58] Update docs-nav.json Fixing translation errors --- docs/zh-Hans/docs-nav.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/zh-Hans/docs-nav.json b/docs/zh-Hans/docs-nav.json index 66229da6da..732acc8806 100644 --- a/docs/zh-Hans/docs-nav.json +++ b/docs/zh-Hans/docs-nav.json @@ -34,7 +34,7 @@ "path": "Tutorials/Part-1.md" }, { - "text": "第一章: 增删改查操作", + "text": "第二章: 增删改查操作", "path": "Tutorials/Part-2.md" }, { From d62ee8ff8d568472784f69041387d99af7a18a1a Mon Sep 17 00:00:00 2001 From: htlsmile Date: Tue, 7 Jul 2020 13:31:25 +0800 Subject: [PATCH 42/58] Update Repositories.md Fixing translation errors --- docs/zh-Hans/Repositories.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/docs/zh-Hans/Repositories.md b/docs/zh-Hans/Repositories.md index 86d2f2e43d..18bfa5f77d 100644 --- a/docs/zh-Hans/Repositories.md +++ b/docs/zh-Hans/Repositories.md @@ -248,6 +248,4 @@ ABP框架使用实际数据库提供程序的API异步执行查询.虽然这不 * 如果你正在构建一个没有数据库提供程序集成包的**可重用库**,但是在某些情况下需要执行 `IQueryable`对象. -For example, ABP Framework uses the `IAsyncQueryableExecuter` in the `CrudAppService` base class (see the [application services](Application-Services.md) document). - -例如,ABP框架在 `CrudAppService` 基类中(参阅[应用程序](Application-Services.md)文档)使用 `IAsyncQueryableExecuter`. \ No newline at end of file +例如,ABP框架在 `CrudAppService` 基类中(参阅[应用程序](Application-Services.md)文档)使用 `IAsyncQueryableExecuter`. From 02dbdc7b15fcec2ba5f10657ef9f0014596acf42 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Tue, 7 Jul 2020 10:51:38 +0300 Subject: [PATCH 43/58] fix: Expression has changed after it was checked error in loader-bar resolves #4652 --- .../src/lib/components/loader-bar/loader-bar.component.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/loader-bar/loader-bar.component.ts b/npm/ng-packs/packages/theme-shared/src/lib/components/loader-bar/loader-bar.component.ts index 512d959c5f..5f2e922263 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/components/loader-bar/loader-bar.component.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/loader-bar/loader-bar.component.ts @@ -31,7 +31,7 @@ export class LoaderBarComponent implements OnDestroy, OnInit { color = '#77b6ff'; @Input() - isLoading = false; + isLoading: boolean; progressLevel = 0; @@ -122,7 +122,7 @@ export class LoaderBarComponent implements OnDestroy, OnInit { if (this.interval) this.interval.unsubscribe(); this.progressLevel = 100; - this.isLoading = false; + setTimeout(() => (this.isLoading = false), 0); if (this.timer && !this.timer.closed) return; From 746aa22561bfd2e73235bebefc752be81437998e Mon Sep 17 00:00:00 2001 From: Alper Ebicoglu Date: Tue, 7 Jul 2020 10:57:18 +0300 Subject: [PATCH 44/58] add layout to loggedout.cshtml #4647 --- .../Pages/Account/LoggedOut.cshtml | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/modules/account/src/Volo.Abp.Account.Web/Pages/Account/LoggedOut.cshtml b/modules/account/src/Volo.Abp.Account.Web/Pages/Account/LoggedOut.cshtml index 0e7b14236a..abeaf25610 100644 --- a/modules/account/src/Volo.Abp.Account.Web/Pages/Account/LoggedOut.cshtml +++ b/modules/account/src/Volo.Abp.Account.Web/Pages/Account/LoggedOut.cshtml @@ -3,16 +3,20 @@ @using Volo.Abp.Account.Localization @using Microsoft.AspNetCore.Mvc.Localization @using Volo.Abp.Account.Web.Pages.Account +@using Volo.Abp.AspNetCore.Mvc.UI.Theming +@inject IThemeManager ThemeManager @inject IHtmlLocalizer L - +@{ + Layout = ThemeManager.CurrentTheme.GetApplicationLayout(); +} @section scripts { - + } @section styles { - + } @@ -28,4 +32,4 @@ } - + \ No newline at end of file From ce7a1bf774c5e60a9ea9167da3a460c24eb2734a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Tue, 7 Jul 2020 11:41:25 +0300 Subject: [PATCH 45/58] Updating book. --- docs/en/Tutorials/Part-2.md | 27 ++------ docs/en/Tutorials/Part-3.md | 122 ++++++++++++++---------------------- 2 files changed, 51 insertions(+), 98 deletions(-) diff --git a/docs/en/Tutorials/Part-2.md b/docs/en/Tutorials/Part-2.md index 892847ca49..0029eb466d 100644 --- a/docs/en/Tutorials/Part-2.md +++ b/docs/en/Tutorials/Part-2.md @@ -331,6 +331,8 @@ 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. + 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: ```bash @@ -399,33 +401,12 @@ Generated code places the new route definition to the `src/app/app-routing.modul ````js const routes: Routes = [ - { - path: '', - component: DynamicLayoutComponent, - children: [ - // ... - ], - }, + // other route definitions... { path: 'books', loadChildren: () => import('./book/book.module').then(m => m.BookModule) }, ]; ```` -We need to **move this route** definition inside the `children` array, so it can use the application layout: - -````js -const routes: Routes = [ - { - path: '', - component: DynamicLayoutComponent, - children: [ - // ... - { path: 'books', loadChildren: () => import('./book/book.module').then(m => m.BookModule) }, - ], - }, -]; -```` - -Finally, open the `src/app/route.provider.ts` file replace the `configureRoutes` function declaration as shown below: +Now, open the `src/app/route.provider.ts` file replace the `configureRoutes` function declaration as shown below: ```js function configureRoutes(routes: RoutesService) { diff --git a/docs/en/Tutorials/Part-3.md b/docs/en/Tutorials/Part-3.md index 247dc8ce18..2a8d8ec34b 100644 --- a/docs/en/Tutorials/Part-3.md +++ b/docs/en/Tutorials/Part-3.md @@ -977,39 +977,39 @@ Now, you can open your browser to see the changes: ![Save button to the modal](./images/bookstore-new-book-form-v2.png) -## Updating a book +## Updating a Book -Open `book-list.component.ts` in `app\book\book-list` folder and add a variable named `selectedBook`. +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 } from '../models'; -import { BookService } from '../services'; +import { BookDto, BookType, CreateUpdateBookDto } from './models'; +import { BookService } from './services'; import { FormGroup, FormBuilder, Validators } from '@angular/forms'; import { NgbDateNativeAdapter, NgbDateAdapter } from '@ng-bootstrap/ng-bootstrap'; @Component({ - selector: 'app-book-list', - templateUrl: './book-list.component.html', - styleUrls: ['./book-list.component.scss'], + selector: 'app-book', + templateUrl: './book.component.html', + styleUrls: ['./book.component.scss'], providers: [ListService, { provide: NgbDateAdapter, useClass: NgbDateNativeAdapter }], }) -export class BookListComponent implements OnInit { +export class BookComponent implements OnInit { book = { items: [], totalCount: 0 } as PagedResultDto; booksType = BookType; - bookTypeArr = Object.keys(BookType).filter( + form: FormGroup; + + selectedBook = new BookDto(); // declare selectedBook + + bookTypes = Object.keys(BookType).filter( (bookType) => typeof this.booksType[bookType] === 'number' ); isModalOpen = false; - form: FormGroup; - - selectedBook = {} as BookDto; // <== declared selectedBook ==> - constructor( public readonly list: ListService, private bookService: BookService, @@ -1024,14 +1024,13 @@ export class BookListComponent implements OnInit { }); } - // <== this method is replaced ==> createBook() { - this.selectedBook = {} as BookDto; // <== added ==> + this.selectedBook = new BookDto(); // reset the selected book this.buildForm(); this.isModalOpen = true; } - // <== added editBook method ==> + // Add editBook method editBook(id: string) { this.bookService.getById(id).subscribe((book) => { this.selectedBook = book; @@ -1040,7 +1039,6 @@ export class BookListComponent implements OnInit { }); } - // <== this method is replaced ==> buildForm() { this.form = this.fb.group({ name: [this.selectedBook.name || '', Validators.required], @@ -1053,13 +1051,12 @@ export class BookListComponent implements OnInit { }); } - // <== this method is replaced ==> + // change the save method save() { if (this.form.invalid) { return; } - // <== added request ==> const request = this.selectedBook.id ? this.bookService.updateByIdAndInput(this.form.value, this.selectedBook.id) : this.bookService.createByInput(this.form.value); @@ -1074,71 +1071,46 @@ export class BookListComponent implements OnInit { ``` * We declared a variable named `selectedBook` as `BookDto`. -* We added `editBook` method. This method fetches the book with the given `Id` and sets it to `selectedBook` object. +* We added `editBook` method. This method fetches the book with the given `id` and sets it to `selectedBook` object. * We replaced the `buildForm` method so that it creates the form with the `selectedBook` data. * We replaced the `createBook` method so it sets `selectedBook` to an empty object. -* We replaced the `save` method. +* We changed the `save` method to handle both of create and update operations. -### Add "Actions" dropdown to the table +### Add "Actions" Dropdown to the Table -Open the `book-list.component.html` in `app\book\book-list` folder and replace the `
` tag as below: +Open the `/src/app/book/book.component.html`  and add the following `ngx-datatable-column` definition as the first column in the `ngx-datatable`: ```html -
- - - - -
- -
- -
-
-
-
- - - - {%{{{ booksType[row.type] }}}%} - - - - - {%{{{ row.publishDate | date }}}%} - - - - - {%{{{ row.price | currency }}}%} - - -
-
+ + +
+ +
+ +
+
+
+
``` -- We added a `ngx-datatable-column` for the "Actions" column. -- We added `button` with `ngbDropdownToggle` to open actions when clicked the button. -- We have used to [NgbDropdown](https://ng-bootstrap.github.io/#/components/dropdown/examples) for the dropdown menu of actions. - -The final UI looks like as below: +Added an "Actions" dropdown as the first column of the table that is shown below: ![Action buttons](./images/bookstore-actions-buttons.png) -Open `book-list.component.html` in `app\book\book-list` folder and find the `` tag and replace the content as below. +Also, change the `ng-template #abpHeader` section as shown below: ```html @@ -1146,9 +1118,9 @@ Open `book-list.component.html` in `app\book\book-list` folder and find the ` ``` -* This template will show **Edit** text for edit record operation, **New Book** for new record operation in the title. +This template will show **Edit** text for edit record operation, **New Book** for new record operation in the title. -## Deleting a book +## Deleting a Book ### Delete confirmation popup From ac62b8cb07cec4b50d8ce6fb8a6ec3bd2baab5fa Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Tue, 7 Jul 2020 11:45:13 +0300 Subject: [PATCH 46/58] refactor(theme-shared): run detectChanges in isLoading setter --- .../loader-bar/loader-bar.component.ts | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/loader-bar/loader-bar.component.ts b/npm/ng-packs/packages/theme-shared/src/lib/components/loader-bar/loader-bar.component.ts index 5f2e922263..47ff4d057d 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/components/loader-bar/loader-bar.component.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/loader-bar/loader-bar.component.ts @@ -24,14 +24,22 @@ import { filter } from 'rxjs/operators'; styleUrls: ['./loader-bar.component.scss'], }) export class LoaderBarComponent implements OnDestroy, OnInit { + protected _isLoading: boolean; + @Input() - containerClass = 'abp-loader-bar'; + set isLoading(value: boolean) { + this._isLoading = value; + this.cdRef.detectChanges(); + } + get isLoading(): boolean { + return this._isLoading; + } @Input() - color = '#77b6ff'; + containerClass = 'abp-loader-bar'; @Input() - isLoading: boolean; + color = '#77b6ff'; progressLevel = 0; @@ -122,7 +130,7 @@ export class LoaderBarComponent implements OnDestroy, OnInit { if (this.interval) this.interval.unsubscribe(); this.progressLevel = 100; - setTimeout(() => (this.isLoading = false), 0); + this.isLoading = false; if (this.timer && !this.timer.closed) return; From a8cd52f08b13bd15a7771621cb7e31c64f53921f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Tue, 7 Jul 2020 11:52:18 +0300 Subject: [PATCH 47/58] Complete the part 3 --- docs/en/Tutorials/Part-3.md | 45 ++++++++++++++++--------------------- 1 file changed, 19 insertions(+), 26 deletions(-) diff --git a/docs/en/Tutorials/Part-3.md b/docs/en/Tutorials/Part-3.md index 2a8d8ec34b..275f1b9730 100644 --- a/docs/en/Tutorials/Part-3.md +++ b/docs/en/Tutorials/Part-3.md @@ -1122,36 +1122,25 @@ This template will show **Edit** text for edit record operation, **New Book** fo ## Deleting a Book -### Delete confirmation popup - -Open `book-list.component.ts` in `app\book\book-list` folder and inject the `ConfirmationService`. +Open the `/src/app/book/book.component.ts` and inject the `ConfirmationService`. Replace the constructor as below: ```js -import { ConfirmationService } from '@abp/ng.theme.shared'; -//... +// ... + +// add new imports +import { ConfirmationService, Confirmation } from '@abp/ng.theme.shared'; +//change the constructor constructor( public readonly list: ListService, private bookService: BookService, private fb: FormBuilder, - private confirmation: ConfirmationService // <== added this line ==> + private confirmation: ConfirmationService // inject the ConfirmationService ) {} -``` - -* We imported `ConfirmationService`. -* We injected `ConfirmationService` to the constructor. - -See the [Confirmation Popup documentation](https://docs.abp.io/en/abp/latest/UI/Angular/Confirmation-Service) - -In the `book-list.component.ts` add a delete method: - -```js -import { ConfirmationService, Confirmation } from '@abp/ng.theme.shared'; //<== imported Confirmation namespace ==> - -//... +// Add a delete method delete(id: string) { this.confirmation.warn('::AreYouSureToDelete', 'AbpAccount::AreYouSure').subscribe((status) => { if (status === Confirmation.Status.confirm) { @@ -1161,20 +1150,20 @@ delete(id: string) { } ``` +* We imported `ConfirmationService`. +* We injected `ConfirmationService` to the constructor. +* Added a `delete` method. -The `delete` method shows a confirmation popup and subscribes for the user response. The `deleteById` method of `BookService` called only if user clicks to the `Yes` button. The confirmation popup looks like below: - -![bookstore-confirmation-popup](./images/bookstore-confirmation-popup.png) - +> See the [Confirmation Popup documentation](../UI/Angular/Confirmation-Service) for more about this service. -### Add a delete button +### Add a Delete Button -Open `book-list.component.html` in `app\book\book-list` folder and modify the `ngbDropdownMenu` to add the delete button as shown below: +Open `/src/app/book/book.component.html` and modify the `ngbDropdownMenu` to add the delete button as shown below: ```html
- + @@ -1185,6 +1174,10 @@ The final actions dropdown UI looks like below: ![bookstore-final-actions-dropdown](./images/bookstore-final-actions-dropdown.png) +Clicking the "Delete" action calls the `delete` method which then shows a confirmation popup as shown below: + +![bookstore-confirmation-popup](./images/bookstore-confirmation-popup.png) + {{end}} ## The Next Part From ae360eb734b8a3819ac440a6cd62180286cfc426 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Tue, 7 Jul 2020 12:07:41 +0300 Subject: [PATCH 48/58] chore: remove isLoading subscription form list directive --- .../src/lib/directives/ngx-datatable-list.directive.ts | 9 --------- 1 file changed, 9 deletions(-) diff --git a/npm/ng-packs/packages/theme-shared/src/lib/directives/ngx-datatable-list.directive.ts b/npm/ng-packs/packages/theme-shared/src/lib/directives/ngx-datatable-list.directive.ts index 131ae88fc5..b721e1142a 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/directives/ngx-datatable-list.directive.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/directives/ngx-datatable-list.directive.ts @@ -66,14 +66,6 @@ export class NgxDatatableListDirective implements OnChanges, OnDestroy, OnInit { this.subscription.add(sub); } - private subscribeToIsLoading() { - const sub = this.list.isLoading$.subscribe(loading => { - this.table.loadingIndicator = loading; - this.cdRef.detectChanges(); - }); - this.subscription.add(sub); - } - ngOnChanges({ list }: SimpleChanges) { if (!list.firstChange) return; @@ -89,6 +81,5 @@ export class NgxDatatableListDirective implements OnChanges, OnDestroy, OnInit { ngOnInit() { this.subscribeToPage(); this.subscribeToSort(); - this.subscribeToIsLoading(); } } From 934f5029195c4153697557bac002362a0201b2f2 Mon Sep 17 00:00:00 2001 From: Galip Tolga Erdem Date: Tue, 7 Jul 2020 13:35:47 +0300 Subject: [PATCH 49/58] Fixed broken msdemo links on docs --- docs/en/Samples/Index.md | 2 +- docs/en/Samples/Microservice-Demo.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/en/Samples/Index.md b/docs/en/Samples/Index.md index ee9369b387..e715d3d1ca 100644 --- a/docs/en/Samples/Index.md +++ b/docs/en/Samples/Index.md @@ -7,7 +7,7 @@ Here, a list of official samples built with the ABP Framework. Most of these sam A complete solution to demonstrate how to build systems based on the microservice architecture. * [The complete documentation for this sample](Microservice-Demo.md) -* [Source code](https://github.com/abpframework/abp/tree/dev/samples/MicroserviceDemo) +* [Source code](https://github.com/abpframework/abp-samples/tree/master/MicroserviceDemo) * [Microservice architecture document](../Microservice-Architecture.md) ### Book Store diff --git a/docs/en/Samples/Microservice-Demo.md b/docs/en/Samples/Microservice-Demo.md index 25eaf68055..30059a9379 100644 --- a/docs/en/Samples/Microservice-Demo.md +++ b/docs/en/Samples/Microservice-Demo.md @@ -28,7 +28,7 @@ The diagram below shows the system: ### Source Code -You can get the source code from [the GitHub repository](https://github.com/abpframework/abp/tree/master/samples/MicroserviceDemo). +You can get the source code from [the GitHub repository](https://github.com/abpframework/abp-samples/tree/master/MicroserviceDemo). ## Running the Solution From 4751f58d60c091b528b9f0065231d7c9e9461684 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Tue, 7 Jul 2020 13:56:13 +0300 Subject: [PATCH 50/58] Update Part-5.md --- docs/en/Tutorials/Part-5.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/en/Tutorials/Part-5.md b/docs/en/Tutorials/Part-5.md index 61bb16c534..af87e5723a 100644 --- a/docs/en/Tutorials/Part-5.md +++ b/docs/en/Tutorials/Part-5.md @@ -53,7 +53,7 @@ ABP Framework provides an [authorization system](../Authorization.md) based on t A permission must have a unique name (a `string`). The best way is to define it as a `const`, so we can reuse the permission name. -Open the `BookStorePermissions` class and change the content as shown below: +Open the `BookStorePermissions` class inside the `Acme.BookStore.Application.Contracts` project and change the content as shown below: ````csharp namespace Acme.BookStore.Permissions @@ -316,6 +316,6 @@ if (await context.IsGrantedAsync(BookStorePermissions.Books.Default)) {{else if UI == "NG"}} -***Angular UI authorization document is being prepared...*** + {{end}} \ No newline at end of file From a2d909efd5bf1e79c8ae60b834ad8b02f64ba846 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Tue, 7 Jul 2020 14:07:42 +0300 Subject: [PATCH 51/58] Update Part-5.md --- docs/en/Tutorials/Part-5.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/Tutorials/Part-5.md b/docs/en/Tutorials/Part-5.md index af87e5723a..54fd012233 100644 --- a/docs/en/Tutorials/Part-5.md +++ b/docs/en/Tutorials/Part-5.md @@ -165,7 +165,7 @@ namespace Acme.BookStore.Books GetListPolicyName = BookStorePermissions.Books.Default; CreatePolicyName = BookStorePermissions.Books.Create; UpdatePolicyName = BookStorePermissions.Books.Edit; - DeletePolicyName = BookStorePermissions.Books.Create; + DeletePolicyName = BookStorePermissions.Books.Delete; } } } From 7a762728a90a94a4b8b614c53b1a580cfa3af9f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Tue, 7 Jul 2020 14:24:52 +0300 Subject: [PATCH 52/58] Added Angular Guard Configuration section. --- docs/en/Tutorials/Part-5.md | 38 +++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/docs/en/Tutorials/Part-5.md b/docs/en/Tutorials/Part-5.md index 54fd012233..c4aeb97361 100644 --- a/docs/en/Tutorials/Part-5.md +++ b/docs/en/Tutorials/Part-5.md @@ -316,6 +316,44 @@ if (await context.IsGrantedAsync(BookStorePermissions.Books.Default)) {{else if UI == "NG"}} +### Angular Guard Configuration + +First step of the UI is to prevent unauthorized users to see the "Books" menu item and enter to the book management page. + +Open the `/src/app/book/book-routing.module.ts` and replace with the following content: + +````js +import { NgModule } from '@angular/core'; +import { Routes, RouterModule } from '@angular/router'; +import { AuthGuard, PermissionGuard } from '@abp/ng.core'; +import { BookComponent } from './book.component'; + +const routes: Routes = [ + { path: '', component: BookComponent, canActivate: [AuthGuard, PermissionGuard] }, +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule], +}) +export class BookRoutingModule {} +```` + +* Imported `AuthGuard` and `PermissionGuard` from the `@abp/ng.core`. +* Added `canActivate: [AuthGuard, PermissionGuard]` to the route definition. + +Open the `/src/app/route.provider.ts` and add `requiredPolicy: 'BookStore.Books'` to the `/books` route. The `/books` route block should be following: + +````js +{ + path: '/books', + name: '::Menu:Books', + parentName: '::Menu:BookStore', + layout: eLayoutType.application, + requiredPolicy: 'BookStore.Books', +} +```` + {{end}} \ No newline at end of file From 03a473ef5b5e63e5da87773871d42dc2cc19ed00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Tue, 7 Jul 2020 14:34:00 +0300 Subject: [PATCH 53/58] Hide the New Book Button section completed. --- docs/en/Tutorials/Part-5.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/docs/en/Tutorials/Part-5.md b/docs/en/Tutorials/Part-5.md index c4aeb97361..67b124bb33 100644 --- a/docs/en/Tutorials/Part-5.md +++ b/docs/en/Tutorials/Part-5.md @@ -354,6 +354,22 @@ Open the `/src/app/route.provider.ts` and add `requiredPolicy: 'BookStore.Books' } ```` +### Hide the New Book Button +The book management page has a *New Book* button that should be invisible if the current user has no *Book Creation* permission. + +![bookstore-new-book-button-small](images/bookstore-new-book-button-small.png) + +Open the `/src/app/book/book.component.html` file and replace the create button HTML content as shown below: + +````html + + +```` + +* Just added `abpPermission="BookStore.Books.Create"` that hides the button if the current user has no permission. {{end}} \ No newline at end of file From 5644ad89e4247f2d134226995f976229ccde7bad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Tue, 7 Jul 2020 14:41:16 +0300 Subject: [PATCH 54/58] Update Part-5.md --- docs/en/Tutorials/Part-5.md | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/docs/en/Tutorials/Part-5.md b/docs/en/Tutorials/Part-5.md index 67b124bb33..441db14638 100644 --- a/docs/en/Tutorials/Part-5.md +++ b/docs/en/Tutorials/Part-5.md @@ -243,7 +243,7 @@ Open the `Pages/Books/Index.cshtml` file and change the content as shown below: ### JavaScript Side -Books table in the book management page has an actions button for each row. The actions button includes *Edit* and *Delete* action: +Books table in the book management page has an actions button for each row. The actions button includes *Edit* and *Delete* actions: ![bookstore-edit-delete-actions](images/bookstore-edit-delete-actions.png) @@ -372,4 +372,30 @@ Open the `/src/app/book/book.component.html` file and replace the create button * Just added `abpPermission="BookStore.Books.Create"` that hides the button if the current user has no permission. -{{end}} \ No newline at end of file +### Hide the Edit and Delete Actions + +Books table in the book management page has an actions button for each row. The actions button includes *Edit* and *Delete* actions: + +![bookstore-edit-delete-actions](images/bookstore-edit-delete-actions.png) + +We should hide an action if the current user has not granted for the related permission. + +Open the `/src/app/book/book.component.html` file and replace the edit and delete buttons contents as shown below: + +````html + + + + + +```` + +* Added `abpPermission="BookStore.Books.Edit"` that hides the edit action if the current user has no editing permission. +* Added `abpPermission="BookStore.Books.Delete"` that hides the delete action if the current user has no delete permission. + +{{end}} + From 854f3e5551224436e53de0ead6ae6936efd81df2 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Tue, 7 Jul 2020 15:37:03 +0300 Subject: [PATCH 55/58] refactor(core): get the required policy in PermissionGuard from RoutesService resolves #4662 --- .../core/src/lib/guards/permission.guard.ts | 33 +++++++++---------- .../core/src/lib/utils/route-utils.ts | 4 +-- 2 files changed, 18 insertions(+), 19 deletions(-) diff --git a/npm/ng-packs/packages/core/src/lib/guards/permission.guard.ts b/npm/ng-packs/packages/core/src/lib/guards/permission.guard.ts index c4b70d0b7b..6ba6bd18b5 100644 --- a/npm/ng-packs/packages/core/src/lib/guards/permission.guard.ts +++ b/npm/ng-packs/packages/core/src/lib/guards/permission.guard.ts @@ -1,34 +1,33 @@ import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot, CanActivate, RouterStateSnapshot } from '@angular/router'; +import { ActivatedRouteSnapshot, CanActivate, RouterStateSnapshot, Router } from '@angular/router'; import { Store } from '@ngxs/store'; import { Observable, of } from 'rxjs'; import { tap } from 'rxjs/operators'; import snq from 'snq'; -import { RestOccurError } from '../actions'; -import { ConfigState } from '../states'; +import { RestOccurError } from '../actions/rest.actions'; +import { ConfigState } from '../states/config.state'; +import { RoutesService } from '../services/routes.service'; +import { findRoute, getRoutePath } from '../utils/route-utils'; @Injectable({ providedIn: 'root', }) export class PermissionGuard implements CanActivate { - constructor(private store: Store) {} + constructor(private router: Router, private routes: RoutesService, private store: Store) {} - canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable { - let resource = - snq(() => route.data.routes.requiredPolicy) || snq(() => route.data.requiredPolicy as string); - if (!resource) { - resource = snq( - () => - route.routeConfig.children.find(child => state.url.indexOf(child.path) > -1).data - .requiredPolicy, - ); + canActivate( + route: ActivatedRouteSnapshot, + state: RouterStateSnapshot, + ): Observable | boolean { + let { requiredPolicy } = route.data || {}; - if (!resource) { - return of(true); - } + if (!requiredPolicy) { + requiredPolicy = findRoute(this.routes, getRoutePath(this.router, state.url))?.requiredPolicy; + + if (!requiredPolicy) return true; } - return this.store.select(ConfigState.getGrantedPolicy(resource)).pipe( + return this.store.select(ConfigState.getGrantedPolicy(requiredPolicy)).pipe( tap(access => { if (!access) { this.store.dispatch(new RestOccurError({ status: 403 })); diff --git a/npm/ng-packs/packages/core/src/lib/utils/route-utils.ts b/npm/ng-packs/packages/core/src/lib/utils/route-utils.ts index 57ffdd5285..5c98a929e7 100644 --- a/npm/ng-packs/packages/core/src/lib/utils/route-utils.ts +++ b/npm/ng-packs/packages/core/src/lib/utils/route-utils.ts @@ -17,9 +17,9 @@ export function findRoute(routes: RoutesService, path: string): TreeNode path).join('/'); } From b254f6dff2a1166ee333e663c3a5248fff757ea5 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Tue, 7 Jul 2020 15:39:01 +0300 Subject: [PATCH 56/58] fix: localization problem in dynamic layout when language changed --- .../lib/components/dynamic-layout.component.ts | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/npm/ng-packs/packages/core/src/lib/components/dynamic-layout.component.ts b/npm/ng-packs/packages/core/src/lib/components/dynamic-layout.component.ts index 49a0868967..bd09876ba6 100644 --- a/npm/ng-packs/packages/core/src/lib/components/dynamic-layout.component.ts +++ b/npm/ng-packs/packages/core/src/lib/components/dynamic-layout.component.ts @@ -1,9 +1,10 @@ -import { Component, Injector, OnDestroy, Type, Optional, SkipSelf } from '@angular/core'; +import { Component, Injector, OnDestroy, Optional, SkipSelf, Type } from '@angular/core'; import { ActivatedRoute, NavigationEnd, Router } from '@angular/router'; import { Store } from '@ngxs/store'; import { eLayoutType } from '../enums/common'; import { ABP } from '../models'; import { ReplaceableComponents } from '../models/replaceable-components'; +import { LocalizationService } from '../services/localization.service'; import { RoutesService } from '../services/routes.service'; import { ReplaceableComponentsState } from '../states/replaceable-components.state'; import { findRoute, getRoutePath } from '../utils/route-utils'; @@ -16,15 +17,18 @@ import { TreeNode } from '../utils/tree-utils'; `, }) export class DynamicLayoutComponent implements OnDestroy { layout: Type; + isLayoutShow = true; + constructor( injector: Injector, + private localizationService: LocalizationService, private store: Store, @Optional() @SkipSelf() dynamicLayoutComponent: DynamicLayoutComponent, ) { @@ -61,6 +65,15 @@ export class DynamicLayoutComponent implements OnDestroy { this.layout = layouts[expectedLayout].component; } }); + + this.listenToLanguageChange(); + } + + private listenToLanguageChange() { + this.localizationService.languageChange.pipe(takeUntilDestroy(this)).subscribe(() => { + this.isLayoutShow = false; + setTimeout(() => (this.isLayoutShow = true), 0); + }); } private getComponent(key: string): ReplaceableComponents.ReplaceableComponent { From caa822ed6f0e7023b86d16e3d2644350b9db609a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Levent=20Arman=20=C3=96zak?= Date: Tue, 7 Jul 2020 15:45:00 +0300 Subject: [PATCH 57/58] style: replace isLayoutShow with isLayoutVisible --- .../core/src/lib/components/dynamic-layout.component.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/npm/ng-packs/packages/core/src/lib/components/dynamic-layout.component.ts b/npm/ng-packs/packages/core/src/lib/components/dynamic-layout.component.ts index bd09876ba6..2548cfece6 100644 --- a/npm/ng-packs/packages/core/src/lib/components/dynamic-layout.component.ts +++ b/npm/ng-packs/packages/core/src/lib/components/dynamic-layout.component.ts @@ -17,14 +17,14 @@ import { TreeNode } from '../utils/tree-utils'; `, }) export class DynamicLayoutComponent implements OnDestroy { layout: Type; - isLayoutShow = true; + isLayoutVisible = true; constructor( injector: Injector, @@ -71,8 +71,8 @@ export class DynamicLayoutComponent implements OnDestroy { private listenToLanguageChange() { this.localizationService.languageChange.pipe(takeUntilDestroy(this)).subscribe(() => { - this.isLayoutShow = false; - setTimeout(() => (this.isLayoutShow = true), 0); + this.isLayoutVisible = false; + setTimeout(() => (this.isLayoutVisible = true), 0); }); } From a5a641fb71d4492708e7afde86f5ad6b3d747e3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Levent=20Arman=20=C3=96zak?= Date: Tue, 7 Jul 2020 15:48:19 +0300 Subject: [PATCH 58/58] refactor: use default value for url paramater --- npm/ng-packs/packages/core/src/lib/utils/route-utils.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/npm/ng-packs/packages/core/src/lib/utils/route-utils.ts b/npm/ng-packs/packages/core/src/lib/utils/route-utils.ts index 5c98a929e7..a749090695 100644 --- a/npm/ng-packs/packages/core/src/lib/utils/route-utils.ts +++ b/npm/ng-packs/packages/core/src/lib/utils/route-utils.ts @@ -17,9 +17,9 @@ export function findRoute(routes: RoutesService, path: string): TreeNode path).join('/'); }

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 literal 0 HcmV?d00001 From e1f1c2642fcf739ff177661b14f04fd08d21f36b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Sat, 4 Jul 2020 23:36:55 +0300 Subject: [PATCH 11/58] Update Part-3.md --- docs/en/Tutorials/Part-3.md | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/docs/en/Tutorials/Part-3.md b/docs/en/Tutorials/Part-3.md index 14822c9fe2..b9b00a8ece 100644 --- a/docs/en/Tutorials/Part-3.md +++ b/docs/en/Tutorials/Part-3.md @@ -1,4 +1,4 @@ -## ASP.NET Core {{UI_Value}} Tutorial - Part 3 +# ASP.NET Core {{UI_Value}} Tutorial - Part 3 ````json //[doc-params] { @@ -21,15 +21,18 @@ else end }} -### About this tutorial +## About This Tutorial -This is the third part of the ASP.NET Core {{UI_Value}} tutorial series. See all parts: +In this tutorial series, you will build an ABP based web application named `Acme.BookStore`. This application is used to manage a list of books and their authors. It is developed using the following technologies: -- [Part I: Creating the project and book list page](part-1.md) -- [Part II: Creating, updating and deleting books](part-2.md) -- **Part III: Integration tests (this tutorial)** +* **{{DB_Text}}** as the ORM provider. +* **{{UI_Value}}** as the UI Framework. + +This tutorial is organized as the following parts; -*You can also check out [the video course](https://amazingsolutions.teachable.com/p/lets-build-the-bookstore-application) prepared by the community, based on this tutorial.* +- [Part I: Creating the project and book list page](part-1.md) +- [Part-2: Creating, updating and deleting books](Part-2.md) +- **Part-3: Integration tests (this part)** ### Test projects in the solution From 85cd10ef31b2cf548cb0699124b79b84c443e18f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Sun, 5 Jul 2020 00:04:04 +0300 Subject: [PATCH 12/58] Completed the 3rd part of the tutorial. --- docs/en/Tutorials/Part-3.md | 155 ++++++++++++++++++++++-------------- 1 file changed, 94 insertions(+), 61 deletions(-) diff --git a/docs/en/Tutorials/Part-3.md b/docs/en/Tutorials/Part-3.md index b9b00a8ece..92be05f73a 100644 --- a/docs/en/Tutorials/Part-3.md +++ b/docs/en/Tutorials/Part-3.md @@ -34,7 +34,7 @@ This tutorial is organized as the following parts; - [Part-2: Creating, updating and deleting books](Part-2.md) - **Part-3: Integration tests (this part)** -### Test projects in the solution +## Test Projects in the Solution This part covers the **server side** tests. There are several test projects in the solution: @@ -46,76 +46,31 @@ Each project is used to test the related project. Test projects use the followin * [Shoudly](http://shouldly.readthedocs.io/en/latest/) as the assertion library. * [NSubstitute](http://nsubstitute.github.io/) as the mocking library. -### Adding test data +{{if DB="ef"}} -Startup template contains the `BookStoreTestDataBuilder` class in the `Acme.BookStore.TestBase` project which creates initial data to run tests. Change the content of `BookStoreTestDataSeedContributor` class as show below: +> The test projects are configured to use **SQLite in-memory** as the database. A separate database instance is created and seeded (with the data seed system) to prepare a fresh database for every test. -````csharp -using System; -using System.Threading.Tasks; -using Volo.Abp.Data; -using Volo.Abp.DependencyInjection; -using Volo.Abp.Domain.Repositories; -using Volo.Abp.Guids; +{{else if DB="mongodb"}} -namespace Acme.BookStore -{ - public class BookStoreTestDataSeedContributor - : IDataSeedContributor, ITransientDependency - { - private readonly IRepository _bookRepository; - private readonly IGuidGenerator _guidGenerator; +> **[Mongo2Go](https://github.com/Mongo2Go/Mongo2Go)** library is used to mock the MongoDB database. A separate database instance is created and seeded (with the data seed system) to prepare a fresh database for every test. - public BookStoreTestDataSeedContributor( - IRepository bookRepository, - IGuidGenerator guidGenerator) - { - _bookRepository = bookRepository; - _guidGenerator = guidGenerator; - } +{{end}} - public async Task SeedAsync(DataSeedContext context) - { - await _bookRepository.InsertAsync( - new Book(id: _guidGenerator.Create(), - name: "Test book 1", - type: BookType.Fantastic, - publishDate: new DateTime(2015, 05, 24), - price: 21 - ) - ); +## Adding Test Data - await _bookRepository.InsertAsync( - new Book(id: _guidGenerator.Create(), - name: "Test book 2", - type: BookType.Science, - publishDate: new DateTime(2014, 02, 11), - price: 15 - ) - ); - } - } -} -```` - -* `IRepository` is injected and used it in the `SeedAsync` to create two book entities as the test data. -* `IGuidGenerator` is injected to create GUIDs. While `Guid.NewGuid()` would perfectly work for testing, `IGuidGenerator` has additional features especially important while using real databases. Further information, see the [Guid generation document](../Guid-Generation.md). +If you had created a data seed contributor as described in the [first part](Part-1.md), the same data will be available in your tests. So, you can skip this section. If you haven't created the seed contributor, you can use the `BookStoreTestDataSeedContributor` to seed the same data to be used in the tests below. -### Testing the application service BookAppService +## Testing The Application Service: BookAppService Create a test class named `BookAppService_Tests` in the `Acme.BookStore.Application.Tests` project: ````csharp -using System; -using System.Linq; using System.Threading.Tasks; -using Xunit; using Shouldly; using Volo.Abp.Application.Dtos; -using Volo.Abp.Validation; -using Microsoft.EntityFrameworkCore.Internal; +using Xunit; -namespace Acme.BookStore +namespace Acme.BookStore.Books { public class BookAppService_Tests : BookStoreApplicationTestBase { @@ -136,15 +91,16 @@ namespace Acme.BookStore //Assert result.TotalCount.ShouldBeGreaterThan(0); - result.Items.ShouldContain(b => b.Name == "Test book 1"); + result.Items.ShouldContain(b => b.Name == "1984"); } } } ```` -* `Should_Get_List_Of_Books` test simply uses `BookAppService.GetListAsync` method to get and check the list of users. +* `Should_Get_List_Of_Books` test simply uses `BookAppService.GetListAsync` method to get and check the list of books. +* We can safely check the book "1984" by its name, because we know that this books is available in the database since we've added it in the seed data. -Add a new test that creates a valid new book: +Add a new test method to the `BookAppService_Tests` class that creates a new **valid** book: ````csharp [Fact] @@ -173,7 +129,7 @@ Add a new test that tries to create an invalid book and fails: [Fact] public async Task Should_Not_Create_A_Book_Without_Name() { - var exception = await Assert.ThrowsAsync(async () => + var exception = await Assert.ThrowsAsync(async () => { await _bookAppService.CreateAsync( new CreateUpdateBookDto @@ -193,9 +149,86 @@ public async Task Should_Not_Create_A_Book_Without_Name() * Since the `Name` is empty, ABP will throw an `AbpValidationException`. +The final test class should be as shown below: + +````csharp +using System; +using System.Linq; +using System.Threading.Tasks; +using Shouldly; +using Volo.Abp.Application.Dtos; +using Volo.Abp.Validation; +using Xunit; + +namespace Acme.BookStore.Books +{ + public class BookAppService_Tests : BookStoreApplicationTestBase + { + private readonly IBookAppService _bookAppService; + + public BookAppService_Tests() + { + _bookAppService = GetRequiredService(); + } + + [Fact] + public async Task Should_Get_List_Of_Books() + { + //Act + var result = await _bookAppService.GetListAsync( + new PagedAndSortedResultRequestDto() + ); + + //Assert + result.TotalCount.ShouldBeGreaterThan(0); + result.Items.ShouldContain(b => b.Name == "1984"); + } + + [Fact] + public async Task Should_Create_A_Valid_Book() + { + //Act + var result = await _bookAppService.CreateAsync( + new CreateUpdateBookDto + { + Name = "New test book 42", + Price = 10, + PublishDate = System.DateTime.Now, + Type = BookType.ScienceFiction + } + ); + + //Assert + result.Id.ShouldNotBe(Guid.Empty); + result.Name.ShouldBe("New test book 42"); + } + + [Fact] + public async Task Should_Not_Create_A_Book_Without_Name() + { + var exception = await Assert.ThrowsAsync(async () => + { + await _bookAppService.CreateAsync( + new CreateUpdateBookDto + { + Name = "", + Price = 10, + PublishDate = DateTime.Now, + Type = BookType.ScienceFiction + } + ); + }); + + exception.ValidationErrors + .ShouldContain(err => err.MemberNames.Any(mem => mem == "Name")); + } + } +} +```` + Open the **Test Explorer Window** (use Test -> Windows -> Test Explorer menu if it is not visible) and **Run All** tests: ![bookstore-appservice-tests](./images/bookstore-appservice-tests.png) -Congratulations, the green icons show, the tests have been successfully passed! +Congratulations, the **green icons** indicates that the tests have been successfully passed! From 12200857c0fcbb071dacf50889985e8d9e0e8a3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Sun, 5 Jul 2020 00:32:59 +0300 Subject: [PATCH 13/58] Update tutorial to fix the paging. --- docs/en/Tutorials/Part-1.md | 86 ++++----- docs/en/Tutorials/Part-2.md | 341 +++++++++++++++++++----------------- 2 files changed, 220 insertions(+), 207 deletions(-) diff --git a/docs/en/Tutorials/Part-1.md b/docs/en/Tutorials/Part-1.md index 00e0852d37..9279a53298 100644 --- a/docs/en/Tutorials/Part-1.md +++ b/docs/en/Tutorials/Part-1.md @@ -702,50 +702,52 @@ $(function () { var dataTable = $('#BooksTable').DataTable( abp.libs.datatables.normalizeConfiguration({ - ajax: abp.libs.datatables.createAjax(acme.bookStore.books.book.getList), - columnDefs: [ - { - title: l('Name'), - data: "name" - }, - { - title: l('Type'), - data: "type", - render: function (data) { - console.log(data); - return l('Enum:BookType:' + data); - } - }, - { - title: l('PublishDate'), - data: "publishDate", - render: function (data) { - return luxon - .DateTime - .fromISO(data, { - locale: abp.localization.currentCulture.name - }).toLocaleString(); - } - }, - { - title: l('Price'), - data: "price" - }, - { - title: l('CreationTime'), data: "creationTime", - render: function (data) { - return luxon - .DateTime - .fromISO(data, { - locale: abp.localization.currentCulture.name - }).toLocaleString(luxon.DateTime.DATETIME_SHORT); - } + serverSide: true, + paging: true, + order: [[1, "asc"]], + searching: false, + scrollX: true, + ajax: abp.libs.datatables.createAjax(acme.bookStore.books.book.getList), + columnDefs: [ + { + title: l('Name'), + data: "name" + }, + { + title: l('Type'), + data: "type", + render: function (data) { + return l('Enum:BookType:' + data); } - ] - } - ) + }, + { + title: l('PublishDate'), + data: "publishDate", + render: function (data) { + return luxon + .DateTime + .fromISO(data, { + locale: abp.localization.currentCulture.name + }).toLocaleString(); + } + }, + { + title: l('Price'), + data: "price" + }, + { + title: l('CreationTime'), data: "creationTime", + render: function (data) { + return luxon + .DateTime + .fromISO(data, { + locale: abp.localization.currentCulture.name + }).toLocaleString(luxon.DateTime.DATETIME_SHORT); + } + } + ] + }) ); - }); ```` diff --git a/docs/en/Tutorials/Part-2.md b/docs/en/Tutorials/Part-2.md index 694d20ed09..dc0a222ea1 100644 --- a/docs/en/Tutorials/Part-2.md +++ b/docs/en/Tutorials/Part-2.md @@ -207,47 +207,51 @@ $(function () { var dataTable = $('#BooksTable').DataTable( abp.libs.datatables.normalizeConfiguration({ - ajax: abp.libs.datatables.createAjax(acme.bookStore.books.book.getList), - columnDefs: [ - { - title: l('Name'), - data: "name" - }, - { - title: l('Type'), - data: "type", - render: function (data) { - return l('Enum:BookType:' + data); - } - }, - { - title: l('PublishDate'), - data: "publishDate", - render: function (data) { - return luxon - .DateTime - .fromISO(data, { - locale: abp.localization.currentCulture.name - }).toLocaleString(); - } - }, - { - title: l('Price'), - data: "price" - }, - { - title: l('CreationTime'), data: "creationTime", - render: function (data) { - return luxon - .DateTime - .fromISO(data, { - locale: abp.localization.currentCulture.name - }).toLocaleString(luxon.DateTime.DATETIME_SHORT); - } + serverSide: true, + paging: true, + order: [[1, "asc"]], + searching: false, + scrollX: true, + ajax: abp.libs.datatables.createAjax(acme.bookStore.books.book.getList), + columnDefs: [ + { + title: l('Name'), + data: "name" + }, + { + title: l('Type'), + data: "type", + render: function (data) { + return l('Enum:BookType:' + data); } - ] - } - ) + }, + { + title: l('PublishDate'), + data: "publishDate", + render: function (data) { + return luxon + .DateTime + .fromISO(data, { + locale: abp.localization.currentCulture.name + }).toLocaleString(); + } + }, + { + title: l('Price'), + data: "price" + }, + { + title: l('CreationTime'), data: "creationTime", + render: function (data) { + return luxon + .DateTime + .fromISO(data, { + locale: abp.localization.currentCulture.name + }).toLocaleString(luxon.DateTime.DATETIME_SHORT); + } + } + ] + }) ); var createModal = new abp.ModalManager(abp.appPath + 'Books/CreateModal'); @@ -260,7 +264,6 @@ $(function () { e.preventDefault(); createModal.open(); }); - }); ```` @@ -388,61 +391,65 @@ $(function () { var dataTable = $('#BooksTable').DataTable( abp.libs.datatables.normalizeConfiguration({ - ajax: abp.libs.datatables.createAjax(acme.bookStore.books.book.getList), - columnDefs: [ - { - title: l('Actions'), - rowAction: { - items: - [ - { - text: l('Edit'), - action: function (data) { - editModal.open({ id: data.record.id }); - } + serverSide: true, + paging: true, + order: [[1, "asc"]], + searching: false, + scrollX: true, + ajax: abp.libs.datatables.createAjax(acme.bookStore.books.book.getList), + columnDefs: [ + { + title: l('Actions'), + rowAction: { + items: + [ + { + text: l('Edit'), + action: function (data) { + editModal.open({ id: data.record.id }); } - ] - } - }, - { - title: l('Name'), - data: "name" - }, - { - title: l('Type'), - data: "type", - render: function (data) { - return l('Enum:BookType:' + data); - } - }, - { - title: l('PublishDate'), - data: "publishDate", - render: function (data) { - return luxon - .DateTime - .fromISO(data, { - locale: abp.localization.currentCulture.name - }).toLocaleString(); - } - }, - { - title: l('Price'), - data: "price" - }, - { - title: l('CreationTime'), data: "creationTime", - render: function (data) { - return luxon - .DateTime - .fromISO(data, { - locale: abp.localization.currentCulture.name - }).toLocaleString(luxon.DateTime.DATETIME_SHORT); - } + } + ] + } + }, + { + title: l('Name'), + data: "name" + }, + { + title: l('Type'), + data: "type", + render: function (data) { + return l('Enum:BookType:' + data); + } + }, + { + title: l('PublishDate'), + data: "publishDate", + render: function (data) { + return luxon + .DateTime + .fromISO(data, { + locale: abp.localization.currentCulture.name + }).toLocaleString(); } - ] - } - ) + }, + { + title: l('Price'), + data: "price" + }, + { + title: l('CreationTime'), data: "creationTime", + render: function (data) { + return luxon + .DateTime + .fromISO(data, { + locale: abp.localization.currentCulture.name + }).toLocaleString(luxon.DateTime.DATETIME_SHORT); + } + } + ] + }) ); createModal.onResult(function () { @@ -513,80 +520,84 @@ $(function () { var dataTable = $('#BooksTable').DataTable( abp.libs.datatables.normalizeConfiguration({ - ajax: abp.libs.datatables.createAjax(acme.bookStore.books.book.getList), - columnDefs: [ - { - title: l('Actions'), - rowAction: { - items: - [ - { - text: l('Edit'), - action: function (data) { - editModal.open({ id: data.record.id }); - } + serverSide: true, + paging: true, + order: [[1, "asc"]], + searching: false, + scrollX: true, + ajax: abp.libs.datatables.createAjax(acme.bookStore.books.book.getList), + columnDefs: [ + { + title: l('Actions'), + rowAction: { + items: + [ + { + text: l('Edit'), + action: function (data) { + editModal.open({ id: data.record.id }); + } + }, + { + text: l('Delete'), + confirmMessage: function (data) { + return l( + 'BookDeletionConfirmationMessage', + data.record.name + ); }, - { - text: l('Delete'), - confirmMessage: function (data) { - return l( - 'BookDeletionConfirmationMessage', - data.record.name - ); - }, - action: function (data) { - acme.bookStore.books.book - .delete(data.record.id) - .then(function() { - abp.notify.info( - l('SuccessfullyDeleted') - ); - dataTable.ajax.reload(); - }); - } + action: function (data) { + acme.bookStore.books.book + .delete(data.record.id) + .then(function() { + abp.notify.info( + l('SuccessfullyDeleted') + ); + dataTable.ajax.reload(); + }); } - ] - } - }, - { - title: l('Name'), - data: "name" - }, - { - title: l('Type'), - data: "type", - render: function (data) { - return l('Enum:BookType:' + data); - } - }, - { - title: l('PublishDate'), - data: "publishDate", - render: function (data) { - return luxon - .DateTime - .fromISO(data, { - locale: abp.localization.currentCulture.name - }).toLocaleString(); - } - }, - { - title: l('Price'), - data: "price" - }, - { - title: l('CreationTime'), data: "creationTime", - render: function (data) { - return luxon - .DateTime - .fromISO(data, { - locale: abp.localization.currentCulture.name - }).toLocaleString(luxon.DateTime.DATETIME_SHORT); - } + } + ] + } + }, + { + title: l('Name'), + data: "name" + }, + { + title: l('Type'), + data: "type", + render: function (data) { + return l('Enum:BookType:' + data); + } + }, + { + title: l('PublishDate'), + data: "publishDate", + render: function (data) { + return luxon + .DateTime + .fromISO(data, { + locale: abp.localization.currentCulture.name + }).toLocaleString(); + } + }, + { + title: l('Price'), + data: "price" + }, + { + title: l('CreationTime'), data: "creationTime", + render: function (data) { + return luxon + .DateTime + .fromISO(data, { + locale: abp.localization.currentCulture.name + }).toLocaleString(luxon.DateTime.DATETIME_SHORT); } - ] - } - ) + } + ] + }) ); createModal.onResult(function () { From df510ffa30caa9ba2dcf542f42327fc208823507 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Sun, 5 Jul 2020 14:17:04 +0300 Subject: [PATCH 14/58] Added source code --- docs/en/Tutorials/Part-2.md | 4 ++++ docs/en/Tutorials/Part-3.md | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/docs/en/Tutorials/Part-2.md b/docs/en/Tutorials/Part-2.md index dc0a222ea1..289d74e847 100644 --- a/docs/en/Tutorials/Part-2.md +++ b/docs/en/Tutorials/Part-2.md @@ -34,6 +34,10 @@ This tutorial is organized as the following parts; - **Part-2: Creating, updating and deleting books (this part)** - [Part-3: Integration tests](part-3.md) +### Source Code + +You can find the completed solution on {{if UI == "MVC"}}[the GitHub repository](https://github.com/abpframework/abp-samples/tree/master/BookStore-Mvc-EfCore){{else}}[the GitHub repository](https://github.com/abpframework/abp-samples/tree/master/BookStore-Angular-MongoDb){{end}}. + {{if UI == "MVC"}} ## Creating a New Book diff --git a/docs/en/Tutorials/Part-3.md b/docs/en/Tutorials/Part-3.md index 92be05f73a..fce9fe243d 100644 --- a/docs/en/Tutorials/Part-3.md +++ b/docs/en/Tutorials/Part-3.md @@ -34,6 +34,10 @@ This tutorial is organized as the following parts; - [Part-2: Creating, updating and deleting books](Part-2.md) - **Part-3: Integration tests (this part)** +### Source Code + +You can find the completed solution on {{if UI == "MVC"}}[the GitHub repository](https://github.com/abpframework/abp-samples/tree/master/BookStore-Mvc-EfCore){{else}}[the GitHub repository](https://github.com/abpframework/abp-samples/tree/master/BookStore-Angular-MongoDb){{end}}. + ## Test Projects in the Solution This part covers the **server side** tests. There are several test projects in the solution: From d8957fe5dc8b7f8f868c329dff504d0ac0d87158 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Sun, 5 Jul 2020 15:31:20 +0300 Subject: [PATCH 15/58] Added authorization part --- docs/en/Tutorials/Part-4.md | 226 ++++++++++++++++++ .../images/bookstore-edit-delete-actions.png | Bin 0 -> 12396 bytes .../images/bookstore-permissions-ui.png | Bin 0 -> 58971 bytes 3 files changed, 226 insertions(+) create mode 100644 docs/en/Tutorials/Part-4.md create mode 100644 docs/en/Tutorials/images/bookstore-edit-delete-actions.png create mode 100644 docs/en/Tutorials/images/bookstore-permissions-ui.png diff --git a/docs/en/Tutorials/Part-4.md b/docs/en/Tutorials/Part-4.md new file mode 100644 index 0000000000..53aa15278f --- /dev/null +++ b/docs/en/Tutorials/Part-4.md @@ -0,0 +1,226 @@ +# ASP.NET Core {{UI_Value}} Tutorial - Part 4 +````json +//[doc-params] +{ + "UI": ["MVC","NG"] +} +```` + +{{ +if UI == "MVC" + DB="ef" + DB_Text="Entity Framework Core" + UI_Text="mvc" +else if UI == "NG" + DB="mongodb" + DB_Text="MongoDB" + UI_Text="angular" +else + DB ="?" + UI_Text="?" +end +}} + +## About This Tutorial + +In this tutorial series, you will build an ABP based web application named `Acme.BookStore`. This application is used to manage a list of books and their authors. It is developed using the following technologies: + +* **{{DB_Text}}** as the ORM provider. +* **{{UI_Value}}** as the UI Framework. + +This tutorial is organized as the following parts; + +- [Part I: Creating the project and book list page](part-1.md) +- [Part-2: Creating, updating and deleting books](Part-2.md) +- [Part-3: Integration tests](Part-3.md) +- **Part-4: Authorization (this part)** + +### Source Code + +You can find the completed solution on {{if UI == "MVC"}}[the GitHub repository](https://github.com/abpframework/abp-samples/tree/master/BookStore-Mvc-EfCore){{else}}[the GitHub repository](https://github.com/abpframework/abp-samples/tree/master/BookStore-Angular-MongoDb){{end}}. + +## Permissions + +ABP Framework provides an [authorization system](../Authorization.md) based on the ASP.NET Core's [authorization infrastructure](https://docs.microsoft.com/en-us/aspnet/core/security/authorization/introduction). One major feature added on top of the standard authorization infrastructure is the **permission system** which allows to define permissions and enable/disable per role, user or client. + +### Permission Names + +A permission must have a unique name (a `string`). The best way is to define it as a `const`, so we can reuse the permission name. + +Open the `BookStorePermissions` class and change the content as shown below: + +````csharp +namespace Acme.BookStore.Permissions +{ + public static class BookStorePermissions + { + public const string GroupName = "BookStore"; + + public static class Books + { + public const string Default = GroupName + ".Books"; + public const string Create = Default + ".Create"; + public const string Edit = Default + ".Edit"; + public const string Delete = Default + ".Delete"; + } + } +} +```` + +This is a hierarchical way of defining permission names. For example, "create book" permission name was defined as `BookStore.Books.Create`. + +### Permission Definitions + +You should define permissions before using them. + +Open the `BookStorePermissionDefinitionProvider` class inside the `Acme.BookStore.Application.Contracts` project and change the content as shown below: + +````csharp +using Acme.BookStore.Localization; +using Volo.Abp.Authorization.Permissions; +using Volo.Abp.Localization; + +namespace Acme.BookStore.Permissions +{ + public class BookStorePermissionDefinitionProvider : PermissionDefinitionProvider + { + public override void Define(IPermissionDefinitionContext context) + { + var bookStoreGroup = context.AddGroup(BookStorePermissions.GroupName, L("Permission:BookStore")); + + var booksPermission = bookStoreGroup.AddPermission(BookStorePermissions.Books.Default, L("Permission:Books")); + booksPermission.AddChild(BookStorePermissions.Books.Create, L("Permission:Books.Create")); + booksPermission.AddChild(BookStorePermissions.Books.Edit, L("Permission:Books.Edit")); + booksPermission.AddChild(BookStorePermissions.Books.Delete, L("Permission:Books.Delete")); + } + + private static LocalizableString L(string name) + { + return LocalizableString.Create(name); + } + } +} +```` + +This class defines a **permission group** (to group permissions on the UI, will be seen below) and **4 permissions** inside this group. Also, **Create**, **Edit** and **Delete** are children of the `BookStorePermissions.Books.Default` permission. A child permission can be selected **only if the parent was selected**. + +Finally, edit the localization file (`en.json` under the `Localization/BookStore` folder of the `Acme.BookStore.Domain.Shared` project) to define the localization keys used above: + +````json +"Permission:BookStore": "Book Store", +"Permission:Books": "Book Management", +"Permission:Books.Create": "Creating new books", +"Permission:Books.Edit": "Editing the books", +"Permission:Books.Delete": "Deleting the books" +```` + +> Localization key names are arbitrary and no forcing rule. But we prefer the convention used above. + +### Permission Management UI + +Once you define the permissions, you can see them on the **permission management modal**. + +Go to the *Administration -> Identity -> Roles* page, select *Permissions* action for the admin role to open the permission management modal: + +![bookstore-permissions-ui](images/bookstore-permissions-ui.png) + +Grant the permissions you want and save the modal. + +## Authorization + +Now, you can use the permissions to authorize the book management. + +### Application Layer & HTTP API + +Open the `BookAppService` class and add set the policy names as the permission names defined above: + +````csharp +using System; +using Acme.BookStore.Permissions; +using Volo.Abp.Application.Dtos; +using Volo.Abp.Application.Services; +using Volo.Abp.Domain.Repositories; + +namespace Acme.BookStore.Books +{ + public class BookAppService : + CrudAppService< + Book, //The Book entity + BookDto, //Used to show books + Guid, //Primary key of the book entity + PagedAndSortedResultRequestDto, //Used for paging/sorting + CreateUpdateBookDto>, //Used to create/update a book + IBookAppService //implement the IBookAppService + { + public BookAppService(IRepository repository) + : base(repository) + { + GetPolicyName = BookStorePermissions.Books.Default; + GetListPolicyName = BookStorePermissions.Books.Default; + CreatePolicyName = BookStorePermissions.Books.Create; + UpdatePolicyName = BookStorePermissions.Books.Edit; + DeletePolicyName = BookStorePermissions.Books.Create; + } + } +} +```` + +Added code to the constructor. Base `CrudAppService` automatically uses these permissions on the CRUD operations. This makes the **application service** secure, but also makes the **HTTP API** secure since this service is automatically used as an HTTP API as explained before (see [auto API controllers](../API/Auto-API-Controllers.md)). + +{{if UI == "MVC"}} + +### Razor Page + +While securing the HTTP API & the application service prevents unauthorized users to use the services, they can still navigate to the book management page. While they will get authorization exceptions when the page makes the first AJAX call to the server, we should also authorize the page for a better user experience and security. + +Open the `BookStoreWebModule` and add the following code block inside the `ConfigureServices` method: + +````csharp +Configure(options => +{ + options.Conventions.AuthorizePage("/Books/Index", BookStorePermissions.Books.Default); + options.Conventions.AuthorizePage("/Books/CreateModal", BookStorePermissions.Books.Create); + options.Conventions.AuthorizePage("/Books/EditModal", BookStorePermissions.Books.Edit); +}); +```` + +Now, unauthorized users are redirected to the **login page**. + +### JavaScript Side + +Books table in the book management page has an actions button for each row. The actions button includes *Edit* and *Delete* action: + +![bookstore-edit-delete-actions](images/bookstore-edit-delete-actions.png) + +We should hide an action if the current user has not granted for the related permission. Datatables row actions has a `visible` option that can be set to `false` to hide the action item. + +Open the `Pages/Books/Index.js` inside the `Acme.BookStore.Web` project and add a `visible` option to the `Edit` action as shown below: + +````js +{ + text: l('Edit'), + visible: abp.auth.isGranted('BookStore.Books.Edit'), //CHECK for the PERMISSION + action: function (data) { + editModal.open({ id: data.record.id }); + } +} +```` + +Do same for the `Delete` action: + +````js +visible: abp.auth.isGranted('BookStore.Books.Delete') +```` + +* `abp.auth.isGranted(...)` is used to check a permission that is defined before. +* `visible` could also be get a function that returns a `bool` if the value will be calculated later, based on some conditions. + +### Menu Item + +Even we secured all layers of the book management page, it is still visible on the main menu of the application. + +{{else if UI == "NG"}} + +***Angular UI authorization document is being prepared...*** + +{{end}} \ No newline at end of file diff --git a/docs/en/Tutorials/images/bookstore-edit-delete-actions.png b/docs/en/Tutorials/images/bookstore-edit-delete-actions.png new file mode 100644 index 0000000000000000000000000000000000000000..9c275c6d15a0737498098b4c3ff2cafebd648595 GIT binary patch literal 12396 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 literal 0 HcmV?d00001 diff --git a/docs/en/Tutorials/images/bookstore-permissions-ui.png b/docs/en/Tutorials/images/bookstore-permissions-ui.png new file mode 100644 index 0000000000000000000000000000000000000000..749f7a013f72763af7759101d83b50b47527f76c GIT binary patch literal 58971 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 W=F2m#l*5w%7|~GCQLcM#8~GoxzB@et literal 0 HcmV?d00001 From c95f8ff88ba4c2a84e840023110de1ab2651cedb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Sun, 5 Jul 2020 16:48:33 +0300 Subject: [PATCH 16/58] Complete the part 4 for the mvc UI --- docs/en/Tutorials/Part-4.md | 93 +++++++++++++++++- .../bookstore-new-book-button-small.png | Bin 0 -> 3005 bytes 2 files changed, 91 insertions(+), 2 deletions(-) create mode 100644 docs/en/Tutorials/images/bookstore-new-book-button-small.png diff --git a/docs/en/Tutorials/Part-4.md b/docs/en/Tutorials/Part-4.md index 53aa15278f..43523440db 100644 --- a/docs/en/Tutorials/Part-4.md +++ b/docs/en/Tutorials/Part-4.md @@ -171,7 +171,7 @@ Added code to the constructor. Base `CrudAppService` automatically uses these pe ### Razor Page -While securing the HTTP API & the application service prevents unauthorized users to use the services, they can still navigate to the book management page. While they will get authorization exceptions when the page makes the first AJAX call to the server, we should also authorize the page for a better user experience and security. +While securing the HTTP API & the application service prevents unauthorized users to use the services, they can still navigate to the book management page. While they will get authorization exception when the page makes the first AJAX call to the server, we should also authorize the page for a better user experience and security. Open the `BookStoreWebModule` and add the following code block inside the `ConfigureServices` method: @@ -186,6 +186,55 @@ Configure(options => Now, unauthorized users are redirected to the **login page**. +#### Hide the New Book Button + +The book management page has a *New Book* button that should be invisible if the current user has no *Book Creation* permission. + +![bookstore-new-book-button-small](images/bookstore-new-book-button-small.png) + +Open the `Pages/Books/Index.cshtml` file and change the content as shown below: + +````html +@page +@using Acme.BookStore.Localization +@using Acme.BookStore.Permissions +@using Acme.BookStore.Web.Pages.Books +@using Microsoft.AspNetCore.Authorization +@using Microsoft.Extensions.Localization +@model IndexModel +@inject IStringLocalizer L +@inject IAuthorizationService AuthorizationService +@section scripts +{ + +} + + + + + + @L["Books"] + + + @if (await AuthorizationService.IsGrantedAsync(BookStorePermissions.Books.Create)) + { + + } + + + + + + + +```` + +* Added `@inject IAuthorizationService AuthorizationService` to access to the authorization service. +* Used `@if (await AuthorizationService.IsGrantedAsync(BookStorePermissions.Books.Create))` to check the book creation permission to conditionally render the *New Book* button. + ### JavaScript Side Books table in the book management page has an actions button for each row. The actions button includes *Edit* and *Delete* action: @@ -217,7 +266,47 @@ visible: abp.auth.isGranted('BookStore.Books.Delete') ### Menu Item -Even we secured all layers of the book management page, it is still visible on the main menu of the application. +Even we have secured all the layers of the book management page, it is still visible on the main menu of the application. We should hide the menu item if the current user has no permission. + +Open the `BookStoreMenuContributor` class, find the code block below: + +````csharp +context.Menu.AddItem( + new ApplicationMenuItem( + "BooksStore", + l["Menu:BookStore"], + icon: "fa fa-book" + ).AddItem( + new ApplicationMenuItem( + "BooksStore.Books", + l["Menu:Books"], + url: "/Books" + ) + ) +); +```` + +And replace this code block with the following: + +````csharp +var bookStoreMenu = new ApplicationMenuItem( + "BooksStore", + l["Menu:BookStore"], + icon: "fa fa-book" +); + +context.Menu.AddItem(bookStoreMenu); + +//CHECK the PERMISSION +if (await context.IsGrantedAsync(BookStorePermissions.Books.Default)) +{ + bookStoreMenu.AddItem(new ApplicationMenuItem( + "BooksStore.Books", + l["Menu:Books"], + url: "/Books" + )); +} +```` {{else if UI == "NG"}} diff --git a/docs/en/Tutorials/images/bookstore-new-book-button-small.png b/docs/en/Tutorials/images/bookstore-new-book-button-small.png new file mode 100644 index 0000000000000000000000000000000000000000..13f7da9285c92a9ee1476cd12cd66d2499d652f3 GIT binary patch literal 3005 zcmbuBXEYm(8pmSZP8M*Rl7#SD2ZKa*C>(DQX@#!2tlpdI|wxz-%lfYOKFwFt;t`x)q+F;CM;-8fp$Os5xS z;56&g1I(uo_?Qvb>8wC5#lti0g`+-@GVrV^UnjFI@0zRKEnu?k`yk7^uk~OY3eV}f zML6DmPSH%7ALUT$5BEQ zL80St+u$mC;S_iOvkXiekuAg}YXpkpEoFkSm`4glOK5@G{^q)NR=KqE`lT$}l|!TT zlcPOSH(hMC7;deq$>Du}7JU5niE_C}k)FJA(V@4e%n~&?3pY7HTEj_lzlF<;#%Xi9 ziScz_h|&tzY+0igmz3DyhE~~XoOFs+Bzv}knj|D7{Ay}`dDn@smoUNb{VTh)MTdv3 z3O`owsKUetgJVeDP=cxEx%SyTeyiibFwf)8YEeWkuocrlx({npM z|K+yVGYH@-m!!@0G$G_xm88Aw9xF9YMn|QR&>iHQh`INnsp3c6>$c%(($Y{@PR7-y z5a*>GX9__@3)JzC{_fQ->7e})yg;Xk;iyx?)Q@%l+ebgJ+i`~lCGDRvxx*KbrVq32 zaP^k(@iAMsuP0ylWAOrvg-l2a&H&?H;(#aBAj%$^a&o%I1eG8M7MO2w$*R35sILmM zG(`q+gb5|w+fBs@B#D=C#a&8zqAxCVu3h=xmr6iMN!M~$`ij0c5)>QQaV@statdBa z?+PLCQeL`g*VWf959D=!ktZKPf&#~XQ~P`8*JXG7YKCTOK``E_M#ae+@16SCRgaes zO(D+&DHwiLHQDfn4*A*DVZKS(j=jfy0b4<d^nE<}G0Xsw_qzl4?4m_qez~L2Dsf zV(C$%(X~EUXS;;wJrGHkF+#YQ`b{|viO{gYlrfDH4xi+Y8hp}x*LO#aYruw!+P>nl zWiuzNVAQo9x&LjjcV=~R0{fj|@Q?%L>0-^P`$+9rY8KBA7b0u)P8? zo1l-7JdD)UAao$cB*7!zedrjJ;`QWE$5z!_rQ+fI8y+*^+!n#190l6W)l?5}$-mI$j#9&?${QW&>aGx_X4&&Y+PM*JCRe{csv#GQZ`cHtd? zEdB7_9(sPscva>AS9(>00AEg!66X>1n?)5T`EBJuI2PAF-%))WOaL`=#lsU;?5{JD`94f&+Amo#FK6_xR+ur?=Boq+B|)< z-j9ST4SN7DQ|gJxYieM5$*3B}t_>ZrT%~5O8JmaDec2hyW;*yM9`$CNZpViM;NV~Y zq~N~D?5XiUQPlQLulz3r0=b-hyVl1_YCj3y9#q;0;|CN3>m*nU${n`J)P7aYEY=B!)PAT4-Z_V%2YY&E((1G^C7dWve7v zHe3}2vmLdq9^l+i-R(C zM(AB67MF8twZP5@>flm;ga<=AMm(aa{h-Z=cfz&Fe>2DV=%A1ZZmD7=WbL=Ov^(=$ zfWzr$ezZiqH5wzx+4n1l7W}!*Ob5g)(m+PuQ6nz>35jBpek+pE``m5LU*uM%*Gn>* zHndj*a;6zJ&po#+0Ib30 zKm@2ASRW=&=`xsqjy*FR&t*dK#T$#NLGoU(0B;{YQL1M>R+(KRtMhT$IHqUs_R@H{SA*e1s zlZAZn0Tg;W>|=DYLC#oil%qK&ZG{#Z;75lptNIcHJO!Yqevwh^{rCo6$H2AGgv)n+-L`z>r z03+^FkSWO9_8awq<%{2IBk~_tJ`o*L&l9h0Y$+fW97@p<^=oYcCx(08B<-w0UBVJG z6GazFXGyV;oH Date: Sun, 5 Jul 2020 16:51:33 +0300 Subject: [PATCH 17/58] Added navigation links to the tutorial. --- docs/en/Tutorials/Part-1.md | 1 + docs/en/Tutorials/Part-2.md | 1 + docs/en/Tutorials/Part-3.md | 4 ++++ 3 files changed, 6 insertions(+) diff --git a/docs/en/Tutorials/Part-1.md b/docs/en/Tutorials/Part-1.md index 9279a53298..53745f9b59 100644 --- a/docs/en/Tutorials/Part-1.md +++ b/docs/en/Tutorials/Part-1.md @@ -32,6 +32,7 @@ This tutorial is organized as the following parts; - **Part-1: Creating the project and book list page (this part)** - [Part-2: Creating, updating and deleting books](part-2.md) - [Part-3: Integration tests](part-3.md) +- [Part-4: Authorization](Part-4.md) ### Source Code diff --git a/docs/en/Tutorials/Part-2.md b/docs/en/Tutorials/Part-2.md index 289d74e847..c744d85229 100644 --- a/docs/en/Tutorials/Part-2.md +++ b/docs/en/Tutorials/Part-2.md @@ -33,6 +33,7 @@ This tutorial is organized as the following parts; - [Part I: Creating the project and book list page](part-1.md) - **Part-2: Creating, updating and deleting books (this part)** - [Part-3: Integration tests](part-3.md) +- [Part-4: Authorization](Part-4.md) ### Source Code diff --git a/docs/en/Tutorials/Part-3.md b/docs/en/Tutorials/Part-3.md index fce9fe243d..22e3cd4a5b 100644 --- a/docs/en/Tutorials/Part-3.md +++ b/docs/en/Tutorials/Part-3.md @@ -33,6 +33,7 @@ This tutorial is organized as the following parts; - [Part I: Creating the project and book list page](part-1.md) - [Part-2: Creating, updating and deleting books](Part-2.md) - **Part-3: Integration tests (this part)** +- [Part-4: Authorization](Part-4.md) ### Source Code @@ -236,3 +237,6 @@ Open the **Test Explorer Window** (use Test -> Windows -> Test Explorer menu if Congratulations, the **green icons** indicates that the tests have been successfully passed! +## Next Part + +See the [next part](part-4.md) of this tutorial. \ No newline at end of file From 8e9344db1e14633e5b73defea39f291940ad52ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Sun, 5 Jul 2020 17:27:55 +0300 Subject: [PATCH 18/58] Split the first part of two tutorial into 2 and rearranged the titles. --- docs/en/Tutorials/Part-1.md | 547 +------------- docs/en/Tutorials/Part-2.md | 1337 ++++++++-------------------------- docs/en/Tutorials/Part-3.md | 1348 +++++++++++++++++++++++++++++++---- docs/en/Tutorials/Part-4.md | 378 ++++------ docs/en/Tutorials/Part-5.md | 316 ++++++++ docs/en/docs-nav.json | 16 +- 6 files changed, 1999 insertions(+), 1943 deletions(-) create mode 100644 docs/en/Tutorials/Part-5.md diff --git a/docs/en/Tutorials/Part-1.md b/docs/en/Tutorials/Part-1.md index 53745f9b59..c74f7d8c85 100644 --- a/docs/en/Tutorials/Part-1.md +++ b/docs/en/Tutorials/Part-1.md @@ -1,4 +1,4 @@ -# ASP.NET Core {{UI_Value}} Tutorial - Part 1 +# Web Application Development Tutorial - Part 1: Creating the Server Side ````json //[doc-params] { @@ -29,10 +29,11 @@ In this tutorial series, you will build an ABP based web application named `Acme This tutorial is organized as the following parts; -- **Part-1: Creating the project and book list page (this part)** -- [Part-2: Creating, updating and deleting books](part-2.md) -- [Part-3: Integration tests](part-3.md) -- [Part-4: Authorization](Part-4.md) +- **Part 1: Creating the server side (this part)** +- [Part 2: The book list page](Part-2.md) +- [Part 3: Creating, updating and deleting books](Part-3.md) +- [Part 4: Integration tests](Part-4.md) +- [Part 5: Authorization](Part-5.md) ### Source Code @@ -490,538 +491,6 @@ If you try to execute the `[GET] /api/app/book` API to get a list of books, the That's pretty cool since we haven't written a single line of code to create the API controller, but now we have a fully working REST API! -{{if UI == "MVC"}} +## The Next Part -## Dynamic JavaScript Proxies - -It's common to call the HTTP API endpoints via AJAX from the **JavaScript** side. You can use `$.ajax` or another tool to call the endpoints. However, ABP offers a better way. - -ABP **dynamically** creates **[JavaScript Proxies](../UI/AspNetCore/)** for all API endpoints. So, you can use any **endpoint** just like calling a **JavaScript function**. - -### Testing in Developer Console of the Browser - -You can easily test the JavaScript proxies using your favorite browser's **Developer Console**. Run the application, open your browser's **developer tools** (*shortcut is generally F12*), switch to the **Console** tab, type the following code and press enter: - -````js -acme.bookStore.books.book.getList({}).done(function (result) { console.log(result); }); -```` - -* `acme.bookStore.books` is the namespace of the `BookAppService` converted to [camelCase](https://en.wikipedia.org/wiki/Camel_case). -* `book` is the conventional name for the `BookAppService` (removed `AppService` postfix and converted to camelCase). -* `getList` is the conventional name for the `GetListAsync` method defined in the `CrudAppService` base class (removed `Async` postfix and converted to camelCase). -* `{}` argument is used to send an empty object to the `GetListAsync` method which normally expects an object of type `PagedAndSortedResultRequestDto` that is used to send paging and sorting options to the server (all properties are optional with default values, so you can send an empty object). -* `getList` function returns a `promise`. You can pass a callback to the `then` (or `done`) function to get the result returned from the server. - -Running this code produces the following output: - -![bookstore-javascript-proxy-console](images/bookstore-javascript-proxy-console.png) - -You can see the **book list** returned from the server. You can also check the **network** tab of the developer tools to see the client to server communication: - -![bookstore-getlist-result-network](images/bookstore-getlist-result-network.png) - -Let's **create a new book** using the `create` function: - -````js -acme.bookStore.books.book.create({ - name: 'Foundation', - type: 7, - publishDate: '1951-05-24', - price: 21.5 - }).then(function (result) { - console.log('successfully created the book with id: ' + result.id); - }); -```` - -You should see a message in the console something like that: - -````text -successfully created the book with id: 439b0ea8-923e-8e1e-5d97-39f2c7ac4246 -```` - -Check the `Books` table in the database to see the new book row. You can try `get`, `update` and `delete` functions yourself. - -We will use these dynamic proxy functions in the next sections to communicate to the server. - -## Create a Books Page - -It's time to create something visible and usable! Instead of classic MVC, we will use the [Razor Pages UI](https://docs.microsoft.com/en-us/aspnet/core/tutorials/razor-pages/razor-pages-start) approach which is recommended by Microsoft. - -Create `Books` folder under the `Pages` folder of the `Acme.BookStore.Web` project. Add a new Razor Page by right clicking the Books folder then selecting **Add > Razor Page** menu item. Name it as `Index`: - -![bookstore-add-index-page](./images/bookstore-add-index-page-v2.png) - -Open the `Index.cshtml` and change the whole content as shown below: - -````html -@page -@using Acme.BookStore.Web.Pages.Books -@model IndexModel - -