diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateBase.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateBase.cs index a351589881..b5976b403f 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateBase.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateBase.cs @@ -103,6 +103,7 @@ namespace Volo.Abp.Cli.ProjectBuilding.Templates.App if (context.BuildArgs.ExtraProperties.ContainsKey("separate-identity-server")) { steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.HttpApi.HostWithIds")); + steps.Add(new AppTemplateChangeDbMigratorPortSettingsStep("44300")); } else { @@ -123,6 +124,7 @@ namespace Volo.Abp.Cli.ProjectBuilding.Templates.App { steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.HttpApi.HostWithIds")); steps.Add(new BlazorAppsettingsFilePortChangeForSeparatedIdentityServersStep()); + steps.Add(new AppTemplateChangeDbMigratorPortSettingsStep("44300")); } else { @@ -140,6 +142,7 @@ namespace Volo.Abp.Cli.ProjectBuilding.Templates.App steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.Web")); steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.Web.Tests", projectFolderPath: "/aspnet-core/test/MyCompanyName.MyProjectName.Web.Tests")); steps.Add(new AppTemplateProjectRenameStep("MyCompanyName.MyProjectName.Web.Host", "MyCompanyName.MyProjectName.Web")); + steps.Add(new AppTemplateChangeDbMigratorPortSettingsStep("44300")); } else { @@ -162,6 +165,7 @@ namespace Volo.Abp.Cli.ProjectBuilding.Templates.App { steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.HttpApi.HostWithIds")); steps.Add(new AngularEnvironmentFilePortChangeForSeparatedIdentityServersStep()); + steps.Add(new AppTemplateChangeDbMigratorPortSettingsStep("44300")); if (context.BuildArgs.MobileApp == MobileApp.ReactNative) { diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateChangeDbMigratorPortSettingsStep.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateChangeDbMigratorPortSettingsStep.cs new file mode 100644 index 0000000000..2d192f1478 --- /dev/null +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateChangeDbMigratorPortSettingsStep.cs @@ -0,0 +1,24 @@ +using Volo.Abp.Cli.ProjectBuilding.Building; +using Volo.Abp.Cli.ProjectBuilding.Files; + +namespace Volo.Abp.Cli.ProjectBuilding.Templates.App +{ + public class AppTemplateChangeDbMigratorPortSettingsStep : ProjectBuildPipelineStep + { + public string IdentityServerPort { get; } + + /// + public AppTemplateChangeDbMigratorPortSettingsStep( + string identityServerPort) + { + IdentityServerPort = identityServerPort; + } + + public override void Execute(ProjectBuildContext context) + { + context + .GetFile("/aspnet-core/src/MyCompanyName.MyProjectName.DbMigrator/appsettings.json") + .ReplaceText("44305", IdentityServerPort); + } + } +} diff --git a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/AbpVirtualFileExplorerWebModule.cs b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/AbpVirtualFileExplorerWebModule.cs index f49628aa45..41c007e06d 100644 --- a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/AbpVirtualFileExplorerWebModule.cs +++ b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/AbpVirtualFileExplorerWebModule.cs @@ -1,4 +1,5 @@ using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.FileProviders.Physical; using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap; using Volo.Abp.AspNetCore.Mvc.UI.Bundling; using Volo.Abp.AspNetCore.Mvc.UI.Packages.Prismjs; diff --git a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Pages/VirtualFileExplorer/Index.cshtml.cs b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Pages/VirtualFileExplorer/Index.cshtml.cs index b450531cc8..14f9fc581f 100644 --- a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Pages/VirtualFileExplorer/Index.cshtml.cs +++ b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Pages/VirtualFileExplorer/Index.cshtml.cs @@ -1,10 +1,9 @@ +using System; using System.Collections.Generic; using System.Linq; using System.Text; -using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.FileProviders; -using NUglify.Helpers; using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Pagination; using Volo.Abp.VirtualFileExplorer.Web.Models; using Volo.Abp.VirtualFileSystem; @@ -31,7 +30,6 @@ namespace Volo.Abp.VirtualFileExplorer.Web.Pages.VirtualFileExplorer protected IVirtualFileProvider VirtualFileProvider { get; } - public IndexModel(IVirtualFileProvider virtualFileProvider) { VirtualFileProvider = virtualFileProvider; @@ -67,16 +65,26 @@ namespace Volo.Abp.VirtualFileExplorer.Web.Pages.VirtualFileExplorer LastUpdateTime = fileInfo.LastModified.LocalDateTime }; + var filePath = fileInfo.PhysicalPath ?? $"{Path.EnsureEndsWith('/')}{fileInfo.Name}";; + if (fileInfo.IsDirectory) { fileInfoViewModel.Icon = "fas fa-folder"; fileInfoViewModel.FileType = "folder"; fileInfoViewModel.Length = "/"; - fileInfoViewModel.FileName =$"{fileInfo.Name}"; + fileInfoViewModel.FileName =$"{fileInfo.Name}"; } else { - fileInfoViewModel.FilePath = ((EmbeddedResourceFileInfo) fileInfo).VirtualPath; + if (fileInfo is EmbeddedResourceFileInfo embeddedResourceFileInfo) + { + fileInfoViewModel.FilePath = embeddedResourceFileInfo.VirtualPath; + } + else + { + fileInfoViewModel.FilePath = filePath; + } + } FileInfoList.Add(fileInfoViewModel); diff --git a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/VirtualFileExplorerConsts.cs b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/VirtualFileExplorerConsts.cs index a05020b764..08a5916a0a 100644 --- a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/VirtualFileExplorerConsts.cs +++ b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/VirtualFileExplorerConsts.cs @@ -2,6 +2,6 @@ { public static class VirtualFileExplorerConsts { - public static string[] AllowFileInfoTypes = new[] {"VirtualDirectoryFileInfo", "EmbeddedResourceFileInfo"}; + public static readonly string[] AllowFileInfoTypes = {"VirtualDirectoryFileInfo", "EmbeddedResourceFileInfo", "ManifestDirectoryInfo" , "ManifestFileInfo"}; } } diff --git a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Volo.Abp.VirtualFileExplorer.Web.csproj b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Volo.Abp.VirtualFileExplorer.Web.csproj index d41cec81c1..cfe69554ac 100644 --- a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Volo.Abp.VirtualFileExplorer.Web.csproj +++ b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Volo.Abp.VirtualFileExplorer.Web.csproj @@ -9,6 +9,7 @@ false false false + true true Library @@ -18,14 +19,12 @@ - - @@ -34,4 +33,8 @@ + + + + diff --git a/npm/ng-packs/packages/core/src/lib/core.module.ts b/npm/ng-packs/packages/core/src/lib/core.module.ts index a661012ac7..f25f8f07ac 100644 --- a/npm/ng-packs/packages/core/src/lib/core.module.ts +++ b/npm/ng-packs/packages/core/src/lib/core.module.ts @@ -52,6 +52,7 @@ export function storageFactory(): OAuthStorage { FormsModule, ReactiveFormsModule, RouterModule, + LocalizationModule, AbstractNgModelComponent, AutofocusDirective, @@ -76,6 +77,7 @@ export function storageFactory(): OAuthStorage { FormsModule, ReactiveFormsModule, RouterModule, + LocalizationModule, ], declarations: [ AbstractNgModelComponent, @@ -94,6 +96,7 @@ export function storageFactory(): OAuthStorage { StopPropagationDirective, VisibilityDirective, ], + providers: [LocalizationPipe], entryComponents: [ RouterOutletComponent, DynamicLayoutComponent, @@ -125,9 +128,8 @@ export class RootCoreModule {} * CoreModule is the module that is publicly available */ @NgModule({ - exports: [BaseCoreModule, LocalizationModule], - imports: [BaseCoreModule, LocalizationModule], - providers: [LocalizationPipe], + exports: [BaseCoreModule], + imports: [BaseCoreModule], }) export class CoreModule { static forRoot(options = {} as ABP.Root): ModuleWithProviders { diff --git a/npm/ng-packs/packages/core/src/lib/models/common.ts b/npm/ng-packs/packages/core/src/lib/models/common.ts index 7e828c9d2a..d4d44faae0 100644 --- a/npm/ng-packs/packages/core/src/lib/models/common.ts +++ b/npm/ng-packs/packages/core/src/lib/models/common.ts @@ -14,6 +14,7 @@ export namespace ABP { export interface Test extends Partial { baseHref?: string; + listQueryDebounceTime?: number; routes?: Routes; } diff --git a/npm/ng-packs/packages/core/src/lib/services/list.service.ts b/npm/ng-packs/packages/core/src/lib/services/list.service.ts index 135b13a912..0bd3e927ae 100644 --- a/npm/ng-packs/packages/core/src/lib/services/list.service.ts +++ b/npm/ng-packs/packages/core/src/lib/services/list.service.ts @@ -1,5 +1,12 @@ -import { Inject, Injectable, OnDestroy, Optional } from '@angular/core'; -import { BehaviorSubject, Observable, of, ReplaySubject, Subject } from 'rxjs'; +import { Injectable, Injector, OnDestroy } from '@angular/core'; +import { + BehaviorSubject, + MonoTypeOperatorFunction, + Observable, + of, + ReplaySubject, + Subject, +} from 'rxjs'; import { catchError, debounceTime, @@ -68,7 +75,7 @@ export class ListService implements OnDes get query$(): Observable { return this._query$ .asObservable() - .pipe(debounceTime(this.delay || 300), shareReplay({ bufferSize: 1, refCount: true })); + .pipe(this.delay, shareReplay({ bufferSize: 1, refCount: true })); } private _isLoading$ = new BehaviorSubject(false); @@ -89,7 +96,11 @@ export class ListService implements OnDes } as any) as QueryParamsType); }; - constructor(@Optional() @Inject(LIST_QUERY_DEBOUNCE_TIME) private delay: number) { + private delay: MonoTypeOperatorFunction; + + constructor(injector: Injector) { + const delay = injector.get(LIST_QUERY_DEBOUNCE_TIME, 300); + this.delay = delay ? debounceTime(delay) : tap(); this.get(); } diff --git a/npm/ng-packs/packages/core/testing/src/lib/core-testing.module.ts b/npm/ng-packs/packages/core/testing/src/lib/core-testing.module.ts index 9a7fc3eec0..7fa32a1b89 100644 --- a/npm/ng-packs/packages/core/testing/src/lib/core-testing.module.ts +++ b/npm/ng-packs/packages/core/testing/src/lib/core-testing.module.ts @@ -3,14 +3,14 @@ import { BaseCoreModule, coreOptionsFactory, CORE_OPTIONS, - LocalizationPipe, + LIST_QUERY_DEBOUNCE_TIME, RestService, } from '@abp/ng.core'; import { APP_BASE_HREF } from '@angular/common'; import { ModuleWithProviders, NgModule } from '@angular/core'; +import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { provideRoutes } from '@angular/router'; import { RouterTestingModule } from '@angular/router/testing'; -import { MockLocalizationPipe } from './pipes/mock-localization.pipe'; import { MockRestService } from './services/mock-rest.service'; /** @@ -18,13 +18,12 @@ import { MockRestService } from './services/mock-rest.service'; * and it provides mock alternatives */ @NgModule({ - exports: [RouterTestingModule, BaseCoreModule, MockLocalizationPipe], - imports: [RouterTestingModule, BaseCoreModule], - declarations: [MockLocalizationPipe], + exports: [RouterTestingModule, BaseCoreModule], + imports: [NoopAnimationsModule, RouterTestingModule, BaseCoreModule], }) export class CoreTestingModule { static withConfig( - { baseHref = '/', routes = [], ...options } = {} as ABP.Test, + { baseHref = '/', listQueryDebounceTime = 0, routes = [], ...options } = {} as ABP.Test, ): ModuleWithProviders { return { ngModule: CoreTestingModule, @@ -40,8 +39,8 @@ export class CoreTestingModule { deps: ['CORE_OPTIONS'], }, { - provide: LocalizationPipe, - useClass: MockLocalizationPipe, + provide: LIST_QUERY_DEBOUNCE_TIME, + useValue: listQueryDebounceTime, }, { provide: RestService, diff --git a/npm/ng-packs/packages/core/testing/src/lib/pipes/index.ts b/npm/ng-packs/packages/core/testing/src/lib/pipes/index.ts deleted file mode 100644 index 60bb9b7dce..0000000000 --- a/npm/ng-packs/packages/core/testing/src/lib/pipes/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './mock-localization.pipe'; diff --git a/npm/ng-packs/packages/core/testing/src/lib/pipes/mock-localization.pipe.ts b/npm/ng-packs/packages/core/testing/src/lib/pipes/mock-localization.pipe.ts deleted file mode 100644 index 302173cb0f..0000000000 --- a/npm/ng-packs/packages/core/testing/src/lib/pipes/mock-localization.pipe.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Config } from '@abp/ng.core'; -import { Injectable, Pipe, PipeTransform } from '@angular/core'; - -@Injectable() -@Pipe({ - name: 'abpLocalization', -}) -export class MockLocalizationPipe implements PipeTransform { - transform(value: string | Config.LocalizationWithDefault = '', ..._: string[]) { - return typeof value === 'string' ? value : value.defaultValue; - } -} diff --git a/npm/ng-packs/packages/core/testing/src/public-api.ts b/npm/ng-packs/packages/core/testing/src/public-api.ts index 8028a99aac..3b48853680 100644 --- a/npm/ng-packs/packages/core/testing/src/public-api.ts +++ b/npm/ng-packs/packages/core/testing/src/public-api.ts @@ -1,2 +1 @@ export * from './lib/core-testing.module'; -export * from './lib/pipes'; diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/ui-extensions.module.ts b/npm/ng-packs/packages/theme-shared/extensions/src/lib/ui-extensions.module.ts index 11f9ff9e4d..28456e0324 100644 --- a/npm/ng-packs/packages/theme-shared/extensions/src/lib/ui-extensions.module.ts +++ b/npm/ng-packs/packages/theme-shared/extensions/src/lib/ui-extensions.module.ts @@ -47,4 +47,10 @@ import { PropDataDirective } from './directives/prop-data.directive'; NgbTypeaheadModule, ], }) +export class BaseUiExtensionsModule {} + +@NgModule({ + exports: [BaseUiExtensionsModule], + imports: [BaseUiExtensionsModule], +}) export class UiExtensionsModule {} diff --git a/npm/ng-packs/packages/theme-shared/extensions/testing/ng-package.json b/npm/ng-packs/packages/theme-shared/extensions/testing/ng-package.json new file mode 100644 index 0000000000..10757e7f04 --- /dev/null +++ b/npm/ng-packs/packages/theme-shared/extensions/testing/ng-package.json @@ -0,0 +1,7 @@ +{ + "$schema": "../../../../node_modules/ng-packagr/ng-package.schema.json", + "dest": "../../dist/theme-shared/extensions/testing", + "lib": { + "entryFile": "src/public-api.ts" + } +} diff --git a/npm/ng-packs/packages/theme-shared/extensions/testing/src/lib/ui-extensions-testing.module.ts b/npm/ng-packs/packages/theme-shared/extensions/testing/src/lib/ui-extensions-testing.module.ts new file mode 100644 index 0000000000..593cce3733 --- /dev/null +++ b/npm/ng-packs/packages/theme-shared/extensions/testing/src/lib/ui-extensions-testing.module.ts @@ -0,0 +1,8 @@ +import { BaseUiExtensionsModule } from '@abp/ng.theme.shared/extensions'; +import { NgModule } from '@angular/core'; + +@NgModule({ + exports: [BaseUiExtensionsModule], + imports: [BaseUiExtensionsModule], +}) +export class UiExtensionsTestingModule {} diff --git a/npm/ng-packs/packages/theme-shared/extensions/testing/src/public-api.ts b/npm/ng-packs/packages/theme-shared/extensions/testing/src/public-api.ts new file mode 100644 index 0000000000..d524c9cd0c --- /dev/null +++ b/npm/ng-packs/packages/theme-shared/extensions/testing/src/public-api.ts @@ -0,0 +1 @@ +export * from './lib/ui-extensions-testing.module'; diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.DbMigrator/appsettings.json b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.DbMigrator/appsettings.json index 2e4a69bd49..1d9beacd54 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.DbMigrator/appsettings.json +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.DbMigrator/appsettings.json @@ -21,7 +21,7 @@ "MyProjectName_Swagger": { "ClientId": "MyProjectName_Swagger", "ClientSecret": "1q2w3e*", - "RootUrl": "https://localhost:44300" + "RootUrl": "https://localhost:44305" } } } diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyProjectNameHttpApiHostModule.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyProjectNameHttpApiHostModule.cs index 39cedbb06a..ac55c87569 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyProjectNameHttpApiHostModule.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyProjectNameHttpApiHostModule.cs @@ -58,7 +58,7 @@ namespace MyCompanyName.MyProjectName ConfigureLocalization(); ConfigureVirtualFileSystem(context); ConfigureCors(context, configuration); - ConfigureSwaggerServices(context); + ConfigureSwaggerServices(context, configuration); } private void ConfigureBundles() @@ -129,9 +129,14 @@ namespace MyCompanyName.MyProjectName }); } - private static void ConfigureSwaggerServices(ServiceConfigurationContext context) + private static void ConfigureSwaggerServices(ServiceConfigurationContext context, IConfiguration configuration) { - context.Services.AddSwaggerGen( + context.Services.AddAbpSwaggerGenWithOAuth( + configuration["AuthServer:Authority"], + new Dictionary + { + {"MyProjectName", "MyProjectName API"} + }, options => { options.SwaggerDoc("v1", new OpenApiInfo {Title = "MyProjectName API", Version = "v1"}); @@ -216,6 +221,10 @@ namespace MyCompanyName.MyProjectName app.UseAbpSwaggerUI(c => { c.SwaggerEndpoint("/swagger/v1/swagger.json", "MyProjectName API"); + + var configuration = context.ServiceProvider.GetRequiredService(); + c.OAuthClientId(configuration["AuthServer:SwaggerClientId"]); + c.OAuthClientSecret(configuration["AuthServer:SwaggerClientSecret"]); }); app.UseAuditing(); diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/appsettings.json b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/appsettings.json index 795753ec9d..1051a8576c 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/appsettings.json +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/appsettings.json @@ -9,7 +9,9 @@ }, "AuthServer": { "Authority": "https://localhost:44305", - "RequireHttpsMetadata": "false" + "RequireHttpsMetadata": "false", + "SwaggerClientId": "MyProjectName_Swagger", + "SwaggerClientSecret": "1q2w3e*" }, "StringEncryption": { "DefaultPassPhrase": "gsKnGZ041HLL4IM8"