From d3b23682d742cd2c0d4c4556326c5284b178670a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Can=20Y=C4=B1lmaz?= <30300440+bariscanyilmaz@users.noreply.github.com> Date: Thu, 2 Feb 2023 16:26:54 +0300 Subject: [PATCH 01/15] create card component --- .../components/card/card-body.component.ts | 7 +++++ .../components/card/card-title.component.ts | 7 +++++ .../src/lib/components/card/card.component.ts | 27 +++++++++++++++++++ 3 files changed, 41 insertions(+) create mode 100644 npm/ng-packs/packages/theme-shared/src/lib/components/card/card-body.component.ts create mode 100644 npm/ng-packs/packages/theme-shared/src/lib/components/card/card-title.component.ts create mode 100644 npm/ng-packs/packages/theme-shared/src/lib/components/card/card.component.ts diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/card/card-body.component.ts b/npm/ng-packs/packages/theme-shared/src/lib/components/card/card-body.component.ts new file mode 100644 index 0000000000..fc540e0002 --- /dev/null +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/card/card-body.component.ts @@ -0,0 +1,7 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'abp-card-body', + template: ``, +}) +export class CardBodyComponent {} diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/card/card-title.component.ts b/npm/ng-packs/packages/theme-shared/src/lib/components/card/card-title.component.ts new file mode 100644 index 0000000000..b40e5b1767 --- /dev/null +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/card/card-title.component.ts @@ -0,0 +1,7 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'abp-card-title', + template: ``, +}) +export class CardTitleComponent {} diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/card/card.component.ts b/npm/ng-packs/packages/theme-shared/src/lib/components/card/card.component.ts new file mode 100644 index 0000000000..9a97fa33b2 --- /dev/null +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/card/card.component.ts @@ -0,0 +1,27 @@ +import { Component, ContentChild, Input } from '@angular/core'; +import { CardBodyComponent } from './card-body.component'; +import { CardTitleComponent } from './card-title.component'; + +@Component({ + selector: 'abp-card', + template: ` +
+
+ +
+
+ +
+
`, +}) +export class CardComponent { + @Input() class:string + + @Input() style:string + + @ContentChild(CardBodyComponent) + cardBodyTemplate?: CardBodyComponent; + + @ContentChild(CardTitleComponent) + cardTitleTemplate?: CardTitleComponent; +} From bb9f29a5a7ca341dc5ebc5be7c49bdf708d01c4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Can=20Y=C4=B1lmaz?= <30300440+bariscanyilmaz@users.noreply.github.com> Date: Thu, 2 Feb 2023 16:27:52 +0300 Subject: [PATCH 02/15] import card component to theme-shared module --- .../theme-shared/src/lib/components/index.ts | 3 +++ .../theme-shared/src/lib/theme-shared.module.ts | 13 +++++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/index.ts b/npm/ng-packs/packages/theme-shared/src/lib/components/index.ts index 810d5a991a..09ae029a7e 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/components/index.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/index.ts @@ -11,3 +11,6 @@ export * from './modal/modal.component'; export * from './toast-container/toast-container.component'; export * from './toast/toast.component'; export * from './password/password.component'; +export * from './card/card.component'; +export * from './card/card-title.component'; +export * from './card/card-body.component'; \ No newline at end of file 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 fd9a0cd236..492cff0aa8 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 @@ -36,6 +36,9 @@ import { HTTP_ERROR_CONFIG, httpErrorConfigFactory } from './tokens/http-error.t import { DateParserFormatter } from './utils/date-parser-formatter'; import { CONFIRMATION_ICONS, DEFAULT_CONFIRMATION_ICONS } from './tokens/confirmation-icons.token'; import { PasswordComponent } from './components/password/password.component'; +import { CardComponent } from './components/card/card.component'; +import { CardTitleComponent } from './components/card/card-title.component'; +import { CardBodyComponent } from './components/card/card-body.component'; const declarationsWithExports = [ BreadcrumbComponent, @@ -52,6 +55,9 @@ const declarationsWithExports = [ NgxDatatableListDirective, LoadingDirective, ModalCloseDirective, + CardComponent, + CardTitleComponent, + CardBodyComponent, ]; @NgModule({ @@ -62,11 +68,14 @@ const declarationsWithExports = [ NgbPaginationModule, EllipsisModule, ], - declarations: [...declarationsWithExports, HttpErrorWrapperComponent], + declarations: [ + ...declarationsWithExports, + HttpErrorWrapperComponent, + ], exports: [NgxDatatableModule, EllipsisModule, NgxValidateCoreModule, ...declarationsWithExports], providers: [DatePipe], }) -export class BaseThemeSharedModule {} +export class BaseThemeSharedModule { } @NgModule({ imports: [BaseThemeSharedModule], From efc71e3ec7868e3c6ddc453ab4f53b5ec2869e77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Can=20Y=C4=B1lmaz?= <30300440+bariscanyilmaz@users.noreply.github.com> Date: Thu, 2 Feb 2023 16:31:56 +0300 Subject: [PATCH 03/15] use abp-card component instead of card class --- .../dev-app/src/app/home/home.component.html | 156 ++++++------------ 1 file changed, 54 insertions(+), 102 deletions(-) diff --git a/npm/ng-packs/apps/dev-app/src/app/home/home.component.html b/npm/ng-packs/apps/dev-app/src/app/home/home.component.html index 2d249da3d8..ae646f2b6b 100644 --- a/npm/ng-packs/apps/dev-app/src/app/home/home.component.html +++ b/npm/ng-packs/apps/dev-app/src/app/home/home.component.html @@ -10,15 +10,8 @@

{{ '::LongWelcomeMessage' | abpLocalization }}

- + {{ 'AbpAccount::Login' | abpLocalization }} @@ -26,11 +19,11 @@

Let's improve your application!

Here are some links to help you get started:

-
-
+ + +
- + "> - + "> - + ">
- + ">

- - + + "> - + style="width: 72px; height: 28px; border: none; display: inline-block">

- + "> - + ">
-
-
+ +

Meet the ABP Commercial

A Complete Web Application Platform Built on the ABP Framework

- -
-
+ +

ABP Commercial is a platform based on the open source ABP framework. It provides pre-built application modules, rapid @@ -199,8 +174,7 @@

- + "> - + "> - + "> - + "> - + "> - + ">
-
-
+ + +

