From ea9118dfee97fd2583d0d3da3a89876df73a69e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Leon=20Ko=C5=A1ak?= Date: Tue, 31 Mar 2020 08:51:27 +0200 Subject: [PATCH 1/8] Slovenian translations for Volo.Abp.UI --- .../Localization/Resources/AbpUi/sl.json | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/sl.json diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/sl.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/sl.json new file mode 100644 index 0000000000..641de8a242 --- /dev/null +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/sl.json @@ -0,0 +1,62 @@ +{ + "culture": "sl", + "texts": { + "InternalServerErrorMessage": "Zgodila se je napaka na strežniku!", + "ValidationErrorMessage": "Vaš zahtevek ni veljaven!", + "ValidationNarrativeErrorMessageTitle": "Pri preverjanju so bile zaznane sledeče napake.", + "DefaultErrorMessage": "Zgodila se je napaka!", + "DefaultErrorMessageDetail": "Strežnik ni poslal podrobnosti o napaki.", + "DefaultErrorMessage401": "Niste prijavljeni!", + "DefaultErrorMessage401Detail": "Za izvedbo te operacije se morate prijaviti.", + "DefaultErrorMessage403": "Nimate pravic!", + "DefaultErrorMessage403Detail": "Nimate dovoljenja za izvedbo te operacije!", + "DefaultErrorMessage404": "Vir ni bil najden!", + "DefaultErrorMessage404Detail": "Zahtevanega vira ni bilo mogoče najti na strežniku!", + "EntityNotFoundErrorMessage": "Ni entitete {0} z id-jem = {1}!", + "Languages": "Jeziki", + "Error": "Napaka", + "AreYouSure": "Ali ste prepričani?", + "Cancel": "Prekliči", + "Yes": "Da", + "No": "Ne", + "Ok": "V redu", + "Close": "Zapri", + "Save": "Shrani", + "SavingWithThreeDot": "Shranjujem...", + "Actions": "Dejanja", + "Delete": "Izbriši", + "Edit": "Uredi", + "Refresh": "Osveži", + "Language": "Jezik", + "LoadMore": "Naloži več", + "ProcessingWithThreeDot": "Procesiram...", + "LoadingWithThreeDot": "Nalagam...", + "Welcome": "Dobrodošli", + "Login": "Prijava", + "Register": "Registracija", + "Logout": "Odjava", + "Submit": "Pošlji", + "Back": "Nazaj", + "PagerSearch": "Iskanje", + "PagerNext": "Naslednja", + "PagerPrevious": "Prejšnja", + "PagerFirst": "Prva", + "PagerLast": "Zadnja", + "PagerInfo": "Prikazanih _START_ do _END_ od _TOTAL_ zapisov", + "PagerInfoEmpty": "Prikazanih 0 do 0 od 0 zapisov", + "PagerInfoFiltered": "(filtrirano od vseh _MAX_ zapisov)", + "NoDataAvailableInDatatable": "V tabeli ni na voljo podatkov", + "PagerShowMenuEntries": "Prikaži _MENU_ zapise", + "DatatableActionDropdownDefaultText": "Dejanja", + "ChangePassword": "Zamenjaj geslo", + "PersonalInfo": "Moj profil", + "AreYouSureYouWantToCancelEditingWarningMessage": "Imate neshranjene spremembe.", + "UnhandledException": "Neobravnavana napaka!", + "401Message": "Nepooblaščeno", + "403Message": "Prepovedano", + "404Message": "Strani ni mogoče najti", + "500Message": "Napaka na strani strežnika", + "GoHomePage": "Pojdi na osnovno stran", + "GoBack": "Nazaj" + } +} From 5ae4dccb96a03690d610de5416ae4f2d9c0dbafb Mon Sep 17 00:00:00 2001 From: maliming Date: Wed, 8 Apr 2020 22:17:48 +0800 Subject: [PATCH 2/8] Use the tempkey.rsa file in memory. Resolve #3515 --- .../MyProjectNameTestBaseModule.cs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.TestBase/MyProjectNameTestBaseModule.cs b/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.TestBase/MyProjectNameTestBaseModule.cs index 974a91dcf6..1dfc546ad6 100644 --- a/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.TestBase/MyProjectNameTestBaseModule.cs +++ b/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.TestBase/MyProjectNameTestBaseModule.cs @@ -4,6 +4,7 @@ using Volo.Abp.Authorization; using Volo.Abp.Autofac; using Volo.Abp.BackgroundJobs; using Volo.Abp.Data; +using Volo.Abp.IdentityServer; using Volo.Abp.Modularity; using Volo.Abp.Threading; @@ -17,6 +18,19 @@ namespace MyCompanyName.MyProjectName )] public class MyProjectNameTestBaseModule : AbpModule { + public override void PreConfigureServices(ServiceConfigurationContext context) + { + PreConfigure(options => + { + options.AddDeveloperSigningCredential = false; + }); + + PreConfigure(identityServerBuilder => + { + identityServerBuilder.AddDeveloperSigningCredential(false, System.Guid.NewGuid().ToString()); + }); + } + public override void ConfigureServices(ServiceConfigurationContext context) { Configure(options => From 2a061874b6936ba69e68b823cb4050f767b04a23 Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Sat, 11 Apr 2020 00:32:22 +0300 Subject: [PATCH 3/8] feat: add an empty modal container component --- .../modal/modal-container.component.ts | 12 +++++++ .../tests/modal-container.component.spec.ts | 34 +++++++++++++++++++ .../src/lib/theme-shared.module.ts | 16 +++++---- 3 files changed, 55 insertions(+), 7 deletions(-) create mode 100644 npm/ng-packs/packages/theme-shared/src/lib/components/modal/modal-container.component.ts create mode 100644 npm/ng-packs/packages/theme-shared/src/lib/tests/modal-container.component.spec.ts diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/modal/modal-container.component.ts b/npm/ng-packs/packages/theme-shared/src/lib/components/modal/modal-container.component.ts new file mode 100644 index 0000000000..bd24bd84d2 --- /dev/null +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/modal/modal-container.component.ts @@ -0,0 +1,12 @@ +import { Component, ViewChild, ViewContainerRef } from '@angular/core'; + +@Component({ + selector: 'abp-modal-container', + template: ` + + `, +}) +export class ModalContainerComponent { + @ViewChild('container', { static: true, read: ViewContainerRef }) + container: ViewContainerRef; +} diff --git a/npm/ng-packs/packages/theme-shared/src/lib/tests/modal-container.component.spec.ts b/npm/ng-packs/packages/theme-shared/src/lib/tests/modal-container.component.spec.ts new file mode 100644 index 0000000000..4ee654e9bd --- /dev/null +++ b/npm/ng-packs/packages/theme-shared/src/lib/tests/modal-container.component.spec.ts @@ -0,0 +1,34 @@ +import { Component, ComponentFactoryResolver, ComponentRef } from '@angular/core'; +import { createComponentFactory, Spectator } from '@ngneat/spectator/jest'; +import { ModalContainerComponent } from '../components/modal/modal-container.component'; + +describe('ModalContainerComponent', () => { + @Component({ template: '
bar
' }) + class TestComponent {} + + let componentRef: ComponentRef; + let spectator: Spectator; + + const createComponent = createComponentFactory({ + component: ModalContainerComponent, + entryComponents: [TestComponent], + }); + + beforeEach(() => (spectator = createComponent())); + + afterEach(() => componentRef.destroy()); + + describe('#container', () => { + it('should be a ViewContainerRef', () => { + let foo = document.querySelector('div.foo'); + expect(foo).toBeNull(); + + const cfResolver = spectator.get(ComponentFactoryResolver); + const factory = cfResolver.resolveComponentFactory(TestComponent); + componentRef = spectator.component.container.createComponent(factory); + + foo = document.querySelector('div.foo'); + expect(foo.textContent).toBe('bar'); + }); + }); +}); diff --git a/npm/ng-packs/packages/theme-shared/src/lib/theme-shared.module.ts b/npm/ng-packs/packages/theme-shared/src/lib/theme-shared.module.ts index 15ba212944..f23410d6d0 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/theme-shared.module.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/theme-shared.module.ts @@ -1,4 +1,4 @@ -import { CoreModule, noop, LazyLoadService } from '@abp/ng.core'; +import { CoreModule, LazyLoadService, noop } from '@abp/ng.core'; import { DatePipe } from '@angular/common'; import { APP_INITIALIZER, Injector, ModuleWithProviders, NgModule } from '@angular/core'; import { NgbDateParserFormatter, NgbPaginationModule } from '@ng-bootstrap/ng-bootstrap'; @@ -9,23 +9,24 @@ import { ChartComponent } from './components/chart/chart.component'; import { ConfirmationComponent } from './components/confirmation/confirmation.component'; import { HttpErrorWrapperComponent } from './components/http-error-wrapper/http-error-wrapper.component'; import { LoaderBarComponent } from './components/loader-bar/loader-bar.component'; +import { LoadingComponent } from './components/loading/loading.component'; +import { ModalContainerComponent } from './components/modal/modal-container.component'; import { ModalComponent } from './components/modal/modal.component'; +import { PaginationComponent } from './components/pagination/pagination.component'; import { SortOrderIconComponent } from './components/sort-order-icon/sort-order-icon.component'; import { TableEmptyMessageComponent } from './components/table-empty-message/table-empty-message.component'; -import { ToastContainerComponent } from './components/toast-container/toast-container.component'; import { TableComponent } from './components/table/table.component'; +import { ToastContainerComponent } from './components/toast-container/toast-container.component'; import { ToastComponent } from './components/toast/toast.component'; import styles from './constants/styles'; +import { LoadingDirective } from './directives/loading.directive'; import { TableSortDirective } from './directives/table-sort.directive'; import { ErrorHandler } from './handlers/error.handler'; import { RootParams } from './models/common'; +import { THEME_SHARED_APPEND_CONTENT } from './tokens/append-content.token'; import { httpErrorConfigFactory, HTTP_ERROR_CONFIG } from './tokens/http-error.token'; import { DateParserFormatter } from './utils/date-parser-formatter'; import { chartJsLoaded$ } from './utils/widget-utils'; -import { PaginationComponent } from './components/pagination/pagination.component'; -import { LoadingComponent } from './components/loading/loading.component'; -import { LoadingDirective } from './directives/loading.directive'; -import { THEME_SHARED_APPEND_CONTENT } from './tokens/append-content.token'; /** * @@ -54,6 +55,7 @@ export function appendScript(injector: Injector) { LoaderBarComponent, LoadingComponent, ModalComponent, + ModalContainerComponent, PaginationComponent, TableComponent, TableEmptyMessageComponent, @@ -81,7 +83,7 @@ export function appendScript(injector: Injector) { TableSortDirective, ], providers: [DatePipe], - entryComponents: [HttpErrorWrapperComponent, LoadingComponent], + entryComponents: [HttpErrorWrapperComponent, LoadingComponent, ModalContainerComponent], }) export class ThemeSharedModule { constructor(private errorHandler: ErrorHandler) {} From 146c8631606a0f0b45547a996ce2a36c032907c5 Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Sat, 11 Apr 2020 00:33:49 +0300 Subject: [PATCH 4/8] feat: add a service that projects to modal container --- .../theme-shared/src/lib/services/index.ts | 1 + .../src/lib/services/modal.service.ts | 47 ++++++++++ .../src/lib/tests/modal.service.spec.ts | 87 +++++++++++++++++++ 3 files changed, 135 insertions(+) create mode 100644 npm/ng-packs/packages/theme-shared/src/lib/services/modal.service.ts create mode 100644 npm/ng-packs/packages/theme-shared/src/lib/tests/modal.service.spec.ts diff --git a/npm/ng-packs/packages/theme-shared/src/lib/services/index.ts b/npm/ng-packs/packages/theme-shared/src/lib/services/index.ts index c53455a433..c363a56894 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/services/index.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/services/index.ts @@ -1,2 +1,3 @@ export * from './confirmation.service'; +export * from './modal.service'; export * from './toaster.service'; diff --git a/npm/ng-packs/packages/theme-shared/src/lib/services/modal.service.ts b/npm/ng-packs/packages/theme-shared/src/lib/services/modal.service.ts new file mode 100644 index 0000000000..ac481f68ea --- /dev/null +++ b/npm/ng-packs/packages/theme-shared/src/lib/services/modal.service.ts @@ -0,0 +1,47 @@ +import { ContentProjectionService, PROJECTION_STRATEGY } from '@abp/ng.core'; +import { ComponentRef, Injectable, TemplateRef, ViewContainerRef } from '@angular/core'; +import { ModalContainerComponent } from '../components/modal/modal-container.component'; + +@Injectable({ + providedIn: 'root', +}) +export class ModalService { + private containerComponentRef: ComponentRef; + + constructor(private contentProjectionService: ContentProjectionService) { + this.setContainer(); + } + + private setContainer() { + this.containerComponentRef = this.contentProjectionService.projectContent( + PROJECTION_STRATEGY.AppendComponentToBody(ModalContainerComponent), + ); + + this.containerComponentRef.changeDetectorRef.detectChanges(); + } + + clearModal() { + this.getContainer().clear(); + this.detectChanges(); + } + + detectChanges() { + this.containerComponentRef.changeDetectorRef.detectChanges(); + } + + getContainer(): ViewContainerRef { + return this.containerComponentRef.instance.container; + } + + renderTemplate(template: TemplateRef, context?: T) { + const containerRef = this.getContainer(); + + const strategy = PROJECTION_STRATEGY.ProjectTemplateToContainer( + template, + containerRef, + context, + ); + + this.contentProjectionService.projectContent(strategy); + } +} diff --git a/npm/ng-packs/packages/theme-shared/src/lib/tests/modal.service.spec.ts b/npm/ng-packs/packages/theme-shared/src/lib/tests/modal.service.spec.ts new file mode 100644 index 0000000000..e1a2e8bf51 --- /dev/null +++ b/npm/ng-packs/packages/theme-shared/src/lib/tests/modal.service.spec.ts @@ -0,0 +1,87 @@ +import { Component, TemplateRef, ViewChild } from '@angular/core'; +import { createComponentFactory, Spectator } from '@ngneat/spectator/jest'; +import { ModalContainerComponent } from '../components/modal/modal-container.component'; +import { ModalService } from '../services'; + +describe('ModalContainerComponent', () => { + @Component({ + template: ` + +
bar
+
+ `, + }) + class TestComponent { + @ViewChild('ref', { static: true }) + template: TemplateRef; + + constructor(public service: ModalService) {} + } + + let spectator: Spectator; + let service: ModalService; + + const createComponent = createComponentFactory({ + component: TestComponent, + entryComponents: [ModalContainerComponent], + }); + + beforeEach(() => { + spectator = createComponent(); + service = spectator.component.service; + }); + + afterEach(() => { + service.getContainer().clear(); + service['containerComponentRef'].changeDetectorRef.detectChanges(); + service['containerComponentRef'].destroy(); + }); + + describe('#getContainer', () => { + it('should return the ViewContainerRef of ModalContainerComponent', () => { + let foo = document.querySelector('div.foo'); + expect(foo).toBeNull(); + + const containerRef = service.getContainer(); + const embeddedViewRef = containerRef.createEmbeddedView(spectator.component.template); + + foo = document.querySelector('div.foo'); + expect(foo).toBe(embeddedViewRef.rootNodes[0]); + expect(foo.textContent).toBe('bar'); + }); + }); + + describe('#renderTemplate', () => { + it('should render given template using the ViewContainerRef of ModalContainerComponent', () => { + let foo = document.querySelector('div.foo'); + expect(foo).toBeNull(); + + service.renderTemplate(spectator.component.template); + + foo = document.querySelector('div.foo'); + expect(foo.textContent).toBe('bar'); + }); + }); + + describe('#detectChanges', () => { + it('should call detectChanges on the containerComponentRef', () => { + const spy = jest.spyOn(service['containerComponentRef'].changeDetectorRef, 'detectChanges'); + + service.detectChanges(); + + expect(spy).toHaveBeenCalledTimes(1); + }); + }); + + describe('#clearModal', () => { + it('should call clear on the ViewContainerRef and detectChanges', () => { + const clear = jest.spyOn(service.getContainer(), 'clear'); + const detectChanges = jest.spyOn(service, 'detectChanges'); + + service.clearModal(); + + expect(clear).toHaveBeenCalledTimes(1); + expect(detectChanges).toHaveBeenCalledTimes(1); + }); + }); +}); From 0cf7d1d261661776d4ad62927b8586f9f0e6c0a7 Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Sat, 11 Apr 2020 00:34:09 +0300 Subject: [PATCH 5/8] feat: use modal service to project modal --- .../lib/components/modal/modal.component.html | 67 +++--- .../lib/components/modal/modal.component.ts | 60 +++-- .../src/lib/tests/modal.component.spec.ts | 224 ++++++++++++------ 3 files changed, 236 insertions(+), 115 deletions(-) diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/modal/modal.component.html b/npm/ng-packs/packages/theme-shared/src/lib/components/modal/modal.component.html index c3168bad92..b37f5b6ce3 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/components/modal/modal.component.html +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/modal/modal.component.html @@ -1,34 +1,43 @@ -