Merge branch 'dev' into maliming/linkuser

pull/5190/head
maliming 5 years ago
commit 283d995a85

@ -4,12 +4,13 @@
<Version>3.1.0</Version>
<NoWarn>$(NoWarn);CS1591</NoWarn>
<PackageIconUrl>https://abp.io/assets/abp_nupkg.png</PackageIconUrl>
<PackageProjectUrl>https://abp.io</PackageProjectUrl>
<PackageLicenseUrl>https://github.com/abpframework/abp/blob/master/LICENSE</PackageLicenseUrl>
<PackageProjectUrl>https://abp.io/</PackageProjectUrl>
<PackageLicenseFile>LICENSE.md</PackageLicenseFile>
<RepositoryType>git</RepositoryType>
<RepositoryUrl>https://github.com/abpframework/abp/</RepositoryUrl>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="SourceLink.Create.CommandLine" Version="2.8.3" PrivateAssets="All" />
<None Include="LICENSE.md" Pack="true" PackagePath=""/>
</ItemGroup>
</Project>

@ -0,0 +1,405 @@
# Introducing the Angular Service Proxy Generation
Angular Service Proxy System **generates TypeScript services and models** to consume your backend HTTP APIs developed using the ABP Framework. So, you **don't manually create** models for your server side DTOs and perform raw HTTP calls to the server.
ABP Framework has introduced the **new** Angular Service Proxy Generation system with the version 3.1. While this feature was available since the [v2.3](https://blog.abp.io/abp/ABP-Framework-v2_3_0-Has-Been-Released), it was not well covering some scenarios, like inheritance and generic types and had some known problems. **With the v3.1, we've re-written** it using the [Angular Schematics](https://angular.io/guide/schematics) system. Now, it is much more stable and feature rich.
This post introduces the service proxy generation system and highlights some important features.
## Installation
### ABP CLI
You need to have the [ABP CLI](https://docs.abp.io/en/abp/latest/CLI) to use the system. So, install it if you haven't installed before:
````bash
dotnet tool install -g Volo.Abp.Cli
````
If you already have installed it before, you can update to the latest version:
````shell
dotnet tool update -g Volo.Abp.Cli
````
### Project Configuration
> If you've created your project with version 3.1 or later, you can skip this part since it will be already installed in your solution.
For a solution that was created before v3.1, follow the steps below to configure the angular application:
* Add `@abp/ng.schematics` package to the `devDependencies` of the Angular project. Run the following command in the root folder of the angular application:
````bash
npm install @abp/ng.schematics --save-dev
````
- Add `rootNamespace` entry into the `apis/default` section in the `/src/environments/environment.ts`, as shown below:
```json
apis: {
default: {
...
rootNamespace: 'Acme.BookStore'
},
}
```
`Acme.BookStore` should be replaced by the root namespace of your .NET project. This ensures to not create unnecessary nested folders while creating the service proxy code. This value is `AngularProxyDemo` for the example solution explained below.
## Basic Usage
### Project Creation
> If you already have a solution, you can skip this section.
You need to [create](https://abp.io/get-started) your solution with the Angular UI. You can use the [ABP CLI](https://docs.abp.io/en/abp/latest/CLI) to create a new solution:
````bash
abp new AngularProxyDemo -u angular
````
#### Run the Application
The backend application must be up and running to be able to use the service proxy code generation system.
> See the [getting started](https://docs.abp.io/en/abp/latest/Getting-Started?UI=NG&DB=EF&Tiered=No) guide if you don't know details of creating and running the solution.
### Backend
Assume that we have an `IBookAppService` interface:
````csharp
using System.Collections.Generic;
using System.Threading.Tasks;
using Volo.Abp.Application.Services;
namespace AngularProxyDemo.Books
{
public interface IBookAppService : IApplicationService
{
public Task<List<BookDto>> GetListAsync();
}
}
````
That uses a `BookDto` defined as shown:
```csharp
using System;
using Volo.Abp.Application.Dtos;
namespace AngularProxyDemo.Books
{
public class BookDto : EntityDto<Guid>
{
public string Name { get; set; }
public DateTime PublishDate { get; set; }
}
}
```
And implemented as the following:
```csharp
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Volo.Abp.Application.Services;
namespace AngularProxyDemo.Books
{
public class BookAppService : ApplicationService, IBookAppService
{
public async Task<List<BookDto>> GetListAsync()
{
//TODO: get books from a database...
}
}
}
```
It simply returns a list of books. You probably want to get the books from a database, but it doesn't matter for this article.
### HTTP API
Thanks to the [auto API controllers](https://docs.abp.io/en/abp/latest/API/Auto-API-Controllers) system of the ABP Framework, we don't have to develop API controllers manually. Just **run the backend (*HttpApi.Host*) application** that shows the [Swagger UI](https://swagger.io/tools/swagger-ui/) by default. You will see the **GET** API for the books:
![swagger-book-list](swagger-book-list.png)
### Service Proxy Generation
Open a **command line** in the **root folder of the Angular application** and execute the following command:
````bash
abp generate-proxy
````
It should produce an output like the following:
````bash
CREATE src/app/shared/models/books/index.ts (142 bytes)
CREATE src/app/shared/services/books/book.service.ts (437 bytes)
...
````
> `generate-proxy` command can take some some optional parameters for advanced scenarios (like [modular development](https://docs.abp.io/en/abp/latest/Module-Development-Basics)). You can take a look at the [documentation](https://docs.abp.io/en/abp/latest/UI/Angular/Service-Proxies).
It basically creates two files;
src/app/shared/services/books/**book.service.ts**: This is the service that can be injected and used to get the list of books;
````typescript
import { RestService } from '@abp/ng.core';
import { Injectable } from '@angular/core';
import type { BookDto } from '../../models/book';
@Injectable({
providedIn: 'root',
})
export class BookService {
apiName = 'Default';
getList = () =>
this.restService.request<any, BookDto[]>({
method: 'GET',
url: `/api/app/book`,
},
{ apiName: this.apiName });
constructor(private restService: RestService) {}
}
````
src/app/shared/models/books/**index.ts**: This file contains the modal classes corresponding to the DTOs defined in the server side;
````typescript
import type { EntityDto } from '@abp/ng.core';
export interface BookDto extends EntityDto<string> {
name: string;
publishDate: string;
}
````
You can now inject the `BookService` into any Angular component and use the `getList()` method to get the list of books.
### About the Generated Code
The generated code is;
* **Simple**: It is almost identical to the code if you've written it yourself.
* **Splitted**: Instead of a single, large file;
* It creates a separate `.ts` file for every backend **service**. **Model** (DTO) classes are also grouped per service.
* It understands the [modularity](https://docs.abp.io/en/abp/latest/Module-Development-Basics), so creates the services for your own **module** (or the module you've specified).
* **Object oriented**;
* Supports **inheritance** of server side DTOs and generates the code respecting to the inheritance structure.
* Supports **generic types**.
* Supports **re-using type definitions** across services and doesn't generate the same DTO multiple times.
* **Well-aligned to the backend**;
* Service **method signatures** match exactly with the services on the backend services. This is achieved by a special endpoint exposed by the ABP Framework that well defines the backend contracts.
* **Namespaces** are exactly matches to the backend services and DTOs.
* **Well-aligned with the ABP Framework**;
* Recognizes the **standard ABP Framework DTO types** (like `EntityDto`, `ListResultDto`... etc) and doesn't repeat these classes in the application code, but uses from the `@abp/ng.core` package.
* Uses the `RestService` defined by the `@abp/ng.core` package which simplifies the generated code, keeps it short and re-uses all the logics implemented by the `RestService` (including error handling, authorization token injection, using multiple server endpoints... etc).
These are the main motivations behind the decision of creating a service proxy generation system, instead of using a pre-built tool like [NSWAG](https://github.com/RicoSuter/NSwag).
## Other Examples
Let me show you a few more examples.
### Updating an Entity
Assume that you added a new method to the server side application service, to update a book:
```csharp
public Task<BookDto> UpdateAsync(Guid id, BookUpdateDto input);
```
`BookUpdateDto` is a simple class defined shown below:
```csharp
using System;
namespace AngularProxyDemo.Books
{
public class BookUpdateDto
{
public string Name { get; set; }
public DateTime PublishDate { get; set; }
}
}
```
Let's re-run the `generate-proxy` command to see the result:
````
abp generate-proxy
````
The output of this command will be like the following:
````bash
UPDATE src/app/shared/services/books/book.service.ts (660 bytes)
UPDATE src/app/shared/models/books/index.ts (217 bytes)
````
It tells us two files have been updated. Let's see the changes;
**book.service.ts**
````typescript
import { RestService } from '@abp/ng.core';
import { Injectable } from '@angular/core';
import type { BookDto, BookUpdateDto } from '../../models/books';
@Injectable({
providedIn: 'root',
})
export class BookService {
apiName = 'Default';
getList = () =>
this.restService.request<any, BookDto[]>({
method: 'GET',
url: `/api/app/book`,
},
{ apiName: this.apiName });
update = (id: string, input: BookUpdateDto) =>
this.restService.request<any, BookDto>({
method: 'PUT',
url: `/api/app/book/${id}`,
body: input,
},
{ apiName: this.apiName });
constructor(private restService: RestService) {}
}
````
`update` function has been added to the `BookService` that gets an `id` and a `BookUpdateDto` as the parameters.
**index.ts**
````typescript
import type { EntityDto } from '@abp/ng.core';
export interface BookDto extends EntityDto<string> {
name: string;
publishDate: string;
}
export interface BookUpdateDto {
name: string;
publishDate: string;
}
````
Added a new DTO class: `BookUpdateDto`.
### Advanced Example
In this example, I want to show a DTO structure using inheritance, generics, arrays and dictionaries.
I've created an `IOrderAppService` as shown below:
````csharp
using System.Threading.Tasks;
using Volo.Abp.Application.Services;
namespace AngularProxyDemo.Orders
{
public interface IOrderAppService : IApplicationService
{
public Task CreateAsync(OrderCreateDto input);
}
}
````
`OrderCreateDto` and the related DTOs are as the followings;
````csharp
using System;
using System.Collections.Generic;
using Volo.Abp.Data;
namespace AngularProxyDemo.Orders
{
public class OrderCreateDto : IHasExtraProperties
{
public Guid CustomerId { get; set; }
public DateTime CreationTime { get; set; }
//ARRAY of DTOs
public OrderDetailDto[] Details { get; set; }
//DICTIONARY
public Dictionary<string, object> ExtraProperties { get; set; }
}
public class OrderDetailDto : GenericDetailDto<int> //INHERIT from GENERIC
{
public string Note { get; set; }
}
//GENERIC class
public abstract class GenericDetailDto<TCount>
{
public Guid ProductId { get; set; }
public TCount Count { get; set; }
}
}
````
When I run the `abp generate-proxy` command again, I see two new files have been created.
src/app/shared/services/orders/**order.service.ts**
````typescript
import { RestService } from '@abp/ng.core';
import { Injectable } from '@angular/core';
import type { OrderCreateDto } from '../../models/orders';
@Injectable({
providedIn: 'root',
})
export class OrderService {
apiName = 'Default';
create = (input: OrderCreateDto) =>
this.restService.request<any, void>({
method: 'POST',
url: `/api/app/order`,
body: input,
},
{ apiName: this.apiName });
constructor(private restService: RestService) {}
}
````
src/app/shared/models/orders/**index.ts**
````typescript
import type { GenericDetailDto } from '../../models/orders';
export interface OrderCreateDto {
customerId: string;
creationTime: string;
details: OrderDetailDto[];
extraProperties: string | object;
}
export interface OrderDetailDto extends GenericDetailDto<number> {
note: string;
}
````
NOTE: 3.1.0-rc2 was generating the code above, which is wrong. It will be fixed in the next RC versions.

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

@ -16,6 +16,12 @@ To update an existing installation:
dotnet tool update -g Volo.Abp.Cli
````
## Global Options
While each command may have a set of options, there are some global options those can be used with any command;
* `--skip-cli-version-check`: Skips to check the latest version of the ABP CLI. If you don't specify, it will check the latest version and shows a warning message if there is a newer version of the ABP CLI.
## Commands
Here, the list of all available commands before explaining their details:
@ -181,6 +187,13 @@ Usage:
abp generate-proxy
````
#### Options
* `--module` or `-m`: Specifies the name of the backend module you wish to generate proxies for. Default value: `app`.
* `--source` or `-s`: Specifies the Angular project name to resolve the root namespace & API definition URL from. Default value: `defaultProject`.
* `--target` or `-t`: Specifies the Angular project name to place generated code in. Default value: `defaultProject`.
* `--prompt` or `-p`: Asks the options from the command line prompt (for the unspecified options).
> See the [Angular Service Proxies document](UI/Angular/Service-Proxies.md) for more.
@ -196,7 +209,7 @@ abp switch-to-preview [options]
#### Options
`--solution-directory` or `-sd`: Specifies the directory. The solution should be in that directory or in any of its sub directories. If not specified, default is the current directory.
* `--solution-directory` or `-sd`: Specifies the directory. The solution should be in that directory or in any of its sub directories. If not specified, default is the current directory.
### switch-to-nightly
@ -211,7 +224,7 @@ abp switch-to-nightly [options]
#### Options
`--solution-directory` or `-sd`: Specifies the directory. The solution should be in that directory or in any of its sub directories. If not specified, default is the current directory.
* `--solution-directory` or `-sd`: Specifies the directory. The solution should be in that directory or in any of its sub directories. If not specified, default is the current directory.
### switch-to-stable
@ -224,7 +237,7 @@ abp switch-to-stable [options]
````
#### Options
`--solution-directory` or `-sd`: Specifies the directory. The solution should be in that directory or in any of its sub directories. If not specified, default is the current directory.
* `--solution-directory` or `-sd`: Specifies the directory. The solution should be in that directory or in any of its sub directories. If not specified, default is the current directory.
### translate

@ -1,9 +1,11 @@
## Using DevExtreme with ABP Based Applications
## Using DevExtreme Components With the ABP Framework
Hi, in this step by step article, I will show you how to integrate DevExtreme components into ABP Framework based applications.
Hi, in this step by step article, I will show you how to integrate [DevExtreme](https://js.devexpress.com/) components into ABP Framework-based applications.
![both-example-result](both-example-result.png)
*(A screenshot from the example application developed in this article)*
## Create the Project
ABP Framework offers startup templates to get into the business faster. We can download a new startup template using [ABP CLI](https://docs.abp.io/en/abp/latest/CLI):
@ -151,7 +153,7 @@ namespace DevExtremeSample.Web.Bundling
}
```
As you see, the `DevExtremeScriptContributor` is depends on `JQueryScriptContributor` which adds JQuery related files before the DevExpress packages (see the [bundling system](https://docs.abp.io/en/abp/latest/UI/AspNetCore/Bundling-Minification) for details).
As you see, the `DevExtremeScriptContributor` depends on `JQueryScriptContributor` which adds JQuery related files before the DevExpress packages (see the [bundling system](https://docs.abp.io/en/abp/latest/UI/AspNetCore/Bundling-Minification) for details).
#### Create DevExtremeJsViewComponent
@ -184,7 +186,7 @@ namespace DevExtremeSample.Web.Components.DevExtremeJs
<abp-script type="typeof(DevExtremeScriptContributor)" />
```
Your final Web project should be like as the following:
Your final Web project should be like the following:
![devextreme-js](devextreme-js.png)
@ -204,7 +206,7 @@ Configure<AbpLayoutHookOptions>(options =>
#### Known Issue: Uncaught TypeError: MutationObserver.observe: Argument 1 is not an object.
> This issue does exists in the ABP Framework v3.0 and earlier versions. If you are using ABP Framework v3.1 or a latter version, you can skip this section.
> This issue does exist in the ABP Framework v3.0 and earlier versions. If you are using ABP Framework v3.1 or a later version, you can skip this section.
When you run your `*.Web` project, you will see an exception (`Uncaught TypeError: MutationObserver.observe: Argument 1 is not an object.`) at your console.
@ -265,7 +267,7 @@ I've used an in-memory list to store data for this example, instead of a real da
#### JSON Serialization
You can see some `JsonProperty` attributes on the DTO properties. I uses these attributes because DevExtreme example expects `PascalCase` property names in the serialized JSON that is sent to the client. But ABP Framework & ASP.NET Core conventionally uses `camelCase` property names on JSON serialization. Adding these `JsonProperty` attributes ensures that the related properties are serialized as `PascalCase`.
You can see some `JsonProperty` attributes on the DTO properties. I use these attributes because DevExtreme example expects `PascalCase` property names in the serialized JSON that is sent to the client. But ABP Framework & ASP.NET Core conventionally uses `camelCase` property names on JSON serialization. Adding these `JsonProperty` attributes ensures that the related properties are serialized as `PascalCase`.
#### DevExtreme Components vs Application Service Methods
@ -300,3 +302,7 @@ Html.DevExtreme().DataGrid<Order>()
.Key("OrderID")
)
```
## Conclusion
In this article, I've explained how to use [DevExtreme](https://js.devexpress.com/) components in your application. ABP Framework is designed so that it can work with any UI library/framework.

@ -323,6 +323,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.BlobStoring.Aws",
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.BlobStoring.Aws.Tests", "test\Volo.Abp.BlobStoring.Aws.Tests\Volo.Abp.BlobStoring.Aws.Tests.csproj", "{2CD3B26A-CA81-4279-8D5D-6A594517BB3F}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Kafka", "src\Volo.Abp.Kafka\Volo.Abp.Kafka.csproj", "{2A864049-9CD5-4493-8CDB-C408474D43D4}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.EventBus.Kafka", "src\Volo.Abp.EventBus.Kafka\Volo.Abp.EventBus.Kafka.csproj", "{C1D891B0-AE83-42CB-987D-425A2787DE78}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.GlobalFeatures", "src\Volo.Abp.GlobalFeatures\Volo.Abp.GlobalFeatures.csproj", "{04F44063-C952-403A-815F-EFB778BDA125}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.GlobalFeatures.Tests", "test\Volo.Abp.GlobalFeatures.Tests\Volo.Abp.GlobalFeatures.Tests.csproj", "{231F1581-AA21-44C3-BF27-51EB3AD5355C}"
@ -965,6 +969,14 @@ Global
{2CD3B26A-CA81-4279-8D5D-6A594517BB3F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2CD3B26A-CA81-4279-8D5D-6A594517BB3F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2CD3B26A-CA81-4279-8D5D-6A594517BB3F}.Release|Any CPU.Build.0 = Release|Any CPU
{2A864049-9CD5-4493-8CDB-C408474D43D4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2A864049-9CD5-4493-8CDB-C408474D43D4}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2A864049-9CD5-4493-8CDB-C408474D43D4}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2A864049-9CD5-4493-8CDB-C408474D43D4}.Release|Any CPU.Build.0 = Release|Any CPU
{C1D891B0-AE83-42CB-987D-425A2787DE78}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C1D891B0-AE83-42CB-987D-425A2787DE78}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C1D891B0-AE83-42CB-987D-425A2787DE78}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C1D891B0-AE83-42CB-987D-425A2787DE78}.Release|Any CPU.Build.0 = Release|Any CPU
{04F44063-C952-403A-815F-EFB778BDA125}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{04F44063-C952-403A-815F-EFB778BDA125}.Debug|Any CPU.Build.0 = Debug|Any CPU
{04F44063-C952-403A-815F-EFB778BDA125}.Release|Any CPU.ActiveCfg = Release|Any CPU
@ -1136,6 +1148,8 @@ Global
{8E49687A-E69F-49F2-8DB0-428D0883A937} = {447C8A77-E5F0-4538-8687-7383196D04EA}
{50968CDE-1029-4051-B2E5-B69D0ECF2A18} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6}
{2CD3B26A-CA81-4279-8D5D-6A594517BB3F} = {447C8A77-E5F0-4538-8687-7383196D04EA}
{2A864049-9CD5-4493-8CDB-C408474D43D4} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6}
{C1D891B0-AE83-42CB-987D-425A2787DE78} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6}
{04F44063-C952-403A-815F-EFB778BDA125} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6}
{231F1581-AA21-44C3-BF27-51EB3AD5355C} = {447C8A77-E5F0-4538-8687-7383196D04EA}
EndGlobalSection

@ -0,0 +1,13 @@
using Volo.Abp.AspNetCore.Mvc.UI.Bundling;
using System.Collections.Generic;
namespace Volo.Abp.AspNetCore.Mvc.UI.Packages.CropperJs
{
public class CropperJsScriptContributor : BundleContributor
{
public override void ConfigureBundle(BundleConfigurationContext context)
{
context.Files.AddIfNotContains("/libs/cropperjs/js/cropper.min.js");
}
}
}

@ -0,0 +1,13 @@
using System.Collections.Generic;
using Volo.Abp.AspNetCore.Mvc.UI.Bundling;
namespace Volo.Abp.AspNetCore.Mvc.UI.Packages.CropperJs
{
public class CropperJsStyleContributor : BundleContributor
{
public override void ConfigureBundle(BundleConfigurationContext context)
{
context.Files.AddIfNotContains("/libs/cropperjs/css/cropper.min.css");
}
}
}

@ -0,0 +1,16 @@
using System.Collections.Generic;
using Volo.Abp.AspNetCore.Mvc.UI.Bundling;
using Volo.Abp.AspNetCore.Mvc.UI.Packages.JQuery;
using Volo.Abp.Modularity;
namespace Volo.Abp.AspNetCore.Mvc.UI.Packages.StarRatingSvg
{
[DependsOn(typeof(JQueryScriptContributor))]
public class StarRatingSvgScriptContributor : BundleContributor
{
public override void ConfigureBundle(BundleConfigurationContext context)
{
context.Files.AddIfNotContains("/libs/star-rating-svg/js/jquery.star-rating-svg.min.js");
}
}
}

@ -0,0 +1,13 @@
using System.Collections.Generic;
using Volo.Abp.AspNetCore.Mvc.UI.Bundling;
namespace Volo.Abp.AspNetCore.Mvc.UI.Packages.StarRatingSvg
{
public class StarRatingSvgStyleContributor : BundleContributor
{
public override void ConfigureBundle(BundleConfigurationContext context)
{
context.Files.AddIfNotContains("/libs/star-rating-svg/css/star-rating-svg.css");
}
}
}

@ -41,9 +41,13 @@ namespace Volo.Abp.Cli
{
Logger.LogInformation("ABP CLI (https://abp.io)");
await CheckCliVersionAsync();
var commandLineArgs = CommandLineArgumentParser.Parse(args);
if (!commandLineArgs.Options.ContainsKey("skip-cli-version-check"))
{
await CheckCliVersionAsync();
}
var commandType = CommandSelector.Select(commandLineArgs);
using (var scope = ServiceScopeFactory.CreateScope())
@ -72,7 +76,7 @@ namespace Volo.Abp.Cli
var currentCliVersion = await GetCurrentCliVersion(assembly);
var updateChannel = GetUpdateChannel(currentCliVersion);
Logger.LogInformation($"Version {currentCliVersion} ({updateChannel} channel)");
Logger.LogInformation($"Version {currentCliVersion} ({updateChannel})");
try
{

@ -115,7 +115,6 @@ namespace Volo.Abp.Cli.Commands
throw new CliUsageException(sb.ToString());
}
public static class Options
{
public static class Project

@ -2,7 +2,6 @@ using System;
using System.IO;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Volo.Abp.Cli.Args;
using Volo.Abp.Cli.Utils;
@ -17,7 +16,31 @@ namespace Volo.Abp.Cli.Commands
CheckAngularJsonFile();
CheckNgSchematics();
CmdHelper.RunCmd("npx ng g @abp/ng.schematics:proxy");
var prompt = commandLineArgs.Options.ContainsKey("p") || commandLineArgs.Options.ContainsKey("prompt");
var defaultValue = prompt ? null : "__default";
var module = commandLineArgs.Options.GetOrNull(Options.Module.Short, Options.Module.Long) ?? defaultValue;
var source = commandLineArgs.Options.GetOrNull(Options.Source.Short, Options.Source.Long) ?? defaultValue;
var target = commandLineArgs.Options.GetOrNull(Options.Target.Short, Options.Target.Long) ?? defaultValue;
var commandBuilder = new StringBuilder("npx ng g @abp/ng.schematics:proxy");
if (module != null)
{
commandBuilder.Append($" --module {module}");
}
if (source != null)
{
commandBuilder.Append($" --source {source}");
}
if (target != null)
{
commandBuilder.Append($" --target {target}");
}
CmdHelper.RunCmd(commandBuilder.ToString());
return Task.CompletedTask;
}
@ -29,20 +52,21 @@ namespace Volo.Abp.Cli.Commands
if (!File.Exists(packageJsonPath))
{
throw new CliUsageException(
"package.json file not found" +
Environment.NewLine +
GetUsageInfo()
"package.json file not found" +
Environment.NewLine +
GetUsageInfo()
);
}
var schematicsPackageNode = (string) JObject.Parse(File.ReadAllText(packageJsonPath))["devDependencies"]?["@abp/ng.schematics"];
var schematicsPackageNode =
(string) JObject.Parse(File.ReadAllText(packageJsonPath))["devDependencies"]?["@abp/ng.schematics"];
if (schematicsPackageNode == null)
{
throw new CliUsageException(
"\"@abp/ng.schematics\" NPM package should be installed to the devDependencies before running this command!" +
Environment.NewLine +
GetUsageInfo()
"\"@abp/ng.schematics\" NPM package should be installed to the devDependencies before running this command!" +
Environment.NewLine +
GetUsageInfo()
);
}
}
@ -69,9 +93,12 @@ namespace Volo.Abp.Cli.Commands
sb.AppendLine("");
sb.AppendLine(" abp generate-proxy");
sb.AppendLine("");
sb.AppendLine("Examples:");
sb.AppendLine("Options:");
sb.AppendLine("");
sb.AppendLine(" abp generate-proxy");
sb.AppendLine("-m|--module <module-name> (default: 'app') The name of the backend module you wish to generate proxies for.");
sb.AppendLine("-s|--source <source-name> (default: 'defaultProject') Angular project name to resolve the root namespace & API definition URL from.");
sb.AppendLine("-t|--target <target-name> (default: 'defaultProject') Angular project name to place generated code in.");
sb.AppendLine("-p|--prompt Asks the options from the command line prompt (for the missing options)");
sb.AppendLine("");
sb.AppendLine("See the documentation for more info: https://docs.abp.io/en/abp/latest/CLI");
@ -82,5 +109,32 @@ namespace Volo.Abp.Cli.Commands
{
return "Generates Angular service proxies and DTOs to consume HTTP APIs.";
}
public static class Options
{
public static class Module
{
public const string Short = "m";
public const string Long = "module";
}
public static class Source
{
public const string Short = "s";
public const string Long = "source";
}
public static class Target
{
public const string Short = "t";
public const string Long = "target";
}
public static class Prompt
{
public const string Short = "p";
public const string Long = "prompt";
}
}
}
}

@ -86,8 +86,7 @@ namespace Volo.Abp.Cli.NuGet
versions = versions.Where(x => !x.IsPrerelease).ToList();
}
var semanticVersions = versions.ToList();
return semanticVersions.Any() ? semanticVersions.Max() : null;
return versions.Any() ? versions.Max() : null;
}
}

@ -236,7 +236,7 @@ namespace Volo.Abp.Cli.ProjectModification
}
}
if (version == currentVersion)
if (string.IsNullOrEmpty(version) || version == currentVersion)
{
return false;
}
@ -275,6 +275,12 @@ namespace Volo.Abp.Cli.ProjectModification
? versionList.First()
: versionList.FirstOrDefault(v => !SemanticVersion.Parse(v).IsPrerelease);
if (string.IsNullOrEmpty(newVersion))
{
_fileVersionStorage[package.Name] = newVersion;
return newVersion;
}
var newVersionWithPrefix = $"~{newVersion}";
_fileVersionStorage[package.Name] = newVersionWithPrefix;

@ -31,6 +31,7 @@ namespace Volo.Abp.Cli.ProjectModification
{
var solutionPath = GetSolutionPath(commandLineArgs);
var solutionFolder = GetSolutionFolder(commandLineArgs);
var solutionAngularFolder = GetSolutionAngularFolder(solutionFolder);
await _nugetPackagesVersionUpdater.UpdateSolutionAsync(
solutionPath,
@ -40,42 +41,74 @@ namespace Volo.Abp.Cli.ProjectModification
solutionFolder,
false,
true);
if (solutionAngularFolder != null)
{
await _npmPackagesUpdater.Update(
solutionAngularFolder,
false,
true);
}
}
public async Task SwitchToNightlyPreview(CommandLineArgs commandLineArgs)
{
var solutionPath = GetSolutionPath(commandLineArgs);
var solutionFolder = GetSolutionFolder(commandLineArgs);
var solutionAngularFolder = GetSolutionAngularFolder(solutionFolder);
_packageSourceManager.Add(solutionFolder, "ABP Nightly", "https://www.myget.org/F/abp-nightly/api/v3/index.json");
await _nugetPackagesVersionUpdater.UpdateSolutionAsync(
solutionPath,
true);
if (solutionPath != null)
{
await _nugetPackagesVersionUpdater.UpdateSolutionAsync(
solutionPath,
true);
}
await _npmPackagesUpdater.Update(
solutionFolder,
true);
if (solutionAngularFolder != null)
{
await _npmPackagesUpdater.Update(
solutionAngularFolder,
true);
}
}
public async Task SwitchToStable(CommandLineArgs commandLineArgs)
{
var solutionPath = GetSolutionPath(commandLineArgs);
var solutionFolder = GetSolutionFolder(commandLineArgs);
var solutionAngularFolder = GetSolutionAngularFolder(solutionFolder);
_packageSourceManager.Remove(solutionFolder, "ABP Nightly");
await _nugetPackagesVersionUpdater.UpdateSolutionAsync(
solutionPath,
false,
false,
true);
if (solutionPath != null)
{
await _nugetPackagesVersionUpdater.UpdateSolutionAsync(
solutionPath,
false,
false,
true);
}
await _npmPackagesUpdater.Update(
solutionFolder,
false,
false,
true);
if (solutionAngularFolder != null)
{
await _npmPackagesUpdater.Update(
solutionAngularFolder,
false,
false,
true);
}
}
private string GetSolutionPath(CommandLineArgs commandLineArgs)
@ -99,7 +132,7 @@ namespace Volo.Abp.Cli.ProjectModification
}
}
Logger.LogError("There is no solution or more that one solution in current directory.");
Logger.LogWarning("There is no solution or more that one solution in current directory.");
return null;
}
@ -112,6 +145,23 @@ namespace Volo.Abp.Cli.ProjectModification
?? Directory.GetCurrentDirectory();
}
private string GetSolutionAngularFolder(string solutionFolder)
{
var upperAngularPath = Path.Combine(Directory.GetParent(solutionFolder)?.FullName ?? "", "angular");
if (Directory.Exists(upperAngularPath))
{
return upperAngularPath;
}
var innerAngularPath = Path.Combine(solutionFolder, "angular");
if (Directory.Exists(innerAngularPath))
{
return innerAngularPath;
}
return null;
}
public static class Options
{
public static class SolutionDirectory

@ -0,0 +1,3 @@
<Weavers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FodyWeavers.xsd">
<ConfigureAwait ContinueOnCapturedContext="false" />
</Weavers>

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- This file was generated by Fody. Manual changes to this file will be lost when your project is rebuilt. -->
<xs:element name="Weavers">
<xs:complexType>
<xs:all>
<xs:element name="ConfigureAwait" minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:attribute name="ContinueOnCapturedContext" type="xs:boolean" />
</xs:complexType>
</xs:element>
</xs:all>
<xs:attribute name="VerifyAssembly" type="xs:boolean">
<xs:annotation>
<xs:documentation>'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="VerifyIgnoreCodes" type="xs:string">
<xs:annotation>
<xs:documentation>A comma-separated list of error codes that can be safely ignored in assembly verification.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="GenerateXsd" type="xs:boolean">
<xs:annotation>
<xs:documentation>'false' to turn off automatic generation of the XML Schema file.</xs:documentation>
</xs:annotation>
</xs:attribute>
</xs:complexType>
</xs:element>
</xs:schema>

@ -0,0 +1,16 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\..\configureawait.props" />
<Import Project="..\..\..\common.props" />
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<RootNamespace />
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Volo.Abp.EventBus\Volo.Abp.EventBus.csproj" />
<ProjectReference Include="..\Volo.Abp.Kafka\Volo.Abp.Kafka.csproj" />
</ItemGroup>
</Project>

@ -0,0 +1,27 @@
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.Kafka;
using Volo.Abp.Modularity;
namespace Volo.Abp.EventBus.Kafka
{
[DependsOn(
typeof(AbpEventBusModule),
typeof(AbpKafkaModule))]
public class AbpEventBusKafkaModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
var configuration = context.Services.GetConfiguration();
Configure<AbpKafkaEventBusOptions>(configuration.GetSection("Kafka:EventBus"));
}
public override void OnApplicationInitialization(ApplicationInitializationContext context)
{
context
.ServiceProvider
.GetRequiredService<KafkaDistributedEventBus>()
.Initialize();
}
}
}

@ -0,0 +1,12 @@
namespace Volo.Abp.EventBus.Kafka
{
public class AbpKafkaEventBusOptions
{
public string ConnectionName { get; set; }
public string TopicName { get; set; }
public string GroupId { get; set; }
}
}

@ -0,0 +1,208 @@
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Confluent.Kafka;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using Volo.Abp.DependencyInjection;
using Volo.Abp.EventBus.Distributed;
using Volo.Abp.Kafka;
using Volo.Abp.MultiTenancy;
using Volo.Abp.Threading;
namespace Volo.Abp.EventBus.Kafka
{
[Dependency(ReplaceServices = true)]
[ExposeServices(typeof(IDistributedEventBus), typeof(KafkaDistributedEventBus))]
public class KafkaDistributedEventBus : EventBusBase, IDistributedEventBus, ISingletonDependency
{
protected AbpKafkaEventBusOptions AbpKafkaEventBusOptions { get; }
protected AbpDistributedEventBusOptions AbpDistributedEventBusOptions { get; }
protected IKafkaMessageConsumerFactory MessageConsumerFactory { get; }
protected IKafkaSerializer Serializer { get; }
protected IProducerPool ProducerPool { get; }
protected ConcurrentDictionary<Type, List<IEventHandlerFactory>> HandlerFactories { get; }
protected ConcurrentDictionary<string, Type> EventTypes { get; }
protected IKafkaMessageConsumer Consumer { get; private set; }
public KafkaDistributedEventBus(
IServiceScopeFactory serviceScopeFactory,
ICurrentTenant currentTenant,
IOptions<AbpKafkaEventBusOptions> abpKafkaEventBusOptions,
IKafkaMessageConsumerFactory messageConsumerFactory,
IOptions<AbpDistributedEventBusOptions> abpDistributedEventBusOptions,
IKafkaSerializer serializer,
IProducerPool producerPool)
: base(serviceScopeFactory, currentTenant)
{
AbpKafkaEventBusOptions = abpKafkaEventBusOptions.Value;
AbpDistributedEventBusOptions = abpDistributedEventBusOptions.Value;
MessageConsumerFactory = messageConsumerFactory;
Serializer = serializer;
ProducerPool = producerPool;
HandlerFactories = new ConcurrentDictionary<Type, List<IEventHandlerFactory>>();
EventTypes = new ConcurrentDictionary<string, Type>();
}
public void Initialize()
{
Consumer = MessageConsumerFactory.Create(
AbpKafkaEventBusOptions.TopicName,
AbpKafkaEventBusOptions.GroupId,
AbpKafkaEventBusOptions.ConnectionName);
Consumer.OnMessageReceived(ProcessEventAsync);
SubscribeHandlers(AbpDistributedEventBusOptions.Handlers);
}
private async Task ProcessEventAsync(Message<string, byte[]> message)
{
var eventName = message.Key;
var eventType = EventTypes.GetOrDefault(eventName);
if (eventType == null)
{
return;
}
var eventData = Serializer.Deserialize(message.Value, eventType);
await TriggerHandlersAsync(eventType, eventData);
}
public IDisposable Subscribe<TEvent>(IDistributedEventHandler<TEvent> handler) where TEvent : class
{
return Subscribe(typeof(TEvent), handler);
}
public override IDisposable Subscribe(Type eventType, IEventHandlerFactory factory)
{
var handlerFactories = GetOrCreateHandlerFactories(eventType);
if (factory.IsInFactories(handlerFactories))
{
return NullDisposable.Instance;
}
handlerFactories.Add(factory);
return new EventHandlerFactoryUnregistrar(this, eventType, factory);
}
/// <inheritdoc/>
public override void Unsubscribe<TEvent>(Func<TEvent, Task> action)
{
Check.NotNull(action, nameof(action));
GetOrCreateHandlerFactories(typeof(TEvent))
.Locking(factories =>
{
factories.RemoveAll(
factory =>
{
var singleInstanceFactory = factory as SingleInstanceHandlerFactory;
if (singleInstanceFactory == null)
{
return false;
}
var actionHandler = singleInstanceFactory.HandlerInstance as ActionEventHandler<TEvent>;
if (actionHandler == null)
{
return false;
}
return actionHandler.Action == action;
});
});
}
/// <inheritdoc/>
public override void Unsubscribe(Type eventType, IEventHandler handler)
{
GetOrCreateHandlerFactories(eventType)
.Locking(factories =>
{
factories.RemoveAll(
factory =>
factory is SingleInstanceHandlerFactory handlerFactory &&
handlerFactory.HandlerInstance == handler
);
});
}
/// <inheritdoc/>
public override void Unsubscribe(Type eventType, IEventHandlerFactory factory)
{
GetOrCreateHandlerFactories(eventType).Locking(factories => factories.Remove(factory));
}
/// <inheritdoc/>
public override void UnsubscribeAll(Type eventType)
{
GetOrCreateHandlerFactories(eventType).Locking(factories => factories.Clear());
}
public override async Task PublishAsync(Type eventType, object eventData)
{
var eventName = EventNameAttribute.GetNameOrDefault(eventType);
var body = Serializer.Serialize(eventData);
var producer = ProducerPool.Get(AbpKafkaEventBusOptions.ConnectionName);
await producer.ProduceAsync(
AbpKafkaEventBusOptions.TopicName,
new Message<string, byte[]>
{
Key = eventName, Value = body
});
}
private List<IEventHandlerFactory> GetOrCreateHandlerFactories(Type eventType)
{
return HandlerFactories.GetOrAdd(
eventType,
type =>
{
var eventName = EventNameAttribute.GetNameOrDefault(type);
EventTypes[eventName] = type;
return new List<IEventHandlerFactory>();
}
);
}
protected override IEnumerable<EventTypeWithEventHandlerFactories> GetHandlerFactories(Type eventType)
{
var handlerFactoryList = new List<EventTypeWithEventHandlerFactories>();
foreach (var handlerFactory in HandlerFactories.Where(hf => ShouldTriggerEventForHandler(eventType, hf.Key))
)
{
handlerFactoryList.Add(
new EventTypeWithEventHandlerFactories(handlerFactory.Key, handlerFactory.Value));
}
return handlerFactoryList.ToArray();
}
private static bool ShouldTriggerEventForHandler(Type targetEventType, Type handlerEventType)
{
//Should trigger same type
if (handlerEventType == targetEventType)
{
return true;
}
//Should trigger for inherited types
if (handlerEventType.IsAssignableFrom(targetEventType))
{
return true;
}
return false;
}
}
}

@ -0,0 +1,3 @@
<Weavers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FodyWeavers.xsd">
<ConfigureAwait ContinueOnCapturedContext="false" />
</Weavers>

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- This file was generated by Fody. Manual changes to this file will be lost when your project is rebuilt. -->
<xs:element name="Weavers">
<xs:complexType>
<xs:all>
<xs:element name="ConfigureAwait" minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:attribute name="ContinueOnCapturedContext" type="xs:boolean" />
</xs:complexType>
</xs:element>
</xs:all>
<xs:attribute name="VerifyAssembly" type="xs:boolean">
<xs:annotation>
<xs:documentation>'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="VerifyIgnoreCodes" type="xs:string">
<xs:annotation>
<xs:documentation>A comma-separated list of error codes that can be safely ignored in assembly verification.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="GenerateXsd" type="xs:boolean">
<xs:annotation>
<xs:documentation>'false' to turn off automatic generation of the XML Schema file.</xs:documentation>
</xs:annotation>
</xs:attribute>
</xs:complexType>
</xs:element>
</xs:schema>

@ -0,0 +1,17 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\..\configureawait.props" />
<Import Project="..\..\..\common.props" />
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<RootNamespace />
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Confluent.Kafka" Version="1.5.0" />
<ProjectReference Include="..\Volo.Abp.Json\Volo.Abp.Json.csproj" />
<ProjectReference Include="..\Volo.Abp.Threading\Volo.Abp.Threading.csproj" />
</ItemGroup>
</Project>

@ -0,0 +1,31 @@
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.Json;
using Volo.Abp.Modularity;
using Volo.Abp.Threading;
namespace Volo.Abp.Kafka
{
[DependsOn(
typeof(AbpJsonModule),
typeof(AbpThreadingModule)
)]
public class AbpKafkaModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
var configuration = context.Services.GetConfiguration();
Configure<AbpKafkaOptions>(configuration.GetSection("Kafka"));
}
public override void OnApplicationShutdown(ApplicationShutdownContext context)
{
context.ServiceProvider
.GetRequiredService<IConsumerPool>()
.Dispose();
context.ServiceProvider
.GetRequiredService<IProducerPool>()
.Dispose();
}
}
}

@ -0,0 +1,22 @@
using System;
using Confluent.Kafka;
using Confluent.Kafka.Admin;
namespace Volo.Abp.Kafka
{
public class AbpKafkaOptions
{
public KafkaConnections Connections { get; }
public Action<ProducerConfig> ConfigureProducer { get; set; }
public Action<ConsumerConfig> ConfigureConsumer { get; set; }
public Action<TopicSpecification> ConfigureTopic { get; set; }
public AbpKafkaOptions()
{
Connections = new KafkaConnections();
}
}
}

@ -0,0 +1,109 @@
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using Confluent.Kafka;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
using Microsoft.Extensions.Options;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.Kafka
{
public class ConsumerPool : IConsumerPool, ISingletonDependency
{
protected AbpKafkaOptions Options { get; }
protected ConcurrentDictionary<string, IConsumer<string, byte[]>> Consumers { get; }
protected TimeSpan TotalDisposeWaitDuration { get; set; } = TimeSpan.FromSeconds(10);
public ILogger<ConsumerPool> Logger { get; set; }
private bool _isDisposed;
public ConsumerPool(IOptions<AbpKafkaOptions> options)
{
Options = options.Value;
Consumers = new ConcurrentDictionary<string, IConsumer<string, byte[]>>();
Logger = new NullLogger<ConsumerPool>();
}
public virtual IConsumer<string, byte[]> Get(string groupId, string connectionName = null)
{
connectionName ??= KafkaConnections.DefaultConnectionName;
return Consumers.GetOrAdd(
connectionName, connection =>
{
var config = new ConsumerConfig(Options.Connections.GetOrDefault(connection))
{
GroupId = groupId,
EnableAutoCommit = false
};
Options.ConfigureConsumer?.Invoke(config);
return new ConsumerBuilder<string, byte[]>(config).Build();
}
);
}
public void Dispose()
{
if (_isDisposed)
{
return;
}
_isDisposed = true;
if (!Consumers.Any())
{
Logger.LogDebug($"Disposed consumer pool with no consumers in the pool.");
return;
}
var poolDisposeStopwatch = Stopwatch.StartNew();
Logger.LogInformation($"Disposing consumer pool ({Consumers.Count} consumers).");
var remainingWaitDuration = TotalDisposeWaitDuration;
foreach (var consumer in Consumers.Values)
{
var poolItemDisposeStopwatch = Stopwatch.StartNew();
try
{
consumer.Close();
consumer.Dispose();
}
catch
{
}
poolItemDisposeStopwatch.Stop();
remainingWaitDuration = remainingWaitDuration > poolItemDisposeStopwatch.Elapsed
? remainingWaitDuration.Subtract(poolItemDisposeStopwatch.Elapsed)
: TimeSpan.Zero;
}
poolDisposeStopwatch.Stop();
Logger.LogInformation(
$"Disposed Kafka Consumer Pool ({Consumers.Count} consumers in {poolDisposeStopwatch.Elapsed.TotalMilliseconds:0.00} ms).");
if (poolDisposeStopwatch.Elapsed.TotalSeconds > 5.0)
{
Logger.LogWarning(
$"Disposing Kafka Consumer Pool got time greather than expected: {poolDisposeStopwatch.Elapsed.TotalMilliseconds:0.00} ms.");
}
Consumers.Clear();
}
}
}

@ -0,0 +1,10 @@
using System;
using Confluent.Kafka;
namespace Volo.Abp.Kafka
{
public interface IConsumerPool : IDisposable
{
IConsumer<string, byte[]> Get(string groupId, string connectionName = null);
}
}

@ -0,0 +1,11 @@
using System;
using System.Threading.Tasks;
using Confluent.Kafka;
namespace Volo.Abp.Kafka
{
public interface IKafkaMessageConsumer
{
void OnMessageReceived(Func<Message<string, byte[]>, Task> callback);
}
}

@ -0,0 +1,19 @@
namespace Volo.Abp.Kafka
{
public interface IKafkaMessageConsumerFactory
{
/// <summary>
/// Creates a new <see cref="IKafkaMessageConsumer"/>.
/// Avoid to create too many consumers since they are
/// not disposed until end of the application.
/// </summary>
/// <param name="topicName"></param>
/// <param name="groupId"></param>
/// <param name="connectionName"></param>
/// <returns></returns>
IKafkaMessageConsumer Create(
string topicName,
string groupId,
string connectionName = null);
}
}

@ -0,0 +1,11 @@
using System;
namespace Volo.Abp.Kafka
{
public interface IKafkaSerializer
{
byte[] Serialize(object obj);
object Deserialize(byte[] value, Type type);
}
}

@ -0,0 +1,10 @@
using System;
using Confluent.Kafka;
namespace Volo.Abp.Kafka
{
public interface IProducerPool : IDisposable
{
IProducer<string, byte[]> Get(string connectionName = null);
}
}

@ -0,0 +1,35 @@
using System;
using System.Collections.Generic;
using Confluent.Kafka;
using JetBrains.Annotations;
namespace Volo.Abp.Kafka
{
[Serializable]
public class KafkaConnections : Dictionary<string, ClientConfig>
{
public const string DefaultConnectionName = "Default";
[NotNull]
public ClientConfig Default
{
get => this[DefaultConnectionName];
set => this[DefaultConnectionName] = Check.NotNull(value, nameof(value));
}
public KafkaConnections()
{
Default = new ClientConfig();
}
public ClientConfig GetOrDefault(string connectionName)
{
if (TryGetValue(connectionName, out var connectionFactory))
{
return connectionFactory;
}
return Default;
}
}
}

@ -0,0 +1,156 @@
using System;
using System.Collections.Concurrent;
using System.Linq;
using System.Threading.Tasks;
using Confluent.Kafka;
using Confluent.Kafka.Admin;
using JetBrains.Annotations;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
using Microsoft.Extensions.Options;
using Volo.Abp.DependencyInjection;
using Volo.Abp.ExceptionHandling;
using Volo.Abp.Threading;
namespace Volo.Abp.Kafka
{
public class KafkaMessageConsumer : IKafkaMessageConsumer, ITransientDependency, IDisposable
{
public ILogger<KafkaMessageConsumer> Logger { get; set; }
protected IConsumerPool ConsumerPool { get; }
protected IExceptionNotifier ExceptionNotifier { get; }
protected AbpKafkaOptions Options { get; }
protected ConcurrentBag<Func<Message<string, byte[]>, Task>> Callbacks { get; }
protected IConsumer<string, byte[]> Consumer { get; private set; }
protected string ConnectionName { get; private set; }
protected string GroupId { get; private set; }
protected string TopicName { get; private set; }
public KafkaMessageConsumer(
IConsumerPool consumerPool,
IExceptionNotifier exceptionNotifier,
IOptions<AbpKafkaOptions> options)
{
ConsumerPool = consumerPool;
ExceptionNotifier = exceptionNotifier;
Options = options.Value;
Logger = NullLogger<KafkaMessageConsumer>.Instance;
Callbacks = new ConcurrentBag<Func<Message<string, byte[]>, Task>>();
}
public virtual void Initialize(
[NotNull] string topicName,
[NotNull] string groupId,
string connectionName = null)
{
Check.NotNull(topicName, nameof(topicName));
Check.NotNull(groupId, nameof(groupId));
TopicName = topicName;
ConnectionName = connectionName ?? KafkaConnections.DefaultConnectionName;
GroupId = groupId;
AsyncHelper.RunSync(CreateTopicAsync);
Consume();
}
public virtual void OnMessageReceived(Func<Message<string, byte[]>, Task> callback)
{
Callbacks.Add(callback);
}
protected virtual async Task CreateTopicAsync()
{
using (var adminClient = new AdminClientBuilder(Options.Connections.GetOrDefault(ConnectionName)).Build())
{
var topic = new TopicSpecification
{
Name = TopicName,
NumPartitions = 1,
ReplicationFactor = 1
};
Options.ConfigureTopic?.Invoke(topic);
try
{
await adminClient.CreateTopicsAsync(new[] {topic});
}
catch (CreateTopicsException e)
{
if (!e.Error.Reason.Contains($"Topic '{TopicName}' already exists"))
{
throw;
}
}
}
}
protected virtual void Consume()
{
Consumer = ConsumerPool.Get(GroupId, ConnectionName);
Task.Factory.StartNew(async () =>
{
Consumer.Subscribe(TopicName);
while (true)
{
try
{
var consumeResult = Consumer.Consume();
if (consumeResult.IsPartitionEOF)
{
continue;
}
await HandleIncomingMessage(consumeResult);
}
catch (ConsumeException ex)
{
Logger.LogException(ex, LogLevel.Warning);
AsyncHelper.RunSync(() => ExceptionNotifier.NotifyAsync(ex, logLevel: LogLevel.Warning));
}
}
});
}
protected virtual async Task HandleIncomingMessage(ConsumeResult<string, byte[]> consumeResult)
{
try
{
foreach (var callback in Callbacks)
{
await callback(consumeResult.Message);
}
Consumer.Commit(consumeResult);
}
catch (Exception ex)
{
Logger.LogException(ex);
await ExceptionNotifier.NotifyAsync(ex);
}
}
public virtual void Dispose()
{
if (Consumer == null)
{
return;
}
Consumer.Close();
Consumer.Dispose();
}
}
}

@ -0,0 +1,32 @@
using System;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.Kafka
{
public class KafkaMessageConsumerFactory : IKafkaMessageConsumerFactory, ISingletonDependency, IDisposable
{
protected IServiceScope ServiceScope { get; }
public KafkaMessageConsumerFactory(IServiceScopeFactory serviceScopeFactory)
{
ServiceScope = serviceScopeFactory.CreateScope();
}
public IKafkaMessageConsumer Create(
string topicName,
string groupId,
string connectionName = null)
{
var consumer = ServiceScope.ServiceProvider.GetRequiredService<KafkaMessageConsumer>();
consumer.Initialize(topicName, groupId, connectionName);
return consumer;
}
public void Dispose()
{
ServiceScope?.Dispose();
}
}
}

@ -0,0 +1,102 @@
using System;
using System.Collections.Concurrent;
using System.Diagnostics;
using System.Linq;
using Confluent.Kafka;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
using Microsoft.Extensions.Options;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.Kafka
{
public class ProducerPool : IProducerPool, ISingletonDependency
{
protected AbpKafkaOptions Options { get; }
protected ConcurrentDictionary<string, IProducer<string, byte[]>> Producers { get; }
protected TimeSpan TotalDisposeWaitDuration { get; set; } = TimeSpan.FromSeconds(10);
public ILogger<ProducerPool> Logger { get; set; }
private bool _isDisposed;
public ProducerPool(IOptions<AbpKafkaOptions> options)
{
Options = options.Value;
Producers = new ConcurrentDictionary<string, IProducer<string, byte[]>>();
Logger = new NullLogger<ProducerPool>();
}
public virtual IProducer<string, byte[]> Get(string connectionName = null)
{
connectionName ??= KafkaConnections.DefaultConnectionName;
return Producers.GetOrAdd(
connectionName, connection =>
{
var config = Options.Connections.GetOrDefault(connection);
Options.ConfigureProducer?.Invoke(new ProducerConfig(config));
return new ProducerBuilder<string, byte[]>(config).Build();
});
}
public void Dispose()
{
if (_isDisposed)
{
return;
}
_isDisposed = true;
if (!Producers.Any())
{
Logger.LogDebug($"Disposed producer pool with no producers in the pool.");
return;
}
var poolDisposeStopwatch = Stopwatch.StartNew();
Logger.LogInformation($"Disposing producer pool ({Producers.Count} producers).");
var remainingWaitDuration = TotalDisposeWaitDuration;
foreach (var producer in Producers.Values)
{
var poolItemDisposeStopwatch = Stopwatch.StartNew();
try
{
producer.Dispose();
}
catch
{
}
poolItemDisposeStopwatch.Stop();
remainingWaitDuration = remainingWaitDuration > poolItemDisposeStopwatch.Elapsed
? remainingWaitDuration.Subtract(poolItemDisposeStopwatch.Elapsed)
: TimeSpan.Zero;
}
poolDisposeStopwatch.Stop();
Logger.LogInformation(
$"Disposed Kafka Producer Pool ({Producers.Count} producers in {poolDisposeStopwatch.Elapsed.TotalMilliseconds:0.00} ms).");
if (poolDisposeStopwatch.Elapsed.TotalSeconds > 5.0)
{
Logger.LogWarning(
$"Disposing Kafka Producer Pool got time greather than expected: {poolDisposeStopwatch.Elapsed.TotalMilliseconds:0.00} ms.");
}
Producers.Clear();
}
}
}

@ -0,0 +1,27 @@
using System;
using System.Text;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Json;
namespace Volo.Abp.Kafka
{
public class Utf8JsonKafkaSerializer : IKafkaSerializer, ITransientDependency
{
private readonly IJsonSerializer _jsonSerializer;
public Utf8JsonKafkaSerializer(IJsonSerializer jsonSerializer)
{
_jsonSerializer = jsonSerializer;
}
public byte[] Serialize(object obj)
{
return Encoding.UTF8.GetBytes(_jsonSerializer.Serialize(obj));
}
public object Deserialize(byte[] value, Type type)
{
return _jsonSerializer.Deserialize(type, Encoding.UTF8.GetString(value));
}
}
}

@ -17,6 +17,7 @@
"Error": "Error",
"AreYouSure": "Are you sure?",
"Cancel": "Cancel",
"Clear": "Clear",
"Yes": "Yes",
"No": "No",
"Ok": "Ok",

@ -17,6 +17,7 @@
"Error": "Hata",
"AreYouSure": "Emin misiniz?",
"Cancel": "Vazgeç",
"Clear": "Temizle",
"Yes": "Evet",
"No": "Hayır",
"Ok": "Tamam",

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

@ -2,30 +2,30 @@
# yarn lockfile v1
"@abp/aspnetcore.mvc.ui.theme.shared@^3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-3.1.0-rc.2.tgz#db34b0414ded4bd52420d1faa3a5fab03b68783f"
integrity sha512-tnTDCkExlUT+OyPls/VfZsBlbgu02P9zqpT58F7bDo2WtaxzrSvo6xwC+9a6+c3CpKy/xezI2S/r8H9lb2vd5w==
dependencies:
"@abp/aspnetcore.mvc.ui" "~3.1.0-rc.2"
"@abp/bootstrap" "~3.1.0-rc.2"
"@abp/bootstrap-datepicker" "~3.1.0-rc.2"
"@abp/datatables.net-bs4" "~3.1.0-rc.2"
"@abp/font-awesome" "~3.1.0-rc.2"
"@abp/jquery-form" "~3.1.0-rc.2"
"@abp/jquery-validation-unobtrusive" "~3.1.0-rc.2"
"@abp/lodash" "~3.1.0-rc.2"
"@abp/luxon" "~3.1.0-rc.2"
"@abp/malihu-custom-scrollbar-plugin" "~3.1.0-rc.2"
"@abp/select2" "~3.1.0-rc.2"
"@abp/sweetalert" "~3.1.0-rc.2"
"@abp/timeago" "~3.1.0-rc.2"
"@abp/toastr" "~3.1.0-rc.2"
"@abp/aspnetcore.mvc.ui@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-3.1.0-rc.2.tgz#395e101891d8fa7d1532defd125712c7846ee22a"
integrity sha512-dUvOXwUX7I08ZO5q30I9/1qv7s3c9FvKLVrjMexZL1auP83C5hnCh6EBOSWhKKe5Wfe5Rq2sxiinFi/xXibTsw==
"@abp/aspnetcore.mvc.ui.theme.shared@^3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-3.1.0-rc.3.tgz#54a92d673f5158ee222d0d95ebfbca6c63b20a4f"
integrity sha512-czS+8+wuNxuNIogI3FI/T72dCumpbsXp9Fke9pwQEzkCZZCG11cJdOCr1pLJKT1G54x+zfgwVVFIL36sFcq50A==
dependencies:
"@abp/aspnetcore.mvc.ui" "~3.1.0-rc.3"
"@abp/bootstrap" "~3.1.0-rc.3"
"@abp/bootstrap-datepicker" "~3.1.0-rc.3"
"@abp/datatables.net-bs4" "~3.1.0-rc.3"
"@abp/font-awesome" "~3.1.0-rc.3"
"@abp/jquery-form" "~3.1.0-rc.3"
"@abp/jquery-validation-unobtrusive" "~3.1.0-rc.3"
"@abp/lodash" "~3.1.0-rc.3"
"@abp/luxon" "~3.1.0-rc.3"
"@abp/malihu-custom-scrollbar-plugin" "~3.1.0-rc.3"
"@abp/select2" "~3.1.0-rc.3"
"@abp/sweetalert" "~3.1.0-rc.3"
"@abp/timeago" "~3.1.0-rc.3"
"@abp/toastr" "~3.1.0-rc.3"
"@abp/aspnetcore.mvc.ui@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-3.1.0-rc.3.tgz#e26f8ff9d7beaedf2050b9d6319e6368c990c373"
integrity sha512-qglA2lW0eQFzZlGeAev+vGuWsHNFmDeSCGAHPhd4Z07zjnphPnIOXSa+rXhb+4y6DevQP7OY/KSMQdX6ZMU3RQ==
dependencies:
ansi-colors "^4.1.1"
extend-object "^1.0.0"
@ -34,144 +34,144 @@
path "^0.12.7"
rimraf "^3.0.2"
"@abp/bootstrap-datepicker@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-3.1.0-rc.2.tgz#5ecca3e7150d4a75577d9abf0f226813fe40cff5"
integrity sha512-SebgagX0TszhsmIfQhM+A+M+cThbELSRmbDb+48DgLflVHH1bw6wCGXVMVQA65vYWkiHaALbxDgYOHLSFsWpag==
"@abp/bootstrap-datepicker@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-3.1.0-rc.3.tgz#279d9603cd916a884bac125cb525ee44fb809762"
integrity sha512-qZolOk2Pw+IvXh6Ko7wJddzMVPbS8silGecBZMYe0DVRNovg0515Px8zR3GJ16wcVQuvG6ByBn4fdeKFmYfokQ==
dependencies:
bootstrap-datepicker "^1.9.0"
"@abp/bootstrap@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-3.1.0-rc.2.tgz#691e4f609895e8914cf6903a26ad5d51f629c596"
integrity sha512-SaT7JN5C2RqzTgA8YdoON/eaeL4gl54vp7DTGPXXVvTYS20ZSxExKgVXEuOMEJVITKu4OeXqLYZyThz888I9iQ==
"@abp/bootstrap@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-3.1.0-rc.3.tgz#a1368df757995f52c19dd76ef1846d19a067def6"
integrity sha512-r8XRTYJBEa33FVxF+Mg0ALYNhmTjVBw1NQIQY8Ub5ZR+HIZoaDqA0X5zfAKvGQlmfXLiZJDkvCV5EIQWsIgnrA==
dependencies:
"@abp/core" "~3.1.0-rc.2"
"@abp/core" "~3.1.0-rc.3"
bootstrap "^4.5.0"
bootstrap-v4-rtl "4.4.1-2"
"@abp/core@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/core/-/core-3.1.0-rc.2.tgz#707cec3323020b9ee4cc7c5a7fee21b418457eff"
integrity sha512-2VSCPIWEEM4iwcgRfgFempjPV0zLaWf81cp1ZrwuilqsljUXjMQL8Pf07TEaSa8+uN3VKkCsQtyq3A+DhUlVhA==
"@abp/core@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/core/-/core-3.1.0-rc.3.tgz#7e1bd9ac9aaecfc66863e8e319975358885a3ca2"
integrity sha512-wIvm4l8ZDQ+eiNN1a+v07EjUhngrxwPWvfDf9bPQpepfnIKiAktJziihh0oBJAbqXNqmI7f6FGN76spvNop/EA==
dependencies:
"@abp/utils" "^3.1.0-rc.2"
"@abp/utils" "^3.1.0-rc.3"
"@abp/datatables.net-bs4@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-3.1.0-rc.2.tgz#d98f47e4e286a7299ba42da1c394594f4b4581c7"
integrity sha512-VrcgFq3qq6azpCJEpk00R4fWA6GBzoDgHJT0K9bQtg4AqG8oamJa2QWX60g2OXzWpbI74bxleBAOLXzC4OJIrw==
"@abp/datatables.net-bs4@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-3.1.0-rc.3.tgz#f46c4474635918c16ca7edbe4930c07317930592"
integrity sha512-FeN53p5U2hIyYyM3G3AuGSwBZFBGbx4yHb/ymW/DEGtJ6XtynHlsFPz00/PktLe0OKOjUxOUf2LQLqKJi83WQQ==
dependencies:
"@abp/datatables.net" "~3.1.0-rc.2"
"@abp/datatables.net" "~3.1.0-rc.3"
datatables.net-bs4 "^1.10.21"
"@abp/datatables.net@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-3.1.0-rc.2.tgz#e73fee8f323e33094bfe49cbed520a4b9f382c18"
integrity sha512-+Bo8C7tslTasH7kMUnXQ5JESzg+ciy7jmvWPbJo32f0VFuiSPDBBr6nacBmE6IHPqG54ZAjqOkvE8eWL39dN2A==
"@abp/datatables.net@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-3.1.0-rc.3.tgz#c3a8f81d5ee571445b01d2db0e05ed555b1459b8"
integrity sha512-sOWuVwvSoQlXqC9CC9HGH6HzdHb5vVX8CbqzIUYBJEzY4NBRUqeclFJQrA/thjMNtefdLD2AiVwPFmAdGBeDSg==
dependencies:
"@abp/jquery" "~3.1.0-rc.2"
"@abp/jquery" "~3.1.0-rc.3"
datatables.net "^1.10.21"
"@abp/font-awesome@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-3.1.0-rc.2.tgz#4d0ef35abe67b86a6cbb8c7008a50f26eadbaa6e"
integrity sha512-r1iLq+1avQ8lsDqNAsu0TAQn5+JlYhUnjTVpnb/xcDMtbJv+eBZpqVLTbXelHV0q2Czq/gDzloqkHFNv5Cxceg==
"@abp/font-awesome@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-3.1.0-rc.3.tgz#38f63ad4fadc4986a73116fa29d5ef56812c483c"
integrity sha512-BnrI9XaKxEvI0d6Fa9tbw1J/VAsVUqTyAHva4WTUUa+neB9gaK62ZUjgDdF8Eo6gj7UOO8DYvsXehzpVpZKlPQ==
dependencies:
"@abp/core" "~3.1.0-rc.2"
"@abp/core" "~3.1.0-rc.3"
"@fortawesome/fontawesome-free" "^5.13.0"
"@abp/jquery-form@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-3.1.0-rc.2.tgz#f08ceb6be4a23d79f855d59b46c5fea5a6bf37ee"
integrity sha512-3UlUGXmvoT5xz4Hjz2gRX2rL+YbL4JprGaZvBrIbASJ6VSV3yHYbjma8YBqj2Wu2IQv6wpNhAYV+tALjPnFEgw==
"@abp/jquery-form@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-3.1.0-rc.3.tgz#7b74828f32a641c0b1ef1fd8b0389bf994a09e16"
integrity sha512-G+YRnDRZe5Mw81NAEnnr8scGjupndcu9xZ1dw+hCFGg30yypiUIfHtrMR4iR94y7M198fAgQP+0k7RvDqnALiw==
dependencies:
"@abp/jquery" "~3.1.0-rc.2"
"@abp/jquery" "~3.1.0-rc.3"
jquery-form "^4.3.0"
"@abp/jquery-validation-unobtrusive@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-3.1.0-rc.2.tgz#1802ffd0dc8aa710bfb81f6f5e6654a44227334f"
integrity sha512-2iWFp8a4Iths5dbf3v/gcTFrOXUX6CkwS5JiO3YsA0ujbZgF2HGbnPD7vzrfuRJAIKPKCIiovLDBY3yKN6boQw==
"@abp/jquery-validation-unobtrusive@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-3.1.0-rc.3.tgz#aef83e8f11791ae7be449eab6655a73075f98b45"
integrity sha512-uWu6qdZasSZEFJC1IhEtj8NZq5kXX8W/zlK2tVpFhjxE/QYiJlPj8pVy2I7cuEIBghzAO2omwI+5En8TSagrGA==
dependencies:
"@abp/jquery-validation" "~3.1.0-rc.2"
"@abp/jquery-validation" "~3.1.0-rc.3"
jquery-validation-unobtrusive "^3.2.11"
"@abp/jquery-validation@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-3.1.0-rc.2.tgz#adc314584261ef5bcdfa240c5e2df9f1bb4dcb2f"
integrity sha512-L2GoAUxMCAd8pXt54UqI2CEV4nWS0ww2dTNctEUcnJ2UZc7Ce+QFqBgvyRNmuSULMebfdtUYkodCGFdzzjRXfg==
"@abp/jquery-validation@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-3.1.0-rc.3.tgz#40dcb28ce5a3a87fc69972053e48a456c84e3225"
integrity sha512-uaL+ZS/NTf103Hq3ehayFT1qvq/Y2T5PAFY9ijBvX+7phCtPwGiIPfUvyuwYnKbdTa15odC275e7pY2CssHWIA==
dependencies:
"@abp/jquery" "~3.1.0-rc.2"
"@abp/jquery" "~3.1.0-rc.3"
jquery-validation "^1.19.2"
"@abp/jquery@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-3.1.0-rc.2.tgz#05857739e5ec9e519194fe9b80b426be0b40addb"
integrity sha512-+qPHJpV/s9GGWwdH6gj8BdDhg4t4w8pI9hx41UlIpPdrtO4kzaPU85/f7vX0QYzOrsYYxmWXHu3H0pL8QyDwQA==
"@abp/jquery@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-3.1.0-rc.3.tgz#8c35b9e7de888516e2acc5227092ca2fed991475"
integrity sha512-DT2uBNfW3+Xc1Bz62WHdIC3JfAb2Qcc4p86LyDG5pNRAd3FpImA1VnRPsMRX9Mig7HYRjMYiuYXTeovM6YS0fg==
dependencies:
"@abp/core" "~3.1.0-rc.2"
"@abp/core" "~3.1.0-rc.3"
jquery "~3.5.1"
"@abp/lodash@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-3.1.0-rc.2.tgz#80fc560277e903b94cf90146e05cb6e6e62b0ee3"
integrity sha512-TQ8HqvW9skMFDfJv7wNX4Ahi/HjCBfD/ZDePvfyTLwdsnNPwDg6zERwYTGk48ep/6CUsK3MMQzvShl4yaYIFYQ==
"@abp/lodash@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-3.1.0-rc.3.tgz#a312975824fa3bebc00f5eca35cededc5ec3af4b"
integrity sha512-siv5cMWlUHEX2RtvKCGoX2cEh4h1hniluKlFgmVmYY4hdGYdAG4T2d9QQAbPODwdzrJ8jzI36hXT/P4IrzhWZw==
dependencies:
"@abp/core" "~3.1.0-rc.2"
"@abp/core" "~3.1.0-rc.3"
lodash "^4.17.15"
"@abp/luxon@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-3.1.0-rc.2.tgz#6a7db2fd1cc1674e73df6c982657c791a94fc65b"
integrity sha512-vrtiuMnQDP0rC+yrQawqVu3F4pcZrv3wsx0ZqaIWWakQJ4X17aSTM0Xhxa95jnHh4WFFUDN00mYxkPxNr8JqvA==
"@abp/luxon@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-3.1.0-rc.3.tgz#9b9d5c9827a0c661458094134cafd80f35537a69"
integrity sha512-cKj/irXJhTJ6WiSyjzcZcsDjKFji1Q/0nV7IYhY9e2wzpg3qEB8Z8k8fDLPDAUriUKxBoI6mQ/CVC0ah7eg/LA==
dependencies:
luxon "^1.24.1"
"@abp/malihu-custom-scrollbar-plugin@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-3.1.0-rc.2.tgz#3805b260bd3442353a946de5c7508e98cc7cefdd"
integrity sha512-bp+S43ZIWQpkhx7ni2DThwDZ2A+q6ZaAUaESWz+yCHXWwYacnfHeq4p+mkS07OdVteP33NWAxJpjtDl6fPBo8A==
"@abp/malihu-custom-scrollbar-plugin@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-3.1.0-rc.3.tgz#218eb620532af8bdde6a46388a3d5349974fab44"
integrity sha512-z3IzgSYtpZ2FlWNmM2A1wbP3CHB3P5a8k/JR0JSWwtl+D/LiYC348VQIXen+pIJoEjMlY48iSi5XNyBIz4X9hw==
dependencies:
"@abp/core" "~3.1.0-rc.2"
"@abp/core" "~3.1.0-rc.3"
malihu-custom-scrollbar-plugin "^3.1.5"
"@abp/select2@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-3.1.0-rc.2.tgz#6b16301cb7c4ad4e2b39400a5f9cf336c700a343"
integrity sha512-qbj6csa9/0+xF5fzcm1WJSzUiBvSgwiYPRpH5wyG/FZYf7YxK2dAv/Lmi5RE4eAb8Ib9ueB7nPkzJYUJhJ1wgQ==
"@abp/select2@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-3.1.0-rc.3.tgz#493afc27f29da1c9926ee02e8f7b641e8ee4b67e"
integrity sha512-fym9GmQbl34CyTCVzfo4jGe77nSeDuRPYMzAYO8p0uKdDB8t9jNZNqhYJ9Ee5KQXJyg4lmFFPkLcRZF14E+cWw==
dependencies:
"@abp/core" "~3.1.0-rc.2"
"@abp/core" "~3.1.0-rc.3"
select2 "^4.0.13"
"@abp/sweetalert@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-3.1.0-rc.2.tgz#a152eb5632cd0eee50d5fed2c156bc4b6daf6829"
integrity sha512-6pjzFwr/HKgNYcsx76GZdcm0qZ8NfcdYqFOwj91w3bGmtPZYRRJLV01k9kDIOQHYnmCReO+ThF46wZCyt/8xvg==
"@abp/sweetalert@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-3.1.0-rc.3.tgz#1c1421e2baaa57cc24e0f9334a5173836819cc24"
integrity sha512-WrYRutXM2f6VRECEkWhjfqtQXlnEw88MCkYicAhyMH7ZYYWg7r9xVg9TRJJI4UwGMLSyR3EB+ZdTmnD8aSC0yQ==
dependencies:
"@abp/core" "~3.1.0-rc.2"
"@abp/core" "~3.1.0-rc.3"
sweetalert "^2.1.2"
"@abp/timeago@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-3.1.0-rc.2.tgz#0c3fe13f15319c943186eff861f0e9a790b6651b"
integrity sha512-BJzvJGJk6uPkpR5MMIX7DF/WsYZbvss2B82RTcr2Dkto7VtfRUYqcpWBcUIHCJ7hLh4SMS000fC8tfRXo7e0EA==
"@abp/timeago@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-3.1.0-rc.3.tgz#0a7a369ba29633f00b19206b257c6f1f59f182a4"
integrity sha512-FDgaQCJmwWplCcdJYa9kyCcMxJFrKf+zDEFzT5hWfhMzq+sYJYX7QDQtbF5OJnMSWuPyI0/RU0bocuGaJ584VQ==
dependencies:
"@abp/jquery" "~3.1.0-rc.2"
"@abp/jquery" "~3.1.0-rc.3"
timeago "^1.6.7"
"@abp/toastr@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-3.1.0-rc.2.tgz#1b149684a4f7751df48cd9cbac5ce0ce7526042c"
integrity sha512-4U2spuDnl2F3AzGDvHyhGJtZT0Kv4LmdUYwdq/aKneHSTzJ9v5bUpjjU1Gth6fyi0iqH61DAyaoTsbgy0kFQqQ==
"@abp/toastr@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-3.1.0-rc.3.tgz#89af6aa864a9aac76bc9bf21b7f9bc6763ca7573"
integrity sha512-AeKH5imy8W9yMAlzRv9VdkRHApySpR2BKfrQYk3q9LubgwaxLvOFc/l38aIEKuyosN7dHTMFBQlEwLxWFwaoPA==
dependencies:
"@abp/jquery" "~3.1.0-rc.2"
"@abp/jquery" "~3.1.0-rc.3"
toastr "^2.1.4"
"@abp/utils@^3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-3.1.0-rc.2.tgz#c3774246f01f4b032b2d229457c3bd93f7d14048"
integrity sha512-lgHy/OAEBau2Qyr0mZUjOWU8uBFBFIBvGnUKgSqKRxTqf5GyNvkKO8GPpqGSmyIsYUfW2UUsRhaLW7K85T9CZw==
"@abp/utils@^3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-3.1.0-rc.3.tgz#3cbc50c1f8fdf6592d66f8ea4b5a9c4249a5e46a"
integrity sha512-45KXx5zlxm5gK2EFwzM+hMjT8q8pD3PejyNfVP6HBbGE2N36LGKYtI59s6vFm5yV2qFxQyVPrk4mi3Y+neqlBw==
dependencies:
just-compare "^1.3.0"

@ -3,7 +3,7 @@
"name": "asp.net",
"private": true,
"dependencies": {
"@abp/aspnetcore.mvc.ui.theme.basic": "^3.1.0-rc.2"
"@abp/aspnetcore.mvc.ui.theme.basic": "^3.1.0-rc.3"
},
"devDependencies": {}
}

@ -2,37 +2,37 @@
# yarn lockfile v1
"@abp/aspnetcore.mvc.ui.theme.basic@^3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-3.1.0-rc.2.tgz#b72eee4a441619caa8222941c797c8afd3cae09b"
integrity sha512-8zczo69E6ACjFaL+3UNP7VoUXeoSVViKAyhoub0Uw6CrLUxAYxT/Yuw/apIY7AW3cVoB5ULBfjMN7xWSJML9eg==
dependencies:
"@abp/aspnetcore.mvc.ui.theme.shared" "~3.1.0-rc.2"
"@abp/aspnetcore.mvc.ui.theme.shared@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-3.1.0-rc.2.tgz#db34b0414ded4bd52420d1faa3a5fab03b68783f"
integrity sha512-tnTDCkExlUT+OyPls/VfZsBlbgu02P9zqpT58F7bDo2WtaxzrSvo6xwC+9a6+c3CpKy/xezI2S/r8H9lb2vd5w==
dependencies:
"@abp/aspnetcore.mvc.ui" "~3.1.0-rc.2"
"@abp/bootstrap" "~3.1.0-rc.2"
"@abp/bootstrap-datepicker" "~3.1.0-rc.2"
"@abp/datatables.net-bs4" "~3.1.0-rc.2"
"@abp/font-awesome" "~3.1.0-rc.2"
"@abp/jquery-form" "~3.1.0-rc.2"
"@abp/jquery-validation-unobtrusive" "~3.1.0-rc.2"
"@abp/lodash" "~3.1.0-rc.2"
"@abp/luxon" "~3.1.0-rc.2"
"@abp/malihu-custom-scrollbar-plugin" "~3.1.0-rc.2"
"@abp/select2" "~3.1.0-rc.2"
"@abp/sweetalert" "~3.1.0-rc.2"
"@abp/timeago" "~3.1.0-rc.2"
"@abp/toastr" "~3.1.0-rc.2"
"@abp/aspnetcore.mvc.ui@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-3.1.0-rc.2.tgz#395e101891d8fa7d1532defd125712c7846ee22a"
integrity sha512-dUvOXwUX7I08ZO5q30I9/1qv7s3c9FvKLVrjMexZL1auP83C5hnCh6EBOSWhKKe5Wfe5Rq2sxiinFi/xXibTsw==
"@abp/aspnetcore.mvc.ui.theme.basic@^3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-3.1.0-rc.3.tgz#d7e3ad928a72efb7c76a585ef051fce860efb7bf"
integrity sha512-cc2Wp/6hr1j89Ap/474HlH54WhAIgCya1buuXxrxXSMdYqDKNxK61aMYC/mnYGMiyPqoz6TWWUJB2h2dZeTgzQ==
dependencies:
"@abp/aspnetcore.mvc.ui.theme.shared" "~3.1.0-rc.3"
"@abp/aspnetcore.mvc.ui.theme.shared@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-3.1.0-rc.3.tgz#54a92d673f5158ee222d0d95ebfbca6c63b20a4f"
integrity sha512-czS+8+wuNxuNIogI3FI/T72dCumpbsXp9Fke9pwQEzkCZZCG11cJdOCr1pLJKT1G54x+zfgwVVFIL36sFcq50A==
dependencies:
"@abp/aspnetcore.mvc.ui" "~3.1.0-rc.3"
"@abp/bootstrap" "~3.1.0-rc.3"
"@abp/bootstrap-datepicker" "~3.1.0-rc.3"
"@abp/datatables.net-bs4" "~3.1.0-rc.3"
"@abp/font-awesome" "~3.1.0-rc.3"
"@abp/jquery-form" "~3.1.0-rc.3"
"@abp/jquery-validation-unobtrusive" "~3.1.0-rc.3"
"@abp/lodash" "~3.1.0-rc.3"
"@abp/luxon" "~3.1.0-rc.3"
"@abp/malihu-custom-scrollbar-plugin" "~3.1.0-rc.3"
"@abp/select2" "~3.1.0-rc.3"
"@abp/sweetalert" "~3.1.0-rc.3"
"@abp/timeago" "~3.1.0-rc.3"
"@abp/toastr" "~3.1.0-rc.3"
"@abp/aspnetcore.mvc.ui@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-3.1.0-rc.3.tgz#e26f8ff9d7beaedf2050b9d6319e6368c990c373"
integrity sha512-qglA2lW0eQFzZlGeAev+vGuWsHNFmDeSCGAHPhd4Z07zjnphPnIOXSa+rXhb+4y6DevQP7OY/KSMQdX6ZMU3RQ==
dependencies:
ansi-colors "^4.1.1"
extend-object "^1.0.0"
@ -41,144 +41,144 @@
path "^0.12.7"
rimraf "^3.0.2"
"@abp/bootstrap-datepicker@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-3.1.0-rc.2.tgz#5ecca3e7150d4a75577d9abf0f226813fe40cff5"
integrity sha512-SebgagX0TszhsmIfQhM+A+M+cThbELSRmbDb+48DgLflVHH1bw6wCGXVMVQA65vYWkiHaALbxDgYOHLSFsWpag==
"@abp/bootstrap-datepicker@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-3.1.0-rc.3.tgz#279d9603cd916a884bac125cb525ee44fb809762"
integrity sha512-qZolOk2Pw+IvXh6Ko7wJddzMVPbS8silGecBZMYe0DVRNovg0515Px8zR3GJ16wcVQuvG6ByBn4fdeKFmYfokQ==
dependencies:
bootstrap-datepicker "^1.9.0"
"@abp/bootstrap@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-3.1.0-rc.2.tgz#691e4f609895e8914cf6903a26ad5d51f629c596"
integrity sha512-SaT7JN5C2RqzTgA8YdoON/eaeL4gl54vp7DTGPXXVvTYS20ZSxExKgVXEuOMEJVITKu4OeXqLYZyThz888I9iQ==
"@abp/bootstrap@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-3.1.0-rc.3.tgz#a1368df757995f52c19dd76ef1846d19a067def6"
integrity sha512-r8XRTYJBEa33FVxF+Mg0ALYNhmTjVBw1NQIQY8Ub5ZR+HIZoaDqA0X5zfAKvGQlmfXLiZJDkvCV5EIQWsIgnrA==
dependencies:
"@abp/core" "~3.1.0-rc.2"
"@abp/core" "~3.1.0-rc.3"
bootstrap "^4.5.0"
bootstrap-v4-rtl "4.4.1-2"
"@abp/core@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/core/-/core-3.1.0-rc.2.tgz#707cec3323020b9ee4cc7c5a7fee21b418457eff"
integrity sha512-2VSCPIWEEM4iwcgRfgFempjPV0zLaWf81cp1ZrwuilqsljUXjMQL8Pf07TEaSa8+uN3VKkCsQtyq3A+DhUlVhA==
"@abp/core@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/core/-/core-3.1.0-rc.3.tgz#7e1bd9ac9aaecfc66863e8e319975358885a3ca2"
integrity sha512-wIvm4l8ZDQ+eiNN1a+v07EjUhngrxwPWvfDf9bPQpepfnIKiAktJziihh0oBJAbqXNqmI7f6FGN76spvNop/EA==
dependencies:
"@abp/utils" "^3.1.0-rc.2"
"@abp/utils" "^3.1.0-rc.3"
"@abp/datatables.net-bs4@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-3.1.0-rc.2.tgz#d98f47e4e286a7299ba42da1c394594f4b4581c7"
integrity sha512-VrcgFq3qq6azpCJEpk00R4fWA6GBzoDgHJT0K9bQtg4AqG8oamJa2QWX60g2OXzWpbI74bxleBAOLXzC4OJIrw==
"@abp/datatables.net-bs4@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-3.1.0-rc.3.tgz#f46c4474635918c16ca7edbe4930c07317930592"
integrity sha512-FeN53p5U2hIyYyM3G3AuGSwBZFBGbx4yHb/ymW/DEGtJ6XtynHlsFPz00/PktLe0OKOjUxOUf2LQLqKJi83WQQ==
dependencies:
"@abp/datatables.net" "~3.1.0-rc.2"
"@abp/datatables.net" "~3.1.0-rc.3"
datatables.net-bs4 "^1.10.21"
"@abp/datatables.net@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-3.1.0-rc.2.tgz#e73fee8f323e33094bfe49cbed520a4b9f382c18"
integrity sha512-+Bo8C7tslTasH7kMUnXQ5JESzg+ciy7jmvWPbJo32f0VFuiSPDBBr6nacBmE6IHPqG54ZAjqOkvE8eWL39dN2A==
"@abp/datatables.net@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-3.1.0-rc.3.tgz#c3a8f81d5ee571445b01d2db0e05ed555b1459b8"
integrity sha512-sOWuVwvSoQlXqC9CC9HGH6HzdHb5vVX8CbqzIUYBJEzY4NBRUqeclFJQrA/thjMNtefdLD2AiVwPFmAdGBeDSg==
dependencies:
"@abp/jquery" "~3.1.0-rc.2"
"@abp/jquery" "~3.1.0-rc.3"
datatables.net "^1.10.21"
"@abp/font-awesome@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-3.1.0-rc.2.tgz#4d0ef35abe67b86a6cbb8c7008a50f26eadbaa6e"
integrity sha512-r1iLq+1avQ8lsDqNAsu0TAQn5+JlYhUnjTVpnb/xcDMtbJv+eBZpqVLTbXelHV0q2Czq/gDzloqkHFNv5Cxceg==
"@abp/font-awesome@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-3.1.0-rc.3.tgz#38f63ad4fadc4986a73116fa29d5ef56812c483c"
integrity sha512-BnrI9XaKxEvI0d6Fa9tbw1J/VAsVUqTyAHva4WTUUa+neB9gaK62ZUjgDdF8Eo6gj7UOO8DYvsXehzpVpZKlPQ==
dependencies:
"@abp/core" "~3.1.0-rc.2"
"@abp/core" "~3.1.0-rc.3"
"@fortawesome/fontawesome-free" "^5.13.0"
"@abp/jquery-form@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-3.1.0-rc.2.tgz#f08ceb6be4a23d79f855d59b46c5fea5a6bf37ee"
integrity sha512-3UlUGXmvoT5xz4Hjz2gRX2rL+YbL4JprGaZvBrIbASJ6VSV3yHYbjma8YBqj2Wu2IQv6wpNhAYV+tALjPnFEgw==
"@abp/jquery-form@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-3.1.0-rc.3.tgz#7b74828f32a641c0b1ef1fd8b0389bf994a09e16"
integrity sha512-G+YRnDRZe5Mw81NAEnnr8scGjupndcu9xZ1dw+hCFGg30yypiUIfHtrMR4iR94y7M198fAgQP+0k7RvDqnALiw==
dependencies:
"@abp/jquery" "~3.1.0-rc.2"
"@abp/jquery" "~3.1.0-rc.3"
jquery-form "^4.3.0"
"@abp/jquery-validation-unobtrusive@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-3.1.0-rc.2.tgz#1802ffd0dc8aa710bfb81f6f5e6654a44227334f"
integrity sha512-2iWFp8a4Iths5dbf3v/gcTFrOXUX6CkwS5JiO3YsA0ujbZgF2HGbnPD7vzrfuRJAIKPKCIiovLDBY3yKN6boQw==
"@abp/jquery-validation-unobtrusive@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-3.1.0-rc.3.tgz#aef83e8f11791ae7be449eab6655a73075f98b45"
integrity sha512-uWu6qdZasSZEFJC1IhEtj8NZq5kXX8W/zlK2tVpFhjxE/QYiJlPj8pVy2I7cuEIBghzAO2omwI+5En8TSagrGA==
dependencies:
"@abp/jquery-validation" "~3.1.0-rc.2"
"@abp/jquery-validation" "~3.1.0-rc.3"
jquery-validation-unobtrusive "^3.2.11"
"@abp/jquery-validation@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-3.1.0-rc.2.tgz#adc314584261ef5bcdfa240c5e2df9f1bb4dcb2f"
integrity sha512-L2GoAUxMCAd8pXt54UqI2CEV4nWS0ww2dTNctEUcnJ2UZc7Ce+QFqBgvyRNmuSULMebfdtUYkodCGFdzzjRXfg==
"@abp/jquery-validation@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-3.1.0-rc.3.tgz#40dcb28ce5a3a87fc69972053e48a456c84e3225"
integrity sha512-uaL+ZS/NTf103Hq3ehayFT1qvq/Y2T5PAFY9ijBvX+7phCtPwGiIPfUvyuwYnKbdTa15odC275e7pY2CssHWIA==
dependencies:
"@abp/jquery" "~3.1.0-rc.2"
"@abp/jquery" "~3.1.0-rc.3"
jquery-validation "^1.19.2"
"@abp/jquery@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-3.1.0-rc.2.tgz#05857739e5ec9e519194fe9b80b426be0b40addb"
integrity sha512-+qPHJpV/s9GGWwdH6gj8BdDhg4t4w8pI9hx41UlIpPdrtO4kzaPU85/f7vX0QYzOrsYYxmWXHu3H0pL8QyDwQA==
"@abp/jquery@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-3.1.0-rc.3.tgz#8c35b9e7de888516e2acc5227092ca2fed991475"
integrity sha512-DT2uBNfW3+Xc1Bz62WHdIC3JfAb2Qcc4p86LyDG5pNRAd3FpImA1VnRPsMRX9Mig7HYRjMYiuYXTeovM6YS0fg==
dependencies:
"@abp/core" "~3.1.0-rc.2"
"@abp/core" "~3.1.0-rc.3"
jquery "~3.5.1"
"@abp/lodash@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-3.1.0-rc.2.tgz#80fc560277e903b94cf90146e05cb6e6e62b0ee3"
integrity sha512-TQ8HqvW9skMFDfJv7wNX4Ahi/HjCBfD/ZDePvfyTLwdsnNPwDg6zERwYTGk48ep/6CUsK3MMQzvShl4yaYIFYQ==
"@abp/lodash@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-3.1.0-rc.3.tgz#a312975824fa3bebc00f5eca35cededc5ec3af4b"
integrity sha512-siv5cMWlUHEX2RtvKCGoX2cEh4h1hniluKlFgmVmYY4hdGYdAG4T2d9QQAbPODwdzrJ8jzI36hXT/P4IrzhWZw==
dependencies:
"@abp/core" "~3.1.0-rc.2"
"@abp/core" "~3.1.0-rc.3"
lodash "^4.17.15"
"@abp/luxon@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-3.1.0-rc.2.tgz#6a7db2fd1cc1674e73df6c982657c791a94fc65b"
integrity sha512-vrtiuMnQDP0rC+yrQawqVu3F4pcZrv3wsx0ZqaIWWakQJ4X17aSTM0Xhxa95jnHh4WFFUDN00mYxkPxNr8JqvA==
"@abp/luxon@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-3.1.0-rc.3.tgz#9b9d5c9827a0c661458094134cafd80f35537a69"
integrity sha512-cKj/irXJhTJ6WiSyjzcZcsDjKFji1Q/0nV7IYhY9e2wzpg3qEB8Z8k8fDLPDAUriUKxBoI6mQ/CVC0ah7eg/LA==
dependencies:
luxon "^1.24.1"
"@abp/malihu-custom-scrollbar-plugin@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-3.1.0-rc.2.tgz#3805b260bd3442353a946de5c7508e98cc7cefdd"
integrity sha512-bp+S43ZIWQpkhx7ni2DThwDZ2A+q6ZaAUaESWz+yCHXWwYacnfHeq4p+mkS07OdVteP33NWAxJpjtDl6fPBo8A==
"@abp/malihu-custom-scrollbar-plugin@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-3.1.0-rc.3.tgz#218eb620532af8bdde6a46388a3d5349974fab44"
integrity sha512-z3IzgSYtpZ2FlWNmM2A1wbP3CHB3P5a8k/JR0JSWwtl+D/LiYC348VQIXen+pIJoEjMlY48iSi5XNyBIz4X9hw==
dependencies:
"@abp/core" "~3.1.0-rc.2"
"@abp/core" "~3.1.0-rc.3"
malihu-custom-scrollbar-plugin "^3.1.5"
"@abp/select2@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-3.1.0-rc.2.tgz#6b16301cb7c4ad4e2b39400a5f9cf336c700a343"
integrity sha512-qbj6csa9/0+xF5fzcm1WJSzUiBvSgwiYPRpH5wyG/FZYf7YxK2dAv/Lmi5RE4eAb8Ib9ueB7nPkzJYUJhJ1wgQ==
"@abp/select2@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-3.1.0-rc.3.tgz#493afc27f29da1c9926ee02e8f7b641e8ee4b67e"
integrity sha512-fym9GmQbl34CyTCVzfo4jGe77nSeDuRPYMzAYO8p0uKdDB8t9jNZNqhYJ9Ee5KQXJyg4lmFFPkLcRZF14E+cWw==
dependencies:
"@abp/core" "~3.1.0-rc.2"
"@abp/core" "~3.1.0-rc.3"
select2 "^4.0.13"
"@abp/sweetalert@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-3.1.0-rc.2.tgz#a152eb5632cd0eee50d5fed2c156bc4b6daf6829"
integrity sha512-6pjzFwr/HKgNYcsx76GZdcm0qZ8NfcdYqFOwj91w3bGmtPZYRRJLV01k9kDIOQHYnmCReO+ThF46wZCyt/8xvg==
"@abp/sweetalert@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-3.1.0-rc.3.tgz#1c1421e2baaa57cc24e0f9334a5173836819cc24"
integrity sha512-WrYRutXM2f6VRECEkWhjfqtQXlnEw88MCkYicAhyMH7ZYYWg7r9xVg9TRJJI4UwGMLSyR3EB+ZdTmnD8aSC0yQ==
dependencies:
"@abp/core" "~3.1.0-rc.2"
"@abp/core" "~3.1.0-rc.3"
sweetalert "^2.1.2"
"@abp/timeago@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-3.1.0-rc.2.tgz#0c3fe13f15319c943186eff861f0e9a790b6651b"
integrity sha512-BJzvJGJk6uPkpR5MMIX7DF/WsYZbvss2B82RTcr2Dkto7VtfRUYqcpWBcUIHCJ7hLh4SMS000fC8tfRXo7e0EA==
"@abp/timeago@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-3.1.0-rc.3.tgz#0a7a369ba29633f00b19206b257c6f1f59f182a4"
integrity sha512-FDgaQCJmwWplCcdJYa9kyCcMxJFrKf+zDEFzT5hWfhMzq+sYJYX7QDQtbF5OJnMSWuPyI0/RU0bocuGaJ584VQ==
dependencies:
"@abp/jquery" "~3.1.0-rc.2"
"@abp/jquery" "~3.1.0-rc.3"
timeago "^1.6.7"
"@abp/toastr@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-3.1.0-rc.2.tgz#1b149684a4f7751df48cd9cbac5ce0ce7526042c"
integrity sha512-4U2spuDnl2F3AzGDvHyhGJtZT0Kv4LmdUYwdq/aKneHSTzJ9v5bUpjjU1Gth6fyi0iqH61DAyaoTsbgy0kFQqQ==
"@abp/toastr@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-3.1.0-rc.3.tgz#89af6aa864a9aac76bc9bf21b7f9bc6763ca7573"
integrity sha512-AeKH5imy8W9yMAlzRv9VdkRHApySpR2BKfrQYk3q9LubgwaxLvOFc/l38aIEKuyosN7dHTMFBQlEwLxWFwaoPA==
dependencies:
"@abp/jquery" "~3.1.0-rc.2"
"@abp/jquery" "~3.1.0-rc.3"
toastr "^2.1.4"
"@abp/utils@^3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-3.1.0-rc.2.tgz#c3774246f01f4b032b2d229457c3bd93f7d14048"
integrity sha512-lgHy/OAEBau2Qyr0mZUjOWU8uBFBFIBvGnUKgSqKRxTqf5GyNvkKO8GPpqGSmyIsYUfW2UUsRhaLW7K85T9CZw==
"@abp/utils@^3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-3.1.0-rc.3.tgz#3cbc50c1f8fdf6592d66f8ea4b5a9c4249a5e46a"
integrity sha512-45KXx5zlxm5gK2EFwzM+hMjT8q8pD3PejyNfVP6HBbGE2N36LGKYtI59s6vFm5yV2qFxQyVPrk4mi3Y+neqlBw==
dependencies:
just-compare "^1.3.0"

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

@ -2,37 +2,37 @@
# yarn lockfile v1
"@abp/aspnetcore.mvc.ui.theme.basic@^3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-3.1.0-rc.2.tgz#b72eee4a441619caa8222941c797c8afd3cae09b"
integrity sha512-8zczo69E6ACjFaL+3UNP7VoUXeoSVViKAyhoub0Uw6CrLUxAYxT/Yuw/apIY7AW3cVoB5ULBfjMN7xWSJML9eg==
dependencies:
"@abp/aspnetcore.mvc.ui.theme.shared" "~3.1.0-rc.2"
"@abp/aspnetcore.mvc.ui.theme.shared@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-3.1.0-rc.2.tgz#db34b0414ded4bd52420d1faa3a5fab03b68783f"
integrity sha512-tnTDCkExlUT+OyPls/VfZsBlbgu02P9zqpT58F7bDo2WtaxzrSvo6xwC+9a6+c3CpKy/xezI2S/r8H9lb2vd5w==
dependencies:
"@abp/aspnetcore.mvc.ui" "~3.1.0-rc.2"
"@abp/bootstrap" "~3.1.0-rc.2"
"@abp/bootstrap-datepicker" "~3.1.0-rc.2"
"@abp/datatables.net-bs4" "~3.1.0-rc.2"
"@abp/font-awesome" "~3.1.0-rc.2"
"@abp/jquery-form" "~3.1.0-rc.2"
"@abp/jquery-validation-unobtrusive" "~3.1.0-rc.2"
"@abp/lodash" "~3.1.0-rc.2"
"@abp/luxon" "~3.1.0-rc.2"
"@abp/malihu-custom-scrollbar-plugin" "~3.1.0-rc.2"
"@abp/select2" "~3.1.0-rc.2"
"@abp/sweetalert" "~3.1.0-rc.2"
"@abp/timeago" "~3.1.0-rc.2"
"@abp/toastr" "~3.1.0-rc.2"
"@abp/aspnetcore.mvc.ui@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-3.1.0-rc.2.tgz#395e101891d8fa7d1532defd125712c7846ee22a"
integrity sha512-dUvOXwUX7I08ZO5q30I9/1qv7s3c9FvKLVrjMexZL1auP83C5hnCh6EBOSWhKKe5Wfe5Rq2sxiinFi/xXibTsw==
"@abp/aspnetcore.mvc.ui.theme.basic@^3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-3.1.0-rc.3.tgz#d7e3ad928a72efb7c76a585ef051fce860efb7bf"
integrity sha512-cc2Wp/6hr1j89Ap/474HlH54WhAIgCya1buuXxrxXSMdYqDKNxK61aMYC/mnYGMiyPqoz6TWWUJB2h2dZeTgzQ==
dependencies:
"@abp/aspnetcore.mvc.ui.theme.shared" "~3.1.0-rc.3"
"@abp/aspnetcore.mvc.ui.theme.shared@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-3.1.0-rc.3.tgz#54a92d673f5158ee222d0d95ebfbca6c63b20a4f"
integrity sha512-czS+8+wuNxuNIogI3FI/T72dCumpbsXp9Fke9pwQEzkCZZCG11cJdOCr1pLJKT1G54x+zfgwVVFIL36sFcq50A==
dependencies:
"@abp/aspnetcore.mvc.ui" "~3.1.0-rc.3"
"@abp/bootstrap" "~3.1.0-rc.3"
"@abp/bootstrap-datepicker" "~3.1.0-rc.3"
"@abp/datatables.net-bs4" "~3.1.0-rc.3"
"@abp/font-awesome" "~3.1.0-rc.3"
"@abp/jquery-form" "~3.1.0-rc.3"
"@abp/jquery-validation-unobtrusive" "~3.1.0-rc.3"
"@abp/lodash" "~3.1.0-rc.3"
"@abp/luxon" "~3.1.0-rc.3"
"@abp/malihu-custom-scrollbar-plugin" "~3.1.0-rc.3"
"@abp/select2" "~3.1.0-rc.3"
"@abp/sweetalert" "~3.1.0-rc.3"
"@abp/timeago" "~3.1.0-rc.3"
"@abp/toastr" "~3.1.0-rc.3"
"@abp/aspnetcore.mvc.ui@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-3.1.0-rc.3.tgz#e26f8ff9d7beaedf2050b9d6319e6368c990c373"
integrity sha512-qglA2lW0eQFzZlGeAev+vGuWsHNFmDeSCGAHPhd4Z07zjnphPnIOXSa+rXhb+4y6DevQP7OY/KSMQdX6ZMU3RQ==
dependencies:
ansi-colors "^4.1.1"
extend-object "^1.0.0"
@ -41,213 +41,213 @@
path "^0.12.7"
rimraf "^3.0.2"
"@abp/blogging@^3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/blogging/-/blogging-3.1.0-rc.2.tgz#89f056ce6218cbeffeefbc96138d98596db6dd91"
integrity sha512-SrAsp6S/1FM9IRnpsOKLSxT/Cx0mENS7LmLYm/rMc8YwYTUZDg9s9DJhs6WqFgghadByvul6bgJ8NDLrktKJcA==
"@abp/blogging@^3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/blogging/-/blogging-3.1.0-rc.3.tgz#5c21c1dc57d832de35e89621fd81653599e676ad"
integrity sha512-8iAe29fzdCH4YAp3+8JSMrT0E0/OfUSQ9sIxGXrlV4GyEX2iGZrszRyKsKA+bgQmBOQdnT36RrmSOl0K/A+Mxw==
dependencies:
"@abp/aspnetcore.mvc.ui.theme.shared" "~3.1.0-rc.2"
"@abp/owl.carousel" "~3.1.0-rc.2"
"@abp/prismjs" "~3.1.0-rc.2"
"@abp/tui-editor" "~3.1.0-rc.2"
"@abp/aspnetcore.mvc.ui.theme.shared" "~3.1.0-rc.3"
"@abp/owl.carousel" "~3.1.0-rc.3"
"@abp/prismjs" "~3.1.0-rc.3"
"@abp/tui-editor" "~3.1.0-rc.3"
"@abp/bootstrap-datepicker@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-3.1.0-rc.2.tgz#5ecca3e7150d4a75577d9abf0f226813fe40cff5"
integrity sha512-SebgagX0TszhsmIfQhM+A+M+cThbELSRmbDb+48DgLflVHH1bw6wCGXVMVQA65vYWkiHaALbxDgYOHLSFsWpag==
"@abp/bootstrap-datepicker@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-3.1.0-rc.3.tgz#279d9603cd916a884bac125cb525ee44fb809762"
integrity sha512-qZolOk2Pw+IvXh6Ko7wJddzMVPbS8silGecBZMYe0DVRNovg0515Px8zR3GJ16wcVQuvG6ByBn4fdeKFmYfokQ==
dependencies:
bootstrap-datepicker "^1.9.0"
"@abp/bootstrap@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-3.1.0-rc.2.tgz#691e4f609895e8914cf6903a26ad5d51f629c596"
integrity sha512-SaT7JN5C2RqzTgA8YdoON/eaeL4gl54vp7DTGPXXVvTYS20ZSxExKgVXEuOMEJVITKu4OeXqLYZyThz888I9iQ==
"@abp/bootstrap@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-3.1.0-rc.3.tgz#a1368df757995f52c19dd76ef1846d19a067def6"
integrity sha512-r8XRTYJBEa33FVxF+Mg0ALYNhmTjVBw1NQIQY8Ub5ZR+HIZoaDqA0X5zfAKvGQlmfXLiZJDkvCV5EIQWsIgnrA==
dependencies:
"@abp/core" "~3.1.0-rc.2"
"@abp/core" "~3.1.0-rc.3"
bootstrap "^4.5.0"
bootstrap-v4-rtl "4.4.1-2"
"@abp/clipboard@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-3.1.0-rc.2.tgz#73a8dbc1f98cfb64d374b463dcd16b186bb694bb"
integrity sha512-Q1Z9pcs3gpptjE8Cjm/38bPKwKncjoVYSO0TknyEZLM3QG+PtZwa9UCkaK+Truz/U3QoZqbPuNbPKr5cz7o+lw==
"@abp/clipboard@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-3.1.0-rc.3.tgz#40f0a95298cf9d7097d8e7f96e42c181e5a9907b"
integrity sha512-efCjrAHN3d7zmq4eVzlT4H/s6K11I9K7hv4fIJP6fbZKDoXi5hzTv2+dt9JRDWAra+s87PdBJq7AEWNs6ONiGg==
dependencies:
"@abp/core" "~3.1.0-rc.2"
"@abp/core" "~3.1.0-rc.3"
clipboard "^2.0.6"
"@abp/codemirror@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/codemirror/-/codemirror-3.1.0-rc.2.tgz#020d6207094293109a0752b046064c2592056c27"
integrity sha512-TmbfAP+CpzbWly03iibi7x9dW655Zxcu50tifAyi3LSTwrQIbhB6jo1aksdA2X97qTSLBhvOt3avcqj91sKRhQ==
"@abp/codemirror@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/codemirror/-/codemirror-3.1.0-rc.3.tgz#db68462bc6618734daa30f928feb65e0cca8cf53"
integrity sha512-TJz21MreoVePouWjnQKQ6gD9cXWQkS7xTl4V93i69C6m9f/ozoaoJvm3Va3GGGZMKf6u2B8G+XX7d6QGz406hg==
dependencies:
"@abp/core" "~3.1.0-rc.2"
"@abp/core" "~3.1.0-rc.3"
codemirror "^5.54.0"
"@abp/core@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/core/-/core-3.1.0-rc.2.tgz#707cec3323020b9ee4cc7c5a7fee21b418457eff"
integrity sha512-2VSCPIWEEM4iwcgRfgFempjPV0zLaWf81cp1ZrwuilqsljUXjMQL8Pf07TEaSa8+uN3VKkCsQtyq3A+DhUlVhA==
"@abp/core@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/core/-/core-3.1.0-rc.3.tgz#7e1bd9ac9aaecfc66863e8e319975358885a3ca2"
integrity sha512-wIvm4l8ZDQ+eiNN1a+v07EjUhngrxwPWvfDf9bPQpepfnIKiAktJziihh0oBJAbqXNqmI7f6FGN76spvNop/EA==
dependencies:
"@abp/utils" "^3.1.0-rc.2"
"@abp/utils" "^3.1.0-rc.3"
"@abp/datatables.net-bs4@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-3.1.0-rc.2.tgz#d98f47e4e286a7299ba42da1c394594f4b4581c7"
integrity sha512-VrcgFq3qq6azpCJEpk00R4fWA6GBzoDgHJT0K9bQtg4AqG8oamJa2QWX60g2OXzWpbI74bxleBAOLXzC4OJIrw==
"@abp/datatables.net-bs4@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-3.1.0-rc.3.tgz#f46c4474635918c16ca7edbe4930c07317930592"
integrity sha512-FeN53p5U2hIyYyM3G3AuGSwBZFBGbx4yHb/ymW/DEGtJ6XtynHlsFPz00/PktLe0OKOjUxOUf2LQLqKJi83WQQ==
dependencies:
"@abp/datatables.net" "~3.1.0-rc.2"
"@abp/datatables.net" "~3.1.0-rc.3"
datatables.net-bs4 "^1.10.21"
"@abp/datatables.net@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-3.1.0-rc.2.tgz#e73fee8f323e33094bfe49cbed520a4b9f382c18"
integrity sha512-+Bo8C7tslTasH7kMUnXQ5JESzg+ciy7jmvWPbJo32f0VFuiSPDBBr6nacBmE6IHPqG54ZAjqOkvE8eWL39dN2A==
"@abp/datatables.net@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-3.1.0-rc.3.tgz#c3a8f81d5ee571445b01d2db0e05ed555b1459b8"
integrity sha512-sOWuVwvSoQlXqC9CC9HGH6HzdHb5vVX8CbqzIUYBJEzY4NBRUqeclFJQrA/thjMNtefdLD2AiVwPFmAdGBeDSg==
dependencies:
"@abp/jquery" "~3.1.0-rc.2"
"@abp/jquery" "~3.1.0-rc.3"
datatables.net "^1.10.21"
"@abp/font-awesome@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-3.1.0-rc.2.tgz#4d0ef35abe67b86a6cbb8c7008a50f26eadbaa6e"
integrity sha512-r1iLq+1avQ8lsDqNAsu0TAQn5+JlYhUnjTVpnb/xcDMtbJv+eBZpqVLTbXelHV0q2Czq/gDzloqkHFNv5Cxceg==
"@abp/font-awesome@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-3.1.0-rc.3.tgz#38f63ad4fadc4986a73116fa29d5ef56812c483c"
integrity sha512-BnrI9XaKxEvI0d6Fa9tbw1J/VAsVUqTyAHva4WTUUa+neB9gaK62ZUjgDdF8Eo6gj7UOO8DYvsXehzpVpZKlPQ==
dependencies:
"@abp/core" "~3.1.0-rc.2"
"@abp/core" "~3.1.0-rc.3"
"@fortawesome/fontawesome-free" "^5.13.0"
"@abp/highlight.js@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/highlight.js/-/highlight.js-3.1.0-rc.2.tgz#4c796617471ec571dd6be2fc5327ae02e720ea1f"
integrity sha512-EUBRx7kDRmWEZx4bx1tHRjs0goMV1TzvuBQj7Wrq41CUqhpz2cBk9ZUI5AFGQJTSf0tz1SFqZhr4xDMpo8szTw==
"@abp/highlight.js@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/highlight.js/-/highlight.js-3.1.0-rc.3.tgz#d1e92b44ebd6cc6fc49a18cf350bf24b12be2792"
integrity sha512-rb9/ryoEK2krMh3DLYQcqTyvSaI7BYlOd6+awDYl5iWXu8TK+M1NP9zSM8ZoYr0kkLoD1dGHsF4ondCfCYjxPQ==
dependencies:
"@abp/core" "~3.1.0-rc.2"
"@abp/core" "~3.1.0-rc.3"
"@abp/jquery-form@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-3.1.0-rc.2.tgz#f08ceb6be4a23d79f855d59b46c5fea5a6bf37ee"
integrity sha512-3UlUGXmvoT5xz4Hjz2gRX2rL+YbL4JprGaZvBrIbASJ6VSV3yHYbjma8YBqj2Wu2IQv6wpNhAYV+tALjPnFEgw==
"@abp/jquery-form@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-3.1.0-rc.3.tgz#7b74828f32a641c0b1ef1fd8b0389bf994a09e16"
integrity sha512-G+YRnDRZe5Mw81NAEnnr8scGjupndcu9xZ1dw+hCFGg30yypiUIfHtrMR4iR94y7M198fAgQP+0k7RvDqnALiw==
dependencies:
"@abp/jquery" "~3.1.0-rc.2"
"@abp/jquery" "~3.1.0-rc.3"
jquery-form "^4.3.0"
"@abp/jquery-validation-unobtrusive@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-3.1.0-rc.2.tgz#1802ffd0dc8aa710bfb81f6f5e6654a44227334f"
integrity sha512-2iWFp8a4Iths5dbf3v/gcTFrOXUX6CkwS5JiO3YsA0ujbZgF2HGbnPD7vzrfuRJAIKPKCIiovLDBY3yKN6boQw==
"@abp/jquery-validation-unobtrusive@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-3.1.0-rc.3.tgz#aef83e8f11791ae7be449eab6655a73075f98b45"
integrity sha512-uWu6qdZasSZEFJC1IhEtj8NZq5kXX8W/zlK2tVpFhjxE/QYiJlPj8pVy2I7cuEIBghzAO2omwI+5En8TSagrGA==
dependencies:
"@abp/jquery-validation" "~3.1.0-rc.2"
"@abp/jquery-validation" "~3.1.0-rc.3"
jquery-validation-unobtrusive "^3.2.11"
"@abp/jquery-validation@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-3.1.0-rc.2.tgz#adc314584261ef5bcdfa240c5e2df9f1bb4dcb2f"
integrity sha512-L2GoAUxMCAd8pXt54UqI2CEV4nWS0ww2dTNctEUcnJ2UZc7Ce+QFqBgvyRNmuSULMebfdtUYkodCGFdzzjRXfg==
"@abp/jquery-validation@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-3.1.0-rc.3.tgz#40dcb28ce5a3a87fc69972053e48a456c84e3225"
integrity sha512-uaL+ZS/NTf103Hq3ehayFT1qvq/Y2T5PAFY9ijBvX+7phCtPwGiIPfUvyuwYnKbdTa15odC275e7pY2CssHWIA==
dependencies:
"@abp/jquery" "~3.1.0-rc.2"
"@abp/jquery" "~3.1.0-rc.3"
jquery-validation "^1.19.2"
"@abp/jquery@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-3.1.0-rc.2.tgz#05857739e5ec9e519194fe9b80b426be0b40addb"
integrity sha512-+qPHJpV/s9GGWwdH6gj8BdDhg4t4w8pI9hx41UlIpPdrtO4kzaPU85/f7vX0QYzOrsYYxmWXHu3H0pL8QyDwQA==
"@abp/jquery@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-3.1.0-rc.3.tgz#8c35b9e7de888516e2acc5227092ca2fed991475"
integrity sha512-DT2uBNfW3+Xc1Bz62WHdIC3JfAb2Qcc4p86LyDG5pNRAd3FpImA1VnRPsMRX9Mig7HYRjMYiuYXTeovM6YS0fg==
dependencies:
"@abp/core" "~3.1.0-rc.2"
"@abp/core" "~3.1.0-rc.3"
jquery "~3.5.1"
"@abp/lodash@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-3.1.0-rc.2.tgz#80fc560277e903b94cf90146e05cb6e6e62b0ee3"
integrity sha512-TQ8HqvW9skMFDfJv7wNX4Ahi/HjCBfD/ZDePvfyTLwdsnNPwDg6zERwYTGk48ep/6CUsK3MMQzvShl4yaYIFYQ==
"@abp/lodash@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-3.1.0-rc.3.tgz#a312975824fa3bebc00f5eca35cededc5ec3af4b"
integrity sha512-siv5cMWlUHEX2RtvKCGoX2cEh4h1hniluKlFgmVmYY4hdGYdAG4T2d9QQAbPODwdzrJ8jzI36hXT/P4IrzhWZw==
dependencies:
"@abp/core" "~3.1.0-rc.2"
"@abp/core" "~3.1.0-rc.3"
lodash "^4.17.15"
"@abp/luxon@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-3.1.0-rc.2.tgz#6a7db2fd1cc1674e73df6c982657c791a94fc65b"
integrity sha512-vrtiuMnQDP0rC+yrQawqVu3F4pcZrv3wsx0ZqaIWWakQJ4X17aSTM0Xhxa95jnHh4WFFUDN00mYxkPxNr8JqvA==
"@abp/luxon@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-3.1.0-rc.3.tgz#9b9d5c9827a0c661458094134cafd80f35537a69"
integrity sha512-cKj/irXJhTJ6WiSyjzcZcsDjKFji1Q/0nV7IYhY9e2wzpg3qEB8Z8k8fDLPDAUriUKxBoI6mQ/CVC0ah7eg/LA==
dependencies:
luxon "^1.24.1"
"@abp/malihu-custom-scrollbar-plugin@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-3.1.0-rc.2.tgz#3805b260bd3442353a946de5c7508e98cc7cefdd"
integrity sha512-bp+S43ZIWQpkhx7ni2DThwDZ2A+q6ZaAUaESWz+yCHXWwYacnfHeq4p+mkS07OdVteP33NWAxJpjtDl6fPBo8A==
"@abp/malihu-custom-scrollbar-plugin@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-3.1.0-rc.3.tgz#218eb620532af8bdde6a46388a3d5349974fab44"
integrity sha512-z3IzgSYtpZ2FlWNmM2A1wbP3CHB3P5a8k/JR0JSWwtl+D/LiYC348VQIXen+pIJoEjMlY48iSi5XNyBIz4X9hw==
dependencies:
"@abp/core" "~3.1.0-rc.2"
"@abp/core" "~3.1.0-rc.3"
malihu-custom-scrollbar-plugin "^3.1.5"
"@abp/markdown-it@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/markdown-it/-/markdown-it-3.1.0-rc.2.tgz#cd9e84d4188c1adaad4f37ce5f9a1fa028fb5405"
integrity sha512-CufWWxhceJqzKxnTbFXMB+SVi2Ikp2CH8tQ5wvrsDwqJV6ViOCyhBLMIwcV1/oAY9lHzCI+abPiEUZdN7AzhYQ==
"@abp/markdown-it@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/markdown-it/-/markdown-it-3.1.0-rc.3.tgz#74a1e2c20654988159f332a01790a74d7ffb6b92"
integrity sha512-6k5e+WRfE4I0vp4KmV44FLQXvT8u+UUtdzPJOotWERWePuCVLJqM0u0hht0s5uEoTOhfCONIYwqQoGjzfP/8lg==
dependencies:
"@abp/core" "~3.1.0-rc.2"
"@abp/core" "~3.1.0-rc.3"
markdown-it "^11.0.0"
"@abp/owl.carousel@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/owl.carousel/-/owl.carousel-3.1.0-rc.2.tgz#c17e34dd4a38aef12f59ad0ef9ad20715880aa98"
integrity sha512-065bHPn7XJHs2ABKdUx3hunnRmKuedjyZZuIMZNvavH4hJyiV3MI0F6RjWLohgMFIvmp0iM259bQwoCkvGFrBA==
"@abp/owl.carousel@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/owl.carousel/-/owl.carousel-3.1.0-rc.3.tgz#c419eccaeb18150dab5b7fdd2da102a26a6d6013"
integrity sha512-lLJuhCJ5/879juIHqLPrNos+zOyBb7cuvpzAF+IE+6/Jb9yP5Xn9O8004F2ELXRag0bHZVzCgCbtPmDDF+LkNQ==
dependencies:
"@abp/core" "~3.1.0-rc.2"
"@abp/core" "~3.1.0-rc.3"
owl.carousel "^2.3.4"
"@abp/prismjs@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-3.1.0-rc.2.tgz#767d58c07e94c6e5056fd187d4e398efa108f67e"
integrity sha512-HCX/nw6noslnlw7xh94IaybI7xNYrjVOIld1C+J7p9AHizLhxh4kRbwVTpLhFzUWsSrTe8+VssgryimLQvTmjg==
"@abp/prismjs@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-3.1.0-rc.3.tgz#d13885bf613871f6cd003f58ae01ee4587ad15ad"
integrity sha512-gaKxJ3d78oR1wGZhnPzM5EJIAsibh3VT9MFithFt/YAQdrMMOqS1fEdGsm1zO/A7Veyho9Ba/144RmPkFXH5gQ==
dependencies:
"@abp/clipboard" "~3.1.0-rc.2"
"@abp/core" "~3.1.0-rc.2"
"@abp/clipboard" "~3.1.0-rc.3"
"@abp/core" "~3.1.0-rc.3"
prismjs "^1.20.0"
"@abp/select2@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-3.1.0-rc.2.tgz#6b16301cb7c4ad4e2b39400a5f9cf336c700a343"
integrity sha512-qbj6csa9/0+xF5fzcm1WJSzUiBvSgwiYPRpH5wyG/FZYf7YxK2dAv/Lmi5RE4eAb8Ib9ueB7nPkzJYUJhJ1wgQ==
"@abp/select2@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-3.1.0-rc.3.tgz#493afc27f29da1c9926ee02e8f7b641e8ee4b67e"
integrity sha512-fym9GmQbl34CyTCVzfo4jGe77nSeDuRPYMzAYO8p0uKdDB8t9jNZNqhYJ9Ee5KQXJyg4lmFFPkLcRZF14E+cWw==
dependencies:
"@abp/core" "~3.1.0-rc.2"
"@abp/core" "~3.1.0-rc.3"
select2 "^4.0.13"
"@abp/sweetalert@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-3.1.0-rc.2.tgz#a152eb5632cd0eee50d5fed2c156bc4b6daf6829"
integrity sha512-6pjzFwr/HKgNYcsx76GZdcm0qZ8NfcdYqFOwj91w3bGmtPZYRRJLV01k9kDIOQHYnmCReO+ThF46wZCyt/8xvg==
"@abp/sweetalert@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-3.1.0-rc.3.tgz#1c1421e2baaa57cc24e0f9334a5173836819cc24"
integrity sha512-WrYRutXM2f6VRECEkWhjfqtQXlnEw88MCkYicAhyMH7ZYYWg7r9xVg9TRJJI4UwGMLSyR3EB+ZdTmnD8aSC0yQ==
dependencies:
"@abp/core" "~3.1.0-rc.2"
"@abp/core" "~3.1.0-rc.3"
sweetalert "^2.1.2"
"@abp/timeago@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-3.1.0-rc.2.tgz#0c3fe13f15319c943186eff861f0e9a790b6651b"
integrity sha512-BJzvJGJk6uPkpR5MMIX7DF/WsYZbvss2B82RTcr2Dkto7VtfRUYqcpWBcUIHCJ7hLh4SMS000fC8tfRXo7e0EA==
"@abp/timeago@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-3.1.0-rc.3.tgz#0a7a369ba29633f00b19206b257c6f1f59f182a4"
integrity sha512-FDgaQCJmwWplCcdJYa9kyCcMxJFrKf+zDEFzT5hWfhMzq+sYJYX7QDQtbF5OJnMSWuPyI0/RU0bocuGaJ584VQ==
dependencies:
"@abp/jquery" "~3.1.0-rc.2"
"@abp/jquery" "~3.1.0-rc.3"
timeago "^1.6.7"
"@abp/toastr@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-3.1.0-rc.2.tgz#1b149684a4f7751df48cd9cbac5ce0ce7526042c"
integrity sha512-4U2spuDnl2F3AzGDvHyhGJtZT0Kv4LmdUYwdq/aKneHSTzJ9v5bUpjjU1Gth6fyi0iqH61DAyaoTsbgy0kFQqQ==
"@abp/toastr@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-3.1.0-rc.3.tgz#89af6aa864a9aac76bc9bf21b7f9bc6763ca7573"
integrity sha512-AeKH5imy8W9yMAlzRv9VdkRHApySpR2BKfrQYk3q9LubgwaxLvOFc/l38aIEKuyosN7dHTMFBQlEwLxWFwaoPA==
dependencies:
"@abp/jquery" "~3.1.0-rc.2"
"@abp/jquery" "~3.1.0-rc.3"
toastr "^2.1.4"
"@abp/tui-editor@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/tui-editor/-/tui-editor-3.1.0-rc.2.tgz#48a1f78b4aca6a82daeb243b2d192c1dbe01710f"
integrity sha512-w9mNBY4c1DXAsIwLpLLKXHoIZMMaQhY2xONhD771v503ZGyNKHU+0donbyowLUzznf3PX7LcVVx/vpYxCnWybw==
"@abp/tui-editor@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/tui-editor/-/tui-editor-3.1.0-rc.3.tgz#31c66f06b938ec416276907e539f51da389be01c"
integrity sha512-V3drpSK2l+WwfHWnK+9BFB33Ww+ruo6GFuOhyzDXjmXhOOMeiM2c/r205v+Bm/uEB0GaCW1m/r3yfogFfMipIw==
dependencies:
"@abp/codemirror" "~3.1.0-rc.2"
"@abp/highlight.js" "~3.1.0-rc.2"
"@abp/jquery" "~3.1.0-rc.2"
"@abp/markdown-it" "~3.1.0-rc.2"
"@abp/codemirror" "~3.1.0-rc.3"
"@abp/highlight.js" "~3.1.0-rc.3"
"@abp/jquery" "~3.1.0-rc.3"
"@abp/markdown-it" "~3.1.0-rc.3"
tui-editor "^1.4.10"
"@abp/utils@^3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-3.1.0-rc.2.tgz#c3774246f01f4b032b2d229457c3bd93f7d14048"
integrity sha512-lgHy/OAEBau2Qyr0mZUjOWU8uBFBFIBvGnUKgSqKRxTqf5GyNvkKO8GPpqGSmyIsYUfW2UUsRhaLW7K85T9CZw==
"@abp/utils@^3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-3.1.0-rc.3.tgz#3cbc50c1f8fdf6592d66f8ea4b5a9c4249a5e46a"
integrity sha512-45KXx5zlxm5gK2EFwzM+hMjT8q8pD3PejyNfVP6HBbGE2N36LGKYtI59s6vFm5yV2qFxQyVPrk4mi3Y+neqlBw==
dependencies:
just-compare "^1.3.0"

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

@ -2,37 +2,37 @@
# yarn lockfile v1
"@abp/aspnetcore.mvc.ui.theme.basic@^3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-3.1.0-rc.2.tgz#b72eee4a441619caa8222941c797c8afd3cae09b"
integrity sha512-8zczo69E6ACjFaL+3UNP7VoUXeoSVViKAyhoub0Uw6CrLUxAYxT/Yuw/apIY7AW3cVoB5ULBfjMN7xWSJML9eg==
dependencies:
"@abp/aspnetcore.mvc.ui.theme.shared" "~3.1.0-rc.2"
"@abp/aspnetcore.mvc.ui.theme.shared@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-3.1.0-rc.2.tgz#db34b0414ded4bd52420d1faa3a5fab03b68783f"
integrity sha512-tnTDCkExlUT+OyPls/VfZsBlbgu02P9zqpT58F7bDo2WtaxzrSvo6xwC+9a6+c3CpKy/xezI2S/r8H9lb2vd5w==
dependencies:
"@abp/aspnetcore.mvc.ui" "~3.1.0-rc.2"
"@abp/bootstrap" "~3.1.0-rc.2"
"@abp/bootstrap-datepicker" "~3.1.0-rc.2"
"@abp/datatables.net-bs4" "~3.1.0-rc.2"
"@abp/font-awesome" "~3.1.0-rc.2"
"@abp/jquery-form" "~3.1.0-rc.2"
"@abp/jquery-validation-unobtrusive" "~3.1.0-rc.2"
"@abp/lodash" "~3.1.0-rc.2"
"@abp/luxon" "~3.1.0-rc.2"
"@abp/malihu-custom-scrollbar-plugin" "~3.1.0-rc.2"
"@abp/select2" "~3.1.0-rc.2"
"@abp/sweetalert" "~3.1.0-rc.2"
"@abp/timeago" "~3.1.0-rc.2"
"@abp/toastr" "~3.1.0-rc.2"
"@abp/aspnetcore.mvc.ui@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-3.1.0-rc.2.tgz#395e101891d8fa7d1532defd125712c7846ee22a"
integrity sha512-dUvOXwUX7I08ZO5q30I9/1qv7s3c9FvKLVrjMexZL1auP83C5hnCh6EBOSWhKKe5Wfe5Rq2sxiinFi/xXibTsw==
"@abp/aspnetcore.mvc.ui.theme.basic@^3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-3.1.0-rc.3.tgz#d7e3ad928a72efb7c76a585ef051fce860efb7bf"
integrity sha512-cc2Wp/6hr1j89Ap/474HlH54WhAIgCya1buuXxrxXSMdYqDKNxK61aMYC/mnYGMiyPqoz6TWWUJB2h2dZeTgzQ==
dependencies:
"@abp/aspnetcore.mvc.ui.theme.shared" "~3.1.0-rc.3"
"@abp/aspnetcore.mvc.ui.theme.shared@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-3.1.0-rc.3.tgz#54a92d673f5158ee222d0d95ebfbca6c63b20a4f"
integrity sha512-czS+8+wuNxuNIogI3FI/T72dCumpbsXp9Fke9pwQEzkCZZCG11cJdOCr1pLJKT1G54x+zfgwVVFIL36sFcq50A==
dependencies:
"@abp/aspnetcore.mvc.ui" "~3.1.0-rc.3"
"@abp/bootstrap" "~3.1.0-rc.3"
"@abp/bootstrap-datepicker" "~3.1.0-rc.3"
"@abp/datatables.net-bs4" "~3.1.0-rc.3"
"@abp/font-awesome" "~3.1.0-rc.3"
"@abp/jquery-form" "~3.1.0-rc.3"
"@abp/jquery-validation-unobtrusive" "~3.1.0-rc.3"
"@abp/lodash" "~3.1.0-rc.3"
"@abp/luxon" "~3.1.0-rc.3"
"@abp/malihu-custom-scrollbar-plugin" "~3.1.0-rc.3"
"@abp/select2" "~3.1.0-rc.3"
"@abp/sweetalert" "~3.1.0-rc.3"
"@abp/timeago" "~3.1.0-rc.3"
"@abp/toastr" "~3.1.0-rc.3"
"@abp/aspnetcore.mvc.ui@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-3.1.0-rc.3.tgz#e26f8ff9d7beaedf2050b9d6319e6368c990c373"
integrity sha512-qglA2lW0eQFzZlGeAev+vGuWsHNFmDeSCGAHPhd4Z07zjnphPnIOXSa+rXhb+4y6DevQP7OY/KSMQdX6ZMU3RQ==
dependencies:
ansi-colors "^4.1.1"
extend-object "^1.0.0"
@ -41,144 +41,144 @@
path "^0.12.7"
rimraf "^3.0.2"
"@abp/bootstrap-datepicker@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-3.1.0-rc.2.tgz#5ecca3e7150d4a75577d9abf0f226813fe40cff5"
integrity sha512-SebgagX0TszhsmIfQhM+A+M+cThbELSRmbDb+48DgLflVHH1bw6wCGXVMVQA65vYWkiHaALbxDgYOHLSFsWpag==
"@abp/bootstrap-datepicker@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-3.1.0-rc.3.tgz#279d9603cd916a884bac125cb525ee44fb809762"
integrity sha512-qZolOk2Pw+IvXh6Ko7wJddzMVPbS8silGecBZMYe0DVRNovg0515Px8zR3GJ16wcVQuvG6ByBn4fdeKFmYfokQ==
dependencies:
bootstrap-datepicker "^1.9.0"
"@abp/bootstrap@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-3.1.0-rc.2.tgz#691e4f609895e8914cf6903a26ad5d51f629c596"
integrity sha512-SaT7JN5C2RqzTgA8YdoON/eaeL4gl54vp7DTGPXXVvTYS20ZSxExKgVXEuOMEJVITKu4OeXqLYZyThz888I9iQ==
"@abp/bootstrap@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-3.1.0-rc.3.tgz#a1368df757995f52c19dd76ef1846d19a067def6"
integrity sha512-r8XRTYJBEa33FVxF+Mg0ALYNhmTjVBw1NQIQY8Ub5ZR+HIZoaDqA0X5zfAKvGQlmfXLiZJDkvCV5EIQWsIgnrA==
dependencies:
"@abp/core" "~3.1.0-rc.2"
"@abp/core" "~3.1.0-rc.3"
bootstrap "^4.5.0"
bootstrap-v4-rtl "4.4.1-2"
"@abp/core@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/core/-/core-3.1.0-rc.2.tgz#707cec3323020b9ee4cc7c5a7fee21b418457eff"
integrity sha512-2VSCPIWEEM4iwcgRfgFempjPV0zLaWf81cp1ZrwuilqsljUXjMQL8Pf07TEaSa8+uN3VKkCsQtyq3A+DhUlVhA==
"@abp/core@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/core/-/core-3.1.0-rc.3.tgz#7e1bd9ac9aaecfc66863e8e319975358885a3ca2"
integrity sha512-wIvm4l8ZDQ+eiNN1a+v07EjUhngrxwPWvfDf9bPQpepfnIKiAktJziihh0oBJAbqXNqmI7f6FGN76spvNop/EA==
dependencies:
"@abp/utils" "^3.1.0-rc.2"
"@abp/utils" "^3.1.0-rc.3"
"@abp/datatables.net-bs4@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-3.1.0-rc.2.tgz#d98f47e4e286a7299ba42da1c394594f4b4581c7"
integrity sha512-VrcgFq3qq6azpCJEpk00R4fWA6GBzoDgHJT0K9bQtg4AqG8oamJa2QWX60g2OXzWpbI74bxleBAOLXzC4OJIrw==
"@abp/datatables.net-bs4@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-3.1.0-rc.3.tgz#f46c4474635918c16ca7edbe4930c07317930592"
integrity sha512-FeN53p5U2hIyYyM3G3AuGSwBZFBGbx4yHb/ymW/DEGtJ6XtynHlsFPz00/PktLe0OKOjUxOUf2LQLqKJi83WQQ==
dependencies:
"@abp/datatables.net" "~3.1.0-rc.2"
"@abp/datatables.net" "~3.1.0-rc.3"
datatables.net-bs4 "^1.10.21"
"@abp/datatables.net@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-3.1.0-rc.2.tgz#e73fee8f323e33094bfe49cbed520a4b9f382c18"
integrity sha512-+Bo8C7tslTasH7kMUnXQ5JESzg+ciy7jmvWPbJo32f0VFuiSPDBBr6nacBmE6IHPqG54ZAjqOkvE8eWL39dN2A==
"@abp/datatables.net@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-3.1.0-rc.3.tgz#c3a8f81d5ee571445b01d2db0e05ed555b1459b8"
integrity sha512-sOWuVwvSoQlXqC9CC9HGH6HzdHb5vVX8CbqzIUYBJEzY4NBRUqeclFJQrA/thjMNtefdLD2AiVwPFmAdGBeDSg==
dependencies:
"@abp/jquery" "~3.1.0-rc.2"
"@abp/jquery" "~3.1.0-rc.3"
datatables.net "^1.10.21"
"@abp/font-awesome@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-3.1.0-rc.2.tgz#4d0ef35abe67b86a6cbb8c7008a50f26eadbaa6e"
integrity sha512-r1iLq+1avQ8lsDqNAsu0TAQn5+JlYhUnjTVpnb/xcDMtbJv+eBZpqVLTbXelHV0q2Czq/gDzloqkHFNv5Cxceg==
"@abp/font-awesome@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-3.1.0-rc.3.tgz#38f63ad4fadc4986a73116fa29d5ef56812c483c"
integrity sha512-BnrI9XaKxEvI0d6Fa9tbw1J/VAsVUqTyAHva4WTUUa+neB9gaK62ZUjgDdF8Eo6gj7UOO8DYvsXehzpVpZKlPQ==
dependencies:
"@abp/core" "~3.1.0-rc.2"
"@abp/core" "~3.1.0-rc.3"
"@fortawesome/fontawesome-free" "^5.13.0"
"@abp/jquery-form@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-3.1.0-rc.2.tgz#f08ceb6be4a23d79f855d59b46c5fea5a6bf37ee"
integrity sha512-3UlUGXmvoT5xz4Hjz2gRX2rL+YbL4JprGaZvBrIbASJ6VSV3yHYbjma8YBqj2Wu2IQv6wpNhAYV+tALjPnFEgw==
"@abp/jquery-form@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-3.1.0-rc.3.tgz#7b74828f32a641c0b1ef1fd8b0389bf994a09e16"
integrity sha512-G+YRnDRZe5Mw81NAEnnr8scGjupndcu9xZ1dw+hCFGg30yypiUIfHtrMR4iR94y7M198fAgQP+0k7RvDqnALiw==
dependencies:
"@abp/jquery" "~3.1.0-rc.2"
"@abp/jquery" "~3.1.0-rc.3"
jquery-form "^4.3.0"
"@abp/jquery-validation-unobtrusive@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-3.1.0-rc.2.tgz#1802ffd0dc8aa710bfb81f6f5e6654a44227334f"
integrity sha512-2iWFp8a4Iths5dbf3v/gcTFrOXUX6CkwS5JiO3YsA0ujbZgF2HGbnPD7vzrfuRJAIKPKCIiovLDBY3yKN6boQw==
"@abp/jquery-validation-unobtrusive@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-3.1.0-rc.3.tgz#aef83e8f11791ae7be449eab6655a73075f98b45"
integrity sha512-uWu6qdZasSZEFJC1IhEtj8NZq5kXX8W/zlK2tVpFhjxE/QYiJlPj8pVy2I7cuEIBghzAO2omwI+5En8TSagrGA==
dependencies:
"@abp/jquery-validation" "~3.1.0-rc.2"
"@abp/jquery-validation" "~3.1.0-rc.3"
jquery-validation-unobtrusive "^3.2.11"
"@abp/jquery-validation@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-3.1.0-rc.2.tgz#adc314584261ef5bcdfa240c5e2df9f1bb4dcb2f"
integrity sha512-L2GoAUxMCAd8pXt54UqI2CEV4nWS0ww2dTNctEUcnJ2UZc7Ce+QFqBgvyRNmuSULMebfdtUYkodCGFdzzjRXfg==
"@abp/jquery-validation@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-3.1.0-rc.3.tgz#40dcb28ce5a3a87fc69972053e48a456c84e3225"
integrity sha512-uaL+ZS/NTf103Hq3ehayFT1qvq/Y2T5PAFY9ijBvX+7phCtPwGiIPfUvyuwYnKbdTa15odC275e7pY2CssHWIA==
dependencies:
"@abp/jquery" "~3.1.0-rc.2"
"@abp/jquery" "~3.1.0-rc.3"
jquery-validation "^1.19.2"
"@abp/jquery@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-3.1.0-rc.2.tgz#05857739e5ec9e519194fe9b80b426be0b40addb"
integrity sha512-+qPHJpV/s9GGWwdH6gj8BdDhg4t4w8pI9hx41UlIpPdrtO4kzaPU85/f7vX0QYzOrsYYxmWXHu3H0pL8QyDwQA==
"@abp/jquery@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-3.1.0-rc.3.tgz#8c35b9e7de888516e2acc5227092ca2fed991475"
integrity sha512-DT2uBNfW3+Xc1Bz62WHdIC3JfAb2Qcc4p86LyDG5pNRAd3FpImA1VnRPsMRX9Mig7HYRjMYiuYXTeovM6YS0fg==
dependencies:
"@abp/core" "~3.1.0-rc.2"
"@abp/core" "~3.1.0-rc.3"
jquery "~3.5.1"
"@abp/lodash@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-3.1.0-rc.2.tgz#80fc560277e903b94cf90146e05cb6e6e62b0ee3"
integrity sha512-TQ8HqvW9skMFDfJv7wNX4Ahi/HjCBfD/ZDePvfyTLwdsnNPwDg6zERwYTGk48ep/6CUsK3MMQzvShl4yaYIFYQ==
"@abp/lodash@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-3.1.0-rc.3.tgz#a312975824fa3bebc00f5eca35cededc5ec3af4b"
integrity sha512-siv5cMWlUHEX2RtvKCGoX2cEh4h1hniluKlFgmVmYY4hdGYdAG4T2d9QQAbPODwdzrJ8jzI36hXT/P4IrzhWZw==
dependencies:
"@abp/core" "~3.1.0-rc.2"
"@abp/core" "~3.1.0-rc.3"
lodash "^4.17.15"
"@abp/luxon@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-3.1.0-rc.2.tgz#6a7db2fd1cc1674e73df6c982657c791a94fc65b"
integrity sha512-vrtiuMnQDP0rC+yrQawqVu3F4pcZrv3wsx0ZqaIWWakQJ4X17aSTM0Xhxa95jnHh4WFFUDN00mYxkPxNr8JqvA==
"@abp/luxon@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-3.1.0-rc.3.tgz#9b9d5c9827a0c661458094134cafd80f35537a69"
integrity sha512-cKj/irXJhTJ6WiSyjzcZcsDjKFji1Q/0nV7IYhY9e2wzpg3qEB8Z8k8fDLPDAUriUKxBoI6mQ/CVC0ah7eg/LA==
dependencies:
luxon "^1.24.1"
"@abp/malihu-custom-scrollbar-plugin@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-3.1.0-rc.2.tgz#3805b260bd3442353a946de5c7508e98cc7cefdd"
integrity sha512-bp+S43ZIWQpkhx7ni2DThwDZ2A+q6ZaAUaESWz+yCHXWwYacnfHeq4p+mkS07OdVteP33NWAxJpjtDl6fPBo8A==
"@abp/malihu-custom-scrollbar-plugin@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-3.1.0-rc.3.tgz#218eb620532af8bdde6a46388a3d5349974fab44"
integrity sha512-z3IzgSYtpZ2FlWNmM2A1wbP3CHB3P5a8k/JR0JSWwtl+D/LiYC348VQIXen+pIJoEjMlY48iSi5XNyBIz4X9hw==
dependencies:
"@abp/core" "~3.1.0-rc.2"
"@abp/core" "~3.1.0-rc.3"
malihu-custom-scrollbar-plugin "^3.1.5"
"@abp/select2@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-3.1.0-rc.2.tgz#6b16301cb7c4ad4e2b39400a5f9cf336c700a343"
integrity sha512-qbj6csa9/0+xF5fzcm1WJSzUiBvSgwiYPRpH5wyG/FZYf7YxK2dAv/Lmi5RE4eAb8Ib9ueB7nPkzJYUJhJ1wgQ==
"@abp/select2@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-3.1.0-rc.3.tgz#493afc27f29da1c9926ee02e8f7b641e8ee4b67e"
integrity sha512-fym9GmQbl34CyTCVzfo4jGe77nSeDuRPYMzAYO8p0uKdDB8t9jNZNqhYJ9Ee5KQXJyg4lmFFPkLcRZF14E+cWw==
dependencies:
"@abp/core" "~3.1.0-rc.2"
"@abp/core" "~3.1.0-rc.3"
select2 "^4.0.13"
"@abp/sweetalert@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-3.1.0-rc.2.tgz#a152eb5632cd0eee50d5fed2c156bc4b6daf6829"
integrity sha512-6pjzFwr/HKgNYcsx76GZdcm0qZ8NfcdYqFOwj91w3bGmtPZYRRJLV01k9kDIOQHYnmCReO+ThF46wZCyt/8xvg==
"@abp/sweetalert@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-3.1.0-rc.3.tgz#1c1421e2baaa57cc24e0f9334a5173836819cc24"
integrity sha512-WrYRutXM2f6VRECEkWhjfqtQXlnEw88MCkYicAhyMH7ZYYWg7r9xVg9TRJJI4UwGMLSyR3EB+ZdTmnD8aSC0yQ==
dependencies:
"@abp/core" "~3.1.0-rc.2"
"@abp/core" "~3.1.0-rc.3"
sweetalert "^2.1.2"
"@abp/timeago@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-3.1.0-rc.2.tgz#0c3fe13f15319c943186eff861f0e9a790b6651b"
integrity sha512-BJzvJGJk6uPkpR5MMIX7DF/WsYZbvss2B82RTcr2Dkto7VtfRUYqcpWBcUIHCJ7hLh4SMS000fC8tfRXo7e0EA==
"@abp/timeago@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-3.1.0-rc.3.tgz#0a7a369ba29633f00b19206b257c6f1f59f182a4"
integrity sha512-FDgaQCJmwWplCcdJYa9kyCcMxJFrKf+zDEFzT5hWfhMzq+sYJYX7QDQtbF5OJnMSWuPyI0/RU0bocuGaJ584VQ==
dependencies:
"@abp/jquery" "~3.1.0-rc.2"
"@abp/jquery" "~3.1.0-rc.3"
timeago "^1.6.7"
"@abp/toastr@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-3.1.0-rc.2.tgz#1b149684a4f7751df48cd9cbac5ce0ce7526042c"
integrity sha512-4U2spuDnl2F3AzGDvHyhGJtZT0Kv4LmdUYwdq/aKneHSTzJ9v5bUpjjU1Gth6fyi0iqH61DAyaoTsbgy0kFQqQ==
"@abp/toastr@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-3.1.0-rc.3.tgz#89af6aa864a9aac76bc9bf21b7f9bc6763ca7573"
integrity sha512-AeKH5imy8W9yMAlzRv9VdkRHApySpR2BKfrQYk3q9LubgwaxLvOFc/l38aIEKuyosN7dHTMFBQlEwLxWFwaoPA==
dependencies:
"@abp/jquery" "~3.1.0-rc.2"
"@abp/jquery" "~3.1.0-rc.3"
toastr "^2.1.4"
"@abp/utils@^3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-3.1.0-rc.2.tgz#c3774246f01f4b032b2d229457c3bd93f7d14048"
integrity sha512-lgHy/OAEBau2Qyr0mZUjOWU8uBFBFIBvGnUKgSqKRxTqf5GyNvkKO8GPpqGSmyIsYUfW2UUsRhaLW7K85T9CZw==
"@abp/utils@^3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-3.1.0-rc.3.tgz#3cbc50c1f8fdf6592d66f8ea4b5a9c4249a5e46a"
integrity sha512-45KXx5zlxm5gK2EFwzM+hMjT8q8pD3PejyNfVP6HBbGE2N36LGKYtI59s6vFm5yV2qFxQyVPrk4mi3Y+neqlBw==
dependencies:
just-compare "^1.3.0"

@ -15,11 +15,11 @@
},
"private": true,
"dependencies": {
"@abp/ng.account": "~3.1.0-rc.2",
"@abp/ng.identity": "~3.1.0-rc.2",
"@abp/ng.setting-management": "~3.1.0-rc.2",
"@abp/ng.tenant-management": "~3.1.0-rc.2",
"@abp/ng.theme.basic": "~3.1.0-rc.2",
"@abp/ng.account": "~3.1.0-rc.3",
"@abp/ng.identity": "~3.1.0-rc.3",
"@abp/ng.setting-management": "~3.1.0-rc.3",
"@abp/ng.tenant-management": "~3.1.0-rc.3",
"@abp/ng.theme.basic": "~3.1.0-rc.3",
"@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": ">=3.1.0-rc.2",
"@abp/ng.theme.shared": ">=3.1.0-rc.2"
"@abp/ng.core": ">=3.1.0-rc.3",
"@abp/ng.theme.shared": ">=3.1.0-rc.3"
},
"dependencies": {
"tslib": "^2.0.0"

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

@ -2,37 +2,37 @@
# yarn lockfile v1
"@abp/aspnetcore.mvc.ui.theme.basic@^3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-3.1.0-rc.2.tgz#b72eee4a441619caa8222941c797c8afd3cae09b"
integrity sha512-8zczo69E6ACjFaL+3UNP7VoUXeoSVViKAyhoub0Uw6CrLUxAYxT/Yuw/apIY7AW3cVoB5ULBfjMN7xWSJML9eg==
dependencies:
"@abp/aspnetcore.mvc.ui.theme.shared" "~3.1.0-rc.2"
"@abp/aspnetcore.mvc.ui.theme.shared@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-3.1.0-rc.2.tgz#db34b0414ded4bd52420d1faa3a5fab03b68783f"
integrity sha512-tnTDCkExlUT+OyPls/VfZsBlbgu02P9zqpT58F7bDo2WtaxzrSvo6xwC+9a6+c3CpKy/xezI2S/r8H9lb2vd5w==
dependencies:
"@abp/aspnetcore.mvc.ui" "~3.1.0-rc.2"
"@abp/bootstrap" "~3.1.0-rc.2"
"@abp/bootstrap-datepicker" "~3.1.0-rc.2"
"@abp/datatables.net-bs4" "~3.1.0-rc.2"
"@abp/font-awesome" "~3.1.0-rc.2"
"@abp/jquery-form" "~3.1.0-rc.2"
"@abp/jquery-validation-unobtrusive" "~3.1.0-rc.2"
"@abp/lodash" "~3.1.0-rc.2"
"@abp/luxon" "~3.1.0-rc.2"
"@abp/malihu-custom-scrollbar-plugin" "~3.1.0-rc.2"
"@abp/select2" "~3.1.0-rc.2"
"@abp/sweetalert" "~3.1.0-rc.2"
"@abp/timeago" "~3.1.0-rc.2"
"@abp/toastr" "~3.1.0-rc.2"
"@abp/aspnetcore.mvc.ui@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-3.1.0-rc.2.tgz#395e101891d8fa7d1532defd125712c7846ee22a"
integrity sha512-dUvOXwUX7I08ZO5q30I9/1qv7s3c9FvKLVrjMexZL1auP83C5hnCh6EBOSWhKKe5Wfe5Rq2sxiinFi/xXibTsw==
"@abp/aspnetcore.mvc.ui.theme.basic@^3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-3.1.0-rc.3.tgz#d7e3ad928a72efb7c76a585ef051fce860efb7bf"
integrity sha512-cc2Wp/6hr1j89Ap/474HlH54WhAIgCya1buuXxrxXSMdYqDKNxK61aMYC/mnYGMiyPqoz6TWWUJB2h2dZeTgzQ==
dependencies:
"@abp/aspnetcore.mvc.ui.theme.shared" "~3.1.0-rc.3"
"@abp/aspnetcore.mvc.ui.theme.shared@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-3.1.0-rc.3.tgz#54a92d673f5158ee222d0d95ebfbca6c63b20a4f"
integrity sha512-czS+8+wuNxuNIogI3FI/T72dCumpbsXp9Fke9pwQEzkCZZCG11cJdOCr1pLJKT1G54x+zfgwVVFIL36sFcq50A==
dependencies:
"@abp/aspnetcore.mvc.ui" "~3.1.0-rc.3"
"@abp/bootstrap" "~3.1.0-rc.3"
"@abp/bootstrap-datepicker" "~3.1.0-rc.3"
"@abp/datatables.net-bs4" "~3.1.0-rc.3"
"@abp/font-awesome" "~3.1.0-rc.3"
"@abp/jquery-form" "~3.1.0-rc.3"
"@abp/jquery-validation-unobtrusive" "~3.1.0-rc.3"
"@abp/lodash" "~3.1.0-rc.3"
"@abp/luxon" "~3.1.0-rc.3"
"@abp/malihu-custom-scrollbar-plugin" "~3.1.0-rc.3"
"@abp/select2" "~3.1.0-rc.3"
"@abp/sweetalert" "~3.1.0-rc.3"
"@abp/timeago" "~3.1.0-rc.3"
"@abp/toastr" "~3.1.0-rc.3"
"@abp/aspnetcore.mvc.ui@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-3.1.0-rc.3.tgz#e26f8ff9d7beaedf2050b9d6319e6368c990c373"
integrity sha512-qglA2lW0eQFzZlGeAev+vGuWsHNFmDeSCGAHPhd4Z07zjnphPnIOXSa+rXhb+4y6DevQP7OY/KSMQdX6ZMU3RQ==
dependencies:
ansi-colors "^4.1.1"
extend-object "^1.0.0"
@ -41,144 +41,144 @@
path "^0.12.7"
rimraf "^3.0.2"
"@abp/bootstrap-datepicker@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-3.1.0-rc.2.tgz#5ecca3e7150d4a75577d9abf0f226813fe40cff5"
integrity sha512-SebgagX0TszhsmIfQhM+A+M+cThbELSRmbDb+48DgLflVHH1bw6wCGXVMVQA65vYWkiHaALbxDgYOHLSFsWpag==
"@abp/bootstrap-datepicker@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-3.1.0-rc.3.tgz#279d9603cd916a884bac125cb525ee44fb809762"
integrity sha512-qZolOk2Pw+IvXh6Ko7wJddzMVPbS8silGecBZMYe0DVRNovg0515Px8zR3GJ16wcVQuvG6ByBn4fdeKFmYfokQ==
dependencies:
bootstrap-datepicker "^1.9.0"
"@abp/bootstrap@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-3.1.0-rc.2.tgz#691e4f609895e8914cf6903a26ad5d51f629c596"
integrity sha512-SaT7JN5C2RqzTgA8YdoON/eaeL4gl54vp7DTGPXXVvTYS20ZSxExKgVXEuOMEJVITKu4OeXqLYZyThz888I9iQ==
"@abp/bootstrap@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-3.1.0-rc.3.tgz#a1368df757995f52c19dd76ef1846d19a067def6"
integrity sha512-r8XRTYJBEa33FVxF+Mg0ALYNhmTjVBw1NQIQY8Ub5ZR+HIZoaDqA0X5zfAKvGQlmfXLiZJDkvCV5EIQWsIgnrA==
dependencies:
"@abp/core" "~3.1.0-rc.2"
"@abp/core" "~3.1.0-rc.3"
bootstrap "^4.5.0"
bootstrap-v4-rtl "4.4.1-2"
"@abp/core@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/core/-/core-3.1.0-rc.2.tgz#707cec3323020b9ee4cc7c5a7fee21b418457eff"
integrity sha512-2VSCPIWEEM4iwcgRfgFempjPV0zLaWf81cp1ZrwuilqsljUXjMQL8Pf07TEaSa8+uN3VKkCsQtyq3A+DhUlVhA==
"@abp/core@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/core/-/core-3.1.0-rc.3.tgz#7e1bd9ac9aaecfc66863e8e319975358885a3ca2"
integrity sha512-wIvm4l8ZDQ+eiNN1a+v07EjUhngrxwPWvfDf9bPQpepfnIKiAktJziihh0oBJAbqXNqmI7f6FGN76spvNop/EA==
dependencies:
"@abp/utils" "^3.1.0-rc.2"
"@abp/utils" "^3.1.0-rc.3"
"@abp/datatables.net-bs4@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-3.1.0-rc.2.tgz#d98f47e4e286a7299ba42da1c394594f4b4581c7"
integrity sha512-VrcgFq3qq6azpCJEpk00R4fWA6GBzoDgHJT0K9bQtg4AqG8oamJa2QWX60g2OXzWpbI74bxleBAOLXzC4OJIrw==
"@abp/datatables.net-bs4@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-3.1.0-rc.3.tgz#f46c4474635918c16ca7edbe4930c07317930592"
integrity sha512-FeN53p5U2hIyYyM3G3AuGSwBZFBGbx4yHb/ymW/DEGtJ6XtynHlsFPz00/PktLe0OKOjUxOUf2LQLqKJi83WQQ==
dependencies:
"@abp/datatables.net" "~3.1.0-rc.2"
"@abp/datatables.net" "~3.1.0-rc.3"
datatables.net-bs4 "^1.10.21"
"@abp/datatables.net@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-3.1.0-rc.2.tgz#e73fee8f323e33094bfe49cbed520a4b9f382c18"
integrity sha512-+Bo8C7tslTasH7kMUnXQ5JESzg+ciy7jmvWPbJo32f0VFuiSPDBBr6nacBmE6IHPqG54ZAjqOkvE8eWL39dN2A==
"@abp/datatables.net@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-3.1.0-rc.3.tgz#c3a8f81d5ee571445b01d2db0e05ed555b1459b8"
integrity sha512-sOWuVwvSoQlXqC9CC9HGH6HzdHb5vVX8CbqzIUYBJEzY4NBRUqeclFJQrA/thjMNtefdLD2AiVwPFmAdGBeDSg==
dependencies:
"@abp/jquery" "~3.1.0-rc.2"
"@abp/jquery" "~3.1.0-rc.3"
datatables.net "^1.10.21"
"@abp/font-awesome@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-3.1.0-rc.2.tgz#4d0ef35abe67b86a6cbb8c7008a50f26eadbaa6e"
integrity sha512-r1iLq+1avQ8lsDqNAsu0TAQn5+JlYhUnjTVpnb/xcDMtbJv+eBZpqVLTbXelHV0q2Czq/gDzloqkHFNv5Cxceg==
"@abp/font-awesome@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-3.1.0-rc.3.tgz#38f63ad4fadc4986a73116fa29d5ef56812c483c"
integrity sha512-BnrI9XaKxEvI0d6Fa9tbw1J/VAsVUqTyAHva4WTUUa+neB9gaK62ZUjgDdF8Eo6gj7UOO8DYvsXehzpVpZKlPQ==
dependencies:
"@abp/core" "~3.1.0-rc.2"
"@abp/core" "~3.1.0-rc.3"
"@fortawesome/fontawesome-free" "^5.13.0"
"@abp/jquery-form@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-3.1.0-rc.2.tgz#f08ceb6be4a23d79f855d59b46c5fea5a6bf37ee"
integrity sha512-3UlUGXmvoT5xz4Hjz2gRX2rL+YbL4JprGaZvBrIbASJ6VSV3yHYbjma8YBqj2Wu2IQv6wpNhAYV+tALjPnFEgw==
"@abp/jquery-form@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-3.1.0-rc.3.tgz#7b74828f32a641c0b1ef1fd8b0389bf994a09e16"
integrity sha512-G+YRnDRZe5Mw81NAEnnr8scGjupndcu9xZ1dw+hCFGg30yypiUIfHtrMR4iR94y7M198fAgQP+0k7RvDqnALiw==
dependencies:
"@abp/jquery" "~3.1.0-rc.2"
"@abp/jquery" "~3.1.0-rc.3"
jquery-form "^4.3.0"
"@abp/jquery-validation-unobtrusive@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-3.1.0-rc.2.tgz#1802ffd0dc8aa710bfb81f6f5e6654a44227334f"
integrity sha512-2iWFp8a4Iths5dbf3v/gcTFrOXUX6CkwS5JiO3YsA0ujbZgF2HGbnPD7vzrfuRJAIKPKCIiovLDBY3yKN6boQw==
"@abp/jquery-validation-unobtrusive@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-3.1.0-rc.3.tgz#aef83e8f11791ae7be449eab6655a73075f98b45"
integrity sha512-uWu6qdZasSZEFJC1IhEtj8NZq5kXX8W/zlK2tVpFhjxE/QYiJlPj8pVy2I7cuEIBghzAO2omwI+5En8TSagrGA==
dependencies:
"@abp/jquery-validation" "~3.1.0-rc.2"
"@abp/jquery-validation" "~3.1.0-rc.3"
jquery-validation-unobtrusive "^3.2.11"
"@abp/jquery-validation@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-3.1.0-rc.2.tgz#adc314584261ef5bcdfa240c5e2df9f1bb4dcb2f"
integrity sha512-L2GoAUxMCAd8pXt54UqI2CEV4nWS0ww2dTNctEUcnJ2UZc7Ce+QFqBgvyRNmuSULMebfdtUYkodCGFdzzjRXfg==
"@abp/jquery-validation@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-3.1.0-rc.3.tgz#40dcb28ce5a3a87fc69972053e48a456c84e3225"
integrity sha512-uaL+ZS/NTf103Hq3ehayFT1qvq/Y2T5PAFY9ijBvX+7phCtPwGiIPfUvyuwYnKbdTa15odC275e7pY2CssHWIA==
dependencies:
"@abp/jquery" "~3.1.0-rc.2"
"@abp/jquery" "~3.1.0-rc.3"
jquery-validation "^1.19.2"
"@abp/jquery@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-3.1.0-rc.2.tgz#05857739e5ec9e519194fe9b80b426be0b40addb"
integrity sha512-+qPHJpV/s9GGWwdH6gj8BdDhg4t4w8pI9hx41UlIpPdrtO4kzaPU85/f7vX0QYzOrsYYxmWXHu3H0pL8QyDwQA==
"@abp/jquery@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-3.1.0-rc.3.tgz#8c35b9e7de888516e2acc5227092ca2fed991475"
integrity sha512-DT2uBNfW3+Xc1Bz62WHdIC3JfAb2Qcc4p86LyDG5pNRAd3FpImA1VnRPsMRX9Mig7HYRjMYiuYXTeovM6YS0fg==
dependencies:
"@abp/core" "~3.1.0-rc.2"
"@abp/core" "~3.1.0-rc.3"
jquery "~3.5.1"
"@abp/lodash@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-3.1.0-rc.2.tgz#80fc560277e903b94cf90146e05cb6e6e62b0ee3"
integrity sha512-TQ8HqvW9skMFDfJv7wNX4Ahi/HjCBfD/ZDePvfyTLwdsnNPwDg6zERwYTGk48ep/6CUsK3MMQzvShl4yaYIFYQ==
"@abp/lodash@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-3.1.0-rc.3.tgz#a312975824fa3bebc00f5eca35cededc5ec3af4b"
integrity sha512-siv5cMWlUHEX2RtvKCGoX2cEh4h1hniluKlFgmVmYY4hdGYdAG4T2d9QQAbPODwdzrJ8jzI36hXT/P4IrzhWZw==
dependencies:
"@abp/core" "~3.1.0-rc.2"
"@abp/core" "~3.1.0-rc.3"
lodash "^4.17.15"
"@abp/luxon@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-3.1.0-rc.2.tgz#6a7db2fd1cc1674e73df6c982657c791a94fc65b"
integrity sha512-vrtiuMnQDP0rC+yrQawqVu3F4pcZrv3wsx0ZqaIWWakQJ4X17aSTM0Xhxa95jnHh4WFFUDN00mYxkPxNr8JqvA==
"@abp/luxon@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-3.1.0-rc.3.tgz#9b9d5c9827a0c661458094134cafd80f35537a69"
integrity sha512-cKj/irXJhTJ6WiSyjzcZcsDjKFji1Q/0nV7IYhY9e2wzpg3qEB8Z8k8fDLPDAUriUKxBoI6mQ/CVC0ah7eg/LA==
dependencies:
luxon "^1.24.1"
"@abp/malihu-custom-scrollbar-plugin@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-3.1.0-rc.2.tgz#3805b260bd3442353a946de5c7508e98cc7cefdd"
integrity sha512-bp+S43ZIWQpkhx7ni2DThwDZ2A+q6ZaAUaESWz+yCHXWwYacnfHeq4p+mkS07OdVteP33NWAxJpjtDl6fPBo8A==
"@abp/malihu-custom-scrollbar-plugin@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-3.1.0-rc.3.tgz#218eb620532af8bdde6a46388a3d5349974fab44"
integrity sha512-z3IzgSYtpZ2FlWNmM2A1wbP3CHB3P5a8k/JR0JSWwtl+D/LiYC348VQIXen+pIJoEjMlY48iSi5XNyBIz4X9hw==
dependencies:
"@abp/core" "~3.1.0-rc.2"
"@abp/core" "~3.1.0-rc.3"
malihu-custom-scrollbar-plugin "^3.1.5"
"@abp/select2@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-3.1.0-rc.2.tgz#6b16301cb7c4ad4e2b39400a5f9cf336c700a343"
integrity sha512-qbj6csa9/0+xF5fzcm1WJSzUiBvSgwiYPRpH5wyG/FZYf7YxK2dAv/Lmi5RE4eAb8Ib9ueB7nPkzJYUJhJ1wgQ==
"@abp/select2@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-3.1.0-rc.3.tgz#493afc27f29da1c9926ee02e8f7b641e8ee4b67e"
integrity sha512-fym9GmQbl34CyTCVzfo4jGe77nSeDuRPYMzAYO8p0uKdDB8t9jNZNqhYJ9Ee5KQXJyg4lmFFPkLcRZF14E+cWw==
dependencies:
"@abp/core" "~3.1.0-rc.2"
"@abp/core" "~3.1.0-rc.3"
select2 "^4.0.13"
"@abp/sweetalert@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-3.1.0-rc.2.tgz#a152eb5632cd0eee50d5fed2c156bc4b6daf6829"
integrity sha512-6pjzFwr/HKgNYcsx76GZdcm0qZ8NfcdYqFOwj91w3bGmtPZYRRJLV01k9kDIOQHYnmCReO+ThF46wZCyt/8xvg==
"@abp/sweetalert@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-3.1.0-rc.3.tgz#1c1421e2baaa57cc24e0f9334a5173836819cc24"
integrity sha512-WrYRutXM2f6VRECEkWhjfqtQXlnEw88MCkYicAhyMH7ZYYWg7r9xVg9TRJJI4UwGMLSyR3EB+ZdTmnD8aSC0yQ==
dependencies:
"@abp/core" "~3.1.0-rc.2"
"@abp/core" "~3.1.0-rc.3"
sweetalert "^2.1.2"
"@abp/timeago@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-3.1.0-rc.2.tgz#0c3fe13f15319c943186eff861f0e9a790b6651b"
integrity sha512-BJzvJGJk6uPkpR5MMIX7DF/WsYZbvss2B82RTcr2Dkto7VtfRUYqcpWBcUIHCJ7hLh4SMS000fC8tfRXo7e0EA==
"@abp/timeago@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-3.1.0-rc.3.tgz#0a7a369ba29633f00b19206b257c6f1f59f182a4"
integrity sha512-FDgaQCJmwWplCcdJYa9kyCcMxJFrKf+zDEFzT5hWfhMzq+sYJYX7QDQtbF5OJnMSWuPyI0/RU0bocuGaJ584VQ==
dependencies:
"@abp/jquery" "~3.1.0-rc.2"
"@abp/jquery" "~3.1.0-rc.3"
timeago "^1.6.7"
"@abp/toastr@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-3.1.0-rc.2.tgz#1b149684a4f7751df48cd9cbac5ce0ce7526042c"
integrity sha512-4U2spuDnl2F3AzGDvHyhGJtZT0Kv4LmdUYwdq/aKneHSTzJ9v5bUpjjU1Gth6fyi0iqH61DAyaoTsbgy0kFQqQ==
"@abp/toastr@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-3.1.0-rc.3.tgz#89af6aa864a9aac76bc9bf21b7f9bc6763ca7573"
integrity sha512-AeKH5imy8W9yMAlzRv9VdkRHApySpR2BKfrQYk3q9LubgwaxLvOFc/l38aIEKuyosN7dHTMFBQlEwLxWFwaoPA==
dependencies:
"@abp/jquery" "~3.1.0-rc.2"
"@abp/jquery" "~3.1.0-rc.3"
toastr "^2.1.4"
"@abp/utils@^3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-3.1.0-rc.2.tgz#c3774246f01f4b032b2d229457c3bd93f7d14048"
integrity sha512-lgHy/OAEBau2Qyr0mZUjOWU8uBFBFIBvGnUKgSqKRxTqf5GyNvkKO8GPpqGSmyIsYUfW2UUsRhaLW7K85T9CZw==
"@abp/utils@^3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-3.1.0-rc.3.tgz#3cbc50c1f8fdf6592d66f8ea4b5a9c4249a5e46a"
integrity sha512-45KXx5zlxm5gK2EFwzM+hMjT8q8pD3PejyNfVP6HBbGE2N36LGKYtI59s6vFm5yV2qFxQyVPrk4mi3Y+neqlBw==
dependencies:
just-compare "^1.3.0"

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

@ -2,37 +2,37 @@
# yarn lockfile v1
"@abp/aspnetcore.mvc.ui.theme.basic@^3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-3.1.0-rc.2.tgz#b72eee4a441619caa8222941c797c8afd3cae09b"
integrity sha512-8zczo69E6ACjFaL+3UNP7VoUXeoSVViKAyhoub0Uw6CrLUxAYxT/Yuw/apIY7AW3cVoB5ULBfjMN7xWSJML9eg==
dependencies:
"@abp/aspnetcore.mvc.ui.theme.shared" "~3.1.0-rc.2"
"@abp/aspnetcore.mvc.ui.theme.shared@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-3.1.0-rc.2.tgz#db34b0414ded4bd52420d1faa3a5fab03b68783f"
integrity sha512-tnTDCkExlUT+OyPls/VfZsBlbgu02P9zqpT58F7bDo2WtaxzrSvo6xwC+9a6+c3CpKy/xezI2S/r8H9lb2vd5w==
dependencies:
"@abp/aspnetcore.mvc.ui" "~3.1.0-rc.2"
"@abp/bootstrap" "~3.1.0-rc.2"
"@abp/bootstrap-datepicker" "~3.1.0-rc.2"
"@abp/datatables.net-bs4" "~3.1.0-rc.2"
"@abp/font-awesome" "~3.1.0-rc.2"
"@abp/jquery-form" "~3.1.0-rc.2"
"@abp/jquery-validation-unobtrusive" "~3.1.0-rc.2"
"@abp/lodash" "~3.1.0-rc.2"
"@abp/luxon" "~3.1.0-rc.2"
"@abp/malihu-custom-scrollbar-plugin" "~3.1.0-rc.2"
"@abp/select2" "~3.1.0-rc.2"
"@abp/sweetalert" "~3.1.0-rc.2"
"@abp/timeago" "~3.1.0-rc.2"
"@abp/toastr" "~3.1.0-rc.2"
"@abp/aspnetcore.mvc.ui@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-3.1.0-rc.2.tgz#395e101891d8fa7d1532defd125712c7846ee22a"
integrity sha512-dUvOXwUX7I08ZO5q30I9/1qv7s3c9FvKLVrjMexZL1auP83C5hnCh6EBOSWhKKe5Wfe5Rq2sxiinFi/xXibTsw==
"@abp/aspnetcore.mvc.ui.theme.basic@^3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-3.1.0-rc.3.tgz#d7e3ad928a72efb7c76a585ef051fce860efb7bf"
integrity sha512-cc2Wp/6hr1j89Ap/474HlH54WhAIgCya1buuXxrxXSMdYqDKNxK61aMYC/mnYGMiyPqoz6TWWUJB2h2dZeTgzQ==
dependencies:
"@abp/aspnetcore.mvc.ui.theme.shared" "~3.1.0-rc.3"
"@abp/aspnetcore.mvc.ui.theme.shared@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-3.1.0-rc.3.tgz#54a92d673f5158ee222d0d95ebfbca6c63b20a4f"
integrity sha512-czS+8+wuNxuNIogI3FI/T72dCumpbsXp9Fke9pwQEzkCZZCG11cJdOCr1pLJKT1G54x+zfgwVVFIL36sFcq50A==
dependencies:
"@abp/aspnetcore.mvc.ui" "~3.1.0-rc.3"
"@abp/bootstrap" "~3.1.0-rc.3"
"@abp/bootstrap-datepicker" "~3.1.0-rc.3"
"@abp/datatables.net-bs4" "~3.1.0-rc.3"
"@abp/font-awesome" "~3.1.0-rc.3"
"@abp/jquery-form" "~3.1.0-rc.3"
"@abp/jquery-validation-unobtrusive" "~3.1.0-rc.3"
"@abp/lodash" "~3.1.0-rc.3"
"@abp/luxon" "~3.1.0-rc.3"
"@abp/malihu-custom-scrollbar-plugin" "~3.1.0-rc.3"
"@abp/select2" "~3.1.0-rc.3"
"@abp/sweetalert" "~3.1.0-rc.3"
"@abp/timeago" "~3.1.0-rc.3"
"@abp/toastr" "~3.1.0-rc.3"
"@abp/aspnetcore.mvc.ui@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-3.1.0-rc.3.tgz#e26f8ff9d7beaedf2050b9d6319e6368c990c373"
integrity sha512-qglA2lW0eQFzZlGeAev+vGuWsHNFmDeSCGAHPhd4Z07zjnphPnIOXSa+rXhb+4y6DevQP7OY/KSMQdX6ZMU3RQ==
dependencies:
ansi-colors "^4.1.1"
extend-object "^1.0.0"
@ -41,144 +41,144 @@
path "^0.12.7"
rimraf "^3.0.2"
"@abp/bootstrap-datepicker@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-3.1.0-rc.2.tgz#5ecca3e7150d4a75577d9abf0f226813fe40cff5"
integrity sha512-SebgagX0TszhsmIfQhM+A+M+cThbELSRmbDb+48DgLflVHH1bw6wCGXVMVQA65vYWkiHaALbxDgYOHLSFsWpag==
"@abp/bootstrap-datepicker@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-3.1.0-rc.3.tgz#279d9603cd916a884bac125cb525ee44fb809762"
integrity sha512-qZolOk2Pw+IvXh6Ko7wJddzMVPbS8silGecBZMYe0DVRNovg0515Px8zR3GJ16wcVQuvG6ByBn4fdeKFmYfokQ==
dependencies:
bootstrap-datepicker "^1.9.0"
"@abp/bootstrap@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-3.1.0-rc.2.tgz#691e4f609895e8914cf6903a26ad5d51f629c596"
integrity sha512-SaT7JN5C2RqzTgA8YdoON/eaeL4gl54vp7DTGPXXVvTYS20ZSxExKgVXEuOMEJVITKu4OeXqLYZyThz888I9iQ==
"@abp/bootstrap@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-3.1.0-rc.3.tgz#a1368df757995f52c19dd76ef1846d19a067def6"
integrity sha512-r8XRTYJBEa33FVxF+Mg0ALYNhmTjVBw1NQIQY8Ub5ZR+HIZoaDqA0X5zfAKvGQlmfXLiZJDkvCV5EIQWsIgnrA==
dependencies:
"@abp/core" "~3.1.0-rc.2"
"@abp/core" "~3.1.0-rc.3"
bootstrap "^4.5.0"
bootstrap-v4-rtl "4.4.1-2"
"@abp/core@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/core/-/core-3.1.0-rc.2.tgz#707cec3323020b9ee4cc7c5a7fee21b418457eff"
integrity sha512-2VSCPIWEEM4iwcgRfgFempjPV0zLaWf81cp1ZrwuilqsljUXjMQL8Pf07TEaSa8+uN3VKkCsQtyq3A+DhUlVhA==
"@abp/core@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/core/-/core-3.1.0-rc.3.tgz#7e1bd9ac9aaecfc66863e8e319975358885a3ca2"
integrity sha512-wIvm4l8ZDQ+eiNN1a+v07EjUhngrxwPWvfDf9bPQpepfnIKiAktJziihh0oBJAbqXNqmI7f6FGN76spvNop/EA==
dependencies:
"@abp/utils" "^3.1.0-rc.2"
"@abp/utils" "^3.1.0-rc.3"
"@abp/datatables.net-bs4@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-3.1.0-rc.2.tgz#d98f47e4e286a7299ba42da1c394594f4b4581c7"
integrity sha512-VrcgFq3qq6azpCJEpk00R4fWA6GBzoDgHJT0K9bQtg4AqG8oamJa2QWX60g2OXzWpbI74bxleBAOLXzC4OJIrw==
"@abp/datatables.net-bs4@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-3.1.0-rc.3.tgz#f46c4474635918c16ca7edbe4930c07317930592"
integrity sha512-FeN53p5U2hIyYyM3G3AuGSwBZFBGbx4yHb/ymW/DEGtJ6XtynHlsFPz00/PktLe0OKOjUxOUf2LQLqKJi83WQQ==
dependencies:
"@abp/datatables.net" "~3.1.0-rc.2"
"@abp/datatables.net" "~3.1.0-rc.3"
datatables.net-bs4 "^1.10.21"
"@abp/datatables.net@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-3.1.0-rc.2.tgz#e73fee8f323e33094bfe49cbed520a4b9f382c18"
integrity sha512-+Bo8C7tslTasH7kMUnXQ5JESzg+ciy7jmvWPbJo32f0VFuiSPDBBr6nacBmE6IHPqG54ZAjqOkvE8eWL39dN2A==
"@abp/datatables.net@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-3.1.0-rc.3.tgz#c3a8f81d5ee571445b01d2db0e05ed555b1459b8"
integrity sha512-sOWuVwvSoQlXqC9CC9HGH6HzdHb5vVX8CbqzIUYBJEzY4NBRUqeclFJQrA/thjMNtefdLD2AiVwPFmAdGBeDSg==
dependencies:
"@abp/jquery" "~3.1.0-rc.2"
"@abp/jquery" "~3.1.0-rc.3"
datatables.net "^1.10.21"
"@abp/font-awesome@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-3.1.0-rc.2.tgz#4d0ef35abe67b86a6cbb8c7008a50f26eadbaa6e"
integrity sha512-r1iLq+1avQ8lsDqNAsu0TAQn5+JlYhUnjTVpnb/xcDMtbJv+eBZpqVLTbXelHV0q2Czq/gDzloqkHFNv5Cxceg==
"@abp/font-awesome@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-3.1.0-rc.3.tgz#38f63ad4fadc4986a73116fa29d5ef56812c483c"
integrity sha512-BnrI9XaKxEvI0d6Fa9tbw1J/VAsVUqTyAHva4WTUUa+neB9gaK62ZUjgDdF8Eo6gj7UOO8DYvsXehzpVpZKlPQ==
dependencies:
"@abp/core" "~3.1.0-rc.2"
"@abp/core" "~3.1.0-rc.3"
"@fortawesome/fontawesome-free" "^5.13.0"
"@abp/jquery-form@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-3.1.0-rc.2.tgz#f08ceb6be4a23d79f855d59b46c5fea5a6bf37ee"
integrity sha512-3UlUGXmvoT5xz4Hjz2gRX2rL+YbL4JprGaZvBrIbASJ6VSV3yHYbjma8YBqj2Wu2IQv6wpNhAYV+tALjPnFEgw==
"@abp/jquery-form@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-3.1.0-rc.3.tgz#7b74828f32a641c0b1ef1fd8b0389bf994a09e16"
integrity sha512-G+YRnDRZe5Mw81NAEnnr8scGjupndcu9xZ1dw+hCFGg30yypiUIfHtrMR4iR94y7M198fAgQP+0k7RvDqnALiw==
dependencies:
"@abp/jquery" "~3.1.0-rc.2"
"@abp/jquery" "~3.1.0-rc.3"
jquery-form "^4.3.0"
"@abp/jquery-validation-unobtrusive@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-3.1.0-rc.2.tgz#1802ffd0dc8aa710bfb81f6f5e6654a44227334f"
integrity sha512-2iWFp8a4Iths5dbf3v/gcTFrOXUX6CkwS5JiO3YsA0ujbZgF2HGbnPD7vzrfuRJAIKPKCIiovLDBY3yKN6boQw==
"@abp/jquery-validation-unobtrusive@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-3.1.0-rc.3.tgz#aef83e8f11791ae7be449eab6655a73075f98b45"
integrity sha512-uWu6qdZasSZEFJC1IhEtj8NZq5kXX8W/zlK2tVpFhjxE/QYiJlPj8pVy2I7cuEIBghzAO2omwI+5En8TSagrGA==
dependencies:
"@abp/jquery-validation" "~3.1.0-rc.2"
"@abp/jquery-validation" "~3.1.0-rc.3"
jquery-validation-unobtrusive "^3.2.11"
"@abp/jquery-validation@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-3.1.0-rc.2.tgz#adc314584261ef5bcdfa240c5e2df9f1bb4dcb2f"
integrity sha512-L2GoAUxMCAd8pXt54UqI2CEV4nWS0ww2dTNctEUcnJ2UZc7Ce+QFqBgvyRNmuSULMebfdtUYkodCGFdzzjRXfg==
"@abp/jquery-validation@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-3.1.0-rc.3.tgz#40dcb28ce5a3a87fc69972053e48a456c84e3225"
integrity sha512-uaL+ZS/NTf103Hq3ehayFT1qvq/Y2T5PAFY9ijBvX+7phCtPwGiIPfUvyuwYnKbdTa15odC275e7pY2CssHWIA==
dependencies:
"@abp/jquery" "~3.1.0-rc.2"
"@abp/jquery" "~3.1.0-rc.3"
jquery-validation "^1.19.2"
"@abp/jquery@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-3.1.0-rc.2.tgz#05857739e5ec9e519194fe9b80b426be0b40addb"
integrity sha512-+qPHJpV/s9GGWwdH6gj8BdDhg4t4w8pI9hx41UlIpPdrtO4kzaPU85/f7vX0QYzOrsYYxmWXHu3H0pL8QyDwQA==
"@abp/jquery@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-3.1.0-rc.3.tgz#8c35b9e7de888516e2acc5227092ca2fed991475"
integrity sha512-DT2uBNfW3+Xc1Bz62WHdIC3JfAb2Qcc4p86LyDG5pNRAd3FpImA1VnRPsMRX9Mig7HYRjMYiuYXTeovM6YS0fg==
dependencies:
"@abp/core" "~3.1.0-rc.2"
"@abp/core" "~3.1.0-rc.3"
jquery "~3.5.1"
"@abp/lodash@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-3.1.0-rc.2.tgz#80fc560277e903b94cf90146e05cb6e6e62b0ee3"
integrity sha512-TQ8HqvW9skMFDfJv7wNX4Ahi/HjCBfD/ZDePvfyTLwdsnNPwDg6zERwYTGk48ep/6CUsK3MMQzvShl4yaYIFYQ==
"@abp/lodash@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-3.1.0-rc.3.tgz#a312975824fa3bebc00f5eca35cededc5ec3af4b"
integrity sha512-siv5cMWlUHEX2RtvKCGoX2cEh4h1hniluKlFgmVmYY4hdGYdAG4T2d9QQAbPODwdzrJ8jzI36hXT/P4IrzhWZw==
dependencies:
"@abp/core" "~3.1.0-rc.2"
"@abp/core" "~3.1.0-rc.3"
lodash "^4.17.15"
"@abp/luxon@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-3.1.0-rc.2.tgz#6a7db2fd1cc1674e73df6c982657c791a94fc65b"
integrity sha512-vrtiuMnQDP0rC+yrQawqVu3F4pcZrv3wsx0ZqaIWWakQJ4X17aSTM0Xhxa95jnHh4WFFUDN00mYxkPxNr8JqvA==
"@abp/luxon@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-3.1.0-rc.3.tgz#9b9d5c9827a0c661458094134cafd80f35537a69"
integrity sha512-cKj/irXJhTJ6WiSyjzcZcsDjKFji1Q/0nV7IYhY9e2wzpg3qEB8Z8k8fDLPDAUriUKxBoI6mQ/CVC0ah7eg/LA==
dependencies:
luxon "^1.24.1"
"@abp/malihu-custom-scrollbar-plugin@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-3.1.0-rc.2.tgz#3805b260bd3442353a946de5c7508e98cc7cefdd"
integrity sha512-bp+S43ZIWQpkhx7ni2DThwDZ2A+q6ZaAUaESWz+yCHXWwYacnfHeq4p+mkS07OdVteP33NWAxJpjtDl6fPBo8A==
"@abp/malihu-custom-scrollbar-plugin@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-3.1.0-rc.3.tgz#218eb620532af8bdde6a46388a3d5349974fab44"
integrity sha512-z3IzgSYtpZ2FlWNmM2A1wbP3CHB3P5a8k/JR0JSWwtl+D/LiYC348VQIXen+pIJoEjMlY48iSi5XNyBIz4X9hw==
dependencies:
"@abp/core" "~3.1.0-rc.2"
"@abp/core" "~3.1.0-rc.3"
malihu-custom-scrollbar-plugin "^3.1.5"
"@abp/select2@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-3.1.0-rc.2.tgz#6b16301cb7c4ad4e2b39400a5f9cf336c700a343"
integrity sha512-qbj6csa9/0+xF5fzcm1WJSzUiBvSgwiYPRpH5wyG/FZYf7YxK2dAv/Lmi5RE4eAb8Ib9ueB7nPkzJYUJhJ1wgQ==
"@abp/select2@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-3.1.0-rc.3.tgz#493afc27f29da1c9926ee02e8f7b641e8ee4b67e"
integrity sha512-fym9GmQbl34CyTCVzfo4jGe77nSeDuRPYMzAYO8p0uKdDB8t9jNZNqhYJ9Ee5KQXJyg4lmFFPkLcRZF14E+cWw==
dependencies:
"@abp/core" "~3.1.0-rc.2"
"@abp/core" "~3.1.0-rc.3"
select2 "^4.0.13"
"@abp/sweetalert@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-3.1.0-rc.2.tgz#a152eb5632cd0eee50d5fed2c156bc4b6daf6829"
integrity sha512-6pjzFwr/HKgNYcsx76GZdcm0qZ8NfcdYqFOwj91w3bGmtPZYRRJLV01k9kDIOQHYnmCReO+ThF46wZCyt/8xvg==
"@abp/sweetalert@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-3.1.0-rc.3.tgz#1c1421e2baaa57cc24e0f9334a5173836819cc24"
integrity sha512-WrYRutXM2f6VRECEkWhjfqtQXlnEw88MCkYicAhyMH7ZYYWg7r9xVg9TRJJI4UwGMLSyR3EB+ZdTmnD8aSC0yQ==
dependencies:
"@abp/core" "~3.1.0-rc.2"
"@abp/core" "~3.1.0-rc.3"
sweetalert "^2.1.2"
"@abp/timeago@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-3.1.0-rc.2.tgz#0c3fe13f15319c943186eff861f0e9a790b6651b"
integrity sha512-BJzvJGJk6uPkpR5MMIX7DF/WsYZbvss2B82RTcr2Dkto7VtfRUYqcpWBcUIHCJ7hLh4SMS000fC8tfRXo7e0EA==
"@abp/timeago@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-3.1.0-rc.3.tgz#0a7a369ba29633f00b19206b257c6f1f59f182a4"
integrity sha512-FDgaQCJmwWplCcdJYa9kyCcMxJFrKf+zDEFzT5hWfhMzq+sYJYX7QDQtbF5OJnMSWuPyI0/RU0bocuGaJ584VQ==
dependencies:
"@abp/jquery" "~3.1.0-rc.2"
"@abp/jquery" "~3.1.0-rc.3"
timeago "^1.6.7"
"@abp/toastr@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-3.1.0-rc.2.tgz#1b149684a4f7751df48cd9cbac5ce0ce7526042c"
integrity sha512-4U2spuDnl2F3AzGDvHyhGJtZT0Kv4LmdUYwdq/aKneHSTzJ9v5bUpjjU1Gth6fyi0iqH61DAyaoTsbgy0kFQqQ==
"@abp/toastr@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-3.1.0-rc.3.tgz#89af6aa864a9aac76bc9bf21b7f9bc6763ca7573"
integrity sha512-AeKH5imy8W9yMAlzRv9VdkRHApySpR2BKfrQYk3q9LubgwaxLvOFc/l38aIEKuyosN7dHTMFBQlEwLxWFwaoPA==
dependencies:
"@abp/jquery" "~3.1.0-rc.2"
"@abp/jquery" "~3.1.0-rc.3"
toastr "^2.1.4"
"@abp/utils@^3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-3.1.0-rc.2.tgz#c3774246f01f4b032b2d229457c3bd93f7d14048"
integrity sha512-lgHy/OAEBau2Qyr0mZUjOWU8uBFBFIBvGnUKgSqKRxTqf5GyNvkKO8GPpqGSmyIsYUfW2UUsRhaLW7K85T9CZw==
"@abp/utils@^3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-3.1.0-rc.3.tgz#3cbc50c1f8fdf6592d66f8ea4b5a9c4249a5e46a"
integrity sha512-45KXx5zlxm5gK2EFwzM+hMjT8q8pD3PejyNfVP6HBbGE2N36LGKYtI59s6vFm5yV2qFxQyVPrk4mi3Y+neqlBw==
dependencies:
just-compare "^1.3.0"

@ -8,52 +8,45 @@
@using Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.ReactionSelection
@model IndexModel
@inject IStringLocalizer<AbpUiResource> Localizer
<h1>CMS Kit DEMO</h1>
<h1 class="text-center">CMS Kit DEMO</h1>
<abp-card class="mb-3">
<abp-card-body>
<abp-blockquote>
<p>
Any fool can write code that a computer can understand. Good programmers write code that humans can understand.
<abp-card>
<abp-card-body class="p-5">
<abp-blockquote class="text-center">
<p class="h2 mb-4">
"Any fool can write code that a computer can understand. Good programmers write code that humans can understand."
</p>
<footer>
Martin Fowler
</footer>
<p class="m-0">- Martin Fowler</p>
</abp-blockquote>
</abp-card-body>
<abp-card-footer>
@if (GlobalFeatureManager.Instance.IsEnabled<ReactionsFeature>())
{
@await Component.InvokeAsync(typeof(ReactionSelectionViewComponent), new {entityType = "quote", entityId = "1"})
<hr/>
}
@if (GlobalFeatureManager.Instance.IsEnabled<CommentsFeature>())
{
@await Component.InvokeAsync(typeof(CommentingViewComponent), new {entityType = "quote", entityId = "1"})
}
</abp-card-footer>
</abp-card>
<abp-card class="mb-3">
<abp-card-body>
<abp-blockquote>
<p>
Writing code is very simple, but writing simple code is the hardest thing there is!
@if (GlobalFeatureManager.Instance.IsEnabled<ReactionsFeature>())
{
@await Component.InvokeAsync(typeof(ReactionSelectionViewComponent), new { entityType = "quote", entityId = "1" })
}
@if (GlobalFeatureManager.Instance.IsEnabled<CommentsFeature>())
{
@await Component.InvokeAsync(typeof(CommentingViewComponent), new { entityType = "quote", entityId = "1" })
}
<hr class="my-5" />
<abp-card>
<abp-card-body class="p-5">
<abp-blockquote class="text-center">
<p class="h2 mb-4">
"Writing code is very simple, but writing simple code is the hardest thing there is!"
</p>
<footer>
Halil ibrahim Kalkan <small>(inspired from Johan Cruyff)</small>
</footer>
<p class="m-0"> - Halil ibrahim Kalkan <small class="d-block text-muted">Inspired from Johan Cruyff</small></p>
</abp-blockquote>
</abp-card-body>
<abp-card-footer>
@if (GlobalFeatureManager.Instance.IsEnabled<ReactionsFeature>())
{
@await Component.InvokeAsync(typeof(ReactionSelectionViewComponent), new { entityType = "quote", entityId = "2" })
<hr />
}
@if (GlobalFeatureManager.Instance.IsEnabled<CommentsFeature>())
{
@await Component.InvokeAsync(typeof(CommentingViewComponent), new { entityType = "quote", entityId = "2" })
}
</abp-card-footer>
</abp-card>
@if (GlobalFeatureManager.Instance.IsEnabled<ReactionsFeature>())
{
@await Component.InvokeAsync(typeof(ReactionSelectionViewComponent), new { entityType = "quote", entityId = "2" })
}
@if (GlobalFeatureManager.Instance.IsEnabled<CommentsFeature>())
{
@await Component.InvokeAsync(typeof(CommentingViewComponent), new { entityType = "quote", entityId = "2" })
}
<hr class="my-5" />

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

@ -0,0 +1,46 @@
var abp = abp || {};
(function () {
if (!luxon) {
throw "abp/luxon library requires the luxon library included to the page!";
}
/* TIMING *************************************************/
abp.timing = abp.timing || {};
var setObjectValue = function (obj, property, value) {
if (typeof property === "string") {
property = property.split('.');
}
if (property.length > 1) {
var p = property.shift();
setObjectValue(obj[p], property, value);
} else {
obj[property[0]] = value;
}
}
var getObjectValue = function (obj, property) {
return property.split('.').reduce((a, v) => a[v], obj)
}
abp.timing.convertFieldsToIsoDate = function (form, fields) {
for (var field of fields) {
var dateTime = luxon.DateTime
.fromFormat(
getObjectValue(form, field),
abp.localization.currentCulture.dateTimeFormat.shortDatePattern,
{locale: abp.localization.currentCulture.cultureName}
);
if (!dateTime.invalid) {
setObjectValue(form, field, dateTime.toFormat("yyyy-MM-dd HH:mm:ss"))
}
}
return form;
}
})(jQuery);

@ -2,37 +2,37 @@
# yarn lockfile v1
"@abp/aspnetcore.mvc.ui.theme.basic@^3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-3.1.0-rc.2.tgz#b72eee4a441619caa8222941c797c8afd3cae09b"
integrity sha512-8zczo69E6ACjFaL+3UNP7VoUXeoSVViKAyhoub0Uw6CrLUxAYxT/Yuw/apIY7AW3cVoB5ULBfjMN7xWSJML9eg==
dependencies:
"@abp/aspnetcore.mvc.ui.theme.shared" "~3.1.0-rc.2"
"@abp/aspnetcore.mvc.ui.theme.shared@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-3.1.0-rc.2.tgz#db34b0414ded4bd52420d1faa3a5fab03b68783f"
integrity sha512-tnTDCkExlUT+OyPls/VfZsBlbgu02P9zqpT58F7bDo2WtaxzrSvo6xwC+9a6+c3CpKy/xezI2S/r8H9lb2vd5w==
dependencies:
"@abp/aspnetcore.mvc.ui" "~3.1.0-rc.2"
"@abp/bootstrap" "~3.1.0-rc.2"
"@abp/bootstrap-datepicker" "~3.1.0-rc.2"
"@abp/datatables.net-bs4" "~3.1.0-rc.2"
"@abp/font-awesome" "~3.1.0-rc.2"
"@abp/jquery-form" "~3.1.0-rc.2"
"@abp/jquery-validation-unobtrusive" "~3.1.0-rc.2"
"@abp/lodash" "~3.1.0-rc.2"
"@abp/luxon" "~3.1.0-rc.2"
"@abp/malihu-custom-scrollbar-plugin" "~3.1.0-rc.2"
"@abp/select2" "~3.1.0-rc.2"
"@abp/sweetalert" "~3.1.0-rc.2"
"@abp/timeago" "~3.1.0-rc.2"
"@abp/toastr" "~3.1.0-rc.2"
"@abp/aspnetcore.mvc.ui@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-3.1.0-rc.2.tgz#395e101891d8fa7d1532defd125712c7846ee22a"
integrity sha512-dUvOXwUX7I08ZO5q30I9/1qv7s3c9FvKLVrjMexZL1auP83C5hnCh6EBOSWhKKe5Wfe5Rq2sxiinFi/xXibTsw==
"@abp/aspnetcore.mvc.ui.theme.basic@^3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-3.1.0-rc.3.tgz#d7e3ad928a72efb7c76a585ef051fce860efb7bf"
integrity sha512-cc2Wp/6hr1j89Ap/474HlH54WhAIgCya1buuXxrxXSMdYqDKNxK61aMYC/mnYGMiyPqoz6TWWUJB2h2dZeTgzQ==
dependencies:
"@abp/aspnetcore.mvc.ui.theme.shared" "~3.1.0-rc.3"
"@abp/aspnetcore.mvc.ui.theme.shared@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-3.1.0-rc.3.tgz#54a92d673f5158ee222d0d95ebfbca6c63b20a4f"
integrity sha512-czS+8+wuNxuNIogI3FI/T72dCumpbsXp9Fke9pwQEzkCZZCG11cJdOCr1pLJKT1G54x+zfgwVVFIL36sFcq50A==
dependencies:
"@abp/aspnetcore.mvc.ui" "~3.1.0-rc.3"
"@abp/bootstrap" "~3.1.0-rc.3"
"@abp/bootstrap-datepicker" "~3.1.0-rc.3"
"@abp/datatables.net-bs4" "~3.1.0-rc.3"
"@abp/font-awesome" "~3.1.0-rc.3"
"@abp/jquery-form" "~3.1.0-rc.3"
"@abp/jquery-validation-unobtrusive" "~3.1.0-rc.3"
"@abp/lodash" "~3.1.0-rc.3"
"@abp/luxon" "~3.1.0-rc.3"
"@abp/malihu-custom-scrollbar-plugin" "~3.1.0-rc.3"
"@abp/select2" "~3.1.0-rc.3"
"@abp/sweetalert" "~3.1.0-rc.3"
"@abp/timeago" "~3.1.0-rc.3"
"@abp/toastr" "~3.1.0-rc.3"
"@abp/aspnetcore.mvc.ui@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-3.1.0-rc.3.tgz#e26f8ff9d7beaedf2050b9d6319e6368c990c373"
integrity sha512-qglA2lW0eQFzZlGeAev+vGuWsHNFmDeSCGAHPhd4Z07zjnphPnIOXSa+rXhb+4y6DevQP7OY/KSMQdX6ZMU3RQ==
dependencies:
ansi-colors "^4.1.1"
extend-object "^1.0.0"
@ -41,144 +41,144 @@
path "^0.12.7"
rimraf "^3.0.2"
"@abp/bootstrap-datepicker@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-3.1.0-rc.2.tgz#5ecca3e7150d4a75577d9abf0f226813fe40cff5"
integrity sha512-SebgagX0TszhsmIfQhM+A+M+cThbELSRmbDb+48DgLflVHH1bw6wCGXVMVQA65vYWkiHaALbxDgYOHLSFsWpag==
"@abp/bootstrap-datepicker@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-3.1.0-rc.3.tgz#279d9603cd916a884bac125cb525ee44fb809762"
integrity sha512-qZolOk2Pw+IvXh6Ko7wJddzMVPbS8silGecBZMYe0DVRNovg0515Px8zR3GJ16wcVQuvG6ByBn4fdeKFmYfokQ==
dependencies:
bootstrap-datepicker "^1.9.0"
"@abp/bootstrap@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-3.1.0-rc.2.tgz#691e4f609895e8914cf6903a26ad5d51f629c596"
integrity sha512-SaT7JN5C2RqzTgA8YdoON/eaeL4gl54vp7DTGPXXVvTYS20ZSxExKgVXEuOMEJVITKu4OeXqLYZyThz888I9iQ==
"@abp/bootstrap@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-3.1.0-rc.3.tgz#a1368df757995f52c19dd76ef1846d19a067def6"
integrity sha512-r8XRTYJBEa33FVxF+Mg0ALYNhmTjVBw1NQIQY8Ub5ZR+HIZoaDqA0X5zfAKvGQlmfXLiZJDkvCV5EIQWsIgnrA==
dependencies:
"@abp/core" "~3.1.0-rc.2"
"@abp/core" "~3.1.0-rc.3"
bootstrap "^4.5.0"
bootstrap-v4-rtl "4.4.1-2"
"@abp/core@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/core/-/core-3.1.0-rc.2.tgz#707cec3323020b9ee4cc7c5a7fee21b418457eff"
integrity sha512-2VSCPIWEEM4iwcgRfgFempjPV0zLaWf81cp1ZrwuilqsljUXjMQL8Pf07TEaSa8+uN3VKkCsQtyq3A+DhUlVhA==
"@abp/core@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/core/-/core-3.1.0-rc.3.tgz#7e1bd9ac9aaecfc66863e8e319975358885a3ca2"
integrity sha512-wIvm4l8ZDQ+eiNN1a+v07EjUhngrxwPWvfDf9bPQpepfnIKiAktJziihh0oBJAbqXNqmI7f6FGN76spvNop/EA==
dependencies:
"@abp/utils" "^3.1.0-rc.2"
"@abp/utils" "^3.1.0-rc.3"
"@abp/datatables.net-bs4@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-3.1.0-rc.2.tgz#d98f47e4e286a7299ba42da1c394594f4b4581c7"
integrity sha512-VrcgFq3qq6azpCJEpk00R4fWA6GBzoDgHJT0K9bQtg4AqG8oamJa2QWX60g2OXzWpbI74bxleBAOLXzC4OJIrw==
"@abp/datatables.net-bs4@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-3.1.0-rc.3.tgz#f46c4474635918c16ca7edbe4930c07317930592"
integrity sha512-FeN53p5U2hIyYyM3G3AuGSwBZFBGbx4yHb/ymW/DEGtJ6XtynHlsFPz00/PktLe0OKOjUxOUf2LQLqKJi83WQQ==
dependencies:
"@abp/datatables.net" "~3.1.0-rc.2"
"@abp/datatables.net" "~3.1.0-rc.3"
datatables.net-bs4 "^1.10.21"
"@abp/datatables.net@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-3.1.0-rc.2.tgz#e73fee8f323e33094bfe49cbed520a4b9f382c18"
integrity sha512-+Bo8C7tslTasH7kMUnXQ5JESzg+ciy7jmvWPbJo32f0VFuiSPDBBr6nacBmE6IHPqG54ZAjqOkvE8eWL39dN2A==
"@abp/datatables.net@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-3.1.0-rc.3.tgz#c3a8f81d5ee571445b01d2db0e05ed555b1459b8"
integrity sha512-sOWuVwvSoQlXqC9CC9HGH6HzdHb5vVX8CbqzIUYBJEzY4NBRUqeclFJQrA/thjMNtefdLD2AiVwPFmAdGBeDSg==
dependencies:
"@abp/jquery" "~3.1.0-rc.2"
"@abp/jquery" "~3.1.0-rc.3"
datatables.net "^1.10.21"
"@abp/font-awesome@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-3.1.0-rc.2.tgz#4d0ef35abe67b86a6cbb8c7008a50f26eadbaa6e"
integrity sha512-r1iLq+1avQ8lsDqNAsu0TAQn5+JlYhUnjTVpnb/xcDMtbJv+eBZpqVLTbXelHV0q2Czq/gDzloqkHFNv5Cxceg==
"@abp/font-awesome@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-3.1.0-rc.3.tgz#38f63ad4fadc4986a73116fa29d5ef56812c483c"
integrity sha512-BnrI9XaKxEvI0d6Fa9tbw1J/VAsVUqTyAHva4WTUUa+neB9gaK62ZUjgDdF8Eo6gj7UOO8DYvsXehzpVpZKlPQ==
dependencies:
"@abp/core" "~3.1.0-rc.2"
"@abp/core" "~3.1.0-rc.3"
"@fortawesome/fontawesome-free" "^5.13.0"
"@abp/jquery-form@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-3.1.0-rc.2.tgz#f08ceb6be4a23d79f855d59b46c5fea5a6bf37ee"
integrity sha512-3UlUGXmvoT5xz4Hjz2gRX2rL+YbL4JprGaZvBrIbASJ6VSV3yHYbjma8YBqj2Wu2IQv6wpNhAYV+tALjPnFEgw==
"@abp/jquery-form@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-3.1.0-rc.3.tgz#7b74828f32a641c0b1ef1fd8b0389bf994a09e16"
integrity sha512-G+YRnDRZe5Mw81NAEnnr8scGjupndcu9xZ1dw+hCFGg30yypiUIfHtrMR4iR94y7M198fAgQP+0k7RvDqnALiw==
dependencies:
"@abp/jquery" "~3.1.0-rc.2"
"@abp/jquery" "~3.1.0-rc.3"
jquery-form "^4.3.0"
"@abp/jquery-validation-unobtrusive@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-3.1.0-rc.2.tgz#1802ffd0dc8aa710bfb81f6f5e6654a44227334f"
integrity sha512-2iWFp8a4Iths5dbf3v/gcTFrOXUX6CkwS5JiO3YsA0ujbZgF2HGbnPD7vzrfuRJAIKPKCIiovLDBY3yKN6boQw==
"@abp/jquery-validation-unobtrusive@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-3.1.0-rc.3.tgz#aef83e8f11791ae7be449eab6655a73075f98b45"
integrity sha512-uWu6qdZasSZEFJC1IhEtj8NZq5kXX8W/zlK2tVpFhjxE/QYiJlPj8pVy2I7cuEIBghzAO2omwI+5En8TSagrGA==
dependencies:
"@abp/jquery-validation" "~3.1.0-rc.2"
"@abp/jquery-validation" "~3.1.0-rc.3"
jquery-validation-unobtrusive "^3.2.11"
"@abp/jquery-validation@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-3.1.0-rc.2.tgz#adc314584261ef5bcdfa240c5e2df9f1bb4dcb2f"
integrity sha512-L2GoAUxMCAd8pXt54UqI2CEV4nWS0ww2dTNctEUcnJ2UZc7Ce+QFqBgvyRNmuSULMebfdtUYkodCGFdzzjRXfg==
"@abp/jquery-validation@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-3.1.0-rc.3.tgz#40dcb28ce5a3a87fc69972053e48a456c84e3225"
integrity sha512-uaL+ZS/NTf103Hq3ehayFT1qvq/Y2T5PAFY9ijBvX+7phCtPwGiIPfUvyuwYnKbdTa15odC275e7pY2CssHWIA==
dependencies:
"@abp/jquery" "~3.1.0-rc.2"
"@abp/jquery" "~3.1.0-rc.3"
jquery-validation "^1.19.2"
"@abp/jquery@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-3.1.0-rc.2.tgz#05857739e5ec9e519194fe9b80b426be0b40addb"
integrity sha512-+qPHJpV/s9GGWwdH6gj8BdDhg4t4w8pI9hx41UlIpPdrtO4kzaPU85/f7vX0QYzOrsYYxmWXHu3H0pL8QyDwQA==
"@abp/jquery@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-3.1.0-rc.3.tgz#8c35b9e7de888516e2acc5227092ca2fed991475"
integrity sha512-DT2uBNfW3+Xc1Bz62WHdIC3JfAb2Qcc4p86LyDG5pNRAd3FpImA1VnRPsMRX9Mig7HYRjMYiuYXTeovM6YS0fg==
dependencies:
"@abp/core" "~3.1.0-rc.2"
"@abp/core" "~3.1.0-rc.3"
jquery "~3.5.1"
"@abp/lodash@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-3.1.0-rc.2.tgz#80fc560277e903b94cf90146e05cb6e6e62b0ee3"
integrity sha512-TQ8HqvW9skMFDfJv7wNX4Ahi/HjCBfD/ZDePvfyTLwdsnNPwDg6zERwYTGk48ep/6CUsK3MMQzvShl4yaYIFYQ==
"@abp/lodash@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-3.1.0-rc.3.tgz#a312975824fa3bebc00f5eca35cededc5ec3af4b"
integrity sha512-siv5cMWlUHEX2RtvKCGoX2cEh4h1hniluKlFgmVmYY4hdGYdAG4T2d9QQAbPODwdzrJ8jzI36hXT/P4IrzhWZw==
dependencies:
"@abp/core" "~3.1.0-rc.2"
"@abp/core" "~3.1.0-rc.3"
lodash "^4.17.15"
"@abp/luxon@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-3.1.0-rc.2.tgz#6a7db2fd1cc1674e73df6c982657c791a94fc65b"
integrity sha512-vrtiuMnQDP0rC+yrQawqVu3F4pcZrv3wsx0ZqaIWWakQJ4X17aSTM0Xhxa95jnHh4WFFUDN00mYxkPxNr8JqvA==
"@abp/luxon@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-3.1.0-rc.3.tgz#9b9d5c9827a0c661458094134cafd80f35537a69"
integrity sha512-cKj/irXJhTJ6WiSyjzcZcsDjKFji1Q/0nV7IYhY9e2wzpg3qEB8Z8k8fDLPDAUriUKxBoI6mQ/CVC0ah7eg/LA==
dependencies:
luxon "^1.24.1"
"@abp/malihu-custom-scrollbar-plugin@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-3.1.0-rc.2.tgz#3805b260bd3442353a946de5c7508e98cc7cefdd"
integrity sha512-bp+S43ZIWQpkhx7ni2DThwDZ2A+q6ZaAUaESWz+yCHXWwYacnfHeq4p+mkS07OdVteP33NWAxJpjtDl6fPBo8A==
"@abp/malihu-custom-scrollbar-plugin@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-3.1.0-rc.3.tgz#218eb620532af8bdde6a46388a3d5349974fab44"
integrity sha512-z3IzgSYtpZ2FlWNmM2A1wbP3CHB3P5a8k/JR0JSWwtl+D/LiYC348VQIXen+pIJoEjMlY48iSi5XNyBIz4X9hw==
dependencies:
"@abp/core" "~3.1.0-rc.2"
"@abp/core" "~3.1.0-rc.3"
malihu-custom-scrollbar-plugin "^3.1.5"
"@abp/select2@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-3.1.0-rc.2.tgz#6b16301cb7c4ad4e2b39400a5f9cf336c700a343"
integrity sha512-qbj6csa9/0+xF5fzcm1WJSzUiBvSgwiYPRpH5wyG/FZYf7YxK2dAv/Lmi5RE4eAb8Ib9ueB7nPkzJYUJhJ1wgQ==
"@abp/select2@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-3.1.0-rc.3.tgz#493afc27f29da1c9926ee02e8f7b641e8ee4b67e"
integrity sha512-fym9GmQbl34CyTCVzfo4jGe77nSeDuRPYMzAYO8p0uKdDB8t9jNZNqhYJ9Ee5KQXJyg4lmFFPkLcRZF14E+cWw==
dependencies:
"@abp/core" "~3.1.0-rc.2"
"@abp/core" "~3.1.0-rc.3"
select2 "^4.0.13"
"@abp/sweetalert@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-3.1.0-rc.2.tgz#a152eb5632cd0eee50d5fed2c156bc4b6daf6829"
integrity sha512-6pjzFwr/HKgNYcsx76GZdcm0qZ8NfcdYqFOwj91w3bGmtPZYRRJLV01k9kDIOQHYnmCReO+ThF46wZCyt/8xvg==
"@abp/sweetalert@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-3.1.0-rc.3.tgz#1c1421e2baaa57cc24e0f9334a5173836819cc24"
integrity sha512-WrYRutXM2f6VRECEkWhjfqtQXlnEw88MCkYicAhyMH7ZYYWg7r9xVg9TRJJI4UwGMLSyR3EB+ZdTmnD8aSC0yQ==
dependencies:
"@abp/core" "~3.1.0-rc.2"
"@abp/core" "~3.1.0-rc.3"
sweetalert "^2.1.2"
"@abp/timeago@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-3.1.0-rc.2.tgz#0c3fe13f15319c943186eff861f0e9a790b6651b"
integrity sha512-BJzvJGJk6uPkpR5MMIX7DF/WsYZbvss2B82RTcr2Dkto7VtfRUYqcpWBcUIHCJ7hLh4SMS000fC8tfRXo7e0EA==
"@abp/timeago@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-3.1.0-rc.3.tgz#0a7a369ba29633f00b19206b257c6f1f59f182a4"
integrity sha512-FDgaQCJmwWplCcdJYa9kyCcMxJFrKf+zDEFzT5hWfhMzq+sYJYX7QDQtbF5OJnMSWuPyI0/RU0bocuGaJ584VQ==
dependencies:
"@abp/jquery" "~3.1.0-rc.2"
"@abp/jquery" "~3.1.0-rc.3"
timeago "^1.6.7"
"@abp/toastr@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-3.1.0-rc.2.tgz#1b149684a4f7751df48cd9cbac5ce0ce7526042c"
integrity sha512-4U2spuDnl2F3AzGDvHyhGJtZT0Kv4LmdUYwdq/aKneHSTzJ9v5bUpjjU1Gth6fyi0iqH61DAyaoTsbgy0kFQqQ==
"@abp/toastr@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-3.1.0-rc.3.tgz#89af6aa864a9aac76bc9bf21b7f9bc6763ca7573"
integrity sha512-AeKH5imy8W9yMAlzRv9VdkRHApySpR2BKfrQYk3q9LubgwaxLvOFc/l38aIEKuyosN7dHTMFBQlEwLxWFwaoPA==
dependencies:
"@abp/jquery" "~3.1.0-rc.2"
"@abp/jquery" "~3.1.0-rc.3"
toastr "^2.1.4"
"@abp/utils@^3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-3.1.0-rc.2.tgz#c3774246f01f4b032b2d229457c3bd93f7d14048"
integrity sha512-lgHy/OAEBau2Qyr0mZUjOWU8uBFBFIBvGnUKgSqKRxTqf5GyNvkKO8GPpqGSmyIsYUfW2UUsRhaLW7K85T9CZw==
"@abp/utils@^3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-3.1.0-rc.3.tgz#3cbc50c1f8fdf6592d66f8ea4b5a9c4249a5e46a"
integrity sha512-45KXx5zlxm5gK2EFwzM+hMjT8q8pD3PejyNfVP6HBbGE2N36LGKYtI59s6vFm5yV2qFxQyVPrk4mi3Y+neqlBw==
dependencies:
just-compare "^1.3.0"

@ -18,14 +18,18 @@ namespace Volo.CmsKit.Web
{
Configure<CmsKitUiOptions>(options =>
{
options.ReactionIcons[StandardReactions.Smile] = new LocalizableIconDictionary("/cms-kit/icons/smile.png");
options.ReactionIcons[StandardReactions.ThumbsUp] = new LocalizableIconDictionary("/cms-kit/icons/thumbsup.png");
options.ReactionIcons[StandardReactions.Confused] = new LocalizableIconDictionary("/cms-kit/icons/confused.png");
options.ReactionIcons[StandardReactions.Eyes] = new LocalizableIconDictionary("/cms-kit/icons/eyes.png");
options.ReactionIcons[StandardReactions.Heart] = new LocalizableIconDictionary("/cms-kit/icons/heart.png");
options.ReactionIcons[StandardReactions.Hooray] = new LocalizableIconDictionary("/cms-kit/icons/hooray.png");
options.ReactionIcons[StandardReactions.Rocket] = new LocalizableIconDictionary("/cms-kit/icons/rocket.png");
options.ReactionIcons[StandardReactions.ThumbsDown] = new LocalizableIconDictionary("/cms-kit/icons/thumbsdown.png");
options.ReactionIcons[StandardReactions.Smile] = new LocalizableIconDictionary("fas fa-smile text-warning");
options.ReactionIcons[StandardReactions.ThumbsUp] = new LocalizableIconDictionary("fa fa-thumbs-up text-primary");
options.ReactionIcons[StandardReactions.Confused] = new LocalizableIconDictionary("fas fa-surprise text-warning");
options.ReactionIcons[StandardReactions.Eyes] = new LocalizableIconDictionary("fas fa-meh-rolling-eyes text-warning");
options.ReactionIcons[StandardReactions.Heart] = new LocalizableIconDictionary("fa fa-heart text-danger");
options.ReactionIcons[StandardReactions.HeartBroken] = new LocalizableIconDictionary("fas fa-heart-broken text-danger");
options.ReactionIcons[StandardReactions.Wink] = new LocalizableIconDictionary("fas fa-grin-wink text-warning");
options.ReactionIcons[StandardReactions.Pray] = new LocalizableIconDictionary("fas fa-praying-hands text-info");
options.ReactionIcons[StandardReactions.Rocket] = new LocalizableIconDictionary("fa fa-rocket text-success");
options.ReactionIcons[StandardReactions.ThumbsDown] = new LocalizableIconDictionary("fa fa-thumbs-down text-secondary");
options.ReactionIcons[StandardReactions.Victory] = new LocalizableIconDictionary("fas fa-hand-peace text-warning");
options.ReactionIcons[StandardReactions.Rock] = new LocalizableIconDictionary("fas fa-hand-rock text-warning");
});
Configure<AbpVirtualFileSystemOptions>(options =>
@ -35,3 +39,4 @@ namespace Volo.CmsKit.Web
}
}
}

@ -8,7 +8,11 @@
public const string Confused = "_CF";
public const string Eyes = "_EY";
public const string Heart = "_HE";
public const string Hooray = "_HO";
public const string HeartBroken = "_HB";
public const string Wink = "_WI";
public const string Pray = "_PR";
public const string Rocket = "_RO";
public const string Victory = "_VI";
public const string Rock = "_RC";
}
}

@ -16,14 +16,18 @@ namespace Volo.CmsKit
{
Configure<CmsKitOptions>(options =>
{
options.Reactions.AddOrReplace(StandardReactions.Smile);
options.Reactions.AddOrReplace(StandardReactions.ThumbsUp);
options.Reactions.AddOrReplace(StandardReactions.ThumbsDown);
options.Reactions.AddOrReplace(StandardReactions.Smile);
options.Reactions.AddOrReplace(StandardReactions.Wink);
options.Reactions.AddOrReplace(StandardReactions.Confused);
options.Reactions.AddOrReplace(StandardReactions.Victory);
options.Reactions.AddOrReplace(StandardReactions.Rock);
options.Reactions.AddOrReplace(StandardReactions.Eyes);
options.Reactions.AddOrReplace(StandardReactions.Heart);
options.Reactions.AddOrReplace(StandardReactions.Hooray);
options.Reactions.AddOrReplace(StandardReactions.HeartBroken);
options.Reactions.AddOrReplace(StandardReactions.Rocket);
options.Reactions.AddOrReplace(StandardReactions.Pray);
});
}
}

@ -15,101 +15,107 @@
@{
Func<dynamic, IHtmlContent> GetCommentTitle(CmsUserDto author, DateTime creationTime) =>
@<span>
<i class="fa fa-comment-o"></i>
@((string.IsNullOrWhiteSpace(author.Name)
@<span>
<i class="far fa-comment-alt mr-2"></i>
@((string.IsNullOrWhiteSpace(author.Name)
? author.UserName
: author.Name + " " + author.Surname).Trim())
<small>@creationTime.ToString()</small>
</span>;
<small class="text-muted float-right" style="opacity: .5;">@creationTime.ToString()</small>
</span>;
}
@{
Func<dynamic, IHtmlContent> GetCommentArea(Guid? repliedCommentId, bool cancelButton = false) =>
@<div class="cms-comment-form-area @(repliedCommentId.HasValue ? "pl-5" : "pt-4")"
data-reply-id="@(repliedCommentId?.ToString() ?? "")"
style="@(string.IsNullOrEmpty(repliedCommentId?.ToString() ?? "") ? "" : "display:none")">
<form class="cms-comment-form">
<input hidden value="@(repliedCommentId?.ToString() ?? "")" name="repliedCommentId"/>
<div class="form-group">
<label> @(string.IsNullOrEmpty(repliedCommentId?.ToString() ?? "") ? L["YourComment"] : L["YourReply"]) </label>
<textarea class="form-control" name="commentText" rows="3"></textarea>
@<div class="cms-comment-form-area bg-light card p-4 mx-0 mt-4 @(repliedCommentId.HasValue ? "my-1" : "mb-0")"
data-reply-id="@(repliedCommentId?.ToString() ?? "")"
style="@(string.IsNullOrEmpty(repliedCommentId?.ToString() ?? "") ? "" : "display:none")">
<form class="cms-comment-form">
<input hidden value="@(repliedCommentId?.ToString() ?? "")" name="repliedCommentId" />
<div class="form-row">
<div class="col">
<div class="form-group">
<textarea class="form-control" name="commentText" placeholder="@(string.IsNullOrEmpty(repliedCommentId?.ToString() ?? "") ? L["YourComment"] : L["YourReply"])..." rows="3"></textarea>
</div>
</div>
@if (cancelButton)
{
<abp-button type="button" button-type="Secondary" class="reply-cancel-button" data-reply-id="@(repliedCommentId?.ToString() ?? "")"> @L["Cancel"] </abp-button>
}
<abp-button type="submit" button-type="Primary"> @L["Send"] </abp-button>
</form>
</div>;
<div class="col-auto">
<div class="text-right">
@if (cancelButton)
{
<abp-button type="button" button-type="Outline_Secondary" class="reply-cancel-button mb-2" size="Block" data-reply-id="@(repliedCommentId?.ToString() ?? "")"><i class="fa fa-times mr-1"></i> @L["Cancel"] </abp-button>
}
<abp-button type="submit" button-type="Primary" size="Block"><i class="fa fa-comment-alt mr-1"></i> @L["Send"]</abp-button>
</div>
</div>
</div>
</form>
</div>;
}
@{
Func<dynamic, IHtmlContent> GetCommentContentArea(Guid id, string text) =>
@<div>
<div class="cms-comment-content-area" data-id="@id.ToString()">
<p>
@text
</p>
</div>
</div>;
@<div>
<div class="cms-comment-content-area" data-id="@id.ToString()">
<p class="m-0">
@text
</p>
</div>
</div>;
}
@{
Func<dynamic, IHtmlContent> GetCommentActionArea(Guid id, Guid authorId, bool isReply, string text) =>
@<div class="pb-4">
<div class="float-right">
@if (!isReply)
@<div>
<div class="text-right">
@if (!isReply)
{
@if (CurrentUser.IsAuthenticated)
{
@if (CurrentUser.IsAuthenticated)
{
<a href="#" class="comment-reply-link" data-reply-id="@id.ToString()" id="@($"cms-comment_{Model.EntityType}_{Model.EntityId}_{id}_link")">
<i class="fa fa-reply"></i> @L["Reply"]
</a>
}
else
{
<a href="@(Model.LoginUrl + "_" + id)"> @L["LoginToReply"]</a>
}
<a href="#" class="comment-reply-link btn btn-sm btn-primary" data-reply-id="@id.ToString()" id="@($"cms-comment_{Model.EntityType}_{Model.EntityId}_{id}_link")">
<i class="fa fa-reply mr-1"></i> @L["Reply"]
</a>
}
@if (authorId == CurrentUser.Id)
else
{
@if (!isReply)
{
<span> | </span>
}
<a href="@(Model.LoginUrl + "_" + id)" class="btn btn-sm btn-primary shadow-sm"> @L["LoginToReply"]</a>
}
}
@if (authorId == CurrentUser.Id)
{
<a href="#" class="comment-delete-link" data-id="@id.ToString()">
<i class="fa fa-trash"></i> @L["Delete"]
</a>
<a href="#" class="comment-delete-link btn btn-sm shadow-sm bg-white" data-id="@id.ToString()">
<i class="fa fa-trash mr-1 text-danger"></i> @L["Delete"]
</a>
<span> | </span>
<a href="#" class="comment-edit-link" data-id="@id.ToString()">
<i class="fa fa-pencil"></i> @L["Edit"]
</a>
}
</div>
<div class="cms-comment-edit-area" id="@($"cms-comment_{Model.EntityType}_{Model.EntityId}_{id}")" data-id="@id.ToString()" style="display:none">
<a href="#" class="comment-edit-link btn btn-sm shadow-sm bg-white" data-id="@id.ToString()">
<i class="fa fa-pencil mr-1 text-info"></i> @L["Edit"]
</a>
}
</div>
<div class="cms-comment-edit-area" id="@($"cms-comment_{Model.EntityType}_{Model.EntityId}_{id}")" data-id="@id.ToString()" style="display:none">
<div class="card bg-light p-4 mx-0 mt-3">
<form class="cms-comment-update-form">
<input hidden value="@id.ToString()" name="id"/>
<input hidden value="@id.ToString()" name="id" />
<div class="form-group">
<textarea class="form-control" name="commentText" rows="3">@text</textarea>
</div>
<abp-button type="button" button-type="Secondary" class="comment-edit-cancel-button" data-id="@id.ToString()"> @L["Cancel"] </abp-button>
<abp-button type="submit" button-type="Primary"> @L["Update"] </abp-button>
<div class="text-right">
<abp-button type="button" button-type="Secondary" class="comment-edit-cancel-button" data-id="@id.ToString()"> @L["Cancel"] </abp-button>
<abp-button type="submit" button-type="Primary"> @L["Update"] </abp-button>
</div>
</form>
</div>
</div>;
</div>
</div>;
}
<div class="cms-comment-area" data-entity-type="@Model.EntityType" data-entity-id="@Model.EntityId">
<div class="pl-5 pt-3">
<h4>
@L["Comments"]
</h4>
<div>
<h5 class="mb-0 mt-4">
<i class="fas fa-comment-alt"></i> @L["Comments"]
</h5>
@foreach (var comment in Model.Comments)
{
<div class="comment pt-2 mt-1 mb-1">
<div class="border-bottom">
<div class="comment">
<div class="card p-4 mx-0 my-4">
<h5>
@GetCommentTitle(comment.Author, comment.CreationTime).Invoke(null)
</h5>
@ -119,7 +125,7 @@
@if (cmsKitUiOptions.Value.CommentsOptions.IsReactionsEnabled && GlobalFeatureManager.Instance.IsEnabled<ReactionsFeature>())
{
@await Component.InvokeAsync(typeof(ReactionSelectionViewComponent),
new {entityType = "comment", entityId = comment.Id.ToString()})
new { entityType = "comment", entityId = comment.Id.ToString() })
}
@GetCommentActionArea(comment.Id, comment.Author.Id, false, comment.Text).Invoke(null)
@ -131,28 +137,28 @@
@if (comment.Replies.Any())
{
<div class="pl-5">
@foreach (var reply in comment.Replies)
{
<div class="comment pt-3">
<div class="border-bottom">
@foreach (var reply in comment.Replies)
{
<div class="bg-light card p-4 mx-0 mt-3">
<div class="comment">
<div>
<h6>
<h5>
@GetCommentTitle(reply.Author, reply.CreationTime).Invoke(null)
</h6>
</h5>
@GetCommentContentArea(reply.Id, reply.Text).Invoke(null)
@if (cmsKitUiOptions.Value.CommentsOptions.IsReactionsEnabled && GlobalFeatureManager.Instance.IsEnabled<ReactionsFeature>())
{
@await Component.InvokeAsync(typeof(ReactionSelectionViewComponent),
new {entityType = "comment", entityId = reply.Id.ToString()})
new { entityType = "comment", entityId = reply.Id.ToString() })
}
@GetCommentActionArea(reply.Id, reply.Author.Id, true, reply.Text).Invoke(null)
</div>
</div>
}
</div>
</div>
}
}
</div>
</div>
@ -166,7 +172,7 @@
}
else if (!string.IsNullOrWhiteSpace(Model.LoginUrl))
{
<div class="float-right mb-2">
<div class="text-right">
<a href="@Model.LoginUrl" class="btn btn-primary"> @L["LoginToAddComment"]</a>
</div>
}

