diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/ar.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/ar.json index a54b1ee806..fae2e16129 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/ar.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/ar.json @@ -533,7 +533,7 @@ "RaffleDeletionConfirmationMessage": "هل أنت متأكد أنك تريد حذف هذا السحب؟", "CreateRaffle": "إنشاء السحب", "RemoveImage": "إزالة الصورة", - "SuccessfullySaved": "تم الحفظ بنجاح", + "SavedSuccessfully": "تم الحفظ بنجاح", "Menu:CommunityTalks": "محادثات المجتمع", "Menu:Conferences": "المؤتمرات", "Menu:OtherLiveEvents": "الأحداث المباشرة الأخرى", diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/cs.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/cs.json index 9f2116cbfa..c3b5357a98 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/cs.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/cs.json @@ -533,7 +533,7 @@ "RaffleDeletionConfirmationMessage": "Opravdu chcete smazat toto slosování?", "CreateRaffle": "Vytvořit tombolu", "RemoveImage": "Odebrat obrázek", - "SuccessfullySaved": "Úspěšně uloženo", + "SavedSuccessfully": "Úspěšně uloženo", "Menu:CommunityTalks": "Komunitní rozhovory", "Menu:Conferences": "Konference", "Menu:OtherLiveEvents": "Další živé akce", diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/de.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/de.json index e18b85c689..6dc8e69ea3 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/de.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/de.json @@ -533,7 +533,7 @@ "RaffleDeletionConfirmationMessage": "Sind Sie sicher, dass Sie dieses Gewinnspiel löschen möchten?", "CreateRaffle": "Gewinnspiel erstellen", "RemoveImage": "Entferne Bild", - "SuccessfullySaved": "Erfolgreich gespeichert", + "SavedSuccessfully": "Erfolgreich gespeichert", "Menu:CommunityTalks": "Community-Gespräche", "Menu:Conferences": "Konferenzen", "Menu:OtherLiveEvents": "Andere Live-Events", diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json index 18dc42a2ad..3fd77f45a1 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json @@ -533,7 +533,7 @@ "RaffleDeletionConfirmationMessage": "Are you sure you want to delete this raffle?", "CreateRaffle": "Create Raffle", "RemoveImage": "Remove Image", - "SuccessfullySaved": "Successfully saved", + "SavedSuccessfully": "Saved successfully", "Menu:CommunityTalks": "Community Talks", "Menu:Conferences": "Conferences", "Menu:OtherLiveEvents": "Other Live Events", @@ -597,6 +597,9 @@ "DontSendEmailForLicenseExpire": "Don't Send Email For License Expire", "SuccessfullyChanged": "Successfully changed", "WinnerCountMustBeLessThanMaxWinnerCount": "Winner count must be less than max winner count", - "NoChangesDetected": "No changes detected" + "NoChangesDetected": "No changes detected", + "ProductCount": "Product Count", + "Actions": "Actions", + "CreateInvoice": "Create Invoice" } } diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/es.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/es.json index 88696d31f7..6ae52c5ca8 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/es.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/es.json @@ -533,7 +533,7 @@ "RaffleDeletionConfirmationMessage": "¿Estás seguro de que quieres eliminar este sorteo?", "CreateRaffle": "Crear sorteo", "RemoveImage": "Quita la imagen", - "SuccessfullySaved": "Guardado con éxito", + "SavedSuccessfully": "Guardado con éxito", "Menu:CommunityTalks": "Charlas comunitarias", "Menu:Conferences": "Conferencias", "Menu:OtherLiveEvents": "Otros eventos en vivo", diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/fi.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/fi.json index 8b842aded8..0f32519b06 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/fi.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/fi.json @@ -533,7 +533,7 @@ "RaffleDeletionConfirmationMessage": "Haluatko varmasti poistaa tämän arvonnan?", "CreateRaffle": "Luo arpajaiset", "RemoveImage": "Poista kuva", - "SuccessfullySaved": "Tallennettu onnistuneesti", + "SavedSuccessfully": "Tallennettu onnistuneesti", "Menu:CommunityTalks": "Yhteisön keskustelut", "Menu:Conferences": "Konferenssit", "Menu:OtherLiveEvents": "Muut live-tapahtumat", diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/fr.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/fr.json index e22b86d89f..0fcc7462ec 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/fr.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/fr.json @@ -533,7 +533,7 @@ "RaffleDeletionConfirmationMessage": "Êtes-vous sûr de vouloir supprimer ce tirage au sort ?", "CreateRaffle": "Créer un tirage au sort", "RemoveImage": "Supprimer l'image", - "SuccessfullySaved": "Enregistré avec succès", + "SavedSuccessfully": "Enregistré avec succès", "Menu:CommunityTalks": "Discussions communautaires", "Menu:Conferences": "Conférences", "Menu:OtherLiveEvents": "Autres événements en direct", diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/hi.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/hi.json index a0de1d8eef..234f5420ad 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/hi.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/hi.json @@ -533,7 +533,7 @@ "RaffleDeletionConfirmationMessage": "क्या आप वाकई इस रैफ़ल को हटाना चाहते हैं?", "CreateRaffle": "रैफ़ल बनाएं", "RemoveImage": "छवि हटाएँ", - "SuccessfullySaved": "सफलतापूर्वक संचित कर लिया गया है", + "SavedSuccessfully": "सफलतापूर्वक संचित कर लिया गया है", "Menu:CommunityTalks": "सामुदायिक वार्ता", "Menu:Conferences": "सम्मेलन", "Menu:OtherLiveEvents": "अन्य लाइव इवेंट", diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/hr.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/hr.json index f8e5421db9..fbf9b3512c 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/hr.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/hr.json @@ -533,7 +533,7 @@ "RaffleDeletionConfirmationMessage": "Jeste li sigurni da želite izbrisati ovu nagradnu igru?", "CreateRaffle": "Napravite nagradnu igru", "RemoveImage": "Ukloni sliku", - "SuccessfullySaved": "Uspješno spremljeno", + "SavedSuccessfully": "Uspješno spremljeno", "Menu:CommunityTalks": "Razgovori zajednice", "Menu:Conferences": "Konferencije", "Menu:OtherLiveEvents": "Ostali događaji uživo", diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/hu.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/hu.json index d41ac05e58..fbde299616 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/hu.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/hu.json @@ -533,7 +533,7 @@ "RaffleDeletionConfirmationMessage": "Biztosan törölni szeretnéd ezt a nyereményjátékot?", "CreateRaffle": "Hozzon létre tombolát", "RemoveImage": "Kép eltávolítása", - "SuccessfullySaved": "Sikeresen mentve", + "SavedSuccessfully": "Sikeresen mentve", "Menu:CommunityTalks": "Közösségi beszélgetések", "Menu:Conferences": "Konferenciák", "Menu:OtherLiveEvents": "Egyéb élő események", diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/is.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/is.json index 789701d409..8f0403ae68 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/is.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/is.json @@ -533,7 +533,7 @@ "RaffleDeletionConfirmationMessage": "Ertu viss um að þú viljir eyða þessari happdrætti?", "CreateRaffle": "Búðu til happdrætti", "RemoveImage": "Fjarlægja mynd", - "SuccessfullySaved": "Vistað", + "SavedSuccessfully": "Vistað", "Menu:CommunityTalks": "Samfélagsspjall", "Menu:Conferences": "Ráðstefnur", "Menu:OtherLiveEvents": "Aðrir viðburðir í beinni", diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/it.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/it.json index b03f3bbbf7..214106c6b5 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/it.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/it.json @@ -533,7 +533,7 @@ "RaffleDeletionConfirmationMessage": "Sei sicuro di voler eliminare questa lotteria?", "CreateRaffle": "Crea lotteria", "RemoveImage": "Rimuovi immagine", - "SuccessfullySaved": "Salvato con successo", + "SavedSuccessfully": "Salvato con successo", "Menu:CommunityTalks": "Colloqui comunitari", "Menu:Conferences": "Conferenze", "Menu:OtherLiveEvents": "Altri eventi dal vivo", diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/nl.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/nl.json index 3ddd7ae385..e9bccd40ac 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/nl.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/nl.json @@ -533,7 +533,7 @@ "RaffleDeletionConfirmationMessage": "Weet je zeker dat je deze loterij wilt verwijderen?", "CreateRaffle": "Maak een loterij", "RemoveImage": "Afbeelding verwijderen", - "SuccessfullySaved": "Succesvol opgeslagen", + "SavedSuccessfully": "Succesvol opgeslagen", "Menu:CommunityTalks": "Gemeenschapsgesprekken", "Menu:Conferences": "Conferenties", "Menu:OtherLiveEvents": "Andere live-evenementen", diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/pl-PL.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/pl-PL.json index 059ea39311..2eaf8a307f 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/pl-PL.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/pl-PL.json @@ -533,7 +533,7 @@ "RaffleDeletionConfirmationMessage": "Czy na pewno chcesz usunąć tę loterię?", "CreateRaffle": "Utwórz loterię", "RemoveImage": "Usuń obraz", - "SuccessfullySaved": "Pomyślnie zapisano", + "SavedSuccessfully": "Pomyślnie zapisano", "Menu:CommunityTalks": "Rozmowy społecznościowe", "Menu:Conferences": "Konferencje", "Menu:OtherLiveEvents": "Inne wydarzenia na żywo", diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/pt-BR.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/pt-BR.json index 99bbf75ec5..e21f67ed56 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/pt-BR.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/pt-BR.json @@ -533,7 +533,7 @@ "RaffleDeletionConfirmationMessage": "Tem certeza de que deseja excluir este sorteio?", "CreateRaffle": "Criar sorteio", "RemoveImage": "Remover imagem", - "SuccessfullySaved": "Salvo com sucesso", + "SavedSuccessfully": "Salvo com sucesso", "Menu:CommunityTalks": "Palestras Comunitárias", "Menu:Conferences": "Conferências", "Menu:OtherLiveEvents": "Outros eventos ao vivo", diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/ro-RO.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/ro-RO.json index 6a3263e78e..7daba21dca 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/ro-RO.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/ro-RO.json @@ -533,7 +533,7 @@ "RaffleDeletionConfirmationMessage": "Sigur doriți să ștergeți această tombolă?", "CreateRaffle": "Creați tombolă", "RemoveImage": "Eliminați imaginea", - "SuccessfullySaved": "Salvat cu succes", + "SavedSuccessfully": "Salvat cu succes", "Menu:CommunityTalks": "Discuții comunitare", "Menu:Conferences": "Conferințe", "Menu:OtherLiveEvents": "Alte evenimente live", diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/ru.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/ru.json index f1f66136be..506aaa7ef7 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/ru.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/ru.json @@ -547,7 +547,7 @@ "RaffleDeletionConfirmationMessage": "Вы уверены, что хотите удалить этот розыгрыш?", "CreateRaffle": "Создать лотерею", "RemoveImage": "Удалить изображение", - "SuccessfullySaved": "Успешно сохранено", + "SavedSuccessfully": "Успешно сохранено", "Menu:CommunityTalks": "Обсуждения сообщества", "Menu:Conferences": "Конференции", "Menu:OtherLiveEvents": "Другие живые события", diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/sk.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/sk.json index 4cb4885c78..24e74b780c 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/sk.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/sk.json @@ -533,7 +533,7 @@ "RaffleDeletionConfirmationMessage": "Naozaj chcete odstrániť túto tombolu?", "CreateRaffle": "Vytvorenie tomboly", "RemoveImage": "Odstrániť obrázok", - "SuccessfullySaved": "Úspešne uložené", + "SavedSuccessfully": "Úspešne uložené", "Menu:CommunityTalks": "Komunitné rozhovory", "Menu:Conferences": "konferencie", "Menu:OtherLiveEvents": "Ďalšie živé podujatia", diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/sl.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/sl.json index 58eb87edbc..e6c52fc6c8 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/sl.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/sl.json @@ -533,7 +533,7 @@ "RaffleDeletionConfirmationMessage": "Ali ste prepričani, da želite izbrisati to nagradno igro?", "CreateRaffle": "Ustvari nagradno igro", "RemoveImage": "Odstrani sliko", - "SuccessfullySaved": "Uspešno shranjeno", + "SavedSuccessfully": "Uspešno shranjeno", "Menu:CommunityTalks": "Skupnostni pogovori", "Menu:Conferences": "konference", "Menu:OtherLiveEvents": "Drugi dogodki v živo", diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/vi.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/vi.json index 1d00ba855e..ce354fc7e1 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/vi.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/vi.json @@ -533,7 +533,7 @@ "RaffleDeletionConfirmationMessage": "Bạn có chắc chắn muốn xóa xổ số này không?", "CreateRaffle": "Tạo xổ số", "RemoveImage": "Xóa hình ảnh", - "SuccessfullySaved": "Lưu thành công", + "SavedSuccessfully": "Lưu thành công", "Menu:CommunityTalks": "Tọa đàm cộng đồng", "Menu:Conferences": "Hội nghị", "Menu:OtherLiveEvents": "Sự kiện trực tiếp khác", diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/zh-Hans.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/zh-Hans.json index 59b617ac0b..c601468f55 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/zh-Hans.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/zh-Hans.json @@ -533,7 +533,7 @@ "RaffleDeletionConfirmationMessage": "您确定要删除这次抽奖吗?", "CreateRaffle": "创建抽奖活动", "RemoveImage": "移除图像", - "SuccessfullySaved": "成功保存", + "SavedSuccessfully": "成功保存", "Menu:CommunityTalks": "社区讲座", "Menu:Conferences": "会议", "Menu:OtherLiveEvents": "其他现场活动", diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/zh-Hant.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/zh-Hant.json index a0f325b15c..31edc2aa49 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/zh-Hant.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/zh-Hant.json @@ -533,7 +533,7 @@ "RaffleDeletionConfirmationMessage": "您確定要刪除此抽獎嗎?", "CreateRaffle": "創建抽獎活動", "RemoveImage": "刪除影像", - "SuccessfullySaved": "保存成功", + "SavedSuccessfully": "保存成功", "Menu:CommunityTalks": "社區講座", "Menu:Conferences": "會議", "Menu:OtherLiveEvents": "其他現場活動", diff --git a/common.props b/common.props index de934818f0..fdee3ad9ac 100644 --- a/common.props +++ b/common.props @@ -1,7 +1,8 @@ latest - 8.2.0 + 8.2.0-preview + 3.2.0-preview $(NoWarn);CS1591;CS0436 https://abp.io/assets/abp_nupkg.png https://abp.io/ diff --git a/docs/en/Dependency-Injection.md b/docs/en/Dependency-Injection.md index 27eaaad553..6a1ea66d41 100644 --- a/docs/en/Dependency-Injection.md +++ b/docs/en/Dependency-Injection.md @@ -129,6 +129,7 @@ If you do not specify which services to expose, ABP expose services by conventio * The class itself is exposed by default. That means you can inject it by ``TaxCalculator`` class. * Default interfaces are exposed by default. Default interfaces are determined by naming convention. In this example, ``ICalculator`` and ``ITaxCalculator`` are default interfaces of ``TaxCalculator``, but ``ICanCalculate`` is not. A generic interface (e.g. `ICalculator`) is also considered as a default interface if the naming convention is satisfied. +* The resolved instances will be the same if multiple services are exposed for **Singleton** and **Scoped** services. This behavior requires exposing the class itself. ### Combining All Together @@ -566,4 +567,4 @@ Startup templates come with Autofac installed. See [Autofac integration](Autofac ## See Also * [ASP.NET Core Dependency Injection Best Practices, Tips & Tricks](https://medium.com/volosoft/asp-net-core-dependency-injection-best-practices-tips-tricks-c6e9c67f9d96) -* [Video tutorial](https://abp.io/video-courses/essentials/dependency-injection) \ No newline at end of file +* [Video tutorial](https://abp.io/video-courses/essentials/dependency-injection) diff --git a/docs/en/UI/Angular/HTTP-Error-Handling.md b/docs/en/UI/Angular/HTTP-Error-Handling.md index 606211bfeb..8b4077fb53 100644 --- a/docs/en/UI/Angular/HTTP-Error-Handling.md +++ b/docs/en/UI/Angular/HTTP-Error-Handling.md @@ -1,8 +1,40 @@ # HTTP Error Handling -When the `RestService` is used, all HTTP errors are reported to the [`HttpErrorReporterService`](./HTTP-Error-Reporter-Service), and then `ErrorHandler`, a service exposed by the `@abp/ng.theme.shared` package automatically handles the errors. +### Error Configurations + +ABP offers a configurations for errors handling like below + +```ts +import { ThemeSharedModule } from '@abp/ng.theme.shared'; +import { MyCustomRouteErrorComponent } from './my-custom-route.component'; + +@NgModule({ + imports: [ + ThemeSharedModule.forRoot({ + httpErrorConfig: { + skipHandledErrorCodes: [403], + errorScreen: { + forWhichErrors: [404], + component: CustomErrorComponent, + hideCloseIcon: false + } + } + }), + ... + ], +}) +export class AppModule {} +``` + +- `ErrorScreenErrorCodes` the error codes that you can pass to `skipHandledErrorCodes` and `forWhichErrors`. +- `skipHandledErrorCodes` the error codes those you don't want to handle it. +- `errorScreen` the screen that you want to show when a route error occurs. + - `component` component that you want to show. + - `forWhichErrors` same as `ErrorScreenErrorCodes` + - `hideCloseIcon` hides close icon in default ABP component. ## Custom HTTP Error Handler +When the `RestService` is used, all HTTP errors are reported to the [`HttpErrorReporterService`](./HTTP-Error-Reporter-Service), and then `ErrorHandler`, a service exposed by the `@abp/ng.theme.shared` package automatically handles the errors. ### Function Method `Deprecated` diff --git a/docs/en/docs-nav.json b/docs/en/docs-nav.json index eeefa3d06e..ff85feae58 100644 --- a/docs/en/docs-nav.json +++ b/docs/en/docs-nav.json @@ -1059,7 +1059,7 @@ "path": "UI/Angular/HTTP-Requests.md" }, { - "text": "HTTP Error Handling / Customization", + "text": "Customize Error Handling", "path": "UI/Angular/HTTP-Error-Handling.md" } ] diff --git a/docs/zh-Hans/Modules/Tenant-Management.md b/docs/zh-Hans/Modules/Tenant-Management.md index 3c3ebd7f01..976221e85c 100644 --- a/docs/zh-Hans/Modules/Tenant-Management.md +++ b/docs/zh-Hans/Modules/Tenant-Management.md @@ -16,7 +16,7 @@ ### 源代码 -可以 [在此处](https://github.com/abpframework/abp/tree/dev/modules/identity) 访问源代码。源代码使用 [MIT](https://choosealicense.com/licenses/mit/) 许可, 所以你可以免费使用和自定义它. +可以 [在此处](https://github.com/abpframework/abp/tree/dev/modules/tenant-management) 访问源代码。源代码使用 [MIT](https://choosealicense.com/licenses/mit/) 许可, 所以你可以免费使用和自定义它. ## 用户界面 diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Layout/PageHeader.razor b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Layout/PageHeader.razor index 2bb222feb8..d7c636d5d2 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Layout/PageHeader.razor +++ b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Layout/PageHeader.razor @@ -1,11 +1,24 @@ @using Blazorise @using Microsoft.Extensions.Options +@using Microsoft.AspNetCore.Components.Web +@using Volo.Abp.Ui.Branding @inject IOptions Options +@inject IBrandingProvider BrandingProvider + + @if (PageLayout.Title.IsNullOrEmpty()) + { + @BrandingProvider.AppName + } + else + { + @PageLayout.Title | @BrandingProvider.AppName + } + @if(Options.Value.RenderPageTitle) - { + {

