diff --git a/.github/scripts/update_versions.py b/.github/scripts/update_versions.py index dcbd749796..1f593273bc 100644 --- a/.github/scripts/update_versions.py +++ b/.github/scripts/update_versions.py @@ -1,54 +1,79 @@ import os import json +import re +import xml.etree.ElementTree as ET from github import Github -def update_latest_versions(): - version = os.environ["GITHUB_REF"].split("/")[-1] +def get_target_release_branch(version): + """ + Extracts the first two numbers from the release version (`9.0.5` → `rel-9.0`) + to determine the corresponding `rel-x.x` branch. + """ + match = re.match(r"(\d+)\.(\d+)\.\d+", version) + if not match: + raise ValueError(f"Invalid version format: {version}") - if "rc" in version: - return False + major, minor = match.groups() + target_branch = f"rel-{major}.{minor}" + return target_branch - with open("latest-versions.json", "r") as f: - latest_versions = json.load(f) +def get_version_from_common_props(branch): + """ + Retrieves `Version` and `LeptonXVersion` from the `common.props` file in the specified branch. + """ + g = Github(os.environ["GITHUB_TOKEN"]) + repo = g.get_repo("abpframework/abp") - latest_versions[0]["version"] = version + try: + file_content = repo.get_contents("common.props", ref=branch) + common_props_content = file_content.decoded_content.decode("utf-8") - with open("latest-versions.json", "w") as f: - json.dump(latest_versions, f, indent=2) + root = ET.fromstring(common_props_content) + version = root.find(".//Version").text + leptonx_version = root.find(".//LeptonXVersion").text - return True + return version, leptonx_version + except Exception as e: + raise FileNotFoundError(f"common.props not found in branch {branch}: {e}") -def create_pr(): - g = Github(os.environ["GITHUB_TOKEN"]) - repo = g.get_repo("abpframework/abp") +def update_latest_versions(): + """ + Updates `latest-versions.json` based on the most relevant release branch. + """ + # Get the release version from GitHub reference + release_version = os.environ["GITHUB_REF"].split("/")[-1] # Example: "refs/tags/v9.0.5" → "v9.0.5" + if release_version.startswith("v"): + release_version = release_version[1:] # Convert to "9.0.5" format - branch_name = f"update-latest-versions-{os.environ['GITHUB_REF'].split('/')[-1]}" - base = repo.get_branch("dev") - repo.create_git_ref(ref=f"refs/heads/{branch_name}", sha=base.commit.sha) + # Determine the correct `rel-x.x` branch + target_branch = get_target_release_branch(release_version) + + # Retrieve `common.props` data from the target branch + version, leptonx_version = get_version_from_common_props(target_branch) - # Get the current latest-versions.json file and its sha - contents = repo.get_contents("latest-versions.json", ref="dev") - file_sha = contents.sha + # Skip if the version is a preview or release candidate + if "preview" in version or "rc" in version: + return False - # Update the file in the repo - repo.update_file( - path="latest-versions.json", - message=f"Update latest-versions.json to version {os.environ['GITHUB_REF'].split('/')[-1]}", - content=open("latest-versions.json", "r").read().encode("utf-8"), - sha=file_sha, - branch=branch_name, - ) + # Read the `latest-versions.json` file + with open("latest-versions.json", "r") as f: + latest_versions = json.load(f) - try: - pr = repo.create_pull(title="Update latest-versions.json", - body="Automated PR to update the latest-versions.json file.", - head=branch_name, base="dev") - except Exception as e: - print(f"Error while creating PR: {e}") + # Add the new version entry + new_version_entry = { + "version": version, + "releaseDate": "", + "type": "stable", + "message": "", + "leptonx": { + "version": leptonx_version + } + } + + latest_versions.insert(0, new_version_entry) # Insert the new version at the top - pr.create_review_request(reviewers=["ebicoglu", "gizemmutukurt", "skoc10"]) + # Update the file + with open("latest-versions.json", "w") as f: + json.dump(latest_versions, f, indent=2) -if __name__ == "__main__": - should_create_pr = update_latest_versions() - if should_create_pr: - create_pr() \ No newline at end of file + return True diff --git a/Directory.Packages.props b/Directory.Packages.props index 9c944083b9..c860d010c0 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -164,7 +164,7 @@ - + @@ -183,4 +183,4 @@ - \ No newline at end of file + diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json index 4856813fe1..b81733d247 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json @@ -645,7 +645,7 @@ "ExtendPaymentInfoSection_Description": "By extending/renewing your license, you will continue to get premium support. You will also be able to get major or minor updates for modules and themes. You will be able to continue creating new projects. And you will still be able to use ABP Suite which speeds up your development.", "LicenseRenewalPrice": "License renewal price", "LicensePrice": "License Price", - "TrialLicensePaymentInfoSection_Description": "Purchase license: By purchasing a license, you will continue to get premium support. You will also be able to get major or minor updates for modules and themes. You will be able to continue creating new projects. And you will still be able to use ABP Suite which speeds up your development.
See the license comparison table to check the differences between the license types.", + "TrialLicensePaymentInfoSection_Description": "Purchase license: By purchasing a license, you will continue to get premium support. You will also be able to get major or minor updates for modules and themes. You will be able to continue creating new projects. And you will still be able to use ABP Suite which speeds up your development.
See the license comparison table to check the differences between the license types.", "SelectTargetLicense": "Select Target License", "UpgradePaymentInfoSection_ExtendMyLicenseForOneYear": "Yes, extend my license expiration date for 1 year.", "UpgradePaymentInfoSection_WantToExtendLicense": "Do you want to extend your license for 1 more year?", diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json index 2cc7827122..9f9dd49e65 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json @@ -1348,7 +1348,7 @@ "ExtendPaymentInfoSection_Description": "By extending/renewing your license, you will continue to get premium support. You will also be able to get major or minor updates for modules and themes. You will be able to continue creating new projects. And you will still be able to use ABP Suite which speeds up your development.", "LicenseRenewalPrice": "License renewal price", "LicensePrice": "License Price", - "TrialLicensePaymentInfoSection_Description": "Purchase license: By purchasing a license, you will continue to get premium support. You will also be able to get major or minor updates for modules and themes. You will be able to continue creating new projects. And you will still be able to use ABP Suite which speeds up your development.
See the license comparison table to check the differences between the license types.", + "TrialLicensePaymentInfoSection_Description": "Purchase license: By purchasing a license, you will continue to get premium support. You will also be able to get major or minor updates for modules and themes. You will be able to continue creating new projects. And you will still be able to use ABP Suite which speeds up your development.
See the license comparison table to check the differences between the license types.", "SelectTargetLicense": "Select Target License", "UpgradePaymentInfoSection_ExtendMyLicenseForOneYear": "Yes, extend my license expiration date for 1 year.", "UpgradePaymentInfoSection_WantToExtendLicense": "Do you want to extend your license for 1 more year?", diff --git a/common.props b/common.props index b1355eb36a..0a2b822389 100644 --- a/common.props +++ b/common.props @@ -1,8 +1,13 @@ latest +<<<<<<< auto-merge/rel-9-1/3468 + 9.1.0-rc.2 + 4.1.0-rc.2 +======= 9.2.0-preview 4.2.0-preview +>>>>>>> dev $(NoWarn);CS1591;CS0436 https://abp.io/assets/abp_nupkg.png https://abp.io/ diff --git a/docs/en/Community-Articles/2023-11-06-Blazor-Fullstack-Web-Ui/Post.md b/docs/en/Community-Articles/2023-11-06-Blazor-Fullstack-Web-Ui/Post.md index c1c38d7818..5c1b03701e 100644 --- a/docs/en/Community-Articles/2023-11-06-Blazor-Fullstack-Web-Ui/Post.md +++ b/docs/en/Community-Articles/2023-11-06-Blazor-Fullstack-Web-Ui/Post.md @@ -1,8 +1,5 @@ # Blazor's History and Full-stack Web UI -![Cover Image](cover-image.png) - - Blazor is a web framework that allows developers to build interactive web applications using .NET instead of JavaScript. The first version of Blazor was released on May 14, 2020. Since its initial release, Blazor has evolved with the new versions. Until now, six different versions have been declared. Sometimes, it can be not very clear to see the differences between these approaches. First, let's try to understand these. * **Blazor-Server**: >> *Loads fast at first* >> In this version, heavy things are done in the server. Browsers are thin clients and download a small page for the first load. The page updates are done via SignalR connection. This was released with .NET Core 3. diff --git a/docs/en/Community-Articles/2024-01-15-Abp-Supports-NET8/Post.md b/docs/en/Community-Articles/2024-01-15-Abp-Supports-NET8/Post.md index a45f893b16..c6a37d85cd 100644 --- a/docs/en/Community-Articles/2024-01-15-Abp-Supports-NET8/Post.md +++ b/docs/en/Community-Articles/2024-01-15-Abp-Supports-NET8/Post.md @@ -1,5 +1,3 @@ -![cover](cover.png) - # ABP Now Supports .NET 8 Recently we have published ABP v8.0. With this version [the ABP Framework](https://github.com/abpframework/abp/blob/dev/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyCompanyName.MyProjectName.Web.csproj#L6) and ABP Commercial both supports for .NET 8, aligning itself with the latest enhancements and new features of the ASP.NET's new version 8. @@ -170,4 +168,4 @@ Starting in .NET 8, C# Hot Reload [supports modifying generic types and generic *References:* -* https://learn.microsoft.com/en-us/dotnet/core/whats-new/dotnet-8 \ No newline at end of file +* https://learn.microsoft.com/en-us/dotnet/core/whats-new/dotnet-8 diff --git a/docs/en/Community-Articles/2024-08-28-Understanding-AOT-vs-JIT/POST.md b/docs/en/Community-Articles/2024-08-28-Understanding-AOT-vs-JIT/POST.md index 295b509029..cd4c3177a1 100644 --- a/docs/en/Community-Articles/2024-08-28-Understanding-AOT-vs-JIT/POST.md +++ b/docs/en/Community-Articles/2024-08-28-Understanding-AOT-vs-JIT/POST.md @@ -1,7 +1,3 @@ - - -![book](images/cover.png) - Ahead-of-Time (AOT) compilation and Just-in-Time (JIT) compilation are two different methods for compiling Angular applications. Here's a breakdown of the differences between them: ### **Ahead-of-Time (AOT) Compilation** @@ -61,4 +57,4 @@ Ahead-of-Time (AOT) compilation and Just-in-Time (JIT) compilation are two diffe ### **Best Practices:** - **Use AOT** for production builds to ensure faster load times, smaller bundle sizes, and more secure applications. -- **Use JIT** during development to take advantage of quicker builds and easier debugging. \ No newline at end of file +- **Use JIT** during development to take advantage of quicker builds and easier debugging. diff --git a/docs/en/Community-Articles/2024-08-29-What-is-Angular-Schematics/Post.md b/docs/en/Community-Articles/2024-08-29-What-is-Angular-Schematics/Post.md index c13c5ab345..5ea6cb6528 100644 --- a/docs/en/Community-Articles/2024-08-29-What-is-Angular-Schematics/Post.md +++ b/docs/en/Community-Articles/2024-08-29-What-is-Angular-Schematics/Post.md @@ -1,7 +1,5 @@ # What is Angular Schematics? -![Cover Image](cover.png) - **Angular Schematics** is a powerful tool which is part of the Angular CLI that allows developers to automate various development tasks by **generating and modifying code**. Schematics provides a way to create **templates and boilerplate code** for Angular applications or libraries, enabling consistency and reducing the amount of repetitive work. ### Key Concepts of Angular Schematics: @@ -82,4 +80,4 @@ Here are the direct links for the Angular Schematics resources: ### Conclusion: -Angular Schematics is a powerful tool for automating repetitive tasks, generating consistent code, and managing project upgrades. By leveraging schematics, Angular developers can save time, reduce errors, and enforce best practices across their projects. \ No newline at end of file +Angular Schematics is a powerful tool for automating repetitive tasks, generating consistent code, and managing project upgrades. By leveraging schematics, Angular developers can save time, reduce errors, and enforce best practices across their projects. diff --git a/docs/en/Community-Articles/2024-09-01-Do-You-Need-MultiTenancy/Post.md b/docs/en/Community-Articles/2024-09-01-Do-You-Need-MultiTenancy/Post.md index b80917f4c4..a294a1f2e6 100644 --- a/docs/en/Community-Articles/2024-09-01-Do-You-Need-MultiTenancy/Post.md +++ b/docs/en/Community-Articles/2024-09-01-Do-You-Need-MultiTenancy/Post.md @@ -2,8 +2,6 @@ This article discusses whether you need a multi-tenancy architecture for your next project. Answer my critical questions to decide if multi-tenancy suits your application or not! -![Cover image](cover.png) - ## What’s Multi-tenancy? It’s an architectural approach to building SaaS solutions. In this model, the hardware and software resources are shared between tenants, and application data is virtually or physically isolated between tenants. Here, **the main goal is minimizing costs and maximizing customer count**. diff --git a/docs/en/Community-Articles/2024-09-18-Blazor-9-New-Features/post.md b/docs/en/Community-Articles/2024-09-18-Blazor-9-New-Features/post.md index bc73c13210..1d78b493e4 100644 --- a/docs/en/Community-Articles/2024-09-18-Blazor-9-New-Features/post.md +++ b/docs/en/Community-Articles/2024-09-18-Blazor-9-New-Features/post.md @@ -2,8 +2,6 @@ In this article, I'll highlight .NET 9's Blazor updates and important features for ASP.NET Core 9.0. These features are based on the latest .NET 9 Preview 7. -![Cover](cover.png) - ## .NET MAUI Blazor Hybrid App and Web App solution template There's a new solution template to create .**NET MAUI native** and **Blazor web client** apps. This new template allows to choose a Blazor interactive render mode, it uses a shared Razor class library to maintain the UI's Razor components. diff --git a/docs/en/Community-Articles/2024-09-24-Angular-Difference-Btw-Promise-Observable/post.md b/docs/en/Community-Articles/2024-09-24-Angular-Difference-Btw-Promise-Observable/post.md index 39d722a293..9f8ae4c9d7 100644 --- a/docs/en/Community-Articles/2024-09-24-Angular-Difference-Btw-Promise-Observable/post.md +++ b/docs/en/Community-Articles/2024-09-24-Angular-Difference-Btw-Promise-Observable/post.md @@ -2,10 +2,6 @@ In this article, I will mention the differences between `Promise` and `Observable` . They are used in TypeScript (Angular) for handling async operations but have different use cases and behaviors. Let's see these six differences... -![Cover](cover.png) - - - ## 1. Eager or Lazy Evaluation - **Promise**: A `promise` is **eager**! This means that as soon as a `promise` is created, it executes the operation, like initiating immediately an HTTP request. **You can't control the execution start time; it begins right away!** diff --git a/docs/en/Community-Articles/2024-10-01-SignalR-9-New-Features/Post.md b/docs/en/Community-Articles/2024-10-01-SignalR-9-New-Features/Post.md index c004d45eba..c92e38f764 100644 --- a/docs/en/Community-Articles/2024-10-01-SignalR-9-New-Features/Post.md +++ b/docs/en/Community-Articles/2024-10-01-SignalR-9-New-Features/Post.md @@ -1,11 +1,6 @@ ### ASP.NET Core SignalR New Features — Summary - In this article, I’ll highlight the latest .**NET 9 SignalR updates** for ASP.NET Core 9.0. -![Cover](cover.png) - - - ### SignalR Hub Accepts Base Classes SignalR `Hub` class can now get a base class of a polymorphic class. As you see in the example below, I can send `Animal` to `Process` method. Before .NET 9, we could only pass the derived classes: `Cat` and `Dog`. diff --git a/docs/en/Community-Articles/2024-10-09-Cookies-vs-Local-Storage/Post.md b/docs/en/Community-Articles/2024-10-09-Cookies-vs-Local-Storage/Post.md index bac7f69596..b7122253ab 100644 --- a/docs/en/Community-Articles/2024-10-09-Cookies-vs-Local-Storage/Post.md +++ b/docs/en/Community-Articles/2024-10-09-Cookies-vs-Local-Storage/Post.md @@ -1,9 +1,5 @@ # When to Use Cookies, When to Use Local Storage? -![cover](cover.png) - - - ## Cookies vs Local Storage When you want to save client-side data on browsers, you can use `Cookies` or `Local Storage` of the browser. While these methods look similar, they have different behaviors. You need to decide based on the specific use-case, security concerns and the data size being stored. I'll clarify the differences between these methods. @@ -60,4 +56,4 @@ When you want to save client-side data on browsers, you can use `Cookies` or `Lo In many cases, you might use both cookies and local storage, depending on the specific requirements of different parts of your application. There are also other places where you can store the client-side data. You can check out [this article](https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Client-side_web_APIs/Client-side_storage) for more information. -Happy coding 🧑🏽‍💻 \ No newline at end of file +Happy coding 🧑🏽‍💻 diff --git a/docs/en/Community-Articles/2024-10-09-NET9-Performance-Improvements/Post.md b/docs/en/Community-Articles/2024-10-09-NET9-Performance-Improvements/Post.md index 67e451f0df..4710cc0a99 100644 --- a/docs/en/Community-Articles/2024-10-09-NET9-Performance-Improvements/Post.md +++ b/docs/en/Community-Articles/2024-10-09-NET9-Performance-Improvements/Post.md @@ -2,8 +2,6 @@ With every release, .NET becomes faster & faster! You get these improvements for free by just updating your project to the latest .NET! -![Cover Image](cover.png) - It’s very interesting that **20% of these improvements** are implemented by **open-source volunteers** rather than Microsoft employees. These improvements mostly focus on cloud-native and high-throughput applications. I’ll briefly list them below. ![From Microsoft Blog Post](cited-from-microsoft-blog-post.png) diff --git a/docs/en/Community-Articles/2024-10-11-NET-Aspire-vs-ABP-Studio/POST.md b/docs/en/Community-Articles/2024-10-11-NET-Aspire-vs-ABP-Studio/POST.md index 9e996d2099..fe7b706b5a 100644 --- a/docs/en/Community-Articles/2024-10-11-NET-Aspire-vs-ABP-Studio/POST.md +++ b/docs/en/Community-Articles/2024-10-11-NET-Aspire-vs-ABP-Studio/POST.md @@ -2,8 +2,6 @@ In this article, I will compare [.NET Aspire](https://learn.microsoft.com/en-us/dotnet/aspire/) by [ABP Studio](https://abp.io/docs/latest/studio) by explaining their similarities and differences. -![cover](cover.png) - ## Introduction While .NET Aspire and ABP Studio are tools for different purpose with different scope and they have different approaches to solve the problems, many developers still may confuse since they also have some similar functionalities and solves some common problems. diff --git a/docs/en/Community-Articles/2024-10-23-Abp-Net9-Upgrade/post.md b/docs/en/Community-Articles/2024-10-23-Abp-Net9-Upgrade/post.md index 2a75a97df3..bc8bd691b5 100644 --- a/docs/en/Community-Articles/2024-10-23-Abp-Net9-Upgrade/post.md +++ b/docs/en/Community-Articles/2024-10-23-Abp-Net9-Upgrade/post.md @@ -1,9 +1,5 @@ # ABP Now Supports .NET 9 -![Cover image](cover.png) - - - **.NET 9.0.100-rc.2** has been released on **October 8, 2024**. To align with the latest .NET, we also released the ABP Platform [9.0.0-rc.1](https://github.com/abpframework/abp/releases/tag/9.0.0-rc.1) version. **With this release, ABP now supports .NET 9.** diff --git a/docs/en/Community-Articles/2024-11-13-BuiltIn-OpenApi-Documentation/post.md b/docs/en/Community-Articles/2024-11-13-BuiltIn-OpenApi-Documentation/post.md index 3e950c38c0..f257577ac2 100644 --- a/docs/en/Community-Articles/2024-11-13-BuiltIn-OpenApi-Documentation/post.md +++ b/docs/en/Community-Articles/2024-11-13-BuiltIn-OpenApi-Documentation/post.md @@ -1,8 +1,6 @@ Built-in OpenAPI Document Generation with .NET 9 — No more SwaggerUI! 👋 ======================================================================== -![Cover](cover.png) - What’s Swagger UI? ------------------ diff --git a/docs/en/Community-Articles/2024-12-01-OpenAI-Integration/POST.md b/docs/en/Community-Articles/2024-12-01-OpenAI-Integration/POST.md index 4706e79f49..830f0d094a 100644 --- a/docs/en/Community-Articles/2024-12-01-OpenAI-Integration/POST.md +++ b/docs/en/Community-Articles/2024-12-01-OpenAI-Integration/POST.md @@ -2,8 +2,6 @@ In this article, I will show you how to integrate and use the [OpenAI API](https://github.com/openai/openai-dotnet?tab=readme-ov-file#getting-started) with the [ABP Framework](https://abp.io/). We will explore step-by-step how these technologies can work together to enhance your application with powerful AI capabilities, such as natural language processing, image generation, and more. -![cover-image](cover-image.png) - ## Creating an ABP Project To begin integrating OpenAI API with ABP Framework, you first need to create an ABP project. Follow these steps to create and set up your ABP project: @@ -384,4 +382,4 @@ To showcase the integration of the OpenAI API with the ABP Framework, we impleme ## Conclusion -In this article, we covered how to integrate the OpenAI API with the ABP Framework by creating a sample project, setting up the OpenAI services, and implementing examples for conversational AI, knowledge-based assistance, and image generation. By following these steps, you can add powerful AI-driven capabilities to your application, making it more interactive, intelligent, and capable of meeting user needs effectively. \ No newline at end of file +In this article, we covered how to integrate the OpenAI API with the ABP Framework by creating a sample project, setting up the OpenAI services, and implementing examples for conversational AI, knowledge-based assistance, and image generation. By following these steps, you can add powerful AI-driven capabilities to your application, making it more interactive, intelligent, and capable of meeting user needs effectively. diff --git a/docs/en/Community-Articles/2025-01-03-ABP-Background-Workers-vs-Jobs/background-jobs-vs-background-workers.md b/docs/en/Community-Articles/2025-01-03-ABP-Background-Workers-vs-Jobs/background-jobs-vs-background-workers.md index 5677b74335..43a3c3a813 100644 --- a/docs/en/Community-Articles/2025-01-03-ABP-Background-Workers-vs-Jobs/background-jobs-vs-background-workers.md +++ b/docs/en/Community-Articles/2025-01-03-ABP-Background-Workers-vs-Jobs/background-jobs-vs-background-workers.md @@ -1,7 +1,5 @@ # ABP Framework: Background Jobs vs Background Workers — When to Use Which? -![cover](cover.png) - In the ABP Framework, **Background Jobs** and **Background Workers** serve different purposes but can sometimes seem interchangeable. Sometimes it can be confusing. Let’s clarify their differences, and I'll show you some real-world cases to help you understand how to decide between these two. We have official documents for these: 📕 **Background Workers ABP Document** https://abp.io/docs/latest/framework/infrastructure/background-workers diff --git a/docs/en/Community-Articles/2025-01-24-Understanding-Transactions-in-ABP-Unit-Of-Work/POST.md b/docs/en/Community-Articles/2025-01-24-Understanding-Transactions-in-ABP-Unit-Of-Work/POST.md index 49a75b2a25..929203c6a0 100644 --- a/docs/en/Community-Articles/2025-01-24-Understanding-Transactions-in-ABP-Unit-Of-Work/POST.md +++ b/docs/en/Community-Articles/2025-01-24-Understanding-Transactions-in-ABP-Unit-Of-Work/POST.md @@ -2,8 +2,6 @@ [The Unit of Work](https://en.wikipedia.org/wiki/Unit_of_work) is a software design pattern that maintains a list of objects affected by a business transaction and coordinates the writing out of changes and the resolution of concurrency problems to ensure that all changes are made within a single transaction. -![pic](./pic.png) - ## Transaction Management Overview One of the primary responsibilities of the Unit of Work is managing database transactions. It provides the following transaction management features: diff --git a/docs/en/docs-nav.json b/docs/en/docs-nav.json index 8ca147a3db..87b3d56e88 100644 --- a/docs/en/docs-nav.json +++ b/docs/en/docs-nav.json @@ -487,7 +487,8 @@ }, { "text": "Exception Handling", - "path": "framework/fundamentals/exception-handling.md" + "path": "framework/fundamentals/exception-handling.md", + "keywords": ["Error"] }, { "text": "Localization", @@ -1974,7 +1975,68 @@ }, { "text": "Single-Layer Solution", - "path": "solution-templates/single-layer-web-application" + "isLazyExpandable": true, + "path": "solution-templates/single-layer-web-application", + "items": [ + { + "text": "Overview", + "path": "solution-templates/single-layer-web-application/overview.md" + }, + { + "text": "Solution Structure", + "path": "solution-templates/single-layer-web-application/solution-structure.md" + }, + { + "text": "Main Components", + "isLazyExpandable": true, + "path": "solution-templates/single-layer-web-application/main-components.md", + "items": [ + { + "text": "Web Applications", + "path": "solution-templates/single-layer-web-application/web-applications.md" + }, + { + "text": "Db Migrator", + "path": "solution-templates/single-layer-web-application/db-migrator.md" + } + ] + }, + { + "text": "Built-In Features", + "isLazyExpandable": true, + "path": "solution-templates/single-layer-web-application/built-in-features.md", + "items": [ + { + "text": "Authentication", + "path": "solution-templates/single-layer-web-application/authentication.md" + }, + { + "text": "Database configurations", + "path": "solution-templates/single-layer-web-application/database-configurations.md" + }, + { + "text": "Logging (with Serilog)", + "path": "solution-templates/single-layer-web-application/logging.md" + }, + { + "text": "Swagger integration", + "path": "solution-templates/single-layer-web-application/swagger-integration.md" + }, + { + "text": "Multi-Tenancy", + "path": "solution-templates/single-layer-web-application/multi-tenancy.md" + }, + { + "text": "BLOB Storing", + "path": "solution-templates/single-layer-web-application/blob-storing.md" + }, + { + "text": "CORS configuration", + "path": "solution-templates/single-layer-web-application/cors-configuration.md" + } + ] + } + ] }, { "text": "Layered Solution", diff --git a/docs/en/solution-templates/layered-web-application/deployment/azure-deployment/step3-deployment-github-action.md b/docs/en/solution-templates/layered-web-application/deployment/azure-deployment/step3-deployment-github-action.md index d6533ef6ec..a9ec807c64 100644 --- a/docs/en/solution-templates/layered-web-application/deployment/azure-deployment/step3-deployment-github-action.md +++ b/docs/en/solution-templates/layered-web-application/deployment/azure-deployment/step3-deployment-github-action.md @@ -49,7 +49,7 @@ jobs: - name: Set up .NET Core uses: actions/setup-dotnet@v4 with: - dotnet-version: '8.x' + dotnet-version: '9.x' include-prerelease: true - name: Install ABP CLI @@ -150,7 +150,7 @@ jobs: - name: Set up .NET Core uses: actions/setup-dotnet@v4 with: - dotnet-version: '8.x' + dotnet-version: '9.x' include-prerelease: true - name: Install ABP CLI @@ -250,7 +250,7 @@ jobs: - name: Set up .NET Core uses: actions/setup-dotnet@v4 with: - dotnet-version: '8.x' + dotnet-version: '9.x' include-prerelease: true - name: Install ABP CLI @@ -355,7 +355,7 @@ jobs: - name: Set up .NET Core uses: actions/setup-dotnet@v4 with: - dotnet-version: '8.x' + dotnet-version: '9.x' include-prerelease: true - name: Install ABP CLI @@ -489,7 +489,7 @@ build: - name: Set up .NET Core uses: actions/setup-dotnet@v4 with: - dotnet-version: '8.x' + dotnet-version: '9.x' include-prerelease: true - name: Install ABP CLI @@ -569,7 +569,7 @@ jobs: - name: Set up .NET Core uses: actions/setup-dotnet@v4 with: - dotnet-version: '8.x' + dotnet-version: '9.x' include-prerelease: true - name: Install ABP CLI diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/ar.json b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/ar.json index 1f6d8fd608..3b94f7f834 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/ar.json +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/ar.json @@ -78,6 +78,7 @@ "EndDate": "تاريخ الانتهاء", "Feature:AuditLoggingGroup": "تدوين التسجيل", "Feature:AuditLoggingEnable": "تمكين صفحة تسجيل التدقيق", - "Feature:AuditLoggingEnableDescription": "تفعيل صفحة تسجيل التدقيق في التطبيق." + "Feature:AuditLoggingEnableDescription": "تفعيل صفحة تسجيل التدقيق في التطبيق.", + "TenantId": "معرف المستأجر" } } \ No newline at end of file diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/cs.json b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/cs.json index 0804c7e734..ceeb244fc8 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/cs.json +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/cs.json @@ -78,6 +78,7 @@ "EndDate": "Datum ukončení", "Feature:AuditLoggingGroup": "Protokolování auditu", "Feature:AuditLoggingEnable": "Povolena stránka protokolování auditu", - "Feature:AuditLoggingEnableDescription": "Povolit stránku protokolování auditu v aplikaci." + "Feature:AuditLoggingEnableDescription": "Povolit stránku protokolování auditu v aplikaci.", + "TenantId": "ID nájemce" } } \ No newline at end of file diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/de-DE.json b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/de-DE.json index 138f7a04e2..75e5c251c3 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/de-DE.json +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/de-DE.json @@ -77,6 +77,7 @@ "EndDate": "Endtermin", "Feature:AuditLoggingGroup": "Audit-Protokollierung", "Feature:AuditLoggingEnable": "Aktivieren Sie die Überwachungsprotokollseite", - "Feature:AuditLoggingEnableDescription": "Aktivieren Sie die Überwachungsprotokollseite in der App." + "Feature:AuditLoggingEnableDescription": "Aktivieren Sie die Überwachungsprotokollseite in der App.", + "TenantId": "Mandanten-ID" } } \ No newline at end of file diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/de.json b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/de.json index 9b229eb182..2f3152fca5 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/de.json +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/de.json @@ -78,6 +78,7 @@ "EndDate": "Endtermin", "Feature:AuditLoggingGroup": "Audit-Protokollierung", "Feature:AuditLoggingEnable": "Aktivierte Audit-Logging-Seite", - "Feature:AuditLoggingEnableDescription": "Aktivieren Sie die Audit-Logging-Seite in der Anwendung." + "Feature:AuditLoggingEnableDescription": "Aktivieren Sie die Audit-Logging-Seite in der Anwendung.", + "TenantId": "Mandanten-ID" } } \ No newline at end of file diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/en.json b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/en.json index 3351816d31..4071fac620 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/en.json +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/en.json @@ -93,6 +93,7 @@ "DisplayName:ExpiredDeleterPeriod": "Expired item deletion period", "Description:ExpiredDeleterPeriod": "Set the number of days after which expired items will be automatically deleted.", "ExpiredDeleterPeriodUnit": "day(s)", - "AuditLogsBeforeXWillBeDeleted": "Audit logs before {0} will be deleted." + "AuditLogsBeforeXWillBeDeleted": "Audit logs before {0} will be deleted.", + "TenantId": "Tenant Id" } } diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/es.json b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/es.json index 0e7ce7a37f..1227e0bc08 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/es.json +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/es.json @@ -78,6 +78,7 @@ "EndDate": "Fecha final", "Feature:AuditLoggingGroup": "Registros de auditoría", "Feature:AuditLoggingEnable": "Habilitar la página de registro de auditoría", - "Feature:AuditLoggingEnableDescription": "Habilite la página de registro de auditoría en la aplicación." + "Feature:AuditLoggingEnableDescription": "Habilite la página de registro de auditoría en la aplicación.", + "TenantId": "ID de inquilino" } } \ No newline at end of file diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/fi.json b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/fi.json index 285cc214e1..9870d85155 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/fi.json +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/fi.json @@ -78,6 +78,7 @@ "EndDate": "Päättymispäivä", "Feature:AuditLoggingGroup": "Tarkastusten kirjaaminen", "Feature:AuditLoggingEnable": "Aktivoi auditointilokisivu", - "Feature:AuditLoggingEnableDescription": "Ota käyttöön tarkastuksen kirjaussivu sovelluksessa." + "Feature:AuditLoggingEnableDescription": "Ota käyttöön tarkastuksen kirjaussivu sovelluksessa.", + "TenantId": "Vuokralaisen tunnus" } } \ No newline at end of file diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/fr.json b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/fr.json index 228a3ad788..ced0d637c9 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/fr.json +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/fr.json @@ -78,6 +78,7 @@ "EndDate": "Date de fin", "Feature:AuditLoggingGroup": "Journalisation d'audit", "Feature:AuditLoggingEnable": "Page de journalisation d'audit activée", - "Feature:AuditLoggingEnableDescription": "Activez la page de journalisation d'audit dans l'application." + "Feature:AuditLoggingEnableDescription": "Activez la page de journalisation d'audit dans l'application.", + "TenantId": "ID du locataire" } } \ No newline at end of file diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/hi.json b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/hi.json index 10dbb7cf10..7c6a4b5587 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/hi.json +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/hi.json @@ -78,6 +78,7 @@ "EndDate": "समाप्ति तिथि", "Feature:AuditLoggingGroup": "ऑडिट लॉगिंग", "Feature:AuditLoggingEnable": "सक्षम ऑडिट लॉगिंग पृष्ठ", - "Feature:AuditLoggingEnableDescription": "एप्लिकेशन में ऑडिट लॉगिंग पृष्ठ सक्षम करें।" + "Feature:AuditLoggingEnableDescription": "एप्लिकेशन में ऑडिट लॉगिंग पृष्ठ सक्षम करें।", + "TenantId": "किरायेदार आईडी" } } \ No newline at end of file diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/hr.json b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/hr.json index 587efee335..ec6028c6a8 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/hr.json +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/hr.json @@ -78,6 +78,7 @@ "EndDate": "Datum završetka", "Feature:AuditLoggingGroup": "Zapisivanje revizije", "Feature:AuditLoggingEnable": "Omogućena stranica za bilježenje revizije", - "Feature:AuditLoggingEnableDescription": "Omogućite stranicu za bilježenje revizije u aplikaciji." + "Feature:AuditLoggingEnableDescription": "Omogućite stranicu za bilježenje revizije u aplikaciji.", + "TenantId": "ID stanara" } } \ No newline at end of file diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/hu.json b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/hu.json index 0812acfb37..1122431190 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/hu.json +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/hu.json @@ -78,6 +78,7 @@ "EndDate": "Befejezés dátuma", "Feature:AuditLoggingGroup": "Audit naplózás", "Feature:AuditLoggingEnable": "Engedélyezett naplózási oldal", - "Feature:AuditLoggingEnableDescription": "Engedélyezze a naplózási oldalt az alkalmazásban." + "Feature:AuditLoggingEnableDescription": "Engedélyezze a naplózási oldalt az alkalmazásban.", + "TenantId": "Bérlő azonosító" } } \ No newline at end of file diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/is.json b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/is.json index 3175bfe492..cdf1217b36 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/is.json +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/is.json @@ -78,6 +78,7 @@ "EndDate": "Loka dagsetning", "Feature:AuditLoggingGroup": "Endurskoðunarskráning", "Feature:AuditLoggingEnable": "Virkjað endurskoðunarskráningarsíða", - "Feature:AuditLoggingEnableDescription": "Virkjaðu endurskoðunarskráningarsíðu í forritinu." + "Feature:AuditLoggingEnableDescription": "Virkjaðu endurskoðunarskráningarsíðu í forritinu.", + "TenantId": "Leigutakaauðkenni" } } \ No newline at end of file diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/it.json b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/it.json index 1a434abadc..1a7823908a 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/it.json +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/it.json @@ -78,6 +78,7 @@ "EndDate": "Data di fine", "Feature:AuditLoggingGroup": "Registrazione di controllo", "Feature:AuditLoggingEnable": "Pagina di registrazione di controllo abilitata", - "Feature:AuditLoggingEnableDescription": "Abilita la pagina di registrazione dell'audit nell'applicazione." + "Feature:AuditLoggingEnableDescription": "Abilita la pagina di registrazione dell'audit nell'applicazione.", + "TenantId": "ID inquilino" } } \ No newline at end of file diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/nl.json b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/nl.json index b8b218ca2d..6500e216b6 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/nl.json +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/nl.json @@ -78,6 +78,7 @@ "EndDate": "Einddatum", "Feature:AuditLoggingGroup": "Auditregistratie", "Feature:AuditLoggingEnable": "Pagina voor auditregistratie ingeschakeld", - "Feature:AuditLoggingEnableDescription": "Schakel de auditlogboekpagina in de applicatie in." + "Feature:AuditLoggingEnableDescription": "Schakel de auditlogboekpagina in de applicatie in.", + "TenantId": "Huurder-ID" } } \ No newline at end of file diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/pl-PL.json b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/pl-PL.json index 179e5f4f98..bbbc627b98 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/pl-PL.json +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/pl-PL.json @@ -78,6 +78,7 @@ "EndDate": "Data końcowa", "Feature:AuditLoggingGroup": "Rejestrowanie audytu", "Feature:AuditLoggingEnable": "Włączono stronę rejestrowania audytu", - "Feature:AuditLoggingEnableDescription": "Włącz stronę rejestrowania audytu w aplikacji." + "Feature:AuditLoggingEnableDescription": "Włącz stronę rejestrowania audytu w aplikacji.", + "TenantId": "Identyfikator najemcy" } } \ No newline at end of file diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/pt-BR.json b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/pt-BR.json index 9173d3cdd4..8e5557e442 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/pt-BR.json +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/pt-BR.json @@ -78,6 +78,7 @@ "EndDate": "Data final", "Feature:AuditLoggingGroup": "Registro de auditoria", "Feature:AuditLoggingEnable": "Página de registro de auditoria habilitada", - "Feature:AuditLoggingEnableDescription": "Habilite a página de registro de auditoria no aplicativo." + "Feature:AuditLoggingEnableDescription": "Habilite a página de registro de auditoria no aplicativo.", + "TenantId": "ID do inquilino" } } \ No newline at end of file diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/ro-RO.json b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/ro-RO.json index 9f079420eb..73da32a928 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/ro-RO.json +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/ro-RO.json @@ -78,6 +78,7 @@ "EndDate": "Data de încheiere", "Feature:AuditLoggingGroup": "Înregistrare de audit", "Feature:AuditLoggingEnable": "Pagina de înregistrare a auditului activată", - "Feature:AuditLoggingEnableDescription": "Activați pagina de înregistrare a auditului în aplicație." + "Feature:AuditLoggingEnableDescription": "Activați pagina de înregistrare a auditului în aplicație.", + "TenantId": "ID chiriaș" } } \ No newline at end of file diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/ru.json b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/ru.json index f06719e4b2..9dba5121ce 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/ru.json +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/ru.json @@ -78,6 +78,7 @@ "EndDate": "Дата окончания", "Feature:AuditLoggingGroup": "Ведение журнала аудита", "Feature:AuditLoggingEnable": "Включенная страница ведения журнала аудита", - "Feature:AuditLoggingEnableDescription": "Включить страницу ведения журнала аудита в приложении." + "Feature:AuditLoggingEnableDescription": "Включить страницу ведения журнала аудита в приложении.", + "TenantId": "Идентификатор арендатора" } } \ No newline at end of file diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/sk.json b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/sk.json index e58dd37a5a..672f32dd44 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/sk.json +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/sk.json @@ -78,6 +78,7 @@ "EndDate": "Dátum konca", "Feature:AuditLoggingGroup": "Audit logovanie", "Feature:AuditLoggingEnable": "Povoliť stránku audit logovania", - "Feature:AuditLoggingEnableDescription": "Povolená stránka audit logovania v aplikácii." + "Feature:AuditLoggingEnableDescription": "Povolená stránka audit logovania v aplikácii.", + "TenantId": "ID nájomníka" } } \ No newline at end of file diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/sl.json b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/sl.json index e38afe0002..324a03b6db 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/sl.json +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/sl.json @@ -78,6 +78,7 @@ "EndDate": "Končni datum", "Feature:AuditLoggingGroup": "Revizijsko beleženje", "Feature:AuditLoggingEnable": "Omogočena stran za beleženje revizije", - "Feature:AuditLoggingEnableDescription": "Omogočite stran za beleženje revizije v aplikaciji." + "Feature:AuditLoggingEnableDescription": "Omogočite stran za beleženje revizije v aplikaciji.", + "TenantId": "ID najemnika" } } \ No newline at end of file diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/sv.json b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/sv.json index f0b8b1ebee..2432e63d33 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/sv.json +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/sv.json @@ -93,6 +93,7 @@ "DisplayName:ExpiredDeleterPeriod": "Utgången raderingsperiod för objekt", "Description:ExpiredDeleterPeriod": "Ställ in antalet dagar efter vilka utgångna objekt automatiskt ska raderas.", "ExpiredDeleterPeriodUnit": "dag(ar)", - "AuditLogsBeforeXWillBeDeleted": "Granskningsloggar före {0} kommer att raderas." + "AuditLogsBeforeXWillBeDeleted": "Granskningsloggar före {0} kommer att raderas.", + "TenantId": "Hyresgäst-ID" } } \ No newline at end of file diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/tr.json b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/tr.json index 2760b4ba28..6fb89d3b2b 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/tr.json +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/tr.json @@ -46,7 +46,7 @@ "Date": "Tarih", "Url": "Url", "UserName": "Kullanıcı adı", - "TenantImpersonator": "Kiracı Taklitçisi", + "TenantImpersonator": "Müşteri Taklitçisi", "UserImpersonator": "Kullanıcı Taklitçisi", "UrlFilter": "Url Filtresi", "User": "Kullanıcı", @@ -78,6 +78,7 @@ "Feature:AuditLoggingGroup": "İşlem Kayıtları", "Feature:AuditLoggingEnable": "İşlem kayıtları sayfasını etkinleştirin", "Feature:AuditLoggingEnableDescription": "Uygulamadanızdaki işlem kayıtları sayfasını etkinleştirir.", - "MinMaxDuration": "Süre (Min. - Max.)" + "MinMaxDuration": "Süre (Min. - Max.)", + "TenantId": "Müşteri Id" } } diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/vi.json b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/vi.json index 03e68947c8..0ea4845071 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/vi.json +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/vi.json @@ -78,6 +78,7 @@ "EndDate": "Ngày cuối", "Feature:AuditLoggingGroup": "Ghi nhật ký kiểm tra", "Feature:AuditLoggingEnable": "Đã bật trang ghi nhật ký kiểm tra", - "Feature:AuditLoggingEnableDescription": "Kích hoạt trang ghi nhật ký kiểm tra trong ứng dụng." + "Feature:AuditLoggingEnableDescription": "Kích hoạt trang ghi nhật ký kiểm tra trong ứng dụng.", + "TenantId": "ID người thuê" } } \ No newline at end of file diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/zh-Hans.json b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/zh-Hans.json index 23ab2cf949..3f6099f04f 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/zh-Hans.json +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/zh-Hans.json @@ -78,6 +78,7 @@ "EndDate": "结束日期", "Feature:AuditLoggingGroup": "审计日志", "Feature:AuditLoggingEnable": "启用审计记录页面", - "Feature:AuditLoggingEnableDescription": "在应用程序中启用审计日志页面。" + "Feature:AuditLoggingEnableDescription": "在应用程序中启用审计日志页面。", + "TenantId": "租户 ID" } } \ No newline at end of file diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/zh-Hant.json b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/zh-Hant.json index f987b0f31b..5b663c9568 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/zh-Hant.json +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/zh-Hant.json @@ -78,6 +78,7 @@ "EndDate": "結束時間", "Feature:AuditLoggingGroup": "審計日誌", "Feature:AuditLoggingEnable": "啟用審計日誌頁面", - "Feature:AuditLoggingEnableDescription": "在應用程序中啟用審計日誌頁面." + "Feature:AuditLoggingEnableDescription": "在應用程序中啟用審計日誌頁面.", + "TenantId": "租戶 ID" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Domain.Shared/Volo/Docs/Documents/NavigationNode.cs b/modules/docs/src/Volo.Docs.Domain.Shared/Volo/Docs/Documents/NavigationNode.cs index f19b9f41df..015f711850 100644 --- a/modules/docs/src/Volo.Docs.Domain.Shared/Volo/Docs/Documents/NavigationNode.cs +++ b/modules/docs/src/Volo.Docs.Domain.Shared/Volo/Docs/Documents/NavigationNode.cs @@ -21,6 +21,9 @@ namespace Volo.Docs.Documents [JsonPropertyName("isIndex")] public bool IsIndex { get; set; } + + [JsonPropertyName("keywords")] + public string[] Keywords { get; set; } public bool IsLeaf => !HasChildItems; diff --git a/modules/docs/src/Volo.Docs.Web/Areas/Documents/TagHelpers/TreeTagHelper.cs b/modules/docs/src/Volo.Docs.Web/Areas/Documents/TagHelpers/TreeTagHelper.cs index e6c75d0161..3aa9b85777 100644 --- a/modules/docs/src/Volo.Docs.Web/Areas/Documents/TagHelpers/TreeTagHelper.cs +++ b/modules/docs/src/Volo.Docs.Web/Areas/Documents/TagHelpers/TreeTagHelper.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.AspNetCore.Razor.TagHelpers; @@ -23,7 +24,7 @@ namespace Volo.Docs.Areas.Documents.TagHelpers private const string LiItemTemplateWithLink = @"
  • {2}{3}
  • "; - private const string ListItemAnchor = @"{2}"; + private const string ListItemAnchor = @"{3}"; private const string ListItemSpan = @"{1}"; @@ -155,7 +156,8 @@ namespace Volo.Docs.Areas.Documents.TagHelpers sb.Clear(); - listInnerItem = string.Format(ListItemAnchor, NormalizePath(node.Path), textCss, + var additionalAttributes = node.Keywords.IsNullOrEmpty() ? "" : "data-keywords=\"" + node.Keywords.JoinAsString(",") + "\""; + listInnerItem = string.Format(ListItemAnchor, NormalizePath(node.Path), additionalAttributes ,textCss, node.Text.IsNullOrEmpty() ? "?" : sb.Append(node.Text).Append(badgeStringBuilder.ToString()).ToString()); diff --git a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/index.js b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/index.js index 6636787f33..23eca169b5 100644 --- a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/index.js +++ b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/index.js @@ -29,7 +29,8 @@ var doc = doc || {}; var $ul = $(``); var $li = $(`
  • `); - $li.append(` ${node.text}`) + var dataKeywords = node.keywords ? `data-keywords="${node.keywords}"` : ""; + $li.append(` ${node.text}`) if(node.isLazyExpandable){ $li.addClass("lazy-expand"); @@ -111,12 +112,17 @@ var doc = doc || {}; var filteredItems = $navigation .find('li > a') .filter(function () { - return ( - $(this) - .text() - .toUpperCase() - .indexOf(filterText.toUpperCase()) > -1 - ); + var keywords = ($(this).data('keywords') || "").split(","); + var text = $(this).text(); + + if(text.toUpperCase().indexOf(filterText.toUpperCase()) > -1) + { + return true; + } + + return keywords.some(function(keyword){ + return keyword.toUpperCase().indexOf(filterText.toUpperCase()) > -1; + }); }); filteredItems.each(function () { diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AspNetIdentity/AbpResourceOwnerPasswordValidator.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AspNetIdentity/AbpResourceOwnerPasswordValidator.cs index eece31acc3..d4e0fb5490 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AspNetIdentity/AbpResourceOwnerPasswordValidator.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AspNetIdentity/AbpResourceOwnerPasswordValidator.cs @@ -128,21 +128,29 @@ public class AbpResourceOwnerPasswordValidator : IResourceOwnerPasswordValidator } else if (result.IsNotAllowed) { - Logger.LogInformation("Authentication failed for username: {username}, reason: not allowed", context.UserName); - - if (user.ShouldChangePasswordOnNextLogin) + if (!await UserManager.CheckPasswordAsync(user, context.Password)) { - await HandleShouldChangePasswordOnNextLoginAsync(context, user, context.Password); - return; + Logger.LogInformation("Authentication failed for username: {username}, reason: invalid credentials", context.UserName); + errorDescription = Localizer["InvalidUserNameOrPassword"]; } - - if (await UserManager.ShouldPeriodicallyChangePasswordAsync(user)) + else { - await HandlePeriodicallyChangePasswordAsync(context, user, context.Password); - return; - } + Logger.LogInformation("Authentication failed for username: {username}, reason: not allowed", context.UserName); - errorDescription = Localizer["LoginIsNotAllowed"]; + if (user.ShouldChangePasswordOnNextLogin) + { + await HandleShouldChangePasswordOnNextLoginAsync(context, user, context.Password); + return; + } + + if (await UserManager.ShouldPeriodicallyChangePasswordAsync(user)) + { + await HandlePeriodicallyChangePasswordAsync(context, user, context.Password); + return; + } + + errorDescription = Localizer["LoginIsNotAllowed"]; + } } else { diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/Controllers/TokenController.Password.cs b/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/Controllers/TokenController.Password.cs index 392e696d08..33a1a37845 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/Controllers/TokenController.Password.cs +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/Controllers/TokenController.Password.cs @@ -115,24 +115,32 @@ public partial class TokenController } else if (result.IsNotAllowed) { - Logger.LogInformation("Authentication failed for username: {username}, reason: not allowed", request.Username); - - if (user.ShouldChangePasswordOnNextLogin) + if (!await UserManager.CheckPasswordAsync(user, request.Password)) { - return await HandleShouldChangePasswordOnNextLoginAsync(request, user, request.Password); + Logger.LogInformation("Authentication failed for username: {username}, reason: invalid credentials", request.Username); + errorDescription = "Invalid username or password!"; } - - if (await UserManager.ShouldPeriodicallyChangePasswordAsync(user)) + else { - return await HandlePeriodicallyChangePasswordAsync(request, user, request.Password); - } + Logger.LogInformation("Authentication failed for username: {username}, reason: not allowed", request.Username); - if (user.IsActive) - { - return await HandleConfirmUserAsync(request, user); - } + if (user.ShouldChangePasswordOnNextLogin) + { + return await HandleShouldChangePasswordOnNextLoginAsync(request, user, request.Password); + } - errorDescription = "You are not allowed to login! Your account is inactive."; + if (await UserManager.ShouldPeriodicallyChangePasswordAsync(user)) + { + return await HandlePeriodicallyChangePasswordAsync(request, user, request.Password); + } + + if (user.IsActive) + { + return await HandleConfirmUserAsync(request, user); + } + + errorDescription = "You are not allowed to login! Your account is inactive."; + } } else { diff --git a/npm/ng-packs/packages/core/src/lib/services/local-storage-listener.service.ts b/npm/ng-packs/packages/core/src/lib/services/local-storage-listener.service.ts index 67231f5e85..4920e7fa0e 100644 --- a/npm/ng-packs/packages/core/src/lib/services/local-storage-listener.service.ts +++ b/npm/ng-packs/packages/core/src/lib/services/local-storage-listener.service.ts @@ -1,6 +1,5 @@ import { DOCUMENT } from '@angular/common'; import { Injectable, inject } from '@angular/core'; - @Injectable({ providedIn: 'root', }) @@ -9,8 +8,13 @@ export class LocalStorageListenerService { constructor() { this.window.addEventListener('storage', event => { - if (event.key === 'access_token' && event.newValue === null) { - this.window.location.reload(); + if (event.key === 'access_token') { + const tokenRemoved = event.newValue === null; + const tokenAdded = event.oldValue === null && event.newValue !== null; + + if (tokenRemoved || tokenAdded) { + this.window.location.assign('/'); + } } }); } diff --git a/npm/ng-packs/packages/permission-management/src/lib/components/permission-management.component.html b/npm/ng-packs/packages/permission-management/src/lib/components/permission-management.component.html index a2cf136c7b..7470c3e772 100644 --- a/npm/ng-packs/packages/permission-management/src/lib/components/permission-management.component.html +++ b/npm/ng-packs/packages/permission-management/src/lib/components/permission-management.component.html @@ -40,7 +40,7 @@
    - {{ 'Permission Group' }} + {{ 'AbpPermissionManagement::PermissionGroup' | abpLocalization }}
    diff --git a/npm/ng-packs/packages/setting-management/config/src/lib/components/email-setting-group/email-setting-group.component.html b/npm/ng-packs/packages/setting-management/config/src/lib/components/email-setting-group/email-setting-group.component.html index 2264b9939a..aa13148379 100644 --- a/npm/ng-packs/packages/setting-management/config/src/lib/components/email-setting-group/email-setting-group.component.html +++ b/npm/ng-packs/packages/setting-management/config/src/lib/components/email-setting-group/email-setting-group.component.html @@ -131,9 +131,11 @@ formName="emailTestForm" [disabled]="emailTestForm.invalid && emailTestForm.dirty" > - {{ 'AbpTenantManagement::Send' | abpLocalization }} + {{ 'AbpSettingManagement::Send' | abpLocalization }} - +