@ -1,25 +1,29 @@
@inject ICurrentUser CurrentUser
@using Volo.Abp.Users
@model Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.ReactionSelection.ReactionSelectionViewComponent.ReactionSelectionViewModel
<span class="cms-reaction-area" data-entity-type="@Model.EntityType" data-entity-id="@Model.EntityId">
<div class="text-right">
<div class="px-2 py-1 my-3 card border-0 shadow-sm d-inline-block">
<span class="cms-reaction-area" data-entity-type="@Model.EntityType" data-entity-id="@Model.EntityId">
@if (CurrentUser.IsAuthenticated)
{
<a class="cms-reaction-select-icon" tabindex="0"><i class="fa fa-smile-o"></i></a>
<div class="cms-reaction-selection-popover-content" style="display: none">
@foreach (var reaction in Model.Reactions)
{
<span class="mr-1 cms-reaction-icon @(reaction.IsSelectedByCurrentUser ? "cms-reaction-icon-selected" : "")" data-reaction-name="@reaction.Name">
<img src="@reaction.Icon" width="18" height="18"/>
</span>
}
@if (CurrentUser.IsAuthenticated)
{
<a class="cms-reaction-select-icon" href="#"><i class="fa fa-smile-o text-muted"></i></a>
<div class="cms-reaction-selection-popover-content" style="display: none">
@foreach (var reaction in Model.Reactions)
{
<span class="m-2 p-2 w-25 d-inline-block text-center cms-reaction-icon @(reaction.IsSelectedByCurrentUser ? "shadow-sm bg-light rounded cms-reaction-icon-selected" : "")" data-reaction-name="@reaction.Name">
<i class="@reaction.Icon fa-2x"></i>
</span>
}
</div>
}
@foreach (var reaction in Model.Reactions.Where(r => r.Count > 0))
{
<span class="ml-3 cms-reaction-icon @(reaction.IsSelectedByCurrentUser ? "cms-reaction-icon-selected" : "")" data-reaction-name="@reaction.Name" data-click-action="@(CurrentUser.IsAuthenticated ? "true" : "false")">
<i class="@reaction.Icon"></i>
<small class="text-muted" style="opacity: .75;">@(reaction.Count)</small>
</span>
}
</span>
</div>
}
@foreach (var reaction in Model.Reactions.Where(r => r.Count > 0))
{
<span class="mr-1 cms-reaction-icon @(reaction.IsSelectedByCurrentUser ? "cms-reaction-icon-selected" : "")" data-reaction-name="@reaction.Name" data-click-action="@(CurrentUser.IsAuthenticated ? "true" : "false")">
<img src="@reaction.Icon" width="18" height="18"/>
@(reaction.Count)
</span>
}
</span>
</div>

