Merge branch 'dev' into cms-kit/content-management

pull/6858/head
Ahmet 5 years ago
commit 729033082b

@ -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)
{

@ -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; }
/// <param name="identityServerPort"></param>
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);
}
}
}

@ -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;

@ -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 =$"<a href='{Url.Content("~/")}VirtualFileExplorer?path={fileInfo.PhysicalPath}'>{fileInfo.Name}</a>";
fileInfoViewModel.FileName =$"<a href='{Url.Content("~/")}VirtualFileExplorer?path={filePath}'>{fileInfo.Name}</a>";
}
else
{
fileInfoViewModel.FilePath = ((EmbeddedResourceFileInfo) fileInfo).VirtualPath;
if (fileInfo is EmbeddedResourceFileInfo embeddedResourceFileInfo)
{
fileInfoViewModel.FilePath = embeddedResourceFileInfo.VirtualPath;
}
else
{
fileInfoViewModel.FilePath = filePath;
}
}
FileInfoList.Add(fileInfoViewModel);

@ -2,6 +2,6 @@
{
public static class VirtualFileExplorerConsts
{
public static string[] AllowFileInfoTypes = new[] {"VirtualDirectoryFileInfo", "EmbeddedResourceFileInfo"};
public static readonly string[] AllowFileInfoTypes = {"VirtualDirectoryFileInfo", "EmbeddedResourceFileInfo", "ManifestDirectoryInfo" , "ManifestFileInfo"};
}
}

@ -9,6 +9,7 @@
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
<GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
<GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>
<GenerateEmbeddedFilesManifest>true</GenerateEmbeddedFilesManifest>
<IsPackable>true</IsPackable>
<OutputType>Library</OutputType>
</PropertyGroup>
@ -18,14 +19,12 @@
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Pages\**\*.cshtml" />
<EmbeddedResource Include="Pages\**\*.css" />
<EmbeddedResource Include="Pages\**\*.js" />
<EmbeddedResource Include="Components\**\*.js" />
<EmbeddedResource Include="Components\**\*.css" />
<EmbeddedResource Include="wwwroot\**\*.*" />
<EmbeddedResource Include="Localization\**\*.json" />
<Content Remove="Pages\**\*.cshtml" />
<Content Remove="Pages\**\*.css" />
<Content Remove="Pages\**\*.js" />
<Content Remove="wwwroot\**\*.*" />
@ -34,4 +33,8 @@
<Content Remove="Localization\**\*.json" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.FileProviders.Embedded" Version="$(MicrosoftPackageVersion)" />
</ItemGroup>
</Project>

@ -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<RootCoreModule> {

@ -14,6 +14,7 @@ export namespace ABP {
export interface Test extends Partial<Root> {
baseHref?: string;
listQueryDebounceTime?: number;
routes?: Routes;
}

@ -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<QueryParamsType = ABP.PageQueryParams> implements OnDes
get query$(): Observable<QueryParamsType> {
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<QueryParamsType = ABP.PageQueryParams> implements OnDes
} as any) as QueryParamsType);
};
constructor(@Optional() @Inject(LIST_QUERY_DEBOUNCE_TIME) private delay: number) {
private delay: MonoTypeOperatorFunction<QueryParamsType>;
constructor(injector: Injector) {
const delay = injector.get(LIST_QUERY_DEBOUNCE_TIME, 300);
this.delay = delay ? debounceTime(delay) : tap();
this.get();
}

@ -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<CoreTestingModule> {
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,

@ -1 +0,0 @@
export * from './mock-localization.pipe';

@ -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;
}
}

@ -1,2 +1 @@
export * from './lib/core-testing.module';
export * from './lib/pipes';

@ -47,4 +47,10 @@ import { PropDataDirective } from './directives/prop-data.directive';
NgbTypeaheadModule,
],
})
export class BaseUiExtensionsModule {}
@NgModule({
exports: [BaseUiExtensionsModule],
imports: [BaseUiExtensionsModule],
})
export class UiExtensionsModule {}

@ -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"
}
}

@ -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 {}

@ -0,0 +1 @@
export * from './lib/ui-extensions-testing.module';

@ -21,7 +21,7 @@
"MyProjectName_Swagger": {
"ClientId": "MyProjectName_Swagger",
"ClientSecret": "1q2w3e*",
"RootUrl": "https://localhost:44300"
"RootUrl": "https://localhost:44305"
}
}
}

@ -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<string, string>
{
{"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<IConfiguration>();
c.OAuthClientId(configuration["AuthServer:SwaggerClientId"]);
c.OAuthClientSecret(configuration["AuthServer:SwaggerClientSecret"]);
});
app.UseAuditing();

@ -9,7 +9,9 @@
},
"AuthServer": {
"Authority": "https://localhost:44305",
"RequireHttpsMetadata": "false"
"RequireHttpsMetadata": "false",
"SwaggerClientId": "MyProjectName_Swagger",
"SwaggerClientSecret": "1q2w3e*"
},
"StringEncryption": {
"DefaultPassPhrase": "gsKnGZ041HLL4IM8"

Loading…
Cancel
Save