Merge branch 'dev' into maliming/update-packages

pull/6460/head
maliming 5 years ago
commit 47c1470ccf

@ -9,8 +9,8 @@ ABP Framework is a complete **infrastructure** based on the **ASP.NET Core** to
## Getting Started
- [Getting Started Guide](https://docs.abp.io/en/abp/4.0/Getting-Started) is the easiest way to start a new web application with the ABP Framework.
- [Web Application Development Tutorial](https://docs.abp.io/en/abp/4.0/Tutorials/Part-1) is a complete tutorial to develop a full stack web application.
- [Getting Started Guide](https://docs.abp.io/en/abp/latest/Getting-Started) is the easiest way to start a new web application with the ABP Framework.
- [Web Application Development Tutorial](https://docs.abp.io/en/abp/latest/Tutorials/Part-1) is a complete tutorial to develop a full stack web application.
### Quick Start
@ -44,32 +44,32 @@ ABP provides a **full stack developer experience**.
<img src="docs/en/images/ddd-microservice-simple.png">
ABP offers a complete, **modular** and **layered** software architecture based on **[Domain Driven Design](https://docs.abp.io/en/abp/latest/Domain-Driven-Design)** principles and patterns. It also provides the necessary infrastructure and guiding to [implement this architecture](https://docs.abp.io/en/abp/4.0/Domain-Driven-Design-Implementation-Guide).
ABP offers a complete, **modular** and **layered** software architecture based on **[Domain Driven Design](https://docs.abp.io/en/abp/latest/Domain-Driven-Design)** principles and patterns. It also provides the necessary infrastructure and guiding to [implement this architecture](https://docs.abp.io/en/abp/latest/Domain-Driven-Design-Implementation-Guide).
ABP Framework is suitable for **[microservice solutions](https://docs.abp.io/en/abp/latest/Microservice-Architecture)** as well as monolithic applications.
### Infrastructure
There are a lot of features provided by the ABP Framework to achieve real world scenarios easier, like [Event Bus](https://docs.abp.io/en/abp/4.0/Event-Bus), [Background Job System](https://docs.abp.io/en/abp/4.0/Background-Jobs), [Audit Logging](https://docs.abp.io/en/abp/4.0/Audit-Logging), [BLOB Storing](https://docs.abp.io/en/abp/4.0/Blob-Storing), [Data Seeding](https://docs.abp.io/en/abp/4.0/Data-Seeding), [Data Filtering](https://docs.abp.io/en/abp/4.0/Data-Filtering), etc.
There are a lot of features provided by the ABP Framework to achieve real world scenarios easier, like [Event Bus](https://docs.abp.io/en/abp/latest/Event-Bus), [Background Job System](https://docs.abp.io/en/abp/latest/Background-Jobs), [Audit Logging](https://docs.abp.io/en/abp/latest/Audit-Logging), [BLOB Storing](https://docs.abp.io/en/abp/latest/Blob-Storing), [Data Seeding](https://docs.abp.io/en/abp/latest/Data-Seeding), [Data Filtering](https://docs.abp.io/en/abp/latest/Data-Filtering), etc.
### Cross Cutting Concerns
ABP also simplifies (and even automates wherever possible) cross cutting concerns and common non-functional requirements like [Exception Handling](https://docs.abp.io/en/abp/4.0/Exception-Handling), [Validation](https://docs.abp.io/en/abp/4.0/Validation), [Authorization](https://docs.abp.io/en/abp/4.0/Authorization), [Localization](https://docs.abp.io/en/abp/4.0/Localization), [Caching](https://docs.abp.io/en/abp/4.0/Caching), [Dependency Injection](https://docs.abp.io/en/abp/4.0/Dependency-Injection), [Setting Management](https://docs.abp.io/en/abp/4.0/Settings), etc.
ABP also simplifies (and even automates wherever possible) cross cutting concerns and common non-functional requirements like [Exception Handling](https://docs.abp.io/en/abp/latest/Exception-Handling), [Validation](https://docs.abp.io/en/abp/latest/Validation), [Authorization](https://docs.abp.io/en/abp/latest/Authorization), [Localization](https://docs.abp.io/en/abp/latest/Localization), [Caching](https://docs.abp.io/en/abp/latest/Caching), [Dependency Injection](https://docs.abp.io/en/abp/latest/Dependency-Injection), [Setting Management](https://docs.abp.io/en/abp/latest/Settings), etc.
### Application Modules
ABP is a modular framework and the Application Modules provide **pre-built application functionalities**;
- [**Account**](https://docs.abp.io/en/abp/4.0/Modules/Account): Provides UI for the account management and allows user to login/register to the application.
- **[Identity](https://docs.abp.io/en/abp/4.0/Modules/Identity)**: Manages organization units, roles, users and their permissions, based on the Microsoft Identity library.
- [**IdentityServer**](https://docs.abp.io/en/abp/4.0/Modules/IdentityServer): Integrates to IdentityServer4.
- [**Tenant Management**](https://docs.abp.io/en/abp/4.0/Modules/Tenant-Management): Manages tenants for a [multi-tenant](https://docs.abp.io/en/abp/4.0/Multi-Tenancy) (SaaS) application.
- [**Account**](https://docs.abp.io/en/abp/latest/Modules/Account): Provides UI for the account management and allows user to login/register to the application.
- **[Identity](https://docs.abp.io/en/abp/latest/Modules/Identity)**: Manages organization units, roles, users and their permissions, based on the Microsoft Identity library.
- [**IdentityServer**](https://docs.abp.io/en/abp/latest/Modules/IdentityServer): Integrates to IdentityServer4.
- [**Tenant Management**](https://docs.abp.io/en/abp/latest/Modules/Tenant-Management): Manages tenants for a [multi-tenant](https://docs.abp.io/en/abp/latest/Multi-Tenancy) (SaaS) application.
See the [Application Modules](https://docs.abp.io/en/abp/4.0/Modules/Index) document for all pre-built modules.
See the [Application Modules](https://docs.abp.io/en/abp/latest/Modules/Index) document for all pre-built modules.
### Startup Templates
The [Startup templates](https://docs.abp.io/en/abp/4.0/Startup-Templates/Index) are pre-built Visual Studio solution templates. You can create your own solution based on these templates to **immediately start your development**.
The [Startup templates](https://docs.abp.io/en/abp/latest/Startup-Templates/Index) are pre-built Visual Studio solution templates. You can create your own solution based on these templates to **immediately start your development**.
## ABP Community
@ -83,11 +83,11 @@ Follow the [ABP Blog](https://blog.abp.io/) to learn the latest happenings in th
### Samples
See the [sample projects](https://docs.abp.io/en/abp/4.0/Samples/Index) built with the ABP Framework.
See the [sample projects](https://docs.abp.io/en/abp/latest/Samples/Index) built with the ABP Framework.
### Want to Contribute?
ABP is a community-driven open source project. See [the contribution guide](https://docs.abp.io/en/abp/4.0/Contribution/Index) if you want to be a part of this project.
ABP is a community-driven open source project. See [the contribution guide](https://docs.abp.io/en/abp/latest/Contribution/Index) if you want to be a part of this project.
## Official Links

@ -32,6 +32,7 @@
"MyProfile": "My profile",
"EmailNotValid": "Please enter a valid email address.",
"JoinOurMarketingNewsletter": "Join our marketing newsletter",
"WouldLikeToReceiveMarketingMaterials": "I would like to receive marketing materials like product deals & special offers."
"WouldLikeToReceiveMarketingMaterials": "I would like to receive marketing materials like product deals & special offers.",
"StartUsingYourLicenseNow": "Start using your license now!"
}
}

@ -184,6 +184,14 @@
"ABPCLIExamplesInfo": "<strong>new</strong> command creates a <strong>layered MVC application</strong> with <strong>Entity Framework Core</strong> as the database provider. However, it has additional options. Examples:",
"SeeCliDocumentForMoreInformation": "See the <a href=\"{0}\">ABP CLI document</a> for more options or select the \"Direct Download\" tab above.",
"Optional": "Optional",
"LocalFrameworkRef": "Keep local project reference for the framework packages."
"LocalFrameworkRef": "Keep local project reference for the framework packages.",
"BlobStoring": "BLOB Storing",
"BlobStoringExplanation": "BLOB Storing system provides an abstraction to work with BLOBs. ABP provides some pre-built storage provider integrations (Azure, AWS, File System, Database, etc.) that you can easily use in your applications.",
"TextTemplating": "Text Templating",
"TextTemplatingExplanation": "Text templating is used to dynamically render contents based on a template and a model (a data object). For example, you can use it to create dynamic email contents with a pre-built template.",
"MultipleUIOptions": "Multiple UI Options",
"MultipleDBOptions": "Multiple Database Providers",
"MultipleUIOptionsExplanation": "The core framework is designed as UI independent and can work with any type of UI system, while there are multiple pre-built and integrated options are provided out of the box.",
"MultipleDBOptionsExplanation": "The framework can work with any data source, while the following providers are officially developed and supported;"
}
}

@ -184,6 +184,13 @@
"ABPCLIExamplesInfo": "<strong>new</strong>命令创建一个 <strong>分层的MVC应用程序</strong> 使用 <strong>Entity Framework Core</strong> 做为数据库提供程序. 它还有其他选项. 示例:",
"SeeCliDocumentForMoreInformation": "参阅 <a href=\"{0}\">ABP CLI 文档</a> 获得更多选项或选择上方的 \"直接下载\" 标签.",
"Optional": "可选的",
"LocalFrameworkRef": "保留框架包的本地项目引用."
"LocalFrameworkRef": "保留框架包的本地项目引用.",
"BlobStoring": "BLOB存储",
"BlobStoringExplanation": "BLOB存储系统提供了BLOB的抽象. ABP提供了一些预构建的存储提供程序集成(Azure,AWS,文件系统,数据库等),你可以轻松的在你的应用程序中使用它们.",
"TextTemplating": "文本模板",
"TextTemplatingExplanation": "文本模板是基于模板和模型(数据对象)使用动态渲染内容. 例如你可以使用预构建的模板来创建动态的电子邮件内容.",
"MultipleUIOptions": "多个UI选项",
"MultipleDBOptions": "多个数据库提供程序",
"MultipleUIOptionsExplanation": "核心框架设计为独立与UI,可以和任何类型的UI系统一起使用. 同时提供了多个开箱即用的预构建集成选项."
}
}

@ -280,21 +280,11 @@ public async Task CreateAsync(CreateAuthorDto input)
## Check a Permission in JavaScript
You may need to check a policy/permission on the client side.
See the following documents to learn how to re-use the authorization system on the client side:
### MVC UI
For ASP.NET Core MVC / Razor Pages applications, you can use the `abp.auth` API.
**Example: Check if a given permission has been granted for the current user**
```js
abp.auth.isGranted('MyPermissionName');
```
### Angular UI
See the [permission management document](UI/Angular/Permission-Management.md) for the Angular UI.
* [ASP.NET Core MVC / Razor Pages UI: Authorization](UI/AspNetCore/JavaScript-API/Auth.md)
* [Angular UI Authorization](UI/Angular/Permission-Management.md)
* [Blazor UI Authorization](UI/Blazor/Authorization.md)
## Permission Management

@ -0,0 +1,87 @@
# ABP.IO Platform 4.0 with .NET 5.0 in the 4th Year!
Today, we are extremely happy to release ABP Framework 4.0 with **.NET 5.0 support**!
## 4 Years of Work
As a nice coincidence, today is the **4th year** since the first commit made in the [abp repository](https://github.com/abpframework/abp)! So, we can say "*Happy Birthday ABP Framework!*".
![abp-contribution-graph-4-years](abp-contribution-graph-4-years.png)
### Some Statistics
ABP.IO Platform and the ABP Community is growing. Here, a summary of these 4 years.
From GitHub, only from the main [abp repository](https://github.com/abpframework/abp);
* **15,297 commits** done.
* **3,764 issues** are closed.
* **2,133 pull requests** are merged.
* **158 contributors**.
* **88 releases** published.
* **5.2K stars** on GitHub.
From NuGet & NPM;
* **220 NuGet** packages & **52 NPM** packages.
* **1,000,000 downloads** only for the core NuGet package.
From Website;
* **200,000 visitors**.
* **1,000,000+ sessions**.
## What's New With 4.0?
Since all the new features are already explained in details with the [4.0 RC Announcement Post](https://blog.abp.io/abp/ABP.IO-Platform-v4.0-RC-Has-Been-Released-based-on-.NET-5.0), I will not repeat all the details again. Please read [the RC post](https://blog.abp.io/abp/ABP.IO-Platform-v4.0-RC-Has-Been-Released-based-on-.NET-5.0) for **new feature and changes** you may need to do for your solution while upgrading to the version 4.0.
Here, a brief list of major features and changes;
* Migrated to **.NET 5.0**.
* Stable **Blazor** UI.
* Moved to **System.Text.Json**.
* Upgraded to **IdentityServer** version 4.0.
* **WPF** startup template.
## Creating New Solutions
You can create a new solution with the ABP Framework version 4.0 by either using the `abp new` command or using the **direct download** tab on the [get started page](https://abp.io/get-started).
> See the [getting started document](https://docs.abp.io/en/abp/latest/Getting-Started) for details.
## How to Upgrade an Existing Solution
This is a **major version** and requires some **manual work**, especially related to **.NET 5.0** and **IdentityServer** 4.0 upgrades.
* See the [MIGRATION GUIDE](https://docs.abp.io/en/abp/latest/Migration-Guides/Abp-4_0) that covers all the details about the upgrade progress.
* You can also see the [upgrading document](https://docs.abp.io/en/abp/latest/Upgrading).
## New Guides / Documents
We are constantly improving the documentation. Our purpose is not only document the ABP Framework, but also write architectural and practical guides for developers.
### Implementing Domain Driven Design
[Implementing Domain Driven Design](https://docs.abp.io/en/abp/latest/Domain-Driven-Design-Implementation-Guide) is a practical guide for they want to implement the DDD principles in their solutions. While the implementation details rely on the ABP Framework infrastructure, core concepts, principles and patterns are applicable in any kind of solution, even if it is not a .NET solution.
![ddd-implementation-guide-sample](ddd-implementation-guide-sample.png)
### Testing
The new [Testing document](https://docs.abp.io/en/abp/latest/Testing) discusses different kind of automated tests and explains how you can write tests for your ABP based solutions.
### UI Documents
We've created a lot of documents for the [MVC](https://docs.abp.io/en/abp/latest/UI/AspNetCore/Overall), [Blazor](https://docs.abp.io/en/abp/latest/UI/Blazor/Overall) and the [Angular](https://docs.abp.io/en/abp/latest/UI/Angular/Quick-Start) UI.
## About the Next Version
The next versions 4.1 will mostly focus on;
* Improving current features.
* Complete module features for the Blazor UI.
* Improve developer experience and productivity.
* More documentation and examples.
Planned preview date for the version **4.1 is December 17, 2020**. See the [Road Map](https://docs.abp.io/en/abp/latest/Road-Map) document and [GitHub Milestones](https://github.com/abpframework/abp/milestones) to learn what's planned for the next versions. We are trying to be clear about the coming features and the next release dates.

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 149 KiB

@ -0,0 +1,936 @@
# Creating an Event Organizer Application with the ABP Framework & Blazor UI.
## Introduction
In this article, we will create an example application that is a simple **meeting/event organizer**: People create events and other people registers to the event.
The application has been developed with **Blazor** as the UI framework and **MongoDB** as the database provider.
> This tutorial is based on my notes that I'd created to implement this application in a workshop. It shows the necessary steps to build the application rather than detailed explanations.
### Source Code
Source code of the completed application is [available on GitHub](https://github.com/abpframework/abp-samples/tree/master/EventOrganizer).
### Screenshots
Here, the pages of the final application.
**Home Page - Event List**
![event-list-ui](images/event-list-ui.png)
**Creating a new Event**
![event-create-ui](images/event-create-ui.png)
**Event Detail Page**
![event-detail-ui](images/event-detail-ui.png)
## Requirements
The following tools are needed to be able to run the solution.
* .NET 5.0 SDK
* Visual Studio 2019 16.8.0+ or another compatible IDE
* MongoDB Server (with MongoDB Compass)
## Development
### Creating a new Application
* Use the following ABP CLI command:
````bash
abp new EventOrganizer -u blazor -d mongodb
````
### Open & Run the Application
* Open the solution in Visual Studio (or your favorite IDE).
* Run the `EventOrganizer.DbMigrator` application to seed the initial data.
* Run the `EventOrganizer.HttpApi.Host` application that starts the server side.
* Run the `EventOrganizer.Blazor` application to start the UI.
### Apply the Custom Styles
* Add styles to `wwwroot/main.css`:
````css
body.abp-application-layout {
background-color: #222 !important;
font-size: 18px;
}
nav#main-navbar.bg-dark {
background-color: #222 !important;
box-shadow: none !important;
}
.event-pic {
width: 100%;
border-radius: 12px;
box-shadow: 5px 5px 0px 0px rgba(0,0,0,.5);
margin-bottom: 10px;
}
.event-link:hover, .event-link:hover *{
text-decoration: none;
}
.event-link:hover .event-pic {
box-shadow: 5px 5px 0px 0px #ffd800;
}
.event-form {
background-color: #333 !important;
box-shadow: 5px 5px 0px 0px rgba(0,0,0,.5);
border-radius: 12px;
}
.table {
background: #fff;
border-radius: 12px;
box-shadow: 5px 5px 0px 0px rgba(0,0,0,.5);
}
.table th{
border: 0 !important;
}
.modal {
color: #333;
}
.page-item:first-child .page-link {
margin-left: 0;
border-top-left-radius: 12px;
border-bottom-left-radius: 12px;
}
.page-item:last-child .page-link {
border-top-right-radius: 12px;
border-bottom-right-radius: 12px;
}
.btn {
border-radius: 8px;
}
.att-list {
list-style: none;
padding: 0;
}
.att-list li {
padding: 4px 0 0 0;
}
````
* `wwwroot/index.html`: Remove `bg-light` class from the `body` tag and add `bg-dark text-light`.
### Domain Layer
* Add the following `Event` aggregate (with `EventAttendee`) to the solution:
**Event**
````csharp
using System;
using System.Collections.Generic;
using Volo.Abp.Domain.Entities.Auditing;
namespace EventOrganizer.Events
{
public class Event : FullAuditedAggregateRoot<Guid>
{
public string Title { get; set; }
public string Description { get; set; }
public bool IsFree { get; set; }
public DateTime StartTime { get; set; }
public ICollection<EventAttendee> Attendees { get; set; }
public Event()
{
Attendees = new List<EventAttendee>();
}
}
}
````
**EventAttendee**
```csharp
using System;
using Volo.Abp.Auditing;
namespace EventOrganizer.Events
{
public class EventAttendee : IHasCreationTime
{
public Guid UserId { get; set; }
public DateTime CreationTime { get; set; }
}
}
```
### MongoDB Mapping
* Add the following property to the `EventOrganizerMongoDbContext`:
````csharp
public IMongoCollection<Event> Events => Collection<Event>();
````
### Clean Index.razor & Add the Header & "Create Event" button
* Clean the `Index.razor` file.
* Replace the content with the following code:
````html
@page "/"
@inherits EventOrganizerComponentBase
<Row Class="mb-4">
<Column Class="text-left">
<h1>Upcoming Events</h1>
</Column>
<Column Class="text-right">
@if (CurrentUser.IsAuthenticated)
{
<a class="btn btn-primary" href="/create-event">
<i class="fa fa-plus"></i> @L["CreateEvent"]
</a>
}
</Column>
</Row>
````
* Open `Localization/EventOrganizer/en.json` in the `EventOrganizer.Domain.Shared` project and add the following entry:
````json
"CreateEvent": "Create a new event!"
````
The Result (run the `EventOrganizer.Blazor` application to see):
![index-title](images/index-title.png)
### Event Creation
* Create the Initial `IEventAppService` with the `CreateAsync` method:
````csharp
using System;
using System.Threading.Tasks;
using Volo.Abp.Application.Services;
namespace EventOrganizer.Events
{
public interface IEventAppService : IApplicationService
{
Task<Guid> CreateAsync(EventCreationDto input);
}
}
````
* Add `EventCreationDto` class:
````csharp
using System;
using System.ComponentModel.DataAnnotations;
namespace EventOrganizer.Events
{
public class EventCreationDto
{
[Required]
[StringLength(100)]
public string Title { get; set; }
[Required]
[StringLength(2000)]
public string Description { get; set; }
public bool IsFree { get; set; }
public DateTime StartTime { get; set; }
}
}
````
* Implement the `EventAppService`:
````csharp
using System;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Volo.Abp.Domain.Repositories;
namespace EventOrganizer.Events
{
public class EventAppService : EventOrganizerAppService, IEventAppService
{
private readonly IRepository<Event, Guid> _eventRepository;
public EventAppService(IRepository<Event, Guid> eventRepository)
{
_eventRepository = eventRepository;
}
[Authorize]
public async Task<Guid> CreateAsync(EventCreationDto input)
{
var eventEntity = ObjectMapper.Map<EventCreationDto, Event>(input);
await _eventRepository.InsertAsync(eventEntity);
return eventEntity.Id;
}
}
}
````
* Add AutoMapper mapping to the `EventOrganizerApplicationAutoMapperProfile` class:
````csharp
using AutoMapper;
using EventOrganizer.Events;
namespace EventOrganizer
{
public class EventOrganizerApplicationAutoMapperProfile : Profile
{
public EventOrganizerApplicationAutoMapperProfile()
{
CreateMap<EventCreationDto, Event>();
}
}
}
````
This will automatically create the HTTP (REST) API for the application service (run the `EventOrganizer.HttpApi.Host` application to see it on the Swagger UI):
![swagger-event-create](images/swagger-event-create.png)
* Create the `CreateEvent.razor` file:
````csharp
@page "/create-event"
@inherits EventOrganizerComponentBase
<Heading Size="HeadingSize.Is3" Margin="Margin.Is5.FromTop.Is4.FromBottom" Class="text-center">Create Event</Heading>
<Row>
<Column ColumnSize="ColumnSize.Is6.Is3.WithOffset">
<div class="p-lg-5 p-md-3 event-form">
<EditForm Model="@Event" OnValidSubmit="Create">
<Field>
<FieldLabel>@L["Title"]</FieldLabel>
<TextEdit @bind-Text="@Event.Title" />
</Field>
<Field>
<FieldLabel>@L["Description"]</FieldLabel>
<MemoEdit @bind-Text="@Event.Description" />
</Field>
<Field>
<Check TValue="bool" @bind-Checked="@Event.IsFree">@L["Free"]</Check>
</Field>
<Field>
<FieldLabel>@L["StartTime"]</FieldLabel>
<DateEdit TValue="DateTime" @bind-Date="@Event.StartTime" />
</Field>
<Button Type="@ButtonType.Submit" Block="true" Color="@Color.Primary" Size="Size.Large">@L["Save"]</Button>
</EditForm>
</div>
</Column>
</Row>
````
* Create a partial `CreateEvent` class in the same folder, with the `CreateEvent.razor.cs` as the file name:
````csharp
using System.Threading.Tasks;
using EventOrganizer.Events;
using Microsoft.AspNetCore.Components;
namespace EventOrganizer.Blazor.Pages
{
public partial class CreateEvent
{
private EventCreationDto Event { get; set; } = new EventCreationDto();
private readonly IEventAppService _eventAppService;
private readonly NavigationManager _navigationManager;
public CreateEvent(
IEventAppService eventAppService,
NavigationManager navigationManager)
{
_eventAppService = eventAppService;
_navigationManager = navigationManager;
}
private async Task Create()
{
var eventId = await _eventAppService.CreateAsync(Event);
_navigationManager.NavigateTo("/events/" + eventId);
}
}
}
````
The final UI is (run the `EventOrganizer.Blazor` application and click to the "Create Event" button):
![event-create-ui](images/event-create-ui.png)
### Upcoming Events (Home Page)
* Open the `IEventAppService` and add a `GetUpcomingAsync` method to get the list of upcoming events:
````csharp
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Volo.Abp.Application.Services;
namespace EventOrganizer.Events
{
public interface IEventAppService : IApplicationService
{
Task<Guid> CreateAsync(EventCreationDto input);
Task<List<EventDto>> GetUpcomingAsync();
}
}
````
* Add a `EventDto` class:
````csharp
using System;
using Volo.Abp.Application.Dtos;
namespace EventOrganizer.Events
{
public class EventDto : EntityDto<Guid>
{
public string Title { get; set; }
public string Description { get; set; }
public bool IsFree { get; set; }
public DateTime StartTime { get; set; }
public int AttendeesCount { get; set; }
}
}
````
* Implement the `GetUpcomingAsync` in the `EventAppService` class:
````csharp
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Volo.Abp.Domain.Repositories;
namespace EventOrganizer.Events
{
public class EventAppService : EventOrganizerAppService, IEventAppService
{
private readonly IRepository<Event, Guid> _eventRepository;
public EventAppService(IRepository<Event, Guid> eventRepository)
{
_eventRepository = eventRepository;
}
[Authorize]
public async Task<Guid> CreateAsync(EventCreationDto input)
{
var eventEntity = ObjectMapper.Map<EventCreationDto, Event>(input);
await _eventRepository.InsertAsync(eventEntity);
return eventEntity.Id;
}
public async Task<List<EventDto>> GetUpcomingAsync()
{
var events = await AsyncExecuter.ToListAsync(
_eventRepository
.Where(x => x.StartTime > Clock.Now)
.OrderBy(x => x.StartTime)
);
return ObjectMapper.Map<List<Event>, List<EventDto>>(events);
}
}
}
````
* Add the following line into the `EventOrganizerApplicationAutoMapperProfile` constructor:
````csharp
CreateMap<Event, EventDto>();
````
Run the `EventOrganizer.HttpApi.Host` application to see the new `upcoming` endpoint on the Swagger UI:
![swagger-event-upcoming](images/swagger-event-upcoming.png)
* Change the `Pages/Index.razor.cs` content in the `EventOrganizer.Blazor` project as shown below:
```csharp
using System.Collections.Generic;
using System.Threading.Tasks;
using EventOrganizer.Events;
namespace EventOrganizer.Blazor.Pages
{
public partial class Index
{
private List<EventDto> UpcomingEvents { get; set; } = new List<EventDto>();
private readonly IEventAppService _eventAppService;
public Index(IEventAppService eventAppService)
{
_eventAppService = eventAppService;
}
protected override async Task OnInitializedAsync()
{
UpcomingEvents = await _eventAppService.GetUpcomingAsync();
}
}
}
```
* Change the `Pages/Index.razor` content in the `EventOrganizer.Blazor` project as shown below:
````html
@page "/"
@inherits EventOrganizerComponentBase
<Row Class="mb-4">
<Column Class="text-left">
<h1>Upcoming Events</h1>
</Column>
<Column Class="text-right">
@if (CurrentUser.IsAuthenticated)
{
<a class="btn btn-primary" href="/create-event">
<i class="fa fa-plus"></i> @L["CreateEvent"]
</a>
}
</Column>
</Row>
<Row>
@foreach (var upcomingEvent in UpcomingEvents)
{
<Column Class="col-12 col-lg-4 col-md-6">
<a class="mb-5 position-relative d-block event-link" href="/events/@upcomingEvent.Id">
<div class="position-absolute text-right w-100 px-3 py-2" style="left: 0; top: 2px;">
@if (upcomingEvent.IsFree)
{
<Badge Color="Color.Success" Class="mr-1">FREE</Badge>
}
<span class="badge badge-warning font-weight-normal">
<i class="fas fa-user-friends"></i>
<span class="font-weight-bold">@upcomingEvent.AttendeesCount</span>
</span>
</div>
<img src="https://picsum.photos/seed/@upcomingEvent.Id/400/300" class="event-pic"/>
<div class="px-3 py-1">
<small class="font-weight-bold text-warning my-2 d-block text-uppercase">@upcomingEvent.StartTime.ToLongDateString()</small>
<p class="h4 text-light d-block mb-2">@upcomingEvent.Title</p>
<p class="text-light" style="opacity: .65;">@upcomingEvent.Description.TruncateWithPostfix(150)</p>
</div>
</a>
</Column>
}
</Row>
````
The new home page is shown below:
![event-list-ui](images/event-list-ui.png)
### Event Detail Page
* Add `GetAsync`, `RegisterAsync`, `UnregisterAsync` and `DeleteAsync` methods to the `IEventAppService`:
````csharp
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Volo.Abp.Application.Services;
namespace EventOrganizer.Events
{
public interface IEventAppService : IApplicationService
{
Task<Guid> CreateAsync(EventCreationDto input);
Task<List<EventDto>> GetUpcomingAsync();
Task<EventDetailDto> GetAsync(Guid id);
Task RegisterAsync(Guid id);
Task UnregisterAsync(Guid id);
Task DeleteAsync(Guid id);
}
}
````
* Add `EventDetailDto` class:
````csharp
using System;
using System.Collections.Generic;
using Volo.Abp.Application.Dtos;
namespace EventOrganizer.Events
{
public class EventDetailDto : CreationAuditedEntityDto<Guid>
{
public string Title { get; set; }
public string Description { get; set; }
public bool IsFree { get; set; }
public DateTime StartTime { get; set; }
public List<EventAttendeeDto> Attendees { get; set; }
}
}
````
* Add `EventAttendeeDto` class:
````csharp
using System;
namespace EventOrganizer.Events
{
public class EventAttendeeDto
{
public Guid UserId { get; set; }
public string UserName { get; set; }
public DateTime CreationTime { get; set; }
}
}
````
* Implement the new methods in the `EventAppService`:
````csharp
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using EventOrganizer.Users;
using Microsoft.AspNetCore.Authorization;
using Volo.Abp;
using Volo.Abp.Domain.Repositories;
using Volo.Abp.Users;
namespace EventOrganizer.Events
{
public class EventAppService : EventOrganizerAppService, IEventAppService
{
private readonly IRepository<Event, Guid> _eventRepository;
private readonly IRepository<AppUser, Guid> _userRepository;
public EventAppService(IRepository<Event, Guid> eventRepository, IRepository<AppUser, Guid> userRepository)
{
_eventRepository = eventRepository;
_userRepository = userRepository;
}
[Authorize]
public async Task<Guid> CreateAsync(EventCreationDto input)
{
var eventEntity = ObjectMapper.Map<EventCreationDto, Event>(input);
await _eventRepository.InsertAsync(eventEntity);
return eventEntity.Id;
}
public async Task<List<EventDto>> GetUpcomingAsync()
{
var events = await AsyncExecuter.ToListAsync(
_eventRepository
.Where(x => x.StartTime > Clock.Now)
.OrderBy(x => x.StartTime)
);
return ObjectMapper.Map<List<Event>, List<EventDto>>(events);
}
public async Task<EventDetailDto> GetAsync(Guid id)
{
var @event = await _eventRepository.GetAsync(id);
var attendeeIds = @event.Attendees.Select(a => a.UserId).ToList();
var attendees = (await AsyncExecuter.ToListAsync(_userRepository.Where(u => attendeeIds.Contains(u.Id))))
.ToDictionary(x => x.Id);
var result = ObjectMapper.Map<Event, EventDetailDto>(@event);
foreach (var attendeeDto in result.Attendees)
{
attendeeDto.UserName = attendees[attendeeDto.UserId].UserName;
}
return result;
}
[Authorize]
public async Task RegisterAsync(Guid id)
{
var @event = await _eventRepository.GetAsync(id);
if (@event.Attendees.Any(a => a.UserId == CurrentUser.Id))
{
return;
}
@event.Attendees.Add(new EventAttendee {UserId = CurrentUser.GetId(), CreationTime = Clock.Now});
await _eventRepository.UpdateAsync(@event);
}
[Authorize]
public async Task UnregisterAsync(Guid id)
{
var @event = await _eventRepository.GetAsync(id);
var removedItems = @event.Attendees.RemoveAll(x => x.UserId == CurrentUser.Id);
if (removedItems.Any())
{
await _eventRepository.UpdateAsync(@event);
}
}
[Authorize]
public async Task DeleteAsync(Guid id)
{
var @event = await _eventRepository.GetAsync(id);
if (CurrentUser.Id != @event.CreatorId)
{
throw new UserFriendlyException("You don't have the necessary permission to delete this event!");
}
await _eventRepository.DeleteAsync(id);
}
}
}
````
* Add the following mappings into the `EventOrganizerApplicationAutoMapperProfile`:
````csharp
CreateMap<Event, EventDetailDto>();
CreateMap<EventAttendee, EventAttendeeDto>();
````
Run the `EventOrganizer.HttpApi.Host` application to see the complete Event HTTP API in the Swagger UI:
![swagger-event-all](images/swagger-event-all.png)
* Create `EventDetail.razor` component with the following content:
````html
@page "/events/{id}"
@inherits EventOrganizerComponentBase
@if (Event != null)
{
<Row Class="mb-4">
<Column Class="text-left">
<h1>@Event.Title</h1>
</Column>
<Column Class="text-right pt-2">
<a href="/" Class="btn btn-dark"><i class="fa fa-arrow-left"></i> Back</a>
@if (CurrentUser.IsAuthenticated && CurrentUser.Id == Event.CreatorId)
{
<Button Color="Color.Danger" Clicked="Delete" Class="ml-1">Delete</Button>
}
</Column>
</Row>
<Row>
<Column Class="col-12 col-md-8">
<div class="position-relative">
<div class="position-absolute text-right w-100 px-3 py-2" style="left: 0; top: 2px;">
@if (Event.IsFree)
{
<Badge Color="Color.Success" Class="mr-1">FREE</Badge>
}
<span class="badge badge-warning font-weight-normal">
<i class="fas fa-user-friends"></i>
<span class="font-weight-bold">@Event.Attendees.Count</span>
</span>
</div>
<img src="https://picsum.photos/seed/@Event.Id/800/600" class="event-pic" />
<small class="font-weight-bold text-warning my-2 d-block text-uppercase">Start time: @Event.StartTime.ToLongDateString()</small>
<p style="opacity: .65;">@Event.Description</p>
</div>
</Column>
<Column Class="col-12 col-md-4">
<div class="p-4 event-form">
@if (CurrentUser.IsAuthenticated)
{
<div>
@if (!IsRegistered)
{
<Button Color="Color.Primary" Clicked="Register" Class="btn-block btn-lg">Register now!</Button>
}
else
{
<p>You are registered in this event</p>
<Button Color="Color.Secondary" Clicked="UnRegister" Class="btn-block">Cancel registration!</Button>
}
</div>
}
else
{
<a class="btn btn-primary" href="/authentication/login">
<i class="fa fa-sign-in-alt"></i> Login to attend!
</a>
}
</div>
<div class="mt-4 event-form p-4">
<span class="font-weight-bold"><i class="fas fa-user-friends"></i> Attendees <span class="float-right font-weight-normal" style="opacity:.65;">(@Event.Attendees.Count)</span></span>
<ul class="mt-1 mb-0 att-list">
@foreach (var attendee in Event.Attendees)
{
<li><i class="fa fa-check"></i> @attendee.UserName</li>
}
</ul>
</div>
</Column>
</Row>
}
````
* Create `EventDetail.razor.cs` file with the following content:
````csharp
using System;
using System.Linq;
using System.Threading.Tasks;
using EventOrganizer.Events;
using Microsoft.AspNetCore.Components;
namespace EventOrganizer.Blazor.Pages
{
public partial class EventDetail
{
[Parameter]
public string Id { get; set; }
private EventDetailDto Event { get; set; }
private bool IsRegistered { get; set; }
private readonly IEventAppService _eventAppService;
private readonly NavigationManager _navigationManager;
public EventDetail(
IEventAppService eventAppService,
NavigationManager navigationManager)
{
_eventAppService = eventAppService;
_navigationManager = navigationManager;
}
protected override async Task OnInitializedAsync()
{
await GetEventAsync();
}
private async Task GetEventAsync()
{
Event = await _eventAppService.GetAsync(Guid.Parse(Id));
if (CurrentUser.IsAuthenticated)
{
IsRegistered = Event.Attendees.Any(a => a.UserId == CurrentUser.Id);
}
}
private async Task Register()
{
await _eventAppService.RegisterAsync(Guid.Parse(Id));
await GetEventAsync();
}
private async Task UnRegister()
{
await _eventAppService.UnregisterAsync(Guid.Parse(Id));
await GetEventAsync();
}
private async Task Delete()
{
if (!await Message.Confirm("This event will be deleted: " + Event.Title))
{
return;
}
await _eventAppService.DeleteAsync(Guid.Parse(Id));
_navigationManager.NavigateTo("/");
}
}
}
````
The resulting page is shown below:
![event-detail-ui](images/event-detail-ui.png)
### Integration Tests
Create an `EventAppService_Tests` class in the `EventOrganizer.Application.Tests` project:
````csharp
using System;
using System.Threading.Tasks;
using Shouldly;
using Xunit;
namespace EventOrganizer.Events
{
[Collection(EventOrganizerTestConsts.CollectionDefinitionName)]
public class EventAppService_Tests : EventOrganizerApplicationTestBase
{
private readonly IEventAppService _eventAppService;
public EventAppService_Tests()
{
_eventAppService = GetRequiredService<IEventAppService>();
}
[Fact]
public async Task Should_Create_A_Valid_Event()
{
// Create an event
var eventId = await _eventAppService.CreateAsync(
new EventCreationDto
{
Title = "My test event 1",
Description = "My test event description 1",
IsFree = true,
StartTime = DateTime.Now.AddDays(2)
}
);
eventId.ShouldNotBe(Guid.Empty);
// Get the event
var @event = await _eventAppService.GetAsync(eventId);
@event.Title.ShouldBe("My test event 1");
// Get upcoming events
var events = await _eventAppService.GetUpcomingAsync();
events.ShouldContain(x => x.Title == "My test event 1");
}
}
}
````
## Source Code
Source code of the completed application is [available on GitHub](https://github.com/abpframework/abp-samples/tree/master/EventOrganizer).

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 865 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

@ -1,11 +1,11 @@
# Exception Handling
ABP provides a built-in infrastructure and offers a standard model for handling exceptions in a web application.
ABP provides a built-in infrastructure and offers a standard model for handling exceptions.
* Automatically **handles all exceptions** and sends a standard **formatted error message** to the client for an API/AJAX request.
* Automatically hides **internal infrastructure errors** and returns a standard error message.
* Provides a configurable way to **localize** exception messages.
* Automatically maps standard exceptions to **HTTP status codes** and provides a configurable option to map these to custom exceptions.
* Provides an easy and configurable way to **localize** exception messages.
* Automatically maps standard exceptions to **HTTP status codes** and provides a configurable option to map custom exceptions.
## Automatic Exception Handling

@ -0,0 +1,65 @@
# Getting Started
````json
//[doc-params]
{
"UI": ["MVC", "Blazor", "NG"],
"DB": ["EF", "Mongo"],
"Tiered": ["Yes", "No"]
}
````
> This document assumes that you prefer to use **{{ UI_Value }}** as the UI framework and **{{ DB_Value }}** as the database provider. For other options, please change the preference on top of this document.
## Create a New Project
Use the `new` command of the ABP CLI to create a new project:
````shell
abp new Acme.BookStore{{if UI == "NG"}} -u angular{{else if UI == "Blazor"}} -u blazor{{end}}{{if DB == "Mongo"}} -d mongodb{{end}}{{if Tiered == "Yes"}}{{if UI == "MVC"}} --tiered{{else}} --separate-identity-server{{end}}{{end}}
````
*You can use different level of namespaces; e.g. BookStore, Acme.BookStore or Acme.Retail.BookStore.*
{{ if Tiered == "Yes" }}
{{ if UI == "MVC" }}
* `--tiered` argument is used to create N-tiered solution where authentication server, UI and API layers are physically separated.
{{ else }}
* `--separate-identity-server` argument is used to separate the identity server application from the API host application. If not specified, you will have a single endpoint on the server.
{{ end }}
{{ end }}
> [ABP CLI document](./CLI.md) covers all of the available commands and options.
> Alternatively, you can **create and download** projects from [ABP Framework website](https://abp.io/get-started) by easily selecting the all the options from the page.
### The Solution Structure
The solution has a layered structure (based on the [Domain Driven Design](Domain-Driven-Design.md)) and contains unit & integration test projects. See the [application template document](Startup-Templates/Application.md) to understand the solution structure in details.
{{ if DB == "Mongo" }}
#### MongoDB Transactions
The [startup template](Startup-templates/Index.md) **disables** transactions in the `.MongoDB` project by default. If your MongoDB server supports transactions, you can enable the it in the *YourProjectMongoDbModule* class's `ConfigureServices` method:
```csharp
Configure<AbpUnitOfWorkDefaultOptions>(options =>
{
options.TransactionBehavior = UnitOfWorkTransactionBehavior.Auto;
});
```
> Or you can delete that code since `Auto` is already the default behavior.
{{ end }}
## Next Step
* [Running the solution](Getting-Started-Running-Solution.md)

@ -0,0 +1,217 @@
# Getting Started
````json
//[doc-params]
{
"UI": ["MVC", "Blazor", "NG"],
"DB": ["EF", "Mongo"],
"Tiered": ["Yes", "No"]
}
````
> This document assumes that you prefer to use **{{ UI_Value }}** as the UI framework and **{{ DB_Value }}** as the database provider. For other options, please change the preference on top of this document.
## Create the Database
### Connection String
Check the **connection string** in the `appsettings.json` file under the {{if Tiered == "Yes"}}`.IdentityServer` and `.HttpApi.Host` projects{{else}}{{if UI=="MVC"}}`.Web` project{{else}}`.HttpApi.Host` project{{end}}{{end}}
{{ if DB == "EF" }}
````json
"ConnectionStrings": {
"Default": "Server=localhost;Database=BookStore;Trusted_Connection=True"
}
````
The solution is configured to use **Entity Framework Core** with **MS SQL Server** by default. EF Core supports [various](https://docs.microsoft.com/en-us/ef/core/providers/) database providers, so you can use any supported DBMS. See [the Entity Framework integration document](Entity-Framework-Core.md) to learn how to [switch to another DBMS](Entity-Framework-Core-Other-DBMS.md).
### Apply the Migrations
The solution uses the [Entity Framework Core Code First Migrations](https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations/?tabs=dotnet-core-cli). So, you need to apply migrations to create the database. There are two ways of applying the database migrations.
#### Apply Migrations Using the DbMigrator
The solution comes with a `.DbMigrator` console application which applies migrations and also **seeds the initial data**. It is useful on **development** as well as on **production** environment.
> `.DbMigrator` project has its own `appsettings.json`. So, if you have changed the connection string above, you should also change this one.
Right click to the `.DbMigrator` project and select **Set as StartUp Project**
![set-as-startup-project](images/set-as-startup-project.png)
Hit F5 (or Ctrl+F5) to run the application. It will have an output like shown below:
![db-migrator-output](images/db-migrator-output.png)
> Initial [seed data](Data-Seeding.md) creates the `admin` user in the database (with the password is `1q2w3E*`) which is then used to login to the application. So, you need to use `.DbMigrator` at least once for a new database.
#### Using EF Core Update-Database Command
Ef Core has `Update-Database` command which creates database if necessary and applies pending migrations.
{{ if UI == "MVC" }}
Right click to the {{if Tiered == "Yes"}}`.IdentityServer`{{else}}`.Web`{{end}} project and select **Set as StartUp project**:
{{ else if UI != "MVC" }}
Right click to the `.HttpApi.Host` project and select **Set as StartUp Project**:
{{ end }}
![set-as-startup-project](images/set-as-startup-project.png)
Open the **Package Manager Console**, select `.EntityFrameworkCore.DbMigrations` project as the **Default Project** and run the `Update-Database` command:
![package-manager-console-update-database](images/package-manager-console-update-database.png)
This will create a new database based on the configured connection string.
> **Using the `.DbMigrator` tool is the suggested way**, because it also seeds the initial data to be able to properly run the web application.
>
> If you just use the `Update-Database` command, you will have an empty database, so you can not login to the application since there is no initial admin user in the database. You can use the `Update-Database` command in development time when you don't need to seed the database. However, using the `.DbMigrator` application is easier and you can always use it to migrate the schema and seed the database.
{{ else if DB == "Mongo" }}
````json
"ConnectionStrings": {
"Default": "mongodb://localhost:27017/BookStore"
}
````
The solution is configured to use **MongoDB** in your local computer, so you need to have a MongoDB server instance up and running or change the connection string to another MongoDB server.
### Seed Initial Data
The solution comes with a `.DbMigrator` console application which **seeds the initial data**. It is useful on **development** as well as on **production** environment.
> `.DbMigrator` project has its own `appsettings.json`. So, if you have changed the connection string above, you should also change this one.
Right click to the `.DbMigrator` project and select **Set as StartUp Project**
![set-as-startup-project](images/set-as-startup-project.png)
Hit F5 (or Ctrl+F5) to run the application. It will have an output like shown below:
![db-migrator-output](images/db-migrator-output.png)
> Initial [seed data](Data-Seeding.md) creates the `admin` user in the database (with the password is `1q2w3E*`) which is then used to login to the application. So, you need to use `.DbMigrator` at least once for a new database.
{{ end }}
## Run the Application
{{ if UI == "MVC" }}
{{ if Tiered == "Yes" }}
> Tiered solutions use **Redis** as the distributed cache. Ensure that it is installed and running in your local computer. If you are using a remote Redis Server, set the configuration in the `appsettings.json` files of the projects below.
1. Ensure that the `.IdentityServer` project is the startup project. Run this application that will open a **login** page in your browser.
> Use Ctrl+F5 in Visual Studio (instead of F5) to run the application without debugging. If you don't have a debug purpose, this will be faster.
You can login, but you cannot enter to the main application here. This is **just the authentication server**.
2. Ensure that the `.HttpApi.Host` project is the startup project and run the application which will open a **Swagger UI** in your browser.
![swagger-ui](images/swagger-ui.png)
This is the HTTP API that is used by the web application.
3. Lastly, ensure that the `.Web` project is the startup project and run the application which will open a **welcome** page in your browser
![mvc-tiered-app-home](images/bookstore-home.png)
Click to the **login** button which will redirect you to the *authentication server* to login to the application:
![bookstore-login](images/bookstore-login.png)
{{ else # Tiered != "Yes" }}
Ensure that the `.Web` project is the startup project. Run the application which will open the **login** page in your browser:
> Use Ctrl+F5 in Visual Studio (instead of F5) to run the application without debugging. If you don't have a debug purpose, this will be faster.
![bookstore-login](images/bookstore-login.png)
{{ end # Tiered }}
{{ else # UI != "MVC" }}
### Running the HTTP API Host (Server Side)
{{ if Tiered == "Yes" }}
> Tiered solutions use Redis as the distributed cache. Ensure that it is installed and running in your local computer. If you are using a remote Redis Server, set the configuration in the `appsettings.json` files of the projects below.
Ensure that the `.IdentityServer` project is the startup project. Run the application which will open a **login** page in your browser.
> Use Ctrl+F5 in Visual Studio (instead of F5) to run the application without debugging. If you don't have a debug purpose, this will be faster.
You can login, but you cannot enter to the main application here. This is just the authentication server.
Ensure that the `.HttpApi.Host` project is the startup project and run the application which will open a Swagger UI:
{{ else # Tiered == "No" }}
Ensure that the `.HttpApi.Host` project is the startup project and run the application which will open a Swagger UI:
> Use Ctrl+F5 in Visual Studio (instead of F5) to run the application without debugging. If you don't have a debug purpose, this will be faster.
{{ end # Tiered }}
![swagger-ui](images/swagger-ui.png)
You can see the application APIs and test them here. Get [more info](https://swagger.io/tools/swagger-ui/) about the Swagger UI.
{{ end # UI }}
{{ if UI == "Blazor" }}
### Running the Blazor Application (Client Side)
Ensure that the `.Blazor` project is the startup project and run the application.
> Use Ctrl+F5 in Visual Studio (instead of F5) to run the application without debugging. If you don't have a debug purpose, this will be faster.
Once the application starts, click to the **Login** link on to header, which redirects you to the authentication server to enter a username and password:
![bookstore-login](images/bookstore-login.png)
{{ else if UI == "NG" }}
### Running the Angular Application (Client Side)
Go to the `angular` folder, open a command line terminal, type the `yarn` command (we suggest to the [yarn](https://yarnpkg.com/) package manager while `npm install` will also work)
```bash
yarn
```
Once all node modules are loaded, execute `yarn start` (or `npm start`) command:
```bash
yarn start
```
It may take a longer time for the first build. Once it finishes, it opens the Angular UI in your default browser with the [localhost:4200](http://localhost:4200/) address.
![bookstore-login](images/bookstore-login.png)
{{ end }}
Enter **admin** as the username and **1q2w3E*** as the password to login to the application. The application is up and running. You can start developing your application based on this startup template.
## Mobile Development
If you want to include a [React Native](https://reactnative.dev/) project in your solution, add `-m react-native` (or `--mobile react-native`) argument to project creation command. This is a basic React Native startup template to develop mobile applications integrated to your ABP based backends.
See the [Getting Started with the React Native](Getting-Started-React-Native.md) document to learn how to configure and run the React Native application.
## See Also
* [Web Application Development Tutorial](Tutorials/Part-1.md)
* [Application Startup Template](Startup-Templates/Application.md)

@ -0,0 +1,56 @@
# Getting Started
````json
//[doc-params]
{
"UI": ["MVC", "Blazor", "NG"],
"DB": ["EF", "Mongo"],
"Tiered": ["Yes", "No"]
}
````
> This document assumes that you prefer to use **{{ UI_Value }}** as the UI framework and **{{ DB_Value }}** as the database provider. For other options, please change the preference on top of this document.
## Setup Your Development Environment
First things first! Let's setup your development environment before creating the project.
### Pre-Requirements
The following tools should be installed on your development machine:
* [Visual Studio 2019](https://visualstudio.microsoft.com/vs/) (v16.8+) for Windows / [Visual Studio for Mac](https://visualstudio.microsoft.com/vs/mac/). <sup id="a-editor">[1](#f-editor)</sup>
* [.NET Core 5.0+](https://www.microsoft.com/net/download/dotnet-core/)
{{ if UI != "Blazor" }}
* [Node v12 or v14](https://nodejs.org/)
* [Yarn v1.20+ (not v2)](https://classic.yarnpkg.com/en/docs/install) <sup id="a-yarn">[2](#f-yarn)</sup> or npm v6+ (already installed with Node)
{{ end }}
{{ if Tiered == "Yes" }}
* [Redis](https://redis.io/) (the startup solution uses the Redis as the [distributed cache](Caching.md)).
{{ end }}
<sup id="f-editor"><b>1</b></sup> _You can use another editor instead of Visual Studio as long as it supports .NET Core and ASP.NET Core._ <sup>[↩](#a-editor)</sup>
{{ if UI != "Blazor" }}
<sup id="f-yarn"><b>2</b></sup> _Yarn v2 works differently and is not supported._ <sup>[↩](#a-yarn)</sup>
{{ end }}
### Install the ABP CLI
[ABP CLI](./CLI.md) is a command line interface that is used to automate some common tasks for ABP based solutions. First, you need to install the ABP CLI using the following command:
````shell
dotnet tool install -g Volo.Abp.Cli
````
If you've already installed, you can update it using the following command:
````shell
dotnet tool update -g Volo.Abp.Cli
````
## Next Step
* [Creating a new solution](Getting-Started-Create-Solution.md)

@ -9,310 +9,12 @@
}
````
This tutorial explains how to create a new web application using the [application startup template](Startup-Templates/Application.md).
> This document assumes that you prefer to use **{{ UI_Value }}** as the UI framework and **{{ DB_Value }}** as the database provider. For other options, please change the preference on top of this document.
## Contents
## Setup Your Development Environment
First things first! Let's setup your development environment before creating the first project.
### Pre-Requirements
The following tools should be installed on your development machine:
* [Visual Studio 2019](https://visualstudio.microsoft.com/vs/) (v16.8+) for Windows / [Visual Studio for Mac](https://visualstudio.microsoft.com/vs/mac/). <sup id="a-editor">[1](#f-editor)</sup>
* [.NET Core 5.0+](https://www.microsoft.com/net/download/dotnet-core/)
{{ if UI != "Blazor" }}
* [Node v12 or v14](https://nodejs.org/)
* [Yarn v1.20+ (not v2)](https://classic.yarnpkg.com/en/docs/install) <sup id="a-yarn">[2](#f-yarn)</sup> or npm v6+ (already installed with Node)
{{ end }}
{{ if Tiered == "Yes" }}
* [Redis](https://redis.io/) (the startup solution uses the Redis as the [distributed cache](Caching.md)).
{{ end }}
<sup id="f-editor"><b>1</b></sup> _You can use another editor instead of Visual Studio as long as it supports .NET Core and ASP.NET Core._ <sup>[↩](#a-editor)</sup>
{{ if UI != "Blazor" }}
<sup id="f-yarn"><b>2</b></sup> _Yarn v2 works differently and is not supported._ <sup>[↩](#a-yarn)</sup>
{{ end }}
### Install the ABP CLI
[ABP CLI](./CLI.md) is a command line interface that is used to automate some common tasks for ABP based solutions.
> ABP CLI is a free & open source tool for the ABP framework.
First, you need to install the ABP CLI using the following command:
````shell
dotnet tool install -g Volo.Abp.Cli
````
If you've already installed, you can update it using the following command:
````shell
dotnet tool update -g Volo.Abp.Cli
````
## Create a New Project
Use the `new` command of the ABP CLI to create a new project:
````shell
abp new Acme.BookStore{{if UI == "NG"}} -u angular{{else if UI == "Blazor"}} -u blazor{{end}}{{if DB == "Mongo"}} -d mongodb{{end}}{{if Tiered == "Yes"}}{{if UI == "MVC"}} --tiered{{else}} --separate-identity-server{{end}}{{end}}
````
> You can use different level of namespaces; e.g. BookStore, Acme.BookStore or Acme.Retail.BookStore.
> Alternatively, you can select the "Direct Download" tab from the [ABP Framework web site](https://abp.io/get-started) to create a new solution.
{{ if Tiered == "Yes" }}
{{ if UI == "MVC" }}
* `--tiered` argument is used to create N-tiered solution where authentication server, UI and API layers are physically separated.
{{ else }}
* `--separate-identity-server` argument is used to separate the identity server application from the API host application. If not specified, you will have a single endpoint on the server.
{{ end }}
{{ end }}
### ABP CLI Commands & Options
[ABP CLI document](./CLI.md) covers all of the available commands and options for the ABP CLI. This document uses the [application startup template](Startup-Templates/Application.md) to create a new web application. See the [ABP Startup Templates](Startup-Templates/Index.md) document for other templates.
### The Solution Structure
The solution has a layered structure (based on the [Domain Driven Design](Domain-Driven-Design.md)) and contains unit & integration test projects. See the [application template document](Startup-Templates/Application.md) to understand the solution structure in details.
{{ if DB == "Mongo" }}
#### MongoDB Transactions
The [startup template](Startup-templates/Index.md) **disables** transactions in the `.MongoDB` project by default. If your MongoDB server supports transactions, you can enable the it in the *YourProjectMongoDbModule* class:
```csharp
Configure<AbpUnitOfWorkDefaultOptions>(options =>
{
options.TransactionBehavior = UnitOfWorkTransactionBehavior.Auto;
});
```
> Or you can delete this code since this is already the default behavior.
{{ end }}
## Create the Database
### Connection String
Check the **connection string** in the `appsettings.json` file under the {{if Tiered == "Yes"}}`.IdentityServer` and `.HttpApi.Host` projects{{else}}{{if UI=="MVC"}}`.Web` project{{else}}`.HttpApi.Host` project{{end}}{{end}}
{{ if DB == "EF" }}
````json
"ConnectionStrings": {
"Default": "Server=localhost;Database=BookStore;Trusted_Connection=True"
}
````
The solution is configured to use **Entity Framework Core** with **MS SQL Server** by default. EF Core supports [various](https://docs.microsoft.com/en-us/ef/core/providers/) database providers, so you can use any supported DBMS. See [the Entity Framework integration document](Entity-Framework-Core.md) to learn how to [switch to another DBMS](Entity-Framework-Core-Other-DBMS.md).
### Apply the Migrations
The solution uses the [Entity Framework Core Code First Migrations](https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations/?tabs=dotnet-core-cli). So, you need to apply migrations to create the database. There are two ways of applying the database migrations.
#### Apply Migrations Using the DbMigrator
The solution comes with a `.DbMigrator` console application which applies migrations and also **seeds the initial data**. It is useful on **development** as well as on **production** environment.
> `.DbMigrator` project has its own `appsettings.json`. So, if you have changed the connection string above, you should also change this one.
Right click to the `.DbMigrator` project and select **Set as StartUp Project**
![set-as-startup-project](images/set-as-startup-project.png)
Hit F5 (or Ctrl+F5) to run the application. It will have an output like shown below:
![db-migrator-output](images/db-migrator-output.png)
> Initial [seed data](Data-Seeding.md) creates the `admin` user in the database (with the password is `1q2w3E*`) which is then used to login to the application. So, you need to use `.DbMigrator` at least once for a new database.
#### Using EF Core Update-Database Command
Ef Core has `Update-Database` command which creates database if necessary and applies pending migrations.
{{ if UI == "MVC" }}
Right click to the {{if Tiered == "Yes"}}`.IdentityServer`{{else}}`.Web`{{end}} project and select **Set as StartUp project**:
{{ else if UI != "MVC" }}
Right click to the `.HttpApi.Host` project and select **Set as StartUp Project**:
{{ end }}
![set-as-startup-project](images/set-as-startup-project.png)
Open the **Package Manager Console**, select `.EntityFrameworkCore.DbMigrations` project as the **Default Project** and run the `Update-Database` command:
![package-manager-console-update-database](images/package-manager-console-update-database.png)
This will create a new database based on the configured connection string.
> **Using the `.DbMigrator` tool is the suggested way**, because it also seeds the initial data to be able to properly run the web application.
>
> If you just use the `Update-Database` command, you will have an empty database, so you can not login to the application since there is no initial admin user in the database. You can use the `Update-Database` command in development time when you don't need to seed the database. However, using the `.DbMigrator` application is easier and you can always use it to migrate the schema and seed the database.
{{ else if DB == "Mongo" }}
````json
"ConnectionStrings": {
"Default": "mongodb://localhost:27017/BookStore"
}
````
The solution is configured to use **MongoDB** in your local computer, so you need to have a MongoDB server instance up and running or change the connection string to another MongoDB server.
### Seed Initial Data
The solution comes with a `.DbMigrator` console application which **seeds the initial data**. It is useful on **development** as well as on **production** environment.
> `.DbMigrator` project has its own `appsettings.json`. So, if you have changed the connection string above, you should also change this one.
Right click to the `.DbMigrator` project and select **Set as StartUp Project**
![set-as-startup-project](images/set-as-startup-project.png)
Hit F5 (or Ctrl+F5) to run the application. It will have an output like shown below:
![db-migrator-output](images/db-migrator-output.png)
> Initial [seed data](Data-Seeding.md) creates the `admin` user in the database (with the password is `1q2w3E*`) which is then used to login to the application. So, you need to use `.DbMigrator` at least once for a new database.
{{ end }}
## Run the Application
{{ if UI == "MVC" }}
{{ if Tiered == "Yes" }}
> Tiered solutions use Redis as the distributed cache. Ensure that it is installed and running in your local computer. If you are using a remote Redis Server, set the configuration in the `appsettings.json` files of the projects below.
1. Ensure that the `.IdentityServer` project is the startup project. Run this application that will open a **login** page in your browser.
> Use Ctrl+F5 in Visual Studio (instead of F5) to run the application without debugging. If you don't have a debug purpose, this will be faster.
You can login, but you cannot enter to the main application here. This is **just the authentication server**.
2. Ensure that the `.HttpApi.Host` project is the startup project and run the application which will open a **Swagger UI** in your browser.
![swagger-ui](images/swagger-ui.png)
This is the HTTP API that is used by the web application.
3. Lastly, ensure that the `.Web` project is the startup project and run the application which will open a **welcome** page in your browser
![mvc-tiered-app-home](images/bookstore-home.png)
Click to the **login** button which will redirect you to the *authentication server* to login to the application:
![bookstore-login](images/bookstore-login.png)
{{ else # Tiered != "Yes" }}
Ensure that the `.Web` project is the startup project. Run the application which will open the **login** page in your browser:
> Use Ctrl+F5 in Visual Studio (instead of F5) to run the application without debugging. If you don't have a debug purpose, this will be faster.
![bookstore-login](images/bookstore-login.png)
{{ end # Tiered }}
{{ else # UI != "MVC" }}
### Running the HTTP API Host (Server Side)
{{ if Tiered == "Yes" }}
> Tiered solutions use Redis as the distributed cache. Ensure that it is installed and running in your local computer. If you are using a remote Redis Server, set the configuration in the `appsettings.json` files of the projects below.
Ensure that the `.IdentityServer` project is the startup project. Run the application which will open a **login** page in your browser.
> Use Ctrl+F5 in Visual Studio (instead of F5) to run the application without debugging. If you don't have a debug purpose, this will be faster.
You can login, but you cannot enter to the main application here. This is just the authentication server.
Ensure that the `.HttpApi.Host` project is the startup project and run the application which will open a Swagger UI:
{{ else # Tiered == "No" }}
Ensure that the `.HttpApi.Host` project is the startup project and run the application which will open a Swagger UI:
> Use Ctrl+F5 in Visual Studio (instead of F5) to run the application without debugging. If you don't have a debug purpose, this will be faster.
{{ end # Tiered }}
![swagger-ui](images/swagger-ui.png)
You can see the application APIs and test them here. Get [more info](https://swagger.io/tools/swagger-ui/) about the Swagger UI.
> ##### Authorization for the Swagger UI
>
> Most of the HTTP APIs require authentication & authorization. If you want to test authorized APIs, manually go to the `/Account/Login` page, enter `admin` as the username and `1q2w3E*` as the password to login to the application. Then you will be able to execute authorized APIs too.
{{ end # UI }}
{{ if UI == "Blazor" }}
### Running the Blazor Application (Client Side)
Ensure that the `.Blazor` project is the startup project and run the application.
> Use Ctrl+F5 in Visual Studio (instead of F5) to run the application without debugging. If you don't have a debug purpose, this will be faster.
Once the application starts, click to the **Login** link on to header, which redirects you to the authentication server to enter a username and password:
![bookstore-login](images/bookstore-login.png)
{{ else if UI == "NG" }}
### Running the Angular Application (Client Side)
Go to the `angular` folder, open a command line terminal, type the `yarn` command (we suggest to the [yarn](https://yarnpkg.com/) package manager while `npm install` will also work)
```bash
yarn
```
Once all node modules are loaded, execute `yarn start` (or `npm start`) command:
```bash
yarn start
```
It may take a longer time for the first build. Once it finishes, it opens the Angular UI in your default browser with the [localhost:4200](http://localhost:4200/) address.
![bookstore-login](images/bookstore-login.png)
{{ end }}
Enter **admin** as the username and **1q2w3E*** as the password to login to the application. The application is up and running. You can start developing your application based on this startup template.
## Mobile Development
If you want to include a [React Native](https://reactnative.dev/) project in your solution, add `-m react-native` (or `--mobile react-native`) argument to project creation command. This is a basic React Native startup template to develop mobile applications integrated to your ABP based backends.
See the [Getting Started with the React Native](Getting-Started-React-Native.md) document to learn how to configure and run the React Native application.
## Next
This tutorial explains how to **create and run** a new web application using the ABP Framework. Follow the steps below;
* [Web Application Development Tutorial](Tutorials/Part-1.md)
1. [Setup your development environment](Getting-Started-Setup-Environment)
2. [Creating a new solution](Getting-Started-Create-Solution.md)
3. [Running the solution](Getting-Started-Running-Solution.md)

@ -0,0 +1,5 @@
# ABP Framework Migration Guides
* [3.3.x to 4.0 Migration Guide](Abp-4_0.md)
* [2.9.x to 3.0 Migration Guide](../UI/Angular/Migration-Guide-v3.md)

@ -0,0 +1,3 @@
# Swagger UI Integration
TODO

@ -1,3 +1,11 @@
# Blazor UI: Authentication
TODO
The [application startup template](../../Startup-Templates/Application.md) is properly configured to use OpenId Connect to authenticate the user through the server side login form;
* When the Blazor application needs to authenticate, it is redirected to the server side.
* Users can enter username & password to login if they already have an account. If not, they can use the register form to create a new user. They can also use forgot password and other features. The server side uses IdentityServer4 to handle the authentication.
* Finally, they are redirected back to the Blazor application to complete the login process.
This is a typical and recommended approach to implement authentication in Single-Page Applications. The client side configuration is done in the startup template, so you can change it.
See the [Blazor Security document](https://docs.microsoft.com/en-us/aspnet/core/blazor/security) to understand and customize the authentication process.

@ -0,0 +1,75 @@
# Blazor UI: Authorization
Blazor applications can use the same authorization system and permissions defined in the server side.
> This document is only for authorizing on the Blazor UI. See the [Server Side Authorization](../../Authorization.md) to learn how to define permissions and control the authorization system.
## Basic Usage
> ABP Framework is **100% compatible** with the Authorization infrastructure provided by the Blazor. See the [Blazor Security Document](https://docs.microsoft.com/en-us/aspnet/core/blazor/security/) to learn all authorization options. This section **only shows some common scenarios**.
### Authorize Attribute
`[Authorize]` attribute can be used to show a page only to the authenticated users.
````csharp
@page "/"
@attribute [Authorize]
You can only see this if you're signed in.
````
The `[Authorize]` attribute also supports role-based or policy-based authorization. For example, you can check permissions defined in the server side:
````csharp
@page "/"
@attribute [Authorize("MyPermission")]
You can only see this if you have the necessary permission.
````
### AuthorizeView
`AuthorizeView` component can be used in a page/component to conditionally render a part of the content:
````html
<AuthorizeView Policy="MyPermission">
<p>You can only see this if you satisfy the "MyPermission" policy.</p>
</AuthorizeView>
````
### IAuthorizationService
`IAuthorizationService` can be injected and used to programmatically check permissions:
````csharp
public partial class Index
{
protected override async Task OnInitializedAsync()
{
if (await AuthorizationService.IsGrantedAsync("MyPermission"))
{
//...
}
}
}
````
If your component directly or indirectly inherits from the `AbpComponentBase`, `AuthorizationService` becomes pre-injected and ready to use. If not, you can always [inject](../../Dependency-Injection.md) the `IAuthorizationService` yourself.
`IAuthorizationService` can also be used in the view side where `AuthorizeView` component is not enough.
There are some useful extension methods for the `IAuthorizationService`:
* `IsGrantedAsync` simply returns `true` or `false` for the given policy/permission.
* `CheckAsync` checks and throws `AbpAuthorizationException` if given policy/permission hasn't granted. You don't have to handle these kind of exceptions since ABP Framework automatically [handles errors](Error-Handling.md).
* `AuthorizeAsync` returns `AuthorizationResult` as the standard way provided by the ASP.NET Core authorization system.
> See the [Blazor Security Document](https://docs.microsoft.com/en-us/aspnet/core/blazor/security/) to learn all authorization options
## See Also
* [Authorization](../../Authorization.md) (server side)
* [Blazor Security](https://docs.microsoft.com/en-us/aspnet/core/blazor/security/) (Microsoft documentation)
* [ICurrentUser Service](CurrentUser.md)

@ -0,0 +1,23 @@
# Blazor UI: Current Tenant
`ICurrentTenant` service can be used to get information about the current tenant in a [multi-tenant](../../Multi-Tenancy.md) application. `ICurrentTenant` defines the following properties;
* `Id` (`Guid`): Id of the current tenant. Can be `null` if the current user is a host user or the tenant could not be determined.
* `Name` (`string`): Name of the current tenant. Can be `null` if the current user is a host user or the tenant could not be determined.
* `IsAvailable` (`bool`): Returns `true` if the `Id` is not `null`.
**Example: Show the current tenant name on a page**
````csharp
@page "/"
@using Volo.Abp.MultiTenancy
@inject ICurrentTenant CurrentTenant
@if (CurrentTenant.IsAvailable)
{
<p>Current tenant name: @CurrentTenant.Name</p>
}
````
## See Also
* [Multi-Tenancy](../../Multi-Tenancy.md)

@ -0,0 +1,22 @@
# Blazor UI: Current User
`ICurrentUser` service is used to obtain information about the currently authenticated user. Inject the `ICurrentUser` into any component/page and use its properties and methods.
**Example: Show username & email on a page**
````csharp
@page "/"
@using Volo.Abp.Users
@inject ICurrentUser CurrentUser
@if (CurrentUser.IsAuthenticated)
{
<p>Welcome @CurrentUser.UserName</p>
}
````
> If you (directly or indirectly) derived your component from the `AbpComponentBase`, you can directly use the base `CurrentUser` property.
`ICurrentUser` provides `Id`, `Name`, `SurName`, `Email`, `Roles` and some other properties.
> See the [Server Side Current User](../../CurrentUser) service for more information.

@ -0,0 +1,62 @@
# Blazor UI: Error Handling
Blazor, by default, shows a yellow line at the bottom of the page if any unhandled exception occurs. However, this is not useful in a real application.
ABP provides an automatic error handling system for the Blazor UI.
* Handles all unhandled exceptions and shows nice and useful messages to the user.
* It distinguishes different kind of exceptions. Hides internal/technical error details from the user (shows a generic error message in these cases).
* It is well integrated to the [server side exception handling](../../Exception-Handling.md) system.
## Basic Usage
There are different type of `Exception` classes handled differently by the ABP Framework.
### UserFriendlyException
`UserFriendlyException` is a special type of exception. You can directly show a error message dialog to the user by throwing such an exception.
**Example**
````csharp
@page "/"
@using Volo.Abp
<Button Clicked="TestException">Throw test exception</Button>
@code
{
private void TestException()
{
throw new UserFriendlyException("A user friendly error message!");
}
}
````
ABP automatically handle the exception and show an error message to the user:
![blazor-user-friendly-exception](../../images/blazor-user-friendly-exception.png)
> You can derive from `UserFriendlyException` or directly implement `IUserFriendlyException` interface to create your own `Exception` class if you need.
> You can use the [localization system](Localization.md) to show localized error messages.
### BusinessException and Other Exception Types
See the [exception handling document](../../Exception-Handling.md) to understand different kind of Exception class and interfaces and other capabilities of the Exception Handling system.
## Generic Errors
If the thrown `Exception` is not a special type, it is considered as generic error and a generic error message is shown to the user:
![blazor-generic-exception-message](../../images/blazor-generic-exception-message.png)
> All error details (including stack trace) are still written in the browser's console.
## Server Side Errors
Errors (like Validation, Authorization and User Friendly Errors) sent by the server are processed as you expect and properly shown to the user. So, error handling system works end to end without need to manually handle exceptions or manually transfer server-to-client error messages.
## See Also
* [Exception Handling System](../../Exception-Handling.md)

@ -150,6 +150,12 @@ ABP makes this possible by auto registering components to and resolving the comp
Resolving a component from the Dependency Injection system makes it possible to easily replace components of a depended module.
## Error Handling
Blazor, by default, shows a yellow line at the bottom of the page if any unhandled exception occurs. However, this is not useful in a real application.
ABP provides an [automatic error handling system](Error-Handling.md) for the Blazor UI.
## Customization
While the theme and some modules come as NuGet packages, you can still replace/override and customize them on need. See the [Customization / Overriding Components](Customization-Overriding-Components.md) document.

@ -0,0 +1,3 @@
# Blazor UI: Page Header
TODO

@ -0,0 +1,24 @@
# Blazor UI: Routing
Blazor has its own [routing system](https://docs.microsoft.com/en-us/aspnet/core/blazor/fundamentals/routing) and you can use it in your applications. ABP doesn't add any new feature to it, except one small improvement for the [modular development](../../Module-Development-Basics.md).
## AbpRouterOptions
Blazor `Router` component requires to define `AdditionalAssemblies` when you have components in assemblies/projects other than the main application's entrance assembly. So, if you want to create razor class libraries as ABP modules, you typically want to add the module's assembly to the `AdditionalAssemblies`. In this case, you need to add your module's assembly to the `AbpRouterOptions`.
**Example**
````csharp
Configure<AbpRouterOptions>(options =>
{
options.AdditionalAssemblies.Add(typeof(MyBlazorModule).Assembly);
});
````
Write this code in the `ConfigureServices` method of your [module](../../Module-Development-Basics.md).
`AbpRouterOptions` has another property, `AppAssembly`, which should be the entrance assembly of the application and typically set in the final application's module. If you've created your solution with the [application startup template](../../Startup-Templates/Application.md), it is already configured for you.
## See Also
* [Blazor Routing](https://docs.microsoft.com/en-us/aspnet/core/blazor/fundamentals/routing) (Microsoft Documentation)

@ -27,11 +27,15 @@ When you upgrade to a new version, it is good to check if there is a database sc
If `Add-Migration` generates an empty migration, you can use `Remove-Migration` to delete it before executing the `.DbMigrator`.
## The Blog Posts
## The Blog Posts & Guides
Sometimes we introduce new features/changes that requires to make changes in the startup template. We already implement the changes in the startup template for new applications. However, in some cases you need to manually make some minor changes in your solution.
Whenever you upgrade your solution, it is strongly suggested to check the [ABP BLOG](https://blog.abp.io/?_ga=2.177248992.411298747.1597771169-1910388957.1594128976) to learn the new features and changes coming with the new version. We regularly publish posts and write these kind of changes. If the changes are not trivial, we also provide migration guides.
Whenever you upgrade your solution, it is strongly suggested to check the [ABP BLOG](https://blog.abp.io/) to learn the new features and changes coming with the new version. We regularly publish posts and write these kind of changes.
### Migration Guides
We prepare migration guides if the new version brings breaking changes for existing applications. See the [Migration Guides](Migration-Guides/Index.md) page for all the guides.
## Semantic Versioning & Breaking Changes

@ -634,39 +634,76 @@
"text": "Localization",
"path": "UI/Blazor/Localization.md"
},
{
"text": "Settings",
"path": "UI/Blazor/Settings.md"
},
{
"text": "Notification",
"path": "UI/Blazor/Notification.md"
},
{
"text": "Message",
"path": "UI/Blazor/Message.md"
},
{
"text": "Theming",
"path": "UI/Blazor/Theming.md",
"items": [
{
"text": "Overall",
"path": "UI/Blazor/Theming.md"
},
{
"text": "The Basic Theme",
"path": "UI/Blazor/Basic-Theme.md"
},
{
"text": "Branding",
"path": "UI/Blazor/Branding.md"
},
{
"text": "Page Header",
"path": "UI/Blazor/Page-Header.md"
},
{
"text": "Toolbars",
"path": "UI/Blazor/Toolbars.md"
}
]
},
{
"text": "Toolbars",
"path": "UI/Blazor/Toolbars.md"
"text": "Security",
"items": [
{
"text": "Authentication",
"path": "UI/Blazor/Authentication.md"
},
{
"text": "Authorization",
"path": "UI/Blazor/Authorization.md"
}
]
},
{
"text": "Page Alerts",
"path": "UI/Blazor/Page-Alerts.md"
"text": "Services",
"items": [
{
"text": "Current User",
"path": "UI/Blazor/CurrentUser.md"
},
{
"text": "Current Tenant",
"path": "UI/Blazor/CurrentTenant.md"
},
{
"text": "Notification",
"path": "UI/Blazor/Notification.md"
},
{
"text": "Message",
"path": "UI/Blazor/Message.md"
},
{
"text": "Page Alerts",
"path": "UI/Blazor/Page-Alerts.md"
}
]
},
{
"text": "Branding",
"path": "UI/Blazor/Branding.md"
"text": "Settings",
"path": "UI/Blazor/Settings.md"
},
{
"text": "Error Handling",
"path": "UI/Blazor/Error-Handling.md"
},
{
"text": "Customization / Overriding Components",
@ -677,18 +714,14 @@
"path": "UI/Blazor/Global-Scripts-Styles.md"
},
{
"text": "Authentication",
"path": "UI/Blazor/Authentication.md"
"text": "Routing",
"path": "UI/Blazor/Routing.md"
}
]
},
{
"text": "Angular",
"items": [
{
"text": "Migration Guide v2.x to v3",
"path": "UI/Angular/Migration-Guide-v3.md"
},
{
"text": "Quick Start",
"path": "UI/Angular/Quick-Start.md"
@ -998,6 +1031,10 @@
{
"text": "Road Map",
"path": "Road-Map.md"
},
{
"text": "Migration Guides",
"path": "Migration-Guides/Index.md"
}
]
},

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

@ -1,3 +1,3 @@
@using Volo.Abp.Ui.Branding
@inject IBrandingProvider BrandingProvider
<a class="navbar-brand" href="/">@BrandingProvider.AppName</a>
<a class="navbar-brand" href="">@BrandingProvider.AppName</a>

@ -23,7 +23,8 @@ namespace Volo.Abp.AspNetCore.Mvc.ModelBinding
return null;
}
if (!context.Metadata.ContainerType.IsAssignableTo<IHasExtraProperties>())
if (context.Metadata.ContainerType == null ||
!context.Metadata.ContainerType.IsAssignableTo<IHasExtraProperties>())
{
return null;
}

@ -95,7 +95,8 @@ namespace Microsoft.AspNetCore.Authorization
{
if (!await authorizationService.IsGrantedAsync(policyName))
{
throw new AbpAuthorizationException("Authorization failed! Given policy has not granted: " + policyName);
throw new AbpAuthorizationException(code: AbpAuthorizationErrorCodes.GivenPolicyHasNotGrantedWithPolicyName)
.WithData("PolicyName", policyName);
}
}
@ -103,7 +104,8 @@ namespace Microsoft.AspNetCore.Authorization
{
if (!await authorizationService.IsGrantedAsync(resource, requirement))
{
throw new AbpAuthorizationException("Authorization failed! Given requirement has not granted for given resource: " + resource);
throw new AbpAuthorizationException(code: AbpAuthorizationErrorCodes.GivenRequirementHasNotGrantedForGivenResource)
.WithData("ResourceName", resource);
}
}
@ -111,7 +113,8 @@ namespace Microsoft.AspNetCore.Authorization
{
if (!await authorizationService.IsGrantedAsync(resource, policy))
{
throw new AbpAuthorizationException("Authorization failed! Given policy has not granted for given resource: " + resource);
throw new AbpAuthorizationException(code: AbpAuthorizationErrorCodes.GivenPolicyHasNotGrantedForGivenResource)
.WithData("ResourceName", resource);
}
}
@ -119,7 +122,7 @@ namespace Microsoft.AspNetCore.Authorization
{
if (!await authorizationService.IsGrantedAsync(policy))
{
throw new AbpAuthorizationException("Authorization failed! Given policy has not granted.");
throw new AbpAuthorizationException(code: AbpAuthorizationErrorCodes.GivenPolicyHasNotGranted);
}
}
@ -127,7 +130,8 @@ namespace Microsoft.AspNetCore.Authorization
{
if (!await authorizationService.IsGrantedAsync(resource, requirements))
{
throw new AbpAuthorizationException("Authorization failed! Given requirements have not granted for given resource: " + resource);
throw new AbpAuthorizationException(code: AbpAuthorizationErrorCodes.GivenRequirementsHasNotGrantedForGivenResource)
.WithData("ResourceName", resource);
}
}
@ -135,7 +139,8 @@ namespace Microsoft.AspNetCore.Authorization
{
if (!await authorizationService.IsGrantedAsync(resource, policyName))
{
throw new AbpAuthorizationException("Authorization failed! Given polist has not granted for given resource: " + resource);
throw new AbpAuthorizationException(code: AbpAuthorizationErrorCodes.GivenPolicyHasNotGrantedForGivenResource)
.WithData("ResourceName", resource);
}
}
@ -149,4 +154,4 @@ namespace Microsoft.AspNetCore.Authorization
return abpAuthorizationService;
}
}
}
}

@ -19,7 +19,12 @@
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Volo.Abp.Localization.Abstractions\Volo.Abp.Localization.Abstractions.csproj" />
<None Remove="Volo\Abp\Authorization\Localization\*.json" />
<EmbeddedResource Include="Volo\Abp\Authorization\Localization\*.json" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Volo.Abp.Localization\Volo.Abp.Localization.csproj" />
<ProjectReference Include="..\Volo.Abp.MultiTenancy\Volo.Abp.MultiTenancy.csproj" />
<ProjectReference Include="..\Volo.Abp.Security\Volo.Abp.Security.csproj" />
</ItemGroup>

@ -0,0 +1,15 @@
namespace Volo.Abp.Authorization
{
public static class AbpAuthorizationErrorCodes
{
public const string GivenPolicyHasNotGranted = "Volo.Authorization:010001";
public const string GivenPolicyHasNotGrantedWithPolicyName = "Volo.Authorization:010002";
public const string GivenPolicyHasNotGrantedForGivenResource = "Volo.Authorization:010003";
public const string GivenRequirementHasNotGrantedForGivenResource = "Volo.Authorization:010004";
public const string GivenRequirementsHasNotGrantedForGivenResource = "Volo.Authorization:010005";
}
}

@ -3,17 +3,20 @@ using System.Collections.Generic;
using Microsoft.AspNetCore.Authorization;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Volo.Abp.Authorization.Localization;
using Volo.Abp.Authorization.Permissions;
using Volo.Abp.Localization;
using Volo.Abp.Localization.ExceptionHandling;
using Volo.Abp.Modularity;
using Volo.Abp.MultiTenancy;
using Volo.Abp.Security;
using Volo.Abp.VirtualFileSystem;
namespace Volo.Abp.Authorization
{
[DependsOn(
typeof(AbpSecurityModule),
typeof(AbpLocalizationAbstractionsModule),
typeof(AbpLocalizationModule),
typeof(AbpMultiTenancyModule)
)]
public class AbpAuthorizationModule : AbpModule
@ -38,6 +41,23 @@ namespace Volo.Abp.Authorization
options.ValueProviders.Add<RolePermissionValueProvider>();
options.ValueProviders.Add<ClientPermissionValueProvider>();
});
Configure<AbpVirtualFileSystemOptions>(options =>
{
options.FileSets.AddEmbedded<AbpAuthorizationResource>();
});
Configure<AbpLocalizationOptions>(options =>
{
options.Resources
.Add<AbpAuthorizationResource>("en")
.AddVirtualJson("/Volo/Abp/Authorization/Localization");
});
Configure<AbpExceptionLocalizationOptions>(options =>
{
options.MapCodeNamespace("Volo.Authorization", typeof(AbpAuthorizationResource));
});
}
private static void AutoAddDefinitionProviders(IServiceCollection services)

@ -0,0 +1,10 @@
using Volo.Abp.Localization;
namespace Volo.Abp.Authorization.Localization
{
[LocalizationResourceName("AbpAuthorization")]
public class AbpAuthorizationResource
{
}
}

@ -0,0 +1,10 @@
{
"culture": "en",
"texts": {
"Volo.Authorization:010001": "Authorization failed! Given policy has not granted.",
"Volo.Authorization:010002": "Authorization failed! Given policy has not granted: {PolicyName}",
"Volo.Authorization:010003": "Authorization failed! Given policy has not granted for given resource: {ResourceName}",
"Volo.Authorization:010004": "Authorization failed! Given requirement has not granted for given resource: {ResourceName}",
"Volo.Authorization:010005": "Authorization failed! Given requirements has not granted for given resource: {ResourceName}"
}
}

@ -0,0 +1,10 @@
{
"culture": "tr",
"texts": {
"Volo.Authorization:010001": "Yetkilendirme başarısız! Belirtilen izin sağlanmamış.",
"Volo.Authorization:010002": "Yetkilendirme başarısız! Bu izin sağlanmamış: {PolicyName}",
"Volo.Authorization:010003": "Yetkilendirme başarısız! Bu izin, bu kaynak için sağlanmamış: {ResourceName}",
"Volo.Authorization:010004": "Yetkilendirme başarısız! Bu kaynak belirtilen gerekliliği sağlamamış: {ResourceName}",
"Volo.Authorization:010005": "Yetkilendirme başarısız! Bu kaynak belirtilen gereklilikleri sağlamamış: {ResourceName}"
}
}

@ -0,0 +1,10 @@
{
"culture": "zh-Hans",
"texts": {
"Volo.Authorization:010001": "授权失败! 提供的策略尚未授予.",
"Volo.Authorization:010002": "授权失败! 提供的策略尚未授予: {PolicyName}",
"Volo.Authorization:010003": "授权失败! 提供的策略未授予提供的资源: {ResourceName}",
"Volo.Authorization:010004": "授权失败! 提供的要求未授予提供的资源: {ResourceName}",
"Volo.Authorization:010005": "授权失败! 提供的要求未授予提供的资源: {ResourceName}"
}
}

@ -12,9 +12,9 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="Blazorise" Version="0.9.3-preview2" />
<PackageReference Include="Blazorise.DataGrid" Version="0.9.3-preview2" />
<PackageReference Include="Blazorise.Snackbar" Version="0.9.3-preview2" />
<PackageReference Include="Blazorise" Version="0.9.3-preview3" />
<PackageReference Include="Blazorise.DataGrid" Version="0.9.3-preview3" />
<PackageReference Include="Blazorise.Snackbar" Version="0.9.3-preview3" />
</ItemGroup>
</Project>

@ -1,17 +1,24 @@
using System;
using System.Diagnostics;
using System.IO;
using System.Runtime.InteropServices;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
using ICSharpCode.SharpZipLib.Core;
using ICSharpCode.SharpZipLib.Zip;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
using Volo.Abp.Cli.Args;
using Volo.Abp.Cli.Auth;
using Volo.Abp.Cli.Http;
using Volo.Abp.Cli.ProjectBuilding;
using Volo.Abp.Cli.ProjectBuilding.Building;
using Volo.Abp.Cli.ProjectBuilding.Templates.App;
using Volo.Abp.Cli.ProjectBuilding.Templates.Console;
using Volo.Abp.Cli.Utils;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Threading;
namespace Volo.Abp.Cli.Commands
{
@ -20,10 +27,13 @@ namespace Volo.Abp.Cli.Commands
public ILogger<NewCommand> Logger { get; set; }
protected TemplateProjectBuilder TemplateProjectBuilder { get; }
public ITemplateInfoProvider TemplateInfoProvider { get; }
public NewCommand(TemplateProjectBuilder templateProjectBuilder)
public NewCommand(TemplateProjectBuilder templateProjectBuilder
, ITemplateInfoProvider templateInfoProvider)
{
TemplateProjectBuilder = templateProjectBuilder;
TemplateInfoProvider = templateInfoProvider;
Logger = NullLogger<NewCommand>.Instance;
}
@ -187,6 +197,35 @@ namespace Volo.Abp.Cli.Commands
}
Logger.LogInformation($"'{projectName}' has been successfully created to '{outputFolder}'");
if (AppTemplateBase.IsAppTemplate(template ?? (await TemplateInfoProvider.GetDefaultAsync()).Name))
{
var isCommercial = template == AppProTemplate.TemplateName;
OpenThanksPage(uiFramework, databaseProvider, isTiered || commandLineArgs.Options.ContainsKey("separate-identity-server"), isCommercial);
}
}
private void OpenThanksPage(UiFramework uiFramework, DatabaseProvider databaseProvider, bool tiered, bool commercial)
{
uiFramework = uiFramework == UiFramework.NotSpecified || uiFramework == UiFramework.None ? UiFramework.Mvc : uiFramework;
var urlPrefix = commercial ? "commercial" : "www";
var tieredYesNo = tiered ? "yes" : "no";
var url = $"https://{urlPrefix}.abp.io/project-created-success?ui={uiFramework:g}&db={databaseProvider:g}&tiered={tieredYesNo}";
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
url = url.Replace("&", "^&");
Process.Start(new ProcessStartInfo("cmd", $"/c start {url}") { CreateNoWindow = true });
}
else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
{
Process.Start("xdg-open", url);
}
else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
{
Process.Start("open", url);
}
}
private bool GetCreateSolutionFolderPreference(CommandLineArgs commandLineArgs)
@ -195,7 +234,7 @@ namespace Volo.Abp.Cli.Commands
if (longKey == false)
{
return commandLineArgs.Options.ContainsKey(Options.CreateSolutionFolder.Short);
return commandLineArgs.Options.ContainsKey(Options.CreateSolutionFolder.Short);
}
return longKey;

@ -1,10 +1,11 @@
using Volo.Abp.Cli.ProjectBuilding.Building;
using System.Threading.Tasks;
using Volo.Abp.Cli.ProjectBuilding.Building;
namespace Volo.Abp.Cli.ProjectBuilding
{
public interface ITemplateInfoProvider
{
TemplateInfo GetDefault();
Task<TemplateInfo> GetDefaultAsync();
TemplateInfo Get(string name);
}

@ -1,18 +1,44 @@
using System;
using System.Text.Json;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
using Volo.Abp.Cli.Auth;
using Volo.Abp.Cli.Http;
using Volo.Abp.Cli.ProjectBuilding.Building;
using Volo.Abp.Cli.ProjectBuilding.Templates.App;
using Volo.Abp.Cli.ProjectBuilding.Templates.Console;
using Volo.Abp.Cli.ProjectBuilding.Templates.MvcModule;
using Volo.Abp.Cli.ProjectBuilding.Templates.Wpf;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Threading;
namespace Volo.Abp.Cli.ProjectBuilding
{
public class TemplateInfoProvider : ITemplateInfoProvider, ITransientDependency
{
public TemplateInfo GetDefault()
public ILogger<TemplateInfoProvider> Logger { get; set; }
public ICancellationTokenProvider CancellationTokenProvider { get; }
public IRemoteServiceExceptionHandler RemoteServiceExceptionHandler { get; }
public AuthService AuthService { get; }
public TemplateInfoProvider(ICancellationTokenProvider cancellationTokenProvider,
IRemoteServiceExceptionHandler remoteServiceExceptionHandler,
AuthService authService)
{
CancellationTokenProvider = cancellationTokenProvider;
RemoteServiceExceptionHandler = remoteServiceExceptionHandler;
AuthService = authService;
Logger = NullLogger<TemplateInfoProvider>.Instance;
}
public async Task<TemplateInfo> GetDefaultAsync()
{
return Get(AppTemplate.TemplateName);
var defaultTemplateName = await CheckProLicenseAsync() ? AppProTemplate.TemplateName : AppTemplate.TemplateName;
return Get(defaultTemplateName);
}
public TemplateInfo Get(string name)
@ -35,5 +61,43 @@ namespace Volo.Abp.Cli.ProjectBuilding
throw new Exception("There is no template found with given name: " + name);
}
}
private async Task<bool> CheckProLicenseAsync()
{
if (!AuthService.IsLoggedIn())
{
return false;
}
try
{
var url = $"{CliUrls.WwwAbpIo}api/license/check-user";
using (var client = new CliHttpClient())
{
var response = await client.GetHttpResponseMessageWithRetryAsync(
url,
CancellationTokenProvider.Token,
Logger);
if (!response.IsSuccessStatusCode)
{
throw new Exception($"ERROR: Remote server returns '{response.StatusCode}'");
}
await RemoteServiceExceptionHandler.EnsureSuccessfulHttpResponseAsync(response);
var responseContent = await response.Content.ReadAsStringAsync();
var result = JsonSerializer.Deserialize<bool>(responseContent);
return result;
}
}
catch (Exception)
{
return false;
}
}
}
}

@ -49,7 +49,7 @@ namespace Volo.Abp.Cli.ProjectBuilding
public async Task<ProjectBuildResult> BuildAsync(ProjectBuildArgs args)
{
var templateInfo = GetTemplateInfo(args);
var templateInfo = await GetTemplateInfoAsync(args);
NormalizeArgs(args, templateInfo);
@ -175,11 +175,11 @@ namespace Volo.Abp.Cli.ProjectBuilding
}
}
private TemplateInfo GetTemplateInfo(ProjectBuildArgs args)
private async Task<TemplateInfo> GetTemplateInfoAsync(ProjectBuildArgs args)
{
if (args.TemplateName.IsNullOrWhiteSpace())
{
return TemplateInfoProvider.GetDefault();
return await TemplateInfoProvider.GetDefaultAsync();
}
else
{

@ -161,6 +161,11 @@ namespace Volo.Abp.Cli.ProjectBuilding.Templates.App
{
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.HttpApi.HostWithIds"));
steps.Add(new AngularEnvironmentFilePortChangeForSeparatedIdentityServersStep());
if (context.BuildArgs.MobileApp == MobileApp.ReactNative)
{
steps.Add(new ReactEnvironmentFilePortChangeForSeparatedIdentityServersStep());
}
}
else
{

@ -0,0 +1,44 @@
using System;
using System.Linq;
using Volo.Abp.Cli.ProjectBuilding.Building;
namespace Volo.Abp.Cli.ProjectBuilding.Templates.App
{
public class ReactEnvironmentFilePortChangeForSeparatedIdentityServersStep : ProjectBuildPipelineStep
{
public override void Execute(ProjectBuildContext context)
{
var fileEntry = context.Files.FirstOrDefault(x =>
!x.IsDirectory &&
x.Name.EndsWith($"{MobileApp.ReactNative.GetFolderName()}/Environment.js",
StringComparison.InvariantCultureIgnoreCase)
);
if (fileEntry == null)
{
return;
}
fileEntry.NormalizeLineEndings();
var lines = fileEntry.GetLines();
for (var i = 0; i < lines.Length; i++)
{
var line = lines[i];
if (line.Contains("issuer") && line.Contains("localhost"))
{
line = line.Replace("44305", "44301");
}
else if (line.Contains("apiUrl") && line.Contains("localhost"))
{
line = line.Replace("44305", "44300");
}
lines[i] = line;
}
fileEntry.SetLines(lines);
}
}
}

@ -1,13 +1,13 @@
// using Volo.Abp.EntityFrameworkCore;
//
// namespace Microsoft.EntityFrameworkCore
// {
// public static class AbpOracleModelBuilderExtensions
// {
// public static void UseOracle(
// this ModelBuilder modelBuilder)
// {
// modelBuilder.SetDatabaseProvider(EfCoreDatabaseProvider.Oracle);
// }
// }
// }
using Volo.Abp.EntityFrameworkCore;
namespace Microsoft.EntityFrameworkCore
{
public static class AbpOracleModelBuilderExtensions
{
public static void UseOracle(
this ModelBuilder modelBuilder)
{
modelBuilder.SetDatabaseProvider(EfCoreDatabaseProvider.Oracle);
}
}
}

@ -19,7 +19,7 @@
</ItemGroup>
<ItemGroup>
<!--<PackageReference Include="Devart.Data.Oracle.EFCore" Version="9.11.1034" />-->
<PackageReference Include="Devart.Data.Oracle.EFCore" Version="9.14.1150" />
</ItemGroup>
</Project>

@ -1,27 +1,34 @@
// using JetBrains.Annotations;
// using Microsoft.EntityFrameworkCore;
// using System;
// using Devart.Data.Oracle.Entity;
// using Volo.Abp.EntityFrameworkCore.DependencyInjection;
//
// namespace Volo.Abp.EntityFrameworkCore
// {
// public static class AbpDbContextConfigurationContextOracleDevartExtensions
// {
// public static DbContextOptionsBuilder UseOracle(
// [NotNull] this AbpDbContextConfigurationContext context,
// [CanBeNull] Action<OracleDbContextOptionsBuilder> oracleOptionsAction = null,
// bool useExistingConnectionIfAvailable = false)
// {
// TODO: UseQuerySplittingBehavior(QuerySplittingBehavior.SplitQuery);
// if (useExistingConnectionIfAvailable && context.ExistingConnection != null)
// {
// return context.DbContextOptions.UseOracle(context.ExistingConnection, oracleOptionsAction);
// }
// else
// {
// return context.DbContextOptions.UseOracle(context.ConnectionString, oracleOptionsAction);
// }
// }
// }
// }
using JetBrains.Annotations;
using Microsoft.EntityFrameworkCore;
using System;
using Devart.Data.Oracle.Entity;
using Volo.Abp.EntityFrameworkCore.DependencyInjection;
namespace Volo.Abp.EntityFrameworkCore
{
public static class AbpDbContextConfigurationContextOracleDevartExtensions
{
public static DbContextOptionsBuilder UseOracle(
[NotNull] this AbpDbContextConfigurationContext context,
[CanBeNull] Action<OracleDbContextOptionsBuilder> oracleOptionsAction = null,
bool useExistingConnectionIfAvailable = false)
{
if (useExistingConnectionIfAvailable && context.ExistingConnection != null)
{
return context.DbContextOptions.UseOracle(context.ExistingConnection, optionsBuilder =>
{
optionsBuilder.UseQuerySplittingBehavior(QuerySplittingBehavior.SplitQuery);
oracleOptionsAction?.Invoke(optionsBuilder);
});
}
else
{
return context.DbContextOptions.UseOracle(context.ConnectionString, optionsBuilder =>
{
optionsBuilder.UseQuerySplittingBehavior(QuerySplittingBehavior.SplitQuery);
oracleOptionsAction?.Invoke(optionsBuilder);
});
}
}
}
}

@ -1,32 +1,32 @@
// using JetBrains.Annotations;
// using System;
// using Devart.Data.Oracle.Entity;
//
// namespace Volo.Abp.EntityFrameworkCore
// {
// public static class AbpDbContextOptionsOracleDevartExtensions
// {
// public static void UseOracle(
// [NotNull] this AbpDbContextOptions options,
// [CanBeNull] Action<OracleDbContextOptionsBuilder> oracleOptionsAction = null,
// bool useExistingConnectionIfAvailable = false)
// {
// options.Configure(context =>
// {
// context.UseOracle(oracleOptionsAction, useExistingConnectionIfAvailable);
// });
// }
//
// public static void UseOracle<TDbContext>(
// [NotNull] this AbpDbContextOptions options,
// [CanBeNull] Action<OracleDbContextOptionsBuilder> oracleOptionsAction = null,
// bool useExistingConnectionIfAvailable = false)
// where TDbContext : AbpDbContext<TDbContext>
// {
// options.Configure<TDbContext>(context =>
// {
// context.UseOracle(oracleOptionsAction, useExistingConnectionIfAvailable);
// });
// }
// }
// }
using JetBrains.Annotations;
using System;
using Devart.Data.Oracle.Entity;
namespace Volo.Abp.EntityFrameworkCore
{
public static class AbpDbContextOptionsOracleDevartExtensions
{
public static void UseOracle(
[NotNull] this AbpDbContextOptions options,
[CanBeNull] Action<OracleDbContextOptionsBuilder> oracleOptionsAction = null,
bool useExistingConnectionIfAvailable = false)
{
options.Configure(context =>
{
context.UseOracle(oracleOptionsAction, useExistingConnectionIfAvailable);
});
}
public static void UseOracle<TDbContext>(
[NotNull] this AbpDbContextOptions options,
[CanBeNull] Action<OracleDbContextOptionsBuilder> oracleOptionsAction = null,
bool useExistingConnectionIfAvailable = false)
where TDbContext : AbpDbContext<TDbContext>
{
options.Configure<TDbContext>(context =>
{
context.UseOracle(oracleOptionsAction, useExistingConnectionIfAvailable);
});
}
}
}

@ -1,22 +1,22 @@
// using Volo.Abp.Guids;
// using Volo.Abp.Modularity;
//
// namespace Volo.Abp.EntityFrameworkCore.Oracle.Devart
// {
// [DependsOn(
// typeof(AbpEntityFrameworkCoreModule)
// )]
// public class AbpEntityFrameworkCoreOracleDevartModule : AbpModule
// {
// public override void ConfigureServices(ServiceConfigurationContext context)
// {
// Configure<AbpSequentialGuidGeneratorOptions>(options =>
// {
// if (options.DefaultSequentialGuidType == null)
// {
// options.DefaultSequentialGuidType = SequentialGuidType.SequentialAsBinary;
// }
// });
// }
// }
// }
using Volo.Abp.Guids;
using Volo.Abp.Modularity;
namespace Volo.Abp.EntityFrameworkCore.Oracle.Devart
{
[DependsOn(
typeof(AbpEntityFrameworkCoreModule)
)]
public class AbpEntityFrameworkCoreOracleDevartModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
Configure<AbpSequentialGuidGeneratorOptions>(options =>
{
if (options.DefaultSequentialGuidType == null)
{
options.DefaultSequentialGuidType = SequentialGuidType.SequentialAsBinary;
}
});
}
}
}

@ -62,12 +62,6 @@ namespace Volo.Abp.AspNetCore.ExceptionHandling
return CreateEntityNotFoundError(exception as EntityNotFoundException);
}
if (exception is AbpAuthorizationException)
{
var authorizationException = exception as AbpAuthorizationException;
return new RemoteServiceErrorInfo(authorizationException.Message);
}
var errorInfo = new RemoteServiceErrorInfo();
if (exception is IUserFriendlyException)

@ -15,7 +15,12 @@
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Volo.Abp.Localization.Abstractions\Volo.Abp.Localization.Abstractions.csproj" />
<None Remove="Volo\Abp\Features\Localization\*.json" />
<EmbeddedResource Include="Volo\Abp\Features\Localization\*.json" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Volo.Abp.Localization\Volo.Abp.Localization.csproj" />
<ProjectReference Include="..\Volo.Abp.MultiTenancy\Volo.Abp.MultiTenancy.csproj" />
<ProjectReference Include="..\Volo.Abp.Validation\Volo.Abp.Validation.csproj" />
</ItemGroup>

@ -0,0 +1,11 @@
namespace Volo.Abp.Features
{
public static class AbpFeatureErrorCodes
{
public const string FeatureIsNotEnabled = "Volo.Feature:010001";
public const string AllOfTheseFeaturesMustBeEnabled = "Volo.Feature:010002";
public const string AtLeastOneOfTheseFeaturesMustBeEnabled = "Volo.Feature:010003";
}
}

@ -1,15 +1,18 @@
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using Volo.Abp.Features.Localization;
using Volo.Abp.Localization;
using Volo.Abp.Localization.ExceptionHandling;
using Volo.Abp.Modularity;
using Volo.Abp.MultiTenancy;
using Volo.Abp.Validation;
using Volo.Abp.VirtualFileSystem;
namespace Volo.Abp.Features
{
[DependsOn(
typeof(AbpLocalizationAbstractionsModule),
typeof(AbpLocalizationModule),
typeof(AbpMultiTenancyModule),
typeof(AbpValidationModule)
)]
@ -29,6 +32,23 @@ namespace Volo.Abp.Features
options.ValueProviders.Add<EditionFeatureValueProvider>();
options.ValueProviders.Add<TenantFeatureValueProvider>();
});
Configure<AbpVirtualFileSystemOptions>(options =>
{
options.FileSets.AddEmbedded<AbpFeatureResource>();
});
Configure<AbpLocalizationOptions>(options =>
{
options.Resources
.Add<AbpFeatureResource>("en")
.AddVirtualJson("/Volo/Abp/Features/Localization");
});
Configure<AbpExceptionLocalizationOptions>(options =>
{
options.MapCodeNamespace("Volo.Feature", typeof(AbpFeatureResource));
});
}
private static void AutoAddDefinitionProviders(IServiceCollection services)

@ -9,8 +9,8 @@ namespace Volo.Abp.Features
public static class FeatureCheckerExtensions
{
public static async Task<T> GetAsync<T>(
[NotNull] this IFeatureChecker featureChecker,
[NotNull] string name,
[NotNull] this IFeatureChecker featureChecker,
[NotNull] string name,
T defaultValue = default)
where T : struct
{
@ -56,10 +56,11 @@ namespace Volo.Abp.Features
{
if (!(await featureChecker.IsEnabledAsync(featureName)))
{
throw new AbpAuthorizationException("Feature is not enabled: " + featureName);
throw new AbpAuthorizationException(code: AbpFeatureErrorCodes.FeatureIsNotEnabled).WithData(
"FeatureName", featureName);
}
}
public static async Task CheckEnabledAsync(this IFeatureChecker featureChecker, bool requiresAll, params string[] featureNames)
{
if (featureNames.IsNullOrEmpty())
@ -73,10 +74,8 @@ namespace Volo.Abp.Features
{
if (!(await featureChecker.IsEnabledAsync(featureName)))
{
throw new AbpAuthorizationException(
"Required features are not enabled. All of these features must be enabled: " +
string.Join(", ", featureNames)
);
throw new AbpAuthorizationException(code: AbpFeatureErrorCodes.AllOfTheseFeaturesMustBeEnabled)
.WithData("FeatureNames", string.Join(", ", featureNames));
}
}
}
@ -90,11 +89,9 @@ namespace Volo.Abp.Features
}
}
throw new AbpAuthorizationException(
"Required features are not enabled. At least one of these features must be enabled: " +
string.Join(", ", featureNames)
);
throw new AbpAuthorizationException(code: AbpFeatureErrorCodes.AtLeastOneOfTheseFeaturesMustBeEnabled)
.WithData("FeatureNames", string.Join(", ", featureNames));
}
}
}
}
}

@ -0,0 +1,10 @@
using Volo.Abp.Localization;
namespace Volo.Abp.Features.Localization
{
[LocalizationResourceName("AbpFeature")]
public class AbpFeatureResource
{
}
}

@ -0,0 +1,8 @@
{
"culture": "en",
"texts": {
"Volo.Feature:010001": "Feature is not enabled: {FeatureName}",
"Volo.Feature:010002": "Required features are not enabled. All of these features must be enabled: {FeatureNames}",
"Volo.Feature:010003": "Required features are not enabled. At least one of these features must be enabled: {FeatureNames}"
}
}

@ -0,0 +1,8 @@
{
"culture": "tr",
"texts": {
"Volo.Feature:010001": "Bu özellik etkin değil: {FeatureName}",
"Volo.Feature:010002": "Gerekli özellikler etkinleştirilmemiş. Bu özelliklerin tümü etkinleştirilmelidir: {FeatureNames}",
"Volo.Feature:010003": "Gerekli özellikler etkinleştirilmemiş. Bu özelliklerden en az birinin etkinleştirilmesi gerekir: {FeatureNames}"
}
}

@ -0,0 +1,8 @@
{
"culture": "zh-Hans",
"texts": {
"Volo.Feature:010001": "功能未启用: {FeatureName}",
"Volo.Feature:010002": "必要的功能未启用. 这些功能需要启用: {FeatureNames}",
"Volo.Feature:010003": "必要的功能未启用. 需要启用这些功能中的一项:{FeatureNames}"
}
}

@ -1,6 +1,7 @@
using System;
using System.Runtime.Serialization;
using Microsoft.Extensions.Logging;
using Volo.Abp.ExceptionHandling;
using Volo.Abp.Logging;
namespace Volo.Abp.Authorization
@ -9,7 +10,7 @@ namespace Volo.Abp.Authorization
/// This exception is thrown on an unauthorized request.
/// </summary>
[Serializable]
public class AbpAuthorizationException : AbpException, IHasLogLevel
public class AbpAuthorizationException : AbpException, IHasLogLevel, IHasErrorCode
{
/// <summary>
/// Severity of the exception.
@ -17,6 +18,11 @@ namespace Volo.Abp.Authorization
/// </summary>
public LogLevel LogLevel { get; set; }
/// <summary>
/// Error code.
/// </summary>
public string Code { get; }
/// <summary>
/// Creates a new <see cref="AbpAuthorizationException"/> object.
/// </summary>
@ -54,5 +60,24 @@ namespace Volo.Abp.Authorization
{
LogLevel = LogLevel.Warning;
}
/// <summary>
/// Creates a new <see cref="AbpAuthorizationException"/> object.
/// </summary>
/// <param name="message">Exception message</param>
/// <param name="code">Exception code</param>
/// <param name="innerException">Inner exception</param>
public AbpAuthorizationException(string message = null, string code = null, Exception innerException = null)
: base(message, innerException)
{
Code = code;
LogLevel = LogLevel.Warning;
}
public AbpAuthorizationException WithData(string name, object value)
{
Data[name] = value;
return this;
}
}
}
}

@ -3,7 +3,7 @@
"name": "asp.net",
"private": true,
"dependencies": {
"@abp/aspnetcore.mvc.ui.theme.shared": "^4.0.0-rc.5",
"@abp/aspnetcore.mvc.ui.theme.shared": "^4.0.0",
"highlight.js": "^9.13.1"
},
"devDependencies": {}

@ -2,30 +2,30 @@
# yarn lockfile v1
"@abp/aspnetcore.mvc.ui.theme.shared@^4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-4.0.0-rc.5.tgz#ca73a54b7f328e7429ac639ce17526b72eab5581"
integrity sha512-GPc82OOz+MpSnTl46Wgeg53NYPI46jdy4/muragF6JR+3zBEo8tYe0jHP8T+LGtyGXdYoJ9Sx9274fRyxxh65Q==
dependencies:
"@abp/aspnetcore.mvc.ui" "~4.0.0-rc.5"
"@abp/bootstrap" "~4.0.0-rc.5"
"@abp/bootstrap-datepicker" "~4.0.0-rc.5"
"@abp/datatables.net-bs4" "~4.0.0-rc.5"
"@abp/font-awesome" "~4.0.0-rc.5"
"@abp/jquery-form" "~4.0.0-rc.5"
"@abp/jquery-validation-unobtrusive" "~4.0.0-rc.5"
"@abp/lodash" "~4.0.0-rc.5"
"@abp/luxon" "~4.0.0-rc.5"
"@abp/malihu-custom-scrollbar-plugin" "~4.0.0-rc.5"
"@abp/select2" "~4.0.0-rc.5"
"@abp/sweetalert" "~4.0.0-rc.5"
"@abp/timeago" "~4.0.0-rc.5"
"@abp/toastr" "~4.0.0-rc.5"
"@abp/aspnetcore.mvc.ui@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-4.0.0-rc.5.tgz#fa0dbc0b2f0a2c7777cdeb7613ec61307e6edd96"
integrity sha512-zEHA08snWGVL2Lm4ijpj/CnY1JxIg1ark3fxNsaKraVciVWbh5jmnBL8LCdKZFWZqEGCeWxrEnpt8OGIV+nhdg==
"@abp/aspnetcore.mvc.ui.theme.shared@^4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-4.0.0.tgz#ba896056e9df5ac58e108df96996fbb2ca7a1a15"
integrity sha512-3RNn6VrNA+cqnPBoSbiCazN05cC2rhcRFMMxkEte+LImGbGOsxc4MflzHg5On1ExCGdqko8Axbw/ydy44Ak4Hw==
dependencies:
"@abp/aspnetcore.mvc.ui" "~4.0.0"
"@abp/bootstrap" "~4.0.0"
"@abp/bootstrap-datepicker" "~4.0.0"
"@abp/datatables.net-bs4" "~4.0.0"
"@abp/font-awesome" "~4.0.0"
"@abp/jquery-form" "~4.0.0"
"@abp/jquery-validation-unobtrusive" "~4.0.0"
"@abp/lodash" "~4.0.0"
"@abp/luxon" "~4.0.0"
"@abp/malihu-custom-scrollbar-plugin" "~4.0.0"
"@abp/select2" "~4.0.0"
"@abp/sweetalert" "~4.0.0"
"@abp/timeago" "~4.0.0"
"@abp/toastr" "~4.0.0"
"@abp/aspnetcore.mvc.ui@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-4.0.0.tgz#68502177a05f6ce7191a09b06a18c5b5dfab425d"
integrity sha512-tYHUWMwnwInrGSzC/OdN6bH/VHZEz5DP3rx2U6fcb0I5GvvRdQZxVgUvmWn6DeMA3PG10Gra4SfkhZqRQq9rjQ==
dependencies:
ansi-colors "^4.1.1"
extend-object "^1.0.0"
@ -36,145 +36,145 @@
micromatch "^4.0.2"
path "^0.12.7"
"@abp/bootstrap-datepicker@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-4.0.0-rc.5.tgz#38d665ba63dc9a0bb5fb8bfad50e7cac2fcdb8bf"
integrity sha512-nh+yJRn+CsnLd2VQelYcQbS49zP1LDSvczZrlCZUtiyAv400cBa1mC8tITxDnpAEBlICWb5s4Sg7kJXjyePsmw==
"@abp/bootstrap-datepicker@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-4.0.0.tgz#cdbd2c388c6d7ce8c6d72443038975063e6c6d02"
integrity sha512-hauH8VhpC8cxv1wCR6bVBcNqZepftdBXxEVID7TSAqgNyWjm/CrJqWLI+A0nnkG3IHoIm9D22iF47BamuYHptw==
dependencies:
bootstrap-datepicker "^1.9.0"
"@abp/bootstrap@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-4.0.0-rc.5.tgz#c49675030b2bde53a8b30249f38d85d4ae0aff49"
integrity sha512-eXJS1Eq2WyB9qKhyW/+9PUzZU5YNKe9q2Mt2nISwb0NmFepGiLkoygGQXtTe7yvyVdqrb6XM5pZHxdM0tRkYRQ==
"@abp/bootstrap@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-4.0.0.tgz#04174f18055f76f936e6fb73e5ff71ffa08a8528"
integrity sha512-Tmr0yoSWg7XHl02X5wv04CvYcL8KCpX8u6YGJj31jRZxUTeCvs5ETXlepOWcdxPQqi/4olXv5B9GEz5S9l5nZA==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
bootstrap "^4.5.0"
bootstrap-v4-rtl "4.4.1-2"
"@abp/core@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/core/-/core-4.0.0-rc.5.tgz#3500839195c24f1275c55801037b02fd749516f7"
integrity sha512-Ubbej59+9z4FQWWCUSO3LphTmT8ZJQ/53cFcMOMIX/uoluli8IORBeAetTw4UDqG2rA70a5YKpyz17pG36D1kA==
"@abp/core@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/core/-/core-4.0.0.tgz#65e76c697e62162717e0edabf7edacc4228e682a"
integrity sha512-xcTTBFjLFZ9Trv2x9Y/c3XKezIx+x3MTXUD98QJPf1aR7T43TE/tLHRxdRfW3R8ka0O1wmlYshpkaw5pYNsj5w==
dependencies:
"@abp/utils" "^4.0.0-rc.5"
"@abp/utils" "^4.0.0"
"@abp/datatables.net-bs4@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-4.0.0-rc.5.tgz#00a9db6cd73bd1f6e5adaebe3add0f3192ed9b1d"
integrity sha512-Xvvm7j2UVgJfQRIPJ121vYH7upao22nqcFAxmeBFZ41Vgmt2gDkbXfvPHIAw06M0C2Gpym9shO+Sg4556xCubQ==
"@abp/datatables.net-bs4@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-4.0.0.tgz#fe737e054f6ba35e787a1cda185af2788ef86d39"
integrity sha512-mz7xZdzX1nlFyX7vNzB5w3RkqZ0IHrPgsXGOB7OCTKMRshDFVH2O51Oy4qoLDOXoTVeahHtR9v8thEWFR1SnZg==
dependencies:
"@abp/datatables.net" "~4.0.0-rc.5"
"@abp/datatables.net" "~4.0.0"
datatables.net-bs4 "^1.10.21"
"@abp/datatables.net@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-4.0.0-rc.5.tgz#ca581ca5b76a95702086b04da3f50b00b7da7973"
integrity sha512-xm7JQ/B9Opng1zai+cAILD6pl2Xlp54NMkfz7Y6U4DEYhzUAOT1idOVUhlCMtdE6RxVVqZGVozQZt7SZFZVImw==
"@abp/datatables.net@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-4.0.0.tgz#88ae5f1a6068fba55927e59f113686508e9553cb"
integrity sha512-JYTfMA1zlBNGiQHAiZiTj5ka6B6vq5k2jqsoLHup4pD9jpKwKRBGtltVsWoEnetd9eEbp4SaV/FCuh3RzmV6Pw==
dependencies:
"@abp/jquery" "~4.0.0-rc.5"
"@abp/jquery" "~4.0.0"
datatables.net "^1.10.21"
"@abp/font-awesome@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-4.0.0-rc.5.tgz#59a0516eb3c2d6f43a0a19a60f7c31fef4d421f4"
integrity sha512-VsmpC04epanCyZC6DVrDJz8FcupdU8/PpV9gnr7YvTk+VZQrq/zY9C21GWPDGKmBPavUlG4QMrX1oeUvu+9FoA==
"@abp/font-awesome@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-4.0.0.tgz#6e1e4bd1175a0b8d3b095e215c07e66ad0e42e19"
integrity sha512-kHfZ45UMDWSRk1gTV/BwVfSoXksJ9UlnD3SelTGeAkvbDqtDllqlp9y6c3qQcmZUE348Xl4hDTkU8upZwswCFQ==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
"@fortawesome/fontawesome-free" "^5.13.0"
"@abp/jquery-form@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-4.0.0-rc.5.tgz#91b90f4cb45bce584e33a74cc4366297fc4d4d40"
integrity sha512-5XrRF1xQMpZnAHYGDdpkLnYaAiKtWsmmHJ3aLxtg1QHnTuSKbasEtsOMVTqazkpiGcZsURcHNa4B/JUSK/KuBg==
"@abp/jquery-form@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-4.0.0.tgz#3afb41eb16d62e32c31a29c6a866f634a5a20cd8"
integrity sha512-cQq8PgzHfpK9/LxmjlnMsDn85wWvEOqjyLaepHFpTTt0341auSgXNwhp7rk71AUHD1lP3c9ALctmqu+gYmh9ag==
dependencies:
"@abp/jquery" "~4.0.0-rc.5"
"@abp/jquery" "~4.0.0"
jquery-form "^4.3.0"
"@abp/jquery-validation-unobtrusive@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-4.0.0-rc.5.tgz#f6c3320c9362bc70120dbdcce02cda814ec7c243"
integrity sha512-ftBxpeMLeRlaabPzU0wjDd4qvfgX38XtELnGjdQmTQ3P5lmAjhSTk1Fe8eIfGSINUAwYJyCjUlyYIMVi+kx9Tg==
"@abp/jquery-validation-unobtrusive@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-4.0.0.tgz#c3674d2b01b3c524de4c3fac1c6ae3657857ee7b"
integrity sha512-OGibIdw0ogjp6VQIebHM7OtMT36pjLKRrOHyCVpTmQ7NzDODV5ptG83vOnt5nFG0y9XFrOt8cnHrrd+K1Bpo/Q==
dependencies:
"@abp/jquery-validation" "~4.0.0-rc.5"
"@abp/jquery-validation" "~4.0.0"
jquery-validation-unobtrusive "^3.2.11"
"@abp/jquery-validation@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-4.0.0-rc.5.tgz#eb02731039b5befebf3666cb6cc1a7b54d5e9057"
integrity sha512-5LWBi+8Otch8SUCJA7DyKX7gD2Vy2aCODyPO5Y037lx7iUk/xHkhRnPDOVIGiS8fzyZx+fLNhJ6Lbfk9P+I5XA==
"@abp/jquery-validation@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-4.0.0.tgz#0a101937f89ff398317142b5271fa9a1de6571c2"
integrity sha512-4nzvhAktEINpQ2H+Hy7TOxxojTmTEm5dBTbHs1vbCWUuF0OTpouZWbMZDESdP0ZbjXcQ+vhwuM4e/pm/PeaHyQ==
dependencies:
"@abp/jquery" "~4.0.0-rc.5"
"@abp/jquery" "~4.0.0"
jquery-validation "^1.19.2"
"@abp/jquery@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-4.0.0-rc.5.tgz#244fbe71bb85abc1f54bfca269d9b0bfdf50469f"
integrity sha512-xt2gV3ZIMpyTFls2a58TTXEbhFxQGb7JacRojp5/+MyGL/SoQbOGENU3aK/fHRYD3VRUkhlKFGT6Ijv3LX83/A==
"@abp/jquery@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-4.0.0.tgz#00d24678b573bcc2fb14d8337ccdbf697b59d43b"
integrity sha512-gXLK97IvAZriNlG8e0qJcd7MvnpshJQURb4lg8VYibD7Fs/OBeHSAWM2Adgi3H9DnQL8XEUlWf487FSz4RC/Yg==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
jquery "~3.5.1"
"@abp/lodash@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-4.0.0-rc.5.tgz#f38dd3021d2b9877cf38fe812531968b7e607838"
integrity sha512-xdJ3WjqBz+C1gxrq1GcA66D1wrKn3QJ9/culTvEDr/eLpHjimnNjMmhAQqVxbaGk6qD6Q8Fswr8gtwqpPSe6eA==
"@abp/lodash@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-4.0.0.tgz#fe76d09517f6b1adf18edde94a31e13b003329dc"
integrity sha512-uitn5uYlb9xShRtV4AFOgp3lu2kADGMD4+a4fy5r4umlPM2uuMo0wMhzyYdBIG64JC5oNaqAzOwZyhhnn+HGJg==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
lodash "^4.17.15"
"@abp/luxon@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-4.0.0-rc.5.tgz#9448a48b6b3bf0446b421c2642188b9f11848572"
integrity sha512-S/lkCt/ou0Lv7KG3/XEAHx2S2YaDcEszyhnRBVCYSNqOUr0a56J+2MqKL5OFrOTNCfkPHDkaJVlSIXBEXokXFA==
"@abp/luxon@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-4.0.0.tgz#d9357e4fb422b6e18ebe897a86a4c4bc6fbe6858"
integrity sha512-tiE6NiSa4El88SVotxfmmpceINLz8MruaO/e/U3QjJEHjRoqlv0UBrM/x5Xz92c7ZIvL0Y4QvWNISeDg6/oqIQ==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
luxon "^1.24.1"
"@abp/malihu-custom-scrollbar-plugin@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-4.0.0-rc.5.tgz#87acd20de26e071bb38ec26fa4cd18026ca11464"
integrity sha512-QOp8R/LDabMhjapSjaArBEZUEslhOOGYIGfFm8CCrSeWGWJR8TFa68PIjhmUpNM5l8nlvC3MDMkQ/TnOaXgR4g==
"@abp/malihu-custom-scrollbar-plugin@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-4.0.0.tgz#972acf26f5eaa4bf9b8991cbe7c19fd0005d94e2"
integrity sha512-SpUo1CfppKzkE6Rb880pgB7oQ83Mkjsi0o6eE4r4gkF5hfzkuCXOmNjTYKfQIkE4n3G9QQd+8AAN/4xj4DiDrA==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
malihu-custom-scrollbar-plugin "^3.1.5"
"@abp/select2@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-4.0.0-rc.5.tgz#a7cc1e2e1985693f673c8214ac7db21d79dee4b8"
integrity sha512-ZNwT8u0CPDrCO4y5kCWd2EGhihwc+R6aBxx8tzL0AUAuHYRVA68T49Exyd1Fa+jESRjoVn18hys6HnTCUzZkWQ==
"@abp/select2@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-4.0.0.tgz#8fdf4c5e18f4093ee4e073dab950cf7aa9b2a540"
integrity sha512-XeXahcDMczdkZdP07yhQriIvbi1N5meeSGTnFyZX+bNTGzUOarPcuNYZ6Mcl3351HcyESHzuJbKbsk3RB1kGeg==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
select2 "^4.0.13"
"@abp/sweetalert@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-4.0.0-rc.5.tgz#e360ed98fc242348eb881e0031e4bf921bd1065b"
integrity sha512-dCmKYbmUBvsh95VjOeAxBsEgDQSTYswbAOXfTe/1nTf7ABVxUouKY++TYjK9xOgrmUx2fXC/kpImiAKI/xsLEg==
"@abp/sweetalert@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-4.0.0.tgz#0d93e92e95c6855aef7e19532a7513a078ece216"
integrity sha512-y3XtZqnUVZuQohpRO1ImyBZXhtrm4H+typIL/9VgcnlvQjBTyIaiwDmU8j07Bb2rKJKe0prVkkVARO7OnjOS5A==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
sweetalert "^2.1.2"
"@abp/timeago@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-4.0.0-rc.5.tgz#f0dd1e85249dc737e8cfedba072677dd6727d16c"
integrity sha512-Nqq9Ok7odlp+ptmCDsdcz1/j68n6gZN8+jBHZt18hU4ox4awruDbSguK7Pn2qu8Vt5zfGtit0+nqKamlq+dr6A==
"@abp/timeago@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-4.0.0.tgz#509cd8a84cd94c2644824b0c3af10c8fff6de2dc"
integrity sha512-90jzLYJusYTPwMbak1+XkXE85OPOXPpysRbL28KQwl7WLNBm8wx6IEoVZOHvOrpYscYdyeWhZCgILSJ8DR3a2Q==
dependencies:
"@abp/jquery" "~4.0.0-rc.5"
"@abp/jquery" "~4.0.0"
timeago "^1.6.7"
"@abp/toastr@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-4.0.0-rc.5.tgz#7f39a71fca5665cbcf46f02a7df6030ddb0114c7"
integrity sha512-jS01uP0MZb4OWfBTH1UEXlTPYMjK5WqorE8WZ6Am+jKzwfHudCDFmjFfSX5PV2/Ia3CP9NU8mwygXLmtsHZbHw==
"@abp/toastr@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-4.0.0.tgz#06e28665cb7f6eefee3f69c985dd2b3f86cd7f1d"
integrity sha512-YL1fahVpDszhwpnRTN87GCP523Mkaw42ApT2A/hZuBdwRzP/u5GwRfng0i/uhdYXCMkTKuHmaHnRyqhGiv7nfQ==
dependencies:
"@abp/jquery" "~4.0.0-rc.5"
"@abp/jquery" "~4.0.0"
toastr "^2.1.4"
"@abp/utils@^4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-4.0.0-rc.5.tgz#45b55d6bbf69ad2a052bc2635c039d2cc4aac401"
integrity sha512-pRYUSh30VT4702lfnQCswIwLVqNC6ZFsmydXngwZASJEJVKj30XitSlixnKhocvozG/87H0sYVzvwmUyJiHHQw==
"@abp/utils@^4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-4.0.0.tgz#6c2b5f5c20821028fe6cdbffb5e2f6088956b9d5"
integrity sha512-Yj2yCObvS6X/P8rdRMQBo7940k5P/dZhgCUSo9C6P9GNmJY8wNdJFFyhRtaHuAyU5IBBBIY7+mMKOk5eQcbjWQ==
dependencies:
just-compare "^1.3.0"

@ -3,8 +3,8 @@
"name": "asp.net",
"private": true,
"dependencies": {
"@abp/aspnetcore.mvc.ui.theme.basic": "^4.0.0-rc.5",
"@abp/prismjs": "^4.0.0-rc.5"
"@abp/aspnetcore.mvc.ui.theme.basic": "^4.0.0",
"@abp/prismjs": "^4.0.0"
},
"devDependencies": {}
}

@ -2,37 +2,37 @@
# yarn lockfile v1
"@abp/aspnetcore.mvc.ui.theme.basic@^4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-4.0.0-rc.5.tgz#f57744513c443dd96b64a11376b67fabb0df821d"
integrity sha512-6P9nwq1RvAVtRl5NQq+R5QQIGflSbZMFdQTje4r7hDjhKlGLPQUBgWrYRP0TXkIbxz/fhBC9/Mg7lg3bmSH+uQ==
dependencies:
"@abp/aspnetcore.mvc.ui.theme.shared" "~4.0.0-rc.5"
"@abp/aspnetcore.mvc.ui.theme.shared@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-4.0.0-rc.5.tgz#ca73a54b7f328e7429ac639ce17526b72eab5581"
integrity sha512-GPc82OOz+MpSnTl46Wgeg53NYPI46jdy4/muragF6JR+3zBEo8tYe0jHP8T+LGtyGXdYoJ9Sx9274fRyxxh65Q==
dependencies:
"@abp/aspnetcore.mvc.ui" "~4.0.0-rc.5"
"@abp/bootstrap" "~4.0.0-rc.5"
"@abp/bootstrap-datepicker" "~4.0.0-rc.5"
"@abp/datatables.net-bs4" "~4.0.0-rc.5"
"@abp/font-awesome" "~4.0.0-rc.5"
"@abp/jquery-form" "~4.0.0-rc.5"
"@abp/jquery-validation-unobtrusive" "~4.0.0-rc.5"
"@abp/lodash" "~4.0.0-rc.5"
"@abp/luxon" "~4.0.0-rc.5"
"@abp/malihu-custom-scrollbar-plugin" "~4.0.0-rc.5"
"@abp/select2" "~4.0.0-rc.5"
"@abp/sweetalert" "~4.0.0-rc.5"
"@abp/timeago" "~4.0.0-rc.5"
"@abp/toastr" "~4.0.0-rc.5"
"@abp/aspnetcore.mvc.ui@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-4.0.0-rc.5.tgz#fa0dbc0b2f0a2c7777cdeb7613ec61307e6edd96"
integrity sha512-zEHA08snWGVL2Lm4ijpj/CnY1JxIg1ark3fxNsaKraVciVWbh5jmnBL8LCdKZFWZqEGCeWxrEnpt8OGIV+nhdg==
"@abp/aspnetcore.mvc.ui.theme.basic@^4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-4.0.0.tgz#b1822cf5bbc0f6eeb414ebd0877f6d1115a81fe7"
integrity sha512-yYXQkEnNhftzm+ZI8d3VFMlV5UuLNTMQQwV2eZ8tJfstUQrKV9bVd3+NdDOr3AkvcD8D7mvMFeBuoMYteL5kLQ==
dependencies:
"@abp/aspnetcore.mvc.ui.theme.shared" "~4.0.0"
"@abp/aspnetcore.mvc.ui.theme.shared@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-4.0.0.tgz#ba896056e9df5ac58e108df96996fbb2ca7a1a15"
integrity sha512-3RNn6VrNA+cqnPBoSbiCazN05cC2rhcRFMMxkEte+LImGbGOsxc4MflzHg5On1ExCGdqko8Axbw/ydy44Ak4Hw==
dependencies:
"@abp/aspnetcore.mvc.ui" "~4.0.0"
"@abp/bootstrap" "~4.0.0"
"@abp/bootstrap-datepicker" "~4.0.0"
"@abp/datatables.net-bs4" "~4.0.0"
"@abp/font-awesome" "~4.0.0"
"@abp/jquery-form" "~4.0.0"
"@abp/jquery-validation-unobtrusive" "~4.0.0"
"@abp/lodash" "~4.0.0"
"@abp/luxon" "~4.0.0"
"@abp/malihu-custom-scrollbar-plugin" "~4.0.0"
"@abp/select2" "~4.0.0"
"@abp/sweetalert" "~4.0.0"
"@abp/timeago" "~4.0.0"
"@abp/toastr" "~4.0.0"
"@abp/aspnetcore.mvc.ui@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-4.0.0.tgz#68502177a05f6ce7191a09b06a18c5b5dfab425d"
integrity sha512-tYHUWMwnwInrGSzC/OdN6bH/VHZEz5DP3rx2U6fcb0I5GvvRdQZxVgUvmWn6DeMA3PG10Gra4SfkhZqRQq9rjQ==
dependencies:
ansi-colors "^4.1.1"
extend-object "^1.0.0"
@ -43,162 +43,162 @@
micromatch "^4.0.2"
path "^0.12.7"
"@abp/bootstrap-datepicker@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-4.0.0-rc.5.tgz#38d665ba63dc9a0bb5fb8bfad50e7cac2fcdb8bf"
integrity sha512-nh+yJRn+CsnLd2VQelYcQbS49zP1LDSvczZrlCZUtiyAv400cBa1mC8tITxDnpAEBlICWb5s4Sg7kJXjyePsmw==
"@abp/bootstrap-datepicker@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-4.0.0.tgz#cdbd2c388c6d7ce8c6d72443038975063e6c6d02"
integrity sha512-hauH8VhpC8cxv1wCR6bVBcNqZepftdBXxEVID7TSAqgNyWjm/CrJqWLI+A0nnkG3IHoIm9D22iF47BamuYHptw==
dependencies:
bootstrap-datepicker "^1.9.0"
"@abp/bootstrap@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-4.0.0-rc.5.tgz#c49675030b2bde53a8b30249f38d85d4ae0aff49"
integrity sha512-eXJS1Eq2WyB9qKhyW/+9PUzZU5YNKe9q2Mt2nISwb0NmFepGiLkoygGQXtTe7yvyVdqrb6XM5pZHxdM0tRkYRQ==
"@abp/bootstrap@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-4.0.0.tgz#04174f18055f76f936e6fb73e5ff71ffa08a8528"
integrity sha512-Tmr0yoSWg7XHl02X5wv04CvYcL8KCpX8u6YGJj31jRZxUTeCvs5ETXlepOWcdxPQqi/4olXv5B9GEz5S9l5nZA==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
bootstrap "^4.5.0"
bootstrap-v4-rtl "4.4.1-2"
"@abp/clipboard@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-4.0.0-rc.5.tgz#66a62e7cd1cec2c4e94d606c9caa3290db7056f8"
integrity sha512-aGcNyWnYzpik8r2sElPuf4h+Bd3HFJscmP8fAbw43t877CqrXxKCt62cAjUM5aeF5fVvMIuw+/wPSmSY29Yy+Q==
"@abp/clipboard@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-4.0.0.tgz#4b01bead2e404c38a3ae9955dac5522d3c30c78b"
integrity sha512-39CZuF6lxUx1fluclzMl1uG0qIUX82S2wNbyJu2WGfuMMaaIgzSp9du/bB89Ik6rR5BFUU/3p8uvzOgy4sc2sQ==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
clipboard "^2.0.6"
"@abp/core@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/core/-/core-4.0.0-rc.5.tgz#3500839195c24f1275c55801037b02fd749516f7"
integrity sha512-Ubbej59+9z4FQWWCUSO3LphTmT8ZJQ/53cFcMOMIX/uoluli8IORBeAetTw4UDqG2rA70a5YKpyz17pG36D1kA==
"@abp/core@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/core/-/core-4.0.0.tgz#65e76c697e62162717e0edabf7edacc4228e682a"
integrity sha512-xcTTBFjLFZ9Trv2x9Y/c3XKezIx+x3MTXUD98QJPf1aR7T43TE/tLHRxdRfW3R8ka0O1wmlYshpkaw5pYNsj5w==
dependencies:
"@abp/utils" "^4.0.0-rc.5"
"@abp/utils" "^4.0.0"
"@abp/datatables.net-bs4@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-4.0.0-rc.5.tgz#00a9db6cd73bd1f6e5adaebe3add0f3192ed9b1d"
integrity sha512-Xvvm7j2UVgJfQRIPJ121vYH7upao22nqcFAxmeBFZ41Vgmt2gDkbXfvPHIAw06M0C2Gpym9shO+Sg4556xCubQ==
"@abp/datatables.net-bs4@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-4.0.0.tgz#fe737e054f6ba35e787a1cda185af2788ef86d39"
integrity sha512-mz7xZdzX1nlFyX7vNzB5w3RkqZ0IHrPgsXGOB7OCTKMRshDFVH2O51Oy4qoLDOXoTVeahHtR9v8thEWFR1SnZg==
dependencies:
"@abp/datatables.net" "~4.0.0-rc.5"
"@abp/datatables.net" "~4.0.0"
datatables.net-bs4 "^1.10.21"
"@abp/datatables.net@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-4.0.0-rc.5.tgz#ca581ca5b76a95702086b04da3f50b00b7da7973"
integrity sha512-xm7JQ/B9Opng1zai+cAILD6pl2Xlp54NMkfz7Y6U4DEYhzUAOT1idOVUhlCMtdE6RxVVqZGVozQZt7SZFZVImw==
"@abp/datatables.net@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-4.0.0.tgz#88ae5f1a6068fba55927e59f113686508e9553cb"
integrity sha512-JYTfMA1zlBNGiQHAiZiTj5ka6B6vq5k2jqsoLHup4pD9jpKwKRBGtltVsWoEnetd9eEbp4SaV/FCuh3RzmV6Pw==
dependencies:
"@abp/jquery" "~4.0.0-rc.5"
"@abp/jquery" "~4.0.0"
datatables.net "^1.10.21"
"@abp/font-awesome@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-4.0.0-rc.5.tgz#59a0516eb3c2d6f43a0a19a60f7c31fef4d421f4"
integrity sha512-VsmpC04epanCyZC6DVrDJz8FcupdU8/PpV9gnr7YvTk+VZQrq/zY9C21GWPDGKmBPavUlG4QMrX1oeUvu+9FoA==
"@abp/font-awesome@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-4.0.0.tgz#6e1e4bd1175a0b8d3b095e215c07e66ad0e42e19"
integrity sha512-kHfZ45UMDWSRk1gTV/BwVfSoXksJ9UlnD3SelTGeAkvbDqtDllqlp9y6c3qQcmZUE348Xl4hDTkU8upZwswCFQ==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
"@fortawesome/fontawesome-free" "^5.13.0"
"@abp/jquery-form@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-4.0.0-rc.5.tgz#91b90f4cb45bce584e33a74cc4366297fc4d4d40"
integrity sha512-5XrRF1xQMpZnAHYGDdpkLnYaAiKtWsmmHJ3aLxtg1QHnTuSKbasEtsOMVTqazkpiGcZsURcHNa4B/JUSK/KuBg==
"@abp/jquery-form@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-4.0.0.tgz#3afb41eb16d62e32c31a29c6a866f634a5a20cd8"
integrity sha512-cQq8PgzHfpK9/LxmjlnMsDn85wWvEOqjyLaepHFpTTt0341auSgXNwhp7rk71AUHD1lP3c9ALctmqu+gYmh9ag==
dependencies:
"@abp/jquery" "~4.0.0-rc.5"
"@abp/jquery" "~4.0.0"
jquery-form "^4.3.0"
"@abp/jquery-validation-unobtrusive@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-4.0.0-rc.5.tgz#f6c3320c9362bc70120dbdcce02cda814ec7c243"
integrity sha512-ftBxpeMLeRlaabPzU0wjDd4qvfgX38XtELnGjdQmTQ3P5lmAjhSTk1Fe8eIfGSINUAwYJyCjUlyYIMVi+kx9Tg==
"@abp/jquery-validation-unobtrusive@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-4.0.0.tgz#c3674d2b01b3c524de4c3fac1c6ae3657857ee7b"
integrity sha512-OGibIdw0ogjp6VQIebHM7OtMT36pjLKRrOHyCVpTmQ7NzDODV5ptG83vOnt5nFG0y9XFrOt8cnHrrd+K1Bpo/Q==
dependencies:
"@abp/jquery-validation" "~4.0.0-rc.5"
"@abp/jquery-validation" "~4.0.0"
jquery-validation-unobtrusive "^3.2.11"
"@abp/jquery-validation@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-4.0.0-rc.5.tgz#eb02731039b5befebf3666cb6cc1a7b54d5e9057"
integrity sha512-5LWBi+8Otch8SUCJA7DyKX7gD2Vy2aCODyPO5Y037lx7iUk/xHkhRnPDOVIGiS8fzyZx+fLNhJ6Lbfk9P+I5XA==
"@abp/jquery-validation@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-4.0.0.tgz#0a101937f89ff398317142b5271fa9a1de6571c2"
integrity sha512-4nzvhAktEINpQ2H+Hy7TOxxojTmTEm5dBTbHs1vbCWUuF0OTpouZWbMZDESdP0ZbjXcQ+vhwuM4e/pm/PeaHyQ==
dependencies:
"@abp/jquery" "~4.0.0-rc.5"
"@abp/jquery" "~4.0.0"
jquery-validation "^1.19.2"
"@abp/jquery@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-4.0.0-rc.5.tgz#244fbe71bb85abc1f54bfca269d9b0bfdf50469f"
integrity sha512-xt2gV3ZIMpyTFls2a58TTXEbhFxQGb7JacRojp5/+MyGL/SoQbOGENU3aK/fHRYD3VRUkhlKFGT6Ijv3LX83/A==
"@abp/jquery@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-4.0.0.tgz#00d24678b573bcc2fb14d8337ccdbf697b59d43b"
integrity sha512-gXLK97IvAZriNlG8e0qJcd7MvnpshJQURb4lg8VYibD7Fs/OBeHSAWM2Adgi3H9DnQL8XEUlWf487FSz4RC/Yg==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
jquery "~3.5.1"
"@abp/lodash@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-4.0.0-rc.5.tgz#f38dd3021d2b9877cf38fe812531968b7e607838"
integrity sha512-xdJ3WjqBz+C1gxrq1GcA66D1wrKn3QJ9/culTvEDr/eLpHjimnNjMmhAQqVxbaGk6qD6Q8Fswr8gtwqpPSe6eA==
"@abp/lodash@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-4.0.0.tgz#fe76d09517f6b1adf18edde94a31e13b003329dc"
integrity sha512-uitn5uYlb9xShRtV4AFOgp3lu2kADGMD4+a4fy5r4umlPM2uuMo0wMhzyYdBIG64JC5oNaqAzOwZyhhnn+HGJg==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
lodash "^4.17.15"
"@abp/luxon@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-4.0.0-rc.5.tgz#9448a48b6b3bf0446b421c2642188b9f11848572"
integrity sha512-S/lkCt/ou0Lv7KG3/XEAHx2S2YaDcEszyhnRBVCYSNqOUr0a56J+2MqKL5OFrOTNCfkPHDkaJVlSIXBEXokXFA==
"@abp/luxon@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-4.0.0.tgz#d9357e4fb422b6e18ebe897a86a4c4bc6fbe6858"
integrity sha512-tiE6NiSa4El88SVotxfmmpceINLz8MruaO/e/U3QjJEHjRoqlv0UBrM/x5Xz92c7ZIvL0Y4QvWNISeDg6/oqIQ==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
luxon "^1.24.1"
"@abp/malihu-custom-scrollbar-plugin@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-4.0.0-rc.5.tgz#87acd20de26e071bb38ec26fa4cd18026ca11464"
integrity sha512-QOp8R/LDabMhjapSjaArBEZUEslhOOGYIGfFm8CCrSeWGWJR8TFa68PIjhmUpNM5l8nlvC3MDMkQ/TnOaXgR4g==
"@abp/malihu-custom-scrollbar-plugin@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-4.0.0.tgz#972acf26f5eaa4bf9b8991cbe7c19fd0005d94e2"
integrity sha512-SpUo1CfppKzkE6Rb880pgB7oQ83Mkjsi0o6eE4r4gkF5hfzkuCXOmNjTYKfQIkE4n3G9QQd+8AAN/4xj4DiDrA==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
malihu-custom-scrollbar-plugin "^3.1.5"
"@abp/prismjs@^4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-4.0.0-rc.5.tgz#febe1f5bc1ce4234e681c7dd76e5274c23c636ed"
integrity sha512-h7lhlk1dKhhL75jc6YBKb+w24tbMi2QMAsGnexcxfgUU043a9VFZzzU6lg3najH+dQzcVl5/qh5w9KoC7EYMGA==
"@abp/prismjs@^4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-4.0.0.tgz#7b98c233ac1f0025c14b27c1ba62910bd9022442"
integrity sha512-Eh63EUe2wnl8P1iyPo9Glt9BD6yFdrAjIbvBeFheJnSWgvij3mayOtCAq9P2ksKWo1Gq3hv1lm/p9vdYFRHoKw==
dependencies:
"@abp/clipboard" "~4.0.0-rc.5"
"@abp/core" "~4.0.0-rc.5"
"@abp/clipboard" "~4.0.0"
"@abp/core" "~4.0.0"
prismjs "^1.20.0"
"@abp/select2@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-4.0.0-rc.5.tgz#a7cc1e2e1985693f673c8214ac7db21d79dee4b8"
integrity sha512-ZNwT8u0CPDrCO4y5kCWd2EGhihwc+R6aBxx8tzL0AUAuHYRVA68T49Exyd1Fa+jESRjoVn18hys6HnTCUzZkWQ==
"@abp/select2@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-4.0.0.tgz#8fdf4c5e18f4093ee4e073dab950cf7aa9b2a540"
integrity sha512-XeXahcDMczdkZdP07yhQriIvbi1N5meeSGTnFyZX+bNTGzUOarPcuNYZ6Mcl3351HcyESHzuJbKbsk3RB1kGeg==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
select2 "^4.0.13"
"@abp/sweetalert@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-4.0.0-rc.5.tgz#e360ed98fc242348eb881e0031e4bf921bd1065b"
integrity sha512-dCmKYbmUBvsh95VjOeAxBsEgDQSTYswbAOXfTe/1nTf7ABVxUouKY++TYjK9xOgrmUx2fXC/kpImiAKI/xsLEg==
"@abp/sweetalert@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-4.0.0.tgz#0d93e92e95c6855aef7e19532a7513a078ece216"
integrity sha512-y3XtZqnUVZuQohpRO1ImyBZXhtrm4H+typIL/9VgcnlvQjBTyIaiwDmU8j07Bb2rKJKe0prVkkVARO7OnjOS5A==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
sweetalert "^2.1.2"
"@abp/timeago@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-4.0.0-rc.5.tgz#f0dd1e85249dc737e8cfedba072677dd6727d16c"
integrity sha512-Nqq9Ok7odlp+ptmCDsdcz1/j68n6gZN8+jBHZt18hU4ox4awruDbSguK7Pn2qu8Vt5zfGtit0+nqKamlq+dr6A==
"@abp/timeago@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-4.0.0.tgz#509cd8a84cd94c2644824b0c3af10c8fff6de2dc"
integrity sha512-90jzLYJusYTPwMbak1+XkXE85OPOXPpysRbL28KQwl7WLNBm8wx6IEoVZOHvOrpYscYdyeWhZCgILSJ8DR3a2Q==
dependencies:
"@abp/jquery" "~4.0.0-rc.5"
"@abp/jquery" "~4.0.0"
timeago "^1.6.7"
"@abp/toastr@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-4.0.0-rc.5.tgz#7f39a71fca5665cbcf46f02a7df6030ddb0114c7"
integrity sha512-jS01uP0MZb4OWfBTH1UEXlTPYMjK5WqorE8WZ6Am+jKzwfHudCDFmjFfSX5PV2/Ia3CP9NU8mwygXLmtsHZbHw==
"@abp/toastr@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-4.0.0.tgz#06e28665cb7f6eefee3f69c985dd2b3f86cd7f1d"
integrity sha512-YL1fahVpDszhwpnRTN87GCP523Mkaw42ApT2A/hZuBdwRzP/u5GwRfng0i/uhdYXCMkTKuHmaHnRyqhGiv7nfQ==
dependencies:
"@abp/jquery" "~4.0.0-rc.5"
"@abp/jquery" "~4.0.0"
toastr "^2.1.4"
"@abp/utils@^4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-4.0.0-rc.5.tgz#45b55d6bbf69ad2a052bc2635c039d2cc4aac401"
integrity sha512-pRYUSh30VT4702lfnQCswIwLVqNC6ZFsmydXngwZASJEJVKj30XitSlixnKhocvozG/87H0sYVzvwmUyJiHHQw==
"@abp/utils@^4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-4.0.0.tgz#6c2b5f5c20821028fe6cdbffb5e2f6088956b9d5"
integrity sha512-Yj2yCObvS6X/P8rdRMQBo7940k5P/dZhgCUSo9C6P9GNmJY8wNdJFFyhRtaHuAyU5IBBBIY7+mMKOk5eQcbjWQ==
dependencies:
just-compare "^1.3.0"

@ -0,0 +1,49 @@
using Shouldly;
using Volo.Abp.AspNetCore.ExceptionHandling;
using Volo.Abp.Authorization;
using Volo.Abp.Localization;
using Xunit;
namespace Microsoft.AspNetCore.Authorization
{
public class AbpAuthorizationServiceExtensions_Tests : AuthorizationTestBase
{
private readonly IExceptionToErrorInfoConverter _exceptionToErrorInfoConverter;
public AbpAuthorizationServiceExtensions_Tests()
{
_exceptionToErrorInfoConverter = GetRequiredService<IExceptionToErrorInfoConverter>();
}
[Fact]
public void Test_AbpAuthorizationException_Localization()
{
using (CultureHelper.Use("zh-Hans"))
{
var exception = new AbpAuthorizationException(code: AbpAuthorizationErrorCodes.GivenPolicyHasNotGranted);
var errorInfo = _exceptionToErrorInfoConverter.Convert(exception, false);
errorInfo.Message.ShouldBe("授权失败! 提供的策略尚未授予.");
exception = new AbpAuthorizationException(code: AbpAuthorizationErrorCodes.GivenPolicyHasNotGrantedWithPolicyName)
.WithData("PolicyName", "my_policy_name");
errorInfo = _exceptionToErrorInfoConverter.Convert(exception, false);
errorInfo.Message.ShouldBe("授权失败! 提供的策略尚未授予: my_policy_name");
exception = new AbpAuthorizationException(code: AbpAuthorizationErrorCodes.GivenPolicyHasNotGrantedForGivenResource)
.WithData("ResourceName", "my_resource_name");
errorInfo = _exceptionToErrorInfoConverter.Convert(exception, false);
errorInfo.Message.ShouldBe("授权失败! 提供的策略未授予提供的资源: my_resource_name");
exception = new AbpAuthorizationException(code: AbpAuthorizationErrorCodes.GivenRequirementHasNotGrantedForGivenResource)
.WithData("ResourceName", "my_resource_name");
errorInfo = _exceptionToErrorInfoConverter.Convert(exception, false);
errorInfo.Message.ShouldBe("授权失败! 提供的要求未授予提供的资源: my_resource_name");
exception = new AbpAuthorizationException(code: AbpAuthorizationErrorCodes.GivenRequirementsHasNotGrantedForGivenResource)
.WithData("ResourceName", "my_resource_name");
errorInfo = _exceptionToErrorInfoConverter.Convert(exception, false);
errorInfo.Message.ShouldBe("授权失败! 提供的要求未授予提供的资源: my_resource_name");
}
}
}
}

@ -12,6 +12,7 @@
<ItemGroup>
<ProjectReference Include="..\..\src\Volo.Abp.Autofac\Volo.Abp.Autofac.csproj" />
<ProjectReference Include="..\..\src\Volo.Abp.ExceptionHandling\Volo.Abp.ExceptionHandling.csproj" />
<ProjectReference Include="..\AbpTestBase\AbpTestBase.csproj" />
<ProjectReference Include="..\..\src\Volo.Abp.Authorization\Volo.Abp.Authorization.csproj" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="$(MicrosoftNETTestSdkPackageVersion)" />

@ -2,12 +2,14 @@
using Volo.Abp.Authorization.TestServices;
using Volo.Abp.Autofac;
using Volo.Abp.DynamicProxy;
using Volo.Abp.ExceptionHandling;
using Volo.Abp.Modularity;
namespace Volo.Abp.Authorization
{
[DependsOn(typeof(AbpAutofacModule))]
[DependsOn(typeof(AbpAuthorizationModule))]
[DependsOn(typeof(AbpExceptionHandlingModule))]
public class AbpAuthorizationTestModule : AbpModule
{
public override void PreConfigureServices(ServiceConfigurationContext context)
@ -22,4 +24,4 @@ namespace Volo.Abp.Authorization
});
}
}
}
}

@ -9,6 +9,7 @@
<ItemGroup>
<ProjectReference Include="..\..\src\Volo.Abp.Autofac\Volo.Abp.Autofac.csproj" />
<ProjectReference Include="..\..\src\Volo.Abp.ExceptionHandling\Volo.Abp.ExceptionHandling.csproj" />
<ProjectReference Include="..\AbpTestBase\AbpTestBase.csproj" />
<ProjectReference Include="..\..\src\Volo.Abp.Features\Volo.Abp.Features.csproj" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="$(MicrosoftNETTestSdkPackageVersion)" />

@ -1,10 +1,12 @@
using Volo.Abp.Autofac;
using Volo.Abp.ExceptionHandling;
using Volo.Abp.Modularity;
namespace Volo.Abp.Features
{
[DependsOn(
typeof(AbpFeaturesModule),
typeof(AbpExceptionHandlingModule),
typeof(AbpTestBaseModule),
typeof(AbpAutofacModule)
)]
@ -12,7 +14,7 @@ namespace Volo.Abp.Features
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
}
}
}

@ -0,0 +1,40 @@
using Shouldly;
using Volo.Abp.AspNetCore.ExceptionHandling;
using Volo.Abp.Authorization;
using Volo.Abp.Localization;
using Xunit;
namespace Volo.Abp.Features
{
public class FeatureCheckerExtensions_Tests : FeatureTestBase
{
private readonly IExceptionToErrorInfoConverter _exceptionToErrorInfoConverter;
public FeatureCheckerExtensions_Tests()
{
_exceptionToErrorInfoConverter = GetRequiredService<IExceptionToErrorInfoConverter>();
}
[Fact]
public void Test_AbpAuthorizationException_Localization()
{
using (CultureHelper.Use("zh-Hans"))
{
var exception = new AbpAuthorizationException(code: AbpFeatureErrorCodes.FeatureIsNotEnabled)
.WithData("FeatureName", "my_feature_name");
var errorInfo = _exceptionToErrorInfoConverter.Convert(exception, false);
errorInfo.Message.ShouldBe("功能未启用: my_feature_name");
exception = new AbpAuthorizationException(code: AbpFeatureErrorCodes.AllOfTheseFeaturesMustBeEnabled)
.WithData("FeatureNames", "my_feature_name, my_feature_name2");
errorInfo = _exceptionToErrorInfoConverter.Convert(exception, false);
errorInfo.Message.ShouldBe("必要的功能未启用. 这些功能需要启用: my_feature_name, my_feature_name2");
exception = new AbpAuthorizationException(code: AbpFeatureErrorCodes.AtLeastOneOfTheseFeaturesMustBeEnabled)
.WithData("FeatureNames", "my_feature_name, my_feature_name2");
errorInfo = _exceptionToErrorInfoConverter.Convert(exception, false);
errorInfo.Message.ShouldBe("必要的功能未启用. 需要启用这些功能中的一项my_feature_name, my_feature_name2");
}
}
}
}

@ -3,7 +3,7 @@
"name": "volo.blogtestapp",
"private": true,
"dependencies": {
"@abp/aspnetcore.mvc.ui.theme.basic": "^4.0.0-rc.5",
"@abp/blogging": "^4.0.0-rc.5"
"@abp/aspnetcore.mvc.ui.theme.basic": "^4.0.0",
"@abp/blogging": "^4.0.0"
}
}

@ -2,37 +2,37 @@
# yarn lockfile v1
"@abp/aspnetcore.mvc.ui.theme.basic@^4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-4.0.0-rc.5.tgz#f57744513c443dd96b64a11376b67fabb0df821d"
integrity sha512-6P9nwq1RvAVtRl5NQq+R5QQIGflSbZMFdQTje4r7hDjhKlGLPQUBgWrYRP0TXkIbxz/fhBC9/Mg7lg3bmSH+uQ==
dependencies:
"@abp/aspnetcore.mvc.ui.theme.shared" "~4.0.0-rc.5"
"@abp/aspnetcore.mvc.ui.theme.shared@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-4.0.0-rc.5.tgz#ca73a54b7f328e7429ac639ce17526b72eab5581"
integrity sha512-GPc82OOz+MpSnTl46Wgeg53NYPI46jdy4/muragF6JR+3zBEo8tYe0jHP8T+LGtyGXdYoJ9Sx9274fRyxxh65Q==
dependencies:
"@abp/aspnetcore.mvc.ui" "~4.0.0-rc.5"
"@abp/bootstrap" "~4.0.0-rc.5"
"@abp/bootstrap-datepicker" "~4.0.0-rc.5"
"@abp/datatables.net-bs4" "~4.0.0-rc.5"
"@abp/font-awesome" "~4.0.0-rc.5"
"@abp/jquery-form" "~4.0.0-rc.5"
"@abp/jquery-validation-unobtrusive" "~4.0.0-rc.5"
"@abp/lodash" "~4.0.0-rc.5"
"@abp/luxon" "~4.0.0-rc.5"
"@abp/malihu-custom-scrollbar-plugin" "~4.0.0-rc.5"
"@abp/select2" "~4.0.0-rc.5"
"@abp/sweetalert" "~4.0.0-rc.5"
"@abp/timeago" "~4.0.0-rc.5"
"@abp/toastr" "~4.0.0-rc.5"
"@abp/aspnetcore.mvc.ui@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-4.0.0-rc.5.tgz#fa0dbc0b2f0a2c7777cdeb7613ec61307e6edd96"
integrity sha512-zEHA08snWGVL2Lm4ijpj/CnY1JxIg1ark3fxNsaKraVciVWbh5jmnBL8LCdKZFWZqEGCeWxrEnpt8OGIV+nhdg==
"@abp/aspnetcore.mvc.ui.theme.basic@^4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-4.0.0.tgz#b1822cf5bbc0f6eeb414ebd0877f6d1115a81fe7"
integrity sha512-yYXQkEnNhftzm+ZI8d3VFMlV5UuLNTMQQwV2eZ8tJfstUQrKV9bVd3+NdDOr3AkvcD8D7mvMFeBuoMYteL5kLQ==
dependencies:
"@abp/aspnetcore.mvc.ui.theme.shared" "~4.0.0"
"@abp/aspnetcore.mvc.ui.theme.shared@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-4.0.0.tgz#ba896056e9df5ac58e108df96996fbb2ca7a1a15"
integrity sha512-3RNn6VrNA+cqnPBoSbiCazN05cC2rhcRFMMxkEte+LImGbGOsxc4MflzHg5On1ExCGdqko8Axbw/ydy44Ak4Hw==
dependencies:
"@abp/aspnetcore.mvc.ui" "~4.0.0"
"@abp/bootstrap" "~4.0.0"
"@abp/bootstrap-datepicker" "~4.0.0"
"@abp/datatables.net-bs4" "~4.0.0"
"@abp/font-awesome" "~4.0.0"
"@abp/jquery-form" "~4.0.0"
"@abp/jquery-validation-unobtrusive" "~4.0.0"
"@abp/lodash" "~4.0.0"
"@abp/luxon" "~4.0.0"
"@abp/malihu-custom-scrollbar-plugin" "~4.0.0"
"@abp/select2" "~4.0.0"
"@abp/sweetalert" "~4.0.0"
"@abp/timeago" "~4.0.0"
"@abp/toastr" "~4.0.0"
"@abp/aspnetcore.mvc.ui@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-4.0.0.tgz#68502177a05f6ce7191a09b06a18c5b5dfab425d"
integrity sha512-tYHUWMwnwInrGSzC/OdN6bH/VHZEz5DP3rx2U6fcb0I5GvvRdQZxVgUvmWn6DeMA3PG10Gra4SfkhZqRQq9rjQ==
dependencies:
ansi-colors "^4.1.1"
extend-object "^1.0.0"
@ -43,214 +43,214 @@
micromatch "^4.0.2"
path "^0.12.7"
"@abp/blogging@^4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/blogging/-/blogging-4.0.0-rc.5.tgz#fb24809905eed5078387b3e7594f71f8ccaf46a9"
integrity sha512-jMxzCBjFAe/n9LgszgNkyCYLtYnLtXtuRMoJ78KH7xXOwpamXucuuG5PM0q4q9it72oMsMUrZ/vrdbgNLNL0ng==
"@abp/blogging@^4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/blogging/-/blogging-4.0.0.tgz#01c65e816b646b247ee7077ad5bc002528a83467"
integrity sha512-NWY0lzhITIUlq4tygadughJiH+Y6OIu70OphX/KqbQdo6A291qWRIeMSDGF8ZN5ui/tdliD24Wh2sHKN+kNEuw==
dependencies:
"@abp/aspnetcore.mvc.ui.theme.shared" "~4.0.0-rc.5"
"@abp/owl.carousel" "~4.0.0-rc.5"
"@abp/prismjs" "~4.0.0-rc.5"
"@abp/tui-editor" "~4.0.0-rc.5"
"@abp/aspnetcore.mvc.ui.theme.shared" "~4.0.0"
"@abp/owl.carousel" "~4.0.0"
"@abp/prismjs" "~4.0.0"
"@abp/tui-editor" "~4.0.0"
"@abp/bootstrap-datepicker@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-4.0.0-rc.5.tgz#38d665ba63dc9a0bb5fb8bfad50e7cac2fcdb8bf"
integrity sha512-nh+yJRn+CsnLd2VQelYcQbS49zP1LDSvczZrlCZUtiyAv400cBa1mC8tITxDnpAEBlICWb5s4Sg7kJXjyePsmw==
"@abp/bootstrap-datepicker@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-4.0.0.tgz#cdbd2c388c6d7ce8c6d72443038975063e6c6d02"
integrity sha512-hauH8VhpC8cxv1wCR6bVBcNqZepftdBXxEVID7TSAqgNyWjm/CrJqWLI+A0nnkG3IHoIm9D22iF47BamuYHptw==
dependencies:
bootstrap-datepicker "^1.9.0"
"@abp/bootstrap@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-4.0.0-rc.5.tgz#c49675030b2bde53a8b30249f38d85d4ae0aff49"
integrity sha512-eXJS1Eq2WyB9qKhyW/+9PUzZU5YNKe9q2Mt2nISwb0NmFepGiLkoygGQXtTe7yvyVdqrb6XM5pZHxdM0tRkYRQ==
"@abp/bootstrap@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-4.0.0.tgz#04174f18055f76f936e6fb73e5ff71ffa08a8528"
integrity sha512-Tmr0yoSWg7XHl02X5wv04CvYcL8KCpX8u6YGJj31jRZxUTeCvs5ETXlepOWcdxPQqi/4olXv5B9GEz5S9l5nZA==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
bootstrap "^4.5.0"
bootstrap-v4-rtl "4.4.1-2"
"@abp/clipboard@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-4.0.0-rc.5.tgz#66a62e7cd1cec2c4e94d606c9caa3290db7056f8"
integrity sha512-aGcNyWnYzpik8r2sElPuf4h+Bd3HFJscmP8fAbw43t877CqrXxKCt62cAjUM5aeF5fVvMIuw+/wPSmSY29Yy+Q==
"@abp/clipboard@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-4.0.0.tgz#4b01bead2e404c38a3ae9955dac5522d3c30c78b"
integrity sha512-39CZuF6lxUx1fluclzMl1uG0qIUX82S2wNbyJu2WGfuMMaaIgzSp9du/bB89Ik6rR5BFUU/3p8uvzOgy4sc2sQ==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
clipboard "^2.0.6"
"@abp/codemirror@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/codemirror/-/codemirror-4.0.0-rc.5.tgz#026c526d5cc3921c8a174eebd11ea84d27e06ab4"
integrity sha512-gz6C6MAKfCYz01VJr265xFjmkMBXZnzAD4odqwBZxLgN0tHy2Ex30ViU5GhG+4EcAxaEmWJjOxgMokWCk+E0UQ==
"@abp/codemirror@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/codemirror/-/codemirror-4.0.0.tgz#b122fe29eab8146e81b864bdca084b1beb1ebe61"
integrity sha512-s1yjkLOhMJklXsq7r6Ojgv2B1NM8VODz5ou/hjNqTTnZiVOVnKOdXJsRqU+5ctX1anJuUpD24SJd1KrKSAhKSQ==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
codemirror "^5.54.0"
"@abp/core@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/core/-/core-4.0.0-rc.5.tgz#3500839195c24f1275c55801037b02fd749516f7"
integrity sha512-Ubbej59+9z4FQWWCUSO3LphTmT8ZJQ/53cFcMOMIX/uoluli8IORBeAetTw4UDqG2rA70a5YKpyz17pG36D1kA==
"@abp/core@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/core/-/core-4.0.0.tgz#65e76c697e62162717e0edabf7edacc4228e682a"
integrity sha512-xcTTBFjLFZ9Trv2x9Y/c3XKezIx+x3MTXUD98QJPf1aR7T43TE/tLHRxdRfW3R8ka0O1wmlYshpkaw5pYNsj5w==
dependencies:
"@abp/utils" "^4.0.0-rc.5"
"@abp/utils" "^4.0.0"
"@abp/datatables.net-bs4@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-4.0.0-rc.5.tgz#00a9db6cd73bd1f6e5adaebe3add0f3192ed9b1d"
integrity sha512-Xvvm7j2UVgJfQRIPJ121vYH7upao22nqcFAxmeBFZ41Vgmt2gDkbXfvPHIAw06M0C2Gpym9shO+Sg4556xCubQ==
"@abp/datatables.net-bs4@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-4.0.0.tgz#fe737e054f6ba35e787a1cda185af2788ef86d39"
integrity sha512-mz7xZdzX1nlFyX7vNzB5w3RkqZ0IHrPgsXGOB7OCTKMRshDFVH2O51Oy4qoLDOXoTVeahHtR9v8thEWFR1SnZg==
dependencies:
"@abp/datatables.net" "~4.0.0-rc.5"
"@abp/datatables.net" "~4.0.0"
datatables.net-bs4 "^1.10.21"
"@abp/datatables.net@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-4.0.0-rc.5.tgz#ca581ca5b76a95702086b04da3f50b00b7da7973"
integrity sha512-xm7JQ/B9Opng1zai+cAILD6pl2Xlp54NMkfz7Y6U4DEYhzUAOT1idOVUhlCMtdE6RxVVqZGVozQZt7SZFZVImw==
"@abp/datatables.net@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-4.0.0.tgz#88ae5f1a6068fba55927e59f113686508e9553cb"
integrity sha512-JYTfMA1zlBNGiQHAiZiTj5ka6B6vq5k2jqsoLHup4pD9jpKwKRBGtltVsWoEnetd9eEbp4SaV/FCuh3RzmV6Pw==
dependencies:
"@abp/jquery" "~4.0.0-rc.5"
"@abp/jquery" "~4.0.0"
datatables.net "^1.10.21"
"@abp/font-awesome@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-4.0.0-rc.5.tgz#59a0516eb3c2d6f43a0a19a60f7c31fef4d421f4"
integrity sha512-VsmpC04epanCyZC6DVrDJz8FcupdU8/PpV9gnr7YvTk+VZQrq/zY9C21GWPDGKmBPavUlG4QMrX1oeUvu+9FoA==
"@abp/font-awesome@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-4.0.0.tgz#6e1e4bd1175a0b8d3b095e215c07e66ad0e42e19"
integrity sha512-kHfZ45UMDWSRk1gTV/BwVfSoXksJ9UlnD3SelTGeAkvbDqtDllqlp9y6c3qQcmZUE348Xl4hDTkU8upZwswCFQ==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
"@fortawesome/fontawesome-free" "^5.13.0"
"@abp/highlight.js@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/highlight.js/-/highlight.js-4.0.0-rc.5.tgz#30957d40f58d7254e43231ecfb89b11f0eaf85cb"
integrity sha512-6pLhzYChzyNc8x3QGSBJcz6EbBFVG4AddcJQAEvp/BmnkfVwb8av++Y3I1a3Pc/6GhSuKhy5QCnFoQQzrtHXwA==
"@abp/highlight.js@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/highlight.js/-/highlight.js-4.0.0.tgz#109a7e21805c4545a677c5b41f09ee31fc5cf08a"
integrity sha512-VjlZniAnjxSRBcUoLG3hUXMTuODIjEqUZRbre3EEvr1pmkFASQyHhVEbyXR7LJOcBJ1NAtePYPPyXU8omrqOZg==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
"@abp/jquery-form@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-4.0.0-rc.5.tgz#91b90f4cb45bce584e33a74cc4366297fc4d4d40"
integrity sha512-5XrRF1xQMpZnAHYGDdpkLnYaAiKtWsmmHJ3aLxtg1QHnTuSKbasEtsOMVTqazkpiGcZsURcHNa4B/JUSK/KuBg==
"@abp/jquery-form@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-4.0.0.tgz#3afb41eb16d62e32c31a29c6a866f634a5a20cd8"
integrity sha512-cQq8PgzHfpK9/LxmjlnMsDn85wWvEOqjyLaepHFpTTt0341auSgXNwhp7rk71AUHD1lP3c9ALctmqu+gYmh9ag==
dependencies:
"@abp/jquery" "~4.0.0-rc.5"
"@abp/jquery" "~4.0.0"
jquery-form "^4.3.0"
"@abp/jquery-validation-unobtrusive@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-4.0.0-rc.5.tgz#f6c3320c9362bc70120dbdcce02cda814ec7c243"
integrity sha512-ftBxpeMLeRlaabPzU0wjDd4qvfgX38XtELnGjdQmTQ3P5lmAjhSTk1Fe8eIfGSINUAwYJyCjUlyYIMVi+kx9Tg==
"@abp/jquery-validation-unobtrusive@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-4.0.0.tgz#c3674d2b01b3c524de4c3fac1c6ae3657857ee7b"
integrity sha512-OGibIdw0ogjp6VQIebHM7OtMT36pjLKRrOHyCVpTmQ7NzDODV5ptG83vOnt5nFG0y9XFrOt8cnHrrd+K1Bpo/Q==
dependencies:
"@abp/jquery-validation" "~4.0.0-rc.5"
"@abp/jquery-validation" "~4.0.0"
jquery-validation-unobtrusive "^3.2.11"
"@abp/jquery-validation@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-4.0.0-rc.5.tgz#eb02731039b5befebf3666cb6cc1a7b54d5e9057"
integrity sha512-5LWBi+8Otch8SUCJA7DyKX7gD2Vy2aCODyPO5Y037lx7iUk/xHkhRnPDOVIGiS8fzyZx+fLNhJ6Lbfk9P+I5XA==
"@abp/jquery-validation@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-4.0.0.tgz#0a101937f89ff398317142b5271fa9a1de6571c2"
integrity sha512-4nzvhAktEINpQ2H+Hy7TOxxojTmTEm5dBTbHs1vbCWUuF0OTpouZWbMZDESdP0ZbjXcQ+vhwuM4e/pm/PeaHyQ==
dependencies:
"@abp/jquery" "~4.0.0-rc.5"
"@abp/jquery" "~4.0.0"
jquery-validation "^1.19.2"
"@abp/jquery@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-4.0.0-rc.5.tgz#244fbe71bb85abc1f54bfca269d9b0bfdf50469f"
integrity sha512-xt2gV3ZIMpyTFls2a58TTXEbhFxQGb7JacRojp5/+MyGL/SoQbOGENU3aK/fHRYD3VRUkhlKFGT6Ijv3LX83/A==
"@abp/jquery@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-4.0.0.tgz#00d24678b573bcc2fb14d8337ccdbf697b59d43b"
integrity sha512-gXLK97IvAZriNlG8e0qJcd7MvnpshJQURb4lg8VYibD7Fs/OBeHSAWM2Adgi3H9DnQL8XEUlWf487FSz4RC/Yg==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
jquery "~3.5.1"
"@abp/lodash@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-4.0.0-rc.5.tgz#f38dd3021d2b9877cf38fe812531968b7e607838"
integrity sha512-xdJ3WjqBz+C1gxrq1GcA66D1wrKn3QJ9/culTvEDr/eLpHjimnNjMmhAQqVxbaGk6qD6Q8Fswr8gtwqpPSe6eA==
"@abp/lodash@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-4.0.0.tgz#fe76d09517f6b1adf18edde94a31e13b003329dc"
integrity sha512-uitn5uYlb9xShRtV4AFOgp3lu2kADGMD4+a4fy5r4umlPM2uuMo0wMhzyYdBIG64JC5oNaqAzOwZyhhnn+HGJg==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
lodash "^4.17.15"
"@abp/luxon@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-4.0.0-rc.5.tgz#9448a48b6b3bf0446b421c2642188b9f11848572"
integrity sha512-S/lkCt/ou0Lv7KG3/XEAHx2S2YaDcEszyhnRBVCYSNqOUr0a56J+2MqKL5OFrOTNCfkPHDkaJVlSIXBEXokXFA==
"@abp/luxon@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-4.0.0.tgz#d9357e4fb422b6e18ebe897a86a4c4bc6fbe6858"
integrity sha512-tiE6NiSa4El88SVotxfmmpceINLz8MruaO/e/U3QjJEHjRoqlv0UBrM/x5Xz92c7ZIvL0Y4QvWNISeDg6/oqIQ==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
luxon "^1.24.1"
"@abp/malihu-custom-scrollbar-plugin@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-4.0.0-rc.5.tgz#87acd20de26e071bb38ec26fa4cd18026ca11464"
integrity sha512-QOp8R/LDabMhjapSjaArBEZUEslhOOGYIGfFm8CCrSeWGWJR8TFa68PIjhmUpNM5l8nlvC3MDMkQ/TnOaXgR4g==
"@abp/malihu-custom-scrollbar-plugin@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-4.0.0.tgz#972acf26f5eaa4bf9b8991cbe7c19fd0005d94e2"
integrity sha512-SpUo1CfppKzkE6Rb880pgB7oQ83Mkjsi0o6eE4r4gkF5hfzkuCXOmNjTYKfQIkE4n3G9QQd+8AAN/4xj4DiDrA==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
malihu-custom-scrollbar-plugin "^3.1.5"
"@abp/markdown-it@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/markdown-it/-/markdown-it-4.0.0-rc.5.tgz#dbc5aeaea6912604b9edf06569eefe04d84b61ba"
integrity sha512-IsqvtDjx0RxZFjtlzPb7Z2mpi+Cq2qpEBPuZPYR9yJbGshzco0j+GdM0Kd+ezeBAHQ40zyrL7Q0cAuT9zORN+A==
"@abp/markdown-it@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/markdown-it/-/markdown-it-4.0.0.tgz#abb2745871212bf5980f014324d1f175c9bf8ae0"
integrity sha512-lb7/WiagsJjDCq1lIiWI0pdl6o4EzuNMD1/Xa2p3n34jLx5x4cPhTthwHCkYqedJ22CiCV7Aevh8X2vt/b9aDw==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
markdown-it "^11.0.0"
"@abp/owl.carousel@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/owl.carousel/-/owl.carousel-4.0.0-rc.5.tgz#6669fd0671f276e629ac0ddcada76bd1661ef57b"
integrity sha512-3xG+JGygdQ2L30yqvzJSv53FGlj6jS5pjEb3shypo95NvcxZ5PrySVBG25wY7Q5IMo7+vZcBqf3/ffVBusAeCw==
"@abp/owl.carousel@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/owl.carousel/-/owl.carousel-4.0.0.tgz#5f95ae6e8e57b4c93dfa45552d1786af4ab32bda"
integrity sha512-C+gaH+X0H8UXASPUlotq58Ygv2ER3d/ARUj8mN78dscIOXHzr9SIQCTuvvLJF2YZeGhkF/aCUHy+VwiIBlDqvQ==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
owl.carousel "^2.3.4"
"@abp/prismjs@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-4.0.0-rc.5.tgz#febe1f5bc1ce4234e681c7dd76e5274c23c636ed"
integrity sha512-h7lhlk1dKhhL75jc6YBKb+w24tbMi2QMAsGnexcxfgUU043a9VFZzzU6lg3najH+dQzcVl5/qh5w9KoC7EYMGA==
"@abp/prismjs@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-4.0.0.tgz#7b98c233ac1f0025c14b27c1ba62910bd9022442"
integrity sha512-Eh63EUe2wnl8P1iyPo9Glt9BD6yFdrAjIbvBeFheJnSWgvij3mayOtCAq9P2ksKWo1Gq3hv1lm/p9vdYFRHoKw==
dependencies:
"@abp/clipboard" "~4.0.0-rc.5"
"@abp/core" "~4.0.0-rc.5"
"@abp/clipboard" "~4.0.0"
"@abp/core" "~4.0.0"
prismjs "^1.20.0"
"@abp/select2@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-4.0.0-rc.5.tgz#a7cc1e2e1985693f673c8214ac7db21d79dee4b8"
integrity sha512-ZNwT8u0CPDrCO4y5kCWd2EGhihwc+R6aBxx8tzL0AUAuHYRVA68T49Exyd1Fa+jESRjoVn18hys6HnTCUzZkWQ==
"@abp/select2@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-4.0.0.tgz#8fdf4c5e18f4093ee4e073dab950cf7aa9b2a540"
integrity sha512-XeXahcDMczdkZdP07yhQriIvbi1N5meeSGTnFyZX+bNTGzUOarPcuNYZ6Mcl3351HcyESHzuJbKbsk3RB1kGeg==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
select2 "^4.0.13"
"@abp/sweetalert@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-4.0.0-rc.5.tgz#e360ed98fc242348eb881e0031e4bf921bd1065b"
integrity sha512-dCmKYbmUBvsh95VjOeAxBsEgDQSTYswbAOXfTe/1nTf7ABVxUouKY++TYjK9xOgrmUx2fXC/kpImiAKI/xsLEg==
"@abp/sweetalert@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-4.0.0.tgz#0d93e92e95c6855aef7e19532a7513a078ece216"
integrity sha512-y3XtZqnUVZuQohpRO1ImyBZXhtrm4H+typIL/9VgcnlvQjBTyIaiwDmU8j07Bb2rKJKe0prVkkVARO7OnjOS5A==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
sweetalert "^2.1.2"
"@abp/timeago@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-4.0.0-rc.5.tgz#f0dd1e85249dc737e8cfedba072677dd6727d16c"
integrity sha512-Nqq9Ok7odlp+ptmCDsdcz1/j68n6gZN8+jBHZt18hU4ox4awruDbSguK7Pn2qu8Vt5zfGtit0+nqKamlq+dr6A==
"@abp/timeago@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-4.0.0.tgz#509cd8a84cd94c2644824b0c3af10c8fff6de2dc"
integrity sha512-90jzLYJusYTPwMbak1+XkXE85OPOXPpysRbL28KQwl7WLNBm8wx6IEoVZOHvOrpYscYdyeWhZCgILSJ8DR3a2Q==
dependencies:
"@abp/jquery" "~4.0.0-rc.5"
"@abp/jquery" "~4.0.0"
timeago "^1.6.7"
"@abp/toastr@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-4.0.0-rc.5.tgz#7f39a71fca5665cbcf46f02a7df6030ddb0114c7"
integrity sha512-jS01uP0MZb4OWfBTH1UEXlTPYMjK5WqorE8WZ6Am+jKzwfHudCDFmjFfSX5PV2/Ia3CP9NU8mwygXLmtsHZbHw==
"@abp/toastr@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-4.0.0.tgz#06e28665cb7f6eefee3f69c985dd2b3f86cd7f1d"
integrity sha512-YL1fahVpDszhwpnRTN87GCP523Mkaw42ApT2A/hZuBdwRzP/u5GwRfng0i/uhdYXCMkTKuHmaHnRyqhGiv7nfQ==
dependencies:
"@abp/jquery" "~4.0.0-rc.5"
"@abp/jquery" "~4.0.0"
toastr "^2.1.4"
"@abp/tui-editor@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/tui-editor/-/tui-editor-4.0.0-rc.5.tgz#769101cc903826b8104c63d8371126289caf3e4f"
integrity sha512-oqn8EjMWSoyYFJX5wgFKz3SNV2+CaUSIBqy/c59ETFKx2azwTuuM2BwGM4l0seapEGoW8P/a4OyNrwruKLGYsA==
"@abp/tui-editor@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/tui-editor/-/tui-editor-4.0.0.tgz#dff89b1993a89115fef34bd2247e9939a2d3942f"
integrity sha512-Q09e2AX9PhzmoZFVw69RyuiZxE7TVLGYcM0RS4PxBYccFME+VPfG5D3/SfqMr+OwroI4iqh+tIgVyS8uyo/r0A==
dependencies:
"@abp/codemirror" "~4.0.0-rc.5"
"@abp/highlight.js" "~4.0.0-rc.5"
"@abp/jquery" "~4.0.0-rc.5"
"@abp/markdown-it" "~4.0.0-rc.5"
"@abp/codemirror" "~4.0.0"
"@abp/highlight.js" "~4.0.0"
"@abp/jquery" "~4.0.0"
"@abp/markdown-it" "~4.0.0"
tui-editor "^1.4.10"
"@abp/utils@^4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-4.0.0-rc.5.tgz#45b55d6bbf69ad2a052bc2635c039d2cc4aac401"
integrity sha512-pRYUSh30VT4702lfnQCswIwLVqNC6ZFsmydXngwZASJEJVKj30XitSlixnKhocvozG/87H0sYVzvwmUyJiHHQw==
"@abp/utils@^4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-4.0.0.tgz#6c2b5f5c20821028fe6cdbffb5e2f6088956b9d5"
integrity sha512-Yj2yCObvS6X/P8rdRMQBo7940k5P/dZhgCUSo9C6P9GNmJY8wNdJFFyhRtaHuAyU5IBBBIY7+mMKOk5eQcbjWQ==
dependencies:
just-compare "^1.3.0"

@ -10,11 +10,11 @@ namespace Volo.Blogging.Admin
{
if (context.Menu.Name == StandardMenus.Main)
{
await ConfigureMainMenu(context);
await ConfigureMainMenuAsync(context);
}
}
private async Task ConfigureMainMenu(MenuConfigurationContext context)
private async Task ConfigureMainMenuAsync(MenuConfigurationContext context)
{
var l = context.GetLocalizer<BloggingResource>();

@ -3,6 +3,6 @@
"name": "client-simulation-web",
"private": true,
"dependencies": {
"@abp/aspnetcore.mvc.ui.theme.basic": "^4.0.0-rc.5"
"@abp/aspnetcore.mvc.ui.theme.basic": "^4.0.0"
}
}

@ -2,37 +2,37 @@
# yarn lockfile v1
"@abp/aspnetcore.mvc.ui.theme.basic@^4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-4.0.0-rc.5.tgz#f57744513c443dd96b64a11376b67fabb0df821d"
integrity sha512-6P9nwq1RvAVtRl5NQq+R5QQIGflSbZMFdQTje4r7hDjhKlGLPQUBgWrYRP0TXkIbxz/fhBC9/Mg7lg3bmSH+uQ==
dependencies:
"@abp/aspnetcore.mvc.ui.theme.shared" "~4.0.0-rc.5"
"@abp/aspnetcore.mvc.ui.theme.shared@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-4.0.0-rc.5.tgz#ca73a54b7f328e7429ac639ce17526b72eab5581"
integrity sha512-GPc82OOz+MpSnTl46Wgeg53NYPI46jdy4/muragF6JR+3zBEo8tYe0jHP8T+LGtyGXdYoJ9Sx9274fRyxxh65Q==
dependencies:
"@abp/aspnetcore.mvc.ui" "~4.0.0-rc.5"
"@abp/bootstrap" "~4.0.0-rc.5"
"@abp/bootstrap-datepicker" "~4.0.0-rc.5"
"@abp/datatables.net-bs4" "~4.0.0-rc.5"
"@abp/font-awesome" "~4.0.0-rc.5"
"@abp/jquery-form" "~4.0.0-rc.5"
"@abp/jquery-validation-unobtrusive" "~4.0.0-rc.5"
"@abp/lodash" "~4.0.0-rc.5"
"@abp/luxon" "~4.0.0-rc.5"
"@abp/malihu-custom-scrollbar-plugin" "~4.0.0-rc.5"
"@abp/select2" "~4.0.0-rc.5"
"@abp/sweetalert" "~4.0.0-rc.5"
"@abp/timeago" "~4.0.0-rc.5"
"@abp/toastr" "~4.0.0-rc.5"
"@abp/aspnetcore.mvc.ui@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-4.0.0-rc.5.tgz#fa0dbc0b2f0a2c7777cdeb7613ec61307e6edd96"
integrity sha512-zEHA08snWGVL2Lm4ijpj/CnY1JxIg1ark3fxNsaKraVciVWbh5jmnBL8LCdKZFWZqEGCeWxrEnpt8OGIV+nhdg==
"@abp/aspnetcore.mvc.ui.theme.basic@^4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-4.0.0.tgz#b1822cf5bbc0f6eeb414ebd0877f6d1115a81fe7"
integrity sha512-yYXQkEnNhftzm+ZI8d3VFMlV5UuLNTMQQwV2eZ8tJfstUQrKV9bVd3+NdDOr3AkvcD8D7mvMFeBuoMYteL5kLQ==
dependencies:
"@abp/aspnetcore.mvc.ui.theme.shared" "~4.0.0"
"@abp/aspnetcore.mvc.ui.theme.shared@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-4.0.0.tgz#ba896056e9df5ac58e108df96996fbb2ca7a1a15"
integrity sha512-3RNn6VrNA+cqnPBoSbiCazN05cC2rhcRFMMxkEte+LImGbGOsxc4MflzHg5On1ExCGdqko8Axbw/ydy44Ak4Hw==
dependencies:
"@abp/aspnetcore.mvc.ui" "~4.0.0"
"@abp/bootstrap" "~4.0.0"
"@abp/bootstrap-datepicker" "~4.0.0"
"@abp/datatables.net-bs4" "~4.0.0"
"@abp/font-awesome" "~4.0.0"
"@abp/jquery-form" "~4.0.0"
"@abp/jquery-validation-unobtrusive" "~4.0.0"
"@abp/lodash" "~4.0.0"
"@abp/luxon" "~4.0.0"
"@abp/malihu-custom-scrollbar-plugin" "~4.0.0"
"@abp/select2" "~4.0.0"
"@abp/sweetalert" "~4.0.0"
"@abp/timeago" "~4.0.0"
"@abp/toastr" "~4.0.0"
"@abp/aspnetcore.mvc.ui@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-4.0.0.tgz#68502177a05f6ce7191a09b06a18c5b5dfab425d"
integrity sha512-tYHUWMwnwInrGSzC/OdN6bH/VHZEz5DP3rx2U6fcb0I5GvvRdQZxVgUvmWn6DeMA3PG10Gra4SfkhZqRQq9rjQ==
dependencies:
ansi-colors "^4.1.1"
extend-object "^1.0.0"
@ -43,145 +43,145 @@
micromatch "^4.0.2"
path "^0.12.7"
"@abp/bootstrap-datepicker@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-4.0.0-rc.5.tgz#38d665ba63dc9a0bb5fb8bfad50e7cac2fcdb8bf"
integrity sha512-nh+yJRn+CsnLd2VQelYcQbS49zP1LDSvczZrlCZUtiyAv400cBa1mC8tITxDnpAEBlICWb5s4Sg7kJXjyePsmw==
"@abp/bootstrap-datepicker@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-4.0.0.tgz#cdbd2c388c6d7ce8c6d72443038975063e6c6d02"
integrity sha512-hauH8VhpC8cxv1wCR6bVBcNqZepftdBXxEVID7TSAqgNyWjm/CrJqWLI+A0nnkG3IHoIm9D22iF47BamuYHptw==
dependencies:
bootstrap-datepicker "^1.9.0"
"@abp/bootstrap@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-4.0.0-rc.5.tgz#c49675030b2bde53a8b30249f38d85d4ae0aff49"
integrity sha512-eXJS1Eq2WyB9qKhyW/+9PUzZU5YNKe9q2Mt2nISwb0NmFepGiLkoygGQXtTe7yvyVdqrb6XM5pZHxdM0tRkYRQ==
"@abp/bootstrap@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-4.0.0.tgz#04174f18055f76f936e6fb73e5ff71ffa08a8528"
integrity sha512-Tmr0yoSWg7XHl02X5wv04CvYcL8KCpX8u6YGJj31jRZxUTeCvs5ETXlepOWcdxPQqi/4olXv5B9GEz5S9l5nZA==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
bootstrap "^4.5.0"
bootstrap-v4-rtl "4.4.1-2"
"@abp/core@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/core/-/core-4.0.0-rc.5.tgz#3500839195c24f1275c55801037b02fd749516f7"
integrity sha512-Ubbej59+9z4FQWWCUSO3LphTmT8ZJQ/53cFcMOMIX/uoluli8IORBeAetTw4UDqG2rA70a5YKpyz17pG36D1kA==
"@abp/core@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/core/-/core-4.0.0.tgz#65e76c697e62162717e0edabf7edacc4228e682a"
integrity sha512-xcTTBFjLFZ9Trv2x9Y/c3XKezIx+x3MTXUD98QJPf1aR7T43TE/tLHRxdRfW3R8ka0O1wmlYshpkaw5pYNsj5w==
dependencies:
"@abp/utils" "^4.0.0-rc.5"
"@abp/utils" "^4.0.0"
"@abp/datatables.net-bs4@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-4.0.0-rc.5.tgz#00a9db6cd73bd1f6e5adaebe3add0f3192ed9b1d"
integrity sha512-Xvvm7j2UVgJfQRIPJ121vYH7upao22nqcFAxmeBFZ41Vgmt2gDkbXfvPHIAw06M0C2Gpym9shO+Sg4556xCubQ==
"@abp/datatables.net-bs4@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-4.0.0.tgz#fe737e054f6ba35e787a1cda185af2788ef86d39"
integrity sha512-mz7xZdzX1nlFyX7vNzB5w3RkqZ0IHrPgsXGOB7OCTKMRshDFVH2O51Oy4qoLDOXoTVeahHtR9v8thEWFR1SnZg==
dependencies:
"@abp/datatables.net" "~4.0.0-rc.5"
"@abp/datatables.net" "~4.0.0"
datatables.net-bs4 "^1.10.21"
"@abp/datatables.net@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-4.0.0-rc.5.tgz#ca581ca5b76a95702086b04da3f50b00b7da7973"
integrity sha512-xm7JQ/B9Opng1zai+cAILD6pl2Xlp54NMkfz7Y6U4DEYhzUAOT1idOVUhlCMtdE6RxVVqZGVozQZt7SZFZVImw==
"@abp/datatables.net@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-4.0.0.tgz#88ae5f1a6068fba55927e59f113686508e9553cb"
integrity sha512-JYTfMA1zlBNGiQHAiZiTj5ka6B6vq5k2jqsoLHup4pD9jpKwKRBGtltVsWoEnetd9eEbp4SaV/FCuh3RzmV6Pw==
dependencies:
"@abp/jquery" "~4.0.0-rc.5"
"@abp/jquery" "~4.0.0"
datatables.net "^1.10.21"
"@abp/font-awesome@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-4.0.0-rc.5.tgz#59a0516eb3c2d6f43a0a19a60f7c31fef4d421f4"
integrity sha512-VsmpC04epanCyZC6DVrDJz8FcupdU8/PpV9gnr7YvTk+VZQrq/zY9C21GWPDGKmBPavUlG4QMrX1oeUvu+9FoA==
"@abp/font-awesome@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-4.0.0.tgz#6e1e4bd1175a0b8d3b095e215c07e66ad0e42e19"
integrity sha512-kHfZ45UMDWSRk1gTV/BwVfSoXksJ9UlnD3SelTGeAkvbDqtDllqlp9y6c3qQcmZUE348Xl4hDTkU8upZwswCFQ==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
"@fortawesome/fontawesome-free" "^5.13.0"
"@abp/jquery-form@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-4.0.0-rc.5.tgz#91b90f4cb45bce584e33a74cc4366297fc4d4d40"
integrity sha512-5XrRF1xQMpZnAHYGDdpkLnYaAiKtWsmmHJ3aLxtg1QHnTuSKbasEtsOMVTqazkpiGcZsURcHNa4B/JUSK/KuBg==
"@abp/jquery-form@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-4.0.0.tgz#3afb41eb16d62e32c31a29c6a866f634a5a20cd8"
integrity sha512-cQq8PgzHfpK9/LxmjlnMsDn85wWvEOqjyLaepHFpTTt0341auSgXNwhp7rk71AUHD1lP3c9ALctmqu+gYmh9ag==
dependencies:
"@abp/jquery" "~4.0.0-rc.5"
"@abp/jquery" "~4.0.0"
jquery-form "^4.3.0"
"@abp/jquery-validation-unobtrusive@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-4.0.0-rc.5.tgz#f6c3320c9362bc70120dbdcce02cda814ec7c243"
integrity sha512-ftBxpeMLeRlaabPzU0wjDd4qvfgX38XtELnGjdQmTQ3P5lmAjhSTk1Fe8eIfGSINUAwYJyCjUlyYIMVi+kx9Tg==
"@abp/jquery-validation-unobtrusive@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-4.0.0.tgz#c3674d2b01b3c524de4c3fac1c6ae3657857ee7b"
integrity sha512-OGibIdw0ogjp6VQIebHM7OtMT36pjLKRrOHyCVpTmQ7NzDODV5ptG83vOnt5nFG0y9XFrOt8cnHrrd+K1Bpo/Q==
dependencies:
"@abp/jquery-validation" "~4.0.0-rc.5"
"@abp/jquery-validation" "~4.0.0"
jquery-validation-unobtrusive "^3.2.11"
"@abp/jquery-validation@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-4.0.0-rc.5.tgz#eb02731039b5befebf3666cb6cc1a7b54d5e9057"
integrity sha512-5LWBi+8Otch8SUCJA7DyKX7gD2Vy2aCODyPO5Y037lx7iUk/xHkhRnPDOVIGiS8fzyZx+fLNhJ6Lbfk9P+I5XA==
"@abp/jquery-validation@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-4.0.0.tgz#0a101937f89ff398317142b5271fa9a1de6571c2"
integrity sha512-4nzvhAktEINpQ2H+Hy7TOxxojTmTEm5dBTbHs1vbCWUuF0OTpouZWbMZDESdP0ZbjXcQ+vhwuM4e/pm/PeaHyQ==
dependencies:
"@abp/jquery" "~4.0.0-rc.5"
"@abp/jquery" "~4.0.0"
jquery-validation "^1.19.2"
"@abp/jquery@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-4.0.0-rc.5.tgz#244fbe71bb85abc1f54bfca269d9b0bfdf50469f"
integrity sha512-xt2gV3ZIMpyTFls2a58TTXEbhFxQGb7JacRojp5/+MyGL/SoQbOGENU3aK/fHRYD3VRUkhlKFGT6Ijv3LX83/A==
"@abp/jquery@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-4.0.0.tgz#00d24678b573bcc2fb14d8337ccdbf697b59d43b"
integrity sha512-gXLK97IvAZriNlG8e0qJcd7MvnpshJQURb4lg8VYibD7Fs/OBeHSAWM2Adgi3H9DnQL8XEUlWf487FSz4RC/Yg==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
jquery "~3.5.1"
"@abp/lodash@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-4.0.0-rc.5.tgz#f38dd3021d2b9877cf38fe812531968b7e607838"
integrity sha512-xdJ3WjqBz+C1gxrq1GcA66D1wrKn3QJ9/culTvEDr/eLpHjimnNjMmhAQqVxbaGk6qD6Q8Fswr8gtwqpPSe6eA==
"@abp/lodash@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-4.0.0.tgz#fe76d09517f6b1adf18edde94a31e13b003329dc"
integrity sha512-uitn5uYlb9xShRtV4AFOgp3lu2kADGMD4+a4fy5r4umlPM2uuMo0wMhzyYdBIG64JC5oNaqAzOwZyhhnn+HGJg==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
lodash "^4.17.15"
"@abp/luxon@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-4.0.0-rc.5.tgz#9448a48b6b3bf0446b421c2642188b9f11848572"
integrity sha512-S/lkCt/ou0Lv7KG3/XEAHx2S2YaDcEszyhnRBVCYSNqOUr0a56J+2MqKL5OFrOTNCfkPHDkaJVlSIXBEXokXFA==
"@abp/luxon@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-4.0.0.tgz#d9357e4fb422b6e18ebe897a86a4c4bc6fbe6858"
integrity sha512-tiE6NiSa4El88SVotxfmmpceINLz8MruaO/e/U3QjJEHjRoqlv0UBrM/x5Xz92c7ZIvL0Y4QvWNISeDg6/oqIQ==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
luxon "^1.24.1"
"@abp/malihu-custom-scrollbar-plugin@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-4.0.0-rc.5.tgz#87acd20de26e071bb38ec26fa4cd18026ca11464"
integrity sha512-QOp8R/LDabMhjapSjaArBEZUEslhOOGYIGfFm8CCrSeWGWJR8TFa68PIjhmUpNM5l8nlvC3MDMkQ/TnOaXgR4g==
"@abp/malihu-custom-scrollbar-plugin@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-4.0.0.tgz#972acf26f5eaa4bf9b8991cbe7c19fd0005d94e2"
integrity sha512-SpUo1CfppKzkE6Rb880pgB7oQ83Mkjsi0o6eE4r4gkF5hfzkuCXOmNjTYKfQIkE4n3G9QQd+8AAN/4xj4DiDrA==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
malihu-custom-scrollbar-plugin "^3.1.5"
"@abp/select2@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-4.0.0-rc.5.tgz#a7cc1e2e1985693f673c8214ac7db21d79dee4b8"
integrity sha512-ZNwT8u0CPDrCO4y5kCWd2EGhihwc+R6aBxx8tzL0AUAuHYRVA68T49Exyd1Fa+jESRjoVn18hys6HnTCUzZkWQ==
"@abp/select2@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-4.0.0.tgz#8fdf4c5e18f4093ee4e073dab950cf7aa9b2a540"
integrity sha512-XeXahcDMczdkZdP07yhQriIvbi1N5meeSGTnFyZX+bNTGzUOarPcuNYZ6Mcl3351HcyESHzuJbKbsk3RB1kGeg==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
select2 "^4.0.13"
"@abp/sweetalert@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-4.0.0-rc.5.tgz#e360ed98fc242348eb881e0031e4bf921bd1065b"
integrity sha512-dCmKYbmUBvsh95VjOeAxBsEgDQSTYswbAOXfTe/1nTf7ABVxUouKY++TYjK9xOgrmUx2fXC/kpImiAKI/xsLEg==
"@abp/sweetalert@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-4.0.0.tgz#0d93e92e95c6855aef7e19532a7513a078ece216"
integrity sha512-y3XtZqnUVZuQohpRO1ImyBZXhtrm4H+typIL/9VgcnlvQjBTyIaiwDmU8j07Bb2rKJKe0prVkkVARO7OnjOS5A==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
sweetalert "^2.1.2"
"@abp/timeago@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-4.0.0-rc.5.tgz#f0dd1e85249dc737e8cfedba072677dd6727d16c"
integrity sha512-Nqq9Ok7odlp+ptmCDsdcz1/j68n6gZN8+jBHZt18hU4ox4awruDbSguK7Pn2qu8Vt5zfGtit0+nqKamlq+dr6A==
"@abp/timeago@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-4.0.0.tgz#509cd8a84cd94c2644824b0c3af10c8fff6de2dc"
integrity sha512-90jzLYJusYTPwMbak1+XkXE85OPOXPpysRbL28KQwl7WLNBm8wx6IEoVZOHvOrpYscYdyeWhZCgILSJ8DR3a2Q==
dependencies:
"@abp/jquery" "~4.0.0-rc.5"
"@abp/jquery" "~4.0.0"
timeago "^1.6.7"
"@abp/toastr@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-4.0.0-rc.5.tgz#7f39a71fca5665cbcf46f02a7df6030ddb0114c7"
integrity sha512-jS01uP0MZb4OWfBTH1UEXlTPYMjK5WqorE8WZ6Am+jKzwfHudCDFmjFfSX5PV2/Ia3CP9NU8mwygXLmtsHZbHw==
"@abp/toastr@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-4.0.0.tgz#06e28665cb7f6eefee3f69c985dd2b3f86cd7f1d"
integrity sha512-YL1fahVpDszhwpnRTN87GCP523Mkaw42ApT2A/hZuBdwRzP/u5GwRfng0i/uhdYXCMkTKuHmaHnRyqhGiv7nfQ==
dependencies:
"@abp/jquery" "~4.0.0-rc.5"
"@abp/jquery" "~4.0.0"
toastr "^2.1.4"
"@abp/utils@^4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-4.0.0-rc.5.tgz#45b55d6bbf69ad2a052bc2635c039d2cc4aac401"
integrity sha512-pRYUSh30VT4702lfnQCswIwLVqNC6ZFsmydXngwZASJEJVKj30XitSlixnKhocvozG/87H0sYVzvwmUyJiHHQw==
"@abp/utils@^4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-4.0.0.tgz#6c2b5f5c20821028fe6cdbffb5e2f6088956b9d5"
integrity sha512-Yj2yCObvS6X/P8rdRMQBo7940k5P/dZhgCUSo9C6P9GNmJY8wNdJFFyhRtaHuAyU5IBBBIY7+mMKOk5eQcbjWQ==
dependencies:
just-compare "^1.3.0"

@ -15,11 +15,11 @@
},
"private": true,
"dependencies": {
"@abp/ng.account": "~3.3.1",
"@abp/ng.identity": "~4.0.0-rc.5",
"@abp/ng.setting-management": "~4.0.0-rc.5",
"@abp/ng.tenant-management": "~4.0.0-rc.5",
"@abp/ng.theme.basic": "~4.0.0-rc.5",
"@abp/ng.account": "~3.3.2",
"@abp/ng.identity": "~4.0.0",
"@abp/ng.setting-management": "~4.0.0",
"@abp/ng.tenant-management": "~4.0.0",
"@abp/ng.theme.basic": "~4.0.0",
"@angular/animations": "~10.0.0",
"@angular/common": "~10.0.0",
"@angular/compiler": "~10.0.0",

@ -4,8 +4,8 @@
"peerDependencies": {
"@angular/common": "^9.1.11",
"@angular/core": "^9.1.11",
"@abp/ng.core": ">=4.0.0-rc.5",
"@abp/ng.theme.shared": ">=4.0.0-rc.5"
"@abp/ng.core": ">=4.0.0",
"@abp/ng.theme.shared": ">=4.0.0"
},
"dependencies": {
"tslib": "^2.0.0"

@ -3,6 +3,6 @@
"name": "my-app-identityserver",
"private": true,
"dependencies": {
"@abp/aspnetcore.mvc.ui.theme.basic": "^4.0.0-rc.5"
"@abp/aspnetcore.mvc.ui.theme.basic": "^4.0.0"
}
}

@ -2,37 +2,37 @@
# yarn lockfile v1
"@abp/aspnetcore.mvc.ui.theme.basic@^4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-4.0.0-rc.5.tgz#f57744513c443dd96b64a11376b67fabb0df821d"
integrity sha512-6P9nwq1RvAVtRl5NQq+R5QQIGflSbZMFdQTje4r7hDjhKlGLPQUBgWrYRP0TXkIbxz/fhBC9/Mg7lg3bmSH+uQ==
dependencies:
"@abp/aspnetcore.mvc.ui.theme.shared" "~4.0.0-rc.5"
"@abp/aspnetcore.mvc.ui.theme.shared@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-4.0.0-rc.5.tgz#ca73a54b7f328e7429ac639ce17526b72eab5581"
integrity sha512-GPc82OOz+MpSnTl46Wgeg53NYPI46jdy4/muragF6JR+3zBEo8tYe0jHP8T+LGtyGXdYoJ9Sx9274fRyxxh65Q==
dependencies:
"@abp/aspnetcore.mvc.ui" "~4.0.0-rc.5"
"@abp/bootstrap" "~4.0.0-rc.5"
"@abp/bootstrap-datepicker" "~4.0.0-rc.5"
"@abp/datatables.net-bs4" "~4.0.0-rc.5"
"@abp/font-awesome" "~4.0.0-rc.5"
"@abp/jquery-form" "~4.0.0-rc.5"
"@abp/jquery-validation-unobtrusive" "~4.0.0-rc.5"
"@abp/lodash" "~4.0.0-rc.5"
"@abp/luxon" "~4.0.0-rc.5"
"@abp/malihu-custom-scrollbar-plugin" "~4.0.0-rc.5"
"@abp/select2" "~4.0.0-rc.5"
"@abp/sweetalert" "~4.0.0-rc.5"
"@abp/timeago" "~4.0.0-rc.5"
"@abp/toastr" "~4.0.0-rc.5"
"@abp/aspnetcore.mvc.ui@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-4.0.0-rc.5.tgz#fa0dbc0b2f0a2c7777cdeb7613ec61307e6edd96"
integrity sha512-zEHA08snWGVL2Lm4ijpj/CnY1JxIg1ark3fxNsaKraVciVWbh5jmnBL8LCdKZFWZqEGCeWxrEnpt8OGIV+nhdg==
"@abp/aspnetcore.mvc.ui.theme.basic@^4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-4.0.0.tgz#b1822cf5bbc0f6eeb414ebd0877f6d1115a81fe7"
integrity sha512-yYXQkEnNhftzm+ZI8d3VFMlV5UuLNTMQQwV2eZ8tJfstUQrKV9bVd3+NdDOr3AkvcD8D7mvMFeBuoMYteL5kLQ==
dependencies:
"@abp/aspnetcore.mvc.ui.theme.shared" "~4.0.0"
"@abp/aspnetcore.mvc.ui.theme.shared@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-4.0.0.tgz#ba896056e9df5ac58e108df96996fbb2ca7a1a15"
integrity sha512-3RNn6VrNA+cqnPBoSbiCazN05cC2rhcRFMMxkEte+LImGbGOsxc4MflzHg5On1ExCGdqko8Axbw/ydy44Ak4Hw==
dependencies:
"@abp/aspnetcore.mvc.ui" "~4.0.0"
"@abp/bootstrap" "~4.0.0"
"@abp/bootstrap-datepicker" "~4.0.0"
"@abp/datatables.net-bs4" "~4.0.0"
"@abp/font-awesome" "~4.0.0"
"@abp/jquery-form" "~4.0.0"
"@abp/jquery-validation-unobtrusive" "~4.0.0"
"@abp/lodash" "~4.0.0"
"@abp/luxon" "~4.0.0"
"@abp/malihu-custom-scrollbar-plugin" "~4.0.0"
"@abp/select2" "~4.0.0"
"@abp/sweetalert" "~4.0.0"
"@abp/timeago" "~4.0.0"
"@abp/toastr" "~4.0.0"
"@abp/aspnetcore.mvc.ui@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-4.0.0.tgz#68502177a05f6ce7191a09b06a18c5b5dfab425d"
integrity sha512-tYHUWMwnwInrGSzC/OdN6bH/VHZEz5DP3rx2U6fcb0I5GvvRdQZxVgUvmWn6DeMA3PG10Gra4SfkhZqRQq9rjQ==
dependencies:
ansi-colors "^4.1.1"
extend-object "^1.0.0"
@ -43,145 +43,145 @@
micromatch "^4.0.2"
path "^0.12.7"
"@abp/bootstrap-datepicker@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-4.0.0-rc.5.tgz#38d665ba63dc9a0bb5fb8bfad50e7cac2fcdb8bf"
integrity sha512-nh+yJRn+CsnLd2VQelYcQbS49zP1LDSvczZrlCZUtiyAv400cBa1mC8tITxDnpAEBlICWb5s4Sg7kJXjyePsmw==
"@abp/bootstrap-datepicker@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-4.0.0.tgz#cdbd2c388c6d7ce8c6d72443038975063e6c6d02"
integrity sha512-hauH8VhpC8cxv1wCR6bVBcNqZepftdBXxEVID7TSAqgNyWjm/CrJqWLI+A0nnkG3IHoIm9D22iF47BamuYHptw==
dependencies:
bootstrap-datepicker "^1.9.0"
"@abp/bootstrap@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-4.0.0-rc.5.tgz#c49675030b2bde53a8b30249f38d85d4ae0aff49"
integrity sha512-eXJS1Eq2WyB9qKhyW/+9PUzZU5YNKe9q2Mt2nISwb0NmFepGiLkoygGQXtTe7yvyVdqrb6XM5pZHxdM0tRkYRQ==
"@abp/bootstrap@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-4.0.0.tgz#04174f18055f76f936e6fb73e5ff71ffa08a8528"
integrity sha512-Tmr0yoSWg7XHl02X5wv04CvYcL8KCpX8u6YGJj31jRZxUTeCvs5ETXlepOWcdxPQqi/4olXv5B9GEz5S9l5nZA==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
bootstrap "^4.5.0"
bootstrap-v4-rtl "4.4.1-2"
"@abp/core@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/core/-/core-4.0.0-rc.5.tgz#3500839195c24f1275c55801037b02fd749516f7"
integrity sha512-Ubbej59+9z4FQWWCUSO3LphTmT8ZJQ/53cFcMOMIX/uoluli8IORBeAetTw4UDqG2rA70a5YKpyz17pG36D1kA==
"@abp/core@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/core/-/core-4.0.0.tgz#65e76c697e62162717e0edabf7edacc4228e682a"
integrity sha512-xcTTBFjLFZ9Trv2x9Y/c3XKezIx+x3MTXUD98QJPf1aR7T43TE/tLHRxdRfW3R8ka0O1wmlYshpkaw5pYNsj5w==
dependencies:
"@abp/utils" "^4.0.0-rc.5"
"@abp/utils" "^4.0.0"
"@abp/datatables.net-bs4@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-4.0.0-rc.5.tgz#00a9db6cd73bd1f6e5adaebe3add0f3192ed9b1d"
integrity sha512-Xvvm7j2UVgJfQRIPJ121vYH7upao22nqcFAxmeBFZ41Vgmt2gDkbXfvPHIAw06M0C2Gpym9shO+Sg4556xCubQ==
"@abp/datatables.net-bs4@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-4.0.0.tgz#fe737e054f6ba35e787a1cda185af2788ef86d39"
integrity sha512-mz7xZdzX1nlFyX7vNzB5w3RkqZ0IHrPgsXGOB7OCTKMRshDFVH2O51Oy4qoLDOXoTVeahHtR9v8thEWFR1SnZg==
dependencies:
"@abp/datatables.net" "~4.0.0-rc.5"
"@abp/datatables.net" "~4.0.0"
datatables.net-bs4 "^1.10.21"
"@abp/datatables.net@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-4.0.0-rc.5.tgz#ca581ca5b76a95702086b04da3f50b00b7da7973"
integrity sha512-xm7JQ/B9Opng1zai+cAILD6pl2Xlp54NMkfz7Y6U4DEYhzUAOT1idOVUhlCMtdE6RxVVqZGVozQZt7SZFZVImw==
"@abp/datatables.net@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-4.0.0.tgz#88ae5f1a6068fba55927e59f113686508e9553cb"
integrity sha512-JYTfMA1zlBNGiQHAiZiTj5ka6B6vq5k2jqsoLHup4pD9jpKwKRBGtltVsWoEnetd9eEbp4SaV/FCuh3RzmV6Pw==
dependencies:
"@abp/jquery" "~4.0.0-rc.5"
"@abp/jquery" "~4.0.0"
datatables.net "^1.10.21"
"@abp/font-awesome@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-4.0.0-rc.5.tgz#59a0516eb3c2d6f43a0a19a60f7c31fef4d421f4"
integrity sha512-VsmpC04epanCyZC6DVrDJz8FcupdU8/PpV9gnr7YvTk+VZQrq/zY9C21GWPDGKmBPavUlG4QMrX1oeUvu+9FoA==
"@abp/font-awesome@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-4.0.0.tgz#6e1e4bd1175a0b8d3b095e215c07e66ad0e42e19"
integrity sha512-kHfZ45UMDWSRk1gTV/BwVfSoXksJ9UlnD3SelTGeAkvbDqtDllqlp9y6c3qQcmZUE348Xl4hDTkU8upZwswCFQ==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
"@fortawesome/fontawesome-free" "^5.13.0"
"@abp/jquery-form@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-4.0.0-rc.5.tgz#91b90f4cb45bce584e33a74cc4366297fc4d4d40"
integrity sha512-5XrRF1xQMpZnAHYGDdpkLnYaAiKtWsmmHJ3aLxtg1QHnTuSKbasEtsOMVTqazkpiGcZsURcHNa4B/JUSK/KuBg==
"@abp/jquery-form@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-4.0.0.tgz#3afb41eb16d62e32c31a29c6a866f634a5a20cd8"
integrity sha512-cQq8PgzHfpK9/LxmjlnMsDn85wWvEOqjyLaepHFpTTt0341auSgXNwhp7rk71AUHD1lP3c9ALctmqu+gYmh9ag==
dependencies:
"@abp/jquery" "~4.0.0-rc.5"
"@abp/jquery" "~4.0.0"
jquery-form "^4.3.0"
"@abp/jquery-validation-unobtrusive@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-4.0.0-rc.5.tgz#f6c3320c9362bc70120dbdcce02cda814ec7c243"
integrity sha512-ftBxpeMLeRlaabPzU0wjDd4qvfgX38XtELnGjdQmTQ3P5lmAjhSTk1Fe8eIfGSINUAwYJyCjUlyYIMVi+kx9Tg==
"@abp/jquery-validation-unobtrusive@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-4.0.0.tgz#c3674d2b01b3c524de4c3fac1c6ae3657857ee7b"
integrity sha512-OGibIdw0ogjp6VQIebHM7OtMT36pjLKRrOHyCVpTmQ7NzDODV5ptG83vOnt5nFG0y9XFrOt8cnHrrd+K1Bpo/Q==
dependencies:
"@abp/jquery-validation" "~4.0.0-rc.5"
"@abp/jquery-validation" "~4.0.0"
jquery-validation-unobtrusive "^3.2.11"
"@abp/jquery-validation@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-4.0.0-rc.5.tgz#eb02731039b5befebf3666cb6cc1a7b54d5e9057"
integrity sha512-5LWBi+8Otch8SUCJA7DyKX7gD2Vy2aCODyPO5Y037lx7iUk/xHkhRnPDOVIGiS8fzyZx+fLNhJ6Lbfk9P+I5XA==
"@abp/jquery-validation@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-4.0.0.tgz#0a101937f89ff398317142b5271fa9a1de6571c2"
integrity sha512-4nzvhAktEINpQ2H+Hy7TOxxojTmTEm5dBTbHs1vbCWUuF0OTpouZWbMZDESdP0ZbjXcQ+vhwuM4e/pm/PeaHyQ==
dependencies:
"@abp/jquery" "~4.0.0-rc.5"
"@abp/jquery" "~4.0.0"
jquery-validation "^1.19.2"
"@abp/jquery@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-4.0.0-rc.5.tgz#244fbe71bb85abc1f54bfca269d9b0bfdf50469f"
integrity sha512-xt2gV3ZIMpyTFls2a58TTXEbhFxQGb7JacRojp5/+MyGL/SoQbOGENU3aK/fHRYD3VRUkhlKFGT6Ijv3LX83/A==
"@abp/jquery@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-4.0.0.tgz#00d24678b573bcc2fb14d8337ccdbf697b59d43b"
integrity sha512-gXLK97IvAZriNlG8e0qJcd7MvnpshJQURb4lg8VYibD7Fs/OBeHSAWM2Adgi3H9DnQL8XEUlWf487FSz4RC/Yg==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
jquery "~3.5.1"
"@abp/lodash@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-4.0.0-rc.5.tgz#f38dd3021d2b9877cf38fe812531968b7e607838"
integrity sha512-xdJ3WjqBz+C1gxrq1GcA66D1wrKn3QJ9/culTvEDr/eLpHjimnNjMmhAQqVxbaGk6qD6Q8Fswr8gtwqpPSe6eA==
"@abp/lodash@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-4.0.0.tgz#fe76d09517f6b1adf18edde94a31e13b003329dc"
integrity sha512-uitn5uYlb9xShRtV4AFOgp3lu2kADGMD4+a4fy5r4umlPM2uuMo0wMhzyYdBIG64JC5oNaqAzOwZyhhnn+HGJg==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
lodash "^4.17.15"
"@abp/luxon@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-4.0.0-rc.5.tgz#9448a48b6b3bf0446b421c2642188b9f11848572"
integrity sha512-S/lkCt/ou0Lv7KG3/XEAHx2S2YaDcEszyhnRBVCYSNqOUr0a56J+2MqKL5OFrOTNCfkPHDkaJVlSIXBEXokXFA==
"@abp/luxon@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-4.0.0.tgz#d9357e4fb422b6e18ebe897a86a4c4bc6fbe6858"
integrity sha512-tiE6NiSa4El88SVotxfmmpceINLz8MruaO/e/U3QjJEHjRoqlv0UBrM/x5Xz92c7ZIvL0Y4QvWNISeDg6/oqIQ==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
luxon "^1.24.1"
"@abp/malihu-custom-scrollbar-plugin@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-4.0.0-rc.5.tgz#87acd20de26e071bb38ec26fa4cd18026ca11464"
integrity sha512-QOp8R/LDabMhjapSjaArBEZUEslhOOGYIGfFm8CCrSeWGWJR8TFa68PIjhmUpNM5l8nlvC3MDMkQ/TnOaXgR4g==
"@abp/malihu-custom-scrollbar-plugin@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-4.0.0.tgz#972acf26f5eaa4bf9b8991cbe7c19fd0005d94e2"
integrity sha512-SpUo1CfppKzkE6Rb880pgB7oQ83Mkjsi0o6eE4r4gkF5hfzkuCXOmNjTYKfQIkE4n3G9QQd+8AAN/4xj4DiDrA==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
malihu-custom-scrollbar-plugin "^3.1.5"
"@abp/select2@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-4.0.0-rc.5.tgz#a7cc1e2e1985693f673c8214ac7db21d79dee4b8"
integrity sha512-ZNwT8u0CPDrCO4y5kCWd2EGhihwc+R6aBxx8tzL0AUAuHYRVA68T49Exyd1Fa+jESRjoVn18hys6HnTCUzZkWQ==
"@abp/select2@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-4.0.0.tgz#8fdf4c5e18f4093ee4e073dab950cf7aa9b2a540"
integrity sha512-XeXahcDMczdkZdP07yhQriIvbi1N5meeSGTnFyZX+bNTGzUOarPcuNYZ6Mcl3351HcyESHzuJbKbsk3RB1kGeg==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
select2 "^4.0.13"
"@abp/sweetalert@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-4.0.0-rc.5.tgz#e360ed98fc242348eb881e0031e4bf921bd1065b"
integrity sha512-dCmKYbmUBvsh95VjOeAxBsEgDQSTYswbAOXfTe/1nTf7ABVxUouKY++TYjK9xOgrmUx2fXC/kpImiAKI/xsLEg==
"@abp/sweetalert@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-4.0.0.tgz#0d93e92e95c6855aef7e19532a7513a078ece216"
integrity sha512-y3XtZqnUVZuQohpRO1ImyBZXhtrm4H+typIL/9VgcnlvQjBTyIaiwDmU8j07Bb2rKJKe0prVkkVARO7OnjOS5A==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
sweetalert "^2.1.2"
"@abp/timeago@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-4.0.0-rc.5.tgz#f0dd1e85249dc737e8cfedba072677dd6727d16c"
integrity sha512-Nqq9Ok7odlp+ptmCDsdcz1/j68n6gZN8+jBHZt18hU4ox4awruDbSguK7Pn2qu8Vt5zfGtit0+nqKamlq+dr6A==
"@abp/timeago@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-4.0.0.tgz#509cd8a84cd94c2644824b0c3af10c8fff6de2dc"
integrity sha512-90jzLYJusYTPwMbak1+XkXE85OPOXPpysRbL28KQwl7WLNBm8wx6IEoVZOHvOrpYscYdyeWhZCgILSJ8DR3a2Q==
dependencies:
"@abp/jquery" "~4.0.0-rc.5"
"@abp/jquery" "~4.0.0"
timeago "^1.6.7"
"@abp/toastr@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-4.0.0-rc.5.tgz#7f39a71fca5665cbcf46f02a7df6030ddb0114c7"
integrity sha512-jS01uP0MZb4OWfBTH1UEXlTPYMjK5WqorE8WZ6Am+jKzwfHudCDFmjFfSX5PV2/Ia3CP9NU8mwygXLmtsHZbHw==
"@abp/toastr@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-4.0.0.tgz#06e28665cb7f6eefee3f69c985dd2b3f86cd7f1d"
integrity sha512-YL1fahVpDszhwpnRTN87GCP523Mkaw42ApT2A/hZuBdwRzP/u5GwRfng0i/uhdYXCMkTKuHmaHnRyqhGiv7nfQ==
dependencies:
"@abp/jquery" "~4.0.0-rc.5"
"@abp/jquery" "~4.0.0"
toastr "^2.1.4"
"@abp/utils@^4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-4.0.0-rc.5.tgz#45b55d6bbf69ad2a052bc2635c039d2cc4aac401"
integrity sha512-pRYUSh30VT4702lfnQCswIwLVqNC6ZFsmydXngwZASJEJVKj30XitSlixnKhocvozG/87H0sYVzvwmUyJiHHQw==
"@abp/utils@^4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-4.0.0.tgz#6c2b5f5c20821028fe6cdbffb5e2f6088956b9d5"
integrity sha512-Yj2yCObvS6X/P8rdRMQBo7940k5P/dZhgCUSo9C6P9GNmJY8wNdJFFyhRtaHuAyU5IBBBIY7+mMKOk5eQcbjWQ==
dependencies:
just-compare "^1.3.0"

@ -3,6 +3,6 @@
"name": "my-app",
"private": true,
"dependencies": {
"@abp/aspnetcore.mvc.ui.theme.basic": "^4.0.0-rc.5"
"@abp/aspnetcore.mvc.ui.theme.basic": "^4.0.0"
}
}

@ -2,37 +2,37 @@
# yarn lockfile v1
"@abp/aspnetcore.mvc.ui.theme.basic@^4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-4.0.0-rc.5.tgz#f57744513c443dd96b64a11376b67fabb0df821d"
integrity sha512-6P9nwq1RvAVtRl5NQq+R5QQIGflSbZMFdQTje4r7hDjhKlGLPQUBgWrYRP0TXkIbxz/fhBC9/Mg7lg3bmSH+uQ==
dependencies:
"@abp/aspnetcore.mvc.ui.theme.shared" "~4.0.0-rc.5"
"@abp/aspnetcore.mvc.ui.theme.shared@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-4.0.0-rc.5.tgz#ca73a54b7f328e7429ac639ce17526b72eab5581"
integrity sha512-GPc82OOz+MpSnTl46Wgeg53NYPI46jdy4/muragF6JR+3zBEo8tYe0jHP8T+LGtyGXdYoJ9Sx9274fRyxxh65Q==
dependencies:
"@abp/aspnetcore.mvc.ui" "~4.0.0-rc.5"
"@abp/bootstrap" "~4.0.0-rc.5"
"@abp/bootstrap-datepicker" "~4.0.0-rc.5"
"@abp/datatables.net-bs4" "~4.0.0-rc.5"
"@abp/font-awesome" "~4.0.0-rc.5"
"@abp/jquery-form" "~4.0.0-rc.5"
"@abp/jquery-validation-unobtrusive" "~4.0.0-rc.5"
"@abp/lodash" "~4.0.0-rc.5"
"@abp/luxon" "~4.0.0-rc.5"
"@abp/malihu-custom-scrollbar-plugin" "~4.0.0-rc.5"
"@abp/select2" "~4.0.0-rc.5"
"@abp/sweetalert" "~4.0.0-rc.5"
"@abp/timeago" "~4.0.0-rc.5"
"@abp/toastr" "~4.0.0-rc.5"
"@abp/aspnetcore.mvc.ui@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-4.0.0-rc.5.tgz#fa0dbc0b2f0a2c7777cdeb7613ec61307e6edd96"
integrity sha512-zEHA08snWGVL2Lm4ijpj/CnY1JxIg1ark3fxNsaKraVciVWbh5jmnBL8LCdKZFWZqEGCeWxrEnpt8OGIV+nhdg==
"@abp/aspnetcore.mvc.ui.theme.basic@^4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-4.0.0.tgz#b1822cf5bbc0f6eeb414ebd0877f6d1115a81fe7"
integrity sha512-yYXQkEnNhftzm+ZI8d3VFMlV5UuLNTMQQwV2eZ8tJfstUQrKV9bVd3+NdDOr3AkvcD8D7mvMFeBuoMYteL5kLQ==
dependencies:
"@abp/aspnetcore.mvc.ui.theme.shared" "~4.0.0"
"@abp/aspnetcore.mvc.ui.theme.shared@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-4.0.0.tgz#ba896056e9df5ac58e108df96996fbb2ca7a1a15"
integrity sha512-3RNn6VrNA+cqnPBoSbiCazN05cC2rhcRFMMxkEte+LImGbGOsxc4MflzHg5On1ExCGdqko8Axbw/ydy44Ak4Hw==
dependencies:
"@abp/aspnetcore.mvc.ui" "~4.0.0"
"@abp/bootstrap" "~4.0.0"
"@abp/bootstrap-datepicker" "~4.0.0"
"@abp/datatables.net-bs4" "~4.0.0"
"@abp/font-awesome" "~4.0.0"
"@abp/jquery-form" "~4.0.0"
"@abp/jquery-validation-unobtrusive" "~4.0.0"
"@abp/lodash" "~4.0.0"
"@abp/luxon" "~4.0.0"
"@abp/malihu-custom-scrollbar-plugin" "~4.0.0"
"@abp/select2" "~4.0.0"
"@abp/sweetalert" "~4.0.0"
"@abp/timeago" "~4.0.0"
"@abp/toastr" "~4.0.0"
"@abp/aspnetcore.mvc.ui@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-4.0.0.tgz#68502177a05f6ce7191a09b06a18c5b5dfab425d"
integrity sha512-tYHUWMwnwInrGSzC/OdN6bH/VHZEz5DP3rx2U6fcb0I5GvvRdQZxVgUvmWn6DeMA3PG10Gra4SfkhZqRQq9rjQ==
dependencies:
ansi-colors "^4.1.1"
extend-object "^1.0.0"
@ -43,145 +43,145 @@
micromatch "^4.0.2"
path "^0.12.7"
"@abp/bootstrap-datepicker@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-4.0.0-rc.5.tgz#38d665ba63dc9a0bb5fb8bfad50e7cac2fcdb8bf"
integrity sha512-nh+yJRn+CsnLd2VQelYcQbS49zP1LDSvczZrlCZUtiyAv400cBa1mC8tITxDnpAEBlICWb5s4Sg7kJXjyePsmw==
"@abp/bootstrap-datepicker@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-4.0.0.tgz#cdbd2c388c6d7ce8c6d72443038975063e6c6d02"
integrity sha512-hauH8VhpC8cxv1wCR6bVBcNqZepftdBXxEVID7TSAqgNyWjm/CrJqWLI+A0nnkG3IHoIm9D22iF47BamuYHptw==
dependencies:
bootstrap-datepicker "^1.9.0"
"@abp/bootstrap@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-4.0.0-rc.5.tgz#c49675030b2bde53a8b30249f38d85d4ae0aff49"
integrity sha512-eXJS1Eq2WyB9qKhyW/+9PUzZU5YNKe9q2Mt2nISwb0NmFepGiLkoygGQXtTe7yvyVdqrb6XM5pZHxdM0tRkYRQ==
"@abp/bootstrap@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-4.0.0.tgz#04174f18055f76f936e6fb73e5ff71ffa08a8528"
integrity sha512-Tmr0yoSWg7XHl02X5wv04CvYcL8KCpX8u6YGJj31jRZxUTeCvs5ETXlepOWcdxPQqi/4olXv5B9GEz5S9l5nZA==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
bootstrap "^4.5.0"
bootstrap-v4-rtl "4.4.1-2"
"@abp/core@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/core/-/core-4.0.0-rc.5.tgz#3500839195c24f1275c55801037b02fd749516f7"
integrity sha512-Ubbej59+9z4FQWWCUSO3LphTmT8ZJQ/53cFcMOMIX/uoluli8IORBeAetTw4UDqG2rA70a5YKpyz17pG36D1kA==
"@abp/core@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/core/-/core-4.0.0.tgz#65e76c697e62162717e0edabf7edacc4228e682a"
integrity sha512-xcTTBFjLFZ9Trv2x9Y/c3XKezIx+x3MTXUD98QJPf1aR7T43TE/tLHRxdRfW3R8ka0O1wmlYshpkaw5pYNsj5w==
dependencies:
"@abp/utils" "^4.0.0-rc.5"
"@abp/utils" "^4.0.0"
"@abp/datatables.net-bs4@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-4.0.0-rc.5.tgz#00a9db6cd73bd1f6e5adaebe3add0f3192ed9b1d"
integrity sha512-Xvvm7j2UVgJfQRIPJ121vYH7upao22nqcFAxmeBFZ41Vgmt2gDkbXfvPHIAw06M0C2Gpym9shO+Sg4556xCubQ==
"@abp/datatables.net-bs4@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-4.0.0.tgz#fe737e054f6ba35e787a1cda185af2788ef86d39"
integrity sha512-mz7xZdzX1nlFyX7vNzB5w3RkqZ0IHrPgsXGOB7OCTKMRshDFVH2O51Oy4qoLDOXoTVeahHtR9v8thEWFR1SnZg==
dependencies:
"@abp/datatables.net" "~4.0.0-rc.5"
"@abp/datatables.net" "~4.0.0"
datatables.net-bs4 "^1.10.21"
"@abp/datatables.net@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-4.0.0-rc.5.tgz#ca581ca5b76a95702086b04da3f50b00b7da7973"
integrity sha512-xm7JQ/B9Opng1zai+cAILD6pl2Xlp54NMkfz7Y6U4DEYhzUAOT1idOVUhlCMtdE6RxVVqZGVozQZt7SZFZVImw==
"@abp/datatables.net@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-4.0.0.tgz#88ae5f1a6068fba55927e59f113686508e9553cb"
integrity sha512-JYTfMA1zlBNGiQHAiZiTj5ka6B6vq5k2jqsoLHup4pD9jpKwKRBGtltVsWoEnetd9eEbp4SaV/FCuh3RzmV6Pw==
dependencies:
"@abp/jquery" "~4.0.0-rc.5"
"@abp/jquery" "~4.0.0"
datatables.net "^1.10.21"
"@abp/font-awesome@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-4.0.0-rc.5.tgz#59a0516eb3c2d6f43a0a19a60f7c31fef4d421f4"
integrity sha512-VsmpC04epanCyZC6DVrDJz8FcupdU8/PpV9gnr7YvTk+VZQrq/zY9C21GWPDGKmBPavUlG4QMrX1oeUvu+9FoA==
"@abp/font-awesome@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-4.0.0.tgz#6e1e4bd1175a0b8d3b095e215c07e66ad0e42e19"
integrity sha512-kHfZ45UMDWSRk1gTV/BwVfSoXksJ9UlnD3SelTGeAkvbDqtDllqlp9y6c3qQcmZUE348Xl4hDTkU8upZwswCFQ==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
"@fortawesome/fontawesome-free" "^5.13.0"
"@abp/jquery-form@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-4.0.0-rc.5.tgz#91b90f4cb45bce584e33a74cc4366297fc4d4d40"
integrity sha512-5XrRF1xQMpZnAHYGDdpkLnYaAiKtWsmmHJ3aLxtg1QHnTuSKbasEtsOMVTqazkpiGcZsURcHNa4B/JUSK/KuBg==
"@abp/jquery-form@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-4.0.0.tgz#3afb41eb16d62e32c31a29c6a866f634a5a20cd8"
integrity sha512-cQq8PgzHfpK9/LxmjlnMsDn85wWvEOqjyLaepHFpTTt0341auSgXNwhp7rk71AUHD1lP3c9ALctmqu+gYmh9ag==
dependencies:
"@abp/jquery" "~4.0.0-rc.5"
"@abp/jquery" "~4.0.0"
jquery-form "^4.3.0"
"@abp/jquery-validation-unobtrusive@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-4.0.0-rc.5.tgz#f6c3320c9362bc70120dbdcce02cda814ec7c243"
integrity sha512-ftBxpeMLeRlaabPzU0wjDd4qvfgX38XtELnGjdQmTQ3P5lmAjhSTk1Fe8eIfGSINUAwYJyCjUlyYIMVi+kx9Tg==
"@abp/jquery-validation-unobtrusive@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-4.0.0.tgz#c3674d2b01b3c524de4c3fac1c6ae3657857ee7b"
integrity sha512-OGibIdw0ogjp6VQIebHM7OtMT36pjLKRrOHyCVpTmQ7NzDODV5ptG83vOnt5nFG0y9XFrOt8cnHrrd+K1Bpo/Q==
dependencies:
"@abp/jquery-validation" "~4.0.0-rc.5"
"@abp/jquery-validation" "~4.0.0"
jquery-validation-unobtrusive "^3.2.11"
"@abp/jquery-validation@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-4.0.0-rc.5.tgz#eb02731039b5befebf3666cb6cc1a7b54d5e9057"
integrity sha512-5LWBi+8Otch8SUCJA7DyKX7gD2Vy2aCODyPO5Y037lx7iUk/xHkhRnPDOVIGiS8fzyZx+fLNhJ6Lbfk9P+I5XA==
"@abp/jquery-validation@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-4.0.0.tgz#0a101937f89ff398317142b5271fa9a1de6571c2"
integrity sha512-4nzvhAktEINpQ2H+Hy7TOxxojTmTEm5dBTbHs1vbCWUuF0OTpouZWbMZDESdP0ZbjXcQ+vhwuM4e/pm/PeaHyQ==
dependencies:
"@abp/jquery" "~4.0.0-rc.5"
"@abp/jquery" "~4.0.0"
jquery-validation "^1.19.2"
"@abp/jquery@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-4.0.0-rc.5.tgz#244fbe71bb85abc1f54bfca269d9b0bfdf50469f"
integrity sha512-xt2gV3ZIMpyTFls2a58TTXEbhFxQGb7JacRojp5/+MyGL/SoQbOGENU3aK/fHRYD3VRUkhlKFGT6Ijv3LX83/A==
"@abp/jquery@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-4.0.0.tgz#00d24678b573bcc2fb14d8337ccdbf697b59d43b"
integrity sha512-gXLK97IvAZriNlG8e0qJcd7MvnpshJQURb4lg8VYibD7Fs/OBeHSAWM2Adgi3H9DnQL8XEUlWf487FSz4RC/Yg==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
jquery "~3.5.1"
"@abp/lodash@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-4.0.0-rc.5.tgz#f38dd3021d2b9877cf38fe812531968b7e607838"
integrity sha512-xdJ3WjqBz+C1gxrq1GcA66D1wrKn3QJ9/culTvEDr/eLpHjimnNjMmhAQqVxbaGk6qD6Q8Fswr8gtwqpPSe6eA==
"@abp/lodash@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-4.0.0.tgz#fe76d09517f6b1adf18edde94a31e13b003329dc"
integrity sha512-uitn5uYlb9xShRtV4AFOgp3lu2kADGMD4+a4fy5r4umlPM2uuMo0wMhzyYdBIG64JC5oNaqAzOwZyhhnn+HGJg==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
lodash "^4.17.15"
"@abp/luxon@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-4.0.0-rc.5.tgz#9448a48b6b3bf0446b421c2642188b9f11848572"
integrity sha512-S/lkCt/ou0Lv7KG3/XEAHx2S2YaDcEszyhnRBVCYSNqOUr0a56J+2MqKL5OFrOTNCfkPHDkaJVlSIXBEXokXFA==
"@abp/luxon@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-4.0.0.tgz#d9357e4fb422b6e18ebe897a86a4c4bc6fbe6858"
integrity sha512-tiE6NiSa4El88SVotxfmmpceINLz8MruaO/e/U3QjJEHjRoqlv0UBrM/x5Xz92c7ZIvL0Y4QvWNISeDg6/oqIQ==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
luxon "^1.24.1"
"@abp/malihu-custom-scrollbar-plugin@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-4.0.0-rc.5.tgz#87acd20de26e071bb38ec26fa4cd18026ca11464"
integrity sha512-QOp8R/LDabMhjapSjaArBEZUEslhOOGYIGfFm8CCrSeWGWJR8TFa68PIjhmUpNM5l8nlvC3MDMkQ/TnOaXgR4g==
"@abp/malihu-custom-scrollbar-plugin@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-4.0.0.tgz#972acf26f5eaa4bf9b8991cbe7c19fd0005d94e2"
integrity sha512-SpUo1CfppKzkE6Rb880pgB7oQ83Mkjsi0o6eE4r4gkF5hfzkuCXOmNjTYKfQIkE4n3G9QQd+8AAN/4xj4DiDrA==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
malihu-custom-scrollbar-plugin "^3.1.5"
"@abp/select2@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-4.0.0-rc.5.tgz#a7cc1e2e1985693f673c8214ac7db21d79dee4b8"
integrity sha512-ZNwT8u0CPDrCO4y5kCWd2EGhihwc+R6aBxx8tzL0AUAuHYRVA68T49Exyd1Fa+jESRjoVn18hys6HnTCUzZkWQ==
"@abp/select2@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-4.0.0.tgz#8fdf4c5e18f4093ee4e073dab950cf7aa9b2a540"
integrity sha512-XeXahcDMczdkZdP07yhQriIvbi1N5meeSGTnFyZX+bNTGzUOarPcuNYZ6Mcl3351HcyESHzuJbKbsk3RB1kGeg==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
select2 "^4.0.13"
"@abp/sweetalert@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-4.0.0-rc.5.tgz#e360ed98fc242348eb881e0031e4bf921bd1065b"
integrity sha512-dCmKYbmUBvsh95VjOeAxBsEgDQSTYswbAOXfTe/1nTf7ABVxUouKY++TYjK9xOgrmUx2fXC/kpImiAKI/xsLEg==
"@abp/sweetalert@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-4.0.0.tgz#0d93e92e95c6855aef7e19532a7513a078ece216"
integrity sha512-y3XtZqnUVZuQohpRO1ImyBZXhtrm4H+typIL/9VgcnlvQjBTyIaiwDmU8j07Bb2rKJKe0prVkkVARO7OnjOS5A==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
sweetalert "^2.1.2"
"@abp/timeago@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-4.0.0-rc.5.tgz#f0dd1e85249dc737e8cfedba072677dd6727d16c"
integrity sha512-Nqq9Ok7odlp+ptmCDsdcz1/j68n6gZN8+jBHZt18hU4ox4awruDbSguK7Pn2qu8Vt5zfGtit0+nqKamlq+dr6A==
"@abp/timeago@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-4.0.0.tgz#509cd8a84cd94c2644824b0c3af10c8fff6de2dc"
integrity sha512-90jzLYJusYTPwMbak1+XkXE85OPOXPpysRbL28KQwl7WLNBm8wx6IEoVZOHvOrpYscYdyeWhZCgILSJ8DR3a2Q==
dependencies:
"@abp/jquery" "~4.0.0-rc.5"
"@abp/jquery" "~4.0.0"
timeago "^1.6.7"
"@abp/toastr@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-4.0.0-rc.5.tgz#7f39a71fca5665cbcf46f02a7df6030ddb0114c7"
integrity sha512-jS01uP0MZb4OWfBTH1UEXlTPYMjK5WqorE8WZ6Am+jKzwfHudCDFmjFfSX5PV2/Ia3CP9NU8mwygXLmtsHZbHw==
"@abp/toastr@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-4.0.0.tgz#06e28665cb7f6eefee3f69c985dd2b3f86cd7f1d"
integrity sha512-YL1fahVpDszhwpnRTN87GCP523Mkaw42ApT2A/hZuBdwRzP/u5GwRfng0i/uhdYXCMkTKuHmaHnRyqhGiv7nfQ==
dependencies:
"@abp/jquery" "~4.0.0-rc.5"
"@abp/jquery" "~4.0.0"
toastr "^2.1.4"
"@abp/utils@^4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-4.0.0-rc.5.tgz#45b55d6bbf69ad2a052bc2635c039d2cc4aac401"
integrity sha512-pRYUSh30VT4702lfnQCswIwLVqNC6ZFsmydXngwZASJEJVKj30XitSlixnKhocvozG/87H0sYVzvwmUyJiHHQw==
"@abp/utils@^4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-4.0.0.tgz#6c2b5f5c20821028fe6cdbffb5e2f6088956b9d5"
integrity sha512-Yj2yCObvS6X/P8rdRMQBo7940k5P/dZhgCUSo9C6P9GNmJY8wNdJFFyhRtaHuAyU5IBBBIY7+mMKOk5eQcbjWQ==
dependencies:
just-compare "^1.3.0"

@ -3,6 +3,6 @@
"name": "my-app",
"private": true,
"dependencies": {
"@abp/aspnetcore.mvc.ui.theme.basic": "^4.0.0-rc.5"
"@abp/aspnetcore.mvc.ui.theme.basic": "^4.0.0"
}
}

@ -2,37 +2,37 @@
# yarn lockfile v1
"@abp/aspnetcore.mvc.ui.theme.basic@^4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-4.0.0-rc.5.tgz#f57744513c443dd96b64a11376b67fabb0df821d"
integrity sha512-6P9nwq1RvAVtRl5NQq+R5QQIGflSbZMFdQTje4r7hDjhKlGLPQUBgWrYRP0TXkIbxz/fhBC9/Mg7lg3bmSH+uQ==
dependencies:
"@abp/aspnetcore.mvc.ui.theme.shared" "~4.0.0-rc.5"
"@abp/aspnetcore.mvc.ui.theme.shared@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-4.0.0-rc.5.tgz#ca73a54b7f328e7429ac639ce17526b72eab5581"
integrity sha512-GPc82OOz+MpSnTl46Wgeg53NYPI46jdy4/muragF6JR+3zBEo8tYe0jHP8T+LGtyGXdYoJ9Sx9274fRyxxh65Q==
dependencies:
"@abp/aspnetcore.mvc.ui" "~4.0.0-rc.5"
"@abp/bootstrap" "~4.0.0-rc.5"
"@abp/bootstrap-datepicker" "~4.0.0-rc.5"
"@abp/datatables.net-bs4" "~4.0.0-rc.5"
"@abp/font-awesome" "~4.0.0-rc.5"
"@abp/jquery-form" "~4.0.0-rc.5"
"@abp/jquery-validation-unobtrusive" "~4.0.0-rc.5"
"@abp/lodash" "~4.0.0-rc.5"
"@abp/luxon" "~4.0.0-rc.5"
"@abp/malihu-custom-scrollbar-plugin" "~4.0.0-rc.5"
"@abp/select2" "~4.0.0-rc.5"
"@abp/sweetalert" "~4.0.0-rc.5"
"@abp/timeago" "~4.0.0-rc.5"
"@abp/toastr" "~4.0.0-rc.5"
"@abp/aspnetcore.mvc.ui@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-4.0.0-rc.5.tgz#fa0dbc0b2f0a2c7777cdeb7613ec61307e6edd96"
integrity sha512-zEHA08snWGVL2Lm4ijpj/CnY1JxIg1ark3fxNsaKraVciVWbh5jmnBL8LCdKZFWZqEGCeWxrEnpt8OGIV+nhdg==
"@abp/aspnetcore.mvc.ui.theme.basic@^4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-4.0.0.tgz#b1822cf5bbc0f6eeb414ebd0877f6d1115a81fe7"
integrity sha512-yYXQkEnNhftzm+ZI8d3VFMlV5UuLNTMQQwV2eZ8tJfstUQrKV9bVd3+NdDOr3AkvcD8D7mvMFeBuoMYteL5kLQ==
dependencies:
"@abp/aspnetcore.mvc.ui.theme.shared" "~4.0.0"
"@abp/aspnetcore.mvc.ui.theme.shared@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-4.0.0.tgz#ba896056e9df5ac58e108df96996fbb2ca7a1a15"
integrity sha512-3RNn6VrNA+cqnPBoSbiCazN05cC2rhcRFMMxkEte+LImGbGOsxc4MflzHg5On1ExCGdqko8Axbw/ydy44Ak4Hw==
dependencies:
"@abp/aspnetcore.mvc.ui" "~4.0.0"
"@abp/bootstrap" "~4.0.0"
"@abp/bootstrap-datepicker" "~4.0.0"
"@abp/datatables.net-bs4" "~4.0.0"
"@abp/font-awesome" "~4.0.0"
"@abp/jquery-form" "~4.0.0"
"@abp/jquery-validation-unobtrusive" "~4.0.0"
"@abp/lodash" "~4.0.0"
"@abp/luxon" "~4.0.0"
"@abp/malihu-custom-scrollbar-plugin" "~4.0.0"
"@abp/select2" "~4.0.0"
"@abp/sweetalert" "~4.0.0"
"@abp/timeago" "~4.0.0"
"@abp/toastr" "~4.0.0"
"@abp/aspnetcore.mvc.ui@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-4.0.0.tgz#68502177a05f6ce7191a09b06a18c5b5dfab425d"
integrity sha512-tYHUWMwnwInrGSzC/OdN6bH/VHZEz5DP3rx2U6fcb0I5GvvRdQZxVgUvmWn6DeMA3PG10Gra4SfkhZqRQq9rjQ==
dependencies:
ansi-colors "^4.1.1"
extend-object "^1.0.0"
@ -43,145 +43,145 @@
micromatch "^4.0.2"
path "^0.12.7"
"@abp/bootstrap-datepicker@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-4.0.0-rc.5.tgz#38d665ba63dc9a0bb5fb8bfad50e7cac2fcdb8bf"
integrity sha512-nh+yJRn+CsnLd2VQelYcQbS49zP1LDSvczZrlCZUtiyAv400cBa1mC8tITxDnpAEBlICWb5s4Sg7kJXjyePsmw==
"@abp/bootstrap-datepicker@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-4.0.0.tgz#cdbd2c388c6d7ce8c6d72443038975063e6c6d02"
integrity sha512-hauH8VhpC8cxv1wCR6bVBcNqZepftdBXxEVID7TSAqgNyWjm/CrJqWLI+A0nnkG3IHoIm9D22iF47BamuYHptw==
dependencies:
bootstrap-datepicker "^1.9.0"
"@abp/bootstrap@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-4.0.0-rc.5.tgz#c49675030b2bde53a8b30249f38d85d4ae0aff49"
integrity sha512-eXJS1Eq2WyB9qKhyW/+9PUzZU5YNKe9q2Mt2nISwb0NmFepGiLkoygGQXtTe7yvyVdqrb6XM5pZHxdM0tRkYRQ==
"@abp/bootstrap@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-4.0.0.tgz#04174f18055f76f936e6fb73e5ff71ffa08a8528"
integrity sha512-Tmr0yoSWg7XHl02X5wv04CvYcL8KCpX8u6YGJj31jRZxUTeCvs5ETXlepOWcdxPQqi/4olXv5B9GEz5S9l5nZA==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
bootstrap "^4.5.0"
bootstrap-v4-rtl "4.4.1-2"
"@abp/core@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/core/-/core-4.0.0-rc.5.tgz#3500839195c24f1275c55801037b02fd749516f7"
integrity sha512-Ubbej59+9z4FQWWCUSO3LphTmT8ZJQ/53cFcMOMIX/uoluli8IORBeAetTw4UDqG2rA70a5YKpyz17pG36D1kA==
"@abp/core@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/core/-/core-4.0.0.tgz#65e76c697e62162717e0edabf7edacc4228e682a"
integrity sha512-xcTTBFjLFZ9Trv2x9Y/c3XKezIx+x3MTXUD98QJPf1aR7T43TE/tLHRxdRfW3R8ka0O1wmlYshpkaw5pYNsj5w==
dependencies:
"@abp/utils" "^4.0.0-rc.5"
"@abp/utils" "^4.0.0"
"@abp/datatables.net-bs4@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-4.0.0-rc.5.tgz#00a9db6cd73bd1f6e5adaebe3add0f3192ed9b1d"
integrity sha512-Xvvm7j2UVgJfQRIPJ121vYH7upao22nqcFAxmeBFZ41Vgmt2gDkbXfvPHIAw06M0C2Gpym9shO+Sg4556xCubQ==
"@abp/datatables.net-bs4@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-4.0.0.tgz#fe737e054f6ba35e787a1cda185af2788ef86d39"
integrity sha512-mz7xZdzX1nlFyX7vNzB5w3RkqZ0IHrPgsXGOB7OCTKMRshDFVH2O51Oy4qoLDOXoTVeahHtR9v8thEWFR1SnZg==
dependencies:
"@abp/datatables.net" "~4.0.0-rc.5"
"@abp/datatables.net" "~4.0.0"
datatables.net-bs4 "^1.10.21"
"@abp/datatables.net@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-4.0.0-rc.5.tgz#ca581ca5b76a95702086b04da3f50b00b7da7973"
integrity sha512-xm7JQ/B9Opng1zai+cAILD6pl2Xlp54NMkfz7Y6U4DEYhzUAOT1idOVUhlCMtdE6RxVVqZGVozQZt7SZFZVImw==
"@abp/datatables.net@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-4.0.0.tgz#88ae5f1a6068fba55927e59f113686508e9553cb"
integrity sha512-JYTfMA1zlBNGiQHAiZiTj5ka6B6vq5k2jqsoLHup4pD9jpKwKRBGtltVsWoEnetd9eEbp4SaV/FCuh3RzmV6Pw==
dependencies:
"@abp/jquery" "~4.0.0-rc.5"
"@abp/jquery" "~4.0.0"
datatables.net "^1.10.21"
"@abp/font-awesome@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-4.0.0-rc.5.tgz#59a0516eb3c2d6f43a0a19a60f7c31fef4d421f4"
integrity sha512-VsmpC04epanCyZC6DVrDJz8FcupdU8/PpV9gnr7YvTk+VZQrq/zY9C21GWPDGKmBPavUlG4QMrX1oeUvu+9FoA==
"@abp/font-awesome@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-4.0.0.tgz#6e1e4bd1175a0b8d3b095e215c07e66ad0e42e19"
integrity sha512-kHfZ45UMDWSRk1gTV/BwVfSoXksJ9UlnD3SelTGeAkvbDqtDllqlp9y6c3qQcmZUE348Xl4hDTkU8upZwswCFQ==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
"@fortawesome/fontawesome-free" "^5.13.0"
"@abp/jquery-form@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-4.0.0-rc.5.tgz#91b90f4cb45bce584e33a74cc4366297fc4d4d40"
integrity sha512-5XrRF1xQMpZnAHYGDdpkLnYaAiKtWsmmHJ3aLxtg1QHnTuSKbasEtsOMVTqazkpiGcZsURcHNa4B/JUSK/KuBg==
"@abp/jquery-form@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-4.0.0.tgz#3afb41eb16d62e32c31a29c6a866f634a5a20cd8"
integrity sha512-cQq8PgzHfpK9/LxmjlnMsDn85wWvEOqjyLaepHFpTTt0341auSgXNwhp7rk71AUHD1lP3c9ALctmqu+gYmh9ag==
dependencies:
"@abp/jquery" "~4.0.0-rc.5"
"@abp/jquery" "~4.0.0"
jquery-form "^4.3.0"
"@abp/jquery-validation-unobtrusive@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-4.0.0-rc.5.tgz#f6c3320c9362bc70120dbdcce02cda814ec7c243"
integrity sha512-ftBxpeMLeRlaabPzU0wjDd4qvfgX38XtELnGjdQmTQ3P5lmAjhSTk1Fe8eIfGSINUAwYJyCjUlyYIMVi+kx9Tg==
"@abp/jquery-validation-unobtrusive@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-4.0.0.tgz#c3674d2b01b3c524de4c3fac1c6ae3657857ee7b"
integrity sha512-OGibIdw0ogjp6VQIebHM7OtMT36pjLKRrOHyCVpTmQ7NzDODV5ptG83vOnt5nFG0y9XFrOt8cnHrrd+K1Bpo/Q==
dependencies:
"@abp/jquery-validation" "~4.0.0-rc.5"
"@abp/jquery-validation" "~4.0.0"
jquery-validation-unobtrusive "^3.2.11"
"@abp/jquery-validation@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-4.0.0-rc.5.tgz#eb02731039b5befebf3666cb6cc1a7b54d5e9057"
integrity sha512-5LWBi+8Otch8SUCJA7DyKX7gD2Vy2aCODyPO5Y037lx7iUk/xHkhRnPDOVIGiS8fzyZx+fLNhJ6Lbfk9P+I5XA==
"@abp/jquery-validation@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-4.0.0.tgz#0a101937f89ff398317142b5271fa9a1de6571c2"
integrity sha512-4nzvhAktEINpQ2H+Hy7TOxxojTmTEm5dBTbHs1vbCWUuF0OTpouZWbMZDESdP0ZbjXcQ+vhwuM4e/pm/PeaHyQ==
dependencies:
"@abp/jquery" "~4.0.0-rc.5"
"@abp/jquery" "~4.0.0"
jquery-validation "^1.19.2"
"@abp/jquery@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-4.0.0-rc.5.tgz#244fbe71bb85abc1f54bfca269d9b0bfdf50469f"
integrity sha512-xt2gV3ZIMpyTFls2a58TTXEbhFxQGb7JacRojp5/+MyGL/SoQbOGENU3aK/fHRYD3VRUkhlKFGT6Ijv3LX83/A==
"@abp/jquery@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-4.0.0.tgz#00d24678b573bcc2fb14d8337ccdbf697b59d43b"
integrity sha512-gXLK97IvAZriNlG8e0qJcd7MvnpshJQURb4lg8VYibD7Fs/OBeHSAWM2Adgi3H9DnQL8XEUlWf487FSz4RC/Yg==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
jquery "~3.5.1"
"@abp/lodash@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-4.0.0-rc.5.tgz#f38dd3021d2b9877cf38fe812531968b7e607838"
integrity sha512-xdJ3WjqBz+C1gxrq1GcA66D1wrKn3QJ9/culTvEDr/eLpHjimnNjMmhAQqVxbaGk6qD6Q8Fswr8gtwqpPSe6eA==
"@abp/lodash@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-4.0.0.tgz#fe76d09517f6b1adf18edde94a31e13b003329dc"
integrity sha512-uitn5uYlb9xShRtV4AFOgp3lu2kADGMD4+a4fy5r4umlPM2uuMo0wMhzyYdBIG64JC5oNaqAzOwZyhhnn+HGJg==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
lodash "^4.17.15"
"@abp/luxon@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-4.0.0-rc.5.tgz#9448a48b6b3bf0446b421c2642188b9f11848572"
integrity sha512-S/lkCt/ou0Lv7KG3/XEAHx2S2YaDcEszyhnRBVCYSNqOUr0a56J+2MqKL5OFrOTNCfkPHDkaJVlSIXBEXokXFA==
"@abp/luxon@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-4.0.0.tgz#d9357e4fb422b6e18ebe897a86a4c4bc6fbe6858"
integrity sha512-tiE6NiSa4El88SVotxfmmpceINLz8MruaO/e/U3QjJEHjRoqlv0UBrM/x5Xz92c7ZIvL0Y4QvWNISeDg6/oqIQ==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
luxon "^1.24.1"
"@abp/malihu-custom-scrollbar-plugin@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-4.0.0-rc.5.tgz#87acd20de26e071bb38ec26fa4cd18026ca11464"
integrity sha512-QOp8R/LDabMhjapSjaArBEZUEslhOOGYIGfFm8CCrSeWGWJR8TFa68PIjhmUpNM5l8nlvC3MDMkQ/TnOaXgR4g==
"@abp/malihu-custom-scrollbar-plugin@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-4.0.0.tgz#972acf26f5eaa4bf9b8991cbe7c19fd0005d94e2"
integrity sha512-SpUo1CfppKzkE6Rb880pgB7oQ83Mkjsi0o6eE4r4gkF5hfzkuCXOmNjTYKfQIkE4n3G9QQd+8AAN/4xj4DiDrA==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
malihu-custom-scrollbar-plugin "^3.1.5"
"@abp/select2@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-4.0.0-rc.5.tgz#a7cc1e2e1985693f673c8214ac7db21d79dee4b8"
integrity sha512-ZNwT8u0CPDrCO4y5kCWd2EGhihwc+R6aBxx8tzL0AUAuHYRVA68T49Exyd1Fa+jESRjoVn18hys6HnTCUzZkWQ==
"@abp/select2@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-4.0.0.tgz#8fdf4c5e18f4093ee4e073dab950cf7aa9b2a540"
integrity sha512-XeXahcDMczdkZdP07yhQriIvbi1N5meeSGTnFyZX+bNTGzUOarPcuNYZ6Mcl3351HcyESHzuJbKbsk3RB1kGeg==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
select2 "^4.0.13"
"@abp/sweetalert@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-4.0.0-rc.5.tgz#e360ed98fc242348eb881e0031e4bf921bd1065b"
integrity sha512-dCmKYbmUBvsh95VjOeAxBsEgDQSTYswbAOXfTe/1nTf7ABVxUouKY++TYjK9xOgrmUx2fXC/kpImiAKI/xsLEg==
"@abp/sweetalert@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-4.0.0.tgz#0d93e92e95c6855aef7e19532a7513a078ece216"
integrity sha512-y3XtZqnUVZuQohpRO1ImyBZXhtrm4H+typIL/9VgcnlvQjBTyIaiwDmU8j07Bb2rKJKe0prVkkVARO7OnjOS5A==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
sweetalert "^2.1.2"
"@abp/timeago@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-4.0.0-rc.5.tgz#f0dd1e85249dc737e8cfedba072677dd6727d16c"
integrity sha512-Nqq9Ok7odlp+ptmCDsdcz1/j68n6gZN8+jBHZt18hU4ox4awruDbSguK7Pn2qu8Vt5zfGtit0+nqKamlq+dr6A==
"@abp/timeago@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-4.0.0.tgz#509cd8a84cd94c2644824b0c3af10c8fff6de2dc"
integrity sha512-90jzLYJusYTPwMbak1+XkXE85OPOXPpysRbL28KQwl7WLNBm8wx6IEoVZOHvOrpYscYdyeWhZCgILSJ8DR3a2Q==
dependencies:
"@abp/jquery" "~4.0.0-rc.5"
"@abp/jquery" "~4.0.0"
timeago "^1.6.7"
"@abp/toastr@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-4.0.0-rc.5.tgz#7f39a71fca5665cbcf46f02a7df6030ddb0114c7"
integrity sha512-jS01uP0MZb4OWfBTH1UEXlTPYMjK5WqorE8WZ6Am+jKzwfHudCDFmjFfSX5PV2/Ia3CP9NU8mwygXLmtsHZbHw==
"@abp/toastr@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-4.0.0.tgz#06e28665cb7f6eefee3f69c985dd2b3f86cd7f1d"
integrity sha512-YL1fahVpDszhwpnRTN87GCP523Mkaw42ApT2A/hZuBdwRzP/u5GwRfng0i/uhdYXCMkTKuHmaHnRyqhGiv7nfQ==
dependencies:
"@abp/jquery" "~4.0.0-rc.5"
"@abp/jquery" "~4.0.0"
toastr "^2.1.4"
"@abp/utils@^4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-4.0.0-rc.5.tgz#45b55d6bbf69ad2a052bc2635c039d2cc4aac401"
integrity sha512-pRYUSh30VT4702lfnQCswIwLVqNC6ZFsmydXngwZASJEJVKj30XitSlixnKhocvozG/87H0sYVzvwmUyJiHHQw==
"@abp/utils@^4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-4.0.0.tgz#6c2b5f5c20821028fe6cdbffb5e2f6088956b9d5"
integrity sha512-Yj2yCObvS6X/P8rdRMQBo7940k5P/dZhgCUSo9C6P9GNmJY8wNdJFFyhRtaHuAyU5IBBBIY7+mMKOk5eQcbjWQ==
dependencies:
just-compare "^1.3.0"

@ -9,11 +9,11 @@ namespace Volo.CmsKit.Admin.Web.Menus
{
if (context.Menu.Name == StandardMenus.Main)
{
await ConfigureMainMenu(context);
await ConfigureMainMenuAsync(context);
}
}
private Task ConfigureMainMenu(MenuConfigurationContext context)
private Task ConfigureMainMenuAsync(MenuConfigurationContext context)
{
//Add main menu items.

@ -9,11 +9,11 @@ namespace Volo.CmsKit.Public.Web.Menus
{
if (context.Menu.Name == StandardMenus.Main)
{
await ConfigureMainMenu(context);
await ConfigureMainMenuAsync(context);
}
}
private Task ConfigureMainMenu(MenuConfigurationContext context)
private Task ConfigureMainMenuAsync(MenuConfigurationContext context)
{
//Add main menu items.

@ -3,7 +3,7 @@
"name": "volo.docstestapp",
"private": true,
"dependencies": {
"@abp/aspnetcore.mvc.ui.theme.basic": "^4.0.0-rc.5",
"@abp/docs": "^4.0.0-rc.5"
"@abp/aspnetcore.mvc.ui.theme.basic": "^4.0.0",
"@abp/docs": "^4.0.0"
}
}

@ -2,45 +2,45 @@
# yarn lockfile v1
"@abp/anchor-js@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/anchor-js/-/anchor-js-4.0.0-rc.5.tgz#6670766a69863275322017044cc84cb84b7aae87"
integrity sha512-kr+67S1l+RndksFPmaISXeSabymaGi0Wgr0vSHLcfHX2ja9bs+YTHqmahzo1H3K0IYQRcEf7NchGayMKRaPbuA==
"@abp/anchor-js@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/anchor-js/-/anchor-js-4.0.0.tgz#4c22939bfb3b97a89f5b701eef4935d68b705f8d"
integrity sha512-iVFPS6225xvd7o+R0ZDcz0nNeSOkoWIGNyNU9vx/7N3BOYHg+meMf1rO+5xFISu7giG9xfwH5+PWf7QkLJ4mPg==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
anchor-js "^4.2.2"
"@abp/aspnetcore.mvc.ui.theme.basic@^4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-4.0.0-rc.5.tgz#f57744513c443dd96b64a11376b67fabb0df821d"
integrity sha512-6P9nwq1RvAVtRl5NQq+R5QQIGflSbZMFdQTje4r7hDjhKlGLPQUBgWrYRP0TXkIbxz/fhBC9/Mg7lg3bmSH+uQ==
dependencies:
"@abp/aspnetcore.mvc.ui.theme.shared" "~4.0.0-rc.5"
"@abp/aspnetcore.mvc.ui.theme.shared@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-4.0.0-rc.5.tgz#ca73a54b7f328e7429ac639ce17526b72eab5581"
integrity sha512-GPc82OOz+MpSnTl46Wgeg53NYPI46jdy4/muragF6JR+3zBEo8tYe0jHP8T+LGtyGXdYoJ9Sx9274fRyxxh65Q==
dependencies:
"@abp/aspnetcore.mvc.ui" "~4.0.0-rc.5"
"@abp/bootstrap" "~4.0.0-rc.5"
"@abp/bootstrap-datepicker" "~4.0.0-rc.5"
"@abp/datatables.net-bs4" "~4.0.0-rc.5"
"@abp/font-awesome" "~4.0.0-rc.5"
"@abp/jquery-form" "~4.0.0-rc.5"
"@abp/jquery-validation-unobtrusive" "~4.0.0-rc.5"
"@abp/lodash" "~4.0.0-rc.5"
"@abp/luxon" "~4.0.0-rc.5"
"@abp/malihu-custom-scrollbar-plugin" "~4.0.0-rc.5"
"@abp/select2" "~4.0.0-rc.5"
"@abp/sweetalert" "~4.0.0-rc.5"
"@abp/timeago" "~4.0.0-rc.5"
"@abp/toastr" "~4.0.0-rc.5"
"@abp/aspnetcore.mvc.ui@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-4.0.0-rc.5.tgz#fa0dbc0b2f0a2c7777cdeb7613ec61307e6edd96"
integrity sha512-zEHA08snWGVL2Lm4ijpj/CnY1JxIg1ark3fxNsaKraVciVWbh5jmnBL8LCdKZFWZqEGCeWxrEnpt8OGIV+nhdg==
"@abp/aspnetcore.mvc.ui.theme.basic@^4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-4.0.0.tgz#b1822cf5bbc0f6eeb414ebd0877f6d1115a81fe7"
integrity sha512-yYXQkEnNhftzm+ZI8d3VFMlV5UuLNTMQQwV2eZ8tJfstUQrKV9bVd3+NdDOr3AkvcD8D7mvMFeBuoMYteL5kLQ==
dependencies:
"@abp/aspnetcore.mvc.ui.theme.shared" "~4.0.0"
"@abp/aspnetcore.mvc.ui.theme.shared@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-4.0.0.tgz#ba896056e9df5ac58e108df96996fbb2ca7a1a15"
integrity sha512-3RNn6VrNA+cqnPBoSbiCazN05cC2rhcRFMMxkEte+LImGbGOsxc4MflzHg5On1ExCGdqko8Axbw/ydy44Ak4Hw==
dependencies:
"@abp/aspnetcore.mvc.ui" "~4.0.0"
"@abp/bootstrap" "~4.0.0"
"@abp/bootstrap-datepicker" "~4.0.0"
"@abp/datatables.net-bs4" "~4.0.0"
"@abp/font-awesome" "~4.0.0"
"@abp/jquery-form" "~4.0.0"
"@abp/jquery-validation-unobtrusive" "~4.0.0"
"@abp/lodash" "~4.0.0"
"@abp/luxon" "~4.0.0"
"@abp/malihu-custom-scrollbar-plugin" "~4.0.0"
"@abp/select2" "~4.0.0"
"@abp/sweetalert" "~4.0.0"
"@abp/timeago" "~4.0.0"
"@abp/toastr" "~4.0.0"
"@abp/aspnetcore.mvc.ui@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-4.0.0.tgz#68502177a05f6ce7191a09b06a18c5b5dfab425d"
integrity sha512-tYHUWMwnwInrGSzC/OdN6bH/VHZEz5DP3rx2U6fcb0I5GvvRdQZxVgUvmWn6DeMA3PG10Gra4SfkhZqRQq9rjQ==
dependencies:
ansi-colors "^4.1.1"
extend-object "^1.0.0"
@ -51,181 +51,181 @@
micromatch "^4.0.2"
path "^0.12.7"
"@abp/bootstrap-datepicker@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-4.0.0-rc.5.tgz#38d665ba63dc9a0bb5fb8bfad50e7cac2fcdb8bf"
integrity sha512-nh+yJRn+CsnLd2VQelYcQbS49zP1LDSvczZrlCZUtiyAv400cBa1mC8tITxDnpAEBlICWb5s4Sg7kJXjyePsmw==
"@abp/bootstrap-datepicker@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-4.0.0.tgz#cdbd2c388c6d7ce8c6d72443038975063e6c6d02"
integrity sha512-hauH8VhpC8cxv1wCR6bVBcNqZepftdBXxEVID7TSAqgNyWjm/CrJqWLI+A0nnkG3IHoIm9D22iF47BamuYHptw==
dependencies:
bootstrap-datepicker "^1.9.0"
"@abp/bootstrap@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-4.0.0-rc.5.tgz#c49675030b2bde53a8b30249f38d85d4ae0aff49"
integrity sha512-eXJS1Eq2WyB9qKhyW/+9PUzZU5YNKe9q2Mt2nISwb0NmFepGiLkoygGQXtTe7yvyVdqrb6XM5pZHxdM0tRkYRQ==
"@abp/bootstrap@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-4.0.0.tgz#04174f18055f76f936e6fb73e5ff71ffa08a8528"
integrity sha512-Tmr0yoSWg7XHl02X5wv04CvYcL8KCpX8u6YGJj31jRZxUTeCvs5ETXlepOWcdxPQqi/4olXv5B9GEz5S9l5nZA==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
bootstrap "^4.5.0"
bootstrap-v4-rtl "4.4.1-2"
"@abp/clipboard@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-4.0.0-rc.5.tgz#66a62e7cd1cec2c4e94d606c9caa3290db7056f8"
integrity sha512-aGcNyWnYzpik8r2sElPuf4h+Bd3HFJscmP8fAbw43t877CqrXxKCt62cAjUM5aeF5fVvMIuw+/wPSmSY29Yy+Q==
"@abp/clipboard@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-4.0.0.tgz#4b01bead2e404c38a3ae9955dac5522d3c30c78b"
integrity sha512-39CZuF6lxUx1fluclzMl1uG0qIUX82S2wNbyJu2WGfuMMaaIgzSp9du/bB89Ik6rR5BFUU/3p8uvzOgy4sc2sQ==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
clipboard "^2.0.6"
"@abp/core@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/core/-/core-4.0.0-rc.5.tgz#3500839195c24f1275c55801037b02fd749516f7"
integrity sha512-Ubbej59+9z4FQWWCUSO3LphTmT8ZJQ/53cFcMOMIX/uoluli8IORBeAetTw4UDqG2rA70a5YKpyz17pG36D1kA==
"@abp/core@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/core/-/core-4.0.0.tgz#65e76c697e62162717e0edabf7edacc4228e682a"
integrity sha512-xcTTBFjLFZ9Trv2x9Y/c3XKezIx+x3MTXUD98QJPf1aR7T43TE/tLHRxdRfW3R8ka0O1wmlYshpkaw5pYNsj5w==
dependencies:
"@abp/utils" "^4.0.0-rc.5"
"@abp/utils" "^4.0.0"
"@abp/datatables.net-bs4@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-4.0.0-rc.5.tgz#00a9db6cd73bd1f6e5adaebe3add0f3192ed9b1d"
integrity sha512-Xvvm7j2UVgJfQRIPJ121vYH7upao22nqcFAxmeBFZ41Vgmt2gDkbXfvPHIAw06M0C2Gpym9shO+Sg4556xCubQ==
"@abp/datatables.net-bs4@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-4.0.0.tgz#fe737e054f6ba35e787a1cda185af2788ef86d39"
integrity sha512-mz7xZdzX1nlFyX7vNzB5w3RkqZ0IHrPgsXGOB7OCTKMRshDFVH2O51Oy4qoLDOXoTVeahHtR9v8thEWFR1SnZg==
dependencies:
"@abp/datatables.net" "~4.0.0-rc.5"
"@abp/datatables.net" "~4.0.0"
datatables.net-bs4 "^1.10.21"
"@abp/datatables.net@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-4.0.0-rc.5.tgz#ca581ca5b76a95702086b04da3f50b00b7da7973"
integrity sha512-xm7JQ/B9Opng1zai+cAILD6pl2Xlp54NMkfz7Y6U4DEYhzUAOT1idOVUhlCMtdE6RxVVqZGVozQZt7SZFZVImw==
"@abp/datatables.net@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-4.0.0.tgz#88ae5f1a6068fba55927e59f113686508e9553cb"
integrity sha512-JYTfMA1zlBNGiQHAiZiTj5ka6B6vq5k2jqsoLHup4pD9jpKwKRBGtltVsWoEnetd9eEbp4SaV/FCuh3RzmV6Pw==
dependencies:
"@abp/jquery" "~4.0.0-rc.5"
"@abp/jquery" "~4.0.0"
datatables.net "^1.10.21"
"@abp/docs@^4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/docs/-/docs-4.0.0-rc.5.tgz#7012ee97d8e0f74ae29187b724c841d476d9d1bd"
integrity sha512-8K9MbzdNuyW1IM2M8FvNiGwt1NShGlCiHyptajEYaMOgumtApuDn51OajjCBzahGehpumhMTK1gf4AwSKJogTg==
"@abp/docs@^4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/docs/-/docs-4.0.0.tgz#40d2f5f6ba28427a35ef5f1c6eec6953d4af5789"
integrity sha512-QXFiiLaf11AIf6uEGSSD2SzQIn11s3GeXQ0eEbeKMi/exC60Vbl1hg7mYHooeBKRjPCwK24gK7HHppSFHlHRsw==
dependencies:
"@abp/anchor-js" "~4.0.0-rc.5"
"@abp/clipboard" "~4.0.0-rc.5"
"@abp/malihu-custom-scrollbar-plugin" "~4.0.0-rc.5"
"@abp/popper.js" "~4.0.0-rc.5"
"@abp/prismjs" "~4.0.0-rc.5"
"@abp/anchor-js" "~4.0.0"
"@abp/clipboard" "~4.0.0"
"@abp/malihu-custom-scrollbar-plugin" "~4.0.0"
"@abp/popper.js" "~4.0.0"
"@abp/prismjs" "~4.0.0"
"@abp/font-awesome@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-4.0.0-rc.5.tgz#59a0516eb3c2d6f43a0a19a60f7c31fef4d421f4"
integrity sha512-VsmpC04epanCyZC6DVrDJz8FcupdU8/PpV9gnr7YvTk+VZQrq/zY9C21GWPDGKmBPavUlG4QMrX1oeUvu+9FoA==
"@abp/font-awesome@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-4.0.0.tgz#6e1e4bd1175a0b8d3b095e215c07e66ad0e42e19"
integrity sha512-kHfZ45UMDWSRk1gTV/BwVfSoXksJ9UlnD3SelTGeAkvbDqtDllqlp9y6c3qQcmZUE348Xl4hDTkU8upZwswCFQ==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
"@fortawesome/fontawesome-free" "^5.13.0"
"@abp/jquery-form@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-4.0.0-rc.5.tgz#91b90f4cb45bce584e33a74cc4366297fc4d4d40"
integrity sha512-5XrRF1xQMpZnAHYGDdpkLnYaAiKtWsmmHJ3aLxtg1QHnTuSKbasEtsOMVTqazkpiGcZsURcHNa4B/JUSK/KuBg==
"@abp/jquery-form@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-4.0.0.tgz#3afb41eb16d62e32c31a29c6a866f634a5a20cd8"
integrity sha512-cQq8PgzHfpK9/LxmjlnMsDn85wWvEOqjyLaepHFpTTt0341auSgXNwhp7rk71AUHD1lP3c9ALctmqu+gYmh9ag==
dependencies:
"@abp/jquery" "~4.0.0-rc.5"
"@abp/jquery" "~4.0.0"
jquery-form "^4.3.0"
"@abp/jquery-validation-unobtrusive@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-4.0.0-rc.5.tgz#f6c3320c9362bc70120dbdcce02cda814ec7c243"
integrity sha512-ftBxpeMLeRlaabPzU0wjDd4qvfgX38XtELnGjdQmTQ3P5lmAjhSTk1Fe8eIfGSINUAwYJyCjUlyYIMVi+kx9Tg==
"@abp/jquery-validation-unobtrusive@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-4.0.0.tgz#c3674d2b01b3c524de4c3fac1c6ae3657857ee7b"
integrity sha512-OGibIdw0ogjp6VQIebHM7OtMT36pjLKRrOHyCVpTmQ7NzDODV5ptG83vOnt5nFG0y9XFrOt8cnHrrd+K1Bpo/Q==
dependencies:
"@abp/jquery-validation" "~4.0.0-rc.5"
"@abp/jquery-validation" "~4.0.0"
jquery-validation-unobtrusive "^3.2.11"
"@abp/jquery-validation@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-4.0.0-rc.5.tgz#eb02731039b5befebf3666cb6cc1a7b54d5e9057"
integrity sha512-5LWBi+8Otch8SUCJA7DyKX7gD2Vy2aCODyPO5Y037lx7iUk/xHkhRnPDOVIGiS8fzyZx+fLNhJ6Lbfk9P+I5XA==
"@abp/jquery-validation@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-4.0.0.tgz#0a101937f89ff398317142b5271fa9a1de6571c2"
integrity sha512-4nzvhAktEINpQ2H+Hy7TOxxojTmTEm5dBTbHs1vbCWUuF0OTpouZWbMZDESdP0ZbjXcQ+vhwuM4e/pm/PeaHyQ==
dependencies:
"@abp/jquery" "~4.0.0-rc.5"
"@abp/jquery" "~4.0.0"
jquery-validation "^1.19.2"
"@abp/jquery@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-4.0.0-rc.5.tgz#244fbe71bb85abc1f54bfca269d9b0bfdf50469f"
integrity sha512-xt2gV3ZIMpyTFls2a58TTXEbhFxQGb7JacRojp5/+MyGL/SoQbOGENU3aK/fHRYD3VRUkhlKFGT6Ijv3LX83/A==
"@abp/jquery@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-4.0.0.tgz#00d24678b573bcc2fb14d8337ccdbf697b59d43b"
integrity sha512-gXLK97IvAZriNlG8e0qJcd7MvnpshJQURb4lg8VYibD7Fs/OBeHSAWM2Adgi3H9DnQL8XEUlWf487FSz4RC/Yg==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
jquery "~3.5.1"
"@abp/lodash@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-4.0.0-rc.5.tgz#f38dd3021d2b9877cf38fe812531968b7e607838"
integrity sha512-xdJ3WjqBz+C1gxrq1GcA66D1wrKn3QJ9/culTvEDr/eLpHjimnNjMmhAQqVxbaGk6qD6Q8Fswr8gtwqpPSe6eA==
"@abp/lodash@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-4.0.0.tgz#fe76d09517f6b1adf18edde94a31e13b003329dc"
integrity sha512-uitn5uYlb9xShRtV4AFOgp3lu2kADGMD4+a4fy5r4umlPM2uuMo0wMhzyYdBIG64JC5oNaqAzOwZyhhnn+HGJg==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
lodash "^4.17.15"
"@abp/luxon@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-4.0.0-rc.5.tgz#9448a48b6b3bf0446b421c2642188b9f11848572"
integrity sha512-S/lkCt/ou0Lv7KG3/XEAHx2S2YaDcEszyhnRBVCYSNqOUr0a56J+2MqKL5OFrOTNCfkPHDkaJVlSIXBEXokXFA==
"@abp/luxon@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-4.0.0.tgz#d9357e4fb422b6e18ebe897a86a4c4bc6fbe6858"
integrity sha512-tiE6NiSa4El88SVotxfmmpceINLz8MruaO/e/U3QjJEHjRoqlv0UBrM/x5Xz92c7ZIvL0Y4QvWNISeDg6/oqIQ==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
luxon "^1.24.1"
"@abp/malihu-custom-scrollbar-plugin@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-4.0.0-rc.5.tgz#87acd20de26e071bb38ec26fa4cd18026ca11464"
integrity sha512-QOp8R/LDabMhjapSjaArBEZUEslhOOGYIGfFm8CCrSeWGWJR8TFa68PIjhmUpNM5l8nlvC3MDMkQ/TnOaXgR4g==
"@abp/malihu-custom-scrollbar-plugin@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-4.0.0.tgz#972acf26f5eaa4bf9b8991cbe7c19fd0005d94e2"
integrity sha512-SpUo1CfppKzkE6Rb880pgB7oQ83Mkjsi0o6eE4r4gkF5hfzkuCXOmNjTYKfQIkE4n3G9QQd+8AAN/4xj4DiDrA==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
malihu-custom-scrollbar-plugin "^3.1.5"
"@abp/popper.js@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/popper.js/-/popper.js-4.0.0-rc.5.tgz#f589ca18c5e5cc6b1a93ba75a4b42f215aa56527"
integrity sha512-bbBtopaLeqU6MEfDfiCMi2xsppMA4LYnZSIpwuAM5hJ0ql9fVGIFCXR5gqH0BpHw5TZ53kl9cbPugSV40fls2g==
"@abp/popper.js@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/popper.js/-/popper.js-4.0.0.tgz#8fcb6aba4ad444668f536930cacbeb651af529ce"
integrity sha512-jzMWmN6DEcVE+veKmBR/l8a5/yKlcVKgtuSIwHTDnVI1UFW1MQWtyBHV6vXzH+7TqvlI3EevDg+UlIxTfpjNxg==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
popper.js "^1.16.0"
"@abp/prismjs@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-4.0.0-rc.5.tgz#febe1f5bc1ce4234e681c7dd76e5274c23c636ed"
integrity sha512-h7lhlk1dKhhL75jc6YBKb+w24tbMi2QMAsGnexcxfgUU043a9VFZzzU6lg3najH+dQzcVl5/qh5w9KoC7EYMGA==
"@abp/prismjs@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-4.0.0.tgz#7b98c233ac1f0025c14b27c1ba62910bd9022442"
integrity sha512-Eh63EUe2wnl8P1iyPo9Glt9BD6yFdrAjIbvBeFheJnSWgvij3mayOtCAq9P2ksKWo1Gq3hv1lm/p9vdYFRHoKw==
dependencies:
"@abp/clipboard" "~4.0.0-rc.5"
"@abp/core" "~4.0.0-rc.5"
"@abp/clipboard" "~4.0.0"
"@abp/core" "~4.0.0"
prismjs "^1.20.0"
"@abp/select2@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-4.0.0-rc.5.tgz#a7cc1e2e1985693f673c8214ac7db21d79dee4b8"
integrity sha512-ZNwT8u0CPDrCO4y5kCWd2EGhihwc+R6aBxx8tzL0AUAuHYRVA68T49Exyd1Fa+jESRjoVn18hys6HnTCUzZkWQ==
"@abp/select2@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-4.0.0.tgz#8fdf4c5e18f4093ee4e073dab950cf7aa9b2a540"
integrity sha512-XeXahcDMczdkZdP07yhQriIvbi1N5meeSGTnFyZX+bNTGzUOarPcuNYZ6Mcl3351HcyESHzuJbKbsk3RB1kGeg==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
select2 "^4.0.13"
"@abp/sweetalert@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-4.0.0-rc.5.tgz#e360ed98fc242348eb881e0031e4bf921bd1065b"
integrity sha512-dCmKYbmUBvsh95VjOeAxBsEgDQSTYswbAOXfTe/1nTf7ABVxUouKY++TYjK9xOgrmUx2fXC/kpImiAKI/xsLEg==
"@abp/sweetalert@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-4.0.0.tgz#0d93e92e95c6855aef7e19532a7513a078ece216"
integrity sha512-y3XtZqnUVZuQohpRO1ImyBZXhtrm4H+typIL/9VgcnlvQjBTyIaiwDmU8j07Bb2rKJKe0prVkkVARO7OnjOS5A==
dependencies:
"@abp/core" "~4.0.0-rc.5"
"@abp/core" "~4.0.0"
sweetalert "^2.1.2"
"@abp/timeago@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-4.0.0-rc.5.tgz#f0dd1e85249dc737e8cfedba072677dd6727d16c"
integrity sha512-Nqq9Ok7odlp+ptmCDsdcz1/j68n6gZN8+jBHZt18hU4ox4awruDbSguK7Pn2qu8Vt5zfGtit0+nqKamlq+dr6A==
"@abp/timeago@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-4.0.0.tgz#509cd8a84cd94c2644824b0c3af10c8fff6de2dc"
integrity sha512-90jzLYJusYTPwMbak1+XkXE85OPOXPpysRbL28KQwl7WLNBm8wx6IEoVZOHvOrpYscYdyeWhZCgILSJ8DR3a2Q==
dependencies:
"@abp/jquery" "~4.0.0-rc.5"
"@abp/jquery" "~4.0.0"
timeago "^1.6.7"
"@abp/toastr@~4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-4.0.0-rc.5.tgz#7f39a71fca5665cbcf46f02a7df6030ddb0114c7"
integrity sha512-jS01uP0MZb4OWfBTH1UEXlTPYMjK5WqorE8WZ6Am+jKzwfHudCDFmjFfSX5PV2/Ia3CP9NU8mwygXLmtsHZbHw==
"@abp/toastr@~4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-4.0.0.tgz#06e28665cb7f6eefee3f69c985dd2b3f86cd7f1d"
integrity sha512-YL1fahVpDszhwpnRTN87GCP523Mkaw42ApT2A/hZuBdwRzP/u5GwRfng0i/uhdYXCMkTKuHmaHnRyqhGiv7nfQ==
dependencies:
"@abp/jquery" "~4.0.0-rc.5"
"@abp/jquery" "~4.0.0"
toastr "^2.1.4"
"@abp/utils@^4.0.0-rc.5":
version "4.0.0-rc.5"
resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-4.0.0-rc.5.tgz#45b55d6bbf69ad2a052bc2635c039d2cc4aac401"
integrity sha512-pRYUSh30VT4702lfnQCswIwLVqNC6ZFsmydXngwZASJEJVKj30XitSlixnKhocvozG/87H0sYVzvwmUyJiHHQw==
"@abp/utils@^4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-4.0.0.tgz#6c2b5f5c20821028fe6cdbffb5e2f6088956b9d5"
integrity sha512-Yj2yCObvS6X/P8rdRMQBo7940k5P/dZhgCUSo9C6P9GNmJY8wNdJFFyhRtaHuAyU5IBBBIY7+mMKOk5eQcbjWQ==
dependencies:
just-compare "^1.3.0"

@ -13,11 +13,11 @@ namespace Volo.Docs.Admin.Navigation
{
if (context.Menu.Name == StandardMenus.Main)
{
await ConfigureMainMenu(context);
await ConfigureMainMenuAsync(context);
}
}
private async Task ConfigureMainMenu(MenuConfigurationContext context)
private async Task ConfigureMainMenuAsync(MenuConfigurationContext context)
{
var administrationMenu = context.Menu.GetAdministration();

@ -71,7 +71,7 @@
if (feature.ValueType is ToggleStringValueType)
{
<Field>
<Check TValue="bool" @bind-checked="@ToggleValues[feature.Name]">@feature.DisplayName</Check>
<Check TValue="bool" @bind-Checked="@ToggleValues[feature.Name]">@feature.DisplayName</Check>
</Field>
}
}

@ -27,12 +27,12 @@ namespace Volo.Abp.Identity.Blazor
if (hasRolePermission)
{
identityMenuItem.AddItem(new ApplicationMenuItem(IdentityMenuNames.Roles, l["Roles"], url: "/identity/roles"));
identityMenuItem.AddItem(new ApplicationMenuItem(IdentityMenuNames.Roles, l["Roles"], url: "identity/roles"));
}
if (hasUserPermission)
{
identityMenuItem.AddItem(new ApplicationMenuItem(IdentityMenuNames.Users, l["Users"], url: "/identity/users"));
identityMenuItem.AddItem(new ApplicationMenuItem(IdentityMenuNames.Users, l["Users"], url: "identity/users"));
}
}
}

@ -89,7 +89,7 @@
<Validation MessageLocalizer="@LH.Localize">
<Field>
<FieldLabel>@L["DisplayName:RoleName"]</FieldLabel>
<TextEdit @bind-Text="@NewEntity.Name">
<TextEdit @bind-Text="@NewEntity.Name" Autofocus="true">
<Feedback>
<ValidationError />
</Feedback>
@ -127,7 +127,7 @@
<Validation MessageLocalizer="@LH.Localize">
<Field>
<FieldLabel>@L["DisplayName:RoleName"]</FieldLabel>
<TextEdit @bind-Text="EditingEntity.Name">
<TextEdit @bind-Text="EditingEntity.Name" Autofocus="true">
<Feedback>
<ValidationError />
</Feedback>

@ -97,7 +97,7 @@
<Validation MessageLocalizer="@LH.Localize">
<Field>
<FieldLabel>@L["DisplayName:UserName"]</FieldLabel>
<TextEdit @bind-Text="NewEntity.UserName">
<TextEdit @bind-Text="NewEntity.UserName" Autofocus="true">
<Feedback>
<ValidationError />
</Feedback>
@ -208,7 +208,7 @@
<Validation MessageLocalizer="@LH.Localize">
<Field>
<FieldLabel>@L["DisplayName:UserName"]</FieldLabel>
<TextEdit @bind-Text="EditingEntity.UserName">
<TextEdit @bind-Text="EditingEntity.UserName" Autofocus="true">
<Feedback>
<ValidationError />
</Feedback>

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save