@ -1,13 +1,8 @@
.cms-reaction-select-icon
{
.cms-reaction-select-icon, .cms-reaction-icon {
cursor: pointer;
}
.cms-reaction-icon
{
cursor: pointer;
padding: 3px 5px 5px;
}
.cms-reaction-icon-selected
{
background-color: #eef;
}
.cms-reaction-selection-popover-content i.fa-2x{
width: 25%;
display: inline-block;
float: left;
}

@ -47,7 +47,7 @@
function init() {
$selectIcon.popover({
placement: 'right',
placement: 'left',
html: true,
trigger: 'focus',
title: l('PickYourReaction'),

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

@ -2,45 +2,45 @@
# yarn lockfile v1
"@abp/anchor-js@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/anchor-js/-/anchor-js-3.1.0-rc.2.tgz#3f445de4884bbe4a7be2bada7db56a376e9fba5e"
integrity sha512-qBFBy8tcinL7YWFy7iPprXTaFowgc7cvyO8mEKG2HG6/LdObm6KBASgAXGLRv2Jhxbdfyrisbcr+TdM8gzrWog==
"@abp/anchor-js@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/anchor-js/-/anchor-js-3.1.0-rc.3.tgz#839562d155fe9d026328da64a14e354c00090856"
integrity sha512-5NhcK1wZQlfE9gJ679DD3KsnYOigCHCqSGdwOQZn7gzGWNKnhCnzsnjAyh32lL9tNHTHMKkydVr6kJ5LU6Yr1Q==
dependencies:
"@abp/core" "~3.1.0-rc.2"
"@abp/core" "~3.1.0-rc.3"
anchor-js "^4.2.2"
"@abp/aspnetcore.mvc.ui.theme.basic@^3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-3.1.0-rc.2.tgz#b72eee4a441619caa8222941c797c8afd3cae09b"
integrity sha512-8zczo69E6ACjFaL+3UNP7VoUXeoSVViKAyhoub0Uw6CrLUxAYxT/Yuw/apIY7AW3cVoB5ULBfjMN7xWSJML9eg==
dependencies:
"@abp/aspnetcore.mvc.ui.theme.shared" "~3.1.0-rc.2"
"@abp/aspnetcore.mvc.ui.theme.shared@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-3.1.0-rc.2.tgz#db34b0414ded4bd52420d1faa3a5fab03b68783f"
integrity sha512-tnTDCkExlUT+OyPls/VfZsBlbgu02P9zqpT58F7bDo2WtaxzrSvo6xwC+9a6+c3CpKy/xezI2S/r8H9lb2vd5w==
dependencies:
"@abp/aspnetcore.mvc.ui" "~3.1.0-rc.2"
"@abp/bootstrap" "~3.1.0-rc.2"
"@abp/bootstrap-datepicker" "~3.1.0-rc.2"
"@abp/datatables.net-bs4" "~3.1.0-rc.2"
"@abp/font-awesome" "~3.1.0-rc.2"
"@abp/jquery-form" "~3.1.0-rc.2"
"@abp/jquery-validation-unobtrusive" "~3.1.0-rc.2"
"@abp/lodash" "~3.1.0-rc.2"
"@abp/luxon" "~3.1.0-rc.2"
"@abp/malihu-custom-scrollbar-plugin" "~3.1.0-rc.2"
"@abp/select2" "~3.1.0-rc.2"
"@abp/sweetalert" "~3.1.0-rc.2"
"@abp/timeago" "~3.1.0-rc.2"
"@abp/toastr" "~3.1.0-rc.2"
"@abp/aspnetcore.mvc.ui@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-3.1.0-rc.2.tgz#395e101891d8fa7d1532defd125712c7846ee22a"
integrity sha512-dUvOXwUX7I08ZO5q30I9/1qv7s3c9FvKLVrjMexZL1auP83C5hnCh6EBOSWhKKe5Wfe5Rq2sxiinFi/xXibTsw==
"@abp/aspnetcore.mvc.ui.theme.basic@^3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-3.1.0-rc.3.tgz#d7e3ad928a72efb7c76a585ef051fce860efb7bf"
integrity sha512-cc2Wp/6hr1j89Ap/474HlH54WhAIgCya1buuXxrxXSMdYqDKNxK61aMYC/mnYGMiyPqoz6TWWUJB2h2dZeTgzQ==
dependencies:
"@abp/aspnetcore.mvc.ui.theme.shared" "~3.1.0-rc.3"
"@abp/aspnetcore.mvc.ui.theme.shared@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-3.1.0-rc.3.tgz#54a92d673f5158ee222d0d95ebfbca6c63b20a4f"
integrity sha512-czS+8+wuNxuNIogI3FI/T72dCumpbsXp9Fke9pwQEzkCZZCG11cJdOCr1pLJKT1G54x+zfgwVVFIL36sFcq50A==
dependencies:
"@abp/aspnetcore.mvc.ui" "~3.1.0-rc.3"
"@abp/bootstrap" "~3.1.0-rc.3"
"@abp/bootstrap-datepicker" "~3.1.0-rc.3"
"@abp/datatables.net-bs4" "~3.1.0-rc.3"
"@abp/font-awesome" "~3.1.0-rc.3"
"@abp/jquery-form" "~3.1.0-rc.3"
"@abp/jquery-validation-unobtrusive" "~3.1.0-rc.3"
"@abp/lodash" "~3.1.0-rc.3"
"@abp/luxon" "~3.1.0-rc.3"
"@abp/malihu-custom-scrollbar-plugin" "~3.1.0-rc.3"
"@abp/select2" "~3.1.0-rc.3"
"@abp/sweetalert" "~3.1.0-rc.3"
"@abp/timeago" "~3.1.0-rc.3"
"@abp/toastr" "~3.1.0-rc.3"
"@abp/aspnetcore.mvc.ui@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-3.1.0-rc.3.tgz#e26f8ff9d7beaedf2050b9d6319e6368c990c373"
integrity sha512-qglA2lW0eQFzZlGeAev+vGuWsHNFmDeSCGAHPhd4Z07zjnphPnIOXSa+rXhb+4y6DevQP7OY/KSMQdX6ZMU3RQ==
dependencies:
ansi-colors "^4.1.1"
extend-object "^1.0.0"
@ -49,180 +49,180 @@
path "^0.12.7"
rimraf "^3.0.2"
"@abp/bootstrap-datepicker@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-3.1.0-rc.2.tgz#5ecca3e7150d4a75577d9abf0f226813fe40cff5"
integrity sha512-SebgagX0TszhsmIfQhM+A+M+cThbELSRmbDb+48DgLflVHH1bw6wCGXVMVQA65vYWkiHaALbxDgYOHLSFsWpag==
"@abp/bootstrap-datepicker@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-3.1.0-rc.3.tgz#279d9603cd916a884bac125cb525ee44fb809762"
integrity sha512-qZolOk2Pw+IvXh6Ko7wJddzMVPbS8silGecBZMYe0DVRNovg0515Px8zR3GJ16wcVQuvG6ByBn4fdeKFmYfokQ==
dependencies:
bootstrap-datepicker "^1.9.0"
"@abp/bootstrap@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-3.1.0-rc.2.tgz#691e4f609895e8914cf6903a26ad5d51f629c596"
integrity sha512-SaT7JN5C2RqzTgA8YdoON/eaeL4gl54vp7DTGPXXVvTYS20ZSxExKgVXEuOMEJVITKu4OeXqLYZyThz888I9iQ==
"@abp/bootstrap@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-3.1.0-rc.3.tgz#a1368df757995f52c19dd76ef1846d19a067def6"
integrity sha512-r8XRTYJBEa33FVxF+Mg0ALYNhmTjVBw1NQIQY8Ub5ZR+HIZoaDqA0X5zfAKvGQlmfXLiZJDkvCV5EIQWsIgnrA==
dependencies:
"@abp/core" "~3.1.0-rc.2"
"@abp/core" "~3.1.0-rc.3"
bootstrap "^4.5.0"
bootstrap-v4-rtl "4.4.1-2"
"@abp/clipboard@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-3.1.0-rc.2.tgz#73a8dbc1f98cfb64d374b463dcd16b186bb694bb"
integrity sha512-Q1Z9pcs3gpptjE8Cjm/38bPKwKncjoVYSO0TknyEZLM3QG+PtZwa9UCkaK+Truz/U3QoZqbPuNbPKr5cz7o+lw==
"@abp/clipboard@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-3.1.0-rc.3.tgz#40f0a95298cf9d7097d8e7f96e42c181e5a9907b"
integrity sha512-efCjrAHN3d7zmq4eVzlT4H/s6K11I9K7hv4fIJP6fbZKDoXi5hzTv2+dt9JRDWAra+s87PdBJq7AEWNs6ONiGg==
dependencies:
"@abp/core" "~3.1.0-rc.2"
"@abp/core" "~3.1.0-rc.3"
clipboard "^2.0.6"
"@abp/core@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/core/-/core-3.1.0-rc.2.tgz#707cec3323020b9ee4cc7c5a7fee21b418457eff"
integrity sha512-2VSCPIWEEM4iwcgRfgFempjPV0zLaWf81cp1ZrwuilqsljUXjMQL8Pf07TEaSa8+uN3VKkCsQtyq3A+DhUlVhA==
"@abp/core@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/core/-/core-3.1.0-rc.3.tgz#7e1bd9ac9aaecfc66863e8e319975358885a3ca2"
integrity sha512-wIvm4l8ZDQ+eiNN1a+v07EjUhngrxwPWvfDf9bPQpepfnIKiAktJziihh0oBJAbqXNqmI7f6FGN76spvNop/EA==
dependencies:
"@abp/utils" "^3.1.0-rc.2"
"@abp/utils" "^3.1.0-rc.3"
"@abp/datatables.net-bs4@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-3.1.0-rc.2.tgz#d98f47e4e286a7299ba42da1c394594f4b4581c7"
integrity sha512-VrcgFq3qq6azpCJEpk00R4fWA6GBzoDgHJT0K9bQtg4AqG8oamJa2QWX60g2OXzWpbI74bxleBAOLXzC4OJIrw==
"@abp/datatables.net-bs4@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-3.1.0-rc.3.tgz#f46c4474635918c16ca7edbe4930c07317930592"
integrity sha512-FeN53p5U2hIyYyM3G3AuGSwBZFBGbx4yHb/ymW/DEGtJ6XtynHlsFPz00/PktLe0OKOjUxOUf2LQLqKJi83WQQ==
dependencies:
"@abp/datatables.net" "~3.1.0-rc.2"
"@abp/datatables.net" "~3.1.0-rc.3"
datatables.net-bs4 "^1.10.21"
"@abp/datatables.net@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-3.1.0-rc.2.tgz#e73fee8f323e33094bfe49cbed520a4b9f382c18"
integrity sha512-+Bo8C7tslTasH7kMUnXQ5JESzg+ciy7jmvWPbJo32f0VFuiSPDBBr6nacBmE6IHPqG54ZAjqOkvE8eWL39dN2A==
"@abp/datatables.net@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-3.1.0-rc.3.tgz#c3a8f81d5ee571445b01d2db0e05ed555b1459b8"
integrity sha512-sOWuVwvSoQlXqC9CC9HGH6HzdHb5vVX8CbqzIUYBJEzY4NBRUqeclFJQrA/thjMNtefdLD2AiVwPFmAdGBeDSg==
dependencies:
"@abp/jquery" "~3.1.0-rc.2"
"@abp/jquery" "~3.1.0-rc.3"
datatables.net "^1.10.21"
"@abp/docs@^3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/docs/-/docs-3.1.0-rc.2.tgz#d46ec3c7b71fb7ad35e076ea6fd0b0bb9e09d27f"
integrity sha512-jGqxJTOQQb+xxNhasvy4S5qHGOesZwL4BruVdUXVbhUqc1M2lof6iJF4GxYaTndPigg4rOUpc+4WcSD8LUqWQw==
"@abp/docs@^3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/docs/-/docs-3.1.0-rc.3.tgz#b5bab272c4094de8f38c04015cf7219f0931c8c5"
integrity sha512-o1R9Kvw2VKqyjHYmNXYGUhiJue1FaqgRIJmmR6z0ncND7swsz4Qb/2gQvws4bHo/dIl28yrzJeKNzXbE74hHgQ==
dependencies:
"@abp/anchor-js" "~3.1.0-rc.2"
"@abp/clipboard" "~3.1.0-rc.2"
"@abp/malihu-custom-scrollbar-plugin" "~3.1.0-rc.2"
"@abp/popper.js" "~3.1.0-rc.2"
"@abp/prismjs" "~3.1.0-rc.2"
"@abp/anchor-js" "~3.1.0-rc.3"
"@abp/clipboard" "~3.1.0-rc.3"
"@abp/malihu-custom-scrollbar-plugin" "~3.1.0-rc.3"
"@abp/popper.js" "~3.1.0-rc.3"
"@abp/prismjs" "~3.1.0-rc.3"
"@abp/font-awesome@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-3.1.0-rc.2.tgz#4d0ef35abe67b86a6cbb8c7008a50f26eadbaa6e"
integrity sha512-r1iLq+1avQ8lsDqNAsu0TAQn5+JlYhUnjTVpnb/xcDMtbJv+eBZpqVLTbXelHV0q2Czq/gDzloqkHFNv5Cxceg==
"@abp/font-awesome@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-3.1.0-rc.3.tgz#38f63ad4fadc4986a73116fa29d5ef56812c483c"
integrity sha512-BnrI9XaKxEvI0d6Fa9tbw1J/VAsVUqTyAHva4WTUUa+neB9gaK62ZUjgDdF8Eo6gj7UOO8DYvsXehzpVpZKlPQ==
dependencies:
"@abp/core" "~3.1.0-rc.2"
"@abp/core" "~3.1.0-rc.3"
"@fortawesome/fontawesome-free" "^5.13.0"
"@abp/jquery-form@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-3.1.0-rc.2.tgz#f08ceb6be4a23d79f855d59b46c5fea5a6bf37ee"
integrity sha512-3UlUGXmvoT5xz4Hjz2gRX2rL+YbL4JprGaZvBrIbASJ6VSV3yHYbjma8YBqj2Wu2IQv6wpNhAYV+tALjPnFEgw==
"@abp/jquery-form@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-3.1.0-rc.3.tgz#7b74828f32a641c0b1ef1fd8b0389bf994a09e16"
integrity sha512-G+YRnDRZe5Mw81NAEnnr8scGjupndcu9xZ1dw+hCFGg30yypiUIfHtrMR4iR94y7M198fAgQP+0k7RvDqnALiw==
dependencies:
"@abp/jquery" "~3.1.0-rc.2"
"@abp/jquery" "~3.1.0-rc.3"
jquery-form "^4.3.0"
"@abp/jquery-validation-unobtrusive@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-3.1.0-rc.2.tgz#1802ffd0dc8aa710bfb81f6f5e6654a44227334f"
integrity sha512-2iWFp8a4Iths5dbf3v/gcTFrOXUX6CkwS5JiO3YsA0ujbZgF2HGbnPD7vzrfuRJAIKPKCIiovLDBY3yKN6boQw==
"@abp/jquery-validation-unobtrusive@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-3.1.0-rc.3.tgz#aef83e8f11791ae7be449eab6655a73075f98b45"
integrity sha512-uWu6qdZasSZEFJC1IhEtj8NZq5kXX8W/zlK2tVpFhjxE/QYiJlPj8pVy2I7cuEIBghzAO2omwI+5En8TSagrGA==
dependencies:
"@abp/jquery-validation" "~3.1.0-rc.2"
"@abp/jquery-validation" "~3.1.0-rc.3"
jquery-validation-unobtrusive "^3.2.11"
"@abp/jquery-validation@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-3.1.0-rc.2.tgz#adc314584261ef5bcdfa240c5e2df9f1bb4dcb2f"
integrity sha512-L2GoAUxMCAd8pXt54UqI2CEV4nWS0ww2dTNctEUcnJ2UZc7Ce+QFqBgvyRNmuSULMebfdtUYkodCGFdzzjRXfg==
"@abp/jquery-validation@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-3.1.0-rc.3.tgz#40dcb28ce5a3a87fc69972053e48a456c84e3225"
integrity sha512-uaL+ZS/NTf103Hq3ehayFT1qvq/Y2T5PAFY9ijBvX+7phCtPwGiIPfUvyuwYnKbdTa15odC275e7pY2CssHWIA==
dependencies:
"@abp/jquery" "~3.1.0-rc.2"
"@abp/jquery" "~3.1.0-rc.3"
jquery-validation "^1.19.2"
"@abp/jquery@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-3.1.0-rc.2.tgz#05857739e5ec9e519194fe9b80b426be0b40addb"
integrity sha512-+qPHJpV/s9GGWwdH6gj8BdDhg4t4w8pI9hx41UlIpPdrtO4kzaPU85/f7vX0QYzOrsYYxmWXHu3H0pL8QyDwQA==
"@abp/jquery@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-3.1.0-rc.3.tgz#8c35b9e7de888516e2acc5227092ca2fed991475"
integrity sha512-DT2uBNfW3+Xc1Bz62WHdIC3JfAb2Qcc4p86LyDG5pNRAd3FpImA1VnRPsMRX9Mig7HYRjMYiuYXTeovM6YS0fg==
dependencies:
"@abp/core" "~3.1.0-rc.2"
"@abp/core" "~3.1.0-rc.3"
jquery "~3.5.1"
"@abp/lodash@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-3.1.0-rc.2.tgz#80fc560277e903b94cf90146e05cb6e6e62b0ee3"
integrity sha512-TQ8HqvW9skMFDfJv7wNX4Ahi/HjCBfD/ZDePvfyTLwdsnNPwDg6zERwYTGk48ep/6CUsK3MMQzvShl4yaYIFYQ==
"@abp/lodash@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-3.1.0-rc.3.tgz#a312975824fa3bebc00f5eca35cededc5ec3af4b"
integrity sha512-siv5cMWlUHEX2RtvKCGoX2cEh4h1hniluKlFgmVmYY4hdGYdAG4T2d9QQAbPODwdzrJ8jzI36hXT/P4IrzhWZw==
dependencies:
"@abp/core" "~3.1.0-rc.2"
"@abp/core" "~3.1.0-rc.3"
lodash "^4.17.15"
"@abp/luxon@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-3.1.0-rc.2.tgz#6a7db2fd1cc1674e73df6c982657c791a94fc65b"
integrity sha512-vrtiuMnQDP0rC+yrQawqVu3F4pcZrv3wsx0ZqaIWWakQJ4X17aSTM0Xhxa95jnHh4WFFUDN00mYxkPxNr8JqvA==
"@abp/luxon@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-3.1.0-rc.3.tgz#9b9d5c9827a0c661458094134cafd80f35537a69"
integrity sha512-cKj/irXJhTJ6WiSyjzcZcsDjKFji1Q/0nV7IYhY9e2wzpg3qEB8Z8k8fDLPDAUriUKxBoI6mQ/CVC0ah7eg/LA==
dependencies:
luxon "^1.24.1"
"@abp/malihu-custom-scrollbar-plugin@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-3.1.0-rc.2.tgz#3805b260bd3442353a946de5c7508e98cc7cefdd"
integrity sha512-bp+S43ZIWQpkhx7ni2DThwDZ2A+q6ZaAUaESWz+yCHXWwYacnfHeq4p+mkS07OdVteP33NWAxJpjtDl6fPBo8A==
"@abp/malihu-custom-scrollbar-plugin@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-3.1.0-rc.3.tgz#218eb620532af8bdde6a46388a3d5349974fab44"
integrity sha512-z3IzgSYtpZ2FlWNmM2A1wbP3CHB3P5a8k/JR0JSWwtl+D/LiYC348VQIXen+pIJoEjMlY48iSi5XNyBIz4X9hw==
dependencies:
"@abp/core" "~3.1.0-rc.2"
"@abp/core" "~3.1.0-rc.3"
malihu-custom-scrollbar-plugin "^3.1.5"
"@abp/popper.js@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/popper.js/-/popper.js-3.1.0-rc.2.tgz#26bd792c33b9a8cf347d14be4e08a4d42eb189c8"
integrity sha512-xWsOIzndRkvwdD5LOan8zf4vtceW0RIjCWSWdRtso4+V/fTLzWw9ofG3utvMaeJvu1Rfdr2mb2tLzYDNezNDAg==
"@abp/popper.js@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/popper.js/-/popper.js-3.1.0-rc.3.tgz#7b12694e65866edeaa8e8543a23ef238682f34cb"
integrity sha512-QyoRm8y4bjemPGwqTHHO30H5/g+uJ4vsX6eB+lxiqPYBW/2OCTccjWkRwPl1YXKdMMyS2IMARDtYDtrNoQ8Z5g==
dependencies:
"@abp/core" "~3.1.0-rc.2"
"@abp/core" "~3.1.0-rc.3"
popper.js "^1.16.0"
"@abp/prismjs@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-3.1.0-rc.2.tgz#767d58c07e94c6e5056fd187d4e398efa108f67e"
integrity sha512-HCX/nw6noslnlw7xh94IaybI7xNYrjVOIld1C+J7p9AHizLhxh4kRbwVTpLhFzUWsSrTe8+VssgryimLQvTmjg==
"@abp/prismjs@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-3.1.0-rc.3.tgz#d13885bf613871f6cd003f58ae01ee4587ad15ad"
integrity sha512-gaKxJ3d78oR1wGZhnPzM5EJIAsibh3VT9MFithFt/YAQdrMMOqS1fEdGsm1zO/A7Veyho9Ba/144RmPkFXH5gQ==
dependencies:
"@abp/clipboard" "~3.1.0-rc.2"
"@abp/core" "~3.1.0-rc.2"
"@abp/clipboard" "~3.1.0-rc.3"
"@abp/core" "~3.1.0-rc.3"
prismjs "^1.20.0"
"@abp/select2@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-3.1.0-rc.2.tgz#6b16301cb7c4ad4e2b39400a5f9cf336c700a343"
integrity sha512-qbj6csa9/0+xF5fzcm1WJSzUiBvSgwiYPRpH5wyG/FZYf7YxK2dAv/Lmi5RE4eAb8Ib9ueB7nPkzJYUJhJ1wgQ==
"@abp/select2@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-3.1.0-rc.3.tgz#493afc27f29da1c9926ee02e8f7b641e8ee4b67e"
integrity sha512-fym9GmQbl34CyTCVzfo4jGe77nSeDuRPYMzAYO8p0uKdDB8t9jNZNqhYJ9Ee5KQXJyg4lmFFPkLcRZF14E+cWw==
dependencies:
"@abp/core" "~3.1.0-rc.2"
"@abp/core" "~3.1.0-rc.3"
select2 "^4.0.13"
"@abp/sweetalert@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-3.1.0-rc.2.tgz#a152eb5632cd0eee50d5fed2c156bc4b6daf6829"
integrity sha512-6pjzFwr/HKgNYcsx76GZdcm0qZ8NfcdYqFOwj91w3bGmtPZYRRJLV01k9kDIOQHYnmCReO+ThF46wZCyt/8xvg==
"@abp/sweetalert@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-3.1.0-rc.3.tgz#1c1421e2baaa57cc24e0f9334a5173836819cc24"
integrity sha512-WrYRutXM2f6VRECEkWhjfqtQXlnEw88MCkYicAhyMH7ZYYWg7r9xVg9TRJJI4UwGMLSyR3EB+ZdTmnD8aSC0yQ==
dependencies:
"@abp/core" "~3.1.0-rc.2"
"@abp/core" "~3.1.0-rc.3"
sweetalert "^2.1.2"
"@abp/timeago@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-3.1.0-rc.2.tgz#0c3fe13f15319c943186eff861f0e9a790b6651b"
integrity sha512-BJzvJGJk6uPkpR5MMIX7DF/WsYZbvss2B82RTcr2Dkto7VtfRUYqcpWBcUIHCJ7hLh4SMS000fC8tfRXo7e0EA==
"@abp/timeago@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-3.1.0-rc.3.tgz#0a7a369ba29633f00b19206b257c6f1f59f182a4"
integrity sha512-FDgaQCJmwWplCcdJYa9kyCcMxJFrKf+zDEFzT5hWfhMzq+sYJYX7QDQtbF5OJnMSWuPyI0/RU0bocuGaJ584VQ==
dependencies:
"@abp/jquery" "~3.1.0-rc.2"
"@abp/jquery" "~3.1.0-rc.3"
timeago "^1.6.7"
"@abp/toastr@~3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-3.1.0-rc.2.tgz#1b149684a4f7751df48cd9cbac5ce0ce7526042c"
integrity sha512-4U2spuDnl2F3AzGDvHyhGJtZT0Kv4LmdUYwdq/aKneHSTzJ9v5bUpjjU1Gth6fyi0iqH61DAyaoTsbgy0kFQqQ==
"@abp/toastr@~3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-3.1.0-rc.3.tgz#89af6aa864a9aac76bc9bf21b7f9bc6763ca7573"
integrity sha512-AeKH5imy8W9yMAlzRv9VdkRHApySpR2BKfrQYk3q9LubgwaxLvOFc/l38aIEKuyosN7dHTMFBQlEwLxWFwaoPA==
dependencies:
"@abp/jquery" "~3.1.0-rc.2"
"@abp/jquery" "~3.1.0-rc.3"
toastr "^2.1.4"
"@abp/utils@^3.1.0-rc.2":
version "3.1.0-rc.2"
resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-3.1.0-rc.2.tgz#c3774246f01f4b032b2d229457c3bd93f7d14048"
integrity sha512-lgHy/OAEBau2Qyr0mZUjOWU8uBFBFIBvGnUKgSqKRxTqf5GyNvkKO8GPpqGSmyIsYUfW2UUsRhaLW7K85T9CZw==
"@abp/utils@^3.1.0-rc.3":
version "3.1.0-rc.3"
resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-3.1.0-rc.3.tgz#3cbc50c1f8fdf6592d66f8ea4b5a9c4249a5e46a"
integrity sha512-45KXx5zlxm5gK2EFwzM+hMjT8q8pD3PejyNfVP6HBbGE2N36LGKYtI59s6vFm5yV2qFxQyVPrk4mi3Y+neqlBw==
dependencies:
just-compare "^1.3.0"

@ -1,4 +1,3 @@
using System.Collections.Generic;
using Volo.Abp.Validation.StringValues;
namespace Volo.Abp.FeatureManagement
@ -11,6 +10,8 @@ namespace Volo.Abp.FeatureManagement
public string Value { get; set; }
public FeatureProviderDto Provider { get; set; }
public string Description { get; set; }
public IStringValueType ValueType { get; set; }
@ -19,4 +20,4 @@ namespace Volo.Abp.FeatureManagement
public string ParentName { get; set; }
}
}
}

@ -0,0 +1,9 @@
namespace Volo.Abp.FeatureManagement
{
public class FeatureProviderDto
{
public string Name { get; set; }
public string Key { get; set; }
}
}

@ -33,6 +33,7 @@ namespace Volo.Abp.FeatureManagement
foreach (var featureDefinition in featureDefinitions)
{
var feature = await FeatureManager.GetOrNullWithProviderAsync(featureDefinition.Name, providerName, providerKey);
features.Add(new FeatureDto
{
Name = featureDefinition.Name,
@ -40,7 +41,12 @@ namespace Volo.Abp.FeatureManagement
ValueType = featureDefinition.ValueType,
Description = featureDefinition.Description?.Localize(StringLocalizerFactory),
ParentName = featureDefinition.Parent?.Name,
Value = await FeatureManager.GetOrNullAsync(featureDefinition.Name, providerName, providerKey)
Value = feature.Value,
Provider = new FeatureProviderDto
{
Name = feature.Provider?.Name,
Key = feature.Provider?.Key
}
});
}

@ -8,6 +8,11 @@ namespace Volo.Abp.FeatureManagement
{
public string Name => DefaultValueFeatureValueProvider.ProviderName;
public bool Compatible(string providerName)
{
return providerName == Name;
}
public virtual Task<string> GetOrNullAsync(FeatureDefinition feature, string providerKey)
{
return Task.FromResult(feature.DefaultValue);
@ -23,4 +28,4 @@ namespace Volo.Abp.FeatureManagement
throw new AbpException($"Can not clear default value of a feature. It is only possible while defining the feature in a {typeof(IFeatureDefinitionProvider)} implementation.");
}
}
}
}

