diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en-GB.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en-GB.json index 2429f52eef..48cba301a9 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en-GB.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en-GB.json @@ -15,6 +15,7 @@ "Permission:Maintain": "Maintain", "Permission:ClearCaches": "Clear caches", "Permission:Modules": "Modules", + "Permission:UserDownloads": "User Downloads", "Permission:Packages": "Packages", "Permission:Edit": "Edit", "Permission:Delete": "Delete", @@ -102,6 +103,9 @@ "DoYouWantToCreateNewUser": "Do you want to create new user?", "MasterModules": "Master Modules", "OrganizationName": "Organisation name", + "DownloadType": "Download type", + "UserDownloads": "User Downloads", + "AcceptNewsletter": "Accept newsletter", "CreationDate": "Creation date", "LicenseStartDate": "License start date", "LicenseEndDate": "License end date", diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json index 825de3e1cc..703c158dea 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json @@ -120,8 +120,15 @@ "PurchaseOrderNo": "Purchase order no", "QuotationDate": "Quotation date", "CompanyName": "Company name", + "DownloadType": "Download type", + "UserDownloads": "User Downloads", + "AcceptNewsletter": "Accept newsletter", "CompanyAddress": "Company address", "Price": "Price", + "Unknown": "Unknown", + "DddEBook": "Ddd EBook", + "MasteringAbpFrameworkEBook": "Mastering AbpFramework EBook", + "MicroserviceEBook": "Microservice EBook", "DiscountText": "Discount text", "DiscountQuantity": "Discount quantity", "DiscountPrice": "Discount price", @@ -284,6 +291,7 @@ "Menu:Quotation": "Quotation", "Menu:Invoice": "Invoice", "Menu:Quotation/Invoice": "Quotation/Invoice", + "Menu:UserDownloads": "User Downloads", "Menu:PaymentRequests": "Payment Requests", "Permission:PaymentRequests": "Payment Requests", "PaymentRequests": "Payment Requests", @@ -566,6 +574,7 @@ "AllowAbpStudioBetaAccess": "Allow ABP Studio Beta Access", "TotalQuestionCanNotBeNullMessage": "Total Question can not be null", "Permission:OrganizationAutoRenewalPayments": "Organization Auto Renewal Payments", + "Permission:UserDownloads": "User Downloads", "Permission:RetryFailedPayments": "Retry Failed Payments", "AutoRenewalIsNotEnabled": "Auto Renewal is not enabled!", "LicenseIsNotExpired": "License is not expired!", diff --git a/docs/en/cli/index.md b/docs/en/cli/index.md index c283121ce5..5a1d213764 100644 --- a/docs/en/cli/index.md +++ b/docs/en/cli/index.md @@ -105,6 +105,8 @@ abp cli update abp cli update --preview abp cli update --version 1.0.0 abp cli remove +abp cli check-version +abp cli clear-cache ```` ### new @@ -794,12 +796,19 @@ Examples: ````bash abp upgrade -t app +abp upgrade -t app --language-management --gdpr --audit-logging-ui --text-template-management --openiddict-pro +abp upgrade -t app-nolayers --audit-logging-ui abp upgrade -t app-nolayers -p D:\MyProjects\MyProject ```` #### Options * `--path` or `-p`: Specifies the module path. The module should be in that directory. If not specified, the default is the current directory. +* `--gdpr`: Installs GDPR module too. +* `--language-management`: Installs Language Management module too. +* `--audit-logging-ui`: Installs Audit Logging Pro (UI) module too. +* `--text-template-management`: Installs Text Template Management module too. +* `--openiddict-pro`: Installs OpenIddict Pro (UI) module too. ### translate diff --git a/docs/en/framework/ui/angular/quick-start.md b/docs/en/framework/ui/angular/quick-start.md index 2a8986f965..df2d6331b9 100644 --- a/docs/en/framework/ui/angular/quick-start.md +++ b/docs/en/framework/ui/angular/quick-start.md @@ -4,8 +4,8 @@ Please follow the steps below to prepare your development environment for Angular. -1. **Install Node.js:** Please visit [Node.js downloads page](https://nodejs.org/en/download/) and download proper Node.js v16 or v18 installer for your OS. An alternative is to install [NVM](https://github.com/nvm-sh/nvm) and use it to have multiple versions of Node.js in your operating system. -2. **[Optional] Install Yarn:** You may install Yarn v1 (not v2) following the instructions on [the installation page](https://classic.yarnpkg.com/en/docs/install). Yarn v1 delivers an arguably better developer experience compared to npm v6 and below. You may skip this step and work with npm, which is built-in in Node.js, instead. +1. **Install Node.js:** Please visit [Node.js downloads page](https://nodejs.org/en/download/) and download proper Node.js `v18.19+` installer for your OS. An alternative is to install [NVM](https://github.com/nvm-sh/nvm) and use it to have multiple versions of Node.js in your operating system. +2. **[Optional] Install Yarn:** You may install Yarn v1.22+ (not v2) following the instructions on [the installation page](https://classic.yarnpkg.com/en/docs/install). Yarn v1 delivers an arguably better developer experience compared to npm v10 and below. You may skip this step and work with npm, which is built-in in Node.js, instead. 3. **[Optional] Install VS Code:** [VS Code](https://code.visualstudio.com/) is a free, open-source IDE which works seamlessly with TypeScript. Although you can use any IDE including Visual Studio or Rider, VS Code will most likely deliver the best developer experience when it comes to Angular projects. ABP project templates even contain plugin recommendations for VS Code users, which VS Code will ask you to install when you open the Angular project folder. Here is a list of recommended extensions: - [Angular Language Service](https://marketplace.visualstudio.com/items?itemName=angular.ng-template) - [Prettier - Code formatter](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode) diff --git a/docs/en/get-started/layered-web-application.md b/docs/en/get-started/layered-web-application.md index ee26397797..804b2df787 100644 --- a/docs/en/get-started/layered-web-application.md +++ b/docs/en/get-started/layered-web-application.md @@ -22,8 +22,8 @@ The following tools should be installed on your development machine: * [Visual Studio 2022](https://visualstudio.microsoft.com/vs/) (v17.3+) for Windows / [Visual Studio for Mac](https://visualstudio.microsoft.com/vs/mac/). [1](#f-editor) * [.NET 8.0+](https://dotnet.microsoft.com/en-us/download/dotnet) {{ if UI != "Blazor" }} -* [Node v16 or v18](https://nodejs.org/) -* [Yarn v1.20+ (not v2)](https://classic.yarnpkg.com/en/docs/install) [2](#f-yarn) or npm v6+ (already installed with Node) +* [Node v18.19+](https://nodejs.org/) +* [Yarn v1.22+ (not v2)](https://classic.yarnpkg.com/en/docs/install) [2](#f-yarn) or npm v10+ (already installed with Node) {{ end }} {{ if Tiered == "Yes" }} * [Redis](https://redis.io/) (as the [distributed cache](Caching.md)). diff --git a/docs/en/get-started/single-layer-web-application.md b/docs/en/get-started/single-layer-web-application.md index 9708c513cb..201d0fb2df 100644 --- a/docs/en/get-started/single-layer-web-application.md +++ b/docs/en/get-started/single-layer-web-application.md @@ -21,8 +21,8 @@ The following tools should be installed on your development machine: * [Visual Studio 2022](https://visualstudio.microsoft.com/vs/) (v17.3+) for Windows / [Visual Studio for Mac](https://visualstudio.microsoft.com/vs/mac/). [1](#f-editor) * [.NET 8.0+](https://dotnet.microsoft.com/en-us/download/dotnet) {{ if UI != "Blazor" }} -* [Node v16 or v18](https://nodejs.org/) -* [Yarn v1.20+ (not v2)](https://classic.yarnpkg.com/en/docs/install) [2](#f-yarn) or npm v6+ (already installed with Node) +* [Node v18.19+](https://nodejs.org/) +* [Yarn v1.22+ (not v2)](https://classic.yarnpkg.com/en/docs/install) [2](#f-yarn) or npm v10+ (already installed with Node) {{ end }} {{ if Tiered == "Yes" }} * [Redis](https://redis.io/) (as the [distributed cache](Caching.md)). diff --git a/docs/en/guides/migrating-from-open-source.md b/docs/en/guides/migrating-from-open-source.md index f73b7afc8d..5340e4212a 100644 --- a/docs/en/guides/migrating-from-open-source.md +++ b/docs/en/guides/migrating-from-open-source.md @@ -9,12 +9,14 @@ ABP Studio provides a way for users, who already started the development before * Alternatively, you can use the following ABP Studio CLI command to achieve the same functionality: ```bash - abp upgrade [-t ] + abp upgrade [-t ] [options] Examples: abp upgrade -t app - abp upgrade -t app-nolayers + abp upgrade -t app --language-management --gdpr --audit-logging-ui --text-template-management --openiddict-pro + abp upgrade -t app-nolayers --audit-logging-ui + abp upgrade -t app-nolayers -p D:\MyProjects\MyProject ``` ## Changes in the solution @@ -31,15 +33,14 @@ This command will remove the following modules from your solution: And install the following modules to your solution: - Volo.Abp.Account.Pro -- Volo.Abp.AuditLogging.Pro - Volo.Abp.Identity.Pro -- Volo.Abp.OpenIddict.Pro -- Volo.Saas -- Volo.Abp.LanguageManagement -- Volo.Abp.TextTemplateManagement -- Volo.FileManagement -- Volo.Abp.Gdpr - Volo.Abp.LeptonXTheme +- Volo.Saas +- Volo.Abp.OpenIddict.Pro (*Optional*) +- Volo.Abp.AuditLogging.Pro (*Optional*) +- Volo.Abp.LanguageManagement (*Optional*) +- Volo.Abp.TextTemplateManagement (*Optional*) +- Volo.Abp.Gdpr (*Optional*) ### Other changes diff --git a/docs/en/release-info/migration-guides/abp-8-3.md b/docs/en/release-info/migration-guides/abp-8-3.md index bc726e68d8..50a7f274a4 100644 --- a/docs/en/release-info/migration-guides/abp-8-3.md +++ b/docs/en/release-info/migration-guides/abp-8-3.md @@ -49,6 +49,10 @@ However, notice this package is used by the `@abp/aspnetcore.mvc.ui.theme.shared See the PR for more info: https://github.com/abpframework/abp/pull/19340 +### Angular UI + +We wish to formally inform you that ABP version 8.3 has been upgraded to incorporate Angular version 18. Consequently, we recommend migrating your application to [Angular v18](https://angular.dev/update-guide) to ensure compatibility. + ## PRO > Please check the **Open-Source (Framework)** section before reading this section. The listed topics might affect your application and you might need to take care of them. diff --git a/docs/en/studio/installation.md b/docs/en/studio/installation.md index 11f390f9f3..4dc158e464 100644 --- a/docs/en/studio/installation.md +++ b/docs/en/studio/installation.md @@ -8,7 +8,7 @@ Before you begin the installation process for ABP Studio, ensure that your system meets the following pre-requirements: ### Node -Make sure [Node.js](https://nodejs.org/en) is installed on your system. If you have not installed Node.js, you can download the `v16` or `v18` version from the official [Node.js website](https://nodejs.org/en/download/prebuilt-installer). +Make sure [Node.js](https://nodejs.org/en) is installed on your system. If you have not installed Node.js, you can download the `v18.19+` version from the official [Node.js website](https://nodejs.org/en/download/prebuilt-installer). ### WireGuard (Optional) ABP Studio needs [WireGuard](https://www.wireguard.com/) for Kubernetes operations. You can find the installation instructions for your specific operating system below: diff --git a/docs/en/tutorials/todo/layered/index.md b/docs/en/tutorials/todo/layered/index.md index db25c826f1..6761bb68bb 100644 --- a/docs/en/tutorials/todo/layered/index.md +++ b/docs/en/tutorials/todo/layered/index.md @@ -53,7 +53,7 @@ This documentation has a video tutorial on **YouTube**!! You can watch it here: ## Pre-Requirements * An IDE (e.g. [Visual Studio](https://visualstudio.microsoft.com/vs/)) that supports [.NET 8.0+](https://dotnet.microsoft.com/download/dotnet) development. -* [Node v16.x](https://nodejs.org/) +* [Node v18.19+](https://nodejs.org/) {{if DB=="Mongo"}} diff --git a/docs/en/tutorials/todo/single-layer/index.md b/docs/en/tutorials/todo/single-layer/index.md index 9afbbd8833..3b4f755c70 100644 --- a/docs/en/tutorials/todo/single-layer/index.md +++ b/docs/en/tutorials/todo/single-layer/index.md @@ -49,7 +49,7 @@ This documentation has a video tutorial on **YouTube**!! You can watch it here: ## Pre-Requirements * An IDE (e.g. [Visual Studio](https://visualstudio.microsoft.com/vs/)) that supports [.NET 8.0+](https://dotnet.microsoft.com/download/dotnet) development. -* [Node v16.x](https://nodejs.org/) +* [Node v18.19+](https://nodejs.org/) {{if DB=="Mongo"}} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/AbpAspNetCoreMvcUiBundlingModule.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/AbpAspNetCoreMvcUiBundlingModule.cs index bdd4cb2a27..4e020bfcf8 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/AbpAspNetCoreMvcUiBundlingModule.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/AbpAspNetCoreMvcUiBundlingModule.cs @@ -1,4 +1,5 @@ -using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap; +using Volo.Abp.AspNetCore.Mvc.Libs; +using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap; using Volo.Abp.Minify; using Volo.Abp.Modularity; @@ -11,5 +12,11 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling; )] public class AbpAspNetCoreMvcUiBundlingModule : AbpModule { - + public override void ConfigureServices(ServiceConfigurationContext context) + { + Configure(options => + { + options.CheckLibs = true; + }); + } } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcModule.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcModule.cs index 7b68fca32d..379523b659 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcModule.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcModule.cs @@ -32,6 +32,7 @@ using Volo.Abp.AspNetCore.Mvc.DataAnnotations; using Volo.Abp.AspNetCore.Mvc.DependencyInjection; using Volo.Abp.AspNetCore.Mvc.Infrastructure; using Volo.Abp.AspNetCore.Mvc.Json; +using Volo.Abp.AspNetCore.Mvc.Libs; using Volo.Abp.AspNetCore.Mvc.Localization; using Volo.Abp.AspNetCore.VirtualFileSystem; using Volo.Abp.DependencyInjection; @@ -231,6 +232,7 @@ public class AbpAspNetCoreMvcModule : AbpModule public override void OnApplicationInitialization(ApplicationInitializationContext context) { AddApplicationParts(context); + CheckLibs(context); } private static void AddApplicationParts(ApplicationInitializationContext context) @@ -277,4 +279,9 @@ public class AbpAspNetCoreMvcModule : AbpModule partManager.ApplicationParts.AddIfNotContains(moduleAssembly); } } + + private static void CheckLibs(ApplicationInitializationContext context) + { + context.ServiceProvider.GetRequiredService().CheckLibs(context); + } } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ExceptionHandling/AbpExceptionFilter.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ExceptionHandling/AbpExceptionFilter.cs index d2abae0902..3b60e74d78 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ExceptionHandling/AbpExceptionFilter.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ExceptionHandling/AbpExceptionFilter.cs @@ -75,10 +75,18 @@ public class AbpExceptionFilter : IAsyncExceptionFilter, IAbpFilter, ITransientD } else { - context.HttpContext.Response.Headers.Add(AbpHttpConsts.AbpErrorFormat, "true"); - context.HttpContext.Response.StatusCode = (int)context - .GetRequiredService() - .GetStatusCode(context.HttpContext, context.Exception); + if (!context.HttpContext.Response.HasStarted) + { + context.HttpContext.Response.Headers.Add(AbpHttpConsts.AbpErrorFormat, "true"); + context.HttpContext.Response.StatusCode = (int)context + .GetRequiredService() + .GetStatusCode(context.HttpContext, context.Exception); + } + else + { + var logger = context.GetService>(NullLogger.Instance)!; + logger.LogWarning("HTTP response has already started, cannot set headers and status code!"); + } context.Result = new ObjectResult(new RemoteServiceErrorResponse(remoteServiceErrorInfo)); } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ExceptionHandling/AbpExceptionPageFilter.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ExceptionHandling/AbpExceptionPageFilter.cs index f404f52e5d..56814718b6 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ExceptionHandling/AbpExceptionPageFilter.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ExceptionHandling/AbpExceptionPageFilter.cs @@ -103,10 +103,17 @@ public class AbpExceptionPageFilter : IAsyncPageFilter, IAbpFilter, ITransientDe } else { - context.HttpContext.Response.Headers.Add(AbpHttpConsts.AbpErrorFormat, "true"); - context.HttpContext.Response.StatusCode = (int)context - .GetRequiredService() - .GetStatusCode(context.HttpContext, context.Exception!); + if (!context.HttpContext.Response.HasStarted) + { + context.HttpContext.Response.Headers.Add(AbpHttpConsts.AbpErrorFormat, "true"); + context.HttpContext.Response.StatusCode = (int)context + .GetRequiredService() + .GetStatusCode(context.HttpContext, context.Exception!); + } + else + { + logger.LogWarning("HTTP response has already started, cannot set headers and status code!"); + } context.Result = new ObjectResult(new RemoteServiceErrorResponse(remoteServiceErrorInfo)); } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Libs/AbpMvcLibsOptions.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Libs/AbpMvcLibsOptions.cs new file mode 100644 index 0000000000..d166528a05 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Libs/AbpMvcLibsOptions.cs @@ -0,0 +1,6 @@ +namespace Volo.Abp.AspNetCore.Mvc.Libs; + +public class AbpMvcLibsOptions +{ + public bool CheckLibs { get; set; } +} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Libs/AbpMvcLibsService.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Libs/AbpMvcLibsService.cs new file mode 100644 index 0000000000..1329fa5e27 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Libs/AbpMvcLibsService.cs @@ -0,0 +1,88 @@ +using System; +using System.IO; +using System.Linq; +using System.Net; +using System.Text; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Microsoft.Extensions.FileProviders; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.AspNetCore.Mvc.Libs; + +public class AbpMvcLibsService : IAbpMvcLibsService, ITransientDependency +{ + private Task? _checkLibsTask; + + public virtual void CheckLibs(ApplicationInitializationContext context) + { + var options = context.ServiceProvider.GetRequiredService>().Value; + if (options.CheckLibs) + { + var app = context.GetApplicationBuilder(); + app.Use(async (httpContext, next) => + { + if (!await CheckLibsAsyncOnceAsync(httpContext)) + { + httpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError; + httpContext.Response.ContentType = "text/html"; + await httpContext.Response.WriteAsync( + "" + + " " + + " Error - The Libs folder is missing!" + + " " + + " " + + "

