From dc68fe77d78cf7f8ce3703758471d3cc4d8d3f06 Mon Sep 17 00:00:00 2001 From: maliming Date: Wed, 30 Nov 2022 11:53:55 +0800 Subject: [PATCH 001/179] Add abp headers to Dapr's `HttpClient`. --- .../Volo/Abp/Dapr/AbpDaprClientFactory.cs | 44 ++++++++++++++++++- 1 file changed, 42 insertions(+), 2 deletions(-) diff --git a/framework/src/Volo.Abp.Dapr/Volo/Abp/Dapr/AbpDaprClientFactory.cs b/framework/src/Volo.Abp.Dapr/Volo/Abp/Dapr/AbpDaprClientFactory.cs index aa14bbe7f2..b94c113fca 100644 --- a/framework/src/Volo.Abp.Dapr/Volo/Abp/Dapr/AbpDaprClientFactory.cs +++ b/framework/src/Volo.Abp.Dapr/Volo/Abp/Dapr/AbpDaprClientFactory.cs @@ -1,10 +1,14 @@ using System; +using System.Globalization; using System.Net.Http; +using System.Net.Http.Headers; using System.Text.Json; using Dapr.Client; using Microsoft.Extensions.Options; using Volo.Abp.DependencyInjection; using Volo.Abp.Json.SystemTextJson; +using Volo.Abp.MultiTenancy; +using Volo.Abp.Tracing; namespace Volo.Abp.Dapr; @@ -13,13 +17,21 @@ public class AbpDaprClientFactory : IAbpDaprClientFactory, ISingletonDependency protected AbpDaprOptions DaprOptions { get; } protected JsonSerializerOptions JsonSerializerOptions { get; } protected IDaprApiTokenProvider DaprApiTokenProvider { get; } + protected ICurrentTenant CurrentTenant { get; } + protected ICorrelationIdProvider CorrelationIdProvider { get; } + protected IOptions AbpCorrelationIdOptions { get; } public AbpDaprClientFactory( IOptions options, IOptions systemTextJsonSerializerOptions, - IDaprApiTokenProvider daprApiTokenProvider) + IDaprApiTokenProvider daprApiTokenProvider, + ICurrentTenant currentTenant, ICorrelationIdProvider correlationIdProvider, + IOptions abpCorrelationIdOptions) { DaprApiTokenProvider = daprApiTokenProvider; + CurrentTenant = currentTenant; + CorrelationIdProvider = correlationIdProvider; + AbpCorrelationIdOptions = abpCorrelationIdOptions; DaprOptions = options.Value; JsonSerializerOptions = CreateJsonSerializerOptions(systemTextJsonSerializerOptions.Value); } @@ -61,11 +73,39 @@ public class AbpDaprClientFactory : IAbpDaprClientFactory, ISingletonDependency daprEndpoint = DaprOptions.HttpEndpoint; } - return DaprClient.CreateInvokeHttpClient( + var httpClient = DaprClient.CreateInvokeHttpClient( appId, daprEndpoint, daprApiToken ?? DaprApiTokenProvider.GetDaprApiToken() ); + + AddHeaders(httpClient); + + return httpClient; + } + + protected virtual void AddHeaders(HttpClient httpClient) + { + //CorrelationId + httpClient.DefaultRequestHeaders.Add(AbpCorrelationIdOptions.Value.HttpHeaderName, CorrelationIdProvider.Get()); + + //TenantId + if (CurrentTenant.Id.HasValue) + { + //TODO: Use AbpAspNetCoreMultiTenancyOptions to get the key + httpClient.DefaultRequestHeaders.Add(TenantResolverConsts.DefaultTenantKey, CurrentTenant.Id.Value.ToString()); + } + + //Culture + //TODO: Is that the way we want? Couldn't send the culture (not ui culture) + var currentCulture = CultureInfo.CurrentUICulture.Name ?? CultureInfo.CurrentCulture.Name; + if (!currentCulture.IsNullOrEmpty()) + { + httpClient.DefaultRequestHeaders.AcceptLanguage.Add(new StringWithQualityHeaderValue(currentCulture)); + } + + //X-Requested-With + httpClient.DefaultRequestHeaders.Add("X-Requested-With", "XMLHttpRequest"); } protected virtual JsonSerializerOptions CreateJsonSerializerOptions(AbpSystemTextJsonSerializerOptions systemTextJsonSerializerOptions) From 52525b44eea18bcb9f4eeff1e3908f17595bc796 Mon Sep 17 00:00:00 2001 From: Mahmut Gundogdu Date: Wed, 4 Oct 2023 17:46:19 +0300 Subject: [PATCH 002/179] refactor(dtos.ts): improve generic type naming and ordering for better readability and consistency --- npm/ng-packs/packages/core/src/lib/models/dtos.ts | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/npm/ng-packs/packages/core/src/lib/models/dtos.ts b/npm/ng-packs/packages/core/src/lib/models/dtos.ts index ee1f03fab3..e86a06a060 100644 --- a/npm/ng-packs/packages/core/src/lib/models/dtos.ts +++ b/npm/ng-packs/packages/core/src/lib/models/dtos.ts @@ -114,14 +114,14 @@ export class CreationAuditedEntityDto extends EntityDto extends CreationAuditedEntityDto { creator?: TUserDto; constructor( - initialValues: Partial> = {}, + initialValues: Partial> = {}, ) { super(initialValues); } @@ -136,14 +136,15 @@ export class AuditedEntityDto extends CreationAuditedEntit } } + export class AuditedEntityWithUserDto< - TUserDto, TPrimaryKey = string, + TUserDto = any, > extends AuditedEntityDto { creator?: TUserDto; lastModifier?: TUserDto; - constructor(initialValues: Partial> = {}) { + constructor(initialValues: Partial> = {}) { super(initialValues); } } @@ -159,14 +160,14 @@ export class FullAuditedEntityDto extends AuditedEntityDto } export class FullAuditedEntityWithUserDto< - TUserDto, TPrimaryKey = string, + TUserDto = any > extends FullAuditedEntityDto { creator?: TUserDto; lastModifier?: TUserDto; deleter?: TUserDto; - constructor(initialValues: Partial> = {}) { + constructor(initialValues: Partial> = {}) { super(initialValues); } } From efc63f63c0c5e620295de415146291d5c01454c5 Mon Sep 17 00:00:00 2001 From: Mahmut Gundogdu Date: Wed, 11 Oct 2023 16:14:24 +0300 Subject: [PATCH 003/179] Add generic parser import method. Improve generic method, I can work with multiple generic params. --- .../src/tests/parse-generic-type.spec.ts | 129 ++++++++++++++++++ .../packages/schematics/src/utils/model.ts | 35 +++-- .../packages/schematics/src/utils/tree.ts | 31 ++++- 3 files changed, 185 insertions(+), 10 deletions(-) create mode 100644 npm/ng-packs/packages/schematics/src/tests/parse-generic-type.spec.ts diff --git a/npm/ng-packs/packages/schematics/src/tests/parse-generic-type.spec.ts b/npm/ng-packs/packages/schematics/src/tests/parse-generic-type.spec.ts new file mode 100644 index 0000000000..400fcdf6eb --- /dev/null +++ b/npm/ng-packs/packages/schematics/src/tests/parse-generic-type.spec.ts @@ -0,0 +1,129 @@ +import { parseBaseTypeWithGenericTypes } from '../utils/model'; +import { parseGenerics } from '../utils/tree'; + +import {test} from '@jest/globals'; + +const cases: Array<[string, string[]]> = [ + [ + 'Volo.Abp.Application.Dtos.AuditedEntityWithUserDto', + ['Volo.Abp.Application.Dtos.AuditedEntityWithUserDto'], + ], + [ + 'Volo.Abp.Application.Dtos.AuditedEntityWithUserDto', + ['Volo.Abp.Application.Dtos.AuditedEntityWithUserDto', 'Volo.Abp.Identity.IdentityUserDto'], + ], + [ + 'Volo.Abp.Application.Dtos.AuditedEntityWithUserDto', + [ + 'Volo.Abp.Application.Dtos.AuditedEntityWithUserDto', + 'string', + 'Volo.Abp.Identity.IdentityUserDto' + ], + ], + [ + 'Volo.Abp.Application.Dtos.AuditedEntityWithUserDto>', + [ + 'Volo.Abp.Application.Dtos.AuditedEntityWithUserDto', + 'string', + 'Volo.Abp.Identity.IdentityUserDto', + 'number', + ], + ], + [ + 'Volo.Abp.Application.Dtos.AuditedEntityWithUserDto>>', + [ + 'Volo.Abp.Application.Dtos.AuditedEntityWithUserDto', + 'string', + 'Volo.Abp.Identity.IdentityUserDto', + 'Volo.Abp.Core.Dummy', + 'System.String', + ], + ], + [ + 'AuditedEntityWithUserDto', + ['AuditedEntityWithUserDto'], + ], +]; + +test.each(cases)('should parse %s', (inputStr, expected) => { + const parsed = parseBaseTypeWithGenericTypes(inputStr); + expect(parsed).toEqual(expected); +}) + +describe('parseGenerics', () => { + + it('should work with simple type', function() { + const node = parseGenerics('System.String'); + expect(node.data).toEqual('System.String'); + expect(node.index).toBe(0); + expect(node.parent).toBe(null); + }); + it('should work with simple Array type', function() { + const node = parseGenerics('System.String[]'); + expect(node.data).toEqual('System.String[]'); + expect(node.index).toBe(0); + expect(node.parent).toBe(null); + }); + + it('should work with simple', function() { + const node = parseGenerics('Volo.Abp.Application.Dtos.AuditedEntityWithUserDto'); + expect(node.data).toEqual('Volo.Abp.Application.Dtos.AuditedEntityWithUserDto'); + expect(node.index).toBe(0); + expect(node.parent).toBe(null); + }); + + it('should work with `Volo.Abp.Application.Dtos.AuditedEntityWithUserDto`', function() { + const type = 'Volo.Abp.Application.Dtos.AuditedEntityWithUserDto'; + const node = parseGenerics(type); + + expect(node.data).toEqual('Volo.Abp.Application.Dtos.AuditedEntityWithUserDto'); + expect(node.children.length).toBe(1); + const child = node.children[0]; + expect(node.children[0].data).toEqual('Volo.Abp.Identity.IdentityUserDto'); + expect(child.parent).toBe(node); + }); + + + it('should work with `Volo.Abp.Application.Dtos.AuditedEntityWithUserDto`', function() { + const type = 'Volo.Abp.Application.Dtos.AuditedEntityWithUserDto'; + const node = parseGenerics(type); + + expect(node.data).toEqual('Volo.Abp.Application.Dtos.AuditedEntityWithUserDto'); + expect(node.children.length).toBe(2); + expect(node.children[0].data).toEqual('System.string'); + expect(node.children[0].index).toBe(0) + expect(node.children[1].data).toEqual('Volo.Abp.Identity.IdentityUserDto'); + expect(node.children[1].index).toBe(1); + + }); + it('should Volo.Abp.Application.Dtos.AuditedEntityWithUserDto>', function() { + const type = 'Volo.Abp.Application.Dtos.AuditedEntityWithUserDto>'; + const node = parseGenerics(type); + expect(node.data).toEqual('Volo.Abp.Application.Dtos.AuditedEntityWithUserDto'); + expect(node.children.length).toBe(2); + expect(node.children[0].data).toEqual('System.string'); + expect((node.children[0]).parent).toBe(node); + + expect(node.children[1].data).toEqual('Volo.Abp.Identity.IdentityUserDto'); + expect(node.children[1].children.length).toBe(1); + expect(node.children[1].children[0].data).toEqual('System.Int'); + expect(node.children[1].children[0].parent).toBe(node.children[1]) + expect(node.children[1].children[0].index).toBe(0) + + }); + + it('should Volo.Abp.Application.Dtos.AuditedEntityWithUserDto,System.string>', function() { + const type = 'Volo.Abp.Application.Dtos.AuditedEntityWithUserDto,System.string>'; + const node = parseGenerics(type); + expect(node.data).toEqual('Volo.Abp.Application.Dtos.AuditedEntityWithUserDto'); + expect(node.children.length).toBe(2); + expect(node.children[0].data).toEqual('Volo.Abp.Identity.IdentityUserDto'); + expect(node.children[0].children.length).toBe(1); + expect(node.children[0].children[0].data).toEqual('System.Int'); + expect(node.children[1].data).toEqual('System.string'); + + }); +}); + + + diff --git a/npm/ng-packs/packages/schematics/src/utils/model.ts b/npm/ng-packs/packages/schematics/src/utils/model.ts index 4ef8a4cb97..11ff88d15a 100644 --- a/npm/ng-packs/packages/schematics/src/utils/model.ts +++ b/npm/ng-packs/packages/schematics/src/utils/model.ts @@ -9,7 +9,7 @@ import { import { parseNamespace } from './namespace'; import { relativePathToModel } from './path'; import { camel } from './text'; -import { parseGenerics } from './tree'; +import { parseGenerics, TypeNode } from './tree'; import { createTypeParser, createTypeSimplifier, @@ -71,12 +71,16 @@ export function createImportRefsToModelReducer(params: ModelGeneratorParams) { model.interfaces.forEach(_interface => { const { baseType } = types[_interface.ref]; - if (baseType && parseNamespace(solution, baseType) !== model.namespace) - toBeImported.push({ - type: baseType.split('<')[0], - isEnum: false, - }); + if (baseType && parseNamespace(solution, baseType) !== model.namespace){ + const baseTypeWithGenericParams = parseBaseTypeWithGenericTypes(baseType); + baseTypeWithGenericParams.forEach(t => { + toBeImported.push({ + type: t, + isEnum: false, + }); + }) +} [..._interface.properties, ..._interface.generics].forEach(prop => { prop.refs.forEach(ref => { const propType = types[ref]; @@ -172,7 +176,20 @@ export function createRefToImportReducerCreator(params: ModelGeneratorParams) { } function isOptionalProperty(prop: PropertyDef) { - return ( - prop.typeSimple.endsWith('?') || (prop.typeSimple === 'string' && prop.isRequired === false) - ); + return (prop.typeSimple.endsWith('?') || (prop.typeSimple === 'string' && !prop.isRequired)); +} + +export function parseBaseTypeWithGenericTypes(type: string): string[] { + const parsedTypeNode = parseGenerics(type); + const nodeToText = (node: TypeNode,acc:string[] = []): string[] => { + + acc.push(node.data); + if(node.children && node.children.length > 0){ + node.children.forEach(child => { + nodeToText(child,acc); + }) + } + return acc; + } + return nodeToText(parsedTypeNode); } diff --git a/npm/ng-packs/packages/schematics/src/utils/tree.ts b/npm/ng-packs/packages/schematics/src/utils/tree.ts index 5fd8414f0c..489e0229fc 100644 --- a/npm/ng-packs/packages/schematics/src/utils/tree.ts +++ b/npm/ng-packs/packages/schematics/src/utils/tree.ts @@ -39,7 +39,7 @@ export class TypeNode { } } -export function parseGenerics(type: string, mapperFn?: TypeNodeMapperFn) { +export function parseGenericsOld(type: string, mapperFn?: TypeNodeMapperFn) { const [rootType, ...types] = type.split('<'); const root = new TypeNode(rootType, null, mapperFn); @@ -68,4 +68,33 @@ export function parseGenerics(type: string, mapperFn?: TypeNodeMapperFn) { return root; } +export function parseGenerics(type: string, mapperFn?: TypeNodeMapperFn, parent?: TypeNode | null): TypeNode { + const regex = /(?[\w.]+)<(?.*)>/; + + const match = type.match(regex); + if (!match) { + return new TypeNode(type, null, mapperFn); + } + + const mainType = match.groups?.MainType || ''; + const genericType = match.groups?.GenericType || ''; + const root = new TypeNode(mainType, parent ?? null, mapperFn); + if (genericType.includes(',')) { + const genericTypes = genericType.split(','); + genericTypes.forEach((genericType, index) => { + const child = parseGenerics(genericType, mapperFn, root); + child.index = index; + root.children.push(child); + child.parent = root; + }); + } else { + const child = parseGenerics(genericType, mapperFn, root); + child.index = root.children.length; + root.children.push(child); + child.parent = root; + } + return root; +} + + export type TypeNodeMapperFn = (node: TypeNode) => string; From a6105b38688561960b0d5c98ec487a33b2d3bcd6 Mon Sep 17 00:00:00 2001 From: Mahmut Gundogdu Date: Thu, 12 Oct 2023 10:36:42 +0300 Subject: [PATCH 004/179] Marked deprecated classed --- npm/ng-packs/packages/core/src/lib/models/dtos.ts | 3 ++- npm/ng-packs/packages/core/src/lib/utils/file-utils.ts | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/npm/ng-packs/packages/core/src/lib/models/dtos.ts b/npm/ng-packs/packages/core/src/lib/models/dtos.ts index ee1f03fab3..aa20a65833 100644 --- a/npm/ng-packs/packages/core/src/lib/models/dtos.ts +++ b/npm/ng-packs/packages/core/src/lib/models/dtos.ts @@ -136,6 +136,7 @@ export class AuditedEntityDto extends CreationAuditedEntit } } +/** @deprecated the class signature will change in v8.0 */ export class AuditedEntityWithUserDto< TUserDto, TPrimaryKey = string, @@ -157,7 +158,7 @@ export class FullAuditedEntityDto extends AuditedEntityDto super(initialValues); } } - +/** @deprecated the class signature will change in v8.0 */ export class FullAuditedEntityWithUserDto< TUserDto, TPrimaryKey = string, diff --git a/npm/ng-packs/packages/core/src/lib/utils/file-utils.ts b/npm/ng-packs/packages/core/src/lib/utils/file-utils.ts index b5241ec096..71bbdd9600 100644 --- a/npm/ng-packs/packages/core/src/lib/utils/file-utils.ts +++ b/npm/ng-packs/packages/core/src/lib/utils/file-utils.ts @@ -1,3 +1,4 @@ +/** @deprecated the method will change in v8.0 */ export function downloadBlob(blob: Blob, filename: string) { const blobUrl = URL.createObjectURL(blob); From 344fca116c847ee733488603286b01def5c406e5 Mon Sep 17 00:00:00 2001 From: Sinan997 Date: Mon, 16 Oct 2023 14:13:47 +0300 Subject: [PATCH 005/179] remove --- .../src/lib/components/empty-layout/empty-layout.component.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/npm/ng-packs/packages/theme-basic/src/lib/components/empty-layout/empty-layout.component.ts b/npm/ng-packs/packages/theme-basic/src/lib/components/empty-layout/empty-layout.component.ts index f961ecc321..b9a78ba06d 100644 --- a/npm/ng-packs/packages/theme-basic/src/lib/components/empty-layout/empty-layout.component.ts +++ b/npm/ng-packs/packages/theme-basic/src/lib/components/empty-layout/empty-layout.component.ts @@ -5,7 +5,6 @@ import { eLayoutType } from '@abp/ng.core'; selector: 'abp-layout-empty', template: ` - `, }) export class EmptyLayoutComponent { From 300c05fc2ebd5dcdc6da7a6325b322157ca152e5 Mon Sep 17 00:00:00 2001 From: maliming Date: Tue, 17 Oct 2023 17:43:27 +0800 Subject: [PATCH 006/179] Add CDN support for bundles. --- .../UI/Bundling/BundleConfigurationContext.cs | 4 +- .../Bundling/BundleConfigurationExtensions.cs | 7 +++ .../BundleContributorCollectionExtensions.cs | 4 ++ .../AspNetCore/Mvc/UI/Bundling/BundleFile.cs | 14 +++++ .../Mvc/UI/Bundling/BundleFileContributor.cs | 14 +++-- .../UI/Bundling/BundleFileListExtensions.cs | 32 +++++++++++ .../Bundling/IBundleConfigurationContext.cs | 2 +- .../Mvc/UI/Bundling/BundleCacheItem.cs | 4 +- .../Mvc/UI/Bundling/BundleManager.cs | 54 +++++++++++++++---- .../Mvc/UI/Bundling/IBundleManager.cs | 4 +- .../TagHelpers/AbpTagHelperResourceService.cs | 34 +++++++----- .../TagHelpers/AbpTagHelperScriptService.cs | 11 ++-- .../TagHelpers/AbpTagHelperStyleService.cs | 16 +++--- .../Mvc/UI/Resources/IWebRequestResources.cs | 3 +- .../Mvc/UI/Resources/WebRequestResources.cs | 7 +-- 15 files changed, 161 insertions(+), 49 deletions(-) create mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleFile.cs create mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleFileListExtensions.cs diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleConfigurationContext.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleConfigurationContext.cs index b67c8f6d3d..bc4dc14d11 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleConfigurationContext.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleConfigurationContext.cs @@ -8,7 +8,7 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling; public class BundleConfigurationContext : IBundleConfigurationContext { - public List Files { get; } + public List Files { get; } public IFileProvider FileProvider { get; } @@ -18,7 +18,7 @@ public class BundleConfigurationContext : IBundleConfigurationContext public BundleConfigurationContext(IServiceProvider serviceProvider, IFileProvider fileProvider) { - Files = new List(); + Files = new List(); ServiceProvider = serviceProvider; LazyServiceProvider = ServiceProvider.GetRequiredService(); FileProvider = fileProvider; diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleConfigurationExtensions.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleConfigurationExtensions.cs index 3ee0fe6cd9..ca628f4d67 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleConfigurationExtensions.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleConfigurationExtensions.cs @@ -1,4 +1,5 @@ using System; +using System.Linq; namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling; @@ -10,6 +11,12 @@ public static class BundleConfigurationExtensions return bundleConfiguration; } + public static BundleConfiguration AddCdnFiles(this BundleConfiguration bundleConfiguration, params string[] files) + { + bundleConfiguration.Contributors.AddCdnFiles(files.Select(x => new BundleFile(x, true)).ToArray()); + return bundleConfiguration; + } + public static BundleConfiguration AddContributors(this BundleConfiguration bundleConfiguration, params IBundleContributor[] contributors) { Check.NotNull(contributors, nameof(contributors)); diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleContributorCollectionExtensions.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleContributorCollectionExtensions.cs index dc0ac8bfbb..3c0dfdeab8 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleContributorCollectionExtensions.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleContributorCollectionExtensions.cs @@ -6,4 +6,8 @@ public static class BundleContributorCollectionExtensions { contributors.Add(new BundleFileContributor(files)); } + public static void AddCdnFiles(this BundleContributorCollection contributors, params BundleFile[] files) + { + contributors.Add(new BundleFileContributor(files)); + } } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleFile.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleFile.cs new file mode 100644 index 0000000000..58427b6c40 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleFile.cs @@ -0,0 +1,14 @@ +namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling; + +public class BundleFile +{ + public string File { get; set; } + + public bool IsCdn { get; set; } + + public BundleFile(string file, bool isCdn = false) + { + File = file; + IsCdn = isCdn; + } +} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleFileContributor.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleFileContributor.cs index 7f218e7fbf..5107c006a0 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleFileContributor.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleFileContributor.cs @@ -1,22 +1,30 @@ using System; using System.Collections.Generic; +using System.Linq; namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling; public class BundleFileContributor : BundleContributor { - public string[] Files { get; } + public List Files { get; } + + public BundleFileContributor(params BundleFile[] files) + { + Files = new List(); + Files.AddRange(files); + } public BundleFileContributor(params string[] files) { - Files = files ?? Array.Empty(); + Files = new List(); + Files.AddRange(files.Select(file => new BundleFile(file))); } public override void ConfigureBundle(BundleConfigurationContext context) { foreach (var file in Files) { - context.Files.AddIfNotContains(x => x.Equals(file, StringComparison.OrdinalIgnoreCase), () => file); + context.Files.AddIfNotContains(x => x.File.Equals(file.File, StringComparison.OrdinalIgnoreCase), () => file); } } } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleFileListExtensions.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleFileListExtensions.cs new file mode 100644 index 0000000000..b3088b293d --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleFileListExtensions.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling; + +/// +/// This class is used to compatible with old code. +/// +public static class BundleFileListExtensions +{ + public static void Add(this List bundleFiles, params string[] files) + { + bundleFiles.AddRange(files.Select(file => new BundleFile(file))); + } + + public static void AddRange(this List bundleFiles, params string[] files) + { + bundleFiles.AddRange(files.Select(file => new BundleFile(file))); + } + + public static void AddIfNotContains(this List bundleFiles, params string[] files) + { + foreach (var file in files) + { + if (!bundleFiles.Any(x => x.File.Equals(file, StringComparison.OrdinalIgnoreCase))) + { + bundleFiles.Add(new BundleFile(file)); + } + } + } +} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/IBundleConfigurationContext.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/IBundleConfigurationContext.cs index 61d772d638..96df341514 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/IBundleConfigurationContext.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/IBundleConfigurationContext.cs @@ -5,5 +5,5 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling; public interface IBundleConfigurationContext : IServiceProviderAccessor { - List Files { get; } + List Files { get; } } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleCacheItem.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleCacheItem.cs index 5c3890a852..f6830cbd74 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleCacheItem.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleCacheItem.cs @@ -5,11 +5,11 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling; public class BundleCacheItem { - public List Files { get; } + public List Files { get; } public List WatchDisposeHandles { get; } - public BundleCacheItem(List files) + public BundleCacheItem(List files) { Files = files; WatchDisposeHandles = new List(); diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleManager.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleManager.cs index 8291c2c75f..5a46e1ff5a 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleManager.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleManager.cs @@ -12,7 +12,6 @@ using Microsoft.Extensions.Options; using Volo.Abp.AspNetCore.Mvc.UI.Bundling.Scripts; using Volo.Abp.AspNetCore.Mvc.UI.Bundling.Styles; using Volo.Abp.AspNetCore.Mvc.UI.Resources; -using Volo.Abp.AspNetCore.VirtualFileSystem; using Volo.Abp.DependencyInjection; using Volo.Abp.VirtualFileSystem; @@ -56,19 +55,22 @@ public class BundleManager : IBundleManager, ITransientDependency Logger = NullLogger.Instance; } - public virtual async Task> GetStyleBundleFilesAsync(string bundleName) + public virtual async Task> GetStyleBundleFilesAsync(string bundleName) { return await GetBundleFilesAsync(Options.StyleBundles, bundleName, StyleBundler); } - public virtual async Task> GetScriptBundleFilesAsync(string bundleName) + public virtual async Task> GetScriptBundleFilesAsync(string bundleName) { return await GetBundleFilesAsync(Options.ScriptBundles, bundleName, ScriptBundler); } - protected virtual async Task> GetBundleFilesAsync(BundleConfigurationCollection bundles, string bundleName, IBundler bundler) + protected virtual async Task> GetBundleFilesAsync(BundleConfigurationCollection bundles, string bundleName, IBundler bundler) { + var result = new List(); + var contributors = GetContributors(bundles, bundleName); + var bundleFiles = RequestResources.TryAdd(await GetBundleFilesAsync(contributors)); var dynamicResources = RequestResources.TryAdd(await GetDynamicResourcesAsync(contributors)); @@ -77,16 +79,48 @@ public class BundleManager : IBundleManager, ITransientDependency return bundleFiles.Union(dynamicResources).ToImmutableList(); } + var localBundleFiles = new List(); + foreach (var bundleFile in bundleFiles) + { + if (bundleFile.IsCdn) + { + if (localBundleFiles.Any()) + { + var cacheItem = AddToBundleCache(bundleName, bundler, localBundleFiles); + result.AddRange(cacheItem.Files); + localBundleFiles.Clear(); + } + + result.Add(bundleFile); + } + else + { + localBundleFiles.Add(bundleFile.File); + } + } + + if (localBundleFiles.Any()) + { + var cacheItem = AddToBundleCache(bundleName, bundler, localBundleFiles); + result.AddRange(cacheItem.Files); + localBundleFiles.Clear(); + } + + return result.Union(dynamicResources).ToImmutableList(); + } + + private BundleCacheItem AddToBundleCache(string bundleName, IBundler bundler, List bundleFiles) + { var bundleRelativePath = Options.BundleFolderName.EnsureEndsWith('/') + bundleName + "." + bundleFiles.JoinAsString("|").ToMd5() + "." + bundler.FileExtension; - var cacheItem = BundleCache.GetOrAdd(bundleRelativePath, () => + return BundleCache.GetOrAdd(bundleRelativePath, () => { var cacheValue = new BundleCacheItem( - new List + new List { - "/" + bundleRelativePath + new BundleFile("/" + bundleRelativePath) } ); @@ -104,8 +138,6 @@ public class BundleManager : IBundleManager, ITransientDependency return cacheValue; }); - - return cacheItem.Files.Union(dynamicResources).ToImmutableList(); } private void WatchChanges(BundleCacheItem cacheValue, List files, string bundleRelativePath) @@ -176,7 +208,7 @@ public class BundleManager : IBundleManager, ITransientDependency } } - protected async Task> GetBundleFilesAsync(List contributors) + protected async Task> GetBundleFilesAsync(List contributors) { var context = CreateBundleConfigurationContext(); @@ -198,7 +230,7 @@ public class BundleManager : IBundleManager, ITransientDependency return context.Files; } - protected virtual async Task> GetDynamicResourcesAsync(List contributors) + protected virtual async Task> GetDynamicResourcesAsync(List contributors) { var context = CreateBundleConfigurationContext(); diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/IBundleManager.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/IBundleManager.cs index b4ce56cb62..067554e102 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/IBundleManager.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/IBundleManager.cs @@ -5,7 +5,7 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling; public interface IBundleManager { - Task> GetStyleBundleFilesAsync(string bundleName); + Task> GetStyleBundleFilesAsync(string bundleName); - Task> GetScriptBundleFilesAsync(string bundleName); + Task> GetScriptBundleFilesAsync(string bundleName); } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpTagHelperResourceService.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpTagHelperResourceService.cs index a247022674..1926cb48cf 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpTagHelperResourceService.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpTagHelperResourceService.cs @@ -3,10 +3,12 @@ using Microsoft.AspNetCore.Razor.TagHelpers; using System; using System.Collections.Generic; using System.Diagnostics; +using System.IO; using System.Text.Encodings.Web; using System.Threading.Tasks; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Mvc.Rendering; +using Microsoft.Extensions.FileProviders; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; @@ -63,18 +65,24 @@ public abstract class AbpTagHelperResourceService : ITransientDependency foreach (var bundleFile in bundleFiles) { - var file = HostingEnvironment.WebRootFileProvider.GetFileInfo(bundleFile); - - if (file == null || !file.Exists) + if (bundleFile.IsCdn) { - Logger.LogError($"Could not find the bundle file '{bundleFile}' for the bundle '{bundleName}'!"); - AddErrorScript(viewContext, tagHelper, context, output, bundleFile, bundleName!); - continue; + AddHtmlTag(viewContext, tagHelper, context, output, bundleFile, null); } - - if (file.Length > 0) + else { - AddHtmlTag(viewContext, tagHelper, context, output, bundleFile + "?_v=" + file.LastModified.UtcTicks); + var file = HostingEnvironment.WebRootFileProvider.GetFileInfo(bundleFile.File); + if (file == null || !file.Exists) + { + Logger.LogError($"Could not find the bundle file '{bundleFile.File}' for the bundle '{bundleName}'!"); + AddErrorScript(viewContext, tagHelper, context, output, bundleFile, bundleName!); + continue; + } + + if (file.Length > 0) + { + AddHtmlTag(viewContext, tagHelper, context, output, bundleFile, file); + } } } @@ -84,13 +92,13 @@ public abstract class AbpTagHelperResourceService : ITransientDependency protected abstract void CreateBundle(string bundleName, List bundleItems); - protected abstract Task> GetBundleFilesAsync(string bundleName); + protected abstract Task> GetBundleFilesAsync(string bundleName); - protected abstract void AddHtmlTag(ViewContext viewContext, TagHelper tagHelper, TagHelperContext context, TagHelperOutput output, string file); + protected abstract void AddHtmlTag(ViewContext viewContext, TagHelper tagHelper, TagHelperContext context, TagHelperOutput output, BundleFile file, IFileInfo? fileInfo = null); - protected virtual void AddErrorScript(ViewContext viewContext, TagHelper tagHelper, TagHelperContext context, TagHelperOutput output, string file, string bundleName) + protected virtual void AddErrorScript(ViewContext viewContext, TagHelper tagHelper, TagHelperContext context, TagHelperOutput output, BundleFile file, string bundleName) { - output.Content.AppendHtml($"{Environment.NewLine}"); + output.Content.AppendHtml($"{Environment.NewLine}"); } protected virtual string GenerateBundleName(List bundleItems) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpTagHelperScriptService.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpTagHelperScriptService.cs index 260f28f812..ec6ed2c99c 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpTagHelperScriptService.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpTagHelperScriptService.cs @@ -6,6 +6,7 @@ using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Mvc.Rendering; using Microsoft.AspNetCore.Mvc.ViewFeatures; using Microsoft.AspNetCore.Razor.TagHelpers; +using Microsoft.Extensions.FileProviders; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Options; @@ -32,12 +33,12 @@ public class AbpTagHelperScriptService : AbpTagHelperResourceService ); } - protected override async Task> GetBundleFilesAsync(string bundleName) + protected override async Task> GetBundleFilesAsync(string bundleName) { return await BundleManager.GetScriptBundleFilesAsync(bundleName); } - protected override void AddHtmlTag(ViewContext viewContext, TagHelper tagHelper, TagHelperContext context, TagHelperOutput output, string file) + protected override void AddHtmlTag(ViewContext viewContext, TagHelper tagHelper, TagHelperContext context, TagHelperOutput output, BundleFile file, IFileInfo? fileInfo = null) { var defer = tagHelper switch { @@ -46,12 +47,14 @@ public class AbpTagHelperScriptService : AbpTagHelperResourceService _ => false }; - var deferText = (defer || Options.DeferScriptsByDefault || Options.DeferScripts.Any(x => file.StartsWith(x, StringComparison.OrdinalIgnoreCase))) + var deferText = (defer || Options.DeferScriptsByDefault || Options.DeferScripts.Any(x => file.File.StartsWith(x, StringComparison.OrdinalIgnoreCase))) ? "defer" : string.Empty; var nonceText = (viewContext.HttpContext.Items.TryGetValue(AbpAspNetCoreConsts.ScriptNonceKey, out var nonce) && nonce is string nonceString && !string.IsNullOrEmpty(nonceString)) ? $"nonce=\"{nonceString}\"" : string.Empty; - output.Content.AppendHtml($"{Environment.NewLine}"); + + var src = file.IsCdn ? file.File : viewContext.GetUrlHelper().Content((file.File + "?_v=" + fileInfo!.LastModified.UtcTicks).EnsureStartsWith('~')); + output.Content.AppendHtml($"{Environment.NewLine}"); } } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpTagHelperStyleService.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpTagHelperStyleService.cs index 0f68433f4c..a43221841e 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpTagHelperStyleService.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpTagHelperStyleService.cs @@ -6,6 +6,7 @@ using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Mvc.Rendering; using Microsoft.AspNetCore.Mvc.ViewFeatures; using Microsoft.AspNetCore.Razor.TagHelpers; +using Microsoft.Extensions.FileProviders; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Options; using Volo.Abp.AspNetCore.Security; @@ -18,7 +19,7 @@ public class AbpTagHelperStyleService : AbpTagHelperResourceService public AbpTagHelperStyleService( IBundleManager bundleManager, IOptions options, - IWebHostEnvironment hostingEnvironment, + IWebHostEnvironment hostingEnvironment, IOptions securityHeadersOptions) : base( bundleManager, options, @@ -36,12 +37,12 @@ public class AbpTagHelperStyleService : AbpTagHelperResourceService ); } - protected override async Task> GetBundleFilesAsync(string bundleName) + protected override async Task> GetBundleFilesAsync(string bundleName) { return await BundleManager.GetStyleBundleFilesAsync(bundleName); } - protected override void AddHtmlTag(ViewContext viewContext, TagHelper tagHelper, TagHelperContext context, TagHelperOutput output, string file) + protected override void AddHtmlTag(ViewContext viewContext, TagHelper tagHelper, TagHelperContext context, TagHelperOutput output, BundleFile file, IFileInfo? fileInfo = null) { var preload = tagHelper switch { @@ -50,15 +51,16 @@ public class AbpTagHelperStyleService : AbpTagHelperResourceService _ => false }; - if (preload || Options.PreloadStylesByDefault || Options.PreloadStyles.Any(x => file.StartsWith(x, StringComparison.OrdinalIgnoreCase))) + var href = file.IsCdn ? file.File : viewContext.GetUrlHelper().Content((file.File + "?_v=" + fileInfo!.LastModified.UtcTicks).EnsureStartsWith('~')); + if (preload || Options.PreloadStylesByDefault || Options.PreloadStyles.Any(x => file.File.StartsWith(x, StringComparison.OrdinalIgnoreCase))) { output.Content.AppendHtml(SecurityHeadersOptions.UseContentSecurityPolicyScriptNonce - ? $"{Environment.NewLine}" - : $"{Environment.NewLine}"); + ? $"{Environment.NewLine}" + : $"{Environment.NewLine}"); } else { - output.Content.AppendHtml($"{Environment.NewLine}"); + output.Content.AppendHtml($"{Environment.NewLine}"); } } } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Resources/IWebRequestResources.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Resources/IWebRequestResources.cs index 2eefbcc0dd..9479dec8ce 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Resources/IWebRequestResources.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Resources/IWebRequestResources.cs @@ -1,8 +1,9 @@ using System.Collections.Generic; +using Volo.Abp.AspNetCore.Mvc.UI.Bundling; namespace Volo.Abp.AspNetCore.Mvc.UI.Resources; public interface IWebRequestResources { - List TryAdd(List resources); + List TryAdd(List resources); } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Resources/WebRequestResources.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Resources/WebRequestResources.cs index 3e046499ab..e68b671fc6 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Resources/WebRequestResources.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Resources/WebRequestResources.cs @@ -1,23 +1,24 @@ using System.Collections.Generic; using System.Linq; using Microsoft.AspNetCore.Http; +using Volo.Abp.AspNetCore.Mvc.UI.Bundling; using Volo.Abp.DependencyInjection; namespace Volo.Abp.AspNetCore.Mvc.UI.Resources; public class WebRequestResources : IWebRequestResources, IScopedDependency { - protected Dictionary> Resources { get; } + protected Dictionary> Resources { get; } protected IHttpContextAccessor HttpContextAccessor { get; } public WebRequestResources(IHttpContextAccessor httpContextAccessor) { HttpContextAccessor = httpContextAccessor; - Resources = new Dictionary>(); + Resources = new Dictionary>(); } - public List TryAdd(List resources) + public List TryAdd(List resources) { var path = HttpContextAccessor.HttpContext?.Request?.Path ?? ""; From aa1d939200f79993f23f17f148e15e22e1c8ae6b Mon Sep 17 00:00:00 2001 From: maliming Date: Tue, 17 Oct 2023 20:12:06 +0800 Subject: [PATCH 007/179] Some minor improvements. --- .../Mvc/UI/Bundling/BundleManager.cs | 28 ++++++++----------- .../TagHelpers/AbpTagHelperScriptService.cs | 7 ++--- 2 files changed, 15 insertions(+), 20 deletions(-) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleManager.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleManager.cs index 5a46e1ff5a..fb7b3cd489 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleManager.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleManager.cs @@ -67,10 +67,9 @@ public class BundleManager : IBundleManager, ITransientDependency protected virtual async Task> GetBundleFilesAsync(BundleConfigurationCollection bundles, string bundleName, IBundler bundler) { - var result = new List(); + var files = new List(); var contributors = GetContributors(bundles, bundleName); - var bundleFiles = RequestResources.TryAdd(await GetBundleFilesAsync(contributors)); var dynamicResources = RequestResources.TryAdd(await GetDynamicResourcesAsync(contributors)); @@ -82,31 +81,28 @@ public class BundleManager : IBundleManager, ITransientDependency var localBundleFiles = new List(); foreach (var bundleFile in bundleFiles) { - if (bundleFile.IsCdn) + if (!bundleFile.IsCdn) + { + localBundleFiles.Add(bundleFile.File); + } + else { - if (localBundleFiles.Any()) + if (localBundleFiles.Count != 0) { - var cacheItem = AddToBundleCache(bundleName, bundler, localBundleFiles); - result.AddRange(cacheItem.Files); + files.AddRange(AddToBundleCache(bundleName, bundler, localBundleFiles).Files); localBundleFiles.Clear(); } - result.Add(bundleFile); - } - else - { - localBundleFiles.Add(bundleFile.File); + files.Add(bundleFile); } } - if (localBundleFiles.Any()) + if (localBundleFiles.Count != 0) { - var cacheItem = AddToBundleCache(bundleName, bundler, localBundleFiles); - result.AddRange(cacheItem.Files); - localBundleFiles.Clear(); + files.AddRange(AddToBundleCache(bundleName, bundler, localBundleFiles).Files); } - return result.Union(dynamicResources).ToImmutableList(); + return files.Union(dynamicResources).ToImmutableList(); } private BundleCacheItem AddToBundleCache(string bundleName, IBundler bundler, List bundleFiles) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpTagHelperScriptService.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpTagHelperScriptService.cs index ec6ed2c99c..3ff8e05552 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpTagHelperScriptService.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpTagHelperScriptService.cs @@ -48,13 +48,12 @@ public class AbpTagHelperScriptService : AbpTagHelperResourceService }; var deferText = (defer || Options.DeferScriptsByDefault || Options.DeferScripts.Any(x => file.File.StartsWith(x, StringComparison.OrdinalIgnoreCase))) - ? "defer" + ? "defer " : string.Empty; var nonceText = (viewContext.HttpContext.Items.TryGetValue(AbpAspNetCoreConsts.ScriptNonceKey, out var nonce) && nonce is string nonceString && !string.IsNullOrEmpty(nonceString)) - ? $"nonce=\"{nonceString}\"" + ? $"nonce=\"{nonceString}\" " : string.Empty; - var src = file.IsCdn ? file.File : viewContext.GetUrlHelper().Content((file.File + "?_v=" + fileInfo!.LastModified.UtcTicks).EnsureStartsWith('~')); - output.Content.AppendHtml($"{Environment.NewLine}"); + output.Content.AppendHtml($"{Environment.NewLine}"); } } From 519b300ef2fde8e78c39cd4147c095590363c137 Mon Sep 17 00:00:00 2001 From: maliming Date: Wed, 18 Oct 2023 09:50:47 +0800 Subject: [PATCH 008/179] Add `is-cdn` to script/style taghelper. --- .../Bundling/BundleConfigurationExtensions.cs | 6 ++++ .../BundleContributorCollectionExtensions.cs | 6 ++++ .../AspNetCore/Mvc/UI/Bundling/BundleFile.cs | 14 ++++++-- .../Mvc/UI/Bundling/BundleFileContributor.cs | 2 +- .../UI/Bundling/BundleFileListExtensions.cs | 32 ------------------- .../Mvc/UI/Bundling/BundleManager.cs | 2 +- .../TagHelpers/AbpBundleItemTagHelper.cs | 6 +++- .../TagHelpers/AbpTagHelperResourceService.cs | 6 ++-- .../TagHelpers/AbpTagHelperScriptService.cs | 4 +-- .../TagHelpers/AbpTagHelperStyleService.cs | 4 +-- .../TagHelpers/BundleTagHelperFileItem.cs | 6 ++-- .../SharedThemeGlobalScriptContributor.cs | 22 ++++++------- .../SharedThemeGlobalStyleContributor.cs | 8 ++--- 13 files changed, 55 insertions(+), 63 deletions(-) delete mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleFileListExtensions.cs diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleConfigurationExtensions.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleConfigurationExtensions.cs index ca628f4d67..8dd51dc5a3 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleConfigurationExtensions.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleConfigurationExtensions.cs @@ -11,6 +11,12 @@ public static class BundleConfigurationExtensions return bundleConfiguration; } + public static BundleConfiguration AddFiles(this BundleConfiguration bundleConfiguration, params BundleFile[] files) + { + bundleConfiguration.Contributors.AddFiles(files); + return bundleConfiguration; + } + public static BundleConfiguration AddCdnFiles(this BundleConfiguration bundleConfiguration, params string[] files) { bundleConfiguration.Contributors.AddCdnFiles(files.Select(x => new BundleFile(x, true)).ToArray()); diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleContributorCollectionExtensions.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleContributorCollectionExtensions.cs index 3c0dfdeab8..22bfe2947c 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleContributorCollectionExtensions.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleContributorCollectionExtensions.cs @@ -6,6 +6,12 @@ public static class BundleContributorCollectionExtensions { contributors.Add(new BundleFileContributor(files)); } + + public static void AddFiles(this BundleContributorCollection contributors, params BundleFile[] files) + { + contributors.Add(new BundleFileContributor(files)); + } + public static void AddCdnFiles(this BundleContributorCollection contributors, params BundleFile[] files) { contributors.Add(new BundleFileContributor(files)); diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleFile.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleFile.cs index 58427b6c40..091a4b3823 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleFile.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleFile.cs @@ -2,13 +2,21 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling; public class BundleFile { - public string File { get; set; } + public string FileName { get; set; } public bool IsCdn { get; set; } - public BundleFile(string file, bool isCdn = false) + public BundleFile(string fileName, bool isCdn = false) { - File = file; + FileName = fileName; IsCdn = isCdn; } + + /// + /// This method is used to compatible with old code. + /// + public static implicit operator BundleFile(string fileName) + { + return new BundleFile(fileName); + } } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleFileContributor.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleFileContributor.cs index 5107c006a0..df55266110 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleFileContributor.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleFileContributor.cs @@ -24,7 +24,7 @@ public class BundleFileContributor : BundleContributor { foreach (var file in Files) { - context.Files.AddIfNotContains(x => x.File.Equals(file.File, StringComparison.OrdinalIgnoreCase), () => file); + context.Files.AddIfNotContains(x => x.FileName.Equals(file.FileName, StringComparison.OrdinalIgnoreCase), () => file); } } } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleFileListExtensions.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleFileListExtensions.cs deleted file mode 100644 index b3088b293d..0000000000 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleFileListExtensions.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; - -namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling; - -/// -/// This class is used to compatible with old code. -/// -public static class BundleFileListExtensions -{ - public static void Add(this List bundleFiles, params string[] files) - { - bundleFiles.AddRange(files.Select(file => new BundleFile(file))); - } - - public static void AddRange(this List bundleFiles, params string[] files) - { - bundleFiles.AddRange(files.Select(file => new BundleFile(file))); - } - - public static void AddIfNotContains(this List bundleFiles, params string[] files) - { - foreach (var file in files) - { - if (!bundleFiles.Any(x => x.File.Equals(file, StringComparison.OrdinalIgnoreCase))) - { - bundleFiles.Add(new BundleFile(file)); - } - } - } -} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleManager.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleManager.cs index fb7b3cd489..9e5ca4bdef 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleManager.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/BundleManager.cs @@ -83,7 +83,7 @@ public class BundleManager : IBundleManager, ITransientDependency { if (!bundleFile.IsCdn) { - localBundleFiles.Add(bundleFile.File); + localBundleFiles.Add(bundleFile.FileName); } else { diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpBundleItemTagHelper.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpBundleItemTagHelper.cs index 1240dbef11..81c06df7c3 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpBundleItemTagHelper.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpBundleItemTagHelper.cs @@ -1,4 +1,5 @@ using System; +using Microsoft.AspNetCore.Razor.TagHelpers; using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers; namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling.TagHelpers; @@ -17,6 +18,9 @@ public abstract class AbpBundleItemTagHelper : Ab /// public Type? Type { get; set; } + [HtmlAttributeName("is-cdn")] + public bool IsCdn { get; set; } + protected AbpBundleItemTagHelper(TTagHelperService service) : base(service) { @@ -49,7 +53,7 @@ public abstract class AbpBundleItemTagHelper : Ab if (Src != null) { - return new BundleTagHelperFileItem(Src); + return new BundleTagHelperFileItem(new BundleFile(Src, IsCdn)); } throw new AbpException("abp-script tag helper requires to set either src or type!"); diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpTagHelperResourceService.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpTagHelperResourceService.cs index 1926cb48cf..5a19dee915 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpTagHelperResourceService.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpTagHelperResourceService.cs @@ -71,10 +71,10 @@ public abstract class AbpTagHelperResourceService : ITransientDependency } else { - var file = HostingEnvironment.WebRootFileProvider.GetFileInfo(bundleFile.File); + var file = HostingEnvironment.WebRootFileProvider.GetFileInfo(bundleFile.FileName); if (file == null || !file.Exists) { - Logger.LogError($"Could not find the bundle file '{bundleFile.File}' for the bundle '{bundleName}'!"); + Logger.LogError($"Could not find the bundle file '{bundleFile.FileName}' for the bundle '{bundleName}'!"); AddErrorScript(viewContext, tagHelper, context, output, bundleFile, bundleName!); continue; } @@ -98,7 +98,7 @@ public abstract class AbpTagHelperResourceService : ITransientDependency protected virtual void AddErrorScript(ViewContext viewContext, TagHelper tagHelper, TagHelperContext context, TagHelperOutput output, BundleFile file, string bundleName) { - output.Content.AppendHtml($"{Environment.NewLine}"); + output.Content.AppendHtml($"{Environment.NewLine}"); } protected virtual string GenerateBundleName(List bundleItems) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpTagHelperScriptService.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpTagHelperScriptService.cs index 3ff8e05552..ea0f11b777 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpTagHelperScriptService.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpTagHelperScriptService.cs @@ -47,13 +47,13 @@ public class AbpTagHelperScriptService : AbpTagHelperResourceService _ => false }; - var deferText = (defer || Options.DeferScriptsByDefault || Options.DeferScripts.Any(x => file.File.StartsWith(x, StringComparison.OrdinalIgnoreCase))) + var deferText = (defer || Options.DeferScriptsByDefault || Options.DeferScripts.Any(x => file.FileName.StartsWith(x, StringComparison.OrdinalIgnoreCase))) ? "defer " : string.Empty; var nonceText = (viewContext.HttpContext.Items.TryGetValue(AbpAspNetCoreConsts.ScriptNonceKey, out var nonce) && nonce is string nonceString && !string.IsNullOrEmpty(nonceString)) ? $"nonce=\"{nonceString}\" " : string.Empty; - var src = file.IsCdn ? file.File : viewContext.GetUrlHelper().Content((file.File + "?_v=" + fileInfo!.LastModified.UtcTicks).EnsureStartsWith('~')); + var src = file.IsCdn ? file.FileName : viewContext.GetUrlHelper().Content((file.FileName + "?_v=" + fileInfo!.LastModified.UtcTicks).EnsureStartsWith('~')); output.Content.AppendHtml($"{Environment.NewLine}"); } } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpTagHelperStyleService.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpTagHelperStyleService.cs index a43221841e..63f2e2304d 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpTagHelperStyleService.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpTagHelperStyleService.cs @@ -51,8 +51,8 @@ public class AbpTagHelperStyleService : AbpTagHelperResourceService _ => false }; - var href = file.IsCdn ? file.File : viewContext.GetUrlHelper().Content((file.File + "?_v=" + fileInfo!.LastModified.UtcTicks).EnsureStartsWith('~')); - if (preload || Options.PreloadStylesByDefault || Options.PreloadStyles.Any(x => file.File.StartsWith(x, StringComparison.OrdinalIgnoreCase))) + var href = file.IsCdn ? file.FileName : viewContext.GetUrlHelper().Content((file.FileName + "?_v=" + fileInfo!.LastModified.UtcTicks).EnsureStartsWith('~')); + if (preload || Options.PreloadStylesByDefault || Options.PreloadStyles.Any(x => file.FileName.StartsWith(x, StringComparison.OrdinalIgnoreCase))) { output.Content.AppendHtml(SecurityHeadersOptions.UseContentSecurityPolicyScriptNonce ? $"{Environment.NewLine}" diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/BundleTagHelperFileItem.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/BundleTagHelperFileItem.cs index 45ab8b64eb..b5f6ca74aa 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/BundleTagHelperFileItem.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/BundleTagHelperFileItem.cs @@ -5,16 +5,16 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling.TagHelpers; public class BundleTagHelperFileItem : BundleTagHelperItem { [NotNull] - public string File { get; } + public BundleFile File { get; } - public BundleTagHelperFileItem([NotNull] string file) + public BundleTagHelperFileItem([NotNull] BundleFile file) { File = Check.NotNull(file, nameof(file)); } public override string ToString() { - return File; + return File.FileName; } public override void AddToConfiguration(BundleConfiguration configuration) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Bundling/SharedThemeGlobalScriptContributor.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Bundling/SharedThemeGlobalScriptContributor.cs index 2ac299959a..2ca7c191c8 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Bundling/SharedThemeGlobalScriptContributor.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Bundling/SharedThemeGlobalScriptContributor.cs @@ -35,20 +35,20 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Bundling; )] public class SharedThemeGlobalScriptContributor : BundleContributor { - + public override void ConfigureBundle(BundleConfigurationContext context) { - context.Files.AddRange(new[] + context.Files.AddRange(new BundleFile[] { - "/libs/abp/aspnetcore-mvc-ui-theme-shared/ui-extensions.js", - "/libs/abp/aspnetcore-mvc-ui-theme-shared/jquery/jquery-extensions.js", - "/libs/abp/aspnetcore-mvc-ui-theme-shared/jquery-form/jquery-form-extensions.js", - "/libs/abp/aspnetcore-mvc-ui-theme-shared/jquery/widget-manager.js", - "/libs/abp/aspnetcore-mvc-ui-theme-shared/bootstrap/dom-event-handlers.js", - "/libs/abp/aspnetcore-mvc-ui-theme-shared/bootstrap/modal-manager.js", - "/libs/abp/aspnetcore-mvc-ui-theme-shared/datatables/datatables-extensions.js", - "/libs/abp/aspnetcore-mvc-ui-theme-shared/sweetalert2/abp-sweetalert2.js", - "/libs/abp/aspnetcore-mvc-ui-theme-shared/toastr/abp-toastr.js" + "/libs/abp/aspnetcore-mvc-ui-theme-shared/ui-extensions.js", + "/libs/abp/aspnetcore-mvc-ui-theme-shared/jquery/jquery-extensions.js", + "/libs/abp/aspnetcore-mvc-ui-theme-shared/jquery-form/jquery-form-extensions.js", + "/libs/abp/aspnetcore-mvc-ui-theme-shared/jquery/widget-manager.js", + "/libs/abp/aspnetcore-mvc-ui-theme-shared/bootstrap/dom-event-handlers.js", + "/libs/abp/aspnetcore-mvc-ui-theme-shared/bootstrap/modal-manager.js", + "/libs/abp/aspnetcore-mvc-ui-theme-shared/datatables/datatables-extensions.js", + "/libs/abp/aspnetcore-mvc-ui-theme-shared/sweetalert2/abp-sweetalert2.js", + "/libs/abp/aspnetcore-mvc-ui-theme-shared/toastr/abp-toastr.js" }); } } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Bundling/SharedThemeGlobalStyleContributor.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Bundling/SharedThemeGlobalStyleContributor.cs index 01f490425c..f959d73f05 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Bundling/SharedThemeGlobalStyleContributor.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Bundling/SharedThemeGlobalStyleContributor.cs @@ -27,10 +27,10 @@ public class SharedThemeGlobalStyleContributor : BundleContributor { public override void ConfigureBundle(BundleConfigurationContext context) { - context.Files.AddRange(new[] + context.Files.AddRange(new BundleFile[] { - "/libs/abp/aspnetcore-mvc-ui-theme-shared/datatables/datatables-styles.css", - "/libs/abp/aspnetcore-mvc-ui-theme-shared/date-range-picker/date-range-picker-styles.css" - }); + "/libs/abp/aspnetcore-mvc-ui-theme-shared/datatables/datatables-styles.css", + "/libs/abp/aspnetcore-mvc-ui-theme-shared/date-range-picker/date-range-picker-styles.css" + }); } } From 8df549aed9a64c59ceb2d9f6af878bc2aed3d355 Mon Sep 17 00:00:00 2001 From: maliming Date: Wed, 18 Oct 2023 10:22:34 +0800 Subject: [PATCH 009/179] Update `Bundling-Minification.md`. --- .../en/UI/AspNetCore/Bundling-Minification.md | 77 ++++++++++++++++++ .../UI/AspNetCore/Bundling-Minification.md | 78 +++++++++++++++++++ 2 files changed, 155 insertions(+) diff --git a/docs/en/UI/AspNetCore/Bundling-Minification.md b/docs/en/UI/AspNetCore/Bundling-Minification.md index dd2282c883..650d3e3e77 100644 --- a/docs/en/UI/AspNetCore/Bundling-Minification.md +++ b/docs/en/UI/AspNetCore/Bundling-Minification.md @@ -382,6 +382,83 @@ Configure(options => ```` +### CDN Support + +You can configure `AbpBundlingOptions` or use `is-cdn` on `script/style` taghelper to load all or a single js/css file from CDN. + +#### Add CDN files in `AbpBundlingOptions` + +````csharp +Configure(options => +{ + options.StyleBundles + .Add("MyStyleBundle", configuration => + { + configuration + .AddFiles("/styles/my-style1.css") + .AddFiles("/styles/my-style2.css") + .AddCdnFiles("https://cdn.abp.io/bootstrap.css") + .AddFiles("/styles/my-style3.css") + .AddFiles("/styles/my-style4.css"); + }); + + options.ScriptBundles + .Add("MyScriptBundle", configuration => + { + configuration + .AddFiles("/scripts/my-script1.js") + .AddFiles("/scripts/my-script2.js") + .AddCdnFiles("https://cdn.abp.io/bootstrap.js") + .AddFiles("/scripts/my-script3.js") + .AddFiles("/scripts/my-script4.js"); + }); +}); +```` + +**Output HTML:** + +````html + + + + + + + +```` + +#### Add CDN files in Tag Helpers. + +````html + + + + + + + + + + + + + + + +```` + +**Output HTML:** + +````html + + + + + + + +```` + ## Themes Themes uses the standard package contributors to add library resources to page layouts. Themes may also define some standard/global bundles, so any module can contribute to these standard/global bundles. See the [theming documentation](Theming.md) for more. diff --git a/docs/zh-Hans/UI/AspNetCore/Bundling-Minification.md b/docs/zh-Hans/UI/AspNetCore/Bundling-Minification.md index 338afe8967..fab0893a76 100644 --- a/docs/zh-Hans/UI/AspNetCore/Bundling-Minification.md +++ b/docs/zh-Hans/UI/AspNetCore/Bundling-Minification.md @@ -353,6 +353,84 @@ services.Configure(options => }); ```` +### CDN 支持 + +你可以配置`AbpBundlingOptions`或在`script/style` taghelper上使用`is-cdn`来从CDN加载js/css. + +#### 在`AbpBundlingOptions`中添加CDN文件 + +````csharp +Configure(options => +{ + options.StyleBundles + .Add("MyStyleBundle", configuration => + { + configuration + .AddFiles("/styles/my-style1.css") + .AddFiles("/styles/my-style2.css") + .AddCdnFiles("https://cdn.abp.io/bootstrap.css") + .AddFiles("/styles/my-style3.css") + .AddFiles("/styles/my-style4.css"); + }); + + options.ScriptBundles + .Add("MyScriptBundle", configuration => + { + configuration + .AddFiles("/scripts/my-script1.js") + .AddFiles("/scripts/my-script2.js") + .AddCdnFiles("https://cdn.abp.io/bootstrap.js") + .AddFiles("/scripts/my-script3.js") + .AddFiles("/scripts/my-script4.js"); + }); +}); +```` + +**输出HTMl:** + +````html + + + + + + + +```` + +#### 在TagHelpers中添加CDN文件 + +````html + + + + + + + + + + + + + + + +```` + +**输出HTMl:** + +````html + + + + + + + +```` + + ### 主题 主题使用标准包贡献者将库资源添加到页面布局. 主题还可以定义一些标准/全局包, 因此任何模块都可以为这些标准/全局包做出贡献. 有关更多信息, 请参阅[主题文档](Theming.md). From bfd09fcece56b18a561cee17a28b4c0acbbde9d1 Mon Sep 17 00:00:00 2001 From: Engincan VESKE <43685404+EngincanV@users.noreply.github.com> Date: Wed, 18 Oct 2023 09:35:25 +0300 Subject: [PATCH 010/179] Fix docs template rendering problems --- docs/en/Getting-Started-Running-Solution-Single-Layer.md | 2 +- docs/en/Getting-Started-Running-Solution.md | 4 +++- docs/en/Tutorials/Part-1.md | 2 +- docs/en/Tutorials/Todo/Index.md | 2 +- docs/en/Tutorials/Todo/Single-Layer/Index.md | 2 +- 5 files changed, 7 insertions(+), 5 deletions(-) diff --git a/docs/en/Getting-Started-Running-Solution-Single-Layer.md b/docs/en/Getting-Started-Running-Solution-Single-Layer.md index 8da0fc7912..b200720415 100644 --- a/docs/en/Getting-Started-Running-Solution-Single-Layer.md +++ b/docs/en/Getting-Started-Running-Solution-Single-Layer.md @@ -66,7 +66,7 @@ abp install-libs > We suggest you install [Yarn](https://classic.yarnpkg.com/) to prevent possible package inconsistencies, if you haven't installed it yet. -{{if UI=="Blazor" || UI="BlazorServer"}} +{{if UI=="Blazor" || UI=="BlazorServer"}} ### Bundling and Minification diff --git a/docs/en/Getting-Started-Running-Solution.md b/docs/en/Getting-Started-Running-Solution.md index 9be04c7612..a7771a0773 100644 --- a/docs/en/Getting-Started-Running-Solution.md +++ b/docs/en/Getting-Started-Running-Solution.md @@ -105,7 +105,7 @@ abp install-libs > We suggest you install [Yarn](https://classic.yarnpkg.com/) to prevent possible package inconsistencies, if you haven't installed it yet. -{{if UI=="Blazor" || UI="BlazorServer"}} +{{if UI=="Blazor" || UI=="BlazorServer"}} ### Bundling and Minification @@ -125,6 +125,8 @@ abp bundle {{ if UI == "MVC" || UI == "BlazorServer" }} +> **Note**: Before starting the application, run `abp install-libs` command in your Web directory to restore the client-side libraries. This will populate the `libs` folder. + {{ if Tiered == "Yes" }} > Tiered solutions use **Redis** as the distributed cache. Ensure that it is installed and running in your local computer. If you are using a remote Redis Server, set the configuration in the `appsettings.json` files of the projects below. diff --git a/docs/en/Tutorials/Part-1.md b/docs/en/Tutorials/Part-1.md index 0ed26ce557..6795204936 100644 --- a/docs/en/Tutorials/Part-1.md +++ b/docs/en/Tutorials/Part-1.md @@ -66,7 +66,7 @@ abp install-libs > We suggest you install [Yarn](https://classic.yarnpkg.com/) to prevent possible package inconsistencies, if you haven't installed it yet. -{{if UI=="Blazor" || UI="BlazorServer"}} +{{if UI=="Blazor" || UI=="BlazorServer"}} ### Bundling and Minification diff --git a/docs/en/Tutorials/Todo/Index.md b/docs/en/Tutorials/Todo/Index.md index 0a0a080d8e..f316a9b7ed 100644 --- a/docs/en/Tutorials/Todo/Index.md +++ b/docs/en/Tutorials/Todo/Index.md @@ -113,7 +113,7 @@ abp install-libs > We suggest you install [Yarn](https://classic.yarnpkg.com/) to prevent possible package inconsistencies, if you haven't installed it yet. -{{if UI=="Blazor" || UI="BlazorServer"}} +{{if UI=="Blazor" || UI=="BlazorServer"}} #### Bundling and Minification diff --git a/docs/en/Tutorials/Todo/Single-Layer/Index.md b/docs/en/Tutorials/Todo/Single-Layer/Index.md index e08acb1167..ff075e613d 100644 --- a/docs/en/Tutorials/Todo/Single-Layer/Index.md +++ b/docs/en/Tutorials/Todo/Single-Layer/Index.md @@ -117,7 +117,7 @@ abp install-libs > We suggest you install [Yarn](https://classic.yarnpkg.com/) to prevent possible package inconsistencies, if you haven't installed it yet. -{{if UI=="Blazor" || UI="BlazorServer"}} +{{if UI=="Blazor" || UI=="BlazorServer"}} #### Bundling and Minification From 6ee77a19ee2ebb9f537f31f2ca032abf91c1b603 Mon Sep 17 00:00:00 2001 From: Sinan997 Date: Wed, 18 Oct 2023 10:44:47 +0300 Subject: [PATCH 011/179] add angular update to 7.3, 7.4 migration docs --- docs/en/Migration-Guides/Abp-7_3.md | 5 ++++- docs/en/Migration-Guides/Abp-7_4.md | 3 +++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/docs/en/Migration-Guides/Abp-7_3.md b/docs/en/Migration-Guides/Abp-7_3.md index 9e09306ca3..1d8e5b1e36 100644 --- a/docs/en/Migration-Guides/Abp-7_3.md +++ b/docs/en/Migration-Guides/Abp-7_3.md @@ -25,4 +25,7 @@ This feature comes with a small restriction. If you use any C# code used inside For example, `` will no longer work. However, you can use the C# code for an attribute of script tag, for example, `` is completely valid and won't cause any problem. -> Note: You should not use any C# code used inside the script tag, even if you don't use this feature. Because it might cause errors. \ No newline at end of file +> Note: You should not use any C# code used inside the script tag, even if you don't use this feature. Because it might cause errors. + +## Angular UI +We would like to inform you that ABP Framework version 7.3 uses Angular version 16. Please migrate your applications to Angular 16. [Update angular](https://update.angular.io/) \ No newline at end of file diff --git a/docs/en/Migration-Guides/Abp-7_4.md b/docs/en/Migration-Guides/Abp-7_4.md index 0c69dda74e..ee72da812f 100644 --- a/docs/en/Migration-Guides/Abp-7_4.md +++ b/docs/en/Migration-Guides/Abp-7_4.md @@ -114,3 +114,6 @@ The following packages are included in the templates by default: ### Bumped the `Microsoft.AspNetCore.Components.*` dependency to `7.0.10` In this version, the `Microsoft.AspNetCore.Components.*` dependencies are upgraded to the `7.0.10` version. Therefore, you should upgrade the `Microsoft.AspNetCore.Components.Web` and `Microsoft.AspNetCore.Components.WebAssembly` packages to `7.0.10` in your `Blazor.csproj` file. + +## Angular UI +We would like to inform you that ABP Framework version 7.4 uses Angular version 16. Please migrate your applications to Angular 16. [Update angular](https://update.angular.io/) \ No newline at end of file From bcfbb53067321f8d7d4a3ab3415939960c2266fe Mon Sep 17 00:00:00 2001 From: Sinan997 Date: Wed, 18 Oct 2023 13:53:58 +0300 Subject: [PATCH 012/179] fix getModifierState is not a function error --- .../packages/core/src/lib/directives/caps-lock.directive.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/npm/ng-packs/packages/core/src/lib/directives/caps-lock.directive.ts b/npm/ng-packs/packages/core/src/lib/directives/caps-lock.directive.ts index 16b3c40757..4d66a77b50 100644 --- a/npm/ng-packs/packages/core/src/lib/directives/caps-lock.directive.ts +++ b/npm/ng-packs/packages/core/src/lib/directives/caps-lock.directive.ts @@ -21,7 +21,7 @@ export class TrackCapsLockDirective { if ( (s.toUpperCase() === s && s.toLowerCase() !== s && e.shiftKey) || (s.toUpperCase() !== s && s.toLowerCase() === s && e.shiftKey) || - e.getModifierState('CapsLock') + (e.getModifierState && e.getModifierState('CapsLock')) ) { return true; } From 3c7a7d2de21aeb322bef5f55a7a36a0fc2f7ee4f Mon Sep 17 00:00:00 2001 From: Enis Necipoglu Date: Wed, 18 Oct 2023 17:25:12 +0300 Subject: [PATCH 013/179] Make Blogs URL prefix customizable --- docs/en/Modules/Cms-Kit/Blogging.md | 11 ++++++++++- .../CmsKitWebUnifiedModule.cs | 2 ++ .../Pages/CmsKit/Blogs/CreateModal.cshtml | 3 ++- .../Pages/CmsKit/Blogs/UpdateModal.cshtml | 3 ++- .../Pages/CmsKit/Pages/Create.cshtml | 2 +- .../Pages/CmsKit/Pages/Update.cshtml | 2 +- .../src/Volo.CmsKit.Common.Web/CmsBlogsWebConsts.cs | 6 ++++++ .../Volo/CmsKit/Localization/Resources/ar.json | 1 + .../Volo/CmsKit/Localization/Resources/cs.json | 1 + .../Volo/CmsKit/Localization/Resources/de-DE.json | 1 + .../Volo/CmsKit/Localization/Resources/el.json | 1 + .../Volo/CmsKit/Localization/Resources/en.json | 1 + .../Volo/CmsKit/Localization/Resources/es.json | 1 + .../Volo/CmsKit/Localization/Resources/fi.json | 1 + .../Volo/CmsKit/Localization/Resources/fr.json | 1 + .../Volo/CmsKit/Localization/Resources/hi.json | 1 + .../Volo/CmsKit/Localization/Resources/hu.json | 1 + .../Volo/CmsKit/Localization/Resources/is.json | 3 ++- .../Volo/CmsKit/Localization/Resources/it.json | 1 + .../Volo/CmsKit/Localization/Resources/nl.json | 1 + .../Volo/CmsKit/Localization/Resources/pl-PL.json | 1 + .../Volo/CmsKit/Localization/Resources/pt-BR.json | 1 + .../Volo/CmsKit/Localization/Resources/ro-RO.json | 1 + .../Volo/CmsKit/Localization/Resources/ru.json | 1 + .../Volo/CmsKit/Localization/Resources/sk.json | 1 + .../Volo/CmsKit/Localization/Resources/sl.json | 1 + .../Volo/CmsKit/Localization/Resources/tr.json | 1 + .../Volo/CmsKit/Localization/Resources/vi.json | 1 + .../Volo/CmsKit/Localization/Resources/zh-Hans.json | 1 + .../Volo/CmsKit/Localization/Resources/zh-Hant.json | 1 + .../Volo.CmsKit.Public.Web/CmsKitPublicWebModule.cs | 12 +++++++++--- 31 files changed, 57 insertions(+), 9 deletions(-) create mode 100644 modules/cms-kit/src/Volo.CmsKit.Common.Web/CmsBlogsWebConsts.cs diff --git a/docs/en/Modules/Cms-Kit/Blogging.md b/docs/en/Modules/Cms-Kit/Blogging.md index d45598be52..eb6619a4bc 100644 --- a/docs/en/Modules/Cms-Kit/Blogging.md +++ b/docs/en/Modules/Cms-Kit/Blogging.md @@ -29,7 +29,16 @@ A screenshot from the new blog creation modal: ![blogs-edit](../../images/cmskit-module-blogs-edit.png) -**Slug** is the URL part of the blog. For this example, the root URL of the blog becomes *https://your-domain.com/blogs/technical-blog/*. +**Slug** is the URL part of the blog. For this example, the root URL of the blog becomes `your-domain.com/blogs/technical-blog/`. + +- You can change the default slug by using `CmsBlogsWebConsts.BlogRoutePrefix` constant. For example, if you set it to `foo`, the root URL of the blog becomes `your-domain.com/foo/technical-blog/`. + + ```csharp + public override void PreConfigureServices(ServiceConfigurationContext context) + { + CmsBlogsWebConsts.BlogsRoutePrefix = "foo"; + } + ``` #### Blog Features diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/CmsKitWebUnifiedModule.cs b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/CmsKitWebUnifiedModule.cs index ec98cbcf78..aaadd40f84 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/CmsKitWebUnifiedModule.cs +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/CmsKitWebUnifiedModule.cs @@ -116,6 +116,8 @@ public class CmsKitWebUnifiedModule : AbpModule { public override void PreConfigureServices(ServiceConfigurationContext context) { + CmsBlogsWebConsts.BlogsRoutePrefix = "foo"; + FeatureConfigurer.Configure(); } diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Blogs/CreateModal.cshtml b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Blogs/CreateModal.cshtml index 5aba4f2431..b348a63115 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Blogs/CreateModal.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Blogs/CreateModal.cshtml @@ -9,6 +9,7 @@ @using Volo.Abp.Data @using Volo.Abp.Localization @using Volo.Abp.ObjectExtending +@using Volo.CmsKit.Web @inject IStringLocalizerFactory StringLocalizerFactory @inherits CmsKitAdminPageBase @@ -25,7 +26,7 @@ - + @foreach (var propertyInfo in ObjectExtensionManager.Instance.GetProperties()) { diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Blogs/UpdateModal.cshtml b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Blogs/UpdateModal.cshtml index 65eccddef5..e3385e929b 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Blogs/UpdateModal.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Blogs/UpdateModal.cshtml @@ -8,6 +8,7 @@ @using Volo.Abp.Data @using Volo.Abp.Localization @using Volo.Abp.ObjectExtending +@using Volo.CmsKit.Web @inject IStringLocalizerFactory StringLocalizerFactory @inherits CmsKitAdminPageBase @@ -26,7 +27,7 @@ - + @foreach (var propertyInfo in ObjectExtensionManager.Instance.GetProperties()) { diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/Create.cshtml b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/Create.cshtml index e674c08600..afef4bdad5 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/Create.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/Create.cshtml @@ -59,7 +59,7 @@
- + diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/Update.cshtml b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/Update.cshtml index f1bd33d212..08fc064226 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/Update.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/Update.cshtml @@ -64,7 +64,7 @@ - + diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Web/CmsBlogsWebConsts.cs b/modules/cms-kit/src/Volo.CmsKit.Common.Web/CmsBlogsWebConsts.cs new file mode 100644 index 0000000000..7793856414 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Web/CmsBlogsWebConsts.cs @@ -0,0 +1,6 @@ +namespace Volo.CmsKit.Web; + +public static class CmsBlogsWebConsts +{ + public static string BlogsRoutePrefix { get; set; } = "blogs"; +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/ar.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/ar.json index b26a1fe2a8..9ef0948c80 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/ar.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/ar.json @@ -77,6 +77,7 @@ "PageId": "صفحة", "Pages": "الصفحات", "PageSlugInformation": "سبيكة تستخدم على url. سيكون عنوان url الخاص بك هو \"/{slug}}\".", + "BlogSlugInformation": "سبيكة تستخدم على url. سيكون عنوان url الخاص بك هو \"/{0}/{slug}}\".", "Permission:BlogManagement": "إدارة المدونة", "Permission:BlogManagement.Create": "إنشاء", "Permission:BlogManagement.Delete": "حذف", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/cs.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/cs.json index 8344a53ee2..383ba53bfc 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/cs.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/cs.json @@ -77,6 +77,7 @@ "PageId": "Strana", "Pages": "stránky", "PageSlugInformation": "Na adrese URL je použit Slug. Vaše adresa URL bude '/{{slug}}'.", + "BlogSlugInformation": "Na adrese URL je použit Slug. Vaše adresa URL bude '/{0}/{{slug}}'.", "Permission:BlogManagement": "Správa blogu", "Permission:BlogManagement.Create": "Vytvořit", "Permission:BlogManagement.Delete": "Vymazat", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/de-DE.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/de-DE.json index 3a4b0a5569..8a34408bab 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/de-DE.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/de-DE.json @@ -77,6 +77,7 @@ "PageId": "Buchseite", "Pages": "Seiten", "PageSlugInformation": "Slug wird auf URL verwendet. Ihre URL lautet '/{{slug}}'.", + "BlogSlugInformation": "Slug wird auf URL verwendet. Ihre URL lautet '/{0}/{{slug}}'.", "Permission:BlogManagement": "Blog-Verwaltung", "Permission:BlogManagement.Create": "Schaffen", "Permission:BlogManagement.Delete": "Löschen", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/el.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/el.json index c686723d33..7155c127a3 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/el.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/el.json @@ -77,6 +77,7 @@ "PageId": "Σελίδα", "Pages": "Σελίδες", "PageSlugInformation": "Το Slug χρησιμοποιείται στο url. Το url σας θα είναι '/{{slug}}'.", + "BlogSlugInformation": "Το Slug χρησιμοποιείται στο url. Το url σας θα είναι '/{0}/{{slug}}'.", "Permission:BlogManagement": "Διαχείριση ιστολογίου", "Permission:BlogManagement.Create": "Δημιουργώ", "Permission:BlogManagement.Delete": "Διαγράφω", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json index 40639fc46a..ba39b86848 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json @@ -76,6 +76,7 @@ "PageId": "Page", "Pages": "Pages", "PageSlugInformation": "Slug is used on url. Your url will be '/{{slug}}'.", + "BlogSlugInformation": "Slug is used on url. Your url will be '/{0}/{{slug}}'.", "Permission:BlogManagement": "Blog Management", "Permission:BlogManagement.Create": "Create", "Permission:BlogManagement.Delete": "Delete", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/es.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/es.json index ea9b318b93..fb8e963115 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/es.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/es.json @@ -77,6 +77,7 @@ "PageId": "Página", "Pages": "Paginas", "PageSlugInformation": "Slug se usa en la URL. Su URL será '/{{slug}}'.", + "BlogSlugInformation": "Slug se usa en la URL. Su URL será '/{0}/{{slug}}'.", "Permission:BlogManagement": "Gestión de blogs", "Permission:BlogManagement.Create": "Crear", "Permission:BlogManagement.Delete": "Borrar", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/fi.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/fi.json index 1ead360d61..54a0ea97a4 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/fi.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/fi.json @@ -76,6 +76,7 @@ "PageId": "Sivu", "Pages": "Sivut", "PageSlugInformation": "Etanaa käytetään URL-osoitteessa. URL-osoitteesi on '/{{slug}}'.", + "BlogSlugInformation": "Etanaa käytetään URL-osoitteessa. URL-osoitteesi on '/{0}/{{slug}}'.", "Permission:BlogManagement": "Blogin hallinta", "Permission:BlogManagement.Create": "Luonti", "Permission:BlogManagement.Delete": "Poisto", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/fr.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/fr.json index 445c7b3578..bbd4f67955 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/fr.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/fr.json @@ -77,6 +77,7 @@ "PageId": "Page", "Pages": "Pages", "PageSlugInformation": "Slug est utilisé sur l'url. Votre URL sera '/{{slug}}'.", + "BlogSlugInformation": "Slug est utilisé sur l'url. Votre URL sera '/{0}/{{slug}}'.", "Permission:BlogManagement": "Gestion de blog", "Permission:BlogManagement.Create": "Créer", "Permission:BlogManagement.Delete": "Effacer", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/hi.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/hi.json index fffe151260..b251ac8c18 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/hi.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/hi.json @@ -77,6 +77,7 @@ "PageId": "पृष्ठ", "Pages": "पृष्ठों", "PageSlugInformation": "स्लग का उपयोग url पर किया जाता है। आपका url '/{{slug}}' होगा।", + "BlogSlugInformation": "स्लग का उपयोग url पर किया जाता है। आपका url '/{0}/{{slug}}' होगा।", "Permission:BlogManagement": "ब्लॉग प्रबंधन", "Permission:BlogManagement.Create": "सृजन करना", "Permission:BlogManagement.Delete": "हटाएं", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/hu.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/hu.json index 4c1047e178..43afc9575c 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/hu.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/hu.json @@ -76,6 +76,7 @@ "PageId": "oldal", "Pages": "Oldalak", "PageSlugInformation": "A Slug az url-en használatos. Az Ön URL-je a következő lesz: '/{{slug}}'.", + "BlogSlugInformation": "A Slug az url-en használatos. Az Ön URL-je a következő lesz: '/{0}/{{slug}}'.", "Permission:BlogManagement": "Blogkezelés", "Permission:BlogManagement.Create": "Teremt", "Permission:BlogManagement.Delete": "Töröl", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/is.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/is.json index 43c98adcc2..8b7bebc1ea 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/is.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/is.json @@ -76,7 +76,8 @@ "PageDeletionConfirmationMessage": "Ertu viss um að eyða þessari síðu?", "PageId": "Síða", "Pages": "Síður", - "PageSlugInformation": "Snigill er notaður á slóð. Slóðin þín verður '/síður/{{slug}}'.", + "PageSlugInformation": "Snigill er notaður á slóð. Slóðin þín verður '/{{slug}}'.", + "BlogSlugInformation": "Snigill er notaður á slóð. Slóðin þín verður '/{0}/{{slug}}'.", "Permission:BlogManagement": "Bloggstjórnun", "Permission:BlogManagement.Create": "Búa til", "Permission:BlogManagement.Delete": "Eyða", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/it.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/it.json index bddf4affc2..3575754a8c 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/it.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/it.json @@ -77,6 +77,7 @@ "PageId": "Pagina", "Pages": "Pagine", "PageSlugInformation": "Lo slug viene utilizzato sull'URL. Il tuo URL sarà '/{{slug}}'.", + "BlogSlugInformation": "Lo slug viene utilizzato sull'URL. Il tuo URL sarà '/{0}/{{slug}}'.", "Permission:BlogManagement": "Gestione del blog", "Permission:BlogManagement.Create": "Crea", "Permission:BlogManagement.Delete": "Elimina", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/nl.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/nl.json index d06ba78bf4..ef370edf26 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/nl.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/nl.json @@ -77,6 +77,7 @@ "PageId": "Bladzijde", "Pages": "Pagina's", "PageSlugInformation": "Slug wordt gebruikt voor de url. Uw url wordt '/{{slug}}'.", + "BlogSlugInformation": "Slug wordt gebruikt voor de url. Uw url wordt '/{0}/{{slug}}'.", "Permission:BlogManagement": "Blogbeheer", "Permission:BlogManagement.Create": "Toevoegen", "Permission:BlogManagement.Delete": "Verwijderen", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/pl-PL.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/pl-PL.json index a775020f7a..0bdef5d26b 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/pl-PL.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/pl-PL.json @@ -77,6 +77,7 @@ "PageId": "Strona", "Pages": "Strony", "PageSlugInformation": "Slug jest używany na adresie URL. Twój adres URL to „/{{slug}}”.", + "BlogSlugInformation": "Slug jest używany na adresie URL. Twój adres URL to „/{0}/{{slug}}”.", "Permission:BlogManagement": "Zarządzanie blogiem", "Permission:BlogManagement.Create": "Tworzyć", "Permission:BlogManagement.Delete": "Kasować", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/pt-BR.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/pt-BR.json index c306e6f58c..9510e2a67d 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/pt-BR.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/pt-BR.json @@ -77,6 +77,7 @@ "PageId": "Página", "Pages": "Páginas", "PageSlugInformation": "Slug é usado na url. Sua url será '/{{slug}}'.", + "BlogSlugInformation": "Slug é usado na url. Sua url será '/{0}/{{slug}}'.", "Permission:BlogManagement": "Gerenciamento de blogs", "Permission:BlogManagement.Create": "Criar", "Permission:BlogManagement.Delete": "Excluir", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/ro-RO.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/ro-RO.json index 7712530ee7..21b9ac5a24 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/ro-RO.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/ro-RO.json @@ -77,6 +77,7 @@ "PageId": "Pagina", "Pages": "Pagini", "PageSlugInformation": "Slug este folosit pe url. Url-ul dumneavoastră va fi '/{{slug}}'.", + "BlogSlugInformation": "Slug este folosit pe url. Url-ul dumneavoastră va fi '/{0}/{{slug}}'.", "Permission:BlogManagement": "Administrare Blog", "Permission:BlogManagement.Create": "Creează", "Permission:BlogManagement.Delete": "Şterge", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/ru.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/ru.json index e30641ce50..a1a809f9fa 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/ru.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/ru.json @@ -77,6 +77,7 @@ "PageId": "Страница", "Pages": "Страницы", "PageSlugInformation": "Слаг используется для URL. Ваш URL-адрес будет '/{{slug}}'.", + "BlogSlugInformation": "Слаг используется для URL. Ваш URL-адрес будет '/{0}/{{slug}}'.", "Permission:BlogManagement": "Управление блогом", "Permission:BlogManagement.Create": "Создавать", "Permission:BlogManagement.Delete": "Удалить", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/sk.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/sk.json index 7fc0e7c254..af320c8a19 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/sk.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/sk.json @@ -77,6 +77,7 @@ "PageId": "Stránka", "Pages": "Stránky", "PageSlugInformation": "Slug sa používa v URL. Vaša URL bude '/{{slug}}'.", + "BlogSlugInformation": "Slug sa používa v URL. Vaša URL bude '/{0}/{{slug}}'.", "Permission:BlogManagement": "Správa blogov", "Permission:BlogManagement.Create": "Vytvoriť", "Permission:BlogManagement.Delete": "Zmazať", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/sl.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/sl.json index 0e0d12e2e6..972b7da430 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/sl.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/sl.json @@ -77,6 +77,7 @@ "PageId": "stran", "Pages": "strani", "PageSlugInformation": "Slug se uporablja na url-ju. Vaš url bo '/{{slug}}'.", + "BlogSlugInformation": "Slug se uporablja na url-ju. Vaš url bo '/{0}/{{slug}}'.", "Permission:BlogManagement": "Upravljanje blogov", "Permission:BlogManagement.Create": "Ustvari", "Permission:BlogManagement.Delete": "Izbriši", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json index c84cdc6312..78c5f9341e 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json @@ -76,6 +76,7 @@ "PageId": "Sayfa", "Pages": "Sayfalar", "PageSlugInformation": "Etiket URL'de kullanılır. Url şöyle görünür: '/{{slug}}'.", + "BlogSlugInformation": "Etiket URL'de kullanılır. Url şöyle görünür: '/{0}/{{slug}}'.", "Permission:BlogManagement": "Blog Yönetimi", "Permission:BlogManagement.Create": "Oluşturma", "Permission:BlogManagement.Delete": "Silme", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/vi.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/vi.json index 3e0f36578d..09ae8f3a9c 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/vi.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/vi.json @@ -77,6 +77,7 @@ "PageId": "Trang", "Pages": "Các trang", "PageSlugInformation": "Slug được sử dụng trên url. Url của bạn sẽ là '/{{slug}}'.", + "BlogSlugInformation": "Slug được sử dụng trên url. Url của bạn sẽ là '/{0}/{{slug}}'.", "Permission:BlogManagement": "Quản lý blog", "Permission:BlogManagement.Create": "Tạo ra", "Permission:BlogManagement.Delete": "Xóa bỏ", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/zh-Hans.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/zh-Hans.json index 7e9089d426..516c57eefd 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/zh-Hans.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/zh-Hans.json @@ -76,6 +76,7 @@ "PageId": "页", "Pages": "页面", "PageSlugInformation": "Slug用于url. 你的url将是 '/{{slug}}'.", + "BlogSlugInformation": "Slug用于url. 你的url将是 '/{0}/{{slug}}'.", "Permission:BlogManagement": "博客管理", "Permission:BlogManagement.Create": "创建", "Permission:BlogManagement.Delete": "删除", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/zh-Hant.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/zh-Hant.json index e6dd053052..5d3d2621fb 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/zh-Hant.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/zh-Hant.json @@ -77,6 +77,7 @@ "PageId": "頁", "Pages": "頁面", "PageSlugInformation": "Slug用於網址. 你的網址將是 '/{{slug}}'.", + "BlogSlugInformation": "Slug用於網址. 你的網址將是 '/{0}/{{slug}}'.", "Permission:BlogManagement": "部落格管理", "Permission:BlogManagement.Create": "創建", "Permission:BlogManagement.Delete": "刪除", diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/CmsKitPublicWebModule.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/CmsKitPublicWebModule.cs index 93a61efe2f..c7078acd98 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/CmsKitPublicWebModule.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/CmsKitPublicWebModule.cs @@ -1,4 +1,5 @@ -using Microsoft.AspNetCore.Mvc.RazorPages; +using System; +using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.AspNetCore.Routing; using Microsoft.Extensions.DependencyInjection; using Volo.Abp.AspNetCore.Mvc.Localization; @@ -91,8 +92,13 @@ public class CmsKitPublicWebModule : AbpModule { Configure(options => { - options.Conventions.AddPageRoute("/Public/CmsKit/Blogs/Index", @"/blogs/{blogSlug:minlength(1)}"); - options.Conventions.AddPageRoute("/Public/CmsKit/Blogs/BlogPost", @"/blogs/{blogSlug}/{blogPostSlug:minlength(1)}"); + options.Conventions.AddPageRoute( + "/Public/CmsKit/Blogs/Index", + CmsBlogsWebConsts.BlogsRoutePrefix.EnsureStartsWith('/') + @"/{blogSlug:minlength(1)}"); + + options.Conventions.AddPageRoute( + "/Public/CmsKit/Blogs/BlogPost", + CmsBlogsWebConsts.BlogsRoutePrefix.EnsureStartsWith('/') + @"/{blogSlug}/{blogPostSlug:minlength(1)}"); }); } From cdd14dbf4eb351861d53f44a02f05b1c09138306 Mon Sep 17 00:00:00 2001 From: Engincan VESKE <43685404+EngincanV@users.noreply.github.com> Date: Wed, 18 Oct 2023 17:29:47 +0300 Subject: [PATCH 014/179] CMS Kit: Prevent duplicate comment records --- .../Volo/CmsKit/Comments/CommentConsts.cs | 2 ++ .../CmsKit/Localization/Resources/en.json | 3 ++- .../Volo/CmsKit/Comments/Comment.cs | 4 +++- .../CmsKit/Comments/ICommentRepository.cs | 2 ++ .../Comments/EfCoreCommentRepository.cs | 5 ++++ .../CmsKitDbContextModelCreatingExtensions.cs | 1 + .../Comments/MongoCommentRepository.cs | 6 +++++ .../Public/Comments/CreateCommentInput.cs | 4 +++- .../CreateCommentWithParametersInput.cs | 2 ++ .../Comments/CommentPublicAppService.cs | 15 ++++++++++-- .../Components/Commenting/Default.cshtml | 1 + .../Shared/Components/Commenting/default.js | 23 +++++++++++++++---- 12 files changed, 59 insertions(+), 9 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Comments/CommentConsts.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Comments/CommentConsts.cs index aa253c9593..59afde6a45 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Comments/CommentConsts.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Comments/CommentConsts.cs @@ -12,4 +12,6 @@ public static class CommentConsts public static int MaxTextLength { get; set; } = 512; public static int MaxUrlLength { get; set; } = 512; + + public static int MaxIdempotencyTokenLength { get; set; } = 32; } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json index 40639fc46a..e879b7e339 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json @@ -225,6 +225,7 @@ "RemoveCoverImage": "Remove cover image", "CssClass": "CSS Class", "TagsHelpText": "Tags should be comma-separated (e.g.: tag1, tag2, tag3)", - "ThisPartOfContentCouldntBeLoaded": "This part of content couldn't be loaded." + "ThisPartOfContentCouldntBeLoaded": "This part of content couldn't be loaded.", + "DuplicateCommentAttemptMessage": "Duplicate comment post attempt detected. Your comment has already been submitted." } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Comments/Comment.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Comments/Comment.cs index 7a620b8655..7a09b18b63 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Comments/Comment.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Comments/Comment.cs @@ -25,9 +25,11 @@ public class Comment : AggregateRoot, IHasCreationTime, IMustHaveCreator, public virtual string Url { get; set; } + public virtual string IdempotencyToken { get; set; } + protected Comment() { - + } internal Comment( diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Comments/ICommentRepository.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Comments/ICommentRepository.cs index 30541c2230..b054f11037 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Comments/ICommentRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Comments/ICommentRepository.cs @@ -44,4 +44,6 @@ public interface ICommentRepository : IBasicRepository Comment comment, CancellationToken cancellationToken = default ); + + Task ExistsAsync(string idempotencyToken, CancellationToken cancellationToken = default); } diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Comments/EfCoreCommentRepository.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Comments/EfCoreCommentRepository.cs index 3102bcc40b..2f626a5cd7 100644 --- a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Comments/EfCoreCommentRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Comments/EfCoreCommentRepository.cs @@ -141,6 +141,11 @@ public class EfCoreCommentRepository : EfCoreRepository ExistsAsync(string idempotencyToken, CancellationToken cancellationToken = default) + { + return await (await GetDbSetAsync()).AnyAsync(x => x.IdempotencyToken == idempotencyToken, GetCancellationToken(cancellationToken)); + } + protected virtual async Task> GetListQueryAsync( string filter = null, string entityType = null, diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs index a6a92cced4..b81eb4f31d 100644 --- a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs @@ -80,6 +80,7 @@ public static class CmsKitDbContextModelCreatingExtensions b.Property(x => x.Text).IsRequired().HasMaxLength(CommentConsts.MaxTextLength); b.Property(x => x.RepliedCommentId); b.Property(x => x.Url).HasMaxLength(CommentConsts.MaxUrlLength); + b.Property(x => x.IdempotencyToken).HasMaxLength(CommentConsts.MaxIdempotencyTokenLength); b.HasIndex(x => new { x.TenantId, x.EntityType, x.EntityId }); b.HasIndex(x => new { x.TenantId, x.RepliedCommentId }); diff --git a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Comments/MongoCommentRepository.cs b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Comments/MongoCommentRepository.cs index 089b86cc4f..698c533b4e 100644 --- a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Comments/MongoCommentRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Comments/MongoCommentRepository.cs @@ -159,6 +159,12 @@ public class MongoCommentRepository : MongoDbRepository ExistsAsync(string idempotencyToken, CancellationToken cancellationToken = default) + { + return await (await GetMongoQueryableAsync(cancellationToken)) + .AnyAsync(x => x.IdempotencyToken == idempotencyToken, GetCancellationToken(cancellationToken)); + } + protected virtual async Task> GetListQueryAsync( string filter = null, string entityType = null, diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CreateCommentInput.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CreateCommentInput.cs index 316ffe2737..cc5ee3efec 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CreateCommentInput.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CreateCommentInput.cs @@ -7,7 +7,7 @@ using Volo.CmsKit.Comments; namespace Volo.CmsKit.Public.Comments; [Serializable] -public class CreateCommentInput: ExtensibleObject +public class CreateCommentInput : ExtensibleObject { [Required] [DynamicStringLength(typeof(CommentConsts), nameof(CommentConsts.MaxTextLength))] @@ -20,4 +20,6 @@ public class CreateCommentInput: ExtensibleObject public int CaptchaAnswer { get; set; } public string Url { get; set; } + + public string IdempotencyToken { get; set; } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CreateCommentWithParametersInput.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CreateCommentWithParametersInput.cs index 53f993cf2b..ec7aad1398 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CreateCommentWithParametersInput.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CreateCommentWithParametersInput.cs @@ -25,4 +25,6 @@ public class CreateCommentWithParametersInput public int CaptchaAnswer { get; set; } public string Url { get; set; } + + public string IdempotencyToken { get; set; } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Comments/CommentPublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Comments/CommentPublicAppService.cs index c1b5e736ec..cda077bde7 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Comments/CommentPublicAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Comments/CommentPublicAppService.cs @@ -63,14 +63,15 @@ public class CommentPublicAppService : CmsKitPublicAppServiceBase, ICommentPubli public virtual async Task CreateAsync(string entityType, string entityId, CreateCommentInput input) { CheckExternalUrls(entityType, input.Text); - - var user = await CmsUserLookupService.GetByIdAsync(CurrentUser.GetId()); if (input.RepliedCommentId.HasValue) { await CommentRepository.GetAsync(input.RepliedCommentId.Value); } + await CheckIdempotencyTokenUniquenessAsync(input.IdempotencyToken); + + var user = await CmsUserLookupService.GetByIdAsync(CurrentUser.GetId()); var comment = await CommentRepository.InsertAsync( await CommentManager.CreateAsync( user, @@ -192,4 +193,14 @@ public class CommentPublicAppService : CmsKitPublicAppServiceBase, ICommentPubli { return ObjectMapper.Map(comments.Single(c => c.Comment.Id == commentId).Author); } + + private async Task CheckIdempotencyTokenUniquenessAsync(string idempotencyToken) + { + if(!await CommentRepository.ExistsAsync(idempotencyToken)) + { + return; + } + + throw new UserFriendlyException(L["DuplicateCommentAttemptMessage"]); + } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Commenting/Default.cshtml b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Commenting/Default.cshtml index 8829df73c5..c1171d8ba6 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Commenting/Default.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Commenting/Default.cshtml @@ -31,6 +31,7 @@ data-reply-id="@(repliedCommentId?.ToString() ?? "")" style="@(string.IsNullOrEmpty(repliedCommentId?.ToString() ?? "") ? "" : "display:none")"> +
diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Commenting/default.js b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Commenting/default.js index 75f3288982..0d4616fe51 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Commenting/default.js +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Commenting/default.js @@ -107,10 +107,15 @@ function registerUpdateOfNewComment($container) { $container.find('.cms-comment-update-form').each(function () { - let $form = $(this); + var $form = $(this); + $form.submit(function (e) { e.preventDefault(); + + abp.ui.setBusy($form.find("button[type='submit']")); + let formAsObject = $form.serializeFormToObject(); + $.ajax({ type: 'POST', url: '/CmsKitPublicComments/Update/' + formAsObject.id, @@ -124,9 +129,11 @@ }), success: function () { widgetManager.refresh($widget); + abp.ui.clearBusy(); }, error: function (data) { abp.message.error(data.responseJSON.error.message); + abp.ui.clearBusy(); } }); }); @@ -135,10 +142,14 @@ function registerSubmissionOfNewComment($container) { $container.find('.cms-comment-form').each(function () { - let $form = $(this); + var $form = $(this); + $form.submit(function (e) { e.preventDefault(); - let formAsObject = $form.serializeFormToObject(); + + abp.ui.setBusy("button[type='submit']"); + + var formAsObject = $form.serializeFormToObject(); if (formAsObject.repliedCommentId == '') { formAsObject.repliedCommentId = null; @@ -146,6 +157,7 @@ if (formAsObject.commentText == '') { abp.message.error(l("CommentTextRequired")); + abp.ui.clearBusy(); return; } @@ -161,13 +173,16 @@ text: formAsObject.commentText, url: window.location.href, captchaToken: formAsObject.captchaId, - captchaAnswer: formAsObject.input?.captcha + captchaAnswer: formAsObject.input?.captcha, + idempotencyToken: formAsObject.idempotencyToken }), success: function () { widgetManager.refresh($widget); + abp.ui.clearBusy(); }, error: function (data) { abp.message.error(data.responseJSON.error.message); + abp.ui.clearBusy(); } }); }); From 1f2e5e74cf107d80c841f20456c78e70e69b104e Mon Sep 17 00:00:00 2001 From: Enis Necipoglu Date: Wed, 18 Oct 2023 17:59:56 +0300 Subject: [PATCH 015/179] Add filtered tags to UI --- .../Public/Blogs/IBlogPostPublicAppService.cs | 3 + .../Public/Blogs/BlogPostPublicAppService.cs | 14 +++- .../Public/Blogs/BlogPostPublicController.cs | 8 +++ .../Shared/Components/Tags/Default.cshtml | 4 +- .../Pages/Public/CmsKit/Blogs/BlogPost.cshtml | 5 +- .../Pages/Public/CmsKit/Blogs/Index.cshtml | 71 +++++++++++-------- .../Pages/Public/CmsKit/Blogs/Index.cshtml.cs | 9 ++- 7 files changed, 80 insertions(+), 34 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/IBlogPostPublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/IBlogPostPublicAppService.cs index dd21e2c903..c679420902 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/IBlogPostPublicAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/IBlogPostPublicAppService.cs @@ -17,5 +17,8 @@ public interface IBlogPostPublicAppService : IApplicationService Task> GetAuthorsHasBlogPostsAsync(BlogPostFilteredPagedAndSortedResultRequestDto input); Task GetAuthorHasBlogPostAsync(Guid id); + Task DeleteAsync(Guid id); + + Task GetTagNameAsync([NotNull] Guid tagId); } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Blogs/BlogPostPublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Blogs/BlogPostPublicAppService.cs index cd346f9a21..4a9875990d 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Blogs/BlogPostPublicAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Blogs/BlogPostPublicAppService.cs @@ -12,6 +12,7 @@ using Volo.CmsKit.Blogs; using Volo.CmsKit.Contents; using Volo.CmsKit.Features; using Volo.CmsKit.GlobalFeatures; +using Volo.CmsKit.Tags; using Volo.CmsKit.Users; namespace Volo.CmsKit.Public.Blogs; @@ -24,12 +25,16 @@ public class BlogPostPublicAppService : CmsKitPublicAppServiceBase, IBlogPostPub protected IBlogPostRepository BlogPostRepository { get; } + protected ITagRepository TagRepository { get; } + public BlogPostPublicAppService( IBlogRepository blogRepository, - IBlogPostRepository blogPostRepository) + IBlogPostRepository blogPostRepository, + ITagRepository tagRepository) { BlogRepository = blogRepository; BlogPostRepository = blogPostRepository; + TagRepository = tagRepository; } public virtual async Task GetAsync( @@ -85,4 +90,11 @@ public class BlogPostPublicAppService : CmsKitPublicAppServiceBase, IBlogPostPub await BlogPostRepository.DeleteAsync(id); } + + public async Task GetTagNameAsync([NotNull] Guid tagId) + { + var tag = await TagRepository.GetAsync(tagId); + + return tag.Name; + } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Blogs/BlogPostPublicController.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Blogs/BlogPostPublicController.cs index 4d2a336fca..d5b5768d34 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Blogs/BlogPostPublicController.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Blogs/BlogPostPublicController.cs @@ -1,5 +1,6 @@ using System; using System.Threading.Tasks; +using JetBrains.Annotations; using Microsoft.AspNetCore.Mvc; using Volo.Abp; using Volo.Abp.Application.Dtos; @@ -60,4 +61,11 @@ public class BlogPostPublicController : CmsKitPublicControllerBase, IBlogPostPub { return BlogPostPublicAppService.DeleteAsync(id); } + + [HttpGet] + [Route("tags/{id}")] + public Task GetTagNameAsync([NotNull] Guid tagId) + { + return BlogPostPublicAppService.GetTagNameAsync(tagId); + } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Tags/Default.cshtml b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Tags/Default.cshtml index e9567b8b3e..27ad1fa5ac 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Tags/Default.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Tags/Default.cshtml @@ -10,14 +10,14 @@ { if (Model.UrlFormat.IsNullOrWhiteSpace()) { - + @tag.Name } else { var formattedUrl = Model.UrlFormat.Replace("{TagId}", tag.Id.ToString()).Replace("{TagName}", tag.Name); - @tag.Name + @tag.Name } } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPost.cshtml b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPost.cshtml index 319d6ad2f2..160a732359 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPost.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPost.cshtml @@ -10,6 +10,7 @@ @using Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.Tags @using Volo.Abp.AspNetCore.Mvc.UI.Packages.HighlightJs @using Volo.CmsKit.Contents +@using Volo.CmsKit.Web @using Volo.CmsKit.Web.Pages.CmsKit.Components.Contents @inherits CmsKitPublicPageBase @@ -62,7 +63,7 @@

@Model.ViewModel.Title

- + @@@Model.ViewModel.Author?.UserName @Model.ViewModel.CreationTime @@ -89,7 +90,7 @@ { entityType = Volo.CmsKit.Blogs.BlogPostConsts.EntityType, entityId = Model.ViewModel.Id.ToString(), - urlFormat = $"/blogs/{Model.BlogSlug}?tagId={{TagId}}" + urlFormat = $"/{CmsBlogsWebConsts.BlogsRoutePrefix}/{Model.BlogSlug}?tagId={{TagId}}" }) } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml index 060f0c5c95..54211d7c40 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml @@ -2,18 +2,19 @@ @using Volo.CmsKit.Public.Web.Pages @using Volo.CmsKit.Public.Web.Pages.Public.CmsKit.Blogs +@using Volo.CmsKit.Web @inherits CmsKitPublicPageBase @model IndexModel -@section styles{ - +@section styles { + } @section scripts { - + } @@ -21,29 +22,43 @@ const string dummyImageSource = "https://dummyimage.com/320x180/a3a3a3/fff.png"; } - - -

- +@if (Model.AuthorId.HasValue) +{ + + +
+ - + + @if (Model.SelectedAuthor != null) + { + + } + +
+
+
+
+} + +@if (Model.TagId.HasValue) +{ +

@L["Tags"]

+ @Model.FilteredTagName + + +
+} - @if(Model.SelectedAuthor != null) - { - - } - -
- - @foreach (var blog in Model.Blogs.Items) { @@ -51,11 +66,11 @@ @if (blog.CoverImageMediaId != null) { - + } else { - + }
@blog.Title
@@ -65,7 +80,7 @@

@blog.ShortDescription

@@ -76,6 +91,6 @@
- + diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml.cs index 7feab76946..e47dd40816 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml.cs @@ -31,6 +31,8 @@ public class IndexModel : CmsKitPublicPageModelBase public CmsUserDto SelectedAuthor { get; protected set; } + public string FilteredTagName { get; protected set; } + protected IBlogPostPublicAppService BlogPostPublicAppService { get; } public IndexModel(IBlogPostPublicAppService blogPostPublicAppService) @@ -54,7 +56,12 @@ public class IndexModel : CmsKitPublicPageModelBase { SelectedAuthor = await BlogPostPublicAppService.GetAuthorHasBlogPostAsync(AuthorId.Value); } - + + if (TagId is not null) + { + FilteredTagName = await BlogPostPublicAppService.GetTagNameAsync(TagId.Value); + } + return Page(); } } From 2e29d194896829293c976be4afa888f9155f1a65 Mon Sep 17 00:00:00 2001 From: Enis Necipoglu Date: Wed, 18 Oct 2023 18:04:42 +0300 Subject: [PATCH 016/179] Update Index.cshtml --- .../Pages/Public/CmsKit/Blogs/Index.cshtml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml index 54211d7c40..79f96e3cc1 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml @@ -52,7 +52,7 @@ @if (Model.TagId.HasValue) { -

@L["Tags"]

+

@L["Tags"]

@Model.FilteredTagName From 705730339f72e02a1466f4c34937bcd652d88e16 Mon Sep 17 00:00:00 2001 From: Engincan VESKE <43685404+EngincanV@users.noreply.github.com> Date: Wed, 18 Oct 2023 20:40:51 +0300 Subject: [PATCH 017/179] CMS Kit: Fix tests and add new tests for CommentPublicAppService --- .../Public/Comments/CreateCommentInput.cs | 1 + .../CreateCommentWithParametersInput.cs | 1 + .../Comments/CommentPublicAppService_Tests.cs | 28 +++++++++++++++++-- .../CmsKitDataSeedContributor.cs | 2 +- .../Volo.CmsKit.TestBase/CmsKitTestData.cs | 2 ++ 5 files changed, 30 insertions(+), 4 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CreateCommentInput.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CreateCommentInput.cs index cc5ee3efec..d17e8c9deb 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CreateCommentInput.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CreateCommentInput.cs @@ -21,5 +21,6 @@ public class CreateCommentInput : ExtensibleObject public string Url { get; set; } + [Required] public string IdempotencyToken { get; set; } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CreateCommentWithParametersInput.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CreateCommentWithParametersInput.cs index ec7aad1398..fda4856ffb 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CreateCommentWithParametersInput.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CreateCommentWithParametersInput.cs @@ -26,5 +26,6 @@ public class CreateCommentWithParametersInput public string Url { get; set; } + [Required] public string IdempotencyToken { get; set; } } diff --git a/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Comments/CommentPublicAppService_Tests.cs b/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Comments/CommentPublicAppService_Tests.cs index cbb165c1cd..d01fc295cf 100644 --- a/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Comments/CommentPublicAppService_Tests.cs +++ b/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Comments/CommentPublicAppService_Tests.cs @@ -1,4 +1,5 @@ -using System.Linq; +using System; +using System.Linq; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using NSubstitute; @@ -48,7 +49,8 @@ public class CommentPublicAppService_Tests : CmsKitApplicationTestBase new CreateCommentInput { RepliedCommentId = null, - Text = "newComment" + Text = "newComment", + IdempotencyToken = Guid.NewGuid().ToString("N") } ); @@ -75,7 +77,8 @@ public class CommentPublicAppService_Tests : CmsKitApplicationTestBase new CreateCommentInput { RepliedCommentId = null, - Text = text + Text = text, + IdempotencyToken = Guid.NewGuid().ToString("N") } ); } @@ -95,6 +98,25 @@ public class CommentPublicAppService_Tests : CmsKitApplicationTestBase { RepliedCommentId = null, Text = text, //not allowed URL + IdempotencyToken = Guid.NewGuid().ToString("N") + } + )); + } + + [Fact] + public async Task CreateAsync_ShouldThrowUserFriendlyException_If_IdempotencyToken_Not_Unique() + { + _currentUser.Id.Returns(_cmsKitTestData.User2Id); + + await Should.ThrowAsync(async () => + await _commentAppService.CreateAsync( + _cmsKitTestData.EntityType1, + _cmsKitTestData.EntityId1, + new CreateCommentInput + { + RepliedCommentId = null, + Text = "", + IdempotencyToken = _cmsKitTestData.IdempotencyToken_1 } )); } diff --git a/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitDataSeedContributor.cs b/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitDataSeedContributor.cs index af5ee0754a..f17a95ddba 100644 --- a/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitDataSeedContributor.cs +++ b/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitDataSeedContributor.cs @@ -194,7 +194,7 @@ public class CmsKitDataSeedContributor : IDataSeedContributor, ITransientDepende "comment", null, _cmsKitTestData.User1Id - )); + ){ IdempotencyToken = _cmsKitTestData.IdempotencyToken_1 }); await _commentRepository.InsertAsync(new Comment(_guidGenerator.Create(), _cmsKitTestData.EntityType1, diff --git a/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitTestData.cs b/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitTestData.cs index cfa54d2e55..8c4c07e283 100644 --- a/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitTestData.cs +++ b/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitTestData.cs @@ -131,4 +131,6 @@ public class CmsKitTestData : ISingletonDependency public string PollName { get; } = "Poll"; public string WidgetName { get; } = "CmsPollByCode"; + + public string IdempotencyToken_1 { get; } = Guid.NewGuid().ToString("N"); } From 1c5789dd6a8b368d1787fa85dfd69755d3309a87 Mon Sep 17 00:00:00 2001 From: Enis Necipoglu Date: Thu, 19 Oct 2023 11:15:51 +0300 Subject: [PATCH 018/179] Add readonly support to rating --- .../Pages/Index.cshtml | 7 +- .../Shared/Components/Rating/Default.cshtml | 91 ++++++++++--------- .../Components/Rating/RatingViewComponent.cs | 7 +- .../Shared/Components/Rating/default.js | 3 +- 4 files changed, 59 insertions(+), 49 deletions(-) diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Pages/Index.cshtml b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Pages/Index.cshtml index 1b3f3ff94c..860c2350ac 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Pages/Index.cshtml +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Pages/Index.cshtml @@ -48,7 +48,12 @@ @if (GlobalFeatureManager.Instance.IsEnabled()) { - @await Component.InvokeAsync(typeof(RatingViewComponent), new {entityType = "quote", entityId = "1"}) + @await Component.InvokeAsync(typeof(RatingViewComponent), new + { + entityType = "quote", + entityId = "1", + isReadOnly = false + }) } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/Default.cshtml b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/Default.cshtml index 9b7f6e24f7..95879128a7 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/Default.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/Default.cshtml @@ -6,58 +6,59 @@ @inject IHtmlLocalizer L
-
-
- @if (CurrentUser.IsAuthenticated) +
+
+ + @if (CurrentUser.IsAuthenticated) + { + @if (!Model.IsReadOnly && Model.CurrentRating != null) { - @if (Model.CurrentRating != null) - { - - @L["Undo"] - - } - if (Model.Ratings != null) - { - - - + + @L["Undo"] + + } + if (Model.Ratings != null) + { + + + - "> + + }
-
\ No newline at end of file +
+
\ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/RatingViewComponent.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/RatingViewComponent.cs index b928f7e2af..7ab1df47b8 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/RatingViewComponent.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/RatingViewComponent.cs @@ -31,7 +31,7 @@ public class RatingViewComponent : AbpViewComponent CurrentUser = currentUser; } - public virtual async Task InvokeAsync(string entityType, string entityId) + public virtual async Task InvokeAsync(string entityType, string entityId, bool isReadOnly = false) { var ratings = await RatingPublicAppService.GetGroupedStarCountsAsync(entityType, entityId); var totalRating = ratings.Sum(x => x.Count); @@ -52,7 +52,8 @@ public class RatingViewComponent : AbpViewComponent LoginUrl = loginUrl, Ratings = ratings, CurrentRating = currentUserRating, - TotalRating = totalRating + TotalRating = totalRating, + IsReadOnly = isReadOnly }; return View("~/Pages/CmsKit/Shared/Components/Rating/Default.cshtml", viewModel); @@ -72,4 +73,6 @@ public class RatingViewModel public short? CurrentRating { get; set; } public int TotalRating { get; set; } + + public bool IsReadOnly { get; set; } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/default.js b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/default.js index 22531b47f3..69bb1bac4f 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/default.js +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/default.js @@ -15,6 +15,7 @@ function registerCreateOfNewRating() { $widget.find(".my-rating").each(function () { var authenticated = $(this).attr("data-authenticated"); + var readonly = $(this).attr("data-readonly"); $(this).starRating({ initialRating: 0, @@ -26,7 +27,7 @@ strokeWidth: 0, disableAfterRate: true, useFullStars: true, - readOnly: authenticated === "True", + readOnly: authenticated === "True" || readonly === "True", onHover: function (currentIndex, currentRating, $el) { $widget.find(".live-rating").text(currentIndex); }, From 0289e15a8f4fd51624e01ce3e3b744bb13de6642 Mon Sep 17 00:00:00 2001 From: Enis Necipoglu Date: Thu, 19 Oct 2023 11:31:22 +0300 Subject: [PATCH 019/179] Add readonly support to CommentingViewComponent --- .../Pages/Index.cshtml | 8 +- .../Commenting/CommentingViewComponent.cs | 6 +- .../Components/Commenting/Default.cshtml | 176 +++++++++--------- 3 files changed, 103 insertions(+), 87 deletions(-) diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Pages/Index.cshtml b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Pages/Index.cshtml index 860c2350ac..5302289fb3 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Pages/Index.cshtml +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Pages/Index.cshtml @@ -65,7 +65,13 @@ @if (GlobalFeatureManager.Instance.IsEnabled()) { - @await Component.InvokeAsync(typeof(CommentingViewComponent), new {entityType = "quote", entityId = "1", referralLinks = new [] {"nofollow"}}) + @await Component.InvokeAsync(typeof(CommentingViewComponent), new + { + entityType = "quote", + entityId = "1", + isReadOnly = false, + referralLinks = new [] {"nofollow"} + }) } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Commenting/CommentingViewComponent.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Commenting/CommentingViewComponent.cs index 5810103ea9..32503ceab7 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Commenting/CommentingViewComponent.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Commenting/CommentingViewComponent.cs @@ -60,6 +60,7 @@ public class CommentingViewComponent : AbpViewComponent public virtual async Task InvokeAsync( string entityType, string entityId, + bool isReadOnly, IEnumerable referralLinks = null) { referralLinks ??= Enumerable.Empty(); @@ -74,7 +75,8 @@ public class CommentingViewComponent : AbpViewComponent EntityType = entityType, ReferralLinks = referralLinks, LoginUrl = loginUrl, - Comments = comments.OrderByDescending(i => i.CreationTime).ToList() + IsReadOnly = isReadOnly, + Comments = comments.OrderByDescending(i => i.CreationTime).ToList(), }; await ConvertMarkdownTextsToHtml(viewModel); @@ -144,6 +146,8 @@ public class CommentingViewComponent : AbpViewComponent public string Captcha { get; set; } public string CaptchaImageBase64 { get; set; } + + public bool IsReadOnly { get; set; } } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Commenting/Default.cshtml b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Commenting/Default.cshtml index 8829df73c5..29ab21223c 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Commenting/Default.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Commenting/Default.cshtml @@ -20,16 +20,16 @@ @ @((string.IsNullOrWhiteSpace(author.Name) - ? author.UserName - : author.Name + " " + author.Surname).Trim()) + ? author.UserName + : author.Name + " " + author.Surname).Trim()) @creationTime.ToString() ; } @{ Func GetCommentArea(Guid? repliedCommentId, bool cancelButton = false) => @
+ data-reply-id="@(repliedCommentId?.ToString() ?? "")" + style="@(string.IsNullOrEmpty(repliedCommentId?.ToString() ?? "") ? "" : "display:none")">
@@ -43,31 +43,31 @@
@if (CmsKitCommentOptions.Value.IsRecaptchaEnabled) - { -
- -
-
- -
-
- -
- + { +
+ +
+
+ +
+
+
+
- } +
+ }
@L["Send"] @if (cancelButton) - { - - @L["Cancel"] - - } + { + + @L["Cancel"] + + }
@@ -86,32 +86,32 @@ Func GetCommentActionArea(Guid id, Guid authorId, bool isReply) => @
@if (!isReply) - { - @if (CurrentUser.IsAuthenticated) - { - - @L["Reply"] - + { + @if (CurrentUser.IsAuthenticated) + { + + @L["Reply"] + + + + @L["Delete"] + + } + else + { + + @L["LoginToReply"] + + } + } + - - @L["Delete"] - - } - else - { - - @L["LoginToReply"] - - } - } - - @if (authorId == CurrentUser.Id) - { - - @L["Edit"] - - } + { + + @L["Edit"] + + }
; } @{ @@ -128,26 +128,26 @@
- @L["MarkdownSupported"] + @L["MarkdownSupported"]
@if (CmsKitCommentOptions.Value.IsRecaptchaEnabled) - { - var output = await Model.GenerateCaptchaAsync(); + { + var output = await Model.GenerateCaptchaAsync(); -
- -
-
- -
-
- -
- +
+ +
+
+ +
+
+
+
- } +
+ }
@L["Update"] @@ -183,22 +183,25 @@ @GetCommentContentArea(comment.Id, comment.Text).Invoke(null) -
-
-
- @GetCommentActionArea(comment.Id, comment.Author.Id, false).Invoke(null) + @if (!Model.Input.IsReadOnly) + { +
+
+
+ @GetCommentActionArea(comment.Id, comment.Author.Id, false).Invoke(null) +
-
-
-
- @if (cmsKitUiOptions.Value.CommentsOptions.IsReactionsEnabled && GlobalFeatureManager.Instance.IsEnabled()) - { - @await Component.InvokeAsync(typeof(ReactionSelectionViewComponent), new { entityType = "comment", entityId = comment.Id.ToString() }) - } +
+
+ @if (cmsKitUiOptions.Value.CommentsOptions.IsReactionsEnabled && GlobalFeatureManager.Instance.IsEnabled()) + { + @await Component.InvokeAsync(typeof(ReactionSelectionViewComponent), new { entityType = "comment", entityId = comment.Id.ToString() }) + } +
-
- @GetEditArea(comment.Id, Model.Input.RawCommentTexts[comment.Id], comment.ConcurrencyStamp).Invoke(null) + @GetEditArea(comment.Id, Model.Input.RawCommentTexts[comment.Id], comment.ConcurrencyStamp).Invoke(null) + } @if (comment.Replies.Any()) { @@ -212,23 +215,26 @@ @GetCommentContentArea(reply.Id, reply.Text).Invoke(null) -
-
-
- @GetCommentActionArea(reply.Id, reply.Author.Id, true).Invoke(null) + @if (!Model.Input.IsReadOnly) + { +
+
+
+ @GetCommentActionArea(reply.Id, reply.Author.Id, true).Invoke(null) +
-
-
-
- @if (cmsKitUiOptions.Value.CommentsOptions.IsReactionsEnabled && GlobalFeatureManager.Instance.IsEnabled()) - { - @await Component.InvokeAsync(typeof(ReactionSelectionViewComponent), new { entityType = "comment", entityId = reply.Id.ToString() }) - } +
+
+ @if (cmsKitUiOptions.Value.CommentsOptions.IsReactionsEnabled && GlobalFeatureManager.Instance.IsEnabled()) + { + @await Component.InvokeAsync(typeof(ReactionSelectionViewComponent), new { entityType = "comment", entityId = reply.Id.ToString() }) + } +
-
- @GetEditArea(reply.Id, Model.Input.RawCommentTexts[reply.Id], reply.ConcurrencyStamp).Invoke(null) + @GetEditArea(reply.Id, Model.Input.RawCommentTexts[reply.Id], reply.ConcurrencyStamp).Invoke(null) + }
} From 8219b064e2c13db53961c8f79eaeedc39a093137 Mon Sep 17 00:00:00 2001 From: Enis Necipoglu Date: Thu, 19 Oct 2023 11:33:38 +0300 Subject: [PATCH 020/179] Update CMSKit docs according to readonly support --- docs/en/Modules/Cms-Kit/Comments.md | 1 + docs/en/Modules/Cms-Kit/Ratings.md | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/en/Modules/Cms-Kit/Comments.md b/docs/en/Modules/Cms-Kit/Comments.md index cc8d01249b..ddd39fc675 100644 --- a/docs/en/Modules/Cms-Kit/Comments.md +++ b/docs/en/Modules/Cms-Kit/Comments.md @@ -53,6 +53,7 @@ The comment system provides a commenting [widget](../../UI/AspNetCore/Widgets.md { entityType = "Product", entityId = "...", + isReadOnly = false, referralLinks = new [] {"nofollow"} }) ``` diff --git a/docs/en/Modules/Cms-Kit/Ratings.md b/docs/en/Modules/Cms-Kit/Ratings.md index db58602c15..e6a2ba97fd 100644 --- a/docs/en/Modules/Cms-Kit/Ratings.md +++ b/docs/en/Modules/Cms-Kit/Ratings.md @@ -41,7 +41,8 @@ The ratings system provides a rating widget to allow users send ratings to resou @await Component.InvokeAsync(typeof(RatingViewComponent), new { entityType = "Product", - entityId = "entityId" + entityId = "entityId", + isReadOnly = false }) ``` From bbc620186a8f844fa4d69161cf0a684e0ca2a6cd Mon Sep 17 00:00:00 2001 From: Salih Date: Thu, 19 Oct 2023 12:00:56 +0300 Subject: [PATCH 021/179] Fix the version problem in cms kit --- Directory.Packages.props | 2 +- .../Captcha/SimpleMathsCaptchaGenerator.cs | 20 ++++++++++--------- .../Volo.CmsKit.Public.Web.csproj | 2 +- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index ae21b20429..91574ec319 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -139,7 +139,7 @@ - + diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Security/Captcha/SimpleMathsCaptchaGenerator.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Security/Captcha/SimpleMathsCaptchaGenerator.cs index bd7f9f0371..f3e1a46403 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Security/Captcha/SimpleMathsCaptchaGenerator.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Security/Captcha/SimpleMathsCaptchaGenerator.cs @@ -116,7 +116,9 @@ public class SimpleMathsCaptchaGenerator : ITransientDependency var random = new Random(); var startWith = (byte)random.Next(5, 10); image.Mutate(ctx => ctx.BackgroundColor(Color.Transparent)); - var fontFamily = SystemFonts.Families.FirstOrDefault(x => x.IsStyleAvailable(options.FontStyle))?.Name ?? SystemFonts.Families.First().Name; + var fontFamily = SystemFonts.Families + .FirstOrDefault(x => x.GetAvailableStyles().Contains(options.FontStyle), SystemFonts.Families.First()) + .Name; var font = SystemFonts.CreateFont(fontFamily, options.FontSize, options.FontStyle); foreach (var character in stringText) @@ -125,7 +127,7 @@ public class SimpleMathsCaptchaGenerator : ITransientDependency var color = options.TextColor[random.Next(0, options.TextColor.Length)]; var location = new PointF(startWith + position, random.Next(6, 13)); image.Mutate(ctx => ctx.DrawText(text, font, color, location)); - position += TextMeasurer.Measure(character.ToString(), new RendererOptions(font, location)).Width; + position += TextMeasurer.MeasureSize(character.ToString(), new TextOptions(font)).Width; } //add rotation @@ -133,7 +135,7 @@ public class SimpleMathsCaptchaGenerator : ITransientDependency image.Mutate(ctx => ctx.Transform(rotation)); // add the dynamic image to original image - var size = (ushort)TextMeasurer.Measure(stringText, new RendererOptions(font)).Width; + var size = (ushort)TextMeasurer.MeasureSize(stringText, new TextOptions(font)).Width; var img = new Image(size + 15, options.Height); img.Mutate(ctx => ctx.BackgroundColor(Color.White)); @@ -146,7 +148,7 @@ public class SimpleMathsCaptchaGenerator : ITransientDependency var y1 = random.Next(0, img.Height); img.Mutate(ctx => - ctx.DrawLines(options.TextColor[random.Next(0, options.TextColor.Length)], + ctx.DrawLine(options.TextColor[random.Next(0, options.TextColor.Length)], RandomTextGenerator.GenerateNextFloat(options.MinLineThickness, options.MaxLineThickness), new PointF[] { new PointF(x0, y0), new PointF(x1, y1) }) ); @@ -154,14 +156,14 @@ public class SimpleMathsCaptchaGenerator : ITransientDependency img.Mutate(ctx => ctx.DrawImage(image, 0.80f)); - Parallel.For(0, options.NoiseRate, i => + Parallel.For(0, options.NoiseRate, _ => { - var x0 = random.Next(0, img.Width); - var y0 = random.Next(0, img.Height); + var x0 = random.Next(0, img.Width - 1); + var y0 = random.Next(0, img.Height - 1); img.Mutate( ctx => ctx - .DrawLines(options.NoiseRateColor[random.Next(0, options.NoiseRateColor.Length)], - RandomTextGenerator.GenerateNextFloat(0.5, 1.5), new PointF[] { new Vector2(x0, y0), new Vector2(x0, y0) }) + .DrawLine(options.NoiseRateColor[random.Next(0, options.NoiseRateColor.Length)], + RandomTextGenerator.GenerateNextFloat(0.5, 1.5), new (x0, y0), new (x0 + 0.01f, y0 + 0.01f)) ); }); diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Volo.CmsKit.Public.Web.csproj b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Volo.CmsKit.Public.Web.csproj index ac6f26aa08..81d3a66bea 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Volo.CmsKit.Public.Web.csproj +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Volo.CmsKit.Public.Web.csproj @@ -18,7 +18,7 @@ - + From a2fcff32b5e2211c2054140c047dd6853366383e Mon Sep 17 00:00:00 2001 From: Enis Necipoglu Date: Thu, 19 Oct 2023 12:04:45 +0300 Subject: [PATCH 022/179] Update Client Proxies --- modules/cms-kit/README.md | 24 +++++++ .../cms-kit-admin-generate-proxy.json | 4 +- .../Blogs/BlogFeatureClientProxy.Generated.cs | 28 ++++++++ .../CmsKit/Blogs/BlogFeatureClientProxy.cs | 7 ++ .../MediaDescriptorClientProxy.Generated.cs | 28 ++++++++ .../MediaDescriptorClientProxy.cs | 7 ++ .../cms-kit-common-generate-proxy.json | 54 ++++++++++++++- .../BlogPostPublicClientProxy.Generated.cs | 8 +++ .../ClientProxies/cms-kit-generate-proxy.json | 66 +++++++++++++++++++ 9 files changed, 222 insertions(+), 4 deletions(-) create mode 100644 modules/cms-kit/README.md create mode 100644 modules/cms-kit/src/Volo.CmsKit.Common.HttpApi.Client/ClientProxies/Volo/CmsKit/Blogs/BlogFeatureClientProxy.Generated.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Common.HttpApi.Client/ClientProxies/Volo/CmsKit/Blogs/BlogFeatureClientProxy.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Common.HttpApi.Client/ClientProxies/Volo/CmsKit/MediaDescriptors/MediaDescriptorClientProxy.Generated.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Common.HttpApi.Client/ClientProxies/Volo/CmsKit/MediaDescriptors/MediaDescriptorClientProxy.cs diff --git a/modules/cms-kit/README.md b/modules/cms-kit/README.md new file mode 100644 index 0000000000..0f04a38ab8 --- /dev/null +++ b/modules/cms-kit/README.md @@ -0,0 +1,24 @@ +# CMS Kit + +## Updating Client Proxies + +This project have 3 types of client proxies. Before updating client proxies, make sure `Volo.CmsKit.Web.Unified` project is running. +Then you can update Client proxies in 3 different projects. Execute the following commands in the directory of the each project. + +- CMS Kit Public (**Volo.CmsKit.Public.HttpApi.Client**) + ```bash + abp generate-proxy -t csharp -url https://localhost:44349 -m cms-kit --without-contracts + ``` + +- CMS Kit Common (**Volo.CmsKit.Common.HttpApi.Client**) + + ```bash + abp generate-proxy -t csharp -url https://localhost:44349 -m cms-kit-common --without-contracts + ``` + +- CMS Kit Admin (**Volo.CmsKit.Admin.HttpApi.Client**) + + ```bash + abp generate-proxy -t csharp -url https://localhost:44349 -m cms-kit-admin --without-contracts + ``` + diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/cms-kit-admin-generate-proxy.json b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/cms-kit-admin-generate-proxy.json index 73b1e7dfd4..cbb5992ebd 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/cms-kit-admin-generate-proxy.json +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/cms-kit-admin-generate-proxy.json @@ -2873,8 +2873,8 @@ "nameOnMethod": "input", "name": "Status", "jsonName": null, - "type": "Volo.CmsKit.Blogs.BlogPostStatus?", - "typeSimple": "Volo.CmsKit.Blogs.BlogPostStatus?", + "type": "System.String", + "typeSimple": "string", "isOptional": false, "defaultValue": null, "constraintTypes": null, diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.HttpApi.Client/ClientProxies/Volo/CmsKit/Blogs/BlogFeatureClientProxy.Generated.cs b/modules/cms-kit/src/Volo.CmsKit.Common.HttpApi.Client/ClientProxies/Volo/CmsKit/Blogs/BlogFeatureClientProxy.Generated.cs new file mode 100644 index 0000000000..77485c92db --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Common.HttpApi.Client/ClientProxies/Volo/CmsKit/Blogs/BlogFeatureClientProxy.Generated.cs @@ -0,0 +1,28 @@ +// This file is automatically generated by ABP framework to use MVC Controllers from CSharp +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Volo.Abp; +using Volo.Abp.Application.Dtos; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Http.Client; +using Volo.Abp.Http.Client.ClientProxying; +using Volo.Abp.Http.Modeling; +using Volo.CmsKit.Blogs; + +// ReSharper disable once CheckNamespace +namespace Volo.CmsKit.Blogs; + +[Dependency(ReplaceServices = true)] +[ExposeServices(typeof(IBlogFeatureAppService), typeof(BlogFeatureClientProxy))] +public partial class BlogFeatureClientProxy : ClientProxyBase, IBlogFeatureAppService +{ + public virtual async Task GetOrDefaultAsync(Guid blogId, string featureName) + { + return await RequestAsync(nameof(GetOrDefaultAsync), new ClientProxyRequestTypeValue + { + { typeof(Guid), blogId }, + { typeof(string), featureName } + }); + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.HttpApi.Client/ClientProxies/Volo/CmsKit/Blogs/BlogFeatureClientProxy.cs b/modules/cms-kit/src/Volo.CmsKit.Common.HttpApi.Client/ClientProxies/Volo/CmsKit/Blogs/BlogFeatureClientProxy.cs new file mode 100644 index 0000000000..e9752dfcc9 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Common.HttpApi.Client/ClientProxies/Volo/CmsKit/Blogs/BlogFeatureClientProxy.cs @@ -0,0 +1,7 @@ +// This file is part of BlogFeatureClientProxy, you can customize it here +// ReSharper disable once CheckNamespace +namespace Volo.CmsKit.Blogs; + +public partial class BlogFeatureClientProxy +{ +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.HttpApi.Client/ClientProxies/Volo/CmsKit/MediaDescriptors/MediaDescriptorClientProxy.Generated.cs b/modules/cms-kit/src/Volo.CmsKit.Common.HttpApi.Client/ClientProxies/Volo/CmsKit/MediaDescriptors/MediaDescriptorClientProxy.Generated.cs new file mode 100644 index 0000000000..67eaa76785 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Common.HttpApi.Client/ClientProxies/Volo/CmsKit/MediaDescriptors/MediaDescriptorClientProxy.Generated.cs @@ -0,0 +1,28 @@ +// This file is automatically generated by ABP framework to use MVC Controllers from CSharp +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Volo.Abp; +using Volo.Abp.Application.Dtos; +using Volo.Abp.Content; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Http.Client; +using Volo.Abp.Http.Client.ClientProxying; +using Volo.Abp.Http.Modeling; +using Volo.CmsKit.MediaDescriptors; + +// ReSharper disable once CheckNamespace +namespace Volo.CmsKit.MediaDescriptors; + +[Dependency(ReplaceServices = true)] +[ExposeServices(typeof(IMediaDescriptorAppService), typeof(MediaDescriptorClientProxy))] +public partial class MediaDescriptorClientProxy : ClientProxyBase, IMediaDescriptorAppService +{ + public virtual async Task DownloadAsync(Guid id) + { + return await RequestAsync(nameof(DownloadAsync), new ClientProxyRequestTypeValue + { + { typeof(Guid), id } + }); + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.HttpApi.Client/ClientProxies/Volo/CmsKit/MediaDescriptors/MediaDescriptorClientProxy.cs b/modules/cms-kit/src/Volo.CmsKit.Common.HttpApi.Client/ClientProxies/Volo/CmsKit/MediaDescriptors/MediaDescriptorClientProxy.cs new file mode 100644 index 0000000000..028ccff1a2 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Common.HttpApi.Client/ClientProxies/Volo/CmsKit/MediaDescriptors/MediaDescriptorClientProxy.cs @@ -0,0 +1,7 @@ +// This file is part of MediaDescriptorClientProxy, you can customize it here +// ReSharper disable once CheckNamespace +namespace Volo.CmsKit.MediaDescriptors; + +public partial class MediaDescriptorClientProxy +{ +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.HttpApi.Client/ClientProxies/cms-kit-common-generate-proxy.json b/modules/cms-kit/src/Volo.CmsKit.Common.HttpApi.Client/ClientProxies/cms-kit-common-generate-proxy.json index 6b7b45220a..07e4bf762c 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Common.HttpApi.Client/ClientProxies/cms-kit-common-generate-proxy.json +++ b/modules/cms-kit/src/Volo.CmsKit.Common.HttpApi.Client/ClientProxies/cms-kit-common-generate-proxy.json @@ -8,11 +8,32 @@ "controllerName": "MediaDescriptor", "controllerGroupName": "MediaDescriptor", "isRemoteService": true, + "isIntegrationService": false, "apiVersion": null, "type": "Volo.CmsKit.MediaDescriptors.MediaDescriptorController", "interfaces": [ { - "type": "Volo.CmsKit.MediaDescriptors.IMediaDescriptorAppService" + "type": "Volo.CmsKit.MediaDescriptors.IMediaDescriptorAppService", + "name": "IMediaDescriptorAppService", + "methods": [ + { + "name": "DownloadAsync", + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Content.RemoteStreamContent", + "typeSimple": "Volo.Abp.Content.RemoteStreamContent" + } + } + ] } ], "actions": { @@ -59,11 +80,40 @@ "controllerName": "BlogFeature", "controllerGroupName": "BlogFeature", "isRemoteService": true, + "isIntegrationService": false, "apiVersion": null, "type": "Volo.CmsKit.Blogs.BlogFeatureController", "interfaces": [ { - "type": "Volo.CmsKit.Blogs.IBlogFeatureAppService" + "type": "Volo.CmsKit.Blogs.IBlogFeatureAppService", + "name": "IBlogFeatureAppService", + "methods": [ + { + "name": "GetOrDefaultAsync", + "parametersOnMethod": [ + { + "name": "blogId", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "featureName", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.CmsKit.Blogs.BlogFeatureDto", + "typeSimple": "Volo.CmsKit.Blogs.BlogFeatureDto" + } + } + ] } ], "actions": { diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Blogs/BlogPostPublicClientProxy.Generated.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Blogs/BlogPostPublicClientProxy.Generated.cs index f269125676..d185f22a27 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Blogs/BlogPostPublicClientProxy.Generated.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/Volo/CmsKit/Public/Blogs/BlogPostPublicClientProxy.Generated.cs @@ -60,4 +60,12 @@ public partial class BlogPostPublicClientProxy : ClientProxyBase GetTagNameAsync(Guid tagId) + { + return await RequestAsync(nameof(GetTagNameAsync), new ClientProxyRequestTypeValue + { + { typeof(Guid), tagId } + }); + } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/cms-kit-generate-proxy.json b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/cms-kit-generate-proxy.json index 477938b6de..31e3fb52f8 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/cms-kit-generate-proxy.json +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/cms-kit-generate-proxy.json @@ -1512,6 +1512,23 @@ "type": "System.Void", "typeSimple": "System.Void" } + }, + { + "name": "GetTagNameAsync", + "parametersOnMethod": [ + { + "name": "tagId", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.String", + "typeSimple": "string" + } } ] } @@ -1825,6 +1842,55 @@ }, "allowAnonymous": null, "implementFrom": "Volo.CmsKit.Public.Blogs.IBlogPostPublicAppService" + }, + "GetTagNameAsyncByTagId": { + "uniqueName": "GetTagNameAsyncByTagId", + "name": "GetTagNameAsync", + "httpMethod": "GET", + "url": "api/cms-kit-public/blog-posts/tags/{id}", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "tagId", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "tagId", + "name": "tagId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "" + }, + { + "nameOnMethod": "id", + "name": "id", + "jsonName": null, + "type": null, + "typeSimple": null, + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.String", + "typeSimple": "string" + }, + "allowAnonymous": null, + "implementFrom": "Volo.CmsKit.Public.Blogs.IBlogPostPublicAppService" } } } From c80cf4a9a432708a9bd7d56478247e8f63a28206 Mon Sep 17 00:00:00 2001 From: Salih Date: Thu, 19 Oct 2023 13:47:42 +0300 Subject: [PATCH 023/179] Add new localizations --- .../Community/Localization/Resources/en.json | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en.json index f295468ded..d9326a3683 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en.json @@ -235,6 +235,13 @@ "SponsoredConferencesDescription": "We are honoring to support .NET communities and events for software developers.", "UpcomingEvents": "Upcoming Events", "UpcomingCommunityTalkEventDescription": "The live shows, hosted by the ABP Team, are casual sessions full of community content, demos, Q&A, and discussions around what's happening in ABP.", - "UpcomingConferenceEventDescription": "ABP .NET Conference is a virtual event for the .NET Developer community to come together and listen to talks about the .NET world, common software development practices and the open source ABP Framework." + "UpcomingConferenceEventDescription": "ABP .NET Conference is a virtual event for the .NET Developer community to come together and listen to talks about the .NET world, common software development practices and the open source ABP Framework.", + "LastOneYear": "Last 1 Year", + "AllTimes": "All Times", + "TopContributors": "Top Contributors", + "{0}Posts": "{0} Posts", + "LATESTPOSTS": "LATEST POSTS", + "NoContributorsFound": "No contributors found!", + "LatestPost": "Latest post" } } From 4b739927373d35156b7d0efb09e1b93b54a4d552 Mon Sep 17 00:00:00 2001 From: Sinan997 Date: Thu, 19 Oct 2023 16:39:59 +0300 Subject: [PATCH 024/179] lint test files --- .../packages/core/src/lib/tests/capsLock.directive.spec.ts | 2 +- .../core/src/lib/tests/show-password-directive.spec.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/npm/ng-packs/packages/core/src/lib/tests/capsLock.directive.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/capsLock.directive.spec.ts index 3182dfa2dd..9ba6095206 100644 --- a/npm/ng-packs/packages/core/src/lib/tests/capsLock.directive.spec.ts +++ b/npm/ng-packs/packages/core/src/lib/tests/capsLock.directive.spec.ts @@ -11,7 +11,7 @@ import { By } from '@angular/platform-browser'; imports:[TrackCapsLockDirective] }) class TestComponent { - capsLock:boolean = false + capsLock = false } describe('TrackCapsLockDirective',()=>{ diff --git a/npm/ng-packs/packages/core/src/lib/tests/show-password-directive.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/show-password-directive.spec.ts index 8babb472c4..a1e766dc51 100644 --- a/npm/ng-packs/packages/core/src/lib/tests/show-password-directive.spec.ts +++ b/npm/ng-packs/packages/core/src/lib/tests/show-password-directive.spec.ts @@ -13,7 +13,7 @@ import { By } from '@angular/platform-browser'; imports:[ShowPasswordDirective] }) class TestComponent { - showPassword:boolean = false + showPassword = false } describe('ShowPasswordDirective',()=>{ @@ -46,7 +46,7 @@ describe('ShowPasswordDirective',()=>{ }); it('should have three input has ShowPasswordDirective elements', () => { - let input = des[2].nativeElement + const input = des[2].nativeElement expect(input.type).toBe('password') fixture.componentInstance.showPassword = true fixture.detectChanges() From efd17f7d2f6efa1a089591efef45525fa73b1309 Mon Sep 17 00:00:00 2001 From: Salih Date: Thu, 19 Oct 2023 16:57:59 +0300 Subject: [PATCH 025/179] Add new localizations --- .../AbpIoLocalization/Base/Localization/Resources/en.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json index 92c34ab456..69796af696 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json @@ -221,6 +221,8 @@ "More": "More", "WhyABPIOPlatform": "Why ABP.IO Platform?", "AbpStudio": "ABP Studio", - "ExtraMonths": "{0}EXTRA MONTHS" + "ExtraMonths": "{0}EXTRA MONTHS", + "RSS": "RSS", + "RSSFeed": "RSS Feed" } } From 2c8f24861b4653c361e2d3a21ca2141bc20a05ae Mon Sep 17 00:00:00 2001 From: Enis Necipoglu Date: Thu, 19 Oct 2023 17:34:56 +0300 Subject: [PATCH 026/179] Update CmsKitWebUnifiedModule.cs --- .../host/Volo.CmsKit.Web.Unified/CmsKitWebUnifiedModule.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/CmsKitWebUnifiedModule.cs b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/CmsKitWebUnifiedModule.cs index aaadd40f84..ec98cbcf78 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/CmsKitWebUnifiedModule.cs +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/CmsKitWebUnifiedModule.cs @@ -116,8 +116,6 @@ public class CmsKitWebUnifiedModule : AbpModule { public override void PreConfigureServices(ServiceConfigurationContext context) { - CmsBlogsWebConsts.BlogsRoutePrefix = "foo"; - FeatureConfigurer.Configure(); } From 939548a6a14b318486e48b400018e1774931d6e1 Mon Sep 17 00:00:00 2001 From: Enis Necipoglu Date: Thu, 19 Oct 2023 19:34:52 +0300 Subject: [PATCH 027/179] Add tests for GetTagNameAsync --- .../Blogs/BlogPostPublicAppService_Tests.cs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Blogs/BlogPostPublicAppService_Tests.cs b/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Blogs/BlogPostPublicAppService_Tests.cs index 677e1ac086..edbbe3e8de 100644 --- a/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Blogs/BlogPostPublicAppService_Tests.cs +++ b/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Blogs/BlogPostPublicAppService_Tests.cs @@ -179,4 +179,19 @@ public class BlogPostPublicAppService_Tests : CmsKitApplicationTestBase allItemsFromRepository.Any(x => x.Id == draftBlogPost2.Id).ShouldBeTrue(); allItemsFromRepository.Any(x => x.Id == publishedBlogPost1.Id).ShouldBeTrue(); } + + [Fact] + public async Task GetTagNameAsync_ShouldReturnCorrectName() + { + var tagName = await blogPostAppService.GetTagNameAsync(cmsKitTestData.TagId_1); + + tagName.ShouldBe(cmsKitTestData.TagName_1); + } + + [Fact] + public async Task GetTagNameAsync_WithNonExistingIdShouldReturnCorrectName() + { + await Should.ThrowAsync( + blogPostAppService.GetTagNameAsync(Guid.NewGuid())); + } } From 5a200e7a065e6efdd73f488c24c4f747ef6c90e3 Mon Sep 17 00:00:00 2001 From: Engincan VESKE <43685404+EngincanV@users.noreply.github.com> Date: Thu, 19 Oct 2023 19:37:14 +0300 Subject: [PATCH 028/179] Update "CMS Kit: Pages" documentation --- docs/en/Modules/Cms-Kit/Pages.md | 10 +++++----- docs/en/images/cmskit-module-pages-page.png | Bin 28831 -> 29426 bytes 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/en/Modules/Cms-Kit/Pages.md b/docs/en/Modules/Cms-Kit/Pages.md index cc1f5074f4..04614dd74a 100644 --- a/docs/en/Modules/Cms-Kit/Pages.md +++ b/docs/en/Modules/Cms-Kit/Pages.md @@ -22,13 +22,13 @@ CMS Kit module admin side adds the following items to the main menu, under the * #### Page Management -Pages page is used to manage dynamic pages in the system. +**Pages** page is used to manage dynamic pages in the system. You can create/edit pages with dynamic routes and contents on this page: -![pages-page](../../images/cmskit-module-pages-page.png) +![pages-edit](../../images/cmskit-module-pages-edit.png) -You can create or edit an existing page on this page. +After you have created pages, you can set one of them as a *home page*. Then, whenever anyone navigates to your application's homepage, they see the dynamic content of the page that you have defined on this page. -![pages-edit](../../images/cmskit-module-pages-edit.png) +![pages-page](../../images/cmskit-module-pages-page.png) -When you create a page, you can access the created page via `/{slug}` URL. +Also when you create a page, you can access the created page via `/{slug}` URL. diff --git a/docs/en/images/cmskit-module-pages-page.png b/docs/en/images/cmskit-module-pages-page.png index b64915493c9351b598b12e73c9f75f93c5d0cf8b..526557756539169ebb5ea0698c623d2132063337 100644 GIT binary patch literal 29426 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 P&g8O7$9#x^bO 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 M)3{rD$0FoE0CS$`ssI20 literal 28831 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 MD%y9;Za)h87d1!~fB*mh From be8e065695087d5e989c599da4c3562b994fa66c Mon Sep 17 00:00:00 2001 From: Salih Date: Fri, 20 Oct 2023 17:52:16 +0300 Subject: [PATCH 029/179] Fix resize and compress problem --- .../Volo/Abp/Imaging/ImageCompressor.cs | 23 +++++++++++++++++++ .../Volo/Abp/Imaging/ImageResizer.cs | 23 +++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/framework/src/Volo.Abp.Imaging.Abstractions/Volo/Abp/Imaging/ImageCompressor.cs b/framework/src/Volo.Abp.Imaging.Abstractions/Volo/Abp/Imaging/ImageCompressor.cs index 11789776c7..e32a7d104e 100644 --- a/framework/src/Volo.Abp.Imaging.Abstractions/Volo/Abp/Imaging/ImageCompressor.cs +++ b/framework/src/Volo.Abp.Imaging.Abstractions/Volo/Abp/Imaging/ImageCompressor.cs @@ -28,10 +28,25 @@ public class ImageCompressor : IImageCompressor, ITransientDependency { Check.NotNull(stream, nameof(stream)); + if(!stream.CanRead) + { + return new ImageCompressResult(stream, ImageProcessState.Unsupported); + } + + if(!stream.CanSeek) + { + var memoryStream = new MemoryStream(); + await stream.CopyToAsync(memoryStream, CancellationTokenProvider.FallbackToProvider(cancellationToken)); + SeekToBegin(memoryStream); + stream = memoryStream; + } + foreach (var imageCompressorContributor in ImageCompressorContributors) { var result = await imageCompressorContributor.TryCompressAsync(stream, mimeType, CancellationTokenProvider.FallbackToProvider(cancellationToken)); + SeekToBegin(stream); + if (result.State == ImageProcessState.Unsupported) { continue; @@ -64,4 +79,12 @@ public class ImageCompressor : IImageCompressor, ITransientDependency return new ImageCompressResult(bytes, ImageProcessState.Unsupported); } + + protected virtual void SeekToBegin(Stream stream) + { + if (stream.CanSeek) + { + stream.Seek(0, SeekOrigin.Begin); + } + } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.Imaging.Abstractions/Volo/Abp/Imaging/ImageResizer.cs b/framework/src/Volo.Abp.Imaging.Abstractions/Volo/Abp/Imaging/ImageResizer.cs index 139fc194dd..4afc879089 100644 --- a/framework/src/Volo.Abp.Imaging.Abstractions/Volo/Abp/Imaging/ImageResizer.cs +++ b/framework/src/Volo.Abp.Imaging.Abstractions/Volo/Abp/Imaging/ImageResizer.cs @@ -38,9 +38,24 @@ public class ImageResizer : IImageResizer, ITransientDependency ChangeDefaultResizeMode(resizeArgs); + if(!stream.CanRead) + { + return new ImageResizeResult(stream, ImageProcessState.Unsupported); + } + + if(!stream.CanSeek) + { + var memoryStream = new MemoryStream(); + await stream.CopyToAsync(memoryStream, CancellationTokenProvider.FallbackToProvider(cancellationToken)); + SeekToBegin(memoryStream); + stream = memoryStream; + } + foreach (var imageResizerContributor in ImageResizerContributors) { var result = await imageResizerContributor.TryResizeAsync(stream, resizeArgs, mimeType, CancellationTokenProvider.FallbackToProvider(cancellationToken)); + + SeekToBegin(stream); if (result.State == ImageProcessState.Unsupported) { @@ -85,4 +100,12 @@ public class ImageResizer : IImageResizer, ITransientDependency resizeArgs.Mode = ImageResizeOptions.DefaultResizeMode; } } + + protected virtual void SeekToBegin(Stream stream) + { + if (stream.CanSeek) + { + stream.Seek(0, SeekOrigin.Begin); + } + } } \ No newline at end of file From 1cf0dbe68597dd09359ac92a136e09eb065ed3b5 Mon Sep 17 00:00:00 2001 From: Salih Date: Fri, 20 Oct 2023 18:05:14 +0300 Subject: [PATCH 030/179] Update Image-Manipulation.md --- docs/en/Image-Manipulation.md | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/docs/en/Image-Manipulation.md b/docs/en/Image-Manipulation.md index 1050b6005e..e1715722aa 100644 --- a/docs/en/Image-Manipulation.md +++ b/docs/en/Image-Manipulation.md @@ -76,8 +76,8 @@ public interface IImageResizer **Example usage:** ```csharp -var result = await _imageResizer.ResizeAsync( - stream, /* A stream object that represents an image */ +var resizeResult = await _imageResizer.ResizeAsync( + imageStream, /* A stream object that represents an image */ new ImageResizeArgs { Width = 100, @@ -88,6 +88,16 @@ var result = await _imageResizer.ResizeAsync( ); ``` +> If `resizeResult.State` returns 'Done,' it means that the resize operation was successful. However, if it does not return 'Done,' the stream you're using might be corrupt. Therefore, you can perform a check like the one below and assign the correct stream to the main stream. + +```csharp +if (resizeResult.Result is not null && imageStream != resizeResult.Result && resizeResult.Result.CanRead) +{ + await imageStream.DisposeAsync(); + imageStream = resizeResult.Result; +} +``` + > You can use `MimeTypes.Image.Jpeg` constant instead of the `image/jpeg` magic string used in that example. ### ImageResizeArgs @@ -170,12 +180,23 @@ public interface IImageCompressor **Example usage:** ```csharp -var result = await _imageCompressor.CompressAsync( - stream, /* A stream object that represents an image */ +var compressResult = await _imageCompressor.CompressAsync( + imageStream, /* A stream object that represents an image */ mimeType: "image/jpeg" ); ``` +> If `compressResult.State` returns 'Done,' it means that the compress operation was successful. However, if it does not return 'Done,' the stream you're using might be corrupt. Therefore, you can perform a check like the one below and assign the correct stream to the main stream. + +```csharp + +if (compressResult.Result is not null && imageStream != compressResult.Result && compressResult.Result.CanRead) +{ + await imageStream.DisposeAsync(); + imageStream = compressResult.Result; +} +``` + ### ImageCompressResult The `ImageCompressResult` is a generic class that is used to return the result of the image compression operations. It has the following properties: From 85d32f2378c48c8bfc2088f5a0220d1bd877bd2a Mon Sep 17 00:00:00 2001 From: Engincan VESKE <43685404+EngincanV@users.noreply.github.com> Date: Fri, 20 Oct 2023 21:03:10 +0300 Subject: [PATCH 031/179] Update PackageVersionCheckerService.cs --- .../Version/PackageVersionCheckerService.cs | 27 ++++++++++++++----- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Version/PackageVersionCheckerService.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Version/PackageVersionCheckerService.cs index f4b87ea047..ff35fcf17f 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Version/PackageVersionCheckerService.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Version/PackageVersionCheckerService.cs @@ -46,7 +46,7 @@ public class PackageVersionCheckerService : ITransientDependency { var versionList = await GetPackageVersionListAsync(packageId, false); - if (versionList == null) + if (!versionList.Any()) { return false; } @@ -121,10 +121,10 @@ public class PackageVersionCheckerService : ITransientDependency } var searchUrl = CliUrls.GetNuGetPackageSearchUrl(_apiKeyResult.ApiKey, packageId); - return await HasAnyPackageAsync(searchUrl); + return await HasAnyPackageAsync(searchUrl, packageId); } - private async Task HasAnyPackageAsync(string url) + private async Task HasAnyPackageAsync(string url, string packageId) { try { @@ -139,8 +139,9 @@ public class PackageVersionCheckerService : ITransientDependency await RemoteServiceExceptionHandler.EnsureSuccessfulHttpResponseAsync(responseMessage); var responseContent = await responseMessage.Content.ReadAsStringAsync(); - - return JsonSerializer.Deserialize(responseContent).TotalHits > 0; + var nugetSearchResult = JsonSerializer.Deserialize(responseContent); + + return nugetSearchResult.TotalHits > 0 && nugetSearchResult.Packages.Any(package => package.Id.ToLowerInvariant() == packageId.ToLowerInvariant()); } } catch (Exception) @@ -182,7 +183,7 @@ public class PackageVersionCheckerService : ITransientDependency if (responseMessage.StatusCode == HttpStatusCode.NotFound) { //the package doesn't exist... - return null; + return new List(); } await RemoteServiceExceptionHandler.EnsureSuccessfulHttpResponseAsync(responseMessage); @@ -193,7 +194,7 @@ public class PackageVersionCheckerService : ITransientDependency } catch (Exception) { - return null; + return new List(); } } @@ -238,6 +239,18 @@ public class PackageVersionCheckerService : ITransientDependency { [JsonProperty("totalHits")] public int TotalHits { get; set; } + + [JsonProperty("data")] + public NuGetSearchResultPackagesDto[] Packages { get; set; } + } + + public class NuGetSearchResultPackagesDto + { + [JsonProperty("id")] + public string Id { get; set; } + + [JsonProperty("version")] + public string Version { get; set; } } public class NuGetVersionResultDto From 83e4c382a1dcec84463b079421eff4c0edd24747 Mon Sep 17 00:00:00 2001 From: maliming Date: Mon, 23 Oct 2023 11:10:20 +0800 Subject: [PATCH 032/179] Add `Raw SQL queries for unmapped types` article. --- .../POST.md | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 docs/en/Community-Articles/2023-10-23-NET-8-Feature-raw-sql-queries-for-unmapped-types/POST.md diff --git a/docs/en/Community-Articles/2023-10-23-NET-8-Feature-raw-sql-queries-for-unmapped-types/POST.md b/docs/en/Community-Articles/2023-10-23-NET-8-Feature-raw-sql-queries-for-unmapped-types/POST.md new file mode 100644 index 0000000000..7a783ec40d --- /dev/null +++ b/docs/en/Community-Articles/2023-10-23-NET-8-Feature-raw-sql-queries-for-unmapped-types/POST.md @@ -0,0 +1,53 @@ +# New Raw SQL queries for unmapped types feature with EF Core 8.0 + +## Introduction + +I would love to talk to you about the new feature in EF Core 8.0, specifically the `raw SQL queries for unmapped types`. +This feature was recently introduced by Microsoft and is aimed at providing more flexibility and customization in database queries. + +## What is the raw SQL queries for unmapped types feature? + +To give you a better understanding, let's look at a sample repository method with abp framework. +Here is an example of a raw SQL query using the new feature: + +````csharp +public interface IAuthorRepository : IRepository +{ + Task> GetAllAuthorNamesAsync(); +} + +public class AuthorIdWithNames +{ + public Guid Id { get; set; } + + public string Name { get; set; } +} + +public class EfCoreAuthorRepository : EfCoreRepository, IAuthorRepository +{ + public EfCoreAuthorRepository(IDbContextProvider dbContextProvider) + : base(dbContextProvider) + { + } + + public virtual async Task> GetAllAuthorNamesAsync() + { + return await (await GetDbContextAsync()).Database.SqlQuery(@$"SELECT Id, Name FROM Authors").ToListAsync(); + } +} +```` + +In this code, we can see that we are using the `SqlQuery` method to execute a raw SQL query on a custom type, in this case, `AuthorIdWithNames`. This allows us to retrieve data that may not be mapped to any of our entity classes in the context. + +## In summary + +This feature can be particularly useful in scenarios where we need to access data from tables or views that are not directly mapped to our entities. It also provides an alternative to using stored procedures for querying data. + +However, it's important to note that using raw SQL queries can increase the risk of SQL injection attacks. So, it's recommended to use parameterized queries to prevent this. Additionally, this feature may not work with certain database providers, so it's important to check for compatibility before implementing it. + +In conclusion, the raw SQL queries for unmapped types feature in EF Core 8.0 is a great addition for developers looking for more flexibility in database queries. It allows us to work with data that may not be directly mapped to our entities and can be a useful tool in certain scenarios. Just remember to use parameterized queries and check for compatibility before implementing it. + +## References + +- [Raw SQL queries for unmapped types](https://learn.microsoft.com/en-us/ef/core/what-is-new/ef-core-8.0/whatsnew#raw-sql-queries-for-unmapped-types) +- [SQL Queries](https://learn.microsoft.com/en-us/ef/core/querying/sql-queries#querying-scalar-(non-entity)-types) From bff9fdbaac4b95426a2a736c869701f6ccd66614 Mon Sep 17 00:00:00 2001 From: Engincan VESKE <43685404+EngincanV@users.noreply.github.com> Date: Mon, 23 Oct 2023 09:45:01 +0300 Subject: [PATCH 033/179] CLI: Should not run `AppTemplateRemoveMongodbCollectionFixtureStep` in nolayers templates since they don't have test projects --- .../Volo/Abp/Cli/ProjectBuilding/Building/TemplateInfo.cs | 6 ++++++ .../App/AppTemplateRemoveMongodbCollectionFixtureStep.cs | 5 +++++ 2 files changed, 11 insertions(+) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/TemplateInfo.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/TemplateInfo.cs index 88bdc27973..3cf039f5ae 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/TemplateInfo.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/TemplateInfo.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using JetBrains.Annotations; +using Volo.Abp.Cli.ProjectBuilding.Templates.App; namespace Volo.Abp.Cli.ProjectBuilding.Building; @@ -35,4 +36,9 @@ public abstract class TemplateInfo { return Name.EndsWith("-pro", StringComparison.OrdinalIgnoreCase); } + + public bool IsNoLayer() + { + return Name is AppNoLayersTemplate.TemplateName or AppNoLayersProTemplate.TemplateName; + } } diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateRemoveMongodbCollectionFixtureStep.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateRemoveMongodbCollectionFixtureStep.cs index 842e194eeb..ed290508a2 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateRemoveMongodbCollectionFixtureStep.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateRemoveMongodbCollectionFixtureStep.cs @@ -8,6 +8,11 @@ public class AppTemplateRemoveMongodbCollectionFixtureStep : ProjectBuildPipelin { public override void Execute(ProjectBuildContext context) { + if (context.Template.IsNoLayer()) + { + return; + } + //MyCompanyName.MyProjectName.Application.Tests RemoveFile(context, "/aspnet-core/test/MyCompanyName.MyProjectName.Application.Tests/MyProjectNameApplicationCollection.cs"); RemoveKeyword(context, From dfaee036f881f6e931ed9071d85e95b12aef0c6f Mon Sep 17 00:00:00 2001 From: Salih Date: Mon, 23 Oct 2023 10:56:57 +0300 Subject: [PATCH 034/179] Add new localization --- .../AbpIoLocalization/Admin/Localization/Resources/en.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json index 22a73d35f7..f3c4c35a4d 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json @@ -559,6 +559,7 @@ "SessionDate": "Session Date", "AddSession": "Add Session", "AddSponsor": "Add Sponsor", - "SponsorLogo": "Sponsor Logo" + "SponsorLogo": "Sponsor Logo", + "RegistrationUrl": "Registration Url" } } From dbf46c481b519baa63f9246403bfb082b7fc2bf5 Mon Sep 17 00:00:00 2001 From: Engincan VESKE <43685404+EngincanV@users.noreply.github.com> Date: Mon, 23 Oct 2023 11:12:20 +0300 Subject: [PATCH 035/179] Update Image-Manipulation.md --- docs/en/Image-Manipulation.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/en/Image-Manipulation.md b/docs/en/Image-Manipulation.md index e1715722aa..9d946e31dd 100644 --- a/docs/en/Image-Manipulation.md +++ b/docs/en/Image-Manipulation.md @@ -88,7 +88,7 @@ var resizeResult = await _imageResizer.ResizeAsync( ); ``` -> If `resizeResult.State` returns 'Done,' it means that the resize operation was successful. However, if it does not return 'Done,' the stream you're using might be corrupt. Therefore, you can perform a check like the one below and assign the correct stream to the main stream. +> **Note:** If `resizeResult.State` returns 'Done', then it means that the resize operation was successful. However, if it returns any other state than 'Done', the stream you're using might be corrupted. Therefore, you can perform a check like the one below and assign the correct stream to the main stream: ```csharp if (resizeResult.Result is not null && imageStream != resizeResult.Result && resizeResult.Result.CanRead) @@ -186,7 +186,7 @@ var compressResult = await _imageCompressor.CompressAsync( ); ``` -> If `compressResult.State` returns 'Done,' it means that the compress operation was successful. However, if it does not return 'Done,' the stream you're using might be corrupt. Therefore, you can perform a check like the one below and assign the correct stream to the main stream. +> **Note:** If `compressResult.State` returns 'Done', then it means that the compression operation was successful. However, if it returns any other state than 'Done', the stream you're using might be corrupted. Therefore, you can perform a check like the one below and assign the correct stream to the main stream: ```csharp From 8c14d30a3d30a9f1945abcd8db076dcc1d71e1b8 Mon Sep 17 00:00:00 2001 From: Mahmut Gundogdu Date: Mon, 23 Oct 2023 11:15:58 +0300 Subject: [PATCH 036/179] update nx --- npm/ng-packs/migrations.json | 112 ++++++++++++++++++++++++++++++++--- npm/ng-packs/package.json | 80 +++++++++++-------------- 2 files changed, 139 insertions(+), 53 deletions(-) diff --git a/npm/ng-packs/migrations.json b/npm/ng-packs/migrations.json index a0b431b16a..0e2ed93d08 100644 --- a/npm/ng-packs/migrations.json +++ b/npm/ng-packs/migrations.json @@ -2,19 +2,115 @@ "migrations": [ { "cli": "nx", - "version": "16.2.0-beta.0", - "description": "Remove outputPath from run commands", - "implementation": "./src/migrations/update-16-2-0/remove-run-commands-output-path", + "version": "16.6.0-beta.6", + "description": "Prefix outputs with {workspaceRoot}/{projectRoot} if needed", + "implementation": "./src/migrations/update-15-0-0/prefix-outputs", "package": "nx", - "name": "16.2.0-remove-output-path-from-run-commands" + "name": "16.6.0-prefix-outputs" }, { "cli": "nx", - "version": "16.2.0-beta.0", - "description": "Normalize tsconfig.cy.json files to be located at '/cypress/tsconfig.json'", - "implementation": "./src/migrations/update-16-2-0/update-cy-tsconfig", + "version": "16.8.0-beta.3", + "description": "Escape $ in env variables", + "implementation": "./src/migrations/update-16-8-0/escape-dollar-sign-env-variables", + "package": "nx", + "name": "16.8.0-escape-dollar-sign-env" + }, + { + "version": "16.8.0", + "description": "update-16-8-0-add-ignored-files", + "implementation": "./src/migrations/update-16-8-0-add-ignored-files/update-16-8-0-add-ignored-files", + "package": "@nx/linter", + "name": "update-16-8-0-add-ignored-files" + }, + { + "cli": "nx", + "version": "16.9.0-beta.1", + "description": "Replace imports of Module Federation utils frm @nx/devkit to @nx/webpack", + "implementation": "./src/migrations/update-16-9-0/migrate-mf-util-usage", + "package": "@nx/devkit", + "name": "update-16-9-0-migrate-mf-usage-to-webpack" + }, + { + "cli": "nx", + "version": "16.4.0-beta.6", + "requires": { + "@angular-eslint/eslint-plugin-template": ">=16.0.0" + }, + "description": "Remove the 'accessibility-' prefix from '@angular-eslint/eslint-plugin-template' rules.", + "factory": "./src/migrations/update-16-4-0/rename-angular-eslint-accesibility-rules", + "package": "@nx/angular", + "name": "rename-angular-eslint-accesibility-rules" + }, + { + "cli": "nx", + "version": "16.4.0-beta.11", + "requires": { + "@angular/core": ">=16.1.0" + }, + "description": "Update the @angular/cli package version to ~16.1.0.", + "factory": "./src/migrations/update-16-4-0/update-angular-cli", + "package": "@nx/angular", + "name": "update-angular-cli-version-16-1-0" + }, + { + "cli": "nx", + "version": "16.6.0-beta.0", + "description": "Explicitly set 'updateBuildableProjectDepsInPackageJson' to 'true' in targets that rely on that value as the default.", + "factory": "./src/migrations/update-16-6-0/explicitly-set-projects-to-update-buildable-deps", + "package": "@nx/angular", + "name": "explicitly-set-projects-to-update-buildable-deps" + }, + { + "cli": "nx", + "version": "16.7.0-beta.6", + "requires": { + "@angular/core": ">=16.2.0" + }, + "description": "Update the @angular/cli package version to ~16.2.0.", + "factory": "./src/migrations/update-16-7-0/update-angular-cli", + "package": "@nx/angular", + "name": "update-angular-cli-version-16-2-0" + }, + { + "cli": "nx", + "version": "16.4.0-beta.10", + "description": "Remove tsconfig.e2e.json and add settings to project tsconfig.json. tsConfigs executor option is now deprecated. The project level tsconfig.json file should be used instead.", + "implementation": "./src/migrations/update-16-4-0/tsconfig-sourcemaps", "package": "@nx/cypress", - "name": "update-16-2-0-normalize-tsconfigs" + "name": "update-16-3-0-remove-old-tsconfigs" + }, + { + "cli": "nx", + "version": "16.8.0-beta.4", + "description": "Update to Cypress v13. Most noteable change is video recording is off by default. This migration will only update if the workspace is already on Cypress v12. https://docs.cypress.io/guides/references/migration-guide#Migrating-to-Cypress-130", + "implementation": "./src/migrations/update-16-8-0/cypress-13", + "package": "@nx/cypress", + "name": "update-16-8-0-cypress-13" + }, + { + "cli": "nx", + "version": "16.5.0-beta.2", + "description": "Add test-setup.ts to ignored files in production input", + "implementation": "./src/migrations/update-16-5-0/add-test-setup-to-inputs-ignore", + "package": "@nx/jest", + "name": "add-test-setup-to-inputs-ignore" + }, + { + "cli": "nx", + "version": "16.6.0-beta.0", + "description": "Explicitly set 'updateBuildableProjectDepsInPackageJson' to 'true' in targets that rely on that value as the default.", + "factory": "./src/migrations/update-16-6-0/explicitly-set-projects-to-update-buildable-deps", + "package": "@nx/js", + "name": "explicitly-set-projects-to-update-buildable-deps" + }, + { + "cli": "nx", + "version": "16.8.2-beta.0", + "description": "Remove invalid options (strict, noInterop) for ES6 type modules.", + "factory": "./src/migrations/update-16-8-2/update-swcrc", + "package": "@nx/js", + "name": "16-8-2-update-swcrc" } ] } diff --git a/npm/ng-packs/package.json b/npm/ng-packs/package.json index 8ec7c2f77c..9ca15c0eb6 100644 --- a/npm/ng-packs/package.json +++ b/npm/ng-packs/package.json @@ -44,69 +44,58 @@ }, "private": true, "devDependencies": { - "@abp/ng.account": "~7.4.0", - "@abp/ng.account.core": "~7.4.0", - "@abp/ng.core": "~7.4.0", - "@abp/ng.feature-management": "~7.4.0", - "@abp/ng.identity": "~7.4.0", - "@abp/ng.oauth": "~7.4.0", - "@abp/ng.permission-management": "~7.4.0", - "@abp/ng.schematics": "~7.4.0", - "@abp/ng.setting-management": "~7.4.0", - "@abp/ng.tenant-management": "~7.4.0", - "@abp/ng.theme.basic": "~7.4.0", + "@abp/ng.theme.lepton-x": "~2.4.0", - "@abp/ng.theme.shared": "~7.4.0", "@abp/utils": "~7.4.0", - "@angular-devkit/build-angular": "~16.0.0", - "@angular-devkit/core": "~16.0.0", - "@angular-devkit/schematics": "~16.0.0", + "@angular-devkit/build-angular": "16.2.7", + "@angular-devkit/core": "16.2.7", + "@angular-devkit/schematics": "16.2.7", "@angular-devkit/schematics-cli": "~16.0.0", "@angular-eslint/eslint-plugin": "~16.0.0", "@angular-eslint/eslint-plugin-template": "~16.0.0", "@angular-eslint/template-parser": "~16.0.0", - "@angular/animations": "~16.0.0", + "@angular/animations": "16.2.10", "@angular/cli": "~16.0.0", - "@angular/common": "~16.0.0", - "@angular/compiler": "~16.0.0", - "@angular/compiler-cli": "~16.0.0", - "@angular/core": "~16.0.0", - "@angular/forms": "~16.0.0", - "@angular/language-service": "~16.0.0", - "@angular/localize": "~16.0.0", - "@angular/platform-browser": "~16.0.0", - "@angular/platform-browser-dynamic": "~16.0.0", - "@angular/router": "~16.0.0", + "@angular/common": "16.2.10", + "@angular/compiler": "16.2.10", + "@angular/compiler-cli": "16.2.10", + "@angular/core": "16.2.10", + "@angular/forms": "16.2.10", + "@angular/language-service": "16.2.10", + "@angular/localize": "16.2.10", + "@angular/platform-browser": "16.2.10", + "@angular/platform-browser-dynamic": "16.2.10", + "@angular/router": "16.2.10", "@fortawesome/fontawesome-free": "^5.15.4", "@ng-bootstrap/ng-bootstrap": "^15.0.0", "@ngneat/spectator": "^10.0.0", "@ngx-validate/core": "^0.2.0", - "@nx/angular": "16.2.2", - "@nx/cypress": "16.2.2", - "@nx/eslint-plugin": "16.2.2", - "@nx/jest": "16.2.2", - "@nx/js": "16.2.2", - "@nx/linter": "16.2.2", - "@nx/workspace": "16.2.2", + "@nx/angular": "16.9.0", + "@nx/cypress": "16.9.0", + "@nx/eslint-plugin": "16.9.0", + "@nx/jest": "16.9.0", + "@nx/js": "16.9.0", + "@nx/linter": "16.9.0", + "@nx/workspace": "16.9.0", "@popperjs/core": "~2.11.2", - "@schematics/angular": "~16.0.0", + "@schematics/angular": "16.2.7", "@swc-node/register": "~1.4.2", "@swc/cli": "~0.1.62", - "@swc/core": "~1.3.51", + "@swc/core": "1.3.94", "@swimlane/ngx-datatable": "^20.0.0", "@types/jest": "29.4.4", "@types/node": "20.2.5", - "@typescript-eslint/eslint-plugin": "5.59.5", - "@typescript-eslint/parser": "5.59.5", + "@typescript-eslint/eslint-plugin": "5.62.0", + "@typescript-eslint/parser": "5.62.0", "angular-oauth2-oidc": "^15.0.1", "bootstrap": "^5.1.1", "bootstrap-icons": "^1.10.3", "chart.js": "^3.5.1", "cypress": "^7.3.0", "dotenv": "10.0.0", - "eslint": "8.15.0", + "eslint": "8.46.0", "eslint-config-prettier": "8.1.0", - "eslint-plugin-cypress": "^2.10.3", + "eslint-plugin-cypress": "2.15.1", "got": "^11.5.2", "jest": "29.4.3", "jest-canvas-mock": "^2.3.1", @@ -118,9 +107,9 @@ "just-compare": "^2.3.0", "lerna": "^4.0.0", "lint-staged": "^13.0.3", - "ng-packagr": "~16.0.0", + "ng-packagr": "16.2.3", "ng-zorro-antd": "^16.0.0", - "nx": "16.2.2", + "nx": "16.9.0", "perfect-scrollbar": "^1.5.5", "postcss": "^8.3.9", "postcss-import": "14.1.0", @@ -135,11 +124,11 @@ "ts-toolbelt": "6.15.4", "tslib": "^2.3.0", "tslint": "~6.1.0", - "typescript": "5.0.4", + "typescript": "5.1.6", "zone.js": "~0.13.0", - "@nx/devkit": "16.2.2", - "@nx/plugin": "^16.2.2", - "@swc/helpers": "~0.5.0" + "@nx/devkit": "16.9.0", + "@nx/plugin": "16.9.0", + "@swc/helpers": "0.5.3" }, "lint-staged": { "**/*.{js,jsx,ts,tsx,html,css,scss}": [ @@ -148,3 +137,4 @@ }, "dependencies": {} } + From 0a5fa631f8fe66061cdfc344645b28264cb3ed69 Mon Sep 17 00:00:00 2001 From: Salih Date: Mon, 23 Oct 2023 14:23:52 +0300 Subject: [PATCH 037/179] Update en.json --- .../AbpIoLocalization/Community/Localization/Resources/en.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en.json index d9326a3683..4c7cda3a27 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en.json @@ -242,6 +242,7 @@ "{0}Posts": "{0} Posts", "LATESTPOSTS": "LATEST POSTS", "NoContributorsFound": "No contributors found!", - "LatestPost": "Latest post" + "LatestPost": "Latest post", + "MEMBERSINCE{0}": "MEMBER SINCE {0}" } } From e6d530b02cffd9d83f1e0b2621b30a713430416a Mon Sep 17 00:00:00 2001 From: Salih Date: Mon, 23 Oct 2023 16:05:35 +0300 Subject: [PATCH 038/179] Update en.json --- .../Community/Localization/Resources/en.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en.json index 4c7cda3a27..3c8c8ac397 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en.json @@ -243,6 +243,11 @@ "LATESTPOSTS": "LATEST POSTS", "NoContributorsFound": "No contributors found!", "LatestPost": "Latest post", - "MEMBERSINCE{0}": "MEMBER SINCE {0}" + "MEMBERSINCE{0}": "MEMBER SINCE {0}", + "CopyLink": "Copy Link", + "ShareOnTwitter": "Share on Twitter", + "ShareOnLinkedIn": "Share on LinkedIn", + "MoreFrom{0}": "More from {0}", + "SeeAllFrom{0}": "See all from {0}" } } From 5381c9e7222176f1ba77f382cc95e4a0ffb59b2f Mon Sep 17 00:00:00 2001 From: maliming Date: Tue, 24 Oct 2023 08:48:26 +0800 Subject: [PATCH 039/179] Add `AddMarginBottomClass` to remove the `mb` class. Resolve #17948 --- .../TagHelpers/Card/AbpCardTagHelper.cs | 2 ++ .../TagHelpers/Card/AbpCardTagHelperService.cs | 6 +++++- .../TagHelpers/Form/AbpInputTagHelper.cs | 2 ++ .../TagHelpers/Form/AbpInputTagHelperService.cs | 8 ++++++-- .../TagHelpers/Form/AbpSelectTagHelper.cs | 4 +++- .../TagHelpers/Form/AbpSelectTagHelperService.cs | 9 +++++++-- .../Form/DatePicker/AbpDatePickerBaseTagHelper.cs | 14 ++++++++------ .../AbpDatePickerBaseTagHelperService.cs | 14 +++++++++----- 8 files changed, 42 insertions(+), 17 deletions(-) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Card/AbpCardTagHelper.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Card/AbpCardTagHelper.cs index 5b568e16a6..dee16585b7 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Card/AbpCardTagHelper.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Card/AbpCardTagHelper.cs @@ -4,6 +4,8 @@ public class AbpCardTagHelper : AbpTagHelper public override void Process(TagHelperContext context, TagHelperOutput output) { output.TagName = "div"; - output.Attributes.AddClass("card mb-3"); + output.Attributes.AddClass("card"); + if (TagHelper.AddMarginBottomClass) + { + output.Attributes.AddClass("mb-3"); + } SetBorder(context, output); } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpInputTagHelper.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpInputTagHelper.cs index a426b50d33..62cae94413 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpInputTagHelper.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpInputTagHelper.cs @@ -52,6 +52,8 @@ public class AbpInputTagHelper : AbpTagHelper { output.Attributes.AddClass("form-floating"); } - output.Attributes.AddClass(isCheckBox ? "mb-2" : "mb-3"); + if (TagHelper.AddMarginBottomClass) + { + output.Attributes.AddClass(isCheckBox ? "mb-2" : "mb-3"); + } if (isCheckBox) { output.Attributes.AddClass("custom-checkbox"); @@ -110,7 +113,8 @@ public class AbpInputTagHelperService : AbpTagHelperService protected virtual string SurroundInnerHtmlAndGet(TagHelperContext context, TagHelperOutput output, string innerHtml, bool isCheckbox) { - return "
" + + var mb = TagHelper.AddMarginBottomClass ? (isCheckbox ? "mb-2" : "mb-3") : string.Empty; + return "
" + Environment.NewLine + innerHtml + Environment.NewLine + "
"; } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpSelectTagHelper.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpSelectTagHelper.cs index 7d11f69636..dbcf84437f 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpSelectTagHelper.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpSelectTagHelper.cs @@ -37,7 +37,7 @@ public class AbpSelectTagHelper : AbpTagHelper { output.Attributes.AddClass("form-floating"); } - output.Attributes.AddClass("mb-3"); + + if (TagHelper.AddMarginBottomClass) + { + output.Attributes.AddClass("mb-3"); + } output.TagMode = TagMode.StartTagAndEndTag; output.Content.SetHtmlContent(innerHtml); } @@ -79,7 +83,8 @@ public class AbpSelectTagHelperService : AbpTagHelperService protected virtual string SurroundInnerHtmlAndGet(TagHelperContext context, TagHelperOutput output, string innerHtml) { - return "
" + Environment.NewLine + innerHtml + Environment.NewLine + "
"; + var mb3 = TagHelper.AddMarginBottomClass ? "mb-3" : string.Empty; + return $"
" + Environment.NewLine + innerHtml + Environment.NewLine + "
"; } protected virtual async Task GetSelectTagAsync(TagHelperContext context, TagHelperOutput output, TagHelperContent childContent) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerBaseTagHelper.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerBaseTagHelper.cs index fed2981613..079431c9c6 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerBaseTagHelper.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerBaseTagHelper.cs @@ -21,20 +21,20 @@ public abstract class public bool LabelTooltipHtml { get; set; } = false; - [HtmlAttributeName("info")] + [HtmlAttributeName("info")] public string? InfoText { get; set; } - [HtmlAttributeName("disabled")] + [HtmlAttributeName("disabled")] public bool IsDisabled { get; set; } = false; - [HtmlAttributeName("readonly")] + [HtmlAttributeName("readonly")] public bool? IsReadonly { get; set; } = false; public bool AutoFocus { get; set; } public AbpFormControlSize Size { get; set; } = AbpFormControlSize.Default; - [HtmlAttributeName("required-symbol")] + [HtmlAttributeName("required-symbol")] public bool DisplayRequiredSymbol { get; set; } = true; public string? Name { get; set; } @@ -43,11 +43,13 @@ public abstract class public bool SuppressLabel { get; set; } + public bool AddMarginBottomClass { get; set; } = true; + protected AbpDatePickerBaseTagHelper(AbpDatePickerBaseTagHelperService service) : base(service) { _abpDatePickerOptionsImplementation = new AbpDatePickerOptions(); } - + public void SetDatePickerOptions(IAbpDatePickerOptions options) { _abpDatePickerOptionsImplementation = options; @@ -217,4 +219,4 @@ public abstract class get => _abpDatePickerOptionsImplementation.Options; set => _abpDatePickerOptionsImplementation.Options = value; } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerBaseTagHelperService.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerBaseTagHelperService.cs index 024fd4dd45..54e8720b17 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerBaseTagHelperService.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerBaseTagHelperService.cs @@ -22,7 +22,7 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form.DatePicker; public abstract class AbpDatePickerBaseTagHelperService : AbpTagHelperService where TTagHelper : AbpDatePickerBaseTagHelper { - protected readonly Dictionary> SupportedInputTypes = new() + protected readonly Dictionary> SupportedInputTypes = new() { { typeof(string), o => @@ -42,7 +42,7 @@ public abstract class AbpDatePickerBaseTagHelperService : AbpTagHelp { return dt.ToString("O"); } - + return string.Empty; } }, @@ -54,7 +54,7 @@ public abstract class AbpDatePickerBaseTagHelperService : AbpTagHelp { return dto.ToString("O"); } - + return string.Empty; } }, @@ -161,7 +161,10 @@ public abstract class AbpDatePickerBaseTagHelperService : AbpTagHelp output.TagMode = TagMode.StartTagAndEndTag; output.TagName = "div"; LeaveOnlyGroupAttributes(context, output); - output.Attributes.AddClass("mb-3"); + if (TagHelper.AddMarginBottomClass) + { + output.Attributes.AddClass("mb-3"); + } output.Content.AppendHtml(innerHtml); } @@ -224,7 +227,8 @@ public abstract class AbpDatePickerBaseTagHelperService : AbpTagHelp protected virtual string SurroundInnerHtmlAndGet(TagHelperContext context, TagHelperOutput output, string innerHtml) { - return "
" + + var mb = TagHelper.AddMarginBottomClass ? "mb-3" : string.Empty; + return $"
" + Environment.NewLine + innerHtml + Environment.NewLine + "
"; } From 6a9026a72273c28eeefc5e7af81c71bcb96b2c43 Mon Sep 17 00:00:00 2001 From: maliming Date: Tue, 24 Oct 2023 09:48:49 +0800 Subject: [PATCH 040/179] Add `New Containers feature with NET 8.0` article. --- .../POST.md | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 docs/en/Community-Articles/2023-10-23-NET-8-Feature-containers/POST.md diff --git a/docs/en/Community-Articles/2023-10-23-NET-8-Feature-containers/POST.md b/docs/en/Community-Articles/2023-10-23-NET-8-Feature-containers/POST.md new file mode 100644 index 0000000000..139b2f17b1 --- /dev/null +++ b/docs/en/Community-Articles/2023-10-23-NET-8-Feature-containers/POST.md @@ -0,0 +1,30 @@ +# New Containers feature with NET 8.0 + +This article will show you the new feature of containers with NET 8.0. + +## Non-root user + +The `Non-root user` feature on net 8 is a security measure that allows users to have limited access to the system without having full administrative privileges. Hosting containers as `non-root` aligns with principle of least privilege. +It’s free security provided by the operating system. If you run your app as root, your app process can do anything in the container, like modify files, install packages, or run arbitrary executables. +That’s a concern if your app is ever attacked. If you run your app as non-root, your app process cannot do much, greatly limiting what a bad actor could accomplish. + +## Default ASP.NET Core port changed from 80 to 8080 + +In .NET 8, there has been a change in the default port used by ASP.NET Core applications. Previously, the default port assigned to ASP.NET Core applications was `80`. However, starting from .NET 8, the default port has been changed to `8080`. +This change was made to avoid conflicts with other applications and services that commonly use port 80, such as web servers like IIS or Apache. By using port 8080 as the default, there is less potential for clashes and easier deployment of ASP.NET Core applications alongside other services. + +It's important to note that this change only affects the default port used when an ASP.NET Core application is run without explicitly specifying a port. + +If you want your application to continue using port 80, you can still specify it during the application launch or configure it in the application settings. + +* Recommended: Explicitly set the `ASPNETCORE_HTTP_PORTS`, `ASPNETCORE_HTTPS_PORTS``, and `ASPNETCORE_URLS` environment variables to the desired port. Example: `docker run --rm -it -p 9999:80 -e ASPNETCORE_HTTP_PORTS=80 `` +* Update existing commands and configuration that rely on the expected default port of port 80 to reference port 8080 instead. Example: `docker run --rm -it -p 9999:8080 `` + +> The `dockerfile` of abp templates has been updated to use port `80`. + +## References + +- [Secure your .NET cloud apps with rootless Linux Containers](https://devblogs.microsoft.com/dotnet/securing-containers-with-rootless/) +- [Containers breaking changes](https://learn.microsoft.com/en-us/dotnet/core/whats-new/dotnet-8#containers) +- [ASP.NET Core apps use port 8080 by default](https://learn.microsoft.com/en-us/dotnet/core/compatibility/8.0#containers) +- [Docker images for ASP.NET Core](https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/docker/building-net-docker-images?view=aspnetcore-8.0) From 4e1429c70901dfc1a5f31f296847ef4e9f751e72 Mon Sep 17 00:00:00 2001 From: masumulu28 Date: Tue, 24 Oct 2023 11:17:32 +0300 Subject: [PATCH 041/179] fix: add route item to app-routing after create module --- .../AngularSourceCodeAdder.cs | 67 ++++++++++++++----- 1 file changed, 51 insertions(+), 16 deletions(-) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/AngularSourceCodeAdder.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/AngularSourceCodeAdder.cs index 42e23ab7c8..7cf083fa1a 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/AngularSourceCodeAdder.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/AngularSourceCodeAdder.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; +using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; using Microsoft.Extensions.Logging; @@ -71,6 +72,7 @@ public class AngularSourceCodeAdder : ITransientDependency { await AddProjectToEnvironmentTsAsync(angularPath, moduleName); await AddProjectToAppModuleTsAsync(angularPath, moduleName); + await AddProjectToAppRoutingTsAsync(angularPath, moduleName); } private async Task AddProjectsToAngularJsonAsync(string angularPath, List projects) @@ -244,15 +246,15 @@ public class AngularSourceCodeAdder : ITransientDependency { return; } - + var fileContent = File.ReadAllText(filePath); - fileContent = Regex.Replace(fileContent, @"apis\s*:\s*{", - "apis: {"+ Environment.NewLine + - " " + moduleName.Split(".").Last() + ": {"+ Environment.NewLine + - " rootNamespace: '" + moduleName + "',"+ Environment.NewLine + + fileContent = Regex.Replace(fileContent, @"apis\s*:\s*{", + "apis: {" + Environment.NewLine + + " " + moduleName.Split(".").Last() + ": {" + Environment.NewLine + + " rootNamespace: '" + moduleName + "'," + Environment.NewLine + " },"); - + File.WriteAllText(filePath, fileContent); } @@ -264,23 +266,56 @@ public class AngularSourceCodeAdder : ITransientDependency { return; } - + var fileContent = File.ReadAllText(filePath); var moduleNameAsConfigPath = moduleName.ToKebabCase(); - + if (moduleName.Contains(".")) { var moduleNameSplited = moduleName.Split("."); - moduleNameAsConfigPath = moduleNameSplited.Take(moduleNameSplited.Length-1).JoinAsString(".").ToKebabCase() + "/" + moduleNameSplited.Last().ToKebabCase(); + moduleNameAsConfigPath = moduleNameSplited.Take(moduleNameSplited.Length - 1).JoinAsString(".").ToKebabCase() + "/" + moduleNameSplited.Last().ToKebabCase(); } - fileContent = "import { "+moduleName.Split(".").Last()+"ConfigModule } from '@"+moduleNameAsConfigPath+"/config';" + Environment.NewLine + fileContent; - - fileContent = Regex.Replace(fileContent, "imports\\s*:\\s*\\[", - "imports: ["+ Environment.NewLine + + fileContent = "import { " + moduleName.Split(".").Last() + "ConfigModule } from '@" + moduleNameAsConfigPath + "/config';" + Environment.NewLine + fileContent; + + fileContent = Regex.Replace(fileContent, "imports\\s*:\\s*\\[", + "imports: [" + Environment.NewLine + " " + moduleName.Split(".").Last() + "ConfigModule.forRoot(),"); - + + File.WriteAllText(filePath, fileContent); + } + + private async Task AddProjectToAppRoutingTsAsync(string angularPath, string moduleName) + { + string filePath = Path.Combine(angularPath, "src", "app", "app-routing.module.ts"); + + if (!File.Exists(filePath)) + { + return; + } + + string fileContent = File.ReadAllText(filePath); + string moduleNameAsConfigPath = moduleName.ToKebabCase(); + string path = moduleName.ToKebabCase(); + + if (moduleName.Contains(".")) + { + var moduleNameSplitted = moduleName.Split("."); + moduleNameAsConfigPath = moduleNameSplitted.Take(moduleNameSplitted.Length - 1).JoinAsString(".").ToKebabCase() + "/" + moduleNameSplitted.Last().ToKebabCase(); + path = $"{moduleNameSplitted.Last().ToKebabCase()}"; + } + + string pattern = "Routes\\s*=\\s*\\["; + string newContent = $@"Routes = [ + {{ + path: '{path}', + loadChildren: () => import('@{moduleNameAsConfigPath}') + .then(m => m.{(moduleName.Split(".").Length > 1 ? moduleName.Split(".")[1] : moduleName)}Module.forLazy()) + }}, +"; + + fileContent = Regex.Replace(fileContent, pattern, newContent); File.WriteAllText(filePath, fileContent); } @@ -311,7 +346,7 @@ public class AngularSourceCodeAdder : ITransientDependency { Directory.Delete(vscodeFolder, true); } - + var projectsInFolder = Directory.GetDirectories(folder); if (projectsInFolder.Length == 1 && Path.GetFileName(projectsInFolder[0]) == "projects") @@ -360,7 +395,7 @@ public class AngularSourceCodeAdder : ITransientDependency return projects; } - + private async Task GetProjectPackageNameAsync(string angularProjectsPath, string project) { var packageJsonPath = Path.Combine(angularProjectsPath, project, "package.json"); From e9c8804fb6d91f6e55c537eb2f8f2b4ab0219201 Mon Sep 17 00:00:00 2001 From: selman koc <64414348+skoc10@users.noreply.github.com> Date: Tue, 24 Oct 2023 11:33:54 +0300 Subject: [PATCH 042/179] Update version to release 7.4.1 --- common.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common.props b/common.props index 90cd1a1b4a..b2e66d8dd0 100644 --- a/common.props +++ b/common.props @@ -1,7 +1,7 @@ latest - 7.4.0 + 7.4.1 $(NoWarn);CS1591;CS0436 https://abp.io/assets/abp_nupkg.png https://abp.io/ From 3b2fb353d4efeef1de3bcc6c2bbe7282cf8463a4 Mon Sep 17 00:00:00 2001 From: Mahmut Gundogdu Date: Tue, 24 Oct 2023 16:43:27 +0300 Subject: [PATCH 043/179] bump version on abp templates --- npm/ng-packs/package.json | 11 +++-- templates/app-nolayers/angular/package.json | 42 +++++++++---------- templates/app/angular/package.json | 40 +++++++++--------- templates/module/angular/package.json | 46 ++++++++++----------- 4 files changed, 67 insertions(+), 72 deletions(-) diff --git a/npm/ng-packs/package.json b/npm/ng-packs/package.json index 9ca15c0eb6..146e04e56c 100644 --- a/npm/ng-packs/package.json +++ b/npm/ng-packs/package.json @@ -44,18 +44,17 @@ }, "private": true, "devDependencies": { - "@abp/ng.theme.lepton-x": "~2.4.0", "@abp/utils": "~7.4.0", "@angular-devkit/build-angular": "16.2.7", "@angular-devkit/core": "16.2.7", "@angular-devkit/schematics": "16.2.7", - "@angular-devkit/schematics-cli": "~16.0.0", - "@angular-eslint/eslint-plugin": "~16.0.0", - "@angular-eslint/eslint-plugin-template": "~16.0.0", - "@angular-eslint/template-parser": "~16.0.0", + "@angular-devkit/schematics-cli": "~16.2.0", + "@angular-eslint/eslint-plugin": "~16.2.0", + "@angular-eslint/eslint-plugin-template": "~16.2.0", + "@angular-eslint/template-parser": "~16.1.0", "@angular/animations": "16.2.10", - "@angular/cli": "~16.0.0", + "@angular/cli": "~16.2.0", "@angular/common": "16.2.10", "@angular/compiler": "16.2.10", "@angular/compiler-cli": "16.2.10", diff --git a/templates/app-nolayers/angular/package.json b/templates/app-nolayers/angular/package.json index de32293bb3..5e5a446743 100644 --- a/templates/app-nolayers/angular/package.json +++ b/templates/app-nolayers/angular/package.json @@ -21,31 +21,31 @@ "@abp/ng.tenant-management": "~7.4.0", "@abp/ng.theme.shared": "~7.4.0", "@abp/ng.theme.lepton-x": "~2.4.0", - "@angular/animations": "~16.0.0", - "@angular/common": "~16.0.0", - "@angular/compiler": "~16.0.0", - "@angular/core": "~16.0.0", - "@angular/forms": "~16.0.0", - "@angular/localize": "~16.0.0", - "@angular/platform-browser": "~16.0.0", - "@angular/platform-browser-dynamic": "~16.0.0", - "@angular/router": "~16.0.0", - "rxjs": "7.8.1", + "@angular/animations": "~16.2.0", + "@angular/common": "~16.2.0", + "@angular/compiler": "~16.2.0", + "@angular/core": "~16.2.0", + "@angular/forms": "~16.2.0", + "@angular/localize": "~16.2.0", + "@angular/platform-browser": "~16.2.0", + "@angular/platform-browser-dynamic": "~16.2.0", + "@angular/router": "~16.2.0", + "rxjs": "~7.4.0", "tslib": "^2.1.0", "bootstrap-icons": "~1.8.3", "zone.js": "~0.13.0" }, "devDependencies": { + "@angular-devkit/build-angular": "~16.2.0", + "@angular-eslint/builder": "~16.2.0", + "@angular-eslint/eslint-plugin": "~16.2.0", + "@angular-eslint/eslint-plugin-template": "~16.2.0", + "@angular-eslint/schematics": "~16.2.0", + "@angular-eslint/template-parser": "~16.2.0", "@abp/ng.schematics": "~7.4.0", - "@angular-devkit/build-angular": "~16.0.0", - "@angular-eslint/builder": "~16.0.0", - "@angular-eslint/eslint-plugin": "~16.0.0", - "@angular-eslint/eslint-plugin-template": "~16.0.0", - "@angular-eslint/schematics": "~16.0.0", - "@angular-eslint/template-parser": "~16.0.0", - "@angular/cli": "~16.0.0", - "@angular/compiler-cli": "~16.0.0", - "@angular/language-service": "~16.0.0", + "@angular/cli": "~16.2.0", + "@angular/compiler-cli": "~16.2.0", + "@angular/language-service": "~16.2.0", "@types/jasmine": "~3.6.0", "@types/node": "^12.11.1", "@typescript-eslint/eslint-plugin": "^5.36.2", @@ -57,7 +57,7 @@ "karma-coverage": "~2.1.0", "karma-jasmine": "~4.0.0", "karma-jasmine-html-reporter": "^1.7.0", - "ng-packagr": "^16.0.0", + "ng-packagr": "~16.2.0", "typescript": "~5.0.4" } -} \ No newline at end of file +} diff --git a/templates/app/angular/package.json b/templates/app/angular/package.json index 5a84ede9f5..428834d181 100644 --- a/templates/app/angular/package.json +++ b/templates/app/angular/package.json @@ -21,31 +21,31 @@ "@abp/ng.tenant-management": "~7.4.0", "@abp/ng.theme.shared": "~7.4.0", "@abp/ng.theme.lepton-x": "~2.4.0", - "@angular/animations": "~16.0.0", - "@angular/common": "~16.0.0", - "@angular/compiler": "~16.0.0", - "@angular/core": "~16.0.0", - "@angular/forms": "~16.0.0", - "@angular/localize": "~16.0.0", - "@angular/platform-browser": "~16.0.0", - "@angular/platform-browser-dynamic": "~16.0.0", - "@angular/router": "~16.0.0", + "@angular/animations": "~16.2.0", + "@angular/common": "~16.2.0", + "@angular/compiler": "~16.2.0", + "@angular/core": "~16.2.0", + "@angular/forms": "~16.2.0", + "@angular/localize": "~16.2.0", + "@angular/platform-browser": "~16.2.0", + "@angular/platform-browser-dynamic": "~16.2.0", + "@angular/router": "~16.2.0", "bootstrap-icons": "~1.8.3", - "rxjs": "7.8.1", + "rxjs": "~7.4.0", "tslib": "^2.1.0", "zone.js": "~0.13.0" }, "devDependencies": { - "@angular-devkit/build-angular": "~16.0.0", - "@angular-eslint/builder": "~16.0.0", - "@angular-eslint/eslint-plugin": "~16.0.0", - "@angular-eslint/eslint-plugin-template": "~16.0.0", - "@angular-eslint/schematics": "~16.0.0", - "@angular-eslint/template-parser": "~16.0.0", + "@angular-devkit/build-angular": "~16.2.0", + "@angular-eslint/builder": "~16.2.0", + "@angular-eslint/eslint-plugin": "~16.2.0", + "@angular-eslint/eslint-plugin-template": "~16.2.0", + "@angular-eslint/schematics": "~16.2.0", + "@angular-eslint/template-parser": "~16.2.0", "@abp/ng.schematics": "~7.4.0", - "@angular/cli": "~16.0.0", - "@angular/compiler-cli": "~16.0.0", - "@angular/language-service": "~16.0.0", + "@angular/cli": "~16.2.0", + "@angular/compiler-cli": "~16.2.0", + "@angular/language-service": "~16.2.0", "@types/jasmine": "~3.6.0", "@types/node": "^12.11.1", "@typescript-eslint/eslint-plugin": "^5.36.2", @@ -59,4 +59,4 @@ "karma-jasmine-html-reporter": "^1.7.0", "typescript": "~5.0.4" } -} \ No newline at end of file +} diff --git a/templates/module/angular/package.json b/templates/module/angular/package.json index 531a13de51..59093f8585 100644 --- a/templates/module/angular/package.json +++ b/templates/module/angular/package.json @@ -6,12 +6,9 @@ "start": "ng serve dev-app --open", "build": "ng build my-project-name --configuration production", "build:app": "npm run symlink:copy -- --no-watch && ng build dev-app --configuration production", - "symlink:copy": "symlink copy --angular --packages @my-company-name/my-project-name --configuration production", "test": "ng test", "lint": "ng lint", - "e2e": "ng e2e", - "compile:ivy": "yarn ngcc --properties es2015 browser module main --first-only --create-ivy-entry-points --tsconfig './tsconfig.prod.json' --source node_modules --async false", - "postinstall": "npm run compile:ivy" + "e2e": "ng e2e" }, "private": true, "dependencies": { @@ -24,30 +21,30 @@ "@abp/ng.tenant-management": "~7.4.0", "@abp/ng.theme.basic": "~7.4.0", "@abp/ng.theme.shared": "~7.4.0", - "@angular/animations": "~16.0.0", - "@angular/common": "~16.0.0", - "@angular/compiler": "~16.0.0", - "@angular/core": "~16.0.0", - "@angular/forms": "~16.0.0", - "@angular/localize": "~16.0.0", - "@angular/platform-browser": "~16.0.0", - "@angular/platform-browser-dynamic": "~16.0.0", - "@angular/router": "~16.0.0", - "rxjs": "7.8.1", + "@angular/animations": "~16.2.0", + "@angular/common": "~16.2.0", + "@angular/compiler": "~16.2.0", + "@angular/core": "~16.2.0", + "@angular/forms": "~16.2.0", + "@angular/localize": "~16.2.0", + "@angular/platform-browser": "~16.2.0", + "@angular/platform-browser-dynamic": "~16.2.0", + "@angular/router": "~16.2.0", + "rxjs": "~7.4.0", "tslib": "^2.1.0", "zone.js": "~0.13.0" }, "devDependencies": { + "@angular-devkit/build-angular": "~16.2.0", + "@angular-eslint/builder": "~16.2.0", + "@angular-eslint/eslint-plugin": "~16.2.0", + "@angular-eslint/eslint-plugin-template": "~16.2.0", + "@angular-eslint/schematics": "~16.2.0", + "@angular-eslint/template-parser": "~16.2.0", "@abp/ng.schematics": "~7.4.0", - "@angular-devkit/build-angular": "~16.0.0", - "@angular-eslint/builder": "~16.0.0", - "@angular-eslint/eslint-plugin": "~16.0.0", - "@angular-eslint/eslint-plugin-template": "~16.0.0", - "@angular-eslint/schematics": "~16.0.0", - "@angular-eslint/template-parser": "~16.0.0", - "@angular/cli": "~16.0.0", - "@angular/compiler-cli": "~16.0.0", - "@angular/language-service": "~16.0.0", + "@angular/cli": "~16.2.0", + "@angular/compiler-cli": "~16.2.0", + "@angular/language-service": "~16.2.0", "@types/jasmine": "~3.6.0", "@types/node": "^12.11.1", "@typescript-eslint/eslint-plugin": "^5.36.2", @@ -59,7 +56,6 @@ "karma-coverage": "~2.1.0", "karma-jasmine": "~4.0.0", "karma-jasmine-html-reporter": "^1.7.0", - "symlink-manager": "^1.5.0", "typescript": "~5.0.4" } -} \ No newline at end of file +} From 70c46b3c1c96ba944d7ff665cd24fff212b3a564 Mon Sep 17 00:00:00 2001 From: Mahmut Gundogdu Date: Tue, 24 Oct 2023 16:46:50 +0300 Subject: [PATCH 044/179] bump angular version on schematic package --- npm/ng-packs/packages/schematics/package.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/npm/ng-packs/packages/schematics/package.json b/npm/ng-packs/packages/schematics/package.json index 2389ce3f45..e8655768b9 100644 --- a/npm/ng-packs/packages/schematics/package.json +++ b/npm/ng-packs/packages/schematics/package.json @@ -4,16 +4,16 @@ "author": "", "schematics": "./collection.json", "dependencies": { - "@angular-devkit/core": "~16.0.0", - "@angular-devkit/schematics": "~16.0.0", - "@angular/cli": "~16.0.0", + "@angular-devkit/core": "~16.2.0", + "@angular-devkit/schematics": "~16.2.0", + "@angular/cli": "~16.2.0", "got": "^11.5.2", "jsonc-parser": "^2.3.0", "should-quote": "^1.0.0", "typescript": "5.0.4" }, "devDependencies": { - "@schematics/angular": "~16.0.0", + "@schematics/angular": "~16.2.0", "@types/jest": "29.4.4", "@types/node": "20.2.5", "jest": "29.4.3", From a1499840b881ab2fd5cb8dec46dce7a385f6f6c8 Mon Sep 17 00:00:00 2001 From: masumulu28 Date: Tue, 24 Oct 2023 17:39:27 +0300 Subject: [PATCH 045/179] Normalize angular package's versions --- npm/ng-packs/package.json | 72 +++++++++++++++++++-------------------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/npm/ng-packs/package.json b/npm/ng-packs/package.json index 146e04e56c..376fc1daa5 100644 --- a/npm/ng-packs/package.json +++ b/npm/ng-packs/package.json @@ -46,26 +46,26 @@ "devDependencies": { "@abp/ng.theme.lepton-x": "~2.4.0", "@abp/utils": "~7.4.0", - "@angular-devkit/build-angular": "16.2.7", - "@angular-devkit/core": "16.2.7", - "@angular-devkit/schematics": "16.2.7", + "@angular-devkit/build-angular": "~16.2.0", + "@angular-devkit/core": "~16.2.0", + "@angular-devkit/schematics": "~16.2.0", "@angular-devkit/schematics-cli": "~16.2.0", "@angular-eslint/eslint-plugin": "~16.2.0", "@angular-eslint/eslint-plugin-template": "~16.2.0", - "@angular-eslint/template-parser": "~16.1.0", - "@angular/animations": "16.2.10", + "@angular-eslint/template-parser": "~16.2.0", + "@angular/animations": "~16.2.0", "@angular/cli": "~16.2.0", - "@angular/common": "16.2.10", - "@angular/compiler": "16.2.10", - "@angular/compiler-cli": "16.2.10", - "@angular/core": "16.2.10", - "@angular/forms": "16.2.10", - "@angular/language-service": "16.2.10", - "@angular/localize": "16.2.10", - "@angular/platform-browser": "16.2.10", - "@angular/platform-browser-dynamic": "16.2.10", - "@angular/router": "16.2.10", - "@fortawesome/fontawesome-free": "^5.15.4", + "@angular/common": "~16.2.0", + "@angular/compiler": "~16.2.0", + "@angular/compiler-cli": "~16.2.0", + "@angular/core": "~16.2.0", + "@angular/forms": "~16.2.0", + "@angular/language-service": "~16.2.0", + "@angular/localize": "~16.2.0", + "@angular/platform-browser": "~16.2.0", + "@angular/platform-browser-dynamic": "~16.2.0", + "@angular/router": "~16.2.0", + "@fortawesome/fontawesome-free": "^5.0.0", "@ng-bootstrap/ng-bootstrap": "^15.0.0", "@ngneat/spectator": "^10.0.0", "@ngx-validate/core": "^0.2.0", @@ -76,41 +76,41 @@ "@nx/js": "16.9.0", "@nx/linter": "16.9.0", "@nx/workspace": "16.9.0", - "@popperjs/core": "~2.11.2", - "@schematics/angular": "16.2.7", - "@swc-node/register": "~1.4.2", - "@swc/cli": "~0.1.62", + "@popperjs/core": "~2.11.0", + "@schematics/angular": "~16.2.0", + "@swc-node/register": "~1.4.0", + "@swc/cli": "~0.1.0", "@swc/core": "1.3.94", "@swimlane/ngx-datatable": "^20.0.0", "@types/jest": "29.4.4", "@types/node": "20.2.5", "@typescript-eslint/eslint-plugin": "5.62.0", "@typescript-eslint/parser": "5.62.0", - "angular-oauth2-oidc": "^15.0.1", - "bootstrap": "^5.1.1", - "bootstrap-icons": "^1.10.3", - "chart.js": "^3.5.1", - "cypress": "^7.3.0", + "angular-oauth2-oidc": "^15.0.0", + "bootstrap": "^5.0.0", + "bootstrap-icons": "^1.0.0", + "chart.js": "^3.0.0", + "cypress": "^7.0.0", "dotenv": "10.0.0", "eslint": "8.46.0", "eslint-config-prettier": "8.1.0", "eslint-plugin-cypress": "2.15.1", - "got": "^11.5.2", + "got": "^11.0.0", "jest": "29.4.3", - "jest-canvas-mock": "^2.3.1", + "jest-canvas-mock": "^2.0.0", "jest-environment-jsdom": "29.4.3", "jest-preset-angular": "13.1.0", - "jsonc-eslint-parser": "^2.1.0", - "jsonc-parser": "^2.3.0", - "just-clone": "^6.1.1", - "just-compare": "^2.3.0", + "jsonc-eslint-parser": "^2.0.0", + "jsonc-parser": "^2.0.0", + "just-clone": "^6.0.0", + "just-compare": "^2.0.0", "lerna": "^4.0.0", - "lint-staged": "^13.0.3", - "ng-packagr": "16.2.3", + "lint-staged": "^13.0.0", + "ng-packagr": "~16.2.0", "ng-zorro-antd": "^16.0.0", "nx": "16.9.0", - "perfect-scrollbar": "^1.5.5", - "postcss": "^8.3.9", + "perfect-scrollbar": "^1.0.0", + "postcss": "^8.0.0", "postcss-import": "14.1.0", "postcss-preset-env": "7.5.0", "postcss-url": "10.1.3", @@ -121,7 +121,7 @@ "ts-jest": "29.1.0", "ts-node": "10.9.1", "ts-toolbelt": "6.15.4", - "tslib": "^2.3.0", + "tslib": "^2.0.0", "tslint": "~6.1.0", "typescript": "5.1.6", "zone.js": "~0.13.0", From 11517bfb3bd9b14eb14d60322f314d9cc0cf160d Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Wed, 25 Oct 2023 10:32:23 +0800 Subject: [PATCH 046/179] Generate-proxy support with complex generic types --- .../CSharp/CSharpServiceProxyGenerator.cs | 34 ++++++++++++------- 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ServiceProxying/CSharp/CSharpServiceProxyGenerator.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ServiceProxying/CSharp/CSharpServiceProxyGenerator.cs index 45b93423c4..5c17296272 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ServiceProxying/CSharp/CSharpServiceProxyGenerator.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ServiceProxying/CSharp/CSharpServiceProxyGenerator.cs @@ -538,18 +538,9 @@ public class CSharpServiceProxyGenerator : ServiceProxyGeneratorBase")) - { - var left = typeName.IndexOf("<", StringComparison.Ordinal); - var right = typeName.LastIndexOf(">", StringComparison.Ordinal); - var genericTypes = typeName.Substring(left + 1, right - left - 1); - foreach (var genericType in genericTypes.Split(",").Where(x => x.Contains("."))) - { - usingNamespaceList?.AddIfNotContains($"using {GetTypeNamespace(genericType)};"); - } - } - + + AddGenericTypeUsingNamespace(typeName, usingNamespaceList); + var type = new StringBuilder(); var s1 = typeName.Split("<"); for (var i = 0; i < s1.Length; i++) @@ -579,6 +570,25 @@ public class CSharpServiceProxyGenerator : ServiceProxyGeneratorBase usingNamespaceList) + { + if(!typeFullName.Contains("<")) + { + usingNamespaceList.AddIfNotContains($"using {GetTypeNamespace(typeFullName)};"); + } + + if (typeFullName.Contains("<") && typeFullName.Contains(">")) + { + var left = typeFullName.IndexOf("<", StringComparison.Ordinal); + var right = typeFullName.LastIndexOf(">", StringComparison.Ordinal); + var genericTypes = typeFullName.Substring(left + 1, right - left - 1); + foreach (var genericType in genericTypes.Split(",").Where(x => x.Contains("."))) + { + AddGenericTypeUsingNamespace(genericType, usingNamespaceList); + } + } + } + private static string NormalizeTypeName(string typeName) { var nullable = string.Empty; From 1be36f1a51512e5e55ca3a23999cc4908e687c69 Mon Sep 17 00:00:00 2001 From: Mahmut Gundogdu Date: Wed, 25 Oct 2023 11:16:53 +0300 Subject: [PATCH 047/179] fix lint issues --- .../packages/core/src/lib/tests/capsLock.directive.spec.ts | 2 +- .../core/src/lib/tests/show-password-directive.spec.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/npm/ng-packs/packages/core/src/lib/tests/capsLock.directive.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/capsLock.directive.spec.ts index 3182dfa2dd..9ba6095206 100644 --- a/npm/ng-packs/packages/core/src/lib/tests/capsLock.directive.spec.ts +++ b/npm/ng-packs/packages/core/src/lib/tests/capsLock.directive.spec.ts @@ -11,7 +11,7 @@ import { By } from '@angular/platform-browser'; imports:[TrackCapsLockDirective] }) class TestComponent { - capsLock:boolean = false + capsLock = false } describe('TrackCapsLockDirective',()=>{ diff --git a/npm/ng-packs/packages/core/src/lib/tests/show-password-directive.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/show-password-directive.spec.ts index 8babb472c4..a1e766dc51 100644 --- a/npm/ng-packs/packages/core/src/lib/tests/show-password-directive.spec.ts +++ b/npm/ng-packs/packages/core/src/lib/tests/show-password-directive.spec.ts @@ -13,7 +13,7 @@ import { By } from '@angular/platform-browser'; imports:[ShowPasswordDirective] }) class TestComponent { - showPassword:boolean = false + showPassword = false } describe('ShowPasswordDirective',()=>{ @@ -46,7 +46,7 @@ describe('ShowPasswordDirective',()=>{ }); it('should have three input has ShowPasswordDirective elements', () => { - let input = des[2].nativeElement + const input = des[2].nativeElement expect(input.type).toBe('password') fixture.componentInstance.showPassword = true fixture.detectChanges() From e9a73c0670806d394dd4cbf5aa5d968e82735d5e Mon Sep 17 00:00:00 2001 From: maliming Date: Thu, 26 Oct 2023 10:29:57 +0800 Subject: [PATCH 048/179] Add `Configuring SSL certificate` document. Resolve #17974 --- docs/en/Deployment/Index.md | 1 + docs/en/Deployment/SSL.md | 34 ++++++++++++++++++++++++++++++++++ docs/en/docs-nav.json | 4 ++++ 3 files changed, 39 insertions(+) create mode 100644 docs/en/Deployment/SSL.md diff --git a/docs/en/Deployment/Index.md b/docs/en/Deployment/Index.md index 3eb299b483..37d6c5bcc5 100644 --- a/docs/en/Deployment/Index.md +++ b/docs/en/Deployment/Index.md @@ -6,6 +6,7 @@ However, there are some topics that you should care about when you are deploying ## Guides +* [Configuring SSL certificate(HTTPS)](SSL.md): Explains how to configure SSL certificate(HTTPS) for your application. * [Configuring for OpenIddict](Configuring-OpenIddict.md): Notes for some essential configurations for OpenIddict. * [Configuring for Production](Configuring-Production.md): Notes for some essential configurations for production environments. * [Optimization for Production](Optimizing-Production.md): Tips and suggestions for optimizing your application on production environments. diff --git a/docs/en/Deployment/SSL.md b/docs/en/Deployment/SSL.md new file mode 100644 index 0000000000..c48c916d93 --- /dev/null +++ b/docs/en/Deployment/SSL.md @@ -0,0 +1,34 @@ +# Configuring Configuring SSL certificate(HTTPS) + +A website needs an SSL certificate in order to keep user data secure, verify ownership of the website, prevent attackers from creating a fake version of the site, and gain user trust. + +This document introduces how to get and use SSL certificate(HTTPS) for your application. + +## Get a SSL Certificate from a Certificate Authority + +You can get a SSL certificate from a certificate authority (CA) such as [Let's Encrypt](https://letsencrypt.org/) or [Cloudflare](https://www.cloudflare.com/learning/ssl/what-is-an-ssl-certificate/) and so on. + +Once you have a certificate, you need to configure your web server to use it. The following references show how to configure your web server to use a certificate. + +* [Host ASP.NET Core on Linux with Apache: HTTPS configuration](https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/linux-apache) +* [Host ASP.NET Core on Linux with Nginx: HTTPS configuration](https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/linux-nginx) +* [How to Set Up SSL on IIS 7 or later](https://learn.microsoft.com/en-us/iis/manage/configuring-security/how-to-set-up-ssl-on-iis) + +## Create a Self-Signed Certificate + +You can create a self-signed certificate for testing purposes or internal use. + +There is an article about [how to create a self-signed certificate](https://learn.microsoft.com/en-us/dotnet/core/additional-tools/self-signed-certificates-guide), If you are using IIS, you can use the following this document to [obtain a Certificate](https://learn.microsoft.com/en-us/iis/manage/configuring-security/how-to-set-up-ssl-on-iis#obtain-a-certificate) + +## Common Problems + +### The remote certificate is invalid because of errors in the certificate chain: UntrustedRoot + +This error may occur when using IIS. You need to trust your certificate by `Manage computer certificates`. + +## References + +* [ABP commercial IIS Deployment](https://docs.abp.io/en/commercial/latest/startup-templates/application/deployment-iis) +* [HTTPS in ASP.NET Core](https://learn.microsoft.com/en-us/aspnet/core/security/enforcing-ssl) +* [Let's Encrypt](https://letsencrypt.org/getting-started) +* [Cloudflare's Free SSL / TLS](https://www.cloudflare.com/application-services/products/ssl/) \ No newline at end of file diff --git a/docs/en/docs-nav.json b/docs/en/docs-nav.json index 582dcf98cc..fa0a98915a 100644 --- a/docs/en/docs-nav.json +++ b/docs/en/docs-nav.json @@ -1363,6 +1363,10 @@ "text": "Deployment", "path": "Deployment/Index.md", "items": [ + { + "text": "Configuring SSL certificate(HTTPS)", + "path": "Deployment/SSL.md" + }, { "text": "Configuring OpenIddict", "path": "Deployment/Configuring-OpenIddict.md" From abdf2a320d5cb196a26546f82006958e23df5cf0 Mon Sep 17 00:00:00 2001 From: maliming Date: Thu, 26 Oct 2023 11:26:58 +0800 Subject: [PATCH 049/179] Remove `Required` constraints of `EntityChange's EntityId`. --- .../AbpAuditLoggingDbContextModelBuilderExtensions.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.EntityFrameworkCore/Volo/Abp/AuditLogging/EntityFrameworkCore/AbpAuditLoggingDbContextModelBuilderExtensions.cs b/modules/audit-logging/src/Volo.Abp.AuditLogging.EntityFrameworkCore/Volo/Abp/AuditLogging/EntityFrameworkCore/AbpAuditLoggingDbContextModelBuilderExtensions.cs index 8a3cd7de23..e63d806993 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.EntityFrameworkCore/Volo/Abp/AuditLogging/EntityFrameworkCore/AbpAuditLoggingDbContextModelBuilderExtensions.cs +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.EntityFrameworkCore/Volo/Abp/AuditLogging/EntityFrameworkCore/AbpAuditLoggingDbContextModelBuilderExtensions.cs @@ -73,7 +73,7 @@ public static class AbpAuditLoggingDbContextModelBuilderExtensions b.ConfigureByConvention(); b.Property(x => x.EntityTypeFullName).HasMaxLength(EntityChangeConsts.MaxEntityTypeFullNameLength).IsRequired().HasColumnName(nameof(EntityChange.EntityTypeFullName)); - b.Property(x => x.EntityId).HasMaxLength(EntityChangeConsts.MaxEntityIdLength).IsRequired().HasColumnName(nameof(EntityChange.EntityId)); + b.Property(x => x.EntityId).HasMaxLength(EntityChangeConsts.MaxEntityIdLength).HasColumnName(nameof(EntityChange.EntityId)); b.Property(x => x.AuditLogId).IsRequired().HasColumnName(nameof(EntityChange.AuditLogId)); b.Property(x => x.ChangeTime).IsRequired().HasColumnName(nameof(EntityChange.ChangeTime)); b.Property(x => x.ChangeType).IsRequired().HasColumnName(nameof(EntityChange.ChangeType)); From d5c3619e25c7707fc73f4d907f64cdf9fc392fc0 Mon Sep 17 00:00:00 2001 From: maliming Date: Thu, 26 Oct 2023 15:00:36 +0800 Subject: [PATCH 050/179] Support `DateOnly` and `TimeOnly` in `AspNetCoreApiDescriptionModelProvider`. --- .../Mvc/AspNetCoreApiDescriptionModelProvider.cs | 2 ++ .../src/Volo.Abp.Core/Volo/Abp/Reflection/TypeHelper.cs | 8 ++++++++ 2 files changed, 10 insertions(+) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AspNetCoreApiDescriptionModelProvider.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AspNetCoreApiDescriptionModelProvider.cs index f1d014b76a..0a10835e3c 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AspNetCoreApiDescriptionModelProvider.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AspNetCoreApiDescriptionModelProvider.cs @@ -214,6 +214,8 @@ public class AspNetCoreApiDescriptionModelProvider : IApiDescriptionModelProvide type == typeof(void) || type == typeof(Enum) || type == typeof(ValueType) || + type == typeof(DateOnly) || + type == typeof(TimeOnly) || TypeHelper.IsPrimitiveExtended(type)) { return; diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Reflection/TypeHelper.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Reflection/TypeHelper.cs index b439a5a07b..1efa6c4f29 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Reflection/TypeHelper.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Reflection/TypeHelper.cs @@ -257,6 +257,14 @@ public static class TypeHelper { return "string"; } + else if (type.FullName == "System.DateOnly") + { + return "string"; + } + else if (type.FullName == "System.TimeOnly") + { + return "string"; + } else if (type == typeof(TimeSpan)) { return "string"; From eb1959d765c71f4df3f17b8c850c5543a6b9880a Mon Sep 17 00:00:00 2001 From: maliming Date: Thu, 26 Oct 2023 15:12:15 +0800 Subject: [PATCH 051/179] Update EF Core migrations. --- ...nitial.Designer.cs => 20231026071039_Initial.Designer.cs} | 5 ++--- .../{20231003031426_Initial.cs => 20231026071039_Initial.cs} | 2 +- .../Migrations/MyProjectNameDbContextModelSnapshot.cs | 3 +-- ...nitial.Designer.cs => 20231026071041_Initial.Designer.cs} | 5 ++--- .../Server/Migrations/20231026071041_Initial.cs} | 2 +- .../Server/Migrations/MyProjectNameDbContextModelSnapshot.cs | 3 +-- ...nitial.Designer.cs => 20231026071035_Initial.Designer.cs} | 5 ++--- .../{20231003031446_Initial.cs => 20231026071035_Initial.cs} | 2 +- .../Migrations/MyProjectNameDbContextModelSnapshot.cs | 3 +-- ...nitial.Designer.cs => 20231026071042_Initial.Designer.cs} | 5 ++--- .../{20231003031451_Initial.cs => 20231026071042_Initial.cs} | 2 +- .../Migrations/MyProjectNameDbContextModelSnapshot.cs | 3 +-- ...nitial.Designer.cs => 20231026070402_Initial.Designer.cs} | 5 ++--- .../{20231003030048_Initial.cs => 20231026070402_Initial.cs} | 2 +- .../Migrations/MyProjectNameDbContextModelSnapshot.cs | 3 +-- ...nitial.Designer.cs => 20231026071058_Initial.Designer.cs} | 5 ++--- .../Migrations/20231026071058_Initial.cs} | 2 +- .../Migrations/AuthServerDbContextModelSnapshot.cs | 3 +-- ...nitial.Designer.cs => 20231026071107_Initial.Designer.cs} | 5 ++--- .../{20231003031642_Initial.cs => 20231026071107_Initial.cs} | 2 +- .../Migrations/UnifiedDbContextModelSnapshot.cs | 3 +-- ...nitial.Designer.cs => 20231026071207_Initial.Designer.cs} | 5 ++--- .../{20231003031645_Initial.cs => 20231026071207_Initial.cs} | 2 +- .../Migrations/UnifiedDbContextModelSnapshot.cs | 3 +-- 24 files changed, 32 insertions(+), 48 deletions(-) rename templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/{20231003031426_Initial.Designer.cs => 20231026071039_Initial.Designer.cs} (99%) rename templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/{20231003031426_Initial.cs => 20231026071039_Initial.cs} (99%) rename templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/{20231003031450_Initial.Designer.cs => 20231026071041_Initial.Designer.cs} (99%) rename templates/{module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20231003031621_Initial.cs => app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20231026071041_Initial.cs} (99%) rename templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/{20231003031446_Initial.Designer.cs => 20231026071035_Initial.Designer.cs} (99%) rename templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/{20231003031446_Initial.cs => 20231026071035_Initial.cs} (99%) rename templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/{20231003031451_Initial.Designer.cs => 20231026071042_Initial.Designer.cs} (99%) rename templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/{20231003031451_Initial.cs => 20231026071042_Initial.cs} (99%) rename templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/{20231003030048_Initial.Designer.cs => 20231026070402_Initial.Designer.cs} (99%) rename templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/{20231003030048_Initial.cs => 20231026070402_Initial.cs} (99%) rename templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/{20231003031621_Initial.Designer.cs => 20231026071058_Initial.Designer.cs} (99%) rename templates/{app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20231003031450_Initial.cs => module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20231026071058_Initial.cs} (99%) rename templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/{20231003031642_Initial.Designer.cs => 20231026071107_Initial.Designer.cs} (99%) rename templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/{20231003031642_Initial.cs => 20231026071107_Initial.cs} (99%) rename templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/{20231003031645_Initial.Designer.cs => 20231026071207_Initial.Designer.cs} (99%) rename templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/{20231003031645_Initial.cs => 20231026071207_Initial.cs} (99%) diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20231003031426_Initial.Designer.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20231026071039_Initial.Designer.cs similarity index 99% rename from templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20231003031426_Initial.Designer.cs rename to templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20231026071039_Initial.Designer.cs index e73ffc0d1d..f6131569e7 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20231003031426_Initial.Designer.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20231026071039_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Blazor.Server.Migrations { [DbContext(typeof(MyProjectNameDbContext))] - [Migration("20231003031426_Initial")] + [Migration("20231026071039_Initial")] partial class Initial { /// @@ -22,7 +22,7 @@ namespace MyCompanyName.MyProjectName.Blazor.Server.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "8.0.0-rc.1.23419.6") + .HasAnnotation("ProductVersion", "8.0.0-rc.2.23480.1") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); @@ -218,7 +218,6 @@ namespace MyCompanyName.MyProjectName.Blazor.Server.Migrations .HasColumnName("ChangeType"); b.Property("EntityId") - .IsRequired() .HasMaxLength(128) .HasColumnType("nvarchar(128)") .HasColumnName("EntityId"); diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20231003031426_Initial.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20231026071039_Initial.cs similarity index 99% rename from templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20231003031426_Initial.cs rename to templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20231026071039_Initial.cs index 8b6e1b81cf..10e01ba747 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20231003031426_Initial.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20231026071039_Initial.cs @@ -464,7 +464,7 @@ namespace MyCompanyName.MyProjectName.Blazor.Server.Migrations ChangeTime = table.Column(type: "datetime2", nullable: false), ChangeType = table.Column(type: "tinyint", nullable: false), EntityTenantId = table.Column(type: "uniqueidentifier", nullable: true), - EntityId = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + EntityId = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), EntityTypeFullName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true) }, diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/MyProjectNameDbContextModelSnapshot.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/MyProjectNameDbContextModelSnapshot.cs index cdb1b5bacf..97625b9411 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/MyProjectNameDbContextModelSnapshot.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/MyProjectNameDbContextModelSnapshot.cs @@ -19,7 +19,7 @@ namespace MyCompanyName.MyProjectName.Blazor.Server.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "8.0.0-rc.1.23419.6") + .HasAnnotation("ProductVersion", "8.0.0-rc.2.23480.1") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); @@ -215,7 +215,6 @@ namespace MyCompanyName.MyProjectName.Blazor.Server.Migrations .HasColumnName("ChangeType"); b.Property("EntityId") - .IsRequired() .HasMaxLength(128) .HasColumnType("nvarchar(128)") .HasColumnName("EntityId"); diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20231003031450_Initial.Designer.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20231026071041_Initial.Designer.cs similarity index 99% rename from templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20231003031450_Initial.Designer.cs rename to templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20231026071041_Initial.Designer.cs index f2ed06d4cd..222393bd82 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20231003031450_Initial.Designer.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20231026071041_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Migrations { [DbContext(typeof(MyProjectNameDbContext))] - [Migration("20231003031450_Initial")] + [Migration("20231026071041_Initial")] partial class Initial { /// @@ -22,7 +22,7 @@ namespace MyCompanyName.MyProjectName.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "8.0.0-rc.1.23419.6") + .HasAnnotation("ProductVersion", "8.0.0-rc.2.23480.1") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); @@ -218,7 +218,6 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnName("ChangeType"); b.Property("EntityId") - .IsRequired() .HasMaxLength(128) .HasColumnType("nvarchar(128)") .HasColumnName("EntityId"); diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20231003031621_Initial.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20231026071041_Initial.cs similarity index 99% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20231003031621_Initial.cs rename to templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20231026071041_Initial.cs index d79d7169cb..193fa0b299 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20231003031621_Initial.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20231026071041_Initial.cs @@ -464,7 +464,7 @@ namespace MyCompanyName.MyProjectName.Migrations ChangeTime = table.Column(type: "datetime2", nullable: false), ChangeType = table.Column(type: "tinyint", nullable: false), EntityTenantId = table.Column(type: "uniqueidentifier", nullable: true), - EntityId = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + EntityId = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), EntityTypeFullName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true) }, diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/MyProjectNameDbContextModelSnapshot.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/MyProjectNameDbContextModelSnapshot.cs index 5697b4d5ef..2ab818fa36 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/MyProjectNameDbContextModelSnapshot.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/MyProjectNameDbContextModelSnapshot.cs @@ -19,7 +19,7 @@ namespace MyCompanyName.MyProjectName.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "8.0.0-rc.1.23419.6") + .HasAnnotation("ProductVersion", "8.0.0-rc.2.23480.1") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); @@ -215,7 +215,6 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnName("ChangeType"); b.Property("EntityId") - .IsRequired() .HasMaxLength(128) .HasColumnType("nvarchar(128)") .HasColumnName("EntityId"); diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20231003031446_Initial.Designer.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20231026071035_Initial.Designer.cs similarity index 99% rename from templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20231003031446_Initial.Designer.cs rename to templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20231026071035_Initial.Designer.cs index cdefb06e34..e25c062a5d 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20231003031446_Initial.Designer.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20231026071035_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Host.Migrations { [DbContext(typeof(MyProjectNameDbContext))] - [Migration("20231003031446_Initial")] + [Migration("20231026071035_Initial")] partial class Initial { /// @@ -22,7 +22,7 @@ namespace MyCompanyName.MyProjectName.Host.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "8.0.0-rc.1.23419.6") + .HasAnnotation("ProductVersion", "8.0.0-rc.2.23480.1") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); @@ -218,7 +218,6 @@ namespace MyCompanyName.MyProjectName.Host.Migrations .HasColumnName("ChangeType"); b.Property("EntityId") - .IsRequired() .HasMaxLength(128) .HasColumnType("nvarchar(128)") .HasColumnName("EntityId"); diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20231003031446_Initial.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20231026071035_Initial.cs similarity index 99% rename from templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20231003031446_Initial.cs rename to templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20231026071035_Initial.cs index 9eaa158d4b..3b285fc029 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20231003031446_Initial.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20231026071035_Initial.cs @@ -464,7 +464,7 @@ namespace MyCompanyName.MyProjectName.Host.Migrations ChangeTime = table.Column(type: "datetime2", nullable: false), ChangeType = table.Column(type: "tinyint", nullable: false), EntityTenantId = table.Column(type: "uniqueidentifier", nullable: true), - EntityId = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + EntityId = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), EntityTypeFullName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true) }, diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/MyProjectNameDbContextModelSnapshot.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/MyProjectNameDbContextModelSnapshot.cs index 04ad8a488a..a38be819e5 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/MyProjectNameDbContextModelSnapshot.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/MyProjectNameDbContextModelSnapshot.cs @@ -19,7 +19,7 @@ namespace MyCompanyName.MyProjectName.Host.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "8.0.0-rc.1.23419.6") + .HasAnnotation("ProductVersion", "8.0.0-rc.2.23480.1") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); @@ -215,7 +215,6 @@ namespace MyCompanyName.MyProjectName.Host.Migrations .HasColumnName("ChangeType"); b.Property("EntityId") - .IsRequired() .HasMaxLength(128) .HasColumnType("nvarchar(128)") .HasColumnName("EntityId"); diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20231003031451_Initial.Designer.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20231026071042_Initial.Designer.cs similarity index 99% rename from templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20231003031451_Initial.Designer.cs rename to templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20231026071042_Initial.Designer.cs index a3684f655c..cce37bd3dd 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20231003031451_Initial.Designer.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20231026071042_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Mvc.Migrations { [DbContext(typeof(MyProjectNameDbContext))] - [Migration("20231003031451_Initial")] + [Migration("20231026071042_Initial")] partial class Initial { /// @@ -22,7 +22,7 @@ namespace MyCompanyName.MyProjectName.Mvc.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "8.0.0-rc.1.23419.6") + .HasAnnotation("ProductVersion", "8.0.0-rc.2.23480.1") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); @@ -218,7 +218,6 @@ namespace MyCompanyName.MyProjectName.Mvc.Migrations .HasColumnName("ChangeType"); b.Property("EntityId") - .IsRequired() .HasMaxLength(128) .HasColumnType("nvarchar(128)") .HasColumnName("EntityId"); diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20231003031451_Initial.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20231026071042_Initial.cs similarity index 99% rename from templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20231003031451_Initial.cs rename to templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20231026071042_Initial.cs index 03261fb7bd..2263582b8a 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20231003031451_Initial.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20231026071042_Initial.cs @@ -464,7 +464,7 @@ namespace MyCompanyName.MyProjectName.Mvc.Migrations ChangeTime = table.Column(type: "datetime2", nullable: false), ChangeType = table.Column(type: "tinyint", nullable: false), EntityTenantId = table.Column(type: "uniqueidentifier", nullable: true), - EntityId = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + EntityId = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), EntityTypeFullName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true) }, diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/MyProjectNameDbContextModelSnapshot.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/MyProjectNameDbContextModelSnapshot.cs index b28dbf62b4..9e899c6051 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/MyProjectNameDbContextModelSnapshot.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/MyProjectNameDbContextModelSnapshot.cs @@ -19,7 +19,7 @@ namespace MyCompanyName.MyProjectName.Mvc.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "8.0.0-rc.1.23419.6") + .HasAnnotation("ProductVersion", "8.0.0-rc.2.23480.1") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); @@ -215,7 +215,6 @@ namespace MyCompanyName.MyProjectName.Mvc.Migrations .HasColumnName("ChangeType"); b.Property("EntityId") - .IsRequired() .HasMaxLength(128) .HasColumnType("nvarchar(128)") .HasColumnName("EntityId"); diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/20231003030048_Initial.Designer.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/20231026070402_Initial.Designer.cs similarity index 99% rename from templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/20231003030048_Initial.Designer.cs rename to templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/20231026070402_Initial.Designer.cs index d80788a40e..6ed09621a7 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/20231003030048_Initial.Designer.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/20231026070402_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Migrations { [DbContext(typeof(MyProjectNameDbContext))] - [Migration("20231003030048_Initial")] + [Migration("20231026070402_Initial")] partial class Initial { /// @@ -22,7 +22,7 @@ namespace MyCompanyName.MyProjectName.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "8.0.0-rc.1.23419.6") + .HasAnnotation("ProductVersion", "8.0.0-rc.2.23480.1") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); @@ -218,7 +218,6 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnName("ChangeType"); b.Property("EntityId") - .IsRequired() .HasMaxLength(128) .HasColumnType("nvarchar(128)") .HasColumnName("EntityId"); diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/20231003030048_Initial.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/20231026070402_Initial.cs similarity index 99% rename from templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/20231003030048_Initial.cs rename to templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/20231026070402_Initial.cs index 00c66b2800..bef0c6b97d 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/20231003030048_Initial.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/20231026070402_Initial.cs @@ -485,7 +485,7 @@ namespace MyCompanyName.MyProjectName.Migrations ChangeTime = table.Column(type: "datetime2", nullable: false), ChangeType = table.Column(type: "tinyint", nullable: false), EntityTenantId = table.Column(type: "uniqueidentifier", nullable: true), - EntityId = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + EntityId = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), EntityTypeFullName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true) }, diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/MyProjectNameDbContextModelSnapshot.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/MyProjectNameDbContextModelSnapshot.cs index 1198a563d4..f44d13227d 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/MyProjectNameDbContextModelSnapshot.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/MyProjectNameDbContextModelSnapshot.cs @@ -19,7 +19,7 @@ namespace MyCompanyName.MyProjectName.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "8.0.0-rc.1.23419.6") + .HasAnnotation("ProductVersion", "8.0.0-rc.2.23480.1") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); @@ -215,7 +215,6 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnName("ChangeType"); b.Property("EntityId") - .IsRequired() .HasMaxLength(128) .HasColumnType("nvarchar(128)") .HasColumnName("EntityId"); diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20231003031621_Initial.Designer.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20231026071058_Initial.Designer.cs similarity index 99% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20231003031621_Initial.Designer.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20231026071058_Initial.Designer.cs index e9ad539254..b6947fded4 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20231003031621_Initial.Designer.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20231026071058_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Migrations { [DbContext(typeof(AuthServerDbContext))] - [Migration("20231003031621_Initial")] + [Migration("20231026071058_Initial")] partial class Initial { /// @@ -22,7 +22,7 @@ namespace MyCompanyName.MyProjectName.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "8.0.0-rc.1.23419.6") + .HasAnnotation("ProductVersion", "8.0.0-rc.2.23480.1") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); @@ -218,7 +218,6 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnName("ChangeType"); b.Property("EntityId") - .IsRequired() .HasMaxLength(128) .HasColumnType("nvarchar(128)") .HasColumnName("EntityId"); diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20231003031450_Initial.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20231026071058_Initial.cs similarity index 99% rename from templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20231003031450_Initial.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20231026071058_Initial.cs index d79d7169cb..193fa0b299 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20231003031450_Initial.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20231026071058_Initial.cs @@ -464,7 +464,7 @@ namespace MyCompanyName.MyProjectName.Migrations ChangeTime = table.Column(type: "datetime2", nullable: false), ChangeType = table.Column(type: "tinyint", nullable: false), EntityTenantId = table.Column(type: "uniqueidentifier", nullable: true), - EntityId = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + EntityId = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), EntityTypeFullName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true) }, diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/AuthServerDbContextModelSnapshot.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/AuthServerDbContextModelSnapshot.cs index b60bca4607..849e6894c2 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/AuthServerDbContextModelSnapshot.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/AuthServerDbContextModelSnapshot.cs @@ -19,7 +19,7 @@ namespace MyCompanyName.MyProjectName.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "8.0.0-rc.1.23419.6") + .HasAnnotation("ProductVersion", "8.0.0-rc.2.23480.1") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); @@ -215,7 +215,6 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnName("ChangeType"); b.Property("EntityId") - .IsRequired() .HasMaxLength(128) .HasColumnType("nvarchar(128)") .HasColumnName("EntityId"); diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20231003031642_Initial.Designer.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20231026071107_Initial.Designer.cs similarity index 99% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20231003031642_Initial.Designer.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20231026071107_Initial.Designer.cs index c4d7e314c4..34883896f8 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20231003031642_Initial.Designer.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20231026071107_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Blazor.Server.Host.Migrations { [DbContext(typeof(UnifiedDbContext))] - [Migration("20231003031642_Initial")] + [Migration("20231026071107_Initial")] partial class Initial { /// @@ -22,7 +22,7 @@ namespace MyCompanyName.MyProjectName.Blazor.Server.Host.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "8.0.0-rc.1.23419.6") + .HasAnnotation("ProductVersion", "8.0.0-rc.2.23480.1") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); @@ -218,7 +218,6 @@ namespace MyCompanyName.MyProjectName.Blazor.Server.Host.Migrations .HasColumnName("ChangeType"); b.Property("EntityId") - .IsRequired() .HasMaxLength(128) .HasColumnType("nvarchar(128)") .HasColumnName("EntityId"); diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20231003031642_Initial.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20231026071107_Initial.cs similarity index 99% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20231003031642_Initial.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20231026071107_Initial.cs index c75c765e1a..b21456cc73 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20231003031642_Initial.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20231026071107_Initial.cs @@ -404,7 +404,7 @@ namespace MyCompanyName.MyProjectName.Blazor.Server.Host.Migrations ChangeTime = table.Column(type: "datetime2", nullable: false), ChangeType = table.Column(type: "tinyint", nullable: false), EntityTenantId = table.Column(type: "uniqueidentifier", nullable: true), - EntityId = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + EntityId = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), EntityTypeFullName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true) }, diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/UnifiedDbContextModelSnapshot.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/UnifiedDbContextModelSnapshot.cs index 6172cec5c5..102de849e7 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/UnifiedDbContextModelSnapshot.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/UnifiedDbContextModelSnapshot.cs @@ -19,7 +19,7 @@ namespace MyCompanyName.MyProjectName.Blazor.Server.Host.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "8.0.0-rc.1.23419.6") + .HasAnnotation("ProductVersion", "8.0.0-rc.2.23480.1") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); @@ -215,7 +215,6 @@ namespace MyCompanyName.MyProjectName.Blazor.Server.Host.Migrations .HasColumnName("ChangeType"); b.Property("EntityId") - .IsRequired() .HasMaxLength(128) .HasColumnType("nvarchar(128)") .HasColumnName("EntityId"); diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20231003031645_Initial.Designer.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20231026071207_Initial.Designer.cs similarity index 99% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20231003031645_Initial.Designer.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20231026071207_Initial.Designer.cs index cb4ee3216d..db13e9c657 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20231003031645_Initial.Designer.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20231026071207_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Migrations { [DbContext(typeof(UnifiedDbContext))] - [Migration("20231003031645_Initial")] + [Migration("20231026071207_Initial")] partial class Initial { /// @@ -22,7 +22,7 @@ namespace MyCompanyName.MyProjectName.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "8.0.0-rc.1.23419.6") + .HasAnnotation("ProductVersion", "8.0.0-rc.2.23480.1") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); @@ -218,7 +218,6 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnName("ChangeType"); b.Property("EntityId") - .IsRequired() .HasMaxLength(128) .HasColumnType("nvarchar(128)") .HasColumnName("EntityId"); diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20231003031645_Initial.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20231026071207_Initial.cs similarity index 99% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20231003031645_Initial.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20231026071207_Initial.cs index ddeb81c91f..d19146cde5 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20231003031645_Initial.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20231026071207_Initial.cs @@ -404,7 +404,7 @@ namespace MyCompanyName.MyProjectName.Migrations ChangeTime = table.Column(type: "datetime2", nullable: false), ChangeType = table.Column(type: "tinyint", nullable: false), EntityTenantId = table.Column(type: "uniqueidentifier", nullable: true), - EntityId = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + EntityId = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), EntityTypeFullName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true) }, diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/UnifiedDbContextModelSnapshot.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/UnifiedDbContextModelSnapshot.cs index bfffc80e3d..a8942a8d84 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/UnifiedDbContextModelSnapshot.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/UnifiedDbContextModelSnapshot.cs @@ -19,7 +19,7 @@ namespace MyCompanyName.MyProjectName.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "8.0.0-rc.1.23419.6") + .HasAnnotation("ProductVersion", "8.0.0-rc.2.23480.1") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); @@ -215,7 +215,6 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnName("ChangeType"); b.Property("EntityId") - .IsRequired() .HasMaxLength(128) .HasColumnType("nvarchar(128)") .HasColumnName("EntityId"); From ba11a233fe8c2f1e5f8f55f3fac8e93ff8f1b8c9 Mon Sep 17 00:00:00 2001 From: Mahmut Gundogdu Date: Thu, 26 Oct 2023 10:26:58 +0300 Subject: [PATCH 052/179] fix canHandle method to correctly handle error status code --- .../src/lib/services/status-code-error-handler.service.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/npm/ng-packs/packages/theme-shared/src/lib/services/status-code-error-handler.service.ts b/npm/ng-packs/packages/theme-shared/src/lib/services/status-code-error-handler.service.ts index 35239819bf..976bb11702 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/services/status-code-error-handler.service.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/services/status-code-error-handler.service.ts @@ -57,9 +57,9 @@ export class StatusCodeErrorHandlerService implements CustomHttpErrorHandlerServ this.createErrorComponentService.execute(instance); } - canHandle({ status }): boolean { - this.status = status || 0; - return this.handledStatusCodes.indexOf(status) > -1; + canHandle(error): boolean { + this.status = error?.status || 0; + return this.handledStatusCodes.indexOf(this.status) > -1; } execute(): void { From 1c3054454c74188ed1344407a755208740cbb5d9 Mon Sep 17 00:00:00 2001 From: masumulu28 Date: Thu, 26 Oct 2023 12:07:36 +0300 Subject: [PATCH 053/179] Add mapping for DateOnly & TimeOnly structs --- npm/ng-packs/packages/schematics/src/constants/system-types.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/npm/ng-packs/packages/schematics/src/constants/system-types.ts b/npm/ng-packs/packages/schematics/src/constants/system-types.ts index 19a8eee259..d64c36d1b8 100644 --- a/npm/ng-packs/packages/schematics/src/constants/system-types.ts +++ b/npm/ng-packs/packages/schematics/src/constants/system-types.ts @@ -5,6 +5,8 @@ export const SYSTEM_TYPES = new Map([ ['Collections.Generic.Dictionary', 'Record'], ['DateTime', 'string'], ['DateTimeOffset', 'string'], + ['DateOnly', 'string'], + ['TimeOnly', 'string'], ['Decimal', 'number'], ['Double', 'number'], ['Guid', 'string'], From d3832495f06b4396affeedaf418a21c342a04e12 Mon Sep 17 00:00:00 2001 From: Salih Date: Thu, 26 Oct 2023 13:24:54 +0300 Subject: [PATCH 054/179] Add email and userName changed event --- .../Identity/IdentityUserEmailChangedEto.cs | 16 +++++++ .../IdentityUserUserNameChangedEto.cs | 13 ++++++ .../Volo/Abp/Identity/IdentityUserManager.cs | 45 ++++++++++++++++++- 3 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityUserEmailChangedEto.cs create mode 100644 modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityUserUserNameChangedEto.cs diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityUserEmailChangedEto.cs b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityUserEmailChangedEto.cs new file mode 100644 index 0000000000..c0b1dea34f --- /dev/null +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityUserEmailChangedEto.cs @@ -0,0 +1,16 @@ +using System; +using Volo.Abp.MultiTenancy; + +namespace Volo.Abp.Identity; + +[Serializable] +public class IdentityUserEmailChangedEto : IMultiTenant +{ + public Guid Id { get; set; } + + public Guid? TenantId { get; set; } + + public string Email { get; set; } + + public string OldEmail { get; set; } +} \ No newline at end of file diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityUserUserNameChangedEto.cs b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityUserUserNameChangedEto.cs new file mode 100644 index 0000000000..3f86845dca --- /dev/null +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityUserUserNameChangedEto.cs @@ -0,0 +1,13 @@ +using System; +using Volo.Abp.MultiTenancy; + +namespace Volo.Abp.Identity; + +[Serializable] +public class IdentityUserUserNameChangedEto : IMultiTenant +{ + public Guid Id { get; set; } + public Guid? TenantId { get; set; } + public string UserName { get; set; } + public string OldUserName { get; set; } +} \ No newline at end of file diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserManager.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserManager.cs index cdbb289597..46f23d2866 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserManager.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserManager.cs @@ -10,6 +10,7 @@ using Microsoft.Extensions.Options; using Volo.Abp.Domain.Entities; using Volo.Abp.Domain.Repositories; using Volo.Abp.Domain.Services; +using Volo.Abp.EventBus.Distributed; using Volo.Abp.Identity.Settings; using Volo.Abp.Settings; using Volo.Abp.Threading; @@ -25,6 +26,7 @@ public class IdentityUserManager : UserManager, IDomainService protected IOrganizationUnitRepository OrganizationUnitRepository { get; } protected ISettingProvider SettingProvider { get; } protected ICancellationTokenProvider CancellationTokenProvider { get; } + protected IDistributedEventBus DistributedEventBus { get; } protected override CancellationToken CancellationToken => CancellationTokenProvider.Token; @@ -42,7 +44,8 @@ public class IdentityUserManager : UserManager, IDomainService ILogger logger, ICancellationTokenProvider cancellationTokenProvider, IOrganizationUnitRepository organizationUnitRepository, - ISettingProvider settingProvider) + ISettingProvider settingProvider, + IDistributedEventBus distributedEventBus) : base( store, optionsAccessor, @@ -56,6 +59,7 @@ public class IdentityUserManager : UserManager, IDomainService { OrganizationUnitRepository = organizationUnitRepository; SettingProvider = settingProvider; + DistributedEventBus = distributedEventBus; RoleRepository = roleRepository; UserRepository = userRepository; CancellationTokenProvider = cancellationTokenProvider; @@ -285,4 +289,43 @@ public class IdentityUserManager : UserManager, IDomainService await identityUserStore.SetTokenAsync(user, await identityUserStore.GetInternalLoginProviderAsync(), await identityUserStore.GetRecoveryCodeTokenNameAsync(), string.Empty, CancellationToken); } + + public async override Task SetEmailAsync(IdentityUser user, string email) + { + var oldMail = user.Email; + + var result = await base.SetEmailAsync(user, email); + + result.CheckErrors(); + + await DistributedEventBus.PublishAsync( + new IdentityUserEmailChangedEto + { + Id = user.Id, + TenantId = user.TenantId, + Email = email, + OldEmail = oldMail + }); + + return result; + } + + public async override Task SetUserNameAsync(IdentityUser user, string userName) + { + var oldUserName = user.UserName; + + var result = await base.SetUserNameAsync(user, userName); + + result.CheckErrors(); + + await DistributedEventBus.PublishAsync( + new IdentityUserUserNameChangedEto { + Id = user.Id, + TenantId = user.TenantId, + UserName = userName, + OldUserName = oldUserName + }); + + return result; + } } From 5aea62d0ce54f54ae19686f4942b65315997f01c Mon Sep 17 00:00:00 2001 From: Mahmut Gundogdu Date: Thu, 26 Oct 2023 18:17:25 +0300 Subject: [PATCH 055/179] resolves #2070 --- docs/en/UI/Angular/Service-Proxies.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/docs/en/UI/Angular/Service-Proxies.md b/docs/en/UI/Angular/Service-Proxies.md index 6cd79505c2..992b393d5b 100644 --- a/docs/en/UI/Angular/Service-Proxies.md +++ b/docs/en/UI/Angular/Service-Proxies.md @@ -73,6 +73,17 @@ export const environment: Config.Environment = { > The destination the `proxy` folder is created and the paths above may change based on your project structure. +### Parameters of generate-proxy + +Parameters: +- module or -m: it is backend module name. the default is `app`. the object key of modules defined in response of `api/abp/api-definition`. For example, if you want to generate-proxy of PermissionManagement, you should pass `permissionManagement` as a value. +- apiName or -a: it is Backend api name, a.k.a. remoteServiceName. it defined in the selected module (in response of `api/abp/api-definition`). the property(key) name is `remoteServiceName`. for example for the PermissionManagement, you should pass `AbpPermissionManagement` +- source: Source Angular project for API definition URL & root namespace resolution. +- target: Target Angular project to place the generated code, for example, it is `permission-management`. (npm/ng-packs/packages/*permission-management*). it is folder name. +- entryPoint: Custom place to create generate proxy folder in the target. the place is `permission-management/proxy/src/lib/proxy`. `permission-management` is value of target. if you want to create proxy the place, there is a two option, one you should set value `proxy` as entryPoint. or go to project.json and change `sourceRoot` to `packages/permission-management/proxy/src` from `packages/permission-management/src`. with the property. No need to change sourceRoot of project. if you set empty, proxy generated into folder that defined in sourceRoot property. +- serviceType: the service type of will generate proxy. The options are `application`, `integration` and `all`, Default valueis `application`. A developer can mark a service "integration service". if you want to skip proxy generation for the service, the setting is for you. More info about [Integration Services](../../Integration-Services) + + ### Services The `generate-proxy` command generates one service per back-end controller and a method (property with a function value actually) for each action in the controller. These methods call backend APIs via [RestService](./Http-Requests#restservice). From 9a29530cecaddc1b584ce7baa379dd0a8823715a Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 27 Oct 2023 10:58:08 +0800 Subject: [PATCH 056/179] Exclude `function` parameters in querystrings. --- .../bootstrap/modal-manager.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/bootstrap/modal-manager.js b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/bootstrap/modal-manager.js index e524881176..1907ec9e23 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/bootstrap/modal-manager.js +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/bootstrap/modal-manager.js @@ -134,8 +134,15 @@ $.validator.defaults.ignore = ''; //TODO: Would be better if we can apply only f _args = args || {}; + var argsWithoutFunc = {}; + for (a in _args) { + if (_args.hasOwnProperty(a) && typeof _args[a] !== 'function') { + argsWithoutFunc[a] = _args[a]; + } + } + _createContainer(_modalId) - .load(options.viewUrl, $.param(_args), function (response, status, xhr) { + .load(options.viewUrl, $.param(argsWithoutFunc), function (response, status, xhr) { if (status === "error") { //TODO: Handle! return; From fddad4ae70834dd7edf0e3216ec28f66637dfb0d Mon Sep 17 00:00:00 2001 From: Jadyn Date: Fri, 27 Oct 2023 13:16:56 +0800 Subject: [PATCH 057/179] Update zh translate --- .../Volo/Abp/Identity/Localization/zh-Hans.json | 9 ++++++++- .../Volo/Abp/Identity/Localization/zh-Hant.json | 9 ++++++++- .../Resources/AbpSettingManagement/zh-Hans.json | 2 +- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/zh-Hans.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/zh-Hans.json index 165ba09b41..eaab0eb3ea 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/zh-Hans.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/zh-Hans.json @@ -114,6 +114,13 @@ "Description:Abp.Identity.SignIn.EnablePhoneNumberConfirmation": "用户是否可以确认电话号码", "Description:Abp.Identity.SignIn.RequireConfirmedPhoneNumber": "登录时是否需要验证的手机号码.", "Description:Abp.Identity.User.IsUserNameUpdateEnabled": "是否允许用户更新用户名.", - "Description:Abp.Identity.User.IsEmailUpdateEnabled": "是否允许用户更新电子邮箱." + "Description:Abp.Identity.User.IsEmailUpdateEnabled": "是否允许用户更新电子邮箱.", + "Details": "详情", + "CreatedBy": "创建者", + "ModifiedBy": "修改者", + "ModificationTime": "修改时间", + "PasswordUpdateTime": "密码更新时间", + "LockoutEndTime": "锁定结束时间", + "FailedAccessCount": "访问失败次数" } } diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/zh-Hant.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/zh-Hant.json index d12c44890a..eddabe3446 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/zh-Hant.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/zh-Hant.json @@ -114,6 +114,13 @@ "Description:Abp.Identity.SignIn.EnablePhoneNumberConfirmation": "是否啟用電話認證.", "Description:Abp.Identity.SignIn.RequireConfirmedPhoneNumber": "決定使用者是否需電話認證後才能登入.", "Description:Abp.Identity.User.IsUserNameUpdateEnabled": "決定使用者是否能更新帳號.", - "Description:Abp.Identity.User.IsEmailUpdateEnabled": "決定使用者是否能更新信箱." + "Description:Abp.Identity.User.IsEmailUpdateEnabled": "決定使用者是否能更新信箱.", + "Details": "詳情", + "CreatedBy": "創建者", + "ModifiedBy": "修改者", + "ModificationTime": "修改時間", + "PasswordUpdateTime": "密碼更新時間", + "LockoutEndTime": "鎖定結束時間", + "FailedAccessCount": "訪問失敗次數" } } diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/zh-Hans.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/zh-Hans.json index d229235563..0d1b0226ab 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/zh-Hans.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/zh-Hans.json @@ -25,7 +25,7 @@ "SmtpPassword": "密码", "SmtpDomain": "域", "SmtpEnableSsl": "启用ssl", - "SmtpUseDefaultCredentials": "使用默认证书", + "SmtpUseDefaultCredentials": "使用默认凭据", "DefaultFromAddress": "默认发件人", "DefaultFromDisplayName": "默认显示名称", "Feature:SettingManagementGroup": "设置管理", From b9632e5b10844257435a04651c234b6acc649814 Mon Sep 17 00:00:00 2001 From: Masum ULU <49063256+masumulu28@users.noreply.github.com> Date: Fri, 27 Oct 2023 08:26:44 +0300 Subject: [PATCH 058/179] Update Service-Proxies.md --- docs/en/UI/Angular/Service-Proxies.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/en/UI/Angular/Service-Proxies.md b/docs/en/UI/Angular/Service-Proxies.md index 992b393d5b..b577cadd8c 100644 --- a/docs/en/UI/Angular/Service-Proxies.md +++ b/docs/en/UI/Angular/Service-Proxies.md @@ -76,12 +76,12 @@ export const environment: Config.Environment = { ### Parameters of generate-proxy Parameters: -- module or -m: it is backend module name. the default is `app`. the object key of modules defined in response of `api/abp/api-definition`. For example, if you want to generate-proxy of PermissionManagement, you should pass `permissionManagement` as a value. -- apiName or -a: it is Backend api name, a.k.a. remoteServiceName. it defined in the selected module (in response of `api/abp/api-definition`). the property(key) name is `remoteServiceName`. for example for the PermissionManagement, you should pass `AbpPermissionManagement` -- source: Source Angular project for API definition URL & root namespace resolution. -- target: Target Angular project to place the generated code, for example, it is `permission-management`. (npm/ng-packs/packages/*permission-management*). it is folder name. -- entryPoint: Custom place to create generate proxy folder in the target. the place is `permission-management/proxy/src/lib/proxy`. `permission-management` is value of target. if you want to create proxy the place, there is a two option, one you should set value `proxy` as entryPoint. or go to project.json and change `sourceRoot` to `packages/permission-management/proxy/src` from `packages/permission-management/src`. with the property. No need to change sourceRoot of project. if you set empty, proxy generated into folder that defined in sourceRoot property. -- serviceType: the service type of will generate proxy. The options are `application`, `integration` and `all`, Default valueis `application`. A developer can mark a service "integration service". if you want to skip proxy generation for the service, the setting is for you. More info about [Integration Services](../../Integration-Services) +- **module or -m:** it is backend module name. the default is `app`. the object key of modules defined in response of `api/abp/api-definition`. For example, if you want to generate-proxy of PermissionManagement, you should pass `permissionManagement` as a value. +- **apiName or -a:** it is Backend api name, a.k.a. remoteServiceName. it defined in the selected module (in response of `api/abp/api-definition`). the property(key) name is `remoteServiceName`. for example for the PermissionManagement, you should pass `AbpPermissionManagement` +- **source:** Source Angular project for API definition URL & root namespace resolution. +- **target:** Target Angular project to place the generated code, for example, it is `permission-management`. (npm/ng-packs/packages/*permission-management*). it is folder name. +- **entryPoint:** Custom place to create generate proxy folder in the target. the place is `permission-management/proxy/src/lib/proxy`. `permission-management` is value of target. if you want to create proxy the place, there is a two option, one you should set value `proxy` as entryPoint. or go to project.json and change `sourceRoot` to `packages/permission-management/proxy/src` from `packages/permission-management/src`. with the property. No need to change sourceRoot of project. if you set empty, proxy generated into folder that defined in sourceRoot property. +- **serviceType:** the service type of will generate proxy. The options are `application`, `integration` and `all`, Default valueis `application`. A developer can mark a service "integration service". if you want to skip proxy generation for the service, the setting is for you. More info about [Integration Services](../../Integration-Services) ### Services From 37d7f0b992296dc49e63f74cd5e76b767bdeb3bc Mon Sep 17 00:00:00 2001 From: Masum ULU <49063256+masumulu28@users.noreply.github.com> Date: Fri, 27 Oct 2023 08:28:03 +0300 Subject: [PATCH 059/179] Update title of generate-proxy params --- docs/en/UI/Angular/Service-Proxies.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/en/UI/Angular/Service-Proxies.md b/docs/en/UI/Angular/Service-Proxies.md index b577cadd8c..58c731e44c 100644 --- a/docs/en/UI/Angular/Service-Proxies.md +++ b/docs/en/UI/Angular/Service-Proxies.md @@ -73,9 +73,8 @@ export const environment: Config.Environment = { > The destination the `proxy` folder is created and the paths above may change based on your project structure. -### Parameters of generate-proxy +## Parameters of generate-proxy -Parameters: - **module or -m:** it is backend module name. the default is `app`. the object key of modules defined in response of `api/abp/api-definition`. For example, if you want to generate-proxy of PermissionManagement, you should pass `permissionManagement` as a value. - **apiName or -a:** it is Backend api name, a.k.a. remoteServiceName. it defined in the selected module (in response of `api/abp/api-definition`). the property(key) name is `remoteServiceName`. for example for the PermissionManagement, you should pass `AbpPermissionManagement` - **source:** Source Angular project for API definition URL & root namespace resolution. From 1f20fb6466731b73692a11690c31d9e6951e543a Mon Sep 17 00:00:00 2001 From: Salih Date: Fri, 27 Oct 2023 09:47:29 +0300 Subject: [PATCH 060/179] Update IdentityUserManager.cs --- .../Volo/Abp/Identity/IdentityUserManager.cs | 26 +++++++++++++------ 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserManager.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserManager.cs index 46f23d2866..008ec0fc62 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserManager.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserManager.cs @@ -297,15 +297,20 @@ public class IdentityUserManager : UserManager, IDomainService var result = await base.SetEmailAsync(user, email); result.CheckErrors(); - + + if (string.IsNullOrEmpty(oldMail) || oldMail.Equals(email, StringComparison.OrdinalIgnoreCase)) + { + return result; + } + await DistributedEventBus.PublishAsync( - new IdentityUserEmailChangedEto - { - Id = user.Id, - TenantId = user.TenantId, - Email = email, - OldEmail = oldMail - }); + new IdentityUserEmailChangedEto + { + Id = user.Id, + TenantId = user.TenantId, + Email = email, + OldEmail = oldMail + }); return result; } @@ -317,6 +322,11 @@ public class IdentityUserManager : UserManager, IDomainService var result = await base.SetUserNameAsync(user, userName); result.CheckErrors(); + + if (string.IsNullOrEmpty(oldUserName) || oldUserName == userName) + { + return result; + } await DistributedEventBus.PublishAsync( new IdentityUserUserNameChangedEto { From 0eac81d5f4b01de1e03bcf7431e4c055645b8954 Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 27 Oct 2023 16:00:59 +0800 Subject: [PATCH 061/179] Add unit tests. --- .../IdentityUserUserNameChangedEto.cs | 5 +- .../Volo/Abp/Identity/IdentityUserManager.cs | 51 ++++++------- .../Abp/Identity/IdentityUserManager_Tests.cs | 74 +++++++++++++++++++ 3 files changed, 102 insertions(+), 28 deletions(-) diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityUserUserNameChangedEto.cs b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityUserUserNameChangedEto.cs index 3f86845dca..7745b3cc4f 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityUserUserNameChangedEto.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityUserUserNameChangedEto.cs @@ -7,7 +7,10 @@ namespace Volo.Abp.Identity; public class IdentityUserUserNameChangedEto : IMultiTenant { public Guid Id { get; set; } + public Guid? TenantId { get; set; } + public string UserName { get; set; } + public string OldUserName { get; set; } -} \ No newline at end of file +} diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserManager.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserManager.cs index 008ec0fc62..fc71966c09 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserManager.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserManager.cs @@ -44,7 +44,7 @@ public class IdentityUserManager : UserManager, IDomainService ILogger logger, ICancellationTokenProvider cancellationTokenProvider, IOrganizationUnitRepository organizationUnitRepository, - ISettingProvider settingProvider, + ISettingProvider settingProvider, IDistributedEventBus distributedEventBus) : base( store, @@ -293,49 +293,46 @@ public class IdentityUserManager : UserManager, IDomainService public async override Task SetEmailAsync(IdentityUser user, string email) { var oldMail = user.Email; - + var result = await base.SetEmailAsync(user, email); - + result.CheckErrors(); - if (string.IsNullOrEmpty(oldMail) || oldMail.Equals(email, StringComparison.OrdinalIgnoreCase)) + if (!string.IsNullOrEmpty(oldMail) && !oldMail.Equals(email, StringComparison.OrdinalIgnoreCase)) { - return result; + await DistributedEventBus.PublishAsync( + new IdentityUserEmailChangedEto + { + Id = user.Id, + TenantId = user.TenantId, + Email = email, + OldEmail = oldMail + }); } - await DistributedEventBus.PublishAsync( - new IdentityUserEmailChangedEto - { - Id = user.Id, - TenantId = user.TenantId, - Email = email, - OldEmail = oldMail - }); - return result; } public async override Task SetUserNameAsync(IdentityUser user, string userName) { var oldUserName = user.UserName; - + var result = await base.SetUserNameAsync(user, userName); - + result.CheckErrors(); - - if (string.IsNullOrEmpty(oldUserName) || oldUserName == userName) + + if (!string.IsNullOrEmpty(oldUserName) && !oldUserName.Equals(userName, StringComparison.OrdinalIgnoreCase)) { - return result; + await DistributedEventBus.PublishAsync( + new IdentityUserUserNameChangedEto + { + Id = user.Id, + TenantId = user.TenantId, + UserName = userName, + OldUserName = oldUserName + }); } - await DistributedEventBus.PublishAsync( - new IdentityUserUserNameChangedEto { - Id = user.Id, - TenantId = user.TenantId, - UserName = userName, - OldUserName = oldUserName - }); - return result; } } diff --git a/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdentityUserManager_Tests.cs b/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdentityUserManager_Tests.cs index 517313abcd..191972d13b 100644 --- a/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdentityUserManager_Tests.cs +++ b/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdentityUserManager_Tests.cs @@ -3,9 +3,14 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Identity; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Options; +using NSubstitute; using Shouldly; +using Volo.Abp.EventBus.Distributed; using Volo.Abp.Identity.Settings; +using Volo.Abp.MultiTenancy; using Volo.Abp.Uow; using Xunit; @@ -20,7 +25,9 @@ public class IdentityUserManager_Tests : AbpIdentityDomainTestBase private readonly ILookupNormalizer _lookupNormalizer; private readonly IUnitOfWorkManager _unitOfWorkManager; private readonly IdentityTestData _testData; + private readonly ICurrentTenant _currentTenant; protected IOptions _identityOptions { get; } + protected IDistributedEventBus DistributedEventBus { get; set; } public IdentityUserManager_Tests() { @@ -31,9 +38,16 @@ public class IdentityUserManager_Tests : AbpIdentityDomainTestBase _lookupNormalizer = GetRequiredService(); _testData = GetRequiredService(); _unitOfWorkManager = GetRequiredService(); + _currentTenant = GetRequiredService(); _identityOptions = GetRequiredService>(); } + protected override void AfterAddApplication(IServiceCollection services) + { + DistributedEventBus = Substitute.For(); + services.Replace(ServiceDescriptor.Singleton(DistributedEventBus)); + } + [Fact] public async Task GetByIdAsync() { @@ -249,6 +263,66 @@ public class IdentityUserManager_Tests : AbpIdentityDomainTestBase (await _identityUserManager.ShouldPeriodicallyChangePasswordAsync(user)).ShouldBeTrue(); } + [Fact] + public async Task IdentityUserUserNameChangedEto_Test() + { + var user = CreateRandomUser(); + + (await _identityUserManager.CreateAsync(user)).CheckErrors(); + + await DistributedEventBus.DidNotReceive() + .PublishAsync(Arg.Any(), Arg.Any(), Arg.Any()); + + var newUser = await _identityUserManager.FindByIdAsync(user.Id.ToString()); + newUser.ShouldNotBeNull(); + + using (_currentTenant.Change(Guid.NewGuid())) + { + var oldUsername = newUser.UserName; + await _identityUserManager.SetUserNameAsync(newUser, "newUserName"); + await DistributedEventBus.Received() + .PublishAsync( + Arg.Is(x => + x.Id == newUser.Id && x.TenantId == newUser.TenantId && x.OldUserName == oldUsername && x.UserName == "newUserName"), + Arg.Any(), Arg.Any()); + } + + DistributedEventBus.ClearReceivedCalls(); + await _identityUserManager.SetUserNameAsync(newUser, newUser.UserName); + await DistributedEventBus.DidNotReceive() + .PublishAsync(Arg.Any(), Arg.Any(), Arg.Any()); + } + + [Fact] + public async Task IdentityUserEmailChangedEto_Test() + { + var user = CreateRandomUser(); + + (await _identityUserManager.CreateAsync(user)).CheckErrors(); + + await DistributedEventBus.DidNotReceive() + .PublishAsync(Arg.Any(), Arg.Any(), Arg.Any()); + + var newUser = await _identityUserManager.FindByIdAsync(user.Id.ToString()); + newUser.ShouldNotBeNull(); + + using (_currentTenant.Change(Guid.NewGuid())) + { + var oldEmail = newUser.Email; + await _identityUserManager.SetEmailAsync(newUser, "newEmail@abp.io"); + await DistributedEventBus.Received() + .PublishAsync( + Arg.Is(x => + x.Id == newUser.Id && x.TenantId == newUser.TenantId && x.OldEmail == oldEmail && x.Email == "newEmail@abp.io"), + Arg.Any(), Arg.Any()); + } + + DistributedEventBus.ClearReceivedCalls(); + await _identityUserManager.SetEmailAsync(newUser, newUser.Email); + await DistributedEventBus.DidNotReceive() + .PublishAsync(Arg.Any(), Arg.Any(), Arg.Any()); + } + private async Task CreateRandomDefaultRoleAsync() { await _identityRoleRepository.InsertAsync( From cde7446d325def8730552d53133d90db64bca7c3 Mon Sep 17 00:00:00 2001 From: Huang Tao Date: Fri, 27 Oct 2023 16:02:10 +0800 Subject: [PATCH 062/179] performance: multiple attach on Update with EfCore --- .../Repositories/EntityFrameworkCore/EfCoreRepository.cs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Domain/Repositories/EntityFrameworkCore/EfCoreRepository.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Domain/Repositories/EntityFrameworkCore/EfCoreRepository.cs index 3274360ba2..d73e18615d 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Domain/Repositories/EntityFrameworkCore/EfCoreRepository.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Domain/Repositories/EntityFrameworkCore/EfCoreRepository.cs @@ -161,16 +161,17 @@ public class EfCoreRepository : RepositoryBase, IE { var dbContext = await GetDbContextAsync(); - dbContext.Attach(entity); - - var updatedEntity = dbContext.Update(entity).Entity; + if (dbContext.Set().Local.All(e => e != entity)) + { + dbContext.Update(entity); + } if (autoSave) { await dbContext.SaveChangesAsync(GetCancellationToken(cancellationToken)); } - return updatedEntity; + return entity; } public async override Task UpdateManyAsync(IEnumerable entities, bool autoSave = false, CancellationToken cancellationToken = default) From c0a7762b2a0c06bfbf739ffddef4298eac1e08eb Mon Sep 17 00:00:00 2001 From: Salih Date: Fri, 27 Oct 2023 11:12:22 +0300 Subject: [PATCH 063/179] Update IdentityUserManager.cs --- .../Volo/Abp/Identity/IdentityUserManager.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserManager.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserManager.cs index fc71966c09..5ce3663e14 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserManager.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserManager.cs @@ -321,7 +321,7 @@ public class IdentityUserManager : UserManager, IDomainService result.CheckErrors(); - if (!string.IsNullOrEmpty(oldUserName) && !oldUserName.Equals(userName, StringComparison.OrdinalIgnoreCase)) + if (!string.IsNullOrEmpty(oldUserName) && oldUserName != userName) { await DistributedEventBus.PublishAsync( new IdentityUserUserNameChangedEto From 24ed11ac11d578779be526e6ad26d4e44ac1e87f Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Fri, 27 Oct 2023 16:48:50 +0800 Subject: [PATCH 064/179] Upgrade SixLabors.ImageSharp the latest --- .../Volo.Abp.Imaging.ImageSharp.csproj | 2 +- .../Volo.Blogging.Admin.Application.csproj | 2 +- .../Volo.Blogging.Application.csproj | 2 +- .../src/Volo.CmsKit.Public.Web/Volo.CmsKit.Public.Web.csproj | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/framework/src/Volo.Abp.Imaging.ImageSharp/Volo.Abp.Imaging.ImageSharp.csproj b/framework/src/Volo.Abp.Imaging.ImageSharp/Volo.Abp.Imaging.ImageSharp.csproj index d523a292ba..bdc66961d2 100644 --- a/framework/src/Volo.Abp.Imaging.ImageSharp/Volo.Abp.Imaging.ImageSharp.csproj +++ b/framework/src/Volo.Abp.Imaging.ImageSharp/Volo.Abp.Imaging.ImageSharp.csproj @@ -18,7 +18,7 @@ - + \ No newline at end of file diff --git a/modules/blogging/src/Volo.Blogging.Admin.Application/Volo.Blogging.Admin.Application.csproj b/modules/blogging/src/Volo.Blogging.Admin.Application/Volo.Blogging.Admin.Application.csproj index adc000a44b..cd75ef5233 100644 --- a/modules/blogging/src/Volo.Blogging.Admin.Application/Volo.Blogging.Admin.Application.csproj +++ b/modules/blogging/src/Volo.Blogging.Admin.Application/Volo.Blogging.Admin.Application.csproj @@ -11,7 +11,7 @@ - + diff --git a/modules/blogging/src/Volo.Blogging.Application/Volo.Blogging.Application.csproj b/modules/blogging/src/Volo.Blogging.Application/Volo.Blogging.Application.csproj index 9f1b8a1a00..5871e982dd 100644 --- a/modules/blogging/src/Volo.Blogging.Application/Volo.Blogging.Application.csproj +++ b/modules/blogging/src/Volo.Blogging.Application/Volo.Blogging.Application.csproj @@ -11,7 +11,7 @@ - + diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Volo.CmsKit.Public.Web.csproj b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Volo.CmsKit.Public.Web.csproj index 7aaa2eda5e..7fe7ffbdad 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Volo.CmsKit.Public.Web.csproj +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Volo.CmsKit.Public.Web.csproj @@ -18,8 +18,8 @@ - - + + From 20ccf333da066c989cddd6fc5a437faf32cbbb29 Mon Sep 17 00:00:00 2001 From: Enis Necipoglu Date: Fri, 27 Oct 2023 12:02:07 +0300 Subject: [PATCH 065/179] Fix tags visibility --- .../Pages/CmsKit/Shared/Components/Tags/Default.cshtml | 4 ++-- .../Pages/Public/CmsKit/Blogs/Index.cshtml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Tags/Default.cshtml b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Tags/Default.cshtml index 27ad1fa5ac..baa68ff0f4 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Tags/Default.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Tags/Default.cshtml @@ -10,14 +10,14 @@ { if (Model.UrlFormat.IsNullOrWhiteSpace()) { - + @tag.Name } else { var formattedUrl = Model.UrlFormat.Replace("{TagId}", tag.Id.ToString()).Replace("{TagName}", tag.Name); - @tag.Name + @tag.Name } } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml index 79f96e3cc1..6f2a82e220 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml @@ -53,7 +53,7 @@ @if (Model.TagId.HasValue) {

@L["Tags"]

- @Model.FilteredTagName + @Model.FilteredTagName
From 21c218641ee7d480da864a8b428563e47c44fab3 Mon Sep 17 00:00:00 2001 From: htve Date: Fri, 27 Oct 2023 17:30:29 +0800 Subject: [PATCH 066/179] Fix error test caused by multiple attach --- .../Volo/Abp/Auditing/Auditing_Tests.cs | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/Auditing_Tests.cs b/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/Auditing_Tests.cs index 3aa0da5a9b..4ac434d96c 100644 --- a/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/Auditing_Tests.cs +++ b/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/Auditing_Tests.cs @@ -409,16 +409,13 @@ public class Auditing_Tests : AbpAuditingTestBase } #pragma warning disable 4014 - AuditingStore.Received().SaveAsync(Arg.Is(x => x.EntityChanges.Count == 2 && + AuditingStore.Received().SaveAsync(Arg.Is(x => x.EntityChanges.Count == 1 && x.EntityChanges[0].ChangeType == EntityChangeType.Updated && - x.EntityChanges[0].EntityTypeFullName == typeof(AppEntityWithValueObject).FullName && - - x.EntityChanges[1].ChangeType == EntityChangeType.Updated && - x.EntityChanges[1].EntityTypeFullName == typeof(AppEntityWithValueObjectAddress).FullName && - x.EntityChanges[1].PropertyChanges.Count == 1 && - x.EntityChanges[1].PropertyChanges[0].PropertyName == nameof(AppEntityWithValueObjectAddress.Country) && - x.EntityChanges[1].PropertyChanges[0].OriginalValue == "\"England\"" && - x.EntityChanges[1].PropertyChanges[0].NewValue == "\"Germany\"")); + x.EntityChanges[0].EntityTypeFullName == typeof(AppEntityWithValueObjectAddress).FullName && + x.EntityChanges[0].PropertyChanges.Count == 1 && + x.EntityChanges[0].PropertyChanges[0].PropertyName == nameof(AppEntityWithValueObjectAddress.Country) && + x.EntityChanges[0].PropertyChanges[0].OriginalValue == "\"England\"" && + x.EntityChanges[0].PropertyChanges[0].NewValue == "\"Germany\"")); #pragma warning restore 4014 } From 745fa41615941bc2c997ca630c94616f4e8c9e31 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Fri, 27 Oct 2023 18:18:50 +0800 Subject: [PATCH 067/179] Fix ImageSharp upgrade error --- .../Volo.Abp.Imaging.ImageSharp.csproj | 2 +- .../Volo/Abp/Imaging/ImageSharpCompressOptions.cs | 2 +- .../Imaging/ImageSharpImageCompressorContributor.cs | 6 +++--- .../Imaging/ImageSharpImageResizerContributor.cs | 6 +++--- .../Volo/Blogging/Files/ImageFormatHelper.cs | 4 ++-- .../Security/Captcha/SimpleMathsCaptchaGenerator.cs | 13 ++++++++----- 6 files changed, 18 insertions(+), 15 deletions(-) diff --git a/framework/src/Volo.Abp.Imaging.ImageSharp/Volo.Abp.Imaging.ImageSharp.csproj b/framework/src/Volo.Abp.Imaging.ImageSharp/Volo.Abp.Imaging.ImageSharp.csproj index bdc66961d2..50ebe11d50 100644 --- a/framework/src/Volo.Abp.Imaging.ImageSharp/Volo.Abp.Imaging.ImageSharp.csproj +++ b/framework/src/Volo.Abp.Imaging.ImageSharp/Volo.Abp.Imaging.ImageSharp.csproj @@ -4,7 +4,7 @@ - netstandard2.0; + net7.0 Volo.Abp.Imaging.ImageSharp $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; false diff --git a/framework/src/Volo.Abp.Imaging.ImageSharp/Volo/Abp/Imaging/ImageSharpCompressOptions.cs b/framework/src/Volo.Abp.Imaging.ImageSharp/Volo/Abp/Imaging/ImageSharpCompressOptions.cs index 3fc291da6f..b7c097324d 100644 --- a/framework/src/Volo.Abp.Imaging.ImageSharp/Volo/Abp/Imaging/ImageSharpCompressOptions.cs +++ b/framework/src/Volo.Abp.Imaging.ImageSharp/Volo/Abp/Imaging/ImageSharpCompressOptions.cs @@ -22,7 +22,7 @@ public class ImageSharpCompressOptions PngEncoder = new PngEncoder { CompressionLevel = PngCompressionLevel.BestCompression, - IgnoreMetadata = true + SkipMetadata = true }; WebpEncoder = new WebpEncoder { diff --git a/framework/src/Volo.Abp.Imaging.ImageSharp/Volo/Abp/Imaging/ImageSharpImageCompressorContributor.cs b/framework/src/Volo.Abp.Imaging.ImageSharp/Volo/Abp/Imaging/ImageSharpImageCompressorContributor.cs index a54d006b30..276b7aa6c0 100644 --- a/framework/src/Volo.Abp.Imaging.ImageSharp/Volo/Abp/Imaging/ImageSharpImageCompressorContributor.cs +++ b/framework/src/Volo.Abp.Imaging.ImageSharp/Volo/Abp/Imaging/ImageSharpImageCompressorContributor.cs @@ -34,14 +34,14 @@ public class ImageSharpImageCompressorContributor : IImageCompressorContributor, return new ImageCompressResult(stream, ImageProcessState.Unsupported); } - var (image, format) = await Image.LoadWithFormatAsync(stream, cancellationToken); + var image = await Image.LoadAsync(stream, cancellationToken); - if (!CanCompress(format.DefaultMimeType)) + if (!CanCompress(image.Metadata.DecodedImageFormat!.DefaultMimeType)) { return new ImageCompressResult(stream, ImageProcessState.Unsupported); } - var memoryStream = await GetStreamFromImageAsync(image, format, cancellationToken); + var memoryStream = await GetStreamFromImageAsync(image, image.Metadata.DecodedImageFormat, cancellationToken); if (memoryStream.Length < stream.Length) { diff --git a/framework/src/Volo.Abp.Imaging.ImageSharp/Volo/Abp/Imaging/ImageSharpImageResizerContributor.cs b/framework/src/Volo.Abp.Imaging.ImageSharp/Volo/Abp/Imaging/ImageSharpImageResizerContributor.cs index d2ac92eaf7..7710484449 100644 --- a/framework/src/Volo.Abp.Imaging.ImageSharp/Volo/Abp/Imaging/ImageSharpImageResizerContributor.cs +++ b/framework/src/Volo.Abp.Imaging.ImageSharp/Volo/Abp/Imaging/ImageSharpImageResizerContributor.cs @@ -24,9 +24,9 @@ public class ImageSharpImageResizerContributor : IImageResizerContributor, ITran return new ImageResizeResult(stream, ImageProcessState.Unsupported); } - var (image, format) = await Image.LoadWithFormatAsync(stream, cancellationToken); + var image = await Image.LoadAsync(stream, cancellationToken); - if (!CanResize(format.DefaultMimeType)) + if (!CanResize(image.Metadata.DecodedImageFormat!.DefaultMimeType)) { return new ImageResizeResult(stream, ImageProcessState.Unsupported); } @@ -44,7 +44,7 @@ public class ImageSharpImageResizerContributor : IImageResizerContributor, ITran try { - await image.SaveAsync(memoryStream, format, cancellationToken: cancellationToken); + await image.SaveAsync(memoryStream, image.Metadata.DecodedImageFormat, cancellationToken: cancellationToken); memoryStream.Position = 0; return new ImageResizeResult(memoryStream, ImageProcessState.Done); } diff --git a/modules/blogging/src/Volo.Blogging.Application/Volo/Blogging/Files/ImageFormatHelper.cs b/modules/blogging/src/Volo.Blogging.Application/Volo/Blogging/Files/ImageFormatHelper.cs index 9fccb1e03a..32060bf501 100644 --- a/modules/blogging/src/Volo.Blogging.Application/Volo/Blogging/Files/ImageFormatHelper.cs +++ b/modules/blogging/src/Volo.Blogging.Application/Volo/Blogging/Files/ImageFormatHelper.cs @@ -10,9 +10,9 @@ namespace Volo.Blogging.Areas.Blog.Helpers { public static IImageFormat GetImageRawFormat(Stream stream) { - using (var image = Image.Load(stream, out var imageFormat)) + using (var image = Image.Load(stream)) { - return imageFormat; + return image.Metadata.DecodedImageFormat; } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Security/Captcha/SimpleMathsCaptchaGenerator.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Security/Captcha/SimpleMathsCaptchaGenerator.cs index 220e24f892..7255b6b195 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Security/Captcha/SimpleMathsCaptchaGenerator.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Security/Captcha/SimpleMathsCaptchaGenerator.cs @@ -109,7 +109,7 @@ public class SimpleMathsCaptchaGenerator : ISingletonDependency var random = new Random(); var startWith = (byte)random.Next(5, 10); image.Mutate(ctx => ctx.BackgroundColor(Color.Transparent)); - var fontFamily = SystemFonts.Families.FirstOrDefault(x => x.IsStyleAvailable(options.FontStyle))?.Name ?? SystemFonts.Families.First().Name; + var fontFamily = SystemFonts.Families.FirstOrDefault(x => x.GetAvailableStyles().Contains(options.FontStyle)).Name ?? SystemFonts.Families.First().Name; var font = SystemFonts.CreateFont(fontFamily, options.FontSize, options.FontStyle); foreach (var character in stringText) @@ -118,7 +118,10 @@ public class SimpleMathsCaptchaGenerator : ISingletonDependency var color = options.TextColor[random.Next(0, options.TextColor.Length)]; var location = new PointF(startWith + position, random.Next(6, 13)); image.Mutate(ctx => ctx.DrawText(text, font, color, location)); - position += TextMeasurer.Measure(character.ToString(), new RendererOptions(font, location)).Width; + position += TextMeasurer.MeasureSize(character.ToString(), new TextOptions (font) + { + Origin = location + }).Width; } //add rotation @@ -126,7 +129,7 @@ public class SimpleMathsCaptchaGenerator : ISingletonDependency image.Mutate(ctx => ctx.Transform(rotation)); // add the dynamic image to original image - var size = (ushort)TextMeasurer.Measure(stringText, new RendererOptions(font)).Width; + var size = (ushort)TextMeasurer.MeasureSize(stringText, new TextOptions(font)).Width; var img = new Image(size + 15, options.Height); img.Mutate(ctx => ctx.BackgroundColor(Color.White)); @@ -139,7 +142,7 @@ public class SimpleMathsCaptchaGenerator : ISingletonDependency var y1 = random.Next(0, img.Height); img.Mutate(ctx => - ctx.DrawLines(options.TextColor[random.Next(0, options.TextColor.Length)], + ctx.DrawLine(options.TextColor[random.Next(0, options.TextColor.Length)], RandomTextGenerator.GenerateNextFloat(options.MinLineThickness, options.MaxLineThickness), new PointF[] { new PointF(x0, y0), new PointF(x1, y1) }) ); @@ -153,7 +156,7 @@ public class SimpleMathsCaptchaGenerator : ISingletonDependency var y0 = random.Next(0, img.Height); img.Mutate( ctx => ctx - .DrawLines(options.NoiseRateColor[random.Next(0, options.NoiseRateColor.Length)], + .DrawLine(options.NoiseRateColor[random.Next(0, options.NoiseRateColor.Length)], RandomTextGenerator.GenerateNextFloat(0.5, 1.5), new PointF[] { new Vector2(x0, y0), new Vector2(x0, y0) }) ); }); From b78910b6c7a80dfe6d4ab603ac221da15d9f7b06 Mon Sep 17 00:00:00 2001 From: Salih Date: Fri, 27 Oct 2023 14:32:17 +0300 Subject: [PATCH 068/179] Update en.json --- .../Commercial/Localization/Resources/en.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json index df6333ea0c..b14d1ffa70 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json @@ -421,7 +421,7 @@ "UIFrameworks": "UI Frameworks", "UsefulLinks": "Useful Links", "Platform": "Platform", - "CoolestCompaniesUseABPCommercial": "The coolest companies already use ABP Commercial.", + "CoolestCompaniesUseABPCommercial": "The coolest companies already use ABP Commercial.", "UserInterface": "User Interface", "APIGateway": "API Gateway", "Microservice": "Microservice", @@ -1080,6 +1080,7 @@ "AbpStudio_Page_Title": "ABP Studio", "CampaignInfo": "Buy a new license or renew your existing license and get an additional 2 months at no additional cost! This offer is valid for all license plans. Ensure you take advantage of this limited-time promotion to expand your access to premium features and upgrades.", "HurryUpLastDay": "Hurry Up! Last Day: {0}", - "CreatingCRUDPagesWithABPSuite": "Creating CRUD pages with ABP Suite" + "CreatingCRUDPagesWithABPSuite": "Creating CRUD pages with ABP Suite", + "Testimonials": "Testimonials" } } From 069dcd9c86c1d344d190f793e6b6c36a53286949 Mon Sep 17 00:00:00 2001 From: Sinan997 Date: Fri, 27 Oct 2023 15:08:04 +0300 Subject: [PATCH 069/179] Create function guards and mark class guards as deprecated --- .../account/src/lib/account-routing.module.ts | 10 ++-- .../lib/guards/authentication-flow.guard.ts | 12 ++++ .../src/lib/guards/extensions.guard.ts | 28 ++++++++++ .../core/src/lib/abstracts/auth.guard.ts | 9 +++ .../core/src/lib/guards/permission.guard.ts | 30 +++++++++- .../src/lib/guards/extensions.guard.ts | 55 ++++++++++++++++++ .../src/lib/identity-routing.module.ts | 10 ++-- .../oauth/src/lib/guards/oauth.guard.ts | 24 +++++++- .../packages/oauth/src/lib/oauth.module.ts | 8 +-- .../lib/setting-management-routing.module.ts | 6 +- .../src/lib/guards/extensions.guard.ts | 56 +++++++++++++++++++ .../lib/tenant-management-routing.module.ts | 10 ++-- 12 files changed, 234 insertions(+), 24 deletions(-) diff --git a/npm/ng-packs/packages/account/src/lib/account-routing.module.ts b/npm/ng-packs/packages/account/src/lib/account-routing.module.ts index 0b188f3751..6e651f5baa 100644 --- a/npm/ng-packs/packages/account/src/lib/account-routing.module.ts +++ b/npm/ng-packs/packages/account/src/lib/account-routing.module.ts @@ -1,8 +1,8 @@ import { NgModule } from '@angular/core'; -import { RouterModule, Routes, mapToCanActivate } from '@angular/router'; +import { RouterModule, Routes } from '@angular/router'; import { - AuthGuard, + AuthGuardFn, ReplaceableComponents, ReplaceableRouteContainerComponent, RouterOutletComponent, @@ -14,9 +14,9 @@ import { ManageProfileComponent } from './components/manage-profile/manage-profi import { RegisterComponent } from './components/register/register.component'; import { ResetPasswordComponent } from './components/reset-password/reset-password.component'; import { eAccountComponents } from './enums/components'; -import { AccountExtensionsGuard, AuthenticationFlowGuard } from './guards'; +import { AccountExtensionsGuardFn, AuthenticationFlowGuardFn } from './guards'; -const canActivate = mapToCanActivate([AuthenticationFlowGuard]); +const canActivate = [AuthenticationFlowGuardFn]; const routes: Routes = [ { path: '', pathMatch: 'full', redirectTo: 'login' }, @@ -73,7 +73,7 @@ const routes: Routes = [ { path: 'manage', component: ReplaceableRouteContainerComponent, - canActivate: mapToCanActivate([AuthGuard, AccountExtensionsGuard]), + canActivate: [AuthGuardFn, AccountExtensionsGuardFn], data: { replaceableComponent: { key: eAccountComponents.ManageProfile, diff --git a/npm/ng-packs/packages/account/src/lib/guards/authentication-flow.guard.ts b/npm/ng-packs/packages/account/src/lib/guards/authentication-flow.guard.ts index c00cee3156..c6134c8c23 100644 --- a/npm/ng-packs/packages/account/src/lib/guards/authentication-flow.guard.ts +++ b/npm/ng-packs/packages/account/src/lib/guards/authentication-flow.guard.ts @@ -1,6 +1,9 @@ import { AuthService, IAbpGuard } from '@abp/ng.core'; import { Injectable, inject } from '@angular/core'; +/** + * @deprecated Use `AuthenticationFlowGuardFn` instead. + */ @Injectable() export class AuthenticationFlowGuard implements IAbpGuard { protected readonly authService = inject(AuthService); @@ -12,3 +15,12 @@ export class AuthenticationFlowGuard implements IAbpGuard { return false; } } + +export const AuthenticationFlowGuardFn = () => { + const authService = inject(AuthService); + + if (authService.isInternalAuth) return true; + + authService.navigateToLogin(); + return false; +}; diff --git a/npm/ng-packs/packages/account/src/lib/guards/extensions.guard.ts b/npm/ng-packs/packages/account/src/lib/guards/extensions.guard.ts index 8df8aede51..185d2056f9 100644 --- a/npm/ng-packs/packages/account/src/lib/guards/extensions.guard.ts +++ b/npm/ng-packs/packages/account/src/lib/guards/extensions.guard.ts @@ -17,6 +17,9 @@ import { } from '../tokens/extensions.token'; import { eAccountComponents } from '../enums/components'; +/** + * @deprecated Use `AccountExtensionsGuardFn` instead. + */ @Injectable() export class AccountExtensionsGuard implements IAbpGuard { protected readonly configState = inject(ConfigStateService); @@ -44,3 +47,28 @@ export class AccountExtensionsGuard implements IAbpGuard { ); } } + +export const AccountExtensionsGuardFn = () => { + const configState = inject(ConfigStateService); + const extensions = inject(ExtensionsService); + + const config = { optional: true }; + + const editFormContributors = inject(ACCOUNT_EDIT_FORM_PROP_CONTRIBUTORS, config) || {}; + + return getObjectExtensionEntitiesFromStore(configState, 'Identity').pipe( + map(entities => ({ + [eAccountComponents.PersonalSettings]: entities.User, + })), + mapEntitiesToContributors(configState, 'AbpIdentity'), + tap(objectExtensionContributors => { + mergeWithDefaultProps( + extensions.editFormProps, + DEFAULT_ACCOUNT_FORM_PROPS, + objectExtensionContributors.editForm, + editFormContributors, + ); + }), + map(() => true), + ); +}; diff --git a/npm/ng-packs/packages/core/src/lib/abstracts/auth.guard.ts b/npm/ng-packs/packages/core/src/lib/abstracts/auth.guard.ts index 8fb4f4dc25..2da5d5d21a 100644 --- a/npm/ng-packs/packages/core/src/lib/abstracts/auth.guard.ts +++ b/npm/ng-packs/packages/core/src/lib/abstracts/auth.guard.ts @@ -2,7 +2,11 @@ import { Injectable } from '@angular/core'; import { UrlTree } from '@angular/router'; import { Observable } from 'rxjs'; import { IAbpGuard } from './abstract-guard'; +import { CanActivateFn } from '@angular/router'; +/** + * @deprecated Use `AuthGuardFn` instead. + */ @Injectable({ providedIn: 'root', }) @@ -12,3 +16,8 @@ export class AuthGuard implements IAbpGuard { return false; } } + +export const AuthGuardFn: CanActivateFn = () => { + console.error('You should add @abp/ng-oauth packages or create your own auth packages.'); + return false; +}; \ No newline at end of file diff --git a/npm/ng-packs/packages/core/src/lib/guards/permission.guard.ts b/npm/ng-packs/packages/core/src/lib/guards/permission.guard.ts index ae3fdb6e37..58293da594 100644 --- a/npm/ng-packs/packages/core/src/lib/guards/permission.guard.ts +++ b/npm/ng-packs/packages/core/src/lib/guards/permission.guard.ts @@ -1,5 +1,5 @@ import { Injectable, inject } from '@angular/core'; -import { ActivatedRouteSnapshot, Router, RouterStateSnapshot } from '@angular/router'; +import { ActivatedRouteSnapshot, CanActivateFn, Router, RouterStateSnapshot } from '@angular/router'; import { HttpErrorResponse } from '@angular/common/http'; import { Observable, of } from 'rxjs'; @@ -11,6 +11,9 @@ import { IAbpGuard } from '../abstracts'; import { findRoute, getRoutePath } from '../utils/route-utils'; import { RoutesService, PermissionService, HttpErrorReporterService } from '../services'; +/** + * @deprecated Use `PermissionGuardFn` instead. + */ @Injectable({ providedIn: 'root', }) @@ -40,3 +43,28 @@ export class PermissionGuard implements IAbpGuard { ); } } + +export const PermissionGuardFn: CanActivateFn = (route: ActivatedRouteSnapshot, state: RouterStateSnapshot) => { + const router = inject(Router); + const routesService = inject(RoutesService); + const oAuthService = inject(OAuthService); + const permissionService = inject(PermissionService); + const httpErrorReporter = inject(HttpErrorReporterService); + + let { requiredPolicy } = route.data || {}; + + if (!requiredPolicy) { + const routeFound = findRoute(routesService, getRoutePath(router, state.url)); + requiredPolicy = routeFound?.requiredPolicy; + } + + if (!requiredPolicy) return of(true); + + return permissionService.getGrantedPolicy$(requiredPolicy).pipe( + tap(access => { + if (!access && oAuthService.hasValidAccessToken()) { + httpErrorReporter.reportError({ status: 403 } as HttpErrorResponse); + } + }), + ); +} diff --git a/npm/ng-packs/packages/identity/src/lib/guards/extensions.guard.ts b/npm/ng-packs/packages/identity/src/lib/guards/extensions.guard.ts index 172b599f91..78916556c3 100644 --- a/npm/ng-packs/packages/identity/src/lib/guards/extensions.guard.ts +++ b/npm/ng-packs/packages/identity/src/lib/guards/extensions.guard.ts @@ -26,6 +26,9 @@ import { IDENTITY_TOOLBAR_ACTION_CONTRIBUTORS, } from '../tokens/extensions.token'; +/** + * @deprecated Use `IdentityExtensionsGuardFn` instead. + */ @Injectable() export class IdentityExtensionsGuard implements IAbpGuard { protected readonly configState = inject(ConfigStateService); @@ -80,3 +83,55 @@ export class IdentityExtensionsGuard implements IAbpGuard { ); } } + +export const IdentityExtensionsGuardFn = () => { + const configState = inject(ConfigStateService); + const extensions = inject(ExtensionsService); + + const config = { optional: true }; + + const actionContributors = inject(IDENTITY_ENTITY_ACTION_CONTRIBUTORS, config) || {}; + const toolbarContributors = inject(IDENTITY_TOOLBAR_ACTION_CONTRIBUTORS, config) || {}; + const propContributors = inject(IDENTITY_ENTITY_PROP_CONTRIBUTORS, config) || {}; + const createFormContributors = inject(IDENTITY_CREATE_FORM_PROP_CONTRIBUTORS, config) || {}; + const editFormContributors = inject(IDENTITY_EDIT_FORM_PROP_CONTRIBUTORS, config) || {}; + + return getObjectExtensionEntitiesFromStore(configState, 'Identity').pipe( + map(entities => ({ + [eIdentityComponents.Roles]: entities.Role, + [eIdentityComponents.Users]: entities.User, + })), + mapEntitiesToContributors(configState, 'AbpIdentity'), + tap(objectExtensionContributors => { + mergeWithDefaultActions( + extensions.entityActions, + DEFAULT_IDENTITY_ENTITY_ACTIONS, + actionContributors, + ); + mergeWithDefaultActions( + extensions.toolbarActions, + DEFAULT_IDENTITY_TOOLBAR_ACTIONS, + toolbarContributors, + ); + mergeWithDefaultProps( + extensions.entityProps, + DEFAULT_IDENTITY_ENTITY_PROPS, + objectExtensionContributors.prop, + propContributors, + ); + mergeWithDefaultProps( + extensions.createFormProps, + DEFAULT_IDENTITY_CREATE_FORM_PROPS, + objectExtensionContributors.createForm, + createFormContributors, + ); + mergeWithDefaultProps( + extensions.editFormProps, + DEFAULT_IDENTITY_EDIT_FORM_PROPS, + objectExtensionContributors.editForm, + editFormContributors, + ); + }), + map(() => true), + ); +}; diff --git a/npm/ng-packs/packages/identity/src/lib/identity-routing.module.ts b/npm/ng-packs/packages/identity/src/lib/identity-routing.module.ts index 33c8f53d5a..af4dea7732 100644 --- a/npm/ng-packs/packages/identity/src/lib/identity-routing.module.ts +++ b/npm/ng-packs/packages/identity/src/lib/identity-routing.module.ts @@ -1,9 +1,9 @@ import { NgModule } from '@angular/core'; -import { RouterModule, Routes, mapToCanActivate } from '@angular/router'; +import { RouterModule, Routes } from '@angular/router'; import { - AuthGuard, - PermissionGuard, + AuthGuardFn, + PermissionGuardFn, ReplaceableComponents, ReplaceableRouteContainerComponent, RouterOutletComponent, @@ -12,14 +12,14 @@ import { import { RolesComponent } from './components/roles/roles.component'; import { UsersComponent } from './components/users/users.component'; import { eIdentityComponents } from './enums/components'; -import { IdentityExtensionsGuard } from './guards'; +import { IdentityExtensionsGuardFn } from './guards'; const routes: Routes = [ { path: '', redirectTo: 'roles', pathMatch: 'full' }, { path: '', component: RouterOutletComponent, - canActivate: mapToCanActivate([AuthGuard, PermissionGuard, IdentityExtensionsGuard]), + canActivate: [AuthGuardFn, PermissionGuardFn, IdentityExtensionsGuardFn], children: [ { path: 'roles', diff --git a/npm/ng-packs/packages/oauth/src/lib/guards/oauth.guard.ts b/npm/ng-packs/packages/oauth/src/lib/guards/oauth.guard.ts index 2571a1756c..a0e0e03c09 100644 --- a/npm/ng-packs/packages/oauth/src/lib/guards/oauth.guard.ts +++ b/npm/ng-packs/packages/oauth/src/lib/guards/oauth.guard.ts @@ -1,11 +1,14 @@ import { Injectable, inject } from '@angular/core'; -import { UrlTree, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router'; +import { UrlTree, ActivatedRouteSnapshot, RouterStateSnapshot, CanActivateFn } from '@angular/router'; import { Observable } from 'rxjs'; import { OAuthService } from 'angular-oauth2-oidc'; import { AuthService, IAbpGuard } from '@abp/ng.core'; +/** + * @deprecated Use `AbpOAuthGuardFn` instead. + */ @Injectable({ providedIn: 'root', }) @@ -27,3 +30,22 @@ export class AbpOAuthGuard implements IAbpGuard { return false; } } + + +export const AbpOAuthGuardFn: CanActivateFn = ( + route: ActivatedRouteSnapshot, + state: RouterStateSnapshot, +) => { + const oAuthService = inject(OAuthService); + const authService = inject(AuthService); + + const hasValidAccessToken = oAuthService.hasValidAccessToken(); + + if (hasValidAccessToken) { + return true; + } + + const params = { returnUrl: state.url }; + authService.navigateToLogin(params); + return false; +}; \ No newline at end of file diff --git a/npm/ng-packs/packages/oauth/src/lib/oauth.module.ts b/npm/ng-packs/packages/oauth/src/lib/oauth.module.ts index ac800e7c8f..fb56c7fddd 100644 --- a/npm/ng-packs/packages/oauth/src/lib/oauth.module.ts +++ b/npm/ng-packs/packages/oauth/src/lib/oauth.module.ts @@ -4,7 +4,7 @@ import { OAuthModule, OAuthStorage } from 'angular-oauth2-oidc'; import { AbpLocalStorageService, ApiInterceptor, - AuthGuard, + AuthGuardFn, AuthService, CHECK_AUTHENTICATION_STATE_FN_KEY, noop, @@ -14,7 +14,7 @@ import { AbpOAuthService } from './services'; import { OAuthConfigurationHandler } from './handlers/oauth-configuration.handler'; import { HTTP_INTERCEPTORS } from '@angular/common/http'; import { OAuthApiInterceptor } from './interceptors/api.interceptor'; -import { AbpOAuthGuard } from './guards/oauth.guard'; +import { AbpOAuthGuardFn } from './guards/oauth.guard'; import { NavigateToManageProfileProvider } from './providers'; import { checkAccessToken, pipeToLogin } from './utils'; @@ -31,8 +31,8 @@ export class AbpOAuthModule { useClass: AbpOAuthService, }, { - provide: AuthGuard, - useClass: AbpOAuthGuard, + provide: AuthGuardFn, + useValue: AbpOAuthGuardFn, }, { provide: ApiInterceptor, diff --git a/npm/ng-packs/packages/setting-management/src/lib/setting-management-routing.module.ts b/npm/ng-packs/packages/setting-management/src/lib/setting-management-routing.module.ts index 1fc5fd7c7b..f77f862fef 100644 --- a/npm/ng-packs/packages/setting-management/src/lib/setting-management-routing.module.ts +++ b/npm/ng-packs/packages/setting-management/src/lib/setting-management-routing.module.ts @@ -1,7 +1,7 @@ import { NgModule } from '@angular/core'; -import { RouterModule, Routes, mapToCanActivate } from '@angular/router'; +import { RouterModule, Routes } from '@angular/router'; import { - AuthGuard, + AuthGuardFn, ReplaceableComponents, ReplaceableRouteContainerComponent, RouterOutletComponent, @@ -13,7 +13,7 @@ const routes: Routes = [ { path: '', component: RouterOutletComponent, - canActivate: mapToCanActivate([AuthGuard]), + canActivate: [AuthGuardFn], children: [ { path: '', diff --git a/npm/ng-packs/packages/tenant-management/src/lib/guards/extensions.guard.ts b/npm/ng-packs/packages/tenant-management/src/lib/guards/extensions.guard.ts index bdadb7e78a..896955cc86 100644 --- a/npm/ng-packs/packages/tenant-management/src/lib/guards/extensions.guard.ts +++ b/npm/ng-packs/packages/tenant-management/src/lib/guards/extensions.guard.ts @@ -25,7 +25,11 @@ import { TENANT_MANAGEMENT_ENTITY_PROP_CONTRIBUTORS, TENANT_MANAGEMENT_TOOLBAR_ACTION_CONTRIBUTORS, } from '../tokens/extensions.token'; +import { CanActivateFn } from '@angular/router'; +/** + * @deprecated Use `TenantManagementExtensionsGuardFn` instead. + */ @Injectable() export class TenantManagementExtensionsGuard implements IAbpGuard { protected readonly configState = inject(ConfigStateService); @@ -81,3 +85,55 @@ export class TenantManagementExtensionsGuard implements IAbpGuard { ); } } + +export const TenantManagementExtensionsGuardFn: CanActivateFn = () => { + const configState = inject(ConfigStateService); + const extensions = inject(ExtensionsService); + + const config = { optional: true }; + + const actionContributors = inject(TENANT_MANAGEMENT_ENTITY_ACTION_CONTRIBUTORS, config) || {}; + const toolbarContributors = inject(TENANT_MANAGEMENT_TOOLBAR_ACTION_CONTRIBUTORS, config) || {}; + const propContributors = inject(TENANT_MANAGEMENT_ENTITY_PROP_CONTRIBUTORS, config) || {}; + const createFormContributors = + inject(TENANT_MANAGEMENT_CREATE_FORM_PROP_CONTRIBUTORS, config) || {}; + const editFormContributors = inject(TENANT_MANAGEMENT_EDIT_FORM_PROP_CONTRIBUTORS, config) || {}; + + return getObjectExtensionEntitiesFromStore(configState, 'TenantManagement').pipe( + map(entities => ({ + [eTenantManagementComponents.Tenants]: entities.Tenant, + })), + mapEntitiesToContributors(configState, 'TenantManagement'), + tap(objectExtensionContributors => { + mergeWithDefaultActions( + extensions.entityActions, + DEFAULT_TENANT_MANAGEMENT_ENTITY_ACTIONS, + actionContributors, + ); + mergeWithDefaultActions( + extensions.toolbarActions, + DEFAULT_TENANT_MANAGEMENT_TOOLBAR_ACTIONS, + toolbarContributors, + ); + mergeWithDefaultProps( + extensions.entityProps, + DEFAULT_TENANT_MANAGEMENT_ENTITY_PROPS, + objectExtensionContributors.prop, + propContributors, + ); + mergeWithDefaultProps( + extensions.createFormProps, + DEFAULT_TENANT_MANAGEMENT_CREATE_FORM_PROPS, + objectExtensionContributors.createForm, + createFormContributors, + ); + mergeWithDefaultProps( + extensions.editFormProps, + DEFAULT_TENANT_MANAGEMENT_EDIT_FORM_PROPS, + objectExtensionContributors.editForm, + editFormContributors, + ); + }), + map(() => true), + ); +}; diff --git a/npm/ng-packs/packages/tenant-management/src/lib/tenant-management-routing.module.ts b/npm/ng-packs/packages/tenant-management/src/lib/tenant-management-routing.module.ts index 06e2f0369e..61b438b613 100644 --- a/npm/ng-packs/packages/tenant-management/src/lib/tenant-management-routing.module.ts +++ b/npm/ng-packs/packages/tenant-management/src/lib/tenant-management-routing.module.ts @@ -1,9 +1,9 @@ import { NgModule } from '@angular/core'; -import { RouterModule, Routes, mapToCanActivate } from '@angular/router'; +import { RouterModule, Routes } from '@angular/router'; import { - AuthGuard, - PermissionGuard, + AuthGuardFn, + PermissionGuardFn, ReplaceableComponents, ReplaceableRouteContainerComponent, RouterOutletComponent, @@ -11,14 +11,14 @@ import { import { TenantsComponent } from './components/tenants/tenants.component'; import { eTenantManagementComponents } from './enums/components'; -import { TenantManagementExtensionsGuard } from './guards'; +import { TenantManagementExtensionsGuardFn } from './guards'; const routes: Routes = [ { path: '', redirectTo: 'tenants', pathMatch: 'full' }, { path: '', component: RouterOutletComponent, - canActivate: mapToCanActivate([AuthGuard, PermissionGuard, TenantManagementExtensionsGuard]), + canActivate: [AuthGuardFn, PermissionGuardFn, TenantManagementExtensionsGuardFn], children: [ { path: 'tenants', From 24b9e40b598133873c651012a1250c3022fc6ef3 Mon Sep 17 00:00:00 2001 From: Salih Date: Fri, 27 Oct 2023 17:05:19 +0300 Subject: [PATCH 070/179] Update en.json --- .../AbpIoLocalization/Www/Localization/Resources/en.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json index 5d4890331e..0fff7ed719 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json @@ -432,6 +432,7 @@ "PackageDetailPage_ManualInstallationDescription2": "Then add the {0} dependency to your module class as shown in the following example", "PackageDetailPage_SeeDocumentation": "See the documentation to learn how to use this package in your applications.", "PackageDetailPage_InstallingUsingPMC": "3: Installing with the Package Manager Console", - "PackageDetailPage_InstallingUsingPMCDescription1": "Open the Package Manager Console in Visual Studio (Tools -> Nuget Package Manager -> Package Manager Console) and execute the following command" + "PackageDetailPage_InstallingUsingPMCDescription1": "Open the Package Manager Console in Visual Studio (Tools -> Nuget Package Manager -> Package Manager Console) and execute the following command", + "UIOptions": "UI Options" } } From d443dff0509c836e171f8a6773cbec667db6b03d Mon Sep 17 00:00:00 2001 From: Engincan VESKE <43685404+EngincanV@users.noreply.github.com> Date: Sun, 29 Oct 2023 14:00:09 +0300 Subject: [PATCH 071/179] Initial commit for "ASP.NET Core Metrics" article --- .../POST.md | 123 ++++++++++++++++++ .../built-in-metric-response.png | Bin 0 -> 47699 bytes .../built-in-metrics.png | Bin 0 -> 12637 bytes .../metrics-endpoint.png | Bin 0 -> 180232 bytes 4 files changed, 123 insertions(+) create mode 100644 docs/en/Community-Articles/2023-10-30-NET-8-ASP-NET-Core-Metrics/POST.md create mode 100644 docs/en/Community-Articles/2023-10-30-NET-8-ASP-NET-Core-Metrics/built-in-metric-response.png create mode 100644 docs/en/Community-Articles/2023-10-30-NET-8-ASP-NET-Core-Metrics/built-in-metrics.png create mode 100644 docs/en/Community-Articles/2023-10-30-NET-8-ASP-NET-Core-Metrics/metrics-endpoint.png diff --git a/docs/en/Community-Articles/2023-10-30-NET-8-ASP-NET-Core-Metrics/POST.md b/docs/en/Community-Articles/2023-10-30-NET-8-ASP-NET-Core-Metrics/POST.md new file mode 100644 index 0000000000..f4645a207c --- /dev/null +++ b/docs/en/Community-Articles/2023-10-30-NET-8-ASP-NET-Core-Metrics/POST.md @@ -0,0 +1,123 @@ +# .NET 8 - ASP.NET Core Metrics + +In this article, I'll show you new built-in metrics of .NET 8, which are basically numerical measurements reported over time in your application and can be used to monitor the health of your application and generate reports according to those numerical values. We will see what the metrics are, why to use them, and how to use them in detail. So, let's dive in. + +## What Are Metrics? + +Metrics are numerical measurements reported over time. These measurements are crucial for monitoring the health of an application and generating alerts when necessary. In the context of a web service, various metrics can be tracked, such as: + +* Requests per second. +* Response time. +* Status code counts etc... + +These metrics are not just collected; they are reported to a monitoring system at regular intervals. By doing so, the development and operations teams can visualize these metrics on dashboards (we will see it in the _[Creating Custom Metrics in ASP.NET Core Applications](#creating-custom-metrics-in-aspnet-core-applications)_ section). These dashboards provide a real-time overview of the application's performance and health. + +## Pre-Built Metrics + +ASP.NET Core has many built-in metrics. You can see the following figure for a list of built-in metrics for ASP.NET Core: + +![](built-in-metrics.png) + +> See https://learn.microsoft.com/en-us/dotnet/core/diagnostics/built-in-metrics-aspnetcore and https://github.com/dotnet/aspnetcore/issues/47536 for all built-in metrics and their descriptions. + +For example, we have the `kestrel-current-connections` metric that shows _number of connections that are currently active on the server_ and `http-server-request-duration` metric that shows _the duration of HTTP requests on the server_. + +All of these and other built-in metrics are produced by using the [**System.Diagnostics.Metrics**](https://learn.microsoft.com/en-us/dotnet/api/system.diagnostics.metrics) API and with a small amount of code, we can use & view them. + +## Using Pre-Built Metrics + +Let's see the pre-built metrics in action. + +Create a new ASP.NET Core app with the following command and change the directory to the created application folder: + +```bash +dotnet new web -o MetricsDemo +cd MetricsDemo +``` + +After that open the application in your favourite IDE and add the following service registration code to your application: + +```csharp +var builder = WebApplication.CreateBuilder(args); + +builder.Services.AddOpenTelemetry() + .WithMetrics(builder => + { + builder.AddPrometheusExporter(); + + builder.AddMeter("Microsoft.AspNetCore.Hosting", + "Microsoft.AspNetCore.Server.Kestrel"); + builder.AddView("http.server.request.duration", + new ExplicitBucketHistogramConfiguration + { + Boundaries = new double[] { 0, 0.005, 0.01, 0.025, 0.05, + 0.075, 0.1, 0.25, 0.5, 0.75, 1, 2.5, 5, 7.5, 10 } + }); + }); +``` + +Here, we have done the following things: + +* `AddOpenTelemetry` method registers the required **OpenTelemetry** services into the DI container. +* `WithMetrics` method, we add pre-built metrics to the `OpenTelemetryBuilder` in the `AddMeter` method (_Microsoft.AspNetCore.Hosting_ and _Microsoft.AspNetCore.Server.Kestrel_ are pre-built metrics provided by ASP.NET Core). +* Also, we have used the `AddView` method to customize the output of the metrics by the SDK. Also, it can be used to customize which [Instruments](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/metrics/api.md#instrument) are to be processed or ignored. + +After making the related configurations, let's add the middlewares below and view the metrics: + +```csharp +app.MapPrometheusScrapingEndpoint(); + +app.MapGet("/", () => +{ + Thread.Sleep(2000); + + return "Hello, ABP Community member: " + DateTime.Now.Ticks.ToString()[^3..]; +}); +``` + +* `MapPrometheusScrapingEndpoint`: Adds OpenTelemetry Prometheus scraping endpoint middleware to the pipeline and then we can see the all metrics by navigating to the **/metrics** endpoints (optional): + +![](metrics-endpoint.png) + +### View Metrics + +You can use the `dotnet-counters` command-line tool, which allows you to view live metrics for .NET Core apps. You can run the following command to install the tool: + +```bash +dotnet tool update -g dotnet-counters +``` + +After the tool is installed, you can run the application and by running the `dotnet-counters` tool in a terminal, you can monitor for the specific metrics: + +```bash +dotnet-counters monitor -n Acme.BookStore --counters Microsoft.AspNetCore.Hosting +``` + +When you run the command, it will print a message like in the below and will wait an initial request to your application: + +```txt +Press p to pause, r to resume, q to quit. + Status: Waiting for initial payload... +``` + +If you send a request to your application, then the related built-in metrics that you have added will be collected and will be show in the terminal instantly: + +![](built-in-metric-response.png) + +Also, you can check for the other metric that we have used in the configuration, which is _Microsoft.AspNetCore.Server.Kestrel_ by setting it as a counter as in the command below, and when you send a request to your application, you will see different metrics: + +```bash +dotnet-counters monitor -n Acme.BookStore --counters Microsoft.AspNetCore.Server.Kestrel +``` + +## Creating Custom Metrics in ASP.NET Core Applications + +So far, we have seen what metrics are, which built-in metrics are provided by ASP.NET Core and see a sample application with the built-in metrics and also run the `dotnet-counters` global tool to view metrics. + +//TODO: create custom metrics by using the `IMeterFactory` interface and see it in prometheus or grafana!!! + +## References + +* https://learn.microsoft.com/en-us/aspnet/core/log-mon/metrics/metrics?view=aspnetcore-8.0 +* https://devblogs.microsoft.com/dotnet/announcing-dotnet-8-preview-5/ +* https://www.youtube.com/watch?v=A2pKhNQoQUU \ No newline at end of file diff --git a/docs/en/Community-Articles/2023-10-30-NET-8-ASP-NET-Core-Metrics/built-in-metric-response.png b/docs/en/Community-Articles/2023-10-30-NET-8-ASP-NET-Core-Metrics/built-in-metric-response.png new file mode 100644 index 0000000000000000000000000000000000000000..035e76de7dd10320a1dec53da0f093228693674f GIT binary patch literal 47699 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 literal 0 HcmV?d00001 diff --git a/docs/en/Community-Articles/2023-10-30-NET-8-ASP-NET-Core-Metrics/built-in-metrics.png b/docs/en/Community-Articles/2023-10-30-NET-8-ASP-NET-Core-Metrics/built-in-metrics.png new file mode 100644 index 0000000000000000000000000000000000000000..e36b37c395598bc5f0382f5e6b6928e50c895108 GIT binary patch literal 12637 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¬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 EAK3Ta+W-In literal 0 HcmV?d00001 From a692059ebaeff4aef81787dd01579a101bcd7056 Mon Sep 17 00:00:00 2001 From: Engincan VESKE <43685404+EngincanV@users.noreply.github.com> Date: Sun, 29 Oct 2023 15:08:45 +0300 Subject: [PATCH 072/179] Update POST.md --- .../POST.md | 85 +++++++++++++++++-- 1 file changed, 79 insertions(+), 6 deletions(-) diff --git a/docs/en/Community-Articles/2023-10-30-NET-8-ASP-NET-Core-Metrics/POST.md b/docs/en/Community-Articles/2023-10-30-NET-8-ASP-NET-Core-Metrics/POST.md index f4645a207c..c536613429 100644 --- a/docs/en/Community-Articles/2023-10-30-NET-8-ASP-NET-Core-Metrics/POST.md +++ b/docs/en/Community-Articles/2023-10-30-NET-8-ASP-NET-Core-Metrics/POST.md @@ -2,7 +2,7 @@ In this article, I'll show you new built-in metrics of .NET 8, which are basically numerical measurements reported over time in your application and can be used to monitor the health of your application and generate reports according to those numerical values. We will see what the metrics are, why to use them, and how to use them in detail. So, let's dive in. -## What Are Metrics? +## What are Metrics? Metrics are numerical measurements reported over time. These measurements are crucial for monitoring the health of an application and generating alerts when necessary. In the context of a web service, various metrics can be tracked, such as: @@ -10,7 +10,7 @@ Metrics are numerical measurements reported over time. These measurements are cr * Response time. * Status code counts etc... -These metrics are not just collected; they are reported to a monitoring system at regular intervals. By doing so, the development and operations teams can visualize these metrics on dashboards (we will see it in the _[Creating Custom Metrics in ASP.NET Core Applications](#creating-custom-metrics-in-aspnet-core-applications)_ section). These dashboards provide a real-time overview of the application's performance and health. +These metrics are not just collected; they are reported to a monitoring system at regular intervals. By doing so, the development and operations teams can visualize these metrics on dashboards. These dashboards provide a real-time overview of the application's performance and health. ## Pre-Built Metrics @@ -90,7 +90,7 @@ dotnet tool update -g dotnet-counters After the tool is installed, you can run the application and by running the `dotnet-counters` tool in a terminal, you can monitor for the specific metrics: ```bash -dotnet-counters monitor -n Acme.BookStore --counters Microsoft.AspNetCore.Hosting +dotnet-counters monitor -n MetricsDemo --counters Microsoft.AspNetCore.Hosting ``` When you run the command, it will print a message like in the below and will wait an initial request to your application: @@ -107,14 +107,87 @@ If you send a request to your application, then the related built-in metrics tha Also, you can check for the other metric that we have used in the configuration, which is _Microsoft.AspNetCore.Server.Kestrel_ by setting it as a counter as in the command below, and when you send a request to your application, you will see different metrics: ```bash -dotnet-counters monitor -n Acme.BookStore --counters Microsoft.AspNetCore.Server.Kestrel +dotnet-counters monitor -n MetricsDemo --counters Microsoft.AspNetCore.Server.Kestrel ``` ## Creating Custom Metrics in ASP.NET Core Applications -So far, we have seen what metrics are, which built-in metrics are provided by ASP.NET Core and see a sample application with the built-in metrics and also run the `dotnet-counters` global tool to view metrics. +So far, we have seen what metrics are, which built-in metrics are provided by ASP.NET Core and use the built-in metrics and run the `dotnet-counters` global tool to view these metrics. At this point, let's see how we can create custom metrics and view them via `dotnet-counters` tool. -//TODO: create custom metrics by using the `IMeterFactory` interface and see it in prometheus or grafana!!! +`IMeterFactory` is the recommended service to create *Meter* instances. ASP.NET Core registers `IMeterFactory` in dependency injection (DI) by default. The meter factory integrates metrics with DI, making isolating and collecting metrics easy. + +Assume that, we want to create a metric that holds the sold products in our application. For that purpose, as a first step, we can create a metric class as follows: + +```csharp +using System.Diagnostics.Metrics; + +namespace MetricsDemo; + +public class ProductMetrics +{ + private readonly Counter _soldProductsCount; + + public ProductMetrics(IMeterFactory meterFactory) + { + var meterInstance = meterFactory.Create("MetricsDemo.ProductStore"); + _soldProductsCount = meterInstance.CreateCounter("metricsdemo.productstore.sold_products_count"); + } + + public void IncreaseSoldProductCount(int quantity) + { + _soldProductsCount.Add(quantity); + } +} +``` + +In this class, we are creating a counter and defining metrics that we want to collect and view. `MetricsDemo.ProductStore` is the **counter name** and `metricsdemo.productstore.sold_products_count` is the **metric**, in our example. We need to register this class with a `Singleton` lifetime, because we don't want to reset the counter and want to keep it during the application runtime. + +> The [System.Diagnostics.Metrics.Meter](https://learn.microsoft.com/en-us/dotnet/api/system.diagnostics.metrics.meter) type is the entry point for a library to create a named group of instruments. Instruments record the numeric measurements that are needed to calculate metrics. Here we used [CreateCounter](https://learn.microsoft.com/en-us/dotnet/api/system.diagnostics.metrics.meter.createcounter) to create a Counter instrument named _metricsdemo.productstore.sold_products_count_. + +So, register the type with DI container in the `Program.cs` file (or you can implement the `ISingletonDependency` interface, if you are using an ABP based application): + +```csharp +builder.Services.AddSingleton(); +``` + +Then, we can inject this class and increase sold product count whenever it's needed. Since, we have registered it in DI, we can use it in minimal APIs like in the following example: + +```csharp +app.MapPost("/complete-sale", ([FromBody] ProductSoldModel model, ProductMetrics metrics) => +{ + // ... business logic such as saving the product to the database etc... ... + + metrics.IncreaseSoldProductCount(model.Quantity); +}); +``` + +Whenever a request made to this endpoint the metric that we defined (_metricsdemo.productstore.sold_products_count_) will be increased and we can see this metric via `dotnet-counters` global tool. You can run the following command to see the metrics: + +```bash +dotnet-counters monitor -n MetricsDemo --counters MetricsDemo.ProductStore +``` + +Here is an example output that you would see if you have made a POST requests to the `/complete-sale` endpoint: + +```txt +Press p to pause, r to resume, q to quit. + Status: Paused + +[MetricsDemo.ProductStore] + metricsdemo.productstore.sold_products_count (Count / 1 sec) 20 +``` + +### Advanced: View Metrics in Prometheus & Grafana - Building Dashboards + +It's a common requirement to build a dashboard and monitor the metrics and check the health of your applications. In that point, you can expose the metrics and scrape them using the [Prometheus](https://learn.microsoft.com/en-us/aspnet/core/log-mon/metrics/metrics?view=aspnetcore-8.0#set-up-and-configure-prometheus) and build dashboard by using the [Grafana](https://learn.microsoft.com/en-us/aspnet/core/log-mon/metrics/metrics?view=aspnetcore-8.0#show-metrics-on-a-grafana-dashboard). + +If you want to build a dashboard, you can see [this documentation of Microsoft](https://learn.microsoft.com/en-us/aspnet/core/log-mon/metrics/metrics?view=aspnetcore-8.0#view-metrics-in-grafana-with-opentelemetry-and-prometheus), which shows how to set up the **Prometheus server** and show metrics on a **Grafana** dashboard. + +Also, you can check [this video](https://www.youtube.com/watch?v=A2pKhNQoQUU) if you want to see it in action. + +## Conclusion + +In this article, I showed you the new built-in metrics of .NET8, describe what metrics are, which pre-built metrics are provided by ASP.NET Core, how to use & view these pre-built metrics and finally I have showed you how to create custom metrics and view it in a dashboard. If you want to learn more about the **Metrics System of .NET**, you can check out the references that I have shared below. ## References From e91c77fb942c81a98fb4083817a8613c1491996b Mon Sep 17 00:00:00 2001 From: Engincan VESKE <43685404+EngincanV@users.noreply.github.com> Date: Sun, 29 Oct 2023 15:25:57 +0300 Subject: [PATCH 073/179] Update POST.md --- .../POST.md | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/docs/en/Community-Articles/2023-10-30-NET-8-ASP-NET-Core-Metrics/POST.md b/docs/en/Community-Articles/2023-10-30-NET-8-ASP-NET-Core-Metrics/POST.md index c536613429..07df71527d 100644 --- a/docs/en/Community-Articles/2023-10-30-NET-8-ASP-NET-Core-Metrics/POST.md +++ b/docs/en/Community-Articles/2023-10-30-NET-8-ASP-NET-Core-Metrics/POST.md @@ -20,7 +20,7 @@ ASP.NET Core has many built-in metrics. You can see the following figure for a l > See https://learn.microsoft.com/en-us/dotnet/core/diagnostics/built-in-metrics-aspnetcore and https://github.com/dotnet/aspnetcore/issues/47536 for all built-in metrics and their descriptions. -For example, we have the `kestrel-current-connections` metric that shows _number of connections that are currently active on the server_ and `http-server-request-duration` metric that shows _the duration of HTTP requests on the server_. +For example, we have the `kestrel-current-connections` metric that shows the _number of connections that are currently active on the server_ and the `http-server-request-duration` metric that shows _the duration of HTTP requests on the server_. All of these and other built-in metrics are produced by using the [**System.Diagnostics.Metrics**](https://learn.microsoft.com/en-us/dotnet/api/system.diagnostics.metrics) API and with a small amount of code, we can use & view them. @@ -35,7 +35,7 @@ dotnet new web -o MetricsDemo cd MetricsDemo ``` -After that open the application in your favourite IDE and add the following service registration code to your application: +After that open the application in your favorite IDE and add the following service registration code to your application: ```csharp var builder = WebApplication.CreateBuilder(args); @@ -58,11 +58,11 @@ builder.Services.AddOpenTelemetry() Here, we have done the following things: -* `AddOpenTelemetry` method registers the required **OpenTelemetry** services into the DI container. +* The `AddOpenTelemetry` method registers the required **OpenTelemetry** services into the DI container. * `WithMetrics` method, we add pre-built metrics to the `OpenTelemetryBuilder` in the `AddMeter` method (_Microsoft.AspNetCore.Hosting_ and _Microsoft.AspNetCore.Server.Kestrel_ are pre-built metrics provided by ASP.NET Core). * Also, we have used the `AddView` method to customize the output of the metrics by the SDK. Also, it can be used to customize which [Instruments](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/metrics/api.md#instrument) are to be processed or ignored. -After making the related configurations, let's add the middlewares below and view the metrics: +After making the related configurations, let's add the middleware below and view the metrics: ```csharp app.MapPrometheusScrapingEndpoint(); @@ -93,14 +93,14 @@ After the tool is installed, you can run the application and by running the `dot dotnet-counters monitor -n MetricsDemo --counters Microsoft.AspNetCore.Hosting ``` -When you run the command, it will print a message like in the below and will wait an initial request to your application: +When you run the command, it will print a message like in the one below and will wait for an initial request to your application: ```txt Press p to pause, r to resume, q to quit. Status: Waiting for initial payload... ``` -If you send a request to your application, then the related built-in metrics that you have added will be collected and will be show in the terminal instantly: +If you send a request to your application, then the related built-in metrics that you have added will be collected and will be shown in the terminal instantly: ![](built-in-metric-response.png) @@ -112,7 +112,7 @@ dotnet-counters monitor -n MetricsDemo --counters Microsoft.AspNetCore.Server.Ke ## Creating Custom Metrics in ASP.NET Core Applications -So far, we have seen what metrics are, which built-in metrics are provided by ASP.NET Core and use the built-in metrics and run the `dotnet-counters` global tool to view these metrics. At this point, let's see how we can create custom metrics and view them via `dotnet-counters` tool. +So far, we have seen what metrics are, which built-in metrics are provided by ASP.NET Core and use the built-in metrics and run the `dotnet-counters` global tool to view these metrics. At this point, let's see how we can create custom metrics and view them via the `dotnet-counters` tool. `IMeterFactory` is the recommended service to create *Meter* instances. ASP.NET Core registers `IMeterFactory` in dependency injection (DI) by default. The meter factory integrates metrics with DI, making isolating and collecting metrics easy. @@ -140,17 +140,17 @@ public class ProductMetrics } ``` -In this class, we are creating a counter and defining metrics that we want to collect and view. `MetricsDemo.ProductStore` is the **counter name** and `metricsdemo.productstore.sold_products_count` is the **metric**, in our example. We need to register this class with a `Singleton` lifetime, because we don't want to reset the counter and want to keep it during the application runtime. +In this class, we are creating a counter and defining metrics that we want to collect and view. `MetricsDemo.ProductStore` is the **counter name** and `metricsdemo.productstore.sold_products_count` is the **metric**, in our example. We need to register this class with a `Singleton` lifetime because we don't want to reset the counter and want to keep it during the application runtime. > The [System.Diagnostics.Metrics.Meter](https://learn.microsoft.com/en-us/dotnet/api/system.diagnostics.metrics.meter) type is the entry point for a library to create a named group of instruments. Instruments record the numeric measurements that are needed to calculate metrics. Here we used [CreateCounter](https://learn.microsoft.com/en-us/dotnet/api/system.diagnostics.metrics.meter.createcounter) to create a Counter instrument named _metricsdemo.productstore.sold_products_count_. -So, register the type with DI container in the `Program.cs` file (or you can implement the `ISingletonDependency` interface, if you are using an ABP based application): +So, register the type with the DI container in the `Program.cs` file (or you can implement the `ISingletonDependency` interface, if you are using an ABP based application): ```csharp builder.Services.AddSingleton(); ``` -Then, we can inject this class and increase sold product count whenever it's needed. Since, we have registered it in DI, we can use it in minimal APIs like in the following example: +Then, we can inject this class and increase sold product count whenever it's needed. Since we have registered it in DI, we can use it in minimal APIs like in the following example: ```csharp app.MapPost("/complete-sale", ([FromBody] ProductSoldModel model, ProductMetrics metrics) => @@ -161,13 +161,13 @@ app.MapPost("/complete-sale", ([FromBody] ProductSoldModel model, ProductMetrics }); ``` -Whenever a request made to this endpoint the metric that we defined (_metricsdemo.productstore.sold_products_count_) will be increased and we can see this metric via `dotnet-counters` global tool. You can run the following command to see the metrics: +Whenever a request is made to this endpoint the metric that we defined (_metricsdemo.productstore.sold_products_count_) will be increased and we can see this metric via the `dotnet-counters` global tool. You can run the following command to see the metrics: ```bash dotnet-counters monitor -n MetricsDemo --counters MetricsDemo.ProductStore ``` -Here is an example output that you would see if you have made a POST requests to the `/complete-sale` endpoint: +Here is an example output that you would see if you have made a POST request to the `/complete-sale` endpoint: ```txt Press p to pause, r to resume, q to quit. @@ -179,15 +179,15 @@ Press p to pause, r to resume, q to quit. ### Advanced: View Metrics in Prometheus & Grafana - Building Dashboards -It's a common requirement to build a dashboard and monitor the metrics and check the health of your applications. In that point, you can expose the metrics and scrape them using the [Prometheus](https://learn.microsoft.com/en-us/aspnet/core/log-mon/metrics/metrics?view=aspnetcore-8.0#set-up-and-configure-prometheus) and build dashboard by using the [Grafana](https://learn.microsoft.com/en-us/aspnet/core/log-mon/metrics/metrics?view=aspnetcore-8.0#show-metrics-on-a-grafana-dashboard). +It's a common requirement to build a dashboard and monitor the metrics and check the health of your applications. At that point, you can expose the metrics and scrape them using the [Prometheus](https://learn.microsoft.com/en-us/aspnet/core/log-mon/metrics/metrics?view=aspnetcore-8.0#set-up-and-configure-prometheus) and build a dashboard by using the [Grafana](https://learn.microsoft.com/en-us/aspnet/core/log-mon/metrics/metrics?view=aspnetcore-8.0#show-metrics-on-a-grafana-dashboard). -If you want to build a dashboard, you can see [this documentation of Microsoft](https://learn.microsoft.com/en-us/aspnet/core/log-mon/metrics/metrics?view=aspnetcore-8.0#view-metrics-in-grafana-with-opentelemetry-and-prometheus), which shows how to set up the **Prometheus server** and show metrics on a **Grafana** dashboard. +If you want to build a dashboard, you can see [this documentation from Microsoft](https://learn.microsoft.com/en-us/aspnet/core/log-mon/metrics/metrics?view=aspnetcore-8.0#view-metrics-in-grafana-with-opentelemetry-and-prometheus), which shows how to set up the **Prometheus server** and show metrics on a **Grafana** dashboard. Also, you can check [this video](https://www.youtube.com/watch?v=A2pKhNQoQUU) if you want to see it in action. ## Conclusion -In this article, I showed you the new built-in metrics of .NET8, describe what metrics are, which pre-built metrics are provided by ASP.NET Core, how to use & view these pre-built metrics and finally I have showed you how to create custom metrics and view it in a dashboard. If you want to learn more about the **Metrics System of .NET**, you can check out the references that I have shared below. +In this article, I showed you the new built-in metrics of .NET8, describe what metrics are, which pre-built metrics are provided by ASP.NET Core, how to use & view these pre-built metrics and finally, I have shown you how to create custom metrics and view them in a dashboard. If you want to learn more about the **Metrics System of .NET**, you can check out the references that I have shared below. ## References From eec314757646d1d523807dd3295571596bf6efb9 Mon Sep 17 00:00:00 2001 From: Engincan VESKE <43685404+EngincanV@users.noreply.github.com> Date: Sun, 29 Oct 2023 16:08:49 +0300 Subject: [PATCH 074/179] Update built-in-metrics.png --- .../built-in-metrics.png | Bin 12637 -> 24702 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/en/Community-Articles/2023-10-30-NET-8-ASP-NET-Core-Metrics/built-in-metrics.png b/docs/en/Community-Articles/2023-10-30-NET-8-ASP-NET-Core-Metrics/built-in-metrics.png index e36b37c395598bc5f0382f5e6b6928e50c895108..7cf3a1896db5acc2d1b22564f8c46c4e234f8923 100644 GIT binary patch literal 24702 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%0AX;?P$C9_6uWtq(EjIjM2l6`MB0?%65|bu^3MHcP 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 EAFaZujQ{`u literal 12637 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 t{QB!y0QargkD~$?|Jm^Y#LfqJ1voMAYALV# Date: Sun, 29 Oct 2023 16:59:17 +0300 Subject: [PATCH 075/179] Add `EF Core 8 Primitive collections` article --- .../POST.md | 118 ++++++++++++++++++ 1 file changed, 118 insertions(+) create mode 100644 docs/en/Community-Articles/2023-10-28-EF-Core-8-Primitive-Collections/POST.md diff --git a/docs/en/Community-Articles/2023-10-28-EF-Core-8-Primitive-Collections/POST.md b/docs/en/Community-Articles/2023-10-28-EF-Core-8-Primitive-Collections/POST.md new file mode 100644 index 0000000000..6d5d7cdea9 --- /dev/null +++ b/docs/en/Community-Articles/2023-10-28-EF-Core-8-Primitive-Collections/POST.md @@ -0,0 +1,118 @@ +# EF Core 8 Primitive collections + +What can we do when we want to store a list of primitive types? Before EF Core 8, there were two options: + +- Create a wrapper class and a related table, then add a foreign key linking each value to its owner of the collection. +- Use [value converter](https://learn.microsoft.com/en-us/ef/core/modeling/value-conversions) to serialize-deserialize as JSON. + +The first option covers most scenarios if we need to add some additional properties to this type but let's say we never gonna need this type additionality. + +## Which collection types supported ? + +EF Core has the capability to map `IEnumerable` public properties that have both a getter and a setter, with `T` representing a primitive type + +```csharp +public class PrimitiveCollections +{ + public IEnumerable Ints { get; set; } + public ICollection Strings { get; set; } + public ISet DateTimes { get; set; } + public IList Dates { get; set; } + public uint[] UnsignedInts { get; set; } + public List Booleans { get; set; } + public List Urls { get; set; } +} +``` + +> Some generic arguments are not considered primitive on the database side, such as `uint` and `Uri`. However, these types are also considered as primitive because there are [built-in value converters](https://learn.microsoft.com/en-us/ef/core/modeling/value-conversions?tabs=data-annotations#built-in-converters). + +## Demo + +In this sample, we have a `Car` class with a `Color` enum, and the `Car` class has a `Colors` property. + +```csharp +public enum Color +{ + Black, + White, + Red, + Blue +} + +public class Car +{ + public int Id { get; set; } + public string Brand { get; set; } + public string Model { get; set; } + public ISet Colors { get; set; } = new HashSet(); + + public Car(string brand, string model) + { + Brand = brand; + Model = model; + } +} +``` + +When we want to list cars if they have any of the specific colors. + +```csharp +var colors = new HashSet { Color.Blue, Color.White }; +var cars = await context + .Cars + .Where(x=> x.Colors.Intersect(colors).Any()) + .ToListAsync(); +``` + +The SQL result looks like this; as you can see, it sends colors as parameters instead of adding them inline. It also uses the `json_each` function to deserialize on the database side. + +```sql +SELECT "c"."Id", "c"."Brand", "c"."Colors", "c"."Model" + FROM "Cars" AS "c" + WHERE EXISTS ( + SELECT 1 + FROM ( + SELECT "c0"."value" + FROM json_each("c"."Colors") AS "c0" + INTERSECT + SELECT "c1"."value" + FROM json_each(@__colors_0) AS "c1" + ) AS "t") + +``` + +When we insert to car table. + +```csharp +var car = new Car("Maserati", "GranTurismo") +{ + Colors = new HashSet() + { + Color.Black, + Color.Blue + } +}; +context.Cars.Add(car); +await context.SaveChangesAsync(); +``` + +The SQL statement looks like this, and as you can see, it automatically serializes into the Colors parameter as JSON. + +```sql + Executed DbCommand (0ms) [Parameters= + [@p0='Maserati' (Nullable = false) (Size = 8), + @p1='[0,3]' (Nullable = false) (Size = 5), + @p2='Flow' (Nullable = false) (Size = 4) + ], CommandType='Text', CommandTimeout='30'] + INSERT INTO "Cars" ("Brand", "Colors", "Model") + VALUES (@p0, @p1, @p2) + RETURNING "Id"; +``` +## Conclusion + +We don't need to do anything if we just use a collection of primitive types. It serializes and deserializes as JSON automatically. Additionally, it sends the primitive collection as a parameter to cache the query. + +## References + +- [EF Core 8 Primitive collections](https://learn.microsoft.com/en-us/ef/core/what-is-new/ef-core-8.0/whatsnew#primitive-collection-properties) +- [.NET Data Community Standup - Collections of primitive values in EF Core](https://www.youtube.com/watch?v=AUS2OZjsA2I) \ No newline at end of file From 0ba1d5cdf180ddf0a1c633d2f6e3b3fcad80b1f8 Mon Sep 17 00:00:00 2001 From: linch90 Date: Mon, 30 Oct 2023 00:02:18 +0800 Subject: [PATCH 076/179] Add `ColumnVisible` to EntityProp for show/hide the whole table column, as the `Visible` only show or hide the cell content, not the whole column. --- .../extensible-table.component.html | 25 ++++++++++--------- .../extensions/src/lib/models/entity-props.ts | 13 ++++++++-- 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/extensible-table/extensible-table.component.html b/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/extensible-table/extensible-table.component.html index 2d7105ae52..59bb0d1d6a 100644 --- a/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/extensible-table/extensible-table.component.html +++ b/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/extensible-table/extensible-table.component.html @@ -24,23 +24,24 @@ - - - {{column.name}} - - - {{column.name}} + + + {{ column.name }} + + + {{ column.name }} + - diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/models/entity-props.ts b/npm/ng-packs/packages/theme-shared/extensions/src/lib/models/entity-props.ts index e376fe44df..e86e3ae34e 100644 --- a/npm/ng-packs/packages/theme-shared/extensions/src/lib/models/entity-props.ts +++ b/npm/ng-packs/packages/theme-shared/extensions/src/lib/models/entity-props.ts @@ -1,5 +1,5 @@ import { ABP, escapeHtmlChars } from '@abp/ng.core'; -import { Type } from '@angular/core'; +import { InjectFlags, InjectOptions, InjectionToken, Type } from '@angular/core'; import { Observable, of } from 'rxjs'; import { O } from 'ts-toolbelt'; import { ActionCallback } from './actions'; @@ -31,6 +31,7 @@ export class EntityProp extends Prop { readonly component?: Type; readonly enumList?: Array>; readonly tooltip?: string; + readonly columnVisible: ColumnPredicate; constructor(options: EntityPropOptions) { super( @@ -41,7 +42,8 @@ export class EntityProp extends Prop { options.visible, options.isExtra, ); - + + this.columnVisible = options.columnVisible || (() => true); this.columnWidth = options.columnWidth; this.sortable = options.sortable || false; this.valueResolver = @@ -72,6 +74,7 @@ export type EntityPropOptions = O.Optional< O.Writable>, | 'permission' | 'visible' + | 'columnVisible' | 'displayName' | 'isExtra' | 'columnWidth' @@ -85,4 +88,10 @@ export type EntityPropOptions = O.Optional< export type EntityPropDefaults = Record[]>; export type EntityPropContributorCallback = PropContributorCallback>; export type EntityPropContributorCallbacks = PropContributorCallbacks>; +export type ColumnPredicate = (getInjected: GetInjected, auxData?: any) => boolean; +export type GetInjected = ( + token: Type | InjectionToken, + notFoundValue?: T, + options?: InjectOptions | InjectFlags, +) => T; type PropDataObject = { [key: string]: any }; From 6cb222461169481840845084cc730ca1829e78a1 Mon Sep 17 00:00:00 2001 From: htve Date: Mon, 30 Oct 2023 13:26:33 +0800 Subject: [PATCH 077/179] Fix missing Attach in EfCoreRepository.UpdateAsync --- .../Domain/Repositories/EntityFrameworkCore/EfCoreRepository.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Domain/Repositories/EntityFrameworkCore/EfCoreRepository.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Domain/Repositories/EntityFrameworkCore/EfCoreRepository.cs index d73e18615d..799397218c 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Domain/Repositories/EntityFrameworkCore/EfCoreRepository.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Domain/Repositories/EntityFrameworkCore/EfCoreRepository.cs @@ -163,6 +163,7 @@ public class EfCoreRepository : RepositoryBase, IE if (dbContext.Set().Local.All(e => e != entity)) { + dbContext.Set().Attach(entity); dbContext.Update(entity); } From 7c27d7f2b171d0c5d9d72b156b48f3c893767c1f Mon Sep 17 00:00:00 2001 From: voloagent Date: Mon, 30 Oct 2023 09:02:26 +0300 Subject: [PATCH 078/179] Update_NPM_Packages --- .../package.json | 2 +- .../package.json | 4 +- .../yarn.lock | 280 ++++++------- .../app/Volo.BloggingTestApp/package.json | 4 +- .../app/Volo.BloggingTestApp/yarn.lock | 318 +++++++------- .../Volo.ClientSimulation.Demo/package.json | 2 +- .../demo/Volo.ClientSimulation.Demo/yarn.lock | 258 ++++++------ modules/cms-kit/angular/package.json | 10 +- .../angular/projects/cms-kit/package.json | 4 +- .../Volo.CmsKit.IdentityServer/package.json | 2 +- .../host/Volo.CmsKit.IdentityServer/yarn.lock | 258 ++++++------ .../host/Volo.CmsKit.Web.Host/package.json | 2 +- .../host/Volo.CmsKit.Web.Host/yarn.lock | 258 ++++++------ .../host/Volo.CmsKit.Web.Unified/package.json | 4 +- .../host/Volo.CmsKit.Web.Unified/yarn.lock | 392 +++++++++--------- modules/docs/app/VoloDocs.Web/package.json | 4 +- modules/docs/app/VoloDocs.Web/yarn.lock | 318 +++++++------- .../app/OpenIddict.Demo.Server/package.json | 2 +- modules/openiddict/app/angular/package.json | 20 +- .../package.json | 2 +- .../yarn.lock | 258 ++++++------ .../package.json | 4 +- .../yarn.lock | 292 ++++++------- npm/lerna.json | 2 +- npm/ng-packs/package.json | 5 +- .../packages/account-core/package.json | 6 +- npm/ng-packs/packages/account/package.json | 6 +- npm/ng-packs/packages/components/package.json | 6 +- npm/ng-packs/packages/core/package.json | 4 +- .../packages/feature-management/package.json | 4 +- npm/ng-packs/packages/generators/package.json | 2 +- npm/ng-packs/packages/identity/package.json | 8 +- npm/ng-packs/packages/oauth/package.json | 6 +- .../permission-management/package.json | 4 +- npm/ng-packs/packages/schematics/package.json | 2 +- .../packages/setting-management/package.json | 6 +- .../packages/tenant-management/package.json | 6 +- .../packages/theme-basic/package.json | 6 +- .../packages/theme-shared/package.json | 4 +- npm/packs/anchor-js/package.json | 4 +- .../package.json | 4 +- .../package.json | 6 +- .../package.json | 4 +- .../package.json | 34 +- npm/packs/aspnetcore.mvc.ui/package-lock.json | 2 +- npm/packs/aspnetcore.mvc.ui/package.json | 2 +- npm/packs/blogging/package.json | 10 +- npm/packs/bootstrap-datepicker/package.json | 2 +- .../bootstrap-daterangepicker/package.json | 2 +- npm/packs/bootstrap/package.json | 4 +- npm/packs/chart.js/package.json | 2 +- npm/packs/clipboard/package.json | 4 +- npm/packs/cms-kit.admin/package.json | 12 +- npm/packs/cms-kit.public/package.json | 6 +- npm/packs/cms-kit/package.json | 6 +- npm/packs/codemirror/package.json | 4 +- npm/packs/core/package.json | 4 +- npm/packs/cropperjs/package.json | 4 +- npm/packs/datatables.net-bs4/package.json | 4 +- npm/packs/datatables.net-bs5/package.json | 4 +- npm/packs/datatables.net/package.json | 4 +- npm/packs/docs/package.json | 12 +- npm/packs/flag-icon-css/package.json | 2 +- npm/packs/flag-icons/package.json | 2 +- npm/packs/font-awesome/package.json | 4 +- npm/packs/highlight.js/package.json | 4 +- npm/packs/jquery-form/package.json | 4 +- .../package.json | 4 +- npm/packs/jquery-validation/package.json | 4 +- npm/packs/jquery/package.json | 4 +- npm/packs/jstree/package.json | 4 +- npm/packs/lodash/package.json | 4 +- npm/packs/luxon/package.json | 4 +- .../package.json | 4 +- npm/packs/markdown-it/package.json | 4 +- npm/packs/moment/package.json | 2 +- npm/packs/owl.carousel/package.json | 4 +- npm/packs/popper.js/package.json | 4 +- npm/packs/prismjs/package.json | 6 +- npm/packs/qrcode/package.json | 4 +- npm/packs/select2/package.json | 4 +- npm/packs/signalr/package.json | 4 +- npm/packs/slugify/package.json | 2 +- npm/packs/star-rating-svg/package.json | 4 +- npm/packs/sweetalert2/package.json | 4 +- npm/packs/timeago/package.json | 4 +- npm/packs/toastr/package.json | 4 +- npm/packs/tui-editor/package.json | 6 +- npm/packs/uppy/package.json | 4 +- npm/packs/utils/package.json | 2 +- npm/packs/vee-validate/package.json | 4 +- npm/packs/virtual-file-explorer/package.json | 6 +- npm/packs/vue/package.json | 2 +- .../Volo.Abp.Account.SourceCode.zip | Bin 217062 -> 217050 bytes .../Volo.Abp.AuditLogging.SourceCode.zip | Bin 77414 -> 77415 bytes .../Volo.Abp.BackgroundJobs.SourceCode.zip | Bin 63352 -> 63354 bytes .../Volo.Abp.BasicTheme.SourceCode.zip | Bin 492300 -> 492275 bytes ...lo.Abp.BlobStoring.Database.SourceCode.zip | Bin 67562 -> 67563 bytes .../Volo.Abp.FeatureManagement.SourceCode.zip | Bin 186006 -> 186003 bytes .../Volo.Abp.Identity.SourceCode.zip | Bin 372025 -> 372205 bytes .../Volo.Abp.IdentityServer.SourceCode.zip | Bin 163024 -> 163023 bytes .../Volo.Abp.OpenIddict.SourceCode.zip | Bin 2261243 -> 2261236 bytes ...lo.Abp.PermissionManagement.SourceCode.zip | Bin 177183 -> 177177 bytes .../Volo.Abp.SettingManagement.SourceCode.zip | Bin 274471 -> 274444 bytes .../Volo.Abp.TenantManagement.SourceCode.zip | Bin 163194 -> 163189 bytes .../Volo.Abp.Users.SourceCode.zip | Bin 32630 -> 32631 bytes ...olo.Abp.VirtualFileExplorer.SourceCode.zip | Bin 89374 -> 89352 bytes .../Volo.Blogging.SourceCode.zip | Bin 396735 -> 396711 bytes .../Volo.ClientSimulation.SourceCode.zip | Bin 81379 -> 81361 bytes .../Volo.CmsKit.SourceCode.zip | Bin 892888 -> 892880 bytes .../Volo.Docs.SourceCode.zip | Bin 678784 -> 678764 bytes templates/app-nolayers/angular/package.json | 20 +- .../package.json | 4 +- .../package.json | 4 +- .../Server.Mongo/package.json | 2 +- .../Server/package.json | 2 +- .../package.json | 2 +- .../package.json | 2 +- .../package.json | 2 +- .../package.json | 2 +- templates/app/angular/package.json | 20 +- .../package.json | 2 +- .../package.json | 4 +- .../package.json | 4 +- .../package.json | 2 +- .../package.json | 2 +- .../package.json | 2 +- templates/module/angular/package.json | 20 +- .../projects/my-project-name/package.json | 4 +- .../package.json | 2 +- .../package.json | 4 +- .../package.json | 2 +- .../package.json | 2 +- 133 files changed, 1571 insertions(+), 1572 deletions(-) diff --git a/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/package.json b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/package.json index dd83d4934a..dd3cc1b622 100644 --- a/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/package.json +++ b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/package.json @@ -3,7 +3,7 @@ "name": "asp.net", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.shared": "~7.4.0", + "@abp/aspnetcore.mvc.ui.theme.shared": "~7.4.1", "@abp/prismjs": "^~7.3.2", "@abp/highlight.js": "^~7.3.2" }, diff --git a/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/package.json b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/package.json index 80700852b3..715a290a18 100644 --- a/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/package.json +++ b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/package.json @@ -3,8 +3,8 @@ "name": "asp.net", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "~7.4.0", - "@abp/prismjs": "~7.4.0" + "@abp/aspnetcore.mvc.ui.theme.basic": "~7.4.1", + "@abp/prismjs": "~7.4.1" }, "devDependencies": {} } diff --git a/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/yarn.lock b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/yarn.lock index a61b076582..ec4f519955 100644 --- a/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/yarn.lock +++ b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/yarn.lock @@ -2,39 +2,39 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-7.4.0.tgz#5088dd82ce343e1123e025848f09b51df988b225" - integrity sha512-teT7I0kgjek/lHzpTg5VOVCQ3IL26nFB43Aa/45fuaSwh9FJd3IJNXGL6xwp85oKaptDYSBXIF4GbrUfp2Ugqg== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~7.4.0" - -"@abp/aspnetcore.mvc.ui.theme.shared@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-7.4.0.tgz#e676444a46214e850b0d916daeeb912774ac381d" - integrity sha512-X+dgdgHGUTyf0zaSPsqQp2ZZWu2+9gIRT4r4/LDgxchHgfNvcKRF8jH/JICcVgGD1adJvZzzDpTefL8CuAIRJA== - dependencies: - "@abp/aspnetcore.mvc.ui" "~7.4.0" - "@abp/bootstrap" "~7.4.0" - "@abp/bootstrap-datepicker" "~7.4.0" - "@abp/bootstrap-daterangepicker" "~7.4.0" - "@abp/datatables.net-bs5" "~7.4.0" - "@abp/font-awesome" "~7.4.0" - "@abp/jquery-form" "~7.4.0" - "@abp/jquery-validation-unobtrusive" "~7.4.0" - "@abp/lodash" "~7.4.0" - "@abp/luxon" "~7.4.0" - "@abp/malihu-custom-scrollbar-plugin" "~7.4.0" - "@abp/moment" "~7.4.0" - "@abp/select2" "~7.4.0" - "@abp/sweetalert2" "~7.4.0" - "@abp/timeago" "~7.4.0" - "@abp/toastr" "~7.4.0" - -"@abp/aspnetcore.mvc.ui@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-7.4.0.tgz#61e1b52d2a940e02242f57007bd3f0fcb583c09a" - integrity sha512-gdoxOBo10DWDYhUq1GVfguC0Ot8PYhoA3VLf88/RatL88BNUUlt0e71uMFcx/gk72fuAE+o9zXn/6nq1wtpSwQ== +"@abp/aspnetcore.mvc.ui.theme.basic@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-7.4.1.tgz#62df78aab8a0b374817fdbab6c6363529b43f925" + integrity sha512-KaPmBlwNjOl1+vwLj5O8J11YHBSRg4y0IIxtgZiculXQNFPHbYAXm8sfTw6Wcsx00STrhvUVJQxYMePNnOTCTg== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~7.4.1" + +"@abp/aspnetcore.mvc.ui.theme.shared@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-7.4.1.tgz#8f8679f5cf80137324ddbec9fcaa67332783e708" + integrity sha512-0uUKuTsi/ikLFUUNEqvrn7KimgsvuK+7m1yZD4o47FQlgGxTyt1zQY9w3K6YyhyC3lsT6qCwiAPIoFOzPkIg/Q== + dependencies: + "@abp/aspnetcore.mvc.ui" "~7.4.1" + "@abp/bootstrap" "~7.4.1" + "@abp/bootstrap-datepicker" "~7.4.1" + "@abp/bootstrap-daterangepicker" "~7.4.1" + "@abp/datatables.net-bs5" "~7.4.1" + "@abp/font-awesome" "~7.4.1" + "@abp/jquery-form" "~7.4.1" + "@abp/jquery-validation-unobtrusive" "~7.4.1" + "@abp/lodash" "~7.4.1" + "@abp/luxon" "~7.4.1" + "@abp/malihu-custom-scrollbar-plugin" "~7.4.1" + "@abp/moment" "~7.4.1" + "@abp/select2" "~7.4.1" + "@abp/sweetalert2" "~7.4.1" + "@abp/timeago" "~7.4.1" + "@abp/toastr" "~7.4.1" + +"@abp/aspnetcore.mvc.ui@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-7.4.1.tgz#49c13718a17569f97b71f978b50f367dff67b8f7" + integrity sha512-EvYrfk0mpSt1jAMZmfFcHoNWEJskzResKp0bflOYsYPsZPuJ5WraKsk4IEEpesYHCyHW5AAb5HBJHeoSbVLh4Q== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -43,175 +43,175 @@ merge-stream "^2.0.0" micromatch "^4.0.2" -"@abp/bootstrap-datepicker@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-7.4.0.tgz#75edc2127ca26d86bfefaa6e37579b06e32de5de" - integrity sha512-HXUa+kLjKu8sKr+kCZeNye9Pv/swRfKGAt/uJ2WUEvCJ4IVIMM1p6iMnOEEk/+3OGE64/PWu3cdE9dLP6izOaA== +"@abp/bootstrap-datepicker@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-7.4.1.tgz#f8f35d0edf71368faaae4e40a72fa846b0084f9b" + integrity sha512-hsu8ty6c2oOevsNoyFTQ4yJAu27qnz82MgRNVS8MRfdzo05/LhBhy/tKFm+PFYJqZULYlpQ1GXUF2+uGyazIeg== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap-daterangepicker@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-7.4.0.tgz#5058fc2a9354f0a71ac5393658e362779a3bdc46" - integrity sha512-EK0wzZUY9H3XPb9U3DvYVqh48fU+6IneNGYOk7dcda8CUYObd4Dl1nXligStCqgn2uePtwxDHRx40eV0GXmU/Q== +"@abp/bootstrap-daterangepicker@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-7.4.1.tgz#b133cefdbed0fa1b8f1bda916a9d46952237238a" + integrity sha512-NpmbsO4Xg48Zmr8OOlf1fxuNMnFIqmRrkHiKp9lP5c8am64+7rRzCwATw2UY0Ud+4n8/ws+Iki1dwPQF6db1zw== dependencies: bootstrap-daterangepicker "^3.1.0" -"@abp/bootstrap@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-7.4.0.tgz#71be70660643d8f60d13d355b8c80b16e4854870" - integrity sha512-3Fa+fL5NH+0H2KK4MAaqNsiz0PYwK0+Oxjmd0NgKwcqV2vJzRrzS3WG5kITYjNz9QGdBV+FrhNX/NSRU8LDx3Q== +"@abp/bootstrap@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-7.4.1.tgz#b34a2fcc80e04212865652ee7f4f5498a6a61f6d" + integrity sha512-/qCgfrtNWZ2jui2iL6wd6MLrcxALSEFVBypaz1JK3WjEe7DvFAYvKLl7DugIv039/Sx3mbx/PJiQhx8CVZMsEA== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" bootstrap "^5.1.3" -"@abp/clipboard@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-7.4.0.tgz#f1d147df94ddf3ab53eeeb05aec3d5556064c5d6" - integrity sha512-z/nB1RQN/tmShSRwc9Fv1DsJSNM7+Zg4GnAtvZNpOHJp8LTVmsJWxLoUM7hF896W9E0JKr8tRuCVqulyh3IqKg== +"@abp/clipboard@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-7.4.1.tgz#31329ad4565b5075b486e9ca63fb0ff8a070ff9e" + integrity sha512-/+ylBPs/TEZdwywSSTnj96WoRJPwQnR6vlI+sX7h9wDfSDbMwuSSdETSnDVT21lkl8gonPONFZTL8D1u/KKAhg== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" clipboard "^2.0.8" -"@abp/core@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-7.4.0.tgz#8505d446a3b4d80ce476bd3352c1639c7dc486ec" - integrity sha512-yxrnw6eAEIj/CcX5jAwb4xmCsdqWaG+KRcBA8GFvqXbsK94IjqLDiJ3flo+QhGn2DXo40ISxofZop0CgSbP7Ew== +"@abp/core@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-7.4.1.tgz#1d14899ad16aac038806504eb0a5be9318cdcc0c" + integrity sha512-p0BAe2kCtgZmq8pilahmuxmye8DeRXt2KmnFRbmYE3j4d0uComFZpC72QOD1iro8bkmbsHfsHJpiVg4Sp4licw== dependencies: - "@abp/utils" "~7.4.0" + "@abp/utils" "~7.4.1" -"@abp/datatables.net-bs5@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-7.4.0.tgz#52d22e12a2420b402e03148793707d063db0088d" - integrity sha512-VvQv5w0cUpdDD9jX8aUEaLxFrc4A95JlmFnhCYIV1etL8HNOdZvmOThxorsImk31JfpyVYrY/Ze/rnWi2uhVvQ== +"@abp/datatables.net-bs5@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-7.4.1.tgz#821ee4c5db116f9810d65184855cea1fa7d47360" + integrity sha512-jpUzb65lCGYAxs/1qV3pRP8agHwIgZA9gDrudvR8S/3X3kNQWtmeKoFDZ93mhnl3aWPjWFKVrT2LeQeJw5XO5A== dependencies: - "@abp/datatables.net" "~7.4.0" + "@abp/datatables.net" "~7.4.1" datatables.net-bs5 "^1.11.4" -"@abp/datatables.net@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-7.4.0.tgz#9f12a1bb2abd05cd753b5d937d8a0350b2ff74ae" - integrity sha512-StOkMmIkcBUWzD9ToZ5J/hISRWdxbAWjwn7RuFXsoHXcY03mmD86g2oztjrWC5UFnRdpFnsfspTpbNqXFB9Vag== +"@abp/datatables.net@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-7.4.1.tgz#a4501e92e9995da0759b9ce55756fe92c4e8db59" + integrity sha512-BZOOZLH7XrGlX3aFK97cwV9+npsTzALSBo87OgwO2U6UpeFq7yAOvmC0+L9dmIUDISeORn5IFc/zTsSSIQnpHQ== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" datatables.net "^1.11.4" -"@abp/font-awesome@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-7.4.0.tgz#50059083b88706a0f71f55118472b378e4c66163" - integrity sha512-hKoPyM41HHCK6dg+8pQvjYJWzKABBCXrYQAIneMPQZUZqa4JLObKCva9TR7pu6pUp+9OVzg4fQOBM+nwpHtw4g== +"@abp/font-awesome@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-7.4.1.tgz#f6175a989aa64367830723f1dd9c607906716296" + integrity sha512-/ybaz4KROwFdG4Xv0yMTUMXOreDmKy1lKQuntqHEUnIorhXmkgcd5AQQ5AolJ4NmNdPNt1VYrRcTEmdz3nw+FA== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" "@fortawesome/fontawesome-free" "^5.15.4" -"@abp/jquery-form@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-7.4.0.tgz#7ab3be241ee09f1e2843bd1b4d0b0b86d4446e30" - integrity sha512-OmTRuZ7QK1oe2ayNLqEpRJk4Ogk0wt/hIFtJHwQkCtDuCggoR5sQz4vn1vgrD19MxGq07dow5IgjbbhHv1vtEg== +"@abp/jquery-form@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-7.4.1.tgz#67978c41cda204b4c2027d81fc66844379313fa6" + integrity sha512-JZ1D47s/kpTlfMcpD4Jrlh98bhEDsIlWJauvAYaS0EBPIU9V2zHGQ+h9GPFbSPrXe4sYxPSREcsc8KUVMhT5MQ== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-7.4.0.tgz#0c564e39c4997dd9b8af7d2023615a06d6fd9834" - integrity sha512-vFB3RKkDlDXbHlDJ64uo3jWW1IRXwiCaPf+mcB77Wpt5+0Dn7eWqjBT7KyHBrsV08ghIqY/Q4nXntFJrmLcuEA== +"@abp/jquery-validation-unobtrusive@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-7.4.1.tgz#fe5c90ade419e83505884dd50dd5988d766f177b" + integrity sha512-oHHV/ukap+vDvQ8CnEWnOrrsLkHXIcMk+SjNKe/dyK5VzOVLDpMatRFmloLs2igYVXTqDGjmDlTswTFdJUarcQ== dependencies: - "@abp/jquery-validation" "~7.4.0" + "@abp/jquery-validation" "~7.4.1" jquery-validation-unobtrusive "^3.2.12" -"@abp/jquery-validation@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-7.4.0.tgz#f2aaba8f4c023e93f0051cc9a05c6d82fa5c7254" - integrity sha512-vN4srLT5UXAKXpKHbZgySWT+N2DjRYivgtifpZHMTGFLMW14W+tfi5zhR4H4JvqJpuO6ZKNiz15zA1zwEBK0Tw== +"@abp/jquery-validation@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-7.4.1.tgz#c2c06bc28770832a9ad73eac000586faed3bdbe3" + integrity sha512-A5iFT2EWfGHXrBb/ov5f0grZ2o2xkDaYtps/FnDUwBYdIdD8E7bbJsWp6ytvZDciO0XmEqAoVOxmiij7ue/SOg== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" jquery-validation "^1.19.3" -"@abp/jquery@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-7.4.0.tgz#206891b20f250537d05d907d2b6cd682fec76496" - integrity sha512-DeYo02T6WVhdpLloSPb6ooqtpksu1HtcbbQhIP9E1P7jHSzZoNiJvoKXHiFUcj5PYiGKl9d/o89hM/apWzyreQ== +"@abp/jquery@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-7.4.1.tgz#b5e16834e6c7871ad6392612ac8e2de8617eb353" + integrity sha512-X3RcovvRYISHcsb6W3U3iVsofw6yomoiouoB1tSIy2/tvUbu9n7N/3MM0CUujFm/xib7s3z1tVxFssS9smT7sw== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" jquery "~3.6.0" -"@abp/lodash@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-7.4.0.tgz#93f20abee776dbfa7aa45e2e710f2768f262fda5" - integrity sha512-h4Fnjm+VLwp1F3r57B9MrHhwyOYMo5oP285a85zzAYLkhwcDy7f1nbHKHMQ3ZTaeJVmiRnVaH+3sdUdslCRt5g== +"@abp/lodash@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-7.4.1.tgz#d0f84b7b9cbd989d59ebde594ed7acb8bc720b61" + integrity sha512-RFjZCyAPZnpvT0SJbxXzzmMYbuocSWBlezvjAVA8MiTrOXdZO4VyaTFjIuQcAdSrZhtpFGeYWxAjHshVplxMbw== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" lodash "^4.17.21" -"@abp/luxon@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-7.4.0.tgz#2ba7ff307c8f7c24d818a9c33635b86fd6810db9" - integrity sha512-ROCx7aihM+agdYy7Tkz+GiScx68KY5qwGTnj8P7QabGFChzVUic6RuBG+2Obmfonc6uT7Rq0c8JDGrsGNe/w8A== +"@abp/luxon@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-7.4.1.tgz#e0c0947d2b77f98b9cdaf7d1143025879361c3c9" + integrity sha512-k1wh8tT1529MtNC2gSXEIKdimBXBwubXeLisgpIPx6lkJo1Op6pAz2ERwFXeyktqGdYyuFcnewJIxmS7EPtWhg== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" luxon "^2.3.0" -"@abp/malihu-custom-scrollbar-plugin@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-7.4.0.tgz#aba68877481f4339e048f2ae3cfbe93197145a0a" - integrity sha512-Ntodhi4k0HFQmImYTP5SYf/WDm7aUGJLaGsfePm77HJ6DhGgalIGqtM8NiFXzo/3GmMY0XSo8Wxrs1mSCdtsOA== +"@abp/malihu-custom-scrollbar-plugin@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-7.4.1.tgz#aa7ec247197a258277549052780b38fd9e748c6c" + integrity sha512-pm/wIaiRSgGxelOf8AiL4JKFNZOQ6s2WbR6pULiP2HSNCgCpWYJ2s8fvj7VP3lAHIa98v3m8PSMSUhqaANxZ/Q== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/moment@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-7.4.0.tgz#2490d9c7cdcaeca8d0ba9ebef5e7298caf0c9e09" - integrity sha512-ftsUEgO17GbVawA1GplGFzEeIM4NX004AmS6/fPI3o5isX7o1buF9q9TXdnwUuFEJKZxS4KpveRqzTL5t9k0BQ== +"@abp/moment@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-7.4.1.tgz#1c28ccb13eecdd13695edf8641ca9867b318e37d" + integrity sha512-7vRJyAK5ER9z+LV1xUSAAtWlPlhv8yhM/nHjhC+IQSP/+V1D7VLA6EKxAEexGw7wX6HY8oMOWP9HxDHMb5hKQA== dependencies: moment "^2.9.0" -"@abp/prismjs@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-7.4.0.tgz#8572f36f853c7054d77d02f3098cd844ee321ed7" - integrity sha512-y/Iy6pddQeVazEITktPot8JOPdAEOVAfmYkTBP3DIIPvoYr3kf6rwfzBUalMw5CEjWZ9BaIszDgFCk5ucNHHwQ== +"@abp/prismjs@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-7.4.1.tgz#df4387dbc2f0c77ddb9b6bd0ade9a5db29b9cee2" + integrity sha512-bI7pEKWy32aRYSb2ZziiH6Teebyd8km+1TXADy1yks9i9G5eLWe4/CSdwWpI4M+8ggM8CsdhrZ6/U+55BpXPQA== dependencies: - "@abp/clipboard" "~7.4.0" - "@abp/core" "~7.4.0" + "@abp/clipboard" "~7.4.1" + "@abp/core" "~7.4.1" prismjs "^1.26.0" -"@abp/select2@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-7.4.0.tgz#2f455cc991b7bb4df9ed426097bc2996cac12697" - integrity sha512-DwprX4MIoqMzSdh7eFg7EjGIz4ftYZub6jG9Sk3r+sxabbhpbFTxKOpXnhBWYi7L7uTQ8YDFk/5NeXO+Rm50Ww== +"@abp/select2@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-7.4.1.tgz#d7ea53cfec285a06278db362131b7510d5b73900" + integrity sha512-0S66iy7HuB74qqOSDraoF7UvXqz2PrnOKy+3EYMTMskOn4pWaq03JMR8xxEgZ8CtmsrqlE1a4wt1Yt9b3FIc0w== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" select2 "^4.0.13" -"@abp/sweetalert2@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-7.4.0.tgz#db1b4bd45cbabd61172591abc8ce223b5f607c4e" - integrity sha512-XqHPRnTASaRtbJIZYKW1KSKIJ8tynL8DuPCSMjcp4iyUlk+gnzxvbqXeNVjc2ojxj78T/42M/vITNoiiTYuKUw== +"@abp/sweetalert2@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-7.4.1.tgz#6722a40e5115cc341b7543aa0fa3b5a7ae9515b2" + integrity sha512-9jAHrYqCp5qykYfNNbqgESL6egixofVwonjZlb+lLWHAkIX+gQ2ApUNDFSXPtKUh2n9sXhSfF8SSg+BHP/bkCA== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" sweetalert2 "^11.3.6" -"@abp/timeago@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-7.4.0.tgz#245fe09370f38311a67a594c8a3c884aea59cc90" - integrity sha512-khxK6EICUaGCUM1HkACw/8rlPQNssoQvCK64bNqEHBCXgPUmTcqSj5MEGiNOYbgGyWeH2IAMtJEYPqX1g1wqSA== +"@abp/timeago@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-7.4.1.tgz#243d342ba131878ae7f892909c9cae07cf54902b" + integrity sha512-a0Vl2NFwTxzRmH5akWo8BRUxa6sK72z8OoXwUFkZOUqMWBCHK7ffNiN1/fbSgA+7HpSZdDvIthjYwBt57DxLdQ== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" timeago "^1.6.7" -"@abp/toastr@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-7.4.0.tgz#16ba0414a27c9a21bc7556a078b175445edcf608" - integrity sha512-oM4HT2m95cK/9sB4AEQAKUMSGBep6wZTgM/46+o2IvvMdMPrGR2mPu9V9wi3y817FRgY+/qQTfy5TZWyTuIpVQ== +"@abp/toastr@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-7.4.1.tgz#345545a41b6145e54477c6c376193a6dbd62bdda" + integrity sha512-OLCvPJYSrcT2spcq9nO838Q22VhJ63Kdzasz1HugdVNqgcFCCSsqaoXrJGUcf5GrZx7PNloz7uf1I3txYMeZtA== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" toastr "^2.1.4" -"@abp/utils@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-7.4.0.tgz#b31fb6e5dff07463535479a6bb62dc733d7119c8" - integrity sha512-CcR3tfuEsVM60DYL1A0cH6BkUTsasOoBDv/b63uLCoEOq/g8ntelD/SpRSgfDXK74P9M8OE5ZFxlXWDiYuzAFg== +"@abp/utils@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-7.4.1.tgz#2ce4c4d659c2ae9bc23b71b79fa3c6e120eaecaf" + integrity sha512-eFeoOXcz9cVkDKpOfd2VWmpAojASfsqfvACZqi1UmF16OcjsFIkxmIvhh1fpbT4A+eQLbaFFLIsf6gYb//tXhg== dependencies: just-compare "^2.3.0" diff --git a/modules/blogging/app/Volo.BloggingTestApp/package.json b/modules/blogging/app/Volo.BloggingTestApp/package.json index 1c94891ca1..1239d9b938 100644 --- a/modules/blogging/app/Volo.BloggingTestApp/package.json +++ b/modules/blogging/app/Volo.BloggingTestApp/package.json @@ -3,7 +3,7 @@ "name": "volo.blogtestapp", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "~7.4.0", - "@abp/blogging": "~7.4.0" + "@abp/aspnetcore.mvc.ui.theme.basic": "~7.4.1", + "@abp/blogging": "~7.4.1" } } diff --git a/modules/blogging/app/Volo.BloggingTestApp/yarn.lock b/modules/blogging/app/Volo.BloggingTestApp/yarn.lock index 4469115786..db39937c38 100644 --- a/modules/blogging/app/Volo.BloggingTestApp/yarn.lock +++ b/modules/blogging/app/Volo.BloggingTestApp/yarn.lock @@ -2,39 +2,39 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-7.4.0.tgz#5088dd82ce343e1123e025848f09b51df988b225" - integrity sha512-teT7I0kgjek/lHzpTg5VOVCQ3IL26nFB43Aa/45fuaSwh9FJd3IJNXGL6xwp85oKaptDYSBXIF4GbrUfp2Ugqg== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~7.4.0" - -"@abp/aspnetcore.mvc.ui.theme.shared@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-7.4.0.tgz#e676444a46214e850b0d916daeeb912774ac381d" - integrity sha512-X+dgdgHGUTyf0zaSPsqQp2ZZWu2+9gIRT4r4/LDgxchHgfNvcKRF8jH/JICcVgGD1adJvZzzDpTefL8CuAIRJA== - dependencies: - "@abp/aspnetcore.mvc.ui" "~7.4.0" - "@abp/bootstrap" "~7.4.0" - "@abp/bootstrap-datepicker" "~7.4.0" - "@abp/bootstrap-daterangepicker" "~7.4.0" - "@abp/datatables.net-bs5" "~7.4.0" - "@abp/font-awesome" "~7.4.0" - "@abp/jquery-form" "~7.4.0" - "@abp/jquery-validation-unobtrusive" "~7.4.0" - "@abp/lodash" "~7.4.0" - "@abp/luxon" "~7.4.0" - "@abp/malihu-custom-scrollbar-plugin" "~7.4.0" - "@abp/moment" "~7.4.0" - "@abp/select2" "~7.4.0" - "@abp/sweetalert2" "~7.4.0" - "@abp/timeago" "~7.4.0" - "@abp/toastr" "~7.4.0" - -"@abp/aspnetcore.mvc.ui@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-7.4.0.tgz#61e1b52d2a940e02242f57007bd3f0fcb583c09a" - integrity sha512-gdoxOBo10DWDYhUq1GVfguC0Ot8PYhoA3VLf88/RatL88BNUUlt0e71uMFcx/gk72fuAE+o9zXn/6nq1wtpSwQ== +"@abp/aspnetcore.mvc.ui.theme.basic@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-7.4.1.tgz#62df78aab8a0b374817fdbab6c6363529b43f925" + integrity sha512-KaPmBlwNjOl1+vwLj5O8J11YHBSRg4y0IIxtgZiculXQNFPHbYAXm8sfTw6Wcsx00STrhvUVJQxYMePNnOTCTg== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~7.4.1" + +"@abp/aspnetcore.mvc.ui.theme.shared@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-7.4.1.tgz#8f8679f5cf80137324ddbec9fcaa67332783e708" + integrity sha512-0uUKuTsi/ikLFUUNEqvrn7KimgsvuK+7m1yZD4o47FQlgGxTyt1zQY9w3K6YyhyC3lsT6qCwiAPIoFOzPkIg/Q== + dependencies: + "@abp/aspnetcore.mvc.ui" "~7.4.1" + "@abp/bootstrap" "~7.4.1" + "@abp/bootstrap-datepicker" "~7.4.1" + "@abp/bootstrap-daterangepicker" "~7.4.1" + "@abp/datatables.net-bs5" "~7.4.1" + "@abp/font-awesome" "~7.4.1" + "@abp/jquery-form" "~7.4.1" + "@abp/jquery-validation-unobtrusive" "~7.4.1" + "@abp/lodash" "~7.4.1" + "@abp/luxon" "~7.4.1" + "@abp/malihu-custom-scrollbar-plugin" "~7.4.1" + "@abp/moment" "~7.4.1" + "@abp/select2" "~7.4.1" + "@abp/sweetalert2" "~7.4.1" + "@abp/timeago" "~7.4.1" + "@abp/toastr" "~7.4.1" + +"@abp/aspnetcore.mvc.ui@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-7.4.1.tgz#49c13718a17569f97b71f978b50f367dff67b8f7" + integrity sha512-EvYrfk0mpSt1jAMZmfFcHoNWEJskzResKp0bflOYsYPsZPuJ5WraKsk4IEEpesYHCyHW5AAb5HBJHeoSbVLh4Q== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -43,201 +43,201 @@ merge-stream "^2.0.0" micromatch "^4.0.2" -"@abp/blogging@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/blogging/-/blogging-7.4.0.tgz#9d674d055df1124d2624959472f9790d24d5c9e5" - integrity sha512-yqPFwSCzKTyJ6kZAj0TO/OH+bYFmro6PbnT+C/L7+FlaqSXM2VTzLUVuFQFoudNAanlobadF/Rm9RxE+LE1oWg== +"@abp/blogging@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/blogging/-/blogging-7.4.1.tgz#b2a781f154c98fe69ce2c2948b422f2aaca6fd12" + integrity sha512-OHEw0tiQsJb6y1S3YbRSnw438sZx/msu4vxsJPYKeigyxubyyN8Ndl0NKP6BukrslmtLbnYwh/e/7Kpi+/Bs1g== dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~7.4.0" - "@abp/owl.carousel" "~7.4.0" - "@abp/prismjs" "~7.4.0" - "@abp/tui-editor" "~7.4.0" + "@abp/aspnetcore.mvc.ui.theme.shared" "~7.4.1" + "@abp/owl.carousel" "~7.4.1" + "@abp/prismjs" "~7.4.1" + "@abp/tui-editor" "~7.4.1" -"@abp/bootstrap-datepicker@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-7.4.0.tgz#75edc2127ca26d86bfefaa6e37579b06e32de5de" - integrity sha512-HXUa+kLjKu8sKr+kCZeNye9Pv/swRfKGAt/uJ2WUEvCJ4IVIMM1p6iMnOEEk/+3OGE64/PWu3cdE9dLP6izOaA== +"@abp/bootstrap-datepicker@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-7.4.1.tgz#f8f35d0edf71368faaae4e40a72fa846b0084f9b" + integrity sha512-hsu8ty6c2oOevsNoyFTQ4yJAu27qnz82MgRNVS8MRfdzo05/LhBhy/tKFm+PFYJqZULYlpQ1GXUF2+uGyazIeg== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap-daterangepicker@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-7.4.0.tgz#5058fc2a9354f0a71ac5393658e362779a3bdc46" - integrity sha512-EK0wzZUY9H3XPb9U3DvYVqh48fU+6IneNGYOk7dcda8CUYObd4Dl1nXligStCqgn2uePtwxDHRx40eV0GXmU/Q== +"@abp/bootstrap-daterangepicker@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-7.4.1.tgz#b133cefdbed0fa1b8f1bda916a9d46952237238a" + integrity sha512-NpmbsO4Xg48Zmr8OOlf1fxuNMnFIqmRrkHiKp9lP5c8am64+7rRzCwATw2UY0Ud+4n8/ws+Iki1dwPQF6db1zw== dependencies: bootstrap-daterangepicker "^3.1.0" -"@abp/bootstrap@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-7.4.0.tgz#71be70660643d8f60d13d355b8c80b16e4854870" - integrity sha512-3Fa+fL5NH+0H2KK4MAaqNsiz0PYwK0+Oxjmd0NgKwcqV2vJzRrzS3WG5kITYjNz9QGdBV+FrhNX/NSRU8LDx3Q== +"@abp/bootstrap@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-7.4.1.tgz#b34a2fcc80e04212865652ee7f4f5498a6a61f6d" + integrity sha512-/qCgfrtNWZ2jui2iL6wd6MLrcxALSEFVBypaz1JK3WjEe7DvFAYvKLl7DugIv039/Sx3mbx/PJiQhx8CVZMsEA== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" bootstrap "^5.1.3" -"@abp/clipboard@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-7.4.0.tgz#f1d147df94ddf3ab53eeeb05aec3d5556064c5d6" - integrity sha512-z/nB1RQN/tmShSRwc9Fv1DsJSNM7+Zg4GnAtvZNpOHJp8LTVmsJWxLoUM7hF896W9E0JKr8tRuCVqulyh3IqKg== +"@abp/clipboard@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-7.4.1.tgz#31329ad4565b5075b486e9ca63fb0ff8a070ff9e" + integrity sha512-/+ylBPs/TEZdwywSSTnj96WoRJPwQnR6vlI+sX7h9wDfSDbMwuSSdETSnDVT21lkl8gonPONFZTL8D1u/KKAhg== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" clipboard "^2.0.8" -"@abp/core@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-7.4.0.tgz#8505d446a3b4d80ce476bd3352c1639c7dc486ec" - integrity sha512-yxrnw6eAEIj/CcX5jAwb4xmCsdqWaG+KRcBA8GFvqXbsK94IjqLDiJ3flo+QhGn2DXo40ISxofZop0CgSbP7Ew== +"@abp/core@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-7.4.1.tgz#1d14899ad16aac038806504eb0a5be9318cdcc0c" + integrity sha512-p0BAe2kCtgZmq8pilahmuxmye8DeRXt2KmnFRbmYE3j4d0uComFZpC72QOD1iro8bkmbsHfsHJpiVg4Sp4licw== dependencies: - "@abp/utils" "~7.4.0" + "@abp/utils" "~7.4.1" -"@abp/datatables.net-bs5@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-7.4.0.tgz#52d22e12a2420b402e03148793707d063db0088d" - integrity sha512-VvQv5w0cUpdDD9jX8aUEaLxFrc4A95JlmFnhCYIV1etL8HNOdZvmOThxorsImk31JfpyVYrY/Ze/rnWi2uhVvQ== +"@abp/datatables.net-bs5@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-7.4.1.tgz#821ee4c5db116f9810d65184855cea1fa7d47360" + integrity sha512-jpUzb65lCGYAxs/1qV3pRP8agHwIgZA9gDrudvR8S/3X3kNQWtmeKoFDZ93mhnl3aWPjWFKVrT2LeQeJw5XO5A== dependencies: - "@abp/datatables.net" "~7.4.0" + "@abp/datatables.net" "~7.4.1" datatables.net-bs5 "^1.11.4" -"@abp/datatables.net@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-7.4.0.tgz#9f12a1bb2abd05cd753b5d937d8a0350b2ff74ae" - integrity sha512-StOkMmIkcBUWzD9ToZ5J/hISRWdxbAWjwn7RuFXsoHXcY03mmD86g2oztjrWC5UFnRdpFnsfspTpbNqXFB9Vag== +"@abp/datatables.net@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-7.4.1.tgz#a4501e92e9995da0759b9ce55756fe92c4e8db59" + integrity sha512-BZOOZLH7XrGlX3aFK97cwV9+npsTzALSBo87OgwO2U6UpeFq7yAOvmC0+L9dmIUDISeORn5IFc/zTsSSIQnpHQ== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" datatables.net "^1.11.4" -"@abp/font-awesome@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-7.4.0.tgz#50059083b88706a0f71f55118472b378e4c66163" - integrity sha512-hKoPyM41HHCK6dg+8pQvjYJWzKABBCXrYQAIneMPQZUZqa4JLObKCva9TR7pu6pUp+9OVzg4fQOBM+nwpHtw4g== +"@abp/font-awesome@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-7.4.1.tgz#f6175a989aa64367830723f1dd9c607906716296" + integrity sha512-/ybaz4KROwFdG4Xv0yMTUMXOreDmKy1lKQuntqHEUnIorhXmkgcd5AQQ5AolJ4NmNdPNt1VYrRcTEmdz3nw+FA== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" "@fortawesome/fontawesome-free" "^5.15.4" -"@abp/jquery-form@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-7.4.0.tgz#7ab3be241ee09f1e2843bd1b4d0b0b86d4446e30" - integrity sha512-OmTRuZ7QK1oe2ayNLqEpRJk4Ogk0wt/hIFtJHwQkCtDuCggoR5sQz4vn1vgrD19MxGq07dow5IgjbbhHv1vtEg== +"@abp/jquery-form@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-7.4.1.tgz#67978c41cda204b4c2027d81fc66844379313fa6" + integrity sha512-JZ1D47s/kpTlfMcpD4Jrlh98bhEDsIlWJauvAYaS0EBPIU9V2zHGQ+h9GPFbSPrXe4sYxPSREcsc8KUVMhT5MQ== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-7.4.0.tgz#0c564e39c4997dd9b8af7d2023615a06d6fd9834" - integrity sha512-vFB3RKkDlDXbHlDJ64uo3jWW1IRXwiCaPf+mcB77Wpt5+0Dn7eWqjBT7KyHBrsV08ghIqY/Q4nXntFJrmLcuEA== +"@abp/jquery-validation-unobtrusive@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-7.4.1.tgz#fe5c90ade419e83505884dd50dd5988d766f177b" + integrity sha512-oHHV/ukap+vDvQ8CnEWnOrrsLkHXIcMk+SjNKe/dyK5VzOVLDpMatRFmloLs2igYVXTqDGjmDlTswTFdJUarcQ== dependencies: - "@abp/jquery-validation" "~7.4.0" + "@abp/jquery-validation" "~7.4.1" jquery-validation-unobtrusive "^3.2.12" -"@abp/jquery-validation@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-7.4.0.tgz#f2aaba8f4c023e93f0051cc9a05c6d82fa5c7254" - integrity sha512-vN4srLT5UXAKXpKHbZgySWT+N2DjRYivgtifpZHMTGFLMW14W+tfi5zhR4H4JvqJpuO6ZKNiz15zA1zwEBK0Tw== +"@abp/jquery-validation@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-7.4.1.tgz#c2c06bc28770832a9ad73eac000586faed3bdbe3" + integrity sha512-A5iFT2EWfGHXrBb/ov5f0grZ2o2xkDaYtps/FnDUwBYdIdD8E7bbJsWp6ytvZDciO0XmEqAoVOxmiij7ue/SOg== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" jquery-validation "^1.19.3" -"@abp/jquery@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-7.4.0.tgz#206891b20f250537d05d907d2b6cd682fec76496" - integrity sha512-DeYo02T6WVhdpLloSPb6ooqtpksu1HtcbbQhIP9E1P7jHSzZoNiJvoKXHiFUcj5PYiGKl9d/o89hM/apWzyreQ== +"@abp/jquery@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-7.4.1.tgz#b5e16834e6c7871ad6392612ac8e2de8617eb353" + integrity sha512-X3RcovvRYISHcsb6W3U3iVsofw6yomoiouoB1tSIy2/tvUbu9n7N/3MM0CUujFm/xib7s3z1tVxFssS9smT7sw== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" jquery "~3.6.0" -"@abp/lodash@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-7.4.0.tgz#93f20abee776dbfa7aa45e2e710f2768f262fda5" - integrity sha512-h4Fnjm+VLwp1F3r57B9MrHhwyOYMo5oP285a85zzAYLkhwcDy7f1nbHKHMQ3ZTaeJVmiRnVaH+3sdUdslCRt5g== +"@abp/lodash@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-7.4.1.tgz#d0f84b7b9cbd989d59ebde594ed7acb8bc720b61" + integrity sha512-RFjZCyAPZnpvT0SJbxXzzmMYbuocSWBlezvjAVA8MiTrOXdZO4VyaTFjIuQcAdSrZhtpFGeYWxAjHshVplxMbw== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" lodash "^4.17.21" -"@abp/luxon@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-7.4.0.tgz#2ba7ff307c8f7c24d818a9c33635b86fd6810db9" - integrity sha512-ROCx7aihM+agdYy7Tkz+GiScx68KY5qwGTnj8P7QabGFChzVUic6RuBG+2Obmfonc6uT7Rq0c8JDGrsGNe/w8A== +"@abp/luxon@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-7.4.1.tgz#e0c0947d2b77f98b9cdaf7d1143025879361c3c9" + integrity sha512-k1wh8tT1529MtNC2gSXEIKdimBXBwubXeLisgpIPx6lkJo1Op6pAz2ERwFXeyktqGdYyuFcnewJIxmS7EPtWhg== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" luxon "^2.3.0" -"@abp/malihu-custom-scrollbar-plugin@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-7.4.0.tgz#aba68877481f4339e048f2ae3cfbe93197145a0a" - integrity sha512-Ntodhi4k0HFQmImYTP5SYf/WDm7aUGJLaGsfePm77HJ6DhGgalIGqtM8NiFXzo/3GmMY0XSo8Wxrs1mSCdtsOA== +"@abp/malihu-custom-scrollbar-plugin@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-7.4.1.tgz#aa7ec247197a258277549052780b38fd9e748c6c" + integrity sha512-pm/wIaiRSgGxelOf8AiL4JKFNZOQ6s2WbR6pULiP2HSNCgCpWYJ2s8fvj7VP3lAHIa98v3m8PSMSUhqaANxZ/Q== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/moment@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-7.4.0.tgz#2490d9c7cdcaeca8d0ba9ebef5e7298caf0c9e09" - integrity sha512-ftsUEgO17GbVawA1GplGFzEeIM4NX004AmS6/fPI3o5isX7o1buF9q9TXdnwUuFEJKZxS4KpveRqzTL5t9k0BQ== +"@abp/moment@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-7.4.1.tgz#1c28ccb13eecdd13695edf8641ca9867b318e37d" + integrity sha512-7vRJyAK5ER9z+LV1xUSAAtWlPlhv8yhM/nHjhC+IQSP/+V1D7VLA6EKxAEexGw7wX6HY8oMOWP9HxDHMb5hKQA== dependencies: moment "^2.9.0" -"@abp/owl.carousel@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/owl.carousel/-/owl.carousel-7.4.0.tgz#5b70c90659d9e5951780e2c7204cfb6884b808f9" - integrity sha512-qddfSyXJweA7eV+REtMKeghlviIME20pplW+cz9RxetZpwe4g0bhWjUkfA/7F7c20YNIBkAVO8yfeBzip19wqw== +"@abp/owl.carousel@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/owl.carousel/-/owl.carousel-7.4.1.tgz#9db15032e4639a1b50e08aa7eaaf779f2cf30f6c" + integrity sha512-GNktio3GJqWsu4CrynbTkLucOG97W2rB8LnDxhvINcGow6hrDP3RzcExCqeh+miU6I44VvtC4uySyIYaXJoQ3A== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" owl.carousel "^2.3.4" -"@abp/prismjs@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-7.4.0.tgz#8572f36f853c7054d77d02f3098cd844ee321ed7" - integrity sha512-y/Iy6pddQeVazEITktPot8JOPdAEOVAfmYkTBP3DIIPvoYr3kf6rwfzBUalMw5CEjWZ9BaIszDgFCk5ucNHHwQ== +"@abp/prismjs@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-7.4.1.tgz#df4387dbc2f0c77ddb9b6bd0ade9a5db29b9cee2" + integrity sha512-bI7pEKWy32aRYSb2ZziiH6Teebyd8km+1TXADy1yks9i9G5eLWe4/CSdwWpI4M+8ggM8CsdhrZ6/U+55BpXPQA== dependencies: - "@abp/clipboard" "~7.4.0" - "@abp/core" "~7.4.0" + "@abp/clipboard" "~7.4.1" + "@abp/core" "~7.4.1" prismjs "^1.26.0" -"@abp/select2@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-7.4.0.tgz#2f455cc991b7bb4df9ed426097bc2996cac12697" - integrity sha512-DwprX4MIoqMzSdh7eFg7EjGIz4ftYZub6jG9Sk3r+sxabbhpbFTxKOpXnhBWYi7L7uTQ8YDFk/5NeXO+Rm50Ww== +"@abp/select2@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-7.4.1.tgz#d7ea53cfec285a06278db362131b7510d5b73900" + integrity sha512-0S66iy7HuB74qqOSDraoF7UvXqz2PrnOKy+3EYMTMskOn4pWaq03JMR8xxEgZ8CtmsrqlE1a4wt1Yt9b3FIc0w== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" select2 "^4.0.13" -"@abp/sweetalert2@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-7.4.0.tgz#db1b4bd45cbabd61172591abc8ce223b5f607c4e" - integrity sha512-XqHPRnTASaRtbJIZYKW1KSKIJ8tynL8DuPCSMjcp4iyUlk+gnzxvbqXeNVjc2ojxj78T/42M/vITNoiiTYuKUw== +"@abp/sweetalert2@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-7.4.1.tgz#6722a40e5115cc341b7543aa0fa3b5a7ae9515b2" + integrity sha512-9jAHrYqCp5qykYfNNbqgESL6egixofVwonjZlb+lLWHAkIX+gQ2ApUNDFSXPtKUh2n9sXhSfF8SSg+BHP/bkCA== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" sweetalert2 "^11.3.6" -"@abp/timeago@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-7.4.0.tgz#245fe09370f38311a67a594c8a3c884aea59cc90" - integrity sha512-khxK6EICUaGCUM1HkACw/8rlPQNssoQvCK64bNqEHBCXgPUmTcqSj5MEGiNOYbgGyWeH2IAMtJEYPqX1g1wqSA== +"@abp/timeago@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-7.4.1.tgz#243d342ba131878ae7f892909c9cae07cf54902b" + integrity sha512-a0Vl2NFwTxzRmH5akWo8BRUxa6sK72z8OoXwUFkZOUqMWBCHK7ffNiN1/fbSgA+7HpSZdDvIthjYwBt57DxLdQ== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" timeago "^1.6.7" -"@abp/toastr@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-7.4.0.tgz#16ba0414a27c9a21bc7556a078b175445edcf608" - integrity sha512-oM4HT2m95cK/9sB4AEQAKUMSGBep6wZTgM/46+o2IvvMdMPrGR2mPu9V9wi3y817FRgY+/qQTfy5TZWyTuIpVQ== +"@abp/toastr@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-7.4.1.tgz#345545a41b6145e54477c6c376193a6dbd62bdda" + integrity sha512-OLCvPJYSrcT2spcq9nO838Q22VhJ63Kdzasz1HugdVNqgcFCCSsqaoXrJGUcf5GrZx7PNloz7uf1I3txYMeZtA== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" toastr "^2.1.4" -"@abp/tui-editor@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/tui-editor/-/tui-editor-7.4.0.tgz#831efd947b5a255d73365248e443d43f834c5a75" - integrity sha512-G/aCeG0lrFjEdE/YRbpFWuhuaGDFDqO5+/otIQSOxcR/bkjE1kLrdH5KDYGIa9QUaq7GbKn7yFnjrv9s5ajxzQ== +"@abp/tui-editor@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/tui-editor/-/tui-editor-7.4.1.tgz#4adaffcc3d62c7f2159d6acbca71e14780270277" + integrity sha512-0wiLq03+EB6or9uBbz1ZEWnOAoUjJqqFDONVEv2LtuqWlaiDwzILrSMxihTyFsLGrSAUdezfk2L83DoJT6SsVg== dependencies: - "@abp/jquery" "~7.4.0" - "@abp/prismjs" "~7.4.0" + "@abp/jquery" "~7.4.1" + "@abp/prismjs" "~7.4.1" -"@abp/utils@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-7.4.0.tgz#b31fb6e5dff07463535479a6bb62dc733d7119c8" - integrity sha512-CcR3tfuEsVM60DYL1A0cH6BkUTsasOoBDv/b63uLCoEOq/g8ntelD/SpRSgfDXK74P9M8OE5ZFxlXWDiYuzAFg== +"@abp/utils@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-7.4.1.tgz#2ce4c4d659c2ae9bc23b71b79fa3c6e120eaecaf" + integrity sha512-eFeoOXcz9cVkDKpOfd2VWmpAojASfsqfvACZqi1UmF16OcjsFIkxmIvhh1fpbT4A+eQLbaFFLIsf6gYb//tXhg== dependencies: just-compare "^2.3.0" diff --git a/modules/client-simulation/demo/Volo.ClientSimulation.Demo/package.json b/modules/client-simulation/demo/Volo.ClientSimulation.Demo/package.json index 93e2ccb7f5..9e72809edd 100644 --- a/modules/client-simulation/demo/Volo.ClientSimulation.Demo/package.json +++ b/modules/client-simulation/demo/Volo.ClientSimulation.Demo/package.json @@ -3,6 +3,6 @@ "name": "client-simulation-web", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "~7.4.0" + "@abp/aspnetcore.mvc.ui.theme.basic": "~7.4.1" } } diff --git a/modules/client-simulation/demo/Volo.ClientSimulation.Demo/yarn.lock b/modules/client-simulation/demo/Volo.ClientSimulation.Demo/yarn.lock index 9c4c145174..8c3619aab1 100644 --- a/modules/client-simulation/demo/Volo.ClientSimulation.Demo/yarn.lock +++ b/modules/client-simulation/demo/Volo.ClientSimulation.Demo/yarn.lock @@ -2,39 +2,39 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-7.4.0.tgz#5088dd82ce343e1123e025848f09b51df988b225" - integrity sha512-teT7I0kgjek/lHzpTg5VOVCQ3IL26nFB43Aa/45fuaSwh9FJd3IJNXGL6xwp85oKaptDYSBXIF4GbrUfp2Ugqg== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~7.4.0" - -"@abp/aspnetcore.mvc.ui.theme.shared@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-7.4.0.tgz#e676444a46214e850b0d916daeeb912774ac381d" - integrity sha512-X+dgdgHGUTyf0zaSPsqQp2ZZWu2+9gIRT4r4/LDgxchHgfNvcKRF8jH/JICcVgGD1adJvZzzDpTefL8CuAIRJA== - dependencies: - "@abp/aspnetcore.mvc.ui" "~7.4.0" - "@abp/bootstrap" "~7.4.0" - "@abp/bootstrap-datepicker" "~7.4.0" - "@abp/bootstrap-daterangepicker" "~7.4.0" - "@abp/datatables.net-bs5" "~7.4.0" - "@abp/font-awesome" "~7.4.0" - "@abp/jquery-form" "~7.4.0" - "@abp/jquery-validation-unobtrusive" "~7.4.0" - "@abp/lodash" "~7.4.0" - "@abp/luxon" "~7.4.0" - "@abp/malihu-custom-scrollbar-plugin" "~7.4.0" - "@abp/moment" "~7.4.0" - "@abp/select2" "~7.4.0" - "@abp/sweetalert2" "~7.4.0" - "@abp/timeago" "~7.4.0" - "@abp/toastr" "~7.4.0" - -"@abp/aspnetcore.mvc.ui@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-7.4.0.tgz#61e1b52d2a940e02242f57007bd3f0fcb583c09a" - integrity sha512-gdoxOBo10DWDYhUq1GVfguC0Ot8PYhoA3VLf88/RatL88BNUUlt0e71uMFcx/gk72fuAE+o9zXn/6nq1wtpSwQ== +"@abp/aspnetcore.mvc.ui.theme.basic@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-7.4.1.tgz#62df78aab8a0b374817fdbab6c6363529b43f925" + integrity sha512-KaPmBlwNjOl1+vwLj5O8J11YHBSRg4y0IIxtgZiculXQNFPHbYAXm8sfTw6Wcsx00STrhvUVJQxYMePNnOTCTg== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~7.4.1" + +"@abp/aspnetcore.mvc.ui.theme.shared@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-7.4.1.tgz#8f8679f5cf80137324ddbec9fcaa67332783e708" + integrity sha512-0uUKuTsi/ikLFUUNEqvrn7KimgsvuK+7m1yZD4o47FQlgGxTyt1zQY9w3K6YyhyC3lsT6qCwiAPIoFOzPkIg/Q== + dependencies: + "@abp/aspnetcore.mvc.ui" "~7.4.1" + "@abp/bootstrap" "~7.4.1" + "@abp/bootstrap-datepicker" "~7.4.1" + "@abp/bootstrap-daterangepicker" "~7.4.1" + "@abp/datatables.net-bs5" "~7.4.1" + "@abp/font-awesome" "~7.4.1" + "@abp/jquery-form" "~7.4.1" + "@abp/jquery-validation-unobtrusive" "~7.4.1" + "@abp/lodash" "~7.4.1" + "@abp/luxon" "~7.4.1" + "@abp/malihu-custom-scrollbar-plugin" "~7.4.1" + "@abp/moment" "~7.4.1" + "@abp/select2" "~7.4.1" + "@abp/sweetalert2" "~7.4.1" + "@abp/timeago" "~7.4.1" + "@abp/toastr" "~7.4.1" + +"@abp/aspnetcore.mvc.ui@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-7.4.1.tgz#49c13718a17569f97b71f978b50f367dff67b8f7" + integrity sha512-EvYrfk0mpSt1jAMZmfFcHoNWEJskzResKp0bflOYsYPsZPuJ5WraKsk4IEEpesYHCyHW5AAb5HBJHeoSbVLh4Q== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -43,158 +43,158 @@ merge-stream "^2.0.0" micromatch "^4.0.2" -"@abp/bootstrap-datepicker@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-7.4.0.tgz#75edc2127ca26d86bfefaa6e37579b06e32de5de" - integrity sha512-HXUa+kLjKu8sKr+kCZeNye9Pv/swRfKGAt/uJ2WUEvCJ4IVIMM1p6iMnOEEk/+3OGE64/PWu3cdE9dLP6izOaA== +"@abp/bootstrap-datepicker@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-7.4.1.tgz#f8f35d0edf71368faaae4e40a72fa846b0084f9b" + integrity sha512-hsu8ty6c2oOevsNoyFTQ4yJAu27qnz82MgRNVS8MRfdzo05/LhBhy/tKFm+PFYJqZULYlpQ1GXUF2+uGyazIeg== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap-daterangepicker@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-7.4.0.tgz#5058fc2a9354f0a71ac5393658e362779a3bdc46" - integrity sha512-EK0wzZUY9H3XPb9U3DvYVqh48fU+6IneNGYOk7dcda8CUYObd4Dl1nXligStCqgn2uePtwxDHRx40eV0GXmU/Q== +"@abp/bootstrap-daterangepicker@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-7.4.1.tgz#b133cefdbed0fa1b8f1bda916a9d46952237238a" + integrity sha512-NpmbsO4Xg48Zmr8OOlf1fxuNMnFIqmRrkHiKp9lP5c8am64+7rRzCwATw2UY0Ud+4n8/ws+Iki1dwPQF6db1zw== dependencies: bootstrap-daterangepicker "^3.1.0" -"@abp/bootstrap@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-7.4.0.tgz#71be70660643d8f60d13d355b8c80b16e4854870" - integrity sha512-3Fa+fL5NH+0H2KK4MAaqNsiz0PYwK0+Oxjmd0NgKwcqV2vJzRrzS3WG5kITYjNz9QGdBV+FrhNX/NSRU8LDx3Q== +"@abp/bootstrap@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-7.4.1.tgz#b34a2fcc80e04212865652ee7f4f5498a6a61f6d" + integrity sha512-/qCgfrtNWZ2jui2iL6wd6MLrcxALSEFVBypaz1JK3WjEe7DvFAYvKLl7DugIv039/Sx3mbx/PJiQhx8CVZMsEA== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" bootstrap "^5.1.3" -"@abp/core@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-7.4.0.tgz#8505d446a3b4d80ce476bd3352c1639c7dc486ec" - integrity sha512-yxrnw6eAEIj/CcX5jAwb4xmCsdqWaG+KRcBA8GFvqXbsK94IjqLDiJ3flo+QhGn2DXo40ISxofZop0CgSbP7Ew== +"@abp/core@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-7.4.1.tgz#1d14899ad16aac038806504eb0a5be9318cdcc0c" + integrity sha512-p0BAe2kCtgZmq8pilahmuxmye8DeRXt2KmnFRbmYE3j4d0uComFZpC72QOD1iro8bkmbsHfsHJpiVg4Sp4licw== dependencies: - "@abp/utils" "~7.4.0" + "@abp/utils" "~7.4.1" -"@abp/datatables.net-bs5@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-7.4.0.tgz#52d22e12a2420b402e03148793707d063db0088d" - integrity sha512-VvQv5w0cUpdDD9jX8aUEaLxFrc4A95JlmFnhCYIV1etL8HNOdZvmOThxorsImk31JfpyVYrY/Ze/rnWi2uhVvQ== +"@abp/datatables.net-bs5@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-7.4.1.tgz#821ee4c5db116f9810d65184855cea1fa7d47360" + integrity sha512-jpUzb65lCGYAxs/1qV3pRP8agHwIgZA9gDrudvR8S/3X3kNQWtmeKoFDZ93mhnl3aWPjWFKVrT2LeQeJw5XO5A== dependencies: - "@abp/datatables.net" "~7.4.0" + "@abp/datatables.net" "~7.4.1" datatables.net-bs5 "^1.11.4" -"@abp/datatables.net@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-7.4.0.tgz#9f12a1bb2abd05cd753b5d937d8a0350b2ff74ae" - integrity sha512-StOkMmIkcBUWzD9ToZ5J/hISRWdxbAWjwn7RuFXsoHXcY03mmD86g2oztjrWC5UFnRdpFnsfspTpbNqXFB9Vag== +"@abp/datatables.net@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-7.4.1.tgz#a4501e92e9995da0759b9ce55756fe92c4e8db59" + integrity sha512-BZOOZLH7XrGlX3aFK97cwV9+npsTzALSBo87OgwO2U6UpeFq7yAOvmC0+L9dmIUDISeORn5IFc/zTsSSIQnpHQ== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" datatables.net "^1.11.4" -"@abp/font-awesome@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-7.4.0.tgz#50059083b88706a0f71f55118472b378e4c66163" - integrity sha512-hKoPyM41HHCK6dg+8pQvjYJWzKABBCXrYQAIneMPQZUZqa4JLObKCva9TR7pu6pUp+9OVzg4fQOBM+nwpHtw4g== +"@abp/font-awesome@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-7.4.1.tgz#f6175a989aa64367830723f1dd9c607906716296" + integrity sha512-/ybaz4KROwFdG4Xv0yMTUMXOreDmKy1lKQuntqHEUnIorhXmkgcd5AQQ5AolJ4NmNdPNt1VYrRcTEmdz3nw+FA== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" "@fortawesome/fontawesome-free" "^5.15.4" -"@abp/jquery-form@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-7.4.0.tgz#7ab3be241ee09f1e2843bd1b4d0b0b86d4446e30" - integrity sha512-OmTRuZ7QK1oe2ayNLqEpRJk4Ogk0wt/hIFtJHwQkCtDuCggoR5sQz4vn1vgrD19MxGq07dow5IgjbbhHv1vtEg== +"@abp/jquery-form@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-7.4.1.tgz#67978c41cda204b4c2027d81fc66844379313fa6" + integrity sha512-JZ1D47s/kpTlfMcpD4Jrlh98bhEDsIlWJauvAYaS0EBPIU9V2zHGQ+h9GPFbSPrXe4sYxPSREcsc8KUVMhT5MQ== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-7.4.0.tgz#0c564e39c4997dd9b8af7d2023615a06d6fd9834" - integrity sha512-vFB3RKkDlDXbHlDJ64uo3jWW1IRXwiCaPf+mcB77Wpt5+0Dn7eWqjBT7KyHBrsV08ghIqY/Q4nXntFJrmLcuEA== +"@abp/jquery-validation-unobtrusive@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-7.4.1.tgz#fe5c90ade419e83505884dd50dd5988d766f177b" + integrity sha512-oHHV/ukap+vDvQ8CnEWnOrrsLkHXIcMk+SjNKe/dyK5VzOVLDpMatRFmloLs2igYVXTqDGjmDlTswTFdJUarcQ== dependencies: - "@abp/jquery-validation" "~7.4.0" + "@abp/jquery-validation" "~7.4.1" jquery-validation-unobtrusive "^3.2.12" -"@abp/jquery-validation@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-7.4.0.tgz#f2aaba8f4c023e93f0051cc9a05c6d82fa5c7254" - integrity sha512-vN4srLT5UXAKXpKHbZgySWT+N2DjRYivgtifpZHMTGFLMW14W+tfi5zhR4H4JvqJpuO6ZKNiz15zA1zwEBK0Tw== +"@abp/jquery-validation@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-7.4.1.tgz#c2c06bc28770832a9ad73eac000586faed3bdbe3" + integrity sha512-A5iFT2EWfGHXrBb/ov5f0grZ2o2xkDaYtps/FnDUwBYdIdD8E7bbJsWp6ytvZDciO0XmEqAoVOxmiij7ue/SOg== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" jquery-validation "^1.19.3" -"@abp/jquery@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-7.4.0.tgz#206891b20f250537d05d907d2b6cd682fec76496" - integrity sha512-DeYo02T6WVhdpLloSPb6ooqtpksu1HtcbbQhIP9E1P7jHSzZoNiJvoKXHiFUcj5PYiGKl9d/o89hM/apWzyreQ== +"@abp/jquery@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-7.4.1.tgz#b5e16834e6c7871ad6392612ac8e2de8617eb353" + integrity sha512-X3RcovvRYISHcsb6W3U3iVsofw6yomoiouoB1tSIy2/tvUbu9n7N/3MM0CUujFm/xib7s3z1tVxFssS9smT7sw== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" jquery "~3.6.0" -"@abp/lodash@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-7.4.0.tgz#93f20abee776dbfa7aa45e2e710f2768f262fda5" - integrity sha512-h4Fnjm+VLwp1F3r57B9MrHhwyOYMo5oP285a85zzAYLkhwcDy7f1nbHKHMQ3ZTaeJVmiRnVaH+3sdUdslCRt5g== +"@abp/lodash@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-7.4.1.tgz#d0f84b7b9cbd989d59ebde594ed7acb8bc720b61" + integrity sha512-RFjZCyAPZnpvT0SJbxXzzmMYbuocSWBlezvjAVA8MiTrOXdZO4VyaTFjIuQcAdSrZhtpFGeYWxAjHshVplxMbw== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" lodash "^4.17.21" -"@abp/luxon@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-7.4.0.tgz#2ba7ff307c8f7c24d818a9c33635b86fd6810db9" - integrity sha512-ROCx7aihM+agdYy7Tkz+GiScx68KY5qwGTnj8P7QabGFChzVUic6RuBG+2Obmfonc6uT7Rq0c8JDGrsGNe/w8A== +"@abp/luxon@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-7.4.1.tgz#e0c0947d2b77f98b9cdaf7d1143025879361c3c9" + integrity sha512-k1wh8tT1529MtNC2gSXEIKdimBXBwubXeLisgpIPx6lkJo1Op6pAz2ERwFXeyktqGdYyuFcnewJIxmS7EPtWhg== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" luxon "^2.3.0" -"@abp/malihu-custom-scrollbar-plugin@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-7.4.0.tgz#aba68877481f4339e048f2ae3cfbe93197145a0a" - integrity sha512-Ntodhi4k0HFQmImYTP5SYf/WDm7aUGJLaGsfePm77HJ6DhGgalIGqtM8NiFXzo/3GmMY0XSo8Wxrs1mSCdtsOA== +"@abp/malihu-custom-scrollbar-plugin@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-7.4.1.tgz#aa7ec247197a258277549052780b38fd9e748c6c" + integrity sha512-pm/wIaiRSgGxelOf8AiL4JKFNZOQ6s2WbR6pULiP2HSNCgCpWYJ2s8fvj7VP3lAHIa98v3m8PSMSUhqaANxZ/Q== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/moment@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-7.4.0.tgz#2490d9c7cdcaeca8d0ba9ebef5e7298caf0c9e09" - integrity sha512-ftsUEgO17GbVawA1GplGFzEeIM4NX004AmS6/fPI3o5isX7o1buF9q9TXdnwUuFEJKZxS4KpveRqzTL5t9k0BQ== +"@abp/moment@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-7.4.1.tgz#1c28ccb13eecdd13695edf8641ca9867b318e37d" + integrity sha512-7vRJyAK5ER9z+LV1xUSAAtWlPlhv8yhM/nHjhC+IQSP/+V1D7VLA6EKxAEexGw7wX6HY8oMOWP9HxDHMb5hKQA== dependencies: moment "^2.9.0" -"@abp/select2@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-7.4.0.tgz#2f455cc991b7bb4df9ed426097bc2996cac12697" - integrity sha512-DwprX4MIoqMzSdh7eFg7EjGIz4ftYZub6jG9Sk3r+sxabbhpbFTxKOpXnhBWYi7L7uTQ8YDFk/5NeXO+Rm50Ww== +"@abp/select2@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-7.4.1.tgz#d7ea53cfec285a06278db362131b7510d5b73900" + integrity sha512-0S66iy7HuB74qqOSDraoF7UvXqz2PrnOKy+3EYMTMskOn4pWaq03JMR8xxEgZ8CtmsrqlE1a4wt1Yt9b3FIc0w== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" select2 "^4.0.13" -"@abp/sweetalert2@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-7.4.0.tgz#db1b4bd45cbabd61172591abc8ce223b5f607c4e" - integrity sha512-XqHPRnTASaRtbJIZYKW1KSKIJ8tynL8DuPCSMjcp4iyUlk+gnzxvbqXeNVjc2ojxj78T/42M/vITNoiiTYuKUw== +"@abp/sweetalert2@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-7.4.1.tgz#6722a40e5115cc341b7543aa0fa3b5a7ae9515b2" + integrity sha512-9jAHrYqCp5qykYfNNbqgESL6egixofVwonjZlb+lLWHAkIX+gQ2ApUNDFSXPtKUh2n9sXhSfF8SSg+BHP/bkCA== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" sweetalert2 "^11.3.6" -"@abp/timeago@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-7.4.0.tgz#245fe09370f38311a67a594c8a3c884aea59cc90" - integrity sha512-khxK6EICUaGCUM1HkACw/8rlPQNssoQvCK64bNqEHBCXgPUmTcqSj5MEGiNOYbgGyWeH2IAMtJEYPqX1g1wqSA== +"@abp/timeago@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-7.4.1.tgz#243d342ba131878ae7f892909c9cae07cf54902b" + integrity sha512-a0Vl2NFwTxzRmH5akWo8BRUxa6sK72z8OoXwUFkZOUqMWBCHK7ffNiN1/fbSgA+7HpSZdDvIthjYwBt57DxLdQ== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" timeago "^1.6.7" -"@abp/toastr@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-7.4.0.tgz#16ba0414a27c9a21bc7556a078b175445edcf608" - integrity sha512-oM4HT2m95cK/9sB4AEQAKUMSGBep6wZTgM/46+o2IvvMdMPrGR2mPu9V9wi3y817FRgY+/qQTfy5TZWyTuIpVQ== +"@abp/toastr@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-7.4.1.tgz#345545a41b6145e54477c6c376193a6dbd62bdda" + integrity sha512-OLCvPJYSrcT2spcq9nO838Q22VhJ63Kdzasz1HugdVNqgcFCCSsqaoXrJGUcf5GrZx7PNloz7uf1I3txYMeZtA== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" toastr "^2.1.4" -"@abp/utils@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-7.4.0.tgz#b31fb6e5dff07463535479a6bb62dc733d7119c8" - integrity sha512-CcR3tfuEsVM60DYL1A0cH6BkUTsasOoBDv/b63uLCoEOq/g8ntelD/SpRSgfDXK74P9M8OE5ZFxlXWDiYuzAFg== +"@abp/utils@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-7.4.1.tgz#2ce4c4d659c2ae9bc23b71b79fa3c6e120eaecaf" + integrity sha512-eFeoOXcz9cVkDKpOfd2VWmpAojASfsqfvACZqi1UmF16OcjsFIkxmIvhh1fpbT4A+eQLbaFFLIsf6gYb//tXhg== dependencies: just-compare "^2.3.0" diff --git a/modules/cms-kit/angular/package.json b/modules/cms-kit/angular/package.json index 616089d5d9..ac8ba74119 100644 --- a/modules/cms-kit/angular/package.json +++ b/modules/cms-kit/angular/package.json @@ -15,11 +15,11 @@ }, "private": true, "dependencies": { - "@abp/ng.account": "~7.4.0", - "@abp/ng.identity": "~7.4.0", - "@abp/ng.setting-management": "~7.4.0", - "@abp/ng.tenant-management": "~7.4.0", - "@abp/ng.theme.basic": "~7.4.0", + "@abp/ng.account": "~7.4.1", + "@abp/ng.identity": "~7.4.1", + "@abp/ng.setting-management": "~7.4.1", + "@abp/ng.tenant-management": "~7.4.1", + "@abp/ng.theme.basic": "~7.4.1", "@angular/animations": "~10.0.0", "@angular/common": "~10.0.0", "@angular/compiler": "~10.0.0", diff --git a/modules/cms-kit/angular/projects/cms-kit/package.json b/modules/cms-kit/angular/projects/cms-kit/package.json index 16e2158730..384a49000e 100644 --- a/modules/cms-kit/angular/projects/cms-kit/package.json +++ b/modules/cms-kit/angular/projects/cms-kit/package.json @@ -4,8 +4,8 @@ "peerDependencies": { "@angular/common": "^9.1.11", "@angular/core": "^9.1.11", - "@abp/ng.core": ">=7.4.0", - "@abp/ng.theme.shared": ">=7.4.0" + "@abp/ng.core": ">=7.4.1", + "@abp/ng.theme.shared": ">=7.4.1" }, "dependencies": { "tslib": "^2.0.0" diff --git a/modules/cms-kit/host/Volo.CmsKit.IdentityServer/package.json b/modules/cms-kit/host/Volo.CmsKit.IdentityServer/package.json index c98ab25773..afc96007fd 100644 --- a/modules/cms-kit/host/Volo.CmsKit.IdentityServer/package.json +++ b/modules/cms-kit/host/Volo.CmsKit.IdentityServer/package.json @@ -3,6 +3,6 @@ "name": "my-app-identityserver", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "~7.4.0" + "@abp/aspnetcore.mvc.ui.theme.basic": "~7.4.1" } } diff --git a/modules/cms-kit/host/Volo.CmsKit.IdentityServer/yarn.lock b/modules/cms-kit/host/Volo.CmsKit.IdentityServer/yarn.lock index 9c4c145174..8c3619aab1 100644 --- a/modules/cms-kit/host/Volo.CmsKit.IdentityServer/yarn.lock +++ b/modules/cms-kit/host/Volo.CmsKit.IdentityServer/yarn.lock @@ -2,39 +2,39 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-7.4.0.tgz#5088dd82ce343e1123e025848f09b51df988b225" - integrity sha512-teT7I0kgjek/lHzpTg5VOVCQ3IL26nFB43Aa/45fuaSwh9FJd3IJNXGL6xwp85oKaptDYSBXIF4GbrUfp2Ugqg== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~7.4.0" - -"@abp/aspnetcore.mvc.ui.theme.shared@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-7.4.0.tgz#e676444a46214e850b0d916daeeb912774ac381d" - integrity sha512-X+dgdgHGUTyf0zaSPsqQp2ZZWu2+9gIRT4r4/LDgxchHgfNvcKRF8jH/JICcVgGD1adJvZzzDpTefL8CuAIRJA== - dependencies: - "@abp/aspnetcore.mvc.ui" "~7.4.0" - "@abp/bootstrap" "~7.4.0" - "@abp/bootstrap-datepicker" "~7.4.0" - "@abp/bootstrap-daterangepicker" "~7.4.0" - "@abp/datatables.net-bs5" "~7.4.0" - "@abp/font-awesome" "~7.4.0" - "@abp/jquery-form" "~7.4.0" - "@abp/jquery-validation-unobtrusive" "~7.4.0" - "@abp/lodash" "~7.4.0" - "@abp/luxon" "~7.4.0" - "@abp/malihu-custom-scrollbar-plugin" "~7.4.0" - "@abp/moment" "~7.4.0" - "@abp/select2" "~7.4.0" - "@abp/sweetalert2" "~7.4.0" - "@abp/timeago" "~7.4.0" - "@abp/toastr" "~7.4.0" - -"@abp/aspnetcore.mvc.ui@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-7.4.0.tgz#61e1b52d2a940e02242f57007bd3f0fcb583c09a" - integrity sha512-gdoxOBo10DWDYhUq1GVfguC0Ot8PYhoA3VLf88/RatL88BNUUlt0e71uMFcx/gk72fuAE+o9zXn/6nq1wtpSwQ== +"@abp/aspnetcore.mvc.ui.theme.basic@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-7.4.1.tgz#62df78aab8a0b374817fdbab6c6363529b43f925" + integrity sha512-KaPmBlwNjOl1+vwLj5O8J11YHBSRg4y0IIxtgZiculXQNFPHbYAXm8sfTw6Wcsx00STrhvUVJQxYMePNnOTCTg== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~7.4.1" + +"@abp/aspnetcore.mvc.ui.theme.shared@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-7.4.1.tgz#8f8679f5cf80137324ddbec9fcaa67332783e708" + integrity sha512-0uUKuTsi/ikLFUUNEqvrn7KimgsvuK+7m1yZD4o47FQlgGxTyt1zQY9w3K6YyhyC3lsT6qCwiAPIoFOzPkIg/Q== + dependencies: + "@abp/aspnetcore.mvc.ui" "~7.4.1" + "@abp/bootstrap" "~7.4.1" + "@abp/bootstrap-datepicker" "~7.4.1" + "@abp/bootstrap-daterangepicker" "~7.4.1" + "@abp/datatables.net-bs5" "~7.4.1" + "@abp/font-awesome" "~7.4.1" + "@abp/jquery-form" "~7.4.1" + "@abp/jquery-validation-unobtrusive" "~7.4.1" + "@abp/lodash" "~7.4.1" + "@abp/luxon" "~7.4.1" + "@abp/malihu-custom-scrollbar-plugin" "~7.4.1" + "@abp/moment" "~7.4.1" + "@abp/select2" "~7.4.1" + "@abp/sweetalert2" "~7.4.1" + "@abp/timeago" "~7.4.1" + "@abp/toastr" "~7.4.1" + +"@abp/aspnetcore.mvc.ui@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-7.4.1.tgz#49c13718a17569f97b71f978b50f367dff67b8f7" + integrity sha512-EvYrfk0mpSt1jAMZmfFcHoNWEJskzResKp0bflOYsYPsZPuJ5WraKsk4IEEpesYHCyHW5AAb5HBJHeoSbVLh4Q== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -43,158 +43,158 @@ merge-stream "^2.0.0" micromatch "^4.0.2" -"@abp/bootstrap-datepicker@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-7.4.0.tgz#75edc2127ca26d86bfefaa6e37579b06e32de5de" - integrity sha512-HXUa+kLjKu8sKr+kCZeNye9Pv/swRfKGAt/uJ2WUEvCJ4IVIMM1p6iMnOEEk/+3OGE64/PWu3cdE9dLP6izOaA== +"@abp/bootstrap-datepicker@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-7.4.1.tgz#f8f35d0edf71368faaae4e40a72fa846b0084f9b" + integrity sha512-hsu8ty6c2oOevsNoyFTQ4yJAu27qnz82MgRNVS8MRfdzo05/LhBhy/tKFm+PFYJqZULYlpQ1GXUF2+uGyazIeg== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap-daterangepicker@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-7.4.0.tgz#5058fc2a9354f0a71ac5393658e362779a3bdc46" - integrity sha512-EK0wzZUY9H3XPb9U3DvYVqh48fU+6IneNGYOk7dcda8CUYObd4Dl1nXligStCqgn2uePtwxDHRx40eV0GXmU/Q== +"@abp/bootstrap-daterangepicker@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-7.4.1.tgz#b133cefdbed0fa1b8f1bda916a9d46952237238a" + integrity sha512-NpmbsO4Xg48Zmr8OOlf1fxuNMnFIqmRrkHiKp9lP5c8am64+7rRzCwATw2UY0Ud+4n8/ws+Iki1dwPQF6db1zw== dependencies: bootstrap-daterangepicker "^3.1.0" -"@abp/bootstrap@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-7.4.0.tgz#71be70660643d8f60d13d355b8c80b16e4854870" - integrity sha512-3Fa+fL5NH+0H2KK4MAaqNsiz0PYwK0+Oxjmd0NgKwcqV2vJzRrzS3WG5kITYjNz9QGdBV+FrhNX/NSRU8LDx3Q== +"@abp/bootstrap@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-7.4.1.tgz#b34a2fcc80e04212865652ee7f4f5498a6a61f6d" + integrity sha512-/qCgfrtNWZ2jui2iL6wd6MLrcxALSEFVBypaz1JK3WjEe7DvFAYvKLl7DugIv039/Sx3mbx/PJiQhx8CVZMsEA== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" bootstrap "^5.1.3" -"@abp/core@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-7.4.0.tgz#8505d446a3b4d80ce476bd3352c1639c7dc486ec" - integrity sha512-yxrnw6eAEIj/CcX5jAwb4xmCsdqWaG+KRcBA8GFvqXbsK94IjqLDiJ3flo+QhGn2DXo40ISxofZop0CgSbP7Ew== +"@abp/core@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-7.4.1.tgz#1d14899ad16aac038806504eb0a5be9318cdcc0c" + integrity sha512-p0BAe2kCtgZmq8pilahmuxmye8DeRXt2KmnFRbmYE3j4d0uComFZpC72QOD1iro8bkmbsHfsHJpiVg4Sp4licw== dependencies: - "@abp/utils" "~7.4.0" + "@abp/utils" "~7.4.1" -"@abp/datatables.net-bs5@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-7.4.0.tgz#52d22e12a2420b402e03148793707d063db0088d" - integrity sha512-VvQv5w0cUpdDD9jX8aUEaLxFrc4A95JlmFnhCYIV1etL8HNOdZvmOThxorsImk31JfpyVYrY/Ze/rnWi2uhVvQ== +"@abp/datatables.net-bs5@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-7.4.1.tgz#821ee4c5db116f9810d65184855cea1fa7d47360" + integrity sha512-jpUzb65lCGYAxs/1qV3pRP8agHwIgZA9gDrudvR8S/3X3kNQWtmeKoFDZ93mhnl3aWPjWFKVrT2LeQeJw5XO5A== dependencies: - "@abp/datatables.net" "~7.4.0" + "@abp/datatables.net" "~7.4.1" datatables.net-bs5 "^1.11.4" -"@abp/datatables.net@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-7.4.0.tgz#9f12a1bb2abd05cd753b5d937d8a0350b2ff74ae" - integrity sha512-StOkMmIkcBUWzD9ToZ5J/hISRWdxbAWjwn7RuFXsoHXcY03mmD86g2oztjrWC5UFnRdpFnsfspTpbNqXFB9Vag== +"@abp/datatables.net@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-7.4.1.tgz#a4501e92e9995da0759b9ce55756fe92c4e8db59" + integrity sha512-BZOOZLH7XrGlX3aFK97cwV9+npsTzALSBo87OgwO2U6UpeFq7yAOvmC0+L9dmIUDISeORn5IFc/zTsSSIQnpHQ== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" datatables.net "^1.11.4" -"@abp/font-awesome@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-7.4.0.tgz#50059083b88706a0f71f55118472b378e4c66163" - integrity sha512-hKoPyM41HHCK6dg+8pQvjYJWzKABBCXrYQAIneMPQZUZqa4JLObKCva9TR7pu6pUp+9OVzg4fQOBM+nwpHtw4g== +"@abp/font-awesome@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-7.4.1.tgz#f6175a989aa64367830723f1dd9c607906716296" + integrity sha512-/ybaz4KROwFdG4Xv0yMTUMXOreDmKy1lKQuntqHEUnIorhXmkgcd5AQQ5AolJ4NmNdPNt1VYrRcTEmdz3nw+FA== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" "@fortawesome/fontawesome-free" "^5.15.4" -"@abp/jquery-form@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-7.4.0.tgz#7ab3be241ee09f1e2843bd1b4d0b0b86d4446e30" - integrity sha512-OmTRuZ7QK1oe2ayNLqEpRJk4Ogk0wt/hIFtJHwQkCtDuCggoR5sQz4vn1vgrD19MxGq07dow5IgjbbhHv1vtEg== +"@abp/jquery-form@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-7.4.1.tgz#67978c41cda204b4c2027d81fc66844379313fa6" + integrity sha512-JZ1D47s/kpTlfMcpD4Jrlh98bhEDsIlWJauvAYaS0EBPIU9V2zHGQ+h9GPFbSPrXe4sYxPSREcsc8KUVMhT5MQ== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-7.4.0.tgz#0c564e39c4997dd9b8af7d2023615a06d6fd9834" - integrity sha512-vFB3RKkDlDXbHlDJ64uo3jWW1IRXwiCaPf+mcB77Wpt5+0Dn7eWqjBT7KyHBrsV08ghIqY/Q4nXntFJrmLcuEA== +"@abp/jquery-validation-unobtrusive@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-7.4.1.tgz#fe5c90ade419e83505884dd50dd5988d766f177b" + integrity sha512-oHHV/ukap+vDvQ8CnEWnOrrsLkHXIcMk+SjNKe/dyK5VzOVLDpMatRFmloLs2igYVXTqDGjmDlTswTFdJUarcQ== dependencies: - "@abp/jquery-validation" "~7.4.0" + "@abp/jquery-validation" "~7.4.1" jquery-validation-unobtrusive "^3.2.12" -"@abp/jquery-validation@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-7.4.0.tgz#f2aaba8f4c023e93f0051cc9a05c6d82fa5c7254" - integrity sha512-vN4srLT5UXAKXpKHbZgySWT+N2DjRYivgtifpZHMTGFLMW14W+tfi5zhR4H4JvqJpuO6ZKNiz15zA1zwEBK0Tw== +"@abp/jquery-validation@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-7.4.1.tgz#c2c06bc28770832a9ad73eac000586faed3bdbe3" + integrity sha512-A5iFT2EWfGHXrBb/ov5f0grZ2o2xkDaYtps/FnDUwBYdIdD8E7bbJsWp6ytvZDciO0XmEqAoVOxmiij7ue/SOg== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" jquery-validation "^1.19.3" -"@abp/jquery@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-7.4.0.tgz#206891b20f250537d05d907d2b6cd682fec76496" - integrity sha512-DeYo02T6WVhdpLloSPb6ooqtpksu1HtcbbQhIP9E1P7jHSzZoNiJvoKXHiFUcj5PYiGKl9d/o89hM/apWzyreQ== +"@abp/jquery@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-7.4.1.tgz#b5e16834e6c7871ad6392612ac8e2de8617eb353" + integrity sha512-X3RcovvRYISHcsb6W3U3iVsofw6yomoiouoB1tSIy2/tvUbu9n7N/3MM0CUujFm/xib7s3z1tVxFssS9smT7sw== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" jquery "~3.6.0" -"@abp/lodash@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-7.4.0.tgz#93f20abee776dbfa7aa45e2e710f2768f262fda5" - integrity sha512-h4Fnjm+VLwp1F3r57B9MrHhwyOYMo5oP285a85zzAYLkhwcDy7f1nbHKHMQ3ZTaeJVmiRnVaH+3sdUdslCRt5g== +"@abp/lodash@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-7.4.1.tgz#d0f84b7b9cbd989d59ebde594ed7acb8bc720b61" + integrity sha512-RFjZCyAPZnpvT0SJbxXzzmMYbuocSWBlezvjAVA8MiTrOXdZO4VyaTFjIuQcAdSrZhtpFGeYWxAjHshVplxMbw== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" lodash "^4.17.21" -"@abp/luxon@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-7.4.0.tgz#2ba7ff307c8f7c24d818a9c33635b86fd6810db9" - integrity sha512-ROCx7aihM+agdYy7Tkz+GiScx68KY5qwGTnj8P7QabGFChzVUic6RuBG+2Obmfonc6uT7Rq0c8JDGrsGNe/w8A== +"@abp/luxon@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-7.4.1.tgz#e0c0947d2b77f98b9cdaf7d1143025879361c3c9" + integrity sha512-k1wh8tT1529MtNC2gSXEIKdimBXBwubXeLisgpIPx6lkJo1Op6pAz2ERwFXeyktqGdYyuFcnewJIxmS7EPtWhg== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" luxon "^2.3.0" -"@abp/malihu-custom-scrollbar-plugin@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-7.4.0.tgz#aba68877481f4339e048f2ae3cfbe93197145a0a" - integrity sha512-Ntodhi4k0HFQmImYTP5SYf/WDm7aUGJLaGsfePm77HJ6DhGgalIGqtM8NiFXzo/3GmMY0XSo8Wxrs1mSCdtsOA== +"@abp/malihu-custom-scrollbar-plugin@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-7.4.1.tgz#aa7ec247197a258277549052780b38fd9e748c6c" + integrity sha512-pm/wIaiRSgGxelOf8AiL4JKFNZOQ6s2WbR6pULiP2HSNCgCpWYJ2s8fvj7VP3lAHIa98v3m8PSMSUhqaANxZ/Q== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/moment@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-7.4.0.tgz#2490d9c7cdcaeca8d0ba9ebef5e7298caf0c9e09" - integrity sha512-ftsUEgO17GbVawA1GplGFzEeIM4NX004AmS6/fPI3o5isX7o1buF9q9TXdnwUuFEJKZxS4KpveRqzTL5t9k0BQ== +"@abp/moment@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-7.4.1.tgz#1c28ccb13eecdd13695edf8641ca9867b318e37d" + integrity sha512-7vRJyAK5ER9z+LV1xUSAAtWlPlhv8yhM/nHjhC+IQSP/+V1D7VLA6EKxAEexGw7wX6HY8oMOWP9HxDHMb5hKQA== dependencies: moment "^2.9.0" -"@abp/select2@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-7.4.0.tgz#2f455cc991b7bb4df9ed426097bc2996cac12697" - integrity sha512-DwprX4MIoqMzSdh7eFg7EjGIz4ftYZub6jG9Sk3r+sxabbhpbFTxKOpXnhBWYi7L7uTQ8YDFk/5NeXO+Rm50Ww== +"@abp/select2@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-7.4.1.tgz#d7ea53cfec285a06278db362131b7510d5b73900" + integrity sha512-0S66iy7HuB74qqOSDraoF7UvXqz2PrnOKy+3EYMTMskOn4pWaq03JMR8xxEgZ8CtmsrqlE1a4wt1Yt9b3FIc0w== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" select2 "^4.0.13" -"@abp/sweetalert2@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-7.4.0.tgz#db1b4bd45cbabd61172591abc8ce223b5f607c4e" - integrity sha512-XqHPRnTASaRtbJIZYKW1KSKIJ8tynL8DuPCSMjcp4iyUlk+gnzxvbqXeNVjc2ojxj78T/42M/vITNoiiTYuKUw== +"@abp/sweetalert2@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-7.4.1.tgz#6722a40e5115cc341b7543aa0fa3b5a7ae9515b2" + integrity sha512-9jAHrYqCp5qykYfNNbqgESL6egixofVwonjZlb+lLWHAkIX+gQ2ApUNDFSXPtKUh2n9sXhSfF8SSg+BHP/bkCA== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" sweetalert2 "^11.3.6" -"@abp/timeago@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-7.4.0.tgz#245fe09370f38311a67a594c8a3c884aea59cc90" - integrity sha512-khxK6EICUaGCUM1HkACw/8rlPQNssoQvCK64bNqEHBCXgPUmTcqSj5MEGiNOYbgGyWeH2IAMtJEYPqX1g1wqSA== +"@abp/timeago@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-7.4.1.tgz#243d342ba131878ae7f892909c9cae07cf54902b" + integrity sha512-a0Vl2NFwTxzRmH5akWo8BRUxa6sK72z8OoXwUFkZOUqMWBCHK7ffNiN1/fbSgA+7HpSZdDvIthjYwBt57DxLdQ== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" timeago "^1.6.7" -"@abp/toastr@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-7.4.0.tgz#16ba0414a27c9a21bc7556a078b175445edcf608" - integrity sha512-oM4HT2m95cK/9sB4AEQAKUMSGBep6wZTgM/46+o2IvvMdMPrGR2mPu9V9wi3y817FRgY+/qQTfy5TZWyTuIpVQ== +"@abp/toastr@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-7.4.1.tgz#345545a41b6145e54477c6c376193a6dbd62bdda" + integrity sha512-OLCvPJYSrcT2spcq9nO838Q22VhJ63Kdzasz1HugdVNqgcFCCSsqaoXrJGUcf5GrZx7PNloz7uf1I3txYMeZtA== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" toastr "^2.1.4" -"@abp/utils@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-7.4.0.tgz#b31fb6e5dff07463535479a6bb62dc733d7119c8" - integrity sha512-CcR3tfuEsVM60DYL1A0cH6BkUTsasOoBDv/b63uLCoEOq/g8ntelD/SpRSgfDXK74P9M8OE5ZFxlXWDiYuzAFg== +"@abp/utils@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-7.4.1.tgz#2ce4c4d659c2ae9bc23b71b79fa3c6e120eaecaf" + integrity sha512-eFeoOXcz9cVkDKpOfd2VWmpAojASfsqfvACZqi1UmF16OcjsFIkxmIvhh1fpbT4A+eQLbaFFLIsf6gYb//tXhg== dependencies: just-compare "^2.3.0" diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Host/package.json b/modules/cms-kit/host/Volo.CmsKit.Web.Host/package.json index 7fbc0569f6..212b67b1c1 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Host/package.json +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Host/package.json @@ -3,6 +3,6 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "~7.4.0" + "@abp/aspnetcore.mvc.ui.theme.basic": "~7.4.1" } } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Host/yarn.lock b/modules/cms-kit/host/Volo.CmsKit.Web.Host/yarn.lock index 9c4c145174..8c3619aab1 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Host/yarn.lock +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Host/yarn.lock @@ -2,39 +2,39 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-7.4.0.tgz#5088dd82ce343e1123e025848f09b51df988b225" - integrity sha512-teT7I0kgjek/lHzpTg5VOVCQ3IL26nFB43Aa/45fuaSwh9FJd3IJNXGL6xwp85oKaptDYSBXIF4GbrUfp2Ugqg== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~7.4.0" - -"@abp/aspnetcore.mvc.ui.theme.shared@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-7.4.0.tgz#e676444a46214e850b0d916daeeb912774ac381d" - integrity sha512-X+dgdgHGUTyf0zaSPsqQp2ZZWu2+9gIRT4r4/LDgxchHgfNvcKRF8jH/JICcVgGD1adJvZzzDpTefL8CuAIRJA== - dependencies: - "@abp/aspnetcore.mvc.ui" "~7.4.0" - "@abp/bootstrap" "~7.4.0" - "@abp/bootstrap-datepicker" "~7.4.0" - "@abp/bootstrap-daterangepicker" "~7.4.0" - "@abp/datatables.net-bs5" "~7.4.0" - "@abp/font-awesome" "~7.4.0" - "@abp/jquery-form" "~7.4.0" - "@abp/jquery-validation-unobtrusive" "~7.4.0" - "@abp/lodash" "~7.4.0" - "@abp/luxon" "~7.4.0" - "@abp/malihu-custom-scrollbar-plugin" "~7.4.0" - "@abp/moment" "~7.4.0" - "@abp/select2" "~7.4.0" - "@abp/sweetalert2" "~7.4.0" - "@abp/timeago" "~7.4.0" - "@abp/toastr" "~7.4.0" - -"@abp/aspnetcore.mvc.ui@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-7.4.0.tgz#61e1b52d2a940e02242f57007bd3f0fcb583c09a" - integrity sha512-gdoxOBo10DWDYhUq1GVfguC0Ot8PYhoA3VLf88/RatL88BNUUlt0e71uMFcx/gk72fuAE+o9zXn/6nq1wtpSwQ== +"@abp/aspnetcore.mvc.ui.theme.basic@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-7.4.1.tgz#62df78aab8a0b374817fdbab6c6363529b43f925" + integrity sha512-KaPmBlwNjOl1+vwLj5O8J11YHBSRg4y0IIxtgZiculXQNFPHbYAXm8sfTw6Wcsx00STrhvUVJQxYMePNnOTCTg== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~7.4.1" + +"@abp/aspnetcore.mvc.ui.theme.shared@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-7.4.1.tgz#8f8679f5cf80137324ddbec9fcaa67332783e708" + integrity sha512-0uUKuTsi/ikLFUUNEqvrn7KimgsvuK+7m1yZD4o47FQlgGxTyt1zQY9w3K6YyhyC3lsT6qCwiAPIoFOzPkIg/Q== + dependencies: + "@abp/aspnetcore.mvc.ui" "~7.4.1" + "@abp/bootstrap" "~7.4.1" + "@abp/bootstrap-datepicker" "~7.4.1" + "@abp/bootstrap-daterangepicker" "~7.4.1" + "@abp/datatables.net-bs5" "~7.4.1" + "@abp/font-awesome" "~7.4.1" + "@abp/jquery-form" "~7.4.1" + "@abp/jquery-validation-unobtrusive" "~7.4.1" + "@abp/lodash" "~7.4.1" + "@abp/luxon" "~7.4.1" + "@abp/malihu-custom-scrollbar-plugin" "~7.4.1" + "@abp/moment" "~7.4.1" + "@abp/select2" "~7.4.1" + "@abp/sweetalert2" "~7.4.1" + "@abp/timeago" "~7.4.1" + "@abp/toastr" "~7.4.1" + +"@abp/aspnetcore.mvc.ui@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-7.4.1.tgz#49c13718a17569f97b71f978b50f367dff67b8f7" + integrity sha512-EvYrfk0mpSt1jAMZmfFcHoNWEJskzResKp0bflOYsYPsZPuJ5WraKsk4IEEpesYHCyHW5AAb5HBJHeoSbVLh4Q== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -43,158 +43,158 @@ merge-stream "^2.0.0" micromatch "^4.0.2" -"@abp/bootstrap-datepicker@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-7.4.0.tgz#75edc2127ca26d86bfefaa6e37579b06e32de5de" - integrity sha512-HXUa+kLjKu8sKr+kCZeNye9Pv/swRfKGAt/uJ2WUEvCJ4IVIMM1p6iMnOEEk/+3OGE64/PWu3cdE9dLP6izOaA== +"@abp/bootstrap-datepicker@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-7.4.1.tgz#f8f35d0edf71368faaae4e40a72fa846b0084f9b" + integrity sha512-hsu8ty6c2oOevsNoyFTQ4yJAu27qnz82MgRNVS8MRfdzo05/LhBhy/tKFm+PFYJqZULYlpQ1GXUF2+uGyazIeg== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap-daterangepicker@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-7.4.0.tgz#5058fc2a9354f0a71ac5393658e362779a3bdc46" - integrity sha512-EK0wzZUY9H3XPb9U3DvYVqh48fU+6IneNGYOk7dcda8CUYObd4Dl1nXligStCqgn2uePtwxDHRx40eV0GXmU/Q== +"@abp/bootstrap-daterangepicker@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-7.4.1.tgz#b133cefdbed0fa1b8f1bda916a9d46952237238a" + integrity sha512-NpmbsO4Xg48Zmr8OOlf1fxuNMnFIqmRrkHiKp9lP5c8am64+7rRzCwATw2UY0Ud+4n8/ws+Iki1dwPQF6db1zw== dependencies: bootstrap-daterangepicker "^3.1.0" -"@abp/bootstrap@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-7.4.0.tgz#71be70660643d8f60d13d355b8c80b16e4854870" - integrity sha512-3Fa+fL5NH+0H2KK4MAaqNsiz0PYwK0+Oxjmd0NgKwcqV2vJzRrzS3WG5kITYjNz9QGdBV+FrhNX/NSRU8LDx3Q== +"@abp/bootstrap@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-7.4.1.tgz#b34a2fcc80e04212865652ee7f4f5498a6a61f6d" + integrity sha512-/qCgfrtNWZ2jui2iL6wd6MLrcxALSEFVBypaz1JK3WjEe7DvFAYvKLl7DugIv039/Sx3mbx/PJiQhx8CVZMsEA== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" bootstrap "^5.1.3" -"@abp/core@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-7.4.0.tgz#8505d446a3b4d80ce476bd3352c1639c7dc486ec" - integrity sha512-yxrnw6eAEIj/CcX5jAwb4xmCsdqWaG+KRcBA8GFvqXbsK94IjqLDiJ3flo+QhGn2DXo40ISxofZop0CgSbP7Ew== +"@abp/core@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-7.4.1.tgz#1d14899ad16aac038806504eb0a5be9318cdcc0c" + integrity sha512-p0BAe2kCtgZmq8pilahmuxmye8DeRXt2KmnFRbmYE3j4d0uComFZpC72QOD1iro8bkmbsHfsHJpiVg4Sp4licw== dependencies: - "@abp/utils" "~7.4.0" + "@abp/utils" "~7.4.1" -"@abp/datatables.net-bs5@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-7.4.0.tgz#52d22e12a2420b402e03148793707d063db0088d" - integrity sha512-VvQv5w0cUpdDD9jX8aUEaLxFrc4A95JlmFnhCYIV1etL8HNOdZvmOThxorsImk31JfpyVYrY/Ze/rnWi2uhVvQ== +"@abp/datatables.net-bs5@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-7.4.1.tgz#821ee4c5db116f9810d65184855cea1fa7d47360" + integrity sha512-jpUzb65lCGYAxs/1qV3pRP8agHwIgZA9gDrudvR8S/3X3kNQWtmeKoFDZ93mhnl3aWPjWFKVrT2LeQeJw5XO5A== dependencies: - "@abp/datatables.net" "~7.4.0" + "@abp/datatables.net" "~7.4.1" datatables.net-bs5 "^1.11.4" -"@abp/datatables.net@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-7.4.0.tgz#9f12a1bb2abd05cd753b5d937d8a0350b2ff74ae" - integrity sha512-StOkMmIkcBUWzD9ToZ5J/hISRWdxbAWjwn7RuFXsoHXcY03mmD86g2oztjrWC5UFnRdpFnsfspTpbNqXFB9Vag== +"@abp/datatables.net@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-7.4.1.tgz#a4501e92e9995da0759b9ce55756fe92c4e8db59" + integrity sha512-BZOOZLH7XrGlX3aFK97cwV9+npsTzALSBo87OgwO2U6UpeFq7yAOvmC0+L9dmIUDISeORn5IFc/zTsSSIQnpHQ== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" datatables.net "^1.11.4" -"@abp/font-awesome@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-7.4.0.tgz#50059083b88706a0f71f55118472b378e4c66163" - integrity sha512-hKoPyM41HHCK6dg+8pQvjYJWzKABBCXrYQAIneMPQZUZqa4JLObKCva9TR7pu6pUp+9OVzg4fQOBM+nwpHtw4g== +"@abp/font-awesome@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-7.4.1.tgz#f6175a989aa64367830723f1dd9c607906716296" + integrity sha512-/ybaz4KROwFdG4Xv0yMTUMXOreDmKy1lKQuntqHEUnIorhXmkgcd5AQQ5AolJ4NmNdPNt1VYrRcTEmdz3nw+FA== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" "@fortawesome/fontawesome-free" "^5.15.4" -"@abp/jquery-form@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-7.4.0.tgz#7ab3be241ee09f1e2843bd1b4d0b0b86d4446e30" - integrity sha512-OmTRuZ7QK1oe2ayNLqEpRJk4Ogk0wt/hIFtJHwQkCtDuCggoR5sQz4vn1vgrD19MxGq07dow5IgjbbhHv1vtEg== +"@abp/jquery-form@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-7.4.1.tgz#67978c41cda204b4c2027d81fc66844379313fa6" + integrity sha512-JZ1D47s/kpTlfMcpD4Jrlh98bhEDsIlWJauvAYaS0EBPIU9V2zHGQ+h9GPFbSPrXe4sYxPSREcsc8KUVMhT5MQ== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-7.4.0.tgz#0c564e39c4997dd9b8af7d2023615a06d6fd9834" - integrity sha512-vFB3RKkDlDXbHlDJ64uo3jWW1IRXwiCaPf+mcB77Wpt5+0Dn7eWqjBT7KyHBrsV08ghIqY/Q4nXntFJrmLcuEA== +"@abp/jquery-validation-unobtrusive@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-7.4.1.tgz#fe5c90ade419e83505884dd50dd5988d766f177b" + integrity sha512-oHHV/ukap+vDvQ8CnEWnOrrsLkHXIcMk+SjNKe/dyK5VzOVLDpMatRFmloLs2igYVXTqDGjmDlTswTFdJUarcQ== dependencies: - "@abp/jquery-validation" "~7.4.0" + "@abp/jquery-validation" "~7.4.1" jquery-validation-unobtrusive "^3.2.12" -"@abp/jquery-validation@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-7.4.0.tgz#f2aaba8f4c023e93f0051cc9a05c6d82fa5c7254" - integrity sha512-vN4srLT5UXAKXpKHbZgySWT+N2DjRYivgtifpZHMTGFLMW14W+tfi5zhR4H4JvqJpuO6ZKNiz15zA1zwEBK0Tw== +"@abp/jquery-validation@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-7.4.1.tgz#c2c06bc28770832a9ad73eac000586faed3bdbe3" + integrity sha512-A5iFT2EWfGHXrBb/ov5f0grZ2o2xkDaYtps/FnDUwBYdIdD8E7bbJsWp6ytvZDciO0XmEqAoVOxmiij7ue/SOg== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" jquery-validation "^1.19.3" -"@abp/jquery@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-7.4.0.tgz#206891b20f250537d05d907d2b6cd682fec76496" - integrity sha512-DeYo02T6WVhdpLloSPb6ooqtpksu1HtcbbQhIP9E1P7jHSzZoNiJvoKXHiFUcj5PYiGKl9d/o89hM/apWzyreQ== +"@abp/jquery@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-7.4.1.tgz#b5e16834e6c7871ad6392612ac8e2de8617eb353" + integrity sha512-X3RcovvRYISHcsb6W3U3iVsofw6yomoiouoB1tSIy2/tvUbu9n7N/3MM0CUujFm/xib7s3z1tVxFssS9smT7sw== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" jquery "~3.6.0" -"@abp/lodash@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-7.4.0.tgz#93f20abee776dbfa7aa45e2e710f2768f262fda5" - integrity sha512-h4Fnjm+VLwp1F3r57B9MrHhwyOYMo5oP285a85zzAYLkhwcDy7f1nbHKHMQ3ZTaeJVmiRnVaH+3sdUdslCRt5g== +"@abp/lodash@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-7.4.1.tgz#d0f84b7b9cbd989d59ebde594ed7acb8bc720b61" + integrity sha512-RFjZCyAPZnpvT0SJbxXzzmMYbuocSWBlezvjAVA8MiTrOXdZO4VyaTFjIuQcAdSrZhtpFGeYWxAjHshVplxMbw== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" lodash "^4.17.21" -"@abp/luxon@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-7.4.0.tgz#2ba7ff307c8f7c24d818a9c33635b86fd6810db9" - integrity sha512-ROCx7aihM+agdYy7Tkz+GiScx68KY5qwGTnj8P7QabGFChzVUic6RuBG+2Obmfonc6uT7Rq0c8JDGrsGNe/w8A== +"@abp/luxon@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-7.4.1.tgz#e0c0947d2b77f98b9cdaf7d1143025879361c3c9" + integrity sha512-k1wh8tT1529MtNC2gSXEIKdimBXBwubXeLisgpIPx6lkJo1Op6pAz2ERwFXeyktqGdYyuFcnewJIxmS7EPtWhg== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" luxon "^2.3.0" -"@abp/malihu-custom-scrollbar-plugin@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-7.4.0.tgz#aba68877481f4339e048f2ae3cfbe93197145a0a" - integrity sha512-Ntodhi4k0HFQmImYTP5SYf/WDm7aUGJLaGsfePm77HJ6DhGgalIGqtM8NiFXzo/3GmMY0XSo8Wxrs1mSCdtsOA== +"@abp/malihu-custom-scrollbar-plugin@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-7.4.1.tgz#aa7ec247197a258277549052780b38fd9e748c6c" + integrity sha512-pm/wIaiRSgGxelOf8AiL4JKFNZOQ6s2WbR6pULiP2HSNCgCpWYJ2s8fvj7VP3lAHIa98v3m8PSMSUhqaANxZ/Q== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/moment@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-7.4.0.tgz#2490d9c7cdcaeca8d0ba9ebef5e7298caf0c9e09" - integrity sha512-ftsUEgO17GbVawA1GplGFzEeIM4NX004AmS6/fPI3o5isX7o1buF9q9TXdnwUuFEJKZxS4KpveRqzTL5t9k0BQ== +"@abp/moment@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-7.4.1.tgz#1c28ccb13eecdd13695edf8641ca9867b318e37d" + integrity sha512-7vRJyAK5ER9z+LV1xUSAAtWlPlhv8yhM/nHjhC+IQSP/+V1D7VLA6EKxAEexGw7wX6HY8oMOWP9HxDHMb5hKQA== dependencies: moment "^2.9.0" -"@abp/select2@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-7.4.0.tgz#2f455cc991b7bb4df9ed426097bc2996cac12697" - integrity sha512-DwprX4MIoqMzSdh7eFg7EjGIz4ftYZub6jG9Sk3r+sxabbhpbFTxKOpXnhBWYi7L7uTQ8YDFk/5NeXO+Rm50Ww== +"@abp/select2@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-7.4.1.tgz#d7ea53cfec285a06278db362131b7510d5b73900" + integrity sha512-0S66iy7HuB74qqOSDraoF7UvXqz2PrnOKy+3EYMTMskOn4pWaq03JMR8xxEgZ8CtmsrqlE1a4wt1Yt9b3FIc0w== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" select2 "^4.0.13" -"@abp/sweetalert2@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-7.4.0.tgz#db1b4bd45cbabd61172591abc8ce223b5f607c4e" - integrity sha512-XqHPRnTASaRtbJIZYKW1KSKIJ8tynL8DuPCSMjcp4iyUlk+gnzxvbqXeNVjc2ojxj78T/42M/vITNoiiTYuKUw== +"@abp/sweetalert2@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-7.4.1.tgz#6722a40e5115cc341b7543aa0fa3b5a7ae9515b2" + integrity sha512-9jAHrYqCp5qykYfNNbqgESL6egixofVwonjZlb+lLWHAkIX+gQ2ApUNDFSXPtKUh2n9sXhSfF8SSg+BHP/bkCA== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" sweetalert2 "^11.3.6" -"@abp/timeago@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-7.4.0.tgz#245fe09370f38311a67a594c8a3c884aea59cc90" - integrity sha512-khxK6EICUaGCUM1HkACw/8rlPQNssoQvCK64bNqEHBCXgPUmTcqSj5MEGiNOYbgGyWeH2IAMtJEYPqX1g1wqSA== +"@abp/timeago@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-7.4.1.tgz#243d342ba131878ae7f892909c9cae07cf54902b" + integrity sha512-a0Vl2NFwTxzRmH5akWo8BRUxa6sK72z8OoXwUFkZOUqMWBCHK7ffNiN1/fbSgA+7HpSZdDvIthjYwBt57DxLdQ== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" timeago "^1.6.7" -"@abp/toastr@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-7.4.0.tgz#16ba0414a27c9a21bc7556a078b175445edcf608" - integrity sha512-oM4HT2m95cK/9sB4AEQAKUMSGBep6wZTgM/46+o2IvvMdMPrGR2mPu9V9wi3y817FRgY+/qQTfy5TZWyTuIpVQ== +"@abp/toastr@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-7.4.1.tgz#345545a41b6145e54477c6c376193a6dbd62bdda" + integrity sha512-OLCvPJYSrcT2spcq9nO838Q22VhJ63Kdzasz1HugdVNqgcFCCSsqaoXrJGUcf5GrZx7PNloz7uf1I3txYMeZtA== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" toastr "^2.1.4" -"@abp/utils@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-7.4.0.tgz#b31fb6e5dff07463535479a6bb62dc733d7119c8" - integrity sha512-CcR3tfuEsVM60DYL1A0cH6BkUTsasOoBDv/b63uLCoEOq/g8ntelD/SpRSgfDXK74P9M8OE5ZFxlXWDiYuzAFg== +"@abp/utils@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-7.4.1.tgz#2ce4c4d659c2ae9bc23b71b79fa3c6e120eaecaf" + integrity sha512-eFeoOXcz9cVkDKpOfd2VWmpAojASfsqfvACZqi1UmF16OcjsFIkxmIvhh1fpbT4A+eQLbaFFLIsf6gYb//tXhg== dependencies: just-compare "^2.3.0" diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/package.json b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/package.json index a4a8e6fff1..6d059608f6 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/package.json +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/package.json @@ -3,7 +3,7 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "~7.4.0", - "@abp/cms-kit": "7.4.0" + "@abp/aspnetcore.mvc.ui.theme.basic": "~7.4.1", + "@abp/cms-kit": "7.4.1" } } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/yarn.lock b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/yarn.lock index 87286d8e3c..8e20f36041 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/yarn.lock +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/yarn.lock @@ -2,39 +2,39 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-7.4.0.tgz#5088dd82ce343e1123e025848f09b51df988b225" - integrity sha512-teT7I0kgjek/lHzpTg5VOVCQ3IL26nFB43Aa/45fuaSwh9FJd3IJNXGL6xwp85oKaptDYSBXIF4GbrUfp2Ugqg== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~7.4.0" - -"@abp/aspnetcore.mvc.ui.theme.shared@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-7.4.0.tgz#e676444a46214e850b0d916daeeb912774ac381d" - integrity sha512-X+dgdgHGUTyf0zaSPsqQp2ZZWu2+9gIRT4r4/LDgxchHgfNvcKRF8jH/JICcVgGD1adJvZzzDpTefL8CuAIRJA== - dependencies: - "@abp/aspnetcore.mvc.ui" "~7.4.0" - "@abp/bootstrap" "~7.4.0" - "@abp/bootstrap-datepicker" "~7.4.0" - "@abp/bootstrap-daterangepicker" "~7.4.0" - "@abp/datatables.net-bs5" "~7.4.0" - "@abp/font-awesome" "~7.4.0" - "@abp/jquery-form" "~7.4.0" - "@abp/jquery-validation-unobtrusive" "~7.4.0" - "@abp/lodash" "~7.4.0" - "@abp/luxon" "~7.4.0" - "@abp/malihu-custom-scrollbar-plugin" "~7.4.0" - "@abp/moment" "~7.4.0" - "@abp/select2" "~7.4.0" - "@abp/sweetalert2" "~7.4.0" - "@abp/timeago" "~7.4.0" - "@abp/toastr" "~7.4.0" - -"@abp/aspnetcore.mvc.ui@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-7.4.0.tgz#61e1b52d2a940e02242f57007bd3f0fcb583c09a" - integrity sha512-gdoxOBo10DWDYhUq1GVfguC0Ot8PYhoA3VLf88/RatL88BNUUlt0e71uMFcx/gk72fuAE+o9zXn/6nq1wtpSwQ== +"@abp/aspnetcore.mvc.ui.theme.basic@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-7.4.1.tgz#62df78aab8a0b374817fdbab6c6363529b43f925" + integrity sha512-KaPmBlwNjOl1+vwLj5O8J11YHBSRg4y0IIxtgZiculXQNFPHbYAXm8sfTw6Wcsx00STrhvUVJQxYMePNnOTCTg== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~7.4.1" + +"@abp/aspnetcore.mvc.ui.theme.shared@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-7.4.1.tgz#8f8679f5cf80137324ddbec9fcaa67332783e708" + integrity sha512-0uUKuTsi/ikLFUUNEqvrn7KimgsvuK+7m1yZD4o47FQlgGxTyt1zQY9w3K6YyhyC3lsT6qCwiAPIoFOzPkIg/Q== + dependencies: + "@abp/aspnetcore.mvc.ui" "~7.4.1" + "@abp/bootstrap" "~7.4.1" + "@abp/bootstrap-datepicker" "~7.4.1" + "@abp/bootstrap-daterangepicker" "~7.4.1" + "@abp/datatables.net-bs5" "~7.4.1" + "@abp/font-awesome" "~7.4.1" + "@abp/jquery-form" "~7.4.1" + "@abp/jquery-validation-unobtrusive" "~7.4.1" + "@abp/lodash" "~7.4.1" + "@abp/luxon" "~7.4.1" + "@abp/malihu-custom-scrollbar-plugin" "~7.4.1" + "@abp/moment" "~7.4.1" + "@abp/select2" "~7.4.1" + "@abp/sweetalert2" "~7.4.1" + "@abp/timeago" "~7.4.1" + "@abp/toastr" "~7.4.1" + +"@abp/aspnetcore.mvc.ui@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-7.4.1.tgz#49c13718a17569f97b71f978b50f367dff67b8f7" + integrity sha512-EvYrfk0mpSt1jAMZmfFcHoNWEJskzResKp0bflOYsYPsZPuJ5WraKsk4IEEpesYHCyHW5AAb5HBJHeoSbVLh4Q== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -43,257 +43,257 @@ merge-stream "^2.0.0" micromatch "^4.0.2" -"@abp/bootstrap-datepicker@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-7.4.0.tgz#75edc2127ca26d86bfefaa6e37579b06e32de5de" - integrity sha512-HXUa+kLjKu8sKr+kCZeNye9Pv/swRfKGAt/uJ2WUEvCJ4IVIMM1p6iMnOEEk/+3OGE64/PWu3cdE9dLP6izOaA== +"@abp/bootstrap-datepicker@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-7.4.1.tgz#f8f35d0edf71368faaae4e40a72fa846b0084f9b" + integrity sha512-hsu8ty6c2oOevsNoyFTQ4yJAu27qnz82MgRNVS8MRfdzo05/LhBhy/tKFm+PFYJqZULYlpQ1GXUF2+uGyazIeg== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap-daterangepicker@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-7.4.0.tgz#5058fc2a9354f0a71ac5393658e362779a3bdc46" - integrity sha512-EK0wzZUY9H3XPb9U3DvYVqh48fU+6IneNGYOk7dcda8CUYObd4Dl1nXligStCqgn2uePtwxDHRx40eV0GXmU/Q== +"@abp/bootstrap-daterangepicker@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-7.4.1.tgz#b133cefdbed0fa1b8f1bda916a9d46952237238a" + integrity sha512-NpmbsO4Xg48Zmr8OOlf1fxuNMnFIqmRrkHiKp9lP5c8am64+7rRzCwATw2UY0Ud+4n8/ws+Iki1dwPQF6db1zw== dependencies: bootstrap-daterangepicker "^3.1.0" -"@abp/bootstrap@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-7.4.0.tgz#71be70660643d8f60d13d355b8c80b16e4854870" - integrity sha512-3Fa+fL5NH+0H2KK4MAaqNsiz0PYwK0+Oxjmd0NgKwcqV2vJzRrzS3WG5kITYjNz9QGdBV+FrhNX/NSRU8LDx3Q== +"@abp/bootstrap@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-7.4.1.tgz#b34a2fcc80e04212865652ee7f4f5498a6a61f6d" + integrity sha512-/qCgfrtNWZ2jui2iL6wd6MLrcxALSEFVBypaz1JK3WjEe7DvFAYvKLl7DugIv039/Sx3mbx/PJiQhx8CVZMsEA== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" bootstrap "^5.1.3" -"@abp/clipboard@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-7.4.0.tgz#f1d147df94ddf3ab53eeeb05aec3d5556064c5d6" - integrity sha512-z/nB1RQN/tmShSRwc9Fv1DsJSNM7+Zg4GnAtvZNpOHJp8LTVmsJWxLoUM7hF896W9E0JKr8tRuCVqulyh3IqKg== +"@abp/clipboard@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-7.4.1.tgz#31329ad4565b5075b486e9ca63fb0ff8a070ff9e" + integrity sha512-/+ylBPs/TEZdwywSSTnj96WoRJPwQnR6vlI+sX7h9wDfSDbMwuSSdETSnDVT21lkl8gonPONFZTL8D1u/KKAhg== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" clipboard "^2.0.8" -"@abp/cms-kit.admin@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/cms-kit.admin/-/cms-kit.admin-7.4.0.tgz#89465edaf6ccb44d517ca999dff68a9382bb3b36" - integrity sha512-QnCJF9YgzpS76cX1CXgeKGX41a5tltqf5tX/zryWaXyQxGgc/2gmVIT5NBsOABLNePmtAYGnF2GtwOygikOJCw== +"@abp/cms-kit.admin@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/cms-kit.admin/-/cms-kit.admin-7.4.1.tgz#aab06e7741b5cd5717ca2d1b4966a3ac1882646e" + integrity sha512-6mNdNp1m8dt/LK6HBDbaLs0DUnrAgWZVYWGGAc/ajrQPoZhw0gptqf4raAYnt0yDx+/30/Lw2cwsQQl5uAr5mw== dependencies: - "@abp/codemirror" "~7.4.0" - "@abp/jstree" "~7.4.0" - "@abp/slugify" "~7.4.0" - "@abp/tui-editor" "~7.4.0" - "@abp/uppy" "~7.4.0" + "@abp/codemirror" "~7.4.1" + "@abp/jstree" "~7.4.1" + "@abp/slugify" "~7.4.1" + "@abp/tui-editor" "~7.4.1" + "@abp/uppy" "~7.4.1" -"@abp/cms-kit.public@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/cms-kit.public/-/cms-kit.public-7.4.0.tgz#c13c7e7f155a76f699d6a32f918e74d83ebcdff9" - integrity sha512-5+RJRAH2AK+Do2iNo0KDEqgqt+UwtMpCzIn/Rpcgn+WtiqyJ9XNqn9A8mISasPtXzXvrZplQrSmCAjAUSm1AeA== +"@abp/cms-kit.public@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/cms-kit.public/-/cms-kit.public-7.4.1.tgz#b140eb556985f18e2482cd9422b262fdcad5e6d1" + integrity sha512-5sPirQw6dtnKYTdZuMV9+rH1/W4ZUu3Apo3DwzCLs+VDw6KyaA3TlgYBmtwzXzaAU/e1MDMDjtTumMZos7DeeQ== dependencies: - "@abp/highlight.js" "~7.4.0" - "@abp/star-rating-svg" "~7.4.0" + "@abp/highlight.js" "~7.4.1" + "@abp/star-rating-svg" "~7.4.1" -"@abp/cms-kit@7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/cms-kit/-/cms-kit-7.4.0.tgz#a385f344d08fb95ec163d132f10dbb6e1cc6643d" - integrity sha512-TPWR5vB3p/Ki3iXgM+jk+cdGNhnyzpkziDb4hIL5pOkNFWL7npNNCjlZvppGMzuq/lo31KW5VTBoL4Qf369S6Q== +"@abp/cms-kit@7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/cms-kit/-/cms-kit-7.4.1.tgz#d04ceb79c8593dcd478df0c7293e4f31076250c6" + integrity sha512-VfInnERSq2o5nTvX6VRaFlWIx/tkz31ObRe1XRUU2tafK2W3CWgT85OXft9X0+CeSTyg3LTId9Gy8vtJ2yHm8w== dependencies: - "@abp/cms-kit.admin" "~7.4.0" - "@abp/cms-kit.public" "~7.4.0" + "@abp/cms-kit.admin" "~7.4.1" + "@abp/cms-kit.public" "~7.4.1" -"@abp/codemirror@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/codemirror/-/codemirror-7.4.0.tgz#a7b0805b6db3ed011bed044cc986bf6d48c7a969" - integrity sha512-4+c8jVKFK0O3XZTCh07AcUQCqQhKKEMdvS1KwYbMWD8ZMA9LGAL4Dj+uhkLDrYkwHvtmcQtbw7q37Xlb+uTKJA== +"@abp/codemirror@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/codemirror/-/codemirror-7.4.1.tgz#ed501eaa95ad81bc83336eaff244fc2f70e8b133" + integrity sha512-EyxMJb3puv9jA4xMfQjRe6ZfsupZgQRg7+gxNXWEM8HyTbvrCPgRgrxlbN0KM9jeSAO8GiKgrOPhGpAeZks7sw== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" codemirror "^5.65.1" -"@abp/core@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-7.4.0.tgz#8505d446a3b4d80ce476bd3352c1639c7dc486ec" - integrity sha512-yxrnw6eAEIj/CcX5jAwb4xmCsdqWaG+KRcBA8GFvqXbsK94IjqLDiJ3flo+QhGn2DXo40ISxofZop0CgSbP7Ew== +"@abp/core@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-7.4.1.tgz#1d14899ad16aac038806504eb0a5be9318cdcc0c" + integrity sha512-p0BAe2kCtgZmq8pilahmuxmye8DeRXt2KmnFRbmYE3j4d0uComFZpC72QOD1iro8bkmbsHfsHJpiVg4Sp4licw== dependencies: - "@abp/utils" "~7.4.0" + "@abp/utils" "~7.4.1" -"@abp/datatables.net-bs5@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-7.4.0.tgz#52d22e12a2420b402e03148793707d063db0088d" - integrity sha512-VvQv5w0cUpdDD9jX8aUEaLxFrc4A95JlmFnhCYIV1etL8HNOdZvmOThxorsImk31JfpyVYrY/Ze/rnWi2uhVvQ== +"@abp/datatables.net-bs5@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-7.4.1.tgz#821ee4c5db116f9810d65184855cea1fa7d47360" + integrity sha512-jpUzb65lCGYAxs/1qV3pRP8agHwIgZA9gDrudvR8S/3X3kNQWtmeKoFDZ93mhnl3aWPjWFKVrT2LeQeJw5XO5A== dependencies: - "@abp/datatables.net" "~7.4.0" + "@abp/datatables.net" "~7.4.1" datatables.net-bs5 "^1.11.4" -"@abp/datatables.net@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-7.4.0.tgz#9f12a1bb2abd05cd753b5d937d8a0350b2ff74ae" - integrity sha512-StOkMmIkcBUWzD9ToZ5J/hISRWdxbAWjwn7RuFXsoHXcY03mmD86g2oztjrWC5UFnRdpFnsfspTpbNqXFB9Vag== +"@abp/datatables.net@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-7.4.1.tgz#a4501e92e9995da0759b9ce55756fe92c4e8db59" + integrity sha512-BZOOZLH7XrGlX3aFK97cwV9+npsTzALSBo87OgwO2U6UpeFq7yAOvmC0+L9dmIUDISeORn5IFc/zTsSSIQnpHQ== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" datatables.net "^1.11.4" -"@abp/font-awesome@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-7.4.0.tgz#50059083b88706a0f71f55118472b378e4c66163" - integrity sha512-hKoPyM41HHCK6dg+8pQvjYJWzKABBCXrYQAIneMPQZUZqa4JLObKCva9TR7pu6pUp+9OVzg4fQOBM+nwpHtw4g== +"@abp/font-awesome@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-7.4.1.tgz#f6175a989aa64367830723f1dd9c607906716296" + integrity sha512-/ybaz4KROwFdG4Xv0yMTUMXOreDmKy1lKQuntqHEUnIorhXmkgcd5AQQ5AolJ4NmNdPNt1VYrRcTEmdz3nw+FA== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" "@fortawesome/fontawesome-free" "^5.15.4" -"@abp/highlight.js@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/highlight.js/-/highlight.js-7.4.0.tgz#5e0e0a4ac26463450a8ac4453721fe7432f63fb5" - integrity sha512-AbFgsqRHcJUhjCPpYxJaM+cTNZCMCq7A8UAHfrVFH3bWqQAodYNqO4/qt9B2s0EDrG4QCD82ksX23cmdGk4O3g== +"@abp/highlight.js@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/highlight.js/-/highlight.js-7.4.1.tgz#33417a919b2bb1e5d0e001cade3441ef956a29a0" + integrity sha512-pCU6zORLDzOv4GS7+SMyXYR0yUaZXwkioBnLim5+FLGYoeXn4/Jus4wAGMTiMd0kq+oimMPzHlelUPqSzx92ZQ== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" "@highlightjs/cdn-assets" "~11.4.0" -"@abp/jquery-form@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-7.4.0.tgz#7ab3be241ee09f1e2843bd1b4d0b0b86d4446e30" - integrity sha512-OmTRuZ7QK1oe2ayNLqEpRJk4Ogk0wt/hIFtJHwQkCtDuCggoR5sQz4vn1vgrD19MxGq07dow5IgjbbhHv1vtEg== +"@abp/jquery-form@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-7.4.1.tgz#67978c41cda204b4c2027d81fc66844379313fa6" + integrity sha512-JZ1D47s/kpTlfMcpD4Jrlh98bhEDsIlWJauvAYaS0EBPIU9V2zHGQ+h9GPFbSPrXe4sYxPSREcsc8KUVMhT5MQ== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-7.4.0.tgz#0c564e39c4997dd9b8af7d2023615a06d6fd9834" - integrity sha512-vFB3RKkDlDXbHlDJ64uo3jWW1IRXwiCaPf+mcB77Wpt5+0Dn7eWqjBT7KyHBrsV08ghIqY/Q4nXntFJrmLcuEA== +"@abp/jquery-validation-unobtrusive@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-7.4.1.tgz#fe5c90ade419e83505884dd50dd5988d766f177b" + integrity sha512-oHHV/ukap+vDvQ8CnEWnOrrsLkHXIcMk+SjNKe/dyK5VzOVLDpMatRFmloLs2igYVXTqDGjmDlTswTFdJUarcQ== dependencies: - "@abp/jquery-validation" "~7.4.0" + "@abp/jquery-validation" "~7.4.1" jquery-validation-unobtrusive "^3.2.12" -"@abp/jquery-validation@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-7.4.0.tgz#f2aaba8f4c023e93f0051cc9a05c6d82fa5c7254" - integrity sha512-vN4srLT5UXAKXpKHbZgySWT+N2DjRYivgtifpZHMTGFLMW14W+tfi5zhR4H4JvqJpuO6ZKNiz15zA1zwEBK0Tw== +"@abp/jquery-validation@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-7.4.1.tgz#c2c06bc28770832a9ad73eac000586faed3bdbe3" + integrity sha512-A5iFT2EWfGHXrBb/ov5f0grZ2o2xkDaYtps/FnDUwBYdIdD8E7bbJsWp6ytvZDciO0XmEqAoVOxmiij7ue/SOg== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" jquery-validation "^1.19.3" -"@abp/jquery@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-7.4.0.tgz#206891b20f250537d05d907d2b6cd682fec76496" - integrity sha512-DeYo02T6WVhdpLloSPb6ooqtpksu1HtcbbQhIP9E1P7jHSzZoNiJvoKXHiFUcj5PYiGKl9d/o89hM/apWzyreQ== +"@abp/jquery@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-7.4.1.tgz#b5e16834e6c7871ad6392612ac8e2de8617eb353" + integrity sha512-X3RcovvRYISHcsb6W3U3iVsofw6yomoiouoB1tSIy2/tvUbu9n7N/3MM0CUujFm/xib7s3z1tVxFssS9smT7sw== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" jquery "~3.6.0" -"@abp/jstree@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jstree/-/jstree-7.4.0.tgz#67fa92c9f043c422fe87bb97dcc64ae597901f91" - integrity sha512-vDC+ZdK9OCSthbmw9P8+ezNtRG1KM3+t1S/0t50La24Wo37QVJuA4IeIPbhYxvZ8Urh9ZYphUqsNXylcXDWuZQ== +"@abp/jstree@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jstree/-/jstree-7.4.1.tgz#43dea84e32c07a29e4a7d770fedf03b2e6d0b07d" + integrity sha512-yf1r5vUF2bDl3MBW8ONY1COFYsLk0NMVS3XJzwVsaT99I+BfQ6Ll3EjWGYaieKNwWqzJfG2d8cJH/6Psn+MB0w== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" jstree "^3.3.12" -"@abp/lodash@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-7.4.0.tgz#93f20abee776dbfa7aa45e2e710f2768f262fda5" - integrity sha512-h4Fnjm+VLwp1F3r57B9MrHhwyOYMo5oP285a85zzAYLkhwcDy7f1nbHKHMQ3ZTaeJVmiRnVaH+3sdUdslCRt5g== +"@abp/lodash@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-7.4.1.tgz#d0f84b7b9cbd989d59ebde594ed7acb8bc720b61" + integrity sha512-RFjZCyAPZnpvT0SJbxXzzmMYbuocSWBlezvjAVA8MiTrOXdZO4VyaTFjIuQcAdSrZhtpFGeYWxAjHshVplxMbw== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" lodash "^4.17.21" -"@abp/luxon@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-7.4.0.tgz#2ba7ff307c8f7c24d818a9c33635b86fd6810db9" - integrity sha512-ROCx7aihM+agdYy7Tkz+GiScx68KY5qwGTnj8P7QabGFChzVUic6RuBG+2Obmfonc6uT7Rq0c8JDGrsGNe/w8A== +"@abp/luxon@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-7.4.1.tgz#e0c0947d2b77f98b9cdaf7d1143025879361c3c9" + integrity sha512-k1wh8tT1529MtNC2gSXEIKdimBXBwubXeLisgpIPx6lkJo1Op6pAz2ERwFXeyktqGdYyuFcnewJIxmS7EPtWhg== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" luxon "^2.3.0" -"@abp/malihu-custom-scrollbar-plugin@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-7.4.0.tgz#aba68877481f4339e048f2ae3cfbe93197145a0a" - integrity sha512-Ntodhi4k0HFQmImYTP5SYf/WDm7aUGJLaGsfePm77HJ6DhGgalIGqtM8NiFXzo/3GmMY0XSo8Wxrs1mSCdtsOA== +"@abp/malihu-custom-scrollbar-plugin@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-7.4.1.tgz#aa7ec247197a258277549052780b38fd9e748c6c" + integrity sha512-pm/wIaiRSgGxelOf8AiL4JKFNZOQ6s2WbR6pULiP2HSNCgCpWYJ2s8fvj7VP3lAHIa98v3m8PSMSUhqaANxZ/Q== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/moment@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-7.4.0.tgz#2490d9c7cdcaeca8d0ba9ebef5e7298caf0c9e09" - integrity sha512-ftsUEgO17GbVawA1GplGFzEeIM4NX004AmS6/fPI3o5isX7o1buF9q9TXdnwUuFEJKZxS4KpveRqzTL5t9k0BQ== +"@abp/moment@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-7.4.1.tgz#1c28ccb13eecdd13695edf8641ca9867b318e37d" + integrity sha512-7vRJyAK5ER9z+LV1xUSAAtWlPlhv8yhM/nHjhC+IQSP/+V1D7VLA6EKxAEexGw7wX6HY8oMOWP9HxDHMb5hKQA== dependencies: moment "^2.9.0" -"@abp/prismjs@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-7.4.0.tgz#8572f36f853c7054d77d02f3098cd844ee321ed7" - integrity sha512-y/Iy6pddQeVazEITktPot8JOPdAEOVAfmYkTBP3DIIPvoYr3kf6rwfzBUalMw5CEjWZ9BaIszDgFCk5ucNHHwQ== +"@abp/prismjs@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-7.4.1.tgz#df4387dbc2f0c77ddb9b6bd0ade9a5db29b9cee2" + integrity sha512-bI7pEKWy32aRYSb2ZziiH6Teebyd8km+1TXADy1yks9i9G5eLWe4/CSdwWpI4M+8ggM8CsdhrZ6/U+55BpXPQA== dependencies: - "@abp/clipboard" "~7.4.0" - "@abp/core" "~7.4.0" + "@abp/clipboard" "~7.4.1" + "@abp/core" "~7.4.1" prismjs "^1.26.0" -"@abp/select2@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-7.4.0.tgz#2f455cc991b7bb4df9ed426097bc2996cac12697" - integrity sha512-DwprX4MIoqMzSdh7eFg7EjGIz4ftYZub6jG9Sk3r+sxabbhpbFTxKOpXnhBWYi7L7uTQ8YDFk/5NeXO+Rm50Ww== +"@abp/select2@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-7.4.1.tgz#d7ea53cfec285a06278db362131b7510d5b73900" + integrity sha512-0S66iy7HuB74qqOSDraoF7UvXqz2PrnOKy+3EYMTMskOn4pWaq03JMR8xxEgZ8CtmsrqlE1a4wt1Yt9b3FIc0w== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" select2 "^4.0.13" -"@abp/slugify@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/slugify/-/slugify-7.4.0.tgz#7a174b6b526bbfa4f4916ad9350ea373ab2aa95c" - integrity sha512-F1XEkEJbgVv044CdYJi0msiqtu0Om+SwQuuTC3pt3x52eLFeJHhoKnoc1+kNijsh291boP3fJc53Jkkfx7nLhA== +"@abp/slugify@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/slugify/-/slugify-7.4.1.tgz#6d3d64cb84cd9d9d2e2a9846aa5ea057df631630" + integrity sha512-aXB+N7TfqdJlTWYO79UmowCohB4k02QK0BWB0XUHyoBjqMDs2+776+ETNxGdvmPg+Xql48+YT9GS8dSwA+VBkg== dependencies: slugify "^1.6.5" -"@abp/star-rating-svg@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/star-rating-svg/-/star-rating-svg-7.4.0.tgz#6c43454f60b259b4dd243ccc260d01b3cfe881a7" - integrity sha512-UJ/DgF1rK0hj4gjaGV+F9wOd2htkWNyb83RBbob23sTByLuFcibF/TJTLBErYbvZ05+KOU3+7pTq46EBw5mdtg== +"@abp/star-rating-svg@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/star-rating-svg/-/star-rating-svg-7.4.1.tgz#ac8fe734e5395fd2fb0079ca4ad1170a5e345a3c" + integrity sha512-avIu/3wTIHCkJiWBBA1Mfr70PuSu9ebnrp9igWdm3PdR6vlM8OI9Nfk+3YKuAAiHyDkL9WniQL0f50tY1ToI0Q== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" star-rating-svg "^3.5.0" -"@abp/sweetalert2@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-7.4.0.tgz#db1b4bd45cbabd61172591abc8ce223b5f607c4e" - integrity sha512-XqHPRnTASaRtbJIZYKW1KSKIJ8tynL8DuPCSMjcp4iyUlk+gnzxvbqXeNVjc2ojxj78T/42M/vITNoiiTYuKUw== +"@abp/sweetalert2@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-7.4.1.tgz#6722a40e5115cc341b7543aa0fa3b5a7ae9515b2" + integrity sha512-9jAHrYqCp5qykYfNNbqgESL6egixofVwonjZlb+lLWHAkIX+gQ2ApUNDFSXPtKUh2n9sXhSfF8SSg+BHP/bkCA== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" sweetalert2 "^11.3.6" -"@abp/timeago@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-7.4.0.tgz#245fe09370f38311a67a594c8a3c884aea59cc90" - integrity sha512-khxK6EICUaGCUM1HkACw/8rlPQNssoQvCK64bNqEHBCXgPUmTcqSj5MEGiNOYbgGyWeH2IAMtJEYPqX1g1wqSA== +"@abp/timeago@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-7.4.1.tgz#243d342ba131878ae7f892909c9cae07cf54902b" + integrity sha512-a0Vl2NFwTxzRmH5akWo8BRUxa6sK72z8OoXwUFkZOUqMWBCHK7ffNiN1/fbSgA+7HpSZdDvIthjYwBt57DxLdQ== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" timeago "^1.6.7" -"@abp/toastr@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-7.4.0.tgz#16ba0414a27c9a21bc7556a078b175445edcf608" - integrity sha512-oM4HT2m95cK/9sB4AEQAKUMSGBep6wZTgM/46+o2IvvMdMPrGR2mPu9V9wi3y817FRgY+/qQTfy5TZWyTuIpVQ== +"@abp/toastr@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-7.4.1.tgz#345545a41b6145e54477c6c376193a6dbd62bdda" + integrity sha512-OLCvPJYSrcT2spcq9nO838Q22VhJ63Kdzasz1HugdVNqgcFCCSsqaoXrJGUcf5GrZx7PNloz7uf1I3txYMeZtA== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" toastr "^2.1.4" -"@abp/tui-editor@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/tui-editor/-/tui-editor-7.4.0.tgz#831efd947b5a255d73365248e443d43f834c5a75" - integrity sha512-G/aCeG0lrFjEdE/YRbpFWuhuaGDFDqO5+/otIQSOxcR/bkjE1kLrdH5KDYGIa9QUaq7GbKn7yFnjrv9s5ajxzQ== +"@abp/tui-editor@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/tui-editor/-/tui-editor-7.4.1.tgz#4adaffcc3d62c7f2159d6acbca71e14780270277" + integrity sha512-0wiLq03+EB6or9uBbz1ZEWnOAoUjJqqFDONVEv2LtuqWlaiDwzILrSMxihTyFsLGrSAUdezfk2L83DoJT6SsVg== dependencies: - "@abp/jquery" "~7.4.0" - "@abp/prismjs" "~7.4.0" + "@abp/jquery" "~7.4.1" + "@abp/prismjs" "~7.4.1" -"@abp/uppy@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/uppy/-/uppy-7.4.0.tgz#015fc9966c2f6fa6ee77ecdf73a3e1a80cb625d3" - integrity sha512-/Hj5kCv+gRkylCvBlb3OHfI2cfLuI5+1o2C4L4HhoYmggrCuFf7L6vZGNaDa7LYOtENliLx3wAqpByv6Vd/onA== +"@abp/uppy@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/uppy/-/uppy-7.4.1.tgz#84f906e48711f28552f430239a5735184e589275" + integrity sha512-oCOxAzdYpc1QkwL2h+jBxL9xGF0aAYxcrmvzzYqHCyXC8NG/xEtLFCJvek6cCnSGS5W+v62ZuuyzM03N9ucGNg== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" uppy "^1.16.1" -"@abp/utils@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-7.4.0.tgz#b31fb6e5dff07463535479a6bb62dc733d7119c8" - integrity sha512-CcR3tfuEsVM60DYL1A0cH6BkUTsasOoBDv/b63uLCoEOq/g8ntelD/SpRSgfDXK74P9M8OE5ZFxlXWDiYuzAFg== +"@abp/utils@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-7.4.1.tgz#2ce4c4d659c2ae9bc23b71b79fa3c6e120eaecaf" + integrity sha512-eFeoOXcz9cVkDKpOfd2VWmpAojASfsqfvACZqi1UmF16OcjsFIkxmIvhh1fpbT4A+eQLbaFFLIsf6gYb//tXhg== dependencies: just-compare "^2.3.0" diff --git a/modules/docs/app/VoloDocs.Web/package.json b/modules/docs/app/VoloDocs.Web/package.json index c4e7f90755..9e3818c9b6 100644 --- a/modules/docs/app/VoloDocs.Web/package.json +++ b/modules/docs/app/VoloDocs.Web/package.json @@ -3,7 +3,7 @@ "name": "volo.docstestapp", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "~7.4.0", - "@abp/docs": "~7.4.0" + "@abp/aspnetcore.mvc.ui.theme.basic": "~7.4.1", + "@abp/docs": "~7.4.1" } } diff --git a/modules/docs/app/VoloDocs.Web/yarn.lock b/modules/docs/app/VoloDocs.Web/yarn.lock index dbd2162f5c..7c29d5a62d 100644 --- a/modules/docs/app/VoloDocs.Web/yarn.lock +++ b/modules/docs/app/VoloDocs.Web/yarn.lock @@ -2,47 +2,47 @@ # yarn lockfile v1 -"@abp/anchor-js@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/anchor-js/-/anchor-js-7.4.0.tgz#062faa10d670b70d16c8f6d208a24c63b4185489" - integrity sha512-Fmt97KeuzM8/QPaTdVGcgyBtNQc2oJT8ZoGbrZ9E0uTUUnzBSiIqEH2u2Voz5WaqfOrlAzpILHRjnVfwCMlErQ== +"@abp/anchor-js@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/anchor-js/-/anchor-js-7.4.1.tgz#d9323f8c943e6f02268b55daa0072294ef54b96d" + integrity sha512-72tE6OmE8aUeERGtgktF9bdZ6CFMc33obX8KMU5WL8FynzsJYCbLsggTUc8WCfi/AxuFAtqqxKU1TTjypWs2SQ== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" anchor-js "^4.3.1" -"@abp/aspnetcore.mvc.ui.theme.basic@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-7.4.0.tgz#5088dd82ce343e1123e025848f09b51df988b225" - integrity sha512-teT7I0kgjek/lHzpTg5VOVCQ3IL26nFB43Aa/45fuaSwh9FJd3IJNXGL6xwp85oKaptDYSBXIF4GbrUfp2Ugqg== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~7.4.0" - -"@abp/aspnetcore.mvc.ui.theme.shared@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-7.4.0.tgz#e676444a46214e850b0d916daeeb912774ac381d" - integrity sha512-X+dgdgHGUTyf0zaSPsqQp2ZZWu2+9gIRT4r4/LDgxchHgfNvcKRF8jH/JICcVgGD1adJvZzzDpTefL8CuAIRJA== - dependencies: - "@abp/aspnetcore.mvc.ui" "~7.4.0" - "@abp/bootstrap" "~7.4.0" - "@abp/bootstrap-datepicker" "~7.4.0" - "@abp/bootstrap-daterangepicker" "~7.4.0" - "@abp/datatables.net-bs5" "~7.4.0" - "@abp/font-awesome" "~7.4.0" - "@abp/jquery-form" "~7.4.0" - "@abp/jquery-validation-unobtrusive" "~7.4.0" - "@abp/lodash" "~7.4.0" - "@abp/luxon" "~7.4.0" - "@abp/malihu-custom-scrollbar-plugin" "~7.4.0" - "@abp/moment" "~7.4.0" - "@abp/select2" "~7.4.0" - "@abp/sweetalert2" "~7.4.0" - "@abp/timeago" "~7.4.0" - "@abp/toastr" "~7.4.0" - -"@abp/aspnetcore.mvc.ui@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-7.4.0.tgz#61e1b52d2a940e02242f57007bd3f0fcb583c09a" - integrity sha512-gdoxOBo10DWDYhUq1GVfguC0Ot8PYhoA3VLf88/RatL88BNUUlt0e71uMFcx/gk72fuAE+o9zXn/6nq1wtpSwQ== +"@abp/aspnetcore.mvc.ui.theme.basic@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-7.4.1.tgz#62df78aab8a0b374817fdbab6c6363529b43f925" + integrity sha512-KaPmBlwNjOl1+vwLj5O8J11YHBSRg4y0IIxtgZiculXQNFPHbYAXm8sfTw6Wcsx00STrhvUVJQxYMePNnOTCTg== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~7.4.1" + +"@abp/aspnetcore.mvc.ui.theme.shared@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-7.4.1.tgz#8f8679f5cf80137324ddbec9fcaa67332783e708" + integrity sha512-0uUKuTsi/ikLFUUNEqvrn7KimgsvuK+7m1yZD4o47FQlgGxTyt1zQY9w3K6YyhyC3lsT6qCwiAPIoFOzPkIg/Q== + dependencies: + "@abp/aspnetcore.mvc.ui" "~7.4.1" + "@abp/bootstrap" "~7.4.1" + "@abp/bootstrap-datepicker" "~7.4.1" + "@abp/bootstrap-daterangepicker" "~7.4.1" + "@abp/datatables.net-bs5" "~7.4.1" + "@abp/font-awesome" "~7.4.1" + "@abp/jquery-form" "~7.4.1" + "@abp/jquery-validation-unobtrusive" "~7.4.1" + "@abp/lodash" "~7.4.1" + "@abp/luxon" "~7.4.1" + "@abp/malihu-custom-scrollbar-plugin" "~7.4.1" + "@abp/moment" "~7.4.1" + "@abp/select2" "~7.4.1" + "@abp/sweetalert2" "~7.4.1" + "@abp/timeago" "~7.4.1" + "@abp/toastr" "~7.4.1" + +"@abp/aspnetcore.mvc.ui@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-7.4.1.tgz#49c13718a17569f97b71f978b50f367dff67b8f7" + integrity sha512-EvYrfk0mpSt1jAMZmfFcHoNWEJskzResKp0bflOYsYPsZPuJ5WraKsk4IEEpesYHCyHW5AAb5HBJHeoSbVLh4Q== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -51,194 +51,194 @@ merge-stream "^2.0.0" micromatch "^4.0.2" -"@abp/bootstrap-datepicker@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-7.4.0.tgz#75edc2127ca26d86bfefaa6e37579b06e32de5de" - integrity sha512-HXUa+kLjKu8sKr+kCZeNye9Pv/swRfKGAt/uJ2WUEvCJ4IVIMM1p6iMnOEEk/+3OGE64/PWu3cdE9dLP6izOaA== +"@abp/bootstrap-datepicker@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-7.4.1.tgz#f8f35d0edf71368faaae4e40a72fa846b0084f9b" + integrity sha512-hsu8ty6c2oOevsNoyFTQ4yJAu27qnz82MgRNVS8MRfdzo05/LhBhy/tKFm+PFYJqZULYlpQ1GXUF2+uGyazIeg== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap-daterangepicker@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-7.4.0.tgz#5058fc2a9354f0a71ac5393658e362779a3bdc46" - integrity sha512-EK0wzZUY9H3XPb9U3DvYVqh48fU+6IneNGYOk7dcda8CUYObd4Dl1nXligStCqgn2uePtwxDHRx40eV0GXmU/Q== +"@abp/bootstrap-daterangepicker@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-7.4.1.tgz#b133cefdbed0fa1b8f1bda916a9d46952237238a" + integrity sha512-NpmbsO4Xg48Zmr8OOlf1fxuNMnFIqmRrkHiKp9lP5c8am64+7rRzCwATw2UY0Ud+4n8/ws+Iki1dwPQF6db1zw== dependencies: bootstrap-daterangepicker "^3.1.0" -"@abp/bootstrap@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-7.4.0.tgz#71be70660643d8f60d13d355b8c80b16e4854870" - integrity sha512-3Fa+fL5NH+0H2KK4MAaqNsiz0PYwK0+Oxjmd0NgKwcqV2vJzRrzS3WG5kITYjNz9QGdBV+FrhNX/NSRU8LDx3Q== +"@abp/bootstrap@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-7.4.1.tgz#b34a2fcc80e04212865652ee7f4f5498a6a61f6d" + integrity sha512-/qCgfrtNWZ2jui2iL6wd6MLrcxALSEFVBypaz1JK3WjEe7DvFAYvKLl7DugIv039/Sx3mbx/PJiQhx8CVZMsEA== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" bootstrap "^5.1.3" -"@abp/clipboard@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-7.4.0.tgz#f1d147df94ddf3ab53eeeb05aec3d5556064c5d6" - integrity sha512-z/nB1RQN/tmShSRwc9Fv1DsJSNM7+Zg4GnAtvZNpOHJp8LTVmsJWxLoUM7hF896W9E0JKr8tRuCVqulyh3IqKg== +"@abp/clipboard@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-7.4.1.tgz#31329ad4565b5075b486e9ca63fb0ff8a070ff9e" + integrity sha512-/+ylBPs/TEZdwywSSTnj96WoRJPwQnR6vlI+sX7h9wDfSDbMwuSSdETSnDVT21lkl8gonPONFZTL8D1u/KKAhg== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" clipboard "^2.0.8" -"@abp/core@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-7.4.0.tgz#8505d446a3b4d80ce476bd3352c1639c7dc486ec" - integrity sha512-yxrnw6eAEIj/CcX5jAwb4xmCsdqWaG+KRcBA8GFvqXbsK94IjqLDiJ3flo+QhGn2DXo40ISxofZop0CgSbP7Ew== +"@abp/core@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-7.4.1.tgz#1d14899ad16aac038806504eb0a5be9318cdcc0c" + integrity sha512-p0BAe2kCtgZmq8pilahmuxmye8DeRXt2KmnFRbmYE3j4d0uComFZpC72QOD1iro8bkmbsHfsHJpiVg4Sp4licw== dependencies: - "@abp/utils" "~7.4.0" + "@abp/utils" "~7.4.1" -"@abp/datatables.net-bs5@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-7.4.0.tgz#52d22e12a2420b402e03148793707d063db0088d" - integrity sha512-VvQv5w0cUpdDD9jX8aUEaLxFrc4A95JlmFnhCYIV1etL8HNOdZvmOThxorsImk31JfpyVYrY/Ze/rnWi2uhVvQ== +"@abp/datatables.net-bs5@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-7.4.1.tgz#821ee4c5db116f9810d65184855cea1fa7d47360" + integrity sha512-jpUzb65lCGYAxs/1qV3pRP8agHwIgZA9gDrudvR8S/3X3kNQWtmeKoFDZ93mhnl3aWPjWFKVrT2LeQeJw5XO5A== dependencies: - "@abp/datatables.net" "~7.4.0" + "@abp/datatables.net" "~7.4.1" datatables.net-bs5 "^1.11.4" -"@abp/datatables.net@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-7.4.0.tgz#9f12a1bb2abd05cd753b5d937d8a0350b2ff74ae" - integrity sha512-StOkMmIkcBUWzD9ToZ5J/hISRWdxbAWjwn7RuFXsoHXcY03mmD86g2oztjrWC5UFnRdpFnsfspTpbNqXFB9Vag== +"@abp/datatables.net@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-7.4.1.tgz#a4501e92e9995da0759b9ce55756fe92c4e8db59" + integrity sha512-BZOOZLH7XrGlX3aFK97cwV9+npsTzALSBo87OgwO2U6UpeFq7yAOvmC0+L9dmIUDISeORn5IFc/zTsSSIQnpHQ== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" datatables.net "^1.11.4" -"@abp/docs@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/docs/-/docs-7.4.0.tgz#62a9c23a0d961838515cd30bcee22f16fd40e0a2" - integrity sha512-BfgB51s8qZuzeXydI+CJxC8ogTAmfI3OADN89LWUL5OPCyZa9YAtgaFOEKhYRZ+unY3Rn6wV+v67bMeMhFb5mw== +"@abp/docs@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/docs/-/docs-7.4.1.tgz#3dc2d04612baa7b414e9927853b8c50b5757553f" + integrity sha512-qaGvzmxiS0d1S9OOsCTK6qHeC+umKgCWS58F877eUHGOZWnnE7+ifChB27W1Y79Y87sQkqBYTOFIkq8iAXxwXg== dependencies: - "@abp/anchor-js" "~7.4.0" - "@abp/clipboard" "~7.4.0" - "@abp/malihu-custom-scrollbar-plugin" "~7.4.0" - "@abp/popper.js" "~7.4.0" - "@abp/prismjs" "~7.4.0" + "@abp/anchor-js" "~7.4.1" + "@abp/clipboard" "~7.4.1" + "@abp/malihu-custom-scrollbar-plugin" "~7.4.1" + "@abp/popper.js" "~7.4.1" + "@abp/prismjs" "~7.4.1" -"@abp/font-awesome@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-7.4.0.tgz#50059083b88706a0f71f55118472b378e4c66163" - integrity sha512-hKoPyM41HHCK6dg+8pQvjYJWzKABBCXrYQAIneMPQZUZqa4JLObKCva9TR7pu6pUp+9OVzg4fQOBM+nwpHtw4g== +"@abp/font-awesome@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-7.4.1.tgz#f6175a989aa64367830723f1dd9c607906716296" + integrity sha512-/ybaz4KROwFdG4Xv0yMTUMXOreDmKy1lKQuntqHEUnIorhXmkgcd5AQQ5AolJ4NmNdPNt1VYrRcTEmdz3nw+FA== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" "@fortawesome/fontawesome-free" "^5.15.4" -"@abp/jquery-form@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-7.4.0.tgz#7ab3be241ee09f1e2843bd1b4d0b0b86d4446e30" - integrity sha512-OmTRuZ7QK1oe2ayNLqEpRJk4Ogk0wt/hIFtJHwQkCtDuCggoR5sQz4vn1vgrD19MxGq07dow5IgjbbhHv1vtEg== +"@abp/jquery-form@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-7.4.1.tgz#67978c41cda204b4c2027d81fc66844379313fa6" + integrity sha512-JZ1D47s/kpTlfMcpD4Jrlh98bhEDsIlWJauvAYaS0EBPIU9V2zHGQ+h9GPFbSPrXe4sYxPSREcsc8KUVMhT5MQ== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-7.4.0.tgz#0c564e39c4997dd9b8af7d2023615a06d6fd9834" - integrity sha512-vFB3RKkDlDXbHlDJ64uo3jWW1IRXwiCaPf+mcB77Wpt5+0Dn7eWqjBT7KyHBrsV08ghIqY/Q4nXntFJrmLcuEA== +"@abp/jquery-validation-unobtrusive@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-7.4.1.tgz#fe5c90ade419e83505884dd50dd5988d766f177b" + integrity sha512-oHHV/ukap+vDvQ8CnEWnOrrsLkHXIcMk+SjNKe/dyK5VzOVLDpMatRFmloLs2igYVXTqDGjmDlTswTFdJUarcQ== dependencies: - "@abp/jquery-validation" "~7.4.0" + "@abp/jquery-validation" "~7.4.1" jquery-validation-unobtrusive "^3.2.12" -"@abp/jquery-validation@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-7.4.0.tgz#f2aaba8f4c023e93f0051cc9a05c6d82fa5c7254" - integrity sha512-vN4srLT5UXAKXpKHbZgySWT+N2DjRYivgtifpZHMTGFLMW14W+tfi5zhR4H4JvqJpuO6ZKNiz15zA1zwEBK0Tw== +"@abp/jquery-validation@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-7.4.1.tgz#c2c06bc28770832a9ad73eac000586faed3bdbe3" + integrity sha512-A5iFT2EWfGHXrBb/ov5f0grZ2o2xkDaYtps/FnDUwBYdIdD8E7bbJsWp6ytvZDciO0XmEqAoVOxmiij7ue/SOg== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" jquery-validation "^1.19.3" -"@abp/jquery@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-7.4.0.tgz#206891b20f250537d05d907d2b6cd682fec76496" - integrity sha512-DeYo02T6WVhdpLloSPb6ooqtpksu1HtcbbQhIP9E1P7jHSzZoNiJvoKXHiFUcj5PYiGKl9d/o89hM/apWzyreQ== +"@abp/jquery@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-7.4.1.tgz#b5e16834e6c7871ad6392612ac8e2de8617eb353" + integrity sha512-X3RcovvRYISHcsb6W3U3iVsofw6yomoiouoB1tSIy2/tvUbu9n7N/3MM0CUujFm/xib7s3z1tVxFssS9smT7sw== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" jquery "~3.6.0" -"@abp/lodash@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-7.4.0.tgz#93f20abee776dbfa7aa45e2e710f2768f262fda5" - integrity sha512-h4Fnjm+VLwp1F3r57B9MrHhwyOYMo5oP285a85zzAYLkhwcDy7f1nbHKHMQ3ZTaeJVmiRnVaH+3sdUdslCRt5g== +"@abp/lodash@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-7.4.1.tgz#d0f84b7b9cbd989d59ebde594ed7acb8bc720b61" + integrity sha512-RFjZCyAPZnpvT0SJbxXzzmMYbuocSWBlezvjAVA8MiTrOXdZO4VyaTFjIuQcAdSrZhtpFGeYWxAjHshVplxMbw== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" lodash "^4.17.21" -"@abp/luxon@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-7.4.0.tgz#2ba7ff307c8f7c24d818a9c33635b86fd6810db9" - integrity sha512-ROCx7aihM+agdYy7Tkz+GiScx68KY5qwGTnj8P7QabGFChzVUic6RuBG+2Obmfonc6uT7Rq0c8JDGrsGNe/w8A== +"@abp/luxon@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-7.4.1.tgz#e0c0947d2b77f98b9cdaf7d1143025879361c3c9" + integrity sha512-k1wh8tT1529MtNC2gSXEIKdimBXBwubXeLisgpIPx6lkJo1Op6pAz2ERwFXeyktqGdYyuFcnewJIxmS7EPtWhg== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" luxon "^2.3.0" -"@abp/malihu-custom-scrollbar-plugin@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-7.4.0.tgz#aba68877481f4339e048f2ae3cfbe93197145a0a" - integrity sha512-Ntodhi4k0HFQmImYTP5SYf/WDm7aUGJLaGsfePm77HJ6DhGgalIGqtM8NiFXzo/3GmMY0XSo8Wxrs1mSCdtsOA== +"@abp/malihu-custom-scrollbar-plugin@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-7.4.1.tgz#aa7ec247197a258277549052780b38fd9e748c6c" + integrity sha512-pm/wIaiRSgGxelOf8AiL4JKFNZOQ6s2WbR6pULiP2HSNCgCpWYJ2s8fvj7VP3lAHIa98v3m8PSMSUhqaANxZ/Q== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/moment@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-7.4.0.tgz#2490d9c7cdcaeca8d0ba9ebef5e7298caf0c9e09" - integrity sha512-ftsUEgO17GbVawA1GplGFzEeIM4NX004AmS6/fPI3o5isX7o1buF9q9TXdnwUuFEJKZxS4KpveRqzTL5t9k0BQ== +"@abp/moment@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-7.4.1.tgz#1c28ccb13eecdd13695edf8641ca9867b318e37d" + integrity sha512-7vRJyAK5ER9z+LV1xUSAAtWlPlhv8yhM/nHjhC+IQSP/+V1D7VLA6EKxAEexGw7wX6HY8oMOWP9HxDHMb5hKQA== dependencies: moment "^2.9.0" -"@abp/popper.js@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/popper.js/-/popper.js-7.4.0.tgz#523ec0341544947b8914bab1c9fdfbca1709cc16" - integrity sha512-A/d5SEbspqd5ixJe2dZELqSqMS/5K/WQ9orY5//mz3L0WS9YDqiRjJdyep9pR8jskD9q6Wg+q/rrdipG+LEgMQ== +"@abp/popper.js@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/popper.js/-/popper.js-7.4.1.tgz#db9ae010e87b0f2eb39cd277487100ffd4d08fd1" + integrity sha512-/tcVasfC5Tr0o2yBge7jxP2hfVcVYZoHjNnGAuIsFCvP4zpq65HkVam181QOoJXWMS6ibHJO6tRbYtIZ4ye4lQ== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" "@popperjs/core" "^2.11.2" -"@abp/prismjs@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-7.4.0.tgz#8572f36f853c7054d77d02f3098cd844ee321ed7" - integrity sha512-y/Iy6pddQeVazEITktPot8JOPdAEOVAfmYkTBP3DIIPvoYr3kf6rwfzBUalMw5CEjWZ9BaIszDgFCk5ucNHHwQ== +"@abp/prismjs@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-7.4.1.tgz#df4387dbc2f0c77ddb9b6bd0ade9a5db29b9cee2" + integrity sha512-bI7pEKWy32aRYSb2ZziiH6Teebyd8km+1TXADy1yks9i9G5eLWe4/CSdwWpI4M+8ggM8CsdhrZ6/U+55BpXPQA== dependencies: - "@abp/clipboard" "~7.4.0" - "@abp/core" "~7.4.0" + "@abp/clipboard" "~7.4.1" + "@abp/core" "~7.4.1" prismjs "^1.26.0" -"@abp/select2@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-7.4.0.tgz#2f455cc991b7bb4df9ed426097bc2996cac12697" - integrity sha512-DwprX4MIoqMzSdh7eFg7EjGIz4ftYZub6jG9Sk3r+sxabbhpbFTxKOpXnhBWYi7L7uTQ8YDFk/5NeXO+Rm50Ww== +"@abp/select2@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-7.4.1.tgz#d7ea53cfec285a06278db362131b7510d5b73900" + integrity sha512-0S66iy7HuB74qqOSDraoF7UvXqz2PrnOKy+3EYMTMskOn4pWaq03JMR8xxEgZ8CtmsrqlE1a4wt1Yt9b3FIc0w== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" select2 "^4.0.13" -"@abp/sweetalert2@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-7.4.0.tgz#db1b4bd45cbabd61172591abc8ce223b5f607c4e" - integrity sha512-XqHPRnTASaRtbJIZYKW1KSKIJ8tynL8DuPCSMjcp4iyUlk+gnzxvbqXeNVjc2ojxj78T/42M/vITNoiiTYuKUw== +"@abp/sweetalert2@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-7.4.1.tgz#6722a40e5115cc341b7543aa0fa3b5a7ae9515b2" + integrity sha512-9jAHrYqCp5qykYfNNbqgESL6egixofVwonjZlb+lLWHAkIX+gQ2ApUNDFSXPtKUh2n9sXhSfF8SSg+BHP/bkCA== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" sweetalert2 "^11.3.6" -"@abp/timeago@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-7.4.0.tgz#245fe09370f38311a67a594c8a3c884aea59cc90" - integrity sha512-khxK6EICUaGCUM1HkACw/8rlPQNssoQvCK64bNqEHBCXgPUmTcqSj5MEGiNOYbgGyWeH2IAMtJEYPqX1g1wqSA== +"@abp/timeago@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-7.4.1.tgz#243d342ba131878ae7f892909c9cae07cf54902b" + integrity sha512-a0Vl2NFwTxzRmH5akWo8BRUxa6sK72z8OoXwUFkZOUqMWBCHK7ffNiN1/fbSgA+7HpSZdDvIthjYwBt57DxLdQ== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" timeago "^1.6.7" -"@abp/toastr@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-7.4.0.tgz#16ba0414a27c9a21bc7556a078b175445edcf608" - integrity sha512-oM4HT2m95cK/9sB4AEQAKUMSGBep6wZTgM/46+o2IvvMdMPrGR2mPu9V9wi3y817FRgY+/qQTfy5TZWyTuIpVQ== +"@abp/toastr@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-7.4.1.tgz#345545a41b6145e54477c6c376193a6dbd62bdda" + integrity sha512-OLCvPJYSrcT2spcq9nO838Q22VhJ63Kdzasz1HugdVNqgcFCCSsqaoXrJGUcf5GrZx7PNloz7uf1I3txYMeZtA== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" toastr "^2.1.4" -"@abp/utils@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-7.4.0.tgz#b31fb6e5dff07463535479a6bb62dc733d7119c8" - integrity sha512-CcR3tfuEsVM60DYL1A0cH6BkUTsasOoBDv/b63uLCoEOq/g8ntelD/SpRSgfDXK74P9M8OE5ZFxlXWDiYuzAFg== +"@abp/utils@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-7.4.1.tgz#2ce4c4d659c2ae9bc23b71b79fa3c6e120eaecaf" + integrity sha512-eFeoOXcz9cVkDKpOfd2VWmpAojASfsqfvACZqi1UmF16OcjsFIkxmIvhh1fpbT4A+eQLbaFFLIsf6gYb//tXhg== dependencies: just-compare "^2.3.0" diff --git a/modules/openiddict/app/OpenIddict.Demo.Server/package.json b/modules/openiddict/app/OpenIddict.Demo.Server/package.json index 7fbc0569f6..212b67b1c1 100644 --- a/modules/openiddict/app/OpenIddict.Demo.Server/package.json +++ b/modules/openiddict/app/OpenIddict.Demo.Server/package.json @@ -3,6 +3,6 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "~7.4.0" + "@abp/aspnetcore.mvc.ui.theme.basic": "~7.4.1" } } diff --git a/modules/openiddict/app/angular/package.json b/modules/openiddict/app/angular/package.json index edbd2b95e3..67fe60fb32 100644 --- a/modules/openiddict/app/angular/package.json +++ b/modules/openiddict/app/angular/package.json @@ -12,15 +12,15 @@ }, "private": true, "dependencies": { - "@abp/ng.account": "~7.4.0", - "@abp/ng.components": "~7.4.0", - "@abp/ng.core": "~7.4.0", - "@abp/ng.oauth": "~7.4.0", - "@abp/ng.identity": "~7.4.0", - "@abp/ng.setting-management": "~7.4.0", - "@abp/ng.tenant-management": "~7.4.0", - "@abp/ng.theme.shared": "~7.4.0", - "@abp/ng.theme.lepton-x": "~2.4.0-rc.4", + "@abp/ng.account": "~7.4.1", + "@abp/ng.components": "~7.4.1", + "@abp/ng.core": "~7.4.1", + "@abp/ng.oauth": "~7.4.1", + "@abp/ng.identity": "~7.4.1", + "@abp/ng.setting-management": "~7.4.1", + "@abp/ng.tenant-management": "~7.4.1", + "@abp/ng.theme.shared": "~7.4.1", + "@abp/ng.theme.lepton-x": "~2.4.1", "@angular/animations": "^15.0.1", "@angular/common": "^15.0.1", "@angular/compiler": "^15.0.1", @@ -36,7 +36,7 @@ "zone.js": "~0.11.4" }, "devDependencies": { - "@abp/ng.schematics": "~7.4.0", + "@abp/ng.schematics": "~7.4.1", "@angular-devkit/build-angular": "^15.0.1", "@angular-eslint/builder": "~15.1.0", "@angular-eslint/eslint-plugin": "~15.1.0", diff --git a/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/package.json b/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/package.json index 90b3b47088..c8343aff2a 100644 --- a/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/package.json +++ b/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/package.json @@ -3,6 +3,6 @@ "name": "demo-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "~7.4.0" + "@abp/aspnetcore.mvc.ui.theme.basic": "~7.4.1" } } diff --git a/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/yarn.lock b/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/yarn.lock index 9c4c145174..8c3619aab1 100644 --- a/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/yarn.lock +++ b/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/yarn.lock @@ -2,39 +2,39 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-7.4.0.tgz#5088dd82ce343e1123e025848f09b51df988b225" - integrity sha512-teT7I0kgjek/lHzpTg5VOVCQ3IL26nFB43Aa/45fuaSwh9FJd3IJNXGL6xwp85oKaptDYSBXIF4GbrUfp2Ugqg== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~7.4.0" - -"@abp/aspnetcore.mvc.ui.theme.shared@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-7.4.0.tgz#e676444a46214e850b0d916daeeb912774ac381d" - integrity sha512-X+dgdgHGUTyf0zaSPsqQp2ZZWu2+9gIRT4r4/LDgxchHgfNvcKRF8jH/JICcVgGD1adJvZzzDpTefL8CuAIRJA== - dependencies: - "@abp/aspnetcore.mvc.ui" "~7.4.0" - "@abp/bootstrap" "~7.4.0" - "@abp/bootstrap-datepicker" "~7.4.0" - "@abp/bootstrap-daterangepicker" "~7.4.0" - "@abp/datatables.net-bs5" "~7.4.0" - "@abp/font-awesome" "~7.4.0" - "@abp/jquery-form" "~7.4.0" - "@abp/jquery-validation-unobtrusive" "~7.4.0" - "@abp/lodash" "~7.4.0" - "@abp/luxon" "~7.4.0" - "@abp/malihu-custom-scrollbar-plugin" "~7.4.0" - "@abp/moment" "~7.4.0" - "@abp/select2" "~7.4.0" - "@abp/sweetalert2" "~7.4.0" - "@abp/timeago" "~7.4.0" - "@abp/toastr" "~7.4.0" - -"@abp/aspnetcore.mvc.ui@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-7.4.0.tgz#61e1b52d2a940e02242f57007bd3f0fcb583c09a" - integrity sha512-gdoxOBo10DWDYhUq1GVfguC0Ot8PYhoA3VLf88/RatL88BNUUlt0e71uMFcx/gk72fuAE+o9zXn/6nq1wtpSwQ== +"@abp/aspnetcore.mvc.ui.theme.basic@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-7.4.1.tgz#62df78aab8a0b374817fdbab6c6363529b43f925" + integrity sha512-KaPmBlwNjOl1+vwLj5O8J11YHBSRg4y0IIxtgZiculXQNFPHbYAXm8sfTw6Wcsx00STrhvUVJQxYMePNnOTCTg== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~7.4.1" + +"@abp/aspnetcore.mvc.ui.theme.shared@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-7.4.1.tgz#8f8679f5cf80137324ddbec9fcaa67332783e708" + integrity sha512-0uUKuTsi/ikLFUUNEqvrn7KimgsvuK+7m1yZD4o47FQlgGxTyt1zQY9w3K6YyhyC3lsT6qCwiAPIoFOzPkIg/Q== + dependencies: + "@abp/aspnetcore.mvc.ui" "~7.4.1" + "@abp/bootstrap" "~7.4.1" + "@abp/bootstrap-datepicker" "~7.4.1" + "@abp/bootstrap-daterangepicker" "~7.4.1" + "@abp/datatables.net-bs5" "~7.4.1" + "@abp/font-awesome" "~7.4.1" + "@abp/jquery-form" "~7.4.1" + "@abp/jquery-validation-unobtrusive" "~7.4.1" + "@abp/lodash" "~7.4.1" + "@abp/luxon" "~7.4.1" + "@abp/malihu-custom-scrollbar-plugin" "~7.4.1" + "@abp/moment" "~7.4.1" + "@abp/select2" "~7.4.1" + "@abp/sweetalert2" "~7.4.1" + "@abp/timeago" "~7.4.1" + "@abp/toastr" "~7.4.1" + +"@abp/aspnetcore.mvc.ui@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-7.4.1.tgz#49c13718a17569f97b71f978b50f367dff67b8f7" + integrity sha512-EvYrfk0mpSt1jAMZmfFcHoNWEJskzResKp0bflOYsYPsZPuJ5WraKsk4IEEpesYHCyHW5AAb5HBJHeoSbVLh4Q== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -43,158 +43,158 @@ merge-stream "^2.0.0" micromatch "^4.0.2" -"@abp/bootstrap-datepicker@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-7.4.0.tgz#75edc2127ca26d86bfefaa6e37579b06e32de5de" - integrity sha512-HXUa+kLjKu8sKr+kCZeNye9Pv/swRfKGAt/uJ2WUEvCJ4IVIMM1p6iMnOEEk/+3OGE64/PWu3cdE9dLP6izOaA== +"@abp/bootstrap-datepicker@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-7.4.1.tgz#f8f35d0edf71368faaae4e40a72fa846b0084f9b" + integrity sha512-hsu8ty6c2oOevsNoyFTQ4yJAu27qnz82MgRNVS8MRfdzo05/LhBhy/tKFm+PFYJqZULYlpQ1GXUF2+uGyazIeg== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap-daterangepicker@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-7.4.0.tgz#5058fc2a9354f0a71ac5393658e362779a3bdc46" - integrity sha512-EK0wzZUY9H3XPb9U3DvYVqh48fU+6IneNGYOk7dcda8CUYObd4Dl1nXligStCqgn2uePtwxDHRx40eV0GXmU/Q== +"@abp/bootstrap-daterangepicker@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-7.4.1.tgz#b133cefdbed0fa1b8f1bda916a9d46952237238a" + integrity sha512-NpmbsO4Xg48Zmr8OOlf1fxuNMnFIqmRrkHiKp9lP5c8am64+7rRzCwATw2UY0Ud+4n8/ws+Iki1dwPQF6db1zw== dependencies: bootstrap-daterangepicker "^3.1.0" -"@abp/bootstrap@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-7.4.0.tgz#71be70660643d8f60d13d355b8c80b16e4854870" - integrity sha512-3Fa+fL5NH+0H2KK4MAaqNsiz0PYwK0+Oxjmd0NgKwcqV2vJzRrzS3WG5kITYjNz9QGdBV+FrhNX/NSRU8LDx3Q== +"@abp/bootstrap@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-7.4.1.tgz#b34a2fcc80e04212865652ee7f4f5498a6a61f6d" + integrity sha512-/qCgfrtNWZ2jui2iL6wd6MLrcxALSEFVBypaz1JK3WjEe7DvFAYvKLl7DugIv039/Sx3mbx/PJiQhx8CVZMsEA== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" bootstrap "^5.1.3" -"@abp/core@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-7.4.0.tgz#8505d446a3b4d80ce476bd3352c1639c7dc486ec" - integrity sha512-yxrnw6eAEIj/CcX5jAwb4xmCsdqWaG+KRcBA8GFvqXbsK94IjqLDiJ3flo+QhGn2DXo40ISxofZop0CgSbP7Ew== +"@abp/core@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-7.4.1.tgz#1d14899ad16aac038806504eb0a5be9318cdcc0c" + integrity sha512-p0BAe2kCtgZmq8pilahmuxmye8DeRXt2KmnFRbmYE3j4d0uComFZpC72QOD1iro8bkmbsHfsHJpiVg4Sp4licw== dependencies: - "@abp/utils" "~7.4.0" + "@abp/utils" "~7.4.1" -"@abp/datatables.net-bs5@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-7.4.0.tgz#52d22e12a2420b402e03148793707d063db0088d" - integrity sha512-VvQv5w0cUpdDD9jX8aUEaLxFrc4A95JlmFnhCYIV1etL8HNOdZvmOThxorsImk31JfpyVYrY/Ze/rnWi2uhVvQ== +"@abp/datatables.net-bs5@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-7.4.1.tgz#821ee4c5db116f9810d65184855cea1fa7d47360" + integrity sha512-jpUzb65lCGYAxs/1qV3pRP8agHwIgZA9gDrudvR8S/3X3kNQWtmeKoFDZ93mhnl3aWPjWFKVrT2LeQeJw5XO5A== dependencies: - "@abp/datatables.net" "~7.4.0" + "@abp/datatables.net" "~7.4.1" datatables.net-bs5 "^1.11.4" -"@abp/datatables.net@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-7.4.0.tgz#9f12a1bb2abd05cd753b5d937d8a0350b2ff74ae" - integrity sha512-StOkMmIkcBUWzD9ToZ5J/hISRWdxbAWjwn7RuFXsoHXcY03mmD86g2oztjrWC5UFnRdpFnsfspTpbNqXFB9Vag== +"@abp/datatables.net@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-7.4.1.tgz#a4501e92e9995da0759b9ce55756fe92c4e8db59" + integrity sha512-BZOOZLH7XrGlX3aFK97cwV9+npsTzALSBo87OgwO2U6UpeFq7yAOvmC0+L9dmIUDISeORn5IFc/zTsSSIQnpHQ== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" datatables.net "^1.11.4" -"@abp/font-awesome@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-7.4.0.tgz#50059083b88706a0f71f55118472b378e4c66163" - integrity sha512-hKoPyM41HHCK6dg+8pQvjYJWzKABBCXrYQAIneMPQZUZqa4JLObKCva9TR7pu6pUp+9OVzg4fQOBM+nwpHtw4g== +"@abp/font-awesome@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-7.4.1.tgz#f6175a989aa64367830723f1dd9c607906716296" + integrity sha512-/ybaz4KROwFdG4Xv0yMTUMXOreDmKy1lKQuntqHEUnIorhXmkgcd5AQQ5AolJ4NmNdPNt1VYrRcTEmdz3nw+FA== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" "@fortawesome/fontawesome-free" "^5.15.4" -"@abp/jquery-form@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-7.4.0.tgz#7ab3be241ee09f1e2843bd1b4d0b0b86d4446e30" - integrity sha512-OmTRuZ7QK1oe2ayNLqEpRJk4Ogk0wt/hIFtJHwQkCtDuCggoR5sQz4vn1vgrD19MxGq07dow5IgjbbhHv1vtEg== +"@abp/jquery-form@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-7.4.1.tgz#67978c41cda204b4c2027d81fc66844379313fa6" + integrity sha512-JZ1D47s/kpTlfMcpD4Jrlh98bhEDsIlWJauvAYaS0EBPIU9V2zHGQ+h9GPFbSPrXe4sYxPSREcsc8KUVMhT5MQ== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-7.4.0.tgz#0c564e39c4997dd9b8af7d2023615a06d6fd9834" - integrity sha512-vFB3RKkDlDXbHlDJ64uo3jWW1IRXwiCaPf+mcB77Wpt5+0Dn7eWqjBT7KyHBrsV08ghIqY/Q4nXntFJrmLcuEA== +"@abp/jquery-validation-unobtrusive@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-7.4.1.tgz#fe5c90ade419e83505884dd50dd5988d766f177b" + integrity sha512-oHHV/ukap+vDvQ8CnEWnOrrsLkHXIcMk+SjNKe/dyK5VzOVLDpMatRFmloLs2igYVXTqDGjmDlTswTFdJUarcQ== dependencies: - "@abp/jquery-validation" "~7.4.0" + "@abp/jquery-validation" "~7.4.1" jquery-validation-unobtrusive "^3.2.12" -"@abp/jquery-validation@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-7.4.0.tgz#f2aaba8f4c023e93f0051cc9a05c6d82fa5c7254" - integrity sha512-vN4srLT5UXAKXpKHbZgySWT+N2DjRYivgtifpZHMTGFLMW14W+tfi5zhR4H4JvqJpuO6ZKNiz15zA1zwEBK0Tw== +"@abp/jquery-validation@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-7.4.1.tgz#c2c06bc28770832a9ad73eac000586faed3bdbe3" + integrity sha512-A5iFT2EWfGHXrBb/ov5f0grZ2o2xkDaYtps/FnDUwBYdIdD8E7bbJsWp6ytvZDciO0XmEqAoVOxmiij7ue/SOg== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" jquery-validation "^1.19.3" -"@abp/jquery@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-7.4.0.tgz#206891b20f250537d05d907d2b6cd682fec76496" - integrity sha512-DeYo02T6WVhdpLloSPb6ooqtpksu1HtcbbQhIP9E1P7jHSzZoNiJvoKXHiFUcj5PYiGKl9d/o89hM/apWzyreQ== +"@abp/jquery@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-7.4.1.tgz#b5e16834e6c7871ad6392612ac8e2de8617eb353" + integrity sha512-X3RcovvRYISHcsb6W3U3iVsofw6yomoiouoB1tSIy2/tvUbu9n7N/3MM0CUujFm/xib7s3z1tVxFssS9smT7sw== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" jquery "~3.6.0" -"@abp/lodash@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-7.4.0.tgz#93f20abee776dbfa7aa45e2e710f2768f262fda5" - integrity sha512-h4Fnjm+VLwp1F3r57B9MrHhwyOYMo5oP285a85zzAYLkhwcDy7f1nbHKHMQ3ZTaeJVmiRnVaH+3sdUdslCRt5g== +"@abp/lodash@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-7.4.1.tgz#d0f84b7b9cbd989d59ebde594ed7acb8bc720b61" + integrity sha512-RFjZCyAPZnpvT0SJbxXzzmMYbuocSWBlezvjAVA8MiTrOXdZO4VyaTFjIuQcAdSrZhtpFGeYWxAjHshVplxMbw== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" lodash "^4.17.21" -"@abp/luxon@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-7.4.0.tgz#2ba7ff307c8f7c24d818a9c33635b86fd6810db9" - integrity sha512-ROCx7aihM+agdYy7Tkz+GiScx68KY5qwGTnj8P7QabGFChzVUic6RuBG+2Obmfonc6uT7Rq0c8JDGrsGNe/w8A== +"@abp/luxon@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-7.4.1.tgz#e0c0947d2b77f98b9cdaf7d1143025879361c3c9" + integrity sha512-k1wh8tT1529MtNC2gSXEIKdimBXBwubXeLisgpIPx6lkJo1Op6pAz2ERwFXeyktqGdYyuFcnewJIxmS7EPtWhg== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" luxon "^2.3.0" -"@abp/malihu-custom-scrollbar-plugin@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-7.4.0.tgz#aba68877481f4339e048f2ae3cfbe93197145a0a" - integrity sha512-Ntodhi4k0HFQmImYTP5SYf/WDm7aUGJLaGsfePm77HJ6DhGgalIGqtM8NiFXzo/3GmMY0XSo8Wxrs1mSCdtsOA== +"@abp/malihu-custom-scrollbar-plugin@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-7.4.1.tgz#aa7ec247197a258277549052780b38fd9e748c6c" + integrity sha512-pm/wIaiRSgGxelOf8AiL4JKFNZOQ6s2WbR6pULiP2HSNCgCpWYJ2s8fvj7VP3lAHIa98v3m8PSMSUhqaANxZ/Q== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/moment@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-7.4.0.tgz#2490d9c7cdcaeca8d0ba9ebef5e7298caf0c9e09" - integrity sha512-ftsUEgO17GbVawA1GplGFzEeIM4NX004AmS6/fPI3o5isX7o1buF9q9TXdnwUuFEJKZxS4KpveRqzTL5t9k0BQ== +"@abp/moment@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-7.4.1.tgz#1c28ccb13eecdd13695edf8641ca9867b318e37d" + integrity sha512-7vRJyAK5ER9z+LV1xUSAAtWlPlhv8yhM/nHjhC+IQSP/+V1D7VLA6EKxAEexGw7wX6HY8oMOWP9HxDHMb5hKQA== dependencies: moment "^2.9.0" -"@abp/select2@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-7.4.0.tgz#2f455cc991b7bb4df9ed426097bc2996cac12697" - integrity sha512-DwprX4MIoqMzSdh7eFg7EjGIz4ftYZub6jG9Sk3r+sxabbhpbFTxKOpXnhBWYi7L7uTQ8YDFk/5NeXO+Rm50Ww== +"@abp/select2@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-7.4.1.tgz#d7ea53cfec285a06278db362131b7510d5b73900" + integrity sha512-0S66iy7HuB74qqOSDraoF7UvXqz2PrnOKy+3EYMTMskOn4pWaq03JMR8xxEgZ8CtmsrqlE1a4wt1Yt9b3FIc0w== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" select2 "^4.0.13" -"@abp/sweetalert2@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-7.4.0.tgz#db1b4bd45cbabd61172591abc8ce223b5f607c4e" - integrity sha512-XqHPRnTASaRtbJIZYKW1KSKIJ8tynL8DuPCSMjcp4iyUlk+gnzxvbqXeNVjc2ojxj78T/42M/vITNoiiTYuKUw== +"@abp/sweetalert2@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-7.4.1.tgz#6722a40e5115cc341b7543aa0fa3b5a7ae9515b2" + integrity sha512-9jAHrYqCp5qykYfNNbqgESL6egixofVwonjZlb+lLWHAkIX+gQ2ApUNDFSXPtKUh2n9sXhSfF8SSg+BHP/bkCA== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" sweetalert2 "^11.3.6" -"@abp/timeago@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-7.4.0.tgz#245fe09370f38311a67a594c8a3c884aea59cc90" - integrity sha512-khxK6EICUaGCUM1HkACw/8rlPQNssoQvCK64bNqEHBCXgPUmTcqSj5MEGiNOYbgGyWeH2IAMtJEYPqX1g1wqSA== +"@abp/timeago@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-7.4.1.tgz#243d342ba131878ae7f892909c9cae07cf54902b" + integrity sha512-a0Vl2NFwTxzRmH5akWo8BRUxa6sK72z8OoXwUFkZOUqMWBCHK7ffNiN1/fbSgA+7HpSZdDvIthjYwBt57DxLdQ== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" timeago "^1.6.7" -"@abp/toastr@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-7.4.0.tgz#16ba0414a27c9a21bc7556a078b175445edcf608" - integrity sha512-oM4HT2m95cK/9sB4AEQAKUMSGBep6wZTgM/46+o2IvvMdMPrGR2mPu9V9wi3y817FRgY+/qQTfy5TZWyTuIpVQ== +"@abp/toastr@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-7.4.1.tgz#345545a41b6145e54477c6c376193a6dbd62bdda" + integrity sha512-OLCvPJYSrcT2spcq9nO838Q22VhJ63Kdzasz1HugdVNqgcFCCSsqaoXrJGUcf5GrZx7PNloz7uf1I3txYMeZtA== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" toastr "^2.1.4" -"@abp/utils@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-7.4.0.tgz#b31fb6e5dff07463535479a6bb62dc733d7119c8" - integrity sha512-CcR3tfuEsVM60DYL1A0cH6BkUTsasOoBDv/b63uLCoEOq/g8ntelD/SpRSgfDXK74P9M8OE5ZFxlXWDiYuzAFg== +"@abp/utils@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-7.4.1.tgz#2ce4c4d659c2ae9bc23b71b79fa3c6e120eaecaf" + integrity sha512-eFeoOXcz9cVkDKpOfd2VWmpAojASfsqfvACZqi1UmF16OcjsFIkxmIvhh1fpbT4A+eQLbaFFLIsf6gYb//tXhg== dependencies: just-compare "^2.3.0" diff --git a/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/package.json b/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/package.json index 27a4565870..f051a7f998 100644 --- a/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/package.json +++ b/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/package.json @@ -3,7 +3,7 @@ "version": "1.0.0", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "~7.4.0", - "@abp/virtual-file-explorer": "~7.4.0" + "@abp/aspnetcore.mvc.ui.theme.basic": "~7.4.1", + "@abp/virtual-file-explorer": "~7.4.1" } } diff --git a/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/yarn.lock b/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/yarn.lock index 7f768e6d3a..bb5e53de55 100644 --- a/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/yarn.lock +++ b/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/yarn.lock @@ -2,39 +2,39 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-7.4.0.tgz#5088dd82ce343e1123e025848f09b51df988b225" - integrity sha512-teT7I0kgjek/lHzpTg5VOVCQ3IL26nFB43Aa/45fuaSwh9FJd3IJNXGL6xwp85oKaptDYSBXIF4GbrUfp2Ugqg== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~7.4.0" - -"@abp/aspnetcore.mvc.ui.theme.shared@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-7.4.0.tgz#e676444a46214e850b0d916daeeb912774ac381d" - integrity sha512-X+dgdgHGUTyf0zaSPsqQp2ZZWu2+9gIRT4r4/LDgxchHgfNvcKRF8jH/JICcVgGD1adJvZzzDpTefL8CuAIRJA== - dependencies: - "@abp/aspnetcore.mvc.ui" "~7.4.0" - "@abp/bootstrap" "~7.4.0" - "@abp/bootstrap-datepicker" "~7.4.0" - "@abp/bootstrap-daterangepicker" "~7.4.0" - "@abp/datatables.net-bs5" "~7.4.0" - "@abp/font-awesome" "~7.4.0" - "@abp/jquery-form" "~7.4.0" - "@abp/jquery-validation-unobtrusive" "~7.4.0" - "@abp/lodash" "~7.4.0" - "@abp/luxon" "~7.4.0" - "@abp/malihu-custom-scrollbar-plugin" "~7.4.0" - "@abp/moment" "~7.4.0" - "@abp/select2" "~7.4.0" - "@abp/sweetalert2" "~7.4.0" - "@abp/timeago" "~7.4.0" - "@abp/toastr" "~7.4.0" - -"@abp/aspnetcore.mvc.ui@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-7.4.0.tgz#61e1b52d2a940e02242f57007bd3f0fcb583c09a" - integrity sha512-gdoxOBo10DWDYhUq1GVfguC0Ot8PYhoA3VLf88/RatL88BNUUlt0e71uMFcx/gk72fuAE+o9zXn/6nq1wtpSwQ== +"@abp/aspnetcore.mvc.ui.theme.basic@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-7.4.1.tgz#62df78aab8a0b374817fdbab6c6363529b43f925" + integrity sha512-KaPmBlwNjOl1+vwLj5O8J11YHBSRg4y0IIxtgZiculXQNFPHbYAXm8sfTw6Wcsx00STrhvUVJQxYMePNnOTCTg== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~7.4.1" + +"@abp/aspnetcore.mvc.ui.theme.shared@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-7.4.1.tgz#8f8679f5cf80137324ddbec9fcaa67332783e708" + integrity sha512-0uUKuTsi/ikLFUUNEqvrn7KimgsvuK+7m1yZD4o47FQlgGxTyt1zQY9w3K6YyhyC3lsT6qCwiAPIoFOzPkIg/Q== + dependencies: + "@abp/aspnetcore.mvc.ui" "~7.4.1" + "@abp/bootstrap" "~7.4.1" + "@abp/bootstrap-datepicker" "~7.4.1" + "@abp/bootstrap-daterangepicker" "~7.4.1" + "@abp/datatables.net-bs5" "~7.4.1" + "@abp/font-awesome" "~7.4.1" + "@abp/jquery-form" "~7.4.1" + "@abp/jquery-validation-unobtrusive" "~7.4.1" + "@abp/lodash" "~7.4.1" + "@abp/luxon" "~7.4.1" + "@abp/malihu-custom-scrollbar-plugin" "~7.4.1" + "@abp/moment" "~7.4.1" + "@abp/select2" "~7.4.1" + "@abp/sweetalert2" "~7.4.1" + "@abp/timeago" "~7.4.1" + "@abp/toastr" "~7.4.1" + +"@abp/aspnetcore.mvc.ui@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-7.4.1.tgz#49c13718a17569f97b71f978b50f367dff67b8f7" + integrity sha512-EvYrfk0mpSt1jAMZmfFcHoNWEJskzResKp0bflOYsYPsZPuJ5WraKsk4IEEpesYHCyHW5AAb5HBJHeoSbVLh4Q== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -43,185 +43,185 @@ merge-stream "^2.0.0" micromatch "^4.0.2" -"@abp/bootstrap-datepicker@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-7.4.0.tgz#75edc2127ca26d86bfefaa6e37579b06e32de5de" - integrity sha512-HXUa+kLjKu8sKr+kCZeNye9Pv/swRfKGAt/uJ2WUEvCJ4IVIMM1p6iMnOEEk/+3OGE64/PWu3cdE9dLP6izOaA== +"@abp/bootstrap-datepicker@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-7.4.1.tgz#f8f35d0edf71368faaae4e40a72fa846b0084f9b" + integrity sha512-hsu8ty6c2oOevsNoyFTQ4yJAu27qnz82MgRNVS8MRfdzo05/LhBhy/tKFm+PFYJqZULYlpQ1GXUF2+uGyazIeg== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap-daterangepicker@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-7.4.0.tgz#5058fc2a9354f0a71ac5393658e362779a3bdc46" - integrity sha512-EK0wzZUY9H3XPb9U3DvYVqh48fU+6IneNGYOk7dcda8CUYObd4Dl1nXligStCqgn2uePtwxDHRx40eV0GXmU/Q== +"@abp/bootstrap-daterangepicker@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-7.4.1.tgz#b133cefdbed0fa1b8f1bda916a9d46952237238a" + integrity sha512-NpmbsO4Xg48Zmr8OOlf1fxuNMnFIqmRrkHiKp9lP5c8am64+7rRzCwATw2UY0Ud+4n8/ws+Iki1dwPQF6db1zw== dependencies: bootstrap-daterangepicker "^3.1.0" -"@abp/bootstrap@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-7.4.0.tgz#71be70660643d8f60d13d355b8c80b16e4854870" - integrity sha512-3Fa+fL5NH+0H2KK4MAaqNsiz0PYwK0+Oxjmd0NgKwcqV2vJzRrzS3WG5kITYjNz9QGdBV+FrhNX/NSRU8LDx3Q== +"@abp/bootstrap@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-7.4.1.tgz#b34a2fcc80e04212865652ee7f4f5498a6a61f6d" + integrity sha512-/qCgfrtNWZ2jui2iL6wd6MLrcxALSEFVBypaz1JK3WjEe7DvFAYvKLl7DugIv039/Sx3mbx/PJiQhx8CVZMsEA== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" bootstrap "^5.1.3" -"@abp/clipboard@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-7.4.0.tgz#f1d147df94ddf3ab53eeeb05aec3d5556064c5d6" - integrity sha512-z/nB1RQN/tmShSRwc9Fv1DsJSNM7+Zg4GnAtvZNpOHJp8LTVmsJWxLoUM7hF896W9E0JKr8tRuCVqulyh3IqKg== +"@abp/clipboard@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-7.4.1.tgz#31329ad4565b5075b486e9ca63fb0ff8a070ff9e" + integrity sha512-/+ylBPs/TEZdwywSSTnj96WoRJPwQnR6vlI+sX7h9wDfSDbMwuSSdETSnDVT21lkl8gonPONFZTL8D1u/KKAhg== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" clipboard "^2.0.8" -"@abp/core@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-7.4.0.tgz#8505d446a3b4d80ce476bd3352c1639c7dc486ec" - integrity sha512-yxrnw6eAEIj/CcX5jAwb4xmCsdqWaG+KRcBA8GFvqXbsK94IjqLDiJ3flo+QhGn2DXo40ISxofZop0CgSbP7Ew== +"@abp/core@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-7.4.1.tgz#1d14899ad16aac038806504eb0a5be9318cdcc0c" + integrity sha512-p0BAe2kCtgZmq8pilahmuxmye8DeRXt2KmnFRbmYE3j4d0uComFZpC72QOD1iro8bkmbsHfsHJpiVg4Sp4licw== dependencies: - "@abp/utils" "~7.4.0" + "@abp/utils" "~7.4.1" -"@abp/datatables.net-bs5@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-7.4.0.tgz#52d22e12a2420b402e03148793707d063db0088d" - integrity sha512-VvQv5w0cUpdDD9jX8aUEaLxFrc4A95JlmFnhCYIV1etL8HNOdZvmOThxorsImk31JfpyVYrY/Ze/rnWi2uhVvQ== +"@abp/datatables.net-bs5@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-7.4.1.tgz#821ee4c5db116f9810d65184855cea1fa7d47360" + integrity sha512-jpUzb65lCGYAxs/1qV3pRP8agHwIgZA9gDrudvR8S/3X3kNQWtmeKoFDZ93mhnl3aWPjWFKVrT2LeQeJw5XO5A== dependencies: - "@abp/datatables.net" "~7.4.0" + "@abp/datatables.net" "~7.4.1" datatables.net-bs5 "^1.11.4" -"@abp/datatables.net@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-7.4.0.tgz#9f12a1bb2abd05cd753b5d937d8a0350b2ff74ae" - integrity sha512-StOkMmIkcBUWzD9ToZ5J/hISRWdxbAWjwn7RuFXsoHXcY03mmD86g2oztjrWC5UFnRdpFnsfspTpbNqXFB9Vag== +"@abp/datatables.net@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-7.4.1.tgz#a4501e92e9995da0759b9ce55756fe92c4e8db59" + integrity sha512-BZOOZLH7XrGlX3aFK97cwV9+npsTzALSBo87OgwO2U6UpeFq7yAOvmC0+L9dmIUDISeORn5IFc/zTsSSIQnpHQ== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" datatables.net "^1.11.4" -"@abp/font-awesome@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-7.4.0.tgz#50059083b88706a0f71f55118472b378e4c66163" - integrity sha512-hKoPyM41HHCK6dg+8pQvjYJWzKABBCXrYQAIneMPQZUZqa4JLObKCva9TR7pu6pUp+9OVzg4fQOBM+nwpHtw4g== +"@abp/font-awesome@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-7.4.1.tgz#f6175a989aa64367830723f1dd9c607906716296" + integrity sha512-/ybaz4KROwFdG4Xv0yMTUMXOreDmKy1lKQuntqHEUnIorhXmkgcd5AQQ5AolJ4NmNdPNt1VYrRcTEmdz3nw+FA== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" "@fortawesome/fontawesome-free" "^5.15.4" -"@abp/jquery-form@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-7.4.0.tgz#7ab3be241ee09f1e2843bd1b4d0b0b86d4446e30" - integrity sha512-OmTRuZ7QK1oe2ayNLqEpRJk4Ogk0wt/hIFtJHwQkCtDuCggoR5sQz4vn1vgrD19MxGq07dow5IgjbbhHv1vtEg== +"@abp/jquery-form@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-7.4.1.tgz#67978c41cda204b4c2027d81fc66844379313fa6" + integrity sha512-JZ1D47s/kpTlfMcpD4Jrlh98bhEDsIlWJauvAYaS0EBPIU9V2zHGQ+h9GPFbSPrXe4sYxPSREcsc8KUVMhT5MQ== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-7.4.0.tgz#0c564e39c4997dd9b8af7d2023615a06d6fd9834" - integrity sha512-vFB3RKkDlDXbHlDJ64uo3jWW1IRXwiCaPf+mcB77Wpt5+0Dn7eWqjBT7KyHBrsV08ghIqY/Q4nXntFJrmLcuEA== +"@abp/jquery-validation-unobtrusive@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-7.4.1.tgz#fe5c90ade419e83505884dd50dd5988d766f177b" + integrity sha512-oHHV/ukap+vDvQ8CnEWnOrrsLkHXIcMk+SjNKe/dyK5VzOVLDpMatRFmloLs2igYVXTqDGjmDlTswTFdJUarcQ== dependencies: - "@abp/jquery-validation" "~7.4.0" + "@abp/jquery-validation" "~7.4.1" jquery-validation-unobtrusive "^3.2.12" -"@abp/jquery-validation@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-7.4.0.tgz#f2aaba8f4c023e93f0051cc9a05c6d82fa5c7254" - integrity sha512-vN4srLT5UXAKXpKHbZgySWT+N2DjRYivgtifpZHMTGFLMW14W+tfi5zhR4H4JvqJpuO6ZKNiz15zA1zwEBK0Tw== +"@abp/jquery-validation@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-7.4.1.tgz#c2c06bc28770832a9ad73eac000586faed3bdbe3" + integrity sha512-A5iFT2EWfGHXrBb/ov5f0grZ2o2xkDaYtps/FnDUwBYdIdD8E7bbJsWp6ytvZDciO0XmEqAoVOxmiij7ue/SOg== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" jquery-validation "^1.19.3" -"@abp/jquery@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-7.4.0.tgz#206891b20f250537d05d907d2b6cd682fec76496" - integrity sha512-DeYo02T6WVhdpLloSPb6ooqtpksu1HtcbbQhIP9E1P7jHSzZoNiJvoKXHiFUcj5PYiGKl9d/o89hM/apWzyreQ== +"@abp/jquery@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-7.4.1.tgz#b5e16834e6c7871ad6392612ac8e2de8617eb353" + integrity sha512-X3RcovvRYISHcsb6W3U3iVsofw6yomoiouoB1tSIy2/tvUbu9n7N/3MM0CUujFm/xib7s3z1tVxFssS9smT7sw== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" jquery "~3.6.0" -"@abp/lodash@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-7.4.0.tgz#93f20abee776dbfa7aa45e2e710f2768f262fda5" - integrity sha512-h4Fnjm+VLwp1F3r57B9MrHhwyOYMo5oP285a85zzAYLkhwcDy7f1nbHKHMQ3ZTaeJVmiRnVaH+3sdUdslCRt5g== +"@abp/lodash@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-7.4.1.tgz#d0f84b7b9cbd989d59ebde594ed7acb8bc720b61" + integrity sha512-RFjZCyAPZnpvT0SJbxXzzmMYbuocSWBlezvjAVA8MiTrOXdZO4VyaTFjIuQcAdSrZhtpFGeYWxAjHshVplxMbw== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" lodash "^4.17.21" -"@abp/luxon@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-7.4.0.tgz#2ba7ff307c8f7c24d818a9c33635b86fd6810db9" - integrity sha512-ROCx7aihM+agdYy7Tkz+GiScx68KY5qwGTnj8P7QabGFChzVUic6RuBG+2Obmfonc6uT7Rq0c8JDGrsGNe/w8A== +"@abp/luxon@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-7.4.1.tgz#e0c0947d2b77f98b9cdaf7d1143025879361c3c9" + integrity sha512-k1wh8tT1529MtNC2gSXEIKdimBXBwubXeLisgpIPx6lkJo1Op6pAz2ERwFXeyktqGdYyuFcnewJIxmS7EPtWhg== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" luxon "^2.3.0" -"@abp/malihu-custom-scrollbar-plugin@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-7.4.0.tgz#aba68877481f4339e048f2ae3cfbe93197145a0a" - integrity sha512-Ntodhi4k0HFQmImYTP5SYf/WDm7aUGJLaGsfePm77HJ6DhGgalIGqtM8NiFXzo/3GmMY0XSo8Wxrs1mSCdtsOA== +"@abp/malihu-custom-scrollbar-plugin@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-7.4.1.tgz#aa7ec247197a258277549052780b38fd9e748c6c" + integrity sha512-pm/wIaiRSgGxelOf8AiL4JKFNZOQ6s2WbR6pULiP2HSNCgCpWYJ2s8fvj7VP3lAHIa98v3m8PSMSUhqaANxZ/Q== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/moment@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-7.4.0.tgz#2490d9c7cdcaeca8d0ba9ebef5e7298caf0c9e09" - integrity sha512-ftsUEgO17GbVawA1GplGFzEeIM4NX004AmS6/fPI3o5isX7o1buF9q9TXdnwUuFEJKZxS4KpveRqzTL5t9k0BQ== +"@abp/moment@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-7.4.1.tgz#1c28ccb13eecdd13695edf8641ca9867b318e37d" + integrity sha512-7vRJyAK5ER9z+LV1xUSAAtWlPlhv8yhM/nHjhC+IQSP/+V1D7VLA6EKxAEexGw7wX6HY8oMOWP9HxDHMb5hKQA== dependencies: moment "^2.9.0" -"@abp/prismjs@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-7.4.0.tgz#8572f36f853c7054d77d02f3098cd844ee321ed7" - integrity sha512-y/Iy6pddQeVazEITktPot8JOPdAEOVAfmYkTBP3DIIPvoYr3kf6rwfzBUalMw5CEjWZ9BaIszDgFCk5ucNHHwQ== +"@abp/prismjs@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-7.4.1.tgz#df4387dbc2f0c77ddb9b6bd0ade9a5db29b9cee2" + integrity sha512-bI7pEKWy32aRYSb2ZziiH6Teebyd8km+1TXADy1yks9i9G5eLWe4/CSdwWpI4M+8ggM8CsdhrZ6/U+55BpXPQA== dependencies: - "@abp/clipboard" "~7.4.0" - "@abp/core" "~7.4.0" + "@abp/clipboard" "~7.4.1" + "@abp/core" "~7.4.1" prismjs "^1.26.0" -"@abp/select2@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-7.4.0.tgz#2f455cc991b7bb4df9ed426097bc2996cac12697" - integrity sha512-DwprX4MIoqMzSdh7eFg7EjGIz4ftYZub6jG9Sk3r+sxabbhpbFTxKOpXnhBWYi7L7uTQ8YDFk/5NeXO+Rm50Ww== +"@abp/select2@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-7.4.1.tgz#d7ea53cfec285a06278db362131b7510d5b73900" + integrity sha512-0S66iy7HuB74qqOSDraoF7UvXqz2PrnOKy+3EYMTMskOn4pWaq03JMR8xxEgZ8CtmsrqlE1a4wt1Yt9b3FIc0w== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" select2 "^4.0.13" -"@abp/sweetalert2@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-7.4.0.tgz#db1b4bd45cbabd61172591abc8ce223b5f607c4e" - integrity sha512-XqHPRnTASaRtbJIZYKW1KSKIJ8tynL8DuPCSMjcp4iyUlk+gnzxvbqXeNVjc2ojxj78T/42M/vITNoiiTYuKUw== +"@abp/sweetalert2@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-7.4.1.tgz#6722a40e5115cc341b7543aa0fa3b5a7ae9515b2" + integrity sha512-9jAHrYqCp5qykYfNNbqgESL6egixofVwonjZlb+lLWHAkIX+gQ2ApUNDFSXPtKUh2n9sXhSfF8SSg+BHP/bkCA== dependencies: - "@abp/core" "~7.4.0" + "@abp/core" "~7.4.1" sweetalert2 "^11.3.6" -"@abp/timeago@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-7.4.0.tgz#245fe09370f38311a67a594c8a3c884aea59cc90" - integrity sha512-khxK6EICUaGCUM1HkACw/8rlPQNssoQvCK64bNqEHBCXgPUmTcqSj5MEGiNOYbgGyWeH2IAMtJEYPqX1g1wqSA== +"@abp/timeago@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-7.4.1.tgz#243d342ba131878ae7f892909c9cae07cf54902b" + integrity sha512-a0Vl2NFwTxzRmH5akWo8BRUxa6sK72z8OoXwUFkZOUqMWBCHK7ffNiN1/fbSgA+7HpSZdDvIthjYwBt57DxLdQ== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" timeago "^1.6.7" -"@abp/toastr@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-7.4.0.tgz#16ba0414a27c9a21bc7556a078b175445edcf608" - integrity sha512-oM4HT2m95cK/9sB4AEQAKUMSGBep6wZTgM/46+o2IvvMdMPrGR2mPu9V9wi3y817FRgY+/qQTfy5TZWyTuIpVQ== +"@abp/toastr@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-7.4.1.tgz#345545a41b6145e54477c6c376193a6dbd62bdda" + integrity sha512-OLCvPJYSrcT2spcq9nO838Q22VhJ63Kdzasz1HugdVNqgcFCCSsqaoXrJGUcf5GrZx7PNloz7uf1I3txYMeZtA== dependencies: - "@abp/jquery" "~7.4.0" + "@abp/jquery" "~7.4.1" toastr "^2.1.4" -"@abp/utils@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-7.4.0.tgz#b31fb6e5dff07463535479a6bb62dc733d7119c8" - integrity sha512-CcR3tfuEsVM60DYL1A0cH6BkUTsasOoBDv/b63uLCoEOq/g8ntelD/SpRSgfDXK74P9M8OE5ZFxlXWDiYuzAFg== +"@abp/utils@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-7.4.1.tgz#2ce4c4d659c2ae9bc23b71b79fa3c6e120eaecaf" + integrity sha512-eFeoOXcz9cVkDKpOfd2VWmpAojASfsqfvACZqi1UmF16OcjsFIkxmIvhh1fpbT4A+eQLbaFFLIsf6gYb//tXhg== dependencies: just-compare "^2.3.0" -"@abp/virtual-file-explorer@~7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@abp/virtual-file-explorer/-/virtual-file-explorer-7.4.0.tgz#c118e86b4dd31c590d59f11239687d1108c555c3" - integrity sha512-DcNKiqfXR/VzUzfZSSZlUwxOOQyEIKJZNNCb9bUR021XxUK3tmPQTjFU+6ptq1ebRxByz8239zPcXYIjW4im+A== +"@abp/virtual-file-explorer@~7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@abp/virtual-file-explorer/-/virtual-file-explorer-7.4.1.tgz#f08e4d397749c44c0d7e2cbfd6e26641a9c77904" + integrity sha512-Rx10rm9cBtqP7VWWFhIeYO0/gZED6XphxUoN58OLZzKpTHrkNW4gf1P0emVVuxWD/j7M933rXjzSV8CT0Vtt+Q== dependencies: - "@abp/clipboard" "~7.4.0" - "@abp/prismjs" "~7.4.0" + "@abp/clipboard" "~7.4.1" + "@abp/prismjs" "~7.4.1" "@fortawesome/fontawesome-free@^5.15.4": version "5.15.4" diff --git a/npm/lerna.json b/npm/lerna.json index 9b754ccca7..b5395f7a89 100644 --- a/npm/lerna.json +++ b/npm/lerna.json @@ -1,5 +1,5 @@ { - "version": "7.4.0", + "version": "7.4.1", "packages": [ "packs/*" ], diff --git a/npm/ng-packs/package.json b/npm/ng-packs/package.json index 376fc1daa5..429c80552c 100644 --- a/npm/ng-packs/package.json +++ b/npm/ng-packs/package.json @@ -44,8 +44,8 @@ }, "private": true, "devDependencies": { - "@abp/ng.theme.lepton-x": "~2.4.0", - "@abp/utils": "~7.4.0", + "@abp/ng.theme.lepton-x": "~2.4.1", + "@abp/utils": "~7.4.1", "@angular-devkit/build-angular": "~16.2.0", "@angular-devkit/core": "~16.2.0", "@angular-devkit/schematics": "~16.2.0", @@ -136,4 +136,3 @@ }, "dependencies": {} } - diff --git a/npm/ng-packs/packages/account-core/package.json b/npm/ng-packs/packages/account-core/package.json index 9f2cba366f..b4bf728796 100644 --- a/npm/ng-packs/packages/account-core/package.json +++ b/npm/ng-packs/packages/account-core/package.json @@ -1,14 +1,14 @@ { "name": "@abp/ng.account.core", - "version": "7.4.0", + "version": "7.4.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "peerDependencies": { - "@abp/ng.core": "~7.4.0", - "@abp/ng.theme.shared": "~7.4.0", + "@abp/ng.core": "~7.4.1", + "@abp/ng.theme.shared": "~7.4.1", "@angular/common": ">=12.0.0", "@angular/core": ">=12.0.0" }, diff --git a/npm/ng-packs/packages/account/package.json b/npm/ng-packs/packages/account/package.json index 3f33e750fb..b3b2528d23 100644 --- a/npm/ng-packs/packages/account/package.json +++ b/npm/ng-packs/packages/account/package.json @@ -1,14 +1,14 @@ { "name": "@abp/ng.account", - "version": "7.4.0", + "version": "7.4.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.account.core": "~7.4.0", - "@abp/ng.theme.shared": "~7.4.0", + "@abp/ng.account.core": "~7.4.1", + "@abp/ng.theme.shared": "~7.4.1", "tslib": "^2.0.0" }, "publishConfig": { diff --git a/npm/ng-packs/packages/components/package.json b/npm/ng-packs/packages/components/package.json index 1dab4b4b6e..e9084eb9c0 100644 --- a/npm/ng-packs/packages/components/package.json +++ b/npm/ng-packs/packages/components/package.json @@ -1,14 +1,14 @@ { "name": "@abp/ng.components", - "version": "7.4.0", + "version": "7.4.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "peerDependencies": { - "@abp/ng.core": ">=7.4.0", - "@abp/ng.theme.shared": ">=7.4.0" + "@abp/ng.core": ">=7.4.1", + "@abp/ng.theme.shared": ">=7.4.1" }, "dependencies": { "chart.js": "^3.5.1", diff --git a/npm/ng-packs/packages/core/package.json b/npm/ng-packs/packages/core/package.json index 1261fe6ee8..214e672d8f 100644 --- a/npm/ng-packs/packages/core/package.json +++ b/npm/ng-packs/packages/core/package.json @@ -1,13 +1,13 @@ { "name": "@abp/ng.core", - "version": "7.4.0", + "version": "7.4.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/utils": "~7.4.0", + "@abp/utils": "~7.4.1", "angular-oauth2-oidc": "^15.0.1", "just-clone": "^6.1.1", "just-compare": "^2.3.0", diff --git a/npm/ng-packs/packages/feature-management/package.json b/npm/ng-packs/packages/feature-management/package.json index b07018c81e..de497ea449 100644 --- a/npm/ng-packs/packages/feature-management/package.json +++ b/npm/ng-packs/packages/feature-management/package.json @@ -1,13 +1,13 @@ { "name": "@abp/ng.feature-management", - "version": "7.4.0", + "version": "7.4.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.theme.shared": "~7.4.0", + "@abp/ng.theme.shared": "~7.4.1", "tslib": "^2.0.0" }, "publishConfig": { diff --git a/npm/ng-packs/packages/generators/package.json b/npm/ng-packs/packages/generators/package.json index 0a6721043d..eefbafd941 100644 --- a/npm/ng-packs/packages/generators/package.json +++ b/npm/ng-packs/packages/generators/package.json @@ -1,6 +1,6 @@ { "name": "@abp/nx.generators", - "version": "7.4.0", + "version": "7.4.1", "homepage": "https://abp.io", "generators": "./generators.json", "type": "commonjs", diff --git a/npm/ng-packs/packages/identity/package.json b/npm/ng-packs/packages/identity/package.json index 8b00379187..8df039e253 100644 --- a/npm/ng-packs/packages/identity/package.json +++ b/npm/ng-packs/packages/identity/package.json @@ -1,15 +1,15 @@ { "name": "@abp/ng.identity", - "version": "7.4.0", + "version": "7.4.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.components": "~7.4.0", - "@abp/ng.permission-management": "~7.4.0", - "@abp/ng.theme.shared": "~7.4.0", + "@abp/ng.components": "~7.4.1", + "@abp/ng.permission-management": "~7.4.1", + "@abp/ng.theme.shared": "~7.4.1", "tslib": "^2.0.0" }, "publishConfig": { diff --git a/npm/ng-packs/packages/oauth/package.json b/npm/ng-packs/packages/oauth/package.json index 04580b0c1e..b9dda531bb 100644 --- a/npm/ng-packs/packages/oauth/package.json +++ b/npm/ng-packs/packages/oauth/package.json @@ -1,14 +1,14 @@ { "name": "@abp/ng.oauth", - "version": "7.4.0", + "version": "7.4.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.core": "~7.4.0", - "@abp/utils": "~7.4.0", + "@abp/ng.core": "~7.4.1", + "@abp/utils": "~7.4.1", "angular-oauth2-oidc": "^15.0.1", "just-clone": "^6.1.1", "just-compare": "^2.3.0", diff --git a/npm/ng-packs/packages/permission-management/package.json b/npm/ng-packs/packages/permission-management/package.json index 692bb6c2be..ee9c2ebfaa 100644 --- a/npm/ng-packs/packages/permission-management/package.json +++ b/npm/ng-packs/packages/permission-management/package.json @@ -1,13 +1,13 @@ { "name": "@abp/ng.permission-management", - "version": "7.4.0", + "version": "7.4.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.theme.shared": "~7.4.0", + "@abp/ng.theme.shared": "~7.4.1", "tslib": "^2.0.0" }, "publishConfig": { diff --git a/npm/ng-packs/packages/schematics/package.json b/npm/ng-packs/packages/schematics/package.json index e8655768b9..7d613dee16 100644 --- a/npm/ng-packs/packages/schematics/package.json +++ b/npm/ng-packs/packages/schematics/package.json @@ -1,6 +1,6 @@ { "name": "@abp/ng.schematics", - "version": "7.4.0", + "version": "7.4.1", "author": "", "schematics": "./collection.json", "dependencies": { diff --git a/npm/ng-packs/packages/setting-management/package.json b/npm/ng-packs/packages/setting-management/package.json index 47658075b7..919d96f13d 100644 --- a/npm/ng-packs/packages/setting-management/package.json +++ b/npm/ng-packs/packages/setting-management/package.json @@ -1,14 +1,14 @@ { "name": "@abp/ng.setting-management", - "version": "7.4.0", + "version": "7.4.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.components": "~7.4.0", - "@abp/ng.theme.shared": "~7.4.0", + "@abp/ng.components": "~7.4.1", + "@abp/ng.theme.shared": "~7.4.1", "tslib": "^2.0.0" }, "publishConfig": { diff --git a/npm/ng-packs/packages/tenant-management/package.json b/npm/ng-packs/packages/tenant-management/package.json index 6e3035220f..7b98e6c2af 100644 --- a/npm/ng-packs/packages/tenant-management/package.json +++ b/npm/ng-packs/packages/tenant-management/package.json @@ -1,14 +1,14 @@ { "name": "@abp/ng.tenant-management", - "version": "7.4.0", + "version": "7.4.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.feature-management": "~7.4.0", - "@abp/ng.theme.shared": "~7.4.0", + "@abp/ng.feature-management": "~7.4.1", + "@abp/ng.theme.shared": "~7.4.1", "tslib": "^2.0.0" }, "publishConfig": { diff --git a/npm/ng-packs/packages/theme-basic/package.json b/npm/ng-packs/packages/theme-basic/package.json index 09644b6e90..66fb3a6686 100644 --- a/npm/ng-packs/packages/theme-basic/package.json +++ b/npm/ng-packs/packages/theme-basic/package.json @@ -1,14 +1,14 @@ { "name": "@abp/ng.theme.basic", - "version": "7.4.0", + "version": "7.4.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.account.core": "~7.4.0", - "@abp/ng.theme.shared": "~7.4.0", + "@abp/ng.account.core": "~7.4.1", + "@abp/ng.theme.shared": "~7.4.1", "tslib": "^2.0.0" }, "publishConfig": { diff --git a/npm/ng-packs/packages/theme-shared/package.json b/npm/ng-packs/packages/theme-shared/package.json index 5c0fc9610d..b3118175e5 100644 --- a/npm/ng-packs/packages/theme-shared/package.json +++ b/npm/ng-packs/packages/theme-shared/package.json @@ -1,13 +1,13 @@ { "name": "@abp/ng.theme.shared", - "version": "7.4.0", + "version": "7.4.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.core": "~7.4.0", + "@abp/ng.core": "~7.4.1", "@fortawesome/fontawesome-free": "^5.15.4", "@ng-bootstrap/ng-bootstrap": "^15.0.0", "@ngx-validate/core": "^0.2.0", diff --git a/npm/packs/anchor-js/package.json b/npm/packs/anchor-js/package.json index 8b3542378a..1784f53c7a 100644 --- a/npm/packs/anchor-js/package.json +++ b/npm/packs/anchor-js/package.json @@ -1,11 +1,11 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/anchor-js", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~7.4.0", + "@abp/core": "~7.4.1", "anchor-js": "^4.3.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/aspnetcore.components.server.basictheme/package.json b/npm/packs/aspnetcore.components.server.basictheme/package.json index ee04c0e990..13bac6c467 100644 --- a/npm/packs/aspnetcore.components.server.basictheme/package.json +++ b/npm/packs/aspnetcore.components.server.basictheme/package.json @@ -1,11 +1,11 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/aspnetcore.components.server.basictheme", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/aspnetcore.components.server.theming": "~7.4.0" + "@abp/aspnetcore.components.server.theming": "~7.4.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", "homepage": "https://abp.io", diff --git a/npm/packs/aspnetcore.components.server.theming/package.json b/npm/packs/aspnetcore.components.server.theming/package.json index a55a897a9c..4086c1969b 100644 --- a/npm/packs/aspnetcore.components.server.theming/package.json +++ b/npm/packs/aspnetcore.components.server.theming/package.json @@ -1,12 +1,12 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/aspnetcore.components.server.theming", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/bootstrap": "~7.4.0", - "@abp/font-awesome": "~7.4.0" + "@abp/bootstrap": "~7.4.1", + "@abp/font-awesome": "~7.4.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", "homepage": "https://abp.io", diff --git a/npm/packs/aspnetcore.mvc.ui.theme.basic/package.json b/npm/packs/aspnetcore.mvc.ui.theme.basic/package.json index 69a53526b2..00cb45e009 100644 --- a/npm/packs/aspnetcore.mvc.ui.theme.basic/package.json +++ b/npm/packs/aspnetcore.mvc.ui.theme.basic/package.json @@ -1,5 +1,5 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/aspnetcore.mvc.ui.theme.basic", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.shared": "~7.4.0" + "@abp/aspnetcore.mvc.ui.theme.shared": "~7.4.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", "homepage": "https://abp.io", diff --git a/npm/packs/aspnetcore.mvc.ui.theme.shared/package.json b/npm/packs/aspnetcore.mvc.ui.theme.shared/package.json index 86a227a968..6cf45992d6 100644 --- a/npm/packs/aspnetcore.mvc.ui.theme.shared/package.json +++ b/npm/packs/aspnetcore.mvc.ui.theme.shared/package.json @@ -1,5 +1,5 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/aspnetcore.mvc.ui.theme.shared", "repository": { "type": "git", @@ -10,22 +10,22 @@ "access": "public" }, "dependencies": { - "@abp/aspnetcore.mvc.ui": "~7.4.0", - "@abp/bootstrap": "~7.4.0", - "@abp/bootstrap-datepicker": "~7.4.0", - "@abp/bootstrap-daterangepicker": "~7.4.0", - "@abp/datatables.net-bs5": "~7.4.0", - "@abp/font-awesome": "~7.4.0", - "@abp/jquery-form": "~7.4.0", - "@abp/jquery-validation-unobtrusive": "~7.4.0", - "@abp/lodash": "~7.4.0", - "@abp/luxon": "~7.4.0", - "@abp/malihu-custom-scrollbar-plugin": "~7.4.0", - "@abp/moment": "~7.4.0", - "@abp/select2": "~7.4.0", - "@abp/sweetalert2": "~7.4.0", - "@abp/timeago": "~7.4.0", - "@abp/toastr": "~7.4.0" + "@abp/aspnetcore.mvc.ui": "~7.4.1", + "@abp/bootstrap": "~7.4.1", + "@abp/bootstrap-datepicker": "~7.4.1", + "@abp/bootstrap-daterangepicker": "~7.4.1", + "@abp/datatables.net-bs5": "~7.4.1", + "@abp/font-awesome": "~7.4.1", + "@abp/jquery-form": "~7.4.1", + "@abp/jquery-validation-unobtrusive": "~7.4.1", + "@abp/lodash": "~7.4.1", + "@abp/luxon": "~7.4.1", + "@abp/malihu-custom-scrollbar-plugin": "~7.4.1", + "@abp/moment": "~7.4.1", + "@abp/select2": "~7.4.1", + "@abp/sweetalert2": "~7.4.1", + "@abp/timeago": "~7.4.1", + "@abp/toastr": "~7.4.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", "homepage": "https://abp.io", diff --git a/npm/packs/aspnetcore.mvc.ui/package-lock.json b/npm/packs/aspnetcore.mvc.ui/package-lock.json index 74d3620b9c..ea60b590ab 100644 --- a/npm/packs/aspnetcore.mvc.ui/package-lock.json +++ b/npm/packs/aspnetcore.mvc.ui/package-lock.json @@ -1,6 +1,6 @@ { "name": "@abp/aspnetcore.mvc.ui", - "version": "7.4.0", + "version": "7.4.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/npm/packs/aspnetcore.mvc.ui/package.json b/npm/packs/aspnetcore.mvc.ui/package.json index 9d89144d7e..00113c20bb 100644 --- a/npm/packs/aspnetcore.mvc.ui/package.json +++ b/npm/packs/aspnetcore.mvc.ui/package.json @@ -1,5 +1,5 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/aspnetcore.mvc.ui", "repository": { "type": "git", diff --git a/npm/packs/blogging/package.json b/npm/packs/blogging/package.json index b09ebe3751..237ebc11c3 100644 --- a/npm/packs/blogging/package.json +++ b/npm/packs/blogging/package.json @@ -1,14 +1,14 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/blogging", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.shared": "~7.4.0", - "@abp/owl.carousel": "~7.4.0", - "@abp/prismjs": "~7.4.0", - "@abp/tui-editor": "~7.4.0" + "@abp/aspnetcore.mvc.ui.theme.shared": "~7.4.1", + "@abp/owl.carousel": "~7.4.1", + "@abp/prismjs": "~7.4.1", + "@abp/tui-editor": "~7.4.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", "homepage": "https://abp.io", diff --git a/npm/packs/bootstrap-datepicker/package.json b/npm/packs/bootstrap-datepicker/package.json index 58865a1ac5..7d29b8b0a3 100644 --- a/npm/packs/bootstrap-datepicker/package.json +++ b/npm/packs/bootstrap-datepicker/package.json @@ -1,5 +1,5 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/bootstrap-datepicker", "repository": { "type": "git", diff --git a/npm/packs/bootstrap-daterangepicker/package.json b/npm/packs/bootstrap-daterangepicker/package.json index 4eafb5a8a0..d92025f1bd 100644 --- a/npm/packs/bootstrap-daterangepicker/package.json +++ b/npm/packs/bootstrap-daterangepicker/package.json @@ -1,5 +1,5 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/bootstrap-daterangepicker", "repository": { "type": "git", diff --git a/npm/packs/bootstrap/package.json b/npm/packs/bootstrap/package.json index 7ff316b0ac..09787d790b 100644 --- a/npm/packs/bootstrap/package.json +++ b/npm/packs/bootstrap/package.json @@ -1,5 +1,5 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/bootstrap", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/core": "~7.4.0", + "@abp/core": "~7.4.1", "bootstrap": "^5.1.3" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/chart.js/package.json b/npm/packs/chart.js/package.json index b54cbd56c4..39a4844efd 100644 --- a/npm/packs/chart.js/package.json +++ b/npm/packs/chart.js/package.json @@ -1,5 +1,5 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/chart.js", "publishConfig": { "access": "public" diff --git a/npm/packs/clipboard/package.json b/npm/packs/clipboard/package.json index c762093a23..069870a9f9 100644 --- a/npm/packs/clipboard/package.json +++ b/npm/packs/clipboard/package.json @@ -1,11 +1,11 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/clipboard", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~7.4.0", + "@abp/core": "~7.4.1", "clipboard": "^2.0.8" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/cms-kit.admin/package.json b/npm/packs/cms-kit.admin/package.json index e61d6cb878..316d70c1e2 100644 --- a/npm/packs/cms-kit.admin/package.json +++ b/npm/packs/cms-kit.admin/package.json @@ -1,15 +1,15 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/cms-kit.admin", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/codemirror": "~7.4.0", - "@abp/jstree": "~7.4.0", - "@abp/slugify": "~7.4.0", - "@abp/tui-editor": "~7.4.0", - "@abp/uppy": "~7.4.0" + "@abp/codemirror": "~7.4.1", + "@abp/jstree": "~7.4.1", + "@abp/slugify": "~7.4.1", + "@abp/tui-editor": "~7.4.1", + "@abp/uppy": "~7.4.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", "homepage": "https://abp.io", diff --git a/npm/packs/cms-kit.public/package.json b/npm/packs/cms-kit.public/package.json index cd298f3501..2a37ba8b99 100644 --- a/npm/packs/cms-kit.public/package.json +++ b/npm/packs/cms-kit.public/package.json @@ -1,12 +1,12 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/cms-kit.public", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/highlight.js": "~7.4.0", - "@abp/star-rating-svg": "~7.4.0" + "@abp/highlight.js": "~7.4.1", + "@abp/star-rating-svg": "~7.4.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", "homepage": "https://abp.io", diff --git a/npm/packs/cms-kit/package.json b/npm/packs/cms-kit/package.json index efaeabf662..91d48ce1f8 100644 --- a/npm/packs/cms-kit/package.json +++ b/npm/packs/cms-kit/package.json @@ -1,12 +1,12 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/cms-kit", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/cms-kit.admin": "~7.4.0", - "@abp/cms-kit.public": "~7.4.0" + "@abp/cms-kit.admin": "~7.4.1", + "@abp/cms-kit.public": "~7.4.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", "homepage": "https://abp.io", diff --git a/npm/packs/codemirror/package.json b/npm/packs/codemirror/package.json index f29943e59d..0ecb2d825f 100644 --- a/npm/packs/codemirror/package.json +++ b/npm/packs/codemirror/package.json @@ -1,11 +1,11 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/codemirror", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~7.4.0", + "@abp/core": "~7.4.1", "codemirror": "^5.65.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/core/package.json b/npm/packs/core/package.json index de7df5edeb..db2a5f8eba 100644 --- a/npm/packs/core/package.json +++ b/npm/packs/core/package.json @@ -1,5 +1,5 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/core", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/utils": "~7.4.0" + "@abp/utils": "~7.4.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", "homepage": "https://abp.io", diff --git a/npm/packs/cropperjs/package.json b/npm/packs/cropperjs/package.json index 07b45d4d4b..1c3adff63b 100644 --- a/npm/packs/cropperjs/package.json +++ b/npm/packs/cropperjs/package.json @@ -1,11 +1,11 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/cropperjs", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~7.4.0", + "@abp/core": "~7.4.1", "cropperjs": "^1.5.12" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/datatables.net-bs4/package.json b/npm/packs/datatables.net-bs4/package.json index 4b821168e7..6139027d97 100644 --- a/npm/packs/datatables.net-bs4/package.json +++ b/npm/packs/datatables.net-bs4/package.json @@ -1,5 +1,5 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/datatables.net-bs4", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/datatables.net": "~7.4.0", + "@abp/datatables.net": "~7.4.1", "datatables.net-bs4": "^1.11.4" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/datatables.net-bs5/package.json b/npm/packs/datatables.net-bs5/package.json index 108be39b57..4ef0aa47c9 100644 --- a/npm/packs/datatables.net-bs5/package.json +++ b/npm/packs/datatables.net-bs5/package.json @@ -1,11 +1,11 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/datatables.net-bs5", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/datatables.net": "~7.4.0", + "@abp/datatables.net": "~7.4.1", "datatables.net-bs5": "^1.11.4" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/datatables.net/package.json b/npm/packs/datatables.net/package.json index 160b0117c1..c40a7549cb 100644 --- a/npm/packs/datatables.net/package.json +++ b/npm/packs/datatables.net/package.json @@ -1,5 +1,5 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/datatables.net", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/jquery": "~7.4.0", + "@abp/jquery": "~7.4.1", "datatables.net": "^1.11.4" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/docs/package.json b/npm/packs/docs/package.json index 2e50895ed0..c6b03d5474 100644 --- a/npm/packs/docs/package.json +++ b/npm/packs/docs/package.json @@ -1,15 +1,15 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/docs", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/anchor-js": "~7.4.0", - "@abp/clipboard": "~7.4.0", - "@abp/malihu-custom-scrollbar-plugin": "~7.4.0", - "@abp/popper.js": "~7.4.0", - "@abp/prismjs": "~7.4.0" + "@abp/anchor-js": "~7.4.1", + "@abp/clipboard": "~7.4.1", + "@abp/malihu-custom-scrollbar-plugin": "~7.4.1", + "@abp/popper.js": "~7.4.1", + "@abp/prismjs": "~7.4.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", "homepage": "https://abp.io", diff --git a/npm/packs/flag-icon-css/package.json b/npm/packs/flag-icon-css/package.json index 9f3b32c495..904fa65c97 100644 --- a/npm/packs/flag-icon-css/package.json +++ b/npm/packs/flag-icon-css/package.json @@ -1,5 +1,5 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/flag-icon-css", "publishConfig": { "access": "public" diff --git a/npm/packs/flag-icons/package.json b/npm/packs/flag-icons/package.json index 9a0463a798..026485667e 100644 --- a/npm/packs/flag-icons/package.json +++ b/npm/packs/flag-icons/package.json @@ -1,5 +1,5 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/flag-icons", "publishConfig": { "access": "public" diff --git a/npm/packs/font-awesome/package.json b/npm/packs/font-awesome/package.json index f8c2507180..770e319e26 100644 --- a/npm/packs/font-awesome/package.json +++ b/npm/packs/font-awesome/package.json @@ -1,5 +1,5 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/font-awesome", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/core": "~7.4.0", + "@abp/core": "~7.4.1", "@fortawesome/fontawesome-free": "^5.15.4" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/highlight.js/package.json b/npm/packs/highlight.js/package.json index 13e2c741f5..acc04e595a 100644 --- a/npm/packs/highlight.js/package.json +++ b/npm/packs/highlight.js/package.json @@ -1,11 +1,11 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/highlight.js", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~7.4.0", + "@abp/core": "~7.4.1", "@highlightjs/cdn-assets": "~11.4.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/jquery-form/package.json b/npm/packs/jquery-form/package.json index c1eaadedfa..910dda8881 100644 --- a/npm/packs/jquery-form/package.json +++ b/npm/packs/jquery-form/package.json @@ -1,5 +1,5 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/jquery-form", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/jquery": "~7.4.0", + "@abp/jquery": "~7.4.1", "jquery-form": "^4.3.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/jquery-validation-unobtrusive/package.json b/npm/packs/jquery-validation-unobtrusive/package.json index d07bc08406..795087d7dd 100644 --- a/npm/packs/jquery-validation-unobtrusive/package.json +++ b/npm/packs/jquery-validation-unobtrusive/package.json @@ -1,5 +1,5 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/jquery-validation-unobtrusive", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/jquery-validation": "~7.4.0", + "@abp/jquery-validation": "~7.4.1", "jquery-validation-unobtrusive": "^3.2.12" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/jquery-validation/package.json b/npm/packs/jquery-validation/package.json index 803d556ce5..5178919e18 100644 --- a/npm/packs/jquery-validation/package.json +++ b/npm/packs/jquery-validation/package.json @@ -1,5 +1,5 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/jquery-validation", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/jquery": "~7.4.0", + "@abp/jquery": "~7.4.1", "jquery-validation": "^1.19.3" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/jquery/package.json b/npm/packs/jquery/package.json index ed35001c5b..631e7c0cb4 100644 --- a/npm/packs/jquery/package.json +++ b/npm/packs/jquery/package.json @@ -1,5 +1,5 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/jquery", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/core": "~7.4.0", + "@abp/core": "~7.4.1", "jquery": "~3.6.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/jstree/package.json b/npm/packs/jstree/package.json index c6794062ae..2d94ce38b8 100644 --- a/npm/packs/jstree/package.json +++ b/npm/packs/jstree/package.json @@ -1,11 +1,11 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/jstree", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/jquery": "~7.4.0", + "@abp/jquery": "~7.4.1", "jstree": "^3.3.12" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/lodash/package.json b/npm/packs/lodash/package.json index cbaa5a3f4c..e253bf5026 100644 --- a/npm/packs/lodash/package.json +++ b/npm/packs/lodash/package.json @@ -1,5 +1,5 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/lodash", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/core": "~7.4.0", + "@abp/core": "~7.4.1", "lodash": "^4.17.21" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/luxon/package.json b/npm/packs/luxon/package.json index 07d9393f9d..3cc35bc828 100644 --- a/npm/packs/luxon/package.json +++ b/npm/packs/luxon/package.json @@ -1,5 +1,5 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/luxon", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/core": "~7.4.0", + "@abp/core": "~7.4.1", "luxon": "^2.3.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/malihu-custom-scrollbar-plugin/package.json b/npm/packs/malihu-custom-scrollbar-plugin/package.json index da0d25f81e..72b953d34b 100644 --- a/npm/packs/malihu-custom-scrollbar-plugin/package.json +++ b/npm/packs/malihu-custom-scrollbar-plugin/package.json @@ -1,5 +1,5 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/malihu-custom-scrollbar-plugin", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/core": "~7.4.0", + "@abp/core": "~7.4.1", "malihu-custom-scrollbar-plugin": "^3.1.5" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/markdown-it/package.json b/npm/packs/markdown-it/package.json index 911e9a83fc..21409a9704 100644 --- a/npm/packs/markdown-it/package.json +++ b/npm/packs/markdown-it/package.json @@ -1,11 +1,11 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/markdown-it", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~7.4.0", + "@abp/core": "~7.4.1", "markdown-it": "^12.3.2" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/moment/package.json b/npm/packs/moment/package.json index 91c919eabe..56d5123a88 100644 --- a/npm/packs/moment/package.json +++ b/npm/packs/moment/package.json @@ -1,5 +1,5 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/moment", "repository": { "type": "git", diff --git a/npm/packs/owl.carousel/package.json b/npm/packs/owl.carousel/package.json index ed5825da6c..cbba8f8c5b 100644 --- a/npm/packs/owl.carousel/package.json +++ b/npm/packs/owl.carousel/package.json @@ -1,11 +1,11 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/owl.carousel", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~7.4.0", + "@abp/core": "~7.4.1", "owl.carousel": "^2.3.4" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/popper.js/package.json b/npm/packs/popper.js/package.json index 38c9f317a7..5aa46044ea 100644 --- a/npm/packs/popper.js/package.json +++ b/npm/packs/popper.js/package.json @@ -1,11 +1,11 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/popper.js", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~7.4.0", + "@abp/core": "~7.4.1", "@popperjs/core": "^2.11.2" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/prismjs/package.json b/npm/packs/prismjs/package.json index 7f70f7f662..a76d8b4d48 100644 --- a/npm/packs/prismjs/package.json +++ b/npm/packs/prismjs/package.json @@ -1,12 +1,12 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/prismjs", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/clipboard": "~7.4.0", - "@abp/core": "~7.4.0", + "@abp/clipboard": "~7.4.1", + "@abp/core": "~7.4.1", "prismjs": "^1.26.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/qrcode/package.json b/npm/packs/qrcode/package.json index b342e54584..83cdc72c28 100644 --- a/npm/packs/qrcode/package.json +++ b/npm/packs/qrcode/package.json @@ -1,5 +1,5 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/qrcode", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/core": "~7.4.0" + "@abp/core": "~7.4.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", "homepage": "https://abp.io", diff --git a/npm/packs/select2/package.json b/npm/packs/select2/package.json index 138587f583..da628403c1 100644 --- a/npm/packs/select2/package.json +++ b/npm/packs/select2/package.json @@ -1,5 +1,5 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/select2", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/core": "~7.4.0", + "@abp/core": "~7.4.1", "select2": "^4.0.13" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/signalr/package.json b/npm/packs/signalr/package.json index 4630102fab..7934a12406 100644 --- a/npm/packs/signalr/package.json +++ b/npm/packs/signalr/package.json @@ -1,11 +1,11 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/signalr", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~7.4.0", + "@abp/core": "~7.4.1", "@microsoft/signalr": "~6.0.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/slugify/package.json b/npm/packs/slugify/package.json index 8d106275b1..5a66ee22f5 100644 --- a/npm/packs/slugify/package.json +++ b/npm/packs/slugify/package.json @@ -1,5 +1,5 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/slugify", "publishConfig": { "access": "public" diff --git a/npm/packs/star-rating-svg/package.json b/npm/packs/star-rating-svg/package.json index 49484a3cf3..a7923aadc7 100644 --- a/npm/packs/star-rating-svg/package.json +++ b/npm/packs/star-rating-svg/package.json @@ -1,11 +1,11 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/star-rating-svg", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/jquery": "~7.4.0", + "@abp/jquery": "~7.4.1", "star-rating-svg": "^3.5.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/sweetalert2/package.json b/npm/packs/sweetalert2/package.json index bdae361897..7508409375 100644 --- a/npm/packs/sweetalert2/package.json +++ b/npm/packs/sweetalert2/package.json @@ -1,5 +1,5 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/sweetalert2", "publishConfig": { "access": "public" @@ -10,7 +10,7 @@ "directory": "npm/packs/sweetalert2" }, "dependencies": { - "@abp/core": "~7.4.0", + "@abp/core": "~7.4.1", "sweetalert2": "^11.3.6" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/timeago/package.json b/npm/packs/timeago/package.json index f361de4194..828a8a2ba4 100644 --- a/npm/packs/timeago/package.json +++ b/npm/packs/timeago/package.json @@ -1,5 +1,5 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/timeago", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/jquery": "~7.4.0", + "@abp/jquery": "~7.4.1", "timeago": "^1.6.7" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/toastr/package.json b/npm/packs/toastr/package.json index 758df70b38..7a9fb784cd 100644 --- a/npm/packs/toastr/package.json +++ b/npm/packs/toastr/package.json @@ -1,5 +1,5 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/toastr", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/jquery": "~7.4.0", + "@abp/jquery": "~7.4.1", "toastr": "^2.1.4" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/tui-editor/package.json b/npm/packs/tui-editor/package.json index cda42125cc..ea66914086 100644 --- a/npm/packs/tui-editor/package.json +++ b/npm/packs/tui-editor/package.json @@ -1,12 +1,12 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/tui-editor", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/jquery": "~7.4.0", - "@abp/prismjs": "~7.4.0" + "@abp/jquery": "~7.4.1", + "@abp/prismjs": "~7.4.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", "homepage": "https://abp.io", diff --git a/npm/packs/uppy/package.json b/npm/packs/uppy/package.json index 16e3e9d676..0a914395c4 100644 --- a/npm/packs/uppy/package.json +++ b/npm/packs/uppy/package.json @@ -1,11 +1,11 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/uppy", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~7.4.0", + "@abp/core": "~7.4.1", "uppy": "^1.16.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/utils/package.json b/npm/packs/utils/package.json index 5976e26e37..fa6dbe0af0 100644 --- a/npm/packs/utils/package.json +++ b/npm/packs/utils/package.json @@ -1,6 +1,6 @@ { "name": "@abp/utils", - "version": "7.4.0", + "version": "7.4.1", "scripts": { "prepublishOnly": "yarn install --ignore-scripts && node prepublish.js", "ng": "ng", diff --git a/npm/packs/vee-validate/package.json b/npm/packs/vee-validate/package.json index a4a716df49..acc479df3f 100644 --- a/npm/packs/vee-validate/package.json +++ b/npm/packs/vee-validate/package.json @@ -1,11 +1,11 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/vee-validate", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/vue": "~7.4.0", + "@abp/vue": "~7.4.1", "vee-validate": "~3.4.4" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", diff --git a/npm/packs/virtual-file-explorer/package.json b/npm/packs/virtual-file-explorer/package.json index 87e42e5fd2..4c33fd06e8 100644 --- a/npm/packs/virtual-file-explorer/package.json +++ b/npm/packs/virtual-file-explorer/package.json @@ -1,12 +1,12 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/virtual-file-explorer", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/clipboard": "~7.4.0", - "@abp/prismjs": "~7.4.0" + "@abp/clipboard": "~7.4.1", + "@abp/prismjs": "~7.4.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", "homepage": "https://abp.io", diff --git a/npm/packs/vue/package.json b/npm/packs/vue/package.json index 310f4eb33f..3c5fcad26f 100644 --- a/npm/packs/vue/package.json +++ b/npm/packs/vue/package.json @@ -1,5 +1,5 @@ { - "version": "7.4.0", + "version": "7.4.1", "name": "@abp/vue", "publishConfig": { "access": "public" diff --git a/source-code/Volo.Abp.Account.SourceCode/Volo.Abp.Account.SourceCode.zip b/source-code/Volo.Abp.Account.SourceCode/Volo.Abp.Account.SourceCode.zip index f4ae508c1b2fb6bc357d0999428bf2e78410f219..84f047a17cff837d06b634d66bf72c0a47da27d2 100644 GIT binary patch delta 16840 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 delta 16777 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 IgC)W8e}ZQ=ivR!s diff --git a/source-code/Volo.Abp.AuditLogging.SourceCode/Volo.Abp.AuditLogging.SourceCode.zip b/source-code/Volo.Abp.AuditLogging.SourceCode/Volo.Abp.AuditLogging.SourceCode.zip index 3212963ba9bebd4d28f7ad3fd03e01ac41759c5f..159c8e04fdef9b288b76201145585c3ef65f2134 100644 GIT binary patch delta 6567 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 J&}Nvc{|CB9&td=o delta 6592 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 diff --git a/source-code/Volo.Abp.BackgroundJobs.SourceCode/Volo.Abp.BackgroundJobs.SourceCode.zip b/source-code/Volo.Abp.BackgroundJobs.SourceCode/Volo.Abp.BackgroundJobs.SourceCode.zip index 3f3a3196f878efd061d8f0150e2bd89fa2804aaa..26fe756069c4e3cf9e80432c782b7dd53aa52201 100644 GIT binary patch delta 8196 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 diff --git a/source-code/Volo.Abp.BasicTheme.SourceCode/Volo.Abp.BasicTheme.SourceCode.zip b/source-code/Volo.Abp.BasicTheme.SourceCode/Volo.Abp.BasicTheme.SourceCode.zip index 3051a256ab72145b719cc214f0faa6eca1dec8b5..686fb5c846cb34b30fe40674c338c43b10dd21c6 100644 GIT binary patch delta 68076 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

BsES$j! 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