From f4ea6d2227f46763e78f49b998aaaf57a3526b66 Mon Sep 17 00:00:00 2001 From: Goxiaoy Date: Thu, 19 Sep 2019 17:43:52 +0800 Subject: [PATCH 1/7] add display name to FeatureDto --- .../Volo/Abp/FeatureManagement/FeatureDto.cs | 2 ++ .../Volo/Abp/FeatureManagement/FeatureAppService.cs | 1 + 2 files changed, 3 insertions(+) diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/FeatureDto.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/FeatureDto.cs index 75f5722ee8..1128cfd2e2 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/FeatureDto.cs +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/FeatureDto.cs @@ -7,6 +7,8 @@ namespace Volo.Abp.FeatureManagement { public string Name { get; set; } + public string DisplayName { get; set; } + public string Value { get; set; } public string Description { get; set; } diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Application/Volo/Abp/FeatureManagement/FeatureAppService.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Application/Volo/Abp/FeatureManagement/FeatureAppService.cs index ca2ea995c7..71b41c26e8 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Application/Volo/Abp/FeatureManagement/FeatureAppService.cs +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Application/Volo/Abp/FeatureManagement/FeatureAppService.cs @@ -44,6 +44,7 @@ namespace Volo.Abp.FeatureManagement features.Add(new FeatureDto { Name = featureDefinition.Name, + DisplayName = featureDefinition.DisplayName?.Localize(_stringLocalizerFactory), ValueType = featureDefinition.ValueType, Description = featureDefinition.Description?.Localize(_stringLocalizerFactory), ParentName = featureDefinition.Parent?.Name, From 7b61dfba24e68ef725ebfd39f94bd39ab18678f5 Mon Sep 17 00:00:00 2001 From: brittos Date: Thu, 19 Sep 2019 14:20:14 -0300 Subject: [PATCH 2/7] Pt-BR document translation fix --- docs/pt-BR/Getting-Started-Angular-Template.md | 8 ++++---- .../Getting-Started-AspNetCore-Application.md | 16 ++++++++-------- .../Getting-Started-AspNetCore-MVC-Template.md | 6 +++--- .../pt-BR/Getting-Started-Console-Application.md | 9 ++++----- 4 files changed, 19 insertions(+), 20 deletions(-) diff --git a/docs/pt-BR/Getting-Started-Angular-Template.md b/docs/pt-BR/Getting-Started-Angular-Template.md index cc08b63917..f8f1eac944 100644 --- a/docs/pt-BR/Getting-Started-Angular-Template.md +++ b/docs/pt-BR/Getting-Started-Angular-Template.md @@ -1,4 +1,4 @@ -## Introdução ao modelo de aplicativo angular +## Introdução ao modelo de aplicativo Angular Este tutorial explica como criar um novo aplicativo Angular usando o modelo de inicialização, configurar e executá-lo. @@ -37,13 +37,13 @@ Abra a solução no **Visual Studio** : ![livraria-visual-studio-solução](images/bookstore-visual-studio-solution-for-spa.png) -A solução possui uma estrutura em camadas (baseada no [Domain Driven Design](Domain-Driven-Design.md) ) e contém projetos de teste de unidade e integração adequadamente configurados para trabalhar com o **banco de** dados de **memória** **EF Core** e **SQLite** . +A solução possui uma estrutura em camadas (baseada no [Domain Driven Design](Domain-Driven-Design.md) ) e contém projetos de teste de unidade e integração adequadamente configurados para trabalhar com o **banco de dados** **EF Core** & **SQLite in-memory**. > Consulte o [documento do modelo do aplicativo](Startup-Templates/Application.md) para entender a estrutura da solução em detalhes. -### Cadeia de Conexão de Banco de Dados +### String de Conexão de Banco de Dados -Verifique a **cadeia de conexão** no `appsettings.json`arquivo no `.HttpApi.Host`projeto: +Verifique o **connection string** no `appsettings.json`arquivo no `.HttpApi.Host`projeto: ```json { diff --git a/docs/pt-BR/Getting-Started-AspNetCore-Application.md b/docs/pt-BR/Getting-Started-AspNetCore-Application.md index b7f5b793be..4c5fb40ce1 100644 --- a/docs/pt-BR/Getting-Started-AspNetCore-Application.md +++ b/docs/pt-BR/Getting-Started-AspNetCore-Application.md @@ -1,10 +1,10 @@ -# Introdução ao ABP com o aplicativo Web MVC AspNet Core +# Introdução ao ABP com o AspNet Core MVC Web Application Este tutorial explica como iniciar o ABP do zero com dependências mínimas. Você geralmente deseja começar com o **modelo de inicialização** . ## Criar um novo projeto -1. Crie um novo aplicativo da Web vazio do AspNet Core no Visual Studio: +1. Crie um novo aplicativo da Web vazio AspNet Core Web Application no Visual Studio: ![img](images/create-new-aspnet-core-application.png) @@ -58,7 +58,7 @@ namespace BasicAspNetCoreApplication `AppModule` é um bom nome para o módulo de inicialização de um aplicativo. -Os pacotes ABP definem as classes do módulo e um módulo pode depender de outro módulo. No código acima, nosso `AppModule`depende `AbpAspNetCoreMvcModule`(definido pelo pacote Volo.Abp.AspNetCore.Mvc). É comum adicionar um `DependsOn`atributo após a instalação de um novo pacote de nuget ABP. +Os pacotes ABP definem as classes do módulo e um módulo pode depender de outro módulo. No código acima, nosso `AppModule` depende `AbpAspNetCoreMvcModule`(definido pelo pacote Volo.Abp.AspNetCore.Mvc). É comum adicionar um `DependsOn`atributo após a instalação de um novo pacote de nuget ABP. Em vez da classe Startup, estamos configurando o pipeline do ASP.NET Core nesta classe de módulo. @@ -90,7 +90,7 @@ namespace BasicAspNetCoreApplication } ``` -`ConfigureServices`Método alterado para retornar em `IServiceProvider`vez de `void`. Essa alteração nos permite substituir a injeção de dependência do AspNet Core por outra estrutura (consulte a seção de integração com Autofac abaixo). `services.AddApplication()`adiciona todos os serviços definidos em todos os módulos a partir do `AppModule`. +`ConfigureServices` Método alterado para retornar em `IServiceProvider` vez de `void`. Essa alteração nos permite substituir a injeção de dependência do AspNet Core por outra estrutura (consulte a seção de integração com Autofac abaixo). `services.AddApplication()` adiciona todos os serviços definidos em todos os módulos a partir do `AppModule`. `app.InitializeApplication()`O `Configure`método call in inicializa e inicia o aplicativo. @@ -118,7 +118,7 @@ Se você executar o aplicativo, verá um "Olá, mundo!" mensagem na página. Derivado `HomeController`de em `AbpController`vez de `Controller`classe padrão . Isso não é necessário, mas a `AbpController`classe possui propriedades e métodos base úteis para facilitar seu desenvolvimento. -## Usando Autofac como a estrutura de injeção de dependência +## Usando Autofac como framework de injeção de dependência Embora o sistema de Injeção de Dependência (DI) do AspNet Core seja adequado para requisitos básicos, o Autofac fornece recursos avançados, como Injeção de Propriedade e Interceptação de Método, exigidos pela ABP para executar recursos avançados da estrutura de aplicativos. @@ -130,7 +130,7 @@ Substituir o sistema DI do AspNet Core pelo Autofac e integrar ao ABP é bastant Install-Package Volo.Abp.Autofac ``` -1. Adicionar `AbpAutofacModule`dependência +1. Adicionar `AbpAutofacModule` dependência ```csharp [DependsOn(typeof(AbpAspNetCoreMvcModule))] @@ -141,7 +141,7 @@ public class AppModule : AbpModule } ``` -1. Altere a `services.AddApplication();`linha na `Startup`classe, como mostrado abaixo: +1. Altere a `services.AddApplication();` linha na `Startup`classe, como mostrado abaixo: ```csharp services.AddApplication(options => @@ -150,7 +150,7 @@ services.AddApplication(options => }); ``` -1. Atualize `Program.cs`para não usar o `WebHost.CreateDefaultBuilder()`método, pois ele usa o contêiner DI padrão: +1. Atualize `Program.cs` para não usar o `WebHost.CreateDefaultBuilder()` método, pois ele usa o contêiner DI padrão: ```csharp public class Program diff --git a/docs/pt-BR/Getting-Started-AspNetCore-MVC-Template.md b/docs/pt-BR/Getting-Started-AspNetCore-MVC-Template.md index 076fd978ca..029b898b8d 100644 --- a/docs/pt-BR/Getting-Started-AspNetCore-MVC-Template.md +++ b/docs/pt-BR/Getting-Started-AspNetCore-MVC-Template.md @@ -20,7 +20,7 @@ abp new Acme.BookStore > Você pode usar diferentes níveis de namespaces; por exemplo, BookStore, Acme.BookStore ou Acme.Retail.BookStore. -`new`O comando cria um **aplicativo MVC em camadas** com o **Entity Framework Core** como o provedor de banco de dados. No entanto, possui opções adicionais. Consulte a [documentação](CLI.md) da [CLI](CLI.md) para todas as opções disponíveis. +`new` O comando cria um **aplicativo MVC em camadas** com o **Entity Framework Core** como o provedor de banco de dados. No entanto, possui opções adicionais. Consulte a [documentação](CLI.md) da [CLI](CLI.md) para todas as opções disponíveis. #### Pré requisitos @@ -41,7 +41,7 @@ A solução possui uma estrutura em camadas (baseada no [Domain Driven Design](D ### Cadeia de Conexão de Banco de Dados -Verifique a **cadeia de conexão** no `appsettings.json`arquivo no `.Web`projeto: +Verifique a **connection string** no `appsettings.json`arquivo no `.Web`projeto: ```json { @@ -91,7 +91,7 @@ Verifique se o `.Web`projeto é o projeto de inicialização. Execute o aplicati ![livraria-homepage](images/bookstore-homepage.png) -Clique no botão **Login** , insira `admin`como nome de usuário e `1q2w3E*`senha para acessar o aplicativo. +Clique no botão **Login** , insira `admin` como nome de usuário e `1q2w3E*` senha para acessar o aplicativo. O modelo de inicialização inclui os módulos de **gerenciamento de** **identidade** e **gerenciamento de inquilino** . Após o login, o menu Administração estará disponível, onde você poderá gerenciar **inquilinos** , **funções** , **usuários** e suas **permissões** . A página de gerenciamento de usuários é mostrada abaixo: diff --git a/docs/pt-BR/Getting-Started-Console-Application.md b/docs/pt-BR/Getting-Started-Console-Application.md index f21a959a9c..f5a0d5d5d0 100644 --- a/docs/pt-BR/Getting-Started-Console-Application.md +++ b/docs/pt-BR/Getting-Started-Console-Application.md @@ -10,7 +10,7 @@ Crie um novo aplicativo regular .Net Core Console do Visual Studio: ## Instale o pacote Volo.Abp -Volo.Abp.Core é o pacote principal de pepitas para criar aplicativos baseados em ABP. Então, instale-o no seu projeto: +Volo.Abp.Core é o pacote principal de nuget para criar aplicativos baseados em ABP. Então, instale-o no seu projeto: ``` Install-Package Volo.Abp.Core @@ -18,7 +18,7 @@ Install-Package Volo.Abp.Core ## Criar o primeiro módulo ABP -O ABP é uma estrutura modular e requer uma classe de **módulo de inicialização (raiz)** derivada de `AbpModule`: +O ABP é um framework modular e requer uma classe de **módulo de inicialização (raiz)** derivada de `AbpModule`: ```csharp using Microsoft.Extensions.DependencyInjection; @@ -117,9 +117,9 @@ namespace AbpConsoleDemo Embora seja suficiente para este exemplo de código simples, é sempre recomendável criar escopos no caso de resolver diretamente dependências de `IServiceProvider`(consulte a [documentação de Injeção de Dependências](Dependency-Injection.md)). -## Usando Autofac como a estrutura de injeção de dependência +## Usando Autofac como framework de injeção de dependência -Embora o sistema de Injeção de Dependência (DI) do AspNet Core seja adequado para requisitos básicos, o Autofac fornece recursos avançados, como Injeção de Propriedade e Interceptação de Método, exigidos pela ABP para executar recursos avançados da estrutura de aplicativos. +Embora o sistema de Injeção de Dependência (DI) do AspNet Core seja adequado para requisitos básicos, o Autofac fornece recursos avançados, como Injeção de Propriedade e Interceptação de Método, exigidos pela ABP para executar recursos avançados do framework de aplicativos. Substituir o sistema DI do AspNet Core pelo Autofac e integrar ao ABP é bastante fácil. @@ -179,4 +179,3 @@ Apenas chamado `options.UseAutofac()`método nas `AbpApplicationFactory.Create`o Obter código-fonte do projeto de exemplo criada neste tutorial a partir de [aqui](https://github.com/abpframework/abp/tree/master/samples/BasicConsoleApplication) . - \ No newline at end of file From 09d454b94ff475cf7e544a509d5afba54efb1b42 Mon Sep 17 00:00:00 2001 From: brittos Date: Thu, 19 Sep 2019 17:12:55 -0300 Subject: [PATCH 3/7] Create pt-BR.json --- .../Abp/IdentityServer/Localization/Resources/pt-BR.json | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/pt-BR.json diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/pt-BR.json b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/pt-BR.json new file mode 100644 index 0000000000..8c0353cea3 --- /dev/null +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/pt-BR.json @@ -0,0 +1,8 @@ +{ + "culture": "pt-BR", + "texts": { + "Volo.IdentityServer:DuplicateIdentityResourceName": "O nome da Identity Resource já existe: {Name}", + "Volo.IdentityServer:DuplicateApiResourceName": "O nome da Api Resource já existe: {Name}", + "Volo.IdentityServer:DuplicateClientId": "ClientId já existe: {ClientId}" + } +} \ No newline at end of file From d74eac5b974fa48a9a1b13ed018f558c03651566 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Fri, 20 Sep 2019 10:20:56 +0300 Subject: [PATCH 4/7] feature(setting-management): add policy control to settings.service --- .../src/lib/services/setting-management.service.ts | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/npm/ng-packs/packages/setting-management/src/lib/services/setting-management.service.ts b/npm/ng-packs/packages/setting-management/src/lib/services/setting-management.service.ts index e04019e3c3..14f7a35a75 100644 --- a/npm/ng-packs/packages/setting-management/src/lib/services/setting-management.service.ts +++ b/npm/ng-packs/packages/setting-management/src/lib/services/setting-management.service.ts @@ -1,10 +1,10 @@ import { SettingTab } from '@abp/ng.theme.shared'; import { Injectable } from '@angular/core'; -import { RouteConfigLoadEnd, Router } from '@angular/router'; +import { Router } from '@angular/router'; import { Navigate } from '@ngxs/router-plugin'; import { Store } from '@ngxs/store'; -import { Subject, Subscription, timer } from 'rxjs'; -import { filter, takeUntil } from 'rxjs/operators'; +import { Subject } from 'rxjs'; +import { ConfigState } from '@abp/ng.core'; @Injectable({ providedIn: 'root' }) export class SettingManagementService { @@ -27,7 +27,9 @@ export class SettingManagementService { setSettings() { setTimeout(() => { const route = this.router.config.find(r => r.path === 'setting-management'); - this.settings = route.data.settings.sort((a, b) => a.order - b.order); + this.settings = (route.data.settings as SettingTab[]) + .filter(setting => this.store.selectSnapshot(ConfigState.getGrantedPolicy(setting.requiredPolicy))) + .sort((a, b) => a.order - b.order); this.checkSelected(); }, 0); } From 19a1abba0cc1d42bdaeb8b654737379223ee61bf Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Fri, 20 Sep 2019 10:22:45 +0300 Subject: [PATCH 5/7] fix(core): add ng zone to route navigating --- .../core/src/lib/services/localization.service.ts | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/npm/ng-packs/packages/core/src/lib/services/localization.service.ts b/npm/ng-packs/packages/core/src/lib/services/localization.service.ts index 4dba26bc1f..2af99ee227 100644 --- a/npm/ng-packs/packages/core/src/lib/services/localization.service.ts +++ b/npm/ng-packs/packages/core/src/lib/services/localization.service.ts @@ -1,4 +1,4 @@ -import { Injectable, Optional, SkipSelf } from '@angular/core'; +import { Injectable, Optional, SkipSelf, NgZone } from '@angular/core'; import { ActivatedRouteSnapshot, Router } from '@angular/router'; import { Actions, Store } from '@ngxs/store'; import { noop, Observable } from 'rxjs'; @@ -17,6 +17,7 @@ export class LocalizationService { constructor( private store: Store, private router: Router, + private ngZone: NgZone, private actions: Actions, @Optional() @SkipSelf() @@ -35,9 +36,11 @@ export class LocalizationService { this.setRouteReuse(() => false); this.router.navigated = false; - return registerLocale(locale).then(async () => { - await this.router.navigateByUrl(this.router.url).catch(noop); - this.setRouteReuse(shouldReuseRoute); + return registerLocale(locale).then(() => { + this.ngZone.run(async () => { + await this.router.navigateByUrl(this.router.url).catch(noop); + this.setRouteReuse(shouldReuseRoute); + }); }); } From a5ce9559e5576ece471ec94d8df33ac9f273fb54 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Fri, 20 Sep 2019 10:23:32 +0300 Subject: [PATCH 6/7] feature(core): add new input visibility directive for no listen to dom --- .../lib/directives/visibility.directive.ts | 55 +++++++++++++------ .../packages/theme-shared/package.json | 2 +- 2 files changed, 38 insertions(+), 19 deletions(-) diff --git a/npm/ng-packs/packages/core/src/lib/directives/visibility.directive.ts b/npm/ng-packs/packages/core/src/lib/directives/visibility.directive.ts index da379b250a..56b49f23ee 100644 --- a/npm/ng-packs/packages/core/src/lib/directives/visibility.directive.ts +++ b/npm/ng-packs/packages/core/src/lib/directives/visibility.directive.ts @@ -9,34 +9,49 @@ export class VisibilityDirective implements AfterViewInit { @Input('abpVisibility') focusedElement: HTMLElement; + @Input() + mutationObserverEnabled: boolean = true; + completed$ = new Subject(); constructor(@Optional() private elRef: ElementRef, private renderer: Renderer2) {} ngAfterViewInit() { - const observer = new MutationObserver(mutations => { - mutations.forEach(mutation => { - if (!mutation.target) return; + let observer: MutationObserver; + if (this.mutationObserverEnabled) { + observer = new MutationObserver(mutations => { + mutations.forEach(mutation => { + if (!mutation.target) return; - const htmlNodes = snq( - () => Array.from(mutation.target.childNodes).filter(node => node instanceof HTMLElement), - [], - ); + const htmlNodes = snq( + () => Array.from(mutation.target.childNodes).filter(node => node instanceof HTMLElement), + [], + ); - if (!htmlNodes.length) { - this.renderer.removeChild(this.elRef.nativeElement.parentElement, this.elRef.nativeElement); - this.disconnect(); - } else { - setTimeout(() => { + if (!htmlNodes.length) { + this.removeFromDOM(); this.disconnect(); - }, 0); - } + } else { + setTimeout(() => { + this.disconnect(); + }, 0); + } + }); }); - }); - observer.observe(this.focusedElement, { - childList: true, - }); + observer.observe(this.focusedElement, { + childList: true, + }); + } else { + setTimeout(() => { + const htmlNodes = snq( + () => Array.from(this.focusedElement.childNodes).filter(node => node instanceof HTMLElement), + [], + ); + + if (!htmlNodes.length) this.removeFromDOM(); + }, 0); + } this.completed$.subscribe(() => observer.disconnect()); } @@ -45,4 +60,8 @@ export class VisibilityDirective implements AfterViewInit { this.completed$.next(); this.completed$.complete(); } + + removeFromDOM() { + this.renderer.removeChild(this.elRef.nativeElement.parentElement, this.elRef.nativeElement); + } } diff --git a/npm/ng-packs/packages/theme-shared/package.json b/npm/ng-packs/packages/theme-shared/package.json index 867930bf1f..554cbbe105 100644 --- a/npm/ng-packs/packages/theme-shared/package.json +++ b/npm/ng-packs/packages/theme-shared/package.json @@ -5,7 +5,7 @@ "@abp/ng.core": "^0.8.3", "@angular/cdk": "^8.0.1", "@ng-bootstrap/ng-bootstrap": "^5.1.0", - "@ngx-validate/core": "^0.0.4", + "@ngx-validate/core": "^0.0.5", "bootstrap": "^4.3.1", "chart.js": "^2.8.0", "font-awesome": "^4.7.0", From 1f825d1132bbc270625f215178361da8eb083ec2 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Fri, 20 Sep 2019 10:24:08 +0300 Subject: [PATCH 7/7] feature(theme-shared): add defautl duration to collapse animation --- .../theme-shared/src/lib/animations/collapse.animations.ts | 2 +- npm/ng-packs/packages/theme-shared/src/lib/contants/styles.ts | 4 ++++ .../angular/src/app/books/shared/books.service.ts | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/npm/ng-packs/packages/theme-shared/src/lib/animations/collapse.animations.ts b/npm/ng-packs/packages/theme-shared/src/lib/animations/collapse.animations.ts index 57d5a5c49e..ecbec49e99 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/animations/collapse.animations.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/animations/collapse.animations.ts @@ -15,5 +15,5 @@ export const collapse = trigger('collapse', [ overflow: 'hidden', }), ), - transition('open <=> close', animate('{{duration}}ms')), + transition(`open <=> close`, animate('{{duration}}ms'), { params: { duration: '350' } }), ]); diff --git a/npm/ng-packs/packages/theme-shared/src/lib/contants/styles.ts b/npm/ng-packs/packages/theme-shared/src/lib/contants/styles.ts index 7291eb0ab9..0388f3b51c 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/contants/styles.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/contants/styles.ts @@ -150,6 +150,10 @@ export default ` margin-left: 10px !important; } +.ui-widget-overlay { + z-index: 1000; +} + /* { return this.restService.request({ method: 'GET', - url: '/api/app/book', + url: '/api/app/book?MaxResultCount=100', }); }