@ -16,5 +16,15 @@ namespace Volo.Abp.FeatureManagement
{
return featureManager.GetAllAsync(DefaultValueFeatureValueProvider.ProviderName, null, fallback);
}
public static Task<FeatureNameValueWithGrantedProvider> GetOrNullWithProviderAsync(this IFeatureManager featureManager, [NotNull] string name, bool fallback = true)
{
return featureManager.GetOrNullWithProviderAsync(name, DefaultValueFeatureValueProvider.ProviderName, null, fallback);
}
public static Task<List<FeatureNameValueWithGrantedProvider>> GetAllWithProviderAsync(this IFeatureManager featureManager, bool fallback = true)
{
return featureManager.GetAllWithProviderAsync(DefaultValueFeatureValueProvider.ProviderName, null, fallback);
}
}
}
}

@ -18,9 +18,19 @@ namespace Volo.Abp.FeatureManagement
return featureManager.GetAllAsync(EditionFeatureValueProvider.ProviderName, editionId.ToString(), fallback);
}
public static Task<FeatureNameValueWithGrantedProvider> GetOrNullWithProviderForEditionAsync(this IFeatureManager featureManager, [NotNull] string name, Guid editionId, bool fallback = true)
{
return featureManager.GetOrNullWithProviderAsync(name, EditionFeatureValueProvider.ProviderName, editionId.ToString(), fallback);
}
public static Task<List<FeatureNameValueWithGrantedProvider>> GetAllWithProviderForEditionAsync(this IFeatureManager featureManager, Guid editionId, bool fallback = true)
{
return featureManager.GetAllWithProviderAsync(EditionFeatureValueProvider.ProviderName, editionId.ToString(), fallback);
}
public static Task SetForEditionAsync(this IFeatureManager featureManager, Guid editionId, [NotNull] string name, [CanBeNull] string value, bool forceToSet = false)
{
return featureManager.SetAsync(name, value, EditionFeatureValueProvider.ProviderName, editionId.ToString(), forceToSet);
}
}
}
}

