mirror of https://github.com/abpframework/abp.git
28 changed files with 845 additions and 999 deletions
@ -0,0 +1,57 @@ |
|||
# Blazor UI: Basic Theme |
|||
|
|||
The Basic Theme is a theme implementation for the Blazor 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. |
|||
|
|||
> 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.Components.WebAssembly.BasicTheme](https://www.nuget.org/packages/Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme) NuGet package to your web project. |
|||
* Add `AbpAspNetCoreComponentsWebAssemblyBasicThemeModule` into the `[DependsOn(...)]` attribute for your [module class](../../Module-Development-Basics.md) in the your Blazor UI project. |
|||
* Use `Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme.Themes.Basic.App` as the root component of your application in the `ConfigureServices` method of your module: |
|||
|
|||
````csharp |
|||
var builder = context.Services.GetSingletonInstance<WebAssemblyHostBuilder>(); |
|||
builder.RootComponents.Add<App>("#ApplicationContainer"); |
|||
```` |
|||
|
|||
`#ApplicationContainer` is a selector (like `<div id="ApplicationContainer">Loading...</div>`) in the `index.html`. |
|||
|
|||
## The Layout |
|||
|
|||
 |
|||
|
|||
Application Layout implements the following parts, in addition to the common parts mentioned above; |
|||
|
|||
* [Branding](Branding.md) Area |
|||
* Main [Menu](Navigation-Menu.md) |
|||
* Main [Toolbar](Toolbars.md) with Language Selection & User Menu |
|||
* [Page Alerts](Page-Alerts.md) |
|||
|
|||
## 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 |
|||
|
|||
You can simply override the styles in the Global Styles file of your application. |
|||
|
|||
#### Override the Components |
|||
|
|||
See the [Customization / Overriding Components](Customization-Overriding-Components.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.Components.WebAssembly.BasicTheme) 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) |
|||
@ -0,0 +1,37 @@ |
|||
# Blazor UI: Branding |
|||
|
|||
## IBrandingProvider |
|||
|
|||
`IBrandingProvider` is a simple interface that is used to show the application name and logo on the layout. |
|||
|
|||
The screenshot below shows *MyProject* as the application name: |
|||
|
|||
 |
|||
|
|||
You can implement the `IBrandingProvider` interface or inherit from the `DefaultBrandingProvider` to set the application name: |
|||
|
|||
````csharp |
|||
using Volo.Abp.DependencyInjection; |
|||
using Volo.Abp.Ui.Branding; |
|||
|
|||
namespace MyCompanyName.MyProjectName.Blazor |
|||
{ |
|||
[Dependency(ReplaceServices = true)] |
|||
public class MyProjectNameBrandingProvider : DefaultBrandingProvider |
|||
{ |
|||
public override string AppName => "Book Store"; |
|||
} |
|||
} |
|||
```` |
|||
|
|||
The result will be like shown below: |
|||
|
|||
 |
|||
|
|||
`IBrandingProvider` has the following properties: |
|||
|
|||
* `AppName`: The application name. |
|||
* `LogoUrl`: A URL to show the application logo. |
|||
* `LogoReverseUrl`: A URL to show the application logo on a reverse color theme (dark, for example). |
|||
|
|||
> **Tip**: `IBrandingProvider` is used in every page refresh. For a multi-tenant application, you can return a tenant specific application name to customize it per tenant. |
|||
@ -1,3 +1,88 @@ |
|||
# Blazor UI: Customization / Overriding Components |
|||
|
|||
TODO |
|||
This document explains how to override the user interface of a depended [application module](../../Modules/Index.md) or [theme](Theming.md) for Blazor applications. |
|||
|
|||
## Overriding a Razor Component |
|||
|
|||
The ABP Framework, pre-built themes and modules define some **re-usable razor components and pages**. These pages and components can be replaced by your application or module. |
|||
|
|||
> Since pages are just the razor components, the same principle is valid for pages too. |
|||
|
|||
### Example: Replacing the Branding Area |
|||
|
|||
The screenshot below was taken from the [Basic Theme](Basic-Theme.md) comes with the application startup template. |
|||
|
|||
 |