⚠️ The Libs folder under the wwwroot/libs directory is empty!

" + + "

The Libs folder contains mandatory NPM Packages for running the project.

" + + "

Make sure you run the abp install-libs CLI tool command.

" + + "

For more information, check out the ABP CLI documentation

" + + " " + + "", + Encoding.UTF8 + ); + return; + } + + await next(httpContext); + }); + } + } + + protected virtual Task CheckLibsAsyncOnceAsync(HttpContext httpContext) + { + if (_checkLibsTask == null) + { + _checkLibsTask = CheckLibsAsync(httpContext); + } + + return _checkLibsTask; + } + + protected virtual Task CheckLibsAsync(HttpContext httpContext) + { + var logger = httpContext.RequestServices.GetRequiredService>(); + try + { + var fileProvider = new PhysicalFileProvider(httpContext.RequestServices.GetRequiredService().WebRootPath); + var libsFolder = fileProvider.GetDirectoryContents("/libs"); + if (!libsFolder.Exists || !libsFolder.Any()) + { + logger.LogError("The 'wwwroot/libs' folder does not exist or empty!"); + return Task.FromResult(false); + } + } + catch (Exception e) + { + // In case of any exception, log it and return true to prevent crashing the application. + logger.LogError(e, "An error occurred while checking the libs folder!"); + } + + return Task.FromResult(true); + } +} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Libs/IAbpMvcLibsService.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Libs/IAbpMvcLibsService.cs new file mode 100644 index 0000000000..98a88184e8 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Libs/IAbpMvcLibsService.cs @@ -0,0 +1,6 @@ +namespace Volo.Abp.AspNetCore.Mvc.Libs; + +public interface IAbpMvcLibsService +{ + void CheckLibs(ApplicationInitializationContext context); +} diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcTestModule.cs b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcTestModule.cs index 027403d226..0e13746d66 100644 --- a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcTestModule.cs +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcTestModule.cs @@ -8,6 +8,7 @@ using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.Extensions.DependencyInjection; using Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations; using Volo.Abp.AspNetCore.Mvc.GlobalFeatures; +using Volo.Abp.AspNetCore.Mvc.Libs; using Volo.Abp.AspNetCore.Mvc.Localization; using Volo.Abp.AspNetCore.Mvc.Localization.Resource; using Volo.Abp.AspNetCore.Security.Claims; @@ -140,6 +141,11 @@ public class AbpAspNetCoreMvcTestModule : AbpModule }); context.Services.TransformAbpClaims(); + + Configure(options => + { + options.CheckLibs = false; + }); } public override void OnApplicationInitialization(ApplicationInitializationContext context) diff --git a/latest-versions.json b/latest-versions.json index 4649df25e4..8e0b7be03d 100644 --- a/latest-versions.json +++ b/latest-versions.json @@ -1,6 +1,6 @@ [ { - "version": "8.2.1", + "version": "8.2.2", "releaseDate": "", "type": "stable", "message": "" diff --git a/modules/docs/src/Volo.Docs.Web/Bundling/PrismjsScriptBundleContributorDocsExtension.cs b/modules/docs/src/Volo.Docs.Web/Bundling/PrismjsScriptBundleContributorDocsExtension.cs index 3fc129bf55..0be1e7cb29 100644 --- a/modules/docs/src/Volo.Docs.Web/Bundling/PrismjsScriptBundleContributorDocsExtension.cs +++ b/modules/docs/src/Volo.Docs.Web/Bundling/PrismjsScriptBundleContributorDocsExtension.cs @@ -23,7 +23,8 @@ namespace Volo.Docs.Bundling "scss", "sql", "typescript", - "diff" + "diff", + "yaml" }; public override void ConfigureBundle(BundleConfigurationContext context) diff --git a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs index d69d72f038..2f029fcfce 100644 --- a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs +++ b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs @@ -197,7 +197,6 @@ namespace Volo.Docs.Pages.Documents.Project await SetNavigationAsync(); SetLanguageSelectListItems(); - SetDocumentPageTitle(); return Page(); } @@ -472,7 +471,12 @@ namespace Volo.Docs.Pages.Documents.Project private void SetDocumentPageTitle() { - DocumentPageTitle = Navigation.FindNavigation(DocumentNameWithExtension)?.Text ?? DocumentName?.Replace("-", " "); + DocumentPageTitle = DocumentName?.Replace("-", " "); + var match = Regex.Match(Document.Content, @"#(?.+)"); + if (match.Success && match.Groups.TryGetValue("PageTitle", out var group)) + { + DocumentPageTitle = Regex.Replace(group.Value, "<.*?>", string.Empty).Trim(); + } } public string CreateVersionLink(VersionInfoViewModel latestVersion, string version, string documentName = null) @@ -508,6 +512,7 @@ namespace Volo.Docs.Pages.Documents.Project Document = await GetSpecificDocumentOrDefaultAsync(language); DocumentLanguageCode = language; DocumentNameWithExtension = Document.Name; + SetDocumentPageTitle(); await ConvertDocumentContentToHtmlAsync(); return true; }