diff --git a/.github/scripts/update_versions.py b/.github/scripts/update_versions.py index 48f312b561..dcbd749796 100644 --- a/.github/scripts/update_versions.py +++ b/.github/scripts/update_versions.py @@ -51,5 +51,4 @@ def create_pr(): if __name__ == "__main__": should_create_pr = update_latest_versions() if should_create_pr: - create_pr() - + create_pr() \ No newline at end of file diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index acbc322f12..c2b1557405 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -16,6 +16,7 @@ on: - 'templates/**/*.cshtml' - 'templates/**/*.csproj' - 'templates/**/*.razor' + - 'Directory.Build.props' pull_request: paths: @@ -31,6 +32,7 @@ on: - 'templates/**/*.cshtml' - 'templates/**/*.csproj' - 'templates/**/*.razor' + - 'Directory.Build.props' types: - opened - synchronize diff --git a/Directory.Build.props b/Directory.Build.props index 43a884f556..838ffcc995 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -42,6 +42,9 @@ true + + 4.6.0 + @@ -51,4 +54,4 @@ - \ No newline at end of file + diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json index 341056fae9..8333e0efbe 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json @@ -463,6 +463,37 @@ "DiscountAmount": "Discount Amount", "FullChangeHistory": "Full Change History", "Permission:RefreshReleaseLogs": "Refresh Release Logs", - "ReleaseLogs": "Release Logs" + "ReleaseLogs": "Release Logs", + "AuthorUserName": "Author User Name", + "Type": "Type", + "TotalDiscount": "Total Discount", + "SubTotal": "Sub Total", + "TotalDue": "Total Due", + "QuotationNo": "Quotation no", + "ValidFor": "Valid for", + "QuotationNote": "Quotation note", + "QuotationTemplate.Address": "Address", + "QuotationTemplate.Address:": "Address:", + "QuotationTemplate.VATNo": "VAT No", + "QuotationTemplate.Phone": "Phone", + "QuotationTemplate.E-mail": "E-mail", + "QuotationTemplate.Quotation": "Quotation", + "QuotationTemplate.To": "To", + "QuotationTemplate.Details": "Details", + "QuotationTemplate.QuotationNo:": "Quotation:", + "QuotationTemplate.IssueDate:": "Issue Date:", + "QuotationTemplate.ValidFor:": "Valid For:", + "QuotationTemplate.ValidDays": "{0} Days", + "QuotationTemplate.Description": "Description", + "QuotationTemplate.UnitPrice": "Unit Price", + "QuotationTemplate.Qty": "Qty", + "QuotationTemplate.Discount": "Discount", + "QuotationTemplate.Total": "Total", + "QuotationTemplate.Notes": "Notes", + "QuotationTemplate.SubTotal": "Sub Total", + "QuotationTemplate.Tax/VAT": "Tax / VAT (%{0})", + "QuotationTemplate.TotalDiscount": "Total Discount", + "QuotationTemplate.TotalDue": "Total Due", + "QuotationTemplate.ThanksForYourBusiness": "Thanks for your business!" } } diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/tr.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/tr.json index 4559503a6d..c7c2febc28 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/tr.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/tr.json @@ -417,6 +417,34 @@ "CommunityLinkTitle": "Topluluk web sitesinde açın", "CommunityLink": "Topluluk Bağlantısı", "ReloadFromSource": "Kaynaktan Yeniden Yükle", - "ReloadFromSourceConfirmationMessage": "Bu gönderi \"{0}\" adresinden yenilenecek. Devam etmek istiyor musun?" + "ReloadFromSourceConfirmationMessage": "Bu gönderi \"{0}\" adresinden yenilenecek. Devam etmek istiyor musun?", + "Type": "Tip", + "TotalDiscount": "Toplam İndirim", + "SubTotal": "Ara Toplam", + "TotalDue": "NET TOPLAM", + "DiscountAmount": "İndirim Tutarı", + "QuotationTemplate.Address": "Adres", + "QuotationTemplate.Address:": "Adres:", + "QuotationTemplate.VATNo": "Vergi Dairesi/No", + "QuotationTemplate.Phone": "Telefon", + "QuotationTemplate.E-mail": "E-posta", + "QuotationTemplate.Quotation": "Fiyat Teklifi", + "QuotationTemplate.To": "Müşteri", + "QuotationTemplate.Details": "Detay", + "QuotationTemplate.QuotationNo:": "Teklif No:", + "QuotationTemplate.IssueDate:": "Teklif Tarihi:", + "QuotationTemplate.ValidFor:": "Geçerlilik Süresi:", + "QuotationTemplate.ValidDays": "{0} Gün", + "QuotationTemplate.Description": "Açıklama", + "QuotationTemplate.UnitPrice": "Birim Fiyat", + "QuotationTemplate.Qty": "Adet", + "QuotationTemplate.Discount": "İndirim", + "QuotationTemplate.Total": "Tutar", + "QuotationTemplate.Notes": "Notlar", + "QuotationTemplate.SubTotal": "Alt Toplam", + "QuotationTemplate.Tax/VAT": "Vergiler (%{0})", + "QuotationTemplate.TotalDiscount": "Toplam İndirim", + "QuotationTemplate.TotalDue": "NET TOPLAM", + "QuotationTemplate.ThanksForYourBusiness": "Değerli siparişlerinizi bekleriz." } } diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/ar.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/ar.json index 82cc7724bf..4a7e64125f 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/ar.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/ar.json @@ -137,6 +137,7 @@ "Address": "العنوان", "Homepage": "الصفحة الرئيسية", "Year": "السنة", + "Year_Plural": "سنوات", "Copyright": "حقوق النشر © {1}", "DomainDrivenDesign": "التصميم المُقاد بالنطاق DDD", "CrossCuttingConcerns": "اهتمامات مشتركة", diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json index d228bed40c..fb6207f8f8 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json @@ -141,6 +141,7 @@ "Address": "Address", "Homepage": "Homepage", "Year": "Year", + "Year_Plural": "Years", "Copyright": "Copyright © {1}", "DomainDrivenDesign": "Domain Driven Design", "CrossCuttingConcerns": "Cross Cutting Concerns", @@ -211,6 +212,13 @@ "RecentActivities": "Recent Activities", "SpringCampaign": "Welcome
Spring Sale!", "SpringCampaign2": "Limited
Time Offer!
", - "AboutUs": "About Us" + "AboutUs": "About Us", + "HowItWorks": "How it works?", + "ReleaseNotes": "Release Notes", + "DetailedChangeNotes" : "Detailed Change Notes", + "SeeTrainings": "See Trainings", + "NoContent": "No content", + "ABPStudioBeta": "ABP Studio BETA", + "More": "More" } } diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/fi.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/fi.json index cd2802fef4..16437480ef 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/fi.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/fi.json @@ -140,6 +140,7 @@ "Address": "Osoite", "Homepage": "Kotisivu", "Year": "vuosi", + "Year_Plural": "vuotta", "Copyright": "Tekijänoikeus © {1}", "DomainDrivenDesign": "Domain Driven Design", "CrossCuttingConcerns": "Cross Cutting Concerns", diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/hu.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/hu.json index 21eb33ac23..b9ccddecf4 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/hu.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/hu.json @@ -138,6 +138,7 @@ "Address": "Cím", "Homepage": "Kezdőlap", "Year": "Év", + "Year_Plural": "Év", "Copyright": "Copyright © {1}", "DomainDrivenDesign": "Domainvezérelt tervezés", "CrossCuttingConcerns": "Cross Cutting Concerns", diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/tr.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/tr.json index 4275bb3771..827ebb724c 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/tr.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/tr.json @@ -132,6 +132,7 @@ "Address": "Adres", "Homepage": "Anasayfa", "Year": "Yıl", + "Year_Plural": "Yıl", "Copyright": "Telif hakkı © {1}", "DomainDrivenDesign": "Alan Odaklı Tasarım", "CrossCuttingConcerns": "Cross Cutting Concerns", @@ -168,6 +169,7 @@ "ExploreTheBook": "Kitabı Keşfedin", "ExploreTheEBook": "E-Kitabı Keşfedin", "LatestVideos": "Son Videolar", - "Videos": "Videolar" + "Videos": "Videolar", + "More": "Daha Fazla" } } \ No newline at end of file diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/zh-Hans.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/zh-Hans.json index 89f156c473..d1a0db7176 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/zh-Hans.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/zh-Hans.json @@ -140,6 +140,7 @@ "Address": "地址", "Homepage": "主页", "Year": "年份", + "Year_Plural": "年份", "Copyright": "版权所有 © {1}", "DomainDrivenDesign": "领域驱动设计", "CrossCuttingConcerns": "横切关注点", diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ar.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ar.json index d875bffc2b..a7cfc334a9 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ar.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ar.json @@ -454,7 +454,7 @@ "MultipleUIOptionsExplanation": "نحن نحب طرقًا مختلفة لإنشاء واجهة المستخدم. يوفر حل بدء التشغيل هذا ثلاثة خيارات مختلفة لإطار عمل واجهة المستخدم لتطبيق عملك.", "MultipleDatabaseOptions": "خيارات قاعدة بيانات متعددة", "MultipleDatabaseOptionsExplanation": "لديك خياران لموفر قاعدة البيانات (بالإضافة إلى استخدام كليهما في تطبيق واحد). استخدم Entity Framework Core للعمل مع أي قاعدة بيانات علائقية واستخدم Dapper اختياريًا عندما تحتاج إلى كتابة استعلامات منخفضة المستوى للحصول على أداء أفضل. يعد MongoDB خيارًا آخر إذا كنت بحاجة إلى استخدام قاعدة بيانات NoSQL قائمة على المستندات. في حين أن هؤلاء الموفرين مدمجون جيدًا وملخصون ومهيئون مسبقًا ، يمكنك في الواقع التفاعل مع أي نظام قاعدة بيانات يمكنك استخدامه مع .NET.", - "ModularArchitectureExplanation2": "النمطية هي مواطن من الدرجة الأولى في منصة ABP.IO. يتم تقسيم جميع وظائف التطبيق إلى وحدات اختيارية معزولة جيدًا. يأتي حل بدء التشغيل بالفعل مع وحدات ABP Commercial الأساسية المثبتة مسبقًا. يمكنك أيضًا إنشاء الوحدات النمطية الخاصة بك لبناء نظام معياري لتطبيقك الخاص.", + "ModularArchitectureExplanation2": "النمطية هي مواطن من الدرجة الأولى في منصة ABP.IO. يتم تقسيم جميع وظائف التطبيق إلى وحدات اختيارية معزولة جيدًا. يأتي حل بدء التشغيل بالفعل مع وحدات ABP Commercial الأساسية المثبتة مسبقًا. يمكنك أيضًا إنشاء الوحدات النمطية الخاصة بك لبناء نظام معياري لتطبيقك الخاص.", "MultiTenancyForSaasBusiness": "متعدد الإيجارات لأعمال SaaS الخاصة بك", "MultiTenancyForSaasBusinessExplanation": "توفر ABP Commercial نظامًا كاملاً ومتعدد الإيجارات لإنشاء أنظمة SaaS (البرمجيات كخدمة). يسمح للمستأجرين بمشاركة قواعد البيانات الخاصة بهم أو الحصول عليها من خلال إنشاء قاعدة بيانات سريعة ونظام الهجرة.", "MicroserviceStartupSolution": "حل بدء تشغيل الخدمات المصغرة", diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json index 450cd69ae3..96aaa28e13 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json @@ -96,11 +96,11 @@ "See All Modules": "SeeAllModules", "ABPSuite": "ABP Suite", "AbpSuiteShortDescription": "ABP Suite is a complementary tool to ABP Commercial.", - "AbpSuiteExplanation": "It allows you to build web pages in a matter of minutes. It's a .NET Core Global tool which can be installed from the command line. It can create a new ABP solution, generate CRUD pages from the database to the front-end.", + "AbpSuiteExplanation": "It allows you to build web pages in a matter of minutes. It's a .NET Core Global tool that can be installed from the command line. It can create a new ABP solution, and generate CRUD pages from the database to the front-end.", "Details": "Details", "LeptonTheme": "Lepton Theme", "ProfessionalModernUIThemes": "Professional, modern UI themes", - "LeptonThemeExplanation": "Lepton provides a gamut of Bootstrap admin themes that serve as a solid foundation for any project requiring admin dashboard.", + "LeptonThemeExplanation": "Lepton provides a gamut of Bootstrap admin themes that serve as a solid foundation for any project requiring an admin dashboard.", "DefaultTheme": "Default Theme", "MaterialTheme": "Material Theme", "Default2Theme": "Default 2 Theme", @@ -148,12 +148,12 @@ "SeeTheGuideOrGoToTheLiveDemo": "Check out the developer guide for technical information about this template or go to the live demo.", "DeveloperGuide": "Developer Guide", "ModuleTemplate": "Module Template", - "ModuleTemplateExplanation1": "You want to create a module and reuse across different applications? This startup template prepares everything to start to create a reusable application module or a microservice.", + "ModuleTemplateExplanation1": "You want to create a module and reuse it across different applications? This startup template prepares everything to start to create a reusable application module or a microservice.", "ModuleTemplateExplanation2": "

You can support single or multiple UI frameworks, single or multiple database providers for a single module. The startup template is configured to run and test your module in a minimal application in addition to the unit and integration test infrastructure.

Check out the developer guide for technical information about this template.

", "WithAllStyleOptions": "with all style options", "Demo": "Demo", "SeeAllModules": "See All Modules", - "ABPCLIExplanation": "ABP CLI (Command Line Interface) is a command line tool to perform some common operations for ABP based solutions.", + "ABPCLIExplanation": "ABP CLI (Command Line Interface) is a command line tool to perform some common operations for ABP-based solutions.", "ABPSuiteEasilyCURD": "ABP Suite is a tool which allows you to easily create CRUD pages", "WeAreHereToHelp": "We are Here to Help", "BrowseOrAskQuestion": "You can browse our help topics or search in the frequently asked questions, or you can ask us a question by using the contact form.", @@ -168,7 +168,7 @@ "ABPCommercialFollowingBenefits": "ABP Commercial adds the following benefits on top of the ABP framework:", "Professional": "Professional", "UIThemes": "UI Themes", - "EnterpriseModules": "Enterprise ready, feature rich, pre-built Application Modules (e.g. Identity Server management, SaaS management, language management)", + "EnterpriseModules": "Enterprise ready, feature-rich, pre-built Application Modules (e.g. Identity Server management, SaaS management, language management)", "ToolingToSupport": "Tooling to support your development productivity (e.g. ABP Suite)", "PremiumSupportLink": "Premium Support", "WhatDoIDownloadABPCommercial": "What do I download when I purchase the ABP Commercial?", @@ -187,10 +187,10 @@ "LicenseRenewalCost": "What is the license renewal cost after 1 year?", "LicenseRenewalCostExplanation": "The renewal (extend) price of the standard Team License is ${0}, standard Business License is ${1} and standard Enterprise License is ${2}. If you are already a customer, log into your account to review the current renewal pricing.", "HowDoIRenewMyLicense": "How do I renew my license?", - "HowDoIRenewMyLicenseExplanation": "You can renew your license by navigating to the organization management page. In order to take advantage of our discounted Early Renewal rates, make sure you renew before your license expires. Don't worry about not knowing when your Early Renewal opportunity closes, you'll however receive 3 reminder e-mails before your subscription expires. We'll send them 30 days, 7 days and 1 day before expiration.", + "HowDoIRenewMyLicenseExplanation": "You can renew your license by navigating to the organization management page. In order to take advantage of our discounted Early Renewal rates, ensure you renew before your license expires. Don't worry about not knowing when your Early Renewal opportunity closes, you'll however receive 3 reminder e-mails before your subscription expires. We'll send them 30 days, 7 days and 1 day before expiration.", "IsSourceCodeIncluded": "Does my license include the source code of the commercial modules and themes?", "IsSourceCodeIncludedExplanation1": "Depends on the license type you've purchased:", - "IsSourceCodeIncludedExplanation2": "Team: Your solution uses the modules and themes as NuGet and NPM packages. It doesn't include their source code. In this way, you can easily upgrade these modules and themes whenever a new version is available. However, you can not get the source code of these modules and themes.", + "IsSourceCodeIncludedExplanation2": "Team: Your solution uses the modules and themes as NuGet and NPM packages. It doesn't include their source code. This way, you can easily upgrade these modules and themes whenever a new version is available. However, you can not get the source code of these modules and themes.", "IsSourceCodeIncludedExplanation3": "Business/Enterprise: In addition to the Team license, you are able to download the source code of any module or theme you need. You can even remove the NuGet/NPM package references for a particular module and add its source code directly to your solution to fully change it.", "IsSourceCodeIncludedExplanation4": "

Including the source code of a module to your solution gives you the maximum freedom to customize that module. However, it will then not be possible to automatically upgrade the module when a new version is released.

None of the licenses include the ABP Suite source code, which is an external tool that generates code for you and assists your development.

Check out the Plans & Pricing page for other differences between the license types.