|||
|
|||
The [Basic Theme](Basic-Theme.md) defines some razor components for the layout. For example, the highlighted area with the red rectangle above is called *Branding* 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/bookstore-logo.png` path: |
|||
|
|||
 |
|||
|
|||
The next step is to create a razor component, like `MyBlazor.razor`, in your application: |
|||
|
|||
 |
|||
|
|||
The content of the `MyBlazor.razor` is shown below: |
|||
|
|||
````html |
|||
@using Volo.Abp.DependencyInjection |
|||
@using Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme.Themes.Basic |
|||
@inherits Branding |
|||
@attribute [ExposeServices(typeof(Branding))] |
|||
@attribute [Dependency(ReplaceServices = true)] |
|||
<a href="/"> |
|||
<img src="bookstore-logo.png" width="250" height="60"/> |
|||
</a> |
|||
```` |
|||
|
|||
Let's explain the code: |
|||
|
|||
* `@inherits Branding` line inherits the Branding component defined by the [Basic Theme](Basic-Theme.md) (in the `Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme.Themes.Basic` namespace). |
|||
* `@attribute [ExposeServices(typeof(Branding))]` registers this service (component) to [dependency injection](../../Dependency-Injection.md) for the `Branding` service (component). |
|||
* `@attribute [Dependency(ReplaceServices = true)]` replaces the `Branding` class (component) with this new `MyBranding` class (component). |
|||
* The rest of the code is related the content and styling of the component. |
|||
|
|||
Now, you can run the application to see the result: |
|||
|
|||
 |
|||
|
|||
> Since the component inherits from the component it is replacing, you can use all the non-private fields/properties/methods of the base component in the derived component. |
|||
|
|||
### Example: Replacing with the Code Behind File |
|||
|
|||
If you prefer to use code-behind file for the C# code of your component, you can use the attributes in the C# side. |
|||
|
|||
**MyBlazor.razor** |
|||
|
|||
````html |
|||
@using Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme.Themes.Basic |
|||
@inherits Branding |
|||
<a href="/"> |
|||
<img src="bookstore-logo.png" width="250" height="60"/> |
|||
</a> |
|||
```` |
|||
|
|||
**MyBlazor.razor.cs** |
|||
|
|||
````csharp |
|||
using Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme.Themes.Basic; |
|||
using Volo.Abp.DependencyInjection; |
|||
|
|||
namespace MyProject.Blazor.Components |
|||
{ |
|||
[ExposeServices(typeof(Branding))] |
|||
[Dependency(ReplaceServices = true)] |
|||
public partial class MyBranding |
|||
{ |
|||
|
|||
} |
|||
} |
|||
```` |
|||
|
|||
## Theming |
|||
|
|||
The [Theming](Theming.md) system allows you to build your own theme. You can create your theme from scratch or get the [Basic Theme](Basic-Theme.md) and change however you like. |
|||
|
|||
## Manipulating the Bundles |
|||
@ -1,3 +1,78 @@ |
|||
# Blazor UI: Localization |
|||
|
|||
Blazor applications can reuse the same `IStringLocalizer<T>` service that is explained in the [localization document](../../Localization.md). All the localization resources and texts available in the server side are usable in the Blazor application. |
|||
Blazor applications can reuse the same `IStringLocalizer<T>` service that is explained in the [localization document](../../Localization.md). |
|||
|
|||
All the localization resources and texts available in the server side are usable in the Blazor application. |
|||
|
|||
## IStringLocalizer |
|||
|
|||
`IStringLocalizer<T>` (`T` is the localization resource class) can be injected in any service or component to use the localization service. |
|||
|
|||
### Razor Components |
|||
|
|||
Use `@inject IStringLocalizer<MyProjectNameResource>` to use the localization in a razor component. |
|||
|
|||
**Example: Localization in a Razor Component** |
|||
|
|||
````csharp |
|||
@page "/" |
|||
@using MyCompanyName.MyProjectName.Localization |
|||
@using Microsoft.Extensions.Localization |
|||
@inject IStringLocalizer<MyProjectNameResource> L |
|||
|
|||
<h1> |
|||
@L["LongWelcomeMessage"] |
|||
</h1> |
|||
```` |
|||
|
|||
> `L` is a name that we love and use as the name of a `IStringLocalizer` instance, while you can give any name. |
|||
|
|||
#### The AbpComponentBase |
|||
|
|||
`AbpComponentBase` is a useful base class that you can derive the components from. It has some useful properties/methods you typically need in a component. |
|||
|
|||
The `AbpComponentBase` already defines a base `L` property (of type `IStringLocalizer`). It only requires to set the resource type (in the constructor of the derived class). If you created your application from the ABP's application startup template, then you should have a *YourProjectComponentBase* class in the Blazor project. Inherit components from this class to have the localizer pre-injected. |
|||
|
|||
**Example: Derive from the base component class** |
|||
|
|||
````csharp |
|||
@page "/" |
|||
@inherits MyProjectNameComponentBase |
|||
|
|||
<h1> |
|||
@L["LongWelcomeMessage"] |
|||
</h1> |
|||
```` |
|||
|
|||
### Other Services |
|||
|
|||
`IStringLocalizer<T>` can be injected into any service. |
|||
|
|||
**Example** |
|||
|
|||
````csharp |
|||
public class MyService : ITransientDependency |
|||
{ |
|||
private readonly IStringLocalizer<TestResource> _localizer; |
|||
|
|||
public MyService(IStringLocalizer<TestResource> localizer) |
|||
{ |
|||
_localizer = localizer; |
|||
} |
|||
|
|||
public void Foo() |
|||
{ |
|||
var str = _localizer["HelloWorld"]; |
|||
} |
|||
} |
|||
```` |
|||
|
|||
### Format Arguments |
|||
|
|||
Format arguments can be passed after the localization key. If your message is `Hello {0}, welcome!`, then you can pass the `{0}` argument to the localizer like `_localizer["HelloMessage", "John"]`. |
|||
|
|||
> Refer to the [Microsoft's localization documentation](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/localization) for details about using the localization. |
|||
|
|||
## See Also |
|||
|
|||
* [Localization](../../Localization.md) |
|||
@ -1,3 +1,207 @@ |
|||
# Blazor UI: Navigation / Menu |
|||
|
|||
TODO |
|||
Every application has a main menu to allow users to navigate to pages/screens of the application. Some applications may contain more than one menu in different sections of the UI. |
|||
|
|||
ABP Framework is a [modular](../../Module-Development-Basics.md) application development framework. **Every module may need to add items to the menu**. |
|||
|
|||
So, ABP Framework **provides a menu infrastructure** where; |
|||
|
|||
* The application or the modules can add items to a menu, without knowing how the menu is rendered. |
|||
* The [theme](Theming.md) properly renders the menu. |
|||
|
|||
## Adding Menu Items |
|||
|
|||
In order to add menu items (or manipulate the existing items) you need to create a class implementing the `IMenuContributor` interface. |
|||
|
|||
> The [application startup template](../../Startup-Templates/Application.md) already contains an implementation of the `IMenuContributor`. So, you can add items inside that class instead of creating a new one. |
|||
|
|||
**Example: Add a *CRM* menu item with *Customers* and *Orders* sub menu items** |
|||
|
|||
```csharp |
|||
using System.Threading.Tasks; |
|||
using MyProject.Localization; |
|||
using Volo.Abp.UI.Navigation; |
|||
|
|||
namespace MyProject.Web.Menus |
|||
{ |
|||
public class MyProjectMenuContributor : IMenuContributor |
|||
{ |
|||
public async Task ConfigureMenuAsync(MenuConfigurationContext context) |
|||
{ |
|||
if (context.Menu.Name == StandardMenus.Main) |
|||
{ |
|||
await ConfigureMainMenuAsync(context); |
|||
} |
|||
} |
|||
|
|||
private async Task ConfigureMainMenuAsync(MenuConfigurationContext context) |
|||
{ |
|||
var l = context.GetLocalizer<MyProjectResource>(); |
|||
|
|||
context.Menu.AddItem( |
|||
new ApplicationMenuItem("MyProject.Crm", l["Menu:CRM"]) |
|||
.AddItem(new ApplicationMenuItem( |
|||
name: "MyProject.Crm.Customers", |
|||
displayName: l["Menu:Customers"], |
|||
url: "/crm/customers") |
|||
).AddItem(new ApplicationMenuItem( |
|||
name: "MyProject.Crm.Orders", |
|||
displayName: l["Menu:Orders"], |
|||
url: "/crm/orders") |
|||
) |
|||
); |
|||
} |
|||
} |
|||
} |
|||
``` |
|||
|
|||
* This example adds items only to the main menu (`StandardMenus.Main`: see the *Standard Menus* section below). |
|||
* It gets a `IStringLocalizer` from `context` to [localize](../../Localization.md) the display names of the menu items. |
|||
* Adds the Customers and Orders as children of the CRM menu. |
|||
|
|||
Once you create a menu contributor, you need to add it to the `AbpNavigationOptions` in the `ConfigureServices` method of your module: |
|||
|
|||
````csharp |
|||
Configure<AbpNavigationOptions>(options => |
|||
{ |
|||
options.MenuContributors.Add(new MyProjectMenuContributor()); |
|||
}); |
|||
```` |
|||
|
|||
This example uses some localization keys as display names those should be defined in the localization file: |
|||
|
|||
````json |
|||
"Menu:CRM": "CRM", |
|||
"Menu:Orders": "Orders", |
|||
"Menu:Customers": "Customers" |
|||
```` |
|||
|
|||
See the [localization document](../../Localization.md) to learn more about the localization. |
|||
|
|||
When you run the application, you will see the menu items added to the main menu: |
|||
|
|||
 |
|||
|
|||
> The menu is rendered by the current UI [theme](Theming.md). So, the look of the main menu can be completely different based on your theme. |
|||
|
|||
Here, a few notes on the menu contributors; |
|||
|
|||
* ABP Framework calls the `ConfigureMenuAsync` method **whenever need to render** the menu. |
|||
* Every menu item can have **children**. So, you can add menu items with **unlimited depth** (however, your UI theme may not support unlimited depth). |
|||
* Only leaf menu items have `url`s normally. When you click to a parent menu, its sub menu is opened or closed, you don't navigate the `url` of a parent menu item. |
|||
* If a menu item has no children and has no `url` defined, then it is not rendered on the UI. This simplifies to authorize the menu items: You only authorize the child items (see the next section). If none of the children are authorized, then the parent automatically disappears. |
|||
|
|||
### Menu Item Properties |
|||
|
|||
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. |
|||
* `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. |
|||
* `order` (`int`): The order of the menu item. Default value is `1000`. Items are sorted by the adding order unless you specify an order value. |
|||
* `customData` (`object`): A custom object that you can associate to the menu item and use it while rendering the menu item. |
|||
* `target` (`string`): Target of the menu item. Can be `null` (default), "\_*blank*", "\_*self*", "\_*parent*", "\_*top*" or a frame name for web applications. |
|||
* `elementId` (`string`): Can be used to render the element with a specific HTML `id` attribute. |
|||
* `cssClass` (`string`): Additional string classes for the menu item. |
|||
|
|||
### Authorization |
|||
|
|||
As seen above, a menu contributor contributes to the menu dynamically. So, you can perform any custom logic or get menu items from any source. |
|||
|
|||
One use case is the [authorization](Authorization.md). You typically want to add menu items by checking a permission. |
|||
|
|||
**Example: Check if the current user has a permission** |
|||
|
|||
````csharp |
|||
if (await context.IsGrantedAsync("MyPermissionName")) |
|||
{ |
|||
//...add menu items |
|||
} |
|||
```` |
|||
|
|||
> You can use `context.AuthorizationService` to directly access to the `IAuthorizationService`. |
|||
|
|||
### Resolving Dependencies |
|||
|
|||
`context.ServiceProvider` can be used to resolve any service dependency. |
|||
|
|||
**Example: Get a service** |
|||
|
|||
````csharp |
|||
var myService = context.ServiceProvider.GetRequiredService<IMyService>(); |
|||
//...use the service |
|||
```` |
|||
|
|||
> You don't need to care about releasing/disposing services. ABP Framework handles it. |
|||
|
|||
### The Administration Menu |
|||
|
|||
There is a special menu item in the menu menu that is added by the ABP Framework: The *Administration* menu. It is typically used by the pre-built admin [application modules](../../Modules/Index.md): |
|||
|
|||
 |
|||
|
|||
If you want to add menu items under the *Administration* menu item, you can use the `context.Menu.GetAdministration()` extension method: |
|||
|
|||
````csharp |
|||
context.Menu.GetAdministration().AddItem(...) |
|||
```` |
|||
|
|||
### Manipulating the Existing Menu Items |
|||
|
|||
ABP Framework executes the menu contributors by the [module dependency order](../../Module-Development-Basics.md). So, you can manipulate the menu items that your application or module (directly or indirectly) depends on. |
|||
|
|||
**Example: Set an icon for the `Users` menu item added by the [Identity Module](../../Modules/Identity.md)** |
|||
|
|||
````csharp |
|||
var userMenu = context.Menu.FindMenuItem(IdentityMenuNames.Users); |
|||
userMenu.Icon = "fa fa-users"; |
|||
```` |
|||
|
|||
> `context.Menu` gives you ability to access to all the menu items those have been added by the previous menu contributors. |
|||
|
|||
## Standard Menus |
|||
|
|||
A menu is a **named** component. An application may contain more than one menus with different, unique names. There are two pre-defined standard menus: |
|||
|
|||
* `Main`: The main menu of the application. Contains links to the page of the application. Defined as a constant: `Volo.Abp.UI.Navigation.StandardMenus.Main`. |
|||
* `User`: User profile menu. Defined as a constant: `Volo.Abp.UI.Navigation.StandardMenus.User`. |
|||
|
|||
The `Main` menu already covered above. The `User` menu is available when a user has logged in: |
|||
|
|||
 |
