Merge branch 'dev' into separate-tenant-db-improvements

pull/7577/head
Halil İbrahim Kalkan 5 years ago
commit 10ea177613

@ -16,7 +16,7 @@ namespace Volo.Abp.Cli.Commands.Services
case DatabaseManagementSystem.MySQL: case DatabaseManagementSystem.MySQL:
return "Server=localhost;Port=3306;Database=MyProjectName;Uid=root;Pwd=myPassword;"; return "Server=localhost;Port=3306;Database=MyProjectName;Uid=root;Pwd=myPassword;";
case DatabaseManagementSystem.PostgreSQL: case DatabaseManagementSystem.PostgreSQL:
return "User ID=root;Password=myPassword;Host=localhost;Port=5432;Database=MyProjectName;Pooling=true;Min Pool Size=0;Max Pool Size=100;Connection Lifetime=0;"; return "Host=localhost;Port=5432;Database=MyProjectName;User ID=root;Password=myPassword;Pooling=true;MinimumPoolSize=0;MaximumPoolSize=100;Connection Lifetime=0;";
//case DatabaseManagementSystem.Oracle: //case DatabaseManagementSystem.Oracle:
case DatabaseManagementSystem.OracleDevart: case DatabaseManagementSystem.OracleDevart:
return "Data Source=MyProjectName;Integrated Security=yes;"; return "Data Source=MyProjectName;Integrated Security=yes;";

@ -20,8 +20,10 @@ namespace Volo.Abp.Domain.Repositories
{ {
/// <summary> /// <summary>
/// Get a single entity by the given <paramref name="predicate"/>. /// Get a single entity by the given <paramref name="predicate"/>.
/// It returns null if no entity with the given <paramref name="predicate"/>. /// <para>
/// It returns null if there is no entity with the given <paramref name="predicate"/>.
/// It throws <see cref="InvalidOperationException"/> if there are multiple entities with the given <paramref name="predicate"/>. /// It throws <see cref="InvalidOperationException"/> if there are multiple entities with the given <paramref name="predicate"/>.
/// </para>
/// </summary> /// </summary>
/// <param name="predicate">A condition to find the entity</param> /// <param name="predicate">A condition to find the entity</param>
/// <param name="includeDetails">Set true to include all children of this entity</param> /// <param name="includeDetails">Set true to include all children of this entity</param>
@ -34,8 +36,10 @@ namespace Volo.Abp.Domain.Repositories
/// <summary> /// <summary>
/// Get a single entity by the given <paramref name="predicate"/>. /// Get a single entity by the given <paramref name="predicate"/>.
/// <para>
/// It throws <see cref="EntityNotFoundException"/> if there is no entity with the given <paramref name="predicate"/>. /// It throws <see cref="EntityNotFoundException"/> if there is no entity with the given <paramref name="predicate"/>.
/// It throws <see cref="InvalidOperationException"/> if there are multiple entities with the given <paramref name="predicate"/>. /// It throws <see cref="InvalidOperationException"/> if there are multiple entities with the given <paramref name="predicate"/>.
/// </para>
/// </summary> /// </summary>
/// <param name="predicate">A condition to filter entities</param> /// <param name="predicate">A condition to filter entities</param>
/// <param name="includeDetails">Set true to include all children of this entity</param> /// <param name="includeDetails">Set true to include all children of this entity</param>
@ -47,10 +51,11 @@ namespace Volo.Abp.Domain.Repositories
); );
/// <summary> /// <summary>
/// Deletes many entities by function. /// Deletes many entities by the given <paramref name="predicate"/>.
/// Notice that: All entities fits to given predicate are retrieved and deleted. /// <para>
/// This may cause major performance problems if there are too many entities with /// Please note: This may cause major performance problems if there are too many entities returned for a
/// given predicate. /// given predicate and the database provider doesn't have a way to efficiently delete many entities.
/// </para>
/// </summary> /// </summary>
/// <param name="predicate">A condition to filter entities</param> /// <param name="predicate">A condition to filter entities</param>
/// <param name="autoSave"> /// <param name="autoSave">
@ -69,4 +74,4 @@ namespace Volo.Abp.Domain.Repositories
where TEntity : class, IEntity<TKey> where TEntity : class, IEntity<TKey>
{ {
} }
} }