", "ChangingDevelopers": "Can I change the registered developers of my organization in the future?", @@ -208,12 +208,12 @@ "WhenShouldIRenewMyLicense": "When should I renew my license?", "WhenShouldIRenewMyLicenseExplanation": "If you renew your license within {3} days after your license expires, the following discounts will be applied: Team License {0}; Business License {1}; Enterprise License {2}. However, if you renew your license after {3} days since the expiry date of your license, the renewal price will be the same as the license purchase price and there will be no discount on your renewal.", "TrialPlan": "Do you have a trial plan?", - "TrialPlanExplanation": "Yes, to start your free trial contact marketing@abp.io. We also offer a 30-day money-back guarantee for the Team license, no questions asked! You can request a full refund within the first 30 days of the license purchase. We provide a 60% refund within 30 days for Business and Enterprise licenses. This is because the Business and Enterprise licenses contain the full source-code of all the modules and themes.", + "TrialPlanExplanation": "Yes, to start your free trial contact marketing@volosoft.com. We also offer a 30-day money-back guarantee for the Team license, no questions asked! You can request a full refund within the first 30 days of the license purchase. We provide a 60% refund within 30 days for Business and Enterprise licenses. This is because the Business and Enterprise licenses contain the full source-code of all the modules and themes.", "DoYouAcceptBankWireTransfer": "Do you accept bank wire transfers?", "DoYouAcceptBankWireTransferExplanation": "Yes, we accept bank wire transfers.
After sending the license fee via bank transfer, send your receipt and requested license type to accounting@volosoft.com.
Our international bank account information:", "HowToUpgrade": "How to upgrade existing applications when a new version is available?", - "HowToUpgradeExplanation1": "When you create a new application using ABP Commercial, all the modules and theme are used as NuGet and NPM packages. So, you can easily upgrade the packages when a new version is available.", - "HowToUpgradeExplanation2": "In addition to the standard NuGet/NPM upgrades, ABP CLI provides an update command that automatically finds and upgrades all ABP related packages in your solution.", + "HowToUpgradeExplanation1": "When you create a new application using ABP Commercial, all the modules and themes are used as NuGet and NPM packages. So, you can easily upgrade the packages when a new version is available.", + "HowToUpgradeExplanation2": "In addition to the standard NuGet/NPM upgrades, ABP CLI provides an update command that automatically finds and upgrades all ABP-related packages in your solution.", "DatabaseSupport": "Which database systems are supported?", "DatabaseSupportExplanation": "ABP Framework itself is database agnostic and can work with any database provider by its nature. Check out the Data Access document for a list of currently implemented providers.", "UISupport": "Which UI frameworks are supported?", @@ -239,16 +239,16 @@ "HowCanIGetMyInvoice": "How can I get my invoice?", "HowCanIGetMyInvoiceExplanation": "There are 2 payment gateways for purchasing a license: Iyzico and 2Checkout. If you purchase your license through the 2Checkout gateway, it sends the PDF invoice to your email address, check out 2Checkout invoicing. If you purchase through the Iyzico gateway, with a custom purchase link or via a bank wire transfer, we will prepare and send your invoice. You can request or download your invoice from the organization management page. Before contacting us for the invoice, check your organization management page!", "Forum": "Forum", - "SupportExplanation": "ABP Commercial licenses provides a premium forum support by a team consists of the ABP Framework experts.", + "SupportExplanation": "ABP Commercial license provides a premium forum support by a team consisting of the ABP Framework experts.", "PrivateTicket": "Private Ticket", "PrivateTicketExplanation": "Enterprise License also includes a private support with e-mail and ticket system.", "AbpSuiteExplanation1": "ABP Suite allows you to build web pages in a matter of minutes. It's a .NET Core Global tool that can be installed from the command line.", - "AbpSuiteExplanation2": "It can create a new ABP solution, generate CRUD pages from the database to the front-end. For technical overview see the document", + "AbpSuiteExplanation2": "It can create a new ABP solution and generate CRUD pages from the database to the front-end. For technical overview see the document", "FastEasy": "Fast & Easy", - "AbpSuiteExplanation3": "ABP Suite allows you to easily create CRUD pages. You just need to define your entity and its properties, let the rest to ABP Suite for you! ABP Suite generates all the necessary code for your CRUD page in a few seconds. It supports Angular, MVC and Blazor user interfaces.", + "AbpSuiteExplanation3": "ABP Suite allows you to easily create CRUD pages. You just need to define your entity and its properties, and let the rest to ABP Suite for you! ABP Suite generates all the necessary code for your CRUD page in a few seconds. It supports Angular, MVC and Blazor user interfaces.", "RichOptions": "Rich Options", "AbpSuiteExplanation4": "ABP Suite supports multiple UI options like Razor Pages and Angular.It also supports multiple databases like MongoDB and all databases supported by EntityFramework Core (MS SQL Server, Oracle, MySql, PostgreSQL, and other providers...).", - "AbpSuiteExplanation5": "Good thing is that, you don't have to worry about those options. ABP Suite understands your project type and generates the code for your project and places the generated code in correct place in your project.", + "AbpSuiteExplanation5": "Good thing is that, you don't have to worry about those options. ABP Suite understands your project type and generates the code for your project and places the generated code in the correct place in your project.", "SourceCode": "Source Code", "AbpSuiteExplanation6": "ABP Suite generates the source code for you! It doesn't generate magic files to generate the web page. ABP Suite generates the source code for Entity, Repository, Application Service, Code First Migration, JavaScript/TypeScript and CSHTML/HTML and necessary Interfaces as well. ABP Suite also generates the code according to the Best Practices of software development, so you don't have to worry about the generated code's quality.", "AbpSuiteExplanation7": "Since you have the source code of the building blocks of the generated CRUD page in the correct application layers, you can easily modify the source code and inject your custom/business logic to the generated code.", @@ -263,7 +263,7 @@ "HotToRunSolutionExplanation": "Check out the getting started document to learn how to configure and run your solution.", "GettingStarted": "Getting Started", "WebAppDevTutorial": "Web App Dev Tutorial", - "WebAppDevTutorialExplanation": "Check out the web application development tutorial document for a step by step development sample.", + "WebAppDevTutorialExplanation": "Check out the web application development tutorial document for a step-by-step development sample.", "Document": "Document", "UsingABPSuiteToCURD": "Using ABP Suite for CRUD Page Generation & Tooling", "SeeABPSuiteDocument": "Check out the ABP Suite document to learn the usage of ABP Suite.", @@ -312,7 +312,7 @@ "DiscountRequestDescribeCustomerQuestion": "Which of the following describes you?", "DiscountRequestStudentEmailMessage": "Email Address must contain 'edu'.", "DiscountRequestDeveloperCount": "How many developers are you?", - "DiscountRequestDeveloperCountExceedMessage": "We don't provide discounted license for companies that have over {0} developers.", + "DiscountRequestDeveloperCountExceedMessage": "We don't provide discounted licenses for companies that have over {0} developers.", "DiscountRequestOrganizationName": "Company/organization/school name", "Website": "Website", "GithubUsername": "GitHub username", @@ -400,7 +400,7 @@ "UserDeveloperDescription": "The 'Developers' can write code in the ABP Commercial projects, download the ABP sample projects, and ask questions on the support website. On the other hand, the 'Developers' cannot manage this organization.", "RemoveCurrentUserFromOrganizationWarningMessage": "You are removing yourself from your own organization. You will no longer be able to manage this organization, do you confirm?", "RenewExistingOrganizationOrCreateNewOneMessage": "You can renew the license of your organization(s) by clicking the below \"Extend Now\" button(s) and thus you can extend the license expiration date by 1 year. If you continue to checkout, you will have a new organization. Do you want to continue with a new organization?", - "PurchaseTrialOrganizationOrCreateNewOneMessage": "You have a trial license. To purchase your trial license click Purchase Now button. If you continue to checkout, you will have a new organization. Do you want to continue with a new organization?", + "PurchaseTrialOrganizationOrCreateNewOneMessage": "You have a trial license. To purchase your trial license click the Purchase Now button. If you continue to checkout, you will have a new organization. Do you want to continue with a new organization?", "ExtendNow": "Extend Now", "CreateNewOrganization": "Create a new organization", "RenewLicenseEarly": "If I renew my license early, will I get the full year?", @@ -427,7 +427,7 @@ "BusinessLogic": "Business Logic", "DataAccessLayer": "Data Access Layer", "Monolith": "Monolith", - "ModularArchitectureExplanation": "This startup template provides a layered, modular and DDD based solution architecture to build a clean and maintainable codebase.", + "ModularArchitectureExplanation": "This startup template provides a layered, modular and DDD-based solution architecture to build a clean and maintainable codebase.", "SeeDetails": "See Details", "SeeDocumentation": "Check out the Documentation", "Bs5Compatible": "Bootstrap 5 compatible professional theme, perfect for your admin website.", @@ -448,7 +448,7 @@ "NameSurname": "Name Surname", "Unspecified": "Unspecified", "LicenceType": "Licence Type", - "LicenseDiscountWarning": "THIS DISCOUNT PAGE USES DEFAULT DISCOUNT CODE AND FOR VOLOSOFT DEVELOPERS. PURCHASE LINKS BELOW DOES NOT WORK.", + "LicenseDiscountWarning": "THIS DISCOUNT PAGE USES DEFAULT DISCOUNT CODE AND FOR VOLOSOFT DEVELOPERS. PURCHASE LINKS BELOW DO NOT WORK.", "DiscountedLicenseExplanation": "These license prices are for small startups, individual developers, students, non-profit organizations and projects!", "General": "General", "License": "License", @@ -464,7 +464,7 @@ "AddDevelopers": "Add Developers", "StartDevelopment": "Start Development", "CreateAndRunApplicationUsingStartupTemplate": "Learn how to create and run a new web application using the ABP Commercial startup template.", - "CommunityDescription2": "community.abp.io is a place where people can share ABP related articles. Search for articles, tutorials, code samples, case studies and meet people in the same lane as you.", + "CommunityDescription2": "community.abp.io is a place where people can share ABP-related articles. Search for articles, tutorials, code samples, case studies and meet people in the same lane as you.", "UseABPSuiteExplanation": "Use ABP Suite to download the source-code of the modules and themes.", "ManageModulesWithSuite": "You can also manage your ABP modules with Suite.", "LearnHowToInstallSuite": "Learn how to install and use ABP Suite.", @@ -475,8 +475,8 @@ "MultipleUIOptions": "Multiple UI Options", "MultipleUIOptionsExplanation": "We love different ways to create the User Interface. This startup solution provides three different UI framework options for your business application.", "MultipleDatabaseOptions": "Multiple Database Options", - "MultipleDatabaseOptionsExplanation": "You have two database provider options (in addition to use both in a single application). Use Entity Framework Core to work with any relational database and optionally use Dapper when you need to write low-level queries for a better performance. MongoDB is another option if you need to use a document based NoSQL database. While these providers are well-integrated, abstracted and pre-configured, you can actually interact to any database system that you can use with .NET.", - "ModularArchitectureExplanation2": "Modularity is a first-class citizen in the ABP.IO platform. All the application functionalities are split into well-isolated optional modules. The startup solution already comes with the fundamental ABP Commercial modules pre-installed. You can also create your own modules to build a modular system for your own application.", + "MultipleDatabaseOptionsExplanation": "You have two database provider options (in addition to using both in a single application). Use Entity Framework Core to work with any relational database and optionally use Dapper when you need to write low-level queries for a better performance. MongoDB is another option if you need to use a document based NoSQL database. While these providers are well-integrated, abstracted and pre-configured, you can actually interact to any database system that you can use with .NET.", + "ModularArchitectureExplanation2": "Modularity is a first-class citizen in the ABP.IO platform. All the application functionalities are split into well-isolated optional modules. The startup solution already comes with the fundamental ABP Commercial modules pre-installed. You can also create your own modules to build a modular system for your own application.", "MultiTenancyForSaasBusiness": "Multi-Tenancy for your SaaS Business", "MultiTenancyForSaasBusinessExplanation": "ABP Commercial provides a complete, end-to-end multi-tenancy system to create your SaaS (Software-as-a-Service) systems. It allows the tenants to share or have their own databases with on-the-fly database creation and migration system.", "MicroserviceStartupSolution": "Microservice Startup Solution", @@ -507,39 +507,39 @@ "Note": "Note", "AdditionalNote": "Additional Note", "OnboardingTrainingFaqTitle": "Do you have ABP onboarding training?", - "OnboardingTrainingFaqExplanation": "Yes, we have ABP Training Services to help you get your ABP project started fast. You will learn about ABP from an ABP core team member and you will get the skills to begin your ABP project. In the onboarding training, we will explain how to set up your development environment, install the required tools, create a fully functional CRUD page. The training will be live and the Zoom application will be used, and we are open to using other online meeting platforms. The language of the training will be English. You can also ask your questions about ABP during the sessions. A convenient time and date will be planned for both parties. To get more information, contact us at info@abp.io.", + "OnboardingTrainingFaqExplanation": "Yes, we have ABP Training Services to help you get your ABP project started fast. You will learn about ABP from an ABP core team member, and you will get the skills to begin your ABP project. In the onboarding training, we will explain how to set up your development environment, install the required tools, create a fully functional CRUD page. The training will be live and the Zoom application will be used, and we are open to using other online meeting platforms. The language of the training will be English. You can also ask your questions about ABP during the sessions. A convenient time and date will be planned for both parties. To get more information, contact us at info@abp.io.", "AddBasket": "Add to Basket", "SendTrainingRequest": "Send Training Request", - "OnlyEnglishVersionOfThisDocumentIsTheRecentAndValid": "* The English version of this document is the most up-to-date and the English version will prevail in any dispute.", + "OnlyEnglishVersionOfThisDocumentIsTheRecentAndValid": "* The English version of this document is the most up-to-date, and the English version will prevail in any dispute.", "Pricing_Page_Title": "Pricing & Plans", "Pricing_Page_Description": "Choose the features and functionality your business needs today. Buy an ABP Commercial license and create unlimited projects.", "Pricing_Page_HurryUp": "Hurry Up!", "Pricing_Page_BuyLicense": "Buy a license at 2021 prices until January 16!", "Pricing_Page_ValidForExistingCustomers": "Also valid for existing customers and license renewals.", "Pricing_Page_Hint1": "The license price includes a certain number of developer seats. If you have more developers, you can always purchase additional seats.", - "Pricing_Page_Hint2": "You can purchase more developer licenses now or in the future. Licenses are seat based, so you can transfer a seat from a developer to another.", - "Pricing_Page_Hint3": "You can develop unlimited count of different products with your license.", + "Pricing_Page_Hint2": "You can purchase more developer licenses now or in the future. Licenses are seat-based, so you can transfer a seat from one developer to another.", + "Pricing_Page_Hint3": "You can develop an unlimited count of different products with your license.", "Pricing_Page_Hint4": "ABP Suite is a tool to assist your development to improve your productivity. It supports generating CRUD pages and creating new projects.", "Pricing_Page_Hint5": "You can use all the pre-built modules in your applications.", "Pricing_Page_Hint6": "You can use all the pre-built themes in your applications.", "Pricing_Page_Hint7": "A startup template is a Visual Studio solution to make you jump-start to your project. All fundamental modules are added and pre-configured for you.", - "Pricing_Page_Hint8": "Mastering ABP Framework e-book explains how to implement .NET solutions with best practices. It is sold on Amazon.com and you can download the book for free within your license.", + "Pricing_Page_Hint8": "Mastering ABP Framework e-book explains how to implement .NET solutions with best practices. It is sold on Amazon.com and you can download the book for free with your license.", "Pricing_Page_Hint9": "You can download the source-code of any module. You may want to add the source code to your solution to make radical changes or just keep it for yourself for security reasons.", - "Pricing_Page_Hint10": "Licenses are for lifetime. That means you can continue to develop your application forever. Accessing to the latest version and getting support are granted within the license period (1 year unless you renew it).", + "Pricing_Page_Hint10": "Licenses are for a lifetime. That means you can continue to develop your application forever. Accessing to the latest version and getting support are granted within the license period (1 year unless you renew it).", "Pricing_Page_Hint11": "No restrictions on deployment! You can deploy to as many servers as you want, including the cloud services or on-premises.", "Pricing_Page_Hint12": "You can update the modules, themes and tools to the latest version within your active license period. After your license expires, you need to renew it, to continue to get updates for bug fixes, new features and enhancements.", "Pricing_Page_Hint13": "You can get the premium support for one year (you can renew your license to extend it).", "Pricing_Page_Hint14": "Team and Business licenses have incident/question count limit. If you buy additional developer licenses, your incident limit increases by {0} (for the Team License) or {1} (for the Business License) per developer.", - "Pricing_Page_Hint15": "Only Enterprise License includes private support. You can send e-mail directly to the ABP Team or ask questions on support.abp.io with private ticket option. The private tickets are not visible to the public.", + "Pricing_Page_Hint15": "Only Enterprise License includes private support. You can send e-mail directly to the ABP Team or ask questions on support.abp.io with a private ticket option. The private tickets are not visible to the public.", "Pricing_Page_Hint16": "You can download the source-code of all ABP themes. You may want to add the source code to your solution to make radical changes or just keep it for yourself for security reasons.", "Pricing_Page_Testimonial_1": "ABP Commercial allowed SC Ventures to deliver a bank-grade multi-tenant silo-database SaaS platform in 9 months to support the accounts receivable / accounts payable supply chain financing of significant value invoices from multiple integrated anchors. The modularity of ABP made it possible for the team to deliver in record time, pass all VAPT, and deploy the containerized microservices stack via full CI/CD and pipelines into production.", - "Pricing_Page_Testimonial_2": "We are seeing the value of using ABP Commercial to reduce the overhead of custom development projects. And the team is able to unify the code pattern in different project streams. We see more potential in the framework for us to build new features faster than before. We trust we will be constantly seeing the value of leveraging ABP Commercial.", + "Pricing_Page_Testimonial_2": "We see the value of using ABP Commercial to reduce the overhead of custom development projects. And the team is able to unify the code pattern in different project streams. We see more potential in the framework for us to build new features faster than before. We trust we will be constantly seeing the value of leveraging ABP Commercial.", "Pricing_Page_Testimonial_3": "We love ABP. We don't have to write everything from scratch. We start from out-of-the-box features and just focus on what we really need to write. Also, ABP is well-architected and the code is high quality with fewer bugs. If we would have to write everything we needed on our own, we might have to spend years. Once more things we like is that the new version, or issue fixing, or improvement come out very soon every other week. We don't wait too long.", - "Pricing_Page_Testimonial_4": "ABP Commercial is a fantastic product would recommend. Commercial products to market for our customers in a single configurable platform. The jump start that the framework and tooling provide any team is worth every cent. ABP Commercial was the best fit for our needs.", + "Pricing_Page_Testimonial_4": "ABP Commercial is a fantastic product would recommend. Commercial products to market for our customers in a single configurable platform. The jump starts that the framework and tooling provide any team is worth every cent. ABP Commercial was the best fit for our needs.", "Pricing_Page_Testimonial_5": "ABP Framework is not only a framework, but it is also a guide for project development/management, because it provides DDD, GenericRepository, DI, Microservice, and Modularity training. Even if you are not going to use the framework itself, you can develop yourself with docs.abp.io which is well and professionally prepared (OpenIddict, Redis, Quartz etc.). Because many things are pre-built, it shortens project development time significantly (Such as login page, exception handling, data filtering, seeding, audit logging, localization, auto API controller etc.). As an example from our application, I have used Local Event Bus for stock control. So, I am able to manage order movements by writing stock handler. It is wonderful not to lose time for CreationTime, CreatorId. They are being filled automatically.", - "Pricing_Page_Testimonial_6": "ABP Framework is a good framework but it needs time to understand the different layers, classes, and libraries it used (specially ABP). I spent a lot of time reading the code base, but ABP Commercial save us time to create the project specialty entities (AR) and the repository linked to each of them. I liked also the approach used in ABP is very mature, we know is based on DDD and monolith.", - "Pricing_Page_Testimonial_7": "As a startup we need to iterate quickly and spend minimal time on boilerplate and non-core features.\nOur engineers range from highly experienced to junior engineers, we needed a common understanding and a way to share technical and domain knowledge, ABP allowed us to do this due to their great guides and documentation. \nThere are things we haven't had to worry about since they work out of the box with ABP. \nABP helped us streamline rapid prototyping and development, less than 4 weeks from feature inception to production. With all its premium features included in the license, ABP has given us, \"Startup in a Box\" on the Software Engineering Side.", - "Pricing_Page_Testimonial_8": "I would recommend ABP commercial to all those who want to expand the range of products available to their customers. It's fantastic when need to use a distributed enterprise enviroment (Angualr, WPF, Win&Linux). In addition to their products, we love their support, which makes our job faster and easier. We already know that we have found a great partner for the future who will support us in expanding our business.", + "Pricing_Page_Testimonial_6": "ABP Framework is a good framework but it needs time to understand the different layers, classes, and libraries it uses (specially ABP). I spent a lot of time reading the code base, but ABP Commercial saved us time to create the project specialty entities (AR) and the repository linked to each of them. I liked also the approach used in ABP is very mature, we know is based on DDD and monolith.", + "Pricing_Page_Testimonial_7": "As a startup, we need to iterate quickly and spend minimal time on boilerplate and non-core features.\nOur engineers range from highly experienced to junior engineers, we needed a common understanding and a way to share technical and domain knowledge, ABP allowed us to do this due to their great guides and documentation. \nThere are things we haven't had to worry about since they work out of the box with ABP. \nABP helped us streamline rapid prototyping and development, less than 4 weeks from feature inception to production. With all its premium features included in the license, ABP has given us, \"Startup in a Box\" on the Software Engineering Side.", + "Pricing_Page_Testimonial_8": "I would recommend ABP commercial to all those who want to expand the range of products available to their customers. It's fantastic when need to use a distributed enterprise environment (Angular, WPF, Win&Linux). In addition to their products, we love their support, which makes our job faster and easier. We already know that we have found a great partner for the future who will support us in expanding our business.", "Pricing_Page_Testimonial_9": "We are a company of 2 employees that's been in business for over 20 years.\nIn terms of our experience with ABP Commercial, we were approached by a client who requested that we develop a new human resources application in a modern environment to replace their 25-year-old Access application. We decided to transition from a desktop solution to a web-based one.\n\nAt the time, we had very little knowledge of web applications and .NET but we stumbled upon ABP Commercial, and with the help of ABP Framework, technical documentation, and ABP Suite, we were able to not only develop the application to the client's specifications but also successfully work within a .NET environment within a year.", "AbpBookDownloadArea_ClaimYourEBook": "Claim your Mastering ABP Framework E-Book", "AddMemberModal_Warning_1": "If the username you are trying to add doesn't exist in the system, please ask your team member to register on {0} and share the username of his/her account with you.", @@ -590,9 +590,9 @@ "PaymentSucceed_PaymentSuccessMessage": "Payment Successful", "PaymentSucceed_ThanksForPurchase": "Thank you for your purchase!", "PaymentSucceed_CreateYourOrganization": "Create your organization", - "PaymentSucceed_AddMeAsDeveloper": "I'm a developer too, add me as a a developer to my organization.", + "PaymentSucceed_AddMeAsDeveloper": "I'm a developer too, add me as a developer to my organization.", "PaymentSucceed_CreateOrganization": "Create Organization", - "PaymentSucceed_OrganizationDescription": "An organization consists of developers and owners. The developers are users who write code on ABP project and will benefit from the {1} website. The owners are users who allocate developer seats and manage licensing.", + "PaymentSucceed_OrganizationDescription": "An organization consists of developers and owners. The developers are users who write code on the ABP project and will benefit from the {1} website. The owners are users who allocate developer seats and manage licensing.", "PaymentSucceed_ViewOrganization": "Click here to view organization", "Purchase_TotalAnnualPrice": "TOTAL (annual fee)", "Purchase_TrainingPrice": "Training Price", @@ -600,7 +600,7 @@ "TotalDeveloperPrice": "Total Developer Price", "Purchase_PricePerDeveloper": "{0} {1} per developer", "Purchase_IncludedDeveloperInfo": "{0} {1} included.", - "Purchase_LicenseExtraDeveloperPurchaseMessage": "The {0} license contains {1} developer(s). You can add additional developers now or later.", + "Purchase_LicenseExtraDeveloperPurchaseMessage": "The {0} License includes {1} developers. You can add additional developers.", "StartupTemplates_Page_Title": "ABP Startup Templates", "StartupTemplates_Page_Description": "ABP Commercial allows you to build solutions with any level of complexity. It provides two main pre-built startup solutions. You can select the one close to your requirements and build your own custom solution on top of it.", "MicroserviceStartupSolutionForDotnet": "Microservice Startup Solution for .NET", @@ -665,9 +665,9 @@ "Landing_Page_DocsModule": "Docs", "Landing_Page_FileManagementModule": "File Management", "Landing_Page_CustomerStory_1": "ABP Commercial allowed SC Ventures to deliver a bank-grade multi-tenant silo-database SaaS platform in 9 months to support the accounts receivable / accounts payable supply chain financing of significant value invoices from multiple integrated anchors. The modularity of ABP made it possible for the team to deliver in record time, pass all VAPT, and deploy the containerized microservices stack via full CI/CD and pipelines into production.", - "Landing_Page_CustomerStory_2": "We are seeing the value of using ABP Commercial to reduce the overhead of custom development projects. And the team is able to unify the code pattern in different project streams. We see more potential in the framework for us to build new features faster than before. We trust we will be constantly seeing the value of leveraging ABP Commercial.", - "Landing_Page_CustomerStory_3": "We love ABP. We don't have to write everything from scratch. We start from out-of-the-box features and just focus on what we really need to write. Also, ABP is well-architected and the code is high quality with fewer bugs. If we would have to write everything we needed on our own, we might have to spend years. Once more things we like is that the new version, or issue fixing, or improvement come out very soon\n every other week. We don't wait too long.", - "Landing_Page_CustomerStory_4": "ABP Commercial is a fantastic product would recommend. Commercial products to market for our customers in a single configurable platform. The jump start that the framework and tooling provide any team is worth every cent. ABP Commercial was the best fit for our needs.", + "Landing_Page_CustomerStory_2": "We see the value of using ABP Commercial to reduce the overhead of custom development projects. And the team can unify the code pattern in different project streams. We see more potential in the framework for us to build new features faster than before. We trust we will be constantly seeing the value of leveraging ABP Commercial.", + "Landing_Page_CustomerStory_3": "We love ABP. We don't have to write everything from scratch. We start from out-of-the-box features and just focus on what we really need to write. Also, ABP is well-architected and the code is high quality with fewer bugs. If we would have to write everything we needed on our own, we might have to spend years. Once more thing we like is that the new version, or issue fixing, or improvement comes out very soon\n every other week. We don't wait too long.", + "Landing_Page_CustomerStory_4": "ABP Commercial is a fantastic product would recommend. Commercial products to market for our customers in a single configurable platform. The jump starts that the framework and tooling provide any team is worth every cent. ABP Commercial was the best fit for our needs.", "Landing_Page_AdditionalServices": "Custom or volume license, onboarding, live training & support, custom project development, porting existing projects and more...", "Landing_Page_IncludedDeveloperLicenses": "Included {0} developer licenses", "Landing_Page_SeeOnDemo": "See on Demo", @@ -678,7 +678,7 @@ "Landing_Page_AccountModuleDescription_4": "Provides a forgot password page to send a password reset link as an e-mail.", "Landing_Page_AccountModuleDescription_5": "Provides email confirmation functionality with UI.", "Landing_Page_AccountModuleDescription_6": "Implements two factor authentication (SMS and e-mail).", - "Landing_Page_AccountModuleDescription_7": "Implements user lockout (locks the account for the set amount of time when a certain number of failed logons occur due to invalid credentials within a certain interval of time).", + "Landing_Page_AccountModuleDescription_7": "Implements user lockout (locks the account for the set amount of time when a certain number of failed logins occur due to invalid credentials within a certain interval of time).", "Landing_Page_AccountModuleDescription_8": "Implements Identity Server authentication server UI and functionality.", "Landing_Page_AccountModuleDescription_9": "Allows to switch between tenants in a multi-tenant environment.", "Landing_Page_AccountModuleDescription_10": "Allows to change the UI language of the application.", @@ -696,15 +696,15 @@ "Landing_Page_BloggingModuleDescription_4": "Allows to write comment for a post.", "Landing_Page_BloggingModuleDescription_5": "Allows to assign tags to the blog posts.", "Landing_Page_BloggingModuleDescription_6": "See the blog.abp.io website as a live example of the blogging module.", - "Landing_Page_ChatModuleDescription_1": "This module is used for real-time messaging between users in application.", - "Landing_Page_ChatModuleDescription_2": "Real-time messaging on chat page.", - "Landing_Page_ChatModuleDescription_3": "Search users in application for new conversations.", + "Landing_Page_ChatModuleDescription_1": "This module is used for real-time messaging between users in the application.", + "Landing_Page_ChatModuleDescription_2": "Real-time messaging on the chat page.", + "Landing_Page_ChatModuleDescription_3": "Search users in the application for new conversations.", "Landing_Page_ChatModuleDescription_4": "Contact list for recent conversations.", - "Landing_Page_ChatModuleDescription_5": "New message notifications when user is looking at another page.", + "Landing_Page_ChatModuleDescription_5": "New message notifications when the user is looking at another page.", "Landing_Page_ChatModuleDescription_6": "Total unread message count badge on menu icon.", "Landing_Page_ChatModuleDescription_7": "Unread message count for each conversation.", "Landing_Page_ChatModuleDescription_8": "Lazy loaded conversations.", - "Landing_Page_DocsModuleDescription_1": "This module is used to create technical documentation web sites;", + "Landing_Page_DocsModuleDescription_1": "This module is used to create technical documentation websites;", "Landing_Page_DocsModuleDescription_2": "Built-in GitHub integration: Directly write and manage documents on GitHub.", "Landing_Page_DocsModuleDescription_3": "Versioning support directly integrated to GitHub releases.", "Landing_Page_DocsModuleDescription_4": "Supports multi-language (with fallback support to the default language).", @@ -747,7 +747,7 @@ "Testimonial_ShortDescription_4": "ABP Commercial was the best fit for our needs.", "OnlineReviewersOnAbpCommercial": "Online Reviews on ABP Commercial", "SeeWhatToldAboutAbpCommercial": "See what has been told about ABP Commercial and write your thoughts if you want.", - "BlazoriseLicense": "Do we need to buy Blazorise license?", + "BlazoriseLicense": "Do we need to buy a Blazorise license?", "BlazoriseLicenseExplanation": "We have an agreement between Volosoft and Megabit, with this agreement Blazorise license is bundled with ABP Commercial products therefore our customers do not need to purchase an extra Blazorise license.", "ExtendPaymentInfoSection_DeveloperPrice": "{0}x Additional Developer(s)", "ExtendPaymentInfoSection_DiscountRate": "Discount {0}%", @@ -771,7 +771,7 @@ "BreadCrumbs": "Breadcrumb for seamless switching", "BreadCrumbsDescription": "Using Breadcrumb, you can switch to the pages at the same level with one-click, even when the left menu is closed, and it works on tablet and mobile responsive!", "YourMenu": "Your menu as you wish", - "YourMenuDescription": "Customize the directly clickable icons and dropdown boxes on the user menu as you wish. User menu is completely customizable for your needs", + "YourMenuDescription": "Customize the directly clickable icons and dropdown boxes on the user menu as you wish. The user menu is completely customizable for your needs", "RtlSupport": "RTL support for your language", "RtlSupportDescription": "LeptonX Theme supports RTL for your language. The language options are in the settings menu for you to change the language.", "YourColors": "Your colors on your admin dashboard UI", @@ -793,9 +793,9 @@ "IndependentLayoutDescription2": "This means that you can freely design your project with a content structure other than Bootstrap if you want.", "MostUsedLibraries": "Most used libraries integrated with LeptonX", "MostUsedLibrariesDescription1": "LeptonX contains your most used libraries. It allows you to use libraries such as ApexCharts, DataTables, DropZone, FullCalender, JSTree, Select2, Toastr effortlessly.", - "MostUsedLibrariesDescription2": "LeptonX also supports MVC Angular and Blazor specific libraries.", + "MostUsedLibrariesDescription2": "LeptonX also supports MVC Angular and Blazor-specific libraries.", "CreateAndCustomize": "Create and customize the pages you need in seconds with LeptonX custom pages", - "CreateAndCustomizeDescription": "By using LeptonX Theme you also have access to many pre-made html pages. These include many pages such as login page, blog, FAQ, subscription list, invoice, pricing, file management.", + "CreateAndCustomizeDescription": "By using LeptonX Theme you also have access to many pre-made html pages. These include many pages such as login page, blog, FAQ, subscription list, invoice, pricing, and file management.", "LeptonThemeForAdmin": "Lepton Theme for your admin dashboard by", "LeptonThemeForAdminDescription": "Lepton Theme is still available and will be maintained. If you want to switch to LeptonX Theme as a Lepton Theme user, you can see the documentation to learn how-to.", "LeptonCompatibleWith": "Lepton Theme is compatible with", @@ -844,7 +844,7 @@ "BlazoriseSupportExplanation5": "You can post your questions on the support website and generate a product token for your application.", "AbpLiveTrainingPackages": "ABP Live Training Packages", "Releases": "Releases", - "ReleasesDescription": "ABP Commercial releases and their changelogs.", + "ReleasesDescription": "Release logs of ABP Commercial.", "ReleaseDate": "Release Date", "Labels": "Labels", "PreRelease": "Pre-release", @@ -852,7 +852,137 @@ "Enhancement": "Enhancement", "Bug": "Bug", "Feature": "Feature", - "AllUIs": "All UI's", - "MVC": "MVC" + "AllUIs": "All UIs", + "MVC": "MVC", + "BlazorServer": "Blazor Server", + "MAUI": "MAUI", + "HowItWorks_Page_Title": "How it works?", + "HowItWorks_Page_Description": "ABP Framework extends the .NET platform. So, anything you can do with a plain .NET solution is already possible with the ABP Framework. That makes it easy to get started with a low learning curve.", + "HowItWorks_Description1": "ABP Framework extends the .NET platform. So, anything you can do with a plain .NET solution is already possible with the ABP Framework. That makes it easy to get started with a low learning curve.", + "HowItWorks_Description2": "Once you start learning and using the ABP Framework features, developing your software will be much more enjoyable than ever.", + "HowItWorks_Description3": "This page basically explains how you use the ABP.IO Platform as a .NET developer.", + "CreateANewSolution": "Create a New .NET Solution", + "CreateANewSolution_Description1": "Everything starts by creating a new ABP integrated .NET solution.", + "StartWithStartupTemplates": "Start one of the pre-built startup solution templates", + "SimpleMonolithApplicationTemplate": "Simple monolith application template", + "LayeredApplicationTemplate": "Layered application template", + "MicroserviceSolutionTemplate": "Microservice solution template", + "CreateEmptySolutionAndUseAbp": "Or create a new empty .NET solution and install ABP NuGet & NPM packages yourself.", + "CreatingSolutionWithMultipleOptions": "There are multiple User Interface and Database options while creating a new solution.", + "UIFrameworkOptions": "UI Framework Options", + "DotnetSolutionWithoutDependency": "Now, you have a regular .NET solution in your local computer that has no dependency on a cloud platform or external service.", + "CheckTheDocumentForDetails": "You can check the {1} document for details.", + "UIAndDatabaseIndependent": "ABP can work with any UI and any database provider supported by .NET. \n However, these UI and database providers are pre-integrated and well documented.", + "InstallAbpModules": "Install ABP Modules", + "DevelopYourSolution": "Develop Your Solution", + "DeployAnywhere": "Deploy Anywhere", + "InstallAbpModule_Description1": "ABP is a modular application development framework. Startup solution templates already come with the essential modules installed. \n But there are more application modules you may want to use in your solution.", + "InstallAbpModule_Description2": "Every module consists of a few NuGet and NPM packages and has an installation document. ABP Suite does most of the work automatically, then you manually configure or fine-tune the module based on its documentation.", + "DevelopYourSolution_Description1": "ABP’s infrastructure makes you focus on your own business code by automating the repetitive work and providing pre-built infrastructure and application features.", + "DevelopYourSolution_Description2": "In the following code block, you can see how the ABP Framework seamlessly integrates into your code and automates the repetitive tasks for you.", + "DevelopYourSolution_Description3": "Even in this shortcode block, ABP does a lot of things for you.", + "DevelopYourSolution_Description4": "It provides base classes to apply conventions, like \n dependency injection. Generic \n repository services provide a convenient \n way to interact with the database. Declarative \n authorization works with a fine-tuned permission system.", + "DevelopYourSolution_Description5": "ABP completely automates \n unit of work (for database connection and transaction management), \n exception handling, \n validation\n and audit logging. It provides many more building blocks to simplify your daily development tasks and focus on your own code while creating production-ready \n applications.", + "DevelopYourSolution_Description6": "You can imagine how much that code block can be long and complicated if you would do it all manually.", + "SuiteCrudGenerationInFewSeconds": "In addition to hand coding your solution, you can create fully working advanced CRUD pages in a few minutes using the ABP Suite tooling. It generates the code into your solution, so you can fine-tune it based on your custom requirements.", + "DeployAnywhere_Description1": "At the end of the day, you have a pure .NET solution. You can deploy your solution to your own server, to a cloud platform, Kubernetes or anywhere you want. You can deploy to as many servers as you want. ABP is a deployment environment agnostic tool.", + "ExpertiseAbpFramework": "Expertise the ABP Framework", + "ExpertiseAbpFramework_Description1": "Want to go beyond basics and get expertise with the ABP.IO Platform?", + "FreeDownload": "Free Download", + "Read": "Read", + "HavingTrouble": "Having Trouble?", + "HavingTrouble_Description1": "Do you have problems with developing your solution? We are here! Use the ABP Support platform \n or send an email to get help directly from the Core ABP Framework team members.", + "WeAreHereToHelp_Description1": "You can browse our help topics or search in the frequently asked questions, \n or you can ask us a question by using the contact form.", + "OtherModules": "Other Modules", + "OtherModules_Description1": "Account, Audit Logging, Chat, CMS Kit, File Management, Forms, GDPR, Identity, Language Management, Payment, Saas and more...", + "HowItWorks_DatabaseProviderOptions": "Database provider options", + "SeeFAQ" : "See FAQ", + "ReleaseLogs": "Release Logs", + "ReleaseLogs_Tag": "{0} Release Logs", + "ReleaseLogs_Pr": "Pull Request #{0} - {1}", + "NoLabels": "No labels", + "DoesTheSubscriptionRenewAutomatically": "Does the subscription renew automatically?", + "DoesTheSubscriptionRenewAutomaticallyExplanation": "The ABP Commercial does not have an auto-renewal billing model. Therefore your subscription will not be automatically renewed at the end of your license period. If you want to continue to have the benefits of ABP Commercial, you need to manually renew it at the organization management page. If you have multiple organizations, click the \"Manage\" button at your expiring organization and then click the \"Extend Now\" button to renew your license. You may also want to take a look at the What Happens When My License Ends? section.", + "ExtraQuestionCreditsFaqTitle": "Can I purchase extra support question credits?", + "ExtraQuestionCreditsFaqExplanation": "Yes, you can. To buy extra question credits, send an e-mail to info@abp.io with your organization's name. Here's the price list for the extra question credits: ", + "AlreadyBetaTester": "You have already joined the beta tester program.", + "AbpStudio": "ABP Studio", + "AbpStudio_Description": "ABP Studio is still under development. You can fill out the form below to be one of the first users.", + "AbpStudio_Description1": "ABP Studio is a cross-platform desktop application for ABP developers.", + "AbpStudio_Description2": "It is well integrated to the ABP Framework and aims to provide a comfortable development environment for you by automating things, providing insights about your solution, making develop, run and deploy your solutions much easier.", + "AbpStudio_ComingSoon": "Coming Soon Planned beta release date: Q4 of 2023.", + "AbpStudio_PlannedPreviewDate": "Planned preview release date: Q4 of 2023.", + "BetaRequest": "Beta Request", + "CreateNewSolutions": "Create New Solutions", + "CreateNewSolutions_Description1": "You can create from simple applications to modular monolith or microservice solutions easily with a lot of options. You get a full production-ready base software solution for your business.", + "ArchitectYourSolutions": "Architect Your Solutions", + "ArchitectYourSolutions_Description1": "Build monolith-modular and microservice solution structures easier by creating modules or services and establishing relations between them. You can also install or uninstall pre-built application modules.", + "ExploreYourSolution": "Explore Your Solution", + "ExploreYourSolution_Description1": "ABP Studio shows a high-level view of components in your solution and the modules your solution depends on. You can explore entities, services, HTTP APIs and much more without needing to open your codebase.", + "RunMultiApplicationOrMicroserviceSolutionsInABreeze": "Run Multi-Application or Microservice Solutions in a Breeze", + "RunMultiApplicationOrMicroserviceSolutionsInABreeze_Description1": "Run one, multiple or all services with a single click. In this way, it is very easy to stop a service, run it in Visual Studio to test or debug.", + "RunMultiApplicationOrMicroserviceSolutionsInABreeze_Description2": "See a list of services, view real-time HTTP Request and exception counts for each service.", + "RunMultiApplicationOrMicroserviceSolutionsInABreeze_Description3": "See all details of all HTTP requests coming to any service.", + "RunMultiApplicationOrMicroserviceSolutionsInABreeze_Description4": "Explore exception details as real-time in any service, easily filter and search.", + "RunMultiApplicationOrMicroserviceSolutionsInABreeze_Description5": "Show the application logs, filter by log level or search by text..", + "RunMultiApplicationOrMicroserviceSolutionsInABreeze_Description6": "Browse the UI of your application without leaving the solution runner.", + "IntegrateToYourKubernetesCluster": "Integrate to your Kubernetes Cluster", + "IntegrateToYourKubernetesCluster_Description1": "Connect your local development environment to a local or remote Kubernetes cluster, where that cluster already runs your microservice solution.", + "IntegrateToYourKubernetesCluster_Description2": "Access any service in Kubernetes with their service name as DNS, just like they are running in your local computer.", + "IntegrateToYourKubernetesCluster_Description3": "Intercept any service in that cluster, so all the traffic to the intercepted service is automatically redirected to your service that is running in your local machine. When your service needs to use any service in Kubernetes, the traffic is redirected back to the cluster, just like your local service is running inside the Kubernetes.", + "GetInformed": "Get Informed", + "Studio_GetInformed_Description1": "Leave your contact information to get informed and try it first when ABP Studio has been launched.", + "Studio_GetInformed_Description2": "Planned preview release date: Q3 of 2023.", + "ThankYou!": "Thank you!", + "SendBetaRequest": "Send Beta Request", + "YouJoinedTheBetaTesterProgram": "You joined the ABP Studio beta tester program.", + "PricingExplanation2": "30 days money back guarantee *. Learn more", + "MoneyBackGuaranteeText": "* 30-day money-back guarantee on all licenses! 100% refund on Team, 60% refund on Business and Enterprise licenses within 30 days.", + "MobileApplicationStartupTemplates": "Mobile Application Startup Templates", + "MobileApplicationStartupTemplates_Description1": "Integrated mobile application startup templates for your ABP Commercial solutions.", + "CreatePowerfulLineOfBusinessApplicationsUsingABPMobileStartupTemplates": "Create Powerful line-of-business Applications using ABP Mobile Startup Templates", + "CreatePowerfulLineOfBusinessApplicationsUsingABPMobileStartupTemplates_Description1": "ABP Commercial provides two mobile application startup templates implemented with React Native and .NET MAUI. When you create your new ABP based solution, you will also have basic startup applications connected to your backend APIs.", + "CreatePowerfulLineOfBusinessApplicationsUsingABPMobileStartupTemplates_Description2": "The application has a pre-built authentication token cycle, multi-language support, multi-tenancy support, login, forgot password, profile management and a user management page. You can add your own business logic and customize it based on your requirements.", + "TwoFrameworkOptions": "Two Framework Options", + "TwoFrameworkOptions_Description": "ABP provides both React Native and .NET MAUI mobile startup templates. This way you can choose the one that best suits your needs. Both apps reuse code at the highest rate between iOS and Android platforms.", + "PreIntegratedToYourBackend": "Pre-integrated to Your Backend", + "PreIntegratedToYourBackend_Description": "ABP Mobile applications are pre-integrated to your backend APIs. It gets a valid authentication token from the server and makes authenticated requests.", + "MultiLanguage": "Multi - Language", + "MultiLanguage_Description": "It already supports more than 10 languages out of the box. You can also add next languages.", + "Arabic": "Arabic", + "Czech": "Czech", + "English": "English", + "Hungarian": "Hungarian", + "Finnish": "Finnish", + "French": "French", + "Hindi": "Hindi", + "Portuguese": "Portuguese", + "Italian": "Italian", + "Russian": "Russian", + "Slovak": "Slovak", + "Turkish": "Turkish", + "EngageAndRetainYourCustomersWithABPMobileApps": "Engage and Retain Your Customers with ABP Mobile Apps", + "EngageAndRetainYourCustomersWithABPMobileApps_Description1": "Your customers want to manage their products and subscriptions from anywhere, anytime. That requires organizations to create mobile apps that enable customers to fulfill their requests quickly and seamlessly.", + "EngageAndRetainYourCustomersWithABPMobileApps_Description2": "With ABP Mobile apps, you can create high-quality native mobile apps for Android and iOS… Using a single codebase and without compromising on security, quality, or scalability.", + "OneCodeBaseMultipleDevices": "One Code-Base Multiple Devices", + "OneCodeBaseMultipleDevices_Description": "ABP Mobile applications are cross-platform. They are ready to be installed and run on iOS and Android devices, and they adapt to different form-factors using a single code base. Developers only need to create the UI and front-end code once, there is no need to adapt the code for each device you want to support.", + "ComesWithTheSourceCode": "Comes with the Source-Code", + "ComesWithTheSourceCode_Description": "The mobile apps are provided with the source-code. Easily customize the UX/UI of your apps to meet branding guidelines.", + "Purchase_OneYearPrice": "1 Year Price", + "Purchase_DeveloperSeatCount": "Developer Seat Count", + "Purchase_DevelopersAlreadyIncluded": "{0} developers already included", + "1Year": "1 year", + "{0}Years": "{0} years", + "1YearLicense": "1 year license", + "{0}YearsLicense": "{0} years license", + "1AdditionalDeveloper": "1 additional developer", + "{0}AdditionalDevelopers": "{0} additional developers", + "Discount": "Discount ({0}%)", + "Summary": "Summary", + "TrainingPack": "Training pack", + "TrainingPackDiscount": "Training pack discount", + "Purchase_OnboardingTraining_Description": "This live training package is discounted when purchase with the new license. This discounted price is valid only for new license purchases. Learn more ", + "Purchase_Save": "{0}% Save {1} {2}", + "RemoveBasket": "Remove from basket" } } diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/fi.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/fi.json index 885f43c70b..a4b3ac3a80 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/fi.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/fi.json @@ -476,7 +476,7 @@ "MultipleUIOptionsExplanation": "Rakastamme erilaisia tapoja luoda käyttöliittymä. Tämä käynnistysratkaisu tarjoaa kolme erilaista käyttöliittymäkehysvaihtoehtoa yrityssovelluksellesi.", "MultipleDatabaseOptions": "Useita tietokantavaihtoehtoja", "MultipleDatabaseOptionsExplanation": "Sinulla on kaksi tietokannan tarjoajavaihtoehtoa (sen lisäksi, että voit käyttää molempia yhdessä sovelluksessa). Käytä Entity Framework Corea työskennelläksesi minkä tahansa relaatiotietokannan kanssa ja käytä valinnaisesti Dapperia, kun sinun on kirjoitettava matalan tason kyselyitä parantaaksesi suorituskykyä. MongoDB on toinen vaihtoehto, jos haluat käyttää dokumenttipohjaista NoSQL-tietokantaa. Vaikka nämä palveluntarjoajat ovat hyvin integroituja, abstrakteja ja esikonfiguroituja, voit itse asiassa olla vuorovaikutuksessa minkä tahansa tietokantajärjestelmän kanssa, jota voit käyttää .NET:n kanssa.", - "ModularArchitectureExplanation2": "Modulaarisuus on ensiluokkainen kansalainen ABP.IO-alustalla. Kaikki sovelluksen toiminnot on jaettu hyvin eristettyihin valinnaisiin moduuleihin. Käynnistysratkaisussa on valmiiksi asennettuna perus ABP Commercial -moduulit. Voit myös luoda omia moduuleita rakentaaksesi modulaarisen järjestelmän omalle sovelluksellesi.", + "ModularArchitectureExplanation2": "Modulaarisuus on ensiluokkainen kansalainen ABP.IO-alustalla. Kaikki sovelluksen toiminnot on jaettu hyvin eristettyihin valinnaisiin moduuleihin. Käynnistysratkaisussa on valmiiksi asennettuna perus ABP Commercial -moduulit. Voit myös luoda omia moduuleita rakentaaksesi modulaarisen järjestelmän omalle sovelluksellesi.", "MultiTenancyForSaasBusiness": "Monivuokraus SaaS-yrityksellesi", "MultiTenancyForSaasBusinessExplanation": "ABP Commercial tarjoaa täydellisen, päästä-päähän usean vuokrausjärjestelmän SaaS-järjestelmien (Software-as-a-Service) luomiseen. Sen avulla vuokralaiset voivat jakaa tai käyttää omia tietokantojaan tietokantojen luonti- ja siirtojärjestelmässä.", "MicroserviceStartupSolution": "Mikropalvelun käynnistysratkaisu", diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/hu.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/hu.json index 65f7a66c2d..8b9fb041b7 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/hu.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/hu.json @@ -477,7 +477,7 @@ "MultipleUIOptionsExplanation": "Szeretjük a felhasználói felület létrehozásának különböző módjait. Ez az indítási megoldás három különböző felhasználói felületi keretrendszert biztosít az üzleti alkalmazás számára.", "MultipleDatabaseOptions": "Több adatbázis-beállítás", "MultipleDatabaseOptionsExplanation": "Két adatbázis-szolgáltató lehetősége van (amellett, hogy mindkettőt egyetlen alkalmazásban használhatja). Az Entity Framework Core segítségével bármilyen relációs adatbázissal dolgozhat, és opcionálisan használja a Dappert, ha alacsony szintű lekérdezéseket kell írnia a jobb teljesítmény érdekében. A MongoDB egy másik lehetőség, ha dokumentum alapú NoSQL adatbázist kell használnia. Noha ezek a szolgáltatók jól integráltak, absztraktáltak és előre konfiguráltak, valójában bármilyen adatbázis-rendszerrel kapcsolatba léphet, amelyet a .NET-tel használhat.", - "ModularArchitectureExplanation2": "A a legfőbb szempont az ABP.IO platformon. Az alkalmazás összes funkciója jól elkülönített opcionális modulokra van felosztva. Az indítási megoldás már előre telepítve tartalmazza az alapvető ABP Commercial modulokat . Saját modulokat is létrehozhat, hogy moduláris rendszert építsen fel saját alkalmazásához.", + "ModularArchitectureExplanation2": "A a legfőbb szempont az ABP.IO platformon. Az alkalmazás összes funkciója jól elkülönített opcionális modulokra van felosztva. Az indítási megoldás már előre telepítve tartalmazza az alapvető ABP Commercial modulokat . Saját modulokat is létrehozhat, hogy moduláris rendszert építsen fel saját alkalmazásához.", "MultiTenancyForSaasBusiness": "Többérlős felépítés az Ön SaaS-üzleteihez", "MultiTenancyForSaasBusinessExplanation": "Az ABP Commercial teljes körű, többbérlős rendszert biztosít SaaS (Software-as-a-Service) rendszereinek létrehozásához. Lehetővé teszi a bérlők számára, hogy megosszák vagy rendelkezzenek saját adatbázisokkal az on-the-fly adatbázis-létrehozó és migrációs rendszerrel.", "MicroserviceStartupSolution": "Mikroszolgáltatás indítási megoldás", diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/tr.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/tr.json index 9623aba8bf..e7781f9fe5 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/tr.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/tr.json @@ -21,7 +21,7 @@ "SetDefault": "Varsayılan olarak ayarla", "DefaultOrganization": "Varsayılan", "StartDate": "Başlangıç tarihi", - "EndDate": "bitiş tarihi", + "EndDate": "Bitiş tarihi", "Modules": "Modüller", "LicenseExtendMessage": "Lisans bitiş tarihiniz {0} tarihine kadar uzatıldı", "LicenseUpgradeMessage": "Lisansınız {0} lisansa yükseltildi", @@ -129,8 +129,8 @@ "TellUsWhatYouNeed": "Bize neye ihtiyacın olduğunu söyle.", "YourMessage": "Mesajın", "YourFullName": "Tam adınız", - "EmailField": "E", - "YourEmailAddress": "E", + "EmailField": "E-posta Adresi", + "YourEmailAddress": "E-posta adresiniz", "HowMayWeHelpYou": "Size nasıl yardımcı olabiliriz?", "SendMessage": "Mesaj gönder", "Success": "Başarı", @@ -486,7 +486,7 @@ "MultipleUIOptionsExplanation": "Kullanıcı Arayüzü oluşturmanın farklı yollarını seviyoruz. Bu başlangıç çözümü, iş uygulamanız için üç farklı UI çerçeve seçeneği sunuyor.", "MultipleDatabaseOptions": "Çoklu Veritabanı Seçenekleri", "MultipleDatabaseOptionsExplanation": "İki veritabanı sağlayıcısı seçeneğiniz var (her ikisini de tek bir uygulamada kullanmanın yanı sıra). Herhangi bir ilişkisel veritabanıyla çalışmak için Entity Framework Core'u kullanın ve daha iyi bir performans için düşük seviyeli sorgular yazmanız gerektiğinde isteğe bağlı olarak Dapper'ı kullanın. Belge tabanlı bir NoSQL veritabanı kullanmanız gerekiyorsa MongoDB başka bir seçenektir. Bu sağlayıcılar iyi entegre edilmiş, soyutlanmış ve önceden yapılandırılmış olsa da, .NET ile kullanabileceğiniz herhangi bir veritabanı sistemiyle etkileşime girebilirsiniz. ", - "ModularArchitectureExplanation2": "Modülerlik, ABP.IO platformunda birinci sınıf bir vatandaştır. Uygulamalardaki tüm işlevler iyi izole edilmiş opsiyonel modüllere ayrılmıştır. Başlangıç çözümü zaten temel ABP Ticari modülleri önceden yüklenmiş olarak gelir. Kendi uygulamanız için modüler bir sistem oluşturmak üzere kendi modüllerinizi de oluşturabilirsiniz.", + "ModularArchitectureExplanation2": "Modülerlik, ABP.IO platformunda birinci sınıf bir vatandaştır. Uygulamalardaki tüm işlevler iyi izole edilmiş opsiyonel modüllere ayrılmıştır. Başlangıç çözümü zaten temel ABP Ticari modülleri önceden yüklenmiş olarak gelir. Kendi uygulamanız için modüler bir sistem oluşturmak üzere kendi modüllerinizi de oluşturabilirsiniz.", "MultiTenancyForSaasBusiness": "Saas İşletmeleri için Çoklu Kiralama", "MultiTenancyForSaasBusinessExplanation": "ABP Commercial, SaaS (Hizmet Olarak Yazılım) sistemlerinizi oluşturmak için eksiksiz, uçtan uca çoklu kiracılık sistemi sağlar. Anında veritabanı oluşturma ve taşıma sistemi ile kiracıların kendi veritabanlarını paylaşmalarına veya sahip olmalarına olanak tanır.", "MicroserviceStartupSolution": "Mikro Hizmet Başlangıç Çözümü", @@ -806,6 +806,36 @@ "SupportPolicyFaqTitle": "Destek politikanız nedir?", "SupportPolicyFaqExplanation": "Yalnızca etkin ve önceki ana sürümü destekliyoruz. Üçüncü ve daha eski ana sürümler için bir yama sürümünü garanti etmiyoruz. Örneğin, etkin sürüm 7.0.0 ise, hem 6.x.x hem de 7.x.x için yama sürümleri yayınlayacağız. Ayrıca, yalnızca ABP Framework ve ABP Commercial ile ilgili sorunlar için destek sağlıyoruz. Bu, ABP ürünleri tarafından kullanılan 3. taraf uygulamalar, bulut hizmetleri ve diğer çevresel kütüphaneler için destek verilmediği anlamına gelir. Müşterilerimize \"Volosoft Bilişim A.Ş\"nin resmi çalışma saatleri içinde teknik destek sağlamak için ticari olarak makul çabayı göstereceğiz. Öte yandan, bir hizmet seviyesi anlaşması (SLA) yanıt süresi taahhüt etmiyoruz, ancak teknik sorunlara resmi çalışma saatlerimiz içinde mümkün olduğunca çabuk yanıt vermeye çalışacağız. Müşteri ile özel bir anlaşma yapılmadığı sürece, yalnızca https://support.abp.io adresinden destek sağlıyoruz. Ayrıca, yalnızca Kurumsal Lisans sahiplerinin kullanabildiği özel e-posta desteğimiz de bulunmaktadır.", "BlazoriseLicense": "Blazorise lisansı satın almamız gerekiyor mu?", - "BlazoriseLicenseExplanation": "Volosoft ve Megabit arasında bir anlaşmamız var, bu anlaşma ile Blazorise lisansı ABP Ticari ürünleri ile birlikte geliyor, bu nedenle müşterilerimizin ekstra bir Blazorise lisansı satın almasına gerek kalmıyor." + "BlazoriseLicenseExplanation": "Volosoft ve Megabit arasında bir anlaşmamız var, bu anlaşma ile Blazorise lisansı ABP Ticari ürünleri ile birlikte geliyor, bu nedenle müşterilerimizin ekstra bir Blazorise lisansı satın almasına gerek kalmıyor.", + "MobileApplicationStartupTemplates": "Mobil Uygulama Başlangıç Şablonları", + "MobileApplicationStartupTemplates_Description1": "ABP Commercial çözümleriniz için entegre mobil uygulama başlangıç şablonları.", + "CreatePowerfulLineOfBusinessApplicationsUsingABPMobileStartupTemplates": "ABP Mobil Başlangıç Şablonlarını Kullanarak Güçlü İş Hattı Uygulamaları Oluşturun", + "CreatePowerfulLineOfBusinessApplicationsUsingABPMobileStartupTemplates_Description1": "ABP Commercial, React Native ve .NET MAUI ile uygulanan iki mobil uygulama başlangıç şablonu sağlar. Yeni ABP tabanlı çözümünüzü oluşturduğunuzda, arka uç API'lerinize bağlı temel başlangıç uygulamalarına da sahip olacaksınız.", + "CreatePowerfulLineOfBusinessApplicationsUsingABPMobileStartupTemplates_Description2": "Uygulamanın önceden oluşturulmuş bir kimlik doğrulama belirteç döngüsü, çoklu dil desteği, çoklu kiracılık desteği, oturum açma, parolamı unuttum, profil yönetimi ve bir kullanıcı yönetimi sayfası vardır. Kendi iş mantığınızı ekleyebilir ve gereksinimlerinize göre özelleştirebilirsiniz.", + "TwoFrameworkOptions": "İki Çerçeve Seçeneği", + "TwoFrameworkOptions_Description": "ABP hem React Native hem de .NET MAUI mobil başlangıç şablonları sağlar. Bu şekilde ihtiyaçlarınıza en uygun olanı seçebilirsiniz. Her iki uygulama da iOS ve Android platformları arasında en yüksek oranda kodu yeniden kullanır.", + "PreIntegratedToYourBackend": "Arka Uç API'lerinize Önceden Entegre", + "PreIntegratedToYourBackend_Description": "ABP Mobil uygulamaları, arka uç API'lerinize önceden entegre edilmiştir. Sunucudan geçerli bir kimlik doğrulama belirteci alır ve kimliği doğrulanmış isteklerde bulunur.", + "MultiLanguage": "Çoklu Dil", + "MultiLanguage_Description": "Kutudan çıktığı haliyle 10'dan fazla dili desteklemektedir. Sonraki dilleri de ekleyebilirsiniz.", + "Arabic": "Arapça", + "Czech": "Çekçe", + "English": "İngilizce", + "Hungarian": "Macarca", + "Finnish": "Fince", + "French": "Fransızca", + "Hindi": "Hintçe", + "Portuguese": "Portekizce", + "Italian": "İtalyanca", + "Russian": "Rusça", + "Slovak": "Slovakça", + "Turkish": "Türkçe", + "EngageAndRetainYourCustomersWithABPMobileApps": "ABP Mobil Uygulamaları ile Müşterilerinizin İlgisini Çekin ve Onları Elinizde Tutun", + "EngageAndRetainYourCustomersWithABPMobileApps_Description1": "Müşterileriniz ürünlerini ve aboneliklerini her yerden, her zaman yönetmek ister. Bu da kuruluşların, müşterilerin taleplerini hızlı ve sorunsuz bir şekilde yerine getirmelerini sağlayan mobil uygulamalar oluşturmalarını gerektirir.", + "EngageAndRetainYourCustomersWithABPMobileApps_Description2": "ABP Mobil uygulamaları ile Android ve iOS için yüksek kaliteli yerel mobil uygulamalar oluşturabilirsiniz... Tek bir kod tabanı kullanarak ve güvenlik, kalite veya ölçeklenebilirlikten ödün vermeden.", + "OneCodeBaseMultipleDevices": "Tek Kod Tabanı, Birden Çok Cihaz", + "OneCodeBaseMultipleDevices_Description": "ABP Mobil uygulamaları çapraz platformdur. iOS ve Android cihazlara yüklenmeye ve çalıştırılmaya hazırdırlar ve tek bir kod tabanı kullanarak farklı form faktörlerine uyum sağlarlar. Geliştiricilerin kullanıcı arayüzünü ve ön uç kodunu yalnızca bir kez oluşturması gerekir, desteklemek istediğiniz her cihaz için kodu uyarlamanıza gerek yoktur.", + "ComesWithTheSourceCode": "Kaynak Koduyla Birlikte Geliyor", + "ComesWithTheSourceCode_Description": "Mobil uygulamalar kaynak koduyla birlikte sağlanır. Marka yönergelerini karşılamak için uygulamalarınızın UX/UI'sini kolayca özelleştirin." } -} \ No newline at end of file +} diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hans.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hans.json index c6ed352d1e..699cc0abf2 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hans.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hans.json @@ -476,7 +476,7 @@ "MultipleUIOptionsExplanation": "我们喜欢不同的方式来创建用户界面。 此启动解决方案为您的业务应用程序提供了三种不同的 UI 框架选项。", "MultipleDatabaseOptions": "多个数据库选项", "MultipleDatabaseOptionsExplanation": "您有两个数据库提供程序选项(除了在单个应用程序中使用两者)。 使用 Entity Framework Core 处理任何关系数据库,当您需要编写低级查询以获得更好的性能时,可以选择使用 Dapper。 如果您需要使用基于文档的 NoSQL 数据库,MongoDB 是另一种选择。 虽然这些提供程序是良好集成、抽象和预配置的,但您实际上可以与任何可与 .NET 一起使用的数据库系统进行交互。", - "ModularArchitectureExplanation2": "模块化是 ABP.IO 平台的一等公民。 所有应用程序功能都被拆分为隔离良好的可选模块。 启动解决方案已经预装了基本的 ABP 商业模块。 您还可以创建自己的模块来为自己的应用程序构建模块化系统。", + "ModularArchitectureExplanation2": "模块化是 ABP.IO 平台的一等公民。 所有应用程序功能都被拆分为隔离良好的可选模块。 启动解决方案已经预装了基本的 ABP 商业模块。 您还可以创建自己的模块来为自己的应用程序构建模块化系统。", "MultiTenancyForSaasBusiness": "SaaS 业务的多租户", "MultiTenancyForSaasBusinessExplanation": "ABP 商业版 提供完整的端到端多租户系统来创建您的 SaaS(软件即服务)系统。 它允许租户通过动态数据库创建和迁移系统共享或拥有自己的数据库。", "MicroserviceStartupSolution": "微服务启动解决方案", @@ -827,6 +827,17 @@ "PrivacyPolicyPageTitle": "隐私政策 - Cookies政策", "TermsConditionsPageTitle": "条款和条件", "TrainingsPageTitle": "ABP培训套餐", - "ModulesPageTitle": "ABP内置的应用模块" + "ModulesPageTitle": "ABP内置的应用模块", + "DoesTheSubscriptionRenewAutomatically": "许可会自动续费吗?", + "DoesTheSubscriptionRenewAutomaticallyExplanation": "ABP 商业版没有自动续费的计费模式。因此,在您的许可期结束时,您的订阅将不会自动续订。如果您希望继续享受ABP商业版的服务,请在组织管理页面手动进行续费操作。如果您拥有多个组织,您可以点击即将到期的组织上的\"管理\"按钮,然后点击\"立即续费\"按钮来续订您的许可。您还可以查看许可到期后会发生什么?部分了解更多信息。", + "BlazoriseSupport": "如何获取Blazorise许可密钥并获得Blazorise团队的支持?", + "BlazoriseSupportExplanation": "请按照以下步骤获取Blazorise团队的支持并获得您的Blazorise许可密钥:", + "BlazoriseSupportExplanation1": "使用与您的abp.io账户相同的电子邮件地址在blazorise.com/support/register上注册一个新账户。请将“许可密钥”一栏留空,并确保该电子邮件地址与您在abp.io上的电子邮件账户相同。", + "BlazoriseSupportExplanation2": "通过查看您的电子邮件信箱来验证您的电子邮件地址。如果在收件箱中没有看到电子邮件,请检查您的垃圾邮件箱!", + "BlazoriseSupportExplanation3": "在blazorise.com/support/login上登录Blazorise支持网站。", + "BlazoriseSupportExplanation4": "如果您有有效的ABP商业版许可证,您还将拥有Blazorise PRO许可证。您可以在blazorise.com/support/user/manage/license获取您的Blazorise许可密钥。", + "BlazoriseSupportExplanation5": "您可以在support网站上发布您的问题,并为您的应用程序生成一个产品令牌。", + "ExtraQuestionCreditsFaqTitle": "我可以购买额外的问题支持次数吗?", + "ExtraQuestionCreditsFaqExplanation": "是的,您可以购买额外的问题支持次数,请发送电子邮件至info@abp.io,并提供您的组织名称。以下是额外问题支持次数的价格列表: " } } diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hant.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hant.json index 19afb1a5bb..1f50563750 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hant.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hant.json @@ -402,6 +402,8 @@ "WhatHappensWhenLicenseEndsExplanation4": "許可證到期後,您將無法安裝添加到 ABP 商業平台的新模塊和主題。", "WhatHappensWhenLicenseEndsExplanation5": "您不能使用 ABP 套件。", "WhatHappensWhenLicenseEndsExplanation6": "您無法再獲得高級支持。", - "WhatHappensWhenLicenseEndsExplanation7": "如果您想繼續獲得這些好處,您可以延長(更新)您的許可證。如果您在許可到期後 {3} 天 內延長許可,將應用以下折扣:團隊許可 {0};營業執照{1};企業許可證{2}。" + "WhatHappensWhenLicenseEndsExplanation7": "如果您想繼續獲得這些好處,您可以延長(更新)您的許可證。如果您在許可到期後 {3} 天 內延長許可,將應用以下折扣:團隊許可 {0};營業執照{1};企業許可證{2}。", + "DoesTheSubscriptionRenewAutomatically": "許可會自動續費嗎?", + "DoesTheSubscriptionRenewAutomaticallyExplanation": "ABP 商業版沒有自動續費的計費模式。因此,在您的許可期結束時,您的訂閱將不會自動續訂。如果您希望繼續享受ABP商業版的服務,請在組織管理頁面手動進行續費操作。如果您擁有多個組織,您可以點擊即將到期的組織上的\"管理\"按鈕,然後點擊\"立即續費\"按鈕來續訂您的許可。您還可以查看許可到期後會發生什麼?部分了解更多信息。" } } \ No newline at end of file diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Docs/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Docs/Localization/Resources/en.json index 7f01b621c1..ae3354617b 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Docs/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Docs/Localization/Resources/en.json @@ -1,6 +1,8 @@ { "culture": "en", "texts": { - "Buy": "Buy" + "Buy": "Buy", + "SeeBookDetails": "See Book Details", + "MasteringAbpFrameworkEBookDescription": "This book will help you gain a complete understanding of the framework and modern web application development techniques." } } \ No newline at end of file diff --git a/common.props b/common.props index 994bb4a888..90cd1a1b4a 100644 --- a/common.props +++ b/common.props @@ -1,7 +1,7 @@ latest - 7.3.2 + 7.4.0 $(NoWarn);CS1591;CS0436 https://abp.io/assets/abp_nupkg.png https://abp.io/ diff --git a/docs/en/Blog-Posts/2023-06-05 v7_3_Preview/POST.md b/docs/en/Blog-Posts/2023-06-05 v7_3_Preview/POST.md new file mode 100644 index 0000000000..ef5a8323c4 --- /dev/null +++ b/docs/en/Blog-Posts/2023-06-05 v7_3_Preview/POST.md @@ -0,0 +1,267 @@ +# ABP.IO Platform 7.3 RC Has Been Released + +Today, we are happy to release the [ABP Framework](https://abp.io/) and [ABP Commercial](https://commercial.abp.io/) version **7.3 RC** (Release Candidate). This blog post introduces the new features and important changes in this new version. + +Try this version and provide feedback for a more stable version of ABP v7.3! Thanks to all of you. + +## Get Started with the 7.3 RC + +Follow the steps below to try version 7.3.0 RC today: + +1) **Upgrade** the ABP CLI to version `7.3.0-rc.1` using a command line terminal: + +````bash +dotnet tool update Volo.Abp.Cli -g --version 7.3.0-rc.1 +```` + +**or install** it if you haven't before: + +````bash +dotnet tool install Volo.Abp.Cli -g --version 7.3.0-rc.1 +```` + +2) Create a **new application** with the `--preview` option: + +````bash +abp new BookStore --preview +```` + +See the [ABP CLI documentation](https://docs.abp.io/en/abp/latest/CLI) for all the available options. + +> You can also use the [Get Started](https://abp.io/get-started) page to generate a CLI command to create a new application. + +You can use any IDE that supports .NET 7.x, like [Visual Studio 2022](https://visualstudio.microsoft.com/downloads/). + +## Migration Guides + +There are a few breaking changes in this version that may affect your application. +Please see the following migration documents, if you are upgrading from v7.2: + +* [ABP Framework 7.2 to 7.3 Migration Guide](https://docs.abp.io/en/abp/7.3/Migration-Guides/Abp-7_3) + +> If you are using the CMS Kit or CMS Kit Pro module, please don't forget to create a new migration and apply it to your database. + +## What's New with ABP Framework 7.3? + +In this section, I will introduce some major features released in this version. Here is a brief list of the titles that will be explained in the next sections: + +* Introducing the Volo.Abp.Imaging packages +* ABP CLI: switch-to-local command +* Monitoring Distributed Events +* Ordering of the Local Event Handlers +* Nonce attribute support for Content Security Policy (CSP) +* Other News + +### Introducing the Volo.Abp.Imaging packages + +ABP Framework provides some packages to compress and resize images. Currently, there are four official packages: + +* `Volo.Abp.Imaging.Abstractions`: Provides common services for compression and resizing purposes. +* `Volo.Abp.Imaging.AspNetCore`: Provides some attributes for controller actions that can automatically compress and/or resize uploaded files. +* `Volo.Abp.Imaging.ImageSharp`: Implements the image compression & resize operations using the [ImageSharp](https://github.com/SixLabors/ImageSharp) library. +* `Volo.Abp.Imaging.MagickNet`: Implements the image compression & resize operations using the [Magick.NET](https://github.com/dlemstra/Magick.NET) library. + +You can use one of these official providers (`ImageSharp` or `Magick.NET`) or implement your own image resizer/compressor contributor and use it in your application. + +> See the [Image Manipulation](https://docs.abp.io/en/abp/7.3/Image-Manipulation) documentation to learn more and see the required configurations. + +### ABP CLI: switch-to-local command + +In this version, ABP CLI introduces a new CLI command: **"switch-to-local"**. The `switch-to-local` command changes all NuGet package references on a solution to local project references for all the `.csproj` files in the specified folder (and all its subfolders with any depth). + +**Usage:** + +```bash +abp switch-to-local --paths "C:\Github\abp" +``` + +### Monitoring Distributed Events + +ABP Framework allows you to stay informed when your application **receives** or **sends** a distributed event. This enables you to track the event flow within your application and take appropriate actions based on the received or sent distributed events. + +You just need to subscribe to one of the `DistributedEventReceived` or `DistributedEventSent` events and take additional actions according to your cases. + +**Example: Get informed when your application sends an event to the distributed event bus** + +```csharp +public class DistributedEventSentHandler : ILocalEventHandler, ITransientDependency +{ + public async Task HandleEventAsync(DistributedEventSent eventData) + { + // TODO: IMPLEMENT YOUR LOGIC... + } +} +``` + +> See the documentation to learn more: [https://docs.abp.io/en/abp/7.3/Distributed-Event-Bus](https://docs.abp.io/en/abp/7.3/Distributed-Event-Bus) + +### Ordering of the Local Event Handlers + +In this version, ABP Framework introduces the `LocalEventHandlerOrder` attribute, which can be used to set the execution order for the event handlers. This can be helpful if you want to handle your local event handlers in a specific order. + +**Example:** + +```csharp +[LocalEventHandlerOrder(-1)] +public class MyHandler + : ILocalEventHandler, + ITransientDependency +{ + public async Task HandleEventAsync(StockCountChangedEvent eventData) + { + //TODO: your implementation + } +} +``` + +By default, all event handlers have an order value of 0. Thus, if you want to take certain event handlers to be executed before other event handlers, you can set the order value as a negative value. + +> See the documentation to learn more: [https://docs.abp.io/en/abp/7.3/Local-Event-Bus](https://docs.abp.io/en/abp/7.3/Local-Event-Bus) + +### Nonce attribute support for Content Security Policy (CSP) + +ABP Framework supports adding unique value to nonce attribute for script tags which can be used by Content Security Policy to determine whether or not a given fetch will be allowed to proceed for a given element. In other words, it provides a mechanism to execute only correct script tags with the correct nonce value. + +This feature is disabled by default. You can enable it by setting the *UseContentSecurityPolicyScriptNonce* property of the `AbpSecurityHeadersOptions` class to **true**: + +```csharp +Configure(options => +{ + //adding script-src nonce + options.UseContentSecurityPolicyScriptNonce = true; //false by default +}); +``` + +> See the [Security Headers](https://docs.abp.io/en/abp/7.3/UI/AspNetCore/Security-Headers) documentation for more information. + +### Other News + +* Upgraded the [Blazorise](https://blazorise.com/) library to v1.2.3 for Blazor UI. After the upgrade, ensure that all Blazorise-related packages are using v1.2.3 in your application. +* Module Entity Extension support has been added for the CMS Kit module. See [#16572](https://github.com/abpframework/abp/issues/16572) for more information. + +If you want to see more details, you can check [the release on GitHub](https://github.com/abpframework/abp/releases/tag/5.3.0-rc.1), which contains a list of all the issues and pull requests were closed with this version. + +## What's New with ABP Commercial 7.3? + +We've also worked on [ABP Commercial](https://commercial.abp.io/) to align the features and changes made in the ABP Framework. The following sections introduce a few new features coming with ABP Commercial 7.3. + +### Account Module - Using Authenticator App for Two-Factor Authentication + +In this version, ABP Commercial provides a new **Two-Factor Authentication (2FA) provider** that allows you to log in to an application by scanning a QR Code with an Authenticator App, such as Microsoft Authenticator or Google Authenticator. + +You need to apply the following actions to configure an Authenticator and then you are free to log in by using the Authenticator App: + +**Step 1 - Enable Two Factor Authentication and Scan the QR Code:** + +![](./two-factor-auth-1.png) + +**Step 2 - Verify the QR Code with an authenticator app:** + +![](./two-factor-auth-2.png) + +**Step 3 - Save the recovery codes for later use in case of not being able to login by verifying the QR code:** + +![](./two-factor-auth-3.png) + +You can disable the two-factor authentication and reset the Authenticator App anytime you want, just by disabling the two-factor authentication or resetting the authenticator: + +![](./reset-authenticator.png) + +### Upgrade Blazorise to v1.2.3 + +Upgraded the [Blazorise](https://blazorise.com/) library to v1.2.3 for Blazor UI. If you are upgrading your project to v7.3.0, please ensure that all the Blazorise-related packages are using v1.2.3 in your application. Otherwise, you might get errors due to incompatible versions. + +### CMS Kit: Module Entity Extensions + +Module entity extension system is a high-level extension system that allows you to define new properties for existing entities of the dependent modules. ABP Framework and ABP Commercial use this system to allow developers to extend entities in different modules. + +In this version, Module Entity Extension support has been added for the CMS Kit Pro module. + +You can open the `YourProjectNameModuleExtensionConfigurator` class inside the `Domain.Shared` project of your solution and change the `ConfigureExtraProperties` method as shown below to add a new property to the `Poll` entity of the [CMS Kit Pro module](https://docs.abp.io/en/commercial/latest/modules/cms-kit/index): + +```csharp +public static void ConfigureExtraProperties() +{ + OneTimeRunner.Run(() => + { + ObjectExtensionManager.Instance.Modules() + .ConfigureCmsKitPro(cmsKitPro => + { + cmsKitPro.ConfigurePoll(poll => + { + poll.AddOrUpdateProperty( + "", + property => + { + //configuration for this property + } + ) + }); + }); + }); +} + +``` + +> See the [Module Entity Extensions documentation](https://docs.abp.io/en/abp/latest/Module-Entity-Extensions) to learn more. + +### LeptonX Account Layout + +In this version, Account Layout has been re-designed for LeptonX Theme. You can see the new account layout in the following figure: + +![](leptonx-account-layout.png) + +> To use this new account layout, ensure that your LeptonX Theme package versions are v2.3+. + +## Community News + +### ABP Community Talks 2023.4: Angular 16 and ABP v7.3 + +![](./community-talks-2023-4.png) + +In this episode, the core ABP team talked about what's new with ABP v7.3 and Angular 16. You can watch the event from [here](https://www.youtube.com/watch?v=lq6u4vQURcI). + +### ABP .NET Conference 2023 + +![](./abp-conf.png) + +We organized ABP .NET Conference 2023 on May 2023 and we are happy to share the success of the conference, which captivated overwhelmingly interested live viewers from all over the world. 13 great line up of speakers which includes .NET experts and Microsoft MVPs delivered captivating talks that resonated with the audiences. Each of the talks attracted a great amount of interest and a lot of questions, sparking curiosity in the attendees. + +Thanks to all speakers and attendees for joining our event. + +> We shared our takeaways in a blog post, which you can read at [https://blog.abp.io/abp/ABP-.NET-Conference-2023-Wrap-Up](https://blog.abp.io/abp/ABP-.NET-Conference-2023-Wrap-Up). + +### Volosoft Attendeed & Sponsored Devnot .NET Conference 2023 + +![](devnot-conference.png) + +We are thrilled to announce that the Volosoft Company proudly attended as one of the Gold Sponsors at the Devnot .NET Conference 2023! We are happy to join and be a sponsor of events and contribute to the software society, empowering developers and driving innovation with the .NET community. + +![](devnot-talk.png) + +Co-Founder of [Volosoft](https://volosoft.com/) and Lead Developer of the ABP Framework, [Halil Ibrahim Kalkan](https://twitter.com/hibrahimkalkan) gave a word about "Dealing with Concurrency and Multi Threading in .NET" at this event. + +> You can check [this blog post](https://volosoft.com/blog/Reflecting-on-Devnot-Dotnet-Conference-2023) if you want to learn more about the Devnot .NET Conference 2023. + +### New ABP Community Posts + +There are exciting articles contributed by the ABP community as always. I will highlight some of them here: + +* [Authority Delegation in ABP Commercial](https://community.abp.io/posts/authority-delegation-in-abp-commercial-3wtljpp0) by [Liang Shiwei](https://github.com/realLiangshiwei) +* [What's new in Angular 16? New Features and Updates](https://community.abp.io/posts/whats-new-in-angular-16-new-features-and-updates-s1izi9br) by [Masum Ulu](https://twitter.com/masumulu) +* [Kubernetes Integrated Microservice Development with ABP Studio](https://community.abp.io/videos/kubernetes-integrated-microservice-development-with-abp-studio-oix9zkp8) by [Halil Ibrahim Kalkan](https://twitter.com/hibrahimkalkan) + +Thanks to the ABP Community for all the content they have published. You can also [post your ABP-related (text or video) content](https://community.abp.io/articles/submit) to the ABP Community. + +### New ABP Blog Posts + +There are also some exciting blog posts written by the ABP team. You can see the following list for some of those articles: + +* [ABP .NET Conference 2023 Wrap Up](https://blog.abp.io/abp/ABP-.NET-Conference-2023-Wrap-Up) by [Bige Beşikçi](https://twitter.com/bigedediki) +* [Meet Volosoft at the Devnot .NET Conference 2023!](https://volosoft.com/blog/Meet-Volosoft-at-the-Devnot-.NET-Conference-2023) by [Roo Xu](https://github.com/Roo1227) + +## Conclusion + +This version comes with some new features and a lot of enhancements to the existing features. You can see the [Road Map](https://docs.abp.io/en/abp/7.3/Road-Map) documentation to learn about the release schedule and planned features for the next releases. Please try ABP v7.3 RC and provide feedback to help us release a more stable version. + +Thanks for being a part of this community! diff --git a/docs/en/Blog-Posts/2023-06-05 v7_3_Preview/abp-conf.png b/docs/en/Blog-Posts/2023-06-05 v7_3_Preview/abp-conf.png new file mode 100644 index 0000000000..b3add3ebc0 Binary files /dev/null and b/docs/en/Blog-Posts/2023-06-05 v7_3_Preview/abp-conf.png differ diff --git a/docs/en/Blog-Posts/2023-06-05 v7_3_Preview/community-talks-2023-4.png b/docs/en/Blog-Posts/2023-06-05 v7_3_Preview/community-talks-2023-4.png new file mode 100644 index 0000000000..7c4bef3950 Binary files /dev/null and b/docs/en/Blog-Posts/2023-06-05 v7_3_Preview/community-talks-2023-4.png differ diff --git a/docs/en/Blog-Posts/2023-06-05 v7_3_Preview/cover-image.png b/docs/en/Blog-Posts/2023-06-05 v7_3_Preview/cover-image.png new file mode 100644 index 0000000000..235642a3f8 Binary files /dev/null and b/docs/en/Blog-Posts/2023-06-05 v7_3_Preview/cover-image.png differ diff --git a/docs/en/Blog-Posts/2023-06-05 v7_3_Preview/devnot-conference.png b/docs/en/Blog-Posts/2023-06-05 v7_3_Preview/devnot-conference.png new file mode 100644 index 0000000000..9175452037 Binary files /dev/null and b/docs/en/Blog-Posts/2023-06-05 v7_3_Preview/devnot-conference.png differ diff --git a/docs/en/Blog-Posts/2023-06-05 v7_3_Preview/devnot-talk.png b/docs/en/Blog-Posts/2023-06-05 v7_3_Preview/devnot-talk.png new file mode 100644 index 0000000000..896663ae28 Binary files /dev/null and b/docs/en/Blog-Posts/2023-06-05 v7_3_Preview/devnot-talk.png differ diff --git a/docs/en/Blog-Posts/2023-06-05 v7_3_Preview/leptonx-account-layout.png b/docs/en/Blog-Posts/2023-06-05 v7_3_Preview/leptonx-account-layout.png new file mode 100644 index 0000000000..9395011060 Binary files /dev/null and b/docs/en/Blog-Posts/2023-06-05 v7_3_Preview/leptonx-account-layout.png differ diff --git a/docs/en/Blog-Posts/2023-06-05 v7_3_Preview/reset-authenticator.png b/docs/en/Blog-Posts/2023-06-05 v7_3_Preview/reset-authenticator.png new file mode 100644 index 0000000000..42651b9479 Binary files /dev/null and b/docs/en/Blog-Posts/2023-06-05 v7_3_Preview/reset-authenticator.png differ diff --git a/docs/en/Blog-Posts/2023-06-05 v7_3_Preview/two-factor-auth-1.png b/docs/en/Blog-Posts/2023-06-05 v7_3_Preview/two-factor-auth-1.png new file mode 100644 index 0000000000..00c9e12456 Binary files /dev/null and b/docs/en/Blog-Posts/2023-06-05 v7_3_Preview/two-factor-auth-1.png differ diff --git a/docs/en/Blog-Posts/2023-06-05 v7_3_Preview/two-factor-auth-2.png b/docs/en/Blog-Posts/2023-06-05 v7_3_Preview/two-factor-auth-2.png new file mode 100644 index 0000000000..4ccfbcee83 Binary files /dev/null and b/docs/en/Blog-Posts/2023-06-05 v7_3_Preview/two-factor-auth-2.png differ diff --git a/docs/en/Blog-Posts/2023-06-05 v7_3_Preview/two-factor-auth-3.png b/docs/en/Blog-Posts/2023-06-05 v7_3_Preview/two-factor-auth-3.png new file mode 100644 index 0000000000..82a58bb479 Binary files /dev/null and b/docs/en/Blog-Posts/2023-06-05 v7_3_Preview/two-factor-auth-3.png differ diff --git a/docs/en/Blog-Posts/2023-07-12 v7_3_Release_Stable/POST.md b/docs/en/Blog-Posts/2023-07-12 v7_3_Release_Stable/POST.md new file mode 100644 index 0000000000..89cf9e340d --- /dev/null +++ b/docs/en/Blog-Posts/2023-07-12 v7_3_Release_Stable/POST.md @@ -0,0 +1,75 @@ +# ABP.IO Platform 7.3 Final Has Been Released! + +[ABP Framework](https://abp.io/) and [ABP Commercial](https://commercial.abp.io/) 7.3 versions have been released today. + +## What's New With Version 7.3? + +All the new features were already explained in detail in the [7.3 RC Announcement Post](https://blog.abp.io/abp/ABP.IO-Platform-7-3-RC-Has-Been-Published), so no need to go over them again. Check it out for more details. + +## Getting Started with 7.3 + +### Creating New Solutions + +You can create a new solution with the ABP Framework version 7.3 by either using the `abp new` command or generating the CLI command on the [get started page](https://abp.io/get-started). + +> See the [getting started document](https://docs.abp.io/en/abp/latest/Getting-Started) for more. + +### How to Upgrade an Existing Solution + +#### Install/Update the ABP CLI + +First of all, install the ABP CLI or upgrade it to the latest version. + +If you haven't installed it yet: + +```bash +dotnet tool install -g Volo.Abp.Cli +``` + +To update the existing CLI: + +```bash +dotnet tool update -g Volo.Abp.Cli +``` + +#### Upgrading Existing Solutions with the ABP Update Command + +[ABP CLI](https://docs.abp.io/en/abp/latest/CLI) provides a handy command to update all the ABP related NuGet and NPM packages in your solution with a single command: + +```bash +abp update +``` + +Run this command in the root folder of your solution. + +## Migration Guides + +There are breaking changes in this version that may affect your application. +Please see the following migration documents, if you are upgrading from v7.2: + +* [ABP Framework 7.2 to 7.3 Migration Guide](https://docs.abp.io/en/abp/7.3/Migration-Guides/Abp-7_3) + +## Community News + +### ABP Community Talks 2023.5: Mobile Development with the ABP Framework + +![](community-talks.png) + +In this episode, we'll talk about Exploring Options for Mobile Development with the ABP Framework. + +> Join us to explore the options for Mobile Development in ABP Framework on July 27, 2023, at 17:00 UTC. You can register from [here](https://kommunity.com/volosoft/events/abp-community-talks-20235-mobile-development-with-the-abp-framework-68e64e59). + +### New ABP Community Posts + +There are exciting articles contributed by the ABP community as always. I will highlight some of them here: + +* [Image Compression and Resize with ABP Framework](https://community.abp.io/posts/image-compression-and-resize-with-abp-framework-4v2gpb7g) by [Engincan Veske](https://twitter.com/EngincanVeske) +* [Manage Quartz with SilkierQuartz](https://community.abp.io/posts/manage-quartz-with-silkierquartz-xb4ovbj9) by [Jadyn](https://community.abp.io/members/Jadyn) +* [ABP Helper Methods](https://community.abp.io/posts/abp-helper-methods-04dk74cq) by [Engincan Veske](https://twitter.com/EngincanVeske) +* [How to replace SwaggerUI with RapiDoc](https://community.abp.io/posts/how-to-replace-swaggerui-with-rapidoc-hw7pktmz) by [Jadyn](https://community.abp.io/members/Jadyn) + +Thanks to the ABP Community for all the content they have published. You can also [post your ABP-related (text or video) content](https://community.abp.io/articles/submit) to the ABP Community. + +## About the Next Version + +The next feature version will be 7.4. You can follow the [release planning here](https://github.com/abpframework/abp/milestones). Please [submit an issue](https://github.com/abpframework/abp/issues/new) if you have any problems with this version. diff --git a/docs/en/Blog-Posts/2023-07-12 v7_3_Release_Stable/community-talks.png b/docs/en/Blog-Posts/2023-07-12 v7_3_Release_Stable/community-talks.png new file mode 100644 index 0000000000..f6fded181f Binary files /dev/null and b/docs/en/Blog-Posts/2023-07-12 v7_3_Release_Stable/community-talks.png differ diff --git a/docs/en/Blog-Posts/2023-07-12 v7_3_Release_Stable/cover-image.png b/docs/en/Blog-Posts/2023-07-12 v7_3_Release_Stable/cover-image.png new file mode 100644 index 0000000000..235642a3f8 Binary files /dev/null and b/docs/en/Blog-Posts/2023-07-12 v7_3_Release_Stable/cover-image.png differ diff --git a/docs/en/Community-Articles/2023-06-05-Kubernetes-Integration-Abp-Studio/POST.md b/docs/en/Community-Articles/2023-06-05-Kubernetes-Integration-Abp-Studio/POST.md index 7d183a7b6c..58849266eb 100644 --- a/docs/en/Community-Articles/2023-06-05-Kubernetes-Integration-Abp-Studio/POST.md +++ b/docs/en/Community-Articles/2023-06-05-Kubernetes-Integration-Abp-Studio/POST.md @@ -163,12 +163,10 @@ The solution runner is a great way of running multiple services locally. However ### How ABP Studio Kubernetes Tunnel works -I am sure that you want to see it in action, but before that, let me explain how the solution works. No problem if you can not understand it completely. It is enough to see the big picture: +I am sure that you want to see it in action, but before that, let me explain how the solution works. ![abp-studio-kubernetes-tunnel-how-it-works](06-abp-studio-kubernetes-tunnel-how-it-works.png) -Let's explain how it works: - * **Kubernetes cluster** is shown on the right side and your **local development machine** is shown on the left side. * As you know, when a **user requests a web page** from your web application, the request is accepted by an **Ingress Controller** inside your Kubernetes cluster. * The Ingress controller forwards the request to your **web application**, which then uses an **API gateway** to consume your microservices. diff --git a/docs/en/Community-Articles/2023-07-03-Image-Compression-And-Resize/POST.md b/docs/en/Community-Articles/2023-07-03-Image-Compression-And-Resize/POST.md new file mode 100644 index 0000000000..9023417b20 --- /dev/null +++ b/docs/en/Community-Articles/2023-07-03-Image-Compression-And-Resize/POST.md @@ -0,0 +1,293 @@ +# Image Compression and Resize with ABP Framework + +## Introduction + +In this article, I will show how to compress and resize images easily with the ABP Framework's new [Image Manipulation System](https://docs.abp.io/en/abp/7.3/Image-Manipulation), which is introduced in v7.3.0. + +ABP Framework provides services to compress and resize images and implements these services with popular [ImageSharp](https://sixlabors.com/products/imagesharp/) and [Magick.NET](https://github.com/dlemstra/Magick.NET) libraries. Currently, only these two providers are officially supported by the ABP Framework but thanks to the system being designed extensible, you can implement your own image resizer/compressor and use it in your application. + +> Refer to the documentation for more info: [Image Manipulation](https://docs.abp.io/en/abp/7.3/Image-Manipulation) + +### Source Code + +You can find the source code of the application at [https://github.com/abpframework/abp-samples/tree/master/ImageManipulation](https://github.com/abpframework/abp-samples/tree/master/ImageManipulation). Don't hesitate to check the source code, if you are stuck on any point. + +## Demo: Image Compression and Resize + +The best way to see what ABP's Image Manipulation System is capable of is to see it in action. Thus, we can create a simple application that basically allows us to upload, search and display images. + +### Creating a New ABP Solution + +> I have created an ABP solution and you can find the [full source code of the demo application here](https://github.com/abpframework/abp-samples/tree/master/ImageManipulation). If you want to create the same solution from scratch, you can apply the following steps: + +Install the ABP CLI, if you haven't installed it before: + +```bash +dotnet tool install -g Volo.Abp.Cli +``` + +Create a new solution with the ABP Framework's Application Startup Template with MVC UI and EF Core database (default options): + +```bash +abp new ImageManipulationDemo -t app --version 7.3.0-rc.2 +``` + +> As I have mentioned above, ABP introduced the Image Manipulation System in v7.3.0. So, ensure your application is v7.3.0 or higher. + +After creating the application, let's create the database and seed the initial data by running the `*.DbMigrator` project. Also, you can run the application to see if it's working as expected. + +### Configuring the BLOB Storing System + +Since we are creating an image upload application, we need to store our images somewhere and read these image contents when it's needed. [BLOB Storing System](https://docs.abp.io/en/abp/latest/Blob-Storing) is a great solution to achieve this. Let's install & configure the BLOB Storing System into our application. + +First, run the following command under the directory of your `*.HttpApi` project: + +```bash +abp add-package Volo.Abp.BlobStoring +``` + +Then, we need to select and configure a storage provider to tell the BLOB Storing System where to store the file contents. There are [multiple providers](https://docs.abp.io/en/abp/latest/Blob-Storing#blob-storage-providers) that we can choose. For the simplicity of the demo, let's continue with the **database provider** and run the following command under the directory of your solution (`*.sln`): + +```bash +abp add-module Volo.Abp.BlobStoring.Database +``` + +* This command adds all the NuGet packages to the corresponding layers of your solution. +* Also, it makes the necessary configurations, adds a new database migration, and updates the database. +* Since we are not configuring the connection string, the BLOB Storing system will use the default connection string in our application. + +That's it. We have installed and configured the BLOB Storing System in our application. + +### Configuring the Image Manipulation System + +After, configuring the BLOB Storing System, now we can install and configure the Image Manipulation System to be able to compress and resize images. + +ABP Framework provides two image resizer/compressor implementations out of the box: [ImageSharp](https://docs.abp.io/en/abp/7.3/Image-Manipulation#imagesharp-provider) and [Magick.NET](https://docs.abp.io/en/abp/7.3/Image-Manipulation#magick-net-provider). + +We can use the `Volo.Abp.Imaging.ImageSharp` as the provider for our application. To install the package, run the following command under the `*.HttpApi` project: + +```bash +abp add-package Volo.Abp.Imaging.ImageSharp +``` + +* This package will provide the required services to compress and resize images. +* You can [configure the `ImageSharpCompressOptions`](https://docs.abp.io/en/abp/7.3/Image-Manipulation#configuration-1) to define *DefaultQuality* and encoders. + + +After installing the provider, now we can use the services to compress and resize our images, such as `IImageCompression` and `IImageResizer`. But there is an easier way. The `Volo.Abp.Imaging.AspNetCore` NuGet package defines some attributes for controller actions that can automatically compress and/or resize the uploaded files. + +To be able to use these attributes, we need to install the `Volo.Abp.Imaging.AspNetCore` package. Type the following command under the `*.HttpApi` project: + +```bash +abp add-package Volo.Abp.Imaging.AspNetCore +``` + +This package provides two attributes: `[CompressImage]` and `[ResizeImage]`. Whenever we use these attributes, the Image Manipulation System will automatically compress and/or resize uploaded files. + +### Image Upload (with Compress & Resize) + +After all the required package installations and configurations are done, now we can start implementing the API and UI for the Image Upload. + +Let's start with creating the API. Create a controller in the `*.HttpApi` project named `ImageController` and perform the image upload and image display operations: + +```csharp +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using System.Threading.Tasks; +using Volo.Abp.BlobStoring; +using Volo.Abp.Imaging; + +namespace ImageManipulationDemo.Controllers +{ + [Controller] + [Route("api/image")] + public class ImageController : ImageManipulationDemoController + { + private readonly IBlobContainer _blobContainer; + + public ImageController(IBlobContainer blobContainer) + { + _blobContainer = blobContainer; + } + + [HttpPost("upload")] + [CompressImage] + [ResizeImage(width: 200, height: 200)] + public async Task UploadAsync(IFormFile file) + { + var fileBytes = await file.GetAllBytesAsync(); + var blobName = file.FileName; + + await _blobContainer.SaveAsync(blobName, fileBytes, overrideExisting: true); + + return Ok(); + } + + [HttpGet("")] + public async Task GetImageAsync(string fileName) + { + return await _blobContainer.GetAllBytesAsync(fileName); + } + } +} +``` + +* Here, we have used both `CompressImage` and `ResizeImage` attributes to automatically compress & resize the uploaded file. +* As you can see, we used the `IBlobContainer` service to save our file content. +* Since we are using the *database provider* as BLOB storing provider, the file contents will be added to our database and then we will be able to fetch them whenever it's needed like we have done in the `GetImageAsync` method above. +* We simply used the required attributes (and they do the rest on behalf of us and call the related image resize and compress services) to resize & compress images and save the new resized/compressed image into the database. + +Before implementing the UI side, as you may notice, we've injected the `IBlobContainer` as a typed service (`IBlobContainer`). A typed BLOB container system is a way of creating and managing multiple containers in an application. We haven't created the `ImageManipulationContainer` class yet. + +Let's create this class as below: + +```csharp +using Volo.Abp.BlobStoring; + +namespace ImageManipulationDemo +{ + [BlobContainerName("image-manipulation-demo")] + public class ImageManipulationContainer + { + } +} +``` + +* We have used the `BlobContainerName` attribute to define the name of the container. +* If we haven't used the `BlobContainerName` attribute, ABP Framework uses the full name of the class with its namespace. + +We have implemented the endpoints and now can start implementing the UI side. You can see the following figure to see what we are going to design for the image upload page: + +![](image-upload-ui.png) + +Let's start designing this page. Open the `Index.cshtml` file (*/Pages/Index.cshtml*) under the `*.Web` project and replace it with the following content: + +```html +@page +@using Microsoft.AspNetCore.Mvc.Localization +@using ImageManipulationDemo.Localization +@using Volo.Abp.Users +@model ImageManipulationDemo.Web.Pages.IndexModel +@inject IHtmlLocalizer L +@inject ICurrentUser CurrentUser +@section styles { + +} +@section scripts { + +} + +
+
+
+
+
+
+
+ + +
+ +
+ +
+
+
+
+
+ +
+
+
+
+
+
Search & Display Images
+ +
+
+ + +
+
+ +
+
+
+
+
+
+
+``` + +Then, open the `index.js` file and replace it with the following content: + +```js +$(function () { + + $("#upload-image").submit(function (e) { + e.preventDefault(); + + var file = document.getElementById("formFile").files[0]; + var formData = new FormData(); + formData.append("file", file); + + $.ajax( + { + url: "/api/image/upload", + data: formData, + processData: false, + contentType: false, + type: "POST", + success: function (data) { + abp.message.success("Image saved successfully!"); + }, + error: function (err) { + abp.message.error("An error occured while saving the image."); + } + } + ); + }); + + $("#search-image").submit(function (e) { + e.preventDefault(); + + var imgResult = $("#image-result"); + imgResult.removeClass("d-none"); + + imgResult.html("

Loading...

"); + + var fileName = $("#img-search-input").val(); + + imageManipulationDemo.controllers.image.getImage(fileName) + .then(function (imageFile) { + var src = "data:image/png;base64," + imageFile; + var img = ""; + + imgResult.html(img); + }) + .catch(function (err) { + imgResult.html("

Could not find the image...

"); + }); + }); +}); +``` + +Now, we can run the application and see the Image Manipulation System in action: + +![](image-manipulation.gif) + +The results are impressive for the example above: + +* The original image was 12 KB and now the compressed & resized image has been reduced to 8 KB. +* The original image was 225x225 and now resized as 200x200. + +## Conclusion + +In this article, I have shown you how to compress and/or resize images with ABP Framework's Image Manipulation System by just defining some attributes to the top of the controller actions. + +Also, I have shown that you can use the BLOB Storing System to store file contents and compress/resize images before saving them into BLOB Storages thanks to the image resizers/compressors provided by ABP Framework. + +## See Also + +* [BLOB Storing](https://docs.abp.io/en/abp/latest/Blob-Storing) +* [Image Manipulation](https://docs.abp.io/en/abp/7.3/Image-Manipulation#iimageresizer) diff --git a/docs/en/Community-Articles/2023-07-03-Image-Compression-And-Resize/image-manipulation.gif b/docs/en/Community-Articles/2023-07-03-Image-Compression-And-Resize/image-manipulation.gif new file mode 100644 index 0000000000..d8b2a10c16 Binary files /dev/null and b/docs/en/Community-Articles/2023-07-03-Image-Compression-And-Resize/image-manipulation.gif differ diff --git a/docs/en/Community-Articles/2023-07-03-Image-Compression-And-Resize/image-upload-ui.png b/docs/en/Community-Articles/2023-07-03-Image-Compression-And-Resize/image-upload-ui.png new file mode 100644 index 0000000000..d5fab5a945 Binary files /dev/null and b/docs/en/Community-Articles/2023-07-03-Image-Compression-And-Resize/image-upload-ui.png differ diff --git a/docs/en/Community-Articles/2023-08-07-Basic-Theme-Dark-Mode/POST.md b/docs/en/Community-Articles/2023-08-07-Basic-Theme-Dark-Mode/POST.md new file mode 100644 index 0000000000..00325751ef --- /dev/null +++ b/docs/en/Community-Articles/2023-08-07-Basic-Theme-Dark-Mode/POST.md @@ -0,0 +1,125 @@ +# Adding Dark Mode Support to the Basic Theme +Basic Theme uses plain bootstrap and does not have any custom colors & styles. This article will show you how to add dark mode support to the [Basic Theme](https://docs.abp.io/en/abp/latest/UI/AspNetCore/Basic-Theme). + +Bootstrap brings the [Color Modes](https://getbootstrap.com/docs/5.3/customize/color-modes/#dark-mode) feature with version **5.3**. This feature allows you to add dark mode support to your website with a single line of code. Adding the `data-bs-theme="dark"` attribute changes the color mode of the element to dark mode. + +## Instructions + +1. Create a new project with the following command: + ```bash + abp new BasicThemeDarkMode -t app --theme basic + ``` + +2. Create a component that toggles the color mode. + + - Create a new file named `Components/ChangeTheme/Default.cshtml`: + ```html +
+ +
+ ``` + + - Create a new file named `Components/ChangeTheme/ChangeThemeViewComponent.cs`: + ```csharp + using Microsoft.AspNetCore.Mvc; + using Volo.Abp.AspNetCore.Mvc; + + namespace BasicThemeDarkMode.Web.Components.ChangeTheme; + + [Widget(ScriptFiles = new[]{"/Components/ChangeTheme/ChangeTheme.js"})] + public class ChangeThemeViewComponent : AbpViewComponent + { + public IViewComponentResult Invoke() + { + return View("~/Components/ChangeTheme/Default.cshtml"); + } + } + ``` + + - Create a JavaScript that manages the last selected theme and toggles the color mode. It stores the last selected theme in the *local storage*. So, you don't need to store it in the database. + + - Create a new file named `Components/ChangeTheme/ChangeTheme.js`: + ```js + $(function () { + function changeTheme(theme) { + window.localStorage.setItem('theme', theme); + document.getElementsByTagName('body')[0].setAttribute('data-bs-theme', theme); + } + + function toggleTheme(){ + getTheme() == 'light' ? changeTheme('dark') : changeTheme('light'); + } + + function getTheme(){ + return window.localStorage.getItem('theme') ?? 'dark'; + } + + function init(){ + let theme = getTheme(); + if(theme){ + changeTheme(theme); + } + } + + document.getElementById('ToolbarChangeTheme').addEventListener('click', () => { + toggleTheme(); + }); + + init(); + }); + ``` + +3. Create a new [Toolbar Contributor](https://docs.abp.io/en/abp/latest/UI/AspNetCore/Toolbars) and add a newly created view component to the application toolbar. + + - Create a new class named `BasicThemeDarkModeToolbarContributor.cs`: + ```csharp + using BasicThemeDarkMode.Web.Components.ChangeTheme; + using System.Threading.Tasks; + using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Toolbars; + + namespace BasicThemeDarkMode.Web; + + public class BasicThemeDarkModeToolbarContributor : IToolbarContributor + { + public Task ConfigureToolbarAsync(IToolbarConfigurationContext context) + { + if (context.Toolbar.Name == StandardToolbars.Main) + { + context.Toolbar.Items + .Add(new ToolbarItem(typeof(ChangeThemeViewComponent))); + } + + return Task.CompletedTask; + } + } + ``` + + - Configure [Toolbar Options](https://docs.abp.io/en/abp/latest/UI/AspNetCore/Toolbars) and add a newly created contributor: + ```csharp + Configure(options => + { + options.Contributors.Add(new BasicThemeDarkModeToolbarContributor()); + }); + ``` + +That's it! Now, you can toggle the color mode by clicking the sun icon in the toolbar: + +![Dark Mode](basictheme-toggle-demo.gif) + +- Users Page in Dark Mode: + + ![Users Page in Dark Mode](basictheme-dark-users.png) + +- Settings Page in Dark Mode: + + ![Settings Page in Dark Mode](basictheme-dark-settings.png) + +- Login Page in Dark Mode: + + ![Login Page in Dark Mode](basictheme-dark-login.png) + +## Conclusion + +The theme is stored in **local storage** and it's initialized on the client-side. You can use **Cookies** to render the page in the last selected theme on **server-side** to prevent the flash effect while navigating pages. This document shows the concept of adding dark mode support of bootstrap to the Basic Theme. diff --git a/docs/en/Community-Articles/2023-08-07-Basic-Theme-Dark-Mode/basictheme-dark-login.png b/docs/en/Community-Articles/2023-08-07-Basic-Theme-Dark-Mode/basictheme-dark-login.png new file mode 100644 index 0000000000..0ee18b54b9 Binary files /dev/null and b/docs/en/Community-Articles/2023-08-07-Basic-Theme-Dark-Mode/basictheme-dark-login.png differ diff --git a/docs/en/Community-Articles/2023-08-07-Basic-Theme-Dark-Mode/basictheme-dark-settings.png b/docs/en/Community-Articles/2023-08-07-Basic-Theme-Dark-Mode/basictheme-dark-settings.png new file mode 100644 index 0000000000..6d32677c4c Binary files /dev/null and b/docs/en/Community-Articles/2023-08-07-Basic-Theme-Dark-Mode/basictheme-dark-settings.png differ diff --git a/docs/en/Community-Articles/2023-08-07-Basic-Theme-Dark-Mode/basictheme-dark-users.png b/docs/en/Community-Articles/2023-08-07-Basic-Theme-Dark-Mode/basictheme-dark-users.png new file mode 100644 index 0000000000..67973f8a10 Binary files /dev/null and b/docs/en/Community-Articles/2023-08-07-Basic-Theme-Dark-Mode/basictheme-dark-users.png differ diff --git a/docs/en/Community-Articles/2023-08-07-Basic-Theme-Dark-Mode/basictheme-toggle-demo.gif b/docs/en/Community-Articles/2023-08-07-Basic-Theme-Dark-Mode/basictheme-toggle-demo.gif new file mode 100644 index 0000000000..536b30e6ee Binary files /dev/null and b/docs/en/Community-Articles/2023-08-07-Basic-Theme-Dark-Mode/basictheme-toggle-demo.gif differ diff --git a/docs/en/Data-Filtering.md b/docs/en/Data-Filtering.md index dc237f6151..be1d922fbd 100644 --- a/docs/en/Data-Filtering.md +++ b/docs/en/Data-Filtering.md @@ -237,11 +237,25 @@ protected override Expression> CreateFilterExpression(b => + { + b.HasAbpQueryFilter(e => e.Name.StartsWith("abp")); + }); +} +```` + ### MongoDB ABP abstracts the `IMongoDbRepositoryFilterer` interface to implement data filtering for the [MongoDB Integration](MongoDB.md), it works only if you use the repositories properly. Otherwise, you should manually filter the data. -Currently, the best way to implement a data filter for the MongoDB integration is to create a derived class of `MongoDbRepositoryFilterer` and override `AddGlobalFilters`. Example: +Currently, the best way to implement a data filter for the MongoDB integration is to create a derived class of `MongoDbRepositoryFilterer` and override `FilterQueryable`. Example: ````csharp [ExposeServices(typeof(IMongoDbRepositoryFilterer))] @@ -254,14 +268,14 @@ public class BookMongoDbRepositoryFilterer : MongoDbRepositoryFilterer> filters) + public override TQueryable FilterQueryable(TQueryable query) { - base.AddGlobalFilters(filters); - if (DataFilter.IsEnabled()) { - filters.Add(Builders.Filter.Eq(e => ((IIsActive)e).IsActive, true)); + return (TQueryable)query.Where(x => x.IsActive); } + + return base.FilterQueryable(query); } } ```` diff --git a/docs/en/Integration-Services.md b/docs/en/Integration-Services.md index e788c348f7..98e3e593e5 100644 --- a/docs/en/Integration-Services.md +++ b/docs/en/Integration-Services.md @@ -34,11 +34,47 @@ public interface IProductAppService : IApplicationService That's all. From now, ABP will handle your application service as integration service and implement the followings by convention: -* If you are using the [Auto API Controllers](API/Auto-API-Controllers.md) feature in your application, the URL prefix will be `/integration-api` instead of `/api` for your integration services. Thus, you can distinguish internal and external service communications and take additional actions, such as preventing REST API calls for integration services out of API Gateway. -* Audit logging is disabled by default for the integration services. See the next section if you want to enable it. +* That service is **not exposed** by default, unless you explicitly set `ExposeIntegrationServices` options (see the *Exposing Integration Services* section). +* If you are using the [Auto API Controllers](API/Auto-API-Controllers.md) feature in your application, the **URL prefix** will be `/integration-api` instead of `/api` for your integration services. Thus, you can distinguish internal and external service communications and take additional actions, such as preventing REST API calls for integration services out of API Gateway. +* **Audit logging** is disabled by default for the integration services. See the next section if you want to enable it. + +## Marking an MVC Controller as Integration Service + +In addition to application services, you can mark a regular MVC Controller as integration service, using the same `IntegrationService` attribute, or inheriting an interface that has the `IntegrationService` attribute. + +**Example:** + +````csharp +[IntegrationService] // Mark as integration service +[Route("integration-api/products")] +public class ProductController : AbpControllerBase +{ + //... +} +```` + +When you use the `IntegrationService` attribute, ABP will handle your controller as integration service and implement the followings by convention: + +* That controller is **not exposed** to clients by default, unless you explicitly set `ExposeIntegrationServices` options (see the *Exposing Integration Services* section). +* **Audit logging** is disabled by default for controller. See the next section if you want to enable it. ## Configuration +### Exposing Integration Services + +Integration services and controllers are not exposed by default for security reasons. They typically don't require authorization, so you should **carefully and explicitly** allow them to be visible and usable to client applications. + +To expose integration services and controllers, set `AbpAspNetCoreMvcOptions.ExposeIntegrationServices` to `true` in the `ConfigureServices` method of your [module class](Module-Development-Basics.md): + +````csharp +Configure(options => +{ + options.ExposeIntegrationServices = true; +}); +```` + +> Hiding integration services is useful when you are building reusable application modules, where they may be used in a monolith application or in a microservice system. In a monolith application, integration services don't need to be exposed outside since the modules may in-process communicate with each other. On the other hand, if you build a microservice solution and use that module as a service, it will be proper to expose the integration services, so other microservices can consume them remotely inside your private network (or Kubernetes cluster). In that case, be careful to not accidently expose the integration services out of your private network. Configuring your API Gateway so that it blocks requests to `integration-api` prefixed URLs from outside of your network will be a good option. + ### Enabling/Disabling the Audit Logging Audit Logging is disabled by default for integration services but it can be enabled by configuring the `AbpAuditingOptions` [options class](Options.md) in the `ConfigureServices` method of your [module class](Module-Development-Basics.md): diff --git a/docs/en/Migration-Guides/docs/en/Migration-Guides/Abp-7_4.md b/docs/en/Migration-Guides/docs/en/Migration-Guides/Abp-7_4.md new file mode 100644 index 0000000000..5ec8eb6c65 --- /dev/null +++ b/docs/en/Migration-Guides/docs/en/Migration-Guides/Abp-7_4.md @@ -0,0 +1,8 @@ +# ABP Version 7.4 Migration Guide + +This document is a guide for upgrading ABP v7.3 solutions to ABP v7.4. There are a few changes in this version that may affect your applications, please read it carefully and apply the necessary changes to your application. + +## TemplateDefinition + +The `LocalizationResource(Type)` of `TemplateDefinition` class is changed to `LocalizationResourceName(string)`. + diff --git a/docs/en/Module-Development-Basics.md b/docs/en/Module-Development-Basics.md index dfce0bf4b2..1fdd09f8b2 100644 --- a/docs/en/Module-Development-Basics.md +++ b/docs/en/Module-Development-Basics.md @@ -147,7 +147,7 @@ Lastly, you can override ``OnApplicationShutdown`` method if you want to execute ## Module Dependencies -In a modular application, it's not unusual for one module to depend upon another module(s). An Abp module must declare ``[DependsOn]`` attribute if it does have a dependency upon another module, as shown below: +In a modular application, it's not unusual for one module to depend upon another module(s). An ABP module must declare a ``[DependsOn]`` attribute if it does have a dependency upon another module, as shown below: ````C# [DependsOn(typeof(AbpAspNetCoreMvcModule))] @@ -162,6 +162,27 @@ You can use multiple ``DependsOn`` attribute or pass multiple module types to a A depended module may depend on another module, but you only need to define your direct dependencies. ABP investigates the dependency graph for the application at startup and initializes/shutdowns modules in the correct order. +## Additional Module Assemblies + +ABP automatically registers all the services of your module to the [dependency injection](Dependency-Injection.md) system. It finds the service types by scanning types in the assembly that defines your module class. That assembly is considered as the main assembly of your module. + +Typically, every assembly contains a separate module class definition. Then modules depend on each other using the `DependsOn` attribute as explained in the previous section. However, in some rare cases, your module may consist of multiple assemblies, and only one of them defines a module class, and you want to make the other assemblies parts of your module. In that case, you can use the `AdditionalAssembly` attribute as shown below: + +````csharp +[DependsOn(...)] // Your module dependencies as you normally do +[AdditionalAssembly(typeof(BlogService))] // A type in the target assembly +public class BlogModule +{ + //... +} +```` + +In this example, we assume that the `BlogService` class is inside one assembly (`csproj`) and the `BlogModule` class is inside another assembly (`csproj`). With the `AdditionalAssembly` definition, ABP will load the assembly containing the `BlogService` class as a part of the blog module. + +Notice that `BlogService` is only an arbitrary selected type in the target assembly. It is just used to indicate the related assembly. You could use any type in the assembly. + +> WARNING: If you need to use the `AdditionalAssembly`, be sure that you don't design your system in a wrong way. With this example above, the `BlogService` class' assembly should normally have its own module class and the `BlogModule` should depend on it using the `DependsOn` attribute. Do not use the `AdditionalAssembly` attribute when you can already use the `DependsOn` attribute. + ## Framework Modules vs Application Modules There are **two types of modules.** They don't have any structural difference but categorized by functionality and purpose: diff --git a/docs/en/Module-Entity-Extensions.md b/docs/en/Module-Entity-Extensions.md index 47436a7dd9..93c79120cd 100644 --- a/docs/en/Module-Entity-Extensions.md +++ b/docs/en/Module-Entity-Extensions.md @@ -255,6 +255,20 @@ property => Use `property.UI.OnCreateForm` and `property.UI.OnEditForm` to control forms too. If a property is required, but not added to the create form, you definitely get a validation exception, so use this option carefully. But a required property may not be in the edit form if that's your requirement. +### UI Order + +When you define a property, it appears on the data table, create and edit forms on the related UI page. However, you can control its order. Example: + +````csharp +property => +{ + property.UI.Order = 1; + //...other configurations +} +```` + +Use `property.UI.OnCreateForm` and `property.UI.OnEditForm` to control forms too. If a property is required, but not added to the create form, you definitely get a validation exception, so use this option carefully. But a required property may not be in the edit form if that's your requirement. + ### HTTP API Availability Even if you disable a property on UI, it can be still available through the HTTP API. By default, a property is available on all APIs. diff --git a/docs/en/Modules/Cms-Kit/Tags.md b/docs/en/Modules/Cms-Kit/Tags.md index 8f91bc67c7..9f85faeff2 100644 --- a/docs/en/Modules/Cms-Kit/Tags.md +++ b/docs/en/Modules/Cms-Kit/Tags.md @@ -32,24 +32,40 @@ Configure(options => `TagEntityTypeDefiniton` properties: - `EntityType`: Name of the entity type. -- `DisplayName`: Display name of the entity type. You can use a user friendly display name to show entity type definition on the admin website. +- `DisplayName`: The display name of the entity type. You can use a user-friendly display name to show entity type definition on the admin website. - `CreatePolicies`: List of policy/permission names allowing users to create tags under the entity type. - `UpdatePolicies`: List of policy/permission names allowing users to update tags under the entity type. - `DeletePolicies`: List of policy/permission names allowing users to delete tags under the entity type. ## The Tag Widget -The tag system provides a tag [widget](../../UI/AspNetCore/Widgets.md) to display associated tags of a resource that was configured for tagging. You can simply place the widget on a page like below: +The tag system provides a tag [widget](../../UI/AspNetCore/Widgets.md) to display associated tags of a resource that was configured for tagging. You can simply place the widget on a page like the one below: ```csharp @await Component.InvokeAsync(typeof(TagViewComponent), new { entityType = "Product", - entityId = "..." + entityId = "...", + urlFormat = "/products?tagId={TagId}&tagName={TagName}" }) ``` -`entityType` was explained in the previous section. `entityId` should be the unique id of the product, in this example. If you have a Product entity, you can use its Id here. +`entityType` was explained in the previous section. In this example, the `entityId` should be the unique id of the product. If you have a `Product` entity, you can use its Id here. `urlFormat` is the string format of the URL which will be generated for each tag. You can use the `{TagId}` and `{TagName}` placeholders to populate the URL. For example, the above URL format will populate URLs like `/products?tagId=1&tagName=tag1`. + +## The Popular Tags Widget + +The tag system provides a popular tags [widget](../../UI/AspNetCore/Widgets.md) to display popular tags of a resource that was configured for tagging. You can simply place the widget on a page as below: + +```csharp +@await Component.InvokeAsync(typeof(PopularTagsViewComponent), new +{ + entityType = "Product", + urlFormat = "/products?tagId={TagId}&tagName={TagName}", + maxCount = 10 +}) +``` + +`entityType` was explained in the previous section. `urlFormat` was explained in the previous section. `maxCount` is the maximum number of tags to be displayed. ## User Interface @@ -95,7 +111,7 @@ An entity tag represents a connection between the tag and the tagged entity. This module follows the [Repository Best Practices & Conventions](https://docs.abp.io/en/abp/latest/Best-Practices/Repositories) guide. -Following custom repositories are defined for this feature: +The following custom repositories are defined for this feature: - `ITagRepository` - `IEntityTagRepository` @@ -106,11 +122,11 @@ This module follows the [Domain Services Best Practices & Conventions](https://d ##### Tag Manager -`TagManager` is used to perform some operations for the `Tag` aggregate root. +`TagManager` performs some operations for the `Tag` aggregate root. ##### Entity Tag Manager -`EntityTagManager` is used to perform some operations for the `EntityTag` entity. +`EntityTagManager` performs some operations for the `EntityTag` entity. ### Application layer @@ -124,7 +140,7 @@ This module follows the [Domain Services Best Practices & Conventions](https://d #### Common -##### Table / collection prefix & schema +##### Table / Collection prefix & schema All tables/collections use the `Cms` prefix by default. Set static properties on the `CmsKitDbProperties` class if you need to change the table prefix or set a schema name (if supported by your database provider). diff --git a/docs/en/Modules/Index.md b/docs/en/Modules/Index.md index d5037665f0..5e280268e7 100644 --- a/docs/en/Modules/Index.md +++ b/docs/en/Modules/Index.md @@ -4,8 +4,8 @@ ABP is a **modular application framework** which consists of dozens of **NuGet & There are **two types of modules.** They don't have any structural difference but are categorized by functionality and purpose: -* [**Framework modules**](https://github.com/abpframework/abp/tree/master/framework/src): These are **core modules of the framework** like caching, emailing, theming, security, serialization, validation, EF Core integration, MongoDB integration... etc. They do not have application/business functionalities but makes your daily development easier by providing common infrastructure, integration and abstractions. -* [**Application modules**](https://github.com/abpframework/abp/tree/master/modules): These modules implement specific application/business functionalities like blogging, document management, identity management, tenant management... etc. They generally have their own entities, services, APIs and UI components. +* [**Framework modules**](https://github.com/abpframework/abp/tree/dev/framework/src): These are **core modules of the framework** like caching, emailing, theming, security, serialization, validation, EF Core integration, MongoDB integration... etc. They do not have application/business functionalities but makes your daily development easier by providing common infrastructure, integration and abstractions. +* [**Application modules**](https://github.com/abpframework/abp/tree/dev/modules): These modules implement specific application/business functionalities like blogging, document management, identity management, tenant management... etc. They generally have their own entities, services, APIs and UI components. ## Open Source Application Modules @@ -29,4 +29,4 @@ See [the GitHub repository](https://github.com/abpframework/abp/tree/dev/modules ## Commercial Application Modules -[ABP Commercial](https://commercial.abp.io/) license provides **additional pre-built application modules** on top of the ABP framework. See the [module list](https://commercial.abp.io/modules) provided by the ABP Commercial. \ No newline at end of file +[ABP Commercial](https://commercial.abp.io/) license provides **additional pre-built application modules** on top of the ABP framework. See the [module list](https://commercial.abp.io/modules) provided by the ABP Commercial. diff --git a/docs/en/Modules/Setting-Management.md b/docs/en/Modules/Setting-Management.md index 354fbdd539..e26c7c806e 100644 --- a/docs/en/Modules/Setting-Management.md +++ b/docs/en/Modules/Setting-Management.md @@ -177,7 +177,8 @@ public class BookStoreSettingPageContributor : ISettingPageContributor new SettingPageGroup( "Volo.Abp.MySettingGroup", "MySettingGroup", - typeof(MySettingGroupViewComponent) + typeof(MySettingGroupViewComponent), + order : 1 ) ); @@ -240,7 +241,8 @@ public class BookStoreSettingComponentContributor : ISettingComponentContributor new SettingComponentGroup( "Volo.Abp.MySettingGroup", "MySettingGroup", - typeof(MySettingGroupComponent) + typeof(MySettingGroupComponent), + order : 1 ) ); diff --git a/docs/zh-Hans/Data-Filtering.md b/docs/zh-Hans/Data-Filtering.md index 74192cf426..b17a4ecf9b 100644 --- a/docs/zh-Hans/Data-Filtering.md +++ b/docs/zh-Hans/Data-Filtering.md @@ -190,7 +190,7 @@ protected override Expression> CreateFilterExpression))] @@ -203,14 +203,14 @@ public class BookMongoDbRepositoryFilterer : MongoDbRepositoryFilterer> filters) + public override TQueryable FilterQueryable(TQueryable query) { - base.AddGlobalFilters(filters); - if (DataFilter.IsEnabled()) { - filters.Add(Builders.Filter.Eq(e => ((IIsActive)e).IsActive, true)); + return (TQueryable)query.Where(x => x.IsActive); } + + return base.FilterQueryable(query); } } ```` diff --git a/docs/zh-Hans/Modules/Setting-Management.md b/docs/zh-Hans/Modules/Setting-Management.md index 242553c2c9..cf52d588a2 100644 --- a/docs/zh-Hans/Modules/Setting-Management.md +++ b/docs/zh-Hans/Modules/Setting-Management.md @@ -146,7 +146,8 @@ public class BookStoreSettingPageContributor : ISettingPageContributor new SettingPageGroup( "Volo.Abp.MySettingGroup", "MySettingGroup", - typeof(MySettingGroupViewComponent) + typeof(MySettingGroupViewComponent), + order : 1 ) ); @@ -209,7 +210,8 @@ public class BookStoreSettingComponentContributor : ISettingComponentContributor new SettingComponentGroup( "Volo.Abp.MySettingGroup", "MySettingGroup", - typeof(MySettingGroupComponent) + typeof(MySettingGroupComponent), + order : 1 ) ); diff --git a/framework/Volo.Abp.sln b/framework/Volo.Abp.sln index a475aa8aa5..cd003b7f07 100644 --- a/framework/Volo.Abp.sln +++ b/framework/Volo.Abp.sln @@ -437,25 +437,27 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.AspNetCore.Compone EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.Ldap.Abstractions", "src\Volo.Abp.Ldap.Abstractions\Volo.Abp.Ldap.Abstractions.csproj", "{0F80E95C-41E6-4F23-94FF-FC9D0B8D5D71}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Ddd.Domain.Shared", "src\Volo.Abp.Ddd.Domain.Shared\Volo.Abp.Ddd.Domain.Shared.csproj", "{0858571B-CE73-4AD6-BD06-EC9F0714D8E9}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.Ddd.Domain.Shared", "src\Volo.Abp.Ddd.Domain.Shared\Volo.Abp.Ddd.Domain.Shared.csproj", "{0858571B-CE73-4AD6-BD06-EC9F0714D8E9}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.MultiTenancy.Abstractions", "src\Volo.Abp.MultiTenancy.Abstractions\Volo.Abp.MultiTenancy.Abstractions.csproj", "{86F3684C-A0A5-4943-8CFA-AE79E8E3E315}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.MultiTenancy.Abstractions", "src\Volo.Abp.MultiTenancy.Abstractions\Volo.Abp.MultiTenancy.Abstractions.csproj", "{86F3684C-A0A5-4943-8CFA-AE79E8E3E315}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Imaging.Abstractions", "src\Volo.Abp.Imaging.Abstractions\Volo.Abp.Imaging.Abstractions.csproj", "{32F3E84B-D02E-42BD-BC5C-0D211564EF30}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.Imaging.Abstractions", "src\Volo.Abp.Imaging.Abstractions\Volo.Abp.Imaging.Abstractions.csproj", "{32F3E84B-D02E-42BD-BC5C-0D211564EF30}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Imaging.AspNetCore", "src\Volo.Abp.Imaging.AspNetCore\Volo.Abp.Imaging.AspNetCore.csproj", "{78340A37-219E-4F2D-9AC6-40A7B467EEEC}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.Imaging.AspNetCore", "src\Volo.Abp.Imaging.AspNetCore\Volo.Abp.Imaging.AspNetCore.csproj", "{78340A37-219E-4F2D-9AC6-40A7B467EEEC}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Imaging.ImageSharp", "src\Volo.Abp.Imaging.ImageSharp\Volo.Abp.Imaging.ImageSharp.csproj", "{44467427-E0BE-492C-B9B4-82B362C183C3}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.Imaging.ImageSharp", "src\Volo.Abp.Imaging.ImageSharp\Volo.Abp.Imaging.ImageSharp.csproj", "{44467427-E0BE-492C-B9B4-82B362C183C3}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Imaging.MagickNet", "src\Volo.Abp.Imaging.MagickNet\Volo.Abp.Imaging.MagickNet.csproj", "{F701EDA5-D7EA-4AA7-9C57-83ED50CE72EC}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.Imaging.MagickNet", "src\Volo.Abp.Imaging.MagickNet\Volo.Abp.Imaging.MagickNet.csproj", "{F701EDA5-D7EA-4AA7-9C57-83ED50CE72EC}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Imaging.Abstractions.Tests", "test\Volo.Abp.Imaging.Abstractions.Tests\Volo.Abp.Imaging.Abstractions.Tests.csproj", "{2BE6BDC7-A9A3-4E30-9099-A9EF4813F6FF}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.Imaging.Abstractions.Tests", "test\Volo.Abp.Imaging.Abstractions.Tests\Volo.Abp.Imaging.Abstractions.Tests.csproj", "{2BE6BDC7-A9A3-4E30-9099-A9EF4813F6FF}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Imaging.ImageSharp.Tests", "test\Volo.Abp.Imaging.ImageSharp.Tests\Volo.Abp.Imaging.ImageSharp.Tests.csproj", "{1E161A34-10C1-46FA-9EFD-10DD0858A8F5}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.Imaging.ImageSharp.Tests", "test\Volo.Abp.Imaging.ImageSharp.Tests\Volo.Abp.Imaging.ImageSharp.Tests.csproj", "{1E161A34-10C1-46FA-9EFD-10DD0858A8F5}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Imaging.MagickNet.Tests", "test\Volo.Abp.Imaging.MagickNet.Tests\Volo.Abp.Imaging.MagickNet.Tests.csproj", "{62B2B8C9-8F24-4D31-894F-C1F0728D32AB}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.Imaging.MagickNet.Tests", "test\Volo.Abp.Imaging.MagickNet.Tests\Volo.Abp.Imaging.MagickNet.Tests.csproj", "{62B2B8C9-8F24-4D31-894F-C1F0728D32AB}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Imaging.AspNetCore.Tests", "test\Volo.Abp.Imaging.AspNetCore.Tests\Volo.Abp.Imaging.AspNetCore.Tests.csproj", "{983B0136-384B-4439-B374-31111FFAA286}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.Imaging.AspNetCore.Tests", "test\Volo.Abp.Imaging.AspNetCore.Tests\Volo.Abp.Imaging.AspNetCore.Tests.csproj", "{983B0136-384B-4439-B374-31111FFAA286}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Maui.Client", "src\Volo.Abp.Maui.Client\Volo.Abp.Maui.Client.csproj", "{F19A6E0C-F719-4ED9-A024-14E4B8D40883}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -1363,6 +1365,10 @@ Global {983B0136-384B-4439-B374-31111FFAA286}.Debug|Any CPU.Build.0 = Debug|Any CPU {983B0136-384B-4439-B374-31111FFAA286}.Release|Any CPU.ActiveCfg = Release|Any CPU {983B0136-384B-4439-B374-31111FFAA286}.Release|Any CPU.Build.0 = Release|Any CPU + {F19A6E0C-F719-4ED9-A024-14E4B8D40883}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F19A6E0C-F719-4ED9-A024-14E4B8D40883}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F19A6E0C-F719-4ED9-A024-14E4B8D40883}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F19A6E0C-F719-4ED9-A024-14E4B8D40883}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -1586,13 +1592,14 @@ Global {0858571B-CE73-4AD6-BD06-EC9F0714D8E9} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} {86F3684C-A0A5-4943-8CFA-AE79E8E3E315} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} {32F3E84B-D02E-42BD-BC5C-0D211564EF30} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} + {78340A37-219E-4F2D-9AC6-40A7B467EEEC} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} {44467427-E0BE-492C-B9B4-82B362C183C3} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} {F701EDA5-D7EA-4AA7-9C57-83ED50CE72EC} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} - {78340A37-219E-4F2D-9AC6-40A7B467EEEC} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} {2BE6BDC7-A9A3-4E30-9099-A9EF4813F6FF} = {447C8A77-E5F0-4538-8687-7383196D04EA} {1E161A34-10C1-46FA-9EFD-10DD0858A8F5} = {447C8A77-E5F0-4538-8687-7383196D04EA} {62B2B8C9-8F24-4D31-894F-C1F0728D32AB} = {447C8A77-E5F0-4538-8687-7383196D04EA} {983B0136-384B-4439-B374-31111FFAA286} = {447C8A77-E5F0-4538-8687-7383196D04EA} + {F19A6E0C-F719-4ED9-A024-14E4B8D40883} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {BB97ECF4-9A84-433F-A80B-2A3285BDD1D5} diff --git a/framework/src/Volo.Abp.ApiVersioning.Abstractions/Volo.Abp.ApiVersioning.Abstractions.csproj b/framework/src/Volo.Abp.ApiVersioning.Abstractions/Volo.Abp.ApiVersioning.Abstractions.csproj index 038e852f21..2924448609 100644 --- a/framework/src/Volo.Abp.ApiVersioning.Abstractions/Volo.Abp.ApiVersioning.Abstractions.csproj +++ b/framework/src/Volo.Abp.ApiVersioning.Abstractions/Volo.Abp.ApiVersioning.Abstractions.csproj @@ -5,6 +5,8 @@ netstandard2.0;netstandard2.1;net7.0 + enable + Nullable Volo.Abp.ApiVersioning.Abstractions Volo.Abp.ApiVersioning.Abstractions $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/framework/src/Volo.Abp.ApiVersioning.Abstractions/Volo/Abp/ApiVersioning/IRequestedApiVersion.cs b/framework/src/Volo.Abp.ApiVersioning.Abstractions/Volo/Abp/ApiVersioning/IRequestedApiVersion.cs index 96c2ef33cd..428f8bb6c0 100644 --- a/framework/src/Volo.Abp.ApiVersioning.Abstractions/Volo/Abp/ApiVersioning/IRequestedApiVersion.cs +++ b/framework/src/Volo.Abp.ApiVersioning.Abstractions/Volo/Abp/ApiVersioning/IRequestedApiVersion.cs @@ -2,5 +2,5 @@ public interface IRequestedApiVersion { - string Current { get; } + string? Current { get; } } diff --git a/framework/src/Volo.Abp.ApiVersioning.Abstractions/Volo/Abp/ApiVersioning/NullRequestedApiVersion.cs b/framework/src/Volo.Abp.ApiVersioning.Abstractions/Volo/Abp/ApiVersioning/NullRequestedApiVersion.cs index 0589c662ef..6099283cc4 100644 --- a/framework/src/Volo.Abp.ApiVersioning.Abstractions/Volo/Abp/ApiVersioning/NullRequestedApiVersion.cs +++ b/framework/src/Volo.Abp.ApiVersioning.Abstractions/Volo/Abp/ApiVersioning/NullRequestedApiVersion.cs @@ -4,7 +4,7 @@ public class NullRequestedApiVersion : IRequestedApiVersion { public static NullRequestedApiVersion Instance = new NullRequestedApiVersion(); - public string Current => null; + public string? Current => null; private NullRequestedApiVersion() { diff --git a/framework/src/Volo.Abp.AspNetCore.Authentication.JwtBearer/Volo.Abp.AspNetCore.Authentication.JwtBearer.csproj b/framework/src/Volo.Abp.AspNetCore.Authentication.JwtBearer/Volo.Abp.AspNetCore.Authentication.JwtBearer.csproj index bfe8b1d37b..6deeaac7e3 100644 --- a/framework/src/Volo.Abp.AspNetCore.Authentication.JwtBearer/Volo.Abp.AspNetCore.Authentication.JwtBearer.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Authentication.JwtBearer/Volo.Abp.AspNetCore.Authentication.JwtBearer.csproj @@ -5,6 +5,8 @@ net7.0 + enable + Nullable Volo.Abp.AspNetCore.Authentication.JwtBearer Volo.Abp.AspNetCore.Authentication.JwtBearer $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/framework/src/Volo.Abp.AspNetCore.Authentication.OAuth/Volo.Abp.AspNetCore.Authentication.OAuth.csproj b/framework/src/Volo.Abp.AspNetCore.Authentication.OAuth/Volo.Abp.AspNetCore.Authentication.OAuth.csproj index 562e559273..f8efe3c11c 100644 --- a/framework/src/Volo.Abp.AspNetCore.Authentication.OAuth/Volo.Abp.AspNetCore.Authentication.OAuth.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Authentication.OAuth/Volo.Abp.AspNetCore.Authentication.OAuth.csproj @@ -5,6 +5,8 @@ net7.0 + enable + Nullable Volo.Abp.AspNetCore.Authentication.OAuth Volo.Abp.AspNetCore.Authentication.OAuth $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/framework/src/Volo.Abp.AspNetCore.Authentication.OAuth/Volo/Abp/AspNetCore/Authentication/OAuth/Claims/MultipleClaimAction.cs b/framework/src/Volo.Abp.AspNetCore.Authentication.OAuth/Volo/Abp/AspNetCore/Authentication/OAuth/Claims/MultipleClaimAction.cs index 1910af63d5..e058303572 100644 --- a/framework/src/Volo.Abp.AspNetCore.Authentication.OAuth/Volo/Abp/AspNetCore/Authentication/OAuth/Claims/MultipleClaimAction.cs +++ b/framework/src/Volo.Abp.AspNetCore.Authentication.OAuth/Volo/Abp/AspNetCore/Authentication/OAuth/Claims/MultipleClaimAction.cs @@ -29,7 +29,7 @@ public class MultipleClaimAction : ClaimAction switch (prop.ValueKind) { case JsonValueKind.String: - claim = new Claim(ClaimType, prop.GetString(), ValueType, issuer); + claim = new Claim(ClaimType, prop.GetString()!, ValueType, issuer); if (!identity.Claims.Any(c => c.Type == claim.Type && c.Value == claim.Value)) { identity.AddClaim(claim); @@ -38,7 +38,7 @@ public class MultipleClaimAction : ClaimAction case JsonValueKind.Array: foreach (var arramItem in prop.EnumerateArray()) { - claim = new Claim(ClaimType, arramItem.GetString(), ValueType, issuer); + claim = new Claim(ClaimType, arramItem.GetString()!, ValueType, issuer); if (!identity.Claims.Any(c => c.Type == claim.Type && c.Value == claim.Value)) { identity.AddClaim(claim); diff --git a/framework/src/Volo.Abp.AspNetCore.Authentication.OpenIdConnect/Microsoft/Extensions/DependencyInjection/AbpOpenIdConnectExtensions.cs b/framework/src/Volo.Abp.AspNetCore.Authentication.OpenIdConnect/Microsoft/Extensions/DependencyInjection/AbpOpenIdConnectExtensions.cs index 2a2d0a712d..7d2c1fe6d6 100644 --- a/framework/src/Volo.Abp.AspNetCore.Authentication.OpenIdConnect/Microsoft/Extensions/DependencyInjection/AbpOpenIdConnectExtensions.cs +++ b/framework/src/Volo.Abp.AspNetCore.Authentication.OpenIdConnect/Microsoft/Extensions/DependencyInjection/AbpOpenIdConnectExtensions.cs @@ -28,8 +28,6 @@ public static class AbpOpenIdConnectExtensions { options.ClaimActions.MapAbpClaimTypes(); - configureOptions?.Invoke(options); - options.Events ??= new OpenIdConnectEvents(); var authorizationCodeReceived = options.Events.OnAuthorizationCodeReceived ?? (_ => Task.CompletedTask); @@ -39,16 +37,7 @@ public static class AbpOpenIdConnectExtensions return authorizationCodeReceived.Invoke(receivedContext); }; - options.Events.OnRemoteFailure = remoteFailureContext => - { - if (remoteFailureContext.Failure is OpenIdConnectProtocolException && - remoteFailureContext.Failure.Message.Contains("access_denied")) - { - remoteFailureContext.HandleResponse(); - remoteFailureContext.Response.Redirect($"{remoteFailureContext.Request.PathBase}/"); - } - return Task.CompletedTask; - }; + options.AccessDeniedPath = "/"; options.Events.OnTokenValidated = async (context) => { @@ -63,6 +52,8 @@ public static class AbpOpenIdConnectExtensions logger?.LogException(ex); } }; + + configureOptions?.Invoke(options); }); } diff --git a/framework/src/Volo.Abp.AspNetCore.Authentication.OpenIdConnect/Volo.Abp.AspNetCore.Authentication.OpenIdConnect.csproj b/framework/src/Volo.Abp.AspNetCore.Authentication.OpenIdConnect/Volo.Abp.AspNetCore.Authentication.OpenIdConnect.csproj index 9f1051fbd5..9fa50a203f 100644 --- a/framework/src/Volo.Abp.AspNetCore.Authentication.OpenIdConnect/Volo.Abp.AspNetCore.Authentication.OpenIdConnect.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Authentication.OpenIdConnect/Volo.Abp.AspNetCore.Authentication.OpenIdConnect.csproj @@ -5,6 +5,8 @@ net7.0 + enable + Nullable diff --git a/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor.Theming/Volo.Abp.AspNetCore.Components.MauiBlazor.Theming.csproj b/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor.Theming/Volo.Abp.AspNetCore.Components.MauiBlazor.Theming.csproj index bc6b5fdb26..3cd049965e 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor.Theming/Volo.Abp.AspNetCore.Components.MauiBlazor.Theming.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor.Theming/Volo.Abp.AspNetCore.Components.MauiBlazor.Theming.csproj @@ -5,6 +5,8 @@ net7.0 + enable + Nullable diff --git a/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor/Volo.Abp.AspNetCore.Components.MauiBlazor.csproj b/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor/Volo.Abp.AspNetCore.Components.MauiBlazor.csproj index b1b9dcde81..ff80cd1fba 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor/Volo.Abp.AspNetCore.Components.MauiBlazor.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor/Volo.Abp.AspNetCore.Components.MauiBlazor.csproj @@ -5,6 +5,8 @@ net7.0 + enable + Nullable Volo.Abp.AspNetCore.Components.MauiBlazor Volo.Abp.AspNetCore.Components.MauiBlazor $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor/Volo/Abp/AspNetCore/Components/MauiBlazor/AbpAspNetCoreComponentsMauiBlazorModule.cs b/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor/Volo/Abp/AspNetCore/Components/MauiBlazor/AbpAspNetCoreComponentsMauiBlazorModule.cs index 9772db6a92..010bad5db2 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor/Volo/Abp/AspNetCore/Components/MauiBlazor/AbpAspNetCoreComponentsMauiBlazorModule.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor/Volo/Abp/AspNetCore/Components/MauiBlazor/AbpAspNetCoreComponentsMauiBlazorModule.cs @@ -51,7 +51,7 @@ public class AbpAspNetCoreComponentsMauiBlazorModule : AbpModule var cultureName = configuration.Localization?.CurrentCulture?.CultureName; if (!cultureName.IsNullOrEmpty()) { - var culture = new CultureInfo(cultureName); + var culture = new CultureInfo(cultureName!); CultureInfo.DefaultThreadCurrentCulture = culture; CultureInfo.DefaultThreadCurrentUICulture = culture; } diff --git a/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor/Volo/Abp/AspNetCore/Components/MauiBlazor/AbpMauiBlazorClientHttpMessageHandler.cs b/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor/Volo/Abp/AspNetCore/Components/MauiBlazor/AbpMauiBlazorClientHttpMessageHandler.cs index 90471ba6b4..9fb31979ac 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor/Volo/Abp/AspNetCore/Components/MauiBlazor/AbpMauiBlazorClientHttpMessageHandler.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor/Volo/Abp/AspNetCore/Components/MauiBlazor/AbpMauiBlazorClientHttpMessageHandler.cs @@ -48,7 +48,7 @@ public class AbpMauiBlazorClientHttpMessageHandler : DelegatingHandler, ITransie if (!selectedLanguage.IsNullOrWhiteSpace()) { request.Headers.AcceptLanguage.Clear(); - request.Headers.AcceptLanguage.Add(new StringWithQualityHeaderValue(selectedLanguage)); + request.Headers.AcceptLanguage.Add(new StringWithQualityHeaderValue(selectedLanguage!)); } } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor/Volo/Abp/AspNetCore/Components/MauiBlazor/ApplicationConfigurationCache.cs b/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor/Volo/Abp/AspNetCore/Components/MauiBlazor/ApplicationConfigurationCache.cs index a50c25824e..b5ca46e7d8 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor/Volo/Abp/AspNetCore/Components/MauiBlazor/ApplicationConfigurationCache.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor/Volo/Abp/AspNetCore/Components/MauiBlazor/ApplicationConfigurationCache.cs @@ -7,11 +7,11 @@ namespace Volo.Abp.AspNetCore.Components.MauiBlazor; public class ApplicationConfigurationCache : ISingletonDependency { - protected ApplicationConfigurationDto Configuration { get; set; } + protected ApplicationConfigurationDto? Configuration { get; set; } - public event Action ApplicationConfigurationChanged; + public event Action? ApplicationConfigurationChanged; - public virtual ApplicationConfigurationDto Get() + public virtual ApplicationConfigurationDto? Get() { return Configuration; } diff --git a/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor/Volo/Abp/AspNetCore/Components/MauiBlazor/IMauiBlazorSelectedLanguageProvider.cs b/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor/Volo/Abp/AspNetCore/Components/MauiBlazor/IMauiBlazorSelectedLanguageProvider.cs index c6b4722f58..f995f79a83 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor/Volo/Abp/AspNetCore/Components/MauiBlazor/IMauiBlazorSelectedLanguageProvider.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor/Volo/Abp/AspNetCore/Components/MauiBlazor/IMauiBlazorSelectedLanguageProvider.cs @@ -4,5 +4,5 @@ namespace Volo.Abp.AspNetCore.Components.MauiBlazor; public interface IMauiBlazorSelectedLanguageProvider { - Task GetSelectedLanguageAsync(); + Task GetSelectedLanguageAsync(); } \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor/Volo/Abp/AspNetCore/Components/MauiBlazor/MauiBlazorCachedApplicationConfigurationClient.cs b/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor/Volo/Abp/AspNetCore/Components/MauiBlazor/MauiBlazorCachedApplicationConfigurationClient.cs index ef189e442b..c2fd8e21aa 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor/Volo/Abp/AspNetCore/Components/MauiBlazor/MauiBlazorCachedApplicationConfigurationClient.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor/Volo/Abp/AspNetCore/Components/MauiBlazor/MauiBlazorCachedApplicationConfigurationClient.cs @@ -81,4 +81,4 @@ namespace Volo.Abp.AspNetCore.Components.MauiBlazor return configuration; } } -} +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor/Volo/Abp/AspNetCore/Components/MauiBlazor/MauiBlazorCurrentTenantAccessor.cs b/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor/Volo/Abp/AspNetCore/Components/MauiBlazor/MauiBlazorCurrentTenantAccessor.cs index 9fa7ad03ca..230bd06929 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor/Volo/Abp/AspNetCore/Components/MauiBlazor/MauiBlazorCurrentTenantAccessor.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor/Volo/Abp/AspNetCore/Components/MauiBlazor/MauiBlazorCurrentTenantAccessor.cs @@ -6,5 +6,5 @@ namespace Volo.Abp.AspNetCore.Components.MauiBlazor; [Dependency(ReplaceServices = true)] public class MauiBlazorCurrentTenantAccessor : ICurrentTenantAccessor, ISingletonDependency { - public BasicTenantInfo Current { get; set; } + public BasicTenantInfo? Current { get; set; } } diff --git a/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor/Volo/Abp/AspNetCore/Components/MauiBlazor/MauiBlazorRemoteTenantStore.cs b/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor/Volo/Abp/AspNetCore/Components/MauiBlazor/MauiBlazorRemoteTenantStore.cs index 3cace3f113..d17a2b6f87 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor/Volo/Abp/AspNetCore/Components/MauiBlazor/MauiBlazorRemoteTenantStore.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor/Volo/Abp/AspNetCore/Components/MauiBlazor/MauiBlazorRemoteTenantStore.cs @@ -23,13 +23,13 @@ public class MauiBlazorRemoteTenantStore : ITenantStore, ITransientDependency Cache = cache; } - public async Task FindAsync(string name) + public async Task FindAsync(string name) { var cacheKey = CreateCacheKey(name); var tenantConfiguration = await Cache.GetOrAddAsync( cacheKey, - async () => CreateTenantConfiguration(await TenantAppService.FindTenantByNameAsync(name)), + async () => CreateTenantConfiguration(await TenantAppService.FindTenantByNameAsync(name))!, () => new DistributedCacheEntryOptions { AbsoluteExpirationRelativeToNow = @@ -40,13 +40,13 @@ public class MauiBlazorRemoteTenantStore : ITenantStore, ITransientDependency return tenantConfiguration; } - public async Task FindAsync(Guid id) + public async Task FindAsync(Guid id) { var cacheKey = CreateCacheKey(id); var tenantConfiguration = await Cache.GetOrAddAsync( cacheKey, - async () => CreateTenantConfiguration(await TenantAppService.FindTenantByIdAsync(id)), + async () => CreateTenantConfiguration(await TenantAppService.FindTenantByIdAsync(id))!, () => new DistributedCacheEntryOptions { AbsoluteExpirationRelativeToNow = @@ -57,13 +57,13 @@ public class MauiBlazorRemoteTenantStore : ITenantStore, ITransientDependency return tenantConfiguration; } - public TenantConfiguration Find(string name) + public TenantConfiguration? Find(string name) { var cacheKey = CreateCacheKey(name); var tenantConfiguration = Cache.GetOrAdd( cacheKey, - () => AsyncHelper.RunSync(async () => CreateTenantConfiguration(await TenantAppService.FindTenantByNameAsync(name))), + () => AsyncHelper.RunSync(async () => CreateTenantConfiguration(await TenantAppService.FindTenantByNameAsync(name)))!, () => new DistributedCacheEntryOptions { AbsoluteExpirationRelativeToNow = @@ -74,13 +74,13 @@ public class MauiBlazorRemoteTenantStore : ITenantStore, ITransientDependency return tenantConfiguration; } - public TenantConfiguration Find(Guid id) + public TenantConfiguration? Find(Guid id) { var cacheKey = CreateCacheKey(id); var tenantConfiguration = Cache.GetOrAdd( cacheKey, - () => AsyncHelper.RunSync(async () => CreateTenantConfiguration(await TenantAppService.FindTenantByIdAsync(id))), + () => AsyncHelper.RunSync(async () => CreateTenantConfiguration(await TenantAppService.FindTenantByIdAsync(id)))!, () => new DistributedCacheEntryOptions { AbsoluteExpirationRelativeToNow = @@ -91,14 +91,14 @@ public class MauiBlazorRemoteTenantStore : ITenantStore, ITransientDependency return tenantConfiguration; } - protected virtual TenantConfiguration CreateTenantConfiguration(FindTenantResultDto tenantResultDto) + protected virtual TenantConfiguration? CreateTenantConfiguration(FindTenantResultDto tenantResultDto) { if (!tenantResultDto.Success || tenantResultDto.TenantId == null) { return null; } - return new TenantConfiguration(tenantResultDto.TenantId.Value, tenantResultDto.Name); + return new TenantConfiguration(tenantResultDto.TenantId.Value, tenantResultDto.Name!); } protected virtual string CreateCacheKey(string tenantName) diff --git a/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor/Volo/Abp/AspNetCore/Components/MauiBlazor/MauiBlazorServerUrlProvider.cs b/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor/Volo/Abp/AspNetCore/Components/MauiBlazor/MauiBlazorServerUrlProvider.cs index 1204bfb99b..a93472d3b8 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor/Volo/Abp/AspNetCore/Components/MauiBlazor/MauiBlazorServerUrlProvider.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor/Volo/Abp/AspNetCore/Components/MauiBlazor/MauiBlazorServerUrlProvider.cs @@ -17,7 +17,7 @@ public class MauiBlazorServerUrlProvider : IServerUrlProvider, ITransientDepende RemoteServiceConfigurationProvider = remoteServiceConfigurationProvider; } - public async Task GetBaseUrlAsync(string remoteServiceName = null) + public async Task GetBaseUrlAsync(string? remoteServiceName = null) { var remoteServiceConfiguration = await RemoteServiceConfigurationProvider.GetConfigurationOrDefaultAsync( remoteServiceName ?? RemoteServiceConfigurationDictionary.DefaultName diff --git a/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor/Volo/Abp/AspNetCore/Components/MauiBlazor/NullMauiBlazorSelectedLanguageProvider.cs b/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor/Volo/Abp/AspNetCore/Components/MauiBlazor/NullMauiBlazorSelectedLanguageProvider.cs index b617b96da4..4f1d0504ca 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor/Volo/Abp/AspNetCore/Components/MauiBlazor/NullMauiBlazorSelectedLanguageProvider.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor/Volo/Abp/AspNetCore/Components/MauiBlazor/NullMauiBlazorSelectedLanguageProvider.cs @@ -5,8 +5,8 @@ namespace Volo.Abp.AspNetCore.Components.MauiBlazor; public class NullMauiBlazorSelectedLanguageProvider : IMauiBlazorSelectedLanguageProvider, ITransientDependency { - public Task GetSelectedLanguageAsync() + public Task GetSelectedLanguageAsync() { - return Task.FromResult((string)null); + return Task.FromResult((string?)null); } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Server.Theming/Volo.Abp.AspNetCore.Components.Server.Theming.csproj b/framework/src/Volo.Abp.AspNetCore.Components.Server.Theming/Volo.Abp.AspNetCore.Components.Server.Theming.csproj index c632120d73..266831eba9 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.Server.Theming/Volo.Abp.AspNetCore.Components.Server.Theming.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Components.Server.Theming/Volo.Abp.AspNetCore.Components.Server.Theming.csproj @@ -5,6 +5,8 @@ net7.0 + enable + Nullable true Library true diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Server/Microsoft/AspNetCore/Authentication/Cookies/CookieAuthenticationOptionsExtensions.cs b/framework/src/Volo.Abp.AspNetCore.Components.Server/Microsoft/AspNetCore/Authentication/Cookies/CookieAuthenticationOptionsExtensions.cs index 48065bbac2..ba542312d1 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.Server/Microsoft/AspNetCore/Authentication/Cookies/CookieAuthenticationOptionsExtensions.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components.Server/Microsoft/AspNetCore/Authentication/Cookies/CookieAuthenticationOptionsExtensions.cs @@ -33,7 +33,7 @@ public static class CookieAuthenticationOptionsExtensions var openIdConnectOptions = await GetOpenIdConnectOptions(principalContext, oidcAuthenticationScheme); var response = await openIdConnectOptions.Backchannel.IntrospectTokenAsync(new TokenIntrospectionRequest { - Address = openIdConnectOptions.Configuration?.IntrospectionEndpoint ?? openIdConnectOptions.Authority.EnsureEndsWith('/') + "connect/introspect", + Address = openIdConnectOptions.Configuration?.IntrospectionEndpoint ?? openIdConnectOptions.Authority!.EnsureEndsWith('/') + "connect/introspect", ClientId = openIdConnectOptions.ClientId, ClientSecret = openIdConnectOptions.ClientSecret, Token = accessToken diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Server/Volo.Abp.AspNetCore.Components.Server.csproj b/framework/src/Volo.Abp.AspNetCore.Components.Server/Volo.Abp.AspNetCore.Components.Server.csproj index 297b2a8576..a8cb372ddc 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.Server/Volo.Abp.AspNetCore.Components.Server.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Components.Server/Volo.Abp.AspNetCore.Components.Server.csproj @@ -5,6 +5,8 @@ net7.0 + enable + Nullable true Library true diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Server/Volo/Abp/AspNetCore/Components/Server/Extensibility/BlazorServerLookupApiRequestService.cs b/framework/src/Volo.Abp.AspNetCore.Components.Server/Volo/Abp/AspNetCore/Components/Server/Extensibility/BlazorServerLookupApiRequestService.cs index 355f9fff44..00a5086031 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.Server/Volo/Abp/AspNetCore/Components/Server/Extensibility/BlazorServerLookupApiRequestService.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components.Server/Volo/Abp/AspNetCore/Components/Server/Extensibility/BlazorServerLookupApiRequestService.cs @@ -62,7 +62,7 @@ public class BlazorServerLookupApiRequestService : ILookupApiRequestService, ITr { baseUrl = NavigationManager.BaseUri; client.BaseAddress = new Uri(baseUrl); - foreach (var header in HttpContextAccessor.HttpContext.Request.Headers) + foreach (var header in HttpContextAccessor.HttpContext!.Request.Headers) { requestMessage.Headers.TryAddWithoutValidation(header.Key, header.Value.ToArray()); } diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Components/DynamicLayoutComponent.razor.cs b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Components/DynamicLayoutComponent.razor.cs index 3c4d68178e..4363b674c0 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Components/DynamicLayoutComponent.razor.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Components/DynamicLayoutComponent.razor.cs @@ -6,5 +6,5 @@ namespace Volo.Abp.AspNetCore.Components.Web.Theming.Components; public partial class DynamicLayoutComponent : ComponentBase { [Inject] - protected IOptions AbpDynamicLayoutComponentOptions { get; set; } + protected IOptions AbpDynamicLayoutComponentOptions { get; set; } = default!; } \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Components/LayoutHooks/LayoutHook.razor.cs b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Components/LayoutHooks/LayoutHook.razor.cs index 729b990f34..f5ce191f20 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Components/LayoutHooks/LayoutHook.razor.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Components/LayoutHooks/LayoutHook.razor.cs @@ -10,15 +10,15 @@ namespace Volo.Abp.AspNetCore.Components.Web.Theming.Components.LayoutHooks; public partial class LayoutHook : ComponentBase { [Parameter] - public string Name { get; set; } + public string Name { get; set; } = default!; [Parameter] - public string Layout { get; set; } + public string? Layout { get; set; } [Inject] - protected IOptions LayoutHookOptions { get; set; } + protected IOptions LayoutHookOptions { get; set; } = default!; - protected LayoutHookViewModel LayoutHookViewModel { get; private set; } + protected LayoutHookViewModel LayoutHookViewModel { get; private set; } = default!; protected override Task OnInitializedAsync() { diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Layout/PageHeader.razor.cs b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Layout/PageHeader.razor.cs index ea0b810765..91485d5bf8 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Layout/PageHeader.razor.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Layout/PageHeader.razor.cs @@ -13,13 +13,13 @@ public partial class PageHeader : ComponentBase { protected List ToolbarItemRenders { get; set; } - public IPageToolbarManager PageToolbarManager { get; set; } + public IPageToolbarManager PageToolbarManager { get; set; } = default!; [Inject] - public PageLayout PageLayout { get; private set; } + public PageLayout PageLayout { get; private set; } = default!; [Parameter] // TODO: Consider removing this property in future and use only PageLayout. - public string Title { get => PageLayout.Title; set => PageLayout.Title = value; } + public string? Title { get => PageLayout.Title; set => PageLayout.Title = value; } [Parameter] public bool BreadcrumbShowHome { get; set; } = true; @@ -28,7 +28,7 @@ public partial class PageHeader : ComponentBase public bool BreadcrumbShowCurrent { get; set; } = true; [Parameter] - public RenderFragment ChildContent { get; set; } + public RenderFragment ChildContent { get; set; } = default!; [Parameter] // TODO: Consider removing this property in future and use only PageLayout. public List BreadcrumbItems { @@ -44,7 +44,7 @@ public partial class PageHeader : ComponentBase } [Parameter] - public PageToolbar Toolbar { get; set; } + public PageToolbar? Toolbar { get; set; } public PageHeader() { diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Layout/PageLayout.cs b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Layout/PageLayout.cs index 4d04bd2ad7..077ca5b32c 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Layout/PageLayout.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Layout/PageLayout.cs @@ -9,10 +9,10 @@ namespace Volo.Abp.AspNetCore.Components.Web.Theming.Layout; public class PageLayout : IScopedDependency, INotifyPropertyChanged { - private string title; + private string? title; // TODO: Consider using this property for setting Page Title too. - public virtual string Title { + public virtual string? Title { get => title; set { title = value; @@ -20,9 +20,9 @@ public class PageLayout : IScopedDependency, INotifyPropertyChanged } } - private string menuItemName; + private string? menuItemName; - public string MenuItemName { + public string? MenuItemName { get => menuItemName; set { @@ -35,9 +35,9 @@ public class PageLayout : IScopedDependency, INotifyPropertyChanged public virtual ObservableCollection ToolbarItems { get; } = new(); - public event PropertyChangedEventHandler PropertyChanged; + public event PropertyChangedEventHandler? PropertyChanged; - protected void OnPropertyChanged([CallerMemberName] string propertyName = null) + protected void OnPropertyChanged([CallerMemberName] string? propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/PageToolbars/PageToolbarExtensions.cs b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/PageToolbars/PageToolbarExtensions.cs index 9d9448d281..673c004fdb 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/PageToolbars/PageToolbarExtensions.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/PageToolbars/PageToolbarExtensions.cs @@ -11,9 +11,9 @@ public static class PageToolbarExtensions { public static PageToolbar AddComponent( this PageToolbar toolbar, - Dictionary arguments = null, + Dictionary? arguments = null, int order = 0, - string requiredPolicyName = null) + string? requiredPolicyName = null) { return toolbar.AddComponent( typeof(TComponent), @@ -26,9 +26,9 @@ public static class PageToolbarExtensions public static PageToolbar AddComponent( this PageToolbar toolbar, Type componentType, - Dictionary arguments = null, + Dictionary? arguments = null, int order = 0, - string requiredPolicyName = null) + string? requiredPolicyName = null) { toolbar.Contributors.Add( new SimplePageToolbarContributor( @@ -46,14 +46,14 @@ public static class PageToolbarExtensions this PageToolbar toolbar, string text, Func clicked, - object icon = null, - Color color = null, + object? icon = null, + Color? color = null, bool disabled = false, int order = 0, - string requiredPolicyName = null) + string? requiredPolicyName = null) { toolbar.AddComponent( - new Dictionary + new Dictionary { { nameof(ToolbarButton.Color), color ?? Color.Primary}, { nameof(ToolbarButton.Text), text}, diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/PageToolbars/PageToolbarItem.cs b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/PageToolbars/PageToolbarItem.cs index f62d770403..3e38fb9b1a 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/PageToolbars/PageToolbarItem.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/PageToolbars/PageToolbarItem.cs @@ -9,14 +9,13 @@ public class PageToolbarItem [NotNull] public Type ComponentType { get; } - [CanBeNull] - public Dictionary Arguments { get; set; } + public Dictionary? Arguments { get; set; } public int Order { get; set; } public PageToolbarItem( [NotNull] Type componentType, - [CanBeNull] Dictionary arguments = null, + Dictionary? arguments = null, int order = 0) { ComponentType = Check.NotNull(componentType, nameof(componentType)); diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/PageToolbars/SimplePageToolbarContributor.cs b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/PageToolbars/SimplePageToolbarContributor.cs index d31b12e73c..647538c121 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/PageToolbars/SimplePageToolbarContributor.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/PageToolbars/SimplePageToolbarContributor.cs @@ -10,17 +10,17 @@ public class SimplePageToolbarContributor : IPageToolbarContributor { public Type ComponentType { get; } - public Dictionary Arguments { get; set; } + public Dictionary? Arguments { get; set; } public int Order { get; } - public string RequiredPolicyName { get; } + public string? RequiredPolicyName { get; } public SimplePageToolbarContributor( Type componentType, - Dictionary arguments = null, + Dictionary? arguments = null, int order = 0, - string requiredPolicyName = null) + string? requiredPolicyName = null) { ComponentType = componentType; Arguments = arguments; diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Routing/AbpRouterOptions.cs b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Routing/AbpRouterOptions.cs index ce3b2746e4..9c21e9485d 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Routing/AbpRouterOptions.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Routing/AbpRouterOptions.cs @@ -4,7 +4,7 @@ namespace Volo.Abp.AspNetCore.Components.Web.Theming.Routing; public class AbpRouterOptions { - public Assembly AppAssembly { get; set; } + public Assembly AppAssembly { get; set; } = default!; public RouterAssemblyList AdditionalAssemblies { get; } diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Theming/AbpThemingOptions.cs b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Theming/AbpThemingOptions.cs index 6bba37e0f8..71b0d8bb35 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Theming/AbpThemingOptions.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Theming/AbpThemingOptions.cs @@ -4,7 +4,7 @@ public class AbpThemingOptions { public ThemeDictionary Themes { get; } - public string DefaultThemeName { get; set; } + public string? DefaultThemeName { get; set; } public AbpThemingOptions() { diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Theming/DefaultThemeManager.cs b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Theming/DefaultThemeManager.cs index c85a25bf19..5abd114f83 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Theming/DefaultThemeManager.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Theming/DefaultThemeManager.cs @@ -9,7 +9,7 @@ public class DefaultThemeManager : IThemeManager, IScopedDependency, IServicePro public IServiceProvider ServiceProvider { get; } public ITheme CurrentTheme => GetCurrentTheme(); - private ITheme _currentTheme; + private ITheme? _currentTheme; protected IThemeSelector ThemeSelector { get; } diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Toolbars/IToolbarConfigurationContext.cs b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Toolbars/IToolbarConfigurationContext.cs index e2bfaf06d0..23c565eb5f 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Toolbars/IToolbarConfigurationContext.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Toolbars/IToolbarConfigurationContext.cs @@ -17,8 +17,7 @@ public interface IToolbarConfigurationContext : IServiceProviderAccessor Task IsGrantedAsync(string policyName); - [CanBeNull] - IStringLocalizer GetDefaultLocalizer(); + IStringLocalizer? GetDefaultLocalizer(); [NotNull] public IStringLocalizer GetLocalizer(); diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Toolbars/ToolbarConfigurationContext.cs b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Toolbars/ToolbarConfigurationContext.cs index f773ba14e1..7870743851 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Toolbars/ToolbarConfigurationContext.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Toolbars/ToolbarConfigurationContext.cs @@ -32,8 +32,7 @@ public class ToolbarConfigurationContext : IToolbarConfigurationContext return AuthorizationService.IsGrantedAsync(policyName); } - [CanBeNull] - public IStringLocalizer GetDefaultLocalizer() + public IStringLocalizer? GetDefaultLocalizer() { return StringLocalizerFactory.CreateDefaultOrNull(); } diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Toolbars/ToolbarItem.cs b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Toolbars/ToolbarItem.cs index 966145a4ee..32816d7a3b 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Toolbars/ToolbarItem.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Toolbars/ToolbarItem.cs @@ -9,7 +9,7 @@ public class ToolbarItem get => _componentType; set => _componentType = Check.NotNull(value, nameof(value)); } - private Type _componentType; + private Type _componentType = default!; public int Order { get; set; } diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Volo.Abp.AspNetCore.Components.Web.Theming.csproj b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Volo.Abp.AspNetCore.Components.Web.Theming.csproj index d0abc31cdc..1dd5b61131 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Volo.Abp.AspNetCore.Components.Web.Theming.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Volo.Abp.AspNetCore.Components.Web.Theming.csproj @@ -5,6 +5,8 @@ net7.0 + enable + Nullable diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo.Abp.AspNetCore.Components.Web.csproj b/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo.Abp.AspNetCore.Components.Web.csproj index bc975f9f92..7f89d1c254 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo.Abp.AspNetCore.Components.Web.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo.Abp.AspNetCore.Components.Web.csproj @@ -5,6 +5,8 @@ net7.0 + enable + Nullable diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/AbpBlazorClientHttpMessageHandler.cs b/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/AbpBlazorClientHttpMessageHandler.cs index eb8bee99bd..c92c121628 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/AbpBlazorClientHttpMessageHandler.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/AbpBlazorClientHttpMessageHandler.cs @@ -82,7 +82,7 @@ public class AbpBlazorClientHttpMessageHandler : DelegatingHandler, ITransientDe var selfUri = new Uri(_navigationManager.Uri); - if (request.RequestUri.Host != selfUri.Host || request.RequestUri.Port != selfUri.Port) + if (request.RequestUri!.Host != selfUri.Host || request.RequestUri.Port != selfUri.Port) { return; } diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/AbpBlazorMessageLocalizerHelper.cs b/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/AbpBlazorMessageLocalizerHelper.cs index 52efbc6d11..dc0a2182cb 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/AbpBlazorMessageLocalizerHelper.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/AbpBlazorMessageLocalizerHelper.cs @@ -14,12 +14,12 @@ public class AbpBlazorMessageLocalizerHelper this.stringLocalizer = stringLocalizer; } - public string Localize(string message, [CanBeNull] IEnumerable arguments) + public string Localize(string message, IEnumerable? arguments) { try { return arguments?.Count() > 0 - ? stringLocalizer[message, LocalizeMessageArguments(arguments)?.ToArray()] + ? stringLocalizer[message, LocalizeMessageArguments(arguments)?.ToArray()!] : stringLocalizer[message]; } catch diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/CookieOptions.cs b/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/CookieOptions.cs index 283f665642..d8a5ec3a1a 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/CookieOptions.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/CookieOptions.cs @@ -5,6 +5,6 @@ namespace Volo.Abp.AspNetCore.Components.Web; public class CookieOptions { public DateTimeOffset? ExpireDate { get; set; } - public string Path { get; set; } + public string? Path { get; set; } public bool Secure { get; set; } } diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/CookieService.cs b/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/CookieService.cs index 1b61acb459..a3868d5b2e 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/CookieService.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/CookieService.cs @@ -14,7 +14,7 @@ public class CookieService : ICookieService, ITransientDependency JsRuntime = jsRuntime; } - public async ValueTask SetAsync(string key, string value, CookieOptions options) + public async ValueTask SetAsync(string key, string value, CookieOptions? options) { await JsRuntime.InvokeVoidAsync("abp.utils.setCookieValue", key, value, options?.ExpireDate?.ToString("r"), options?.Path, options?.Secure); } @@ -24,7 +24,7 @@ public class CookieService : ICookieService, ITransientDependency return await JsRuntime.InvokeAsync("abp.utils.getCookieValue", key); } - public async ValueTask DeleteAsync(string key, string path = null) + public async ValueTask DeleteAsync(string key, string? path = null) { await JsRuntime.InvokeVoidAsync("abp.utils.deleteCookie", key); } diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/DefaultServerUrlProvider.cs b/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/DefaultServerUrlProvider.cs index 281ee3cd73..aae5f1f98b 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/DefaultServerUrlProvider.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/DefaultServerUrlProvider.cs @@ -5,7 +5,7 @@ namespace Volo.Abp.AspNetCore.Components.Web; public class DefaultServerUrlProvider : IServerUrlProvider, ISingletonDependency { - public Task GetBaseUrlAsync(string remoteServiceName = null) + public Task GetBaseUrlAsync(string? remoteServiceName = null) { return Task.FromResult("/"); } diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/DependencyInjection/ComponentsClientScopeServiceProviderAccessor.cs b/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/DependencyInjection/ComponentsClientScopeServiceProviderAccessor.cs index f5e07865a7..2311a2c9f9 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/DependencyInjection/ComponentsClientScopeServiceProviderAccessor.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/DependencyInjection/ComponentsClientScopeServiceProviderAccessor.cs @@ -7,5 +7,5 @@ public class ComponentsClientScopeServiceProviderAccessor : IClientScopeServiceProviderAccessor, ISingletonDependency { - public IServiceProvider ServiceProvider { get; set; } + public IServiceProvider ServiceProvider { get; set; } = default!; } diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/ExceptionHandling/AbpExceptionHandlingLogger.cs b/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/ExceptionHandling/AbpExceptionHandlingLogger.cs index cf66f107a0..ba56233ec5 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/ExceptionHandling/AbpExceptionHandlingLogger.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/ExceptionHandling/AbpExceptionHandlingLogger.cs @@ -8,7 +8,7 @@ namespace Volo.Abp.AspNetCore.Components.Web.ExceptionHandling; public class AbpExceptionHandlingLogger : ILogger { private readonly IServiceCollection _serviceCollection; - private IUserExceptionInformer _userExceptionInformer; + private IUserExceptionInformer? _userExceptionInformer; public AbpExceptionHandlingLogger(IServiceCollection serviceCollection) { @@ -19,7 +19,7 @@ public class AbpExceptionHandlingLogger : ILogger LogLevel logLevel, EventId eventId, TState state, - Exception exception, + Exception? exception, Func formatter) { if (exception == null) @@ -58,7 +58,7 @@ public class AbpExceptionHandlingLogger : ILogger return logLevel == LogLevel.Critical || logLevel == LogLevel.Error; } - public virtual IDisposable BeginScope(TState state) + public virtual IDisposable? BeginScope(TState state) where TState : notnull { return NullDisposable.Instance; } diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/ExceptionHandling/AbpExceptionHandlingLoggerProvider.cs b/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/ExceptionHandling/AbpExceptionHandlingLoggerProvider.cs index 3f895502fa..d13fd5a751 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/ExceptionHandling/AbpExceptionHandlingLoggerProvider.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/ExceptionHandling/AbpExceptionHandlingLoggerProvider.cs @@ -5,7 +5,7 @@ namespace Volo.Abp.AspNetCore.Components.Web.ExceptionHandling; public class AbpExceptionHandlingLoggerProvider : ILoggerProvider { - private AbpExceptionHandlingLogger _logger; + private AbpExceptionHandlingLogger? _logger; private static readonly object SyncObj = new object(); private readonly IServiceCollection _serviceCollection; diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/ExceptionHandling/UserExceptionInformer.cs b/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/ExceptionHandling/UserExceptionInformer.cs index 0f0da11bdf..6773e4ff37 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/ExceptionHandling/UserExceptionInformer.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/ExceptionHandling/UserExceptionInformer.cs @@ -39,11 +39,11 @@ public class UserExceptionInformer : IUserExceptionInformer, IScopedDependency if (errorInfo.Details.IsNullOrEmpty()) { - MessageService.Error(errorInfo.Message); + MessageService.Error(errorInfo.Message!); } else { - MessageService.Error(errorInfo.Details, errorInfo.Message); + MessageService.Error(errorInfo.Details!, errorInfo.Message); } } @@ -53,11 +53,11 @@ public class UserExceptionInformer : IUserExceptionInformer, IScopedDependency if (errorInfo.Details.IsNullOrEmpty()) { - await MessageService.Error(errorInfo.Message); + await MessageService.Error(errorInfo.Message!); } else { - await MessageService.Error(errorInfo.Details, errorInfo.Message); + await MessageService.Error(errorInfo.Details!, errorInfo.Message); } } diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/Extensibility/EntityActions/EntityAction.cs b/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/Extensibility/EntityActions/EntityAction.cs index 837eb2c96a..56bcf3d543 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/Extensibility/EntityActions/EntityAction.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/Extensibility/EntityActions/EntityAction.cs @@ -5,15 +5,15 @@ namespace Volo.Abp.AspNetCore.Components.Web.Extensibility.EntityActions; public class EntityAction : IEquatable { - public string Text { get; set; } - public Func Clicked { get; set; } - public Func ConfirmationMessage { get; set; } + public string Text { get; set; } = default!; + public Func Clicked { get; set; } = default!; + public Func? ConfirmationMessage { get; set; } public bool Primary { get; set; } - public object Color { get; set; } - public string Icon { get; set; } - public Func Visible { get; set; } + public object? Color { get; set; } + public string? Icon { get; set; } + public Func? Visible { get; set; } public bool Disabled { get; set; } - public bool Equals(EntityAction other) + public bool Equals(EntityAction? other) { return string.Equals(Text, other?.Text, StringComparison.OrdinalIgnoreCase); } diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/Extensibility/EntityActions/EntityActionDictionary.cs b/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/Extensibility/EntityActions/EntityActionDictionary.cs index 0781870b69..8f638baff6 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/Extensibility/EntityActions/EntityActionDictionary.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/Extensibility/EntityActions/EntityActionDictionary.cs @@ -6,6 +6,6 @@ public class EntityActionDictionary : Dictionary> { public List Get() { - return this.GetOrAdd(typeof(T).FullName, () => new List()); + return this.GetOrAdd(typeof(T).FullName!, () => new List()); } } diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/Extensibility/TableColumns/TableColumn.cs b/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/Extensibility/TableColumns/TableColumn.cs index aa48ad633b..efd1d9320b 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/Extensibility/TableColumns/TableColumn.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/Extensibility/TableColumns/TableColumn.cs @@ -8,23 +8,20 @@ namespace Volo.Abp.AspNetCore.Components.Web.Extensibility.TableColumns; public class TableColumn { - public string Title { get; set; } - public string Data { get; set; } + public string Title { get; set; } = default!; + public string Data { get; set; } = default!; - public string PropertyName { get; set; } + public string PropertyName { get; set; } = default!; - [CanBeNull] - public string DisplayFormat { get; set; } + public string? DisplayFormat { get; set; } public IFormatProvider DisplayFormatProvider { get; set; } = CultureInfo.CurrentCulture; - [CanBeNull] - public Type Component { get; set; } + public Type? Component { get; set; } public List Actions { get; set; } - [CanBeNull] - public Func ValueConverter { get; set; } + public Func? ValueConverter { get; set; } public bool Sortable { get; set; } diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/Extensibility/TableColumns/TableColumnDictionary.cs b/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/Extensibility/TableColumns/TableColumnDictionary.cs index 7eda70177c..67616eb061 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/Extensibility/TableColumns/TableColumnDictionary.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/Extensibility/TableColumns/TableColumnDictionary.cs @@ -6,6 +6,6 @@ public class TableColumnDictionary : Dictionary> { public List Get() { - return this.GetOrAdd(typeof(T).FullName, () => new List()); + return this.GetOrAdd(typeof(T).FullName!, () => new List()); } } diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/ICookieService.cs b/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/ICookieService.cs index afb124644e..393088fd6c 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/ICookieService.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/ICookieService.cs @@ -4,7 +4,7 @@ namespace Volo.Abp.AspNetCore.Components.Web; public interface ICookieService { - public ValueTask SetAsync(string key, string value, CookieOptions options = null); + public ValueTask SetAsync(string key, string value, CookieOptions? options = null); public ValueTask GetAsync(string key); - public ValueTask DeleteAsync(string key, string path = null); + public ValueTask DeleteAsync(string key, string? path = null); } diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/IServerUrlProvider.cs b/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/IServerUrlProvider.cs index f5266a9f18..76c261ea80 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/IServerUrlProvider.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/IServerUrlProvider.cs @@ -4,5 +4,5 @@ namespace Volo.Abp.AspNetCore.Components.Web; public interface IServerUrlProvider { - Task GetBaseUrlAsync(string remoteServiceName = null); + Task GetBaseUrlAsync(string? remoteServiceName = null); } diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/Messages/SimpleUiMessageService.cs b/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/Messages/SimpleUiMessageService.cs index 647be65b41..91c1648cd2 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/Messages/SimpleUiMessageService.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/Messages/SimpleUiMessageService.cs @@ -15,27 +15,27 @@ public class SimpleUiMessageService : IUiMessageService, ITransientDependency JsRuntime = jsRuntime; } - public async Task Info(string message, string title = null, Action options = null) + public async Task Info(string message, string? title = null, Action? options = null) { await JsRuntime.InvokeVoidAsync("alert", message); } - public async Task Success(string message, string title = null, Action options = null) + public async Task Success(string message, string? title = null, Action? options = null) { await JsRuntime.InvokeVoidAsync("alert", message); } - public async Task Warn(string message, string title = null, Action options = null) + public async Task Warn(string message, string? title = null, Action? options = null) { await JsRuntime.InvokeVoidAsync("alert", message); } - public async Task Error(string message, string title = null, Action options = null) + public async Task Error(string message, string? title = null, Action? options = null) { await JsRuntime.InvokeVoidAsync("alert", message); } - public async Task Confirm(string message, string title = null, Action options = null) + public async Task Confirm(string message, string? title = null, Action? options = null) { return await JsRuntime.InvokeAsync("confirm", message); } diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/Security/AbpComponentsClaimsCache.cs b/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/Security/AbpComponentsClaimsCache.cs index 7473387f83..74cbd37e29 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/Security/AbpComponentsClaimsCache.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/Security/AbpComponentsClaimsCache.cs @@ -9,10 +9,9 @@ namespace Volo.Abp.AspNetCore.Components.Web.Security; public class AbpComponentsClaimsCache : IScopedDependency { - public ClaimsPrincipal Principal { get; private set; } + public ClaimsPrincipal Principal { get; private set; } = default!; - [CanBeNull] - private readonly AuthenticationStateProvider _authenticationStateProvider; + private readonly AuthenticationStateProvider? _authenticationStateProvider; public AbpComponentsClaimsCache( IClientScopeServiceProviderAccessor serviceProviderAccessor) diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/Security/ApplicationConfigurationChangedService.cs b/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/Security/ApplicationConfigurationChangedService.cs index 9803a7991d..15aeb7eedb 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/Security/ApplicationConfigurationChangedService.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/Security/ApplicationConfigurationChangedService.cs @@ -6,7 +6,7 @@ public delegate void ApplicationConfigurationChangedHandler(); public class ApplicationConfigurationChangedService : IScopedDependency { - public event ApplicationConfigurationChangedHandler Changed; + public event ApplicationConfigurationChangedHandler Changed = default!; public void NotifyChanged() { diff --git a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.Theming/Volo.Abp.AspNetCore.Components.WebAssembly.Theming.csproj b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.Theming/Volo.Abp.AspNetCore.Components.WebAssembly.Theming.csproj index e310f4a2e2..06a5276ec0 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.Theming/Volo.Abp.AspNetCore.Components.WebAssembly.Theming.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.Theming/Volo.Abp.AspNetCore.Components.WebAssembly.Theming.csproj @@ -5,6 +5,8 @@ net7.0 + enable + Nullable diff --git a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Microsoft/Extensions/DependencyInjection/EmptyWebAssemblyHostEnvironment.cs b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Microsoft/Extensions/DependencyInjection/EmptyWebAssemblyHostEnvironment.cs index 6393948af7..f06bb37911 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Microsoft/Extensions/DependencyInjection/EmptyWebAssemblyHostEnvironment.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Microsoft/Extensions/DependencyInjection/EmptyWebAssemblyHostEnvironment.cs @@ -4,7 +4,7 @@ namespace Microsoft.Extensions.DependencyInjection; public class EmptyWebAssemblyHostEnvironment : IWebAssemblyHostEnvironment { - public string Environment { get; set; } + public string Environment { get; set; } = default!; - public string BaseAddress { get; set; } + public string BaseAddress { get; set; } = default!; } diff --git a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo.Abp.AspNetCore.Components.WebAssembly.csproj b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo.Abp.AspNetCore.Components.WebAssembly.csproj index 4618f31b6c..408844627e 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo.Abp.AspNetCore.Components.WebAssembly.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo.Abp.AspNetCore.Components.WebAssembly.csproj @@ -5,6 +5,8 @@ net7.0 + enable + Nullable Volo.Abp.AspNetCore.Components.WebAssembly Volo.Abp.AspNetCore.Components.WebAssembly $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/AbpAspNetCoreComponentsWebAssemblyModule.cs b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/AbpAspNetCoreComponentsWebAssemblyModule.cs index 2657e5bca7..b16286c19f 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/AbpAspNetCoreComponentsWebAssemblyModule.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/AbpAspNetCoreComponentsWebAssemblyModule.cs @@ -67,7 +67,7 @@ public class AbpAspNetCoreComponentsWebAssemblyModule : AbpModule var cultureName = configuration.Localization?.CurrentCulture?.CultureName; if (!cultureName.IsNullOrEmpty()) { - var culture = new CultureInfo(cultureName); + var culture = new CultureInfo(cultureName!); CultureInfo.DefaultThreadCurrentCulture = culture; CultureInfo.DefaultThreadCurrentUICulture = culture; } diff --git a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/ApplicationConfigurationCache.cs b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/ApplicationConfigurationCache.cs index b55d8d8a56..3d2c64ff4e 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/ApplicationConfigurationCache.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/ApplicationConfigurationCache.cs @@ -5,9 +5,9 @@ namespace Volo.Abp.AspNetCore.Components.WebAssembly; public class ApplicationConfigurationCache : ISingletonDependency { - protected ApplicationConfigurationDto Configuration { get; set; } + protected ApplicationConfigurationDto? Configuration { get; set; } - public virtual ApplicationConfigurationDto Get() + public virtual ApplicationConfigurationDto? Get() { return Configuration; } diff --git a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/WebAssemblyCurrentTenantAccessor.cs b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/WebAssemblyCurrentTenantAccessor.cs index e24746f85a..92ba34c4be 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/WebAssemblyCurrentTenantAccessor.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/WebAssemblyCurrentTenantAccessor.cs @@ -6,5 +6,5 @@ namespace Volo.Abp.AspNetCore.Components.WebAssembly; [Dependency(ReplaceServices = true)] public class WebAssemblyCurrentTenantAccessor : ICurrentTenantAccessor, ISingletonDependency { - public BasicTenantInfo Current { get; set; } + public BasicTenantInfo? Current { get; set; } } diff --git a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/WebAssemblyServerUrlProvider.cs b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/WebAssemblyServerUrlProvider.cs index 2fb133a10d..b74f5a1900 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/WebAssemblyServerUrlProvider.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/WebAssemblyServerUrlProvider.cs @@ -17,7 +17,7 @@ public class WebAssemblyServerUrlProvider : IServerUrlProvider, ITransientDepend RemoteServiceConfigurationProvider = remoteServiceConfigurationProvider; } - public async Task GetBaseUrlAsync(string remoteServiceName = null) + public async Task GetBaseUrlAsync(string? remoteServiceName = null) { var remoteServiceConfiguration = await RemoteServiceConfigurationProvider.GetConfigurationOrDefaultAsync( remoteServiceName ?? RemoteServiceConfigurationDictionary.DefaultName diff --git a/framework/src/Volo.Abp.AspNetCore.Components/Volo.Abp.AspNetCore.Components.csproj b/framework/src/Volo.Abp.AspNetCore.Components/Volo.Abp.AspNetCore.Components.csproj index 95c23d34ad..865ccb9f75 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components/Volo.Abp.AspNetCore.Components.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Components/Volo.Abp.AspNetCore.Components.csproj @@ -5,6 +5,8 @@ net7.0 + enable + Nullable Volo.Abp.AspNetCore.Components Volo.Abp.AspNetCore.Components $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/AbpComponentBase.cs b/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/AbpComponentBase.cs index dc1923f180..6f2df20de8 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/AbpComponentBase.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/AbpComponentBase.cs @@ -20,8 +20,8 @@ namespace Volo.Abp.AspNetCore.Components; public abstract class AbpComponentBase : OwningComponentBase { - protected IStringLocalizerFactory StringLocalizerFactory => LazyGetRequiredService(ref _stringLocalizerFactory); - private IStringLocalizerFactory _stringLocalizerFactory; + protected IStringLocalizerFactory StringLocalizerFactory => LazyGetRequiredService(ref _stringLocalizerFactory)!; + private IStringLocalizerFactory? _stringLocalizerFactory; protected IStringLocalizer L { get { @@ -33,46 +33,46 @@ public abstract class AbpComponentBase : OwningComponentBase return _localizer; } } - private IStringLocalizer _localizer; + private IStringLocalizer? _localizer; - protected Type LocalizationResource { + protected Type? LocalizationResource { get => _localizationResource; set { _localizationResource = value; _localizer = null; } } - private Type _localizationResource = typeof(DefaultResource); + private Type? _localizationResource = typeof(DefaultResource); protected ILogger Logger => _lazyLogger.Value; - private Lazy _lazyLogger => new Lazy(() => LoggerFactory?.CreateLogger(GetType().FullName) ?? NullLogger.Instance, true); + private Lazy _lazyLogger => new Lazy(() => LoggerFactory?.CreateLogger(GetType().FullName!) ?? NullLogger.Instance, true); - protected ILoggerFactory LoggerFactory => LazyGetRequiredService(ref _loggerFactory); - private ILoggerFactory _loggerFactory; + protected ILoggerFactory LoggerFactory => LazyGetRequiredService(ref _loggerFactory)!; + private ILoggerFactory? _loggerFactory; - protected IAuthorizationService AuthorizationService => LazyGetRequiredService(ref _authorizationService); - private IAuthorizationService _authorizationService; + protected IAuthorizationService AuthorizationService => LazyGetRequiredService(ref _authorizationService)!; + private IAuthorizationService? _authorizationService; - protected ICurrentUser CurrentUser => LazyGetRequiredService(ref _currentUser); - private ICurrentUser _currentUser; + protected ICurrentUser CurrentUser => LazyGetRequiredService(ref _currentUser)!; + private ICurrentUser? _currentUser; - protected ICurrentTenant CurrentTenant => LazyGetRequiredService(ref _currentTenant); - private ICurrentTenant _currentTenant; + protected ICurrentTenant CurrentTenant => LazyGetRequiredService(ref _currentTenant)!; + private ICurrentTenant? _currentTenant; - protected IUiMessageService Message => LazyGetNonScopedRequiredService(ref _message); - private IUiMessageService _message; + protected IUiMessageService Message => LazyGetNonScopedRequiredService(ref _message)!; + private IUiMessageService? _message; - protected IUiNotificationService Notify => LazyGetNonScopedRequiredService(ref _notify); - private IUiNotificationService _notify; + protected IUiNotificationService Notify => LazyGetNonScopedRequiredService(ref _notify)!; + private IUiNotificationService? _notify; - protected IUserExceptionInformer UserExceptionInformer => LazyGetNonScopedRequiredService(ref _userExceptionInformer); - private IUserExceptionInformer _userExceptionInformer; + protected IUserExceptionInformer UserExceptionInformer => LazyGetNonScopedRequiredService(ref _userExceptionInformer)!; + private IUserExceptionInformer? _userExceptionInformer; - protected IAlertManager AlertManager => LazyGetNonScopedRequiredService(ref _alertManager); - private IAlertManager _alertManager; + protected IAlertManager AlertManager => LazyGetNonScopedRequiredService(ref _alertManager)!; + private IAlertManager? _alertManager; - protected IClock Clock => LazyGetNonScopedRequiredService(ref _clock); - private IClock _clock; + protected IClock Clock => LazyGetNonScopedRequiredService(ref _clock)!; + private IClock? _clock; protected AlertList Alerts => AlertManager.Alerts; @@ -85,19 +85,19 @@ public abstract class AbpComponentBase : OwningComponentBase if (ObjectMapperContext == null) { - return LazyGetRequiredService(ref _objectMapper); + return LazyGetRequiredService(ref _objectMapper)!; } return LazyGetRequiredService( typeof(IObjectMapper<>).MakeGenericType(ObjectMapperContext), ref _objectMapper - ); + )!; } } - private IObjectMapper _objectMapper; + private IObjectMapper? _objectMapper; - protected Type ObjectMapperContext { get; set; } + protected Type? ObjectMapperContext { get; set; } protected TService LazyGetRequiredService(ref TService reference) => LazyGetRequiredService(typeof(TService), ref reference); @@ -111,13 +111,13 @@ public abstract class AbpComponentBase : OwningComponentBase return reference; } - protected TService LazyGetService(ref TService reference) => LazyGetService(typeof(TService), ref reference); + protected TService? LazyGetService(ref TService? reference) => LazyGetService(typeof(TService), ref reference); - protected TRef LazyGetService(Type serviceType, ref TRef reference) + protected TRef? LazyGetService(Type serviceType, ref TRef? reference) { if (reference == null) { - reference = (TRef)ScopedServices.GetService(serviceType); + reference = (TRef?)ScopedServices.GetService(serviceType); } return reference; @@ -135,20 +135,20 @@ public abstract class AbpComponentBase : OwningComponentBase return reference; } - protected TService LazyGetNonScopedService(ref TService reference) => LazyGetNonScopedService(typeof(TService), ref reference); + protected TService? LazyGetNonScopedService(ref TService? reference) => LazyGetNonScopedService(typeof(TService), ref reference); - protected TRef LazyGetNonScopedService(Type serviceType, ref TRef reference) + protected TRef? LazyGetNonScopedService(Type serviceType, ref TRef? reference) { if (reference == null) { - reference = (TRef)NonScopedServices.GetService(serviceType); + reference = (TRef?)NonScopedServices.GetService(serviceType); } return reference; } [Inject] - protected IServiceProvider NonScopedServices { get; set; } + protected IServiceProvider NonScopedServices { get; set; } = default!; protected virtual IStringLocalizer CreateLocalizer() { @@ -168,6 +168,11 @@ public abstract class AbpComponentBase : OwningComponentBase protected virtual async Task HandleErrorAsync(Exception exception) { + if (IsDisposed) + { + return; + } + Logger.LogException(exception); await InvokeAsync(async () => { diff --git a/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Alerts/AlertList.cs b/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Alerts/AlertList.cs index 6ea0031352..f450033b01 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Alerts/AlertList.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Alerts/AlertList.cs @@ -9,27 +9,27 @@ namespace Volo.Abp.AspNetCore.Components.Alerts; public class AlertList : ObservableCollection { - public void Add(AlertType type, string text, string title = null, bool dismissible = true) + public void Add(AlertType type, string text, string? title = null, bool dismissible = true) { Add(new AlertMessage(type, text, title, dismissible)); } - public void Info(string text, string title = null, bool dismissible = true) + public void Info(string text, string? title = null, bool dismissible = true) { Add(new AlertMessage(AlertType.Info, text, title, dismissible)); } - public void Warning(string text, string title = null, bool dismissible = true) + public void Warning(string text, string? title = null, bool dismissible = true) { Add(new AlertMessage(AlertType.Warning, text, title, dismissible)); } - public void Danger(string text, string title = null, bool dismissible = true) + public void Danger(string text, string? title = null, bool dismissible = true) { Add(new AlertMessage(AlertType.Danger, text, title, dismissible)); } - public void Success(string text, string title = null, bool dismissible = true) + public void Success(string text, string? title = null, bool dismissible = true) { Add(new AlertMessage(AlertType.Success, text, title, dismissible)); } diff --git a/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Alerts/AlertMessage.cs b/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Alerts/AlertMessage.cs index 7a38e422a0..15de91599b 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Alerts/AlertMessage.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Alerts/AlertMessage.cs @@ -9,16 +9,15 @@ public class AlertMessage get => _text; set => _text = Check.NotNullOrWhiteSpace(value, nameof(value)); } - private string _text; + private string _text = default!; public AlertType Type { get; set; } - [CanBeNull] - public string Title { get; set; } + public string? Title { get; set; } public bool Dismissible { get; set; } - public AlertMessage(AlertType type, [NotNull] string text, string title = null, bool dismissible = true) + public AlertMessage(AlertType type, [NotNull] string text, string? title = null, bool dismissible = true) { Type = type; Text = Check.NotNullOrWhiteSpace(text, nameof(text)); diff --git a/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Messages/IUiMessageService.cs b/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Messages/IUiMessageService.cs index 86e878d2a9..9e8d65fdde 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Messages/IUiMessageService.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Messages/IUiMessageService.cs @@ -5,13 +5,13 @@ namespace Volo.Abp.AspNetCore.Components.Messages; public interface IUiMessageService { - Task Info(string message, string title = null, Action options = null); + Task Info(string message, string? title = null, Action? options = null); - Task Success(string message, string title = null, Action options = null); + Task Success(string message, string? title = null, Action? options = null); - Task Warn(string message, string title = null, Action options = null); + Task Warn(string message, string? title = null, Action? options = null); - Task Error(string message, string title = null, Action options = null); + Task Error(string message, string? title = null, Action? options = null); - Task Confirm(string message, string title = null, Action options = null); + Task Confirm(string message, string? title = null, Action? options = null); } diff --git a/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Messages/UiMessageEventArgs.cs b/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Messages/UiMessageEventArgs.cs index 4d73fb2812..45bb66aaac 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Messages/UiMessageEventArgs.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Messages/UiMessageEventArgs.cs @@ -5,7 +5,7 @@ namespace Volo.Abp.AspNetCore.Components.Messages; public class UiMessageEventArgs : EventArgs { - public UiMessageEventArgs(UiMessageType messageType, string message, string title, UiMessageOptions options) + public UiMessageEventArgs(UiMessageType messageType, string message, string? title, UiMessageOptions options) { MessageType = messageType; Message = message; @@ -13,7 +13,7 @@ public class UiMessageEventArgs : EventArgs Options = options; } - public UiMessageEventArgs(UiMessageType messageType, string message, string title, UiMessageOptions options, TaskCompletionSource callback) + public UiMessageEventArgs(UiMessageType messageType, string message, string? title, UiMessageOptions options, TaskCompletionSource callback) { MessageType = messageType; Message = message; @@ -26,9 +26,9 @@ public class UiMessageEventArgs : EventArgs public string Message { get; } - public string Title { get; } + public string? Title { get; } public UiMessageOptions Options { get; } - public TaskCompletionSource Callback { get; } + public TaskCompletionSource Callback { get; } = default!; } diff --git a/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Messages/UiMessageOptions.cs b/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Messages/UiMessageOptions.cs index 5cb8e56eee..a13029a580 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Messages/UiMessageOptions.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Messages/UiMessageOptions.cs @@ -18,35 +18,35 @@ public class UiMessageOptions /// /// Overrides the build-in message icon. /// - public object MessageIcon { get; set; } + public object? MessageIcon { get; set; } /// /// Custom text for the Ok button. /// - public string OkButtonText { get; set; } + public string? OkButtonText { get; set; } /// /// Custom icon for the Ok button. /// - public object OkButtonIcon { get; set; } + public object? OkButtonIcon { get; set; } /// /// Custom text for the Confirmation button. /// - public string ConfirmButtonText { get; set; } + public string? ConfirmButtonText { get; set; } /// /// Custom icon for the Confirmation button. /// - public object ConfirmButtonIcon { get; set; } + public object? ConfirmButtonIcon { get; set; } /// /// Custom text for the Cancel button. /// - public string CancelButtonText { get; set; } + public string? CancelButtonText { get; set; } /// /// Custom icon for the Cancel button. /// - public object CancelButtonIcon { get; set; } + public object? CancelButtonIcon { get; set; } } diff --git a/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Notifications/IUiNotificationService.cs b/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Notifications/IUiNotificationService.cs index 394fdec2a7..d637943af0 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Notifications/IUiNotificationService.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Notifications/IUiNotificationService.cs @@ -5,11 +5,11 @@ namespace Volo.Abp.AspNetCore.Components.Notifications; public interface IUiNotificationService { - Task Info(string message, string title = null, Action options = null); + Task Info(string message, string? title = null, Action? options = null); - Task Success(string message, string title = null, Action options = null); + Task Success(string message, string? title = null, Action? options = null); - Task Warn(string message, string title = null, Action options = null); + Task Warn(string message, string? title = null, Action? options = null); - Task Error(string message, string title = null, Action options = null); + Task Error(string message, string? title = null, Action? options = null); } diff --git a/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Notifications/NullUiNotificationService.cs b/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Notifications/NullUiNotificationService.cs index 6c47586325..e75b1f3524 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Notifications/NullUiNotificationService.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Notifications/NullUiNotificationService.cs @@ -6,21 +6,21 @@ namespace Volo.Abp.AspNetCore.Components.Notifications; public class NullUiNotificationService : IUiNotificationService, ITransientDependency { - public Task Info(string message, string title = null, Action options = null) + public Task Info(string message, string? title = null, Action? options = null) { return Task.CompletedTask; } - public Task Success(string message, string title = null, Action options = null) + public Task Success(string message, string? title = null, Action? options = null) { return Task.CompletedTask; } - public Task Warn(string message, string title = null, Action options = null) + public Task Warn(string message, string? title = null, Action? options = null) { return Task.CompletedTask; } - public Task Error(string message, string title = null, Action options = null) + public Task Error(string message, string? title = null, Action? options = null) { return Task.CompletedTask; } diff --git a/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Notifications/UiNotificationEventArgs.cs b/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Notifications/UiNotificationEventArgs.cs index 554450d025..c12f7a0f06 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Notifications/UiNotificationEventArgs.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Notifications/UiNotificationEventArgs.cs @@ -4,7 +4,7 @@ namespace Volo.Abp.AspNetCore.Components.Notifications; public class UiNotificationEventArgs : EventArgs { - public UiNotificationEventArgs(UiNotificationType notificationType, string message, string title, UiNotificationOptions options) + public UiNotificationEventArgs(UiNotificationType notificationType, string message, string? title, UiNotificationOptions options) { NotificationType = notificationType; Message = message; @@ -16,7 +16,7 @@ public class UiNotificationEventArgs : EventArgs public string Message { get; } - public string Title { get; } + public string? Title { get; } public UiNotificationOptions Options { get; } } diff --git a/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Notifications/UiNotificationOptions.cs b/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Notifications/UiNotificationOptions.cs index c3f6a74fa5..0668d32311 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Notifications/UiNotificationOptions.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Notifications/UiNotificationOptions.cs @@ -10,10 +10,10 @@ public class UiNotificationOptions /// /// Custom text for the Ok button. /// - public ILocalizableString OkButtonText { get; set; } + public ILocalizableString? OkButtonText { get; set; } /// /// Custom icon for the Ok button. /// - public object OkButtonIcon { get; set; } + public object? OkButtonIcon { get; set; } } diff --git a/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Progression/IUiPageProgressService.cs b/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Progression/IUiPageProgressService.cs index 156c763722..1d32c86dc0 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Progression/IUiPageProgressService.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Progression/IUiPageProgressService.cs @@ -16,5 +16,5 @@ public interface IUiPageProgressService /// Value of the progress from 0 to 100, or null for indeterminate progress. /// Additional options. /// Awaitable task. - Task Go(int? percentage, Action options = null); + Task Go(int? percentage, Action? options = null); } diff --git a/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Progression/NullUiPageProgressService.cs b/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Progression/NullUiPageProgressService.cs index 2277122418..52f97f23d5 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Progression/NullUiPageProgressService.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Progression/NullUiPageProgressService.cs @@ -6,9 +6,9 @@ namespace Volo.Abp.AspNetCore.Components.Progression; public class NullUiPageProgressService : IUiPageProgressService, ISingletonDependency { - public event EventHandler ProgressChanged; + public event EventHandler ProgressChanged = default!; - public Task Go(int? percentage, Action options = null) + public Task Go(int? percentage, Action? options = null) { return Task.CompletedTask; } diff --git a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo.Abp.AspNetCore.MultiTenancy.csproj b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo.Abp.AspNetCore.MultiTenancy.csproj index ac7d3eb556..eeb6abb56e 100644 --- a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo.Abp.AspNetCore.MultiTenancy.csproj +++ b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo.Abp.AspNetCore.MultiTenancy.csproj @@ -5,6 +5,8 @@ net7.0 + enable + Nullable Volo.Abp.AspNetCore.MultiTenancy Volo.Abp.AspNetCore.MultiTenancy $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/AbpAspNetCoreMultiTenancyOptions.cs b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/AbpAspNetCoreMultiTenancyOptions.cs index 3ac06350d9..95efaf2d0c 100644 --- a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/AbpAspNetCoreMultiTenancyOptions.cs +++ b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/AbpAspNetCoreMultiTenancyOptions.cs @@ -105,7 +105,7 @@ public class AbpAspNetCoreMultiTenancyOptions else { var transcodingStream = Encoding.CreateTranscodingStream(context.Response.Body, resolvedContentTypeEncoding, Encoding.UTF8, leaveOpen: true); - ExceptionDispatchInfo exceptionDispatchInfo = null; + ExceptionDispatchInfo? exceptionDispatchInfo = null; try { await JsonSerializer.SerializeAsync(transcodingStream, error, error.GetType(), jsonSerializerOptions, context.RequestAborted); @@ -138,7 +138,7 @@ public class AbpAspNetCoreMultiTenancyOptions var details = exception is BusinessException businessException ? businessException.Details : string.Empty; await context.Response.WriteAsync($"\r\n"); - await context.Response.WriteAsync($"

{HtmlEncoder.Default.Encode(message)}

{HtmlEncoder.Default.Encode(details)}
\r\n"); + await context.Response.WriteAsync($"

{HtmlEncoder.Default.Encode(message)}

{HtmlEncoder.Default.Encode(details!)}
\r\n"); await context.Response.WriteAsync("\r\n"); // Note the 500 spaces are to work around an IE 'feature' diff --git a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/AbpMultiTenancyCookieHelper.cs b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/AbpMultiTenancyCookieHelper.cs index d4a91f3b12..59ace12d77 100644 --- a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/AbpMultiTenancyCookieHelper.cs +++ b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/AbpMultiTenancyCookieHelper.cs @@ -14,7 +14,7 @@ public static class AbpMultiTenancyCookieHelper { context.Response.Cookies.Append( tenantKey, - tenantId.ToString(), + tenantId.ToString()!, new CookieOptions { Path = "/", diff --git a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/CookieTenantResolveContributor.cs b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/CookieTenantResolveContributor.cs index 1eabd3ebfb..5804cedf36 100644 --- a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/CookieTenantResolveContributor.cs +++ b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/CookieTenantResolveContributor.cs @@ -10,7 +10,7 @@ public class CookieTenantResolveContributor : HttpTenantResolveContributorBase public override string Name => ContributorName; - protected override Task GetTenantIdOrNameFromHttpContextOrNullAsync(ITenantResolveContext context, HttpContext httpContext) + protected override Task GetTenantIdOrNameFromHttpContextOrNullAsync(ITenantResolveContext context, HttpContext httpContext) { return Task.FromResult(httpContext.Request.Cookies[context.GetAbpAspNetCoreMultiTenancyOptions().TenantKey]); } diff --git a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/DomainTenantResolveContributor.cs b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/DomainTenantResolveContributor.cs index 78f92ac20e..d3e99d12d9 100644 --- a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/DomainTenantResolveContributor.cs +++ b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/DomainTenantResolveContributor.cs @@ -23,11 +23,11 @@ public class DomainTenantResolveContributor : HttpTenantResolveContributorBase _domainFormat = domainFormat.RemovePreFix(ProtocolPrefixes); } - protected override Task GetTenantIdOrNameFromHttpContextOrNullAsync(ITenantResolveContext context, HttpContext httpContext) + protected override Task GetTenantIdOrNameFromHttpContextOrNullAsync(ITenantResolveContext context, HttpContext httpContext) { if (!httpContext.Request.Host.HasValue) { - return Task.FromResult(null); + return Task.FromResult(null); } var hostName = httpContext.Request.Host.Value.RemovePreFix(ProtocolPrefixes); diff --git a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/FormTenantResolveContributor.cs b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/FormTenantResolveContributor.cs index d55343c94c..eed8f2a6c4 100644 --- a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/FormTenantResolveContributor.cs +++ b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/FormTenantResolveContributor.cs @@ -12,7 +12,7 @@ public class FormTenantResolveContributor : HttpTenantResolveContributorBase public override string Name => ContributorName; - protected override async Task GetTenantIdOrNameFromHttpContextOrNullAsync(ITenantResolveContext context, HttpContext httpContext) + protected override async Task GetTenantIdOrNameFromHttpContextOrNullAsync(ITenantResolveContext context, HttpContext httpContext) { if (!httpContext.Request.HasFormContentType) { diff --git a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/HeaderTenantResolveContributor.cs b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/HeaderTenantResolveContributor.cs index a0bec0d606..7387b9f98e 100644 --- a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/HeaderTenantResolveContributor.cs +++ b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/HeaderTenantResolveContributor.cs @@ -14,11 +14,11 @@ public class HeaderTenantResolveContributor : HttpTenantResolveContributorBase public override string Name => ContributorName; - protected override Task GetTenantIdOrNameFromHttpContextOrNullAsync(ITenantResolveContext context, HttpContext httpContext) + protected override Task GetTenantIdOrNameFromHttpContextOrNullAsync(ITenantResolveContext context, HttpContext httpContext) { if (httpContext.Request.Headers.IsNullOrEmpty()) { - return Task.FromResult((string)null); + return Task.FromResult((string?)null); } var tenantIdKey = context.GetAbpAspNetCoreMultiTenancyOptions().TenantKey; @@ -26,7 +26,7 @@ public class HeaderTenantResolveContributor : HttpTenantResolveContributorBase var tenantIdHeader = httpContext.Request.Headers[tenantIdKey]; if (tenantIdHeader == string.Empty || tenantIdHeader.Count < 1) { - return Task.FromResult((string)null); + return Task.FromResult((string?)null); } if (tenantIdHeader.Count > 1) diff --git a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/HttpContextTenantResolveResultAccessor.cs b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/HttpContextTenantResolveResultAccessor.cs index 1197e16baa..b633a89e81 100644 --- a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/HttpContextTenantResolveResultAccessor.cs +++ b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/HttpContextTenantResolveResultAccessor.cs @@ -9,7 +9,7 @@ public class HttpContextTenantResolveResultAccessor : ITenantResolveResultAccess { public const string HttpContextItemName = "__AbpTenantResolveResult"; - public TenantResolveResult Result { + public TenantResolveResult? Result { get => _httpContextAccessor.HttpContext?.Items[HttpContextItemName] as TenantResolveResult; set { if (_httpContextAccessor.HttpContext == null) diff --git a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/HttpTenantResolveContributorBase.cs b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/HttpTenantResolveContributorBase.cs index b0900c899f..1b003e3ba9 100644 --- a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/HttpTenantResolveContributorBase.cs +++ b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/HttpTenantResolveContributorBase.cs @@ -39,5 +39,5 @@ public abstract class HttpTenantResolveContributorBase : TenantResolveContributo } } - protected abstract Task GetTenantIdOrNameFromHttpContextOrNullAsync([NotNull] ITenantResolveContext context, [NotNull] HttpContext httpContext); + protected abstract Task GetTenantIdOrNameFromHttpContextOrNullAsync([NotNull] ITenantResolveContext context, [NotNull] HttpContext httpContext); } diff --git a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/MultiTenancyMiddleware.cs b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/MultiTenancyMiddleware.cs index 89ae55b3b1..310add4bfc 100644 --- a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/MultiTenancyMiddleware.cs +++ b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/MultiTenancyMiddleware.cs @@ -40,7 +40,7 @@ public class MultiTenancyMiddleware : IMiddleware, ITransientDependency public async Task InvokeAsync(HttpContext context, RequestDelegate next) { - TenantConfiguration tenant = null; + TenantConfiguration? tenant = null; try { tenant = await _tenantConfigurationProvider.GetAsync(saveResolveResult: true); @@ -86,7 +86,7 @@ public class MultiTenancyMiddleware : IMiddleware, ITransientDependency } } - private async Task TryGetRequestCultureAsync(HttpContext httpContext) + private async Task TryGetRequestCultureAsync(HttpContext httpContext) { var requestCultureFeature = httpContext.Features.Get(); @@ -114,7 +114,7 @@ public class MultiTenancyMiddleware : IMiddleware, ITransientDependency string culture; string uiCulture; - if (defaultLanguage.Contains(';')) + if (defaultLanguage!.Contains(';')) { var splitted = defaultLanguage.Split(';'); culture = splitted[0]; diff --git a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/QueryStringTenantResolveContributor.cs b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/QueryStringTenantResolveContributor.cs index f4f2cf8cb6..49fb0dc620 100644 --- a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/QueryStringTenantResolveContributor.cs +++ b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/QueryStringTenantResolveContributor.cs @@ -11,7 +11,7 @@ public class QueryStringTenantResolveContributor : HttpTenantResolveContributorB public override string Name => ContributorName; - protected override Task GetTenantIdOrNameFromHttpContextOrNullAsync(ITenantResolveContext context, HttpContext httpContext) + protected override Task GetTenantIdOrNameFromHttpContextOrNullAsync(ITenantResolveContext context, HttpContext httpContext) { if (httpContext.Request.QueryString.HasValue) { @@ -22,13 +22,13 @@ public class QueryStringTenantResolveContributor : HttpTenantResolveContributorB if (tenantValue.IsNullOrWhiteSpace()) { context.Handled = true; - return Task.FromResult(null); + return Task.FromResult(null); } - return Task.FromResult(tenantValue); + return Task.FromResult(tenantValue)!; } } - return Task.FromResult(null); + return Task.FromResult(null); } } diff --git a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/RouteTenantResolveContributor.cs b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/RouteTenantResolveContributor.cs index 06e7972aa1..eabf05e9ad 100644 --- a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/RouteTenantResolveContributor.cs +++ b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/RouteTenantResolveContributor.cs @@ -12,7 +12,7 @@ public class RouteTenantResolveContributor : HttpTenantResolveContributorBase public override string Name => ContributorName; - protected override Task GetTenantIdOrNameFromHttpContextOrNullAsync(ITenantResolveContext context, HttpContext httpContext) + protected override Task GetTenantIdOrNameFromHttpContextOrNullAsync(ITenantResolveContext context, HttpContext httpContext) { var tenantId = httpContext.GetRouteValue(context.GetAbpAspNetCoreMultiTenancyOptions().TenantKey); return Task.FromResult(tenantId != null ? Convert.ToString(tenantId) : null); diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Client.Common/Volo.Abp.AspNetCore.Mvc.Client.Common.csproj b/framework/src/Volo.Abp.AspNetCore.Mvc.Client.Common/Volo.Abp.AspNetCore.Mvc.Client.Common.csproj index 9f9ddb9755..49c0eca552 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.Client.Common/Volo.Abp.AspNetCore.Mvc.Client.Common.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Client.Common/Volo.Abp.AspNetCore.Mvc.Client.Common.csproj @@ -5,6 +5,8 @@ netstandard2.0;netstandard2.1;net7.0 + enable + Nullable Volo.Abp.AspNetCore.Mvc.Client.Common Volo.Abp.AspNetCore.Mvc.Client.Common $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Client.Common/Volo/Abp/AspNetCore/Mvc/Client/RemoteExternalLocalizationStore.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Client.Common/Volo/Abp/AspNetCore/Mvc/Client/RemoteExternalLocalizationStore.cs index c5548acc62..4de2f28391 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.Client.Common/Volo/Abp/AspNetCore/Mvc/Client/RemoteExternalLocalizationStore.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Client.Common/Volo/Abp/AspNetCore/Mvc/Client/RemoteExternalLocalizationStore.cs @@ -22,13 +22,13 @@ public class RemoteExternalLocalizationStore : IExternalLocalizationStore, ITran LocalizationOptions = localizationOptions.Value; } - public virtual LocalizationResourceBase GetResourceOrNull(string resourceName) + public virtual LocalizationResourceBase? GetResourceOrNull(string resourceName) { var configurationDto = ConfigurationClient.Get(); return CreateLocalizationResourceFromConfigurationOrNull(resourceName, configurationDto); } - public virtual async Task GetResourceOrNullAsync(string resourceName) + public virtual async Task GetResourceOrNullAsync(string resourceName) { var configurationDto = await ConfigurationClient.GetAsync(); return CreateLocalizationResourceFromConfigurationOrNull(resourceName, configurationDto); @@ -63,7 +63,7 @@ public class RemoteExternalLocalizationStore : IExternalLocalizationStore, ITran return resources.ToArray(); } - protected virtual LocalizationResourceBase CreateLocalizationResourceFromConfigurationOrNull( + protected virtual LocalizationResourceBase? CreateLocalizationResourceFromConfigurationOrNull( string resourceName, ApplicationConfigurationDto configurationDto) { diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Client.Common/Volo/Abp/AspNetCore/Mvc/Client/RemoteFeatureChecker.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Client.Common/Volo/Abp/AspNetCore/Mvc/Client/RemoteFeatureChecker.cs index d3969e7888..f356324445 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.Client.Common/Volo/Abp/AspNetCore/Mvc/Client/RemoteFeatureChecker.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Client.Common/Volo/Abp/AspNetCore/Mvc/Client/RemoteFeatureChecker.cs @@ -13,7 +13,7 @@ public class RemoteFeatureChecker : FeatureCheckerBase ConfigurationClient = configurationClient; } - public override async Task GetOrNullAsync(string name) + public override async Task GetOrNullAsync(string name) { var configuration = await ConfigurationClient.GetAsync(); return configuration.Features.Values.GetOrDefault(name); diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Client.Common/Volo/Abp/AspNetCore/Mvc/Client/RemoteLocalizationContributor.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Client.Common/Volo/Abp/AspNetCore/Mvc/Client/RemoteLocalizationContributor.cs index e6e180c5f2..c361186a75 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.Client.Common/Volo/Abp/AspNetCore/Mvc/Client/RemoteLocalizationContributor.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Client.Common/Volo/Abp/AspNetCore/Mvc/Client/RemoteLocalizationContributor.cs @@ -14,9 +14,9 @@ public class RemoteLocalizationContributor : ILocalizationResourceContributor { public bool IsDynamic => true; - private LocalizationResourceBase _resource; - private ICachedApplicationConfigurationClient _applicationConfigurationClient; - private ILogger _logger; + private LocalizationResourceBase _resource = default!; + private ICachedApplicationConfigurationClient _applicationConfigurationClient = default!; + private ILogger _logger = default!; public void Initialize(LocalizationResourceInitializationContext context) { @@ -26,7 +26,7 @@ public class RemoteLocalizationContributor : ILocalizationResourceContributor ?? NullLogger.Instance; } - public virtual LocalizedString GetOrNull(string cultureName, string name) + public virtual LocalizedString? GetOrNull(string cultureName, string name) { /* cultureName is not used because remote localization can only * be done in the current culture. */ @@ -34,7 +34,7 @@ public class RemoteLocalizationContributor : ILocalizationResourceContributor return GetOrNullInternal(_resource.ResourceName, name); } - protected virtual LocalizedString GetOrNullInternal(string resourceName, string name) + protected virtual LocalizedString? GetOrNullInternal(string resourceName, string name) { var resource = GetResourceOrNull(resourceName); if (resource == null) @@ -50,7 +50,7 @@ public class RemoteLocalizationContributor : ILocalizationResourceContributor foreach (var baseResource in resource.BaseResources) { - value = GetOrNullInternal(baseResource, name); + value = GetOrNullInternal(baseResource, name)?.ToString(); if (value != null) { return new LocalizedString(name, value); @@ -121,19 +121,19 @@ public class RemoteLocalizationContributor : ILocalizationResourceContributor return Task.FromResult((IEnumerable)Array.Empty()); } - protected virtual ApplicationLocalizationResourceDto GetResourceOrNull(string resourceName) + protected virtual ApplicationLocalizationResourceDto? GetResourceOrNull(string resourceName) { var applicationConfigurationDto = _applicationConfigurationClient.Get(); return GetResourceOrNull(applicationConfigurationDto, resourceName); } - protected virtual async Task GetResourceOrNullAsync(string resourceName) + protected virtual async Task GetResourceOrNullAsync(string resourceName) { var applicationConfigurationDto = await _applicationConfigurationClient.GetAsync(); return GetResourceOrNull(applicationConfigurationDto, resourceName); } - protected virtual ApplicationLocalizationResourceDto GetResourceOrNull( + protected virtual ApplicationLocalizationResourceDto? GetResourceOrNull( ApplicationConfigurationDto applicationConfigurationDto, string resourceName) { diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Client.Common/Volo/Abp/AspNetCore/Mvc/Client/RemotePermissionChecker.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Client.Common/Volo/Abp/AspNetCore/Mvc/Client/RemotePermissionChecker.cs index 3274c5010c..a2fca1f127 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.Client.Common/Volo/Abp/AspNetCore/Mvc/Client/RemotePermissionChecker.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Client.Common/Volo/Abp/AspNetCore/Mvc/Client/RemotePermissionChecker.cs @@ -21,7 +21,7 @@ public class RemotePermissionChecker : IPermissionChecker, ITransientDependency return configuration.Auth.GrantedPolicies.ContainsKey(name); } - public async Task IsGrantedAsync(ClaimsPrincipal claimsPrincipal, string name) + public async Task IsGrantedAsync(ClaimsPrincipal? claimsPrincipal, string name) { /* This provider always works for the current principal. */ return await IsGrantedAsync(name); @@ -41,7 +41,7 @@ public class RemotePermissionChecker : IPermissionChecker, ITransientDependency return result; } - public async Task IsGrantedAsync(ClaimsPrincipal claimsPrincipal, string[] names) + public async Task IsGrantedAsync(ClaimsPrincipal? claimsPrincipal, string[] names) { /* This provider always works for the current principal. */ return await IsGrantedAsync(names); diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Client.Common/Volo/Abp/AspNetCore/Mvc/Client/RemoteSettingProvider.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Client.Common/Volo/Abp/AspNetCore/Mvc/Client/RemoteSettingProvider.cs index 2599df1ef6..6553ee9881 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.Client.Common/Volo/Abp/AspNetCore/Mvc/Client/RemoteSettingProvider.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Client.Common/Volo/Abp/AspNetCore/Mvc/Client/RemoteSettingProvider.cs @@ -15,7 +15,7 @@ public class RemoteSettingProvider : ISettingProvider, ITransientDependency ConfigurationClient = configurationClient; } - public async Task GetOrNullAsync(string name) + public async Task GetOrNullAsync(string name) { var configuration = await ConfigurationClient.GetAsync(); return configuration.Setting.Values.GetOrDefault(name); diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo.Abp.AspNetCore.Mvc.Client.csproj b/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo.Abp.AspNetCore.Mvc.Client.csproj index 2e5a66d740..39f753a6c0 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo.Abp.AspNetCore.Mvc.Client.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo.Abp.AspNetCore.Mvc.Client.csproj @@ -5,6 +5,8 @@ net7.0 + enable + Nullable Volo.Abp.AspNetCore.Mvc.Client Volo.Abp.AspNetCore.Mvc.Client $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo/Abp/AspNetCore/Mvc/Client/MvcCachedApplicationConfigurationClient.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo/Abp/AspNetCore/Mvc/Client/MvcCachedApplicationConfigurationClient.cs index 6f2cc1a05f..b7d8a0df40 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo/Abp/AspNetCore/Mvc/Client/MvcCachedApplicationConfigurationClient.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo/Abp/AspNetCore/Mvc/Client/MvcCachedApplicationConfigurationClient.cs @@ -47,14 +47,14 @@ public class MvcCachedApplicationConfigurationClient : ICachedApplicationConfigu return configuration; } - configuration = await Cache.GetOrAddAsync( + configuration = (await Cache.GetOrAddAsync( cacheKey, async () => await GetRemoteConfigurationAsync(), () => new DistributedCacheEntryOptions { AbsoluteExpirationRelativeToNow = Options.ApplicationConfigurationDtoCacheAbsoluteExpiration } - ); + ))!; if (httpContext != null) { diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo/Abp/AspNetCore/Mvc/Client/MvcRemoteTenantStore.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo/Abp/AspNetCore/Mvc/Client/MvcRemoteTenantStore.cs index 3f091f8db8..aa9fc4beb8 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo/Abp/AspNetCore/Mvc/Client/MvcRemoteTenantStore.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo/Abp/AspNetCore/Mvc/Client/MvcRemoteTenantStore.cs @@ -31,7 +31,7 @@ public class MvcRemoteTenantStore : ITenantStore, ITransientDependency Options = options.Value; } - public async Task FindAsync(string name) + public async Task FindAsync(string name) { var cacheKey = CreateCacheKey(name); var httpContext = HttpContextAccessor?.HttpContext; @@ -41,14 +41,14 @@ public class MvcRemoteTenantStore : ITenantStore, ITransientDependency return tenantConfiguration; } - tenantConfiguration = await Cache.GetOrAddAsync( + tenantConfiguration = (await Cache.GetOrAddAsync( cacheKey, - async () => CreateTenantConfiguration(await TenantAppService.FindTenantByNameAsync(name)), + async () => CreateTenantConfiguration(await TenantAppService.FindTenantByNameAsync(name))!, () => new DistributedCacheEntryOptions { AbsoluteExpirationRelativeToNow = Options.TenantConfigurationCacheAbsoluteExpiration } - ); + ))!; if (httpContext != null) { @@ -58,7 +58,7 @@ public class MvcRemoteTenantStore : ITenantStore, ITransientDependency return tenantConfiguration; } - public async Task FindAsync(Guid id) + public async Task FindAsync(Guid id) { var cacheKey = CreateCacheKey(id); var httpContext = HttpContextAccessor?.HttpContext; @@ -68,14 +68,14 @@ public class MvcRemoteTenantStore : ITenantStore, ITransientDependency return tenantConfiguration; } - tenantConfiguration = await Cache.GetOrAddAsync( + tenantConfiguration = (await Cache.GetOrAddAsync( cacheKey, - async () => CreateTenantConfiguration(await TenantAppService.FindTenantByIdAsync(id)), + async () => CreateTenantConfiguration(await TenantAppService.FindTenantByIdAsync(id))!, () => new DistributedCacheEntryOptions { AbsoluteExpirationRelativeToNow = Options.TenantConfigurationCacheAbsoluteExpiration } - ); + ))!; if (httpContext != null) { @@ -97,12 +97,12 @@ public class MvcRemoteTenantStore : ITenantStore, ITransientDependency tenantConfiguration = Cache.GetOrAdd( cacheKey, - () => AsyncHelper.RunSync(async () => CreateTenantConfiguration(await TenantAppService.FindTenantByNameAsync(name))), + () => AsyncHelper.RunSync(async () => CreateTenantConfiguration(await TenantAppService.FindTenantByNameAsync(name))!), () => new DistributedCacheEntryOptions { AbsoluteExpirationRelativeToNow = Options.TenantConfigurationCacheAbsoluteExpiration } - ); + )!; if (httpContext != null) { @@ -124,12 +124,12 @@ public class MvcRemoteTenantStore : ITenantStore, ITransientDependency tenantConfiguration = Cache.GetOrAdd( cacheKey, - () => AsyncHelper.RunSync(async () => CreateTenantConfiguration(await TenantAppService.FindTenantByIdAsync(id))), + () => AsyncHelper.RunSync(async () => CreateTenantConfiguration(await TenantAppService.FindTenantByIdAsync(id))!), () => new DistributedCacheEntryOptions { AbsoluteExpirationRelativeToNow = Options.TenantConfigurationCacheAbsoluteExpiration } - ); + )!; if (httpContext != null) { @@ -139,14 +139,14 @@ public class MvcRemoteTenantStore : ITenantStore, ITransientDependency return tenantConfiguration; } - protected virtual TenantConfiguration CreateTenantConfiguration(FindTenantResultDto tenantResultDto) + protected virtual TenantConfiguration? CreateTenantConfiguration(FindTenantResultDto tenantResultDto) { if (!tenantResultDto.Success || tenantResultDto.TenantId == null) { return null; } - return new TenantConfiguration(tenantResultDto.TenantId.Value, tenantResultDto.Name); + return new TenantConfiguration(tenantResultDto.TenantId.Value, tenantResultDto.Name!); } protected virtual string CreateCacheKey(string tenantName) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo.Abp.AspNetCore.Mvc.Contracts.csproj b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo.Abp.AspNetCore.Mvc.Contracts.csproj index a89f7c60a7..e0ddc7cdbe 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo.Abp.AspNetCore.Mvc.Contracts.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo.Abp.AspNetCore.Mvc.Contracts.csproj @@ -5,6 +5,8 @@ netstandard2.0;netstandard2.1;net7.0 + enable + Nullable Volo.Abp.AspNetCore.Mvc.Contracts Volo.Abp.AspNetCore.Mvc.Contracts $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationConfigurationDto.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationConfigurationDto.cs index 61b5ec18db..e9c079cc84 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationConfigurationDto.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationConfigurationDto.cs @@ -31,4 +31,20 @@ public class ApplicationConfigurationDto : IHasExtraProperties public ObjectExtensionsDto ObjectExtensions { get; set; } public ExtraPropertyDictionary ExtraProperties { get; set; } + + public ApplicationConfigurationDto() + { + Localization = new ApplicationLocalizationConfigurationDto(); + Auth = new ApplicationAuthConfigurationDto(); + Setting = new ApplicationSettingConfigurationDto(); + CurrentUser = new CurrentUserDto(); + Features = new ApplicationFeatureConfigurationDto(); + GlobalFeatures = new ApplicationGlobalFeatureConfigurationDto(); + MultiTenancy = new MultiTenancyInfoDto(); + CurrentTenant = new CurrentTenantDto(); + Timing = new TimingDto(); + Clock = new ClockDto(); + ObjectExtensions = new ObjectExtensionsDto(); + ExtraProperties = new ExtraPropertyDictionary(); + } } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationFeatureConfigurationDto.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationFeatureConfigurationDto.cs index 9215a46616..4aa022b8c5 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationFeatureConfigurationDto.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationFeatureConfigurationDto.cs @@ -6,10 +6,10 @@ namespace Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations; [Serializable] public class ApplicationFeatureConfigurationDto { - public Dictionary Values { get; set; } + public Dictionary Values { get; set; } public ApplicationFeatureConfigurationDto() { - Values = new Dictionary(); + Values = new Dictionary(); } } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationLocalizationConfigurationDto.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationLocalizationConfigurationDto.cs index b1c0c16e76..5ae2a8ed2d 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationLocalizationConfigurationDto.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationLocalizationConfigurationDto.cs @@ -28,7 +28,7 @@ public class ApplicationLocalizationConfigurationDto public CurrentCultureDto CurrentCulture { get; set; } - public string DefaultResourceName { get; set; } + public string? DefaultResourceName { get; set; } public Dictionary> LanguagesMap { get; set; } @@ -38,5 +38,8 @@ public class ApplicationLocalizationConfigurationDto { Values = new Dictionary>(); Languages = new List(); + CurrentCulture = new CurrentCultureDto(); + LanguagesMap = new Dictionary>(); + LanguageFilesMap = new Dictionary>(); } } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationLocalizationDto.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationLocalizationDto.cs index d301490bed..2bbc604c95 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationLocalizationDto.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationLocalizationDto.cs @@ -7,4 +7,9 @@ namespace Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations; public class ApplicationLocalizationDto { public Dictionary Resources { get; set; } + + public ApplicationLocalizationDto() + { + Resources = new Dictionary(); + } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationLocalizationRequestDto.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationLocalizationRequestDto.cs index 535d572b3f..3b6debe695 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationLocalizationRequestDto.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationLocalizationRequestDto.cs @@ -5,7 +5,7 @@ namespace Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations; public class ApplicationLocalizationRequestDto { [Required] - public string CultureName { get; set; } + public string CultureName { get; set; } = default!; public bool OnlyDynamics { get; set; } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationLocalizationResourceDto.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationLocalizationResourceDto.cs index a7200423d2..bca4ccd8ee 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationLocalizationResourceDto.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationLocalizationResourceDto.cs @@ -7,6 +7,11 @@ namespace Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations; public class ApplicationLocalizationResourceDto { public Dictionary Texts { get; set; } - - public string[] BaseResources { get; set; } + + public string[] BaseResources { get; set; } = default!; + + public ApplicationLocalizationResourceDto() + { + Texts = new Dictionary(); + } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationSettingConfigurationDto.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationSettingConfigurationDto.cs index a1fbba2bbf..1ae30828cf 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationSettingConfigurationDto.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationSettingConfigurationDto.cs @@ -6,5 +6,10 @@ namespace Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations; [Serializable] public class ApplicationSettingConfigurationDto { - public Dictionary Values { get; set; } + public Dictionary Values { get; set; } + + public ApplicationSettingConfigurationDto() + { + Values = new Dictionary(); + } } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ClockDto.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ClockDto.cs index 5112ac80ed..96cd5bd38b 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ClockDto.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ClockDto.cs @@ -2,5 +2,5 @@ public class ClockDto { - public string Kind { get; set; } + public string Kind { get; set; } = default!; } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/CurrentCultureDto.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/CurrentCultureDto.cs index 83f1e0c803..054e626844 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/CurrentCultureDto.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/CurrentCultureDto.cs @@ -5,21 +5,21 @@ namespace Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations; [Serializable] public class CurrentCultureDto { - public string DisplayName { get; set; } + public string DisplayName { get; set; } = default!; - public string EnglishName { get; set; } + public string EnglishName { get; set; } = default!; - public string ThreeLetterIsoLanguageName { get; set; } + public string ThreeLetterIsoLanguageName { get; set; } = default!; - public string TwoLetterIsoLanguageName { get; set; } + public string TwoLetterIsoLanguageName { get; set; } = default!; public bool IsRightToLeft { get; set; } - public string CultureName { get; set; } + public string CultureName { get; set; } = default!; - public string Name { get; set; } + public string Name { get; set; } = default!; - public string NativeName { get; set; } + public string NativeName { get; set; } = default!; - public DateTimeFormatDto DateTimeFormat { get; set; } + public DateTimeFormatDto DateTimeFormat { get; set; } = default!; } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/CurrentUserDto.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/CurrentUserDto.cs index 08a8c4c873..63a4b7a0e9 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/CurrentUserDto.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/CurrentUserDto.cs @@ -15,23 +15,23 @@ public class CurrentUserDto public Guid? ImpersonatorTenantId { get; set; } - public string ImpersonatorUserName { get; set; } + public string? ImpersonatorUserName { get; set; } - public string ImpersonatorTenantName { get; set; } + public string? ImpersonatorTenantName { get; set; } - public string UserName { get; set; } + public string? UserName { get; set; } - public string Name { get; set; } + public string? Name { get; set; } - public string SurName { get; set; } + public string? SurName { get; set; } - public string Email { get; set; } + public string? Email { get; set; } public bool EmailVerified { get; set; } - public string PhoneNumber { get; set; } + public string? PhoneNumber { get; set; } public bool PhoneNumberVerified { get; set; } - public string[] Roles { get; set; } + public string[] Roles { get; set; } = default!; } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/DateTimeFormatDto.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/DateTimeFormatDto.cs index 5f5ad14a5a..a16282efdd 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/DateTimeFormatDto.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/DateTimeFormatDto.cs @@ -2,17 +2,17 @@ public class DateTimeFormatDto { - public string CalendarAlgorithmType { get; set; } + public string CalendarAlgorithmType { get; set; } = default!; - public string DateTimeFormatLong { get; set; } + public string DateTimeFormatLong { get; set; } = default!; - public string ShortDatePattern { get; set; } + public string ShortDatePattern { get; set; } = default!; - public string FullDateTimePattern { get; set; } + public string FullDateTimePattern { get; set; } = default!; - public string DateSeparator { get; set; } + public string DateSeparator { get; set; } = default!; - public string ShortTimePattern { get; set; } + public string ShortTimePattern { get; set; } = default!; - public string LongTimePattern { get; set; } + public string LongTimePattern { get; set; } = default!; } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ObjectExtending/EntityExtensionDto.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ObjectExtending/EntityExtensionDto.cs index 742da779f6..533349527c 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ObjectExtending/EntityExtensionDto.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ObjectExtending/EntityExtensionDto.cs @@ -9,4 +9,10 @@ public class EntityExtensionDto public Dictionary Properties { get; set; } public Dictionary Configuration { get; set; } + + public EntityExtensionDto() + { + Properties = new Dictionary(); + Configuration = new Dictionary(); + } } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ObjectExtending/ExtensionEnumDto.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ObjectExtending/ExtensionEnumDto.cs index 24e9ec9a2f..cd1d210005 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ObjectExtending/ExtensionEnumDto.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ObjectExtending/ExtensionEnumDto.cs @@ -8,5 +8,10 @@ public class ExtensionEnumDto { public List Fields { get; set; } - public string LocalizationResource { get; set; } + public string? LocalizationResource { get; set; } + + public ExtensionEnumDto() + { + Fields = new List(); + } } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ObjectExtending/ExtensionEnumFieldDto.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ObjectExtending/ExtensionEnumFieldDto.cs index 13728d8409..03c0213015 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ObjectExtending/ExtensionEnumFieldDto.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ObjectExtending/ExtensionEnumFieldDto.cs @@ -5,7 +5,7 @@ namespace Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending; [Serializable] public class ExtensionEnumFieldDto { - public string Name { get; set; } + public string? Name { get; set; } - public object Value { get; set; } + public object? Value { get; set; } } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ObjectExtending/ExtensionPropertyAttributeDto.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ObjectExtending/ExtensionPropertyAttributeDto.cs index 492756168d..ea28fb3cb9 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ObjectExtending/ExtensionPropertyAttributeDto.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ObjectExtending/ExtensionPropertyAttributeDto.cs @@ -6,7 +6,12 @@ namespace Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending; [Serializable] public class ExtensionPropertyAttributeDto { - public string TypeSimple { get; set; } + public string TypeSimple { get; set; } = default!; public Dictionary Config { get; set; } + + public ExtensionPropertyAttributeDto() + { + Config = new Dictionary(); + } } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ObjectExtending/ExtensionPropertyDto.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ObjectExtending/ExtensionPropertyDto.cs index a1fb628e1a..68a915309d 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ObjectExtending/ExtensionPropertyDto.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ObjectExtending/ExtensionPropertyDto.cs @@ -7,12 +7,11 @@ namespace Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending; [Serializable] public class ExtensionPropertyDto { - public string Type { get; set; } + public string Type { get; set; } = default!; - public string TypeSimple { get; set; } + public string TypeSimple { get; set; } = default!; - [CanBeNull] - public LocalizableStringDto DisplayName { get; set; } + public LocalizableStringDto? DisplayName { get; set; } public ExtensionPropertyApiDto Api { get; set; } @@ -22,5 +21,13 @@ public class ExtensionPropertyDto public Dictionary Configuration { get; set; } - public object DefaultValue { get; set; } + public object? DefaultValue { get; set; } + + public ExtensionPropertyDto() + { + Api = new ExtensionPropertyApiDto(); + Ui = new ExtensionPropertyUiDto(); + Attributes = new List(); + Configuration = new Dictionary(); + } } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ObjectExtending/ExtensionPropertyUiDto.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ObjectExtending/ExtensionPropertyUiDto.cs index cd43df5446..2c90299b15 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ObjectExtending/ExtensionPropertyUiDto.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ObjectExtending/ExtensionPropertyUiDto.cs @@ -9,4 +9,12 @@ public class ExtensionPropertyUiDto public ExtensionPropertyUiFormDto OnCreateForm { get; set; } public ExtensionPropertyUiFormDto OnEditForm { get; set; } public ExtensionPropertyUiLookupDto Lookup { get; set; } + + public ExtensionPropertyUiDto() + { + OnTable = new ExtensionPropertyUiTableDto(); + OnCreateForm = new ExtensionPropertyUiFormDto(); + OnEditForm = new ExtensionPropertyUiFormDto(); + Lookup = new ExtensionPropertyUiLookupDto(); + } } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ObjectExtending/ExtensionPropertyUiLookupDto.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ObjectExtending/ExtensionPropertyUiLookupDto.cs index b9bc94399c..ae5fd451de 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ObjectExtending/ExtensionPropertyUiLookupDto.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ObjectExtending/ExtensionPropertyUiLookupDto.cs @@ -5,9 +5,9 @@ namespace Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending; [Serializable] public class ExtensionPropertyUiLookupDto { - public string Url { get; set; } - public string ResultListPropertyName { get; set; } - public string DisplayPropertyName { get; set; } - public string ValuePropertyName { get; set; } - public string FilterParamName { get; set; } + public string Url { get; set; } = default!; + public string ResultListPropertyName { get; set; } = default!; + public string DisplayPropertyName { get; set; } = default!; + public string ValuePropertyName { get; set; } = default!; + public string FilterParamName { get; set; } = default!; } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ObjectExtending/LocalizableStringDto.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ObjectExtending/LocalizableStringDto.cs index 8127a90bd7..2fc1989ad5 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ObjectExtending/LocalizableStringDto.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ObjectExtending/LocalizableStringDto.cs @@ -9,10 +9,9 @@ public class LocalizableStringDto [NotNull] public string Name { get; private set; } - [CanBeNull] - public string Resource { get; set; } + public string? Resource { get; set; } - public LocalizableStringDto([NotNull] string name, string resource = null) + public LocalizableStringDto([NotNull] string name, string? resource = null) { Name = Check.NotNullOrEmpty(name, nameof(name)); Resource = resource; diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ObjectExtending/ModuleExtensionDto.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ObjectExtending/ModuleExtensionDto.cs index aadd08cd28..50c944f6ec 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ObjectExtending/ModuleExtensionDto.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ObjectExtending/ModuleExtensionDto.cs @@ -9,4 +9,10 @@ public class ModuleExtensionDto public Dictionary Entities { get; set; } public Dictionary Configuration { get; set; } + + public ModuleExtensionDto() + { + Entities = new Dictionary(); + Configuration = new Dictionary(); + } } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ObjectExtending/ObjectExtensionsDto.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ObjectExtending/ObjectExtensionsDto.cs index f63935847b..b07855057b 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ObjectExtending/ObjectExtensionsDto.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ObjectExtending/ObjectExtensionsDto.cs @@ -9,4 +9,10 @@ public class ObjectExtensionsDto public Dictionary Modules { get; set; } public Dictionary Enums { get; set; } + + public ObjectExtensionsDto() + { + Modules = new Dictionary(); + Enums = new Dictionary(); + } } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/TimingDto.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/TimingDto.cs index ca03407ee5..7aa38ede79 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/TimingDto.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/TimingDto.cs @@ -3,6 +3,11 @@ public class TimingDto { public TimeZone TimeZone { get; set; } + + public TimingDto() + { + TimeZone = new TimeZone(); + } } public class TimeZone @@ -10,14 +15,20 @@ public class TimeZone public IanaTimeZone Iana { get; set; } public WindowsTimeZone Windows { get; set; } + + public TimeZone() + { + Iana = new IanaTimeZone(); + Windows = new WindowsTimeZone(); + } } public class WindowsTimeZone { - public string TimeZoneId { get; set; } + public string? TimeZoneId { get; set; } } public class IanaTimeZone { - public string TimeZoneName { get; set; } + public string? TimeZoneName { get; set; } } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/MultiTenancy/CurrentTenantDto.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/MultiTenancy/CurrentTenantDto.cs index b8b361e7c8..d8c1351b3e 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/MultiTenancy/CurrentTenantDto.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/MultiTenancy/CurrentTenantDto.cs @@ -8,7 +8,7 @@ public class CurrentTenantDto { public Guid? Id { get; set; } - public string Name { get; set; } + public string? Name { get; set; } public bool IsAvailable { get; set; } } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/MultiTenancy/FindTenantResultDto.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/MultiTenancy/FindTenantResultDto.cs index 64bcc77554..599b0b8a67 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/MultiTenancy/FindTenantResultDto.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/MultiTenancy/FindTenantResultDto.cs @@ -9,7 +9,7 @@ public class FindTenantResultDto public Guid? TenantId { get; set; } - public string Name { get; set; } + public string? Name { get; set; } public bool IsActive { get; set; } } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus/Volo/Abp/AspNetCore/Mvc/Dapr/EventBus/Controllers/AbpAspNetCoreMvcDaprEventsController.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus/Volo/Abp/AspNetCore/Mvc/Dapr/EventBus/Controllers/AbpAspNetCoreMvcDaprEventsController.cs index da0dad6a70..b1d5bac7fb 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus/Volo/Abp/AspNetCore/Mvc/Dapr/EventBus/Controllers/AbpAspNetCoreMvcDaprEventsController.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus/Volo/Abp/AspNetCore/Mvc/Dapr/EventBus/Controllers/AbpAspNetCoreMvcDaprEventsController.cs @@ -1,4 +1,5 @@ using System; +using System.Linq; using System.Text.Json; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; @@ -21,7 +22,6 @@ public class AbpAspNetCoreMvcDaprEventsController : AbpController var daprSerializer = HttpContext.RequestServices.GetRequiredService(); var body = (await JsonDocument.ParseAsync(HttpContext.Request.Body)); - var id = body.RootElement.GetProperty("id").GetString(); var pubSubName = body.RootElement.GetProperty("pubsubname").GetString(); var topic = body.RootElement.GetProperty("topic").GetString(); var data = body.RootElement.GetProperty("data").GetRawText(); @@ -32,8 +32,31 @@ public class AbpAspNetCoreMvcDaprEventsController : AbpController } var distributedEventBus = HttpContext.RequestServices.GetRequiredService(); - var eventData = daprSerializer.Deserialize(data, distributedEventBus.GetEventType(topic)); - await distributedEventBus.TriggerHandlersAsync(id, distributedEventBus.GetEventType(topic), eventData); + + if (IsAbpDaprEventData(data)) + { + var daprEventData = daprSerializer.Deserialize(data, typeof(AbpDaprEventData)).As(); + var eventData = daprSerializer.Deserialize(daprEventData.JsonData, distributedEventBus.GetEventType(daprEventData.Topic)); + await distributedEventBus.TriggerHandlersAsync(distributedEventBus.GetEventType(daprEventData.Topic), eventData, daprEventData.MessageId, daprEventData.CorrelationId); + } + else + { + var eventData = daprSerializer.Deserialize(data, distributedEventBus.GetEventType(topic)); + await distributedEventBus.TriggerHandlersAsync(distributedEventBus.GetEventType(topic), eventData); + } + return Ok(); } + + protected virtual bool IsAbpDaprEventData(string data) + { + var document = JsonDocument.Parse(data); + var objects = document.RootElement.EnumerateObject().ToList(); + return objects.Count == 5 && + objects.Any(x => x.Name.Equals("PubSubName", StringComparison.CurrentCultureIgnoreCase)) && + objects.Any(x => x.Name.Equals("Topic", StringComparison.CurrentCultureIgnoreCase)) && + objects.Any(x => x.Name.Equals("MessageId", StringComparison.CurrentCultureIgnoreCase)) && + objects.Any(x => x.Name.Equals("JsonData", StringComparison.CurrentCultureIgnoreCase)) && + objects.Any(x => x.Name.Equals("CorrelationId", StringComparison.CurrentCultureIgnoreCase)); + } } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson.csproj b/framework/src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson.csproj index 026fb2f4d4..bd0d7c063f 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson.csproj @@ -5,6 +5,8 @@ net7.0 + enable + Nullable true Volo.Abp.AspNetCore.Mvc.NewtonsoftJson Volo.Abp.AspNetCore.Mvc.NewtonsoftJson diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/Microsoft/AspNetCore/Razor/TagHelpers/AbpTagHelperAttributeListExtensions.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/Microsoft/AspNetCore/Razor/TagHelpers/AbpTagHelperAttributeListExtensions.cs index 81aefb7382..def91ef68b 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/Microsoft/AspNetCore/Razor/TagHelpers/AbpTagHelperAttributeListExtensions.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/Microsoft/AspNetCore/Razor/TagHelpers/AbpTagHelperAttributeListExtensions.cs @@ -22,7 +22,7 @@ public static class AbpTagHelperAttributeListExtensions } else { - var existingClasses = classAttribute.Value.ToString().Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).ToList(); + var existingClasses = classAttribute.Value.ToString()!.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).ToList(); existingClasses.AddIfNotContains(className); attributes.SetAttribute("class", string.Join(" ", existingClasses)); } @@ -41,7 +41,7 @@ public static class AbpTagHelperAttributeListExtensions return; } - var classList = classAttribute.Value.ToString().Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).ToList(); + var classList = classAttribute.Value.ToString()!.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).ToList(); classList.RemoveAll(c => c == className); attributes.SetAttribute("class", classList.JoinAsString(" ")); diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/AbpTagHelper.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/AbpTagHelper.cs index 5b9c1430f2..8d0227fd11 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/AbpTagHelper.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/AbpTagHelper.cs @@ -23,7 +23,7 @@ public abstract class AbpTagHelper : AbpTagHelper [HtmlAttributeNotBound] [ViewContext] - public ViewContext ViewContext { get; set; } + public ViewContext ViewContext { get; set; } = default!; protected AbpTagHelper(TService service) { diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/AbpTagHelperLocalizer.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/AbpTagHelperLocalizer.cs index c4314134be..5b6db4ff17 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/AbpTagHelperLocalizer.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/AbpTagHelperLocalizer.cs @@ -27,12 +27,12 @@ public class AbpTagHelperLocalizer : IAbpTagHelperLocalizer : localizer[text].Value; } - public IStringLocalizer GetLocalizerOrNull(ModelExplorer explorer) + public IStringLocalizer? GetLocalizerOrNull(ModelExplorer explorer) { return GetLocalizerOrNull(explorer.Container.ModelType.Assembly); } - public IStringLocalizer GetLocalizerOrNull(Assembly assembly) + public IStringLocalizer? GetLocalizerOrNull(Assembly assembly) { var resourceType = GetResourceType(assembly); return resourceType == null @@ -40,7 +40,7 @@ public class AbpTagHelperLocalizer : IAbpTagHelperLocalizer : _stringLocalizerFactory.Create(resourceType); } - private Type GetResourceType(Assembly assembly) + private Type? GetResourceType(Assembly assembly) { return _options .AssemblyResources diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/AbpTagHelperService.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/AbpTagHelperService.cs index b9c3aa92e6..95de4f7f51 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/AbpTagHelperService.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/AbpTagHelperService.cs @@ -23,7 +23,7 @@ public abstract class AbpTagHelperService : IAbpTagHelperService { - public string Href { get; set; } + public string? Href { get; set; } - public string Title { get; set; } + public string Title { get; set; } = default!; public bool Active { get; set; } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Breadcrumb/BreadcrumbItem.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Breadcrumb/BreadcrumbItem.cs index 37a194b906..de9f59ca01 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Breadcrumb/BreadcrumbItem.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Breadcrumb/BreadcrumbItem.cs @@ -2,7 +2,7 @@ public class BreadcrumbItem { - public string Html { get; set; } + public string Html { get; set; } = default!; public bool Active { get; set; } } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Button/AbpButtonTagHelper.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Button/AbpButtonTagHelper.cs index 624d750274..60c986f34b 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Button/AbpButtonTagHelper.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Button/AbpButtonTagHelper.cs @@ -9,11 +9,11 @@ public class AbpButtonTagHelper : AbpTagHelper : AbpTagHelperSe case FontIconType.FontAwesome: return "fa fa-" + TagHelper.Icon; default: - return TagHelper.Icon; + return TagHelper.Icon!; } } @@ -69,7 +69,7 @@ public abstract class AbpButtonTagHelperServiceBase : AbpTagHelperSe } var span = new TagBuilder("span"); - span.InnerHtml.AppendHtml(TagHelper.Text); + span.InnerHtml.AppendHtml(TagHelper.Text!); output.Content.AppendHtml(span); } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Button/AbpLinkButtonTagHelper.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Button/AbpLinkButtonTagHelper.cs index bf3b4d8bac..53508864cd 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Button/AbpLinkButtonTagHelper.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Button/AbpLinkButtonTagHelper.cs @@ -11,9 +11,9 @@ public class AbpLinkButtonTagHelper : AbpTagHelper { - public string Title { get; set; } + public string? Title { get; set; } - public string Subtitle { get; set; } + public string? Subtitle { get; set; } public AbpCardBodyTagHelper(AbpCardBodyTagHelperService tagHelperService) : base(tagHelperService) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Card/AbpCardBodyTagHelperService.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Card/AbpCardBodyTagHelperService.cs index 172fa778b6..e50d0a791a 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Card/AbpCardBodyTagHelperService.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Card/AbpCardBodyTagHelperService.cs @@ -22,7 +22,7 @@ public class AbpCardBodyTagHelperService : AbpTagHelperService { - public string Id { get; set; } + public string? Id { get; set; } public bool? Crossfade { get; set; } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Carousel/AbpCarouselTagHelperService.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Carousel/AbpCarouselTagHelperService.cs index 9264737b7b..af81b045f5 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Carousel/AbpCarouselTagHelperService.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Carousel/AbpCarouselTagHelperService.cs @@ -138,7 +138,7 @@ public class AbpCarouselTagHelperService : AbpTagHelperService it.Active) && itemList.Count > 0) { - itemList.FirstOrDefault().Active = true; + itemList.FirstOrDefault()!.Active = true; } } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Collapse/AbpAccordionItemTagHelper.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Collapse/AbpAccordionItemTagHelper.cs index 8742631e9a..99dd4ff3a1 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Collapse/AbpAccordionItemTagHelper.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Collapse/AbpAccordionItemTagHelper.cs @@ -2,9 +2,9 @@ public class AbpAccordionItemTagHelper : AbpTagHelper { - public string Id { get; set; } + public string? Id { get; set; } - public string Title { get; set; } + public string Title { get; set; } = default!; public bool? Active { get; set; } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Collapse/AbpAccordionTagHelper.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Collapse/AbpAccordionTagHelper.cs index 49cca3199f..a4a87ab32a 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Collapse/AbpAccordionTagHelper.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Collapse/AbpAccordionTagHelper.cs @@ -2,7 +2,7 @@ public class AbpAccordionTagHelper : AbpTagHelper { - public string Id { get; set; } + public string? Id { get; set; } public AbpAccordionTagHelper(AbpAccordionTagHelperService tagHelperService) : base(tagHelperService) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Collapse/AbpCollapseBodyTagHelper.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Collapse/AbpCollapseBodyTagHelper.cs index cd6d5d43ed..477c8ed1d8 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Collapse/AbpCollapseBodyTagHelper.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Collapse/AbpCollapseBodyTagHelper.cs @@ -2,7 +2,7 @@ public class AbpCollapseBodyTagHelper : AbpTagHelper { - public string Id { get; set; } + public string? Id { get; set; } public bool? Multi { get; set; } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Collapse/AbpCollapseButtonTagHelper.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Collapse/AbpCollapseButtonTagHelper.cs index c1219b3bbb..64d90496c3 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Collapse/AbpCollapseButtonTagHelper.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Collapse/AbpCollapseButtonTagHelper.cs @@ -8,7 +8,7 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Collapse; public class AbpCollapseButtonTagHelper : AbpTagHelper { [HtmlAttributeName("abp-collapse-id")] - public string BodyId { get; set; } + public string BodyId { get; set; } = default!; public AbpCollapseButtonTagHelper(AbpCollapseButtonTagHelperService tagHelperService) : base(tagHelperService) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Dropdown/AbpDropdownButtonTagHelper.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Dropdown/AbpDropdownButtonTagHelper.cs index ac87900307..bc0778cb47 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Dropdown/AbpDropdownButtonTagHelper.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Dropdown/AbpDropdownButtonTagHelper.cs @@ -4,7 +4,7 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Dropdown; public class AbpDropdownButtonTagHelper : AbpTagHelper { - public string Text { get; set; } + public string? Text { get; set; } public AbpButtonSize Size { get; set; } = AbpButtonSize.Default; @@ -12,7 +12,7 @@ public class AbpDropdownButtonTagHelper : AbpTagHelper(this ModelExplorer property) where T : Attribute + public static T? GetAttribute(this ModelExplorer property) where T : Attribute { - return property?.Metadata?.ContainerType?.GetTypeInfo()?.GetProperty(property.Metadata.PropertyName)?.GetCustomAttribute(); + return property?.Metadata?.ContainerType?.GetTypeInfo()?.GetProperty(property.Metadata.PropertyName!)?.GetCustomAttribute(); } public static int GetDisplayOrder(this ModelExplorer explorer) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Extensions/TagHelperContextExtensions.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Extensions/TagHelperContextExtensions.cs index 47ab8827e7..bda437f8c5 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Extensions/TagHelperContextExtensions.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Extensions/TagHelperContextExtensions.cs @@ -11,7 +11,7 @@ public static class TagHelperContextExtensions { if (!context.Items.ContainsKey(key)) { - return default(T); + return default(T)!; } return (T)context.Items[key]; diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpDynamicformTagHelper.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpDynamicformTagHelper.cs index 6f2ed964cb..4e4b86a308 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpDynamicformTagHelper.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpDynamicformTagHelper.cs @@ -12,7 +12,7 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form; public class AbpDynamicFormTagHelper : AbpTagHelper { [HtmlAttributeName("abp-model")] - public ModelExpression Model { get; set; } + public ModelExpression Model { get; set; } = default!; [HtmlAttributeName("column-size")] public ColumnSize ColumnSize { get; set; } @@ -23,7 +23,7 @@ public class AbpDynamicFormTagHelper : AbpTagHelper _routeValues; + private IDictionary? _routeValues; private const string ActionAttributeName = "asp-action"; private const string AreaAttributeName = "asp-area"; @@ -36,28 +36,28 @@ public class AbpDynamicFormTagHelper : AbpTagHelper RouteValues diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpDynamicformTagHelperService.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpDynamicformTagHelperService.cs index 5938ad356d..57fa9fe0fb 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpDynamicformTagHelperService.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpDynamicformTagHelperService.cs @@ -201,7 +201,7 @@ public class AbpDynamicFormTagHelperService : AbpTagHelperService(); + var modelAttribute = model.ModelExplorer.GetAttribute()!; var pickerId = modelAttribute.PickerId; @@ -214,16 +214,16 @@ public class AbpDynamicFormTagHelperService : AbpTagHelperService().IsEnd) + if (otherModelExists && otherModel!.GetAttribute()!.IsEnd) { - abpDateRangeInputTagHelper.AspForEnd = ModelExplorerToModelExpressionConverter(otherModel); + abpDateRangeInputTagHelper.AspForEnd = ModelExplorerToModelExpressionConverter(otherModel!); } } return abpDateRangeInputTagHelper; } - private bool TryToGetOtherDateModel(ModelExpression model, string pickerId, out ModelExplorer otherModel) + private bool TryToGetOtherDateModel(ModelExpression model, string pickerId, out ModelExplorer? otherModel) { otherModel = TagHelper.Model.ModelExplorer.Properties.SingleOrDefault(x => x != model.ModelExplorer && x.GetAttribute()?.PickerId == pickerId); return otherModel != null; @@ -266,7 +266,7 @@ public class AbpDynamicFormTagHelperService : AbpTagHelperService(); + var radioButtonAttribute = model.ModelExplorer.GetAttribute()!; var abpRadioInputTagHelper = _serviceProvider.GetRequiredService(); abpRadioInputTagHelper.AspFor = model; abpRadioInputTagHelper.AspItems = null; @@ -356,7 +356,7 @@ public class AbpDynamicFormTagHelperService : AbpTagHelperService -1000 - 1; [HtmlAttributeName("abp-id-name")] - public ModelExpression IdNameFor { get; set; } + public ModelExpression? IdNameFor { get; set; } private readonly MvcViewOptions _mvcViewOptions; diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpInputTagHelper.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpInputTagHelper.cs index 8c58e3c285..a426b50d33 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpInputTagHelper.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpInputTagHelper.cs @@ -6,11 +6,11 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form; public class AbpInputTagHelper : AbpTagHelper { - public ModelExpression AspFor { get; set; } + public ModelExpression AspFor { get; set; } = default!; - public string Label { get; set; } + public string? Label { get; set; } - public string LabelTooltip { get; set; } + public string? LabelTooltip { get; set; } public string LabelTooltipIcon { get; set; } = "bi-info-circle"; @@ -19,7 +19,7 @@ public class AbpInputTagHelper : AbpTagHelper var attribute = TagHelper.AspFor.ModelExplorer.GetAttribute(); - if (attribute != null) + if (attribute != null || TagHelper.FloatingLabel) { - var placeholderLocalized = _tagHelperLocalizer.GetLocalizedText(attribute.Value, TagHelper.AspFor.ModelExplorer); - + var placeholderLocalized = _tagHelperLocalizer.GetLocalizedText(attribute?.Value ?? TagHelper.AspFor.Name, TagHelper.AspFor.ModelExplorer); inputTagHelperOutput.Attributes.Add("placeholder", placeholderLocalized); } } @@ -397,7 +396,7 @@ public class AbpInputTagHelperService : AbpTagHelperService } } - protected virtual TextArea TryGetTextAreaAttribute(TagHelperOutput output) + protected virtual TextArea? TryGetTextAreaAttribute(TagHelperOutput output) { var textAreaAttribute = TagHelper.AspFor.ModelExplorer.GetAttribute