From 9c6529e93f0e11e4a555264cb21f8ed694949456 Mon Sep 17 00:00:00 2001 From: Sinan997 Date: Fri, 28 Jul 2023 14:59:40 +0300 Subject: [PATCH 01/58] show password directive test and document --- docs/en/UI/Angular/Show-Password-Directive.md | 52 +++++++++++++++ .../Angular/images/showPasswordDirective1.png | Bin 0 -> 3707 bytes .../Angular/images/showPasswordDirective2.png | Bin 0 -> 3932 bytes .../lib/tests/show-password-directive.spec.ts | 59 ++++++++++++++++++ 4 files changed, 111 insertions(+) create mode 100644 docs/en/UI/Angular/Show-Password-Directive.md create mode 100644 docs/en/UI/Angular/images/showPasswordDirective1.png create mode 100644 docs/en/UI/Angular/images/showPasswordDirective2.png create mode 100644 npm/ng-packs/packages/core/src/lib/tests/show-password-directive.spec.ts diff --git a/docs/en/UI/Angular/Show-Password-Directive.md b/docs/en/UI/Angular/Show-Password-Directive.md new file mode 100644 index 0000000000..db54bcdd76 --- /dev/null +++ b/docs/en/UI/Angular/Show-Password-Directive.md @@ -0,0 +1,52 @@ +# Show Password Directive + +In password input, text can be shown easily via changing input type attribute to `text`. To make this even easier, you can use the `ShowPasswordDirective` which has been exposed by the `@abp/ng.core` package. + + +## Getting Started + +In order to use the `ShowPasswordDirective` in an HTML template, the **`CoreModule`** should be imported into your module like this: + +```ts +// ... +import { CoreModule } from '@abp/ng.core'; + +@NgModule({ + //... + imports: [..., CoreModule], +}) +export class MyFeatureModule {} +``` + +## Usage + +The `ShowPasswordDirective` is very easy to use. The directive's selector is **`abpShowPassword`**. By adding the `abpShowPassword` attribute to an input element, you can activate the `ShowPasswordDirective` for the input element. + +See an example usage: + +```ts +@Component({ + selector: 'test-component', + standalone: true, + template: ` +
+ + + icon +
+ ` +}) +export class TestComponent{ + showPassword = false; +} +``` + +The `abpShowPassword` attribute has been added to the `` element. Click icon to activate the `ShowPasswordDirective`. + +See the result: + +![Show Password directive](./images/showPasswordDirective1.png) + +To see password input click icon. + +![Show Password directive](./images/showPasswordDirective2.png) \ No newline at end of file diff --git a/docs/en/UI/Angular/images/showPasswordDirective1.png b/docs/en/UI/Angular/images/showPasswordDirective1.png new file mode 100644 index 0000000000000000000000000000000000000000..7b64be2b5f14c8e8affb7849331f0f5398188193 GIT binary patch literal 3707 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 YNubRLytJp=IDz)l)k46FG%?Tr1J+;SK>z>% literal 0 HcmV?d00001 diff --git a/docs/en/UI/Angular/images/showPasswordDirective2.png b/docs/en/UI/Angular/images/showPasswordDirective2.png new file mode 100644 index 0000000000000000000000000000000000000000..43199ffeaa2b1a813743599a1f74137404254ee0 GIT binary patch literal 3932 zcma)9c{r5c+aIzg+4mt!mWYsb)W|+)rYPB$3`(|;ol(-*X~w=Q5h457cP4u=XzW`m zG)N5D-pBWP|NOr1?{}{2dCqyx@|^qr-1j;6{fW8**So;L%K!p_F2MA)jX@wv7|^~; zM+3ZjGvwDnpo{b{?OXT!vwqE@JPEtm_-*kf;t{K<#)AlHnHH)73MMRNmwXoN`BRSd zjJid*^c_*jD+F7X50*?Z{x&|tx+PTL>je5@AKtn zGBQ$M)L5St=%BwP1k={m7Nv?1JsW0b#{gg2ns@$n@QqAiWrtn&qv&3{$cKry0t|tv ze<#!J674F&hczG_cHecZKa2?Vv9qB&xOIXorJnD}(os#xmi)7IjHA4cLv*~5no^FP zGc5(`N$y9*_p;L%ZM=<+v$MGEKK#!?uP{(j$Lw~l#p;UuavKV95!~ZWmlT6joJlD> z$JNT_Qlrke4 z#)_Yn70TN^TyvmC)^Pk@KXSX~BQOx^mjCC0>|NzR0Yg&e?H6)keas6B6XUK|$es1H z{=daJ<1bd)L#*K^D0g9*9Ue}2H8Tg}=X>`f>W(>BSPp!n+7pqTDe^S%4az0h{@i_j ziRN4|n$pvOa{#rt(nvn9a?;h5HoC9Y7SKXzZDi-UN;|hn!)uFZ^X?TkIHZ$&C8IrcW zR?Nk_`s>2G5Ap2E5#{1fY3=lTy-T}iKO)YIC{qT22E(=Xk5yBI(_=qIcRpx*HN`s@ zgw^PGEj(T4?j^c1$`R}-_v@ceOq1-1OL7~k_u${0l))NZMHKR(zZpeIOP@(@uBY|X zVc}@Lr!z=&3Q||8wTHISPtKmdJDvx2obSb*0W-eG;jy`%L-+0Kq6c0+J&_U;Pf-?E z-(rnkGR8CeA;*ZSCPf1!o(P^m>f98-;8yM|Y?$F8*jiuj)dZ-Hg`w&+`PajNI$e3e zY9DaP)rAHQrQX{JhfY^69$ZTGDpcvq7MeC-O&3x;R=D7Qi4C7Kenc8^w}6)B|J=?@ zUlY_Cd;LI#8=7e;rV>@9WZZNU^uYS3hcs}OUQ2hTg1EbWJmDke*nTR%NFKdDp{q%L zy;v=5!|+K`t5T$yQzY*!I2_0<|-C>kG;c(dcVp z(TqlO0p`9T7PYBDKjUd*PHU5Y?Ld_j)EcHin{~53wNYwU|Ll0j`m;J6XF=T4jYhZT z`rf}Sj_(I&1_T9N03Y9*Rpv=bO!QpUM8vnOxxj-@ets(zuTeSQwVd(T#pR$s|NWwf zT()~b?PP|*He(YHibn`imrdOG;giQhV3BhLQk*Zq=qe;m_y9knGb%Xxn^Fb;b;VdQ(E z3FPY^w5EYng2pI+XyEiv))ZOkupf7q0|Itl&1O7C^3~$QQ{R==?|1l69og4LZADE3 zz9nyGmL+YDME9qDnm49R(@*!~qQ@&$I}M4sB-B4vGw#?^lp+QX>h?AhHNuuHO{?=+ z3uV3J#z*IEm-zpQHw{$MMz#cw$luDQ&rm77-Crn}Qj$FzCmU?843yBt<_uDSDC?EW zNeu9qEXIb;&t}31c14H%>|vWQFV9HZp>?`F-jn{DGy# zlfE&7#9Ytk2z$TGyy}rPzfM32J1^~Z`(%xsrn3|#s06AH)+s^a1BlX@SjH0vLQpW5 zc`V1_ubsZuQzp!Ee#4%`oDF^ymhH)=9JhX~5ctUZV~}N$YK7%-YM#JZ)XDoMvZpxL z9@`W;SdhlMM+hA*LZK^hj`9%Il;u;uj0MF$Bint6VXBL$&|UKNnzVYEWl7Rus@WcU zDe~~kr}TO-g(1l7Y5Av~X9-|KMuG>tb9*HM2S>e0o9U4>i?t11!tdM?*hyty_-UxB zV9gHA)G-)|a+qV7xX~KcoDDK}o!RVkKXEacCs`SP=W6dpVlGbD$xe;P|AuAT-um6m z>%z46?h+vE^Ka8tR2psQf_JDH#PABYI=aQI*JAr68^%?}V6IP?XxU#vn|gP}d�Y zx-=@ZKc@!UqB`SJS~_LXdsHc4kZavv)ya!NHN1YKx6!>ZL-8~2tgiLj$XwO;4d2+Ksk1Ka;xH8ZN3$6e-$NX3jNU>tlZ zQ4zb%Z~F#Oi;t_uFmlS1clM@ox8~DtyNp??q?Cu(Xb)zGy7Z^s^et7LP>40(j182Xjlu#7K|v}%u{U_&hCCOuTzgM(&s4_1Dys#{!414iZG}UF zRtzUsc~Bwr2Tv%xid7ipPLnh_+eL~+d5`xk2Sth5AnE!(hE}yJ!+aT;ZLP6uYij*D zbzLN3D@5sfNarK*@l%u8<)YY0E=vA9q@SeD0C;6`e`|bY+04es{Pt$PDj?TpQoAHP zXy$qVjjqNEx*xE=Xm>@vuh~?0_nhxW{%~$XG=^&x^VRqkiIvN7R?wrg zTzvfy_EjOQFRI&LO2WND!LRfj1XeKBj@k!(CvOurCEpU9JLJE_hfD=qAyAzsIyc0^ z4@3L|TWVLk)(@+Ot-L6{*95L@FA*&?Nbmf`fV;x0N84Rro^t8dk#JgaWlUxwaV%;fdRt0cIzjw`v++JMTNJ4&gZ?)2xP51m8SQ0zHm4)Tx?@- z0(r*{RmS0|)%iX4&dH^HY$4bhpC!NdSN23hRBMzJQjZRIB#sHu%eQD-=1|qZ2G!>e zuLZ}vf)=KGlM*lus(N3Guv5)=>zrJfd8@U2sSm% zKB@rOC=pkc*ftja%s}aUVOoc!?#~nfvXb~~vgW41dv7xPnU~3UX|Yn*hh`ddurcuu z?0ACavM=9b^v=n|URTK8?g9;p4*OufzOD7}+a+uZvA*ryo#!$cL-8U#v6~u_93+pM)@PVZhFKZ?&J1|(k3;aqTJif) zzhlq?Y(8)P8uAn(3JuK_L>c zjJq2d-D*_}tcU$l1>Wa%dN{rM+>Wqk(j~bD8R|G1jnw z`MCDZ@=)!+hCZ(R+0XZYB}6O%R#6?^v1)HWf0l`?81T6Y=mI@<6$%@5_J|p#eM>ps zI0gei1J*AznP~g#y!88)hlExH-%K4&(IGm@;fLbnm$?apyjeuv#aT08qHrpvk3CLO z?bVO3Dlf9ZH8@4`fkg-d?DP0r + + + `, + imports:[ShowPasswordDirective] +}) +class TestComponent { + showPassword:boolean = false +} + +describe('ShowPasswordDirective',()=>{ + let fixture: ComponentFixture;; + let des : DebugElement[]; + let desAll : DebugElement[]; + let bareInput; + + beforeEach(()=>{ + fixture = TestBed.configureTestingModule({ + imports: [ TestComponent ] + }).createComponent(TestComponent) + + fixture.detectChanges(); // initial binding + + // all elements with an attached HighlightDirective + des = fixture.debugElement.queryAll(By.directive(ShowPasswordDirective)); + + // all inputs includes nondirective + desAll = fixture.debugElement.queryAll(By.all()); + + // the input without the ShowPasswordDirective + bareInput = fixture.debugElement.query(By.css('input:not([abpShowPassword])')); + }) + + // color tests + it('should have three input has ShowPasswordDirective elements', () => { + expect(des.length).toBe(3); + }); + + test.each([[0,'text'],[1,'password'],[2,'text'],[3,'password']])('%p. input type must be %p)', (index,inpType) => { + const inputType = desAll[index].nativeElement.type; + expect(inputType).toBe(inpType); + }); + + it('should have three input has ShowPasswordDirective elements', () => { + let input = des[2].nativeElement + expect(input.type).toBe('password') + fixture.componentInstance.showPassword = true + fixture.detectChanges() + expect(input.type).toBe('text') + }); + }); \ No newline at end of file From 11f03b26ed02e28850e3e14081a37e607ec3ee1d Mon Sep 17 00:00:00 2001 From: Sinan997 Date: Sun, 30 Jul 2023 23:48:51 +0300 Subject: [PATCH 02/58] capsLock doc and test --- .../src/lib/tests/capsLock.directive.spec.ts | 58 +++++++++++++++++++ .../lib/tests/show-password-directive.spec.ts | 2 +- 2 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 npm/ng-packs/packages/core/src/lib/tests/capsLock.directive.spec.ts diff --git a/npm/ng-packs/packages/core/src/lib/tests/capsLock.directive.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/capsLock.directive.spec.ts new file mode 100644 index 0000000000..17d50ba697 --- /dev/null +++ b/npm/ng-packs/packages/core/src/lib/tests/capsLock.directive.spec.ts @@ -0,0 +1,58 @@ +import { Component, DebugElement } from '@angular/core' +import { ComponentFixture, TestBed } from '@angular/core/testing' +import { TrackCapsLockDirective } from '../directives'; +import { By } from '@angular/platform-browser'; + +@Component({ + standalone:true, + template: ` + + `, + imports:[TrackCapsLockDirective] +}) +class TestComponent { + capsLock:boolean = false +} + +describe('TrackCapsLockDirective',()=>{ + let fixture: ComponentFixture;; + let des : DebugElement[]; + + beforeEach(()=>{ + fixture = TestBed.configureTestingModule({ + imports: [ TestComponent ] + }).createComponent(TestComponent); + + fixture.detectChanges(); + + des = fixture.debugElement.queryAll(By.directive(TrackCapsLockDirective)); + }); + + // tests + test.each(['keydown','keyup'])('is %p works when press capslock and is emit status', (eventName) => { + const event = new KeyboardEvent(eventName, { + key: 'CapsLock', + modifierCapsLock: true + }); + window.dispatchEvent(event); + fixture.detectChanges(); + expect(fixture.componentInstance.capsLock).toBe(true) + }); + + test.each(['keydown','keyup'])('is %p detect the change capslock is emit status', (eventName) => { + const trueEvent = new KeyboardEvent(eventName, { + key: 'CapsLock', + modifierCapsLock: true + }); + window.dispatchEvent(trueEvent); + fixture.detectChanges(); + expect(fixture.componentInstance.capsLock).toBe(true) + const falseEvent = new KeyboardEvent(eventName, { + key: 'CapsLock', + modifierCapsLock: false + }); + window.dispatchEvent(falseEvent); + fixture.detectChanges(); + expect(fixture.componentInstance.capsLock).toBe(false) + }); + }); \ No newline at end of file diff --git a/npm/ng-packs/packages/core/src/lib/tests/show-password-directive.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/show-password-directive.spec.ts index 6b07997bc9..e1e9750995 100644 --- a/npm/ng-packs/packages/core/src/lib/tests/show-password-directive.spec.ts +++ b/npm/ng-packs/packages/core/src/lib/tests/show-password-directive.spec.ts @@ -39,7 +39,7 @@ describe('ShowPasswordDirective',()=>{ bareInput = fixture.debugElement.query(By.css('input:not([abpShowPassword])')); }) - // color tests + // tests it('should have three input has ShowPasswordDirective elements', () => { expect(des.length).toBe(3); }); From 3257c24d74186ebf1d62452b5b8e752c0201c726 Mon Sep 17 00:00:00 2001 From: Sinan997 Date: Sun, 30 Jul 2023 23:49:52 +0300 Subject: [PATCH 03/58] capsLock doc and test --- docs/en/UI/Angular/CapsLock.directive.md | 52 ++++++++++++++++++ .../UI/Angular/images/CapsLockDirective1.png | Bin 0 -> 2224 bytes .../UI/Angular/images/CapsLockDirective2.png | Bin 0 -> 4274 bytes 3 files changed, 52 insertions(+) create mode 100644 docs/en/UI/Angular/CapsLock.directive.md create mode 100644 docs/en/UI/Angular/images/CapsLockDirective1.png create mode 100644 docs/en/UI/Angular/images/CapsLockDirective2.png diff --git a/docs/en/UI/Angular/CapsLock.directive.md b/docs/en/UI/Angular/CapsLock.directive.md new file mode 100644 index 0000000000..4b92d61124 --- /dev/null +++ b/docs/en/UI/Angular/CapsLock.directive.md @@ -0,0 +1,52 @@ +# Show Password Directive + +In password inputs,You may want to show if Caps Lock is on. To make this even easier, you can use the `TrackCapsLockDirective` which has been exposed by the `@abp/ng.core` package. + + +## Getting Started + +In order to use the `TrackCapsLockDirective` in an HTML template, the **`CoreModule`** should be imported into your module like this: + +```ts +// ... +import { CoreModule } from '@abp/ng.core'; + +@NgModule({ + //... + imports: [..., CoreModule], +}) +export class MyFeatureModule {} +``` + +## Usage + +The `TrackCapsLockDirective` is very easy to use. The directive's selector is **`abpCapsLock`**. By adding the `abpCapsLock` event to an element, you can track the status of Caps Lock. U can use this to warn user + +See an example usage: + +```ts +@Component({ + selector: 'test-component', + standalone: true, + template: ` +
+ + + icon +
+ ` +}) +export class TestComponent{ + capsLock = false; +} +``` + +The `abpCapsLock` event has been added to the `` element. Press Caps Lock to activate the `TrackCapsLockDirective`. + +See the result: + +![Show Password directive](./images/CapsLockDirective1.png) + +To see Caps Lock icon press Caps Lock. + +![Show Password directive](./images/CapsLockDirective2.png) \ No newline at end of file diff --git a/docs/en/UI/Angular/images/CapsLockDirective1.png b/docs/en/UI/Angular/images/CapsLockDirective1.png new file mode 100644 index 0000000000000000000000000000000000000000..2f143d755fd2d331beed42c8ce9c361cb8aeaa0b GIT binary patch literal 2224 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 U>BitD2Pwepw$-gl!+XE~7Z`*$lmGw# literal 0 HcmV?d00001 From 45a544b0108d8aa8f0083dc092083c669f5e9a17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sinan=20=C3=96zt=C3=BCrk?= <72804437+Sinan997@users.noreply.github.com> Date: Mon, 31 Jul 2023 10:48:56 +0300 Subject: [PATCH 04/58] Update CapsLock.directive.md --- docs/en/UI/Angular/CapsLock.directive.md | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/docs/en/UI/Angular/CapsLock.directive.md b/docs/en/UI/Angular/CapsLock.directive.md index 4b92d61124..a21057490c 100644 --- a/docs/en/UI/Angular/CapsLock.directive.md +++ b/docs/en/UI/Angular/CapsLock.directive.md @@ -5,15 +5,17 @@ In password inputs,You may want to show if Caps Lock is on. To make this even ea ## Getting Started -In order to use the `TrackCapsLockDirective` in an HTML template, the **`CoreModule`** should be imported into your module like this: +`TrackCapsLockDirective` is standalone. In order to use the `TrackCapsLockDirective` in an HTML template, import it to related module or your standalone component: ```ts -// ... -import { CoreModule } from '@abp/ng.core'; +import { TrackCapsLockDirective } from '@abp/ng.core'; @NgModule({ //... - imports: [..., CoreModule], + imports: [ + ..., + TrackCapsLockDirective + ], }) export class MyFeatureModule {} ``` @@ -25,6 +27,8 @@ The `TrackCapsLockDirective` is very easy to use. The directive's selector is ** See an example usage: ```ts +import { TrackCapsLockDirective } from '@abp/ng.core' + @Component({ selector: 'test-component', standalone: true, @@ -34,7 +38,8 @@ See an example usage: icon - ` + `, + imports: [ TrackCapsLockDirective ] }) export class TestComponent{ capsLock = false; @@ -49,4 +54,4 @@ See the result: To see Caps Lock icon press Caps Lock. -![Show Password directive](./images/CapsLockDirective2.png) \ No newline at end of file +![Show Password directive](./images/CapsLockDirective2.png) From 383222a9ee7b6e9699228e9b71ffa16044ef309b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sinan=20=C3=96zt=C3=BCrk?= <72804437+Sinan997@users.noreply.github.com> Date: Mon, 31 Jul 2023 10:51:53 +0300 Subject: [PATCH 05/58] Update CapsLock.directive.md --- docs/en/UI/Angular/CapsLock.directive.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/en/UI/Angular/CapsLock.directive.md b/docs/en/UI/Angular/CapsLock.directive.md index a21057490c..24bef39cdc 100644 --- a/docs/en/UI/Angular/CapsLock.directive.md +++ b/docs/en/UI/Angular/CapsLock.directive.md @@ -1,6 +1,6 @@ -# Show Password Directive +# Caps Lock Directive -In password inputs,You may want to show if Caps Lock is on. To make this even easier, you can use the `TrackCapsLockDirective` which has been exposed by the `@abp/ng.core` package. +In password inputs, You may want to show if Caps Lock is on. To make this even easier, you can use the `TrackCapsLockDirective` which has been exposed by the `@abp/ng.core` package. ## Getting Started From f96f71576b4318b4a58bf85b2355432d8819d55b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sinan=20=C3=96zt=C3=BCrk?= <72804437+Sinan997@users.noreply.github.com> Date: Mon, 31 Jul 2023 10:58:53 +0300 Subject: [PATCH 06/58] Update Show-Password-Directive.md --- docs/en/UI/Angular/Show-Password-Directive.md | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/docs/en/UI/Angular/Show-Password-Directive.md b/docs/en/UI/Angular/Show-Password-Directive.md index db54bcdd76..6c3cbe4f45 100644 --- a/docs/en/UI/Angular/Show-Password-Directive.md +++ b/docs/en/UI/Angular/Show-Password-Directive.md @@ -4,16 +4,17 @@ In password input, text can be shown easily via changing input type attribute to ## Getting Started - -In order to use the `ShowPasswordDirective` in an HTML template, the **`CoreModule`** should be imported into your module like this: +`ShowPasswordDirective` is standalone. In order to use the `ShowPasswordDirective` in an HTML template, import it to related module or your standalone component: ```ts -// ... -import { CoreModule } from '@abp/ng.core'; +import { ShowPasswordDirective } from '@abp/ng.core'; @NgModule({ //... - imports: [..., CoreModule], + imports: [ + ..., + ShowPasswordDirective + ], }) export class MyFeatureModule {} ``` @@ -25,6 +26,7 @@ The `ShowPasswordDirective` is very easy to use. The directive's selector is **` See an example usage: ```ts +import { ShowPasswordDirective } from '@abp/ng.core'; @Component({ selector: 'test-component', standalone: true, @@ -34,7 +36,8 @@ See an example usage: icon - ` + `, + imports: [ShowPasswordDirective] }) export class TestComponent{ showPassword = false; @@ -49,4 +52,4 @@ See the result: To see password input click icon. -![Show Password directive](./images/showPasswordDirective2.png) \ No newline at end of file +![Show Password directive](./images/showPasswordDirective2.png) From 6e4cd54f2a675685511d4a4fb4c213e0c75db37f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sinan=20=C3=96zt=C3=BCrk?= <72804437+Sinan997@users.noreply.github.com> Date: Mon, 31 Jul 2023 11:21:13 +0300 Subject: [PATCH 07/58] Update CapsLock.directive.md --- docs/en/UI/Angular/CapsLock.directive.md | 29 +++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/docs/en/UI/Angular/CapsLock.directive.md b/docs/en/UI/Angular/CapsLock.directive.md index 24bef39cdc..1e1021bdd4 100644 --- a/docs/en/UI/Angular/CapsLock.directive.md +++ b/docs/en/UI/Angular/CapsLock.directive.md @@ -7,11 +7,16 @@ In password inputs, You may want to show if Caps Lock is on. To make this even e `TrackCapsLockDirective` is standalone. In order to use the `TrackCapsLockDirective` in an HTML template, import it to related module or your standalone component: +**Importing to NgModule** ```ts import { TrackCapsLockDirective } from '@abp/ng.core'; @NgModule({ //... + declarations: [ + ..., + TestComponent + ], imports: [ ..., TrackCapsLockDirective @@ -22,15 +27,33 @@ export class MyFeatureModule {} ## Usage -The `TrackCapsLockDirective` is very easy to use. The directive's selector is **`abpCapsLock`**. By adding the `abpCapsLock` event to an element, you can track the status of Caps Lock. U can use this to warn user +The `TrackCapsLockDirective` is very easy to use. The directive's selector is **`abpCapsLock`**. By adding the `abpCapsLock` event to an element, you can track the status of Caps Lock. You can use this to warn user. See an example usage: +**NgModule Component usage** +```ts +@Component({ + selector: 'test-component', + template: ` +
+ + + icon +
+ ` +}) +export class TestComponent{ + capsLock = false; +} +``` + +**Standalone Component usage** ```ts import { TrackCapsLockDirective } from '@abp/ng.core' @Component({ - selector: 'test-component', + selector: 'standalone-component', standalone: true, template: `
@@ -41,7 +64,7 @@ import { TrackCapsLockDirective } from '@abp/ng.core' `, imports: [ TrackCapsLockDirective ] }) -export class TestComponent{ +export class StandaloneComponent{ capsLock = false; } ``` From 3daec5dd224a7169027b402b2d0613e49e64c021 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sinan=20=C3=96zt=C3=BCrk?= <72804437+Sinan997@users.noreply.github.com> Date: Mon, 31 Jul 2023 12:22:36 +0300 Subject: [PATCH 08/58] Update Show-Password-Directive.md --- docs/en/UI/Angular/Show-Password-Directive.md | 26 +++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/docs/en/UI/Angular/Show-Password-Directive.md b/docs/en/UI/Angular/Show-Password-Directive.md index 6c3cbe4f45..c19c8073bd 100644 --- a/docs/en/UI/Angular/Show-Password-Directive.md +++ b/docs/en/UI/Angular/Show-Password-Directive.md @@ -6,11 +6,16 @@ In password input, text can be shown easily via changing input type attribute to ## Getting Started `ShowPasswordDirective` is standalone. In order to use the `ShowPasswordDirective` in an HTML template, import it to related module or your standalone component: +**Importing to NgModule** ```ts import { ShowPasswordDirective } from '@abp/ng.core'; @NgModule({ //... + declarations: [ + ..., + TestComponent + ], imports: [ ..., ShowPasswordDirective @@ -25,10 +30,27 @@ The `ShowPasswordDirective` is very easy to use. The directive's selector is **` See an example usage: +**NgModule Component usage** ```ts -import { ShowPasswordDirective } from '@abp/ng.core'; @Component({ selector: 'test-component', + template: ` +
+ + + icon +
+ ` +}) +export class TestComponent{ + showPassword = false; +} +``` +**Standalone Component usage** +```ts +import { ShowPasswordDirective } from '@abp/ng.core'; +@Component({ + selector: 'standalone-component', standalone: true, template: `
@@ -39,7 +61,7 @@ import { ShowPasswordDirective } from '@abp/ng.core'; `, imports: [ShowPasswordDirective] }) -export class TestComponent{ +export class StandaloneComponent{ showPassword = false; } ``` From 8197eb1289a1c935c5e32b5f0fcf481e0c420293 Mon Sep 17 00:00:00 2001 From: Sinan997 Date: Mon, 31 Jul 2023 12:57:37 +0300 Subject: [PATCH 09/58] settings tab re-order --- .../src/lib/providers/feature-management-settings.provider.ts | 2 +- .../config/src/lib/providers/setting-tab.provider.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/npm/ng-packs/packages/feature-management/src/lib/providers/feature-management-settings.provider.ts b/npm/ng-packs/packages/feature-management/src/lib/providers/feature-management-settings.provider.ts index 2d7664bb46..30d6701d4b 100644 --- a/npm/ng-packs/packages/feature-management/src/lib/providers/feature-management-settings.provider.ts +++ b/npm/ng-packs/packages/feature-management/src/lib/providers/feature-management-settings.provider.ts @@ -17,7 +17,7 @@ export function configureSettingTabs(settingtabs: SettingTabsService) { settingtabs.add([ { name: eFeatureManagementTabNames.FeatureManagement, - order: 104, + order: 120, requiredPolicy: 'FeatureManagement.ManageHostFeatures', component: FeatureManagementTabComponent, }, diff --git a/npm/ng-packs/packages/setting-management/config/src/lib/providers/setting-tab.provider.ts b/npm/ng-packs/packages/setting-management/config/src/lib/providers/setting-tab.provider.ts index f05104c177..91a31f70cc 100644 --- a/npm/ng-packs/packages/setting-management/config/src/lib/providers/setting-tab.provider.ts +++ b/npm/ng-packs/packages/setting-management/config/src/lib/providers/setting-tab.provider.ts @@ -17,7 +17,7 @@ export function configureSettingTabs(settingTabs: SettingTabsService) { settingTabs.add([ { name: eSettingManamagementSettingTabNames.EmailSettingGroup, - order: 100, + order: 110, requiredPolicy: 'SettingManagement.Emailing', component: EmailSettingGroupComponent, }, From 9b778069fdcc7e1079d40ddcba55b3758ca028ab Mon Sep 17 00:00:00 2001 From: Sinan997 Date: Mon, 31 Jul 2023 17:50:39 +0300 Subject: [PATCH 10/58] re-setting order to default value and new sorting compare function --- .../core/src/lib/services/routes.service.ts | 22 +++++++++++++++---- .../feature-management-settings.provider.ts | 2 +- .../src/lib/providers/setting-tab.provider.ts | 2 +- 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/npm/ng-packs/packages/core/src/lib/services/routes.service.ts b/npm/ng-packs/packages/core/src/lib/services/routes.service.ts index 329d2a370c..ec8ee4c4e5 100644 --- a/npm/ng-packs/packages/core/src/lib/services/routes.service.ts +++ b/npm/ng-packs/packages/core/src/lib/services/routes.service.ts @@ -12,6 +12,7 @@ import { } from '../utils/tree-utils'; import { ConfigStateService } from './config-state.service'; import { PermissionService } from './permission.service'; +import { LocalizationService } from './localization.service'; // eslint-disable-next-line @typescript-eslint/ban-types export abstract class AbstractTreeService { @@ -158,14 +159,26 @@ export abstract class AbstractNavTreeService { private subscription: Subscription; private permissionService: PermissionService; + private localizationService: LocalizationService readonly id = 'name'; readonly parentId = 'parentName'; readonly hide = (item: T) => item.invisible || !this.isGranted(item); readonly sort = (a: T, b: T) => { - if (!Number.isInteger(a.order)) return 1; - if (!Number.isInteger(b.order)) return -1; - - return (a.order as number) - (b.order as number); + const aName = this.localizationService.instant(a.name); + const bName = this.localizationService.instant(b.name); + const aNumber = a.order; + const bNumber = b.order; + + if (!Number.isInteger(aNumber)) return 1; + if (!Number.isInteger(bNumber)) return -1; + + if (aNumber > bNumber) return 1 + if (aNumber < bNumber) return -1 + + if ( aName > bName ) return 1; + if ( aName < bName ) return -1; + + return 0 }; constructor(protected injector: Injector) { @@ -175,6 +188,7 @@ export abstract class AbstractNavTreeService .createOnUpdateStream(state => state) .subscribe(() => this.refresh()); this.permissionService = injector.get(PermissionService); + this.localizationService = injector.get(LocalizationService); this.othersGroup = injector.get(OTHERS_GROUP); } diff --git a/npm/ng-packs/packages/feature-management/src/lib/providers/feature-management-settings.provider.ts b/npm/ng-packs/packages/feature-management/src/lib/providers/feature-management-settings.provider.ts index 30d6701d4b..64bbfb9932 100644 --- a/npm/ng-packs/packages/feature-management/src/lib/providers/feature-management-settings.provider.ts +++ b/npm/ng-packs/packages/feature-management/src/lib/providers/feature-management-settings.provider.ts @@ -17,7 +17,7 @@ export function configureSettingTabs(settingtabs: SettingTabsService) { settingtabs.add([ { name: eFeatureManagementTabNames.FeatureManagement, - order: 120, + order: 100, requiredPolicy: 'FeatureManagement.ManageHostFeatures', component: FeatureManagementTabComponent, }, diff --git a/npm/ng-packs/packages/setting-management/config/src/lib/providers/setting-tab.provider.ts b/npm/ng-packs/packages/setting-management/config/src/lib/providers/setting-tab.provider.ts index 91a31f70cc..f05104c177 100644 --- a/npm/ng-packs/packages/setting-management/config/src/lib/providers/setting-tab.provider.ts +++ b/npm/ng-packs/packages/setting-management/config/src/lib/providers/setting-tab.provider.ts @@ -17,7 +17,7 @@ export function configureSettingTabs(settingTabs: SettingTabsService) { settingTabs.add([ { name: eSettingManamagementSettingTabNames.EmailSettingGroup, - order: 110, + order: 100, requiredPolicy: 'SettingManagement.Emailing', component: EmailSettingGroupComponent, }, From 939f116ebcfe01dc2e2fb90ddaefbb783d2fb30a Mon Sep 17 00:00:00 2001 From: Sinan997 Date: Tue, 1 Aug 2023 12:14:00 +0300 Subject: [PATCH 11/58] moving logic to compare func --- .../packages/core/src/lib/services/routes.service.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/npm/ng-packs/packages/core/src/lib/services/routes.service.ts b/npm/ng-packs/packages/core/src/lib/services/routes.service.ts index ec8ee4c4e5..5f05eaa8ab 100644 --- a/npm/ng-packs/packages/core/src/lib/services/routes.service.ts +++ b/npm/ng-packs/packages/core/src/lib/services/routes.service.ts @@ -164,6 +164,10 @@ export abstract class AbstractNavTreeService readonly parentId = 'parentName'; readonly hide = (item: T) => item.invisible || !this.isGranted(item); readonly sort = (a: T, b: T) => { + return this.compareFunc(a,b) + }; + + readonly compareFunc = (a: T, b: T) => { const aName = this.localizationService.instant(a.name); const bName = this.localizationService.instant(b.name); const aNumber = a.order; @@ -179,7 +183,7 @@ export abstract class AbstractNavTreeService if ( aName < bName ) return -1; return 0 - }; + } constructor(protected injector: Injector) { super(); From b2008832025e0dd742f42e493dea9f6988322ea2 Mon Sep 17 00:00:00 2001 From: Masum ULU Date: Tue, 1 Aug 2023 14:30:13 +0300 Subject: [PATCH 12/58] Update NavItem model for toolbar --- .../packages/theme-shared/src/lib/models/nav-item.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/npm/ng-packs/packages/theme-shared/src/lib/models/nav-item.ts b/npm/ng-packs/packages/theme-shared/src/lib/models/nav-item.ts index 706eb1cb6c..c673bc74e2 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/models/nav-item.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/models/nav-item.ts @@ -1,8 +1,17 @@ import { Injector, Type } from '@angular/core'; import { Observable, of } from 'rxjs'; +export interface Badge { + count?: number | Observable; + color?: string; + icon?: string; +} + export class NavItem { id?: string | number; + name?: string; + description?: string; + badge?: Badge; component?: Type; html?: string; action?: () => void; From 2f112e136726e7340727f704da3d6567f73ebfe1 Mon Sep 17 00:00:00 2001 From: Sinan997 Date: Wed, 2 Aug 2023 13:54:32 +0300 Subject: [PATCH 13/58] SORT_COMPARE_FUNC injection token added --- .../packages/core/src/lib/core.module.ts | 5 ++++ .../core/src/lib/services/routes.service.ts | 24 +++-------------- .../core/src/lib/tokens/compare-func.token.ts | 27 +++++++++++++++++++ 3 files changed, 35 insertions(+), 21 deletions(-) create mode 100644 npm/ng-packs/packages/core/src/lib/tokens/compare-func.token.ts diff --git a/npm/ng-packs/packages/core/src/lib/core.module.ts b/npm/ng-packs/packages/core/src/lib/core.module.ts index c2d497ae7b..c4f7c78fa7 100644 --- a/npm/ng-packs/packages/core/src/lib/core.module.ts +++ b/npm/ng-packs/packages/core/src/lib/core.module.ts @@ -38,6 +38,7 @@ import { SafeHtmlPipe } from './pipes/safe-html.pipe'; import { QUEUE_MANAGER } from './tokens/queue.token'; import { DefaultQueueManager } from './utils/queue'; import { IncludeLocalizationResourcesProvider } from './providers/include-localization-resources.provider'; +import { SORT_COMPARE_FUNC, compareFuncFactory } from './tokens/compare-func.token'; /** * BaseCoreModule is the module that holds @@ -176,6 +177,10 @@ export class CoreModule { useValue: localizationContributor(options.localizations), deps: [LocalizationService], }, + { + provide: SORT_COMPARE_FUNC, + useFactory: compareFuncFactory + }, { provide: QUEUE_MANAGER, useClass: DefaultQueueManager, diff --git a/npm/ng-packs/packages/core/src/lib/services/routes.service.ts b/npm/ng-packs/packages/core/src/lib/services/routes.service.ts index 5f05eaa8ab..c3a1ffe07f 100644 --- a/npm/ng-packs/packages/core/src/lib/services/routes.service.ts +++ b/npm/ng-packs/packages/core/src/lib/services/routes.service.ts @@ -12,7 +12,7 @@ import { } from '../utils/tree-utils'; import { ConfigStateService } from './config-state.service'; import { PermissionService } from './permission.service'; -import { LocalizationService } from './localization.service'; +import { SORT_COMPARE_FUNC } from '../tokens/compare-func.token'; // eslint-disable-next-line @typescript-eslint/ban-types export abstract class AbstractTreeService { @@ -159,7 +159,7 @@ export abstract class AbstractNavTreeService { private subscription: Subscription; private permissionService: PermissionService; - private localizationService: LocalizationService + private compareFunc; readonly id = 'name'; readonly parentId = 'parentName'; readonly hide = (item: T) => item.invisible || !this.isGranted(item); @@ -167,24 +167,6 @@ export abstract class AbstractNavTreeService return this.compareFunc(a,b) }; - readonly compareFunc = (a: T, b: T) => { - const aName = this.localizationService.instant(a.name); - const bName = this.localizationService.instant(b.name); - const aNumber = a.order; - const bNumber = b.order; - - if (!Number.isInteger(aNumber)) return 1; - if (!Number.isInteger(bNumber)) return -1; - - if (aNumber > bNumber) return 1 - if (aNumber < bNumber) return -1 - - if ( aName > bName ) return 1; - if ( aName < bName ) return -1; - - return 0 - } - constructor(protected injector: Injector) { super(); const configState = this.injector.get(ConfigStateService); @@ -192,8 +174,8 @@ export abstract class AbstractNavTreeService .createOnUpdateStream(state => state) .subscribe(() => this.refresh()); this.permissionService = injector.get(PermissionService); - this.localizationService = injector.get(LocalizationService); this.othersGroup = injector.get(OTHERS_GROUP); + this.compareFunc = injector.get(SORT_COMPARE_FUNC); } protected isGranted({ requiredPolicy }: T): boolean { diff --git a/npm/ng-packs/packages/core/src/lib/tokens/compare-func.token.ts b/npm/ng-packs/packages/core/src/lib/tokens/compare-func.token.ts new file mode 100644 index 0000000000..bf66ec2b54 --- /dev/null +++ b/npm/ng-packs/packages/core/src/lib/tokens/compare-func.token.ts @@ -0,0 +1,27 @@ +import { InjectionToken, inject } from '@angular/core'; +import { LocalizationService } from '../services'; + +export const SORT_COMPARE_FUNC = new InjectionToken< 0 | 1 | -1 >('SORT_COMPARE_FUNC'); + +export function compareFuncFactory() { + const localizationService = inject(LocalizationService) + const fn = (a,b) => { + const aName = localizationService.instant(a.name); + const bName = localizationService.instant(b.name); + const aNumber = a.order; + const bNumber = b.order; + + if (!Number.isInteger(aNumber)) return 1; + if (!Number.isInteger(bNumber)) return -1; + + if (aNumber > bNumber) return 1 + if (aNumber < bNumber) return -1 + + if ( aName > bName ) return 1; + if ( aName < bName ) return -1; + + return 0 + } + + return fn +} \ No newline at end of file From d9170bb3a1455d9278623026fd476721f0ed93a0 Mon Sep 17 00:00:00 2001 From: Sinan997 Date: Thu, 3 Aug 2023 09:53:55 +0300 Subject: [PATCH 14/58] update --- docs/en/UI/Angular/CapsLock.directive.md | 6 +++--- .../packages/core/src/lib/tests/capsLock.directive.spec.ts | 1 - .../core/src/lib/tests/show-password-directive.spec.ts | 6 +----- 3 files changed, 4 insertions(+), 9 deletions(-) diff --git a/docs/en/UI/Angular/CapsLock.directive.md b/docs/en/UI/Angular/CapsLock.directive.md index 1e1021bdd4..64a3fc42ca 100644 --- a/docs/en/UI/Angular/CapsLock.directive.md +++ b/docs/en/UI/Angular/CapsLock.directive.md @@ -39,7 +39,7 @@ See an example usage:
- icon + icon
` }) @@ -59,10 +59,10 @@ import { TrackCapsLockDirective } from '@abp/ng.core'
- icon + icon
`, - imports: [ TrackCapsLockDirective ] + imports: [TrackCapsLockDirective] }) export class StandaloneComponent{ capsLock = false; diff --git a/npm/ng-packs/packages/core/src/lib/tests/capsLock.directive.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/capsLock.directive.spec.ts index 17d50ba697..3182dfa2dd 100644 --- a/npm/ng-packs/packages/core/src/lib/tests/capsLock.directive.spec.ts +++ b/npm/ng-packs/packages/core/src/lib/tests/capsLock.directive.spec.ts @@ -28,7 +28,6 @@ describe('TrackCapsLockDirective',()=>{ des = fixture.debugElement.queryAll(By.directive(TrackCapsLockDirective)); }); - // tests test.each(['keydown','keyup'])('is %p works when press capslock and is emit status', (eventName) => { const event = new KeyboardEvent(eventName, { key: 'CapsLock', diff --git a/npm/ng-packs/packages/core/src/lib/tests/show-password-directive.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/show-password-directive.spec.ts index e1e9750995..8babb472c4 100644 --- a/npm/ng-packs/packages/core/src/lib/tests/show-password-directive.spec.ts +++ b/npm/ng-packs/packages/core/src/lib/tests/show-password-directive.spec.ts @@ -27,19 +27,15 @@ describe('ShowPasswordDirective',()=>{ imports: [ TestComponent ] }).createComponent(TestComponent) - fixture.detectChanges(); // initial binding + fixture.detectChanges(); - // all elements with an attached HighlightDirective des = fixture.debugElement.queryAll(By.directive(ShowPasswordDirective)); - // all inputs includes nondirective desAll = fixture.debugElement.queryAll(By.all()); - // the input without the ShowPasswordDirective bareInput = fixture.debugElement.query(By.css('input:not([abpShowPassword])')); }) - // tests it('should have three input has ShowPasswordDirective elements', () => { expect(des.length).toBe(3); }); From 8d02cf83ef0873da98919ee6b2de95e274cc2d8e Mon Sep 17 00:00:00 2001 From: Sinan997 Date: Tue, 1 Aug 2023 08:12:01 +0300 Subject: [PATCH 15/58] decreasing margin for form prop --- .../extensible-form/extensible-form-prop.component.html | 2 +- .../extensible-form/extensible-form-prop.component.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/extensible-form/extensible-form-prop.component.html b/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/extensible-form/extensible-form-prop.component.html index 26dcbf1297..2f16d5d905 100644 --- a/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/extensible-form/extensible-form-prop.component.html +++ b/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/extensible-form/extensible-form-prop.component.html @@ -7,7 +7,7 @@ -
+
[]> = of([]); From f178443b737dbc7b50853b24cf8ffac3c8e0471c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Thu, 3 Aug 2023 10:02:16 +0300 Subject: [PATCH 16/58] Update docs-nav.json --- docs/en/docs-nav.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/en/docs-nav.json b/docs/en/docs-nav.json index c6c07d9a7c..08046fa664 100644 --- a/docs/en/docs-nav.json +++ b/docs/en/docs-nav.json @@ -1522,6 +1522,10 @@ } ] }, + { + "text": "API Documentation", + "path": "{ApiDocumentationUrl}" + }, { "text": "Contribution Guide", "path": "Contribution/Index.md" From 5c066c5b3f6fcbad97149b44d065ae7a9fb1870b Mon Sep 17 00:00:00 2001 From: Sinan997 Date: Fri, 28 Jul 2023 14:59:40 +0300 Subject: [PATCH 17/58] show password directive test and document --- docs/en/UI/Angular/Show-Password-Directive.md | 52 +++++++++++++++ .../Angular/images/showPasswordDirective1.png | Bin 0 -> 3707 bytes .../Angular/images/showPasswordDirective2.png | Bin 0 -> 3932 bytes .../lib/tests/show-password-directive.spec.ts | 59 ++++++++++++++++++ 4 files changed, 111 insertions(+) create mode 100644 docs/en/UI/Angular/Show-Password-Directive.md create mode 100644 docs/en/UI/Angular/images/showPasswordDirective1.png create mode 100644 docs/en/UI/Angular/images/showPasswordDirective2.png create mode 100644 npm/ng-packs/packages/core/src/lib/tests/show-password-directive.spec.ts diff --git a/docs/en/UI/Angular/Show-Password-Directive.md b/docs/en/UI/Angular/Show-Password-Directive.md new file mode 100644 index 0000000000..db54bcdd76 --- /dev/null +++ b/docs/en/UI/Angular/Show-Password-Directive.md @@ -0,0 +1,52 @@ +# Show Password Directive + +In password input, text can be shown easily via changing input type attribute to `text`. To make this even easier, you can use the `ShowPasswordDirective` which has been exposed by the `@abp/ng.core` package. + + +## Getting Started + +In order to use the `ShowPasswordDirective` in an HTML template, the **`CoreModule`** should be imported into your module like this: + +```ts +// ... +import { CoreModule } from '@abp/ng.core'; + +@NgModule({ + //... + imports: [..., CoreModule], +}) +export class MyFeatureModule {} +``` + +## Usage + +The `ShowPasswordDirective` is very easy to use. The directive's selector is **`abpShowPassword`**. By adding the `abpShowPassword` attribute to an input element, you can activate the `ShowPasswordDirective` for the input element. + +See an example usage: + +```ts +@Component({ + selector: 'test-component', + standalone: true, + template: ` +
+ + + icon +
+ ` +}) +export class TestComponent{ + showPassword = false; +} +``` + +The `abpShowPassword` attribute has been added to the `` element. Click icon to activate the `ShowPasswordDirective`. + +See the result: + +![Show Password directive](./images/showPasswordDirective1.png) + +To see password input click icon. + +![Show Password directive](./images/showPasswordDirective2.png) \ No newline at end of file diff --git a/docs/en/UI/Angular/images/showPasswordDirective1.png b/docs/en/UI/Angular/images/showPasswordDirective1.png new file mode 100644 index 0000000000000000000000000000000000000000..7b64be2b5f14c8e8affb7849331f0f5398188193 GIT binary patch literal 3707 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 YNubRLytJp=IDz)l)k46FG%?Tr1J+;SK>z>% literal 0 HcmV?d00001 diff --git a/docs/en/UI/Angular/images/showPasswordDirective2.png b/docs/en/UI/Angular/images/showPasswordDirective2.png new file mode 100644 index 0000000000000000000000000000000000000000..43199ffeaa2b1a813743599a1f74137404254ee0 GIT binary patch literal 3932 zcma)9c{r5c+aIzg+4mt!mWYsb)W|+)rYPB$3`(|;ol(-*X~w=Q5h457cP4u=XzW`m zG)N5D-pBWP|NOr1?{}{2dCqyx@|^qr-1j;6{fW8**So;L%K!p_F2MA)jX@wv7|^~; zM+3ZjGvwDnpo{b{?OXT!vwqE@JPEtm_-*kf;t{K<#)AlHnHH)73MMRNmwXoN`BRSd zjJid*^c_*jD+F7X50*?Z{x&|tx+PTL>je5@AKtn zGBQ$M)L5St=%BwP1k={m7Nv?1JsW0b#{gg2ns@$n@QqAiWrtn&qv&3{$cKry0t|tv ze<#!J674F&hczG_cHecZKa2?Vv9qB&xOIXorJnD}(os#xmi)7IjHA4cLv*~5no^FP zGc5(`N$y9*_p;L%ZM=<+v$MGEKK#!?uP{(j$Lw~l#p;UuavKV95!~ZWmlT6joJlD> z$JNT_Qlrke4 z#)_Yn70TN^TyvmC)^Pk@KXSX~BQOx^mjCC0>|NzR0Yg&e?H6)keas6B6XUK|$es1H z{=daJ<1bd)L#*K^D0g9*9Ue}2H8Tg}=X>`f>W(>BSPp!n+7pqTDe^S%4az0h{@i_j ziRN4|n$pvOa{#rt(nvn9a?;h5HoC9Y7SKXzZDi-UN;|hn!)uFZ^X?TkIHZ$&C8IrcW zR?Nk_`s>2G5Ap2E5#{1fY3=lTy-T}iKO)YIC{qT22E(=Xk5yBI(_=qIcRpx*HN`s@ zgw^PGEj(T4?j^c1$`R}-_v@ceOq1-1OL7~k_u${0l))NZMHKR(zZpeIOP@(@uBY|X zVc}@Lr!z=&3Q||8wTHISPtKmdJDvx2obSb*0W-eG;jy`%L-+0Kq6c0+J&_U;Pf-?E z-(rnkGR8CeA;*ZSCPf1!o(P^m>f98-;8yM|Y?$F8*jiuj)dZ-Hg`w&+`PajNI$e3e zY9DaP)rAHQrQX{JhfY^69$ZTGDpcvq7MeC-O&3x;R=D7Qi4C7Kenc8^w}6)B|J=?@ zUlY_Cd;LI#8=7e;rV>@9WZZNU^uYS3hcs}OUQ2hTg1EbWJmDke*nTR%NFKdDp{q%L zy;v=5!|+K`t5T$yQzY*!I2_0<|-C>kG;c(dcVp z(TqlO0p`9T7PYBDKjUd*PHU5Y?Ld_j)EcHin{~53wNYwU|Ll0j`m;J6XF=T4jYhZT z`rf}Sj_(I&1_T9N03Y9*Rpv=bO!QpUM8vnOxxj-@ets(zuTeSQwVd(T#pR$s|NWwf zT()~b?PP|*He(YHibn`imrdOG;giQhV3BhLQk*Zq=qe;m_y9knGb%Xxn^Fb;b;VdQ(E z3FPY^w5EYng2pI+XyEiv))ZOkupf7q0|Itl&1O7C^3~$QQ{R==?|1l69og4LZADE3 zz9nyGmL+YDME9qDnm49R(@*!~qQ@&$I}M4sB-B4vGw#?^lp+QX>h?AhHNuuHO{?=+ z3uV3J#z*IEm-zpQHw{$MMz#cw$luDQ&rm77-Crn}Qj$FzCmU?843yBt<_uDSDC?EW zNeu9qEXIb;&t}31c14H%>|vWQFV9HZp>?`F-jn{DGy# zlfE&7#9Ytk2z$TGyy}rPzfM32J1^~Z`(%xsrn3|#s06AH)+s^a1BlX@SjH0vLQpW5 zc`V1_ubsZuQzp!Ee#4%`oDF^ymhH)=9JhX~5ctUZV~}N$YK7%-YM#JZ)XDoMvZpxL z9@`W;SdhlMM+hA*LZK^hj`9%Il;u;uj0MF$Bint6VXBL$&|UKNnzVYEWl7Rus@WcU zDe~~kr}TO-g(1l7Y5Av~X9-|KMuG>tb9*HM2S>e0o9U4>i?t11!tdM?*hyty_-UxB zV9gHA)G-)|a+qV7xX~KcoDDK}o!RVkKXEacCs`SP=W6dpVlGbD$xe;P|AuAT-um6m z>%z46?h+vE^Ka8tR2psQf_JDH#PABYI=aQI*JAr68^%?}V6IP?XxU#vn|gP}d�Y zx-=@ZKc@!UqB`SJS~_LXdsHc4kZavv)ya!NHN1YKx6!>ZL-8~2tgiLj$XwO;4d2+Ksk1Ka;xH8ZN3$6e-$NX3jNU>tlZ zQ4zb%Z~F#Oi;t_uFmlS1clM@ox8~DtyNp??q?Cu(Xb)zGy7Z^s^et7LP>40(j182Xjlu#7K|v}%u{U_&hCCOuTzgM(&s4_1Dys#{!414iZG}UF zRtzUsc~Bwr2Tv%xid7ipPLnh_+eL~+d5`xk2Sth5AnE!(hE}yJ!+aT;ZLP6uYij*D zbzLN3D@5sfNarK*@l%u8<)YY0E=vA9q@SeD0C;6`e`|bY+04es{Pt$PDj?TpQoAHP zXy$qVjjqNEx*xE=Xm>@vuh~?0_nhxW{%~$XG=^&x^VRqkiIvN7R?wrg zTzvfy_EjOQFRI&LO2WND!LRfj1XeKBj@k!(CvOurCEpU9JLJE_hfD=qAyAzsIyc0^ z4@3L|TWVLk)(@+Ot-L6{*95L@FA*&?Nbmf`fV;x0N84Rro^t8dk#JgaWlUxwaV%;fdRt0cIzjw`v++JMTNJ4&gZ?)2xP51m8SQ0zHm4)Tx?@- z0(r*{RmS0|)%iX4&dH^HY$4bhpC!NdSN23hRBMzJQjZRIB#sHu%eQD-=1|qZ2G!>e zuLZ}vf)=KGlM*lus(N3Guv5)=>zrJfd8@U2sSm% zKB@rOC=pkc*ftja%s}aUVOoc!?#~nfvXb~~vgW41dv7xPnU~3UX|Yn*hh`ddurcuu z?0ACavM=9b^v=n|URTK8?g9;p4*OufzOD7}+a+uZvA*ryo#!$cL-8U#v6~u_93+pM)@PVZhFKZ?&J1|(k3;aqTJif) zzhlq?Y(8)P8uAn(3JuK_L>c zjJq2d-D*_}tcU$l1>Wa%dN{rM+>Wqk(j~bD8R|G1jnw z`MCDZ@=)!+hCZ(R+0XZYB}6O%R#6?^v1)HWf0l`?81T6Y=mI@<6$%@5_J|p#eM>ps zI0gei1J*AznP~g#y!88)hlExH-%K4&(IGm@;fLbnm$?apyjeuv#aT08qHrpvk3CLO z?bVO3Dlf9ZH8@4`fkg-d?DP0r + + + `, + imports:[ShowPasswordDirective] +}) +class TestComponent { + showPassword:boolean = false +} + +describe('ShowPasswordDirective',()=>{ + let fixture: ComponentFixture;; + let des : DebugElement[]; + let desAll : DebugElement[]; + let bareInput; + + beforeEach(()=>{ + fixture = TestBed.configureTestingModule({ + imports: [ TestComponent ] + }).createComponent(TestComponent) + + fixture.detectChanges(); // initial binding + + // all elements with an attached HighlightDirective + des = fixture.debugElement.queryAll(By.directive(ShowPasswordDirective)); + + // all inputs includes nondirective + desAll = fixture.debugElement.queryAll(By.all()); + + // the input without the ShowPasswordDirective + bareInput = fixture.debugElement.query(By.css('input:not([abpShowPassword])')); + }) + + // color tests + it('should have three input has ShowPasswordDirective elements', () => { + expect(des.length).toBe(3); + }); + + test.each([[0,'text'],[1,'password'],[2,'text'],[3,'password']])('%p. input type must be %p)', (index,inpType) => { + const inputType = desAll[index].nativeElement.type; + expect(inputType).toBe(inpType); + }); + + it('should have three input has ShowPasswordDirective elements', () => { + let input = des[2].nativeElement + expect(input.type).toBe('password') + fixture.componentInstance.showPassword = true + fixture.detectChanges() + expect(input.type).toBe('text') + }); + }); \ No newline at end of file From b61cd17d3167653b0f0a84b9717769bcafffa1f6 Mon Sep 17 00:00:00 2001 From: Sinan997 Date: Sun, 30 Jul 2023 23:48:51 +0300 Subject: [PATCH 18/58] capsLock doc and test --- .../src/lib/tests/capsLock.directive.spec.ts | 58 +++++++++++++++++++ .../lib/tests/show-password-directive.spec.ts | 2 +- 2 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 npm/ng-packs/packages/core/src/lib/tests/capsLock.directive.spec.ts diff --git a/npm/ng-packs/packages/core/src/lib/tests/capsLock.directive.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/capsLock.directive.spec.ts new file mode 100644 index 0000000000..17d50ba697 --- /dev/null +++ b/npm/ng-packs/packages/core/src/lib/tests/capsLock.directive.spec.ts @@ -0,0 +1,58 @@ +import { Component, DebugElement } from '@angular/core' +import { ComponentFixture, TestBed } from '@angular/core/testing' +import { TrackCapsLockDirective } from '../directives'; +import { By } from '@angular/platform-browser'; + +@Component({ + standalone:true, + template: ` + + `, + imports:[TrackCapsLockDirective] +}) +class TestComponent { + capsLock:boolean = false +} + +describe('TrackCapsLockDirective',()=>{ + let fixture: ComponentFixture;; + let des : DebugElement[]; + + beforeEach(()=>{ + fixture = TestBed.configureTestingModule({ + imports: [ TestComponent ] + }).createComponent(TestComponent); + + fixture.detectChanges(); + + des = fixture.debugElement.queryAll(By.directive(TrackCapsLockDirective)); + }); + + // tests + test.each(['keydown','keyup'])('is %p works when press capslock and is emit status', (eventName) => { + const event = new KeyboardEvent(eventName, { + key: 'CapsLock', + modifierCapsLock: true + }); + window.dispatchEvent(event); + fixture.detectChanges(); + expect(fixture.componentInstance.capsLock).toBe(true) + }); + + test.each(['keydown','keyup'])('is %p detect the change capslock is emit status', (eventName) => { + const trueEvent = new KeyboardEvent(eventName, { + key: 'CapsLock', + modifierCapsLock: true + }); + window.dispatchEvent(trueEvent); + fixture.detectChanges(); + expect(fixture.componentInstance.capsLock).toBe(true) + const falseEvent = new KeyboardEvent(eventName, { + key: 'CapsLock', + modifierCapsLock: false + }); + window.dispatchEvent(falseEvent); + fixture.detectChanges(); + expect(fixture.componentInstance.capsLock).toBe(false) + }); + }); \ No newline at end of file diff --git a/npm/ng-packs/packages/core/src/lib/tests/show-password-directive.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/show-password-directive.spec.ts index 6b07997bc9..e1e9750995 100644 --- a/npm/ng-packs/packages/core/src/lib/tests/show-password-directive.spec.ts +++ b/npm/ng-packs/packages/core/src/lib/tests/show-password-directive.spec.ts @@ -39,7 +39,7 @@ describe('ShowPasswordDirective',()=>{ bareInput = fixture.debugElement.query(By.css('input:not([abpShowPassword])')); }) - // color tests + // tests it('should have three input has ShowPasswordDirective elements', () => { expect(des.length).toBe(3); }); From 9f10aeb148b89aa86245f9f6b59464661877a2ab Mon Sep 17 00:00:00 2001 From: Sinan997 Date: Sun, 30 Jul 2023 23:49:52 +0300 Subject: [PATCH 19/58] capsLock doc and test --- docs/en/UI/Angular/CapsLock.directive.md | 52 ++++++++++++++++++ .../UI/Angular/images/CapsLockDirective1.png | Bin 0 -> 2224 bytes .../UI/Angular/images/CapsLockDirective2.png | Bin 0 -> 4274 bytes 3 files changed, 52 insertions(+) create mode 100644 docs/en/UI/Angular/CapsLock.directive.md create mode 100644 docs/en/UI/Angular/images/CapsLockDirective1.png create mode 100644 docs/en/UI/Angular/images/CapsLockDirective2.png diff --git a/docs/en/UI/Angular/CapsLock.directive.md b/docs/en/UI/Angular/CapsLock.directive.md new file mode 100644 index 0000000000..4b92d61124 --- /dev/null +++ b/docs/en/UI/Angular/CapsLock.directive.md @@ -0,0 +1,52 @@ +# Show Password Directive + +In password inputs,You may want to show if Caps Lock is on. To make this even easier, you can use the `TrackCapsLockDirective` which has been exposed by the `@abp/ng.core` package. + + +## Getting Started + +In order to use the `TrackCapsLockDirective` in an HTML template, the **`CoreModule`** should be imported into your module like this: + +```ts +// ... +import { CoreModule } from '@abp/ng.core'; + +@NgModule({ + //... + imports: [..., CoreModule], +}) +export class MyFeatureModule {} +``` + +## Usage + +The `TrackCapsLockDirective` is very easy to use. The directive's selector is **`abpCapsLock`**. By adding the `abpCapsLock` event to an element, you can track the status of Caps Lock. U can use this to warn user + +See an example usage: + +```ts +@Component({ + selector: 'test-component', + standalone: true, + template: ` +
+ + + icon +
+ ` +}) +export class TestComponent{ + capsLock = false; +} +``` + +The `abpCapsLock` event has been added to the `` element. Press Caps Lock to activate the `TrackCapsLockDirective`. + +See the result: + +![Show Password directive](./images/CapsLockDirective1.png) + +To see Caps Lock icon press Caps Lock. + +![Show Password directive](./images/CapsLockDirective2.png) \ No newline at end of file diff --git a/docs/en/UI/Angular/images/CapsLockDirective1.png b/docs/en/UI/Angular/images/CapsLockDirective1.png new file mode 100644 index 0000000000000000000000000000000000000000..2f143d755fd2d331beed42c8ce9c361cb8aeaa0b GIT binary patch literal 2224 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 U>BitD2Pwepw$-gl!+XE~7Z`*$lmGw# literal 0 HcmV?d00001 From 4fd8dbc49a32c2ab665e9a28429c5ef530f81049 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sinan=20=C3=96zt=C3=BCrk?= <72804437+Sinan997@users.noreply.github.com> Date: Mon, 31 Jul 2023 10:48:56 +0300 Subject: [PATCH 20/58] Update CapsLock.directive.md --- docs/en/UI/Angular/CapsLock.directive.md | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/docs/en/UI/Angular/CapsLock.directive.md b/docs/en/UI/Angular/CapsLock.directive.md index 4b92d61124..a21057490c 100644 --- a/docs/en/UI/Angular/CapsLock.directive.md +++ b/docs/en/UI/Angular/CapsLock.directive.md @@ -5,15 +5,17 @@ In password inputs,You may want to show if Caps Lock is on. To make this even ea ## Getting Started -In order to use the `TrackCapsLockDirective` in an HTML template, the **`CoreModule`** should be imported into your module like this: +`TrackCapsLockDirective` is standalone. In order to use the `TrackCapsLockDirective` in an HTML template, import it to related module or your standalone component: ```ts -// ... -import { CoreModule } from '@abp/ng.core'; +import { TrackCapsLockDirective } from '@abp/ng.core'; @NgModule({ //... - imports: [..., CoreModule], + imports: [ + ..., + TrackCapsLockDirective + ], }) export class MyFeatureModule {} ``` @@ -25,6 +27,8 @@ The `TrackCapsLockDirective` is very easy to use. The directive's selector is ** See an example usage: ```ts +import { TrackCapsLockDirective } from '@abp/ng.core' + @Component({ selector: 'test-component', standalone: true, @@ -34,7 +38,8 @@ See an example usage: icon
- ` + `, + imports: [ TrackCapsLockDirective ] }) export class TestComponent{ capsLock = false; @@ -49,4 +54,4 @@ See the result: To see Caps Lock icon press Caps Lock. -![Show Password directive](./images/CapsLockDirective2.png) \ No newline at end of file +![Show Password directive](./images/CapsLockDirective2.png) From cd5867a3f8bd78fdd3b401384554a4934f04a445 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sinan=20=C3=96zt=C3=BCrk?= <72804437+Sinan997@users.noreply.github.com> Date: Mon, 31 Jul 2023 10:51:53 +0300 Subject: [PATCH 21/58] Update CapsLock.directive.md --- docs/en/UI/Angular/CapsLock.directive.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/en/UI/Angular/CapsLock.directive.md b/docs/en/UI/Angular/CapsLock.directive.md index a21057490c..24bef39cdc 100644 --- a/docs/en/UI/Angular/CapsLock.directive.md +++ b/docs/en/UI/Angular/CapsLock.directive.md @@ -1,6 +1,6 @@ -# Show Password Directive +# Caps Lock Directive -In password inputs,You may want to show if Caps Lock is on. To make this even easier, you can use the `TrackCapsLockDirective` which has been exposed by the `@abp/ng.core` package. +In password inputs, You may want to show if Caps Lock is on. To make this even easier, you can use the `TrackCapsLockDirective` which has been exposed by the `@abp/ng.core` package. ## Getting Started From 00c41f56698e2bdb84b27bc36b2255ea3be0cf50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sinan=20=C3=96zt=C3=BCrk?= <72804437+Sinan997@users.noreply.github.com> Date: Mon, 31 Jul 2023 10:58:53 +0300 Subject: [PATCH 22/58] Update Show-Password-Directive.md --- docs/en/UI/Angular/Show-Password-Directive.md | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/docs/en/UI/Angular/Show-Password-Directive.md b/docs/en/UI/Angular/Show-Password-Directive.md index db54bcdd76..6c3cbe4f45 100644 --- a/docs/en/UI/Angular/Show-Password-Directive.md +++ b/docs/en/UI/Angular/Show-Password-Directive.md @@ -4,16 +4,17 @@ In password input, text can be shown easily via changing input type attribute to ## Getting Started - -In order to use the `ShowPasswordDirective` in an HTML template, the **`CoreModule`** should be imported into your module like this: +`ShowPasswordDirective` is standalone. In order to use the `ShowPasswordDirective` in an HTML template, import it to related module or your standalone component: ```ts -// ... -import { CoreModule } from '@abp/ng.core'; +import { ShowPasswordDirective } from '@abp/ng.core'; @NgModule({ //... - imports: [..., CoreModule], + imports: [ + ..., + ShowPasswordDirective + ], }) export class MyFeatureModule {} ``` @@ -25,6 +26,7 @@ The `ShowPasswordDirective` is very easy to use. The directive's selector is **` See an example usage: ```ts +import { ShowPasswordDirective } from '@abp/ng.core'; @Component({ selector: 'test-component', standalone: true, @@ -34,7 +36,8 @@ See an example usage: icon
- ` + `, + imports: [ShowPasswordDirective] }) export class TestComponent{ showPassword = false; @@ -49,4 +52,4 @@ See the result: To see password input click icon. -![Show Password directive](./images/showPasswordDirective2.png) \ No newline at end of file +![Show Password directive](./images/showPasswordDirective2.png) From 1659274d7cfc7d70be56f5f921167aa6d3f760f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sinan=20=C3=96zt=C3=BCrk?= <72804437+Sinan997@users.noreply.github.com> Date: Mon, 31 Jul 2023 11:21:13 +0300 Subject: [PATCH 23/58] Update CapsLock.directive.md --- docs/en/UI/Angular/CapsLock.directive.md | 29 +++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/docs/en/UI/Angular/CapsLock.directive.md b/docs/en/UI/Angular/CapsLock.directive.md index 24bef39cdc..1e1021bdd4 100644 --- a/docs/en/UI/Angular/CapsLock.directive.md +++ b/docs/en/UI/Angular/CapsLock.directive.md @@ -7,11 +7,16 @@ In password inputs, You may want to show if Caps Lock is on. To make this even e `TrackCapsLockDirective` is standalone. In order to use the `TrackCapsLockDirective` in an HTML template, import it to related module or your standalone component: +**Importing to NgModule** ```ts import { TrackCapsLockDirective } from '@abp/ng.core'; @NgModule({ //... + declarations: [ + ..., + TestComponent + ], imports: [ ..., TrackCapsLockDirective @@ -22,15 +27,33 @@ export class MyFeatureModule {} ## Usage -The `TrackCapsLockDirective` is very easy to use. The directive's selector is **`abpCapsLock`**. By adding the `abpCapsLock` event to an element, you can track the status of Caps Lock. U can use this to warn user +The `TrackCapsLockDirective` is very easy to use. The directive's selector is **`abpCapsLock`**. By adding the `abpCapsLock` event to an element, you can track the status of Caps Lock. You can use this to warn user. See an example usage: +**NgModule Component usage** +```ts +@Component({ + selector: 'test-component', + template: ` +
+ + + icon +
+ ` +}) +export class TestComponent{ + capsLock = false; +} +``` + +**Standalone Component usage** ```ts import { TrackCapsLockDirective } from '@abp/ng.core' @Component({ - selector: 'test-component', + selector: 'standalone-component', standalone: true, template: `
@@ -41,7 +64,7 @@ import { TrackCapsLockDirective } from '@abp/ng.core' `, imports: [ TrackCapsLockDirective ] }) -export class TestComponent{ +export class StandaloneComponent{ capsLock = false; } ``` From 2372ce0f29cefaada74ec2b1a8eda306f39ecf87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sinan=20=C3=96zt=C3=BCrk?= <72804437+Sinan997@users.noreply.github.com> Date: Mon, 31 Jul 2023 12:22:36 +0300 Subject: [PATCH 24/58] Update Show-Password-Directive.md --- docs/en/UI/Angular/Show-Password-Directive.md | 26 +++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/docs/en/UI/Angular/Show-Password-Directive.md b/docs/en/UI/Angular/Show-Password-Directive.md index 6c3cbe4f45..c19c8073bd 100644 --- a/docs/en/UI/Angular/Show-Password-Directive.md +++ b/docs/en/UI/Angular/Show-Password-Directive.md @@ -6,11 +6,16 @@ In password input, text can be shown easily via changing input type attribute to ## Getting Started `ShowPasswordDirective` is standalone. In order to use the `ShowPasswordDirective` in an HTML template, import it to related module or your standalone component: +**Importing to NgModule** ```ts import { ShowPasswordDirective } from '@abp/ng.core'; @NgModule({ //... + declarations: [ + ..., + TestComponent + ], imports: [ ..., ShowPasswordDirective @@ -25,10 +30,27 @@ The `ShowPasswordDirective` is very easy to use. The directive's selector is **` See an example usage: +**NgModule Component usage** ```ts -import { ShowPasswordDirective } from '@abp/ng.core'; @Component({ selector: 'test-component', + template: ` +
+ + + icon +
+ ` +}) +export class TestComponent{ + showPassword = false; +} +``` +**Standalone Component usage** +```ts +import { ShowPasswordDirective } from '@abp/ng.core'; +@Component({ + selector: 'standalone-component', standalone: true, template: `
@@ -39,7 +61,7 @@ import { ShowPasswordDirective } from '@abp/ng.core'; `, imports: [ShowPasswordDirective] }) -export class TestComponent{ +export class StandaloneComponent{ showPassword = false; } ``` From 65512dd433bc9b0e4e237f8a2736e9677e98f168 Mon Sep 17 00:00:00 2001 From: Sinan997 Date: Thu, 3 Aug 2023 09:53:55 +0300 Subject: [PATCH 25/58] update --- docs/en/UI/Angular/CapsLock.directive.md | 6 +++--- .../packages/core/src/lib/tests/capsLock.directive.spec.ts | 1 - .../core/src/lib/tests/show-password-directive.spec.ts | 6 +----- 3 files changed, 4 insertions(+), 9 deletions(-) diff --git a/docs/en/UI/Angular/CapsLock.directive.md b/docs/en/UI/Angular/CapsLock.directive.md index 1e1021bdd4..64a3fc42ca 100644 --- a/docs/en/UI/Angular/CapsLock.directive.md +++ b/docs/en/UI/Angular/CapsLock.directive.md @@ -39,7 +39,7 @@ See an example usage:
- icon + icon
` }) @@ -59,10 +59,10 @@ import { TrackCapsLockDirective } from '@abp/ng.core'
- icon + icon
`, - imports: [ TrackCapsLockDirective ] + imports: [TrackCapsLockDirective] }) export class StandaloneComponent{ capsLock = false; diff --git a/npm/ng-packs/packages/core/src/lib/tests/capsLock.directive.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/capsLock.directive.spec.ts index 17d50ba697..3182dfa2dd 100644 --- a/npm/ng-packs/packages/core/src/lib/tests/capsLock.directive.spec.ts +++ b/npm/ng-packs/packages/core/src/lib/tests/capsLock.directive.spec.ts @@ -28,7 +28,6 @@ describe('TrackCapsLockDirective',()=>{ des = fixture.debugElement.queryAll(By.directive(TrackCapsLockDirective)); }); - // tests test.each(['keydown','keyup'])('is %p works when press capslock and is emit status', (eventName) => { const event = new KeyboardEvent(eventName, { key: 'CapsLock', diff --git a/npm/ng-packs/packages/core/src/lib/tests/show-password-directive.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/show-password-directive.spec.ts index e1e9750995..8babb472c4 100644 --- a/npm/ng-packs/packages/core/src/lib/tests/show-password-directive.spec.ts +++ b/npm/ng-packs/packages/core/src/lib/tests/show-password-directive.spec.ts @@ -27,19 +27,15 @@ describe('ShowPasswordDirective',()=>{ imports: [ TestComponent ] }).createComponent(TestComponent) - fixture.detectChanges(); // initial binding + fixture.detectChanges(); - // all elements with an attached HighlightDirective des = fixture.debugElement.queryAll(By.directive(ShowPasswordDirective)); - // all inputs includes nondirective desAll = fixture.debugElement.queryAll(By.all()); - // the input without the ShowPasswordDirective bareInput = fixture.debugElement.query(By.css('input:not([abpShowPassword])')); }) - // tests it('should have three input has ShowPasswordDirective elements', () => { expect(des.length).toBe(3); }); From 3dd099e2a96cffb20b66445a26ceabad93c55cea Mon Sep 17 00:00:00 2001 From: Salih Date: Fri, 4 Aug 2023 13:34:44 +0300 Subject: [PATCH 26/58] Update en.json --- .../Commercial/Localization/Resources/en.json | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json index abd93b4547..0be3cb5dd7 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json @@ -600,7 +600,7 @@ "TotalDeveloperPrice": "Total Developer Price", "Purchase_PricePerDeveloper": "{0} {1} per developer", "Purchase_IncludedDeveloperInfo": "{0} {1} included.", - "Purchase_LicenseExtraDeveloperPurchaseMessage": "The {0} license contains {1} developer(s). You can add additional developers now or later.", + "Purchase_LicenseExtraDeveloperPurchaseMessage": "The {0} License includes {1} developers. You can add additional developers.", "StartupTemplates_Page_Title": "ABP Startup Templates", "StartupTemplates_Page_Description": "ABP Commercial allows you to build solutions with any level of complexity. It provides two main pre-built startup solutions. You can select the one close to your requirements and build your own custom solution on top of it.", "MicroserviceStartupSolutionForDotnet": "Microservice Startup Solution for .NET", @@ -963,6 +963,22 @@ "OneCodeBaseMultipleDevices": "One Code-Base Multiple Devices", "OneCodeBaseMultipleDevices_Description": "ABP Mobile applications are cross-platform. They are ready to be installed and run on iOS and Android devices, and they adapt to different form-factors using a single code base. Developers only need to create the UI and front-end code once, there is no need to adapt the code for each device you want to support.", "ComesWithTheSourceCode": "Comes with the Source-Code", - "ComesWithTheSourceCode_Description": "The mobile apps are provided with the source-code. Easily customize the UX/UI of your apps to meet branding guidelines." + "ComesWithTheSourceCode_Description": "The mobile apps are provided with the source-code. Easily customize the UX/UI of your apps to meet branding guidelines.", + "Purchase_OneYearPrice": "1 Year Price", + "Purchase_DeveloperSeatCount": "Developer Seat Count", + "Purchase_DevelopersAlreadyIncluded": "{0} developers already included", + "1Year": "1 year", + "{0}Years": "{0} years", + "1YearLicense": "1 year license", + "{0}YearsLicense": "{0} years license", + "1AdditionalDeveloper": "1 additional developer", + "{0}AdditionalDevelopers": "{0} additional developers", + "Discount": "Discount ({0}%)", + "Summary": "Summary", + "TrainingPack": "Training pack", + "TrainingPackDiscount": "Training pack discount", + "Purchase_OnboardingTraining_Description": "This live training package is discounted when purchase with the new license. This discounted price is valid only for new license purchases. Learn more ", + "Purchase_Save": "{0}% Save {1} {2}", + "RemoveBasket": "Remove from basket" } } From 24e21ed836c28a4b2479868d85a9aae41d53895a Mon Sep 17 00:00:00 2001 From: masoodkhoshgard Date: Fri, 4 Aug 2023 17:23:47 +0330 Subject: [PATCH 27/58] use curly braces --- .../TagHelpers/Form/AbpInputTagHelperService.cs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpInputTagHelperService.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpInputTagHelperService.cs index 9923e57de0..9699baadd3 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpInputTagHelperService.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpInputTagHelperService.cs @@ -229,9 +229,7 @@ public class AbpInputTagHelperService : AbpTagHelperService if (attribute != null || TagHelper.FloatingLabel) { - var placeholderLocalized = _tagHelperLocalizer.GetLocalizedText(attribute?.Value ?? string.Empty, TagHelper.AspFor.ModelExplorer); - if (string.IsNullOrWhiteSpace(placeholderLocalized)) - placeholderLocalized = TagHelper.AspFor.Name; + var placeholderLocalized = _tagHelperLocalizer.GetLocalizedText(attribute?.Value ?? TagHelper.AspFor.Name, TagHelper.AspFor.ModelExplorer); inputTagHelperOutput.Attributes.Add("placeholder", placeholderLocalized); } } From 5a34f8194bca69ccf3d1a69619f88c892c3632ab Mon Sep 17 00:00:00 2001 From: Enis Necipoglu Date: Sat, 5 Aug 2023 01:09:00 +0300 Subject: [PATCH 28/58] Add feature check for CmsKit Page Middleware --- .../Volo.CmsKit.Public.Web/DefaultHomePageMiddleware.cs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/DefaultHomePageMiddleware.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/DefaultHomePageMiddleware.cs index b5ad981cc0..5763f26053 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/DefaultHomePageMiddleware.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/DefaultHomePageMiddleware.cs @@ -3,6 +3,8 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.DependencyInjection; using Volo.Abp.DependencyInjection; +using Volo.Abp.Features; +using Volo.CmsKit.Features; using Volo.CmsKit.Pages; using Volo.CmsKit.Public.Pages; @@ -12,6 +14,13 @@ public class DefaultHomePageMiddleware : IMiddleware, ITransientDependency { public async Task InvokeAsync(HttpContext context, RequestDelegate next) { + var featureChecker = context.RequestServices.GetRequiredService(); + + if (!await featureChecker.IsEnabledAsync(CmsKitFeatures.PageEnable)) + { + return; + } + if (context.Request.Path.Value == "/") { var pagePublicAppService = context.RequestServices.GetRequiredService(); From d7d9158ddd5ba9354e2c5c6b86f19d093b1b74b3 Mon Sep 17 00:00:00 2001 From: Enis Necipoglu Date: Sat, 5 Aug 2023 01:35:33 +0300 Subject: [PATCH 29/58] Update DefaultHomePageMiddleware.cs --- .../DefaultHomePageMiddleware.cs | 23 ++++++++----------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/DefaultHomePageMiddleware.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/DefaultHomePageMiddleware.cs index 5763f26053..f80cba3970 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/DefaultHomePageMiddleware.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/DefaultHomePageMiddleware.cs @@ -16,23 +16,20 @@ public class DefaultHomePageMiddleware : IMiddleware, ITransientDependency { var featureChecker = context.RequestServices.GetRequiredService(); - if (!await featureChecker.IsEnabledAsync(CmsKitFeatures.PageEnable)) + if (await featureChecker.IsEnabledAsync(CmsKitFeatures.PageEnable)) { - return; - } - - if (context.Request.Path.Value == "/") - { - var pagePublicAppService = context.RequestServices.GetRequiredService(); - - var page = await pagePublicAppService.FindDefaultHomePageAsync(); - if (page != null) + if (context.Request.Path.Value == "/") { - context.Request.Path = $"{PageConsts.UrlPrefix}{page.Slug}"; + var pagePublicAppService = context.RequestServices.GetRequiredService(); + + var page = await pagePublicAppService.FindDefaultHomePageAsync(); + if (page != null) + { + context.Request.Path = $"{PageConsts.UrlPrefix}{page.Slug}"; + } } - } - + await next(context); } } \ No newline at end of file From f617a52ed73f8d230f907f2d0269e8f2a0c703ef Mon Sep 17 00:00:00 2001 From: Enis Necipoglu Date: Sat, 5 Aug 2023 13:45:35 +0300 Subject: [PATCH 30/58] Prevent calling `UpdateMany` when tehre is no changes --- .../Volo/CmsKit/Menus/PageChangedHandler.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Menus/PageChangedHandler.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Menus/PageChangedHandler.cs index 0c8d53d071..68d51841dd 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Menus/PageChangedHandler.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Menus/PageChangedHandler.cs @@ -1,3 +1,4 @@ +using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Volo.Abp.DependencyInjection; @@ -31,6 +32,11 @@ public class PageChangedHandler : .Where(x => x.PageId == eventData.Entity.Id) .ToArray(); + if (affectedMenuItems.IsNullOrEmpty()) + { + return; + } + foreach (var menuItem in affectedMenuItems) { MenuManager.SetPageUrl(menuItem, eventData.Entity); From 1654590621e4a886fb6cadcdda2c802220e49d49 Mon Sep 17 00:00:00 2001 From: Enis Necipoglu Date: Sat, 5 Aug 2023 21:03:38 +0300 Subject: [PATCH 31/58] Add hidden Content inputs for BlogPost --- .../Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/Create.cshtml | 2 ++ .../Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/Update.cshtml | 2 ++ 2 files changed, 4 insertions(+) diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/Create.cshtml b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/Create.cshtml index ab7cf99abe..5e182ef2ce 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/Create.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/Create.cshtml @@ -77,6 +77,8 @@ + +
+ +
Date: Mon, 7 Aug 2023 09:21:25 +0800 Subject: [PATCH 32/58] Check `Path.Value` first for better performance. --- .../Volo.CmsKit.Public.Web/DefaultHomePageMiddleware.cs | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/DefaultHomePageMiddleware.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/DefaultHomePageMiddleware.cs index f80cba3970..752e5f2f42 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/DefaultHomePageMiddleware.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/DefaultHomePageMiddleware.cs @@ -1,5 +1,4 @@ -using System.Net; -using System.Threading.Tasks; +using System.Threading.Tasks; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.DependencyInjection; using Volo.Abp.DependencyInjection; @@ -16,9 +15,9 @@ public class DefaultHomePageMiddleware : IMiddleware, ITransientDependency { var featureChecker = context.RequestServices.GetRequiredService(); - if (await featureChecker.IsEnabledAsync(CmsKitFeatures.PageEnable)) + if (context.Request.Path.Value == "/") { - if (context.Request.Path.Value == "/") + if (await featureChecker.IsEnabledAsync(CmsKitFeatures.PageEnable)) { var pagePublicAppService = context.RequestServices.GetRequiredService(); @@ -32,4 +31,4 @@ public class DefaultHomePageMiddleware : IMiddleware, ITransientDependency await next(context); } -} \ No newline at end of file +} From ac97d57fe16bcfedff4485ae7fb671ddbe9eb15e Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Mon, 7 Aug 2023 11:22:45 +0800 Subject: [PATCH 33/58] Enable nullable annotations for Volo.Abp.Ddd.Domain --- .../Volo/Abp/Auditing/IDeletionAuditedObject.cs | 2 +- .../Volo/Abp/Auditing/IMayHaveCreator.cs | 3 +-- .../Abp/Auditing/IModificationAuditedObject.cs | 2 +- .../LookupExtensionProperty.razor | 2 +- .../Volo.Abp.Ddd.Domain.csproj | 2 ++ .../AbpCommonDbContextRegistrationOptions.cs | 10 +++++----- ...pCommonDbContextRegistrationOptionsBuilder.cs | 2 +- .../MultiTenantDbContextType.cs | 2 +- .../Auditing/AuditedAggregateRootWithUser.cs | 8 ++++---- .../Entities/Auditing/AuditedEntityWithUser.cs | 8 ++++---- .../CreationAuditedAggregateRootWithUser.cs | 4 ++-- .../Auditing/CreationAuditedEntityWithUser.cs | 4 ++-- .../Auditing/FullAuditedAggregateRootWithUser.cs | 12 ++++++------ .../Auditing/FullAuditedEntityWithUser.cs | 12 ++++++------ .../Domain/Entities/Caching/EntityCacheBase.cs | 12 ++++++------ .../EntityCacheServiceCollectionExtensions.cs | 6 +++--- .../Caching/EntityCacheWithObjectMapper.cs | 2 +- .../Caching/EntityCacheWithoutCacheItem.cs | 2 +- .../Abp/Domain/Entities/Caching/IEntityCache.cs | 3 +-- .../Volo/Abp/Domain/Entities/Entity.cs | 8 ++++---- .../Volo/Abp/Domain/Entities/EntityHelper.cs | 16 +++++++--------- .../Events/Distributed/EntitySynchronizer.cs | 7 +++---- .../Events/Distributed/EntityToEtoMapper.cs | 2 +- .../Entities/Events/EntityChangeEventHelper.cs | 2 +- .../Domain/Entities/Events/EntityEventData.cs | 2 +- .../Volo/Abp/Domain/Entities/IEntity.cs | 2 +- .../Domain/Repositories/BasicRepositoryBase.cs | 6 +++--- .../Repositories/IReadOnlyBasicRepository.cs | 2 +- .../Volo/Abp/Domain/Repositories/IRepository.cs | 2 +- .../Repositories/RepositoryAsyncExtensions.cs | 12 ++++++------ .../Abp/Domain/Repositories/RepositoryBase.cs | 8 ++++---- .../Domain/Repositories/RepositoryExtensions.cs | 8 ++++---- .../Repositories/RepositoryRegistrarBase.cs | 4 ++-- .../Volo/Abp/Domain/Services/DomainService.cs | 6 +++--- .../Volo/Abp/Linq/AsyncQueryableExecuter.cs | 8 ++++---- .../Volo/Abp/Linq/IAsyncQueryableExecuter.cs | 8 ++++---- .../Volo/Abp/Linq/IAsyncQueryableProvider.cs | 8 ++++---- 37 files changed, 103 insertions(+), 106 deletions(-) diff --git a/framework/src/Volo.Abp.Auditing.Contracts/Volo/Abp/Auditing/IDeletionAuditedObject.cs b/framework/src/Volo.Abp.Auditing.Contracts/Volo/Abp/Auditing/IDeletionAuditedObject.cs index a7be0c29a1..afec5e4e5f 100644 --- a/framework/src/Volo.Abp.Auditing.Contracts/Volo/Abp/Auditing/IDeletionAuditedObject.cs +++ b/framework/src/Volo.Abp.Auditing.Contracts/Volo/Abp/Auditing/IDeletionAuditedObject.cs @@ -22,5 +22,5 @@ public interface IDeletionAuditedObject : IDeletionAuditedObject /// /// Reference to the deleter user. /// - TUser Deleter { get; } + TUser? Deleter { get; } } diff --git a/framework/src/Volo.Abp.Auditing.Contracts/Volo/Abp/Auditing/IMayHaveCreator.cs b/framework/src/Volo.Abp.Auditing.Contracts/Volo/Abp/Auditing/IMayHaveCreator.cs index 25748f5af9..78989e16d2 100644 --- a/framework/src/Volo.Abp.Auditing.Contracts/Volo/Abp/Auditing/IMayHaveCreator.cs +++ b/framework/src/Volo.Abp.Auditing.Contracts/Volo/Abp/Auditing/IMayHaveCreator.cs @@ -8,8 +8,7 @@ public interface IMayHaveCreator /// /// Reference to the creator. /// - [CanBeNull] - TCreator Creator { get; } + TCreator? Creator { get; } } /// diff --git a/framework/src/Volo.Abp.Auditing.Contracts/Volo/Abp/Auditing/IModificationAuditedObject.cs b/framework/src/Volo.Abp.Auditing.Contracts/Volo/Abp/Auditing/IModificationAuditedObject.cs index 48f26b6299..a82e1452e8 100644 --- a/framework/src/Volo.Abp.Auditing.Contracts/Volo/Abp/Auditing/IModificationAuditedObject.cs +++ b/framework/src/Volo.Abp.Auditing.Contracts/Volo/Abp/Auditing/IModificationAuditedObject.cs @@ -22,5 +22,5 @@ public interface IModificationAuditedObject : IModificationAuditedObject /// /// Reference to the last modifier user of this entity. /// - TUser LastModifier { get; } + TUser? LastModifier { get; } } diff --git a/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/LookupExtensionProperty.razor b/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/LookupExtensionProperty.razor index 7c32549d51..ecdae979f2 100644 --- a/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/LookupExtensionProperty.razor +++ b/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/LookupExtensionProperty.razor @@ -9,7 +9,7 @@ netstandard2.0;netstandard2.1;net7.0 + enable + Nullable Volo.Abp.Ddd.Domain Volo.Abp.Ddd.Domain $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/AbpCommonDbContextRegistrationOptions.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/AbpCommonDbContextRegistrationOptions.cs index bc50368645..8342451056 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/AbpCommonDbContextRegistrationOptions.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/AbpCommonDbContextRegistrationOptions.cs @@ -16,13 +16,13 @@ public abstract class AbpCommonDbContextRegistrationOptions : IAbpCommonDbContex public IServiceCollection Services { get; } - public Dictionary ReplacedDbContextTypes { get; } + public Dictionary ReplacedDbContextTypes { get; } public Type DefaultRepositoryDbContextType { get; protected set; } - public Type DefaultRepositoryImplementationType { get; private set; } + public Type? DefaultRepositoryImplementationType { get; private set; } - public Type DefaultRepositoryImplementationTypeWithoutKey { get; private set; } + public Type? DefaultRepositoryImplementationTypeWithoutKey { get; private set; } public bool RegisterDefaultRepositories { get; private set; } @@ -40,7 +40,7 @@ public abstract class AbpCommonDbContextRegistrationOptions : IAbpCommonDbContex Services = services; DefaultRepositoryDbContextType = originalDbContextType; CustomRepositories = new Dictionary(); - ReplacedDbContextTypes = new Dictionary(); + ReplacedDbContextTypes = new Dictionary(); SpecifiedDefaultRepositories = new List(); } @@ -54,7 +54,7 @@ public abstract class AbpCommonDbContextRegistrationOptions : IAbpCommonDbContex return ReplaceDbContext(typeof(TOtherDbContext), typeof(TTargetDbContext), multiTenancySides); } - public IAbpCommonDbContextRegistrationOptionsBuilder ReplaceDbContext(Type otherDbContextType, Type targetDbContextType = null, MultiTenancySides multiTenancySides = MultiTenancySides.Both) + public IAbpCommonDbContextRegistrationOptionsBuilder ReplaceDbContext(Type otherDbContextType, Type? targetDbContextType = null, MultiTenancySides multiTenancySides = MultiTenancySides.Both) { if (!otherDbContextType.IsAssignableFrom(OriginalDbContextType)) { diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/IAbpCommonDbContextRegistrationOptionsBuilder.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/IAbpCommonDbContextRegistrationOptionsBuilder.cs index 58a82bf77d..ee580332a8 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/IAbpCommonDbContextRegistrationOptionsBuilder.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/IAbpCommonDbContextRegistrationOptionsBuilder.cs @@ -90,5 +90,5 @@ public interface IAbpCommonDbContextRegistrationOptionsBuilder /// The DbContext type to be replaced /// The target DbContext type (optional, used this DbContext type if not provided) /// MultiTenancy side - IAbpCommonDbContextRegistrationOptionsBuilder ReplaceDbContext(Type otherDbContextType, Type targetDbContextType = null, MultiTenancySides multiTenancySides = MultiTenancySides.Both); + IAbpCommonDbContextRegistrationOptionsBuilder ReplaceDbContext(Type otherDbContextType, Type? targetDbContextType = null, MultiTenancySides multiTenancySides = MultiTenancySides.Both); } diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/MultiTenantDbContextType.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/MultiTenantDbContextType.cs index ff0d74608a..b015b9204a 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/MultiTenantDbContextType.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/MultiTenantDbContextType.cs @@ -15,7 +15,7 @@ public class MultiTenantDbContextType MultiTenancySide = multiTenancySide; } - public override bool Equals(object obj) + public override bool Equals(object? obj) { var other = obj as MultiTenantDbContextType; diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Auditing/AuditedAggregateRootWithUser.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Auditing/AuditedAggregateRootWithUser.cs index ebb573579b..f38c21d2fe 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Auditing/AuditedAggregateRootWithUser.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Auditing/AuditedAggregateRootWithUser.cs @@ -12,10 +12,10 @@ public abstract class AuditedAggregateRootWithUser : AuditedAggregateRoot where TUser : IEntity { /// - public virtual TUser Creator { get; protected set; } + public virtual TUser? Creator { get; protected set; } /// - public virtual TUser LastModifier { get; set; } + public virtual TUser? LastModifier { get; set; } } /// @@ -28,10 +28,10 @@ public abstract class AuditedAggregateRootWithUser : AuditedAggrega where TUser : IEntity { /// - public virtual TUser Creator { get; protected set; } + public virtual TUser? Creator { get; protected set; } /// - public virtual TUser LastModifier { get; set; } + public virtual TUser? LastModifier { get; set; } protected AuditedAggregateRootWithUser() { diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Auditing/AuditedEntityWithUser.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Auditing/AuditedEntityWithUser.cs index 99b9b66303..3f8598d348 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Auditing/AuditedEntityWithUser.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Auditing/AuditedEntityWithUser.cs @@ -12,10 +12,10 @@ public abstract class AuditedEntityWithUser : AuditedEntity, IAuditedObje where TUser : IEntity { /// - public virtual TUser Creator { get; protected set; } + public virtual TUser? Creator { get; protected set; } /// - public virtual TUser LastModifier { get; set; } + public virtual TUser? LastModifier { get; set; } } /// @@ -28,10 +28,10 @@ public abstract class AuditedEntityWithUser : AuditedEntity, where TUser : IEntity { /// - public virtual TUser Creator { get; protected set; } + public virtual TUser? Creator { get; protected set; } /// - public virtual TUser LastModifier { get; set; } + public virtual TUser? LastModifier { get; set; } protected AuditedEntityWithUser() { diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Auditing/CreationAuditedAggregateRootWithUser.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Auditing/CreationAuditedAggregateRootWithUser.cs index 73da9d2026..4407a93de8 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Auditing/CreationAuditedAggregateRootWithUser.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Auditing/CreationAuditedAggregateRootWithUser.cs @@ -11,7 +11,7 @@ namespace Volo.Abp.Domain.Entities.Auditing; public abstract class CreationAuditedAggregateRootWithUser : CreationAuditedAggregateRoot, ICreationAuditedObject { /// - public virtual TUser Creator { get; protected set; } + public virtual TUser? Creator { get; protected set; } } /// @@ -23,7 +23,7 @@ public abstract class CreationAuditedAggregateRootWithUser : CreationAudi public abstract class CreationAuditedAggregateRootWithUser : CreationAuditedAggregateRoot, ICreationAuditedObject { /// - public virtual TUser Creator { get; protected set; } + public virtual TUser? Creator { get; protected set; } protected CreationAuditedAggregateRootWithUser() { diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Auditing/CreationAuditedEntityWithUser.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Auditing/CreationAuditedEntityWithUser.cs index 203967fb89..635bb06183 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Auditing/CreationAuditedEntityWithUser.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Auditing/CreationAuditedEntityWithUser.cs @@ -11,7 +11,7 @@ namespace Volo.Abp.Domain.Entities.Auditing; public abstract class CreationAuditedEntityWithUser : CreationAuditedEntity, ICreationAuditedObject { /// - public virtual TUser Creator { get; protected set; } + public virtual TUser? Creator { get; protected set; } } /// @@ -23,7 +23,7 @@ public abstract class CreationAuditedEntityWithUser : CreationAuditedEnti public abstract class CreationAuditedEntityWithUser : CreationAuditedEntity, ICreationAuditedObject { /// - public virtual TUser Creator { get; protected set; } + public virtual TUser? Creator { get; protected set; } protected CreationAuditedEntityWithUser() { diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Auditing/FullAuditedAggregateRootWithUser.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Auditing/FullAuditedAggregateRootWithUser.cs index 918270088e..af8f196f00 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Auditing/FullAuditedAggregateRootWithUser.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Auditing/FullAuditedAggregateRootWithUser.cs @@ -12,13 +12,13 @@ public abstract class FullAuditedAggregateRootWithUser : FullAuditedAggre where TUser : IEntity { /// - public virtual TUser Deleter { get; set; } + public virtual TUser? Deleter { get; set; } /// - public virtual TUser Creator { get; protected set; } + public virtual TUser? Creator { get; protected set; } /// - public virtual TUser LastModifier { get; set; } + public virtual TUser? LastModifier { get; set; } } /// @@ -31,13 +31,13 @@ public abstract class FullAuditedAggregateRootWithUser : FullAudite where TUser : IEntity { /// - public virtual TUser Deleter { get; set; } + public virtual TUser? Deleter { get; set; } /// - public virtual TUser Creator { get; protected set; } + public virtual TUser? Creator { get; protected set; } /// - public virtual TUser LastModifier { get; set; } + public virtual TUser? LastModifier { get; set; } protected FullAuditedAggregateRootWithUser() { diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Auditing/FullAuditedEntityWithUser.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Auditing/FullAuditedEntityWithUser.cs index 1f4886f4c0..834b106d95 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Auditing/FullAuditedEntityWithUser.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Auditing/FullAuditedEntityWithUser.cs @@ -12,13 +12,13 @@ public abstract class FullAuditedEntityWithUser : FullAuditedEntity, IFul where TUser : IEntity { /// - public virtual TUser Deleter { get; set; } + public virtual TUser? Deleter { get; set; } /// - public virtual TUser Creator { get; protected set; } + public virtual TUser? Creator { get; protected set; } /// - public virtual TUser LastModifier { get; set; } + public virtual TUser? LastModifier { get; set; } } /// @@ -31,13 +31,13 @@ public abstract class FullAuditedEntityWithUser : FullAuditedEntity where TUser : IEntity { /// - public virtual TUser Deleter { get; set; } + public virtual TUser? Deleter { get; set; } /// - public virtual TUser Creator { get; protected set; } + public virtual TUser? Creator { get; protected set; } /// - public virtual TUser LastModifier { get; set; } + public virtual TUser? LastModifier { get; set; } protected FullAuditedEntityWithUser() { diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Caching/EntityCacheBase.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Caching/EntityCacheBase.cs index 7e5b17b687..2cb2b2c32b 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Caching/EntityCacheBase.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Caching/EntityCacheBase.cs @@ -27,23 +27,23 @@ public abstract class EntityCacheBase : UnitOfWorkManager = unitOfWorkManager; } - public virtual async Task FindAsync(TKey id) + public virtual async Task FindAsync(TKey id) { return await Cache.GetOrAddAsync( id, - async () => MapToCacheItem(await Repository.FindAsync(id)) + async () => MapToCacheItem(await Repository.FindAsync(id))! ); } public virtual async Task GetAsync(TKey id) { - return await Cache.GetOrAddAsync( + return (await Cache.GetOrAddAsync( id, - async () => MapToCacheItem(await Repository.GetAsync(id)) - ); + async () => MapToCacheItem(await Repository.GetAsync(id))! + ))!; } - protected abstract TEntityCacheItem MapToCacheItem(TEntity entity); + protected abstract TEntityCacheItem? MapToCacheItem(TEntity? entity); public async Task HandleEventAsync(EntityChangedEventData eventData) { diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Caching/EntityCacheServiceCollectionExtensions.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Caching/EntityCacheServiceCollectionExtensions.cs index bf7ceac45c..c208c7b107 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Caching/EntityCacheServiceCollectionExtensions.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Caching/EntityCacheServiceCollectionExtensions.cs @@ -13,7 +13,7 @@ public static class EntityCacheServiceCollectionExtensions { public static IServiceCollection AddEntityCache( this IServiceCollection services, - [CanBeNull] DistributedCacheEntryOptions cacheOptions = null) + DistributedCacheEntryOptions? cacheOptions = null) where TEntity : Entity { services @@ -39,7 +39,7 @@ public static class EntityCacheServiceCollectionExtensions public static IServiceCollection AddEntityCache( this IServiceCollection services, - [CanBeNull] DistributedCacheEntryOptions cacheOptions = null) + DistributedCacheEntryOptions? cacheOptions = null) where TEntity : Entity where TEntityCacheItem : class { @@ -61,7 +61,7 @@ public static class EntityCacheServiceCollectionExtensions public static IServiceCollection AddEntityCache( this IServiceCollection services, - [CanBeNull] DistributedCacheEntryOptions cacheOptions = null) + DistributedCacheEntryOptions? cacheOptions = null) where TEntity : Entity where TEntityCacheItem : class { diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Caching/EntityCacheWithObjectMapper.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Caching/EntityCacheWithObjectMapper.cs index 727df63ea7..a37ad49b1e 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Caching/EntityCacheWithObjectMapper.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Caching/EntityCacheWithObjectMapper.cs @@ -23,7 +23,7 @@ public class EntityCacheWithObjectMapper : ObjectMapper = objectMapper; } - protected override TEntityCacheItem MapToCacheItem(TEntity entity) + protected override TEntityCacheItem? MapToCacheItem(TEntity? entity) { if (entity == null) { diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Caching/EntityCacheWithoutCacheItem.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Caching/EntityCacheWithoutCacheItem.cs index c81f3e5e9e..0f300a7f28 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Caching/EntityCacheWithoutCacheItem.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Caching/EntityCacheWithoutCacheItem.cs @@ -16,7 +16,7 @@ public class EntityCacheWithoutCacheItem : { } - protected override TEntity MapToCacheItem(TEntity entity) + protected override TEntity? MapToCacheItem(TEntity? entity) { return entity; } diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Caching/IEntityCache.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Caching/IEntityCache.cs index 84f4486c65..bd8ba80a63 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Caching/IEntityCache.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Caching/IEntityCache.cs @@ -10,8 +10,7 @@ public interface IEntityCache /// Gets the entity with given , /// or returns null if the entity was not found. /// - [ItemCanBeNull] - Task FindAsync(TKey id); + Task FindAsync(TKey id); /// /// Gets the entity with given , diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Entity.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Entity.cs index 54ebd01d1e..9e52d1abfd 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Entity.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Entity.cs @@ -18,7 +18,7 @@ public abstract class Entity : IEntity return $"[ENTITY: {GetType().Name}] Keys = {GetKeys().JoinAsString(", ")}"; } - public abstract object[] GetKeys(); + public abstract object?[] GetKeys(); public bool EntityEquals(IEntity other) { @@ -31,7 +31,7 @@ public abstract class Entity : IEntity public abstract class Entity : Entity, IEntity { /// - public virtual TKey Id { get; protected set; } + public virtual TKey Id { get; protected set; } = default!; protected Entity() { @@ -43,9 +43,9 @@ public abstract class Entity : Entity, IEntity Id = id; } - public override object[] GetKeys() + public override object?[] GetKeys() { - return new object[] { Id }; + return new object?[] { Id }; } /// diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/EntityHelper.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/EntityHelper.cs index f7a4f27e5f..584807fac5 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/EntityHelper.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/EntityHelper.cs @@ -25,7 +25,7 @@ public static class EntityHelper return typeof(IMultiTenant).IsAssignableFrom(type); } - public static bool EntityEquals(IEntity entity1, IEntity entity2) + public static bool EntityEquals(IEntity? entity1, IEntity? entity2) { if (entity1 == null || entity2 == null) { @@ -131,7 +131,7 @@ public static class EntityHelper return IsValueObjectPredicate(type); } - public static bool IsValueObject(object obj) + public static bool IsValueObject(object? obj) { return obj != null && IsValueObject(obj.GetType()); } @@ -161,7 +161,7 @@ public static class EntityHelper public static bool HasDefaultId(IEntity entity) { - if (EqualityComparer.Default.Equals(entity.Id, default)) + if (EqualityComparer.Default.Equals(entity.Id, default!)) { return true; } @@ -180,7 +180,7 @@ public static class EntityHelper return false; } - private static bool IsDefaultKeyValue(object value) + private static bool IsDefaultKeyValue(object? value) { if (value == null) { @@ -222,8 +222,7 @@ public static class EntityHelper /// Tries to find the primary key type of the given entity type. /// May return null if given type does not implement /// - [CanBeNull] - public static Type FindPrimaryKeyType() + public static Type? FindPrimaryKeyType() where TEntity : IEntity { return FindPrimaryKeyType(typeof(TEntity)); @@ -233,8 +232,7 @@ public static class EntityHelper /// Tries to find the primary key type of the given entity type. /// May return null if given type does not implement /// - [CanBeNull] - public static Type FindPrimaryKeyType([NotNull] Type entityType) + public static Type? FindPrimaryKeyType([NotNull] Type entityType) { if (!typeof(IEntity).IsAssignableFrom(entityType)) { @@ -260,7 +258,7 @@ public static class EntityHelper var lambdaParam = Expression.Parameter(typeof(TEntity)); var leftExpression = Expression.PropertyOrField(lambdaParam, "Id"); var idValue = Convert.ChangeType(id, typeof(TKey)); - Expression> closure = () => idValue; + Expression> closure = () => idValue; var rightExpression = Expression.Convert(closure.Body, leftExpression.Type); var lambdaBody = Expression.Equal(leftExpression, rightExpression); return Expression.Lambda>(lambdaBody, lambdaParam); diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/Distributed/EntitySynchronizer.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/Distributed/EntitySynchronizer.cs index b971acc25f..5640c427c2 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/Distributed/EntitySynchronizer.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/Distributed/EntitySynchronizer.cs @@ -22,7 +22,7 @@ public abstract class EntitySynchronizer : Repository = repository; } - protected override Task FindLocalEntityAsync(TSourceEntityEto eto) + protected override Task FindLocalEntityAsync(TSourceEntityEto eto) { return Repository.FindAsync(eto.Id); } @@ -154,10 +154,9 @@ public abstract class EntitySynchronizer : return true; } - [ItemCanBeNull] - protected abstract Task FindLocalEntityAsync(TSourceEntityEto eto); + protected abstract Task FindLocalEntityAsync(TSourceEntityEto eto); - protected virtual Task IsEtoNewerAsync(TSourceEntityEto eto, [CanBeNull] TEntity localEntity) + protected virtual Task IsEtoNewerAsync(TSourceEntityEto eto, TEntity? localEntity) { if (localEntity is IHasEntityVersion versionedLocalEntity && eto is IHasEntityVersion versionedEto) { diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/Distributed/EntityToEtoMapper.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/Distributed/EntityToEtoMapper.cs index b9d5911375..1710fe81e3 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/Distributed/EntityToEtoMapper.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/Distributed/EntityToEtoMapper.cs @@ -21,7 +21,7 @@ public class EntityToEtoMapper : IEntityToEtoMapper, ITransientDependency Options = options.Value; } - public object Map(object entityObj) + public object? Map(object entityObj) { Check.NotNull(entityObj, nameof(entityObj)); diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/EntityChangeEventHelper.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/EntityChangeEventHelper.cs index 20556f16ff..44eb5c058a 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/EntityChangeEventHelper.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/EntityChangeEventHelper.cs @@ -133,7 +133,7 @@ public class EntityChangeEventHelper : IEntityChangeEventHelper, ITransientDepen { var entityType = ProxyHelper.UnProxy(entityOrEto).GetType(); var eventType = genericEventType.MakeGenericType(entityType); - var eventData = Activator.CreateInstance(eventType, entityOrEto); + var eventData = Activator.CreateInstance(eventType, entityOrEto)!; var currentUow = UnitOfWorkManager.Current; if (currentUow == null) diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/EntityEventData.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/EntityEventData.cs index c2845da60e..b295f22f4e 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/EntityEventData.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/EntityEventData.cs @@ -27,7 +27,7 @@ public class EntityEventData : IEventDataWithInheritableGenericArgument public virtual object[] GetConstructorArgs() { - return new object[] { Entity }; + return new object[] { Entity! }; } public virtual bool IsMultiTenant(out Guid? tenantId) diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/IEntity.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/IEntity.cs index 7f4d425df2..1df1b75696 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/IEntity.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/IEntity.cs @@ -10,7 +10,7 @@ public interface IEntity /// Returns an array of ordered keys for this entity. /// /// - object[] GetKeys(); + object?[] GetKeys(); } /// diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/BasicRepositoryBase.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/BasicRepositoryBase.cs index 8a87f9c391..0d86045eea 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/BasicRepositoryBase.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/BasicRepositoryBase.cs @@ -20,9 +20,9 @@ public abstract class BasicRepositoryBase : IUnitOfWorkEnabled where TEntity : class, IEntity { - public IAbpLazyServiceProvider LazyServiceProvider { get; set; } + public IAbpLazyServiceProvider LazyServiceProvider { get; set; } = default!; - public IServiceProvider ServiceProvider { get; set; } + public IServiceProvider ServiceProvider { get; set; } = default!; public IDataFilter DataFilter => LazyServiceProvider.LazyGetRequiredService(); @@ -123,7 +123,7 @@ public abstract class BasicRepositoryBase : BasicRepositoryBase FindAsync(TKey id, bool includeDetails = true, CancellationToken cancellationToken = default); + public abstract Task FindAsync(TKey id, bool includeDetails = true, CancellationToken cancellationToken = default); public virtual async Task DeleteAsync(TKey id, bool autoSave = false, CancellationToken cancellationToken = default) { diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/IReadOnlyBasicRepository.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/IReadOnlyBasicRepository.cs index 6d447552f9..0736685709 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/IReadOnlyBasicRepository.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/IReadOnlyBasicRepository.cs @@ -51,5 +51,5 @@ public interface IReadOnlyBasicRepository : IReadOnlyBasicReposit /// Set true to include all children of this entity /// A to observe while waiting for the task to complete. /// Entity or null - Task FindAsync(TKey id, bool includeDetails = true, CancellationToken cancellationToken = default); + Task FindAsync(TKey id, bool includeDetails = true, CancellationToken cancellationToken = default); } diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/IRepository.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/IRepository.cs index da915626a8..3c7ae81875 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/IRepository.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/IRepository.cs @@ -28,7 +28,7 @@ public interface IRepository : IReadOnlyRepository, IBasicRepo /// A condition to find the entity /// Set true to include all children of this entity /// A to observe while waiting for the task to complete. - Task FindAsync( + Task FindAsync( [NotNull] Expression> predicate, bool includeDetails = true, CancellationToken cancellationToken = default diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryAsyncExtensions.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryAsyncExtensions.cs index 304f9ea0bd..2115d00200 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryAsyncExtensions.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryAsyncExtensions.cs @@ -120,7 +120,7 @@ public static class RepositoryAsyncExtensions return await repository.AsyncExecuter.FirstAsync(queryable, predicate, cancellationToken); } - public static async Task FirstOrDefaultAsync( + public static async Task FirstOrDefaultAsync( [NotNull] this IReadOnlyRepository repository, CancellationToken cancellationToken = default) where T : class, IEntity @@ -129,7 +129,7 @@ public static class RepositoryAsyncExtensions return await repository.AsyncExecuter.FirstOrDefaultAsync(queryable, cancellationToken); } - public static async Task FirstOrDefaultAsync( + public static async Task FirstOrDefaultAsync( [NotNull] this IReadOnlyRepository repository, [NotNull] Expression> predicate, CancellationToken cancellationToken = default) @@ -162,7 +162,7 @@ public static class RepositoryAsyncExtensions return await repository.AsyncExecuter.LastAsync(queryable, predicate, cancellationToken); } - public static async Task LastOrDefaultAsync( + public static async Task LastOrDefaultAsync( [NotNull] this IReadOnlyRepository repository, CancellationToken cancellationToken = default) where T : class, IEntity @@ -171,7 +171,7 @@ public static class RepositoryAsyncExtensions return await repository.AsyncExecuter.LastOrDefaultAsync(queryable, cancellationToken); } - public static async Task LastOrDefaultAsync( + public static async Task LastOrDefaultAsync( [NotNull] this IReadOnlyRepository repository, [NotNull] Expression> predicate, CancellationToken cancellationToken = default) @@ -204,7 +204,7 @@ public static class RepositoryAsyncExtensions return await repository.AsyncExecuter.SingleAsync(queryable, predicate, cancellationToken); } - public static async Task SingleOrDefaultAsync( + public static async Task SingleOrDefaultAsync( [NotNull] this IReadOnlyRepository repository, CancellationToken cancellationToken = default) where T : class, IEntity @@ -213,7 +213,7 @@ public static class RepositoryAsyncExtensions return await repository.AsyncExecuter.SingleOrDefaultAsync(queryable, cancellationToken); } - public static async Task SingleOrDefaultAsync( + public static async Task SingleOrDefaultAsync( [NotNull] this IReadOnlyRepository repository, [NotNull] Expression> predicate, CancellationToken cancellationToken = default) diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryBase.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryBase.cs index d843584fc4..eb2457f8c8 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryBase.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryBase.cs @@ -41,7 +41,7 @@ public abstract class RepositoryBase : BasicRepositoryBase, IR public abstract Task> GetQueryableAsync(); - public abstract Task FindAsync( + public abstract Task FindAsync( Expression> predicate, bool includeDetails = true, CancellationToken cancellationToken = default); @@ -76,13 +76,13 @@ public abstract class RepositoryBase : BasicRepositoryBase, IR { if (typeof(ISoftDelete).IsAssignableFrom(typeof(TOtherEntity))) { - query = (TQueryable)query.WhereIf(DataFilter.IsEnabled(), e => ((ISoftDelete)e).IsDeleted == false); + query = (TQueryable)query.WhereIf(DataFilter.IsEnabled(), e => ((ISoftDelete)e!).IsDeleted == false); } if (typeof(IMultiTenant).IsAssignableFrom(typeof(TOtherEntity))) { var tenantId = CurrentTenant.Id; - query = (TQueryable)query.WhereIf(DataFilter.IsEnabled(), e => ((IMultiTenant)e).TenantId == tenantId); + query = (TQueryable)query.WhereIf(DataFilter.IsEnabled(), e => ((IMultiTenant)e!).TenantId == tenantId); } return query; @@ -94,7 +94,7 @@ public abstract class RepositoryBase : RepositoryBase, I { public abstract Task GetAsync(TKey id, bool includeDetails = true, CancellationToken cancellationToken = default); - public abstract Task FindAsync(TKey id, bool includeDetails = true, CancellationToken cancellationToken = default); + public abstract Task FindAsync(TKey id, bool includeDetails = true, CancellationToken cancellationToken = default); public virtual async Task DeleteAsync(TKey id, bool autoSave = false, CancellationToken cancellationToken = default) { diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryExtensions.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryExtensions.cs index 379203f46a..cbebf62196 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryExtensions.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryExtensions.cs @@ -54,7 +54,7 @@ public static class RepositoryExtensions ) where TEntity : class, IEntity { - if (!await repository.AnyAsync(x => x.Id.Equals(id), cancellationToken)) + if (!await repository.AnyAsync(x => x.Id!.Equals(id), cancellationToken)) { throw new EntityNotFoundException(typeof(TEntity), id); } @@ -87,7 +87,7 @@ public static class RepositoryExtensions { using (var uow = uowManager.Begin()) { - await HardDeleteWithUnitOfWorkAsync(repository, predicate, autoSave, cancellationToken, uowManager.Current); + await HardDeleteWithUnitOfWorkAsync(repository, predicate, autoSave, cancellationToken, uowManager.Current!); await uow.CompleteAsync(cancellationToken); } } @@ -111,7 +111,7 @@ public static class RepositoryExtensions { using (var uow = uowManager.Begin()) { - await HardDeleteWithUnitOfWorkAsync(repository, entities, autoSave, cancellationToken, uowManager.Current); + await HardDeleteWithUnitOfWorkAsync(repository, entities, autoSave, cancellationToken, uowManager.Current!); await uow.CompleteAsync(cancellationToken); } } @@ -135,7 +135,7 @@ public static class RepositoryExtensions { using (var uow = uowManager.Begin()) { - await HardDeleteWithUnitOfWorkAsync(repository, entity, autoSave, cancellationToken, uowManager.Current); + await HardDeleteWithUnitOfWorkAsync(repository, entity, autoSave, cancellationToken, uowManager.Current!); await uow.CompleteAsync(cancellationToken); } } diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryRegistrarBase.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryRegistrarBase.cs index 320aed8312..d162f2ffea 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryRegistrarBase.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryRegistrarBase.cs @@ -75,12 +75,12 @@ public abstract class RepositoryRegistrarBase if (primaryKeyType == null) { return Options.SpecifiedDefaultRepositoryTypes - ? Options.DefaultRepositoryImplementationTypeWithoutKey.MakeGenericType(entityType) + ? Options.DefaultRepositoryImplementationTypeWithoutKey!.MakeGenericType(entityType) : GetRepositoryType(Options.DefaultRepositoryDbContextType, entityType); } return Options.SpecifiedDefaultRepositoryTypes - ? Options.DefaultRepositoryImplementationType.MakeGenericType(entityType, primaryKeyType) + ? Options.DefaultRepositoryImplementationType!.MakeGenericType(entityType, primaryKeyType) : GetRepositoryType(Options.DefaultRepositoryDbContextType, entityType, primaryKeyType); } diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Services/DomainService.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Services/DomainService.cs index 32cf42409c..b36b32eafd 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Services/DomainService.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Services/DomainService.cs @@ -11,10 +11,10 @@ namespace Volo.Abp.Domain.Services; public abstract class DomainService : IDomainService { - public IAbpLazyServiceProvider LazyServiceProvider { get; set; } + public IAbpLazyServiceProvider LazyServiceProvider { get; set; } = default!; [Obsolete("Use LazyServiceProvider instead.")] - public IServiceProvider ServiceProvider { get; set; } + public IServiceProvider ServiceProvider { get; set; } = default!; protected IClock Clock => LazyServiceProvider.LazyGetRequiredService(); @@ -26,5 +26,5 @@ public abstract class DomainService : IDomainService protected IAsyncQueryableExecuter AsyncExecuter => LazyServiceProvider.LazyGetRequiredService(); - protected ILogger Logger => LazyServiceProvider.LazyGetService(provider => LoggerFactory?.CreateLogger(GetType().FullName) ?? NullLogger.Instance); + protected ILogger Logger => LazyServiceProvider.LazyGetService(provider => LoggerFactory?.CreateLogger(GetType().FullName!) ?? NullLogger.Instance); } diff --git a/framework/src/Volo.Abp.Threading/Volo/Abp/Linq/AsyncQueryableExecuter.cs b/framework/src/Volo.Abp.Threading/Volo/Abp/Linq/AsyncQueryableExecuter.cs index 108d3bb595..a6b9fb7949 100644 --- a/framework/src/Volo.Abp.Threading/Volo/Abp/Linq/AsyncQueryableExecuter.cs +++ b/framework/src/Volo.Abp.Threading/Volo/Abp/Linq/AsyncQueryableExecuter.cs @@ -209,7 +209,7 @@ public class AsyncQueryableExecuter : IAsyncQueryableExecuter, ISingletonDepende return Task.FromResult(queryable.SingleOrDefault(predicate))!; } - public Task MinAsync(IQueryable queryable, CancellationToken cancellationToken = default) + public Task MinAsync(IQueryable queryable, CancellationToken cancellationToken = default) { var provider = FindProvider(queryable); @@ -221,7 +221,7 @@ public class AsyncQueryableExecuter : IAsyncQueryableExecuter, ISingletonDepende return Task.FromResult(queryable.Min())!; } - public Task MinAsync(IQueryable queryable, Expression> selector, CancellationToken cancellationToken = default) + public Task MinAsync(IQueryable queryable, Expression> selector, CancellationToken cancellationToken = default) { var provider = FindProvider(queryable); @@ -233,7 +233,7 @@ public class AsyncQueryableExecuter : IAsyncQueryableExecuter, ISingletonDepende return Task.FromResult(queryable.Min(selector))!; } - public Task MaxAsync(IQueryable queryable, CancellationToken cancellationToken = default) + public Task MaxAsync(IQueryable queryable, CancellationToken cancellationToken = default) { var provider = FindProvider(queryable); @@ -245,7 +245,7 @@ public class AsyncQueryableExecuter : IAsyncQueryableExecuter, ISingletonDepende return Task.FromResult(queryable.Max())!; } - public Task MaxAsync(IQueryable queryable, Expression> selector, CancellationToken cancellationToken = default) + public Task MaxAsync(IQueryable queryable, Expression> selector, CancellationToken cancellationToken = default) { var provider = FindProvider(queryable); diff --git a/framework/src/Volo.Abp.Threading/Volo/Abp/Linq/IAsyncQueryableExecuter.cs b/framework/src/Volo.Abp.Threading/Volo/Abp/Linq/IAsyncQueryableExecuter.cs index 2bea6c4604..4ee0666f4c 100644 --- a/framework/src/Volo.Abp.Threading/Volo/Abp/Linq/IAsyncQueryableExecuter.cs +++ b/framework/src/Volo.Abp.Threading/Volo/Abp/Linq/IAsyncQueryableExecuter.cs @@ -137,12 +137,12 @@ public interface IAsyncQueryableExecuter #region Min - Task MinAsync( + Task MinAsync( [NotNull] IQueryable queryable, CancellationToken cancellationToken = default); - Task MinAsync( + Task MinAsync( [NotNull] IQueryable queryable, [NotNull] Expression> selector, CancellationToken cancellationToken = default); @@ -151,12 +151,12 @@ public interface IAsyncQueryableExecuter #region Max - Task MaxAsync( + Task MaxAsync( [NotNull] IQueryable queryable, CancellationToken cancellationToken = default); - Task MaxAsync( + Task MaxAsync( [NotNull] IQueryable queryable, [NotNull] Expression> selector, CancellationToken cancellationToken = default); diff --git a/framework/src/Volo.Abp.Threading/Volo/Abp/Linq/IAsyncQueryableProvider.cs b/framework/src/Volo.Abp.Threading/Volo/Abp/Linq/IAsyncQueryableProvider.cs index 3f38553ac5..3239fde6d6 100644 --- a/framework/src/Volo.Abp.Threading/Volo/Abp/Linq/IAsyncQueryableProvider.cs +++ b/framework/src/Volo.Abp.Threading/Volo/Abp/Linq/IAsyncQueryableProvider.cs @@ -139,12 +139,12 @@ public interface IAsyncQueryableProvider #region Min - Task MinAsync( + Task MinAsync( [NotNull] IQueryable queryable, CancellationToken cancellationToken = default); - Task MinAsync( + Task MinAsync( [NotNull] IQueryable queryable, [NotNull] Expression> selector, CancellationToken cancellationToken = default); @@ -153,12 +153,12 @@ public interface IAsyncQueryableProvider #region Max - Task MaxAsync( + Task MaxAsync( [NotNull] IQueryable queryable, CancellationToken cancellationToken = default); - Task MaxAsync( + Task MaxAsync( [NotNull] IQueryable queryable, [NotNull] Expression> selector, CancellationToken cancellationToken = default); From 122fc4e874455c7756bdb5b8b61290ac50795aa0 Mon Sep 17 00:00:00 2001 From: Salih Date: Mon, 7 Aug 2023 09:16:43 +0300 Subject: [PATCH 34/58] Update en.json --- .../Commercial/Localization/Resources/en.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json index abd93b4547..e2267d6a36 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json @@ -907,8 +907,12 @@ "ExtraQuestionCreditsFaqExplanation": "Yes, you can. To buy extra question credits, send an e-mail to info@abp.io with your organization's name. Here's the price list for the extra question credits:
  • 50 questions pack $999
  • 25 questions pack $625
  • 15 questions pack $450
", "AlreadyBetaTester": "You have already joined the beta tester program.", "AbpStudio": "ABP Studio", + "AbpStudio_Description": "ABP Studio is still under development. You can fill out the form below to be one of the first users.", "AbpStudio_Description1": "ABP Studio is a cross-platform desktop application for ABP developers.", "AbpStudio_Description2": "It is well integrated to the ABP Framework and aims to provide a comfortable development environment for you by automating things, providing insights about your solution, making develop, run and deploy your solutions much easier.", + "AbpStudio_ComingSoon": "Coming Soon Planned beta release date: Q4 of 2023.", + "AbpStudio_PlannedPreviewDate": "Planned preview release date: Q4 of 2023.", + "BetaRequest": "Beta Request", "CreateNewSolutions": "Create New Solutions", "CreateNewSolutions_Description1": "You can create from simple applications to modular monolith or microservice solutions easily with a lot of options. You get a full production-ready base software solution for your business.", "ArchitectYourSolutions": "Architect Your Solutions", From adaf8c7201643b21ec5ae3796146f1bc21baf0bd Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Mon, 7 Aug 2023 14:23:40 +0800 Subject: [PATCH 35/58] Enable nullable annotations for Volo.Abp.Dapper --- framework/src/Volo.Abp.Dapper/Volo.Abp.Dapper.csproj | 2 ++ .../Volo/Abp/Domain/Repositories/Dapper/DapperRepository.cs | 6 +++--- .../Abp/Domain/Repositories/Dapper/IDapperRepository.cs | 4 ++-- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/framework/src/Volo.Abp.Dapper/Volo.Abp.Dapper.csproj b/framework/src/Volo.Abp.Dapper/Volo.Abp.Dapper.csproj index e4236d697c..e42eca0d2b 100644 --- a/framework/src/Volo.Abp.Dapper/Volo.Abp.Dapper.csproj +++ b/framework/src/Volo.Abp.Dapper/Volo.Abp.Dapper.csproj @@ -5,6 +5,8 @@ net7.0 + enable + Nullable Volo.Abp.Dapper Volo.Abp.Dapper $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/framework/src/Volo.Abp.Dapper/Volo/Abp/Domain/Repositories/Dapper/DapperRepository.cs b/framework/src/Volo.Abp.Dapper/Volo/Abp/Domain/Repositories/Dapper/DapperRepository.cs index b9f061b9aa..fda89ab61d 100644 --- a/framework/src/Volo.Abp.Dapper/Volo/Abp/Domain/Repositories/Dapper/DapperRepository.cs +++ b/framework/src/Volo.Abp.Dapper/Volo/Abp/Domain/Repositories/Dapper/DapperRepository.cs @@ -16,7 +16,7 @@ namespace Volo.Abp.Domain.Repositories.Dapper; public class DapperRepository : IDapperRepository, IUnitOfWorkEnabled where TDbContext : IEfCoreDbContext { - public IAbpLazyServiceProvider LazyServiceProvider { get; set; } + public IAbpLazyServiceProvider LazyServiceProvider { get; set; } = default!; public IDataFilter DataFilter => LazyServiceProvider.LazyGetRequiredService(); @@ -39,9 +39,9 @@ public class DapperRepository : IDapperRepository, IUnitOfWorkEnable public virtual async Task GetDbConnectionAsync() => (await _dbContextProvider.GetDbContextAsync()).Database.GetDbConnection(); [Obsolete("Use GetDbTransactionAsync method.")] - public IDbTransaction DbTransaction => _dbContextProvider.GetDbContext().Database.CurrentTransaction?.GetDbTransaction(); + public IDbTransaction? DbTransaction => _dbContextProvider.GetDbContext().Database.CurrentTransaction?.GetDbTransaction(); - public virtual async Task GetDbTransactionAsync() => (await _dbContextProvider.GetDbContextAsync()).Database.CurrentTransaction?.GetDbTransaction(); + public virtual async Task GetDbTransactionAsync() => (await _dbContextProvider.GetDbContextAsync()).Database.CurrentTransaction?.GetDbTransaction(); protected virtual CancellationToken GetCancellationToken(CancellationToken preferredValue = default) { diff --git a/framework/src/Volo.Abp.Dapper/Volo/Abp/Domain/Repositories/Dapper/IDapperRepository.cs b/framework/src/Volo.Abp.Dapper/Volo/Abp/Domain/Repositories/Dapper/IDapperRepository.cs index e5e8fa4c54..5a22e65e00 100644 --- a/framework/src/Volo.Abp.Dapper/Volo/Abp/Domain/Repositories/Dapper/IDapperRepository.cs +++ b/framework/src/Volo.Abp.Dapper/Volo/Abp/Domain/Repositories/Dapper/IDapperRepository.cs @@ -12,7 +12,7 @@ public interface IDapperRepository Task GetDbConnectionAsync(); [Obsolete("Use GetDbTransactionAsync method.")] - IDbTransaction DbTransaction { get; } + IDbTransaction? DbTransaction { get; } - Task GetDbTransactionAsync(); + Task GetDbTransactionAsync(); } From 671c6156a0f52ab55fb24930c54637b553b8d40b Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Mon, 7 Aug 2023 14:28:27 +0800 Subject: [PATCH 36/58] Enable nullable annotations for Volo.Abp.Ddd.Domain.Shared --- .../Volo.Abp.Ddd.Domain.Shared.csproj | 2 ++ .../Abp/Domain/Entities/Events/Distributed/EntityEto.cs | 6 +++--- .../Entities/Events/Distributed/EtoMappingDictionary.cs | 2 +- .../Entities/Events/Distributed/EtoMappingDictionaryItem.cs | 4 ++-- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/framework/src/Volo.Abp.Ddd.Domain.Shared/Volo.Abp.Ddd.Domain.Shared.csproj b/framework/src/Volo.Abp.Ddd.Domain.Shared/Volo.Abp.Ddd.Domain.Shared.csproj index 2972ef23c1..efc808fdc7 100644 --- a/framework/src/Volo.Abp.Ddd.Domain.Shared/Volo.Abp.Ddd.Domain.Shared.csproj +++ b/framework/src/Volo.Abp.Ddd.Domain.Shared/Volo.Abp.Ddd.Domain.Shared.csproj @@ -5,6 +5,8 @@ netstandard2.0;netstandard2.1;net7.0 + enable + Nullable Volo.Abp.Ddd.Domain.Shared Volo.Abp.Ddd.Domain.Shared $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/framework/src/Volo.Abp.Ddd.Domain.Shared/Volo/Abp/Domain/Entities/Events/Distributed/EntityEto.cs b/framework/src/Volo.Abp.Ddd.Domain.Shared/Volo/Abp/Domain/Entities/Events/Distributed/EntityEto.cs index 8a2983b076..88e71f2e9f 100644 --- a/framework/src/Volo.Abp.Ddd.Domain.Shared/Volo/Abp/Domain/Entities/Events/Distributed/EntityEto.cs +++ b/framework/src/Volo.Abp.Ddd.Domain.Shared/Volo/Abp/Domain/Entities/Events/Distributed/EntityEto.cs @@ -5,9 +5,9 @@ namespace Volo.Abp.Domain.Entities.Events.Distributed; [Serializable] public class EntityEto : EtoBase { - public string EntityType { get; set; } + public string EntityType { get; set; } = default!; - public string KeysAsString { get; set; } + public string KeysAsString { get; set; } = default!; public EntityEto() { @@ -23,5 +23,5 @@ public class EntityEto : EtoBase public abstract class EntityEto : IEntityEto { - public TKey Id { get; set; } + public TKey Id { get; set; } = default!; } \ No newline at end of file diff --git a/framework/src/Volo.Abp.Ddd.Domain.Shared/Volo/Abp/Domain/Entities/Events/Distributed/EtoMappingDictionary.cs b/framework/src/Volo.Abp.Ddd.Domain.Shared/Volo/Abp/Domain/Entities/Events/Distributed/EtoMappingDictionary.cs index bb9e362ac2..f62ccfd872 100644 --- a/framework/src/Volo.Abp.Ddd.Domain.Shared/Volo/Abp/Domain/Entities/Events/Distributed/EtoMappingDictionary.cs +++ b/framework/src/Volo.Abp.Ddd.Domain.Shared/Volo/Abp/Domain/Entities/Events/Distributed/EtoMappingDictionary.cs @@ -5,7 +5,7 @@ namespace Volo.Abp.Domain.Entities.Events.Distributed; public class EtoMappingDictionary : Dictionary { - public void Add(Type objectMappingContextType = null) + public void Add(Type? objectMappingContextType = null) { this[typeof(TEntity)] = new EtoMappingDictionaryItem(typeof(TEntityEto), objectMappingContextType); } diff --git a/framework/src/Volo.Abp.Ddd.Domain.Shared/Volo/Abp/Domain/Entities/Events/Distributed/EtoMappingDictionaryItem.cs b/framework/src/Volo.Abp.Ddd.Domain.Shared/Volo/Abp/Domain/Entities/Events/Distributed/EtoMappingDictionaryItem.cs index a6065e1d5f..c250e6daae 100644 --- a/framework/src/Volo.Abp.Ddd.Domain.Shared/Volo/Abp/Domain/Entities/Events/Distributed/EtoMappingDictionaryItem.cs +++ b/framework/src/Volo.Abp.Ddd.Domain.Shared/Volo/Abp/Domain/Entities/Events/Distributed/EtoMappingDictionaryItem.cs @@ -6,9 +6,9 @@ public class EtoMappingDictionaryItem { public Type EtoType { get; } - public Type ObjectMappingContextType { get; } + public Type? ObjectMappingContextType { get; } - public EtoMappingDictionaryItem(Type etoType, Type objectMappingContextType = null) + public EtoMappingDictionaryItem(Type etoType, Type? objectMappingContextType = null) { EtoType = etoType; ObjectMappingContextType = objectMappingContextType; From fc515c5f996243ce17993b2d8e66cbb7018bcb7e Mon Sep 17 00:00:00 2001 From: selman koc <64414348+skoc10@users.noreply.github.com> Date: Mon, 7 Aug 2023 09:33:49 +0300 Subject: [PATCH 37/58] Update version to release 7.3.2 --- common.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common.props b/common.props index f356656fbf..994bb4a888 100644 --- a/common.props +++ b/common.props @@ -1,7 +1,7 @@ latest - 7.3.1 + 7.3.2 $(NoWarn);CS1591;CS0436 https://abp.io/assets/abp_nupkg.png https://abp.io/ From bf608c6a57b7c798b3ef64f81be27b5cbcbe6f7b Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Mon, 7 Aug 2023 14:49:39 +0800 Subject: [PATCH 38/58] Enable nullable annotations for Volo.Abp.Application.Contracts --- .../Volo.Abp.Ddd.Application.Contracts.csproj | 2 ++ .../Abp/Application/Dtos/AuditedEntityWithUserDto.cs | 8 ++++---- .../Dtos/CreationAuditedEntityWithUserDto.cs | 4 ++-- .../Volo/Abp/Application/Dtos/EntityDto.cs | 2 +- .../Dtos/ExtensibleAuditedEntityWithUserDto.cs | 8 ++++---- .../ExtensibleCreationAuditedEntityWithUserDto.cs | 4 ++-- .../Volo/Abp/Application/Dtos/ExtensibleEntityDto.cs | 2 +- .../Dtos/ExtensibleFullAuditedEntityWithUserDto.cs | 12 ++++++------ .../Application/Dtos/FullAuditedEntityWithUserDto.cs | 12 ++++++------ .../Abp/Application/Dtos/ISortedResultRequest.cs | 2 +- .../Abp/Application/Dtos/LimitedResultRequestDto.cs | 4 ++-- .../Volo/Abp/Application/Dtos/ListResultDto.cs | 4 ++-- .../Dtos/PagedAndSortedResultRequestDto.cs | 4 ++-- .../Events/Distributed/IEntityToEtoMapper.cs | 3 +-- .../Entities/Events/Distributed/EntityToEtoMapper.cs | 2 +- 15 files changed, 37 insertions(+), 36 deletions(-) diff --git a/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo.Abp.Ddd.Application.Contracts.csproj b/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo.Abp.Ddd.Application.Contracts.csproj index ae01d66fd0..891a4b8a33 100644 --- a/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo.Abp.Ddd.Application.Contracts.csproj +++ b/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo.Abp.Ddd.Application.Contracts.csproj @@ -5,6 +5,8 @@ netstandard2.0;netstandard2.1;net7.0 + enable + Nullable Volo.Abp.Ddd.Application.Contracts Volo.Abp.Ddd.Application.Contracts $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Dtos/AuditedEntityWithUserDto.cs b/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Dtos/AuditedEntityWithUserDto.cs index 992abc68fe..dfdbb10590 100644 --- a/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Dtos/AuditedEntityWithUserDto.cs +++ b/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Dtos/AuditedEntityWithUserDto.cs @@ -12,10 +12,10 @@ namespace Volo.Abp.Application.Dtos; public abstract class AuditedEntityWithUserDto : AuditedEntityDto, IAuditedObject { /// - public TUserDto Creator { get; set; } + public TUserDto? Creator { get; set; } /// - public TUserDto LastModifier { get; set; } + public TUserDto? LastModifier { get; set; } } /// @@ -28,8 +28,8 @@ public abstract class AuditedEntityWithUserDto : AuditedEntityDto, IAu public abstract class AuditedEntityWithUserDto : AuditedEntityDto, IAuditedObject { /// - public TUserDto Creator { get; set; } + public TUserDto? Creator { get; set; } /// - public TUserDto LastModifier { get; set; } + public TUserDto? LastModifier { get; set; } } diff --git a/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Dtos/CreationAuditedEntityWithUserDto.cs b/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Dtos/CreationAuditedEntityWithUserDto.cs index e566e8852b..241944bb69 100644 --- a/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Dtos/CreationAuditedEntityWithUserDto.cs +++ b/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Dtos/CreationAuditedEntityWithUserDto.cs @@ -11,7 +11,7 @@ namespace Volo.Abp.Application.Dtos; [Serializable] public abstract class CreationAuditedEntityWithUserDto : CreationAuditedEntityDto, ICreationAuditedObject { - public TUserDto Creator { get; set; } + public TUserDto? Creator { get; set; } } /// @@ -23,5 +23,5 @@ public abstract class CreationAuditedEntityWithUserDto : CreationAudit [Serializable] public abstract class CreationAuditedEntityWithUserDto : CreationAuditedEntityDto, ICreationAuditedObject { - public TUserDto Creator { get; set; } + public TUserDto? Creator { get; set; } } diff --git a/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Dtos/EntityDto.cs b/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Dtos/EntityDto.cs index a205549695..656e63b0d5 100644 --- a/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Dtos/EntityDto.cs +++ b/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Dtos/EntityDto.cs @@ -17,7 +17,7 @@ public abstract class EntityDto : EntityDto, IEntityDto /// /// Id of the entity. /// - public TKey Id { get; set; } + public TKey Id { get; set; } = default!; public override string ToString() { diff --git a/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Dtos/ExtensibleAuditedEntityWithUserDto.cs b/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Dtos/ExtensibleAuditedEntityWithUserDto.cs index 5f6fd28628..212dcfd807 100644 --- a/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Dtos/ExtensibleAuditedEntityWithUserDto.cs +++ b/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Dtos/ExtensibleAuditedEntityWithUserDto.cs @@ -15,10 +15,10 @@ namespace Volo.Abp.Application.Dtos; public abstract class ExtensibleAuditedEntityWithUserDto : ExtensibleAuditedEntityDto, IAuditedObject { /// - public TUserDto Creator { get; set; } + public TUserDto? Creator { get; set; } /// - public TUserDto LastModifier { get; set; } + public TUserDto? LastModifier { get; set; } protected ExtensibleAuditedEntityWithUserDto() : this(true) @@ -44,10 +44,10 @@ public abstract class ExtensibleAuditedEntityWithUserDto : ExtensibleA IAuditedObject { /// - public TUserDto Creator { get; set; } + public TUserDto? Creator { get; set; } /// - public TUserDto LastModifier { get; set; } + public TUserDto? LastModifier { get; set; } protected ExtensibleAuditedEntityWithUserDto() : this(true) diff --git a/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Dtos/ExtensibleCreationAuditedEntityWithUserDto.cs b/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Dtos/ExtensibleCreationAuditedEntityWithUserDto.cs index 3ea1be97ab..21677718cb 100644 --- a/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Dtos/ExtensibleCreationAuditedEntityWithUserDto.cs +++ b/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Dtos/ExtensibleCreationAuditedEntityWithUserDto.cs @@ -14,7 +14,7 @@ namespace Volo.Abp.Application.Dtos; [Serializable] public abstract class ExtensibleCreationAuditedEntityWithUserDto : ExtensibleCreationAuditedEntityDto, ICreationAuditedObject { - public TUserDto Creator { get; set; } + public TUserDto? Creator { get; set; } protected ExtensibleCreationAuditedEntityWithUserDto() : this(true) @@ -39,7 +39,7 @@ public abstract class ExtensibleCreationAuditedEntityWithUserDto : ExtensibleCreationAuditedEntityDto, ICreationAuditedObject { - public TUserDto Creator { get; set; } + public TUserDto? Creator { get; set; } protected ExtensibleCreationAuditedEntityWithUserDto() : this(true) diff --git a/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Dtos/ExtensibleEntityDto.cs b/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Dtos/ExtensibleEntityDto.cs index 1af46a3287..9687af0cf7 100644 --- a/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Dtos/ExtensibleEntityDto.cs +++ b/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Dtos/ExtensibleEntityDto.cs @@ -9,7 +9,7 @@ public abstract class ExtensibleEntityDto : ExtensibleObject, IEntityDto /// Id of the entity. /// - public TKey Id { get; set; } + public TKey Id { get; set; } = default!; protected ExtensibleEntityDto() : this(true) diff --git a/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Dtos/ExtensibleFullAuditedEntityWithUserDto.cs b/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Dtos/ExtensibleFullAuditedEntityWithUserDto.cs index 018a84cd7a..9793774a47 100644 --- a/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Dtos/ExtensibleFullAuditedEntityWithUserDto.cs +++ b/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Dtos/ExtensibleFullAuditedEntityWithUserDto.cs @@ -15,13 +15,13 @@ namespace Volo.Abp.Application.Dtos; public abstract class ExtensibleFullAuditedEntityWithUserDto : ExtensibleFullAuditedEntityDto, IFullAuditedObject { /// - public TUserDto Creator { get; set; } + public TUserDto? Creator { get; set; } /// - public TUserDto LastModifier { get; set; } + public TUserDto? LastModifier { get; set; } /// - public TUserDto Deleter { get; set; } + public TUserDto? Deleter { get; set; } protected ExtensibleFullAuditedEntityWithUserDto() : this(true) @@ -47,13 +47,13 @@ public abstract class ExtensibleFullAuditedEntityWithUserDto : Extensi IFullAuditedObject { /// - public TUserDto Creator { get; set; } + public TUserDto? Creator { get; set; } /// - public TUserDto LastModifier { get; set; } + public TUserDto? LastModifier { get; set; } /// - public TUserDto Deleter { get; set; } + public TUserDto? Deleter { get; set; } protected ExtensibleFullAuditedEntityWithUserDto() : this(true) diff --git a/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Dtos/FullAuditedEntityWithUserDto.cs b/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Dtos/FullAuditedEntityWithUserDto.cs index 0575c348b4..c9941d9127 100644 --- a/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Dtos/FullAuditedEntityWithUserDto.cs +++ b/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Dtos/FullAuditedEntityWithUserDto.cs @@ -12,13 +12,13 @@ namespace Volo.Abp.Application.Dtos; public abstract class FullAuditedEntityWithUserDto : FullAuditedEntityDto, IFullAuditedObject { /// - public TUserDto Creator { get; set; } + public TUserDto? Creator { get; set; } /// - public TUserDto LastModifier { get; set; } + public TUserDto? LastModifier { get; set; } /// - public TUserDto Deleter { get; set; } + public TUserDto? Deleter { get; set; } } /// @@ -31,11 +31,11 @@ public abstract class FullAuditedEntityWithUserDto : FullAuditedEntity public abstract class FullAuditedEntityWithUserDto : FullAuditedEntityDto, IFullAuditedObject { /// - public TUserDto Creator { get; set; } + public TUserDto? Creator { get; set; } /// - public TUserDto LastModifier { get; set; } + public TUserDto? LastModifier { get; set; } /// - public TUserDto Deleter { get; set; } + public TUserDto? Deleter { get; set; } } diff --git a/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Dtos/ISortedResultRequest.cs b/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Dtos/ISortedResultRequest.cs index 0f0a4fe90f..b27c3bf99d 100644 --- a/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Dtos/ISortedResultRequest.cs +++ b/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Dtos/ISortedResultRequest.cs @@ -16,5 +16,5 @@ public interface ISortedResultRequest /// "Name DESC" /// "Name ASC, Age DESC" /// - string Sorting { get; set; } + string? Sorting { get; set; } } diff --git a/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Dtos/LimitedResultRequestDto.cs b/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Dtos/LimitedResultRequestDto.cs index d72f7b0a77..646eb4d45e 100644 --- a/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Dtos/LimitedResultRequestDto.cs +++ b/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Dtos/LimitedResultRequestDto.cs @@ -42,7 +42,7 @@ public class LimitedResultRequestDto : ILimitedResultRequest, IValidatableObject "MaxResultCountExceededExceptionMessage", nameof(MaxResultCount), MaxMaxResultCount, - typeof(LimitedResultRequestDto).FullName, + typeof(LimitedResultRequestDto).FullName!, nameof(MaxMaxResultCount) ], new[] { nameof(MaxResultCount) }); @@ -90,7 +90,7 @@ public class ExtensibleLimitedResultRequestDto : ExtensibleEntityDto, ILimitedRe "MaxResultCountExceededExceptionMessage", nameof(MaxResultCount), MaxMaxResultCount, - typeof(ExtensibleLimitedResultRequestDto).FullName, + typeof(ExtensibleLimitedResultRequestDto).FullName!, nameof(MaxMaxResultCount) ], new[] { nameof(MaxResultCount) }); diff --git a/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Dtos/ListResultDto.cs b/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Dtos/ListResultDto.cs index 361b27faac..56937e7049 100644 --- a/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Dtos/ListResultDto.cs +++ b/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Dtos/ListResultDto.cs @@ -13,7 +13,7 @@ public class ListResultDto : IListResult get { return _items ?? (_items = new List()); } set { _items = value; } } - private IReadOnlyList _items; + private IReadOnlyList? _items; /// /// Creates a new object. @@ -42,7 +42,7 @@ public class ExtensibleListResultDto : ExtensibleObject, IListResult get { return _items ?? (_items = new List()); } set { _items = value; } } - private IReadOnlyList _items; + private IReadOnlyList? _items; /// /// Creates a new object. diff --git a/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Dtos/PagedAndSortedResultRequestDto.cs b/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Dtos/PagedAndSortedResultRequestDto.cs index 229178adbf..8a9b62bb60 100644 --- a/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Dtos/PagedAndSortedResultRequestDto.cs +++ b/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Dtos/PagedAndSortedResultRequestDto.cs @@ -8,7 +8,7 @@ namespace Volo.Abp.Application.Dtos; [Serializable] public class PagedAndSortedResultRequestDto : PagedResultRequestDto, IPagedAndSortedResultRequest { - public virtual string Sorting { get; set; } + public virtual string? Sorting { get; set; } } /// @@ -17,5 +17,5 @@ public class PagedAndSortedResultRequestDto : PagedResultRequestDto, IPagedAndSo [Serializable] public class ExtensiblePagedAndSortedResultRequestDto : ExtensiblePagedResultRequestDto, IPagedAndSortedResultRequest { - public virtual string Sorting { get; set; } + public virtual string? Sorting { get; set; } } diff --git a/framework/src/Volo.Abp.Ddd.Domain.Shared/Volo/Abp/Domain/Entities/Events/Distributed/IEntityToEtoMapper.cs b/framework/src/Volo.Abp.Ddd.Domain.Shared/Volo/Abp/Domain/Entities/Events/Distributed/IEntityToEtoMapper.cs index 6f0ea7a880..67406fd0d4 100644 --- a/framework/src/Volo.Abp.Ddd.Domain.Shared/Volo/Abp/Domain/Entities/Events/Distributed/IEntityToEtoMapper.cs +++ b/framework/src/Volo.Abp.Ddd.Domain.Shared/Volo/Abp/Domain/Entities/Events/Distributed/IEntityToEtoMapper.cs @@ -4,6 +4,5 @@ namespace Volo.Abp.Domain.Entities.Events.Distributed; public interface IEntityToEtoMapper { - [CanBeNull] - object Map(object entityObj); + object? Map(object entityObj); } diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/Distributed/EntityToEtoMapper.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/Distributed/EntityToEtoMapper.cs index 1710fe81e3..cab3fe4614 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/Distributed/EntityToEtoMapper.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/Distributed/EntityToEtoMapper.cs @@ -36,7 +36,7 @@ public class EntityToEtoMapper : IEntityToEtoMapper, ITransientDependency if (etoMappingItem == null) { var keys = entity.GetKeys().JoinAsString(","); - return new EntityEto(entityType.FullName, keys); + return new EntityEto(entityType.FullName!, keys); } using (var scope = HybridServiceScopeFactory.CreateScope()) From c19c22e995ccd316004e047b4e58af6697caf523 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Mon, 7 Aug 2023 14:58:35 +0800 Subject: [PATCH 39/58] Enable nullable annotations for Volo.Abp.Application --- .../Volo.Abp.Ddd.Application.csproj | 2 ++ .../Services/AbstractKeyCrudAppService.cs | 6 +++--- .../Services/AbstractKeyReadOnlyAppService.cs | 6 +++--- .../Services/ApplicationService.cs | 20 +++++++++---------- 4 files changed, 18 insertions(+), 16 deletions(-) diff --git a/framework/src/Volo.Abp.Ddd.Application/Volo.Abp.Ddd.Application.csproj b/framework/src/Volo.Abp.Ddd.Application/Volo.Abp.Ddd.Application.csproj index fc0586ce8e..03351adb7f 100644 --- a/framework/src/Volo.Abp.Ddd.Application/Volo.Abp.Ddd.Application.csproj +++ b/framework/src/Volo.Abp.Ddd.Application/Volo.Abp.Ddd.Application.csproj @@ -5,6 +5,8 @@ netstandard2.0;netstandard2.1;net7.0 + enable + Nullable Volo.Abp.Ddd.Application Volo.Abp.Ddd.Application $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/AbstractKeyCrudAppService.cs b/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/AbstractKeyCrudAppService.cs index 6b6ad975d7..b3a2af6663 100644 --- a/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/AbstractKeyCrudAppService.cs +++ b/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/AbstractKeyCrudAppService.cs @@ -70,11 +70,11 @@ public abstract class AbstractKeyCrudAppService Repository { get; } - protected virtual string CreatePolicyName { get; set; } + protected virtual string? CreatePolicyName { get; set; } - protected virtual string UpdatePolicyName { get; set; } + protected virtual string? UpdatePolicyName { get; set; } - protected virtual string DeletePolicyName { get; set; } + protected virtual string? DeletePolicyName { get; set; } protected AbstractKeyCrudAppService(IRepository repository) : base(repository) diff --git a/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/AbstractKeyReadOnlyAppService.cs b/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/AbstractKeyReadOnlyAppService.cs index e56e3ff042..8602792701 100644 --- a/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/AbstractKeyReadOnlyAppService.cs +++ b/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/AbstractKeyReadOnlyAppService.cs @@ -40,9 +40,9 @@ public abstract class AbstractKeyReadOnlyAppService ReadOnlyRepository { get; } - protected virtual string GetPolicyName { get; set; } + protected virtual string? GetPolicyName { get; set; } - protected virtual string GetListPolicyName { get; set; } + protected virtual string? GetListPolicyName { get; set; } protected AbstractKeyReadOnlyAppService(IReadOnlyRepository repository) { @@ -107,7 +107,7 @@ public abstract class AbstractKeyReadOnlyAppService LazyServiceProvider.LazyGetRequiredService(); - protected Type ObjectMapperContext { get; set; } + protected Type? ObjectMapperContext { get; set; } protected IObjectMapper ObjectMapper => LazyServiceProvider.LazyGetService(provider => ObjectMapperContext == null ? provider.GetRequiredService() @@ -85,34 +85,34 @@ public abstract class ApplicationService : return _localizer; } } - private IStringLocalizer _localizer; + private IStringLocalizer? _localizer; - protected Type LocalizationResource { + protected Type? LocalizationResource { get => _localizationResource; set { _localizationResource = value; _localizer = null; } } - private Type _localizationResource = typeof(DefaultResource); + private Type? _localizationResource = typeof(DefaultResource); - protected IUnitOfWork CurrentUnitOfWork => UnitOfWorkManager?.Current; + protected IUnitOfWork? CurrentUnitOfWork => UnitOfWorkManager?.Current; - protected ILogger Logger => LazyServiceProvider.LazyGetService(provider => LoggerFactory?.CreateLogger(GetType().FullName) ?? NullLogger.Instance); + protected ILogger Logger => LazyServiceProvider.LazyGetService(provider => LoggerFactory?.CreateLogger(GetType().FullName!) ?? NullLogger.Instance); /// /// Checks for given . /// Throws if given policy has not been granted. /// /// The policy name. This method does nothing if given is null or empty. - protected virtual async Task CheckPolicyAsync([CanBeNull] string policyName) + protected virtual async Task CheckPolicyAsync(string? policyName) { if (string.IsNullOrEmpty(policyName)) { return; } - await AuthorizationService.CheckAsync(policyName); + await AuthorizationService.CheckAsync(policyName!); } protected virtual IStringLocalizer CreateLocalizer() From 29f5b89114a2a4a235474e36ecdcea1df9a1ea69 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Mon, 7 Aug 2023 15:06:26 +0800 Subject: [PATCH 40/58] Enable nullable annotations for Volo.Abp.Dapr --- framework/src/Volo.Abp.Dapr/Volo.Abp.Dapr.csproj | 2 ++ .../Volo.Abp.Dapr/Volo/Abp/Dapr/AbpDaprClientFactory.cs | 8 ++++---- .../src/Volo.Abp.Dapr/Volo/Abp/Dapr/AbpDaprModule.cs | 8 ++++---- .../src/Volo.Abp.Dapr/Volo/Abp/Dapr/AbpDaprOptions.cs | 8 ++++---- .../Volo.Abp.Dapr/Volo/Abp/Dapr/DaprApiTokenProvider.cs | 4 ++-- .../Volo.Abp.Dapr/Volo/Abp/Dapr/IAbpDaprClientFactory.cs | 8 ++++---- .../Volo.Abp.Dapr/Volo/Abp/Dapr/IDaprApiTokenProvider.cs | 4 ++-- 7 files changed, 22 insertions(+), 20 deletions(-) diff --git a/framework/src/Volo.Abp.Dapr/Volo.Abp.Dapr.csproj b/framework/src/Volo.Abp.Dapr/Volo.Abp.Dapr.csproj index f21af371bb..1b952e34cc 100644 --- a/framework/src/Volo.Abp.Dapr/Volo.Abp.Dapr.csproj +++ b/framework/src/Volo.Abp.Dapr/Volo.Abp.Dapr.csproj @@ -5,6 +5,8 @@ net7.0 + enable + Nullable diff --git a/framework/src/Volo.Abp.Dapr/Volo/Abp/Dapr/AbpDaprClientFactory.cs b/framework/src/Volo.Abp.Dapr/Volo/Abp/Dapr/AbpDaprClientFactory.cs index aa14bbe7f2..43e9dbc953 100644 --- a/framework/src/Volo.Abp.Dapr/Volo/Abp/Dapr/AbpDaprClientFactory.cs +++ b/framework/src/Volo.Abp.Dapr/Volo/Abp/Dapr/AbpDaprClientFactory.cs @@ -24,7 +24,7 @@ public class AbpDaprClientFactory : IAbpDaprClientFactory, ISingletonDependency JsonSerializerOptions = CreateJsonSerializerOptions(systemTextJsonSerializerOptions.Value); } - public virtual DaprClient Create(Action builderAction = null) + public virtual DaprClient Create(Action? builderAction = null) { var builder = new DaprClientBuilder() .UseJsonSerializationOptions(JsonSerializerOptions); @@ -51,9 +51,9 @@ public class AbpDaprClientFactory : IAbpDaprClientFactory, ISingletonDependency } public virtual HttpClient CreateHttpClient( - string appId = null, - string daprEndpoint = null, - string daprApiToken = null) + string? appId = null, + string? daprEndpoint = null, + string? daprApiToken = null) { if(daprEndpoint.IsNullOrWhiteSpace() && !DaprOptions.HttpEndpoint.IsNullOrWhiteSpace()) diff --git a/framework/src/Volo.Abp.Dapr/Volo/Abp/Dapr/AbpDaprModule.cs b/framework/src/Volo.Abp.Dapr/Volo/Abp/Dapr/AbpDaprModule.cs index 4153ae2ec1..e1ca4bb0db 100644 --- a/framework/src/Volo.Abp.Dapr/Volo/Abp/Dapr/AbpDaprModule.cs +++ b/framework/src/Volo.Abp.Dapr/Volo/Abp/Dapr/AbpDaprModule.cs @@ -33,14 +33,14 @@ public class AbpDaprModule : AbpModule var confEnv = configuration["DAPR_API_TOKEN"]; if (!confEnv.IsNullOrWhiteSpace()) { - options.DaprApiToken = confEnv; + options.DaprApiToken = confEnv!; } else { var env = Environment.GetEnvironmentVariable("DAPR_API_TOKEN"); if (!env.IsNullOrWhiteSpace()) { - options.DaprApiToken = env; + options.DaprApiToken = env!; } } } @@ -50,14 +50,14 @@ public class AbpDaprModule : AbpModule var confEnv = configuration["APP_API_TOKEN"]; if (!confEnv.IsNullOrWhiteSpace()) { - options.AppApiToken = confEnv; + options.AppApiToken = confEnv!; } else { var env = Environment.GetEnvironmentVariable("APP_API_TOKEN"); if (!env.IsNullOrWhiteSpace()) { - options.AppApiToken = env; + options.AppApiToken = env!; } } } diff --git a/framework/src/Volo.Abp.Dapr/Volo/Abp/Dapr/AbpDaprOptions.cs b/framework/src/Volo.Abp.Dapr/Volo/Abp/Dapr/AbpDaprOptions.cs index 7ac19ad31c..f436f35147 100644 --- a/framework/src/Volo.Abp.Dapr/Volo/Abp/Dapr/AbpDaprOptions.cs +++ b/framework/src/Volo.Abp.Dapr/Volo/Abp/Dapr/AbpDaprOptions.cs @@ -2,11 +2,11 @@ public class AbpDaprOptions { - public string HttpEndpoint { get; set; } + public string? HttpEndpoint { get; set; } - public string GrpcEndpoint { get; set; } + public string? GrpcEndpoint { get; set; } - public string DaprApiToken { get; set; } + public string? DaprApiToken { get; set; } - public string AppApiToken { get; set; } + public string? AppApiToken { get; set; } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.Dapr/Volo/Abp/Dapr/DaprApiTokenProvider.cs b/framework/src/Volo.Abp.Dapr/Volo/Abp/Dapr/DaprApiTokenProvider.cs index 10dd3913ed..c38f36bf10 100644 --- a/framework/src/Volo.Abp.Dapr/Volo/Abp/Dapr/DaprApiTokenProvider.cs +++ b/framework/src/Volo.Abp.Dapr/Volo/Abp/Dapr/DaprApiTokenProvider.cs @@ -12,12 +12,12 @@ public class DaprApiTokenProvider : IDaprApiTokenProvider, ISingletonDependency Options = options.Value; } - public virtual string GetDaprApiToken() + public virtual string? GetDaprApiToken() { return Options.DaprApiToken; } - public virtual string GetAppApiToken() + public virtual string? GetAppApiToken() { return Options.AppApiToken; } diff --git a/framework/src/Volo.Abp.Dapr/Volo/Abp/Dapr/IAbpDaprClientFactory.cs b/framework/src/Volo.Abp.Dapr/Volo/Abp/Dapr/IAbpDaprClientFactory.cs index 65c4e76b7e..bbf074af6c 100644 --- a/framework/src/Volo.Abp.Dapr/Volo/Abp/Dapr/IAbpDaprClientFactory.cs +++ b/framework/src/Volo.Abp.Dapr/Volo/Abp/Dapr/IAbpDaprClientFactory.cs @@ -6,11 +6,11 @@ namespace Volo.Abp.Dapr; public interface IAbpDaprClientFactory { - DaprClient Create(Action builderAction = null); + DaprClient Create(Action? builderAction = null); HttpClient CreateHttpClient( - string appId = null, - string daprEndpoint = null, - string daprApiToken = null + string? appId = null, + string? daprEndpoint = null, + string? daprApiToken = null ); } diff --git a/framework/src/Volo.Abp.Dapr/Volo/Abp/Dapr/IDaprApiTokenProvider.cs b/framework/src/Volo.Abp.Dapr/Volo/Abp/Dapr/IDaprApiTokenProvider.cs index 60f2195596..5e153ba2ea 100644 --- a/framework/src/Volo.Abp.Dapr/Volo/Abp/Dapr/IDaprApiTokenProvider.cs +++ b/framework/src/Volo.Abp.Dapr/Volo/Abp/Dapr/IDaprApiTokenProvider.cs @@ -2,7 +2,7 @@ namespace Volo.Abp.Dapr; public interface IDaprApiTokenProvider { - string GetDaprApiToken(); + string? GetDaprApiToken(); - string GetAppApiToken(); + string? GetAppApiToken(); } From 734c72f7f7b0171319a684dc5a91f4f94dfe6c5a Mon Sep 17 00:00:00 2001 From: Engincan VESKE <43685404+EngincanV@users.noreply.github.com> Date: Mon, 7 Aug 2023 10:22:20 +0300 Subject: [PATCH 41/58] Docs: Fix duplicate document results in search --- .../FullSearch/Elastic/ElasticDocumentFullSearch.cs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/FullSearch/Elastic/ElasticDocumentFullSearch.cs b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/FullSearch/Elastic/ElasticDocumentFullSearch.cs index e5f8401b20..30ebf9a96f 100644 --- a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/FullSearch/Elastic/ElasticDocumentFullSearch.cs +++ b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/FullSearch/Elastic/ElasticDocumentFullSearch.cs @@ -204,11 +204,18 @@ namespace Volo.Docs.Documents.FullSearch.Elastic foreach (var hit in response.Hits) { var doc = hit.Source; + if(docs.Any(x => x.Id == doc.Id)) + { + continue; + } + + if (hit.Highlight.ContainsKey("content")) { doc.Highlight = new List(); doc.Highlight.AddRange(hit.Highlight["content"]); } + docs.Add(doc); } From 1ee1f1b12b7608bd05ac0a4f4b25457c941c6508 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Mon, 7 Aug 2023 15:23:11 +0800 Subject: [PATCH 42/58] Enable nullable annotations for Volo.Abp.DistributedLocking.Abstractions --- .../Volo.Abp.DistributedLocking.Abstractions.csproj | 2 ++ .../Volo/Abp/DistributedLocking/IAbpDistributedLock.cs | 3 +-- .../Volo/Abp/DistributedLocking/LocalAbpDistributedLock.cs | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/framework/src/Volo.Abp.DistributedLocking.Abstractions/Volo.Abp.DistributedLocking.Abstractions.csproj b/framework/src/Volo.Abp.DistributedLocking.Abstractions/Volo.Abp.DistributedLocking.Abstractions.csproj index 7e01d295e7..e53f5b718c 100644 --- a/framework/src/Volo.Abp.DistributedLocking.Abstractions/Volo.Abp.DistributedLocking.Abstractions.csproj +++ b/framework/src/Volo.Abp.DistributedLocking.Abstractions/Volo.Abp.DistributedLocking.Abstractions.csproj @@ -5,6 +5,8 @@ netstandard2.0;netstandard2.1;net7.0 + enable + Nullable Volo.Abp.DistributedLocking.Abstractions Volo.Abp.DistributedLocking.Abstractions $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/framework/src/Volo.Abp.DistributedLocking.Abstractions/Volo/Abp/DistributedLocking/IAbpDistributedLock.cs b/framework/src/Volo.Abp.DistributedLocking.Abstractions/Volo/Abp/DistributedLocking/IAbpDistributedLock.cs index 754ae807f8..1d1b5e01db 100644 --- a/framework/src/Volo.Abp.DistributedLocking.Abstractions/Volo/Abp/DistributedLocking/IAbpDistributedLock.cs +++ b/framework/src/Volo.Abp.DistributedLocking.Abstractions/Volo/Abp/DistributedLocking/IAbpDistributedLock.cs @@ -16,8 +16,7 @@ public interface IAbpDistributedLock /// The name of the lock /// How long to wait before giving up on the acquisition attempt. Defaults to 0 /// Cancellation token - [ItemCanBeNull] - Task TryAcquireAsync( + Task TryAcquireAsync( [NotNull] string name, TimeSpan timeout = default, CancellationToken cancellationToken = default diff --git a/framework/src/Volo.Abp.DistributedLocking.Abstractions/Volo/Abp/DistributedLocking/LocalAbpDistributedLock.cs b/framework/src/Volo.Abp.DistributedLocking.Abstractions/Volo/Abp/DistributedLocking/LocalAbpDistributedLock.cs index 490f024d36..58d67e1caf 100644 --- a/framework/src/Volo.Abp.DistributedLocking.Abstractions/Volo/Abp/DistributedLocking/LocalAbpDistributedLock.cs +++ b/framework/src/Volo.Abp.DistributedLocking.Abstractions/Volo/Abp/DistributedLocking/LocalAbpDistributedLock.cs @@ -22,7 +22,7 @@ public class LocalAbpDistributedLock : IAbpDistributedLock, ISingletonDependency } [MethodImpl(MethodImplOptions.AggressiveInlining)] - public async Task TryAcquireAsync( + public async Task TryAcquireAsync( string name, TimeSpan timeout = default, CancellationToken cancellationToken = default) From 86e36cc7bd6ddba2b4d2fde30419e1ba74bf61d8 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Mon, 7 Aug 2023 15:25:42 +0800 Subject: [PATCH 43/58] Enable nullable annotations for Volo.Abp.DistributedLocking --- .../Volo.Abp.DistributedLocking.csproj | 2 ++ .../Volo/Abp/DistributedLocking/MedallionAbpDistributedLock.cs | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.DistributedLocking/Volo.Abp.DistributedLocking.csproj b/framework/src/Volo.Abp.DistributedLocking/Volo.Abp.DistributedLocking.csproj index ae9f960917..8abd0873bd 100644 --- a/framework/src/Volo.Abp.DistributedLocking/Volo.Abp.DistributedLocking.csproj +++ b/framework/src/Volo.Abp.DistributedLocking/Volo.Abp.DistributedLocking.csproj @@ -5,6 +5,8 @@ netstandard2.0;netstandard2.1;net7.0 + enable + Nullable Volo.Abp.DistributedLocking Volo.Abp.DistributedLocking $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/framework/src/Volo.Abp.DistributedLocking/Volo/Abp/DistributedLocking/MedallionAbpDistributedLock.cs b/framework/src/Volo.Abp.DistributedLocking/Volo/Abp/DistributedLocking/MedallionAbpDistributedLock.cs index 0defc5a75f..2d9d07b45a 100644 --- a/framework/src/Volo.Abp.DistributedLocking/Volo/Abp/DistributedLocking/MedallionAbpDistributedLock.cs +++ b/framework/src/Volo.Abp.DistributedLocking/Volo/Abp/DistributedLocking/MedallionAbpDistributedLock.cs @@ -25,7 +25,7 @@ public class MedallionAbpDistributedLock : IAbpDistributedLock, ITransientDepend DistributedLockKeyNormalizer = distributedLockKeyNormalizer; } - public async Task TryAcquireAsync( + public async Task TryAcquireAsync( string name, TimeSpan timeout = default, CancellationToken cancellationToken = default) From 3e3d6402daa84e136ae70fca3d3ef4b60ba080ea Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Mon, 7 Aug 2023 15:30:04 +0800 Subject: [PATCH 44/58] Enable nullable annotations for Volo.Abp.DistributedLocking.Dapr --- .../Volo.Abp.DistributedLocking.Dapr.csproj | 2 ++ .../DistributedLocking/Dapr/AbpDistributedLockDaprOptions.cs | 2 +- .../Volo/Abp/DistributedLocking/Dapr/DaprAbpDistributedLock.cs | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/framework/src/Volo.Abp.DistributedLocking.Dapr/Volo.Abp.DistributedLocking.Dapr.csproj b/framework/src/Volo.Abp.DistributedLocking.Dapr/Volo.Abp.DistributedLocking.Dapr.csproj index 79d39eedf0..a0ddaac22e 100644 --- a/framework/src/Volo.Abp.DistributedLocking.Dapr/Volo.Abp.DistributedLocking.Dapr.csproj +++ b/framework/src/Volo.Abp.DistributedLocking.Dapr/Volo.Abp.DistributedLocking.Dapr.csproj @@ -5,6 +5,8 @@ net7.0 + enable + Nullable diff --git a/framework/src/Volo.Abp.DistributedLocking.Dapr/Volo/Abp/DistributedLocking/Dapr/AbpDistributedLockDaprOptions.cs b/framework/src/Volo.Abp.DistributedLocking.Dapr/Volo/Abp/DistributedLocking/Dapr/AbpDistributedLockDaprOptions.cs index a51ed8ede7..b4572441d3 100644 --- a/framework/src/Volo.Abp.DistributedLocking.Dapr/Volo/Abp/DistributedLocking/Dapr/AbpDistributedLockDaprOptions.cs +++ b/framework/src/Volo.Abp.DistributedLocking.Dapr/Volo/Abp/DistributedLocking/Dapr/AbpDistributedLockDaprOptions.cs @@ -4,7 +4,7 @@ namespace Volo.Abp.DistributedLocking.Dapr; public class AbpDistributedLockDaprOptions { - public string StoreName { get; set; } + public string StoreName { get; set; } = default!; public string? Owner { get; set; } diff --git a/framework/src/Volo.Abp.DistributedLocking.Dapr/Volo/Abp/DistributedLocking/Dapr/DaprAbpDistributedLock.cs b/framework/src/Volo.Abp.DistributedLocking.Dapr/Volo/Abp/DistributedLocking/Dapr/DaprAbpDistributedLock.cs index 974c6461a6..100fece989 100644 --- a/framework/src/Volo.Abp.DistributedLocking.Dapr/Volo/Abp/DistributedLocking/Dapr/DaprAbpDistributedLock.cs +++ b/framework/src/Volo.Abp.DistributedLocking.Dapr/Volo/Abp/DistributedLocking/Dapr/DaprAbpDistributedLock.cs @@ -24,7 +24,7 @@ public class DaprAbpDistributedLock : IAbpDistributedLock, ITransientDependency DistributedLockDaprOptions = distributedLockDaprOptions.Value; } - public async Task TryAcquireAsync( + public async Task TryAcquireAsync( string name, TimeSpan timeout = default, CancellationToken cancellationToken = default) From b1ee15dd590b7a024c8a02923d5ab89cccacf795 Mon Sep 17 00:00:00 2001 From: Engincan VESKE Date: Mon, 7 Aug 2023 10:33:53 +0300 Subject: [PATCH 45/58] Update Docs module documentation for installation step --- docs/en/Modules/Docs.md | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/docs/en/Modules/Docs.md b/docs/en/Modules/Docs.md index 143ec7168d..58dd811397 100644 --- a/docs/en/Modules/Docs.md +++ b/docs/en/Modules/Docs.md @@ -22,22 +22,16 @@ When you use GitHub to store your docs, Docs Module supports versioning. If you ## Installation -### 1- Download +This document covers `Entity Framework Core` provider but you can also select `MongoDB` as your database provider. -If you do not have an existing ABP project, this step shows you how to create a new project from [abp.io](https://abp.io) to add the Docs Module. If you already have an ABP project, you can skip this step. +### 1- Creating an application -It is recommended to use ABP CLI to create new projects. Use the following command: +If you do not have an existing ABP project, you can either [generate a CLI command from the get started page of the abp.io website](https://abp.io/get-started) and runs it or run the command below: ```bash abp new Acme.MyProject ``` -You can also generate a CLI command from [get started page](https://abp.io/get-started). Enter your project name as `Acme.MyProject`, other use default options. - -Note that this document covers `Entity Framework Core` provider but you can also select `MongoDB` as your database provider. - -![Create new project](../images/docs-module_download-new-abp-project.png) - ### 2- Running The Empty Application After you download the project, extract the ZIP file and open `Acme.MyProject.sln`. You will see that the solution consists of `Application`, `Application.Contracts`, `DbMigrator`, `Domain`, `Domain.Shared`, `EntityFrameworkCore`, `HttpApi`, `HttpApi.Client` and `Web` projects. Right click on `Acme.MyProject.Web` project and **Set as StartUp Project**. From 1f630ebcd070dc046b835e085768b4d1a7054a00 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Mon, 7 Aug 2023 15:56:28 +0800 Subject: [PATCH 46/58] CmsKit Add missing field --- .../Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/Update.cshtml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/Update.cshtml b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/Update.cshtml index b9bae20f40..673c402c2c 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/Update.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/Update.cshtml @@ -74,7 +74,8 @@
-
+ + From b67a0e62d06d989172d795563dc6ed47ff28bbb5 Mon Sep 17 00:00:00 2001 From: Enis Necipoglu Date: Mon, 7 Aug 2023 18:06:33 +0300 Subject: [PATCH 50/58] Article - Adding Dark Mode Support to the Basic Theme --- .../2023-08-07-Basic-Theme-Dark-Mode/POST.md | 125 ++++++++++++++++++ .../basictheme-dark-login.png | Bin 0 -> 28676 bytes .../basictheme-dark-settings.png | Bin 0 -> 33538 bytes .../basictheme-dark-users.png | Bin 0 -> 27124 bytes .../basictheme-toggle-demo.gif | Bin 0 -> 193440 bytes 5 files changed, 125 insertions(+) create mode 100644 docs/en/Community-Articles/2023-08-07-Basic-Theme-Dark-Mode/POST.md create mode 100644 docs/en/Community-Articles/2023-08-07-Basic-Theme-Dark-Mode/basictheme-dark-login.png create mode 100644 docs/en/Community-Articles/2023-08-07-Basic-Theme-Dark-Mode/basictheme-dark-settings.png create mode 100644 docs/en/Community-Articles/2023-08-07-Basic-Theme-Dark-Mode/basictheme-dark-users.png create mode 100644 docs/en/Community-Articles/2023-08-07-Basic-Theme-Dark-Mode/basictheme-toggle-demo.gif diff --git a/docs/en/Community-Articles/2023-08-07-Basic-Theme-Dark-Mode/POST.md b/docs/en/Community-Articles/2023-08-07-Basic-Theme-Dark-Mode/POST.md new file mode 100644 index 0000000000..f079c71546 --- /dev/null +++ b/docs/en/Community-Articles/2023-08-07-Basic-Theme-Dark-Mode/POST.md @@ -0,0 +1,125 @@ +# Adding Dark Mode Support to the Basic Theme +Basic Theme uses plain bootstrap and does not have any custom colors & styles. This article will show you how to add dark mode support to the Basic Theme. + +Bootstrap brings [Color Modes](https://getbootstrap.com/docs/5.3/customize/color-modes/#dark-mode) feature with the version **5.3**. This feature allows you to add dark mode support to your website with a single line of code. Adding `data-bs-theme="dark"` attribute, changes the color mode of the element to dark mode. + +## Instructions + +1. Create a new project + ```bash + abp new BasicThemeDarkMode -t app --theme basic + ``` + +2. Create a component that toggles the color mode. + + - Create a new file named `Components/ChangeTheme/Default.cshtml` + ```html +
+ +
+ ``` + + - Create a new file named `Components/ChangeTheme/ChangeThemeViewComponent.cs` + ```csharp + using Microsoft.AspNetCore.Mvc; + using Volo.Abp.AspNetCore.Mvc; + + namespace BasicThemeDarkMode.Web.Components.ChangeTheme; + + [Widget(ScriptFiles = new[]{"/Components/ChangeTheme/ChangeTheme.js"})] + public class ChangeThemeViewComponent : AbpViewComponent + { + public IViewComponentResult Invoke() + { + return View("~/Components/ChangeTheme/Default.cshtml"); + } + } + ``` + + - Create a JavaScript that manages last selected theme and toggles the color mode. It stores the last selected theme in the local storage. So, you don't need to store it in the database. + + - Create a new file named `Components/ChangeTheme/ChangeTheme.js` + ```js + $(function () { + function changeTheme(theme) { + window.localStorage.setItem('theme', theme); + document.getElementsByTagName('body')[0].setAttribute('data-bs-theme', theme); + } + + function toggleTheme(){ + getTheme() == 'light' ? changeTheme('dark') : changeTheme('light'); + } + + function getTheme(){ + return window.localStorage.getItem('theme') ?? 'dark'; + } + + function init(){ + let theme = getTheme(); + if(theme){ + changeTheme(theme); + } + } + + document.getElementById('ToolbarChangeTheme').addEventListener('click', () => { + toggleTheme(); + }); + + init(); + }); + ``` + +3. Create a new Toolbar Contributor and add newly created view component to the application toolbar. + + - Create a new class named `BasicThemeDarkModeToolbarContributor.cs` + ```csharp + using BasicThemeDarkMode.Web.Components.ChangeTheme; + using System.Threading.Tasks; + using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Toolbars; + + namespace BasicThemeDarkMode.Web; + + public class BasicThemeDarkModeToolbarContributor : IToolbarContributor + { + public Task ConfigureToolbarAsync(IToolbarConfigurationContext context) + { + if (context.Toolbar.Name == StandardToolbars.Main) + { + context.Toolbar.Items + .Add(new ToolbarItem(typeof(ChangeThemeViewComponent))); + } + + return Task.CompletedTask; + } + } + ``` + + - Configure [Toolbar Options](https://docs.abp.io/en/abp/latest/UI/AspNetCore/Toolbars) and add newly created contributor. + ```csharp + Configure(options => + { + options.Contributors.Add(new BasicThemeDarkModeToolbarContributor()); + }); + ``` + +That's it! Now, you can toggle the color mode by clicking the sun icon in the toolbar. + +![Dark Mode](basictheme-toggle-demo.gif) + +- Users Page in Dark Mode: + + ![Users Page in Dark Mode](basictheme-dark-users.png) + +- Settings Page in Dark Mode: + + ![Settings Page in Dark Mode](basictheme-dark-settings.png) + +- Login Page in Dark Mode: + + ![Login Page in Dark Mode](basictheme-dark-login.png) + +## Conclusion + +The theme is stored in **local storage** and it's initialized in the client-side. You can use **Cookies** to render the page in the last selected theme on **server-side** to prevent the flash effect while navigating pages. This documents show the concept of adding dark mode support of bootstrap to the Basic Theme. \ No newline at end of file diff --git a/docs/en/Community-Articles/2023-08-07-Basic-Theme-Dark-Mode/basictheme-dark-login.png b/docs/en/Community-Articles/2023-08-07-Basic-Theme-Dark-Mode/basictheme-dark-login.png new file mode 100644 index 0000000000000000000000000000000000000000..0ee18b54b96994e6aa54f9f41f68c40cfab84903 GIT binary patch literal 28676 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 literal 0 HcmV?d00001 diff --git a/docs/en/Community-Articles/2023-08-07-Basic-Theme-Dark-Mode/basictheme-dark-settings.png b/docs/en/Community-Articles/2023-08-07-Basic-Theme-Dark-Mode/basictheme-dark-settings.png new file mode 100644 index 0000000000000000000000000000000000000000..6d32677c4cbddd4491f480b11af3faf24c2c2489 GIT binary patch literal 33538 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 aL=yjbGU?e_Q~yf#$T3U&TF&c*;c_hpl$Z~^Uub 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 literal 0 HcmV?d00001 diff --git a/docs/en/Community-Articles/2023-08-07-Basic-Theme-Dark-Mode/basictheme-toggle-demo.gif b/docs/en/Community-Articles/2023-08-07-Basic-Theme-Dark-Mode/basictheme-toggle-demo.gif new file mode 100644 index 0000000000000000000000000000000000000000..536b30e6ee0f2db9a486adb3f9a6726843d6f1a7 GIT binary patch literal 193440 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 literal 0 HcmV?d00001 From 8a16e217ad09a784332060af09b607f4560f5331 Mon Sep 17 00:00:00 2001 From: Engincan VESKE Date: Mon, 7 Aug 2023 20:37:29 +0300 Subject: [PATCH 51/58] Update POST.md --- .../2023-08-07-Basic-Theme-Dark-Mode/POST.md | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/en/Community-Articles/2023-08-07-Basic-Theme-Dark-Mode/POST.md b/docs/en/Community-Articles/2023-08-07-Basic-Theme-Dark-Mode/POST.md index f079c71546..01f17777ad 100644 --- a/docs/en/Community-Articles/2023-08-07-Basic-Theme-Dark-Mode/POST.md +++ b/docs/en/Community-Articles/2023-08-07-Basic-Theme-Dark-Mode/POST.md @@ -1,18 +1,18 @@ # Adding Dark Mode Support to the Basic Theme -Basic Theme uses plain bootstrap and does not have any custom colors & styles. This article will show you how to add dark mode support to the Basic Theme. +Basic Theme uses plain bootstrap and does not have any custom colors & styles. This article will show you how to add dark mode support to the [Basic Theme](https://docs.abp.io/en/abp/latest/UI/AspNetCore/Basic-Theme). -Bootstrap brings [Color Modes](https://getbootstrap.com/docs/5.3/customize/color-modes/#dark-mode) feature with the version **5.3**. This feature allows you to add dark mode support to your website with a single line of code. Adding `data-bs-theme="dark"` attribute, changes the color mode of the element to dark mode. +Bootstrap brings [Color Modes](https://getbootstrap.com/docs/5.3/customize/color-modes/#dark-mode) feature with the version **5.3**. This feature allows you to add dark mode support to your website with a single line of code. Adding the `data-bs-theme="dark"` attribute changes the color mode of the element to dark mode. ## Instructions -1. Create a new project +1. Create a new project with the following command: ```bash abp new BasicThemeDarkMode -t app --theme basic ``` 2. Create a component that toggles the color mode. - - Create a new file named `Components/ChangeTheme/Default.cshtml` + - Create a new file named `Components/ChangeTheme/Default.cshtml`: ```html

``` - - Create a new file named `Components/ChangeTheme/ChangeThemeViewComponent.cs` + - Create a new file named `Components/ChangeTheme/ChangeThemeViewComponent.cs`: ```csharp using Microsoft.AspNetCore.Mvc; using Volo.Abp.AspNetCore.Mvc; @@ -38,9 +38,9 @@ Bootstrap brings [Color Modes](https://getbootstrap.com/docs/5.3/customize/color } ``` - - Create a JavaScript that manages last selected theme and toggles the color mode. It stores the last selected theme in the local storage. So, you don't need to store it in the database. + - Create a JavaScript that manages the last selected theme and toggles the color mode. It stores the last selected theme in the *local storage*. So, you don't need to store it in the database. - - Create a new file named `Components/ChangeTheme/ChangeTheme.js` + - Create a new file named `Components/ChangeTheme/ChangeTheme.js`: ```js $(function () { function changeTheme(theme) { @@ -71,9 +71,9 @@ Bootstrap brings [Color Modes](https://getbootstrap.com/docs/5.3/customize/color }); ``` -3. Create a new Toolbar Contributor and add newly created view component to the application toolbar. +3. Create a new [Toolbar Contributor](https://docs.abp.io/en/abp/latest/UI/AspNetCore/Toolbars) and add a newly created view component to the application toolbar. - - Create a new class named `BasicThemeDarkModeToolbarContributor.cs` + - Create a new class named `BasicThemeDarkModeToolbarContributor.cs`: ```csharp using BasicThemeDarkMode.Web.Components.ChangeTheme; using System.Threading.Tasks; @@ -96,7 +96,7 @@ Bootstrap brings [Color Modes](https://getbootstrap.com/docs/5.3/customize/color } ``` - - Configure [Toolbar Options](https://docs.abp.io/en/abp/latest/UI/AspNetCore/Toolbars) and add newly created contributor. + - Configure [Toolbar Options](https://docs.abp.io/en/abp/latest/UI/AspNetCore/Toolbars) and add newly created contributor: ```csharp Configure(options => { @@ -104,7 +104,7 @@ Bootstrap brings [Color Modes](https://getbootstrap.com/docs/5.3/customize/color }); ``` -That's it! Now, you can toggle the color mode by clicking the sun icon in the toolbar. +That's it! Now, you can toggle the color mode by clicking the sun icon in the toolbar: ![Dark Mode](basictheme-toggle-demo.gif) @@ -122,4 +122,4 @@ That's it! Now, you can toggle the color mode by clicking the sun icon in the to ## Conclusion -The theme is stored in **local storage** and it's initialized in the client-side. You can use **Cookies** to render the page in the last selected theme on **server-side** to prevent the flash effect while navigating pages. This documents show the concept of adding dark mode support of bootstrap to the Basic Theme. \ No newline at end of file +The theme is stored in **local storage** and it's initialized on the client-side. You can use **Cookies** to render the page in the last selected theme on **server-side** to prevent the flash effect while navigating pages. This document shows the concept of adding dark mode support of bootstrap to the Basic Theme. From 994d3ae2b719d9657b9422d0d93e49a67a4ab28f Mon Sep 17 00:00:00 2001 From: maliming Date: Tue, 8 Aug 2023 09:22:58 +0800 Subject: [PATCH 52/58] Update AbpExceptionPageFilter.cs Close #17309 --- .../AspNetCore/Mvc/ExceptionHandling/AbpExceptionPageFilter.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ExceptionHandling/AbpExceptionPageFilter.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ExceptionHandling/AbpExceptionPageFilter.cs index 9db528d620..31784cb6ea 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ExceptionHandling/AbpExceptionPageFilter.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ExceptionHandling/AbpExceptionPageFilter.cs @@ -83,7 +83,7 @@ public class AbpExceptionPageFilter : IAsyncPageFilter, ITransientDependency remoteServiceErrorInfoBuilder.AppendLine($"---------- {nameof(RemoteServiceErrorInfo)} ----------"); remoteServiceErrorInfoBuilder.AppendLine(context.GetRequiredService().Serialize(remoteServiceErrorInfo, indented: true)); - var logger = context.GetService>(NullLogger.Instance)!; + var logger = context.GetService>(NullLogger.Instance)!; logger.LogWithLevel(logLevel, remoteServiceErrorInfoBuilder.ToString()); logger.LogException(context.Exception!, logLevel); From 8803e58a8f06a472217ecf3b561e9b033b12686e Mon Sep 17 00:00:00 2001 From: Hamza Albreem <94292623+braim23@users.noreply.github.com> Date: Tue, 8 Aug 2023 10:02:23 +0300 Subject: [PATCH 53/58] Update POST.md --- .../2023-08-07-Basic-Theme-Dark-Mode/POST.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/en/Community-Articles/2023-08-07-Basic-Theme-Dark-Mode/POST.md b/docs/en/Community-Articles/2023-08-07-Basic-Theme-Dark-Mode/POST.md index 01f17777ad..00325751ef 100644 --- a/docs/en/Community-Articles/2023-08-07-Basic-Theme-Dark-Mode/POST.md +++ b/docs/en/Community-Articles/2023-08-07-Basic-Theme-Dark-Mode/POST.md @@ -1,7 +1,7 @@ # Adding Dark Mode Support to the Basic Theme Basic Theme uses plain bootstrap and does not have any custom colors & styles. This article will show you how to add dark mode support to the [Basic Theme](https://docs.abp.io/en/abp/latest/UI/AspNetCore/Basic-Theme). -Bootstrap brings [Color Modes](https://getbootstrap.com/docs/5.3/customize/color-modes/#dark-mode) feature with the version **5.3**. This feature allows you to add dark mode support to your website with a single line of code. Adding the `data-bs-theme="dark"` attribute changes the color mode of the element to dark mode. +Bootstrap brings the [Color Modes](https://getbootstrap.com/docs/5.3/customize/color-modes/#dark-mode) feature with version **5.3**. This feature allows you to add dark mode support to your website with a single line of code. Adding the `data-bs-theme="dark"` attribute changes the color mode of the element to dark mode. ## Instructions @@ -96,7 +96,7 @@ Bootstrap brings [Color Modes](https://getbootstrap.com/docs/5.3/customize/color } ``` - - Configure [Toolbar Options](https://docs.abp.io/en/abp/latest/UI/AspNetCore/Toolbars) and add newly created contributor: + - Configure [Toolbar Options](https://docs.abp.io/en/abp/latest/UI/AspNetCore/Toolbars) and add a newly created contributor: ```csharp Configure(options => { From 7f2ca4e022ed5dc9d458986c1dacd05ba9d6b88b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Tue, 8 Aug 2023 15:55:02 +0300 Subject: [PATCH 54/58] Best practice: return this object from aggregate root / entity setter methods. --- docs/en/Best-Practices/Entities.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/docs/en/Best-Practices/Entities.md b/docs/en/Best-Practices/Entities.md index 1c76469cb7..5a8c07c075 100644 --- a/docs/en/Best-Practices/Entities.md +++ b/docs/en/Best-Practices/Entities.md @@ -28,6 +28,7 @@ Every aggregate root is also an entity. So, these rules are valid for aggregate - **Do** keep the entity as always **valid** and **consistent** within its own boundary. - **Do** define properties with `private`, `protected`, `internal ` or `protected internal` setter where it is needed to protect the entity consistency and validity. - **Do** define `public `, `internal` or `protected internal` (virtual) **methods** to change the properties (with non-public setters) if necessary. + - **Do** return the entity object (`this`) from the setter methods. ### Aggregate Roots @@ -86,15 +87,16 @@ public class Issue : FullAuditedAggregateRoot //Using Guid as the key/iden Labels = new Collection(); //Always initialize the collection } - public virtual void SetTitle([NotNull] string title) + public virtual Issue SetTitle([NotNull] string title) { Title = Check.NotNullOrWhiteSpace(title, nameof(title)); //Validate + return this; } /* AddLabel & RemoveLabel methods manages the Labels collection * in a safe way (prevents adding the same label twice) */ - public virtual void AddLabel(Guid labelId) + public virtual Issue AddLabel(Guid labelId) { if (Labels.Any(l => l.LabelId == labelId)) { @@ -102,11 +104,13 @@ public class Issue : FullAuditedAggregateRoot //Using Guid as the key/iden } Labels.Add(new IssueLabel(Id, labelId)); + return this; } - public virtual void RemoveLabel(Guid labelId) + public virtual Issue RemoveLabel(Guid labelId) { Labels.RemoveAll(l => l.LabelId == labelId); + return this; } /* Close & ReOpen methods protect the consistency From 5d137a6dbf510c2c9e98b55e8d3624fb26d5de44 Mon Sep 17 00:00:00 2001 From: Salih Date: Wed, 9 Aug 2023 09:49:51 +0300 Subject: [PATCH 55/58] Update en.json --- .../AbpIoLocalization/Base/Localization/Resources/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json index fb6207f8f8..6fb34a0731 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json @@ -218,7 +218,7 @@ "DetailedChangeNotes" : "Detailed Change Notes", "SeeTrainings": "See Trainings", "NoContent": "No content", - "ABPStudioBeta": "ABP Studio BETA", + "AbpStudio": "ABP Studio", "More": "More" } } From 8165ecba8f88ce2b1faadfb6b5872b643efd7cd2 Mon Sep 17 00:00:00 2001 From: Salih Date: Wed, 9 Aug 2023 14:52:51 +0300 Subject: [PATCH 56/58] Update en.json --- .../Commercial/Localization/Resources/en.json | 77 ++++++++++++++++++- 1 file changed, 76 insertions(+), 1 deletion(-) diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json index 96aaa28e13..1d977e3351 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json @@ -983,6 +983,81 @@ "TrainingPackDiscount": "Training pack discount", "Purchase_OnboardingTraining_Description": "This live training package is discounted when purchase with the new license. This discounted price is valid only for new license purchases.
Learn more ", "Purchase_Save": "{0}% Save {1} {2}", - "RemoveBasket": "Remove from basket" + "RemoveBasket": "Remove from basket", + "WhyABPIOPlatform?": "Why ABP.IO Platform?", + "DocumentAim": "This document aims to answer the big question:", + "DocumentAim_Description": "\"Why should you use the ABP.IO Platform instead of creating a new solution from scratch?\"", + "DocumentAim_Description2": "The document introduces the challenges of building a modern software solution and explains how ABP addresses these challenges.", + "CreatingANewSolution": "Creating a New Solution", + "CreatingANewSolution_Description": "When you need to start a new solution, there are a lot of questions you need to ask yourself, and you should spend a lot of time before starting to write your very first business code.", + "CreatingAnEmptySolution": "Creating an Empty Solution", + "THEPROBLEM": "THE PROBLEM", + "CreatingAnEmptySolution_THEPROBLEM_Description": "Even creating an almost-empty solution is challenging;", + "CreatingAnEmptySolution_THEPROBLEM_Description2": "How do you organize your codebase across projects?", + "CreatingAnEmptySolution_THEPROBLEM_Description3": "What are the layers and how do they interact?", + "CreatingAnEmptySolution_THEPROBLEM_Description4": "How do you integrate to 3rd-party library and systems?", + "CreatingAnEmptySolution_THEPROBLEM_Description5": "How to set up the automated tests?", + "ABPSOLUTION": "ABP SOLUTION", + "CreatingAnEmptySolution_ABPSOLUTION_Description": "ABP provides a well-architected, layered and production-ready startup solution based on the Domain Driven Design principles. The solution also includes a pre-configured unit and integration test projects for each layer.", + "CommonLibraries": "Common Libraries", + "CommonLibraries_THEPROBLEM_Description": "Which libraries should you use to implement common requirements? The software development ecosystem is highly dynamic and it is hard to follow the latest tools, libraries, trends and approaches.", + "CommonLibraries_ABPSOLUTION_Description": "ABP pre-integrates the popular, mature and up-to-date libraries into the solution. You don't spend time integrating them and talking to each other. They properly work out of the box.", + "UITheme&Layout": "UI Theme & Layout", + "UITheme&Layout_THEPROBLEM_Description": "When it comes to the UI, there are a lot of challenges, including preparing a foundation to create a responsive, modern and flexible UI kit with a consistent look & feel and tons of features (like left/top navigation menu, header, toolbar, footer, widgets and so.).", + "UITheme&Layout_THEPROBLEM_Description2": "Even if you buy a pre-built theme, integrating it into your solution may take days of development. Upgrading such a theme is another problem. Most of the time, the theme's HTML/CSS structure is mixed with your UI code, and it is not easy to upgrade or change the theme later.", + "UITheme&Layout_ABPSOLUTION_Description": "ABP Framework provides a theming system that makes your UI code independent from the theme. Themes are isolated, and they are NuGet/NPM packages. Installing or upgrading a theme is just a minute. While you can build your theme (or integrate an existing theme), ABP Commercial offers professional and modern themes.There are also UI component providers (like Telerik and DevExpress). But they only provide individual components. You are responsible for creating your own layout system. You can use such libraries in your ABP-based solutions just like in any other project.", + "TestInfrastructure": "Test Infrastructure", + "TestInfrastructure_THEPROBLEM_Description": "Which libraries should you use to implement common requirements? The software development ecosystem is highly dynamic and it is hard to follow the latest tools, libraries, trends and approaches.", + "TestInfrastructure_ABPSOLUTION_Description": "ABP Startup Templates comes with the test projects already configured for you, and you can immediately write your first unit or integration test code on day 1. Writing unit tests is very clear with the ABP Framework; see how to write tests.", + "CodingStandards&Training": "Coding Standards & Training", + "CodingStandards&Training_THEPROBLEM_Description": "Once you create the development-ready solution, you typically need to train the developers to explain the system and develop it with the same conventions in a standard and consistent way. Even if you train the developers, it is hard to prepare and maintain your documentation. Over time, every developer will write the code differently, and coding standards will begin to diverge.", + "CodingStandards&Training_ABPSOLUTION_Description": "ABP solution is already well-defined and well-documented. Tutorials and best practice guides clearly explain how to make development on an ABP project.", + "KeepingYourSolutionUpToDate": "Keeping Your Solution Up to Date", + "KeepingYourSolutionUpToDate_THEPROBLEM_Description": "After you start your development, you must keep track of the new versions of the libraries you use for upgrades & patches. We regularly update all packages to the latest versions and test them before the stable release. When you update the ABP Framework, all its dependencies are upgraded to edge technology.", + "KeepingYourSolutionUpToDate_ABPSOLUTION_Description": "Abp update CLI command automatically discovers and upgrades all ABP-dependant NuGet and NPM packages in a solution. With ABP, it is easier to stay with the latest versions.", + "DRY": "Don't Repeat Yourself!", + "DRY_Description": "Creating a base solution takes significant time and requires well architectural experience. However, this is just the beginning! As you start developing, you will likely have to write lots of repetitive code; that would be great if all this could be handled automatically.", + "DRY_Description2": "ABP automates and simplifies repeating code as much as possible by following the convention over configuration principle. However, it doesn't restrict you when you need to switch to manual gear. The control is always in your hands.", + "Authentication": "Authentication", + "Authentication_THEPROBLEM_Description": "Single Sign On, Active Directory / LDAP Integration, OpenIddict integration, social logins, two-factor authentication, forgot/reset password, email activation, new user registration, password complexity control, locking account on failed attempts, showing failed login attemps ... etc. We know that all these generic requirements are familiar to you. You are not alone!", + "Authentication_ABPSOLUTION_Description": "ABP Framework and the commercial version provide all these standard stuff pre-implemented for you as a re-usable account module. You just enable and configure what you need.", + "CrossCuttingConcerns": "Cross-Cutting Concerns", + "CrossCuttingConcerns_THEPROBLEM_Description": "Cross-Cutting Concerns are the fundamental repeating logic that should be implementedfor each use case. Some examples;", + "CrossCuttingConcerns_ABPSOLUTION_Description": "ABP Framework automates or simplifies all the common cross-cutting concerns. You only write code that matters for your business and ABP handles the rest by conventions.", + "ArchitecturalInfrastructure": "Architectural Infrastructure", + "ArchitecturalInfrastructure_THEPROBLEM_Description": "You typically need to build infrastructure to implement your architecture properly. For example, you generally implement the Repository pattern. You define some base classes to simplify and standardize to create entities, services, controllers and other objects.", + "ArchitecturalInfrastructure_ABPSOLUTION_Description": "ABP Framework provides all these and more out of the box. It is mature and well-documented.", + "EnterpriseApplicationRequirements": "Enterprise Application Requirements", + "EnterpriseApplicationRequirements_THEPROBLEM_Description": "There are a lot of requirements you repeatedly implement in every business application;", + "EnterpriseApplicationRequirements_ABPSOLUTION_Description": "There is much more. ABP provides infrastructure to implement such requirements easily. Again, you don't spend your valuable time to re-implement all these again and again.", + "GeneratingInitialCode&Tooling": "Generating Initial Code & Tooling", + "GeneratingInitialCode&Tooling_THEPROBLEM_Description": "ABP Suite can generate a full-stack CRUD page for your entities in seconds. The generated code is layered and clean. All the standard validation and authorization requirements are implemented. Plus, unit test classes are generated. Once you get a fully running page, you can modify it according to your business requirements.", + "GeneratingInitialCode&Tooling_ABPSOLUTION_Description": "ABP Framework provides all these and more out of the box. It is mature and well-documented.", + "IntegratingTo3rdPartyLibrariesAndSystems": "Integrating to 3rd-Party Libraries and Systems", + "IntegratingTo3rdPartyLibrariesAndSystems_THEPROBLEM_Description": "Most libraries are designed as low level, and you typically do some work to integrate them properly without repeating the same integration and configuration code everywhere in your solution. For example, assume you must use RabbitMQ to implement your distributed event bus. All you want to do is; send a message to a queue and handle the incoming messages. But you need to understand messaging patterns, queue and exchange details. To write an efficient code, you must create a pool to manage connections, clients and channels. You also must deal with exceptions, ACK messages, re-connecting to RabbitMQ on failures and more.", + "IntegratingTo3rdPartyLibrariesAndSystems_ABPSOLUTION_Description": "ABP's RabbitMQ Distributed Event Bus integration abstracts all these details. You send and receive messages without the hustle and bustle. Do you need to write low-level code? No problem, you can always do that. ABP doesn't restrict you when you need to use low-level features of the library you are using.", + "WhyNotBuildYourOwnFramework?": "Why Not Build Your Own Framework?", + "WhyNotBuildYourOwnFramework_THEPROBLEM_Description": "All the infrastructure, even in the most simple way, takes a lot of time to build, maintain and document. It gets bigger over time, and it becomes hard to maintain it in your solution. Separating these into a re-usable project is the starting point for building your own internal framework.", + "WhyNotBuildYourOwnFramework_ABPSOLUTION_Description": "Building, documenting, training and maintaining an internal framework is really hard. If you don't have an experienced, dedicated framework team, your internal framework rapidly becomes an undocumented legacy code that no one can understand and maintain anymore. On the other hand, these frameworks are generally developed by one or two developers in the team. And these fellows are becoming a knowledge silo. It is good for them but bad for the company because they are the project's single point of failure -SPOF-. Once they leave the company, the project dramatically goes down.", + "TonsOfFeatures": "Tons of Features", + "TonesOfFeatures_Description": "Tag helpers, dynamic forms, BLOB storing system and many other ABP features help you keep DRY (don't repeat yourself) and focus on your business.", + "ArchitecturalInfrastructure_Description": "SaaS applications, modular or microservice systems are most used enterprise software models. Building such systems not only requires a good understanding and experience, but also requires a strong software infrastructure. Otherwise, you will find yourself spending a great effort to support these architectural details in your codebase.", + "Modularity": "Modularity", + "Modularity_THEPROBLEM_Description": "Building a truly modular system is not easy! All the aspects of the system (database, entities, APIs, UI pages/components) can be split into modules, and each module can be re-usable without others. The plain ASP.NET Core doesn't provide such a modular architecture. If you need it, you should think about it from scratch.", + "Modularity_ABPSOLUTION_Description": "The ABP Framework is born to be a modular application development structure. Every feature in the framework is developed to be compatible with modularity. Documentation and guides explain how to develop re-usable modules in a standard way.", + "SaaSMultiTenancy": "SaaS / Multi-Tenancy", + "SaaSMultiTenancy_THEPROBLEM_Description": "Multi-Tenancy is a common way to implement SaaS systems. However, implementing a consistent multi-tenant infrastructure may become complicated.", + "SaaSMultiTenancy_ABPSOLUTION_Description": "ABP Framework provides a complete multi-tenant infrastructure and abstract complexity from your business code. Your application code will be mostly multi-tenancy aware while the ABP Framework automatically isolates the database, cache and other details of the tenants from each other. It supports single database, per tenant database and hybrid approaches. It properly configures the libraries like Microsoft Identity, IdentityServer, OpenIddict, which are not normally multi-tenancy compatible.", + "Microservices": "Microservices", + "Microservices_THEPROBLEM_Description": "Building a microservice system requires many infrastructure details: Authenticating and authorizing applications and microservices and implementing asynchronous messaging and synchronous (Rest/GRPC) communication patterns between microservices are the most fundamental issues.", + "Microservices_ABPSOLUTION_Description": "The ABP Framework provides services, guides, and samples to help you implement your microservice solution using the industry standard tools. ABP Commercial even goes one step further and provides a complete startup template to kick-start your microservice solution.", + "PreBuiltModules": "Pre-Built Modules", + "PreBuiltModules_THEPROBLEM_Description": "All of us have similar but slightly different business requirements. However, we all should re-invent the wheel since no one's code can directly work in our solution. They are all embedded parts of a larger solution.", + "PreBuiltModules_ABPSOLUTION_Description":"ABP Commercial modules provides a lot of re-usable application modules like payment, chat, file management, audit log reporting... etc. All of these modules are easily installed into your solution and directly work. We are constantly adding more modules.", + "PreBuiltModules_ABPSOLUTION_Description2": "All modules are designed as customizable for your business requirements. If you need complete control, you can download the full source code of any module and completely customize based on your specific business requirements.", + "ABPCommunity": "ABP Community", + "ABPCommunity_Description": "Being in a big community where everyone follows similar coding styles and principles and shares a common infrastructure brings power when you have troubles or need help with design decisions. Since we write code similarly, we can help each other much better. ABP is a community-backed project with almost 10K stars on GitHub.", + "ABPCommunity_Description2": "It is easy to share code or even re-usable libraries between ABP developers. A code snippet that works for you will also work for others. There are a lot of samples and tutorials that you can directly implement for your application.", + "ABPCommunity_Description3": "When you hire a developer who worked before with the ABP architecture will immediately understand your solution and start development in a very short time." } } From 8eb5e495097a5ed8337c2028dfae32f34056e518 Mon Sep 17 00:00:00 2001 From: Salih Date: Wed, 9 Aug 2023 15:22:49 +0300 Subject: [PATCH 57/58] Update en.json --- .../AbpIoLocalization/Base/Localization/Resources/en.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json index fb6207f8f8..dc740e04e2 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json @@ -219,6 +219,7 @@ "SeeTrainings": "See Trainings", "NoContent": "No content", "ABPStudioBeta": "ABP Studio BETA", - "More": "More" + "More": "More", + "WhyABPIOPlatform": "Why ABP.IO Platform" } } From 4f0c6022d1dea13a7848beb1486de4e26105831d Mon Sep 17 00:00:00 2001 From: Salih Date: Wed, 9 Aug 2023 15:45:47 +0300 Subject: [PATCH 58/58] Update en.json --- .../AbpIoLocalization/Base/Localization/Resources/en.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json index f2ca45a612..45d2b733ac 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json @@ -219,7 +219,7 @@ "SeeTrainings": "See Trainings", "NoContent": "No content", "More": "More", - "WhyABPIOPlatform": "Why ABP.IO Platform" - "AbpStudio": "ABP Studio", + "WhyABPIOPlatform": "Why ABP.IO Platform", + "AbpStudio": "ABP Studio" } }