@PageLayout.Title

diff --git a/framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/TenantChangedEvent.cs b/framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/TenantChangedEvent.cs new file mode 100644 index 0000000000..93c925827e --- /dev/null +++ b/framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/TenantChangedEvent.cs @@ -0,0 +1,16 @@ +using System; + +namespace Volo.Abp.MultiTenancy; + +[Serializable] +public class TenantChangedEvent +{ + public Guid? Id { get; set; } + public string? NormalizedName { get; set; } + + public TenantChangedEvent(Guid? id = null, string? normalizedName = null) + { + Id = id; + NormalizedName = normalizedName; + } +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/create.js b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/create.js index bcb5ed051d..1b3bd0b7f4 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/create.js +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/create.js @@ -165,7 +165,7 @@ $(function () { } function finishSaving() { - abp.notify.success(l('SuccessfullySaved')); + abp.notify.success(l('SavedSuccessfully')); abp.ui.clearBusy(); location.href = "../BlogPosts"; } diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/index.js b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/index.js index 164ec2d2ae..b35413a729 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/index.js +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/index.js @@ -95,7 +95,7 @@ $(function () { .draft(data.record.id) .then(function () { dataTable.ajax.reloadEx(); - abp.notify.success(l('SuccessfullySaved')); + abp.notify.success(l('SavedSuccessfully')); checkHasBlogPostWaitingForReview(); }); } diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/update.js b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/update.js index 5084eca9da..96d640127e 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/update.js +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/update.js @@ -134,7 +134,7 @@ $(function () { } function finishSaving(result) { - abp.notify.success(l('SuccessfullySaved')); + abp.notify.success(l('SavedSuccessfully')); abp.ui.clearBusy(); location.href = "../../BlogPosts"; } diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/create.js b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/create.js index a9fb83c82d..1b3ccea05f 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/create.js +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/create.js @@ -37,7 +37,7 @@ $(function () { $createForm.ajaxSubmit({ success: function (result) { - abp.notify.success(l('SuccessfullySaved')); + abp.notify.success(l('SavedSuccessfully')); abp.ui.clearBusy(); location.href = "../Pages"; }, diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/update.js b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/update.js index 44722cd83b..d75fb9bdda 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/update.js +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/update.js @@ -35,7 +35,7 @@ $(function () { $formUpdate.ajaxSubmit({ success: function (result) { - abp.notify.success(l('SuccessfullySaved')); + abp.notify.success(l('SavedSuccessfully')); abp.ui.clearBusy(); location.href = "../../Pages"; } diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Web/wwwroot/cms-kit/dummy-placeholder-1280x720.png b/modules/cms-kit/src/Volo.CmsKit.Common.Web/wwwroot/cms-kit/dummy-placeholder-1280x720.png index ac980eebf2..0563548ea9 100644 Binary files a/modules/cms-kit/src/Volo.CmsKit.Common.Web/wwwroot/cms-kit/dummy-placeholder-1280x720.png and b/modules/cms-kit/src/Volo.CmsKit.Common.Web/wwwroot/cms-kit/dummy-placeholder-1280x720.png differ diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Web/wwwroot/cms-kit/dummy-placeholder-320x180.png b/modules/cms-kit/src/Volo.CmsKit.Common.Web/wwwroot/cms-kit/dummy-placeholder-320x180.png index cbb9b8ce6e..05ce8f1cc3 100644 Binary files a/modules/cms-kit/src/Volo.CmsKit.Common.Web/wwwroot/cms-kit/dummy-placeholder-320x180.png and b/modules/cms-kit/src/Volo.CmsKit.Common.Web/wwwroot/cms-kit/dummy-placeholder-320x180.png differ diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/ar.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/ar.json index 2ae0363ec4..faf98ebbb6 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/ar.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/ar.json @@ -147,7 +147,7 @@ "SubjectPlaceholder": "الرجاء كتابة موضوع", "Submit": "يقدم", "Subscribe": "الإشتراك", - "SuccessfullySaved": "تم الحفظ بنجاح!", + "SavedSuccessfully": "تم الحفظ بنجاح!", "TagDeletionConfirmationMessage": "هل أنت متأكد من حذف العلامة \"{0}\"؟", "Tags": "العلامات", "Text": "نص", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/cs.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/cs.json index 6b22cc8ae5..c4534837fa 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/cs.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/cs.json @@ -147,7 +147,7 @@ "SubjectPlaceholder": "Zadejte předmět", "Submit": "Předložit", "Subscribe": "předplatit", - "SuccessfullySaved": "Úspěšně uloženo!", + "SavedSuccessfully": "Úspěšně uloženo!", "TagDeletionConfirmationMessage": "Opravdu chcete smazat značku '{0}'?", "Tags": "Tagy", "Text": "Text", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/de-DE.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/de-DE.json index 8a34408bab..98b8b731c4 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/de-DE.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/de-DE.json @@ -142,7 +142,7 @@ "SubjectPlaceholder": "Bitte geben Sie einen Betreff ein", "Submit": "einreichen", "Subscribe": "Abonnieren", - "SuccessfullySaved": "Erfolgreich gespeichert!", + "SavedSuccessfully": "Erfolgreich gespeichert!", "TagDeletionConfirmationMessage": "Möchten Sie das Tag '{0}' wirklich löschen?", "Tags": "Stichworte", "Text": "Text", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/de.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/de.json index 3c4a2984ef..31bae240c3 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/de.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/de.json @@ -147,7 +147,7 @@ "SubjectPlaceholder": "Bitte geben Sie einen Betreff ein", "Submit": "Einreichen", "Subscribe": "Abonnieren", - "SuccessfullySaved": "Erfolgreich gespeichert!", + "SavedSuccessfully": "Erfolgreich gespeichert!", "TagDeletionConfirmationMessage": "Sind Sie sicher, dass Sie das Tag „{0}“ löschen?", "Tags": "Stichworte", "Text": "Text", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/el.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/el.json index 7155c127a3..695cdd21eb 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/el.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/el.json @@ -145,7 +145,7 @@ "SubjectPlaceholder": "Πληκτρολογήστε ένα θέμα", "Submit": "Υποβολή", "Subscribe": "Εγγραφή", - "SuccessfullySaved": "Αποθηκεύτηκε με επιτυχία!", + "SavedSuccessfully": "Αποθηκεύτηκε με επιτυχία!", "TagDeletionConfirmationMessage": "Είστε βέβαιοι ότι θα διαγράψετε την ετικέτα '{0}'.;", "Tags": "Ετικέτες", "Text": "Κείμενο", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json index 0a4a99fc30..a7ab34b119 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json @@ -147,7 +147,7 @@ "SubjectPlaceholder": "Please type a subject", "Submit": "Submit", "Subscribe": "Subscribe", - "SuccessfullySaved": "Successfully saved!", + "SavedSuccessfully": "Saved successfully!", "TagDeletionConfirmationMessage": "Are you sure to delete '{0}' tag?", "Tags": "Tags", "Text": "Text", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/es.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/es.json index 7c9d914404..e1ff8d7fc8 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/es.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/es.json @@ -147,7 +147,7 @@ "SubjectPlaceholder": "Por favor escriba un asunto", "Submit": "Enviar", "Subscribe": "Suscribir", - "SuccessfullySaved": "¡Guardado con éxito!", + "SavedSuccessfully": "¡Guardado con éxito!", "TagDeletionConfirmationMessage": "¿Está seguro de eliminar la etiqueta \"{0}\"?", "Tags": "Etiquetas", "Text": "Texto", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/fa.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/fa.json index ae4a2034db..e044cde1a5 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/fa.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/fa.json @@ -142,7 +142,7 @@ "SubjectPlaceholder": "لطفا یک موضوع را تایپ کنید", "Submit": "ارسال", "Subscribe": "اشتراک", - "SuccessfullySaved": "با موفقیت ذخیره گردید!", + "SavedSuccessfully": "با موفقیت ذخیره گردید!", "TagDeletionConfirmationMessage": "آیا مطمئن هستید که برچسب '{0}' را حذف می کنید؟", "Tags": "برچسب ها", "Text": "متن", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/fi.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/fi.json index 9fe9a4fd05..82d622f05f 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/fi.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/fi.json @@ -147,7 +147,7 @@ "SubjectPlaceholder": "Kirjoita aihe", "Submit": "Lähetä", "Subscribe": "Tilaa", - "SuccessfullySaved": "Tallennettu onnistuneesti!", + "SavedSuccessfully": "Tallennettu onnistuneesti!", "TagDeletionConfirmationMessage": "Haluatko varmasti poistaa tagin {0}?", "Tags": "Tunnisteet", "Text": "Teksti", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/fr.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/fr.json index f083dedc11..634c1fec85 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/fr.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/fr.json @@ -147,7 +147,7 @@ "SubjectPlaceholder": "Veuillez saisir un sujet", "Submit": "Soumettre", "Subscribe": "S'abonner", - "SuccessfullySaved": "Enregistré avec succès!", + "SavedSuccessfully": "Enregistré avec succès!", "TagDeletionConfirmationMessage": "Êtes-vous sûr de vouloir supprimer la balise \"{0}\"?", "Tags": "Mots clés", "Text": "Texte", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/hi.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/hi.json index c6ef1c1446..dcea398df5 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/hi.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/hi.json @@ -147,7 +147,7 @@ "SubjectPlaceholder": "कृपया एक विषय लिखें", "Submit": "प्रस्तुत", "Subscribe": "सदस्यता लेने के", - "SuccessfullySaved": "सफलतापूर्वक संचित कर लिया गया है!", + "SavedSuccessfully": "सफलतापूर्वक संचित कर लिया गया है!", "TagDeletionConfirmationMessage": "क्या आप '{0}' टैग हटाना सुनिश्चित कर रहे हैं?", "Tags": "टैग", "Text": "टेक्स्ट", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/hr.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/hr.json index f610835e57..d2dff83aee 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/hr.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/hr.json @@ -147,7 +147,7 @@ "SubjectPlaceholder": "Molimo upišite predmet", "Submit": "podnijeti", "Subscribe": "Pretplatite se", - "SuccessfullySaved": "Uspješno spremljeno!", + "SavedSuccessfully": "Uspješno spremljeno!", "TagDeletionConfirmationMessage": "Jeste li sigurni da želite izbrisati oznaku '{0}'?", "Tags": "Oznake", "Text": "Tekst", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/hu.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/hu.json index 8468419e49..219d9f95a7 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/hu.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/hu.json @@ -147,7 +147,7 @@ "SubjectPlaceholder": "Kérjük, írjon be egy tárgyat", "Submit": "Beküldés", "Subscribe": "Iratkozz fel", - "SuccessfullySaved": "Sikeres mentés!", + "SavedSuccessfully": "Sikeres mentés!", "TagDeletionConfirmationMessage": "Biztosan törli a(z) \"{0}\" címkét?", "Tags": "Címkék", "Text": "Szöveg", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/is.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/is.json index c3a60c1af6..6788847dd7 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/is.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/is.json @@ -147,7 +147,7 @@ "SubjectPlaceholder": "Vinsamlegast settu inn viðfangsefni", "Submit": "Senda inn", "Subscribe": "Gerast áskrifandi", - "SuccessfullySaved": "Tókst að vista!", + "SavedSuccessfully": "Tókst að vista!", "TagDeletionConfirmationMessage": "Ertu viss um að eyða tagginu '{0}'?", "Tags": "Tögg", "Text": "Texti", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/it.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/it.json index fd962acca3..c6d84a4f62 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/it.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/it.json @@ -147,7 +147,7 @@ "SubjectPlaceholder": "Si prega di digitare un oggetto", "Submit": "Invia", "Subscribe": "Sottoscrivi", - "SuccessfullySaved": "Salvato con successo!", + "SavedSuccessfully": "Salvato con successo!", "TagDeletionConfirmationMessage": "Sei sicuro di eliminare il tag '{0}'?", "Tags": "Tag", "Text": "Testo", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/nl.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/nl.json index eaf1185fc4..b7c275078a 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/nl.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/nl.json @@ -147,7 +147,7 @@ "SubjectPlaceholder": "Typ een onderwerp", "Submit": "Verzenden", "Subscribe": "Abonneren", - "SuccessfullySaved": "Succesvol opgeslagen!", + "SavedSuccessfully": "Succesvol opgeslagen!", "TagDeletionConfirmationMessage": "Weet u zeker dat u de tag '{0}' wilt verwijderen?", "Tags": "Tags", "Text": "Tekst", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/pl-PL.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/pl-PL.json index a0a8b23b59..5237c0dc95 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/pl-PL.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/pl-PL.json @@ -147,7 +147,7 @@ "SubjectPlaceholder": "Proszę wpisać temat", "Submit": "Składać", "Subscribe": "Subskrybuj", - "SuccessfullySaved": "Zapisano pomyślnie!", + "SavedSuccessfully": "Zapisano pomyślnie!", "TagDeletionConfirmationMessage": "Czy na pewno chcesz usunąć tag „{0}”?", "Tags": "Tagi", "Text": "Tekst", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/pt-BR.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/pt-BR.json index eabe56c23f..3182469634 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/pt-BR.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/pt-BR.json @@ -147,7 +147,7 @@ "SubjectPlaceholder": "Por favor digite um assunto", "Submit": "Enviar", "Subscribe": "Inscrever-se", - "SuccessfullySaved": "Salvo com sucesso!", + "SavedSuccessfully": "Salvo com sucesso!", "TagDeletionConfirmationMessage": "Tem certeza que deseja excluir a tag '{0}'?", "Tags": "Tag", "Text": "Texto", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/ro-RO.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/ro-RO.json index 6532245847..7b9173f477 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/ro-RO.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/ro-RO.json @@ -147,7 +147,7 @@ "SubjectPlaceholder": "Vă rugăm să scrieţi un subiect", "Submit": "Trimiteţi", "Subscribe": "Abonaţi-vă", - "SuccessfullySaved": "Salvat cu succes!", + "SavedSuccessfully": "Salvat cu succes!", "TagDeletionConfirmationMessage": "Sunteţi sigur(ă) că vreţi să ştergeţi eticheta '{0}'?", "Tags": "Etichete", "Text": "Text", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/ru.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/ru.json index 19085289be..491435bc02 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/ru.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/ru.json @@ -147,7 +147,7 @@ "SubjectPlaceholder": "Пожалуйста, введите тему", "Submit": "Представлять на рассмотрение", "Subscribe": "Подписывайся", - "SuccessfullySaved": "Успешно сохранено!", + "SavedSuccessfully": "Успешно сохранено!", "TagDeletionConfirmationMessage": "Вы действительно хотите удалить тег \"{0}\"?", "Tags": "Теги", "Text": "Текст", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/sk.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/sk.json index a9a23965d0..c579340750 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/sk.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/sk.json @@ -147,7 +147,7 @@ "SubjectPlaceholder": "Zadajte prosím predmet", "Submit": "Odoslať", "Subscribe": "Odoberať", - "SuccessfullySaved": "Úspešne uložené!", + "SavedSuccessfully": "Úspešne uložené!", "TagDeletionConfirmationMessage": "Určite chcete odstrániť tag '{0}'?", "Tags": "Tagy", "Text": "Text", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/sl.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/sl.json index 68eeffa634..6e3157f56e 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/sl.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/sl.json @@ -147,7 +147,7 @@ "SubjectPlaceholder": "Vnesite zadevo", "Submit": "Pošlji", "Subscribe": "Naročite se", - "SuccessfullySaved": "Uspešno shranjeno!", + "SavedSuccessfully": "Uspešno shranjeno!", "TagDeletionConfirmationMessage": "Ali ste prepričani, da želite izbrisati oznako »{0}«?", "Tags": "Oznake", "Text": "Besedilo", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json index 78c5f9341e..3605cb9d3b 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json @@ -144,7 +144,7 @@ "SubjectPlaceholder": "Lütfen bir konu yazınız", "Submit": "Kaydet", "Subscribe": "Abone ol", - "SuccessfullySaved": "Başarıyla kaydedildi!", + "SavedSuccessfully": "Başarıyla kaydedildi!", "TagDeletionConfirmationMessage": "'{0}' etiketini silmek istediğinize emin misiniz?", "Tags": "Etiketler", "Text": "Metin", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/vi.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/vi.json index ab943e8b91..1ec430edc3 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/vi.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/vi.json @@ -147,7 +147,7 @@ "SubjectPlaceholder": "Vui lòng nhập một chủ đề", "Submit": "Nộp", "Subscribe": "Đặt mua", - "SuccessfullySaved": "Lưu thành công!", + "SavedSuccessfully": "Lưu thành công!", "TagDeletionConfirmationMessage": "Bạn có chắc chắn xóa thẻ '{0}' không?", "Tags": "Thẻ", "Text": "Chữ", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/zh-Hans.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/zh-Hans.json index 76c8f2b2a1..c02fcf614d 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/zh-Hans.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/zh-Hans.json @@ -147,7 +147,7 @@ "SubjectPlaceholder": "请输入主题", "Submit": "提交", "Subscribe": "订阅", - "SuccessfullySaved": "成功保存!", + "SavedSuccessfully": "成功保存!", "TagDeletionConfirmationMessage": "您确定要删除\"{0}\"标签吗?", "Tags": "标签", "Text": "文本", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/zh-Hant.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/zh-Hant.json index 62c70a6b9e..866fd3fcea 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/zh-Hant.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/zh-Hant.json @@ -147,7 +147,7 @@ "SubjectPlaceholder": "請輸入主題", "Submit": "提交", "Subscribe": "訂閱", - "SuccessfullySaved": "保存成功!", + "SavedSuccessfully": "保存成功!", "TagDeletionConfirmationMessage": "你確定刪除 '{0}' 標籤嗎?", "Tags": "標籤", "Text": "文本", diff --git a/modules/docs/app/VoloDocs.Web/VoloDocs.Web.csproj b/modules/docs/app/VoloDocs.Web/VoloDocs.Web.csproj index 98b3f1ff90..bc6c12fc77 100644 --- a/modules/docs/app/VoloDocs.Web/VoloDocs.Web.csproj +++ b/modules/docs/app/VoloDocs.Web/VoloDocs.Web.csproj @@ -31,6 +31,7 @@ + @@ -42,6 +43,7 @@ + diff --git a/modules/docs/app/VoloDocs.Web/VoloDocsWebModule.cs b/modules/docs/app/VoloDocs.Web/VoloDocsWebModule.cs index 8d36d58de4..3738b1071b 100644 --- a/modules/docs/app/VoloDocs.Web/VoloDocsWebModule.cs +++ b/modules/docs/app/VoloDocs.Web/VoloDocsWebModule.cs @@ -35,6 +35,7 @@ using Volo.Abp.Account; using Volo.Abp.PermissionManagement.HttpApi; using Volo.Abp.Validation.Localization; using Volo.Docs.Documents.FullSearch.Elastic; +using Volo.Abp.Caching.StackExchangeRedis; namespace VoloDocs.Web { @@ -57,6 +58,7 @@ namespace VoloDocs.Web typeof(AbpPermissionManagementApplicationModule), typeof(AbpPermissionManagementHttpApiModule), typeof(AbpAspNetCoreMvcUiBasicThemeModule) + ,typeof(AbpCachingStackExchangeRedisModule) )] public class VoloDocsWebModule : AbpModule { diff --git a/modules/docs/src/Volo.Docs.Admin.Application/Volo/Docs/Admin/Documents/DocumentAdminAppService.cs b/modules/docs/src/Volo.Docs.Admin.Application/Volo/Docs/Admin/Documents/DocumentAdminAppService.cs index 3b777ece48..9356ba9c38 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application/Volo/Docs/Admin/Documents/DocumentAdminAppService.cs +++ b/modules/docs/src/Volo.Docs.Admin.Application/Volo/Docs/Admin/Documents/DocumentAdminAppService.cs @@ -58,21 +58,21 @@ namespace Volo.Docs.Admin.Documents await _versionCache.RemoveAsync(versionCacheKey, true); var documents = await _documentRepository.GetListByProjectId(project.Id); - - foreach (var document in documents) - { - var documentUpdateInfoCacheKey = CacheKeyGenerator.GenerateDocumentUpdateInfoCacheKey( + + var documentUpdateInfoCacheKeys = documents.Select(document => + CacheKeyGenerator.GenerateDocumentUpdateInfoCacheKey( project: project, documentName: document.Name, languageCode: document.LanguageCode, version: document.Version - ); - - await _documentUpdateCache.RemoveAsync(documentUpdateInfoCacheKey); + ) + ); + + await _documentUpdateCache.RemoveManyAsync(documentUpdateInfoCacheKeys); + + documents.ForEach(document => document.LastCachedTime = DateTime.MinValue); - document.LastCachedTime = DateTime.MinValue; - await _documentRepository.UpdateAsync(document); - } + await _documentRepository.UpdateManyAsync(documents); } public virtual async Task PullAllAsync(PullAllDocumentInput input) diff --git a/modules/docs/src/Volo.Docs.Application/Volo/Docs/Documents/DocumentAppService.cs b/modules/docs/src/Volo.Docs.Application/Volo/Docs/Documents/DocumentAppService.cs index 322282ed32..0fe6c18699 100644 --- a/modules/docs/src/Volo.Docs.Application/Volo/Docs/Documents/DocumentAppService.cs +++ b/modules/docs/src/Volo.Docs.Application/Volo/Docs/Documents/DocumentAppService.cs @@ -118,18 +118,24 @@ namespace Volo.Docs.Documents .Where(x => !x.Path.IsNullOrWhiteSpace()) .ToList(); + var cacheKeys = leafs.Select(leaf => + CacheKeyGenerator.GenerateDocumentUpdateInfoCacheKey(project, leaf.Path, input.LanguageCode, input.Version) + ); + var documentUpdateInfos = await DocumentUpdateCache.GetManyAsync(cacheKeys); + foreach (var leaf in leafs) { - var cacheKey = - CacheKeyGenerator.GenerateDocumentUpdateInfoCacheKey(project, leaf.Path, input.LanguageCode, - input.Version); - var documentUpdateInfo = await DocumentUpdateCache.GetAsync(cacheKey); - if (documentUpdateInfo != null) + var key = CacheKeyGenerator.GenerateDocumentUpdateInfoCacheKey(project, leaf.Path, input.LanguageCode, input.Version); + var (_, documentUpdateInfo) = documentUpdateInfos.FirstOrDefault(x => x.Key == key); + + if (documentUpdateInfo == null) { - leaf.CreationTime = documentUpdateInfo.CreationTime; - leaf.LastUpdatedTime = documentUpdateInfo.LastUpdatedTime; - leaf.LastSignificantUpdateTime = documentUpdateInfo.LastSignificantUpdateTime; + continue; } + + leaf.CreationTime = documentUpdateInfo.CreationTime; + leaf.LastUpdatedTime = documentUpdateInfo.LastUpdatedTime; + leaf.LastSignificantUpdateTime = documentUpdateInfo.LastSignificantUpdateTime; } await NavigationTreePostProcessor.ProcessAsync( diff --git a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs index e45cf88e0e..e93be287f8 100644 --- a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs +++ b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs @@ -328,7 +328,7 @@ namespace Volo.Docs.Pages.Documents.Project } var output = await _projectAppService.GetVersionsAsync(Project.ShortName); - var versions = output.Items.ToList() + var versions = output.Items .Select(v => new VersionInfoViewModel(v.DisplayName, v.Name)) .ToList(); diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Pages/SettingManagement/EmailSettingGroup/EmailSettingGroupViewComponent.razor.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Pages/SettingManagement/EmailSettingGroup/EmailSettingGroupViewComponent.razor.cs index ebdcff25d3..9a1d36be44 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Pages/SettingManagement/EmailSettingGroup/EmailSettingGroupViewComponent.razor.cs +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Pages/SettingManagement/EmailSettingGroup/EmailSettingGroupViewComponent.razor.cs @@ -72,7 +72,7 @@ public partial class EmailSettingGroupViewComponent await CurrentApplicationConfigurationCacheResetService.ResetAsync(); - await UiMessageService.Success(L["SuccessfullySaved"]); + await Notify.Success(L["SavedSuccessfully"]); } catch (Exception ex) { diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Pages/SettingManagement/TimeZoneSettingGroup/TimeZoneSettingGroupViewComponent.razor.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Pages/SettingManagement/TimeZoneSettingGroup/TimeZoneSettingGroupViewComponent.razor.cs index 27dc472e1c..587534c4bd 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Pages/SettingManagement/TimeZoneSettingGroup/TimeZoneSettingGroupViewComponent.razor.cs +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Pages/SettingManagement/TimeZoneSettingGroup/TimeZoneSettingGroupViewComponent.razor.cs @@ -48,7 +48,7 @@ public partial class TimeZoneSettingGroupViewComponent { await TimeZoneSettingsAppService.UpdateAsync(TimezoneSettings.Timezone); await CurrentApplicationConfigurationCacheResetService.ResetAsync(); - await UiMessageService.Success(L["SuccessfullySaved"]); + await Notify.Success(L["SavedSuccessfully"]); } catch (Exception ex) { diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/ar.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/ar.json index 86dbb1c29b..ffddca67f0 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/ar.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/ar.json @@ -2,7 +2,7 @@ "culture": "ar", "texts": { "Settings": "الإعدادات", - "SuccessfullySaved": "تم الحفظ بنجاح", + "SavedSuccessfully": "تم الحفظ بنجاح", "Permission:SettingManagement": "إدارة الإعداد", "Permission:Emailing": "إرسال بالبريد الإلكتروني", "Permission:EmailingTest": "اختبار البريد الإلكتروني", diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/cs.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/cs.json index 88fb2a454d..db40a302ab 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/cs.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/cs.json @@ -2,7 +2,7 @@ "culture": "cs", "texts": { "Settings": "Nastavení", - "SuccessfullySaved": "Úspěšně uloženo", + "SavedSuccessfully": "Úspěšně uloženo", "Permission:SettingManagement": "Správa nastavení", "Permission:Emailing": "Zasílání e-mailem", "Permission:EmailingTest": "Test zasílání e-mailem", diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/de-DE.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/de-DE.json index f7df768c2d..486208a35a 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/de-DE.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/de-DE.json @@ -2,7 +2,7 @@ "culture": "de-DE", "texts": { "Settings": "Einstellungen", - "SuccessfullySaved": "Erfolgreich gespeichert", + "SavedSuccessfully": "Erfolgreich gespeichert", "Permission:SettingManagement": "Einstellungen-Verwaltung", "Permission:Emailing": "E-Mail", "Permission:EmailingTest": "Test E-Mails", diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/de.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/de.json index ebe5cf350f..e908e08d2d 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/de.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/de.json @@ -2,7 +2,7 @@ "culture": "de", "texts": { "Settings": "Einstellungen", - "SuccessfullySaved": "Erfolgreich gespeichert", + "SavedSuccessfully": "Erfolgreich gespeichert", "Permission:SettingManagement": "Einstellungsmanagement", "Permission:Emailing": "E-Mail senden", "Permission:EmailingTest": "E-Mail-Test", diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/el.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/el.json index b2c8048d52..a6a6cbf6af 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/el.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/el.json @@ -2,7 +2,7 @@ "culture": "el", "texts": { "Settings": "Ρυθμίσεις", - "SuccessfullySaved": "Αποθηκεύτηκε με επιτυχία", + "SavedSuccessfully": "Αποθηκεύτηκε με επιτυχία", "Permission:SettingManagement": "Διαχείριση ρυθμίσεων", "Permission:Emailing": "Αποστολή email", "Permission:EmailingTest": "Αποστολή δοκιμαστικού email", diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/en-GB.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/en-GB.json index 722d3e8896..6284af2e2f 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/en-GB.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/en-GB.json @@ -2,6 +2,6 @@ "culture": "en-GB", "texts": { "Settings": "Settings", - "SuccessfullySaved": "Successfully saved" + "SavedSuccessfully": "Saved successfully" } } \ No newline at end of file diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/en.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/en.json index 5307ee24dc..09d52cf468 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/en.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/en.json @@ -2,7 +2,7 @@ "culture": "en", "texts": { "Settings": "Settings", - "SuccessfullySaved": "Successfully saved", + "SavedSuccessfully": "Saved successfully", "Permission:SettingManagement": "Setting management", "Permission:Emailing": "Emailing", "Permission:EmailingTest": "Emailing test", diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/es.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/es.json index 5c9176f39a..f194b92c3c 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/es.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/es.json @@ -2,7 +2,7 @@ "culture": "es", "texts": { "Settings": "Configuraciones", - "SuccessfullySaved": "Guardado correctamente", + "SavedSuccessfully": "Guardado correctamente", "Permission:SettingManagement": "Configuraciones de correo electronico", "Permission:Emailing": "Configuración", "Permission:EmailingTest": "prueba de correo electrónico", diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/fa.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/fa.json index d7175c0fd5..1a07a34adf 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/fa.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/fa.json @@ -2,7 +2,7 @@ "culture": "fa", "texts": { "Settings": "تنظیمات", - "SuccessfullySaved": "با موفقیت ذخیره شد", + "SavedSuccessfully": "با موفقیت ذخیره شد", "Permission:SettingManagement": "مدیریت تنظیمات", "Permission:Emailing": "تنظیمات ایمیل", "Menu:Emailing": "تنظیمات ایمیل", diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/fi.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/fi.json index 28ab6f593d..2d96634dd1 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/fi.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/fi.json @@ -2,7 +2,7 @@ "culture": "fi", "texts": { "Settings": "Asetukset", - "SuccessfullySaved": "Tallennettu onnistuneesti", + "SavedSuccessfully": "Tallennettu onnistuneesti", "Permission:SettingManagement": "Asetusten hallinta", "Permission:Emailing": "Sähköpostiviestit", "Permission:EmailingTest": "Sähköpostitesti", diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/fr.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/fr.json index 5d25cffcba..a9ed890fff 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/fr.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/fr.json @@ -2,7 +2,7 @@ "culture": "fr", "texts": { "Settings": "Paramètres", - "SuccessfullySaved": "Enregistré avec succès", + "SavedSuccessfully": "Enregistré avec succès", "Permission:SettingManagement": "Gestion des paramètres", "Permission:Emailing": "Envoi par e-mail", "Permission:EmailingTest": "Test d'emailing", diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/hi.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/hi.json index beacd78318..276690e1d4 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/hi.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/hi.json @@ -2,7 +2,7 @@ "culture": "hi", "texts": { "Settings": "समायोजन", - "SuccessfullySaved": "सफलतापूर्वक संचित कर लिया गया है", + "SavedSuccessfully": "सफलतापूर्वक संचित कर लिया गया है", "Permission:SettingManagement": "प्रबंधन की स्थापना", "Permission:Emailing": "ईमेल से भेजना", "Permission:EmailingTest": "ईमेल परीक्षण", diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/hr.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/hr.json index cd74569b30..038d8f10b4 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/hr.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/hr.json @@ -2,7 +2,7 @@ "culture": "hr", "texts": { "Settings": "Postavke", - "SuccessfullySaved": "Uspješno spremljeno", + "SavedSuccessfully": "Uspješno spremljeno", "Permission:SettingManagement": "Upravljanje postavkama", "Permission:Emailing": "Slanje e-poštom", "Permission:EmailingTest": "Test slanja e-pošte", diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/hu.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/hu.json index 2d18c7299a..b58a9315b2 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/hu.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/hu.json @@ -2,7 +2,7 @@ "culture": "hu", "texts": { "Settings": "Beállítások", - "SuccessfullySaved": "Sikeresen mentve", + "SavedSuccessfully": "Sikeresen mentve", "Permission:SettingManagement": "Beállításkezelés", "Permission:Emailing": "E-mailezés", "Permission:EmailingTest": "E-mail teszt", diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/is.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/is.json index a15b19a7ca..96cc57b8b9 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/is.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/is.json @@ -2,7 +2,7 @@ "culture": "is", "texts": { "Settings": "Stillingar", - "SuccessfullySaved": "Tókst að vista", + "SavedSuccessfully": "Tókst að vista", "Permission:SettingManagement": "Stillingar", "Permission:Emailing": "Senda tölvupóst", "Permission:EmailingTest": "Próf í tölvupósti", diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/it.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/it.json index e578e2cc5a..4b85d89552 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/it.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/it.json @@ -2,7 +2,7 @@ "culture": "it", "texts": { "Settings": "Impostazioni", - "SuccessfullySaved": "Salvato con successo", + "SavedSuccessfully": "Salvato con successo", "Permission:SettingManagement": "Gestione delle impostazioni", "Permission:Emailing": "Invio di e-mail", "Permission:EmailingTest": "Prova di invio tramite posta elettronica", diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/nl.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/nl.json index 539352327a..4cba0f5c21 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/nl.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/nl.json @@ -2,7 +2,7 @@ "culture": "nl", "texts": { "Settings": "Instellingen", - "SuccessfullySaved": "Succesvol opgeslagen", + "SavedSuccessfully": "Succesvol opgeslagen", "Permission:SettingManagement": "Instellingenbeheer", "Permission:Emailing": "E-mail", "Permission:EmailingTest": "E-mailtest", diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/pl-PL.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/pl-PL.json index b3283a2e4d..c1d2af54dd 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/pl-PL.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/pl-PL.json @@ -2,7 +2,7 @@ "culture": "pl-PL", "texts": { "Settings": "Ustawienia", - "SuccessfullySaved": "Zapisano pomyślnie", + "SavedSuccessfully": "Zapisano pomyślnie", "Permission:SettingManagement": "Zarządzanie ustawieniami", "Permission:Emailing": "Wysyłanie e-maili", "Permission:EmailingTest": "Test wysyłania e-maili", diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/pt-BR.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/pt-BR.json index bb612b6add..6ea5d05c1d 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/pt-BR.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/pt-BR.json @@ -2,7 +2,7 @@ "culture": "pt-BR", "texts": { "Settings": "Configurações", - "SuccessfullySaved": "Salvo com sucesso!", + "SavedSuccessfully": "Salvo com sucesso!", "Permission:SettingManagement": "Gestão de Cenários", "Permission:Emailing": "Enviando por e-mail", "Permission:EmailingTest": "Teste de e-mail", diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/ro-RO.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/ro-RO.json index cc5d27fad1..a3b10ffb4d 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/ro-RO.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/ro-RO.json @@ -2,7 +2,7 @@ "culture": "ro-RO", "texts": { "Settings": "Setări", - "SuccessfullySaved": "Salvat cu succes", + "SavedSuccessfully": "Salvat cu succes", "Permission:SettingManagement": "Administrarea setărilor", "Permission:Emailing": "Emailing", "Permission:EmailingTest": "Test de trimitere prin e-mail", diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/ru.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/ru.json index a81b588c31..2b60f7981a 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/ru.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/ru.json @@ -2,7 +2,7 @@ "culture": "ru", "texts": { "Settings": "Настройки", - "SuccessfullySaved": "Успешно сохранено", + "SavedSuccessfully": "Успешно сохранено", "Permission:SettingManagement": "Управление настройками", "Permission:Emailing": "Отправка по электронной почте", "Permission:EmailingTest": "Тестовая рассылка по электронной почте", diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/sk.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/sk.json index f4542c3e3f..962f6de4e9 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/sk.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/sk.json @@ -2,7 +2,7 @@ "culture": "sk", "texts": { "Settings": "Nastavenia", - "SuccessfullySaved": "Úspešne uložené", + "SavedSuccessfully": "Úspešne uložené", "Permission:SettingManagement": "Správa nastavení", "Permission:Emailing": "Posielanie emailov", "Permission:EmailingTest": "Test odosielania e-mailov", diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/sl.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/sl.json index e89803e78c..6f3faabfee 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/sl.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/sl.json @@ -2,7 +2,7 @@ "culture": "sl", "texts": { "Settings": "Nastavitve", - "SuccessfullySaved": "Uspešno shranjeno", + "SavedSuccessfully": "Uspešno shranjeno", "Permission:SettingManagement": "Upravljanje nastavitev", "Permission:Emailing": "Pošiljanje po e-pošti", "Permission:EmailingTest": "Test pošiljanja po e-pošti", diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/tr.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/tr.json index b773a3d1a5..2042c4ec6a 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/tr.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/tr.json @@ -2,7 +2,7 @@ "culture": "tr", "texts": { "Settings": "Ayarlar", - "SuccessfullySaved": "Başarıyla Kaydedildi", + "SavedSuccessfully": "Başarıyla Kaydedildi", "Permission:SettingManagement": "Ayarlar yönetimi", "Permission:Emailing": "Email", "Permission:EmailingTest": "Email testi", diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/vi.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/vi.json index 41ecdd5e56..d843b37714 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/vi.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/vi.json @@ -2,7 +2,7 @@ "culture": "vi", "texts": { "Settings": "Cài đặt", - "SuccessfullySaved": "Lưu thành công", + "SavedSuccessfully": "Lưu thành công", "Permission:SettingManagement": "Cài đặt quản lý", "Permission:Emailing": "Gửi email", "Permission:EmailingTest": "Kiểm tra gửi email", diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/zh-Hans.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/zh-Hans.json index f024f9f775..a01cd3bc14 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/zh-Hans.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/zh-Hans.json @@ -2,7 +2,7 @@ "culture": "zh-Hans", "texts": { "Settings": "设置", - "SuccessfullySaved": "保存成功", + "SavedSuccessfully": "保存成功", "Permission:SettingManagement": "设置管理", "Permission:Emailing": "邮件", "Permission:EmailingTest": "邮件测试", diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/zh-Hant.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/zh-Hant.json index 3c2e08f42f..fe219f36e9 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/zh-Hant.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/zh-Hant.json @@ -2,7 +2,7 @@ "culture": "zh-Hant", "texts": { "Settings": "設置", - "SuccessfullySaved": "保存成功", + "SavedSuccessfully": "保存成功", "Permission:SettingManagement": "設定管理", "Permission:Emailing": "信箱", "Permission:EmailingTest": "郵件測試", diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Index.js b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Index.js index d2f9f580c4..ff279d427f 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Index.js +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Index.js @@ -27,7 +27,7 @@ }).first().click(); $(document).on('AbpSettingSaved', function () { - abp.notify.success(l('SuccessfullySaved')); + abp.notify.success(l('SavedSuccessfully')); abp.ajax({ url: abp.appPath + 'SettingManagement?handler=RefreshConfiguration' diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Application/Volo/Abp/TenantManagement/TenantAppService.cs b/modules/tenant-management/src/Volo.Abp.TenantManagement.Application/Volo/Abp/TenantManagement/TenantAppService.cs index 46c85578f4..e902482c43 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Application/Volo/Abp/TenantManagement/TenantAppService.cs +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Application/Volo/Abp/TenantManagement/TenantAppService.cs @@ -5,6 +5,7 @@ using Microsoft.AspNetCore.Authorization; using Volo.Abp.Application.Dtos; using Volo.Abp.Data; using Volo.Abp.EventBus.Distributed; +using Volo.Abp.EventBus.Local; using Volo.Abp.MultiTenancy; using Volo.Abp.ObjectExtending; @@ -17,17 +18,20 @@ public class TenantAppService : TenantManagementAppServiceBase, ITenantAppServic protected ITenantRepository TenantRepository { get; } protected ITenantManager TenantManager { get; } protected IDistributedEventBus DistributedEventBus { get; } + protected ILocalEventBus LocalEventBus { get; } public TenantAppService( ITenantRepository tenantRepository, ITenantManager tenantManager, IDataSeeder dataSeeder, - IDistributedEventBus distributedEventBus) + IDistributedEventBus distributedEventBus, + ILocalEventBus localEventBus) { DataSeeder = dataSeeder; TenantRepository = tenantRepository; TenantManager = tenantManager; DistributedEventBus = distributedEventBus; + LocalEventBus = localEventBus; } public virtual async Task GetAsync(Guid id) @@ -132,6 +136,10 @@ public class TenantAppService : TenantManagementAppServiceBase, ITenantAppServic public virtual async Task UpdateDefaultConnectionStringAsync(Guid id, string defaultConnectionString) { var tenant = await TenantRepository.GetAsync(id); + if (tenant.FindDefaultConnectionString() != defaultConnectionString) + { + await LocalEventBus.PublishAsync(new TenantChangedEvent(tenant.Id, tenant.NormalizedName)); + } tenant.SetDefaultConnectionString(defaultConnectionString); await TenantRepository.UpdateAsync(tenant); } @@ -141,6 +149,7 @@ public class TenantAppService : TenantManagementAppServiceBase, ITenantAppServic { var tenant = await TenantRepository.GetAsync(id); tenant.RemoveDefaultConnectionString(); + await LocalEventBus.PublishAsync(new TenantChangedEvent(tenant.Id, tenant.NormalizedName)); await TenantRepository.UpdateAsync(tenant); } } diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo/Abp/TenantManagement/TenantConfigurationCacheItemInvalidator.cs b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo/Abp/TenantManagement/TenantConfigurationCacheItemInvalidator.cs index 09c1a9368f..1956ae47ab 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo/Abp/TenantManagement/TenantConfigurationCacheItemInvalidator.cs +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo/Abp/TenantManagement/TenantConfigurationCacheItemInvalidator.cs @@ -4,14 +4,16 @@ using Volo.Abp.Caching; using Volo.Abp.DependencyInjection; using Volo.Abp.Domain.Entities.Events; using Volo.Abp.EventBus; +using Volo.Abp.EventBus.Local; using Volo.Abp.MultiTenancy; namespace Volo.Abp.TenantManagement; - +[LocalEventHandlerOrder(-1)] public class TenantConfigurationCacheItemInvalidator : ILocalEventHandler>, - ILocalEventHandler>, ITransientDependency + ILocalEventHandler, + ITransientDependency { protected IDistributedCache Cache { get; } @@ -22,12 +24,17 @@ public class TenantConfigurationCacheItemInvalidator : public virtual async Task HandleEventAsync(EntityChangedEventData eventData) { + if (eventData is EntityCreatedEventData) + { + return; + } + await ClearCacheAsync(eventData.Entity.Id, eventData.Entity.NormalizedName); } - public virtual async Task HandleEventAsync(EntityDeletedEventData eventData) + public virtual async Task HandleEventAsync(TenantChangedEvent eventData) { - await ClearCacheAsync(eventData.Entity.Id, eventData.Entity.NormalizedName); + await ClearCacheAsync(eventData.Id, eventData.NormalizedName); } protected virtual async Task ClearCacheAsync(Guid? id, string normalizedName) @@ -37,6 +44,7 @@ public class TenantConfigurationCacheItemInvalidator : { TenantConfigurationCacheItem.CalculateCacheKey(id, null), TenantConfigurationCacheItem.CalculateCacheKey(null, normalizedName), + TenantConfigurationCacheItem.CalculateCacheKey(id, normalizedName), }); } -} +} \ No newline at end of file diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo/Abp/TenantManagement/TenantManager.cs b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo/Abp/TenantManagement/TenantManager.cs index 648e02d381..0f40cfdd0b 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo/Abp/TenantManagement/TenantManager.cs +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo/Abp/TenantManagement/TenantManager.cs @@ -2,6 +2,7 @@ using System.Threading.Tasks; using Volo.Abp.Caching; using Volo.Abp.Domain.Services; +using Volo.Abp.EventBus.Local; using Volo.Abp.MultiTenancy; namespace Volo.Abp.TenantManagement; @@ -9,14 +10,17 @@ namespace Volo.Abp.TenantManagement; public class TenantManager : DomainService, ITenantManager { protected ITenantRepository TenantRepository { get; } - protected IDistributedCache Cache { get; } protected ITenantNormalizer TenantNormalizer { get; } + protected ILocalEventBus LocalEventBus { get; } - public TenantManager(ITenantRepository tenantRepository, IDistributedCache cache, ITenantNormalizer tenantNormalizer) + public TenantManager( + ITenantRepository tenantRepository, + ITenantNormalizer tenantNormalizer, + ILocalEventBus localEventBus) { TenantRepository = tenantRepository; - Cache = cache; TenantNormalizer = tenantNormalizer; + LocalEventBus = localEventBus; } public virtual async Task CreateAsync(string name) @@ -36,7 +40,7 @@ public class TenantManager : DomainService, ITenantManager var normalizedName = TenantNormalizer.NormalizeName(name); await ValidateNameAsync(normalizedName, tenant.Id); - await Cache.RemoveAsync(TenantConfigurationCacheItem.CalculateCacheKey(tenant.NormalizedName)); + await LocalEventBus.PublishAsync(new TenantChangedEvent(tenant.Id, tenant.NormalizedName)); tenant.SetName(name); tenant.SetNormalizedName(normalizedName); } diff --git a/modules/tenant-management/test/Volo.Abp.TenantManagement.Application.Tests/Volo/Abp/TenantManagement/TenantAppService_Tests.cs b/modules/tenant-management/test/Volo.Abp.TenantManagement.Application.Tests/Volo/Abp/TenantManagement/TenantAppService_Tests.cs index b797e05566..4288a66aea 100644 --- a/modules/tenant-management/test/Volo.Abp.TenantManagement.Application.Tests/Volo/Abp/TenantManagement/TenantAppService_Tests.cs +++ b/modules/tenant-management/test/Volo.Abp.TenantManagement.Application.Tests/Volo/Abp/TenantManagement/TenantAppService_Tests.cs @@ -2,6 +2,9 @@ using System.Linq; using System.Threading.Tasks; using Shouldly; +using Volo.Abp.Caching; +using Volo.Abp.MultiTenancy; +using Volo.Abp.Uow; using Xunit; namespace Volo.Abp.TenantManagement; @@ -9,10 +12,20 @@ namespace Volo.Abp.TenantManagement; public class TenantAppService_Tests : AbpTenantManagementApplicationTestBase { private readonly ITenantAppService _tenantAppService; + private readonly IUnitOfWorkManager _unitOfWorkManager; + private readonly IDistributedCache _cache; + private readonly ITenantStore _tenantStore; + private readonly ITenantRepository _tenantRepository; + private readonly ITenantNormalizer _tenantNormalizer; public TenantAppService_Tests() { _tenantAppService = GetRequiredService(); + _unitOfWorkManager = GetRequiredService(); + _cache = GetRequiredService>(); + _tenantStore = GetRequiredService(); + _tenantRepository = GetRequiredService(); + _tenantNormalizer = GetRequiredService(); } [Fact] @@ -108,4 +121,46 @@ public class TenantAppService_Tests : AbpTenantManagementApplicationTestBase dbContext.Tenants.Any(t => t.Id == acme.Id).ShouldBeFalse(); }); } + + [Fact] + public async Task Cache_Should_Invalidator_When_Tenant_ConnectionString_Changed() + { + var acme = await _tenantRepository.FindByNameAsync(_tenantNormalizer.NormalizeName("acme")); + + // UpdateDefaultConnectionStringAsync + + // FindAsync will cache tenant. + await _tenantStore.FindAsync(acme.Id); + await _tenantStore.FindAsync(acme.NormalizedName); + + (await _cache.GetAsync(TenantConfigurationCacheItem.CalculateCacheKey(acme.Id, null))).ShouldNotBeNull(); + (await _cache.GetAsync(TenantConfigurationCacheItem.CalculateCacheKey(null, acme.NormalizedName))).ShouldNotBeNull(); + + using (var uow = _unitOfWorkManager.Begin(requiresNew: true)) + { + await _tenantAppService.UpdateDefaultConnectionStringAsync(acme.Id, Guid.NewGuid().ToString()); + await uow.CompleteAsync(); + } + + (await _cache.GetAsync(TenantConfigurationCacheItem.CalculateCacheKey(acme.Id, null))).ShouldBeNull(); + (await _cache.GetAsync(TenantConfigurationCacheItem.CalculateCacheKey(null, acme.NormalizedName))).ShouldBeNull(); + + // DeleteDefaultConnectionStringAsync + + // FindAsync will cache tenant. + await _tenantStore.FindAsync(acme.Id); + await _tenantStore.FindAsync(acme.NormalizedName); + + (await _cache.GetAsync(TenantConfigurationCacheItem.CalculateCacheKey(acme.Id, null))).ShouldNotBeNull(); + (await _cache.GetAsync(TenantConfigurationCacheItem.CalculateCacheKey(null, acme.NormalizedName))).ShouldNotBeNull(); + + using (var uow = _unitOfWorkManager.Begin(requiresNew: true)) + { + await _tenantAppService.DeleteDefaultConnectionStringAsync(acme.Id); + await uow.CompleteAsync(); + } + + (await _cache.GetAsync(TenantConfigurationCacheItem.CalculateCacheKey(acme.Id, null))).ShouldBeNull(); + (await _cache.GetAsync(TenantConfigurationCacheItem.CalculateCacheKey(null, acme.NormalizedName))).ShouldBeNull(); + } } diff --git a/npm/ng-packs/packages/components/extensible/src/lib/components/extensible-form/extensible-form-prop.component.ts b/npm/ng-packs/packages/components/extensible/src/lib/components/extensible-form/extensible-form-prop.component.ts index 1805d87233..23fc4290af 100644 --- a/npm/ng-packs/packages/components/extensible/src/lib/components/extensible-form/extensible-form-prop.component.ts +++ b/npm/ng-packs/packages/components/extensible/src/lib/components/extensible-form/extensible-form-prop.component.ts @@ -15,11 +15,10 @@ import { inject, Injector, Input, - OnChanges, - Optional, + OnChanges, Optional, SimpleChanges, SkipSelf, - ViewChild, + ViewChild } from '@angular/core'; import { ControlContainer, @@ -94,6 +93,7 @@ export class ExtensibleFormPropComponent implements OnChanges, AfterViewInit { @Input() data!: PropData; @Input() prop!: FormProp; @Input() first?: boolean; + @Input() isFirstGroup?: boolean; @ViewChild('field') private fieldRef!: ElementRef; injectorForCustomComponent?: Injector; @@ -124,10 +124,10 @@ export class ExtensibleFormPropComponent implements OnChanges, AfterViewInit { search = (text$: Observable) => text$ ? text$.pipe( - debounceTime(300), - distinctUntilChanged(), - switchMap(text => this.prop?.options?.(this.data, text) || of([])), - ) + debounceTime(300), + distinctUntilChanged(), + switchMap(text => this.prop?.options?.(this.data, text) || of([])), + ) : of([]); typeaheadFormatter = (option: ABP.Option) => option.key; @@ -154,9 +154,8 @@ export class ExtensibleFormPropComponent implements OnChanges, AfterViewInit { } ngAfterViewInit() { - if (this.first && this.fieldRef) { + if (this.isFirstGroup && this.first && this.fieldRef) { this.fieldRef.nativeElement.focus(); - this.cdRef.detectChanges(); } } diff --git a/npm/ng-packs/packages/components/extensible/src/lib/components/extensible-form/extensible-form.component.html b/npm/ng-packs/packages/components/extensible/src/lib/components/extensible-form/extensible-form.component.html index 4b47e8fbb1..b88c2ecbfa 100644 --- a/npm/ng-packs/packages/components/extensible/src/lib/components/extensible-form/extensible-form.component.html +++ b/npm/ng-packs/packages/components/extensible/src/lib/components/extensible-form/extensible-form.component.html @@ -1,5 +1,5 @@ @if (form) { - @for (groupedProp of groupedPropList.items; track i; let i = $index) { + @for (groupedProp of groupedPropList.items; track i; let i = $index; let first = $first) { @if (isAnyGroupMemberVisible(i, data) && groupedProp.group?.className) {
} @else { } @@ -23,8 +23,8 @@ } } - - @for (prop of groupedProp.formPropList; let first = $first; track prop.name) { + + @for (prop of groupedProp.formPropList; let index = $index; let first = $first; track prop.name) { @if (prop.visible(data)) { @if (extraProperties.controls[prop.name]) { @@ -37,6 +37,7 @@ [prop]="prop" [data]="data" [first]="first" + [isFirstGroup]="isFirstGroup" /> } } diff --git a/npm/ng-packs/packages/core/src/lib/models/common.ts b/npm/ng-packs/packages/core/src/lib/models/common.ts index a3aec61b88..6d30a6ec74 100644 --- a/npm/ng-packs/packages/core/src/lib/models/common.ts +++ b/npm/ng-packs/packages/core/src/lib/models/common.ts @@ -73,6 +73,7 @@ export namespace ABP { layout?: eLayoutType; iconClass?: string; group?: string; + breadcrumbText?: string; } export interface Tab extends Nav { diff --git a/npm/ng-packs/packages/core/src/lib/tests/routes.service.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/routes.service.spec.ts index b2ce154421..718b1fc0e2 100644 --- a/npm/ng-packs/packages/core/src/lib/tests/routes.service.spec.ts +++ b/npm/ng-packs/packages/core/src/lib/tests/routes.service.spec.ts @@ -30,6 +30,30 @@ describe('Routes Service', () => { { path: '/foo/bar/baz', name: 'baz', parentName: 'bar', order: 1 }, { path: '/foo/bar/baz/qux', name: 'qux', parentName: 'baz', order: 1 }, { path: '/foo/x', name: 'x', parentName: 'foo', order: 1 }, + { path: '/foo', name: 'foo', breadcrumbText: 'Foo Breadcrumb' }, + { + path: '/foo/bar', + name: 'bar', + parentName: 'foo', + invisible: true, + order: 2, + breadcrumbText: 'Bar Breadcrumb', + }, + { + path: '/foo/bar/baz', + name: 'baz', + parentName: 'bar', + order: 1, + breadcrumbText: 'Baz Breadcrumb', + }, + { + path: '/foo/bar/baz/qux', + name: 'qux', + parentName: 'baz', + order: 1, + breadcrumbText: 'Qux Breadcrumb', + }, + { path: '/foo/x', name: 'x', parentName: 'foo', order: 1, breadcrumbText: 'X Breadcrumb' }, ]; const groupedRoutes = [ @@ -38,6 +62,11 @@ describe('Routes Service', () => { { path: '/foo/bar', name: 'bar', group: barGroup }, { path: '/foo/bar/baz', name: 'baz', group: barGroup }, { path: '/foo/z', name: 'z' }, + { path: '/foo', name: 'foo', group: fooGroup, breadcrumbText: 'Foo Breadcrumb' }, + { path: '/foo/y', name: 'y', parentName: 'foo', breadcrumbText: 'Y Breadcrumb' }, + { path: '/foo/bar', name: 'bar', group: barGroup, breadcrumbText: 'Bar Breadcrumb' }, + { path: '/foo/bar/baz', name: 'baz', group: barGroup, breadcrumbText: 'Baz Breadcrumb' }, + { path: '/foo/z', name: 'z', breadcrumbText: 'Z Breadcrumb' }, ]; beforeEach(() => { @@ -53,23 +82,35 @@ describe('Routes Service', () => { const visible = await lastValueFrom(service.visible$.pipe(take(1))); expect(flat.length).toBe(5); expect(flat[0].name).toBe('baz'); + expect(flat[0].breadcrumbText).toBe('Baz Breadcrumb'); expect(flat[1].name).toBe('qux'); + expect(flat[1].breadcrumbText).toBe('Qux Breadcrumb'); expect(flat[2].name).toBe('x'); + expect(flat[2].breadcrumbText).toBe('X Breadcrumb'); expect(flat[3].name).toBe('bar'); + expect(flat[3].breadcrumbText).toBe('Bar Breadcrumb'); expect(flat[4].name).toBe('foo'); + expect(flat[4].breadcrumbText).toBe('Foo Breadcrumb'); expect(tree.length).toBe(1); expect(tree[0].name).toBe('foo'); + expect(tree[0].breadcrumbText).toBe('Foo Breadcrumb'); expect(tree[0].children.length).toBe(2); expect(tree[0].children[0].name).toBe('x'); + expect(tree[0].children[0].breadcrumbText).toBe('X Breadcrumb'); expect(tree[0].children[1].name).toBe('bar'); + expect(tree[0].children[1].breadcrumbText).toBe('Bar Breadcrumb'); expect(tree[0].children[1].children[0].name).toBe('baz'); + expect(tree[0].children[1].children[0].breadcrumbText).toBe('Baz Breadcrumb'); expect(tree[0].children[1].children[0].children[0].name).toBe('qux'); + expect(tree[0].children[1].children[0].children[0].breadcrumbText).toBe('Qux Breadcrumb'); expect(visible.length).toBe(1); expect(visible[0].name).toBe('foo'); + expect(visible[0].breadcrumbText).toBe('Foo Breadcrumb'); expect(visible[0].children.length).toBe(1); expect(visible[0].children[0].name).toBe('x'); + expect(visible[0].children[0].breadcrumbText).toBe('X Breadcrumb'); }); }); @@ -88,14 +129,21 @@ describe('Routes Service', () => { { path: '/foo/bar', name: 'bar', group: '' }, { path: '/foo/bar/baz', name: 'baz', group: undefined }, { path: '/x', name: 'y', group: 'z' }, + { path: '/foo', name: 'foo', breadcrumbText: 'Foo Breadcrumb' }, + { path: '/foo/bar', name: 'bar', group: '', breadcrumbText: 'Bar Breadcrumb' }, + { path: '/foo/bar/baz', name: 'baz', group: undefined, breadcrumbText: 'Baz Breadcrumb' }, + { path: '/x', name: 'y', group: 'z', breadcrumbText: 'Y Breadcrumb' }, ]); const result = await lastValueFrom(service.groupedVisible$.pipe(take(1))); expect(result[0].group).toBe(othersGroup); expect(result[0].items[0].name).toBe('foo'); + expect(result[0].items[0].breadcrumbText).toBe('Foo Breadcrumb'); expect(result[0].items[1].name).toBe('bar'); + expect(result[0].items[1].breadcrumbText).toBe('Bar Breadcrumb'); expect(result[0].items[2].name).toBe('baz'); + expect(result[0].items[2].breadcrumbText).toBe('Baz Breadcrumb'); }, ); @@ -108,14 +156,19 @@ describe('Routes Service', () => { expect(tree[0].group).toBe('FooGroup'); expect(tree[0].items[0].name).toBe('foo'); + expect(tree[0].items[0].breadcrumbText).toBe('Foo Breadcrumb'); expect(tree[0].items[0].children[0].name).toBe('y'); + expect(tree[0].items[0].children[0].breadcrumbText).toBe('Y Breadcrumb'); expect(tree[1].group).toBe('BarGroup'); expect(tree[1].items[0].name).toBe('bar'); + expect(tree[1].items[0].breadcrumbText).toBe('Bar Breadcrumb'); expect(tree[1].items[1].name).toBe('baz'); + expect(tree[1].items[1].breadcrumbText).toBe('Baz Breadcrumb'); expect(tree[2].group).toBe(othersGroup); expect(tree[2].items[0].name).toBe('z'); + expect(tree[2].items[0].breadcrumbText).toBe('Z Breadcrumb'); }); }); @@ -124,8 +177,10 @@ describe('Routes Service', () => { service.add(routes); const result = service.find(route => route.invisible); expect(result.name).toBe('bar'); + expect(result.breadcrumbText).toBe('Bar Breadcrumb'); expect(result.children.length).toBe(1); expect(result.children[0].name).toBe('baz'); + expect(result.children[0].breadcrumbText).toBe('Baz Breadcrumb'); }); it('should return null when query is not found', () => { @@ -167,17 +222,23 @@ describe('Routes Service', () => { expect(flat.length).toBe(2); expect(flat[1].name).toBe('foo'); + expect(flat[1].breadcrumbText).toBe('Foo Breadcrumb'); expect(flat[0].name).toBe('x'); + expect(flat[0].breadcrumbText).toBe('X Breadcrumb'); expect(tree.length).toBe(1); expect(tree[0].name).toBe('foo'); + expect(tree[0].breadcrumbText).toBe('Foo Breadcrumb'); expect(tree[0].children.length).toBe(1); expect(tree[0].children[0].name).toBe('x'); + expect(tree[0].children[0].breadcrumbText).toBe('X Breadcrumb'); expect(visible.length).toBe(1); expect(visible[0].name).toBe('foo'); + expect(visible[0].breadcrumbText).toBe('Foo Breadcrumb'); expect(visible[0].children.length).toBe(1); expect(visible[0].children[0].name).toBe('x'); + expect(visible[0].children[0].breadcrumbText).toBe('X Breadcrumb'); }); }); @@ -193,21 +254,31 @@ describe('Routes Service', () => { expect(flat.length).toBe(5); expect(flat[0].name).toBe('baz'); + expect(flat[0].breadcrumbText).toBe('Baz Breadcrumb'); expect(flat[1].name).toBe('qux'); + expect(flat[1].breadcrumbText).toBe('Qux Breadcrumb'); expect(flat[2].name).toBe('x'); + expect(flat[2].breadcrumbText).toBe('X Breadcrumb'); expect(flat[3].name).toBe('bar'); + expect(flat[3].breadcrumbText).toBe('Bar Breadcrumb'); expect(flat[4].name).toBe('foo'); + expect(flat[4].breadcrumbText).toBe('Foo Breadcrumb'); expect(tree.length).toBe(1); expect(tree[0].name).toBe('foo'); expect(tree[0].children.length).toBe(2); expect(tree[0].children[0].name).toBe('x'); + expect(tree[0].children[0].breadcrumbText).toBe('X Breadcrumb'); expect(tree[0].children[1].name).toBe('bar'); + expect(tree[0].children[1].breadcrumbText).toBe('Bar Breadcrumb'); expect(tree[0].children[1].children[0].name).toBe('baz'); + expect(tree[0].children[1].children[0].breadcrumbText).toBe('Baz Breadcrumb'); expect(tree[0].children[1].children[0].children[0].name).toBe('qux'); + expect(tree[0].children[1].children[0].children[0].breadcrumbText).toBe('Qux Breadcrumb'); expect(visible.length).toBe(1); expect(visible[0].name).toBe('foo'); + expect(visible[0].breadcrumbText).toBe('Foo Breadcrumb'); expect(visible[0].children.length).toBe(0); }); @@ -238,8 +309,10 @@ describe('Routes Service', () => { service.add(routes); const result = service.search({ invisible: true }); expect(result.name).toBe('bar'); + expect(result.breadcrumbText).toBe('Bar Breadcrumb'); expect(result.children.length).toBe(1); expect(result.children[0].name).toBe('baz'); + expect(result.children[0].breadcrumbText).toBe('Baz Breadcrumb'); }); it('should return null when query is not found', () => { diff --git a/npm/ng-packs/packages/setting-management/config/src/lib/components/email-setting-group/email-setting-group.component.ts b/npm/ng-packs/packages/setting-management/config/src/lib/components/email-setting-group/email-setting-group.component.ts index a47e674e4e..71756b7289 100644 --- a/npm/ng-packs/packages/setting-management/config/src/lib/components/email-setting-group/email-setting-group.component.ts +++ b/npm/ng-packs/packages/setting-management/config/src/lib/components/email-setting-group/email-setting-group.component.ts @@ -68,7 +68,7 @@ export class EmailSettingGroupComponent implements OnInit { .update(this.form.value) .pipe(finalize(() => (this.saving = false))) .subscribe(() => { - this.toasterService.success('AbpSettingManagement::SuccessfullySaved'); + this.toasterService.success('AbpSettingManagement::SavedSuccessfully'); this.getData(); }); } diff --git a/npm/ng-packs/packages/theme-shared/src/lib/handlers/error.handler.ts b/npm/ng-packs/packages/theme-shared/src/lib/handlers/error.handler.ts index 30f9f7b3cb..07c5721625 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/handlers/error.handler.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/handlers/error.handler.ts @@ -87,7 +87,7 @@ export class ErrorHandler { protected filterRestErrors = ({ status }: HttpErrorResponse): boolean => { if (typeof status !== 'number') return false; - if (!this.httpErrorConfig || !this.httpErrorConfig.skipHandledErrorCodes) { + if (!this.httpErrorConfig?.skipHandledErrorCodes) { return true; } diff --git a/npm/ng-packs/packages/theme-shared/src/lib/theme-shared.module.ts b/npm/ng-packs/packages/theme-shared/src/lib/theme-shared.module.ts index d2d294bfc5..c253bc023b 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/theme-shared.module.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/theme-shared.module.ts @@ -32,7 +32,7 @@ import { RootParams } from './models/common'; import { DEFAULT_HANDLERS_PROVIDERS, NG_BOOTSTRAP_CONFIG_PROVIDERS } from './providers'; import { THEME_SHARED_ROUTE_PROVIDERS } from './providers/route.provider'; import { THEME_SHARED_APPEND_CONTENT } from './tokens/append-content.token'; -import { HTTP_ERROR_CONFIG, httpErrorConfigFactory } from './tokens/http-error.token'; +import { HTTP_ERROR_CONFIG } from './tokens/http-error.token'; import { DateParserFormatter } from './utils/date-parser-formatter'; import { CONFIRMATION_ICONS, DEFAULT_CONFIRMATION_ICONS } from './tokens/confirmation-icons.token'; import { PasswordComponent } from './components/password/password.component'; @@ -112,11 +112,6 @@ export class ThemeSharedModule { useFactory: noop, }, { provide: HTTP_ERROR_CONFIG, useValue: httpErrorConfig }, - { - provide: 'HTTP_ERROR_CONFIG', - useFactory: httpErrorConfigFactory, - deps: [HTTP_ERROR_CONFIG], - }, { provide: NgbDateParserFormatter, useClass: DateParserFormatter }, NG_BOOTSTRAP_CONFIG_PROVIDERS, { diff --git a/npm/ng-packs/packages/theme-shared/src/lib/tokens/http-error.token.ts b/npm/ng-packs/packages/theme-shared/src/lib/tokens/http-error.token.ts index 64245680db..96d913f297 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/tokens/http-error.token.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/tokens/http-error.token.ts @@ -1,18 +1,6 @@ import { InjectionToken } from '@angular/core'; import { CustomHttpErrorHandlerService, HttpErrorConfig, HttpErrorHandler } from '../models/common'; -export function httpErrorConfigFactory(config = {} as HttpErrorConfig) { - if (config.errorScreen && config.errorScreen.component && !config.errorScreen.forWhichErrors) { - config.errorScreen.forWhichErrors = [401, 403, 404, 500]; - } - - return { - skipHandledErrorCodes: [], - errorScreen: {}, - ...config, - } as HttpErrorConfig; -} - export const HTTP_ERROR_CONFIG = new InjectionToken('HTTP_ERROR_CONFIG'); /** diff --git a/npm/publish-ng.ps1 b/npm/publish-ng.ps1 index 9ba831f635..dac52b4427 100644 --- a/npm/publish-ng.ps1 +++ b/npm/publish-ng.ps1 @@ -1,6 +1,7 @@ param( [string]$Version, - [string]$Registry + [string]$Registry, + [string]$LeptonXVersion ) yarn install @@ -15,10 +16,11 @@ if (-Not $Version) { if (-Not $Registry) { $Registry = "https://registry.npmjs.org"; } + $UpdateNgPacksCommand = "yarn update-version $Version" $NgPacksPublishCommand = "npm run publish-packages -- --nextVersion $Version --skipGit --registry $Registry --skipVersionValidation" $UpdateGulpCommand = "yarn update-gulp --registry $Registry" - +$UpdateLeptonXCommand = "yarn update-lepton-x-versions -v $LeptonXVersion"; $IsPrerelease = $(node publish-utils.js --prerelease --customVersion $Version) -eq "true"; @@ -38,7 +40,9 @@ $commands = ( "cd scripts", "yarn remove-lock-files", "cd ..", - $UpdateGulpCommand + $UpdateGulpCommand, + "cd scripts", + $UpdateLeptonXCommand ) foreach ($command in $commands) { diff --git a/npm/scripts/change-package-version.ts b/npm/scripts/change-package-version.ts index 6d03716885..8a6b6fefcc 100644 --- a/npm/scripts/change-package-version.ts +++ b/npm/scripts/change-package-version.ts @@ -1,101 +1,114 @@ import glob from "glob"; import fse from "fs-extra"; -import {program} from "commander"; +import { program } from "commander"; -(function findPackageJsonFiles() { - setupCommander(); - const options = { - ignore: [ - "../../**/node_modules/**", - "../../**/dist/**", - "../../**/build/**", - "../../**/scripts/**", - "../../**/wwwroot/**" - ] - }; +export const semverRegex = + /\d+\.\d+\.\d+(?:-[a-zA-Z0-9]+(?:\.[a-zA-Z0-9-]+)*)?(?:\+[a-zA-Z0-9]+(?:\.[a-zA-Z0-9-]+)*)?$/; - const workingDir = "../../"; - glob(`${workingDir}**/package.json`, options, (err, files) => { - if (err) throw err; +function setupCommander() { + program + .option("-n, --packageName ", "Package name") + .option( + "-v, --targetVersion ", + "Version number of the package" + ); - //Todo @masumulu28: check options value and throw error if not provided - const {packageName,targetVersion}= program.opts(); - - for (const file of files) { - readPackageJsonFile(file, packageName, targetVersion); - } - }); -})(); + program.parse(process.argv); +} function readPackageJsonFile(path, key, newVersion) { const replace = (block, key, newVersion) => { - const founded = Object.keys(block).filter(x => x === key); + const founded = Object.keys(block).filter((x) => x === key); + if (founded.length > 0) { let value = block[key]; value = value.replace(semverRegex, newVersion); - return [true, { - ...block, - [key]:value - }]; + + return [ + true, + { + ...block, + [key]: value, + }, + ]; } + return [false, block]; }; + fse.readJson(path, (err, packageObj) => { - if (err) throw err; - - const { dependencies, peerDependencies, devDependencies } = packageObj; - const results = []; - - let result = { ...packageObj }; - if (dependencies) { - const [founded, d] = replace(dependencies, key, newVersion); - results.push(founded); - result = { - ...result, dependencies: d - }; - } - if (peerDependencies) { - const [founded, p] = replace(peerDependencies, key, newVersion); - results.push(founded); - result = { - ...result, peerDependencies: p - }; - } - if (devDependencies) { - const [founded, d] = replace(devDependencies, key, newVersion); - results.push(founded); - result = { - ...result, devDependencies: d - }; - } - const anyChanges = !results.some(x => x); - if (anyChanges) { - return; - } - console.log("changed", path); - writeFile(path, result); + if (err) { + throw err; + } + + const { dependencies, peerDependencies, devDependencies } = packageObj; + const results = []; + + let result = { ...packageObj }; + if (dependencies) { + const [founded, d] = replace(dependencies, key, newVersion); + results.push(founded); + result = { + ...result, + dependencies: d, + }; + } + + if (peerDependencies) { + const [founded, p] = replace(peerDependencies, key, newVersion); + results.push(founded); + result = { + ...result, + peerDependencies: p, + }; } - ) - ; + + if (devDependencies) { + const [founded, d] = replace(devDependencies, key, newVersion); + results.push(founded); + result = { + ...result, + devDependencies: d, + }; + } + + const anyChanges = !results.some((x) => x); + if (anyChanges) { + return; + } + + console.log("changed", path); + writeFile(path, result); + }); } -export const semverRegex = - /\d+\.\d+\.\d+(?:-[a-zA-Z0-9]+(?:\.[a-zA-Z0-9-]+)*)?(?:\+[a-zA-Z0-9]+(?:\.[a-zA-Z0-9-]+)*)?$/; function writeFile(path, result) { return fse.writeJson(path, result, { spaces: 2 }); } +(function findPackageJsonFiles() { + setupCommander(); + const options = { + ignore: [ + "../../**/node_modules/**", + "../../**/dist/**", + "../../**/build/**", + "../../**/scripts/**", + "../../**/wwwroot/**", + ], + }; + + const workingDir = "../../"; + glob(`${workingDir}**/package.json`, options, (err, files) => { + if (err) { + throw err; + } -function setupCommander() { - program - .option( - "-n, --packageName ", - "Package name" - ) - .option( - "-v, --targetVersion ", - "Version number of the package" - ); + //Todo @masumulu28: check options value and throw error if not provided + const { packageName, targetVersion } = program.opts(); - program.parse(process.argv); -} + for (const file of files) { + readPackageJsonFile(file, packageName, targetVersion); + } + }); +})(); diff --git a/npm/scripts/package.json b/npm/scripts/package.json index 2b25b8f52d..19f8db15b8 100644 --- a/npm/scripts/package.json +++ b/npm/scripts/package.json @@ -5,7 +5,8 @@ "scripts": { "remove-lock-files": "yarn && ts-node -r tsconfig-paths/register remove-lock-files.ts", "validate-versions": "yarn && ts-node -r tsconfig-paths/register validate-versions.ts", - "change-package-version": "ts-node -r tsconfig-paths/register change-package-version.ts" + "change-package-version": "ts-node -r tsconfig-paths/register change-package-version.ts", + "update-lepton-x-versions": "ts-node -r tsconfig-paths/register update-lepton-x-versions.ts" }, "dependencies": { "axios": "^0.24.0", diff --git a/npm/scripts/update-lepton-x-versions.ts b/npm/scripts/update-lepton-x-versions.ts new file mode 100644 index 0000000000..b5b59c079c --- /dev/null +++ b/npm/scripts/update-lepton-x-versions.ts @@ -0,0 +1,55 @@ +import { program } from "commander"; +import childProcess from "child_process"; + +/** + * This script is used to update the version of the LeptonX (angular |mvc | blazor) npm packages. + * Depending to **change-package-version.ts** file. (Should we move this to a single script?) + * + * I'm not sure about depending "commander" package. We might need to get options from process.env directly ? + * + * Example + * -Set env + * $env:targetVersion = "1.0.0" + * -Read from nodejs + * process.env.targetVersion + * -Use as argument in commands + * const command = `yarn change-package-version -n ${packageName} -v ${process.env.targetVersion}`; + */ + +//All lepton-x-lite packages for open source (angular | mvc | blazor) UI frameworks +const LEPTON_X_PACKAGE_NAMES = [ + "@abp/ng.theme.lepton-x", + "@abp/aspnetcore.mvc.ui.theme.leptonxlite", + "@abp/aspnetcore.components.server.leptonxlitetheme", +]; + +function validateVersion(targetVersion) { + if (!targetVersion) { + console.log("\x1b[31m", "Error: lepton-x targetVersion is not defined"); + process.exit(1); + } +} + +function initCommander() { + program.option( + "-v, --targetVersion ", + "Version number of the package" + ); + + program.parse(process.argv); +} + +(() => { + initCommander(); + + const { targetVersion } = program.opts(); + + validateVersion(targetVersion); + + LEPTON_X_PACKAGE_NAMES.forEach((packageName) => { + const command = `yarn change-package-version -n ${packageName} -v ${targetVersion}`; + const result = childProcess.execSync(command).toString(); + + console.log(result); + }); +})(); diff --git a/npm/scripts/validate-versions.ts b/npm/scripts/validate-versions.ts index 4583c620e2..a5a53617d7 100644 --- a/npm/scripts/validate-versions.ts +++ b/npm/scripts/validate-versions.ts @@ -1,7 +1,7 @@ -import { program } from 'commander'; -import fse from 'fs-extra'; -import * as path from 'path'; -import { log } from './utils/log'; +import { program } from "commander"; +import fse from "fs-extra"; +import * as path from "path"; +import { log } from "./utils/log"; let excludedPackages = []; @@ -12,29 +12,31 @@ let excludedPackages = []; function initCommander() { program.requiredOption( - '-v, --compareVersion ', - 'version to compare' + "-v, --compareVersion ", + "version to compare" ); - program.requiredOption('-p, --path ', 'NPM packages folder path'); + program.requiredOption("-p, --path ", "NPM packages folder path"); program.option( - '-ep, --excludedPackages ', - 'Packages that will not be checked. Can be passed with separeted comma (like @abp/utils,@abp/core)', - '' + "-ep, --excludedPackages ", + "Packages that will not be checked. Can be passed with separeted comma (like @abp/utils,@abp/core)", + "" ); program.parse(process.argv); - excludedPackages = program.opts().excludedPackages.split(','); + excludedPackages = program.opts().excludedPackages.split(","); } async function compare() { let { compareVersion, path: packagesPath } = program.opts(); packagesPath = path.resolve(packagesPath); + const packageFolders = await fse.readdir(packagesPath); for (let i = 0; i < packageFolders.length; i++) { const folder = packageFolders[i]; const pkgJsonPath = `${packagesPath}/${folder}/package.json`; let pkgJson; + try { pkgJson = await fse.readJSON(pkgJsonPath); } catch (error) {} @@ -46,11 +48,10 @@ async function compare() { throwError(pkgJsonPath, pkgJson.name, pkgJson.version); } - const { dependencies, peerDependencies } = pkgJson; - if (dependencies) await compareDependencies(dependencies, pkgJsonPath); - // if (peerDependencies) { // TODO: update peerDependencies while updating version - // await compareDependencies(peerDependencies, pkgJsonPath); - // } + const { dependencies } = pkgJson; + if (dependencies) { + await compareDependencies(dependencies, pkgJsonPath); + } } } @@ -66,6 +67,7 @@ async function compareDependencies( const packageName = entry[0]; const version = getCleanVersionName(entry[1]); const cleanCompareVersion = getCleanVersionName(compareVersion); + if ( !excludedPackages.includes(entry[0]) && packageName.match(/@(abp|volo)/)?.length && @@ -79,11 +81,13 @@ async function compareDependencies( function throwError(filePath: string, pkg: string, version?: string) { const { compareVersion } = program.opts(); - log.error(`${filePath}: ${pkg} version is not ${compareVersion}. it is ${version}`); + log.error( + `${filePath}: ${pkg} version is not ${compareVersion}. it is ${version}` + ); process.exit(1); } function getCleanVersionName(version) { // Remove caret (^) or tilde (~) from the beginning of the version number - return version.replace(/^[\^~]+/, ''); -} \ No newline at end of file + return version.replace(/^[\^~]+/, ""); +} diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Client/MyProjectNameBlazorModule.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Client/MyProjectNameBlazorModule.cs index af2fd70277..46afc0d1b0 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Client/MyProjectNameBlazorModule.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Client/MyProjectNameBlazorModule.cs @@ -1,5 +1,6 @@ using Blazorise.Bootstrap5; using Blazorise.Icons.FontAwesome; +using Microsoft.AspNetCore.Components.Web; using Microsoft.AspNetCore.Components.WebAssembly.Hosting; using MyCompanyName.MyProjectName.Menus; using MyCompanyName.MyProjectName; @@ -117,6 +118,12 @@ public class MyProjectNameBlazorModule : AbpModule }); } + private static void ConfigureUI(WebAssemblyHostBuilder builder) + { + builder.RootComponents.Add("#ApplicationContainer"); + builder.RootComponents.Add("head::after"); + } + private static void ConfigureHttpClient(ServiceConfigurationContext context, IWebAssemblyHostEnvironment environment) { context.Services.AddTransient(sp => new HttpClient diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Client/MyProjectNameBlazorClientModule.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Client/MyProjectNameBlazorClientModule.cs index 035c9ef835..d1eab9a3fd 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Client/MyProjectNameBlazorClientModule.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Client/MyProjectNameBlazorClientModule.cs @@ -2,6 +2,7 @@ using System.Net.Http; using Blazorise.Bootstrap5; using Blazorise.Icons.FontAwesome; +using Microsoft.AspNetCore.Components.Web; using Microsoft.AspNetCore.Components.WebAssembly.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; @@ -80,6 +81,12 @@ public class MyProjectNameBlazorClientModule : AbpModule }); } + private static void ConfigureUI(WebAssemblyHostBuilder builder) + { + builder.RootComponents.Add("#ApplicationContainer"); + builder.RootComponents.Add("head::after"); + } + private static void ConfigureHttpClient(ServiceConfigurationContext context, IWebAssemblyHostEnvironment environment) { context.Services.AddTransient(sp => new HttpClient diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Client/Pages/Index.razor b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Client/Pages/Index.razor index fe84321fb7..c50cdb96ab 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Client/Pages/Index.razor +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Client/Pages/Index.razor @@ -1,6 +1,8 @@ @page "/" @using Volo.Abp.MultiTenancy @inherits MyProjectNameComponentBase +@inject AuthenticationStateProvider AuthenticationStateProvider +
diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/Components/Pages/Index.razor b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/Components/Pages/Index.razor index 6a4c2c8d6e..105cb10da7 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/Components/Pages/Index.razor +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/Components/Pages/Index.razor @@ -2,6 +2,7 @@ @using Volo.Abp.MultiTenancy @inherits MyProjectNameComponentBase @inject AuthenticationStateProvider AuthenticationStateProvider +
diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/Components/Pages/Index.razor b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/Components/Pages/Index.razor index 543054d1c1..1f743978db 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/Components/Pages/Index.razor +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/Components/Pages/Index.razor @@ -2,6 +2,9 @@ @using Volo.Abp.MultiTenancy @inherits MyProjectNameComponentBase @inject AuthenticationStateProvider AuthenticationStateProvider + +Index +
diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host.Client/MyProjectNameBlazorHostClientModule.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host.Client/MyProjectNameBlazorHostClientModule.cs index d13973767d..65f9488ba9 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host.Client/MyProjectNameBlazorHostClientModule.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host.Client/MyProjectNameBlazorHostClientModule.cs @@ -2,6 +2,7 @@ using System.Net.Http; using Blazorise.Bootstrap5; using Blazorise.Icons.FontAwesome; +using Microsoft.AspNetCore.Components.Web; using Microsoft.AspNetCore.Components.WebAssembly.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; @@ -75,6 +76,12 @@ public class MyProjectNameBlazorHostClientModule : AbpModule }); } + private static void ConfigureUI(WebAssemblyHostBuilder builder) + { + builder.RootComponents.Add("#ApplicationContainer"); + builder.RootComponents.Add("head::after"); + } + private static void ConfigureHttpClient(ServiceConfigurationContext context, IWebAssemblyHostEnvironment environment) { context.Services.AddTransient(sp => new HttpClient