@ -14,6 +14,11 @@ namespace Volo.Abp.FeatureManagement
Store = store;
}
public virtual bool Compatible(string providerName)
{
return providerName == Name;
}
public virtual async Task<string> GetOrNullAsync(FeatureDefinition feature, string providerKey)
{
return await Store.GetOrNullAsync(feature.Name, Name, NormalizeProviderKey(providerKey));
@ -34,4 +39,4 @@ namespace Volo.Abp.FeatureManagement
return providerKey;
}
}
}
}

@ -35,23 +35,37 @@ namespace Volo.Abp.FeatureManagement
true
);
}
public virtual Task<string> GetOrNullAsync(
string name,
string providerName,
string providerKey,
public virtual async Task<string> GetOrNullAsync(
string name,
string providerName,
string providerKey,
bool fallback = true)
{
Check.NotNull(name, nameof(name));
Check.NotNull(providerName, nameof(providerName));
return GetOrNullInternalAsync(name, providerName, providerKey, fallback);
return (await GetOrNullInternalAsync(name, providerName, providerKey, fallback)).Value;
}
public virtual async Task<List<FeatureNameValue>> GetAllAsync(
string providerName,
string providerKey,
string providerName,
string providerKey,
bool fallback = true)
{
return (await GetAllWithProviderAsync(providerName, providerKey, fallback))
.Select(x => new FeatureNameValue(x.Name, x.Value)).ToList();
}
public async Task<FeatureNameValueWithGrantedProvider> GetOrNullWithProviderAsync(string name, string providerName, string providerKey, bool fallback = true)
{
Check.NotNull(name, nameof(name));
Check.NotNull(providerName, nameof(providerName));
return await GetOrNullInternalAsync(name, providerName, providerKey, fallback);
}
public async Task<List<FeatureNameValueWithGrantedProvider>> GetAllWithProviderAsync(string providerName, string providerKey, bool fallback = true)
{
Check.NotNull(providerName, nameof(providerName));
@ -68,31 +82,34 @@ namespace Volo.Abp.FeatureManagement
if (!providerList.Any())
{
return new List<FeatureNameValue>();
return new List<FeatureNameValueWithGrantedProvider>();
}
var featureValues = new Dictionary<string, FeatureNameValue>();
var featureValues = new Dictionary<string, FeatureNameValueWithGrantedProvider>();
foreach (var feature in featureDefinitions)
{
string value = null;
var featureNameValueWithGrantedProvider = new FeatureNameValueWithGrantedProvider(feature.Name, null);
foreach (var provider in providerList)
{
var providerValue = await provider.GetOrNullAsync(
feature,
provider.Name == providerName ? providerKey : null
);
string pk = null;
if (provider.Compatible(providerName))
{
pk = providerKey;
}
if (providerValue != null)
var value = await provider.GetOrNullAsync(feature, pk);
if (value != null)
{
value = providerValue;
featureNameValueWithGrantedProvider.Value = value;
featureNameValueWithGrantedProvider.Provider = new FeatureValueProviderInfo(provider.Name, pk);
break;
}
}
if (value != null)
if (featureNameValueWithGrantedProvider.Value != null)
{
featureValues[feature.Name] = new FeatureNameValue(feature.Name, value);
featureValues[feature.Name] = featureNameValueWithGrantedProvider;
}
}
@ -100,10 +117,10 @@ namespace Volo.Abp.FeatureManagement
}
public virtual async Task SetAsync(
string name,
string value,
string providerName,
string providerKey,
string name,
string value,
string providerName,
string providerKey,
bool forceToSet = false)
{
Check.NotNull(name, nameof(name));
@ -120,11 +137,11 @@ namespace Volo.Abp.FeatureManagement
{
return;
}
if (providers.Count > 1 && !forceToSet && value != null)
{
var fallbackValue = await GetOrNullInternalAsync(name, providers[1].Name, null);
if (fallbackValue == value)
if (fallbackValue.Value == value)
{
//Clear the value if it's same as it's fallback value
value = null;
@ -151,10 +168,10 @@ namespace Volo.Abp.FeatureManagement
}
}
protected virtual async Task<string> GetOrNullInternalAsync(
string name,
string providerName,
string providerKey,
protected virtual async Task<FeatureNameValueWithGrantedProvider> GetOrNullInternalAsync(
string name,
string providerName,
string providerKey,
bool fallback = true) //TODO: Fallback is not used
{
var feature = FeatureDefinitionManager.Get(name);
@ -166,21 +183,25 @@ namespace Volo.Abp.FeatureManagement
providers = providers.SkipWhile(c => c.Name != providerName);
}
string value = null;
var featureNameValueWithGrantedProvider = new FeatureNameValueWithGrantedProvider(name, null);
foreach (var provider in providers)
{
value = await provider.GetOrNullAsync(
feature,
provider.Name == providerName ? providerKey : null
);
string pk = null;
if (provider.Compatible(providerName))
{
pk = providerKey;
}
var value = await provider.GetOrNullAsync(feature, pk);
if (value != null)
{
featureNameValueWithGrantedProvider.Value = value;
featureNameValueWithGrantedProvider.Provider = new FeatureValueProviderInfo(provider.Name, pk);
break;
}
}
return value;
return featureNameValueWithGrantedProvider;
}
}
}

