From 0dcbb61e1982eb3a80f6a21e8191eefa60e72f00 Mon Sep 17 00:00:00 2001 From: maliming Date: Wed, 28 Oct 2020 09:38:09 +0800 Subject: [PATCH 01/20] Remove the unique index of IdentityResource, ApiResource and ApiScope. Resolve #5932 --- .../IdentityServerDbContextModelCreatingExtensions.cs | 6 ------ 1 file changed, 6 deletions(-) diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IdentityServerDbContextModelCreatingExtensions.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IdentityServerDbContextModelCreatingExtensions.cs index eb6d424c16..f63109f1f1 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IdentityServerDbContextModelCreatingExtensions.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IdentityServerDbContextModelCreatingExtensions.cs @@ -193,8 +193,6 @@ namespace Volo.Abp.IdentityServer.EntityFrameworkCore b.Property(x => x.DisplayName).HasMaxLength(IdentityResourceConsts.DisplayNameMaxLength); b.Property(x => x.Description).HasMaxLength(IdentityResourceConsts.DescriptionMaxLength); - b.HasIndex(x => x.Name).IsUnique(); - b.HasMany(x => x.UserClaims).WithOne().HasForeignKey(x => x.IdentityResourceId).IsRequired(); b.HasMany(x => x.Properties).WithOne().HasForeignKey(x => x.IdentityResourceId).IsRequired(); }); @@ -236,8 +234,6 @@ namespace Volo.Abp.IdentityServer.EntityFrameworkCore b.ConfigureByConvention(); - b.HasIndex(x => x.Name).IsUnique(); - b.Property(x => x.Name).HasMaxLength(ApiResourceConsts.NameMaxLength).IsRequired(); b.Property(x => x.DisplayName).HasMaxLength(ApiResourceConsts.DisplayNameMaxLength); b.Property(x => x.Description).HasMaxLength(ApiResourceConsts.DescriptionMaxLength); @@ -320,8 +316,6 @@ namespace Volo.Abp.IdentityServer.EntityFrameworkCore b.Property(x => x.DisplayName).HasMaxLength(ApiScopeConsts.DisplayNameMaxLength); b.Property(x => x.Description).HasMaxLength(ApiScopeConsts.DescriptionMaxLength); - b.HasIndex(x => x.Name).IsUnique(); - b.HasMany(x => x.UserClaims).WithOne().HasForeignKey(x => x.ApiScopeId).IsRequired(); b.HasMany(x => x.Properties).WithOne().HasForeignKey(x => x.ApiScopeId).IsRequired(); }); From ea9f3347df2a95463f9195162599a115bbf1f1fe Mon Sep 17 00:00:00 2001 From: maliming Date: Wed, 28 Oct 2020 09:58:06 +0800 Subject: [PATCH 02/20] Update template projects migrations. --- ...r.cs => 20201028014149_Initial.Designer.cs} | 11 +---------- ...35_Initial.cs => 20201028014149_Initial.cs} | 18 ------------------ ...jectNameMigrationsDbContextModelSnapshot.cs | 9 --------- ...r.cs => 20201028014236_Initial.Designer.cs} | 11 +---------- ...20_Initial.cs => 20201028014236_Initial.cs} | 18 ------------------ ...rverHostMigrationsDbContextModelSnapshot.cs | 9 --------- ...r.cs => 20201028014311_Initial.Designer.cs} | 2 +- ...01_Initial.cs => 20201028014311_Initial.cs} | 0 8 files changed, 3 insertions(+), 75 deletions(-) rename templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/{20201019020935_Initial.Designer.cs => 20201028014149_Initial.Designer.cs} (99%) rename templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/{20201019020935_Initial.cs => 20201028014149_Initial.cs} (99%) rename templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/{20201019021120_Initial.Designer.cs => 20201028014236_Initial.Designer.cs} (99%) rename templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/{20201019021120_Initial.cs => 20201028014236_Initial.cs} (99%) rename templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/{20201019021101_Initial.Designer.cs => 20201028014311_Initial.Designer.cs} (99%) rename templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/{20201019021101_Initial.cs => 20201028014311_Initial.cs} (100%) diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20201019020935_Initial.Designer.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20201028014149_Initial.Designer.cs similarity index 99% rename from templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20201019020935_Initial.Designer.cs rename to templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20201028014149_Initial.Designer.cs index 7e948c753c..748f6c7638 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20201019020935_Initial.Designer.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20201028014149_Initial.Designer.cs @@ -11,7 +11,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Migrations { [DbContext(typeof(MyProjectNameMigrationsDbContext))] - [Migration("20201019020935_Initial")] + [Migration("20201028014149_Initial")] partial class Initial { protected override void BuildTargetModel(ModelBuilder modelBuilder) @@ -1042,9 +1042,6 @@ namespace MyCompanyName.MyProjectName.Migrations b.HasKey("Id"); - b.HasIndex("Name") - .IsUnique(); - b.ToTable("IdentityServerApiResources"); }); @@ -1192,9 +1189,6 @@ namespace MyCompanyName.MyProjectName.Migrations b.HasKey("Id"); - b.HasIndex("Name") - .IsUnique(); - b.ToTable("IdentityServerApiScopes"); }); @@ -1770,9 +1764,6 @@ namespace MyCompanyName.MyProjectName.Migrations b.HasKey("Id"); - b.HasIndex("Name") - .IsUnique(); - b.ToTable("IdentityServerIdentityResources"); }); diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20201019020935_Initial.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20201028014149_Initial.cs similarity index 99% rename from templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20201019020935_Initial.cs rename to templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20201028014149_Initial.cs index dfa2b7fbd5..af7fb7ee1b 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20201019020935_Initial.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20201028014149_Initial.cs @@ -1181,18 +1181,6 @@ namespace MyCompanyName.MyProjectName.Migrations table: "AbpUsers", column: "UserName"); - migrationBuilder.CreateIndex( - name: "IX_IdentityServerApiResources_Name", - table: "IdentityServerApiResources", - column: "Name", - unique: true); - - migrationBuilder.CreateIndex( - name: "IX_IdentityServerApiScopes_Name", - table: "IdentityServerApiScopes", - column: "Name", - unique: true); - migrationBuilder.CreateIndex( name: "IX_IdentityServerClients_ClientId", table: "IdentityServerClients", @@ -1214,12 +1202,6 @@ namespace MyCompanyName.MyProjectName.Migrations table: "IdentityServerDeviceFlowCodes", column: "UserCode"); - migrationBuilder.CreateIndex( - name: "IX_IdentityServerIdentityResources_Name", - table: "IdentityServerIdentityResources", - column: "Name", - unique: true); - migrationBuilder.CreateIndex( name: "IX_IdentityServerPersistedGrants_Expiration", table: "IdentityServerPersistedGrants", diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/MyProjectNameMigrationsDbContextModelSnapshot.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/MyProjectNameMigrationsDbContextModelSnapshot.cs index 657232cff2..82d01f075c 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/MyProjectNameMigrationsDbContextModelSnapshot.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/MyProjectNameMigrationsDbContextModelSnapshot.cs @@ -1040,9 +1040,6 @@ namespace MyCompanyName.MyProjectName.Migrations b.HasKey("Id"); - b.HasIndex("Name") - .IsUnique(); - b.ToTable("IdentityServerApiResources"); }); @@ -1190,9 +1187,6 @@ namespace MyCompanyName.MyProjectName.Migrations b.HasKey("Id"); - b.HasIndex("Name") - .IsUnique(); - b.ToTable("IdentityServerApiScopes"); }); @@ -1768,9 +1762,6 @@ namespace MyCompanyName.MyProjectName.Migrations b.HasKey("Id"); - b.HasIndex("Name") - .IsUnique(); - b.ToTable("IdentityServerIdentityResources"); }); diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20201019021120_Initial.Designer.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20201028014236_Initial.Designer.cs similarity index 99% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20201019021120_Initial.Designer.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20201028014236_Initial.Designer.cs index 0f3b3b90b9..bda1f6108d 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20201019021120_Initial.Designer.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20201028014236_Initial.Designer.cs @@ -11,7 +11,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Migrations { [DbContext(typeof(IdentityServerHostMigrationsDbContext))] - [Migration("20201019021120_Initial")] + [Migration("20201028014236_Initial")] partial class Initial { protected override void BuildTargetModel(ModelBuilder modelBuilder) @@ -984,9 +984,6 @@ namespace MyCompanyName.MyProjectName.Migrations b.HasKey("Id"); - b.HasIndex("Name") - .IsUnique(); - b.ToTable("IdentityServerApiResources"); }); @@ -1134,9 +1131,6 @@ namespace MyCompanyName.MyProjectName.Migrations b.HasKey("Id"); - b.HasIndex("Name") - .IsUnique(); - b.ToTable("IdentityServerApiScopes"); }); @@ -1712,9 +1706,6 @@ namespace MyCompanyName.MyProjectName.Migrations b.HasKey("Id"); - b.HasIndex("Name") - .IsUnique(); - b.ToTable("IdentityServerIdentityResources"); }); diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20201019021120_Initial.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20201028014236_Initial.cs similarity index 99% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20201019021120_Initial.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20201028014236_Initial.cs index 2296a18f25..78dcb6359e 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20201019021120_Initial.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20201028014236_Initial.cs @@ -1155,18 +1155,6 @@ namespace MyCompanyName.MyProjectName.Migrations table: "AbpUsers", column: "UserName"); - migrationBuilder.CreateIndex( - name: "IX_IdentityServerApiResources_Name", - table: "IdentityServerApiResources", - column: "Name", - unique: true); - - migrationBuilder.CreateIndex( - name: "IX_IdentityServerApiScopes_Name", - table: "IdentityServerApiScopes", - column: "Name", - unique: true); - migrationBuilder.CreateIndex( name: "IX_IdentityServerClients_ClientId", table: "IdentityServerClients", @@ -1188,12 +1176,6 @@ namespace MyCompanyName.MyProjectName.Migrations table: "IdentityServerDeviceFlowCodes", column: "UserCode"); - migrationBuilder.CreateIndex( - name: "IX_IdentityServerIdentityResources_Name", - table: "IdentityServerIdentityResources", - column: "Name", - unique: true); - migrationBuilder.CreateIndex( name: "IX_IdentityServerPersistedGrants_Expiration", table: "IdentityServerPersistedGrants", diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/IdentityServerHostMigrationsDbContextModelSnapshot.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/IdentityServerHostMigrationsDbContextModelSnapshot.cs index beb40e7827..29deeab756 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/IdentityServerHostMigrationsDbContextModelSnapshot.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/IdentityServerHostMigrationsDbContextModelSnapshot.cs @@ -982,9 +982,6 @@ namespace MyCompanyName.MyProjectName.Migrations b.HasKey("Id"); - b.HasIndex("Name") - .IsUnique(); - b.ToTable("IdentityServerApiResources"); }); @@ -1132,9 +1129,6 @@ namespace MyCompanyName.MyProjectName.Migrations b.HasKey("Id"); - b.HasIndex("Name") - .IsUnique(); - b.ToTable("IdentityServerApiScopes"); }); @@ -1710,9 +1704,6 @@ namespace MyCompanyName.MyProjectName.Migrations b.HasKey("Id"); - b.HasIndex("Name") - .IsUnique(); - b.ToTable("IdentityServerIdentityResources"); }); diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20201019021101_Initial.Designer.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20201028014311_Initial.Designer.cs similarity index 99% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20201019021101_Initial.Designer.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20201028014311_Initial.Designer.cs index cd2f885a7d..4958727637 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20201019021101_Initial.Designer.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20201028014311_Initial.Designer.cs @@ -11,7 +11,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Migrations { [DbContext(typeof(UnifiedDbContext))] - [Migration("20201019021101_Initial")] + [Migration("20201028014311_Initial")] partial class Initial { protected override void BuildTargetModel(ModelBuilder modelBuilder) diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20201019021101_Initial.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20201028014311_Initial.cs similarity index 100% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20201019021101_Initial.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20201028014311_Initial.cs From 25b95c5c4ef96f9f548f832ebfc07371c1de1f09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Wed, 28 Oct 2020 14:42:38 +0300 Subject: [PATCH 03/20] Update Theming.md --- docs/en/UI/AspNetCore/Theming.md | 81 +++++++++++++++++++++++++++++++- 1 file changed, 79 insertions(+), 2 deletions(-) diff --git a/docs/en/UI/AspNetCore/Theming.md b/docs/en/UI/AspNetCore/Theming.md index 594a882821..fb9d7ccd0e 100644 --- a/docs/en/UI/AspNetCore/Theming.md +++ b/docs/en/UI/AspNetCore/Theming.md @@ -114,7 +114,7 @@ The [Lepton Theme](https://commercial.abp.io/themes) shows the application logo #### The Empty Layout -The empty layout provides an empty page, however it typically includes the following parts; +The empty layout provides an empty page. It typically includes the following parts; * [Page alerts](Page-Alerts.md) * The page content (aka `RenderBody()`) @@ -177,4 +177,81 @@ Configure(options => #### The IThemeSelector Service -ABP Framework allows to use multiple themes together. This is why `options.Themes` is a list. `IThemeSelector` service selects the theme on the runtime. The application developer can set the `AbpThemingOptions.DefaultThemeName` to set the theme to be used, or replace the `IThemeSelector` service implementation (the default implementation is `DefaultThemeSelector`) to completely control the theme selection on runtime. \ No newline at end of file +ABP Framework allows to use multiple themes together. This is why `options.Themes` is a list. `IThemeSelector` service selects the theme on the runtime. The application developer can set the `AbpThemingOptions.DefaultThemeName` to set the theme to be used, or replace the `IThemeSelector` service implementation (the default implementation is `DefaultThemeSelector`) to completely control the theme selection on runtime. + +### Bundles + +[Bundling system](Bundling-Minification.md) provides a standard way to import style & script files into pages. There are two standard bundles defined by the ABP Framework: + +* `StandardBundles.Styles.Global`: The global bundle that includes the style files used in all the pages. Typically, it includes the CSS files of the Base Libraries. +* `StandardBundles.Scripts.Global`: The global bundle that includes the script files used in all the pages. Typically, it includes the JavaScript files of the Base Libraries. + +A theme generally extends these standard bundles by adding theme specific CSS/JavaScript files. + +The best way to define new bundles, inherit from the standard bundles and add to the `AbpBundlingOptions` as shown below (this code is from the [Basic Theme](Basic-Theme.md)): + +````csharp +Configure(options => +{ + options + .StyleBundles + .Add(BasicThemeBundles.Styles.Global, bundle => + { + bundle + .AddBaseBundles(StandardBundles.Styles.Global) + .AddContributors(typeof(BasicThemeGlobalStyleContributor)); + }); + + options + .ScriptBundles + .Add(BasicThemeBundles.Scripts.Global, bundle => + { + bundle + .AddBaseBundles(StandardBundles.Scripts.Global) + .AddContributors(typeof(BasicThemeGlobalScriptContributor)); + }); +}); +```` + +`BasicThemeGlobalStyleContributor` and `BasicThemeGlobalScriptContributor` are bundle contributors. For example, `BasicThemeGlobalStyleContributor` is defined as shown below: + +```csharp +public class BasicThemeGlobalStyleContributor : BundleContributor +{ + public override void ConfigureBundle(BundleConfigurationContext context) + { + context.Files.Add("/themes/basic/layout.css"); + } +} +``` + +Then the theme can render these bundles in a layout. For example, you can render the Global Styles as shown below: + +````html + +```` + +See the [Bundle & Minification](Bundling-Minification.md) document to understand the Bundling system better. + +### Layout Parts + +#### Branding + +#### Main Menu + +#### Main Toolbar + +##### Language Selection + +##### User Menu + +#### Page Alerts + +#### Layout Hooks + +### The NPM Package + +A theme should have a NPM package that depends on the [@abp/aspnetcore.mvc.ui.theme.shared](https://www.npmjs.com/package/@abp/aspnetcore.mvc.ui.theme.shared) package. In this way, it inherits all the Base Libraries. If the theme requires additional libraries, then it should define these dependencies too. + +Applications use the [Client Side Package Management](Client-Side-Package-Management.md) system to add client side libraries to the project. So, if an application uses your theme, it should add dependency to your theme's NPM package as well as the NuGet package dependency. + From 79be09c125087be2ff63e50bef5c65a1e062e5d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Wed, 28 Oct 2020 15:39:51 +0300 Subject: [PATCH 04/20] Added sections to the themind document. --- docs/en/UI/AspNetCore/Theming.md | 141 ++++++++++++++++++ .../basic-theme-application-layout-parts.png | Bin 0 -> 77932 bytes 2 files changed, 141 insertions(+) create mode 100644 docs/en/images/basic-theme-application-layout-parts.png diff --git a/docs/en/UI/AspNetCore/Theming.md b/docs/en/UI/AspNetCore/Theming.md index fb9d7ccd0e..1811213d6f 100644 --- a/docs/en/UI/AspNetCore/Theming.md +++ b/docs/en/UI/AspNetCore/Theming.md @@ -235,20 +235,161 @@ See the [Bundle & Minification](Bundling-Minification.md) document to understand ### Layout Parts +A typical Layout consists of several parts. The theme should include the necessary parts in each layout. + +**Example: The Basic Theme has the following parts for the Application Layout** + +![basic-theme-application-layout-parts](../../images/basic-theme-application-layout-parts.png) + +The application code and the modules can only show contents in the Page Content part. If they need to change the other parts (to add a menu item, to add a toolbar item, to change the application name in the branding area...) they should use the ABP Framework APIs. + +The following sections explain the fundamental parts pre-defined by the ABP Framework and can be implemented by the themes. + +> It is a good practice to split the layout into components/partials, so the final application can override them partially for customization purpose. + #### Branding +`IBrandingProvider` service should be used to get the name and the logo URL of the application to render in the Branding part. + +The [Application Startup Template](../../Startup-Templates/Application.md) has an implementation of this interface to set the values by the application developer. + #### Main Menu +`IMenuManager` service is used to get the main menu items and render on the layout. + +**Example: Get the Main Menu to render in a view component** + +```csharp +public class MainNavbarMenuViewComponent : AbpViewComponent +{ + private readonly IMenuManager _menuManager; + + public MainNavbarMenuViewComponent(IMenuManager menuManager) + { + _menuManager = menuManager; + } + + public async Task InvokeAsync() + { + var menu = await _menuManager.GetAsync(StandardMenus.Main); + return View("~/Themes/Basic/Components/Menu/Default.cshtml", menu); + } +} +``` + +See the [Navigation / Menus](Navigation-Menu.md) document to learn more about the navigation system. + #### Main Toolbar +`IToolbarManager` service is used to get the Main Toolbar items and render on the layout. Each item of this toolbar is a View Component, so it may include any type of UI elements. Inject the `IToolbarManager` and use the `GetAsync` to get the toolbar items: + +````csharp +var toolbar = await _toolbarManager.GetAsync(StandardToolbars.Main); +```` + +> See the [Toolbars](Toolbars.md) document to learn more on the toolbar system. + +The theme has a responsibility to add two pre-defined items to the main toolbar: Language Selection and User Menu. To do that, create a class implementing the `IToolbarContributor` interface and add it to the `AbpToolbarOptions` as shown below: + +```csharp +Configure(options => +{ + options.Contributors.Add(new BasicThemeMainTopToolbarContributor()); +}); +``` + ##### Language Selection +Language Selection toolbar item is generally a dropdown that is used to switch between languages. `ILanguageProvider` is used to get the list of available languages and `CultureInfo.CurrentUICulture` is used to learn the current language. + +`/Abp/Languages/Switch` endpoint can be used to switch the language using such a link: + +````html +@language.DisplayName +```` + +This endpoint accepts the following query string parameters: + +* `culture`: The selected culture, like `en-US` or `en`. +* `uiCulture`: The selected UI culture, like `en-US` or `en`. +* `returnUrl` (optional): Can be used to return a given URL after switching the language. + +`culture` and `uiCulture` should match one of the available languages. ABP Framework sets a culture cookie in the `/Abp/Languages/Switch` endpoint. + ##### User Menu +User menu includes links related to the user account. `IMenuManager` is used just like the Main Menu, but this time with `StandardMenus.User` parameter like shown below: + +````csharp +var menu = await _menuManager.GetAsync(StandardMenus.User); +```` + +[ICurrentUser](../../CurrentUser.md) and [ICurrentTenant](../../Multi-Tenancy.md) services can be used to obtain the current user and tenant names. + #### Page Alerts +`IAlertManager` service is used to get the current page alerts to render on the layout. Use the `Alerts` list of the `IAlertManager`. It is generally rendered just before the page content (`RenderBody()`). + +See the [Page Alerts](Page-Alerts.md) document to learn more. + #### Layout Hooks +Since the Layout is in the theme package, the final application or any module can't directly manipulate the layout content. The [Layout Hook](Layout-Hooks.md) system allows to inject components to some specific points of the layout. + +The theme is responsible to render the hooks in the correct place. + +**Example: Render the `LayoutHooks.Head.First` Hook in the Application Layout** + +````html + + @await Component.InvokeLayoutHookAsync(LayoutHooks.Head.First, StandardLayouts.Application) + ... +```` + +See the [Layout Hook](Layout-Hooks.md) document to learn the standard layout hooks. + +#### Script / Style Sections + +Every layout should render the following optional sections: + +* `styles` section is rendered in the end of the `head`, just before the `LayoutHooks.Head.Last`. +* `scripts` section is rendered in the end of the `body`, just before the `LayoutHooks.Body.Last`. + +In this way, the page can import styles and scripts to the layout. + +**Example: Render the `styles` section** + +````csharp +@await RenderSectionAsync("styles", required: false) +```` + +#### Widget Scripts + +The [Widget System](Widgets.md) allows to define reusable widgets with their own style/script files. All the layouts should render the widget style and scripts. + +**Widget Styles** is rendered as shown below, just before the `styles` section, after the global style bundle: + +````csharp +@await Component.InvokeAsync(typeof(WidgetStylesViewComponent)) +```` + +**Widget Scripts** is rendered as shown below, just before the `scripts` section, after the global script bundle: + +````csharp +@await Component.InvokeAsync(typeof(WidgetScriptsViewComponent)) +```` + +#### ABP Scripts + +ABP has some special scripts those should be included into every layout. They are not included in the global bundles since they are dynamically created based on the current user. + +ABP scripts (`ApplicationConfigurationScript` and `ServiceProxyScript`) should be added just after the global script bundle, as shown below: + +````html + + +```` + ### The NPM Package A theme should have a NPM package that depends on the [@abp/aspnetcore.mvc.ui.theme.shared](https://www.npmjs.com/package/@abp/aspnetcore.mvc.ui.theme.shared) package. In this way, it inherits all the Base Libraries. If the theme requires additional libraries, then it should define these dependencies too. diff --git a/docs/en/images/basic-theme-application-layout-parts.png b/docs/en/images/basic-theme-application-layout-parts.png new file mode 100644 index 0000000000000000000000000000000000000000..5e8f9147a9b6aed79252130716925c77c7b36014 GIT binary patch literal 77932 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%0A*6^qQsGkep6SPlzCscbz;oX0!N!e9W9 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