|||
|
|||
You can add items to the `User` menu by checking the `context.Menu.Name` as shown below: |
|||
|
|||
```csharp |
|||
if (context.Menu.Name == StandardMenus.User) |
|||
{ |
|||
//...add items |
|||
} |
|||
``` |
|||
|
|||
## IMenuManager |
|||
|
|||
`IMenuManager` is generally used by the UI [theme](Theming.md) to render the menu items on the UI. So, **you generally don't need to directly use** the `IMenuManager`. |
|||
|
|||
**Example: Get the Main Menu to render in a razor component** |
|||
|
|||
```csharp |
|||
// Code behind file of a razor component |
|||
public partial class NavMenu |
|||
{ |
|||
private readonly IMenuManager _menuManager; |
|||
|
|||
public NavMenu(IMenuManager menuManager) |
|||
{ |
|||
_menuManager = menuManager; |
|||
} |
|||
|
|||
protected override async Task OnInitializedAsync() |
|||
{ |
|||
var menu = await _menuManager.GetAsync(StandardMenus.Main); |
|||
//... |
|||
} |
|||
} |
|||
``` |
|||
|
|||
|
|||
@ -0,0 +1,3 @@ |
|||
# Blazor UI: Page Alerts |
|||
|
|||
TODO |
|||
@ -1,3 +1,63 @@ |
|||
# Blazor UI: Settings |
|||
|
|||
Blazor applications can reuse the same `ISettingProvider` service that is explained in the [settings document](../../Settings.md). |
|||
Blazor applications can reuse the same `ISettingProvider` service that is explained in the [settings document](../../Settings.md). |
|||
|
|||
## ISettingProvider |
|||
|
|||
`ISettingProvider` is used to get the value of a setting or get the values of all the settings. |
|||
|
|||
**Example usages in a simple service** |
|||
|
|||
````csharp |
|||
public class MyService : ITransientDependency |
|||
{ |
|||
private readonly ISettingProvider _settingProvider; |
|||
|
|||
//Inject ISettingProvider in the constructor |
|||
public MyService(ISettingProvider settingProvider) |
|||
{ |
|||
_settingProvider = settingProvider; |
|||
} |
|||
|
|||
public async Task FooAsync() |
|||
{ |
|||
//Get a value as string. |
|||
string setting1 = await _settingProvider.GetOrNullAsync("MySettingName"); |
|||
|
|||
//Get a bool value and fallback to the default value (false) if not set. |
|||
bool setting2 = await _settingProvider.GetAsync<bool>("MyBoolSettingName"); |
|||
|
|||
//Get a bool value and fallback to the provided default value (true) if not set. |
|||
bool setting3 = await _settingProvider.GetAsync<bool>( |
|||
"MyBoolSettingName", defaultValue: true); |
|||
|
|||
//Get a bool value with the IsTrueAsync shortcut extension method |
|||
bool setting4 = await _settingProvider.IsTrueAsync("MyBoolSettingName"); |
|||
|
|||
//Get an int value or the default value (0) if not set |
|||
int setting5 = (await _settingProvider.GetAsync<int>("MyIntegerSettingName")); |
|||
|
|||
//Get an int value or null if not provided |
|||
int? setting6 = (await _settingProvider |
|||
.GetOrNullAsync("MyIntegerSettingName"))?.To<int>(); |
|||
} |
|||
} |
|||
```` |
|||
|
|||
**Example usage in a Razor Component** |
|||
|
|||
````csharp |
|||
@page "/" |
|||
@using Volo.Abp.Settings |
|||
@inject ISettingProvider SettingProvider |
|||
@code { |
|||
protected override async Task OnInitializedAsync() |
|||
{ |
|||
bool settingValue = await SettingProvider.GetAsync<bool>("MyBoolSettingName"); |
|||
} |
|||
} |
|||
```` |
|||
|
|||
## See Also |
|||
|
|||
* [Settings](../../Settings.md) |
|||
@ -1,3 +1,207 @@ |
|||
# Blazor UI: Theming |
|||
|
|||
TODO |
|||
## Introduction |
|||
|
|||
ABP Framework provides a complete **UI Theming** system with the following goals: |
|||
|
|||
* Reusable [application modules](../../Modules/Index.md) are developed **theme-independent**, so they can work with any UI theme. |
|||
* UI theme is **decided by the final application**. |
|||
* The theme is distributed via a NuGet package, so it is **easily upgradable**. |
|||
* The final application can **customize** the selected theme. |
|||
|
|||
In order to accomplish these goals, ABP Framework; |
|||
|
|||
* Determines a set of **base libraries** used and adapted by all the themes. So, module and application developers can depend on and use these libraries without depending on a particular theme. |
|||
* Provides a system that consists of layout parts (like [navigation menus](Navigation-Menu.md) and [toolbars](Toolbars.md)) that is implemented by all the themes. So, the modules and the application to contribute to the layout to compose a consistent application UI. |
|||
|
|||
### Current Themes |
|||
|
|||
Currently, two themes are **officially provided**: |
|||
|
|||
* The [Basic Theme](Basic-Theme.md) is the minimalist theme with the plain Bootstrap style. It is **open source and free**. |
|||
* The [Lepton Theme](https://commercial.abp.io/themes) is a **commercial** theme developed by the core ABP team and is a part of the [ABP Commercial](https://commercial.abp.io/) license. |
|||
|
|||
## Overall |
|||
|
|||
### The Base Libraries |
|||
|
|||
All the themes must depend on the [Volo.Abp.AspNetCore.Components.WebAssembly.Theming](https://www.nuget.org/packages/Volo.Abp.AspNetCore.Components.WebAssembly.Theming) NuGet package, so they are indirectly depending on the following libraries: |
|||
|
|||
* [Twitter Bootstrap](https://getbootstrap.com/) as the fundamental HTML/CSS framework. |
|||
* [Blazorise](https://github.com/stsrki/Blazorise) as a component library that supports the Bootstrap and adds extra components like Data Grid and Tree. |
|||
* [FontAwesome](https://fontawesome.com/) as the fundamental CSS font library. |
|||
* [Flag Icon](https://github.com/lipis/flag-icon-css) as a library to show flags of countries. |
|||
|
|||
These libraries are selected as the base libraries and available to the applications and modules. |
|||
|
|||
> Bootstrap's JavaScript part is not used since the Blazorise library already provides the necessary functionalities to the Bootstrap components in a native way. |
|||
|
|||
### The Layout |
|||
|
|||
All themes must define a layout for the application. The following image shows the user management page in the [Basic Theme](Basic-Theme.md) application layout: |
|||
|
|||
 |
|||
|
|||
And the same page is shown below with the [Lepton Theme](https://commercial.abp.io/themes) application layout: |
|||
|
|||
 |
|||
|
|||
As you can see, the page is the same, but the look is completely different in the themes above. |
|||
|
|||
The application layout typically includes the following parts; |
|||
|
|||
* A [main menu](Navigation-Menu.md) |
|||
* Main [Toolbar](Toolbars.md) with the following components; |
|||
* User menu |
|||
* Language switch dropdown |
|||
* [Page alerts](Page-Alerts.md) |
|||
* The page content (aka `@Body`) |
|||
|
|||
## Implementing a Theme |
|||
|
|||
A theme is simply a Razor Class Library. |
|||
|
|||
### The Easy Way |
|||
|
|||
The easiest way to create a new theme is to copy the [Basic Theme Source Code](https://github.com/abpframework/abp/tree/dev/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme) and customize it. Once you get a copy of the theme in your solution, remove the `Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic` NuGet package and reference to the local project. |
|||
|
|||
### Global Styles / Scripts |
|||
|
|||
A theme generally needs to add a global style to the page. ABP provides a system to manage the [Global Styles and Scripts](Global-Scripts-Styles.md). A theme can implement the `IBundleContributer` to add global style or script files to the page. |
|||
|
|||
**Example: Adding a style to the page** |
|||
|
|||
````csharp |
|||
using Volo.Abp.Bundling; |
|||
|
|||
namespace MyTheme |
|||
{ |
|||
public class MyThemeBundleContributer : IBundleContributer |
|||
{ |
|||
public void AddScripts(BundleContext context) |
|||
{ |
|||
|
|||
} |
|||
|
|||
public void AddStyles(BundleContext context) |
|||
{ |
|||
context.Add("_content/MyTheme/styles.css"); |
|||
} |
|||
} |
|||
} |
|||
```` |
|||
|
|||
`styles.css` file should be added into the `wwwroot` folder of the theme project for this example. When you use the `abp bundle` command, this class is automatically discovered and executed to add the style to the page. |
|||
|
|||
See the [Global Styles and Scripts](Global-Scripts-Styles.md) document for more. |
|||
|
|||
### 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** |
|||
|
|||
 |
|||
|
|||
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 razor component** |
|||
|
|||
```csharp |
|||
// Code behind file of a razor component |
|||
public partial class NavMenu |
|||
{ |
|||
private readonly IMenuManager _menuManager; |
|||
|
|||
public NavMenu(IMenuManager menuManager) |
|||
{ |
|||
_menuManager = menuManager; |
|||
} |
|||
|
|||
protected override async Task OnInitializedAsync() |
|||
{ |
|||
var menu = await _menuManager.GetAsync(StandardMenus.Main); |
|||
//... |
|||
} |
|||
} |
|||
``` |
|||
|
|||
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 Razor 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<AbpToolbarOptions>(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. |
|||
|
|||
Local Storage is used to get and set the current language with the `Abp.SelectedLanguage` key. |
|||
|
|||
**Example: Get the currently selected language** |
|||
|
|||
````csharp |
|||
var selectedLanguageName = await JsRuntime.InvokeAsync<string>( |
|||
"localStorage.getItem", |
|||
"Abp.SelectedLanguage" |
|||
); |
|||
```` |
|||
|
|||
**Example: Set the selected language** |
|||
|
|||
````csharp |
|||
await JsRuntime.InvokeVoidAsync( |
|||
"localStorage.setItem", |
|||
"Abp.SelectedLanguage", |
|||
"en-US" |
|||
); |
|||
```` |
|||
|
|||
The theme should reload the page after changing the language: |
|||
|
|||
````csharp |
|||
await JsRuntime.InvokeVoidAsync("location.reload"); |
|||
```` |
|||
|
|||
##### 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. See the [Page Alerts](Page-Alerts.md) document to learn more. |
|||
@ -1,3 +1,75 @@ |
|||
# Blazor UI: Toolbars |
|||
|
|||
TODO |
|||
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: |
|||
|
|||
 |
|||
|
|||
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 **Razor Component**. So, first, create a new razor component in your project (the location of the component doesn't matter): |
|||
|
|||
 |
|||
|
|||
The content of the `Notification.razor` is shown below: |
|||
|
|||
````html |
|||
@inherits Volo.Abp.AspNetCore.Components.AbpComponentBase |
|||
<div style="color: white; margin: 8px;"> |
|||
<i class="far fa-bell" @onclick="ShowNotifications"></i> |
|||
</div> |
|||
@code { |
|||
private async Task ShowNotifications() |
|||
{ |
|||
await Message.Info("TODO: Show notifications"); |
|||
} |
|||
} |
|||
```` |
|||
|
|||
This sample simply shows a message. In real life, you probably want to call an HTTP API to get notifications and show on the UI. |
|||
|
|||
Now, we can create a class implementing the `IToolbarContributor` interface: |
|||
|
|||
````csharp |
|||
using System.Threading.Tasks; |
|||
using MyCompanyName.MyProjectName.Blazor.Components; |
|||
using Volo.Abp.AspNetCore.Components.WebAssembly.Theming.Toolbars; |
|||
|
|||
namespace MyCompanyName.MyProjectName.Blazor |
|||
{ |
|||
public class MyToolbarContributor : IToolbarContributor |
|||
{ |
|||
public Task ConfigureToolbarAsync(IToolbarConfigurationContext context) |
|||
{ |
|||
if (context.Toolbar.Name == StandardToolbars.Main) |
|||
{ |
|||
context.Toolbar.Items.Insert(0, new ToolbarItem(typeof(Notification))); |
|||
} |
|||
|
|||
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<AbpToolbarOptions>(options => |
|||
{ |
|||
options.Contributors.Add(new MyToolbarContributor()); |
|||
}); |
|||
```` |
|||
|
|||
That's all, you will see the notification icon on the toolbar when you run the application: |
|||
|
|||
 |
|||
|
|||
## 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. |
|||
|
After Width: | Height: | Size: 50 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 17 KiB |
@ -0,0 +1,3 @@ |
|||
@using Volo.Abp.Ui.Branding |
|||
@inject IBrandingProvider BrandingProvider |
|||
<a class="navbar-brand" href="/">@BrandingProvider.AppName</a> |
|||
@ -1,382 +0,0 @@ |
|||
// <auto-generated />
|
|||
using System; |
|||
using Microsoft.EntityFrameworkCore; |
|||
using Microsoft.EntityFrameworkCore.Infrastructure; |
|||
using Microsoft.EntityFrameworkCore.Metadata; |
|||
using Microsoft.EntityFrameworkCore.Migrations; |
|||
using Microsoft.EntityFrameworkCore.Storage.ValueConversion; |
|||
using MyCompanyName.MyProjectName.EntityFrameworkCore; |
|||
using Volo.Abp.EntityFrameworkCore; |
|||
|
|||
namespace MyCompanyName.MyProjectName.Migrations |
|||
{ |
|||
[DbContext(typeof(MyProjectNameHttpApiHostMigrationsDbContext))] |
|||
[Migration("20201019021119_Initial")] |
|||
partial class Initial |
|||
{ |
|||
protected override void BuildTargetModel(ModelBuilder modelBuilder) |
|||
{ |
|||
#pragma warning disable 612, 618
|
|||
modelBuilder |
|||
.UseIdentityColumns() |
|||
.HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) |
|||
.HasAnnotation("Relational:MaxIdentifierLength", 128) |
|||
.HasAnnotation("ProductVersion", "5.0.0-rc.2.20475.6"); |
|||
|
|||
modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b => |
|||
{ |
|||
b.Property<Guid>("Id") |
|||
.ValueGeneratedOnAdd() |
|||
.HasColumnType("uniqueidentifier"); |
|||
|
|||
b.Property<string>("ApplicationName") |
|||
.HasMaxLength(96) |
|||
.HasColumnType("nvarchar(96)") |
|||
.HasColumnName("ApplicationName"); |
|||
|
|||
b.Property<string>("BrowserInfo") |
|||
.HasMaxLength(512) |
|||
.HasColumnType("nvarchar(512)") |
|||
.HasColumnName("BrowserInfo"); |
|||
|
|||
b.Property<string>("ClientId") |
|||
.HasMaxLength(64) |
|||
.HasColumnType("nvarchar(64)") |
|||
.HasColumnName("ClientId"); |
|||
|
|||
b.Property<string>("ClientIpAddress") |
|||
.HasMaxLength(64) |
|||
.HasColumnType("nvarchar(64)") |
|||
.HasColumnName("ClientIpAddress"); |
|||
|
|||
b.Property<string>("ClientName") |
|||
.HasMaxLength(128) |
|||
.HasColumnType("nvarchar(128)") |
|||
.HasColumnName("ClientName"); |
|||
|
|||
b.Property<string>("Comments") |
|||
.HasMaxLength(256) |
|||
.HasColumnType("nvarchar(256)") |
|||
.HasColumnName("Comments"); |
|||
|
|||
b.Property<string>("ConcurrencyStamp") |
|||
.IsConcurrencyToken() |
|||
.HasMaxLength(40) |
|||
.HasColumnType("nvarchar(40)") |
|||
.HasColumnName("ConcurrencyStamp"); |
|||
|
|||
b.Property<string>("CorrelationId") |
|||
.HasMaxLength(64) |
|||
.HasColumnType("nvarchar(64)") |
|||
.HasColumnName("CorrelationId"); |
|||
|
|||
b.Property<string>("Exceptions") |
|||
.HasMaxLength(4000) |
|||
.HasColumnType("nvarchar(4000)") |
|||
.HasColumnName("Exceptions"); |
|||
|
|||
b.Property<int>("ExecutionDuration") |
|||
.HasColumnType("int") |
|||
.HasColumnName("ExecutionDuration"); |
|||
|
|||
b.Property<DateTime>("ExecutionTime") |
|||
.HasColumnType("datetime2"); |
|||
|
|||
b.Property<string>("ExtraProperties") |
|||
.HasColumnType("nvarchar(max)") |
|||
.HasColumnName("ExtraProperties"); |
|||
|
|||
b.Property<string>("HttpMethod") |
|||
.HasMaxLength(16) |
|||
.HasColumnType("nvarchar(16)") |
|||
.HasColumnName("HttpMethod"); |
|||
|
|||
b.Property<int?>("HttpStatusCode") |
|||
.HasColumnType("int") |
|||
.HasColumnName("HttpStatusCode"); |
|||
|
|||
b.Property<Guid?>("ImpersonatorTenantId") |
|||
.HasColumnType("uniqueidentifier") |
|||
.HasColumnName("ImpersonatorTenantId"); |
|||
|
|||
b.Property<Guid?>("ImpersonatorUserId") |
|||
.HasColumnType("uniqueidentifier") |
|||
.HasColumnName("ImpersonatorUserId"); |
|||
|
|||
b.Property<Guid?>("TenantId") |
|||
.HasColumnType("uniqueidentifier") |
|||
.HasColumnName("TenantId"); |
|||
|
|||
b.Property<string>("TenantName") |
|||
.HasColumnType("nvarchar(max)"); |
|||
|
|||
b.Property<string>("Url") |
|||
.HasMaxLength(256) |
|||
.HasColumnType("nvarchar(256)") |
|||
.HasColumnName("Url"); |
|||
|
|||
b.Property<Guid?>("UserId") |
|||
.HasColumnType("uniqueidentifier") |
|||
.HasColumnName("UserId"); |
|||
|
|||
b.Property<string>("UserName") |
|||
.HasMaxLength(256) |
|||
.HasColumnType("nvarchar(256)") |
|||
.HasColumnName("UserName"); |
|||
|
|||
b.HasKey("Id"); |
|||
|
|||
b.HasIndex("TenantId", "ExecutionTime"); |
|||
|
|||
b.HasIndex("TenantId", "UserId", "ExecutionTime"); |
|||
|
|||
b.ToTable("AbpAuditLogs"); |
|||
}); |
|||
|
|||
modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLogAction", b => |
|||
{ |
|||
b.Property<Guid>("Id") |
|||
.ValueGeneratedOnAdd() |
|||
.HasColumnType("uniqueidentifier"); |
|||
|
|||
b.Property<Guid>("AuditLogId") |
|||
.HasColumnType("uniqueidentifier") |
|||
.HasColumnName("AuditLogId"); |
|||
|
|||
b.Property<int>("ExecutionDuration") |
|||
.HasColumnType("int") |
|||
.HasColumnName("ExecutionDuration"); |
|||
|
|||
b.Property<DateTime>("ExecutionTime") |
|||
.HasColumnType("datetime2") |
|||
.HasColumnName("ExecutionTime"); |
|||
|
|||
b.Property<string>("ExtraProperties") |
|||
.HasColumnType("nvarchar(max)") |
|||
.HasColumnName("ExtraProperties"); |
|||
|
|||
b.Property<string>("MethodName") |
|||
.HasMaxLength(128) |
|||
.HasColumnType("nvarchar(128)") |
|||
.HasColumnName("MethodName"); |
|||
|
|||
b.Property<string>("Parameters") |
|||
.HasMaxLength(2000) |
|||
.HasColumnType("nvarchar(2000)") |
|||
.HasColumnName("Parameters"); |
|||
|
|||
b.Property<string>("ServiceName") |
|||
.HasMaxLength(256) |
|||
.HasColumnType("nvarchar(256)") |
|||
.HasColumnName("ServiceName"); |
|||
|
|||
b.Property<Guid?>("TenantId") |
|||
.HasColumnType("uniqueidentifier") |
|||
.HasColumnName("TenantId"); |
|||
|
|||
b.HasKey("Id"); |
|||
|
|||
b.HasIndex("AuditLogId"); |
|||
|
|||
b.HasIndex("TenantId", "ServiceName", "MethodName", "ExecutionTime"); |
|||
|
|||
b.ToTable("AbpAuditLogActions"); |
|||
}); |
|||
|
|||
modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => |
|||
{ |
|||
b.Property<Guid>("Id") |
|||
.ValueGeneratedOnAdd() |
|||
.HasColumnType("uniqueidentifier"); |
|||
|
|||
b.Property<Guid>("AuditLogId") |
|||
.HasColumnType("uniqueidentifier") |
|||
.HasColumnName("AuditLogId"); |
|||
|
|||
b.Property<DateTime>("ChangeTime") |
|||
.HasColumnType("datetime2") |
|||
.HasColumnName("ChangeTime"); |
|||
|
|||
b.Property<byte>("ChangeType") |
|||
.HasColumnType("tinyint") |
|||
.HasColumnName("ChangeType"); |
|||
|
|||
b.Property<string>("EntityId") |
|||
.IsRequired() |
|||
.HasMaxLength(128) |
|||
.HasColumnType("nvarchar(128)") |
|||
.HasColumnName("EntityId"); |
|||
|
|||
b.Property<Guid?>("EntityTenantId") |
|||
.HasColumnType("uniqueidentifier"); |
|||
|
|||
b.Property<string>("EntityTypeFullName") |
|||
.IsRequired() |
|||
.HasMaxLength(128) |
|||
.HasColumnType("nvarchar(128)") |
|||
.HasColumnName("EntityTypeFullName"); |
|||
|
|||
b.Property<string>("ExtraProperties") |
|||
.HasColumnType("nvarchar(max)") |
|||
.HasColumnName("ExtraProperties"); |
|||
|
|||
b.Property<Guid?>("TenantId") |
|||
.HasColumnType("uniqueidentifier") |
|||
.HasColumnName("TenantId"); |
|||
|
|||
b.HasKey("Id"); |
|||
|
|||
b.HasIndex("AuditLogId"); |
|||
|
|||
b.HasIndex("TenantId", "EntityTypeFullName", "EntityId"); |
|||
|
|||
b.ToTable("AbpEntityChanges"); |
|||
}); |
|||
|
|||
modelBuilder.Entity("Volo.Abp.AuditLogging.EntityPropertyChange", b => |
|||
{ |
|||
b.Property<Guid>("Id") |
|||
.ValueGeneratedOnAdd() |
|||
.HasColumnType("uniqueidentifier"); |
|||
|
|||
b.Property<Guid>("EntityChangeId") |
|||
.HasColumnType("uniqueidentifier"); |
|||
|
|||
b.Property<string>("NewValue") |
|||
.HasMaxLength(512) |
|||
.HasColumnType("nvarchar(512)") |
|||
.HasColumnName("NewValue"); |
|||
|
|||
b.Property<string>("OriginalValue") |
|||
.HasMaxLength(512) |
|||
.HasColumnType("nvarchar(512)") |
|||
.HasColumnName("OriginalValue"); |
|||
|
|||
b.Property<string>("PropertyName") |
|||
.IsRequired() |
|||
.HasMaxLength(128) |
|||
.HasColumnType("nvarchar(128)") |
|||
.HasColumnName("PropertyName"); |
|||
|
|||
b.Property<string>("PropertyTypeFullName") |
|||
.IsRequired() |
|||
.HasMaxLength(64) |
|||
.HasColumnType("nvarchar(64)") |
|||
.HasColumnName("PropertyTypeFullName"); |
|||
|
|||
b.Property<Guid?>("TenantId") |
|||
.HasColumnType("uniqueidentifier") |
|||
.HasColumnName("TenantId"); |
|||
|
|||
b.HasKey("Id"); |
|||
|
|||
b.HasIndex("EntityChangeId"); |
|||
|
|||
b.ToTable("AbpEntityPropertyChanges"); |
|||
}); |
|||
|
|||
modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGrant", b => |
|||
{ |
|||
b.Property<Guid>("Id") |
|||
.ValueGeneratedOnAdd() |
|||
.HasColumnType("uniqueidentifier"); |
|||
|
|||
b.Property<string>("Name") |
|||
.IsRequired() |
|||
.HasMaxLength(128) |
|||
.HasColumnType("nvarchar(128)"); |
|||
|
|||
b.Property<string>("ProviderKey") |
|||
.IsRequired() |
|||
.HasMaxLength(64) |
|||
.HasColumnType("nvarchar(64)"); |
|||
|
|||
b.Property<string>("ProviderName") |
|||
.IsRequired() |
|||
.HasMaxLength(64) |
|||
.HasColumnType("nvarchar(64)"); |
|||
|
|||
b.Property<Guid?>("TenantId") |
|||
.HasColumnType("uniqueidentifier") |
|||
.HasColumnName("TenantId"); |
|||
|
|||
b.HasKey("Id"); |
|||
|
|||
b.HasIndex("Name", "ProviderName", "ProviderKey"); |
|||
|
|||
b.ToTable("AbpPermissionGrants"); |
|||
}); |
|||
|
|||
modelBuilder.Entity("Volo.Abp.SettingManagement.Setting", b => |
|||
{ |
|||
b.Property<Guid>("Id") |
|||
.ValueGeneratedOnAdd() |
|||
.HasColumnType("uniqueidentifier"); |
|||
|
|||
b.Property<string>("Name") |
|||
.IsRequired() |
|||
.HasMaxLength(128) |
|||
.HasColumnType("nvarchar(128)"); |
|||
|
|||
b.Property<string>("ProviderKey") |
|||
.HasMaxLength(64) |
|||
.HasColumnType("nvarchar(64)"); |
|||
|
|||
b.Property<string>("ProviderName") |
|||
.HasMaxLength(64) |
|||
.HasColumnType("nvarchar(64)"); |
|||
|
|||
b.Property<string>("Value") |
|||
.IsRequired() |
|||
.HasMaxLength(2048) |
|||
.HasColumnType("nvarchar(2048)"); |
|||
|
|||
b.HasKey("Id"); |
|||
|
|||
b.HasIndex("Name", "ProviderName", "ProviderKey"); |
|||
|
|||
b.ToTable("AbpSettings"); |
|||
}); |
|||
|
|||
modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLogAction", b => |
|||
{ |
|||
b.HasOne("Volo.Abp.AuditLogging.AuditLog", null) |
|||
.WithMany("Actions") |
|||
.HasForeignKey("AuditLogId") |
|||
.OnDelete(DeleteBehavior.Cascade) |
|||
.IsRequired(); |
|||
}); |
|||
|
|||
modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => |
|||
{ |
|||
b.HasOne("Volo.Abp.AuditLogging.AuditLog", null) |
|||
.WithMany("EntityChanges") |
|||
.HasForeignKey("AuditLogId") |
|||
.OnDelete(DeleteBehavior.Cascade) |
|||
.IsRequired(); |
|||
}); |
|||
|
|||
modelBuilder.Entity("Volo.Abp.AuditLogging.EntityPropertyChange", b => |
|||
{ |
|||
b.HasOne("Volo.Abp.AuditLogging.EntityChange", null) |
|||
.WithMany("PropertyChanges") |
|||
.HasForeignKey("EntityChangeId") |
|||
.OnDelete(DeleteBehavior.Cascade) |
|||
.IsRequired(); |
|||
}); |
|||
|
|||
modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b => |
|||
{ |
|||
b.Navigation("Actions"); |
|||
|
|||
b.Navigation("EntityChanges"); |
|||
}); |
|||
|
|||
modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => |
|||
{ |
|||
b.Navigation("PropertyChanges"); |
|||
}); |
|||
#pragma warning restore 612, 618
|
|||
} |
|||
} |
|||
} |
|||
@ -1,212 +0,0 @@ |
|||
using System; |
|||
using Microsoft.EntityFrameworkCore.Migrations; |
|||
|
|||
namespace MyCompanyName.MyProjectName.Migrations |
|||
{ |
|||
public partial class Initial : Migration |
|||
{ |
|||
protected override void Up(MigrationBuilder migrationBuilder) |
|||
{ |
|||
migrationBuilder.CreateTable( |
|||
name: "AbpAuditLogs", |
|||
columns: table => new |
|||
{ |
|||
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false), |
|||
ApplicationName = table.Column<string>(type: "nvarchar(96)", maxLength: 96, nullable: true), |
|||
UserId = table.Column<Guid>(type: "uniqueidentifier", nullable: true), |
|||
UserName = table.Column<string>(type: "nvarchar(256)", maxLength: 256, nullable: true), |
|||
TenantId = table.Column<Guid>(type: "uniqueidentifier", nullable: true), |
|||
TenantName = table.Column<string>(type: "nvarchar(max)", nullable: true), |
|||
ImpersonatorUserId = table.Column<Guid>(type: "uniqueidentifier", nullable: true), |
|||
ImpersonatorTenantId = table.Column<Guid>(type: "uniqueidentifier", nullable: true), |
|||
ExecutionTime = table.Column<DateTime>(type: "datetime2", nullable: false), |
|||
ExecutionDuration = table.Column<int>(type: "int", nullable: false), |
|||
ClientIpAddress = table.Column<string>(type: "nvarchar(64)", maxLength: 64, nullable: true), |
|||
ClientName = table.Column<string>(type: "nvarchar(128)", maxLength: 128, nullable: true), |
|||
ClientId = table.Column<string>(type: "nvarchar(64)", maxLength: 64, nullable: true), |
|||
CorrelationId = table.Column<string>(type: "nvarchar(64)", maxLength: 64, nullable: true), |
|||
BrowserInfo = table.Column<string>(type: "nvarchar(512)", maxLength: 512, nullable: true), |
|||
HttpMethod = table.Column<string>(type: "nvarchar(16)", maxLength: 16, nullable: true), |
|||
Url = table.Column<string>(type: "nvarchar(256)", maxLength: 256, nullable: true), |
|||
Exceptions = table.Column<string>(type: "nvarchar(4000)", maxLength: 4000, nullable: true), |
|||
Comments = table.Column<string>(type: "nvarchar(256)", maxLength: 256, nullable: true), |
|||
HttpStatusCode = table.Column<int>(type: "int", nullable: true), |
|||
ExtraProperties = table.Column<string>(type: "nvarchar(max)", nullable: true), |
|||
ConcurrencyStamp = table.Column<string>(type: "nvarchar(40)", maxLength: 40, nullable: true) |
|||
}, |
|||
constraints: table => |
|||
{ |
|||
table.PrimaryKey("PK_AbpAuditLogs", x => x.Id); |
|||
}); |
|||
|
|||
migrationBuilder.CreateTable( |
|||
name: "AbpPermissionGrants", |
|||
columns: table => new |
|||
{ |
|||
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false), |
|||
TenantId = table.Column<Guid>(type: "uniqueidentifier", nullable: true), |
|||
Name = table.Column<string>(type: "nvarchar(128)", maxLength: 128, nullable: false), |
|||
ProviderName = table.Column<string>(type: "nvarchar(64)", maxLength: 64, nullable: false), |
|||
ProviderKey = table.Column<string>(type: "nvarchar(64)", maxLength: 64, nullable: false) |
|||
}, |
|||
constraints: table => |
|||
{ |
|||
table.PrimaryKey("PK_AbpPermissionGrants", x => x.Id); |
|||
}); |
|||
|
|||
migrationBuilder.CreateTable( |
|||
name: "AbpSettings", |
|||
columns: table => new |
|||
{ |
|||
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false), |
|||
Name = table.Column<string>(type: "nvarchar(128)", maxLength: 128, nullable: false), |
|||
Value = table.Column<string>(type: "nvarchar(2048)", maxLength: 2048, nullable: false), |
|||
ProviderName = table.Column<string>(type: "nvarchar(64)", maxLength: 64, nullable: true), |
|||
ProviderKey = table.Column<string>(type: "nvarchar(64)", maxLength: 64, nullable: true) |
|||
}, |
|||
constraints: table => |
|||
{ |
|||
table.PrimaryKey("PK_AbpSettings", x => x.Id); |
|||
}); |
|||
|
|||
migrationBuilder.CreateTable( |
|||
name: "AbpAuditLogActions", |
|||
columns: table => new |
|||
{ |
|||
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false), |
|||
TenantId = table.Column<Guid>(type: "uniqueidentifier", nullable: true), |
|||
AuditLogId = table.Column<Guid>(type: "uniqueidentifier", nullable: false), |
|||
ServiceName = table.Column<string>(type: "nvarchar(256)", maxLength: 256, nullable: true), |
|||
MethodName = table.Column<string>(type: "nvarchar(128)", maxLength: 128, nullable: true), |
|||
Parameters = table.Column<string>(type: "nvarchar(2000)", maxLength: 2000, nullable: true), |
|||
ExecutionTime = table.Column<DateTime>(type: "datetime2", nullable: false), |
|||
ExecutionDuration = table.Column<int>(type: "int", nullable: false), |
|||
ExtraProperties = table.Column<string>(type: "nvarchar(max)", nullable: true) |
|||
}, |
|||
constraints: table => |
|||
{ |
|||
table.PrimaryKey("PK_AbpAuditLogActions", x => x.Id); |
|||
table.ForeignKey( |
|||
name: "FK_AbpAuditLogActions_AbpAuditLogs_AuditLogId", |
|||
column: x => x.AuditLogId, |
|||
principalTable: "AbpAuditLogs", |
|||
principalColumn: "Id", |
|||
onDelete: ReferentialAction.Cascade); |
|||
}); |
|||
|
|||
migrationBuilder.CreateTable( |
|||
name: "AbpEntityChanges", |
|||
columns: table => new |
|||
{ |
|||
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false), |
|||
AuditLogId = table.Column<Guid>(type: "uniqueidentifier", nullable: false), |
|||
TenantId = table.Column<Guid>(type: "uniqueidentifier", nullable: true), |
|||
ChangeTime = table.Column<DateTime>(type: "datetime2", nullable: false), |
|||
ChangeType = table.Column<byte>(type: "tinyint", nullable: false), |
|||
EntityTenantId = table.Column<Guid>(type: "uniqueidentifier", nullable: true), |
|||
EntityId = table.Column<string>(type: "nvarchar(128)", maxLength: 128, nullable: false), |
|||
EntityTypeFullName = table.Column<string>(type: "nvarchar(128)", maxLength: 128, nullable: false), |
|||
ExtraProperties = table.Column<string>(type: "nvarchar(max)", nullable: true) |
|||
}, |
|||
constraints: table => |
|||
{ |
|||
table.PrimaryKey("PK_AbpEntityChanges", x => x.Id); |
|||
table.ForeignKey( |
|||
name: "FK_AbpEntityChanges_AbpAuditLogs_AuditLogId", |
|||
column: x => x.AuditLogId, |
|||
principalTable: "AbpAuditLogs", |
|||
principalColumn: "Id", |
|||
onDelete: ReferentialAction.Cascade); |
|||
}); |
|||
|
|||
migrationBuilder.CreateTable( |
|||
name: "AbpEntityPropertyChanges", |
|||
columns: table => new |
|||
{ |
|||
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false), |
|||
TenantId = table.Column<Guid>(type: "uniqueidentifier", nullable: true), |
|||
EntityChangeId = table.Column<Guid>(type: "uniqueidentifier", nullable: false), |
|||
NewValue = table.Column<string>(type: "nvarchar(512)", maxLength: 512, nullable: true), |
|||
OriginalValue = table.Column<string>(type: "nvarchar(512)", maxLength: 512, nullable: true), |
|||
PropertyName = table.Column<string>(type: "nvarchar(128)", maxLength: 128, nullable: false), |
|||
PropertyTypeFullName = table.Column<string>(type: "nvarchar(64)", maxLength: 64, nullable: false) |
|||
}, |
|||
constraints: table => |
|||
{ |
|||
table.PrimaryKey("PK_AbpEntityPropertyChanges", x => x.Id); |
|||
table.ForeignKey( |
|||
name: "FK_AbpEntityPropertyChanges_AbpEntityChanges_EntityChangeId", |
|||
column: x => x.EntityChangeId, |
|||
principalTable: "AbpEntityChanges", |
|||
principalColumn: "Id", |
|||
onDelete: ReferentialAction.Cascade); |
|||
}); |
|||
|
|||
migrationBuilder.CreateIndex( |
|||
name: "IX_AbpAuditLogActions_AuditLogId", |
|||
table: "AbpAuditLogActions", |
|||
column: "AuditLogId"); |
|||
|
|||
migrationBuilder.CreateIndex( |
|||
name: "IX_AbpAuditLogActions_TenantId_ServiceName_MethodName_ExecutionTime", |
|||
table: "AbpAuditLogActions", |
|||
columns: new[] { "TenantId", "ServiceName", "MethodName", "ExecutionTime" }); |
|||
|
|||
migrationBuilder.CreateIndex( |
|||
name: "IX_AbpAuditLogs_TenantId_ExecutionTime", |
|||
table: "AbpAuditLogs", |
|||
columns: new[] { "TenantId", "ExecutionTime" }); |
|||
|
|||
migrationBuilder.CreateIndex( |
|||
name: "IX_AbpAuditLogs_TenantId_UserId_ExecutionTime", |
|||
table: "AbpAuditLogs", |
|||
columns: new[] { "TenantId", "UserId", "ExecutionTime" }); |
|||
|
|||
migrationBuilder.CreateIndex( |
|||
name: "IX_AbpEntityChanges_AuditLogId", |
|||
table: "AbpEntityChanges", |
|||
column: "AuditLogId"); |
|||
|
|||
migrationBuilder.CreateIndex( |
|||
name: "IX_AbpEntityChanges_TenantId_EntityTypeFullName_EntityId", |
|||
table: "AbpEntityChanges", |
|||
columns: new[] { "TenantId", "EntityTypeFullName", "EntityId" }); |
|||
|
|||
migrationBuilder.CreateIndex( |
|||
name: "IX_AbpEntityPropertyChanges_EntityChangeId", |
|||
table: "AbpEntityPropertyChanges", |
|||
column: "EntityChangeId"); |
|||
|
|||
migrationBuilder.CreateIndex( |
|||
name: "IX_AbpPermissionGrants_Name_ProviderName_ProviderKey", |
|||
table: "AbpPermissionGrants", |
|||
columns: new[] { "Name", "ProviderName", "ProviderKey" }); |
|||
|
|||
migrationBuilder.CreateIndex( |
|||
name: "IX_AbpSettings_Name_ProviderName_ProviderKey", |
|||
table: "AbpSettings", |
|||
columns: new[] { "Name", "ProviderName", "ProviderKey" }); |
|||
} |
|||
|
|||
protected override void Down(MigrationBuilder migrationBuilder) |
|||
{ |
|||
migrationBuilder.DropTable( |
|||
name: "AbpAuditLogActions"); |
|||
|
|||
migrationBuilder.DropTable( |
|||
name: "AbpEntityPropertyChanges"); |
|||
|
|||
migrationBuilder.DropTable( |
|||
name: "AbpPermissionGrants"); |
|||
|
|||
migrationBuilder.DropTable( |
|||
name: "AbpSettings"); |
|||
|
|||
migrationBuilder.DropTable( |
|||
name: "AbpEntityChanges"); |
|||
|
|||
migrationBuilder.DropTable( |
|||
name: "AbpAuditLogs"); |
|||
} |
|||
} |
|||
} |
|||
@ -1,380 +0,0 @@ |
|||
// <auto-generated />
|
|||
using System; |
|||
using Microsoft.EntityFrameworkCore; |
|||
using Microsoft.EntityFrameworkCore.Infrastructure; |
|||
using Microsoft.EntityFrameworkCore.Metadata; |
|||
using Microsoft.EntityFrameworkCore.Storage.ValueConversion; |
|||
using MyCompanyName.MyProjectName.EntityFrameworkCore; |
|||
using Volo.Abp.EntityFrameworkCore; |
|||
|
|||
namespace MyCompanyName.MyProjectName.Migrations |
|||
{ |
|||
[DbContext(typeof(MyProjectNameHttpApiHostMigrationsDbContext))] |
|||
partial class MyProjectNameHttpApiHostMigrationsDbContextModelSnapshot : ModelSnapshot |
|||
{ |
|||
protected override void BuildModel(ModelBuilder modelBuilder) |
|||
{ |
|||
#pragma warning disable 612, 618
|
|||
modelBuilder |
|||
.UseIdentityColumns() |
|||
.HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) |
|||
.HasAnnotation("Relational:MaxIdentifierLength", 128) |
|||
.HasAnnotation("ProductVersion", "5.0.0-rc.2.20475.6"); |
|||
|
|||
modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b => |
|||
{ |
|||
b.Property<Guid>("Id") |
|||
.ValueGeneratedOnAdd() |
|||
.HasColumnType("uniqueidentifier"); |
|||
|
|||
b.Property<string>("ApplicationName") |
|||
.HasMaxLength(96) |
|||
.HasColumnType("nvarchar(96)") |
|||
.HasColumnName("ApplicationName"); |
|||
|
|||
b.Property<string>("BrowserInfo") |
|||
.HasMaxLength(512) |
|||
.HasColumnType("nvarchar(512)") |
|||
.HasColumnName("BrowserInfo"); |
|||
|
|||
b.Property<string>("ClientId") |
|||
.HasMaxLength(64) |
|||
.HasColumnType("nvarchar(64)") |
|||
.HasColumnName("ClientId"); |
|||
|
|||
b.Property<string>("ClientIpAddress") |
|||
.HasMaxLength(64) |
|||
.HasColumnType("nvarchar(64)") |
|||
.HasColumnName("ClientIpAddress"); |
|||
|
|||
b.Property<string>("ClientName") |
|||
.HasMaxLength(128) |
|||
.HasColumnType("nvarchar(128)") |
|||
.HasColumnName("ClientName"); |
|||
|
|||
b.Property<string>("Comments") |
|||
.HasMaxLength(256) |
|||
.HasColumnType("nvarchar(256)") |
|||
.HasColumnName("Comments"); |
|||
|
|||
b.Property<string>("ConcurrencyStamp") |
|||
.IsConcurrencyToken() |
|||
.HasMaxLength(40) |
|||
.HasColumnType("nvarchar(40)") |
|||
.HasColumnName("ConcurrencyStamp"); |
|||
|
|||
b.Property<string>("CorrelationId") |
|||
.HasMaxLength(64) |
|||
.HasColumnType("nvarchar(64)") |
|||
.HasColumnName("CorrelationId"); |
|||
|
|||
b.Property<string>("Exceptions") |
|||
.HasMaxLength(4000) |
|||
.HasColumnType("nvarchar(4000)") |
|||
.HasColumnName("Exceptions"); |
|||
|
|||
b.Property<int>("ExecutionDuration") |
|||
.HasColumnType("int") |
|||
.HasColumnName("ExecutionDuration"); |
|||
|
|||
b.Property<DateTime>("ExecutionTime") |
|||
.HasColumnType("datetime2"); |
|||
|
|||
b.Property<string>("ExtraProperties") |
|||
.HasColumnType("nvarchar(max)") |
|||
.HasColumnName("ExtraProperties"); |
|||
|
|||
b.Property<string>("HttpMethod") |
|||
.HasMaxLength(16) |
|||
.HasColumnType("nvarchar(16)") |
|||
.HasColumnName("HttpMethod"); |
|||
|
|||
b.Property<int?>("HttpStatusCode") |
|||
.HasColumnType("int") |
|||
.HasColumnName("HttpStatusCode"); |
|||
|
|||
b.Property<Guid?>("ImpersonatorTenantId") |
|||
.HasColumnType("uniqueidentifier") |
|||
.HasColumnName("ImpersonatorTenantId"); |
|||
|
|||
b.Property<Guid?>("ImpersonatorUserId") |
|||
.HasColumnType("uniqueidentifier") |
|||
.HasColumnName("ImpersonatorUserId"); |
|||
|
|||
b.Property<Guid?>("TenantId") |
|||
.HasColumnType("uniqueidentifier") |
|||
.HasColumnName("TenantId"); |
|||
|
|||
b.Property<string>("TenantName") |
|||
.HasColumnType("nvarchar(max)"); |
|||
|
|||
b.Property<string>("Url") |
|||
.HasMaxLength(256) |
|||
.HasColumnType("nvarchar(256)") |
|||
.HasColumnName("Url"); |
|||
|
|||
b.Property<Guid?>("UserId") |
|||
.HasColumnType("uniqueidentifier") |
|||
.HasColumnName("UserId"); |
|||
|
|||
b.Property<string>("UserName") |
|||
.HasMaxLength(256) |
|||
.HasColumnType("nvarchar(256)") |
|||
.HasColumnName("UserName"); |
|||
|
|||
b.HasKey("Id"); |
|||
|
|||
b.HasIndex("TenantId", "ExecutionTime"); |
|||
|
|||
b.HasIndex("TenantId", "UserId", "ExecutionTime"); |
|||
|
|||
b.ToTable("AbpAuditLogs"); |
|||
}); |
|||
|
|||
modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLogAction", b => |
|||
{ |
|||
b.Property<Guid>("Id") |
|||
.ValueGeneratedOnAdd() |
|||
.HasColumnType("uniqueidentifier"); |
|||
|
|||
b.Property<Guid>("AuditLogId") |
|||
.HasColumnType("uniqueidentifier") |
|||
.HasColumnName("AuditLogId"); |
|||
|
|||
b.Property<int>("ExecutionDuration") |
|||
.HasColumnType("int") |
|||
.HasColumnName("ExecutionDuration"); |
|||
|
|||
b.Property<DateTime>("ExecutionTime") |
|||
.HasColumnType("datetime2") |
|||
.HasColumnName("ExecutionTime"); |
|||
|
|||
b.Property<string>("ExtraProperties") |
|||
.HasColumnType("nvarchar(max)") |
|||
.HasColumnName("ExtraProperties"); |
|||
|
|||
b.Property<string>("MethodName") |
|||
.HasMaxLength(128) |
|||
.HasColumnType("nvarchar(128)") |
|||
.HasColumnName("MethodName"); |
|||
|
|||
b.Property<string>("Parameters") |
|||
.HasMaxLength(2000) |
|||
.HasColumnType("nvarchar(2000)") |
|||
.HasColumnName("Parameters"); |
|||
|
|||
b.Property<string>("ServiceName") |
|||
.HasMaxLength(256) |
|||
.HasColumnType("nvarchar(256)") |
|||
.HasColumnName("ServiceName"); |
|||
|
|||
b.Property<Guid?>("TenantId") |
|||
.HasColumnType("uniqueidentifier") |
|||
.HasColumnName("TenantId"); |
|||
|
|||
b.HasKey("Id"); |
|||
|
|||
b.HasIndex("AuditLogId"); |
|||
|
|||
b.HasIndex("TenantId", "ServiceName", "MethodName", "ExecutionTime"); |
|||
|
|||
b.ToTable("AbpAuditLogActions"); |
|||
}); |
|||
|
|||
modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => |
|||
{ |
|||
b.Property<Guid>("Id") |
|||
.ValueGeneratedOnAdd() |
|||
.HasColumnType("uniqueidentifier"); |
|||
|
|||
b.Property<Guid>("AuditLogId") |
|||
.HasColumnType("uniqueidentifier") |
|||
.HasColumnName("AuditLogId"); |
|||
|
|||
b.Property<DateTime>("ChangeTime") |
|||
.HasColumnType("datetime2") |
|||
.HasColumnName("ChangeTime"); |
|||
|
|||
b.Property<byte>("ChangeType") |
|||
.HasColumnType("tinyint") |
|||
.HasColumnName("ChangeType"); |
|||
|
|||
b.Property<string>("EntityId") |
|||
.IsRequired() |
|||
.HasMaxLength(128) |
|||
.HasColumnType("nvarchar(128)") |
|||
.HasColumnName("EntityId"); |
|||
|
|||
b.Property<Guid?>("EntityTenantId") |
|||
.HasColumnType("uniqueidentifier"); |
|||
|
|||
b.Property<string>("EntityTypeFullName") |
|||
.IsRequired() |
|||
.HasMaxLength(128) |
|||
.HasColumnType("nvarchar(128)") |
|||
.HasColumnName("EntityTypeFullName"); |
|||
|
|||
b.Property<string>("ExtraProperties") |
|||
.HasColumnType("nvarchar(max)") |
|||
.HasColumnName("ExtraProperties"); |
|||
|
|||
b.Property<Guid?>("TenantId") |
|||
.HasColumnType("uniqueidentifier") |
|||
.HasColumnName("TenantId"); |
|||
|
|||
b.HasKey("Id"); |
|||
|
|||
b.HasIndex("AuditLogId"); |
|||
|
|||
b.HasIndex("TenantId", "EntityTypeFullName", "EntityId"); |
|||
|
|||
b.ToTable("AbpEntityChanges"); |
|||
}); |
|||
|
|||
modelBuilder.Entity("Volo.Abp.AuditLogging.EntityPropertyChange", b => |
|||
{ |
|||
b.Property<Guid>("Id") |
|||
.ValueGeneratedOnAdd() |
|||
.HasColumnType("uniqueidentifier"); |
|||
|
|||
b.Property<Guid>("EntityChangeId") |
|||
.HasColumnType("uniqueidentifier"); |
|||
|
|||
b.Property<string>("NewValue") |
|||
.HasMaxLength(512) |
|||
.HasColumnType("nvarchar(512)") |
|||
.HasColumnName("NewValue"); |
|||
|
|||
b.Property<string>("OriginalValue") |
|||
.HasMaxLength(512) |
|||
.HasColumnType("nvarchar(512)") |
|||
.HasColumnName("OriginalValue"); |
|||
|
|||
b.Property<string>("PropertyName") |
|||
.IsRequired() |
|||
.HasMaxLength(128) |
|||
.HasColumnType("nvarchar(128)") |
|||
.HasColumnName("PropertyName"); |
|||
|
|||
b.Property<string>("PropertyTypeFullName") |
|||
.IsRequired() |
|||
.HasMaxLength(64) |
|||
.HasColumnType("nvarchar(64)") |
|||
.HasColumnName("PropertyTypeFullName"); |
|||
|
|||
b.Property<Guid?>("TenantId") |
|||
.HasColumnType("uniqueidentifier") |
|||
.HasColumnName("TenantId"); |
|||
|
|||
b.HasKey("Id"); |
|||
|
|||
b.HasIndex("EntityChangeId"); |
|||
|
|||
b.ToTable("AbpEntityPropertyChanges"); |
|||
}); |
|||
|
|||
modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGrant", b => |
|||
{ |
|||
b.Property<Guid>("Id") |
|||
.ValueGeneratedOnAdd() |
|||
.HasColumnType("uniqueidentifier"); |
|||
|
|||
b.Property<string>("Name") |
|||
.IsRequired() |
|||
.HasMaxLength(128) |
|||
.HasColumnType("nvarchar(128)"); |
|||
|
|||
b.Property<string>("ProviderKey") |
|||
.IsRequired() |
|||
.HasMaxLength(64) |
|||
.HasColumnType("nvarchar(64)"); |
|||
|
|||
b.Property<string>("ProviderName") |
|||
.IsRequired() |
|||
.HasMaxLength(64) |
|||
.HasColumnType("nvarchar(64)"); |
|||
|
|||
b.Property<Guid?>("TenantId") |
|||
.HasColumnType("uniqueidentifier") |
|||
.HasColumnName("TenantId"); |
|||
|
|||
b.HasKey("Id"); |
|||
|
|||
b.HasIndex("Name", "ProviderName", "ProviderKey"); |
|||
|
|||
b.ToTable("AbpPermissionGrants"); |
|||
}); |
|||
|
|||
modelBuilder.Entity("Volo.Abp.SettingManagement.Setting", b => |
|||
{ |
|||
b.Property<Guid>("Id") |
|||
.ValueGeneratedOnAdd() |
|||
.HasColumnType("uniqueidentifier"); |
|||
|
|||
b.Property<string>("Name") |
|||
.IsRequired() |
|||
.HasMaxLength(128) |
|||
.HasColumnType("nvarchar(128)"); |
|||
|
|||
b.Property<string>("ProviderKey") |
|||
.HasMaxLength(64) |
|||
.HasColumnType("nvarchar(64)"); |
|||
|
|||
b.Property<string>("ProviderName") |
|||
.HasMaxLength(64) |
|||
.HasColumnType("nvarchar(64)"); |
|||
|
|||
b.Property<string>("Value") |
|||
.IsRequired() |
|||
.HasMaxLength(2048) |
|||
.HasColumnType("nvarchar(2048)"); |
|||
|
|||
b.HasKey("Id"); |
|||
|
|||
b.HasIndex("Name", "ProviderName", "ProviderKey"); |
|||
|
|||
b.ToTable("AbpSettings"); |
|||
}); |
|||
|
|||
modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLogAction", b => |
|||
{ |
|||
b.HasOne("Volo.Abp.AuditLogging.AuditLog", null) |
|||
.WithMany("Actions") |
|||
.HasForeignKey("AuditLogId") |
|||
.OnDelete(DeleteBehavior.Cascade) |
|||
.IsRequired(); |
|||
}); |
|||
|
|||
modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => |
|||
{ |
|||
b.HasOne("Volo.Abp.AuditLogging.AuditLog", null) |
|||
.WithMany("EntityChanges") |
|||
.HasForeignKey("AuditLogId") |
|||
.OnDelete(DeleteBehavior.Cascade) |
|||
.IsRequired(); |
|||
}); |
|||
|
|||
modelBuilder.Entity("Volo.Abp.AuditLogging.EntityPropertyChange", b => |
|||
{ |
|||
b.HasOne("Volo.Abp.AuditLogging.EntityChange", null) |
|||
.WithMany("PropertyChanges") |
|||
.HasForeignKey("EntityChangeId") |
|||
.OnDelete(DeleteBehavior.Cascade) |
|||
.IsRequired(); |
|||
}); |
|||
|
|||
modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b => |
|||
{ |
|||
b.Navigation("Actions"); |
|||
|
|||
b.Navigation("EntityChanges"); |
|||
}); |
|||
|
|||
modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => |
|||
{ |
|||
b.Navigation("PropertyChanges"); |
|||
}); |
|||
#pragma warning restore 612, 618
|
|||
} |
|||
} |
|||
} |
|||
Loading…
Reference in new issue