@ -289,10 +289,7 @@ namespace Volo.Abp.Domain.Repositories.EntityFrameworkCore
.Where(predicate) .Where(predicate)
.ToListAsync(GetCancellationToken(cancellationToken)); .ToListAsync(GetCancellationToken(cancellationToken));
foreach (var entity in entities) await DeleteManyAsync(entities, autoSave, cancellationToken);
{
dbSet.Remove(entity);
}
if (autoSave) if (autoSave)
{ {

@ -191,10 +191,7 @@ namespace Volo.Abp.Domain.Repositories.MemoryDb
{ {
var entities = (await GetQueryableAsync()).Where(predicate).ToList(); var entities = (await GetQueryableAsync()).Where(predicate).ToList();
foreach (var entity in entities) await DeleteManyAsync(entities, autoSave, cancellationToken);
{
await DeleteAsync(entity, autoSave, cancellationToken);
}
} }
public override async Task<TEntity> InsertAsync( public override async Task<TEntity> InsertAsync(

@ -71,16 +71,18 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
protected Task<TMongoDbContext> GetDbContextAsync(CancellationToken cancellationToken = default) protected Task<TMongoDbContext> GetDbContextAsync(CancellationToken cancellationToken = default)
{ {
cancellationToken = GetCancellationToken(cancellationToken);
// Multi-tenancy unaware entities should always use the host connection string // Multi-tenancy unaware entities should always use the host connection string
if (!EntityHelper.IsMultiTenant<TEntity>()) if (!EntityHelper.IsMultiTenant<TEntity>())
{ {
using (CurrentTenant.Change(null)) using (CurrentTenant.Change(null))
{ {
return DbContextProvider.GetDbContextAsync(GetCancellationToken(cancellationToken)); return DbContextProvider.GetDbContextAsync(cancellationToken);
} }
} }
return DbContextProvider.GetDbContextAsync(GetCancellationToken(cancellationToken)); return DbContextProvider.GetDbContextAsync(cancellationToken);
} }
protected IMongoDbContextProvider<TMongoDbContext> DbContextProvider { get; } protected IMongoDbContextProvider<TMongoDbContext> DbContextProvider { get; }
@ -107,9 +109,11 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
bool autoSave = false, bool autoSave = false,
CancellationToken cancellationToken = default) CancellationToken cancellationToken = default)
{ {
cancellationToken = GetCancellationToken(cancellationToken);
await ApplyAbpConceptsForAddedEntityAsync(entity); await ApplyAbpConceptsForAddedEntityAsync(entity);
var dbContext = await GetDbContextAsync(GetCancellationToken(cancellationToken)); var dbContext = await GetDbContextAsync(cancellationToken);
var collection = dbContext.Collection<TEntity>(); var collection = dbContext.Collection<TEntity>();
if (dbContext.SessionHandle != null) if (dbContext.SessionHandle != null)
@ -117,14 +121,14 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
await collection.InsertOneAsync( await collection.InsertOneAsync(
dbContext.SessionHandle, dbContext.SessionHandle,
entity, entity,
cancellationToken: GetCancellationToken(cancellationToken) cancellationToken: cancellationToken
); );
} }
else else
{ {
await collection.InsertOneAsync( await collection.InsertOneAsync(
entity, entity,
cancellationToken: GetCancellationToken(cancellationToken) cancellationToken: cancellationToken
); );
} }
@ -133,6 +137,8 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
public override async Task InsertManyAsync(IEnumerable<TEntity> entities, bool autoSave = false, CancellationToken cancellationToken = default) public override async Task InsertManyAsync(IEnumerable<TEntity> entities, bool autoSave = false, CancellationToken cancellationToken = default)
{ {
cancellationToken = GetCancellationToken(cancellationToken);
var entityArray = entities.ToArray(); var entityArray = entities.ToArray();
foreach (var entity in entityArray) foreach (var entity in entityArray)
@ -140,7 +146,7 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
await ApplyAbpConceptsForAddedEntityAsync(entity); await ApplyAbpConceptsForAddedEntityAsync(entity);
} }
var dbContext = await GetDbContextAsync(GetCancellationToken(cancellationToken)); var dbContext = await GetDbContextAsync(cancellationToken);
var collection = dbContext.Collection<TEntity>(); var collection = dbContext.Collection<TEntity>();
if (BulkOperationProvider != null) if (BulkOperationProvider != null)
@ -169,6 +175,8 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
bool autoSave = false, bool autoSave = false,
CancellationToken cancellationToken = default) CancellationToken cancellationToken = default)
{ {
cancellationToken = GetCancellationToken(cancellationToken);
SetModificationAuditProperties(entity); SetModificationAuditProperties(entity);
if (entity is ISoftDelete softDeleteEntity && softDeleteEntity.IsDeleted) if (entity is ISoftDelete softDeleteEntity && softDeleteEntity.IsDeleted)
@ -186,7 +194,7 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
var oldConcurrencyStamp = SetNewConcurrencyStamp(entity); var oldConcurrencyStamp = SetNewConcurrencyStamp(entity);
ReplaceOneResult result; ReplaceOneResult result;
var dbContext = await GetDbContextAsync(GetCancellationToken(cancellationToken)); var dbContext = await GetDbContextAsync(cancellationToken);
var collection = dbContext.Collection<TEntity>(); var collection = dbContext.Collection<TEntity>();
if (dbContext.SessionHandle != null) if (dbContext.SessionHandle != null)
@ -195,7 +203,7 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
dbContext.SessionHandle, dbContext.SessionHandle,
CreateEntityFilter(entity, true, oldConcurrencyStamp), CreateEntityFilter(entity, true, oldConcurrencyStamp),
entity, entity,
cancellationToken: GetCancellationToken(cancellationToken) cancellationToken: cancellationToken
); );
} }
else else
@ -203,7 +211,7 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
result = await collection.ReplaceOneAsync( result = await collection.ReplaceOneAsync(
CreateEntityFilter(entity, true, oldConcurrencyStamp), CreateEntityFilter(entity, true, oldConcurrencyStamp),
entity, entity,
cancellationToken: GetCancellationToken(cancellationToken) cancellationToken: cancellationToken
); );
} }
@ -277,15 +285,18 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
bool autoSave = false, bool autoSave = false,
CancellationToken cancellationToken = default) CancellationToken cancellationToken = default)
{ {
await ApplyAbpConceptsForDeletedEntityAsync(entity); cancellationToken = GetCancellationToken(cancellationToken);
var oldConcurrencyStamp = SetNewConcurrencyStamp(entity);
var dbContext = await GetDbContextAsync(GetCancellationToken(cancellationToken)); var dbContext = await GetDbContextAsync(cancellationToken);
var collection = dbContext.Collection<TEntity>(); var collection = dbContext.Collection<TEntity>();
if (entity is ISoftDelete softDeleteEntity && !IsHardDeleted(entity)) var oldConcurrencyStamp = SetNewConcurrencyStamp(entity);
if (typeof(ISoftDelete).IsAssignableFrom(typeof(TEntity)) && !IsHardDeleted(entity))
{ {
softDeleteEntity.IsDeleted = true; ((ISoftDelete)entity).IsDeleted = true;
await ApplyAbpConceptsForDeletedEntityAsync(entity);
ReplaceOneResult result; ReplaceOneResult result;
if (dbContext.SessionHandle != null) if (dbContext.SessionHandle != null)
@ -294,7 +305,7 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
dbContext.SessionHandle, dbContext.SessionHandle,
CreateEntityFilter(entity, true, oldConcurrencyStamp), CreateEntityFilter(entity, true, oldConcurrencyStamp),
entity, entity,
cancellationToken: GetCancellationToken(cancellationToken) cancellationToken: cancellationToken
); );
} }
else else
@ -302,7 +313,7 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
result = await collection.ReplaceOneAsync( result = await collection.ReplaceOneAsync(
CreateEntityFilter(entity, true, oldConcurrencyStamp), CreateEntityFilter(entity, true, oldConcurrencyStamp),
entity, entity,
cancellationToken: GetCancellationToken(cancellationToken) cancellationToken: cancellationToken
); );
} }
@ -313,6 +324,8 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
} }
else else
{ {
await ApplyAbpConceptsForDeletedEntityAsync(entity);
DeleteResult result; DeleteResult result;
if (dbContext.SessionHandle != null) if (dbContext.SessionHandle != null)
@ -320,14 +333,14 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
result = await collection.DeleteOneAsync( result = await collection.DeleteOneAsync(
dbContext.SessionHandle, dbContext.SessionHandle,
CreateEntityFilter(entity, true, oldConcurrencyStamp), CreateEntityFilter(entity, true, oldConcurrencyStamp),
cancellationToken: GetCancellationToken(cancellationToken) cancellationToken: cancellationToken
); );
} }
else else
{ {
result = await collection.DeleteOneAsync( result = await collection.DeleteOneAsync(
CreateEntityFilter(entity, true, oldConcurrencyStamp), CreateEntityFilter(entity, true, oldConcurrencyStamp),
GetCancellationToken(cancellationToken) cancellationToken
); );
} }
@ -343,55 +356,55 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
bool autoSave = false, bool autoSave = false,
CancellationToken cancellationToken = default) CancellationToken cancellationToken = default)
{ {
var softDeletedEntities = new List<TEntity>(); cancellationToken = GetCancellationToken(cancellationToken);
var softDeletedEntities = new Dictionary<TEntity, string>();
var hardDeletedEntities = new List<TEntity>(); var hardDeletedEntities = new List<TEntity>();
foreach (var entity in entities) foreach (var entity in entities)
{ {
await ApplyAbpConceptsForDeletedEntityAsync(entity);
SetNewConcurrencyStamp(entity);
if (typeof(ISoftDelete).IsAssignableFrom(typeof(TEntity)) && !IsHardDeleted(entity)) if (typeof(ISoftDelete).IsAssignableFrom(typeof(TEntity)) && !IsHardDeleted(entity))
{ {
softDeletedEntities.Add(entity); ((ISoftDelete)entity).IsDeleted = true;
softDeletedEntities.Add(entity, SetNewConcurrencyStamp(entity));
} }
else else
{ {
hardDeletedEntities.Add(entity); hardDeletedEntities.Add(entity);
} }
await ApplyAbpConceptsForDeletedEntityAsync(entity);
} }
var dbContext = await GetDbContextAsync(GetCancellationToken(cancellationToken)); var dbContext = await GetDbContextAsync(cancellationToken);
var collection = dbContext.Collection<TEntity>(); var collection = dbContext.Collection<TEntity>();
if (BulkOperationProvider != null) if (BulkOperationProvider != null)
{ {
await BulkOperationProvider.DeleteManyAsync(this, entities.ToArray(), dbContext.SessionHandle, autoSave, cancellationToken); await BulkOperationProvider.DeleteManyAsync(this, entities, dbContext.SessionHandle, autoSave, cancellationToken);
return; return;
} }
if (softDeletedEntities.Count > 0) if (softDeletedEntities.Count > 0)
{ {
UpdateResult updateResult; BulkWriteResult updateResult;
var softDeleteEntitiesCount = softDeletedEntities.Count;
var replaceRequests = new List<WriteModel<TEntity>>(
softDeletedEntities.Select(entity => new ReplaceOneModel<TEntity>(
CreateEntityFilter(entity.Key, true, entity.Value), entity.Key))
);
if (dbContext.SessionHandle != null) if (dbContext.SessionHandle != null)
{ {
updateResult = await collection.UpdateManyAsync( updateResult = await collection.BulkWriteAsync(dbContext.SessionHandle, replaceRequests, cancellationToken: cancellationToken);
dbContext.SessionHandle,
CreateEntitiesFilter(softDeletedEntities),
Builders<TEntity>.Update.Set(x => ((ISoftDelete)x).IsDeleted, true)
);
} }
else else
{ {
updateResult = await collection.UpdateManyAsync( updateResult = await collection.BulkWriteAsync(replaceRequests, cancellationToken: cancellationToken);
CreateEntitiesFilter(softDeletedEntities),
Builders<TEntity>.Update.Set(x => ((ISoftDelete)x).IsDeleted, true)
);
} }
if (updateResult.MatchedCount < softDeleteEntitiesCount) if (updateResult.MatchedCount < softDeletedEntities.Count)
{ {
ThrowOptimisticConcurrencyException(); ThrowOptimisticConcurrencyException();
} }
@ -406,14 +419,14 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
{ {
deleteResult = await collection.DeleteManyAsync( deleteResult = await collection.DeleteManyAsync(
dbContext.SessionHandle, dbContext.SessionHandle,
CreateEntitiesFilter(hardDeletedEntities) CreateEntitiesFilter(hardDeletedEntities),
); cancellationToken: cancellationToken);
} }
else else
{ {
deleteResult = await collection.DeleteManyAsync( deleteResult = await collection.DeleteManyAsync(
CreateEntitiesFilter(hardDeletedEntities) CreateEntitiesFilter(hardDeletedEntities),
); cancellationToken: cancellationToken);
} }
if (deleteResult.DeletedCount < hardDeletedEntitiesCount) if (deleteResult.DeletedCount < hardDeletedEntitiesCount)
@ -462,10 +475,7 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
.Where(predicate) .Where(predicate)
.ToListAsync(cancellationToken); .ToListAsync(cancellationToken);
foreach (var entity in entities) await DeleteManyAsync(entities, autoSave, cancellationToken);
{
await DeleteAsync(entity, autoSave, cancellationToken);
}
} }
[Obsolete("Use GetQueryableAsync method.")] [Obsolete("Use GetQueryableAsync method.")]
@ -484,9 +494,11 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
bool includeDetails = true, bool includeDetails = true,
CancellationToken cancellationToken = default) CancellationToken cancellationToken = default)
{ {
cancellationToken = GetCancellationToken(cancellationToken);
return await (await GetMongoQueryableAsync(cancellationToken)) return await (await GetMongoQueryableAsync(cancellationToken))
.Where(predicate) .Where(predicate)
.SingleOrDefaultAsync(GetCancellationToken(cancellationToken)); .SingleOrDefaultAsync(cancellationToken);
} }
[Obsolete("Use GetMongoQueryableAsync method.")] [Obsolete("Use GetMongoQueryableAsync method.")]
@ -501,6 +513,8 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
public async Task<IMongoQueryable<TEntity>> GetMongoQueryableAsync(CancellationToken cancellationToken = default) public async Task<IMongoQueryable<TEntity>> GetMongoQueryableAsync(CancellationToken cancellationToken = default)
{ {
cancellationToken = GetCancellationToken(cancellationToken);
var dbContext = await GetDbContextAsync(cancellationToken); var dbContext = await GetDbContextAsync(cancellationToken);
var collection = dbContext.Collection<TEntity>(); var collection = dbContext.Collection<TEntity>();
@ -513,6 +527,8 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
public async Task<IAggregateFluent<TEntity>> GetAggregateAsync(CancellationToken cancellationToken = default) public async Task<IAggregateFluent<TEntity>> GetAggregateAsync(CancellationToken cancellationToken = default)
{ {
cancellationToken = GetCancellationToken(cancellationToken);
var dbContext = await GetDbContextAsync(cancellationToken); var dbContext = await GetDbContextAsync(cancellationToken);
var collection = await GetCollectionAsync(cancellationToken); var collection = await GetCollectionAsync(cancellationToken);
@ -695,13 +711,13 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
[Obsolete("This method will be removed in future versions.")] [Obsolete("This method will be removed in future versions.")]
public IAsyncCursor<TEntity> ToCursor(CancellationToken cancellationToken = new CancellationToken()) public IAsyncCursor<TEntity> ToCursor(CancellationToken cancellationToken = new CancellationToken())
{ {
return GetMongoQueryable().ToCursor(cancellationToken); return GetMongoQueryable().ToCursor(GetCancellationToken(cancellationToken));
} }
[Obsolete("This method will be removed in future versions.")] [Obsolete("This method will be removed in future versions.")]
public Task<IAsyncCursor<TEntity>> ToCursorAsync(CancellationToken cancellationToken = new CancellationToken()) public Task<IAsyncCursor<TEntity>> ToCursorAsync(CancellationToken cancellationToken = new CancellationToken())
{ {
return GetMongoQueryable().ToCursorAsync(cancellationToken); return GetMongoQueryable().ToCursorAsync(GetCancellationToken(cancellationToken));
} }
} }
@ -724,7 +740,7 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
bool includeDetails = true, bool includeDetails = true,
CancellationToken cancellationToken = default) CancellationToken cancellationToken = default)
{ {
var entity = await FindAsync(id, includeDetails, cancellationToken); var entity = await FindAsync(id, includeDetails, GetCancellationToken(cancellationToken));
if (entity == null) if (entity == null)
{ {

@ -56,6 +56,23 @@ namespace Volo.Abp.TestApp.Testing
douglas.DeletionTime.ShouldNotBeNull(); douglas.DeletionTime.ShouldNotBeNull();
} }
} }
[Fact]
public async Task Should_Cancel_Deletion_For_Soft_Delete_Many_Entities_ById()
{
await PersonRepository.DeleteManyAsync(new []{ TestDataBuilder.UserDouglasId });
var douglas = await PersonRepository.FindAsync(TestDataBuilder.UserDouglasId);
douglas.ShouldBeNull();
using (DataFilter.Disable<ISoftDelete>())
{
douglas = await PersonRepository.FindAsync(TestDataBuilder.UserDouglasId);
douglas.ShouldNotBeNull();
douglas.IsDeleted.ShouldBeTrue();
douglas.DeletionTime.ShouldNotBeNull();
}
}
[Fact] [Fact]
public async Task Should_Handle_Deletion_On_Update_For_Soft_Delete_Entities() public async Task Should_Handle_Deletion_On_Update_For_Soft_Delete_Entities()