y&FziT5V}tS4Iv;g6{|r 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 Date: Wed, 28 Oct 2020 15:58:32 +0300 Subject: [PATCH 05/20] Complete the theming document. --- docs/en/UI/AspNetCore/Theming.md | 42 +++++++++++++++++++++++++ docs/en/images/breadcrumbs-example.png | Bin 0 -> 9794 bytes 2 files changed, 42 insertions(+) create mode 100644 docs/en/images/breadcrumbs-example.png diff --git a/docs/en/UI/AspNetCore/Theming.md b/docs/en/UI/AspNetCore/Theming.md index 1811213d6f..9f3534b565 100644 --- a/docs/en/UI/AspNetCore/Theming.md +++ b/docs/en/UI/AspNetCore/Theming.md @@ -363,6 +363,20 @@ In this way, the page can import styles and scripts to the layout. @await RenderSectionAsync("styles", required: false) ```` +#### Content Toolbar Section + +Another pre-defined section is the Content Toolbar section which can be used by the pages to add code just before the page content. The Basic Theme renders it as shown below: + +````html +

+
+ @RenderSection("content_toolbar", false) +
+
+```` + +The container div's id must be `AbpContentToolbar`. This section should come before the `RenderBody()`. + #### Widget Scripts The [Widget System](Widgets.md) allows to define reusable widgets with their own style/script files. All the layouts should render the widget style and scripts. @@ -390,6 +404,34 @@ ABP scripts (`ApplicationConfigurationScript` and `ServiceProxyScript`) should b ```` +#### Page Title, Selected Menu Item and Breadcrumbs + +`IPageLayout` service can be injected by any page to set the Page Title, the selected menu item name and the breadcrumb items. Then the theme can use this service to get these values and render on the UI. + +The Basic Theme doesn't implement this service, but the Lepton Theme implements: + +![breadcrumbs-example](../../images/breadcrumbs-example.png) + +#### Tenant Switch + +The Account Layout should allow the user to switch the current tenant if the application is multi-tenant and the tenant was resolved from the cookies. See the [Basic Theme Account Layout](https://github.com/abpframework/abp/blob/dev/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Themes/Basic/Layouts/Account.cshtml) as an example implementation. + +### Layout Classes + +The Standard Layouts (`Application`, `Account` and `Empty`) should add the following CSS classes to the `body` tag: + +* `abp-application-layout` for the `Application` layout. +* `abp-account-layout` for the `Account` layout. +* `abp-empty-layout` for the `Empty` layout. + +In this way, applications or modules can have selectors based on the current layout. + +### RTL + +To support Right-To-Left languages, the Layout should check the current culture and add `dir="rtl"` to the `html` tag and `rtl` CSS class the the `body` tag. + +You can check `CultureInfo.CurrentUICulture.TextInfo.IsRightToLeft` to understand if the current language is a RTL language. + ### The NPM Package A theme should have a NPM package that depends on the [@abp/aspnetcore.mvc.ui.theme.shared](https://www.npmjs.com/package/@abp/aspnetcore.mvc.ui.theme.shared) package. In this way, it inherits all the Base Libraries. If the theme requires additional libraries, then it should define these dependencies too. diff --git a/docs/en/images/breadcrumbs-example.png b/docs/en/images/breadcrumbs-example.png new file mode 100644 index 0000000000000000000000000000000000000000..17ae5f8ba5741e78e98cbf6c4ab2ff1caba42614 GIT binary patch literal 9794 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 Tc#;+z3M06#s;yG2gvI?Ic4{8J literal 0 HcmV?d00001 From dda43e6a2b58699585412f3c910487f92d9b6ada Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Wed, 28 Oct 2020 16:03:53 +0300 Subject: [PATCH 06/20] Update Theming.md --- docs/en/UI/AspNetCore/Theming.md | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/docs/en/UI/AspNetCore/Theming.md b/docs/en/UI/AspNetCore/Theming.md index 9f3534b565..69e6b33769 100644 --- a/docs/en/UI/AspNetCore/Theming.md +++ b/docs/en/UI/AspNetCore/Theming.md @@ -302,13 +302,7 @@ Configure(options => Language Selection toolbar item is generally a dropdown that is used to switch between languages. `ILanguageProvider` is used to get the list of available languages and `CultureInfo.CurrentUICulture` is used to learn the current language. -`/Abp/Languages/Switch` endpoint can be used to switch the language using such a link: - -````html -@language.DisplayName -```` - -This endpoint accepts the following query string parameters: +`/Abp/Languages/Switch` endpoint can be used to switch the language This endpoint accepts the following query string parameters: * `culture`: The selected culture, like `en-US` or `en`. * `uiCulture`: The selected UI culture, like `en-US` or `en`. @@ -377,7 +371,7 @@ Another pre-defined section is the Content Toolbar section which can be used by The container div's id must be `AbpContentToolbar`. This section should come before the `RenderBody()`. -#### Widget Scripts +#### Widget Resources The [Widget System](Widgets.md) allows to define reusable widgets with their own style/script files. All the layouts should render the widget style and scripts. From f9ca7c638c5d511c31c539bfda572244a1ee8ce2 Mon Sep 17 00:00:00 2001 From: maliming Date: Thu, 29 Oct 2020 10:46:42 +0800 Subject: [PATCH 07/20] Use global namespace in blazor. Fix #5982 --- .../Pages/MyProjectName/Index.razor | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/Pages/MyProjectName/Index.razor b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/Pages/MyProjectName/Index.razor index d54a229594..2d155b021c 100644 --- a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/Pages/MyProjectName/Index.razor +++ b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/Pages/MyProjectName/Index.razor @@ -1,6 +1,6 @@ -@page "/MyProjectName" +@page "/MyProjectName" @using Microsoft.Extensions.Localization -@using MyCompanyName.MyProjectName.Localization +@using global::MyCompanyName.MyProjectName.Localization @inject IStringLocalizer L @{ } From 095e4b2508c2e17565f294a1c819b566e211c61f Mon Sep 17 00:00:00 2001 From: Jervis Date: Wed, 21 Oct 2020 11:52:34 +0800 Subject: [PATCH 08/20] remove duplicate section. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit remove duplicate section, "指定移动应用程序框架" --- docs/zh-Hans/Startup-Templates/Application.md | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/docs/zh-Hans/Startup-Templates/Application.md b/docs/zh-Hans/Startup-Templates/Application.md index 58287cef5a..534a26d8fb 100644 --- a/docs/zh-Hans/Startup-Templates/Application.md +++ b/docs/zh-Hans/Startup-Templates/Application.md @@ -59,20 +59,6 @@ abp new Acme.BookStore -d mongodb ### 指定移动应用程序框架 -此模板支持以下移动应用程序框架: - -- `react-native`: React Native - -使用 `-m` (或 `--mobile`) 选项指定移动应用程序框架: - -````bash -abp new Acme.BookStore -m react-native -```` - -如果未指定,不会创建移动应用程序. - -### 指定移动应用程序框架 - 该模板支持以下移动应用程序框架: - `react-native`: React Native From 58a304bd0c1e12ee0eebab2a6f6b856f0639a2e3 Mon Sep 17 00:00:00 2001 From: ZFmY Date: Thu, 29 Oct 2020 16:14:17 +0800 Subject: [PATCH 09/20] sync from the English doc --- .../Getting-Started-AspNetCore-Application.md | 354 ++++++++---------- 1 file changed, 160 insertions(+), 194 deletions(-) diff --git a/docs/zh-Hans/Getting-Started-AspNetCore-Application.md b/docs/zh-Hans/Getting-Started-AspNetCore-Application.md index 0334609bd3..be5e50c2bd 100644 --- a/docs/zh-Hans/Getting-Started-AspNetCore-Application.md +++ b/docs/zh-Hans/Getting-Started-AspNetCore-Application.md @@ -1,194 +1,160 @@ -## 在AspNet Core MVC Web Application中使用ABP - -本教程将介绍如何开始以最少的依赖关系开始使用ABP开发. - -通常情况下你需要下载一个 ***[启动模板](Getting-Started-AspNetCore-MVC-Template.md)*** - -### 创建一个新项目 - -1. 使用Visual Studio创建一个空的AspNet Core Web Application: - -![](images/create-new-aspnet-core-application.png) - -2. 选择空模板 - -![](images/select-empty-web-application.png) - -你可以选择其它模板,但是我想要从一个简洁的项目演示它. - -### 安装 Volo.Abp.AspNetCore.Mvc 包 - -Volo.Abp.AspNetCore.Mvc是ABP集成AspNet Core MVC的包,请安装它到你项目中: - -```` -Install-Package Volo.Abp.AspNetCore.Mvc -```` - -### 创建ABP模块 - -ABP是一个模块化框架,它需要一个**启动 (根) 模块**继承自``AbpModule``: - -````C# -using Microsoft.AspNetCore.Builder; -using Microsoft.Extensions.Hosting; -using Volo.Abp; -using Volo.Abp.AspNetCore.Mvc; -using Volo.Abp.Modularity; - -namespace BasicAspNetCoreApplication -{ - [DependsOn(typeof(AbpAspNetCoreMvcModule))] - public class AppModule : AbpModule - { - public override void OnApplicationInitialization( - ApplicationInitializationContext context) - { - var app = context.GetApplicationBuilder(); - var env = context.GetEnvironment(); - - if (env.IsDevelopment()) - { - app.UseDeveloperExceptionPage(); - } - else - { - app.UseExceptionHandler("/Error"); - } - - app.UseStaticFiles(); - app.UseRouting(); - app.UseConfiguredEndpoints(); - } - } -} -```` - -``AppModule`` 是应用程序启动模块的好名称(建议你的启动模块也使用这个命名). - -ABP的包定义了这个模块类,模块可以依赖其它模块.在上面的代码中 ``AppModule`` 依赖于 ``AbpAspNetCoreMvcModule`` (模块存在于Volo.Abp.AspNetCore.Mvc包中). 安装新的ABP的包后添加``DependsOn``是很常见的做法. - -我们在此模块类中配置ASP.NET Core管道,而不是Startup类中. - -### 启动类 - -接下来修改启动类集成ABP模块系统: - -````C# -using System; -using Microsoft.AspNetCore.Builder; -using Microsoft.Extensions.DependencyInjection; - -namespace BasicAspNetCoreApplication -{ - public class Startup - { - public IServiceProvider ConfigureServices(IServiceCollection services) - { - services.AddApplication(); - - return services.BuildServiceProviderFromFactory(); - } - - public void Configure(IApplicationBuilder app) - { - app.InitializeApplication(); - } - } -} - -```` - -修改``ConfigureServices``方法的返回值为``IServiceProvider``(默认是``void``).这个修改允许我们替换AspNet Core的依赖注入框架. (参阅下面的Autofac集成部分). ``services.AddApplication()``添加了所有模块中定义的全部服务. - -``app.InitializeApplication()`` 调用 ``Configure`` 方法初始化并启动应用程序 - -### Hello World! - -上面的应用程序没有什么功能,让我们创建一个MVC控制器实现一些功能: - -````C# -using Microsoft.AspNetCore.Mvc; -using Volo.Abp.AspNetCore.Mvc; - -namespace BasicAspNetCoreApplication.Controllers -{ - public class HomeController : AbpController - { - public IActionResult Index() - { - return Content("Hello World!"); - } - } -} - -```` - -如果运行这个应用程序你会在页面中看到"Hello World!". - -Derived ``HomeController`` from ``AbpController`` instead of standard ``Controller`` class. This is not required, but ``AbpController`` class has useful base properties and methods to make your development easier. - -从``AbpController``派生``HomeController`` 而不是继承自``Controller``类.虽然这不是强制要求,但是``AbpController``类有很多有用的有属性和方法,使你的开发更容易. - -### 使用 Autofac 依赖注入框架 - -虽然AspNet Core的依赖注入(DI)系统适用于基本要求,但Autofac提供了属性注入和方法拦截等高级功能,这些功能是ABP执行高级应用程序框架功能所必需的. - -用Autofac取代AspNet Core的DI系统并集成到ABP非常简单. - -1. 安装 Volo.Abp.Autofac 包 - -```` -Install-Package Volo.Abp.Autofac -```` - -2. 添加 ``AbpAutofacModule`` 依赖 - -````C# -[DependsOn(typeof(AbpAspNetCoreMvcModule))] -[DependsOn(typeof(AbpAutofacModule))] // 在模块上添加依赖AbpAutofacModule -public class AppModule : AbpModule -{ - ... -} -```` - -3. 修改在``Startup``类下的``services.AddApplication();``如下所示: - -````C# -services.AddApplication(options => -{ - options.UseAutofac(); // 集成 Autofac -}); -```` - -4. 更新 `Program.cs`代码, 不再使用`WebHost.CreateDefaultBuilder()`方法(因为它使用默认的DI容器): - - ````csharp -public class Program -{ - public static void Main(string[] args) - { - /* - https://github.com/aspnet/AspNetCore/issues/4206#issuecomment-445612167 - CurrentDirectoryHelpers 文件位于: \framework\src\Volo.Abp.AspNetCore.Mvc\Microsoft\AspNetCore\InProcess\CurrentDirectoryHelpers.cs - 当升级到ASP.NET Core 3.0的时候将会删除这个类. - */ - CurrentDirectoryHelpers.SetCurrentDirectory(); - - BuildWebHostInternal(args).Run(); - } - public static IWebHost BuildWebHostInternal(string[] args) => - new WebHostBuilder() - .UseKestrel() - .UseContentRoot(Directory.GetCurrentDirectory()) - .UseIIS() - .UseIISIntegration() - .UseStartup() - .Build(); -} -```` - - -### 源码 - -从[此处](https://github.com/abpframework/abp-samples/tree/master/BasicAspNetCoreApplication)获取本教程中创建的示例项目的源代码. +# 在AspNet Core MVC Web Application中使用ABP + +本教程将介绍如何开始以最少的依赖关系开始使用ABP开发. + +通常情况下你需要下载一个 **[启动模板](Getting-Started-AspNetCore-MVC-Template.md)** + +## 创建一个新项目 + +1. 使用Visual Studio 2019 (16.4.0+)创建一个新的AspNet Core Web Application: + +![](images/create-new-aspnet-core-application-v2.png) + +2. 配置新的项目: + +![](images/select-empty-web-application-v2.png) + +3. 完成创建: + +![](images/create-aspnet-core-application.png) + + +## 安装 Volo.Abp.AspNetCore.Mvc 包 + +Volo.Abp.AspNetCore.Mvc是ABP集成AspNet Core MVC的包,请安装它到你项目中: + +```` +Install-Package Volo.Abp.AspNetCore.Mvc +```` + +## 创建ABP模块 + +ABP是一个模块化框架,它需要一个**启动 (根) 模块**继承自``AbpModule``: + +````C# +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.Hosting; +using Volo.Abp; +using Volo.Abp.AspNetCore.Mvc; +using Volo.Abp.Modularity; + +namespace BasicAspNetCoreApplication +{ + [DependsOn(typeof(AbpAspNetCoreMvcModule))] + public class AppModule : AbpModule + { + public override void OnApplicationInitialization( + ApplicationInitializationContext context) + { + var app = context.GetApplicationBuilder(); + var env = context.GetEnvironment(); + + if (env.IsDevelopment()) + { + app.UseDeveloperExceptionPage(); + } + else + { + app.UseExceptionHandler("/Error"); + } + + app.UseStaticFiles(); + app.UseRouting(); + app.UseConfiguredEndpoints(); + } + } +} +```` + +``AppModule`` 是应用程序启动模块的好名称. + +ABP的包定义了这个模块类,模块可以依赖其它模块.在上面的代码中 ``AppModule`` 依赖于 ``AbpAspNetCoreMvcModule`` (模块存在于[Volo.Abp.AspNetCore.Mvc](https://www.nuget.org/packages/Volo.Abp.AspNetCore.Mvc)包中). 安装新的ABP的包后添加``DependsOn``是很常见的做法. + +我们在此模块类中配置ASP.NET Core管道,而不是Startup类中. + +### 启动类 + +接下来修改启动类集成ABP模块系统: + +````C# +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.DependencyInjection; + +namespace BasicAspNetCoreApplication +{ + public class Startup + { + public void ConfigureServices(IServiceCollection services) + { + services.AddApplication(); + } + + public void Configure(IApplicationBuilder app) + { + app.InitializeApplication(); + } + } +} + +```` + +``services.AddApplication()``添加了所有``AppModule``模块中定义的全部服务. + +``Configure``方法中的``app.InitializeApplication()``完成初始化并启动应用程序. + +## 运行应用程序! + +启动该应用,它将按预期运行. + +## 使用 Autofac 依赖注入框架 + +虽然AspNet Core的依赖注入(DI)系统适用于基本要求,但[Autofac](https://autofac.org/)提供了属性注入和方法拦截等高级功能,这些功能是ABP执行高级应用程序框架功能所必需的. + +用Autofac取代AspNet Core的DI系统并集成到ABP非常简单. + +1. 安装 [Volo.Abp.Autofac](https://www.nuget.org/packages/Volo.Abp.Autofac) 包 + +```` +Install-Package Volo.Abp.Autofac +```` + +2. 添加 ``AbpAutofacModule`` 依赖 + +````C# +[DependsOn(typeof(AbpAspNetCoreMvcModule))] +[DependsOn(typeof(AbpAutofacModule))] // 在模块上添加依赖AbpAutofacModule +public class AppModule : AbpModule +{ + ... +} +```` + +3. 修改``Program.cs``以使用Autofac: + +````C# +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Hosting; + +namespace BasicAspNetCoreApplication +{ + public class Program + { + public static void Main(string[] args) + { + CreateHostBuilder(args).Build().Run(); + } + + public static IHostBuilder CreateHostBuilder(string[] args) => + Host.CreateDefaultBuilder(args) + .ConfigureWebHostDefaults(webBuilder => + { + webBuilder.UseStartup(); + }) + .UseAutofac(); // 添加这一行 + } +} +```` + +## 源码 + +从[此处](https://github.com/abpframework/abp-samples/tree/master/BasicAspNetCoreApplication)获取本教程中创建的示例项目的源代码. From ed8857832c2d390bba78446a4fad78d557103b1d Mon Sep 17 00:00:00 2001 From: ZFmY Date: Thu, 29 Oct 2020 18:32:47 +0800 Subject: [PATCH 10/20] fix typo --- docs/zh-Hans/Entity-Framework-Core-Migrations.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/zh-Hans/Entity-Framework-Core-Migrations.md b/docs/zh-Hans/Entity-Framework-Core-Migrations.md index c6f1086540..266c0f46b0 100644 --- a/docs/zh-Hans/Entity-Framework-Core-Migrations.md +++ b/docs/zh-Hans/Entity-Framework-Core-Migrations.md @@ -235,7 +235,7 @@ public static class BackgroundJobsDbContextModelCreatingExtensions } ```` -此u还获取选项用于更改此模块的数据库表前缀和模式,但在这里并不重要. +此扩展方法还提供了选项用于更改此模块的数据库表前缀和模式,但在这里并不重要. 最终的应用程序在 `MigrationsDbContext` 类中调用扩展方法, 因此它可以确定此 `MigrationsDbContext` 维护的数据库中包含哪些模块. 如果要创建第二个数据库并将某些模块表移动到第二个数据库,则需要有第二个`MigrationsDbContext` 类,该类仅调用相关模块的扩展方法. 下一部分将详细介绍该主题. @@ -883,4 +883,4 @@ public class BookStoreDbMigratorModule : AbpModule ## 结论 -本文档说明了如何拆分数据库以及管理Entity Framework Core解决方案的数据库迁移. 简而言之,你需要为每个不同的数据库创建一个单独的迁移项目. \ No newline at end of file +本文档说明了如何拆分数据库以及管理Entity Framework Core解决方案的数据库迁移. 简而言之,你需要为每个不同的数据库创建一个单独的迁移项目. From 6c1d09db932d3801fd9f3e1128b601b174c7d1fc Mon Sep 17 00:00:00 2001 From: Alper Ebicoglu Date: Thu, 29 Oct 2020 13:38:06 +0300 Subject: [PATCH 11/20] use Blazorise latest preview version volosoft/volo#3826 --- templates/app/aspnet-core/NuGet.Config | 6 ++++++ .../MyCompanyName.MyProjectName.Blazor.csproj | 4 ++-- templates/module/aspnet-core/NuGet.Config | 6 ++++++ .../MyCompanyName.MyProjectName.Blazor.Host.csproj | 4 ++-- 4 files changed, 16 insertions(+), 4 deletions(-) create mode 100644 templates/app/aspnet-core/NuGet.Config create mode 100644 templates/module/aspnet-core/NuGet.Config diff --git a/templates/app/aspnet-core/NuGet.Config b/templates/app/aspnet-core/NuGet.Config new file mode 100644 index 0000000000..be8a1ece10 --- /dev/null +++ b/templates/app/aspnet-core/NuGet.Config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj index cfaf51eee7..0da1f2822a 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj @@ -7,8 +7,8 @@ - - + + diff --git a/templates/module/aspnet-core/NuGet.Config b/templates/module/aspnet-core/NuGet.Config new file mode 100644 index 0000000000..be8a1ece10 --- /dev/null +++ b/templates/module/aspnet-core/NuGet.Config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/MyCompanyName.MyProjectName.Blazor.Host.csproj b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/MyCompanyName.MyProjectName.Blazor.Host.csproj index 9d0ce4f54d..ab9baf3b70 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/MyCompanyName.MyProjectName.Blazor.Host.csproj +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/MyCompanyName.MyProjectName.Blazor.Host.csproj @@ -8,8 +8,8 @@ - - + + From 0cbdb692ae98d1a061d09a25be064a0188bbe70c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Thu, 29 Oct 2020 14:45:53 +0300 Subject: [PATCH 12/20] Documented The Basic Theme --- docs/en/Themes/Basic.md | 3 +- docs/en/UI/AspNetCore/Basic-Theme.md | 89 +++++++++++++++++- .../Customization-User-Interface.md | 2 +- docs/en/docs-nav.json | 8 +- docs/en/images/example-global-styles.png | Bin 0 -> 14635 bytes 5 files changed, 97 insertions(+), 5 deletions(-) create mode 100644 docs/en/images/example-global-styles.png diff --git a/docs/en/Themes/Basic.md b/docs/en/Themes/Basic.md index a0165c803a..819138de5f 100644 --- a/docs/en/Themes/Basic.md +++ b/docs/en/Themes/Basic.md @@ -1,3 +1,2 @@ -## Basic Theme +This document has been moved to [here](../UI/AspNetCore/Basic-Theme.md). -TODO \ No newline at end of file diff --git a/docs/en/UI/AspNetCore/Basic-Theme.md b/docs/en/UI/AspNetCore/Basic-Theme.md index 3435e94a8b..5f28475f43 100644 --- a/docs/en/UI/AspNetCore/Basic-Theme.md +++ b/docs/en/UI/AspNetCore/Basic-Theme.md @@ -1,3 +1,90 @@ # ASP.NET Core MVC / Razor Pages: The Basic Theme -This document is in progress. See the [Theming](Theming.md) document. \ No newline at end of file +The Basic Theme is a theme implementation for the ASP.NET Core MVC / Razor Pages UI. It is a minimalist theme that doesn't add any styling on top of the plain [Bootstrap](https://getbootstrap.com/). You can take the Basic Theme as the **base theme** and build your own theme or styling on top of it. See the *Customization* section. + +The Basic Theme has RTL (Right-to-Left language) support. + +> If you are looking for a professional, enterprise ready theme, you can check the [Lepton Theme](https://commercial.abp.io/themes), which is a part of the [ABP Commercial](https://commercial.abp.io/). + +> See the [Theming document](Theming.md) to learn about themes. + +## Installation + +**This theme is already installed** when you create a new solution using the [startup templates](../../Startup-Templates/Index.md). If you need to manually install it, follow the steps below: + +* Install the [Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic](https://www.nuget.org/packages/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic) NuGet package to your web project. +* Add `AbpAspNetCoreMvcUiBasicThemeModule` into the `[DependsOn(...)]` attribute for your [module class](../../Module-Development-Basics.md) in the web project. +* Install the [@abp/aspnetcore.mvc.ui.theme.basic](https://www.npmjs.com/package/@abp/aspnetcore.mvc.ui.theme.basic) NPM package to your web project (e.g. `npm install @abp/aspnetcore.mvc.ui.theme.basic` or `yarn add @abp/aspnetcore.mvc.ui.theme.basic`). +* Run `gulp` command in a command line terminal in the web project's folder. + +## Layouts + +The Basic Theme implements the standard layouts. All the layouts implement the following parts; + +* Global [Bundles](Bundling-Minification.md) +* [Page Alerts](Page-Alerts.md) +* [Layout Hooks](Layout-Hooks.md) +* [Widget](Widgets.md) Resources + +### The Application Layout + +![basic-theme-application-layout](../../images/basic-theme-application-layout.png) + +Application Layout implements the following parts, in addition to the common parts mentioned above; + +* Branding +* Main [Menu](Navigation-Menu.md) +* Main [Toolbar](Toolbars.md) with Language Selection & User Menu + +### The Account Layout + +![basic-theme-account-layout](D:\Github\abp\docs\en\images\basic-theme-account-layout.png) + +Application Layout implements the following parts, in addition to the common parts mentioned above; + +* Branding +* Main [Menu](Navigation-Menu.md) +* Main [Toolbar](Toolbars.md) with Language Selection & User Menu +* Tenant Switch Area + +### Empty Layout + +Empty layout is empty, as its name stands for. However, it implements the common parts mentioned above. + +## Customization + +You have two options two customize this theme: + +### Overriding Styles/Components + +In this approach, you continue to use the the theme as NuGet and NPM packages and customize the parts you need to. There are several ways to customize it; + +#### Override the Styles + +1. Create a CSS file in the `wwwroot` folder of your project: + +![example-global-styles](../../images/example-global-styles.png) + +2. Add the style file to the global bundle, in the `ConfigureServices` method of your [module](../../Module-Development-Basics.md): + +````csharp +Configure(options => +{ + options.StyleBundles.Configure(BasicThemeBundles.Styles.Global, bundle => + { + bundle.AddFiles("/styles/global-styles.css"); + }); +}); +```` + +#### Override the Components + +See the [User Interface Customization Guide](Customization-User-Interface.md) to learn how you can replace components, customize and extend the user interface. + +### Copy & Customize + +You can download the [source code](https://github.com/abpframework/abp/tree/dev/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic) of the Basic Theme, copy the project content into your solution, re-arrange the package/module dependencies (see the Installation section above to understand how it was installed to the project) and freely customize the theme based on your application requirements. + +## See Also + +* [Theming](Theming.md) \ No newline at end of file diff --git a/docs/en/UI/AspNetCore/Customization-User-Interface.md b/docs/en/UI/AspNetCore/Customization-User-Interface.md index c4e196fbb9..d2a1193a53 100644 --- a/docs/en/UI/AspNetCore/Customization-User-Interface.md +++ b/docs/en/UI/AspNetCore/Customization-User-Interface.md @@ -132,7 +132,7 @@ The screenshot below was taken from the **basic theme** comes with the applicati ![bookstore-brand-area-highlighted](../../images/bookstore-brand-area-highlighted.png) -[The basic theme](../../Themes/Basic.md) defines some view components for the layout. For example, the highlighted area with the red rectangle above is called **Brand component**. You probably want to customize this component by adding your **own application logo**. Let's see how to do it. +[The basic theme](Basic-Theme.md) defines some view components for the layout. For example, the highlighted area with the red rectangle above is called **Brand component**. You probably want to customize this component by adding your **own application logo**. Let's see how to do it. First, create your logo and place under a folder in your web application. We used `wwwroot/logos/bookstore-logo.png` path. Then copy the Brand component's view ([from here](https://github.com/abpframework/abp/blob/dev/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Themes/Basic/Components/Brand/Default.cshtml)) from the basic theme files under the `Themes/Basic/Components/Brand` folder. The result should be similar the picture below: diff --git a/docs/en/docs-nav.json b/docs/en/docs-nav.json index 9510da38eb..c5bc0eeb3a 100644 --- a/docs/en/docs-nav.json +++ b/docs/en/docs-nav.json @@ -450,7 +450,13 @@ }, { "text": "Theming", - "path": "UI/AspNetCore/Theming.md" + "path": "UI/AspNetCore/Theming.md", + "items": [ + { + "text": "The Basic Theme", + "path": "UI/AspNetCore/Basic-Theme.md" + } + ] }, { "text": "JavaScript API", diff --git a/docs/en/images/example-global-styles.png b/docs/en/images/example-global-styles.png new file mode 100644 index 0000000000000000000000000000000000000000..04232aa62d43d513a516ae85ae459461237ae6f7 GIT binary patch literal 14635 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 ajGy4TMK-bK>)YLrfRvcLXqB*`|NjT#7Dy8S literal 0 HcmV?d00001 From b6761195d08dd11f72e568332e0afe7d86d1c378 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Thu, 29 Oct 2020 14:48:46 +0300 Subject: [PATCH 13/20] Update Basic-Theme.md --- docs/en/UI/AspNetCore/Basic-Theme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/UI/AspNetCore/Basic-Theme.md b/docs/en/UI/AspNetCore/Basic-Theme.md index 5f28475f43..67977ffd4e 100644 --- a/docs/en/UI/AspNetCore/Basic-Theme.md +++ b/docs/en/UI/AspNetCore/Basic-Theme.md @@ -38,7 +38,7 @@ Application Layout implements the following parts, in addition to the common par ### The Account Layout -![basic-theme-account-layout](D:\Github\abp\docs\en\images\basic-theme-account-layout.png) +![basic-theme-account-layout](../../images/basic-theme-account-layout.png) Application Layout implements the following parts, in addition to the common parts mentioned above; From 47224d242f5a3b11d74a9ead60596244c1e32fa8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Thu, 29 Oct 2020 16:09:18 +0300 Subject: [PATCH 14/20] Documented Toolbars for the aspnet core mvc UI --- docs/en/UI/AspNetCore/Toolbars.md | 73 ++++++++++++++++++++++++++++++- 1 file changed, 72 insertions(+), 1 deletion(-) diff --git a/docs/en/UI/AspNetCore/Toolbars.md b/docs/en/UI/AspNetCore/Toolbars.md index cc3bcd95be..524ef3f18b 100644 --- a/docs/en/UI/AspNetCore/Toolbars.md +++ b/docs/en/UI/AspNetCore/Toolbars.md @@ -1,3 +1,74 @@ # Toolbars -TODO \ No newline at end of file +The Toolbar system is used to define **toolbars** on the user interface. Modules (or your application) can add **items** to a toolbar, then the [theme](Theming.md) renders the toolbar on the **layout**. + +There is only one **standard toolbar** named "Main" (defined as a constant: `StandardToolbars.Main`). The [Basic Theme](Basic-Theme) renders the main toolbar as shown below: + +![bookstore-toolbar-highlighted](../../images/bookstore-toolbar-highlighted.png) + +In the screenshot above, there are two items added to the main toolbar: Language switch component & user menu. You can add your own items here. + +## Example: Add a Notification Icon + +In this example, we will add a **notification (bell) icon** to the left of the language switch item. A item in the toolbar should be a **view component**. So, first, create a new view component in your project: + +![bookstore-notification-view-component](../../images/bookstore-notification-view-component.png) + +**NotificationViewComponent.cs** + +````csharp +public class NotificationViewComponent : AbpViewComponent +{ + public async Task InvokeAsync() + { + return View("/Pages/Shared/Components/Notification/Default.cshtml"); + } +} +```` + +**Default.cshtml** + +````xml +
+ +
+```` + +Now, we can create a class implementing the `IToolbarContributor` interface: + +````csharp +public class MyToolbarContributor : IToolbarContributor +{ + public Task ConfigureToolbarAsync(IToolbarConfigurationContext context) + { + if (context.Toolbar.Name == StandardToolbars.Main) + { + context.Toolbar.Items + .Insert(0, new ToolbarItem(typeof(NotificationViewComponent))); + } + + return Task.CompletedTask; + } +} +```` + +This class adds the `NotificationViewComponent` as the first item in the `Main` toolbar. + +Finally, you need to add this contributor to the `AbpToolbarOptions`, in the `ConfigureServices` of your [module](../../Module-Development-Basics.md): + +````csharp +Configure(options => +{ + options.Contributors.Add(new MyToolbarContributor()); +}); +```` + +That's all, you will see the notification icon on the toolbar when you run the application: + +![bookstore-notification-icon-on-toolbar](../../images/bookstore-notification-icon-on-toolbar.png) + +`NotificationViewComponent` in this sample simply returns a view without any data. In real life, you probably want to **query database** (or call an HTTP API) to get notifications and pass to the view. If you need, you can add a `JavaScript` or `CSS` file to the global [bundle](Bundling-Minification.md) for your toolbar item. + +## IToolbarManager + +`IToolbarManager` is used to render the toolbar. It returns the toolbar items by a toolbar name. This is generally used by the [themes](Theming.md) to render the toolbar on the layout. \ No newline at end of file From 6b73be814ff0887cf184267416f0d9d54a599e8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Thu, 29 Oct 2020 16:10:48 +0300 Subject: [PATCH 15/20] Update docs-nav.json --- docs/en/docs-nav.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/en/docs-nav.json b/docs/en/docs-nav.json index c5bc0eeb3a..8b9a889974 100644 --- a/docs/en/docs-nav.json +++ b/docs/en/docs-nav.json @@ -444,6 +444,10 @@ "text": "Widgets", "path": "UI/AspNetCore/Widgets.md" }, + { + "text": "Toolbars", + "path": "UI/AspNetCore/Toolbars.md" + }, { "text": "Layout Hooks", "path": "UI/AspNetCore/Layout-Hooks.md" From a865f0f8ec9fda67183ef9cbeb81e60926a123a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Thu, 29 Oct 2020 17:04:35 +0300 Subject: [PATCH 16/20] Initial ASP.NET Core MVC / Razor Pages: Data Tables document --- docs/en/UI/AspNetCore/Breadcrumbs.md | 2 +- docs/en/UI/AspNetCore/Data-Tables.md | 102 ++++++++++++++++++++++++++ docs/en/docs-nav.json | 4 + docs/en/images/datatables-example.png | Bin 0 -> 49745 bytes 4 files changed, 107 insertions(+), 1 deletion(-) create mode 100644 docs/en/UI/AspNetCore/Data-Tables.md create mode 100644 docs/en/images/datatables-example.png diff --git a/docs/en/UI/AspNetCore/Breadcrumbs.md b/docs/en/UI/AspNetCore/Breadcrumbs.md index cc3bcd95be..6147f71236 100644 --- a/docs/en/UI/AspNetCore/Breadcrumbs.md +++ b/docs/en/UI/AspNetCore/Breadcrumbs.md @@ -1,3 +1,3 @@ -# Toolbars +# Breadcrumbs TODO \ No newline at end of file diff --git a/docs/en/UI/AspNetCore/Data-Tables.md b/docs/en/UI/AspNetCore/Data-Tables.md new file mode 100644 index 0000000000..b7c4dd3b43 --- /dev/null +++ b/docs/en/UI/AspNetCore/Data-Tables.md @@ -0,0 +1,102 @@ +# ASP.NET Core MVC / Razor Pages: Data Tables + +A Data Table (aka Data Grid) is a UI component to show tabular data to the users. There are a lot of Data table components/libraries and **you can use any one you like** with the ABP Framework. However, the startup templates come with the [DataTables.Net](https://datatables.net/) library as **pre-installed and configured**. ABP Framework provides adapters for this library and make it easy to use with the API endpoints. + +An example screenshot from the user management page that shows the user list in a data table: + +![datatables-example](../../images/datatables-example.png) + +## DataTables.Net Integration + +First of all, you can follow the official documentation to understand how the [DataTables.Net](https://datatables.net/) works. This section will focus on the ABP addons & integration points rather than fully covering the usage of this library. + +### A Quick Example + +You can follow the [web application development tutorial](https://docs.abp.io/en/abp/latest/Tutorials/Part-1?UI=MVC) for a complete example application that uses the DataTables.Net as the Data Table. This section shows a minimalist example. + +You do nothing to add DataTables.Net library to the page since it is already added to the global [bundle](Bundling-Minification.md) by default. + +First, add an `abp-table` as shown below, with an `id`: + +````html + +```` + +> `abp-table` is a [Tag Helper](Tag-Helpers/Index.md) defined by the ABP Framework, but a simple `` tag would also work. + +Then call the `DataTable` plugin on the table selector: + +````js +var dataTable = $('#BooksTable').DataTable( + abp.libs.datatables.normalizeConfiguration({ + serverSide: true, + paging: true, + order: [[1, "asc"]], + searching: false, + ajax: abp.libs.datatables.createAjax(acme.bookStore.books.book.getList), + columnDefs: [ + { + title: l('Actions'), + rowAction: { + items: + [ + { + text: l('Edit'), + action: function (data) { + ///... + } + } + ] + } + }, + { + title: l('Name'), + data: "name" + }, + { + title: l('PublishDate'), + data: "publishDate", + render: function (data) { + return luxon + .DateTime + .fromISO(data, { + locale: abp.localization.currentCulture.name + }).toLocaleString(); + } + }, + { + title: l('Price'), + data: "price" + } + ] + }) +); +```` + +The example code above uses some ABP integration features those will be explained in the next sections. + +### Configuration Normalization + +`abp.libs.datatables.normalizeConfiguration` function takes a DataTables configuration and normalizes to simplify it; + +* Sets `scrollX` option to `true`, if not set. +* Sets `target` index for the column definitions. +* Sets the `language` option to [localize](../../Localization.md) the table in the current language. + +#### Default Configuration + +`normalizeConfiguration` uses the default configuration. You can change the default configuration using the `abp.libs.datatables.defaultConfigurations` object. Example: + +````js +abp.libs.datatables.defaultConfigurations.scrollX = false; +```` + +Here, the all configuration options; + +* `scrollX`: `false` by default. +* `dom`: Default value is `<"dataTable_filters"f>rt<"row dataTable_footer"<"col-auto"l><"col-auto"i><"col"p>>`. +* `language`: A function that returns the localization text using the current language. + +## Other Data Grids + +You can use any library you like. For example, [see this article](https://community.abp.io/articles/using-devextreme-components-with-the-abp-framework-zb8z7yqv) to learn how to use DevExtreme Data Grid in your applications. \ No newline at end of file diff --git a/docs/en/docs-nav.json b/docs/en/docs-nav.json index 8b9a889974..978d40a5b5 100644 --- a/docs/en/docs-nav.json +++ b/docs/en/docs-nav.json @@ -414,6 +414,10 @@ "text": "Modals", "path": "UI/AspNetCore/Modals.md" }, + { + "text": "Data Tables", + "path": "UI/AspNetCore/Data-Tables.md" + }, { "text": "Page Alerts", "path": "UI/AspNetCore/Page-Alerts.md" diff --git a/docs/en/images/datatables-example.png b/docs/en/images/datatables-example.png new file mode 100644 index 0000000000000000000000000000000000000000..ef3e74576b3bd1641981115ec230fb6a06d3361c GIT binary patch literal 49745 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 literal 0 HcmV?d00001 From 8a143af6287424e4662295da545d4f23fa79c6c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Thu, 29 Oct 2020 17:44:56 +0300 Subject: [PATCH 17/20] Documented the Row Actions --- docs/en/UI/AspNetCore/Data-Tables.md | 78 ++++++++++++++++++ .../datatables-row-actions-confirmation.png | Bin 0 -> 42410 bytes docs/en/images/datatables-row-actions.png | Bin 0 -> 19872 bytes 3 files changed, 78 insertions(+) create mode 100644 docs/en/images/datatables-row-actions-confirmation.png create mode 100644 docs/en/images/datatables-row-actions.png diff --git a/docs/en/UI/AspNetCore/Data-Tables.md b/docs/en/UI/AspNetCore/Data-Tables.md index b7c4dd3b43..023c61ad87 100644 --- a/docs/en/UI/AspNetCore/Data-Tables.md +++ b/docs/en/UI/AspNetCore/Data-Tables.md @@ -97,6 +97,84 @@ Here, the all configuration options; * `dom`: Default value is `<"dataTable_filters"f>rt<"row dataTable_footer"<"col-auto"l><"col-auto"i><"col"p>>`. * `language`: A function that returns the localization text using the current language. +### Row Actions + +`rowAction` is an option defined by the ABP Framework to the column definitions to show a drop down button to take actions for a row in the table. + +The example screenshot below shows the actions for each user in the user management table: + +![datatables-example](../../images/datatables-row-actions.png) + +`rowAction` is defined as a part of a column definition: + +````csharp +{ + title: l('Actions'), + rowAction: { + //TODO: CONFIGURATION + } +}, +```` + +**Example: Show *Edit* and *Delete* actions for a book row** + +````js +{ + title: l('Actions'), + rowAction: { + items: + [ + { + text: l('Edit'), + action: function (data) { + //TODO: Open a modal to edit the book + } + }, + { + text: l('Delete'), + confirmMessage: function (data) { + return "Are you sure to delete the book " + data.record.name; + }, + action: function (data) { + acme.bookStore.books.book + .delete(data.record.id) + .then(function() { + abp.notify.info("Successfully deleted!"); + data.table.ajax.reload(); + }); + } + } + ] + } +}, +```` + +#### Action Items + +`items` is an array of action definitions. An action definition can have the following options; + +* `text`: The text (a `string`) for this action to be shown in the actions drop down. +* `action`: A `function` that is executed when the user clicks to the action. The function takes a `data` argument that has the following fields; + * `data.record`: This is the data object related to the row. You can access the data fields like `data.record.id`, `data.record.name`... etc. + * `data.table`: The DataTables instance. +* `confirmMessage`: A function (see the example above) that returns a message (`string`) to show a dialog to get a confirmation from the user before executing the `action`. Example confirmation dialog: + +![datatables-row-actions-confirmation](D:\Github\abp\docs\en\images\datatables-row-actions-confirmation.png) + +You can use the [localization](JavaScript-API/Localization.md) system to show a localized message. + +* `visible`: A `bool` or a `function` that returns a `bool`. If the result is `false`, then the action is not shown in the actions dropdown. This is generally combined by the [authorization](JavaScript-API/Auth.md) system to hide the action if the user has no permission to take this action. Example: + +````js +visible: abp.auth.isGranted('BookStore.Books.Delete'); +```` + +If you define a `function`, then the `function` has two arguments: `record` (the data object of the related row) and the `table` (the DataTable instance). So, you can decide to show/hide the action dynamically, based on the row data and other conditions. + +* `iconClass`: Can be used to show a font-icon, like a [Font-Awesome](https://fontawesome.com/) icon (ex: `fas fa-trash-alt`), near to the action text. +* `enabled`: A `function` that returns a `bool` to disable the action. The `function` takes a `data` object with two fields: `data.record` is the data object related to the row and `data.table` is the DataTables instance. +* `displayNameHtml`: An alternative to use `text` and/or `icon`. You can directly set an HTML content as the display name of the action. + ## Other Data Grids You can use any library you like. For example, [see this article](https://community.abp.io/articles/using-devextreme-components-with-the-abp-framework-zb8z7yqv) to learn how to use DevExtreme Data Grid in your applications. \ No newline at end of file diff --git a/docs/en/images/datatables-row-actions-confirmation.png b/docs/en/images/datatables-row-actions-confirmation.png new file mode 100644 index 0000000000000000000000000000000000000000..9be8433f9c451c60c4fd6993d33cc3f261aae01c GIT binary patch literal 42410 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 literal 0 HcmV?d00001 diff --git a/docs/en/images/datatables-row-actions.png b/docs/en/images/datatables-row-actions.png new file mode 100644 index 0000000000000000000000000000000000000000..4eae0f098af1fd42fb44b0f803c31f695b76d347 GIT binary patch literal 19872 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 Date: Thu, 29 Oct 2020 19:36:08 +0300 Subject: [PATCH 18/20] Update Data-Tables.md --- docs/en/UI/AspNetCore/Data-Tables.md | 11 +++++++---- docs/en/images/datatables-row-actions-icon.png | Bin 0 -> 12576 bytes 2 files changed, 7 insertions(+), 4 deletions(-) create mode 100644 docs/en/images/datatables-row-actions-icon.png diff --git a/docs/en/UI/AspNetCore/Data-Tables.md b/docs/en/UI/AspNetCore/Data-Tables.md index 023c61ad87..f21d69fe51 100644 --- a/docs/en/UI/AspNetCore/Data-Tables.md +++ b/docs/en/UI/AspNetCore/Data-Tables.md @@ -157,9 +157,9 @@ The example screenshot below shows the actions for each user in the user managem * `action`: A `function` that is executed when the user clicks to the action. The function takes a `data` argument that has the following fields; * `data.record`: This is the data object related to the row. You can access the data fields like `data.record.id`, `data.record.name`... etc. * `data.table`: The DataTables instance. -* `confirmMessage`: A function (see the example above) that returns a message (`string`) to show a dialog to get a confirmation from the user before executing the `action`. Example confirmation dialog: +* `confirmMessage`: A `function` (see the example above) that returns a message (`string`) to show a dialog to get a confirmation from the user before executing the `action`. Example confirmation dialog: -![datatables-row-actions-confirmation](D:\Github\abp\docs\en\images\datatables-row-actions-confirmation.png) +![datatables-row-actions-confirmation](../../images/datatables-row-actions-confirmation.png) You can use the [localization](JavaScript-API/Localization.md) system to show a localized message. @@ -171,9 +171,12 @@ visible: abp.auth.isGranted('BookStore.Books.Delete'); If you define a `function`, then the `function` has two arguments: `record` (the data object of the related row) and the `table` (the DataTable instance). So, you can decide to show/hide the action dynamically, based on the row data and other conditions. -* `iconClass`: Can be used to show a font-icon, like a [Font-Awesome](https://fontawesome.com/) icon (ex: `fas fa-trash-alt`), near to the action text. +* `iconClass`: Can be used to show a font-icon, like a [Font-Awesome](https://fontawesome.com/) icon (ex: `fas fa-trash-alt`), near to the action text. Example screenshot: + +![datatables-row-actions-confirmation](../../images/datatables-row-actions-icon.png) + * `enabled`: A `function` that returns a `bool` to disable the action. The `function` takes a `data` object with two fields: `data.record` is the data object related to the row and `data.table` is the DataTables instance. -* `displayNameHtml`: An alternative to use `text` and/or `icon`. You can directly set an HTML content as the display name of the action. +* `displayNameHtml`: Set this to `true` is the `text` value contains HTML tags. ## Other Data Grids diff --git a/docs/en/images/datatables-row-actions-icon.png b/docs/en/images/datatables-row-actions-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..70111fc1ac181302c0d2ca3d8fd2e147b0c7895c GIT binary patch literal 12576 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 Dx0h|f literal 0 HcmV?d00001 From e1c754386992efc54a905fdff5c70ae45b9cb577 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Thu, 29 Oct 2020 20:21:49 +0300 Subject: [PATCH 19/20] Resolved #3300: Completed the datatables document. --- docs/en/UI/AspNetCore/Data-Tables.md | 80 ++++++++++++++++++ .../images/datatables-custom-render-date.png | Bin 0 -> 12093 bytes .../images/datatables-default-render-date.png | Bin 0 -> 16046 bytes 3 files changed, 80 insertions(+) create mode 100644 docs/en/images/datatables-custom-render-date.png create mode 100644 docs/en/images/datatables-default-render-date.png diff --git a/docs/en/UI/AspNetCore/Data-Tables.md b/docs/en/UI/AspNetCore/Data-Tables.md index f21d69fe51..79fd6a3be1 100644 --- a/docs/en/UI/AspNetCore/Data-Tables.md +++ b/docs/en/UI/AspNetCore/Data-Tables.md @@ -97,6 +97,14 @@ Here, the all configuration options; * `dom`: Default value is `<"dataTable_filters"f>rt<"row dataTable_footer"<"col-auto"l><"col-auto"i><"col"p>>`. * `language`: A function that returns the localization text using the current language. +### AJAX Adapter + +DataTables.Net has its own expected data format while getting results of an AJAX call to the server to get the table data. They are especially related how paging and sorting parameters are sent and received. ABP Framework also offers its own conventions for the client-server [AJAX](JavaScript-API/Ajax.md) communication. + +The `abp.libs.datatables.createAjax` method (used in the example above) adapts request and response data format and perfectly works with the [Dynamic JavaScript Client Proxy](Dynamic-JavaScript-Client-Proxies.md) system. + +This works automatically, so most of the times you don't need to know how it works. See the [DTO document](../../Data-Transfer-Objects.md) if you want to learn more about `IPagedAndSortedResultRequest`, `IPagedResult` and other standard interfaces and base DTO classes those are used in client to server communication. + ### Row Actions `rowAction` is an option defined by the ABP Framework to the column definitions to show a drop down button to take actions for a row in the table. @@ -178,6 +186,78 @@ If you define a `function`, then the `function` has two arguments: `record` (the * `enabled`: A `function` that returns a `bool` to disable the action. The `function` takes a `data` object with two fields: `data.record` is the data object related to the row and `data.table` is the DataTables instance. * `displayNameHtml`: Set this to `true` is the `text` value contains HTML tags. +There are some rules with the action items; + +* If none of the action items is visible then the actions column is not rendered. + +### Data Format + +#### The Problem + +See the *Creation Time* column in the example below: + +````js +{ + title: l('CreationTime'), + data: "creationTime", + render: function (data) { + return luxon + .DateTime + .fromISO(data, { + locale: abp.localization.currentCulture.name + }).toLocaleString(luxon.DateTime.DATETIME_SHORT); + } +} +```` + +The `render` is a standard DataTables option to render the column content by a custom function. This example uses the [luxon](https://moment.github.io/luxon/) library (which is installed by default) to write a human readable value of the `creationTime` in the current user's language. Example output of the column: + +![datatables-custom-render-date](../../images/datatables-custom-render-date.png) + +If you don't define the render option, then the result will be ugly and not user friendly: + +![datatables-custom-render-date](../../images/datatables-default-render-date.png) + +However, rendering a `DateTime` is almost same and repeating the same rendering logic everywhere is against to the DRY (Don't Repeat Yourself!) principle. + +#### dataFormat Option + +`dataFormat` column option specifies the data format that is used to render the column data. The same output could be accomplished using the following column definition: + +````js +{ + title: l('CreationTime'), + data: "creationTime", + dataFormat: 'datetime' +} +```` + +`dataFormat: 'datetime'` specifies the data format for this column. There are a few pre-defined `dataFormat`s: + +* `boolean`: Shows a `check` icon for `true` and `times` icon for `false` value and useful to render `bool` values. +* `date`: Shows date part of a `DateTime` value, formatted based on the current culture. +* `datetime`: Shows date & time (excluding seconds) of a `DateTime` value, formatted based on the current culture. + +### Default Renderers + +`abp.libs.datatables.defaultRenderers` option allows you to define new data formats and set renderers for them. + +**Example: Render male / female icons based on the gender** + +````js +abp.libs.datatables.defaultRenderers['gender'] = function(value) { + if (value === 'f') { + return ''; + } else { + return ''; + } +}; +```` + +Assuming that the possible values for a column data is `f` and `m`, the `gender` data format shows female/male icons instead of `f` and `m` texts. You can now set `dataFormat: 'gender'` for a column definition that has the proper data values. + +> You can write the default renderers in a single JavaScript file and add it to the [Global Script Bundle](Bundling-Minification.md), so you can reuse them in all the pages. + ## Other Data Grids You can use any library you like. For example, [see this article](https://community.abp.io/articles/using-devextreme-components-with-the-abp-framework-zb8z7yqv) to learn how to use DevExtreme Data Grid in your applications. \ No newline at end of file diff --git a/docs/en/images/datatables-custom-render-date.png b/docs/en/images/datatables-custom-render-date.png new file mode 100644 index 0000000000000000000000000000000000000000..344237aea7f85b1c6d385727b0baa553bd317107 GIT binary patch literal 12093 zcmchdbx>SUljtwOf`t&=Nl1VI!CeCc2oM4U27>D#gS$&Y2=30{1b24^2<|?(1a}+U z9{F~+ws!0L_SL>WUe(mp)V+O9ch5cNp6*|FpyFp~985Ay003}gK7RND07zPozqg-0 zdHmi)A;ACu8bIcQn2JmC{(|dQg3VOcqeK4a{8WDU#t_BI5G`N0!%Z0%OI?Sl z$#Y^w6yAC90P-$W?mt8^dFX22zmqRNG5s3Ti4*Wd7Er3e#&H$ry+BKLw@glSSP)#j z%TjM>C?r1bx)llc{&7&?wp3fVqiNlI=Cp}RE#d*Z{84pf=&k1S+(3hY;OR>W0?Z%J zpJAekKSlR@^74nT__ycnVj1tBu3Y{)i0`^DL4NtmB;ell;|1>tdQ#Jer%KYbxc_`W zx+2XF8%2ia;(Y((y#GaP8}xAD4JU%d-OYKE>6~Z}W_9Drk;gXc(%*?}A7VZ~!Mh39 zWzva#81_cjxu3Jn>c)BKhV36>lKQ$~{y>C1Smb-FBR1}+A5fML(eBFg5#Y{;>+t)M z81_dawo&_PL99AcZEo!@b8W!A5x?EumbZ!uLDOx0X8?KNz2u`Wh$n4&H@%$uNXscZ z@sSVH$3gj7ssH7l_;-sP!YX*chX(ZJ#lEY5kewkno=Jh_NtiIKWC1A)LF2KcL(HV> zMxKtUv*U4eu!NbE>dEh4V`|l)L1w^*y_TAVNdElNBDVHaQEW*ycbt*6bOE0g*(a_- zGsC=?f~wSh>rj9+$A#p;n}Zk_Np>DPEUQCISX6qI;InIc5@X8yEqRu28|epc>{{4^ zz>l9%&yS4lT?lo@1}Pf0v*|zddO!_~NenHZrQTDKAoq8LlO84__%cCV-Vk??wbt{_S+G%bKWtXV^k8NcMArX3iwDQ}3ajv1_$S2ENnjygV#aOK%8ASmT|6bXa>>M=`#+dMVb+5E@ za-HTZHavQUSeSX1cS+IZqCFO>USB{@Dt`RS%-$1jbrfN`$jJmIm+4oIyz5C;DN{zMOzz<=Dt0cW3cfK$KfwHSmfgi5|$3MWpOvHJF z69tGom)`0c(c5TZ0lgU6+X$0C*)77YQvYZ1=e!FswkkpA|~(YSDZ!=h!e{&))a zxWt?_OPFxzsjBDC*-|Ws{b6cYP%opoaa)4m&|=wL;pAr`U_`}<{BFgJL5H*@KPZB_Hoa! zUX>rf?h($1OAj|oiHUbg#}5M(U3|CWOBZ17NraU`#;eT|4PJfKj}a>$MlvlvK0Ci; z)UBojyR)h*IeE#q9&?%)imMo3lJrDW^s-=zLDVK+d;mK_-N{5npywx zSCYM*G)p~d^UWu(-d#&-XblwD6aUt_&Uu48xb(D`{?oN`XW_|3tM%c7`E&xt-E}`! z^EEF?~ ztFU=^KlnkBzL}hZb?dWlNv(B>ZbsZw%Cr6@JkSL1Dk`eK@5GCYEVO!E*H2#*euO!n zTu2qd<<;$`o$+|_CWuOcw8=ew_cWilBQ73(>(AHe8$THFW_aTxHB(>?#!5oG)f1ev z9}--cbeLYqezpj<6#Ukq<3FyW`q7;6*ZNF(|A*qzI8VyR5>wr_dE5KNXp9+A0+lJ1 zzqh&H)U(TVSRTq|SrIWH>FuRrn#ubi;$Rx;_cFzWA8xi9d){I_L$6Z97}&yrSAf7E zk%ld}&I>4YgQ#S;3uFH??H4zBA2gI-dXm=47M)AkdHJPAy=(ddd7N8;cB0EjD@-`H zprF{%ISakNef_IOb{BoVn?K=Ir%>#p3A%KCf}E7ruSG1pjS89X&V$eKz{e(d7noHd zJ8Jroq?oshx6X6woF=>V&Ra*d4}2cC9}6F*sDD4DK-Np*T&?5Lajc0E6<)JIll0mn zblr7V)x5u!pVO{wglBhYk)CqGO%k1wTN{>Q~pkZ5NQH7)Oi4bTXYbK$GW# zzKQ(O_dD;1fahQ3admbx&%;2ikyEL#M5C+oK?riEBTliSvQTIvow?_zU3V|7NHMbD z_Y4+IiG?|$Vb`xmH*$VRxwyIfOoX!OtnN)3I=*f@bi6Q)`ne@xDvIr?%c6Lx56bk_v#Ie||)Yx5iNS-qkL*6kp z7MNYx?CW&z^+tt>q8N1d)@9pYmO0lABu*dOst5QZ?-M2nN?Wq^%zN^B` zqt@NBNrpu<&<*Ll%*j)eX#4U9y9&pO_Da8(YO^;*9`$gTOX^k9udYGgf~Xqp=p;-Q zD_!cV%!?dlp5BRqHKS7Q1O|ey0LaoCr-Kv~?Ls4ZqHg88)h6q$^*~2_v&_hBcIAc=cz)|BH~bnl_>pP7MCImH z{@o(dc-Kd_yWqIKmItX{t+Hds&|e@KNg)Nb-uI((3e?OVEh2mEd9ZfX9FKio?}m;k zF^gTA8pnuF340Yb?q3bODkGs3B7>!?VsnLMZ;&>zz(Ft^%=q~8kJ^}+=BXID4{T`a6#il@56x) zFA^{W?-@c`W;cCr|7^Ep%{?$I9PYZ8=ZRUCa;X?=-Jd`(9vV8T5clK$89Kz)yf-W& z>a&JwtcC07wH+)%Gj8ka_m=P#j|)k2t>mkc2${r4D;$8m0&-o`Q)8EL7; zLzK=b)COlcEnq?J=k>voEqL^}ruhpA>DG(<@&NC#{FZ#I?YNeNT$+d?IWLM@!>Ey? zOsS|MIoL&PH2WMUl+w+DEbEGK)sFc(B03C&63s&~q0?z2)=jOY1unH0?y|MKt=2Yl z-=EUYyI?tct8gb)ajY}8NHyR8D-AKZ_9j?{yp%X@F+BKb(xDOS4xi2AIef&kK&g*r;_VgShRJe*r7~u-e*#fp8OJ0zk1sY zuUKu8^w3-{;gFfAN1kuz-@9p_*YxMDQ;4aW3}ml$w$mlIWoq0zS6wW{JtO&MI9>c} z9I0|P_yGM$@6N8D-@F14QV$`f7oHWUS%OFjWH`g#$UG&rL2KnQ5&x*0`Tr0o|LZvY zzr@r3RP0!0fi?6_8(sY4@bkOVhy&{%kFoQ=#r)m$8xL%Gu-*4h*BIlstp61A7~6c);)&Pj+)oO%@6?pu)%cZt?>~{yFEgw=1w%(uA3pj@Nm6Drp-0QZ z0;61Z+&YVhxNI!kui`~DE*s3XSF`#m3fD2!8ePq0el}ZSARZqiCAUzCIJNB^4)V4_ zYQ3GYD%jmgcRby5h%0Vs8kt>Z{f1OX9KyA!SyeBzZ>ROg*F>}#tp7=PGTsC&Jb|>% zYW4fuSK5T5rMH^ht&Q&4_1H8(+`V6yWjnX;^=z8U#Kdzx8O&!dWo z%Y3Z3;*skJsIr7HH3Q%iDacvkqDiXseQyYIk!1~h5{|I-`leLOrtYoCK;Wqo^W~oL z4Dvxm_R1ZQE8WIKb)AZD(GOoTZ|a*yO@$E&eMyG}>@c0)4fW1B8J({BLY;EeDm8-H zc?vUGJ^5wr4TIuM;Apy&I*YTMf9B!iI25GwnWMK{%r1u)+(O`8(}3GHo`)2LswB(C zlP~idqdRg;<|XLXLOMnDuYr}2BWR?3^-jJAVYRXRyh0L)bnQgG{n$0`TC=k|K~b;C zAk~9g3BI`FfX}7sO<8U_7%Jt!OE8OL$Dd&1kufVhiifGF;A&VfF`Pj|;Ph^r|9bgc z>@Cx9LyP%YRld%>v~q#E)L}&_?f2hQFq1tG1+WkkGZPCl(@?!@>u)j($N8=R6WKe| z=8r*<$eedtAnDj9zUCy-+S{IL|6(X3v%8(;VThQXcMuMy_e8sPBa7?!b>Sp4C*zTp z=BS_Rv7pH_aZin{A;Gg0MzYY(B{&x{KYq6fLtqqV)l7 zkpLma(B$pPzUMLpCFMK2K!IT@=o1>LrhpXqH-1-dl$b%NU-XJknX;Zk0bdc#)vYPZws(IOLKMRnkcP0b%F+_cB z@95libK}0(WD5UQ*rPx#lcBe^PZD;~nOM-2j+d{pSgL4+>`W!lmS8JVrws7dX{M%% zd}%fK`Vn#5xnKKkV-*$>cBJnEr)M?qQoc~3rye%YZ+_d+nq9#uKQeNH@K_`NlqggU z1ra_S94My0-fN5{;30g!IyjzhHwZ5BS4Xz^l9_=klS-O~^{J-jz(6%IsfEOp;3++; zsLk8e-m@dr8slp#K*yWynSbo+oKoNu@xRnXdi zT)w%)79OB4*n6kW7UJb~hylch?p6z&$CVTkv+Gq-H%+*jni7X9*%P0}T8bJbQu@F} zRSPZmK#)(udZbl$aZ+%FwQ^fLpEPSBrAC(|1$DmI%@|JT&M`4yA?Dib))~dAuGghO z9r~IxFg>6JMpaoJ}AoR{MoPTe&S9TEL+FN1R-r7R@eorFHOuA!fHg^R&{PXJSk15;3c zp$RH5FO-{L_Kt;Y9fCnq_|rV7MKiY+| zTL)+ct-dqccUK(`$z?i776|Oq<(avX)x7hgtZ=Z7$T;3885N-dzNPH$L_RLbegy{v z{`w3&4Um{BN$suL>Zw5L{vj@=qYbnUIXyjOp%$7ZTMo6a3O!{PX-T@E^w8)_yM3y+ z!!Q^29Zh`>$<#x8xOSKDL<(Riah+Sp%wX`oe$g5eNg3bJm1F`~SiWW(SOuwcT@g;BchYk8+DuFR*LKo-B7mT2vi19B2JDTO+ayO-z&3OF6^WYJ7^r z8c*u5RRBN{`l)btnZv0)(h;8sw6;<;*0q{~gm4QI zelaMFUwSv}ATE}VIotN+ekeEbDh!;J*P3+ z<0=8HrNZ(Y#gtoGo~IPr+o!xG>x0K<*&}sXjv~%iON(c)y(|3+XsfGzGv?;dmDufC z1$ru1#jLSzhyaq8-jf=JafitJMRC%$>~?x8%N3(Z;82IT{Z}Z4#3XFvt(6ijbXAer zUiMr3=KJmp9SOtroH6Srv||99h<*35)vQGq2Q`|DC%5vAl-$*=lLPH?MSGskA0K^z z3_Y!p6YUakVqm!D_-w?+CLVgply72#JHE5Z@RSLZ33-Cv0l%?Z5OusE-aO4_kaT1eW=~dtS)V~wd2OkunTL4 ztZ@MpVWK-^;Fv9SV3?VOQE<@*TX0DCsn#L0vdNS+VSw&>2Q2Uj9vKVM zXgM&dsLem^DxKze;xSAI&R<&4Z)4V&T2~?%pSa*8bJvnLo+r;5(?}&GqB!>yF7g~s z(@3u`n;9rGPwT%MZp#0RrJF>wc#Ot*r5Cg7d$!^c33eEb5S@NlAF4{zZ$^CimCMe# z7BY3h$YV5^$jkgFH=$aL<*2LZn9*o!wPpETXum%ldL}&H@ZHnu^9`4-(Vh@)%Dk}7 zaE+u@zcCe#dveSrpUZ7i7*E0ZeSo5_=kBu)IpfM~Lj;#w>4i=4Lp^C!xq(&o5{H|CQ z63;7bx`rB$wFN8a=Z=Sh&0IZ&w>Td-t@RoaT07f*+B?64iW>Rv4$dw{LxD;cvG^gJ zJ9)*Hu&2+wyEv?*pE(vgUSpH-=pXc1|KYSEO)g4T>0K*=$na_`)Zwc?Q0gD7NP@s#=N{- zc2*1*lG!^e*&AC`?2;0X4)%XTK%7PfwBw&$PeWMEM2tuj)9vr#rlhH6H=&tAw*8y* zx-EZWoRm2czs;YXW&0@0*+cR$Pfc8(QNiC6Z0r41bIfc;`?^w&ZrT#^5leG5$5MYE ztpCL)^o1?6(Igan;^OL00%}x=mj>S;*EP2{48PsIeK=ASeQb`Nryr|3(q3--uBK{t zic9vKJ%9gklP|4e!)_#Lyi|Q9B&9a&Xb8+vRMG&DDKLdRZp4D=(0h}`vcJAj|4Hdb z0ovQ*{=UyCmie`ypuw7T9`cHAbY4q^QWJ|f>6B;d(5EPX_=+BISzkh$Rn1%M!DNoY zHq@eNZy(EA`Q>Y?-6#RA6o?O-H$%vF$)4!FXM2(iM$?>WBjr)EN{y!xegENW!C@Tb zp?&vMyVc%}K&$qt%@L_*Y`9!>4mUIvP;8)++rvIlb0^6A37h>I+nE}8c&zU%qE!KWr2SJ=uc8g} zn#}ud2*4?&QAnIZb~1C0a5FEp&xbqGJpoqA0&4(Foyj9%y}VLaG`$|a-4ZSSIRlr|yU3Iw1cg>KC0I~hbb%?3 zbqeBib!q`{nuP3bW$~C$3Vdnhh{l!jJj?%fI^#Am|1!_)_P%#_BtMDw)^UC2ghhL$ z{>=Sa80Z3v=Ng}q&iqi)><_BlaXEDCxa8(-@Ddy${Eo3m?*A*<%ai+bX1U-sQ3zbB zcx5Nt7vqe8Cb`K454owHqV#Gnm*uQcP-AtjAd)J@ck!J9Yxft zB}q-tjUzU)WY)Uv{G=OOKQ0Mp5yP!RBr$SK_Zx^8ULMPx$BVk9N^#Imy$N&9!J^4P zE3|p8PYHlJoPF!6#9u$%jT9vn%O*6!s++iMy_Y4QX~&Otz)zk&LoOute4BpHHUg{*E@5+iyxMi zJ)6HKu2zsfb}3zTq3@<04ow|Y(Y*^nWz(Nv6E^Xm;@bSo(-!l!9<`1=f|tihR6#xw zV?hM)$=>8u;=bRtj_bCx3s-heA;o(^%&yR!mG|gG{g`~WWI_G03E)B{;_kus@FEH3 z|8h7)D3LV3yeA!FZYb?^mE2%Ln=6TY7ob$=ocn~~?$T9REEb0qo?7s1-eL7@vKp(T z;9W<^_3hYO-m~aU-NIm`WvTRW9Bs{wTc1!p#JMv1Zv26JYRfRIb~DFRD&A(D{kNUq zv?oW2ZKCDj(*47%5P&VK=nSP4lEhiCS|W5VEHd1LCC~PzeY?>2r%|dI*LfieaVGHTidFJzva};ChD@qrVOQ zZDP@Y+zh)qJ0@HxOseE*@DqlTM>-=6Mdn4_kk>b--BSO^{GlWocs1N2`tGKDYZ3Ht zo!Djg?8Ke>xrEr+u9^f7%hvi8V-CpSuz+zGRcnJZp-kS37;R%8d0XF_+T)-Ff5$M* z=>1OQ9QtDsRD=q)#EvTd@i626Go$%W81kdg)<#*zASNlhf$^)ZI(UAsN%$i&Ygjue^#;Y<2a$Q zPQ&rh30Y5YA?qRE;px#Dhc=iuHs^=+Nh;S^TaQ}-tF@@(46&_iwHsrm?zYmTfBuE; z2&DwIrU^9tbL4$}WOfx{+>1Qz-bfZIrW(m3&mQ?+vEqK_mKi-Q3>=Jpl|mFc@;S`t zN&kmAzU-pcSB*#bwX&MPCH>?cS%2eKiLPtExk^ng9q?;0wWwM_Oa!sgRmy35G)MPc zeQo?R)T9b$bgO#JUdX$yY3sVw=K@lXAg0~g6W(FU%6c9YbYpxzGDHxX<1aX6Ay@F{ zt){euQ9iUu!tN2nz<5^9r^0N~l>-(CPFCe~66A(dZ$kxVlF_U8N}l40gw z*(EOq5v~-CUkov`jWCL2OLxkZkbeEC{zBJ7ucD-Ra+}VyNQX#dm{%1|Poo2ORD?)s zqW(V$iiAT!bWcBDy+@!(N*R(p^sPUHn**>vD~OO z7%C!BvYVCf?p9w0n$Gw6ni0ZkN-s+OTzAR5A`dj}m>O`NuYPzl+W$DUEkZzNS{32% zOc*G(`ug#(7mGF2P00inG6Ik1PlvY68dX}E%wkD!%ZzUZhf%DYbUHQAv0?y z$rC5uz#b_B;<$dZ^U_`ltF;*Z7;v?yjMRq94f%{;oW%A;Fq z%7lQoTYFGQ^1O&t_ygOr1Z_6=W7|G@_$10}vQ~v2n!cj@CqBsHuRT4+3zp66Hgan$ z4|9#quql!7rEEqOuGJp-Lew zsDHGV)~d;U;CV6nv~*vF@DMX>3&W3>c>Ym)V+6$@zN#Zdo%X2nbC?`%MPz`~p7m0r zXwI8^tl|42zRetgVe$#Jd#|hyMzo2Zc`Ejyx>3k35+AHbsb$AXPh*QA={@wv#GgYm zO?La=UdZhX-g94^E2sWG(4JBi3>EOWJX+EIeDpN1r|T}cEAU+NAQkULWaz5Xpvz8b z(AJ~bk(vndyI{uxj3lgel<ZiE*TPTe8=q0z-MPz`* z6lzhN2SvsRu_5M@l`2s83%lUxaCf-@!~ziWMsgA$z8NqaZ|g_ zX_REOCArkXpP%Us&=)k(%`F=>EQ?gQTy4({y;JYu036HtA%itG=e8@`DM|Gn8^}I` ztdRw3d&Xo~12aupS;)*bI@R4&deLLL4z3nra^orZ^k6-q+INm4Fg=r`)@%cbQBP-RK1;x?`0PVe5*!gn11sn`eb>{RVEHgM(#Yva>=0Nkxjyoov&oPOxK1=$$ z3O?gzqXJZjz~w%ZW81T}HczC9oq>~iS?xyYxY!8Xki}*FqkCNAC-#7;5`*9rOFydK z;htVjbDiE^@-XmgJ@#$&(w@;Mn;|n-e+hGsK9Za$ajJ2+V=C_ZI5n_Kom_gKrmKB- z9O0Y#D?q3@$BftfGT}-U;0R*GR-0w$8%r2>^>H~xQ%l7iWe}2ICW>@-@O;JeOrS!; z;1R3*$cT~wXkyL$o^UQW2NNoic~*arjs+wk6EdVE!|7LOnKsL88PZYmv8+Zw^8O=L zG5(#hheWW0i3-vfRyP~yNqiv-lySg?TqYGj+{N7mRf*nT>p3NBV=c`_b)1wz8Q85{ z=q|7RnawhW3Ia;~DRzgQ2 z?(4JmNy70PUV&1a@Fy6k4yGM~t4~CKEkJkiX1kGTBI>MdP>kR#Yg=1N-1FgsNJTu> zHiSpi!pIRAe&P~f5g@Q5$T?m!AsATXLr-V^$j5}dN}TSx)F!PIb^64opX4U&`ws&Q zK%Ml^SHSNR8XyT;U?B^t@b?3fDJf_B<3Q_A%HoeMelZXDBfr=7ZQIm}1*-!IfzS36 zXI~ei`ix4rj?3y(2ju{w~M$R=B za)$5JDCY`JGo*;$GGU$~y|);;7-)rvEi(f%wim9yD_`9;e$o3B(TGeS?`F+`_Iw-z zHJj1&9ZFL?MuK_*^1hk|OXu(D4@9cayJT!?*1yk|AK+ZF4x43X^Qg)t^pVcZs$wzi zs~A@bcd#nql$20+dbxww>cRqD&~ehNB)$K{u1uNVG^h%Xar;w*{T$tU>Ns7kjR$F; zlJeaKQ9+9guGSKPI`MFy54#vsHzaPoZh4vcC5g;PLp@sR_%U~eyu=CI{q(Etd!sz| zGUIT(%tQtPGbr#}l-Gs&@D*ox=c1?Mht9IPU;&jvKs^(QN~V|m5ko`pu_{p+51ZIys&DbdRS12 zD=C#~(Nhew%hfw?R=YM+-O2@o47Uecwx?3MGI!i}BTu5yY5Z#N2MbP|oHq+(uiX1# ztHSHqCsseH%bPWPV+Z(ITSEVX{Jr zR^2DX=~193Fk3T`IGJ%F8mNd(qU}JQr@zzwc2M{!)C;Vl!E3blwNY3G)3!A>crghJ zT2CdjNOv0M0ZOds<^(HrlMhq{$eoVgUK~lrjXvi64V(~nz9#2R|0UgDv^^BktKp`HFzn%>U8_ZCoEn2wj2DFgZn8y;wexotEeY>4X&}u zL^<<%NQHyJT@L@?CkrzK&zb!AmivxbL^syh+%&4_+KiS4RRiheaCP4usmd?KE%58R z9O5cIE?+jzT9mc=SUVpR7&kW@N$<64^2IFG(`|}PWz|&O75AnP!l9WouPA4hX#MKg zs}UCs{ZFHcs#@4bVIG~BCVor7YkvWX@rJ4;C!Pyb8_TDhy3e!prMvU;M&p+*FVH|I zTT9^kM|fn61UOd9lN2@wRH)M-vjxI%4Vb}V*YAkRGzO4?UFalrx~F-~IIH;wyT0;3_-T1DE6% zNCD}qJjG&4BRW{g>6ODk(^&U3UBdHVR57`PDU;}ee`7mBbOe~+*@serf-jg=X-}E@ z?Kpt}JI61FMcdSy%5fj|RUJiGuY($sH-q*PrZlC8JafOjlmc(hP^zi?4*J=i=U8D3 z`Vx7rm{alkPy|qe2T~4N^-VXjrh#)LJ17#YmMva{pOvB5(EFSGQMBClRF5w?O1_R2 zX+ri%6s}iJ)HA~G+KZY}*}9A`!vu09Zxvq_=Wm@^JptY?S8;Vm^xT}yC927`g5jS!aY2+P^{ zm&j)M$7YwscoT#LotY#HR;yV^OIX6cLlW$>ubaK^>7t$g0ZDMUp0p~K!gLBw&S9!# zlv^)~&jmQ$y7%)?ccdd9t+!oxLfM!jqlyl=x+hy)9I<9xxsy~>(RPo8nKHj}n585p zW>_Kp2P847_6f`VW0{OgtaAckn(Ny%a#)XQovt8(sk1|{*bQsmXdx7>o$SGQKnII$ zz+^Re2zUBv*Fj)dgxime1srV`wPp^3(mcKct@PPUf8ch5vc{EGpSFz31gBmv&#j8OWE?j_^==P|?H%!n{ zXd?+qE<9!?(JlRVH1g(M|D?-+m{%#90YlH1RjS7be$n%orq3woK$|cd_nUg^Pz;8V z&!R{K)l^J_vD?#$Zjs(Y;=f(thBS*J&&A#F{%eQ$eQu-#1DP+F}h-97>85DYUp#N+|9w!L?X%hqhSo0>!OJ39bzug1Z#g5Znpw zcGKT|p7+i>bLal|ymw|ZliB3#+1;~yz90E+n2M4#{&ULbSXfy2vN9kwEUX6=n2+$& zhnN~}eMw6!tXEjFAPEi6^gX1P2FXk_=LJe|zp3ZiA+5{cmVQwM%Lqd&3`apsy;<2{GEVyNh;{a~; z=^TDWNAZCm*8E4FnV)#^-5V}<^fcgy(Rnod^^vk8s+kefg{$LG2P~|X?uXx=Vzo%T zdWiMq1q2I=`Y{j-3+MmeDr1TJ{d=&s!N`gD9n!TIWgF1!(s+_^g{+mWL-=lDW3^bV z1l(#}mfYOmWPz0Ly3Z!`rXYNT;(0z zUm4LgsEP)Ec>L8+y;e)yUrpKlb;jN`(FkG|@6vP{0n>ab<~74%d~kEv@`D1)TXB49 z#O?cQz{q|%1hP2{F87uDEBP2}@zsk5SOQN$SXcxP0a#xHKdct)aO@{<0ITU%c{rEV zkkT-%Kf;4j;@A!NNi&3W@ZIjVbwVWNSLO8ImMIfazh?v~YRBZWCNyg+K%fp8YMj2j zvN442^4@}xdG>7+n>gEajR%ttuB8NBALc!9i%Vm`j~+^i9Vq>?)`Fv z%2ih__75+DbYHzli}1hk>B-JZ*( zu-QvP&QaB_(w$oIZAzubKi+{NJN&?X?yiInynpkHg4}u?j1YO=5wJBd+wFprzpu21 zTu!Yj&lmTT&Y6+@MnxuGBO^YCK~XeLOz%}%DL9c?%-}9_?(soAm-vf`OVs6dezxaH z!{(mhig}Gz>Jqe}R8?0iIre76U`IP3Jg{Hc(jRAW%*y?hR>p#x1e;MurVp2r_uMuK zK=)L;ZWxJna9_b%bjfun>S-Ol|fA7?Q zPJ~5nx6&cLo*+0oAW8wL;kD!M?cknWm6?XLWC&l%U4LAjxkJChUQ%u3XLc?MNwc+| z=3|CC5B^RfCMsXm)YfL13xjm11^2%}Jc+RSya!Rg%CPfy?k2q3g6Siy{awA!M}GRm zBVfV-!7?ze;eJ$y#xo%&e2ITc3GWvB8+=a$MxSjK_Kb zym?#8@1hiUsmjrG#mtftrLMo_5x>FA23yc^^}mjcq^k5-wme#kUMt+;3=RrGZrh2^ zsky(Ny?4LMED7it^(E`nt_17LRi9rV8xZ@@x_Tk$aV=-A>GMTyB&u&^psqV5>`*>B z1Ml2ZT>4>F@I6BfmEe^TTUG*s$@}<992<}BazsRMq)B%@zk#(hCS+>Y$?^m+KEv$3 zFoh_9azv!=7pH}Qr?*!b>22KFimdkS2}N`#jx8xvlB6ziwxQX4YYDtYPmDhE)Ck&l z0!w*zKcj9HrD@?=JAuKCfw0kv;wP8-`7x79?PYJzJvwY^6~R?=9?=ezpGnJ;pr{R{9KTj$mzG?q@8GOqsHwA!i64zq2TpjrMgnHt`5#cE4PQ1ro%!G(;= zJT+bYLiS-romXpyZ?D~rwDdQq7?j4`spSU!RCF};3rk8hCKFe?hm+jwG-+koG>8Fy zmGFNTH7%CIIPYE2Z=GBkcjgOlJ#bw4!jetc;$3*Ji>@y7j5ac-uT2^`s8WPYXYP)P z{W(-8wOF$lIAU$=d+Lm41~W^om@zfB$7eR+z|-k?=s3@uF$jg9$QUD38#AQ=~u{I@omSm_y!72 zkIUhEzQ10Oz5BClPO9yTAGPTBN)jxod2faz+-q}cuAj-WI;8D21nlnB^)Xe^)H>Zp zMtiKSi=i)e1xp(|zihcezfEe+5^R=?$_V12sGq97I z&z#SVL2v6h`g00~B9hFjw^TX=1~Y`Ta@(6T$`gbp-1e;=`a2JZH(3CIL^IL2_(y+d zO{reAN4b}h;PRJErjispuFg&-CMC~zz^yTt4;Y|7mK7knuilkMFV{Md0Rc;6R$=<* z)E_b%ZfLUm?TVSIvFlYdH6l%q+r)Q+7^ zqlTYN7){LpEYdo2?(|I1iYLz!q-~HE{4!20&04yCmY|Pp`tr-f(Iu`pX9p*Cpf`bo zJcHGXUxX=UTL?T^^$nDPpUkDZvs@11`cV*eGEQdUafkSPUm|gR>7j-yIo5x0!H_}* z;d}0p6D_OIR|l>_B4N<5&D*Gjgl@~<6}$@*ebLP_E=#>pYy@Kd9<{wZ{5HJ3og>D} zAoePzBJ{6BR_G72SK1-lPiS9OrSj~Mjtya=5 z!O6<#57mK%gfG0cC$c69XeoXytfc{JF2bXON>R@O?kC5!kELhwLmE#$_n0$|JlE|8 z*H8IkyQ?<{3fCOV-LEE(!wqS!YgR1;Gnhyx_=&a%!saIQe0Cfs=SRDToB-6I=f zD=QjN&s(5_^RlF!{I;$_rl-&DXvg@Wq?5cJ1k@Au_EDNM8}8V2oTM7Rd$dN}V5L{i zCg+l{{OvL}riC(!Ijxb`qmS5iz+m+$lE-Nox<%Ld4c%KAD;AW(28Tm*$+`ab z$~Ax))`sRc1wyxg;pf1w!yz-(1CuTYaqD>2YH|aPl5PbV8BJTK3M|^QO7is zmy%l?MyU80N|-+zX2{T~OqQhp&KBl;vg(0btE{H!W#N65!cOnEHMp;*7zczp+&<3I z?Vq2IXN}>>+=i|PnCDulaPdDGSRhP0lOostZbEMAmB!#g*{#yOEX@}X0ky+*TWGKf zvYzh>bgB9{#>JMnP_8V>0 zN7HX<5D7Vf-)M18!!Mw8{^IrzJZrsS1gd#DnNG}3W7d^hIS*M9t-#1-V4hg9tcgz- z*Ht+etBK$J-)rNnc^#`d*niNr2LiZiVD$T+?ZU2cH3YAFk;mcpmyo$Box7 z^hrQJ7G1F+=RgfDeA`ZSE2_h8JcR zawIw~n#7bLI=uJTV^?+%H9hfmd!NRG)2knkS&`+_GLOBqvqMhp&vGqfZDiuvZoB;+ zt$*p8`!;lfVJ-=cJ?2slLy2pS)kLtt@b#O=5dgtpBbgZd=Xft( zkKBZh1sL9U;@DDrWlXvJLxuHqn6TN6@E^$hf5DyqQ&mGo+W~&3*>hM}#spjUBg0js zIidf}5$=GOj(%dUR9IMI&o}A+e<2Nbqs1Pz{33O<0YdOa*>+o?=~W*hy~=YfoF&?n ze(icXDyy02o$=(~<|e5fI!hYm0Z*NqstianLa5G*1K;p2A#kJ!)*rDa(oBG-Bjf_f z(+-sejcdi%i<>$|pb}QNz2;;=ptq#j#PLIGB$I!tI&R!HFTQHFjv;!U#-cKt;r_+i z9%xW;pW|aagmk_{yC;jAYmr(_ynFq!ivi`YqoHN+uekGjbzg{eG|N1VzN!b;{%J5Z zvcAZeiVWOevMakO{R7!@@0esLn>|-4Rlm?Ygy~u4Icm%f`j)LP>)YsycKrMCIU?8S zwEB@PKgw@#`kK0NC;^c~bO)oUgjprhu>UR9`+63FGlekX?L_*aXQ#hUb+`t+C3p`Ij!L%YelADC%(UU$m-mMWzyaNrNGp?u1++u$vY`ytF%{QUn$4v># zT4ZC+Ia(&u(^YYLi)K_sXntEMag~?1;>eN*;cx7ZTf>E1`$U?HXu3JSyvhlO^6L3@ zSWT@^LF~ShDUa_6%R|dkB|)6S$kM%D6M!lzTYZwI(RIh)pyiEh?aE$aQ-mOUYq19Y?8QU}5n$$IPa!OE7Rm~Au1-24A(PKo1D)ipCu|kz zDo)%o=xK`kOM%J=+(kM|cRvZdP_6t?!YeK5!~qZ#AgoxP5ol?Rf)uPz2+s;)>11|3 zs)XO5)q&1bpHYId8WSW$v4MW#3x`&yW_J(>zg$m26RDMX9t7#abJ{G~)ZCKA4Bt7sIXsmMmuzCm8j zBwprq_ytb3Rvdx|P-$)|qyu&m;>d!e2w53yY_~-hQQQ@E`Z1;!;gcQcd=Q?K12GUC z8(IC7!F~Zq5n{)>@YLaXq5u3$D&6K)m%Tn@lB9d*C4Fw!^6VsI`PuJ6o<}w#N~O5>T3nr2D8jU%LC!_ztX*KXAnXH#H3Wn`O%{|NOGB91ml@=yPI@fJ>lZYNaF{M zsZ0XHm-?;Y-Hy%1P1j85xtPs~_EhZ-58*GiwvPbs3HTZaO;xm+OOEcB1n0WVq~&<_ zh3pk4_&`P9^+*B3F4THFnsXjnZ&NCc+a8;QTBhpECqW9DvlBcsm9riEPQxLeW<5@n z7*}%Cx^+MQd)_C@lsOHiSy=&gPwMRz8~rL8TT8}U6Cee3iTg|qXIIN)ARdz*ti7Tv znuGJpCBdi}Uq&m$2oD2L*oPmO1LgJAtmPFcrO!E(+*P29q^KkPN!V|D$rNWaDZ-HB zpSv3={u&2MjLQ-y=StULRdA3byf7jJvxoADRPEP^+qW#;Is>VJN67+Jwk4$;F@(w! z3fajG);-A0qvg-fu7N|ouFSmZ0!Z!;LcPorQ%b|yRFdh%0VV)P&?@ZxenLWY~ z>D+1btjZ$yI*9F(l`YV~Ztx0f#^o7}ND=|PDQDKuNQBvG;J73&Nb->=4QitKLCetq zen)D!Flg1z{IgD$wZ@_)e~3n*Z4wQO!*X0P{K|WEc0ZGNg_3l)gwzi-W*Nm&_2);URn^qKe zHQxZO(zi6807PHaKubQAA-s>L^I2Z+UcCUk_gf?O%^h`C+R4lI>KHQFnmMErk#^R+ zpD<|}Uii6N4Of(uu(Rq~Pzuu%FkDEY2NKOiB{wWh@44pDw?MmZ%3ok%T~vrI(E_nr zqzV3Kbr-=!eUw+fi5}{p|yllOiRx!JcTh^ITe{o>bZkr?a z=u?AN`Fw@(Pf&5t4^9gvU?8X8Hsv z22K9Sy`##_9(u7|h~9IJnJ#+l@*1(mOjjYsbBR51UDK=CMt{;e-!%;%Hu|^f#hGgc zVm=tubQz(Q2)UXTj7cFQKY^vu+|TK=mN7A9^s|)MScJ*g@weG4sU&A{qjWXE_?htP zPMu7LUTORSlsZzI{ z3m4Y=1(v@(Hv1C&OY!FZuWIJQ@MaP~gRpE7gsGy1 zIKrEy>0Ke$)YT`XSLwu`*&CO+BhLIFhVCZ>51vsb5{s(taOU5QrvB<6>%cQ~X7HYnp#lI@eNKP({MtV%x1WE% zJG$ki1_Z_p2pEb;`f$FTno~XTbXyPsdFpd24-_WQi_@Qr+Y`r|s6>B{oio55^Z z_pJxfBEkn@oQC3kCrd?XeaGm$bn)2ZCgix|*kb9EZnNi&Z?hX3TE!c_TI@piAv(7S zl12bPY{PGi%=x@jO>!!Uw47f}@_JYwKDk!mFqas^b?S)c8}99d@3gtjCfMDc?+$td z2;1AB5ozvFPG#_e2okY(=PWsz25U| z8?=hgh`pXnA84+!4;uLncMLg@YTJCt~W6Npb4dJ z=s0tsGW#Q}n^ECz^`JlU86vL1eSj9%z;?N*uI(?pb&z!IK#jv9ED0+>?NT|w@ zKdWJZU-E*U%DRr+rR3Y;JjwP!YI1mTVZibF&cpVNmZRzcQ&l5i z&e_>ec63qG4+wSF0T@Y!pCS+sai;rOjL-j^+uTO&1ZXyO2Wx7yB*(n%uH<7!NF((- z8p1@kbgWZ>u=l5#i6NAU5CfWBPrg~9;V-Y$)-=Y?jfby-*5YIaUH}U9+>{^5vjYSP zU$|$~?Q5etLk6i$=c*srw0A<_Ymv6&Ax>TEf<@)s;tW;K3~v+ax#_o$@`#^++$H3h z7mt>#`j5U9OrAWoyV|~;AP>VutB?Pk{d|~sKs1Zz)@fqo0d-3A-*%@SNZ@tuNl(p# zp+uqY(>%y`ntoi(#7gC+GnY_Ch}&}5dhF*cS4^fM&|%u~ayKfY@S&Ek&0 zG4;7bLP4v1s$l=XubGNp_dXo8z)hzc7)=t(mqoh|u9@HrV#0dvB!7j`FuDB&8X z0)RQXyzXL%6E5}Co`yPf_NWom5xKfoNO?V#Gc~@3a=cq&jCzI|85~!a-y4R3R^Mw} zkQ#{crZ7K;TwSu$#Gscp2HL(AaEQCyZ~#^W9euSOWrW7ZLLlg_tas!;iuwaY{HLlE z-xWy@{)i;hF&$Q+i=k0hG;r7uT^))Vjs|7g8qWjyhPN#{-cZ!?s0^uOJ)0AOY0bfl zIGJ+DMqI$@>Ho?nMcqGkJC``8*hzv?lAofObF{l-%=xw))xn}foWEj2Zn4j?yW#nsh ze9Gf}hrIKV1eLSW5{;1iu&By=tvBNzce|&L!f>366pauL_k!;YrFeM0w7yf|2$*E2 zguH!n4IJWmu~PFEWc46C@I0RdZ=~O)wZE-=s>WLE+4ki2PV8N)jUB>2(N2=zdmL}% z2dwbC?+8zOVvEbY2Lu{-6}8jdmbV;OM+7_KB`mTg(QDJpZ&aVz`gG&i}2 z;LpfbD9>VG&v;4hhDOUPVt-DIy;9J1t-H4EE}9?vM`v>i9}YA67I}L>!}&CoJgqNa z*j2}({yO)^oSEcKpQAqO+I2?Q0`8`O4Ses++F}$3@xwP;o!1O2T)7*B&DD|u=!jH% zW-l4&cpUXyWOSTVlih=h!n4$xW0d?Beo(vw3jQY6BzVwG(1bUWJfY&tZoU4#lpkLw zxi0$QROZeldM5nO!QZ4|z7jsKa(R6(HJO7-=R~In0cy*4ft)E6`h4ow@AP&eT+9e* z8^#Vq_}&eydzaK#Q*T@0OrqJ1_k5KpGJXA0RXD^b4L=Zk>psI4wq>%%%;k#y6q81> z&L=&;V+BC~x77nnbupjBEqXp=WV$%>jh~h-eA%(EXl?%G0+fX5Iu=SK_E`3m zL_y0zbzC6)FqF|4&9gbBX|L1uN=5ZgU(_iFj6#)k$pVf)>LAX%fjJM<)azekhNflE zaeMymx-a&J$#$E|+|8}W8U^BJ`i|WqL3^>%IgV4rd9AM37zk7~DxCY?&H{Zo3#bfU za_U?^CE|rUR^iU{U!QkHSkTlkW#PM_)7xIo2$V+&H~%fWw#Xx$S~di{KeiMytGk)m z@gr0{9V@Fi7$CF5Y}PR04MEpq$AW36?W=b6Q}hEB+k8L!tJHMiik}Po?c?;tY-hor zM9nE`A?@;m&EbwgdjoDJEMg`BDr;kY2T zy{$!yO45H69QS=wM53a%?(q+ZLFnP&-)8CWY4nRf^qu`hraoZeA7n-e&;-l76o#tu z#}sTvX9RMqmj2bBou$m2eDQwhtj#jqEi7Z>N#C&F`LgBE7!7gP7GAoh*HX606eT$h zs=b@CxP^nUi(!Swe!_Q%qHBR*(o?;h*B|J$Rf?w%a`MyXi5Psoe_ z_!Rs{?P3BTV{Ufm9{6PZQ=5R~6!{KcQNzt+zzIakFU)YWd_lvaES3252hF?lp2GuL zQDO-ywi}K$!yW#Ps8QNPgdHQ7x9C(EoielD?a7AgHuB-8i=W9fkZmic*bScJXY10B zYEw(k9|0yy=SbE=A( zK4iD(o?$L3t2D%rz1Q-Hus7y5Epd=v=QYzXoWXZZZsnn&^TZ;xXxMxto;*u|SkIyBK}2;R;X|3+huLr`A3mo5Ed9!l!BP{cVkt<)_Q*B5c)Vq!!^;N zzFykVh=w;P-A4)|PRYZBk`-aWtiY;jV)xkGW!Hmq?S4&rz3!2d)f>J4w6XiqeZWtd z?V5pGyS(ys%_~-OZOaWgJ6O@hmxEcCa?CxN!=c1TmE#|bIkA#B#{QRtZ3Fb&=ewid z3uK2>yZSZ<$P1j$=?0MH+Bw4zMW;|Q!KQ9;zShA-2W0NeW*Vu{TZ)gC)Ky>ROMP6K zna*d%u^iqE)+~tBovlj*wqXEpvY+aeOS7Hd=by?&{;HuABcaU`J_{0^gUL7UIjJ3a z!p+z9ykB?O?)(5@-HuApBf8QvMHI%))h};eGQA9T8|bYefp#8=e%0G;;<$sfvZ6hD z{I_B;_Jqk4SFSIYn}6WIj~}an>YhjN+qD%vplQggiRc+!@Y+jDkA4Tsi@3=W;Z*3E zZKlIMS%vHRk8_a(U=u~$;RE?yTw;wfCP!p7R&U+!Z$~&`<;~*_ZpvJiUgp0pX4{vo zVE5*jr8zwlLoV3uGcx{Otvwd**^yIPEw$xE$P;{xN4~WV=kdHs5|Ij3K(0G^>t`z( zw**DECo0UOD)Xk$4=s&q3l4_BXQbB}3@4R{Sq z`QuvR`|Zb&{GlLA$h>vy%O;-Z|B!r@`dCv^5HRv|>$)N7xmcYz40gIaQ-Xy>7p-Hr zw1wllL;HU)RqJl_=)URhuRRvlyUcRXM+9c{1#MEg10!D8OQt8?UsrK9`ngFH^o= zmxd9GINg1rPd}locQcZ9b#`t z?0UUfS#{O_XZg@|=(~tUX~{^lM-P?wB3BeXNYyn3wKGC1Xk%SMMS{@=0cq-yo? z+OBuy2A8NTsAC3$w#=H+-0{LD2}f9LpEM_A$h%DQ^!VpQ`|9(;c@`dN#5Q!qP_4er z#Bu;RRK&*3r=%&f_B`~!7g_Y=0*-d@R%jt-E;OJ|5EjJKl35G?dV;#Zy-x+a)1gm@ zAy6vZwVrf*a_vX`ueps~PEjO3mah!_X~)1Z;vh(It+McWp}~9M->TOW8_Z34&cW@e z`ramI^5HQWWj~Y@N5i7yN~(P|ZCPW7MDL4-2v(R5KOJyxSoLGZF;$qEuO=Ib`C}hx z`^zrUn@LY68~$$>*Mq!DYW1e0VRFbR)I7dNTpuZc$yGNl79IC-IlcdTq}8ioYmN7e zEwK=}h$2{7PQq`xLgp&nYSXv`hplf5#kUX{FD9tm&cu=-?qv}zk5}b)NFS|@Q9gUG zKoLU~K7MMB(J8;}%NMGCZKbT+6un={-#+7i-ao|Q0kdpioAwoEOk+%~>(b6{l;Gho zF8&UIr-LE3VOUuN{li@PVGJP9p8fVvQW5Q11*k@Bg#`PzloG8WD6g;lGm#3fnZ1hJ z(%ZzIuHiuFHs?GPvnb%(U9>bU2Wu3eWHD6M7FEXjTerTzqg2tMirp3yZo9C}PpZme z%D_kGn)rlboNdK)z)7}iJ>E@>SKy8HlOWtAOplUj{O=6Pc1qQ>rov+$xJ*7gKSg1t-_Kva>N#!DYGlDfJVfTsDEis*kfP2`tSDbs~o9bI{dkWTnDt3_lhp_v8+BNadlRm(OIP!C_Nv57=ZNX!W+Y98$=xoBoL%C=FZO%+5!+Qgy!sE;z z$TGv|2x+}M#_&+@i&4~Wph$NIa)`Lgi$d)vA2LClt}+^8+QKS)S%afCF! z4jARNbbLOOXgCs5l~E|gM)(>5nv4F$Yv`o-QFqjzg!t@8l%-l zL?o&5LV`upwIyREz1o^~A;i-G$HAeH8TiShxKR=8#np1X$gL&vetTPD!EH9R$X-~B z@<GGNT4F`OoL(j09Xg*FeTft!y+Quil9DEA5FZEEo%BbH7~ivtSv}M< ziN8`lzIPi@;hFct251^_@EFjSa`X=~<%DH&fFGHfs4lID2B|7 z<c8d`F@8{Vhvlc42Q;+`~+OlcN20T+S{8SiU6~yjC;Eyu2NDh(aI_OboC~ zx~|?DLozdDyz|It+$f~gA<0i7U`bo69i41px>Z)i7&}Hc>NsQgMM75w%Xs;f+^!eU z@-D7-{|#Xni6L7CWEz*b>SS3bBk2T8I&xrKF0qd>uZ+Fcu}w8~IRN$KDU_4U&iD&! ztt#qj75m?$qYRv3nwEC@l{*yg&CWxkC&Qb!NA*EGdh~V;6021rvl-d>t1VI}GIuSo zo7dR3qkP!mbmQ#A{09AVV_^@>(|!{me~=#;4V@}VdrtVcL|{0M{mpz^e+Qo&K{rMy4NewasgB>YJPs@hb(B#A zXK#XO`Hb}VICc#^2qE?ZPcxg=n(vNHEKuo?n3V6l@mN_u&(AYhwK()0MP=rfc;%Rw zfS7ca%m+AJbeTpI{XIZn@yL?++HbqG^-)!rX;r}P#7*Qve)g+d_zEppw8Fe9Hwfdx z^nV(hPSiOe9(}PmW_G9j6bsAO@}Sh`e>~wl9dWXawC`(*%w--zajMl21715(^NU(5 z7EHZjd)>K%$$ciua^A13%8+4qb2`_p_Ny#Do1($JRI>zfU5r|l`e}e?;eOH)_o928 z4rm+hhLLv3Np&yhqsTy3;Qh&LsZlaJ_#|UMJS9N=Ly>c1d~5L_BgG*zk>e^RzZ;X? z-92Pb={@Kg{42jOO|EK`hzm`YsD;V=W=M>p-63o8E(=xoJ2zLQ9XX$Ddvk8;Iiwxp z&+YKa2q`Mq9^8m?$#__6-5cC@urz<4v`fp=EmO&nVRQz@qz*U7jxAX1Hsd(CJh>Ze zfwte!nqmOTmIHTU$Nb-$B_hC_T1MI*r;xPsW;K|^VNKhkgN<;@KZwY#|Mza}VpOcRmssSZDA8~5}IKCTng zk8|Pu_Q_8EboklMdSvFg+3&CU3DgJa)r?}tfOE?n_qANA5ee>j$to&Egg)4L_1a)X zpG}!#Q(z+!#AGtN6H#@}p0d8=S0z_&BP!B97$r9rMGUEgk)Fk*=KoQ=r~MhC-2MNJ ze3X`q)O<16!nI;}p{*-=86mE$E2@Bj4Sqv+rmmcb-<(N(q@%wn5EO5Zt~tFZV&#!E z7`$Sz^lrK^?Z}e9JyMeIVBMiE{y$Jd&1*oNxY7H%W@VZzk3W^;iYegQI9Q`BnI!SB zDVM_0e=sI}iy?uHy6qU{dX27iM2RWt1hAHu?bIzaU-EKx$*XUK$q_r=t=-t6>qs7K zT`}LCr=Joy2Wy~V@8MOsHW?f9Ha?k3W8R)20gZJU^a-5J7sZ9`J6-#=A92|7j@HPc z?t^WTn(Mp5&fhH^W4Qf*$UW}xM#<5%#=nka`@;f$Fc?Hth{XF0rmUaZU4*5h#kOI}1XQ(&b9bGg0{^)SaKRXM)!OSF!L3+O_ zu6hsh-#9mYWIY$MWF7N#Vh%WHb%~>c-3~ z4;mk&ck1JcDS+5b+NC3n93!kx;ucLnr!1G6Z60&Ivwo>KfXWHC!LGUF`&(4C?o5aq zn?=){{!a_gs({s>yLAa#u^NzTxt@>A!WcLE2_8jmJ)~6u_gM2Oi{DmDHj}BP-2sL9 z8ST=F<)yAATP!B_!ApNQtM~j;qVP1Xcb0#qyBjX_5Sj**>6G ztNf&6t$jFg?U8EfB{wW#^LFCTVRvwk90;T_HEQ}_PQ*-ed1!z7y*s!k{d=tBy2fpt z=@cgTl8PdyakRnCEpsCa7E+049ZJepc(W5t(w3b%#Hz4SPv+se#6%&Wb2<+Mv1Bip zCaJEI#)vArYqKsA9DE9+SNm-)GTL9&7Wsz>IP<;oqqqKzRb71{Ka29<27M{e3o{F~fK@M{QxMeq9@P z!VF|BUddpd3Zk6gKf`zuM`|&AfR#$qCqWAkKwS zah#9&aAHQ{z%E$vR-)H)cZPS$nwm&gS&w43=f^bnsJyLHj+`zCG_f>>{f~j};s`c) zU6+Z*Yg_%;05T`_g7U&ezs&p+o^#!58KLF0RjcLIvY<0stzQ*k`5v!ynbQLq*$otwy%iD!LzDH+8>r^gz(3(uy*yLBX^uPC zSrY?)-MD~f3ujvq{_Lv_CV80CDZa5D$!epw&5Z<%uXW;^sEI8 z-|1FJv_3K=Mi`ZyL=n%hk907OJ;{{6FxRzfzM3kD`bVKn)m&MI+rs!0y4T&y+IFsn zO>91Wv$U6XWpONhn20>dYpNeyoZ6#Du!N;xC^oc9WMbh=|I^n+3;rw8J3a6Bv(nY` z&ZGXfqIap)ZgH(nvTKI1jF+*_61M7f>QFzuF7}v#5+0rKaZjhhcnvhkuf`8YHaz!2 z9Y$kG!aby;fa2lL6DRshtuuk7Aqks1cQJCPG$VN~U_GjQ$}q4~Q;#(!>Ob5b_sRHd zeGyBOjEc?0PhF-L0fY0~y#Gbcx$mTpua5_k7gOe+Z=0xV+ltvC%WJB?yh@$JlVl>e zoQnL~>Whoz1ArKGruxQSr}G*_-RO@L@@H^)>$OHl z%P%AUvY$2oc2ipri8@;bSNGCE=2Pu6rS|8=$-Cn9rs)#s6%E<)T!yK@jolL0__;v0mb(QZW@9XxU?_Zc-U$3!&>-r_ienfYh?urL3h|WuZ z-F##B@3^!?ytF6j7Z_noENuILk?EyRQb50bvjbS-H}KX1 zZY1s!ovPlBAD)D-3o*)rINB|IH+sE)MQ+maiWWH z!t8EDf)u_K<5qKE^n|uVoK|QV8OBMCNL@?&WiHY@D6-XmO~(0Q;`S#K5GwnTj_)}7 zsa=Q^LH(3>m3!0M{Udy!CE8s2_{_q2u%6L+!ajw29&9!tRjUr^nY2p(CF1+jC-X6s z+4pFG0CRXR*8Z7X+!Kb=Wx^!=!9@xI#U2Bc@aqbSkAyR`!b)5A=2Yjt+$J&i%i5aG z5s(5zti@u3#h9rhV5aPB$Gy;)e|G#WD1$90qs^ABJ?iJUh^c(-Fk2N7F=oav$AS2K z6BX1gSO9?6@or76zyJ-9riCB~#5XBoB?ETec@B6VFO94B!qEGg2=mn-HZ%ZloukpF z5fcwG$?tFHg4tJ=p}I5jRlf)ur!}p)*`0deQ^`(mYQi8X;_c>LPPT0nF;S?0!oIj% zSTU37O@5l5UC(fz+Z9g;#DPZC>I)}K=)SvvYjg{)w~pr`&zbVXuuKG|v0+sK;+X=g zB-I}+kS0Q!-W%TKzT(cP=-1bG z<52dk&8p}BR`q@6z`M0nY`NUtpBn%)F0b{e5A6RdYT@@PYWixSe|O#kmwiW)s`WkHa(q#p(!SM*ig|7MZ}MUIFUkK2{`>!&=f1pu aAntK{`mOOCg*k_gB`c)_D*I^s{r>_iq>4iT literal 0 HcmV?d00001 From 65048eb45531d934e0f9562eb15511bd583ab528 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Thu, 29 Oct 2020 21:46:52 +0300 Subject: [PATCH 20/20] Added Page Header document --- docs/en/UI/AspNetCore/Branding.md | 3 ++ docs/en/UI/AspNetCore/Breadcrumbs.md | 3 -- docs/en/UI/AspNetCore/Layout-Hooks.md | 2 +- docs/en/UI/AspNetCore/Navigation-Menu.md | 2 +- docs/en/UI/AspNetCore/Page-Header.md | 58 ++++++++++++++++++++++++ docs/en/UI/AspNetCore/Theming.md | 2 + docs/en/docs-nav.json | 4 ++ 7 files changed, 69 insertions(+), 5 deletions(-) create mode 100644 docs/en/UI/AspNetCore/Branding.md delete mode 100644 docs/en/UI/AspNetCore/Breadcrumbs.md create mode 100644 docs/en/UI/AspNetCore/Page-Header.md diff --git a/docs/en/UI/AspNetCore/Branding.md b/docs/en/UI/AspNetCore/Branding.md new file mode 100644 index 0000000000..b262c13d46 --- /dev/null +++ b/docs/en/UI/AspNetCore/Branding.md @@ -0,0 +1,3 @@ +# ASP.NET Core MVC / Razor Pages: Branding + +TODO \ No newline at end of file diff --git a/docs/en/UI/AspNetCore/Breadcrumbs.md b/docs/en/UI/AspNetCore/Breadcrumbs.md deleted file mode 100644 index 6147f71236..0000000000 --- a/docs/en/UI/AspNetCore/Breadcrumbs.md +++ /dev/null @@ -1,3 +0,0 @@ -# Breadcrumbs - -TODO \ No newline at end of file diff --git a/docs/en/UI/AspNetCore/Layout-Hooks.md b/docs/en/UI/AspNetCore/Layout-Hooks.md index 7039749142..168454a7c2 100644 --- a/docs/en/UI/AspNetCore/Layout-Hooks.md +++ b/docs/en/UI/AspNetCore/Layout-Hooks.md @@ -1,4 +1,4 @@ -# ASP.NET Core MVC / Razor Pages Layout Hooks +# ASP.NET Core MVC / Razor Pages: Layout Hooks ABP Framework theming system places the page layout into the [theme](Theming.md) NuGet packages. That means the final application doesn't include a `Layout.cshtml`, so you can't directly change the layout code to customize it. diff --git a/docs/en/UI/AspNetCore/Navigation-Menu.md b/docs/en/UI/AspNetCore/Navigation-Menu.md index ddbfbbd857..13a6e1678c 100644 --- a/docs/en/UI/AspNetCore/Navigation-Menu.md +++ b/docs/en/UI/AspNetCore/Navigation-Menu.md @@ -83,7 +83,7 @@ Here, a few notes on the menu contributors; There are more options of a menu item (the constructor of the `ApplicationMenuItem` class). Here, the list of all available options; -* `name` (`string`, required): The unique name of the menu item. +* `name` (`string`, required): The **unique name** of the menu item. * `displayName` (`string`, required): Display name/text of the menu item. You can [localize](../../Localization.md) this as shown before. * `url` (`string`): The URL of the menu item. * `icon` (`string`): An icon name. Free [Font Awesome](https://fontawesome.com/) icon classes are supported out of the box. Example: `fa fa-book`. You can use any CSS font icon class as long as you include the necessary CSS files to your application. diff --git a/docs/en/UI/AspNetCore/Page-Header.md b/docs/en/UI/AspNetCore/Page-Header.md new file mode 100644 index 0000000000..f6ec3074de --- /dev/null +++ b/docs/en/UI/AspNetCore/Page-Header.md @@ -0,0 +1,58 @@ +# ASP.NET Core MVC / Razor Pages: Page Header + +`IPageLayout` service can be used to set the page title, selected menu item and the breadcrumb items for a page. It's the [theme](Theming.md)'s responsibility to render these on the page. + +## IPageLayout + +`IPageLayout` can be injected in any page/view to set the page header properties. + +### Page Title + +Page Title can be set as shown in the example below: + +````csharp +@inject IPageLayout PageLayout +@{ + PageLayout.Content.Title = "Book List"; +} +```` + +* The Page Title is set to the HTML `title` tag (in addition to the [brand/application name](Branding.md)). +* The theme may render the Page Title before the Page Content (not implemented by the Basic Theme). + +### Breadcrumb + +> **The [Basic Theme](Basic-Theme.md) currently doesn't implement the breadcrumbs.** + +Breadcrumb items can be added to the `PageLayout.Content.BreadCrumb`. + +**Example: Add Language Management to the breadcrumb items.** + +```` +PageLayout.Content.BreadCrumb.Add("Language Management"); +```` + +The theme then renders the breadcrumb. An example render result can be: + +![breadcrumbs-example](../../images/breadcrumbs-example.png) + +* The Home icon is rendered by default. Set `PageLayout.Content.BreadCrumb.ShowHome` to `false` to hide it. +* Current Page name (got from the `PageLayout.Content.Title`) is added as the last by default. Set `PageLayout.Content.BreadCrumb.ShowCurrent` to `false` to hide it. + +Any item that you add is inserted between Home and Current Page items. You can add as many item as you need. `BreadCrumb.Add(...)` method gets three parameters: + +* `text`: The text to show for the breadcrumb item. +* `url` (optional): A URL to navigate to, if the user clicks to the breadcrumb item. +* `icon` (optional): An icon class (like `fas fa-user-tie` for Font-Awesome) to show with the `text`. + +### The Selected Menu Item + +> **The [Basic Theme](Basic-Theme.md) currently doesn't implement the selected menu item since it is not applicable to the top menu which is the only option for the Basic Theme for now.** + +You can set the Menu Item name related to this page: + +````csharp +PageLayout.Content.MenuItemName = "BookStore.Books"; +```` + +Menu item name should match a unique menu item name defined using the [Navigation / Menu](Navigation-Menu.md) system. In this case, it is expected from the theme to make the menu item "active" in the main menu. \ No newline at end of file diff --git a/docs/en/UI/AspNetCore/Theming.md b/docs/en/UI/AspNetCore/Theming.md index 69e6b33769..8c680973b8 100644 --- a/docs/en/UI/AspNetCore/Theming.md +++ b/docs/en/UI/AspNetCore/Theming.md @@ -406,6 +406,8 @@ The Basic Theme doesn't implement this service, but the Lepton Theme implements: ![breadcrumbs-example](../../images/breadcrumbs-example.png) +See the [Page Header](Page-Header.md) document for more. + #### Tenant Switch The Account Layout should allow the user to switch the current tenant if the application is multi-tenant and the tenant was resolved from the cookies. See the [Basic Theme Account Layout](https://github.com/abpframework/abp/blob/dev/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Themes/Basic/Layouts/Account.cshtml) as an example implementation. diff --git a/docs/en/docs-nav.json b/docs/en/docs-nav.json index 978d40a5b5..536c5d9a03 100644 --- a/docs/en/docs-nav.json +++ b/docs/en/docs-nav.json @@ -452,6 +452,10 @@ "text": "Toolbars", "path": "UI/AspNetCore/Toolbars.md" }, + { + "text": "Page Header", + "path": "UI/AspNetCore/Page-Header.md" + }, { "text": "Layout Hooks", "path": "UI/AspNetCore/Layout-Hooks.md"