@ -0,0 +1,19 @@
using System;
using JetBrains.Annotations;
namespace Volo.Abp.FeatureManagement
{
[Serializable]
public class FeatureNameValueWithGrantedProvider : NameValue
{
public FeatureValueProviderInfo Provider { get; set; }
public FeatureNameValueWithGrantedProvider([NotNull] string name, string value)
{
Check.NotNull(name, nameof(name));
Name = name;
Value = value;
}
}
}

@ -0,0 +1,21 @@
using System;
using JetBrains.Annotations;
namespace Volo.Abp.FeatureManagement
{
[Serializable]
public class FeatureValueProviderInfo
{
public string Name { get; }
public string Key { get; }
public FeatureValueProviderInfo([NotNull]string name, string key)
{
Check.NotNull(name, nameof(name));
Name = name;
Key = key;
}
}
}

@ -8,10 +8,13 @@ namespace Volo.Abp.FeatureManagement
{
string Name { get; }
//TODO: Other better method name.
bool Compatible(string providerName);
Task<string> GetOrNullAsync([NotNull] FeatureDefinition feature, [CanBeNull] string providerKey);
Task SetAsync([NotNull] FeatureDefinition feature, [NotNull] string value, [CanBeNull] string providerKey);
Task ClearAsync([NotNull] FeatureDefinition feature, [CanBeNull] string providerKey);
}
}
}