@ -62,6 +62,8 @@ namespace Volo.CmsKit.Admin.Tags
return TagAdminAppService.UpdateAsync(id, input); return TagAdminAppService.UpdateAsync(id, input);
} }
[HttpGet]
[Route("tag-definitions")]
public Task<List<TagDefinitionDto>> GetTagDefinitionsAsync() public Task<List<TagDefinitionDto>> GetTagDefinitionsAsync()
{ {
return TagAdminAppService.GetTagDefinitionsAsync(); return TagAdminAppService.GetTagDefinitionsAsync();

@ -154,6 +154,7 @@ export class ModalComponent implements OnDestroy {
} }
ngOnDestroy(): void { ngOnDestroy(): void {
this.toggle(false);
this.destroy$.next(); this.destroy$.next();
} }

@ -2,12 +2,12 @@
# yarn lockfile v1 # yarn lockfile v1
"@abp/ng.core@~4.2.0-rc.2": "@abp/ng.core@~4.2.0":
version "4.2.0-rc.2" version "4.2.0"
resolved "https://registry.yarnpkg.com/@abp/ng.core/-/ng.core-4.2.0-rc.2.tgz#d5ae888cd6beba0ab7cc92a9759e8f3b4095f5dc" resolved "https://registry.yarnpkg.com/@abp/ng.core/-/ng.core-4.2.0.tgz#cd6848291699b9bc60303c58162074d80a0c4428"
integrity sha512-uPsxulybSdGyBpR08d9XR3i/YdG/ILvo1Gzyz2wTOG/gay12hh/p83S50kWeBuPkh8uOiT3ezO9BY/GPVrRI+Q== integrity sha512-HhTpOeK5RdzlfK5zy5t7v68DDqNqAB75if6E4Lt2CwgY8pQUuY0EIzD0+AXhkC5+bjyULNHV2/HW3q/Fm75TVg==
dependencies: dependencies:
"@abp/utils" "^4.2.0-rc.1" "@abp/utils" "^4.2.0-rc.2"
"@angular/localize" "~10.0.10" "@angular/localize" "~10.0.10"
"@ngxs/store" "^3.7.0" "@ngxs/store" "^3.7.0"
angular-oauth2-oidc "^10.0.0" angular-oauth2-oidc "^10.0.0"
@ -17,35 +17,35 @@
ts-toolbelt "6.15.4" ts-toolbelt "6.15.4"
tslib "^2.0.0" tslib "^2.0.0"
"@abp/ng.feature-management@~4.2.0-rc.2": "@abp/ng.feature-management@~4.2.0":
version "4.2.0-rc.2" version "4.2.0"
resolved "https://registry.yarnpkg.com/@abp/ng.feature-management/-/ng.feature-management-4.2.0-rc.2.tgz#c0273a07f73d95e7133ec90c1facd5de51121430" resolved "https://registry.yarnpkg.com/@abp/ng.feature-management/-/ng.feature-management-4.2.0.tgz#2c89d64845533c23560325f806289c131457ced9"
integrity sha512-sGQfh0plQGtm3qCGYs1qmCtWt2EOwVgRyUcNd2ipzorH55S5/dX7or9dYKZofPz7GF55FohbfpxBqnKnBo0WOQ== integrity sha512-IftgAecb2bygNQhMCvQ6m6BxTq7eAvKE36jBZ1s72S658PtO9xx1LIjCql/QNKyu8YpI88Uc5OXZM8mJOVsYuw==
dependencies: dependencies:
"@abp/ng.theme.shared" "~4.2.0-rc.2" "@abp/ng.theme.shared" "~4.2.0"
tslib "^2.0.0" tslib "^2.0.0"
"@abp/ng.identity@~4.2.0-rc.2": "@abp/ng.identity@~4.2.0":
version "4.2.0-rc.2" version "4.2.0"
resolved "https://registry.yarnpkg.com/@abp/ng.identity/-/ng.identity-4.2.0-rc.2.tgz#fe20f05b60980561218f8357df55c00d85af8eb2" resolved "https://registry.yarnpkg.com/@abp/ng.identity/-/ng.identity-4.2.0.tgz#e6e321545a612b37f7f1ff8d0df43086319e77fa"
integrity sha512-zrY5oPhDq8lPcvDvxYM/hS5CtRj71Zlu04Slz4f+ljlStWHBOBZx1VVBl4OQvbDGxDGC04Pf2Sj3PtppEU28gw== integrity sha512-yNSxscWa9Po9H+7b7m94oAzMNLe360yJq9s/yw2EhEnkUTJ5bBbbrnSKK35NNRhziYp9V5CwYsW7uhjxQ3NGqQ==
dependencies: dependencies:
"@abp/ng.permission-management" "~4.2.0-rc.2" "@abp/ng.permission-management" "~4.2.0"
"@abp/ng.theme.shared" "~4.2.0-rc.2" "@abp/ng.theme.shared" "~4.2.0"
tslib "^2.0.0" tslib "^2.0.0"
"@abp/ng.permission-management@~4.2.0-rc.2": "@abp/ng.permission-management@~4.2.0":
version "4.2.0-rc.2" version "4.2.0"
resolved "https://registry.yarnpkg.com/@abp/ng.permission-management/-/ng.permission-management-4.2.0-rc.2.tgz#771285283bf3c82dcdd6a07ef444ada73b918d4a" resolved "https://registry.yarnpkg.com/@abp/ng.permission-management/-/ng.permission-management-4.2.0.tgz#ad2970796b8b1aecfcd5b0a0136c508a0e18e9d4"
integrity sha512-FSMSiXGhalTMZIJzQCS6fYRdFH2eVmk73aPeFn1NnMxNdhzCXfbsHpX/lVes+UMw7CddEEgriv0GQYi8dYMnDw== integrity sha512-wG26+7clnqll7d2+Uypd4xleA2DjpSkkctMOGai7EDaHqgVFDjfX3lZHtz/u7Xt9y9wHltGhqONjh/FuRkrgBA==
dependencies: dependencies:
"@abp/ng.theme.shared" "~4.2.0-rc.2" "@abp/ng.theme.shared" "~4.2.0"
tslib "^2.0.0" tslib "^2.0.0"
"@abp/ng.schematics@~4.2.0-rc.2": "@abp/ng.schematics@~4.2.0":
version "4.2.0-rc.2" version "4.2.0"
resolved "https://registry.yarnpkg.com/@abp/ng.schematics/-/ng.schematics-4.2.0-rc.2.tgz#93774148f57964c72498fa060c04eb99f6c3987d" resolved "https://registry.yarnpkg.com/@abp/ng.schematics/-/ng.schematics-4.2.0.tgz#db1a8ae787cf028452774a51cb62e784a1670e25"
integrity sha512-Ul/+nPTnGpNhi0NMfeYY9fDnsTVzVxP4iSIdqXevPxugeY6pqCefC84i0XHdkVsxIi1UR7VP84tqE9SCv7KnCw== integrity sha512-44bDoLRqDzcJ/X75KH1O0AoQev7zKh0IkAe4N7KQNgjgRiIuWe3h/SQPfqTSlZNT2ZYo/SZMZyX5Nv8OSKXydg==
dependencies: dependencies:
"@angular-devkit/core" "~11.0.2" "@angular-devkit/core" "~11.0.2"
"@angular-devkit/schematics" "~11.0.2" "@angular-devkit/schematics" "~11.0.2"
@ -53,37 +53,37 @@
jsonc-parser "^2.3.0" jsonc-parser "^2.3.0"
typescript "~3.9.2" typescript "~3.9.2"
"@abp/ng.setting-management@~4.2.0-rc.2": "@abp/ng.setting-management@~4.2.0":
version "4.2.0-rc.2" version "4.2.0"
resolved "https://registry.yarnpkg.com/@abp/ng.setting-management/-/ng.setting-management-4.2.0-rc.2.tgz#a7c5bb30e881f8efe702fcc8f3b95bf442b0289a" resolved "https://registry.yarnpkg.com/@abp/ng.setting-management/-/ng.setting-management-4.2.0.tgz#4a4b685ee74ac5030b7e9e73ee67110219df9065"
integrity sha512-5sOk19EzFBIIdeTAx6EEmgh2pYOj5oRXq6uuAOmGVzZiX7arFoyqvTR4OAypIBQdMlZ0Iv4EApvJLD6/1IIrqw== integrity sha512-Ldl+I2jWgMuQdMOnnOBIfk0OoTao5QN9zzQwCGMPgu7dOGjD8IT9h9CpkG4ROKw9YAT1R+P8QlQ6502jQWOMYQ==
dependencies: dependencies:
"@abp/ng.theme.shared" "~4.2.0-rc.2" "@abp/ng.theme.shared" "~4.2.0"
tslib "^2.0.0" tslib "^2.0.0"
"@abp/ng.tenant-management@~4.2.0-rc.2": "@abp/ng.tenant-management@~4.2.0":
version "4.2.0-rc.2" version "4.2.0"
resolved "https://registry.yarnpkg.com/@abp/ng.tenant-management/-/ng.tenant-management-4.2.0-rc.2.tgz#dc5c019f16ac679589dbeac85317628ec6682096" resolved "https://registry.yarnpkg.com/@abp/ng.tenant-management/-/ng.tenant-management-4.2.0.tgz#e42aa4b81036c653abcc0144b74c287587a4ec9f"
integrity sha512-O2Lb0Fe+L11yC69DAcgX4hY6KwI9ojaDnPTFxGtvvTjaUVKnxxchQrJwP0ITsudZe5cWKbF7cME3b3uH4jorBA== integrity sha512-EWfwKAH4wjA37xigikXzI+jTNGopV3WEP/ezQj1KO7pbW1peiTXwIPHN7GDc8MJ6f2olZki7kXypzmgJn9A6KQ==
dependencies: dependencies:
"@abp/ng.feature-management" "~4.2.0-rc.2" "@abp/ng.feature-management" "~4.2.0"
"@abp/ng.theme.shared" "~4.2.0-rc.2" "@abp/ng.theme.shared" "~4.2.0"
tslib "^2.0.0" tslib "^2.0.0"
"@abp/ng.theme.basic@~4.2.0-rc.2": "@abp/ng.theme.basic@~4.2.0":
version "4.2.0-rc.2" version "4.2.0"
resolved "https://registry.yarnpkg.com/@abp/ng.theme.basic/-/ng.theme.basic-4.2.0-rc.2.tgz#83c6ae4d0d95fc0271386a02c2f22531325c3b26" resolved "https://registry.yarnpkg.com/@abp/ng.theme.basic/-/ng.theme.basic-4.2.0.tgz#bc239a9c014cca926c80196eb751a40ceeb7446c"
integrity sha512-VGEDWIIRnmHPrhcjIhhBcqILI8NUsuVIX7K5XfJUuf3WmEzH9Ru9Yyi81AYZNuBNXNAjyjRH/nIxwljnHxO8bA== integrity sha512-xTy/AjuPujVNVb/cUenwRiKAS/BoYRR2Hh+AMksfgndIPMUEXYtJ8eSG+XOAtu0+QE/QI5RYk7FzcbfxDBeuvQ==
dependencies: dependencies:
"@abp/ng.theme.shared" "~4.2.0-rc.2" "@abp/ng.theme.shared" "~4.2.0"
tslib "^2.0.0" tslib "^2.0.0"
"@abp/ng.theme.shared@~4.2.0-rc.2": "@abp/ng.theme.shared@~4.2.0":
version "4.2.0-rc.2" version "4.2.0"
resolved "https://registry.yarnpkg.com/@abp/ng.theme.shared/-/ng.theme.shared-4.2.0-rc.2.tgz#935ca3aa32d8ced85d277139ce790f3cc3faa184" resolved "https://registry.yarnpkg.com/@abp/ng.theme.shared/-/ng.theme.shared-4.2.0.tgz#4b7925c61224d4d1b182c50e11ef915b50b78dda"
integrity sha512-UjYPd6KL3bO9PN9XEmBlKQSc0C3EJsLHhifoV+rgtqAHvortOygSHHknOthRA4PN+cg2/PiuWA5gpvMHP1K7Ow== integrity sha512-LfatA+lk/Wn6MOAZlHlJIiTH5uxqRWBl4QyWXhFrXhYYpJG4je06Y9KA3h+BP4dIQIe06gwAVYpE7D/ur3CbEQ==
dependencies: dependencies:
"@abp/ng.core" "~4.2.0-rc.2" "@abp/ng.core" "~4.2.0"
"@fortawesome/fontawesome-free" "^5.14.0" "@fortawesome/fontawesome-free" "^5.14.0"
"@ng-bootstrap/ng-bootstrap" "^7.0.0" "@ng-bootstrap/ng-bootstrap" "^7.0.0"
"@ngx-validate/core" "^0.0.13" "@ngx-validate/core" "^0.0.13"
@ -92,10 +92,10 @@
chart.js "^2.9.3" chart.js "^2.9.3"
tslib "^2.0.0" tslib "^2.0.0"
"@abp/utils@^4.2.0-rc.1": "@abp/utils@^4.2.0":
version "4.2.0-rc.1" version "4.2.0"
resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-4.2.0-rc.1.tgz#397615ec208150f46ae626b67ea71053750f612f" resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-4.2.0.tgz#073330e3e3f6ee61892f50260e48dbe1b05df35e"
integrity sha512-MkXq5pKf/ZzJJT9oHYgBlUOL5wTx03qdxJeD82nxwJx6w5JFdshBWKj5iJixE1aM5HnzwSGn7bxFqe5QOKST+Q== integrity sha512-75qR3SdiAa75wqleAx9sUMXLj4m9duuBo5+2sVv7Y29GcEyKUPvm8B1s6tksvSGA0e3vnFTHeVEc10eD1xKHSQ==
dependencies: dependencies:
just-compare "^1.3.0" just-compare "^1.3.0"

Loading…
Cancel
Save