- Abp Framework - Abp Commercial - abpframework + Abp Framework + Abp Commercial + abpframework

@@ -295,17 +256,9 @@ {{ context.title }}

- - {{ link.label }} + + {{ link.label + }} @@ -316,9 +269,8 @@
- Details + Details
@@ -338,4 +290,4 @@ border-left: 0 !important; } } - + \ No newline at end of file From a9651a14910dd98232323617fb5526dd8e035d1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Can=20Y=C4=B1lmaz?= <30300440+bariscanyilmaz@users.noreply.github.com> Date: Thu, 2 Feb 2023 17:38:33 +0300 Subject: [PATCH 04/15] lint html --- npm/ng-packs/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/npm/ng-packs/package.json b/npm/ng-packs/package.json index e45e1d255c..72c8ffd062 100644 --- a/npm/ng-packs/package.json +++ b/npm/ng-packs/package.json @@ -131,8 +131,8 @@ }, "dependencies": {}, "lint-staged": { - "**/*.{js,jsx,ts,tsx}": [ + "**/*.{js,jsx,ts,tsx,html,css,scss}": [ "npx prettier --write --config .prettierrc " ] } -} +} \ No newline at end of file From bbd2ad99f3e3be857507f3a0d70333e04b4b7e9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Can=20Y=C4=B1lmaz?= <30300440+bariscanyilmaz@users.noreply.github.com> Date: Thu, 2 Feb 2023 17:59:10 +0300 Subject: [PATCH 05/15] move card components to card module --- .../components/card/card-body.component.ts | 4 +++- .../components/card/card-title.component.ts | 4 +++- .../src/lib/components/card/card.component.ts | 17 ++++++----------- .../src/lib/components/card/card.module.ts | 14 ++++++++++++++ .../src/lib/theme-shared.module.ts | 19 +++++++++---------- 5 files changed, 35 insertions(+), 23 deletions(-) create mode 100644 npm/ng-packs/packages/theme-shared/src/lib/components/card/card.module.ts diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/card/card-body.component.ts b/npm/ng-packs/packages/theme-shared/src/lib/components/card/card-body.component.ts index fc540e0002..b7efd90236 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/components/card/card-body.component.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/card/card-body.component.ts @@ -2,6 +2,8 @@ import { Component } from '@angular/core'; @Component({ selector: 'abp-card-body', - template: ``, + template: `
+ +
`, }) export class CardBodyComponent {} diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/card/card-title.component.ts b/npm/ng-packs/packages/theme-shared/src/lib/components/card/card-title.component.ts index b40e5b1767..f629636854 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/components/card/card-title.component.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/card/card-title.component.ts @@ -2,6 +2,8 @@ import { Component } from '@angular/core'; @Component({ selector: 'abp-card-title', - template: ``, + template: `
+ +
`, }) export class CardTitleComponent {} diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/card/card.component.ts b/npm/ng-packs/packages/theme-shared/src/lib/components/card/card.component.ts index 9a97fa33b2..317e5800b9 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/components/card/card.component.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/card/card.component.ts @@ -4,20 +4,15 @@ import { CardTitleComponent } from './card-title.component'; @Component({ selector: 'abp-card', - template: ` -
-
- -
-
- -
-
`, + template: `
+ + +
`, }) export class CardComponent { - @Input() class:string + @Input() cardClass: string; - @Input() style:string + @Input() cardStyle: string; @ContentChild(CardBodyComponent) cardBodyTemplate?: CardBodyComponent; diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/card/card.module.ts b/npm/ng-packs/packages/theme-shared/src/lib/components/card/card.module.ts new file mode 100644 index 0000000000..d8050a40cd --- /dev/null +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/card/card.module.ts @@ -0,0 +1,14 @@ +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { CardBodyComponent } from './card-body.component'; +import { CardTitleComponent } from './card-title.component'; +import { CardComponent } from './card.component'; + +const declarationsWithExports = [CardComponent, CardBodyComponent, CardTitleComponent]; + +@NgModule({ + declarations: [...declarationsWithExports], + imports: [CommonModule], + exports: [...declarationsWithExports], +}) +export class CardModule {} 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 492cff0aa8..58f93b1bda 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 @@ -36,9 +36,7 @@ import { HTTP_ERROR_CONFIG, httpErrorConfigFactory } from './tokens/http-error.t import { DateParserFormatter } from './utils/date-parser-formatter'; import { CONFIRMATION_ICONS, DEFAULT_CONFIRMATION_ICONS } from './tokens/confirmation-icons.token'; import { PasswordComponent } from './components/password/password.component'; -import { CardComponent } from './components/card/card.component'; -import { CardTitleComponent } from './components/card/card-title.component'; -import { CardBodyComponent } from './components/card/card-body.component'; +import { CardModule } from './components/card/card.module'; const declarationsWithExports = [ BreadcrumbComponent, @@ -55,9 +53,6 @@ const declarationsWithExports = [ NgxDatatableListDirective, LoadingDirective, ModalCloseDirective, - CardComponent, - CardTitleComponent, - CardBodyComponent, ]; @NgModule({ @@ -67,15 +62,19 @@ const declarationsWithExports = [ NgxValidateCoreModule, NgbPaginationModule, EllipsisModule, + CardModule, ], - declarations: [ + declarations: [...declarationsWithExports, HttpErrorWrapperComponent], + exports: [ + NgxDatatableModule, + EllipsisModule, + NgxValidateCoreModule, ...declarationsWithExports, - HttpErrorWrapperComponent, + CardModule, ], - exports: [NgxDatatableModule, EllipsisModule, NgxValidateCoreModule, ...declarationsWithExports], providers: [DatePipe], }) -export class BaseThemeSharedModule { } +export class BaseThemeSharedModule {} @NgModule({ imports: [BaseThemeSharedModule], From b486e2619d3b25919536a7b344e7efb66e78b2ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Can=20Y=C4=B1lmaz?= <30300440+bariscanyilmaz@users.noreply.github.com> Date: Thu, 2 Feb 2023 18:00:09 +0300 Subject: [PATCH 06/15] use cardClass --- .../dev-app/src/app/home/home.component.html | 144 ++++++++++++------ 1 file changed, 96 insertions(+), 48 deletions(-) diff --git a/npm/ng-packs/apps/dev-app/src/app/home/home.component.html b/npm/ng-packs/apps/dev-app/src/app/home/home.component.html index ae646f2b6b..7024ab69e5 100644 --- a/npm/ng-packs/apps/dev-app/src/app/home/home.component.html +++ b/npm/ng-packs/apps/dev-app/src/app/home/home.component.html @@ -10,8 +10,15 @@

{{ '::LongWelcomeMessage' | abpLocalization }}

- + {{ 'AbpAccount::Login' | abpLocalization }} @@ -19,11 +26,11 @@

Let's improve your application!

Here are some links to help you get started:

- - +
- + " + > - + " + > - + " + >
- + " + >

- - + + " + > - + style="width: 72px; height: 28px; border: none; display: inline-block" + >

- + " + > - + " + >
@@ -165,7 +189,7 @@

Meet the ABP Commercial

A Complete Web Application Platform Built on the ABP Framework

- +

ABP Commercial is a platform based @@ -174,7 +198,8 @@

- + " + > - + " + > - + " + > - + " + > - + " + > - + " + >
- + @@ -256,9 +295,17 @@ {{ context.title }}

- - {{ link.label - }} + + {{ link.label }} @@ -269,8 +316,9 @@
- Details + Details
@@ -290,4 +338,4 @@ border-left: 0 !important; } } - \ No newline at end of file + From 9c7efc346cc21046e989317e0f385d51538c2fe9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Can=20Y=C4=B1lmaz?= <30300440+bariscanyilmaz@users.noreply.github.com> Date: Thu, 2 Feb 2023 18:12:32 +0300 Subject: [PATCH 07/15] export card module --- .../packages/theme-shared/src/lib/components/index.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/index.ts b/npm/ng-packs/packages/theme-shared/src/lib/components/index.ts index 09ae029a7e..095af5ef26 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/components/index.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/index.ts @@ -11,6 +11,4 @@ export * from './modal/modal.component'; export * from './toast-container/toast-container.component'; export * from './toast/toast.component'; export * from './password/password.component'; -export * from './card/card.component'; -export * from './card/card-title.component'; -export * from './card/card-body.component'; \ No newline at end of file +export * from './card/index'; From de5a33026e8981efe22060520564583ee8465141 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Can=20Y=C4=B1lmaz?= <30300440+bariscanyilmaz@users.noreply.github.com> Date: Thu, 2 Feb 2023 18:13:28 +0300 Subject: [PATCH 08/15] export card components from input --- .../packages/theme-shared/src/lib/components/card/index.ts | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 npm/ng-packs/packages/theme-shared/src/lib/components/card/index.ts diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/card/index.ts b/npm/ng-packs/packages/theme-shared/src/lib/components/card/index.ts new file mode 100644 index 0000000000..8d6bbd86d8 --- /dev/null +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/card/index.ts @@ -0,0 +1,4 @@ +export * from './card.module'; +export * from './card.component'; +export * from './card-body.component'; +export * from './card-title.component'; From af343a4c4c76460006d2002757df1ce4db70abc7 Mon Sep 17 00:00:00 2001 From: Mahmut Gundogdu Date: Fri, 3 Feb 2023 18:57:44 +0300 Subject: [PATCH 09/15] Fix 3 test --- .../application-localization.service.spec.ts | 17 +++++++++++++++++ .../src/lib/tests/config-state.service.spec.ts | 17 +++++++++-------- .../core/src/lib/tests/date-utils.spec.ts | 2 +- .../src/lib/tests/localization-utils.spec.ts | 3 +++ .../src/lib/tests/localization.service.spec.ts | 9 +++++++++ .../core/src/lib/tests/permission.guard.spec.ts | 4 +++- 6 files changed, 42 insertions(+), 10 deletions(-) create mode 100644 npm/ng-packs/packages/core/src/lib/tests/application-localization.service.spec.ts diff --git a/npm/ng-packs/packages/core/src/lib/tests/application-localization.service.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/application-localization.service.spec.ts new file mode 100644 index 0000000000..4e81b39f59 --- /dev/null +++ b/npm/ng-packs/packages/core/src/lib/tests/application-localization.service.spec.ts @@ -0,0 +1,17 @@ +export const APPLICATION_LOCALIZATION_DATA = { + resources: { + Default: { texts: {}, baseResources: [] }, + MyProjectName: { + texts: { + "'{0}' and '{1}' do not match.": "'{0}' and '{1}' do not match.", + }, + baseResources: [], + }, + AbpIdentity: { + texts: { + Identity: 'identity', + }, + baseResources: [], + }, + }, +}; diff --git a/npm/ng-packs/packages/core/src/lib/tests/config-state.service.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/config-state.service.spec.ts index 3dc1b45732..58040e8652 100644 --- a/npm/ng-packs/packages/core/src/lib/tests/config-state.service.spec.ts +++ b/npm/ng-packs/packages/core/src/lib/tests/config-state.service.spec.ts @@ -8,6 +8,9 @@ import { } from '../proxy/volo/abp/asp-net-core/mvc/application-configurations/models'; import { ConfigStateService } from '../services'; import { CORE_OPTIONS } from '../tokens'; +import { IncludeLocalizationResourcesProvider } from '../providers'; +import { APPLICATION_LOCALIZATION_DATA } from './application-localization.service.spec'; +import { AbpApplicationLocalizationService } from '../proxy/volo/abp/asp-net-core/mvc/application-configurations/abp-application-localization.service'; export const CONFIG_STATE_DATA = { environment: { @@ -34,14 +37,7 @@ export const CONFIG_STATE_DATA = { layouts: [null, null, null], }, localization: { - values: { - MyProjectName: { - "'{0}' and '{1}' do not match.": "'{0}' and '{1}' do not match.", - }, - AbpIdentity: { - Identity: 'identity', - }, - }, + values: {}, languages: [ { cultureName: 'cs', @@ -115,6 +111,11 @@ describe('ConfigStateService', () => { provide: AbpApplicationConfigurationService, useValue: { get: () => of(CONFIG_STATE_DATA) }, }, + { + provide: AbpApplicationLocalizationService, + useValue: { get: () => APPLICATION_LOCALIZATION_DATA }, + }, + IncludeLocalizationResourcesProvider, ], }); diff --git a/npm/ng-packs/packages/core/src/lib/tests/date-utils.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/date-utils.spec.ts index 20ef2e4a48..33f02dfb4f 100644 --- a/npm/ng-packs/packages/core/src/lib/tests/date-utils.spec.ts +++ b/npm/ng-packs/packages/core/src/lib/tests/date-utils.spec.ts @@ -15,7 +15,7 @@ describe('Date Utils', () => { let config: ConfigStateService; beforeEach(() => { - config = new ConfigStateService(null); + config = new ConfigStateService(null, null, null); }); describe('#getShortDateFormat', () => { diff --git a/npm/ng-packs/packages/core/src/lib/tests/localization-utils.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/localization-utils.spec.ts index c12b7b61ce..4af0755d6c 100644 --- a/npm/ng-packs/packages/core/src/lib/tests/localization-utils.spec.ts +++ b/npm/ng-packs/packages/core/src/lib/tests/localization-utils.spec.ts @@ -57,6 +57,7 @@ describe('Localization Utils', () => { languages: [], languageFilesMap: null, languagesMap: null, + resources: {}, }); test.each` @@ -100,6 +101,7 @@ describe('Localization Utils', () => { languages: [], languageFilesMap: null, languagesMap: null, + resources: {}, }); test.each` @@ -148,6 +150,7 @@ describe('Localization Utils', () => { languages: [], languageFilesMap: null, languagesMap: null, + resources: {}, }); test.each` diff --git a/npm/ng-packs/packages/core/src/lib/tests/localization.service.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/localization.service.spec.ts index 5aedd28f6e..d2eb653a85 100644 --- a/npm/ng-packs/packages/core/src/lib/tests/localization.service.spec.ts +++ b/npm/ng-packs/packages/core/src/lib/tests/localization.service.spec.ts @@ -8,8 +8,12 @@ import { SessionStateService } from '../services/session-state.service'; import { LocalizationService } from '../services/localization.service'; import { CORE_OPTIONS } from '../tokens/options.token'; import { CONFIG_STATE_DATA } from './config-state.service.spec'; +import { AbpApplicationLocalizationService } from '../proxy/volo/abp/asp-net-core/mvc/application-configurations/abp-application-localization.service'; +import { APPLICATION_LOCALIZATION_DATA } from './application-localization.service.spec'; +import { IncludeLocalizationResourcesProvider } from '../providers'; const appConfigData$ = new BehaviorSubject(CONFIG_STATE_DATA); +const appLocalizationData$ = new BehaviorSubject(APPLICATION_LOCALIZATION_DATA); describe('LocalizationService', () => { let spectator: SpectatorService; @@ -22,6 +26,7 @@ describe('LocalizationService', () => { entryComponents: [], mocks: [Router], providers: [ + IncludeLocalizationResourcesProvider, { provide: CORE_OPTIONS, useValue: { registerLocaleFn: () => Promise.resolve(), cultureNameLocaleFileMap: {} }, @@ -30,6 +35,10 @@ describe('LocalizationService', () => { provide: AbpApplicationConfigurationService, useValue: { get: () => appConfigData$ }, }, + { + provide: AbpApplicationLocalizationService, + useValue: { get: () => appLocalizationData$ }, + }, ], }); diff --git a/npm/ng-packs/packages/core/src/lib/tests/permission.guard.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/permission.guard.spec.ts index 4369b8434f..372f3434f3 100644 --- a/npm/ng-packs/packages/core/src/lib/tests/permission.guard.spec.ts +++ b/npm/ng-packs/packages/core/src/lib/tests/permission.guard.spec.ts @@ -9,6 +9,7 @@ import { HttpErrorReporterService } from '../services/http-error-reporter.servic import { PermissionService } from '../services/permission.service'; import { RoutesService } from '../services/routes.service'; import { CORE_OPTIONS } from '../tokens/options.token'; +import { IncludeLocalizationResourcesProvider } from '../providers'; describe('PermissionGuard', () => { let spectator: SpectatorService; @@ -36,7 +37,7 @@ describe('PermissionGuard', () => { }, }, ], - { relativeLinkResolution: 'legacy' }, + {}, ), ], providers: [ @@ -45,6 +46,7 @@ describe('PermissionGuard', () => { useValue: '/', }, { provide: CORE_OPTIONS, useValue: { skipGetAppConfiguration: true } }, + IncludeLocalizationResourcesProvider, ], }); From f940c0c4d5d44224540f1caf8f1e44092b2a6341 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Can=20Y=C4=B1lmaz?= <30300440+bariscanyilmaz@users.noreply.github.com> Date: Wed, 15 Feb 2023 14:01:41 +0300 Subject: [PATCH 10/15] fix lint --- .../theme-shared/src/lib/directives/visible.directive.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/npm/ng-packs/packages/theme-shared/src/lib/directives/visible.directive.ts b/npm/ng-packs/packages/theme-shared/src/lib/directives/visible.directive.ts index 9c2c408d0e..9613779472 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/directives/visible.directive.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/directives/visible.directive.ts @@ -8,7 +8,7 @@ export class AbpVisibleDirective implements OnDestroy, OnInit { conditionSubscription: Subscription | undefined; isVisible: boolean | undefined; - @Input('abpVisible') set abpVisible( + @Input() set abpVisible( value: boolean | Promise | Observable | undefined | null, ) { this.condition$ = checkType(value); From 26b9fbc119c34f8087e5ad043166a001eabc62f6 Mon Sep 17 00:00:00 2001 From: Mahmut Gundogdu Date: Wed, 15 Feb 2023 18:44:24 +0300 Subject: [PATCH 11/15] remove unnescessary abstraction --- .../packages/core/src/lib/models/auth.ts | 6 +++-- .../set-token-response-to-storage.token.ts | 3 +++ .../packages/oauth/src/lib/oauth.module.ts | 11 +++----- .../oauth/src/lib/utils/auth-utils.ts | 25 +------------------ 4 files changed, 11 insertions(+), 34 deletions(-) diff --git a/npm/ng-packs/packages/core/src/lib/models/auth.ts b/npm/ng-packs/packages/core/src/lib/models/auth.ts index 9c0250d316..dcaf6e7f11 100644 --- a/npm/ng-packs/packages/core/src/lib/models/auth.ts +++ b/npm/ng-packs/packages/core/src/lib/models/auth.ts @@ -12,6 +12,8 @@ export type PipeToLoginFn = ( params: Pick, injector: Injector, ) => UnaryFunction; - -export type SetTokenResponseToStorageFn = (injector: Injector, tokenRes: T) => void; +/** + * @deprecated The interface should not be used anymore. + */ +export type SetTokenResponseToStorageFn = (tokenRes: T) => void; export type CheckAuthenticationStateFn = (injector: Injector) => void; diff --git a/npm/ng-packs/packages/core/src/lib/tokens/set-token-response-to-storage.token.ts b/npm/ng-packs/packages/core/src/lib/tokens/set-token-response-to-storage.token.ts index 0436195654..0cd26708bf 100644 --- a/npm/ng-packs/packages/core/src/lib/tokens/set-token-response-to-storage.token.ts +++ b/npm/ng-packs/packages/core/src/lib/tokens/set-token-response-to-storage.token.ts @@ -1,6 +1,9 @@ import { InjectionToken } from '@angular/core'; import { SetTokenResponseToStorageFn } from '../models'; +/** + * @deprecated The token should not be used anymore. + */ export const SET_TOKEN_RESPONSE_TO_STORAGE_FN_KEY = new InjectionToken( 'SET_TOKEN_RESPONSE_TO_STORAGE_FN_KEY', ); 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 753ad815e3..7c8c2af99c 100644 --- a/npm/ng-packs/packages/oauth/src/lib/oauth.module.ts +++ b/npm/ng-packs/packages/oauth/src/lib/oauth.module.ts @@ -1,4 +1,4 @@ -import { APP_INITIALIZER, Injector, ModuleWithProviders, NgModule } from '@angular/core'; +import { APP_INITIALIZER, ModuleWithProviders, NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; import { OAuthModule, OAuthStorage } from 'angular-oauth2-oidc'; import { @@ -7,8 +7,7 @@ import { AuthService, CHECK_AUTHENTICATION_STATE_FN_KEY, noop, - PIPE_TO_LOGIN_FN_KEY, - SET_TOKEN_RESPONSE_TO_STORAGE_FN_KEY, + PIPE_TO_LOGIN_FN_KEY } from '@abp/ng.core'; import { storageFactory } from './utils/storage.factory'; import { AbpOAuthService } from './services'; @@ -17,7 +16,7 @@ import { HTTP_INTERCEPTORS } from '@angular/common/http'; import { OAuthApiInterceptor } from './interceptors/api.interceptor'; import { AbpOAuthGuard } from './guards/oauth.guard'; import { NavigateToManageProfileProvider } from './providers'; -import { checkAccessToken, pipeToLogin, setTokenResponseToStorage } from './utils'; +import { checkAccessToken, pipeToLogin } from './utils'; @NgModule({ imports: [CommonModule, OAuthModule], @@ -43,10 +42,6 @@ export class AbpOAuthModule { provide: PIPE_TO_LOGIN_FN_KEY, useValue: pipeToLogin, }, - { - provide: SET_TOKEN_RESPONSE_TO_STORAGE_FN_KEY, - useValue: setTokenResponseToStorage, - }, { provide: CHECK_AUTHENTICATION_STATE_FN_KEY, useValue: checkAccessToken, diff --git a/npm/ng-packs/packages/oauth/src/lib/utils/auth-utils.ts b/npm/ng-packs/packages/oauth/src/lib/utils/auth-utils.ts index 74df5ce79b..64dcd76576 100644 --- a/npm/ng-packs/packages/oauth/src/lib/utils/auth-utils.ts +++ b/npm/ng-packs/packages/oauth/src/lib/utils/auth-utils.ts @@ -1,4 +1,4 @@ -import { Injector } from '@angular/core'; +import { inject, Injector } from '@angular/core'; import { Router } from '@angular/router'; import { OAuthStorage, TokenResponse } from 'angular-oauth2-oidc'; import { pipe } from 'rxjs'; @@ -29,29 +29,6 @@ export const pipeToLogin: PipeToLoginFn = function ( ); }; -export const setTokenResponseToStorage: SetTokenResponseToStorageFn = function ( - injector: Injector, - tokenRes: TokenResponse, -) { - const { access_token, refresh_token, scope: grantedScopes, expires_in } = tokenRes; - const storage = injector.get(OAuthStorage); - - storage.setItem('access_token', access_token); - storage.setItem('refresh_token', refresh_token); - storage.setItem('access_token_stored_at', '' + Date.now()); - - if (grantedScopes) { - storage.setItem('granted_scopes', JSON.stringify(grantedScopes.split(' '))); - } - - if (expires_in) { - const expiresInMilliSeconds = expires_in * 1000; - const now = new Date(); - const expiresAt = now.getTime() + expiresInMilliSeconds; - storage.setItem('expires_at', '' + expiresAt); - } -}; - export function setRememberMe(remember: boolean) { removeRememberMe(); localStorage.setItem(storageKey, 'true'); From 29ebe0831d094fd1dc02f9c9a02ee345383edf3e Mon Sep 17 00:00:00 2001 From: Enis Necipoglu Date: Thu, 16 Feb 2023 11:15:03 +0300 Subject: [PATCH 12/15] Update LeptonX dependencies to latest stable OR preview version --- .../MyCompanyName.MyProjectName.Blazor.Server.Mongo.csproj | 4 ++-- .../MyCompanyName.MyProjectName.Blazor.Server.csproj | 4 ++-- ...CompanyName.MyProjectName.Blazor.WebAssembly.Client.csproj | 2 +- ...yName.MyProjectName.Blazor.WebAssembly.Server.Mongo.csproj | 2 +- ...CompanyName.MyProjectName.Blazor.WebAssembly.Server.csproj | 2 +- .../MyCompanyName.MyProjectName.Host.Mongo.csproj | 2 +- .../MyCompanyName.MyProjectName.Host.csproj | 2 +- .../MyCompanyName.MyProjectName.Mvc.Mongo.csproj | 2 +- .../MyCompanyName.MyProjectName.Mvc.csproj | 2 +- .../MyCompanyName.MyProjectName.AuthServer.csproj | 2 +- .../MyCompanyName.MyProjectName.Blazor.Server.Tiered.csproj | 4 ++-- .../MyCompanyName.MyProjectName.Blazor.Server.csproj | 4 ++-- .../MyCompanyName.MyProjectName.Blazor.csproj | 2 +- .../MyCompanyName.MyProjectName.HttpApi.HostWithIds.csproj | 2 +- .../MyCompanyName.MyProjectName.Web.Host.csproj | 2 +- .../MyCompanyName.MyProjectName.Web.csproj | 2 +- 16 files changed, 20 insertions(+), 20 deletions(-) diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyCompanyName.MyProjectName.Blazor.Server.Mongo.csproj b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyCompanyName.MyProjectName.Blazor.Server.Mongo.csproj index b4fd6c7094..bbb8813a90 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyCompanyName.MyProjectName.Blazor.Server.Mongo.csproj +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyCompanyName.MyProjectName.Blazor.Server.Mongo.csproj @@ -22,8 +22,8 @@ - - + + diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj index c3227aa6c3..693086af4a 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj @@ -22,8 +22,8 @@ - - + + diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Client/MyCompanyName.MyProjectName.Blazor.WebAssembly.Client.csproj b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Client/MyCompanyName.MyProjectName.Blazor.WebAssembly.Client.csproj index 3f0f414cb0..e4da30cdac 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Client/MyCompanyName.MyProjectName.Blazor.WebAssembly.Client.csproj +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Client/MyCompanyName.MyProjectName.Blazor.WebAssembly.Client.csproj @@ -21,7 +21,7 @@ - + diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server.Mongo/MyCompanyName.MyProjectName.Blazor.WebAssembly.Server.Mongo.csproj b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server.Mongo/MyCompanyName.MyProjectName.Blazor.WebAssembly.Server.Mongo.csproj index 52340a8fb0..8b697fb90c 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server.Mongo/MyCompanyName.MyProjectName.Blazor.WebAssembly.Server.Mongo.csproj +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server.Mongo/MyCompanyName.MyProjectName.Blazor.WebAssembly.Server.Mongo.csproj @@ -74,7 +74,7 @@ - + diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/MyCompanyName.MyProjectName.Blazor.WebAssembly.Server.csproj b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/MyCompanyName.MyProjectName.Blazor.WebAssembly.Server.csproj index 8616201990..d3a1aab92c 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/MyCompanyName.MyProjectName.Blazor.WebAssembly.Server.csproj +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/MyCompanyName.MyProjectName.Blazor.WebAssembly.Server.csproj @@ -75,7 +75,7 @@ - + diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/MyCompanyName.MyProjectName.Host.Mongo.csproj b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/MyCompanyName.MyProjectName.Host.Mongo.csproj index fa770434b3..cdf830d530 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/MyCompanyName.MyProjectName.Host.Mongo.csproj +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/MyCompanyName.MyProjectName.Host.Mongo.csproj @@ -70,7 +70,7 @@ - + diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/MyCompanyName.MyProjectName.Host.csproj b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/MyCompanyName.MyProjectName.Host.csproj index a096c8ea16..803061603c 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/MyCompanyName.MyProjectName.Host.csproj +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/MyCompanyName.MyProjectName.Host.csproj @@ -71,7 +71,7 @@ - + diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/MyCompanyName.MyProjectName.Mvc.Mongo.csproj b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/MyCompanyName.MyProjectName.Mvc.Mongo.csproj index 81bf1b0dd7..15198564eb 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/MyCompanyName.MyProjectName.Mvc.Mongo.csproj +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/MyCompanyName.MyProjectName.Mvc.Mongo.csproj @@ -18,7 +18,7 @@ - + diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/MyCompanyName.MyProjectName.Mvc.csproj b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/MyCompanyName.MyProjectName.Mvc.csproj index bc58acbef5..c80b4393f0 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/MyCompanyName.MyProjectName.Mvc.csproj +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/MyCompanyName.MyProjectName.Mvc.csproj @@ -18,7 +18,7 @@ - + diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/MyCompanyName.MyProjectName.AuthServer.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/MyCompanyName.MyProjectName.AuthServer.csproj index 8d0222ec73..1706fe3360 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/MyCompanyName.MyProjectName.AuthServer.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/MyCompanyName.MyProjectName.AuthServer.csproj @@ -44,7 +44,7 @@ - + diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/MyCompanyName.MyProjectName.Blazor.Server.Tiered.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/MyCompanyName.MyProjectName.Blazor.Server.Tiered.csproj index 2f4ce2c095..3b1ded08fa 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/MyCompanyName.MyProjectName.Blazor.Server.Tiered.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/MyCompanyName.MyProjectName.Blazor.Server.Tiered.csproj @@ -30,8 +30,8 @@ - - + + diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj index 547486df33..7d8740c809 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj @@ -28,8 +28,8 @@ - - + + diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj index 05e9fa2b48..d0384eb228 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj @@ -24,7 +24,7 @@ - + diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyCompanyName.MyProjectName.HttpApi.HostWithIds.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyCompanyName.MyProjectName.HttpApi.HostWithIds.csproj index 64e5518d56..bf03c7337f 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyCompanyName.MyProjectName.HttpApi.HostWithIds.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyCompanyName.MyProjectName.HttpApi.HostWithIds.csproj @@ -26,7 +26,7 @@ - + diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj index 23de5c2132..96b5b31394 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj @@ -28,7 +28,7 @@ - + diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyCompanyName.MyProjectName.Web.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyCompanyName.MyProjectName.Web.csproj index 1629ad48c7..5424096c0f 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyCompanyName.MyProjectName.Web.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyCompanyName.MyProjectName.Web.csproj @@ -42,7 +42,7 @@ - + From a43438708426a0738192d1af7079d24b947a2afc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=B0smail=20=C3=87A=C4=9EDA=C5=9E?= Date: Thu, 16 Feb 2023 11:30:04 +0300 Subject: [PATCH 13/15] use bash for installing lepton and bootstrap-icons commands --- docs/en/Themes/LeptonXLite/Angular.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/docs/en/Themes/LeptonXLite/Angular.md b/docs/en/Themes/LeptonXLite/Angular.md index 7ebb649aca..56b003e606 100644 --- a/docs/en/Themes/LeptonXLite/Angular.md +++ b/docs/en/Themes/LeptonXLite/Angular.md @@ -14,11 +14,15 @@ To add `LeptonX-lite` into your project, - Install `@abp/ng.theme.lepton-x` -`yarn add @abp/ng.theme.lepton-x@preview` +```bash +yarn add @abp/ng.theme.lepton-x +``` - Install `bootstrap-icons` -`yarn add bootstrap-icons` +```bash +yarn add bootstrap-icons +``` - Then, we need to edit the styles array in `angular.json` to replace the existing style with the new one in the following link : From 5586e5a7871c58ab473ad4a8272622cd36c5f844 Mon Sep 17 00:00:00 2001 From: Hamza Albreem <94292623+braim23@users.noreply.github.com> Date: Thu, 16 Feb 2023 14:21:55 +0300 Subject: [PATCH 14/15] Fix the missing {{end}} in the Minimalist TodoApp doc --- docs/en/Tutorials/Todo/Single-Layer/Index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/Tutorials/Todo/Single-Layer/Index.md b/docs/en/Tutorials/Todo/Single-Layer/Index.md index ac6a89faea..fe09c57e3f 100644 --- a/docs/en/Tutorials/Todo/Single-Layer/Index.md +++ b/docs/en/Tutorials/Todo/Single-Layer/Index.md @@ -305,7 +305,7 @@ using Volo.Abp.Domain.Repositories; using TodoApp.Entities; using Volo.Abp.Application.Services; using Volo.Abp.Domain.Repositories; - +{{end}} namespace TodoApp.Services; From 2146d84b8fa0cc0c5eacd30b02c2099cd796b4ec Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 17 Feb 2023 09:53:03 +0800 Subject: [PATCH 15/15] Add `AbpStringToGuidConverter` and `AbpNullableStringToGuidConverter`. Resolve #13530 --- .../Mvc/Json/MvcCoreBuilderExtensions.cs | 2 + .../AbpJsonSystemTextJsonModule.cs | 2 + .../AbpNullableStringToGuidConverter.cs | 41 +++++++++ .../AbpStringToGuidConverter.cs | 36 ++++++++ .../ModelBinding/ModelBindingController.cs | 23 +++++ .../ModelBindingController_Tests.cs | 12 +++ .../Volo/Abp/Json/AbpStringToGuid_Tests.cs | 85 +++++++++++++++++++ 7 files changed, 201 insertions(+) create mode 100644 framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpNullableStringToGuidConverter.cs create mode 100644 framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpStringToGuidConverter.cs create mode 100644 framework/test/Volo.Abp.Json.Tests/Volo/Abp/Json/AbpStringToGuid_Tests.cs diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/MvcCoreBuilderExtensions.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/MvcCoreBuilderExtensions.cs index 9777265abd..4fc5a04859 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/MvcCoreBuilderExtensions.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/MvcCoreBuilderExtensions.cs @@ -20,6 +20,8 @@ public static class MvcCoreBuilderExtensions options.JsonSerializerOptions.Converters.Add(new AbpStringToEnumFactory()); options.JsonSerializerOptions.Converters.Add(new AbpStringToBooleanConverter()); + options.JsonSerializerOptions.Converters.Add(new AbpStringToGuidConverter()); + options.JsonSerializerOptions.Converters.Add(new AbpNullableStringToGuidConverter()); options.JsonSerializerOptions.Converters.Add(new ObjectToInferredTypesConverter()); options.JsonSerializerOptions.TypeInfoResolver = new AbpDefaultJsonTypeInfoResolver(serviceProvider diff --git a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpJsonSystemTextJsonModule.cs b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpJsonSystemTextJsonModule.cs index 50dd47d9e2..f6ef46a4e7 100644 --- a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpJsonSystemTextJsonModule.cs +++ b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpJsonSystemTextJsonModule.cs @@ -22,6 +22,8 @@ public class AbpJsonSystemTextJsonModule : AbpModule options.JsonSerializerOptions.Converters.Add(new AbpStringToEnumFactory()); options.JsonSerializerOptions.Converters.Add(new AbpStringToBooleanConverter()); + options.JsonSerializerOptions.Converters.Add(new AbpStringToGuidConverter()); + options.JsonSerializerOptions.Converters.Add(new AbpNullableStringToGuidConverter()); options.JsonSerializerOptions.Converters.Add(new ObjectToInferredTypesConverter()); options.JsonSerializerOptions.TypeInfoResolver = new AbpDefaultJsonTypeInfoResolver(serviceProvider diff --git a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpNullableStringToGuidConverter.cs b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpNullableStringToGuidConverter.cs new file mode 100644 index 0000000000..c80e5aa9a5 --- /dev/null +++ b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpNullableStringToGuidConverter.cs @@ -0,0 +1,41 @@ +using System; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace Volo.Abp.Json.SystemTextJson.JsonConverters; + +public class AbpNullableStringToGuidConverter : JsonConverter +{ + private JsonSerializerOptions _writeJsonSerializerOptions; + + public override Guid? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + if (reader.TokenType == JsonTokenType.String) + { + var guidString = reader.GetString(); + string[] formats = { "N", "D", "B", "P", "X" }; + foreach (var format in formats) + { + if (Guid.TryParseExact(guidString, format, out var guid)) + { + return guid; + } + } + } + + if (reader.TryGetGuid(out var guid2)) + { + return guid2; + } + + return null; + } + + public override void Write(Utf8JsonWriter writer, Guid? value, JsonSerializerOptions options) + { + _writeJsonSerializerOptions ??= JsonSerializerOptionsHelper.Create(options, this); + var entityConverter = (JsonConverter)_writeJsonSerializerOptions.GetConverter(typeof(Guid?)); + + entityConverter.Write(writer, value, _writeJsonSerializerOptions); + } +} diff --git a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpStringToGuidConverter.cs b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpStringToGuidConverter.cs new file mode 100644 index 0000000000..586e4462cf --- /dev/null +++ b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpStringToGuidConverter.cs @@ -0,0 +1,36 @@ +using System; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace Volo.Abp.Json.SystemTextJson.JsonConverters; + +public class AbpStringToGuidConverter : JsonConverter +{ + private JsonSerializerOptions _writeJsonSerializerOptions; + + public override Guid Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + if (reader.TokenType == JsonTokenType.String) + { + var guidString = reader.GetString(); + string[] formats = { "N", "D", "B", "P", "X" }; + foreach (var format in formats) + { + if (Guid.TryParseExact(guidString, format, out var guid)) + { + return guid; + } + } + } + + return reader.GetGuid(); + } + + public override void Write(Utf8JsonWriter writer, Guid value, JsonSerializerOptions options) + { + _writeJsonSerializerOptions ??= JsonSerializerOptionsHelper.Create(options, this); + var entityConverter = (JsonConverter)_writeJsonSerializerOptions.GetConverter(typeof(Guid)); + + entityConverter.Write(writer, value, _writeJsonSerializerOptions); + } +} diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/ModelBinding/ModelBindingController.cs b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/ModelBinding/ModelBindingController.cs index 471d33261a..6dfe3a7281 100644 --- a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/ModelBinding/ModelBindingController.cs +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/ModelBinding/ModelBindingController.cs @@ -49,6 +49,12 @@ public class ModelBindingController : AbpController input.Time3.Value.Kind.ToString().ToLower() + "_" + input.InnerModel.Time4.Kind.ToString().ToLower(); } + + [HttpPost("Guid_Json_Test")] + public GuidJsonModel Guid_Json_Test([FromBody] GuidJsonModel input) + { + return input; + } } public class GetDateTimeKindModel @@ -68,3 +74,20 @@ public class GetDateTimeKindModel public DateTime Time4 { get; set; } } } + +public class GuidJsonModel +{ + public Guid UserId { get; set; } + + public Guid UserId2 { get; set; } + + public Guid UserId3 { get; set; } + + public Guid UserId4 { get; set; } + + public Guid UserId5 { get; set; } + + public Guid? TenantId { get; set; } + + public Guid? TenantId2 { get; set; } +} diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/ModelBinding/ModelBindingController_Tests.cs b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/ModelBinding/ModelBindingController_Tests.cs index befbd169fa..53bfff8b68 100644 --- a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/ModelBinding/ModelBindingController_Tests.cs +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/ModelBinding/ModelBindingController_Tests.cs @@ -106,6 +106,18 @@ public abstract class ModelBindingController_Tests : AspNetCoreMvcTestBase var resultAsString = await response.Content.ReadAsStringAsync(); resultAsString.ShouldBe($"local_{Kind.ToString().ToLower()}_{Kind.ToString().ToLower()}_local"); } + + [Fact] + public async Task Guid_Json_Test() + { + var guid = Guid.NewGuid(); + var json = $"{{\"UserId\":\"{guid:B}\",\"UserId2\":\"{guid:N}\",\"UserId3\":\"{guid:D}\",\"UserId4\":\"{guid:P}\",\"UserId5\":\"{guid:x}\",\"TenantId\":null,\"TenantId2\":\"\"}}"; + var response = await Client.PostAsync("/api/model-Binding-test/Guid_Json_Test", new StringContent(json, Encoding.UTF8, MimeTypes.Application.Json)); + + response.StatusCode.ShouldBe(HttpStatusCode.OK); + var resultAsString = await response.Content.ReadAsStringAsync(); + resultAsString.ShouldBe($"{{\"userId\":\"{guid:D}\",\"userId2\":\"{guid:D}\",\"userId3\":\"{guid:D}\",\"userId4\":\"{guid:D}\",\"userId5\":\"{guid:D}\",\"tenantId\":null,\"tenantId2\":null}}"); + } } public class ModelBindingController_Utc_Tests : ModelBindingController_Tests diff --git a/framework/test/Volo.Abp.Json.Tests/Volo/Abp/Json/AbpStringToGuid_Tests.cs b/framework/test/Volo.Abp.Json.Tests/Volo/Abp/Json/AbpStringToGuid_Tests.cs new file mode 100644 index 0000000000..93918b48c1 --- /dev/null +++ b/framework/test/Volo.Abp.Json.Tests/Volo/Abp/Json/AbpStringToGuid_Tests.cs @@ -0,0 +1,85 @@ +using System; +using System.Text.Json; +using Shouldly; +using Volo.Abp.Json.SystemTextJson.JsonConverters; +using Xunit; + +namespace Volo.Abp.Json; + +public class AbpStringToGuid_Tests +{ + [Fact] + public void Test_Read() + { + var options = new JsonSerializerOptions() + { + Converters = + { + new AbpStringToGuidConverter(), + new AbpNullableStringToGuidConverter() + } + }; + + var guid = Guid.Parse("762DDB84-5225-4853-A566-FF0B3AF57585"); + var testClass = JsonSerializer.Deserialize("{" + + $"\"Id\": \"{guid:N}\", " + + $"\"NullableId\": \"{guid:D}\", " + + $"\"NullableId2\": \"{guid:B}\", " + + $"\"NullableId3\": \"{guid:P}\", " + + $"\"NullableId4\": \"{guid:X}\", " + + "\"NullableId5\": \"\", " + + "\"NullableId6\": null}", options); + testClass.ShouldNotBeNull(); + testClass.Id.ShouldBe(guid); + testClass.NullableId.ShouldBe(guid); + testClass.NullableId2.ShouldBe(guid); + testClass.NullableId3.ShouldBe(guid); + testClass.NullableId4.ShouldBe(guid); + testClass.NullableId5.ShouldBeNull(); + testClass.NullableId6.ShouldBeNull(); + } + + [Fact] + public void Test_Write() + { + var options = new JsonSerializerOptions() + { + Converters = + { + new AbpStringToGuidConverter(), + new AbpNullableStringToGuidConverter() + } + }; + + var guid = Guid.Parse("762DDB84-5225-4853-A566-FF0B3AF57585"); + var json = JsonSerializer.Serialize(new TestClass() + { + Id = guid, + NullableId = null, + NullableId2 = guid, + NullableId3 = null, + NullableId4 = guid, + NullableId5 = null, + NullableId6 = guid + }, options); + + json.ShouldBe($"{{\"Id\":\"{guid:D}\",\"NullableId\":null,\"NullableId2\":\"{guid:D}\",\"NullableId3\":null,\"NullableId4\":\"{guid:D}\",\"NullableId5\":null,\"NullableId6\":\"{guid:D}\"}}"); + } + + class TestClass + { + public Guid Id { get; set; } + + public Guid? NullableId { get; set; } + + public Guid? NullableId2 { get; set; } + + public Guid? NullableId3 { get; set; } + + public Guid? NullableId4 { get; set; } + + public Guid? NullableId5 { get; set; } + + public Guid? NullableId6 { get; set; } + } +}