@ -10,6 +10,10 @@ namespace Volo.Abp.FeatureManagement
Task<List<FeatureNameValue>> GetAllAsync([NotNull] string providerName, [CanBeNull] string providerKey, bool fallback = true);
Task<FeatureNameValueWithGrantedProvider> GetOrNullWithProviderAsync([NotNull]string name, [NotNull] string providerName, [CanBeNull] string providerKey, bool fallback = true);
Task<List<FeatureNameValueWithGrantedProvider>> GetAllWithProviderAsync([NotNull] string providerName, [CanBeNull] string providerKey, bool fallback = true);
Task SetAsync([NotNull] string name, [CanBeNull] string value, [NotNull] string providerName, [CanBeNull] string providerKey, bool forceToSet = false);
}
}
}

@ -18,6 +18,16 @@ namespace Volo.Abp.FeatureManagement
return featureManager.GetAllAsync(TenantFeatureValueProvider.ProviderName, tenantId.ToString(), fallback);
}
public static Task<FeatureNameValueWithGrantedProvider> GetOrNullWithProviderForTenantAsync(this IFeatureManager featureManager, [NotNull] string name, Guid tenantId, bool fallback = true)
{
return featureManager.GetOrNullWithProviderAsync(name, TenantFeatureValueProvider.ProviderName, tenantId.ToString(), fallback);
}
public static Task<List<FeatureNameValueWithGrantedProvider>> GetAllWithProviderForTenantAsync(this IFeatureManager featureManager, Guid tenantId, bool fallback = true)
{
return featureManager.GetAllWithProviderAsync(TenantFeatureValueProvider.ProviderName, tenantId.ToString(), fallback);
}
public static Task SetForTenantAsync(this IFeatureManager featureManager, Guid tenantId, [NotNull] string name, [CanBeNull] string value, bool forceToSet = false)
{
return featureManager.SetAsync(name, value, TenantFeatureValueProvider.ProviderName, tenantId.ToString(), forceToSet);

@ -4,6 +4,7 @@
@using Volo.Abp.FeatureManagement.Localization
@using Volo.Abp.Validation.StringValues
@using Volo.Abp.FeatureManagement.Web.Pages.FeatureManagement
@using Volo.Abp.Features
@model FeatureManagementModal
@inject IHtmlLocalizer<AbpFeatureManagementResource> L
@{
@ -20,20 +21,22 @@
@for (var i = 0; i < Model.FeatureListDto.Features.Count; i++)
{
var feature = Model.FeatureListDto.Features[i];
var disabled = Model.IsDisabled(feature.Provider.Name);
<div class="mt-2" style="padding-left: @(feature.Depth * 20)px">
<spam class="mr-2">@feature.DisplayName</spam>
<spam class="mr-2">@feature.DisplayName @(disabled ? $"({feature.Provider.Name})" : "")</spam>
<input type="text" name="Features[@i].ProviderName" value="@feature.Provider.Name" hidden />
<input type="text" name="Features[@i].Type" value="@feature.ValueType?.Name" hidden />
@if (feature.ValueType is FreeTextStringValueType)
{
<input type="text" name="Features[@i].Name" value="@feature.Name" hidden />
<input type="text" name="Features[@i].Value" value="@feature.Value" />
<input disabled="@disabled" type="text" name="Features[@i].Value" value="@feature.Value" />
}
@if (feature.ValueType is SelectionStringValueType)
{
<input type="text" name="Features[@i].Name" value="@feature.Name" hidden />
<select name="Features[@i].Value">
<select disabled="@disabled" name="Features[@i].Value">
@foreach (var item in (feature.ValueType as SelectionStringValueType).ItemSource.Items)
{
if (item.Value == feature.Value)
@ -50,7 +53,7 @@
@if (feature.ValueType is ToggleStringValueType)
{
<input type="text" name="Features[@i].Name" value="@feature.Name" hidden />
<input type="checkbox" class="FeatureValueCheckbox" name="Features[@i].BoolValue" value="@feature.Value"
<input disabled="@disabled" type="checkbox" class="FeatureValueCheckbox" name="Features[@i].BoolValue" value="@feature.Value"
@Html.Raw(feature.Value == "True" ? "checked" : "") />
}
</div>

@ -4,6 +4,7 @@ using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Volo.Abp.AspNetCore.Mvc.UI.RazorPages;
using Volo.Abp.Features;
using Volo.Abp.Validation.StringValues;
namespace Volo.Abp.FeatureManagement.Web.Pages.FeatureManagement
@ -55,6 +56,10 @@ namespace Volo.Abp.FeatureManagement.Web.Pages.FeatureManagement
return NoContent();
}
public virtual bool IsDisabled(string providerName)
{
return providerName != ProviderName && providerName != DefaultValueFeatureValueProvider.ProviderName;
}
public class ProviderInfoViewModel
{
@ -69,9 +74,11 @@ namespace Volo.Abp.FeatureManagement.Web.Pages.FeatureManagement
public string Value { get; set; }
public string ProviderName { get; set; }
public bool BoolValue { get; set; }
public string Type { get; set; }
}
}
}
}

@ -1,5 +1,5 @@
{
"version": "3.1.0-rc.2",
"version": "3.1.0-rc.3",
"packages": [
"packs/*"
],

@ -1,5 +1,5 @@
{
"version": "3.1.0-rc.2",
"version": "3.1.0-rc.3",
"packages": [
"packages/*"
],

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

Loading…
Cancel
Save