diff --git a/.github/workflows/auto-pr.yml b/.github/workflows/auto-pr.yml index 434e65e031..db6ca8e1ff 100644 --- a/.github/workflows/auto-pr.yml +++ b/.github/workflows/auto-pr.yml @@ -1,13 +1,13 @@ -name: Merge branch dev with rel-9.2 +name: Merge branch dev with rel-9.3 on: push: branches: - - rel-9.2 + - rel-9.3 permissions: contents: read jobs: - merge-dev-with-rel-9-2: + merge-dev-with-rel-9-3: permissions: contents: write # for peter-evans/create-pull-request to create branch pull-requests: write # for peter-evans/create-pull-request to create a PR @@ -18,14 +18,14 @@ jobs: ref: dev - name: Reset promotion branch run: | - git fetch origin rel-9.2:rel-9.2 - git reset --hard rel-9.2 + git fetch origin rel-9.3:rel-9.3 + git reset --hard rel-9.3 - name: Create Pull Request uses: peter-evans/create-pull-request@v3 with: - branch: auto-merge/rel-9-2/${{github.run_number}} - title: Merge branch dev with rel-9.2 - body: This PR generated automatically to merge dev with rel-9.2. Please review the changed files before merging to prevent any errors that may occur. + branch: auto-merge/rel-9-3/${{github.run_number}} + title: Merge branch dev with rel-9.3 + body: This PR generated automatically to merge dev with rel-9.3. Please review the changed files before merging to prevent any errors that may occur. reviewers: maliming draft: true token: ${{ github.token }} @@ -34,5 +34,5 @@ jobs: GH_TOKEN: ${{ secrets.BOT_SECRET }} run: | gh pr ready - gh pr review auto-merge/rel-9-2/${{github.run_number}} --approve - gh pr merge auto-merge/rel-9-2/${{github.run_number}} --merge --auto --delete-branch + gh pr review auto-merge/rel-9-3/${{github.run_number}} --approve + gh pr merge auto-merge/rel-9-3/${{github.run_number}} --merge --auto --delete-branch diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index 7073e826e3..8ebcc32bfc 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -48,7 +48,7 @@ permissions: jobs: build-test: runs-on: ubuntu-22.04 - timeout-minutes: 40 + timeout-minutes: 50 if: ${{ !github.event.pull_request.draft }} steps: - uses: actions/checkout@v2 diff --git a/Directory.Packages.props b/Directory.Packages.props index 956d961565..82e1480710 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -18,10 +18,10 @@ - - - - + + + + @@ -29,14 +29,14 @@ - + - - - + + + @@ -55,68 +55,68 @@ - - - - - - - - - - + + + + + + + + + + - - - - + + + + - - - + + + - + - - - - - - - - + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - + + + + @@ -128,11 +128,11 @@ - - - - - + + + + + @@ -163,17 +163,17 @@ - + - + - - - + + + diff --git a/README.md b/README.md index a6199aab9b..fa6632daa8 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ The following diagram contains the core components of the **ABP Platform** and s ABP offers a complete architectural model to build modern enterprise software solutions. Here, the fundamental architectural structures offered and first-class supported by ABP: -* [Domain Driven Design](https://abp.io/docs/latest/framework/architecture/domain-driven-design) +* [Domain Driven Design (DDD)](https://abp.io/docs/latest/framework/architecture/domain-driven-design) * [Microservices](https://abp.io/docs/latest/framework/architecture/microservices) * [Modularity](https://abp.io/docs/latest/framework/architecture/modularity/basics) * [Multi-Tenancy](https://abp.io/docs/latest/framework/architecture/multi-tenancy) diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json index c06589aa7b..d42e6e4f80 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json @@ -718,6 +718,10 @@ "CacheVersionCount": "Cache Version Count", "CacheVersionCountInfo": "Gets or sets the number of versions to cache", "CacheLatestVersionsInfo": "This caches the latest versions of the NuGet packages", + "NuGetApiKey": "NuGet API key", + "QuestionCount": "Question Count", + "MakeAnnouncement": "Make Announcement", + "MakeAnnouncementInfo": "Check it if you want to make an announcement for this post", "Menu:TelemetryReports": "Telemetry Reports", "TelemetryReports:DailyStudioOpen": "Daily Studio Opens", "TelemetryReports:MonthlyStudioOpen": "Monthly Studio Opens", diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json index 7ea0fb6708..ceda2baa7a 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json @@ -1425,7 +1425,7 @@ "TotalDevelopers": "Total {0} developer(s)", "CustomPurchaseExplanation": "Tailored to your specific needs", "WhereDidYouHearAboutUs": "Where did you hear about us?", - "Twitter": "Twitter", + "Twitter": "Twitter (X)", "Facebook": "Facebook", "Youtube": "YouTube", "Google": "Google", @@ -1890,6 +1890,7 @@ "BiographyContainsUrlValidationMessage": "Biography cannot contain URL.", "CreatePostSEOTitleInfo": "SEO URL is a clean, readable, keyword-rich URL that helps both users and search engines understand what this post is about. Keep it short with 60 characters. SEO titles over 60 characters will be truncated. Use hyphens (-) to separate words (not underscores). Include target keywords near the start. Lowercase only. No stop words unless needed (e.g: \"and\", \"or\", \"the\").", "SEOTitle": "SEO URL", - "InvalidYouTubeUrl": "The URL you entered is not a valid YouTube video link. Please make sure it points to a specific video and try again." + "InvalidYouTubeUrl": "The URL you entered is not a valid YouTube video link. Please make sure it points to a specific video and try again.", + "SelectAnOption": "Select an option" } } diff --git a/common.props b/common.props index 54e6251ac6..bf99a29ca2 100644 --- a/common.props +++ b/common.props @@ -1,8 +1,8 @@ latest - 9.3.0-preview - 4.3.0-preview + 10.0.0-preview + 5.0.0-preview $(NoWarn);CS1591;CS0436 https://abp.io/assets/abp_nupkg.png https://abp.io/ diff --git a/docs/en/Blog-Posts/2025-06-02 v9_2_Release_Stable/POST.md b/docs/en/Blog-Posts/2025-06-02 v9_2_Release_Stable/POST.md new file mode 100644 index 0000000000..1062195bda --- /dev/null +++ b/docs/en/Blog-Posts/2025-06-02 v9_2_Release_Stable/POST.md @@ -0,0 +1,86 @@ +# ABP.IO Platform 9.2 Final Has Been Released! + +We are glad to announce that [ABP](https://abp.io/) 9.2 stable version has been released today. + +## What's New With Version 9.2? + +All the new features were explained in detail in the [9.2 RC Announcement Post](https://abp.io/community/articles/abp-platform-9.2-rc-has-been-released-jpq072nh), so there is no need to review them again. You can check it out for more details. + +## Getting Started with 9.2 + +### Creating New Solutions + +You can check the [Get Started page](https://abp.io/get-started) to see how to get started with ABP. You can either download [ABP Studio](https://abp.io/get-started#abp-studio-tab) (**recommended**, if you prefer a user-friendly GUI application - desktop application) or use the [ABP CLI](https://abp.io/docs/latest/cli) to create new solutions. + +### How to Upgrade an Existing Solution + +You can upgrade your existing solutions with either ABP Studio or ABP CLI. In the following sections, both approaches are explained: + +### Upgrading via ABP Studio + +If you are already using the ABP Studio, you can upgrade it to the latest version. ABP Studio periodically checks for updates in the background, and when a new version of ABP Studio is available, you will be notified through a modal. Then, you can update it by confirming the opened modal. See [the documentation](https://abp.io/docs/latest/studio/installation#upgrading) for more info. + +After upgrading the ABP Studio, then you can open your solution in the application, and simply click the **Upgrade ABP Packages** action button to instantly upgrade your solution: + +![](upgrade-abp-packages.png) + +### Upgrading via ABP CLI + +Alternatively, you can upgrade your existing solution via ABP CLI. First, you need to install the ABP CLI or upgrade it to the latest version. + +If you haven't installed it yet, you can run the following command: + +```bash +dotnet tool install -g Volo.Abp.Studio.Cli +``` + +Or to update the existing CLI, you can run the following command: + +```bash +dotnet tool update -g Volo.Abp.Studio.Cli +``` + +After installing/updating the ABP CLI, you can use the [`update` command](https://abp.io/docs/latest/CLI#update) to update all the ABP related NuGet and NPM packages in your solution as follows: + +```bash +abp update +``` + +You can run this command in the root folder of your solution to update all ABP related packages. + +## Migration Guides + +There are a few breaking changes in this version that may affect your application. Please read the migration guide carefully, if you are upgrading from v9.x: [ABP Version 9.2 Migration Guide](https://abp.io/docs/9.2/release-info/migration-guides/abp-9-2) + +## Community News + +### New ABP Community Articles + +As always, exciting articles have been contributed by the ABP community. I will highlight some of them here: + +* [Liming Ma](https://github.com/maliming) has published 3 new articles: + * [Integrating .NET AI Chat Template with ABP Framework](https://abp.io/community/articles/integrating-.net-ai-chat-template-with-abp-framework-qavb5p2j) + * [Resolving Tenant from Route in ABP Framework](https://abp.io/community/articles/resolving-tenant-from-route-in-abp-framework-ah7oru97) + * [Common Errors in JWT Bearer Authentication](https://abp.io/community/articles/common-errors-in-jwt-bearer-authentication-4u3wrbs5) +* [Engincan Veske](https://engincanveske.substack.com/) has published 3 new articles: + * [Understanding HttpApi.Client Project & Remote Services in an ABP Based Application](https://abp.io/community/articles/http-api-client-and-remote-services-in-abp-based-application-xkknsp6m) + * [Using Elsa 3 with the ABP Framework: A Comprehensive Guide](https://abp.io/community/articles/using-elsa-3-workflow-with-abp-framework-usqk8afg) + * [Implementing Custom Tenant Logo Feature in ABP Framework: A Step-by-Step Guide](https://abp.io/community/articles/implementing-custom-tenant-logo-feature-in-abp-framework-a-stepbystep-guide-sba96ac9) +* [Berkan Şaşmaz](https://berkansasmaz.com/) has published 2 new articles: + * [Understanding the Domain and Application Layers in ABP Framework](https://abp.io/community/articles/understanding-the-domain-and-application-layers-in-abp-1fipc4x4) + * [How Do We Maintain Code Quality and Technical Debt in Our .NET Codebase?](https://abp.io/community/articles/how-do-we-maintain-code-quality-and-technical-debt-in-our-.net-codebase-z7glpya1) +* [Enis Necipoğlu](https://github.com/enisn) has published 2 new articles: + * [White Labeling in ABP Framework](https://abp.io/community/articles/white-labeling-in-abp-framework-5trwmrfm) by [Enis Necipoğlu](https://github.com/enisn) + * [You do it wrong! Customizing ABP Login Page Correctly](https://abp.io/community/articles/you-do-it-wrong-customizing-abp-login-page-correctly-bna7wzt5) +* [Ariful Islam](https://abp.io/community/members/arif) has published 2 new articles: + * [Multi-Workspace Management for ABP Applications](https://abp.io/community/articles/multiworkspace-management-for-abp-applications-eghgty3j) + * [Using Semantic Kernel in the ABP Framework](https://abp.io/community/articles/using-semantic-kernel-in-the-abp-framework-qo5cnuzs) +* [Guide to Add Custom Modules in ABP.IO App](https://abp.io/community/articles/guide-to-add-custom-modules-in-abp.io-app-sttetffa) by [Harsh Gupta](https://abp.io/community/members/harshgupta) +* [Debugging NuGet Packages in ABP.IO: A Complete Guide](https://abp.io/community/articles/debugging-nuget-packages-in-abp.io-a-complete-guide-h13y2033) by [Suhaib Mousa](https://suhaibmousa.com/) +* [Using Microsoft AI Extensions Library and OpenAI to Summarize User Comments](https://abp.io/community/articles/using-microsoft-ai-extensions-library-and-openai-to-summarize-user-comments-gj1lusg7) 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://abp.io/community/posts/create) to the ABP Community. + +## About the Next Version + +The next feature version will be 9.3. 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/2025-06-02 v9_2_Release_Stable/cover-image.png b/docs/en/Blog-Posts/2025-06-02 v9_2_Release_Stable/cover-image.png new file mode 100644 index 0000000000..dd40555c8e Binary files /dev/null and b/docs/en/Blog-Posts/2025-06-02 v9_2_Release_Stable/cover-image.png differ diff --git a/docs/en/Blog-Posts/2025-06-02 v9_2_Release_Stable/upgrade-abp-packages.png b/docs/en/Blog-Posts/2025-06-02 v9_2_Release_Stable/upgrade-abp-packages.png new file mode 100644 index 0000000000..ad5e9bd462 Binary files /dev/null and b/docs/en/Blog-Posts/2025-06-02 v9_2_Release_Stable/upgrade-abp-packages.png differ diff --git a/docs/en/Blog-Posts/2025-06-10-Announcing-ABP-Studio-1.0-Stable-Release/POST.md b/docs/en/Blog-Posts/2025-06-10-Announcing-ABP-Studio-1.0-Stable-Release/POST.md new file mode 100644 index 0000000000..8b37325e7e --- /dev/null +++ b/docs/en/Blog-Posts/2025-06-10-Announcing-ABP-Studio-1.0-Stable-Release/POST.md @@ -0,0 +1,97 @@ +# Announcing ABP Studio 1.0 General Availability 🚀 + +It's the moment you've been waiting for! We are thrilled to announce the stable release of ABP Studio v1.0. This milestone marks a significant step forward in our mission to provide a first-class, integrated development environment for ABP developers. Paired with the recently released [ABP v9.2](https://abp.io/community/articles/announcing-abp-9-2-stable-release-061qmtzb), ABP Studio v1.0 brings new features and improvements that will make your development work faster and more efficient. + +For the past several months, our core ABP team has been hard at work, focusing on the features that matter most to you, our community of developers. This release is the peak of that effort, bringing a host of improvements and new capabilities to the forefront. Let's dive in and explore what's new in ABP Studio v1.0. + +## What's New with ABP Studio v1.0? + +ABP Studio v1.0 is all about enhancing your development experience, from project creation to deployment. Here, we'll walk you through some of the latest features we've implemented, along with other key enhancements that make this release truly special. + +### ❤️ Solution Runner with Ready/Health Checks + +ABP Studio's Solution Runner now provides visual health monitoring that makes tracking your applications' status easily. When you start an application, a spinner indicates it's "starting", then in the *Overall* tab, you can see the application's health (✅ for healthy, ⚠️ for unhealthy) that displays real-time health status: + +![Health Checks](health-checks.png) + +With [pre-configured health checks](https://abp.io/docs/9.2/solution-templates/layered-web-application/health-check-configuration) in ABP solution templates including database connectivity tests, you get instant feedback on your applications' health. + +When health check UI is configured, you can access comprehensive health dashboards with a dedicated "Browse Health UI" command or see the last health response from the "Show Latest Health Check Response" command: + +![SaaS Health Check](saas-health-check.png) + +When you restart applications that are open in your browser, ABP Studio automatically refreshes the pages for you. + +### 🎨 Theme Style Selection on Project Creation + +When creating a new solution, you can now choose your theme, theme style, and layout right from the project creation wizard instead of having to configure these settings later. ABP Studio lets you pick from [ABP's officially provided themes including Basic, LeptonX Lite, and LeptonX](https://abp.io/docs/latest/ui-themes). + +![Theme Style Selection LeptonX](theme-style-selection-leptonx.png) + +If you select Basic or LeptonX Lite themes, only the theme will be changed. However, if you select the LeptonX theme, you'll get additional options to fine-tune your setup: + +- **Theme Style Configuration** - Pick from **System, Light, Dim, or Dark** styles to match how you like your development environment +- **Layout Options** - **Sidebar menu** / **Top menu** + +### 📦 "Container" Application Type for Solution Runner + +ABP Studio v1.0 introduces a dedicated "Container" application type that gives you better control over your Docker containers directly from the Solution Runner. Instead of managing all your containers through PowerShell scripts or running them all together, you can now see and control each container individually in the Solution Runner panel. + +![Container Application Type](containers-type.png) + +This new feature replaces the previous _Infrastructure_ folder approach with a cleaner, more intuitive container section. You can now: + +- **Start and stop containers individually** - No more starting all containers at once when you only need specific services +- **Monitor container status** - See which containers are running, stopped, or have issues directly in the UI +- **Manage container dependencies** - Control the order and timing of container startup based on your application needs + +Whether you're working with databases, message brokers, or other containerized services, the new Container application type makes it much easier to manage your development environment. This is especially useful for microservice architectures where you might want to run only specific services during development or testing. + +### ⚙️ Handle Multiple DbContexts When Adding/Removing/Applying Migrations + +When working with ABP solutions that have multiple DbContexts (such as when using the separate tenant database option), ABP Studio now intelligently prompts you to select the appropriate DbContext for migration operations. This enhancement ensures you're always working with the correct database context and helps prevent common mistakes when managing multiple databases. + +![EF Core Migration Context Selection](new-migration-added.gif) + +The context selection dialog appears automatically when you perform any of these Entity Framework operations: + +- **Adding a new migration** - Choose which DbContext the new migration should target +- **Removing an existing migration** - Select the DbContext from which to remove the migration +- **Updating the database** - Specify which database context should be updated + +## Get Started with ABP Studio v1.0 Today! + +ABP Studio v1.0 is built on the solid foundation of the [latest version of ABP Framework, which is v9.2](https://abp.io/community/articles/announcing-abp-9-2-stable-release-061qmtzb). This means that when you create a new project with ABP Studio, you're getting all the latest features, performance improvements, and bug fixes that come with v9.2. This includes updates to dependencies, enhancements to the core framework, and improvements to application modules. + +We are incredibly excited for you to get your hands on ABP Studio v1.0. We believe these new features will make a real difference in your day-to-day development workflow. + +### ⬇️ Download ABP Studio 1.0 + +Ready to get started? You can download the stable v1.0 release right now from the official ABP Studio website: **[https://abp.io/studio](https://abp.io/studio)** + +![ABP Studio 1.0 Download](abp-studio-download.png) + +If you are an existing ABP Studio user, it's even easier. You don't need to download the installer again. Simply launch ABP Studio, and it will prompt you to update to the latest version directly from the UI. + +> Alternatively, you can click to the *Help -> Check for Updates* context menu item to check for updates and install the latest version: +> +> ![ABP Studio 1.0 Check for Updates](abp-studio-check-for-updates.png) + +### 🔮 What's Next? + +ABP Studio v1.0 represents just the beginning of our journey. We're committed to continuously evolving the platform, adding features that directly address real-world development challenges and enhance your workflow. Our goal is to make ABP Studio the go-to development environment for .NET and ABP Framework developers. + +We will keep releasing new versions with exciting features based on our roadmap and your valuable feedback. To give you a sneak peek into what's planned for future releases, you can expect to see: + +- **Environment Variable Management:** A dedicated UI to easily manage environment variables for your solutions. +- **OpenTelemetry Integration:** We'll be integrating OpenTelemetry support directly into the startup templates, making distributed tracing and observability a seamless part of your application from day one. +- **LeptonX Theme Builder**: Allowing users to determine styling, colour palette and easily override their project's theme styles. +- **Monitor dashboards of the tools used in the solution (e.g. Kubernetes, Redis, Grafana, etc...)** +- **Pre-configured .NET Aspire for the Microservice Startup Template** +- **and more...** + +We are incredibly excited about the future of ABP Studio and can't wait to share the next set of features with you. Your comments and suggestions are invaluable to us. If you have any feedback, please drop a comment below. + +Thank you for being part of our community and happy coding! + +**The Volosoft Team** diff --git a/docs/en/Blog-Posts/2025-06-10-Announcing-ABP-Studio-1.0-Stable-Release/abp-studio-check-for-updates.png b/docs/en/Blog-Posts/2025-06-10-Announcing-ABP-Studio-1.0-Stable-Release/abp-studio-check-for-updates.png new file mode 100644 index 0000000000..bf7f2dc889 Binary files /dev/null and b/docs/en/Blog-Posts/2025-06-10-Announcing-ABP-Studio-1.0-Stable-Release/abp-studio-check-for-updates.png differ diff --git a/docs/en/Blog-Posts/2025-06-10-Announcing-ABP-Studio-1.0-Stable-Release/abp-studio-download.png b/docs/en/Blog-Posts/2025-06-10-Announcing-ABP-Studio-1.0-Stable-Release/abp-studio-download.png new file mode 100644 index 0000000000..453a9ce3f8 Binary files /dev/null and b/docs/en/Blog-Posts/2025-06-10-Announcing-ABP-Studio-1.0-Stable-Release/abp-studio-download.png differ diff --git a/docs/en/Blog-Posts/2025-06-10-Announcing-ABP-Studio-1.0-Stable-Release/containers-type.png b/docs/en/Blog-Posts/2025-06-10-Announcing-ABP-Studio-1.0-Stable-Release/containers-type.png new file mode 100644 index 0000000000..66bfe4a12c Binary files /dev/null and b/docs/en/Blog-Posts/2025-06-10-Announcing-ABP-Studio-1.0-Stable-Release/containers-type.png differ diff --git a/docs/en/Blog-Posts/2025-06-10-Announcing-ABP-Studio-1.0-Stable-Release/cover-image.png b/docs/en/Blog-Posts/2025-06-10-Announcing-ABP-Studio-1.0-Stable-Release/cover-image.png new file mode 100644 index 0000000000..76b24a8573 Binary files /dev/null and b/docs/en/Blog-Posts/2025-06-10-Announcing-ABP-Studio-1.0-Stable-Release/cover-image.png differ diff --git a/docs/en/Blog-Posts/2025-06-10-Announcing-ABP-Studio-1.0-Stable-Release/health-checks.png b/docs/en/Blog-Posts/2025-06-10-Announcing-ABP-Studio-1.0-Stable-Release/health-checks.png new file mode 100644 index 0000000000..6de5deeacf Binary files /dev/null and b/docs/en/Blog-Posts/2025-06-10-Announcing-ABP-Studio-1.0-Stable-Release/health-checks.png differ diff --git a/docs/en/Blog-Posts/2025-06-10-Announcing-ABP-Studio-1.0-Stable-Release/new-migration-added.gif b/docs/en/Blog-Posts/2025-06-10-Announcing-ABP-Studio-1.0-Stable-Release/new-migration-added.gif new file mode 100644 index 0000000000..b8149e8a41 Binary files /dev/null and b/docs/en/Blog-Posts/2025-06-10-Announcing-ABP-Studio-1.0-Stable-Release/new-migration-added.gif differ diff --git a/docs/en/Blog-Posts/2025-06-10-Announcing-ABP-Studio-1.0-Stable-Release/saas-health-check.png b/docs/en/Blog-Posts/2025-06-10-Announcing-ABP-Studio-1.0-Stable-Release/saas-health-check.png new file mode 100644 index 0000000000..547e518751 Binary files /dev/null and b/docs/en/Blog-Posts/2025-06-10-Announcing-ABP-Studio-1.0-Stable-Release/saas-health-check.png differ diff --git a/docs/en/Blog-Posts/2025-06-10-Announcing-ABP-Studio-1.0-Stable-Release/theme-style-selection-leptonx.png b/docs/en/Blog-Posts/2025-06-10-Announcing-ABP-Studio-1.0-Stable-Release/theme-style-selection-leptonx.png new file mode 100644 index 0000000000..8f5f143a11 Binary files /dev/null and b/docs/en/Blog-Posts/2025-06-10-Announcing-ABP-Studio-1.0-Stable-Release/theme-style-selection-leptonx.png differ diff --git a/docs/en/Community-Articles/2025-03-23-Understanding-the-Embedded-Files-in-ABP-Framework/post.md b/docs/en/Community-Articles/2025-03-23-Understanding-the-Embedded-Files-in-ABP-Framework/post.md index 5664fd8091..ccbf1a285c 100644 --- a/docs/en/Community-Articles/2025-03-23-Understanding-the-Embedded-Files-in-ABP-Framework/post.md +++ b/docs/en/Community-Articles/2025-03-23-Understanding-the-Embedded-Files-in-ABP-Framework/post.md @@ -119,7 +119,7 @@ For example, if your filename is `zh.hans.json`, ABP will generate the following [File] [/MyModule/Volo/Abp/MyModule/Localization/zh/hans.json] ``` -Microsoft provides the `Microsoft.Extensions.FileProviders.Manifest` library to solve this problem. +Microsoft provides the `Microsoft.Extensions.FileProviders.Embedded` library to solve this problem. We need to add this package dependency and set `true` in our project: @@ -136,7 +136,7 @@ We need to add this package dependency and set `t - + diff --git a/docs/en/Community-Articles/2025-05-11-AI-Chat/POST.md b/docs/en/Community-Articles/2025-05-11-AI-Chat/POST.md new file mode 100644 index 0000000000..d6d2a5b6dc --- /dev/null +++ b/docs/en/Community-Articles/2025-05-11-AI-Chat/POST.md @@ -0,0 +1,134 @@ +# Integrating .NET AI Chat Template with ABP Framework + +This article demonstrates how to integrate the [.NET AI Chat Template](https://devblogs.microsoft.com/dotnet/announcing-dotnet-ai-template-preview2/) into an ABP Framework application, enabling powerful AI chat capabilities in your ABP-based solution. + +![cover](cover.png) + +## Step 1: Create a New ABP Project + +First, let's create a new [single-layer Blazor Server project](https://abp.io/docs/latest/solution-templates/single-layer-web-application/overview) named `AbpAiChat` using ABP Studio, You can also use the following ABP CLI command to create the project: + +```bash +abp new AbpAiChat -t app-nolayers --ui-framework blazor-server --use-open-source-template +``` + +## Step 2: Integrate AI Chat Template + +The integration process involves copying and adapting the .NET AI Chat Template code into our ABP project. The template code is already included in our sample project, so you don't need to install it separately. + +### 2.1 Project Structure Changes + +1. Copy Blazor components to the `Components` folder +2. Copy AI service classes to the `Services` folder +3. Add required entities(`IngestedDocument`, `IngestedRecord`) to the `AbpAiChatDbContext` and add new migration +4. Copy frontend resources to the `wwwroot` folder +5. Adjust some styles to capatible with the ABP theme + +### 2.2 Required NuGet Packages + +Add the following packages to `AbpAiChat.csproj`: + +```xml + + + + + + +``` + +### 2.3 Configure AI Services + +Add the following configuration to `AbpAiChatModule.cs`: + +```csharp +private void ConfigureAi(ServiceConfigurationContext context) +{ + var credential = new ApiKeyCredential(context.Services.GetConfiguration()["GitHubToken"] ?? throw new InvalidOperationException("Missing configuration: GitHubToken. See the README for details.")); + var openAiOptions = new OpenAIClientOptions() + { + Endpoint = new Uri("https://models.inference.ai.azure.com") + }; + + var ghModelsClient = new OpenAIClient(credential, openAiOptions); + var chatClient = ghModelsClient.GetChatClient("gpt-4o-mini").AsIChatClient(); + var embeddingGenerator = ghModelsClient.GetEmbeddingClient("text-embedding-3-small").AsIEmbeddingGenerator(); + + var vectorStore = new JsonVectorStore(Path.Combine(AppContext.BaseDirectory, "vector-store")); + + context.Services.AddSingleton(vectorStore); + context.Services.AddScoped(); + context.Services.AddSingleton(); + context.Services.AddChatClient(chatClient).UseFunctionInvocation().UseLogging(); + context.Services.AddEmbeddingGenerator(embeddingGenerator); + + context.Services.Configure(options => + { + options.ContentTypeMaps.Add(".mjs", "application/javascript"); + }); +} +``` + +The `ConfigureAi` method is called in the `ConfigureServices` method of `AbpAiChatModule`. It sets up the AI services, including the OpenAI client, chat client, embedding generator, and vector store. + +### 2.4 Configure GitHub Token + +Add your GitHub Personal Access Token to `appsettings.json`: + +```json +{ + "GitHubToken": "your-github-token" +} +``` + +You can obtain your token from [GitHub Personal Access Tokens](https://github.com/settings/personal-access-tokens). + +## Step 3: Add Custom AI Functionality + +Let's add a custom AI function to retrieve the current user's information. Update the `Chat.razor` component: + +```csharp +chatOptions.Tools = +[ + AIFunctionFactory.Create(SearchAsync), + AIFunctionFactory.Create(GetWeather), + AIFunctionFactory.Create(GetCurrentUserInfo) +]; + +[Description("Get current user information")] +private Task GetCurrentUserInfo() +{ + return Task.FromResult(CurrentUser.IsAuthenticated ? + $"UserId: {CurrentUser.Id}, Name: {CurrentUser.UserName}, Email: {CurrentUser.Email}, Roles: {string.Join(", ", CurrentUser.Roles)}" : + "No user information available."); +} +``` + +## Step 4: Add Navigation + +Add a `Chat` menu item in `AbpAiChatMenuContributor` to navigate to the AI Chat component. + +## Running the Application + +After completing the integration, you can run the application and access the AI chat functionality. The chat interface allows you to: + +- Get weather information +- Ask questions about PDF content +- Retrieve current user information +- And more! + +![AI Chat Interface](ai-chat.png) + +## Conclusion + +This integration demonstrates how to leverage the power of AI in your ABP Framework applications. The .NET AI Chat Template provides a solid foundation for building intelligent chat interfaces, and ABP Framework makes it more powerful. + +## References + +- [ABP Single Layer Solution](https://abp.io/docs/latest/solution-templates/single-layer-web-application/overview) +- [.NET AI Template Documentation](https://devblogs.microsoft.com/dotnet/announcing-dotnet-ai-template-preview1/) +- [GitHub Personal Access Tokens Guide](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens) + +## Source Code + +- [AbpAiChat Source Code](https://github.com/abpframework/abp-samples/tree/master/AIChat) diff --git a/docs/en/Community-Articles/2025-05-11-AI-Chat/ai-chat.png b/docs/en/Community-Articles/2025-05-11-AI-Chat/ai-chat.png new file mode 100644 index 0000000000..8388e2ca9e Binary files /dev/null and b/docs/en/Community-Articles/2025-05-11-AI-Chat/ai-chat.png differ diff --git a/docs/en/Community-Articles/2025-05-11-AI-Chat/cover.png b/docs/en/Community-Articles/2025-05-11-AI-Chat/cover.png new file mode 100644 index 0000000000..5dce208fd6 Binary files /dev/null and b/docs/en/Community-Articles/2025-05-11-AI-Chat/cover.png differ diff --git a/docs/en/Community-Articles/2025-06-10-bootcamp/post.md b/docs/en/Community-Articles/2025-06-10-bootcamp/post.md new file mode 100644 index 0000000000..98192235fa --- /dev/null +++ b/docs/en/Community-Articles/2025-06-10-bootcamp/post.md @@ -0,0 +1,38 @@ +You Asked, We Delivered: Introducing Our New Training Bootcamp\! + +Over the past months we’ve heard from countless freelancers, individuals and small teams asking for a focused, high-impact training without the overwhelming commitment or high costs of traditional bootcamps. So here we are\! + +We're excited to introduce **ABP Bootcamp: Mastering Infrastructure & Features**, a full training experience designed to help developers level up fast with practical knowledge they can apply immediately. + +This live, instructor-led program delivers four days of in-depth, real-world training on ABP’s infrastructure and core features. + +**Bootcamp Details** + +Dates: July 1,2,3,4 2025 +Time: 17:00-19:00 (UTC) each day +Format: Live, online sessions +Price: $399 (discounted $799) +Seats: Limited to a small group + +### **What You’ll Learn** + +By the end of this bootcamp, you’ll have: + +\-A solid understanding of ABP’s infrastructure, systems, and design patterns +\-Practical experience with features like dependency injection, configuration, logging, and localization +\-The ability to implement email templating, event bus, caching, and custom settings in real applications +\-Knowledge of best practices for building scalable, maintainable, and high-performance solutions with ABP + +### **Who It’s For** + +This bootcamp is ideal for: + +\-Developers and freelancers using ABP in their daily work +\-Teams looking to speed up onboarding and improve development efficiency +\-Anyone who wants practical ABP knowledge without committing to long-format training programs + +### **Reserve Your Spot** + +Seats are limited to keep the experience interactive and personalized. With the current 50% discount, this is the most accessible way to gain hands-on ABP experience with expert guidance. + +**Registration is now open. Secure your place today and master the infrastructure that powers ABP. Register here: [https://docs.google.com/forms/d/e/1FAIpQLSckMZChdqIJIuWiEvg\_KsSDmrxagRdc5WBYceAemHLrmT1oiA/viewform](https://docs.google.com/forms/d/e/1FAIpQLSckMZChdqIJIuWiEvg_KsSDmrxagRdc5WBYceAemHLrmT1oiA/viewform)** diff --git a/docs/en/Community-Articles/2025-06-12-fix-mongodb-guid-abp-v9.2.0-upgrade/mongo-db.jpg b/docs/en/Community-Articles/2025-06-12-fix-mongodb-guid-abp-v9.2.0-upgrade/mongo-db.jpg new file mode 100644 index 0000000000..63d1fc9ab6 Binary files /dev/null and b/docs/en/Community-Articles/2025-06-12-fix-mongodb-guid-abp-v9.2.0-upgrade/mongo-db.jpg differ diff --git a/docs/en/Community-Articles/2025-06-12-fix-mongodb-guid-abp-v9.2.0-upgrade/post.md b/docs/en/Community-Articles/2025-06-12-fix-mongodb-guid-abp-v9.2.0-upgrade/post.md new file mode 100644 index 0000000000..ddae9a3704 --- /dev/null +++ b/docs/en/Community-Articles/2025-06-12-fix-mongodb-guid-abp-v9.2.0-upgrade/post.md @@ -0,0 +1,93 @@ +# Solving MongoDB GUID Issues After an ABP Framework Upgrade + +So, you've just upgraded your ABP Framework application to a newer version (like v9.2.0+) and suddenly, your application can't read data from its MongoDB database. You're seeing strange deserialization errors, especially related to `Guid` types. What's going on? + +You've likely run into a classic compatibility issue with the MongoDB .NET driver. + +### The Problem: Legacy vs. Standard GUIDs + +Here's the short version: + +* **Old MongoDB Drivers** (used in older ABP versions) stored `Guid` values in a format called `CSharpLegacy`. +* **New MongoDB Drivers** (v3.0+), now default to a universal `Standard` format. + +When your newly upgraded app tries to read old data, the new driver expects the `Standard` format but finds `CSharpLegacy`. The byte orders don't match, and... boom. Deserialization fails. + +The ABP Framework team has an excellent official guide covering this topic in detail. We highly recommend reading their **[MongoDB Driver 2 to 3 Migration Guide](https://abp.io/docs/latest/release-info/migration-guides/MongoDB-Driver-2-to-3)** for a full understanding. + +Our tip below serves as a fast, application-level fix if you need to get your system back online quickly without performing a full data migration. + +### The Quick Fix: Tell the Driver to Use the Old Format + +Instead of changing your data, you can simply tell the new driver to continue using the old `CSharpLegacy` format for all `Guid` and `Guid?` properties. This provides immediate backward compatibility without touching your database. + +It’s a simple, two-step process. + +#### Step 1: Create a Custom Convention + +First, create this class in your `.MongoDb` project. It tells the serializer how to handle `Guid` types. + +```csharp +using MongoDB.Bson; +using MongoDB.Bson.Serialization; +using MongoDB.Bson.Serialization.Conventions; +using MongoDB.Bson.Serialization.Serializers; +using System; + +public class LegacyGuidConvention : ConventionBase, IMemberMapConvention +{ + public void Apply(BsonMemberMap memberMap) + { + if (memberMap.MemberType == typeof(Guid)) + { + memberMap.SetSerializer(new GuidSerializer(GuidRepresentation.CSharpLegacy)); + } + else if (memberMap.MemberType == typeof(Guid?)) + { + var guidSerializer = new GuidSerializer(GuidRepresentation.CSharpLegacy); + var nullableGuidSerializer = new NullableSerializer(guidSerializer); + memberMap.SetSerializer(nullableGuidSerializer); + } + } +} +``` + +#### Step 2: Register the Convention at Startup + +Now, register this convention in your `YourProjectMongoDbModule.cs` file. Add this code to the top of the `ConfigureServices` method. This ensures your rule is applied globally as soon as the application starts. + +```csharp +using Volo.Abp.Modularity; +using MongoDB.Bson.Serialization; +using MongoDB.Bson.Serialization.Conventions; + +public class YourProjectMongoDbModule : AbpModule +{ + public override void ConfigureServices(ServiceConfigurationContext context) + { + // Fix Start + var conventionPack = new ConventionPack { new LegacyGuidConvention() }; + ConventionRegistry.Register( + "LegacyGuidConvention", + conventionPack, + t => true); // Apply to all types + // Fix End + + // ... Your existing ConfigureServices code + } +} +``` + +### An Alternative to Full Data Migration + +It's important to note that the method described here is an **application-level fix**. It's a fantastic alternative to performing a full data migration, which involves writing scripts to convert every legacy GUID in your database. + +If you are interested in the more permanent, data-centric approach, the ABP.IO community has a detailed guide on [**Migrating MongoDB GUIDs from Legacy to Standard Format**](https://abp.io/community/articles/migrating-mongodb-guids-from-legacy-to-standard-format-mongodb-v2-to-v3-dqwybdtw). + +Our quick fix is ideal for getting a system back online fast or when a database migration is too complex. The full migration is better for long-term standards compliance. Choose the path that best fits your project's needs! + +### That's It! + +Restart your application, and the errors should be gone. Your app can now correctly read its old `Guid` data, and it will continue to write new data in the same legacy format, ensuring consistency. + +This approach is a lifesaver for existing projects, saving you from a risky and time-consuming data migration. For brand-new projects, you might consider starting with the `Standard` representation, but for everything else, this is a clean and effective fix. Happy coding! diff --git a/docs/en/Community-Articles/2025-06-13-modular-docker-container-management/modular-docker-container-management.md b/docs/en/Community-Articles/2025-06-13-modular-docker-container-management/modular-docker-container-management.md new file mode 100644 index 0000000000..3f6e061c14 --- /dev/null +++ b/docs/en/Community-Articles/2025-06-13-modular-docker-container-management/modular-docker-container-management.md @@ -0,0 +1,113 @@ +# 🚀 New in ABP Studio: Modular Docker Container Management + +We're excited to announce a new improvement to Docker integration in **ABP Studio**! +With the latest update, you can now manage Docker containers **individually**, add or remove them dynamically, and launch them **either separately or collectively** — all within the Studio. + +![solution-runner-containers](solution-runner-containers.png) + +------ + +## 🔄 What Has Changed? + +In previous versions, Docker dependencies were handled using a **single `docker-compose.override.yml` file**, which was **automatically generated** when creating a new solution if it is needed. + +By default, this file included common development dependencies like PostgreSQL, Redis, RabbitMQ, etc., and was executed through a predefined script named `docker-dependencies` in the Solution Runner. + +While this approach worked well for simple setups, it had some limitations: + +- All services were bundled into a **single compose file**. +- Adding or removing services required modifying this central file. +- It wasn't possible to **start or stop individual containers independently**. + +------ + +## ✅ What's New? + +With the latest ABP Studio update: + +- Each Docker container can now be defined in its **own `docker-compose` file**. +- Compose files can be **added or removed** from the Studio UI. +- Containers can be: + - **Started or stopped individually**. + - **Started/stopped in bulk**. +- The **Solution Runner** recognizes Docker containers and can run them alongside application projects. + +------ + +## ⚠️ Important Notes Before You Start + +### Required: Use `container_name` for Docker Service Matching + +When working with the new modular Docker system in ABP Studio, each service **must define a `container_name`**. +This name is used by ABP Studio to **identify and map** Docker containers to their corresponding service entries in the Studio UI. + +#### Why is this mandatory? + +- ABP Studio relies on `container_name` to: + - Detect whether the service is stopped or continue running. + - Perform **start**, **stop**, and **status check** operations reliably. + - Match Studio UI entries with actual running Docker containers. +- Without a `container_name`, container discovery may fail and **service management features might not work as expected**. + +#### Example: + +``` +services: + redis: + container_name: redis + image: redis:7 + ports: + - "6379:6379" + networks: + - my-network +``` + +> If you do **not** define `container_name`, ABP Studio will be unable to track or control the service properly. + +------ + +## 📥 Migrating from the Old System + +If you're using the old method with a centralized compose file: + +Before: + +``` +docker-compose -f docker-compose.override.yml up -d +``` + +Now: + +1. Create separate `docker-compose` files for each service + (e.g., `docker-compose.postgres.yml`, `docker-compose.redis.yml`). +2. Go to the **Solution Runner tab in ABP Studio**. +3. Use the **“Add Docker Service”** option in Studio to register each file. +4. Optionally remove or archive the old monolithic compose file. + +> If your original `docker-compose.override.yml` contains multiple services, you can split it into individual files — Docker Compose and ABP Studio both support modular composition. + +------ + +## ⚙️ Advanced: Shared Network + +If your containers need to communicate over a shared network, you can define an external network in each compose file like this: + +``` +networks: + my-network: + external: true +``` + +ABP Studio automatically creates the network if they do no exist. But if you like you can create the network once using: + +``` +docker network create my-network +``` + +------ + +## 📚 Additional Resources + +- Docker Compose Documentation +- ABP Studio Documentation (link to updated docs when ready) +- [Report Issues on GitHub](https://github.com/abpframework/abp/issues) \ No newline at end of file diff --git a/docs/en/Community-Articles/2025-06-13-modular-docker-container-management/solution-runner-containers.png b/docs/en/Community-Articles/2025-06-13-modular-docker-container-management/solution-runner-containers.png new file mode 100644 index 0000000000..ef6de78c1f Binary files /dev/null and b/docs/en/Community-Articles/2025-06-13-modular-docker-container-management/solution-runner-containers.png differ diff --git a/docs/en/cli/index.md b/docs/en/cli/index.md index 02521e72cb..60d4e3ff0b 100644 --- a/docs/en/cli/index.md +++ b/docs/en/cli/index.md @@ -161,7 +161,7 @@ For more samples, go to [ABP CLI Create Solution Samples](new-command-samples.md * `--database-provider` or `-d`: Specifies the database provider. Default provider is `ef`. Available providers: * `ef`: Entity Framework Core. * `mongodb`: MongoDB. - * `--connection-string` or `-cs`: Overwrites the default connection strings in all `appsettings.json` files. The default connection string is `Server=localhost;Database=MyProjectName;Trusted_Connection=True` for EF Core and it is configured to use the SQL Server. If you want to use the EF Core, but need to change the DBMS, you can change it as [described here](../framework/data/entity-framework-core/other-dbms.md) (after creating the solution). + * `--connection-string` or `-cs`: Overwrites the default connection strings in all `appsettings.json` files. The default connection string is `Server=localhost;Database=MyProjectName;Trusted_Connection=True` for EF Core and it is configured to use the SQL Server. If you want to use the EF Core, but need to change the DBMS, you can change it as [described here](../framework/data/entity-framework-core/other-dbms.md) (after creating the solution). **Note:** When specifying the connection string, make sure to enclose it in double quotes, for example: `--connection-string "Server=localhost;Database=MyProjectName;Trusted_Connection=True"`. * `--skip-migrations` or `-sm`: Skips the creating initial database migration step. * `--skip-migrator` or `-smr`: Skips the run database migrator step. * `--public-website`: Public Website is a front-facing website for describing your project, listing your products and doing SEO for marketing purposes. Users can login and register on your website with this website. This option is only included in PRO templates. @@ -183,7 +183,7 @@ For more samples, go to [ABP CLI Create Solution Samples](new-command-samples.md * `--database-provider` or `-d`: Specifies the database provider. Default provider is `ef`. Available providers: * `ef`: Entity Framework Core. * `mongodb`: MongoDB. - * `--connection-string` or `-cs`: Overwrites the default connection strings in all `appsettings.json` files. The default connection string is `Server=localhost;Database=MyProjectName;Trusted_Connection=True` for EF Core and it is configured to use the SQL Server. If you want to use the EF Core, but need to change the DBMS, you can change it as [described here](../framework/data/entity-framework-core/other-dbms.md) (after creating the solution). + * `--connection-string` or `-cs`: Overwrites the default connection strings in all `appsettings.json` files. The default connection string is `Server=localhost;Database=MyProjectName;Trusted_Connection=True` for EF Core and it is configured to use the SQL Server. If you want to use the EF Core, but need to change the DBMS, you can change it as [described here](../framework/data/entity-framework-core/other-dbms.md) (after creating the solution). **Note:** When specifying the connection string, make sure to enclose it in double quotes, for example: `--connection-string "Server=localhost;Database=MyProjectName;Trusted_Connection=True"`. * `--skip-migrations` or `-sm`: Skips the creating initial database migration step. * `--skip-migrator` or `-smr`: Skips the run database migrator step. * `--sample-crud-page` or `-scp`: It adds the [BookStore](./../tutorials/book-store/index.md) sample to your solution. @@ -295,7 +295,7 @@ abp new-package --name Acme.BookStore.Domain --template lib.domain * `lib.ef` * `--include-migrations`: Allows migration operations on this package. * `--connection-string-name`: Default value is the last part of the package's namespace (or package name simply). - * `--connection-string`: Connection string value. Defaut value is null. You can set it alter. + * `--connection-string`: Connection string value. Defaut value is null. You can set it alter. **Note:** When specifying the connection string, make sure to enclose it in double quotes, for example: `--connection-string "Server=localhost;Database=MyProjectName;Trusted_Connection=True"`. * `lib.mongodb` * `lib.http-api` * `lib.http-api-client` diff --git a/docs/en/framework/infrastructure/background-jobs/index.md b/docs/en/framework/infrastructure/background-jobs/index.md index 5aa58a7d3e..af0c33de21 100644 --- a/docs/en/framework/infrastructure/background-jobs/index.md +++ b/docs/en/framework/infrastructure/background-jobs/index.md @@ -134,6 +134,25 @@ namespace MyProject } ``` +##### Custom Job Name + +You can configure `GetBackgroundJobName` delegate of the `AbpBackgroundJobOptions` to change the default job name. + +```csharp +Configure(options => +{ + options.GetBackgroundJobName = (jobType) => + { + if (jobTyep == typeof(EmailSendingArgs)) + { + return "emails"; + } + + return BackgroundJobNameAttribute.GetName(jobType); + }; +}); +``` + ### Queue a Job Item Now, you can queue an email sending job using the `IBackgroundJobManager` service: diff --git a/docs/en/framework/infrastructure/background-workers/index.md b/docs/en/framework/infrastructure/background-workers/index.md index 884ea60c25..6ab88a9e53 100644 --- a/docs/en/framework/infrastructure/background-workers/index.md +++ b/docs/en/framework/infrastructure/background-workers/index.md @@ -41,6 +41,8 @@ Start your worker in the `StartAsync` (which is called when the application begi Assume that we want to make a user passive, if the user has not logged in to the application in last 30 days. `AsyncPeriodicBackgroundWorkerBase` class simplifies to create periodic workers, so we will use it for the example below: +> You can use `CronExpression` property to set the cron expression for the background worker if you will use the [Hangfire Background Worker Manager](./hangfire.md) or [Quartz Background Worker Manager](./quartz.md). + ````csharp public class PassiveUserCheckerWorker : AsyncPeriodicBackgroundWorkerBase { @@ -52,6 +54,7 @@ public class PassiveUserCheckerWorker : AsyncPeriodicBackgroundWorkerBase serviceScopeFactory) { Timer.Period = 600000; //10 minutes + //CronExpression = "0 0/10 * * * ?"; //Run every 10 minutes, Only for Quartz or Hangfire integration. } protected async override Task DoWorkAsync( diff --git a/docs/en/framework/infrastructure/simple-state-checker.md b/docs/en/framework/infrastructure/simple-state-checker.md index 584fef1592..981e4f6a61 100644 --- a/docs/en/framework/infrastructure/simple-state-checker.md +++ b/docs/en/framework/infrastructure/simple-state-checker.md @@ -11,11 +11,11 @@ public class MyObject : IHasSimpleStateCheckers { public int Id { get; set; } - public List> SimpleStateCheckers { get; } + public List> StateCheckers { get; } public MyObject() { - SimpleStateCheckers = new List>(); + StateCheckers = new List>(); } } ```` diff --git a/docs/en/get-started/maui.md b/docs/en/get-started/maui.md index 657a217d44..21497fb2f7 100644 --- a/docs/en/get-started/maui.md +++ b/docs/en/get-started/maui.md @@ -13,9 +13,11 @@ dotnet tool install -g Volo.Abp.Studio.Cli Then use the `abp new` command in an empty folder to create a new solution: ````bash -abp new Acme.MyMauiApp -t maui +abp new Acme.MyMauiApp -t maui --old ```` +> **Note**: Since this startup template is not provided by the new ABP Studio Templates yet, you need to pass the `--old` parameter at the end of the command to use the old CLI & templating system for this startup template. + `Acme.MyMauiApp` is the solution name, like *YourCompany.YourProduct*. You can use single level, two-levels or three-levels naming. ## Solution Structure diff --git a/docs/en/images/azure-deploy-create-web-app-2.png b/docs/en/images/azure-deploy-create-web-app-2.png index bbf8f96c64..d68e502783 100644 Binary files a/docs/en/images/azure-deploy-create-web-app-2.png and b/docs/en/images/azure-deploy-create-web-app-2.png differ diff --git a/docs/en/images/azure-deploy-create-web-app-6.png b/docs/en/images/azure-deploy-create-web-app-6.png index f54a17e095..4993061eb5 100644 Binary files a/docs/en/images/azure-deploy-create-web-app-6.png and b/docs/en/images/azure-deploy-create-web-app-6.png differ diff --git a/docs/en/modules/audit-logging-pro.md b/docs/en/modules/audit-logging-pro.md index ef609e5422..cb32ff52fe 100644 --- a/docs/en/modules/audit-logging-pro.md +++ b/docs/en/modules/audit-logging-pro.md @@ -9,6 +9,8 @@ This module implements the Audit Logging system of an application; * See all changes of entities and filter entity change logs. * View details of an entity change. * View all changes of an entity. +* Export audit logs and entity changes to Excel. +* Receive email notifications for completed or failed exports. * This module also defines reusable "Average Execution Duration Per Day" and "Error Rate" widgets. * Periodic clean up of audit logs. @@ -56,6 +58,10 @@ You can view details of an audit log by clicking the magnifier icon on each audi * **Actions:** This tab shows list of actions (controller actions and application service method calls with their parameters) executed during a web request. * **Changes:** This tab shows changed entities during the web request. +##### Export to Excel + +You can export audit logs to Excel by clicking the "Export to Excel" button in the toolbar. If the result set is small (less than a configurable threshold), the file will be generated and downloaded immediately. For larger result sets, the export will be processed as a background job and you'll receive an email with a download link once the export is completed. + #### Entity Changes Entity changes tab is used to list, view and filter entity change logs. @@ -80,6 +86,10 @@ You can view details of all changes of an entity by clicking the "Full Change Hi ![audit-logging-module-full-entity-change-details-modal](../images/audit-logging-module-full-entity-change-details-modal.png) +##### Export to Excel + +You can export entity changes to Excel by clicking the "Export to Excel" button in the toolbar. Similar to audit logs export, for large datasets the export will be processed as a background job and you'll receive an email notification once completed. + #### Audit Log Settings The *Audit Log* settings tab is used to configure audit log settings. You can enable or disable the clean up service system wide. This way, you can shut down the clean up service for all tenants and host. If the system wide clean up service is enabled, you can configure the global *Expired Item Deletion Period* for all tenants and host. @@ -121,11 +131,32 @@ To see `AbpAuditingOptions` properties, please see its [documentation](../framew Configure(options => { options.Period = (int)TimeSpan.FromSeconds(30).TotalMilliseconds; + options.CronExpression = "0 23 * * *"; // This Cron expression only works if Hangfire or Quartz is used for background workers. }); ``` The *Period* doesn't mean the *Expired Item Deletion Period*. It's the period of the worker to run clean up service system wide. The default value is 1 day. +### AuditLogExcelFileOptions + +`AuditLogExcelFileOptions` can be configured in the UI layer, within the `ConfigureServices` method of your [module](../framework/architecture/modularity/basics.md). Example: + +```csharp +Configure(options => +{ + options.FileRetentionHours = 24; // How long to keep files before cleanup (default: 24 hours) + options.DownloadBaseUrl = "https://yourdomain.com"; // Base URL for download links in emails + options.ExcelFileCleanupOptions.Period = (int)TimeSpan.FromHours(24).TotalMilliseconds; // Interval of the cleanup worker (default: 24 hours) + options.ExcelFileCleanupOptions.CronExpression = "0 23 * * *"; // This Cron expression only works if Hangfire or Quartz is used for background workers. +}); +``` + +> Note: The `FileRetentionHours` value determines when files become eligible for deletion, but actual deletion depends on when the cleanup worker runs. If the worker hasn't run after the retention period expires, files will remain accessible. Therefore, `FileRetentionHours` represents the minimum intended retention time, but the actual retention time might be longer depending on the worker's execution schedule. + +These settings control where Excel export files are stored, how long they are kept before automatic cleanup, and what base URL is used in email download links. + +> You must use a valid [BLOB Storage Provider](https://abp.io/docs/latest/framework/infrastructure/blob-storing#blob-storage-providers) to use this feature. + ## Internals ### Domain layer @@ -156,6 +187,15 @@ Following custom repositories are defined for this module: * `AuditLogsAppService` (implements `IAuditLogsAppService`): Implements the use cases of the audit logs management UI. +#### Email Templates + +The module provides email templates for notifications: + +* `AuditLogExportCompleted`: Sent when an audit log export is successfully completed, including a download link. +* `AuditLogExportFailed`: Sent when an audit log export fails, including error details. +* `EntityChangeExportCompleted`: Sent when an entity change export is successfully completed, including a download link. +* `EntityChangeExportFailed`: Sent when an entity change export fails, including error details. + ### Database providers #### Common diff --git a/docs/en/release-info/release-notes.md b/docs/en/release-info/release-notes.md index 4c6bec206e..ce35f8b87c 100644 --- a/docs/en/release-info/release-notes.md +++ b/docs/en/release-info/release-notes.md @@ -8,9 +8,9 @@ Also see the following notes about ABP releases: * [Change logs for ABP pro packages](https://abp.io/pro-releases) -## 9.2 (2025-03-25) +## 9.2 (2025-06-02) -This is currently a RC (release-candidate) and you can see the detailed **[blog post / announcement](https://abp.io/community/articles/abp-platform-9.2-rc-has-been-released-jpq072nh)** for the v9.2 release. +See the detailed **[blog post / announcement](https://abp.io/community/articles/announcing-abp-9-2-stable-release-061qmtzb)** for the v9.2 release. * Added `ApplicationName` Property to Isolate Background Jobs & Background Workers * Docs Module: Added "Alternative Words" to Filter Items diff --git a/docs/en/solution-templates/layered-web-application/deployment/azure-deployment/azure-deployment.md b/docs/en/solution-templates/layered-web-application/deployment/azure-deployment/azure-deployment.md index 49d3750da2..566cf80e32 100644 --- a/docs/en/solution-templates/layered-web-application/deployment/azure-deployment/azure-deployment.md +++ b/docs/en/solution-templates/layered-web-application/deployment/azure-deployment/azure-deployment.md @@ -3,7 +3,7 @@ ````json //[doc-params] { - "UI": ["MVC", "Blazor", "BlazorServer", "NG"], + "UI": ["MVC", "Blazor", "BlazorServer", "BlazorWebApp", "NG"], "DB": ["EF", "Mongo"], "Tiered": ["Yes", "No"] } diff --git a/docs/en/solution-templates/layered-web-application/deployment/azure-deployment/step1-create-azure-resources.md b/docs/en/solution-templates/layered-web-application/deployment/azure-deployment/step1-create-azure-resources.md index 4a4601486c..9fb4de254b 100644 --- a/docs/en/solution-templates/layered-web-application/deployment/azure-deployment/step1-create-azure-resources.md +++ b/docs/en/solution-templates/layered-web-application/deployment/azure-deployment/step1-create-azure-resources.md @@ -1,7 +1,7 @@ ````json //[doc-params] { - "UI": ["MVC", "Blazor", "BlazorServer", "NG"], + "UI": ["MVC", "Blazor", "BlazorServer", "BlazorWebApp", "NG"], "DB": ["EF", "Mongo"], "Tiered": ["Yes", "No"] } @@ -15,7 +15,9 @@ To create a new Azure Web App Service, choose one of the following options: - [Create a new Azure Web App Service using the Terraform Template](terraform-web-app-service.md) (If you have experience with Terraform) -{{ if UI == "MVC" && Tiered == "No" }} +{{ if Tiered == "No" }} + +{{ if UI == "BlazorServer" || UI == "MVC" || UI == "BlazorWebApp"}} ### Create a new Azure Web App service using the Azure Portal @@ -39,9 +41,102 @@ To create a new Azure Web App Service, choose one of the following options: ![Create Web App](../../../../images/azure-deploy-create-web-app-3.png) -{{else}} +{{else if UI == 'NG'}} +### Create a new Azure Static Web App for Angular using the Azure Portal + +1. Log in to the [Azure Portal](https://portal.azure.com/). + +2. Click the **Create a resource** button. + +3. Search for **Static Web App** and select **Static Web App** from the results. + + ![Create a resource angular](../../../../images/azure-deploy-create-a-resource-angular.png) + +4. Click the **Create** button. + +5. Fill in the required fields and click the **Review + create** button. + +6. Click the **Create** button. + + ![Create Web App](../../../../images/azure-deploy-create-web-app-4.png) + +7. Wait for the deployment to complete. + + ![Create Web App](../../../../images/azure-deploy-create-web-app-5.png) + +### Create a new Azure Web App Service for API application + +1. You can create a new Azure Web App Service for an API application in the same resource group. + +2. Click the **Create** button on the top of the resource group page. + +3. Search for **Web App** and select **Web App** from the results. + + ![Create a resource](../../../../images/azure-deploy-create-a-resource.png) + +4. Click the **Create** button. + +5. Fill in the required fields and click the **Review + create** button. + +6. Click the **Create** button. + + ![Create Web App](../../../../images/azure-deploy-create-web-app-6.png) + +7. Wait for the deployment to complete. + + ![Create Web App](../../../../images/azure-deploy-create-web-app-3.png) + +{{ else }} + +### Create a new Azure Static Web App for Blazor using the Azure Portal + +1. Log in to the [Azure Portal](https://portal.azure.com/). + +2. Click the **Create a resource** button. + +3. Search for **Static Web App** and select **Static Web App** from the results. + + ![Create a resource blazor](../../../../images/azure-deploy-create-a-resource-angular.png) + +4. Click the **Create** button. + +5. Fill in the required fields and click the **Review + create** button. + +6. Click the **Create** button. + + ![Create Web App](../../../../images/azure-deploy-create-web-app-7.png) + +7. Wait for the deployment to complete. + + ![Create Web App](../../../../images/azure-deploy-create-web-app-8.png) + +### Create a new Azure Web App Service for API application + +1. You can create a new Azure Web App Service for an API application in the same resource group. + +2. Click the **Create** button on the top of the resource group page. + +3. Search for **Web App** and select **Web App** from the results. + + ![Create a resource](../../../../images/azure-deploy-create-a-resource.png) + +4. Click the **Create** button. + +5. Fill in the required fields and click the **Review + create** button. + +6. Click the **Create** button. + + ![Create Web App](../../../../images/azure-deploy-create-web-app-6.png) + +7. Wait for the deployment to complete. + + ![Create Web App](../../../../images/azure-deploy-create-web-app-3.png) + +{{end}} + +{{ else }} -{{ if UI == "BlazorServer" || UI == "MVC" }} +{{ if UI == "BlazorServer" || UI == "MVC" || UI == "BlazorWebApp"}} ### Create a new Azure Web App service using the Azure Portal @@ -65,8 +160,7 @@ To create a new Azure Web App Service, choose one of the following options: ![Create Web App](../../../../images/azure-deploy-create-web-app-3.png) -{{ else if UI == 'NG' }} - +{{ else if UI == 'NG'}} ### Create a new Azure Static Web App for Angular using the Azure Portal 1. Log in to the [Azure Portal](https://portal.azure.com/). @@ -89,7 +183,7 @@ To create a new Azure Web App Service, choose one of the following options: ![Create Web App](../../../../images/azure-deploy-create-web-app-5.png) -{{else}} +{{ else }} ### Create a new Azure Static Web App for Blazor using the Azure Portal @@ -111,8 +205,6 @@ To create a new Azure Web App Service, choose one of the following options: 7. Wait for the deployment to complete. - ![Create Web App](../../../../images/azure-deploy-create-web-app-8.png) - {{end}} ### Create a new Azure Web App Service for API application @@ -137,8 +229,6 @@ To create a new Azure Web App Service, choose one of the following options: ![Create Web App](../../../../images/azure-deploy-create-web-app-3.png) -{{ if Tiered == "Yes" && (UI == "MVC" || UI == "BlazorServer")}} - ### Create a new Azure Web App Service for AuthServer application Similar to the API application, you can create a new Azure Web App Service for an AuthServer application in the same resource group. @@ -167,8 +257,6 @@ Same as above, but you only need to modify the name of the web app service to ** {{ end }} -{{ end }} - ## What's next? - [Customizing the Azure Web App Service](step2-configuration-application.md) diff --git a/docs/en/solution-templates/layered-web-application/deployment/azure-deployment/step2-configuration-application.md b/docs/en/solution-templates/layered-web-application/deployment/azure-deployment/step2-configuration-application.md index 5f1ba5aafe..718446353a 100644 --- a/docs/en/solution-templates/layered-web-application/deployment/azure-deployment/step2-configuration-application.md +++ b/docs/en/solution-templates/layered-web-application/deployment/azure-deployment/step2-configuration-application.md @@ -1,7 +1,7 @@ ````json //[doc-params] { - "UI": ["MVC", "Blazor", "BlazorServer", "NG"], + "UI": ["MVC", "Blazor", "BlazorServer", "BlazorWebApp", "NG"], "DB": ["EF", "Mongo"], "Tiered": ["Yes", "No"] } @@ -9,17 +9,26 @@ ## Step 2: Customizing the Configuration of the ABP Application -- To customize the configuration of your ABP application, modify the `ConnectionString` values in every location throughout your project. The `ConnectionString` values are stored in the `appsettings.json` files. +#### To customize the configuration of your ABP application - This includes the following files: -{{ if UI == "MVC" && Tiered == "No" }} - **./src/yourapp.DbMigrator/appsettings.json** and **./src/yourapp.Web/appsettings.json** -{{else}} - **./src/yourapp.DbMigrator/appsettings.json** and **./src/yourapp.HttpApi.Host/appsettings.json** -{{end}} -{{if Tiered == "Yes"}} +- Modify the `ConnectionString` values in every location throughout your project. The `ConnectionString` values are stored in the `appsettings.json` files. + + * This includes the following files: + + **./src/yourapp.DbMigrator/appsettings.json** +{{ if Tiered == "No" }} +{{ if UI == "MVC" }} + **./src/yourapp.Web/appsettings.json** +{{ else if UI == "Blazor" || UI == "BlazorServer" || UI == "BlazorWebApp" }} + and **./src/yourapp.Blazor/appsettings.json** +{{ end }} +{{ if UI == "Blazor"|| UI == "NG" }} + **./src/yourapp.HttpApi.Host/appsettings.json** +{{ end }} +{{ else }} + **./src/yourapp.HttpApi.Host/appsettings.json** **./src/yourapp.AuthServer/appsettings.json** -{{end}} +{{ end }} ```json "ConnectionStrings": { @@ -27,35 +36,42 @@ } ``` -{{ if UI == "MVC" }} - -{{if Tiered == "No"}} - Modify the **yourapp.Web** URL in every location throughout your project, especially within the **./src/yourapp.Web/appsettings.json** and **./src/yourapp.DbMigrator/appsettings.json** files, to match your Azure Web App Service URL. + * This includes the following files: + **./src/yourapp.DbMigrator/appsettings.json** +{{ if Tiered == "No" }} +{{ if UI == "MVC" }} + **./src/yourapp.Web/appsettings.json** +{{ else if UI == "Blazor" || UI == "BlazorServer" || UI == "BlazorWebApp" }} + and **./src/yourapp.Blazor/appsettings.json** +{{ else }} + Modify the **`localhost:4200`** in every location throughout your project. + **./angular/src/environments/environment.prod.ts** +{{ end }} +{{ if UI == "Blazor"|| UI == "NG" }} + **./src/yourapp.HttpApi.Host/appsettings.json** +{{ end }} +{{ else }} +{{ if UI == "MVC" }} + **./src/yourapp.Web/appsettings.json** +{{ else if UI == "Blazor" || UI == "BlazorServer" || UI == "BlazorWebApp" }} + **./src/yourapp.Blazor/appsettings.json** +{{ else }} + Modify the **`localhost:4200`** in every location throughout your project. + **./angular/src/environments/environment.prod.ts** +{{ end }} + **./src/yourapp.AuthServer/appsettings.json** + ```json "App": { "SelfUrl": "https://yourapp.azurewebsites.net" } ``` - -{{else}} - -- Modify the **yourapp.Web** URL in every location throughout your project. - - This includes the following files: - - **./src/yourapp.Web/appsettings.json** , **./src/yourapp.DbMigrator/appsettings.json** , **./src/yourapp.HttpApi.Host/appsettings.json** and **./src/yourapp.AuthServer/appsettings.json** - -```json -"App": { - "SelfUrl": "https://yourapp.azurewebsites.net" -} -``` - - Modify the **yourapp.ApiHost** URL in every location throughout your project. - This includes the following files: + * This includes the following files: **./src/yourapp.HttpApi.Host/appsettings.json** , **./src/yourapp.Web/appsettings.json** , **./src/yourapp.DbMigrator/appsettings.json** and **./src/yourapp.AuthServer/appsettings.json** @@ -67,7 +83,7 @@ - Modify the **yourapp.AuthServer** URL in every location throughout your project. - This includes the following files: + * This includes the following files: **./src/yourapp.Web/appsettings.json** , **./src/yourapp.AuthServer/appsettings.json** , **./src/yourapp.DbMigrator/appsettings.json** and **./src/yourapp.HttpApi.Host/appsettings.json** @@ -79,139 +95,7 @@ - Modify the **Redis__Configuration** URL in every location throughout your project. - This includes the following files: - - **./src/yourapp.Web/appsettings.json** , **./src/yourapp.AuthServer/appsettings.json** , **./src/yourapp.DbMigrator/appsettings.json** and **./src/yourapp.HttpApi.Host/appsettings.json** - -```json -"Redis": { - "Configuration": "redis-abpdemo.redis.cache.windows.net:6380,password={yourpassword},ssl=true,abortConnect=False" - }, -``` - -{{end}} - -{{ else if UI == "NG" }} - -- Modify the **`localhost:4200`** in every location throughout your project. - - This includes the following files: - - **./angular/src/environments/environment.prod.ts** , **./aspnet-core/src/yourapp.DbMigrator/appsettings.json** and **./aspnet-core/src/yourapp.HttpApi.Host/appsettings.json** - -```typescript - application: { - baseUrl: 'https://yourapp.azurestaticapps.net' - } -``` - -- Modify the **yourapp.HttpApi.Host** URL in every location throughout your project. - - This includes the following files: - - **./angular/src/environments/environment.prod.ts** , **./aspnet-core/src/yourapp.DbMigrator/appsettings.json** and **./aspnet-core/src/yourapp.HttpApi.Host/appsettings.json** - -```json - "App": { - "SelfUrl": "https://yourApiHost.azurewebsites.net" - } -``` - -{{ else if UI == "Blazor" }} - -- Modify the **yourapp.Blazor** URL in every location throughout your project. - - This includes the following files: - - **./src/yourapp.Blazor/appsettings.json** , **./src/yourapp.DbMigrator/appsettings.json** and **./src/yourapp.HttpApi.Host/appsettings.json** - -```json - "App": { - "SelfUrl": "https://yourapp.azurewebsites.net" - } -``` - -- Modify the **yourapp.HttpApi.Host** URL in every location throughout your project. - - This includes the following files: - - **./src/yourapp.Blazor/appsettings.json** , **./src/yourapp.DbMigrator/appsettings.json** and **./src/yourapp.HttpApi.Host/appsettings.json** - -```json - "App": { - "SelfUrl": "https://yourApiHost.azurewebsites.net" - } -``` - -{{ else }} - -{{if Tiered == "No"}} - -- Modify the **yourapp.Web** URL in every location throughout your project. - - This includes the following files: - - **./src/yourapp.Blazor/appsettings.json** , **./src/yourapp.DbMigrator/appsettings.json** and **./src/yourapp.HttpApi.Host/appsettings.json** - -```json -"App": { - "SelfUrl": "https://yourapp.azurewebsites.net" -} -``` - -- Modify the **yourapp.ApiHost** URL in every location throughout your project. - - This includes the following files: - - **./src/yourapp.HttpApi.Host/appsettings.json** , **./src/yourapp.Blazor/appsettings.json** and **./src/yourapp.DbMigrator/appsettings.json** - -```json -"App": { - "SelfUrl": "https://yourapp-apihost.azurewebsites.net" -} -``` - -{{else}} - -- Modify the **yourapp.Web** URL in every location throughout your project. - - This includes the following files: - - **./src/yourapp.Blazor/appsettings.json** , **./src/yourapp.DbMigrator/appsettings.json** , **./src/yourapp.HttpApi.Host/appsettings.json** and **./src/yourapp.AuthServer/appsettings.json** - -```json -"App": { - "SelfUrl": "https://yourapp.azurewebsites.net" -} -``` - -- Modify the **yourapp.ApiHost** URL in every location throughout your project. - - This includes the following files: - - **./src/yourapp.HttpApi.Host/appsettings.json** , **./src/yourapp.Blazor/appsettings.json** , **./src/yourapp.DbMigrator/appsettings.json** and **./src/yourapp.AuthServer/appsettings.json** - -```json -"App": { - "SelfUrl": "https://yourapp-apihost.azurewebsites.net" -} -``` - -- Modify the **yourapp.AuthServer** URL in every location throughout your project. - - This includes the following files: - - **./src/yourapp.Blazor/appsettings.json** , **./src/yourapp.AuthServer/appsettings.json** , **./src/yourapp.DbMigrator/appsettings.json** and **./src/yourapp.HttpApi.Host/appsettings.json** - -```json -"App": { - "SelfUrl": "https://yourapp-authserver.azurewebsites.net" -} -``` - -- Modify the **Redis__Configuration** URL in every location throughout your project. - - This includes the following files: + * This includes the following files: **./src/yourapp.Blazor/appsettings.json** , **./src/yourapp.AuthServer/appsettings.json** , **./src/yourapp.DbMigrator/appsettings.json** and **./src/yourapp.HttpApi.Host/appsettings.json** @@ -220,11 +104,7 @@ "Configuration": "redis-abpdemo.redis.cache.windows.net:6380,password={yourpassword},ssl=true,abortConnect=False" }, ``` - -{{end}} - -{{end}} - +{{ end }} ## What's next? 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 14f2a48d66..42efc9cd7c 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 @@ -1,7 +1,7 @@ ````json //[doc-params] { - "UI": ["MVC", "Blazor", "BlazorServer", "NG"], + "UI": ["MVC", "Blazor", "BlazorServer", "BlazorWebApp", "NG"], "DB": ["EF", "Mongo"], "Tiered": ["Yes", "No"] } @@ -70,8 +70,8 @@ jobs: run: dotnet publish -c Release -o ${{env.DOTNET_ROOT}}/apihost working-directory: ./aspnet-core/src/Demo.AzureAppsAngular.HttpApi.Host # Replace with your project name - - name: Generate authserver.pfx - run: dotnet dev-certs https -v -ep ${{env.DOTNET_ROOT}}/apihost/authserver.pfx -p 2D7AA457-5D33-48D6-936F-C48E5EF468ED # Replace with your password + - name: Generate openiddict.pfx + run: dotnet dev-certs https -v -ep ${{env.DOTNET_ROOT}}/apihost/openiddict.pfx -p 2D7AA457-5D33-48D6-936F-C48E5EF468ED # Replace with your password - name: Upload artifact for apihost uses: actions/upload-artifact@v4 @@ -170,8 +170,8 @@ jobs: run: dotnet publish -c Release -o ${{env.DOTNET_ROOT}}/apihost working-directory: ./src/demo.BlazorNonTierEfCore.HttpApi.Host # Replace with your project name - - name: Generate authserver.pfx - run: dotnet dev-certs https -v -ep ${{env.DOTNET_ROOT}}/apihost/authserver.pfx -p 2D7AA457-5D33-48D6-936F-C48E5EF468ED # Replace with your password + - name: Generate openiddict.pfx + run: dotnet dev-certs https -v -ep ${{env.DOTNET_ROOT}}/apihost/openiddict.pfx -p 2D7AA457-5D33-48D6-936F-C48E5EF468ED # Replace with your password - name: Upload artifact for apihost uses: actions/upload-artifact@v4 @@ -234,6 +234,96 @@ jobs: name: Build and deploy ASP.Net Core with BlazorServer to Azure Web App +on: + push: + branches: + - main + workflow_dispatch: + +jobs: + build: + runs-on: ubuntu-latest + permissions: + contents: read #This is required for actions/checkout + + steps: + - uses: actions/checkout@v4 + + - name: Set up .NET Core + uses: actions/setup-dotnet@v4 + with: + dotnet-version: '9.x' + + - name: Install ABP CLI + run: | + dotnet tool install -g Volo.Abp.Cli + abp install-libs + shell: bash + + - name: Build with dotnet + run: dotnet build --configuration Release + + - name: Run migrations + run: dotnet run + working-directory: ./src/BlazorServer.NonTiered.DbMigrator + + - name: dotnet publish + run: dotnet publish -c Release -o ${{env.DOTNET_ROOT}}/myapp + working-directory: './src/BlazorServer.NonTiered.Blazor' + + - name: Generate openiddict.pfx + run: dotnet dev-certs https -v -ep ${{env.DOTNET_ROOT}}/myapp/openiddict.pfx -p 7015b85e-89fc-4346-bfd0-a67d81de824e # Replace with your password + + - name: Upload artifact for deployment job + uses: actions/upload-artifact@v4 + with: + name: .net-app + path: ${{env.DOTNET_ROOT}}/myapp + + deploy: + runs-on: ubuntu-latest + needs: build + environment: + name: 'Production' + url: ${{ steps.deploy-to-webapp.outputs.webapp-url }} + permissions: + id-token: write #This is required for requesting the JWT + contents: read #This is required for actions/checkout + + steps: + - name: Download artifact from build job + uses: actions/download-artifact@v4 + with: + name: .net-app + + - name: Login to Azure + uses: azure/login@v2 + with: + client-id: ${{ secrets.AZUREAPPSERVICE_CLIENTID_E74C791E153A4F38A50107C6B5341809 }} + tenant-id: ${{ secrets.AZUREAPPSERVICE_TENANTID_7EC2684BA1FB43F1B563AD3832D0A5AC }} + subscription-id: ${{ secrets.AZUREAPPSERVICE_SUBSCRIPTIONID_81FB702F1C8F43388B145043765CC189 }} + + - name: Deploy to Azure Web App + id: deploy-to-webapp + uses: azure/webapps-deploy@v3 + with: + app-name: 'abp-blazor-webapp-layered' + slot-name: 'Production' + package: . +``` + +}%} + +{{ else }} + +{%{ + +```yaml +# Docs for the Azure Web Apps Deploy action: https://github.com/Azure/webapps-deploy +# More GitHub Actions for Azure: https://github.com/Azure/actions + +name: Build and deploy ASP.Net Core with BlazorServer to Azure Web App + on: push: branches: @@ -266,17 +356,27 @@ jobs: run: dotnet run -- "${{ secrets.CONNECTION_STRING }}" # Set your connection string as a secret in your repository settings working-directory: ./src/blazorservertierdemo.DbMigrator # Replace with your project name + - name: dotnet publish authserver + run: dotnet publish -c Release -o ${{env.DOTNET_ROOT}}/authserver + working-directory: ./src/blazorservertierdemo.AuthServer # Replace with your project name + + - name: Generate openiddict.pfx + run: dotnet dev-certs https -v -ep ${{env.DOTNET_ROOT}}/authserver/openiddict.pfx -p 2D7AA457-5D33-48D6-936F-C48E5EF468ED # Replace with your password + - name: dotnet publish apihost run: dotnet publish -c Release -o ${{env.DOTNET_ROOT}}/apihost working-directory: ./src/blazorservertierdemo.HttpApi.Host # Replace with your project name - - name: Generate authserver.pfx - run: dotnet dev-certs https -v -ep ${{env.DOTNET_ROOT}}/apihost/authserver.pfx -p 2D7AA457-5D33-48D6-936F-C48E5EF468ED # Replace with your password - - name: dotnet publish webapp run: dotnet publish -c Release -o ${{env.DOTNET_ROOT}}/webapp working-directory: ./src/blazorservertierdemo.Blazor # Replace with your project name + - name: Upload artifact for authserver + uses: actions/upload-artifact@v4 + with: + name: .net-authserver + path: ${{env.DOTNET_ROOT}}/authserver + - name: Upload artifact for apihost uses: actions/upload-artifact@v4 with: @@ -295,7 +395,23 @@ jobs: environment: name: 'Production' url: ${{ steps.deploy-to-webapp-3.outputs.webapp-url }} + steps: + - name: Download artifact from authserver + uses: actions/download-artifact@v4 + with: + name: .net-authserver + path: ./authserver + + - name: Deploy authserver + id: deploy-to-webapp + uses: azure/webapps-deploy@v3 + with: + app-name: 'authserver-blazorserver' # Replace with your app name + slot-name: 'Production' + publish-profile: ${{ secrets.authserverblazorserverPublishSettings }} # Set your Azure Web App to publish your profile as a secret in your repository settings + package: ./authserver + - name: Download artifact from apihost uses: actions/download-artifact@v4 with: @@ -323,8 +439,101 @@ jobs: with: app-name: 'webapp-blazorserver' # Replace with your app name slot-name: 'Production' - publish-profile: ${{ secrets.webappblazorserverPublishSettings }} # Set your Azure Web App to publish your profile as a secret in your repository settings - package: ./webapp + publish-profile: ${{ secrets.webappblazorserverPublishSettings }} # Set your Azure Web App publish your profile as a secret in your repository settings +``` + +}%} + +{{end}} + +{{ else if UI == "BlazorWebApp" }} + +{{ if Tiered == "No" }} + +{%{ + +```yaml +# Docs for the Azure Web Apps Deploy action: https://github.com/Azure/webapps-deploy +# More GitHub Actions for Azure: https://github.com/Azure/actions + +name: Build and deploy ASP.Net Core app to Azure Web App - abp-blazor-webapp-layered + +on: + push: + branches: + - main + workflow_dispatch: + +jobs: + build: + runs-on: ubuntu-latest + permissions: + contents: read #This is required for actions/checkout + + steps: + - uses: actions/checkout@v4 + + - name: Set up .NET Core + uses: actions/setup-dotnet@v4 + with: + dotnet-version: '9.x' + + - name: Install ABP CLI + run: | + dotnet tool install -g Volo.Abp.Cli + abp install-libs + shell: bash + + - name: Build with dotnet + run: dotnet build --configuration Release + + - name: Run migrations + run: dotnet run + working-directory: ./src/BlzWapp.NonTiered.DbMigrator + + - name: dotnet publish + run: dotnet publish -c Release -o ${{env.DOTNET_ROOT}}/myapp + working-directory: './src/BlzWapp.NonTiered.Blazor' + + - name: Generate openiddict.pfx + run: dotnet dev-certs https -v -ep ${{env.DOTNET_ROOT}}/myapp/openiddict.pfx -p 7015b85e-89fc-4346-bfd0-a67d81de824e # Replace with your password + + - name: Upload artifact for deployment job + uses: actions/upload-artifact@v4 + with: + name: .net-app + path: ${{env.DOTNET_ROOT}}/myapp + + deploy: + runs-on: ubuntu-latest + needs: build + environment: + name: 'Production' + url: ${{ steps.deploy-to-webapp.outputs.webapp-url }} + permissions: + id-token: write #This is required for requesting the JWT + contents: read #This is required for actions/checkout + + steps: + - name: Download artifact from build job + uses: actions/download-artifact@v4 + with: + name: .net-app + + - name: Login to Azure + uses: azure/login@v2 + with: + client-id: ${{ secrets.AZUREAPPSERVICE_CLIENTID_E74C791E153A4F38A50107C6B5341809 }} + tenant-id: ${{ secrets.AZUREAPPSERVICE_TENANTID_7EC2684BA1FB43F1B563AD3832D0A5AC }} + subscription-id: ${{ secrets.AZUREAPPSERVICE_SUBSCRIPTIONID_81FB702F1C8F43388B145043765CC189 }} + + - name: Deploy to Azure Web App + id: deploy-to-webapp + uses: azure/webapps-deploy@v3 + with: + app-name: 'abp-blazor-webapp-layered' + slot-name: 'Production' + package: . ``` }%} @@ -337,7 +546,7 @@ jobs: # Docs for the Azure Web Apps Deploy action: https://github.com/Azure/webapps-deploy # More GitHub Actions for Azure: https://github.com/Azure/actions -name: Build and deploy ASP.Net Core with BlazorServer to Azure Web App +name: Build and deploy ASP.Net Core with BlazorWebApp to Azure Web App on: push: @@ -369,22 +578,22 @@ jobs: - name: Run migrations run: dotnet run -- "${{ secrets.CONNECTION_STRING }}" # Set your connection string as a secret in your repository settings - working-directory: ./src/blazorservertierdemo.DbMigrator # Replace with your project name + working-directory: ./src/BlzWapp.DbMigrator # Replace with your project name - name: dotnet publish authserver run: dotnet publish -c Release -o ${{env.DOTNET_ROOT}}/authserver - working-directory: ./src/blazorservertierdemo.AuthServer # Replace with your project name + working-directory: ./src/BlzWapp.AuthServer # Replace with your project name - - name: Generate authserver.pfx - run: dotnet dev-certs https -v -ep ${{env.DOTNET_ROOT}}/authserver/authserver.pfx -p 2D7AA457-5D33-48D6-936F-C48E5EF468ED # Replace with your password + - name: Generate openiddict.pfx + run: dotnet dev-certs https -v -ep ${{env.DOTNET_ROOT}}/authserver/openiddict.pfx -p 2D7AA457-5D33-48D6-936F-C48E5EF468ED # Replace with your password - name: dotnet publish apihost run: dotnet publish -c Release -o ${{env.DOTNET_ROOT}}/apihost - working-directory: ./src/blazorservertierdemo.HttpApi.Host # Replace with your project name + working-directory: ./src/BlzWapp.HttpApi.Host # Replace with your project name - name: dotnet publish webapp run: dotnet publish -c Release -o ${{env.DOTNET_ROOT}}/webapp - working-directory: ./src/blazorservertierdemo.Blazor # Replace with your project name + working-directory: ./src/BlzWapp.Blazor # Replace with your project name - name: Upload artifact for authserver uses: actions/upload-artifact@v4 @@ -422,9 +631,9 @@ jobs: id: deploy-to-webapp uses: azure/webapps-deploy@v3 with: - app-name: 'authserver-blazorserver' # Replace with your app name + app-name: 'authserver-blazorwebapp' # Replace with your app name slot-name: 'Production' - publish-profile: ${{ secrets.authserverblazorserverPublishSettings }} # Set your Azure Web App to publish your profile as a secret in your repository settings + publish-profile: ${{ secrets.authserverblazorwebappPublishSettings }} # Set your Azure Web App to publish your profile as a secret in your repository settings package: ./authserver - name: Download artifact from apihost @@ -437,9 +646,9 @@ jobs: id: deploy-to-webapp-2 uses: azure/webapps-deploy@v3 with: - app-name: 'apihost-blazorserver' # Replace with your app name + app-name: 'apihost-blazorwebapp' # Replace with your app name slot-name: 'Production' - publish-profile: ${{ secrets.apihostblazorserverPublishSettings }} # Set your Azure Web App to publish your profile as a secret in your repository settings + publish-profile: ${{ secrets.apihostblazorwebappPublishSettings }} # Set your Azure Web App to publish your profile as a secret in your repository settings package: ./apihost - name: Download artifact from webapp @@ -452,9 +661,9 @@ jobs: id: deploy-to-webapp-3 uses: azure/webapps-deploy@v3 with: - app-name: 'webapp-blazorserver' # Replace with your app name + app-name: 'webapp-blazorwebapp' # Replace with your app name slot-name: 'Production' - publish-profile: ${{ secrets.webappblazorserverPublishSettings }} # Set your Azure Web App publish your profile as a secret in your repository settings + publish-profile: ${{ secrets.webappblazorwebappPublishSettings }} # Set your Azure Web App publish your profile as a secret in your repository settings ``` }%} @@ -509,8 +718,8 @@ jobs: run: dotnet publish -c Release -o ${{env.DOTNET_ROOT}}/myapp working-directory: ./src/yourapp.Web # Replace with your project name - - name: Generate authserver.pfx - run: dotnet dev-certs https -v -ep ${{env.DOTNET_ROOT}}/myapp/authserver.pfx -p 2D7AA457-5D33-48D6-936F-C48E5EF468ED # Replace with your password + - name: Generate openiddict.pfx + run: dotnet dev-certs https -v -ep ${{env.DOTNET_ROOT}}/myapp/openiddict.pfx -p 2D7AA457-5D33-48D6-936F-C48E5EF468ED # Replace with your password - name: Upload artifact for deployment job uses: actions/upload-artifact@v4 @@ -589,8 +798,8 @@ jobs: run: dotnet publish -c Release -o ${{env.DOTNET_ROOT}}/authserver working-directory: ./src/mvctierdemo.AuthServer # Replace with your project name - - name: Generate authserver.pfx - run: dotnet dev-certs https -v -ep ${{env.DOTNET_ROOT}}/authserver/authserver.pfx -p 2D7AA457-5D33-48D6-936F-C48E5EF468ED # Replace with your password + - name: Generate openiddict.pfx + run: dotnet dev-certs https -v -ep ${{env.DOTNET_ROOT}}/authserver/openiddict.pfx -p 2D7AA457-5D33-48D6-936F-C48E5EF468ED # Replace with your password - name: dotnet publish apihost run: dotnet publish -c Release -o ${{env.DOTNET_ROOT}}/apihost diff --git a/docs/en/solution-templates/layered-web-application/deployment/azure-deployment/terraform-web-app-service.md b/docs/en/solution-templates/layered-web-application/deployment/azure-deployment/terraform-web-app-service.md index c1678c4961..7b346d0915 100644 --- a/docs/en/solution-templates/layered-web-application/deployment/azure-deployment/terraform-web-app-service.md +++ b/docs/en/solution-templates/layered-web-application/deployment/azure-deployment/terraform-web-app-service.md @@ -3,7 +3,7 @@ ````json //[doc-params] { - "UI": ["MVC", "Blazor", "BlazorServer", "NG"], + "UI": ["MVC", "Blazor", "BlazorServer", "BlazorWebApp", "NG"], "DB": ["EF", "Mongo"], "Tiered": ["Yes", "No"] } @@ -224,6 +224,53 @@ resource "azurerm_service_plan" "appserviceplan" { sku_name = "B3" } +resource "azurerm_linux_web_app" "webapp" { + name = "webapp-blazorserver" + location = azurerm_resource_group.rg.location + resource_group_name = azurerm_resource_group.rg.name + service_plan_id = azurerm_service_plan.appserviceplan.id + https_only = true + site_config { + application_stack { + dotnet_version = "6.0" + } + minimum_tls_version = "1.2" + } +} +``` + + {{ else }} + +```terraform +# Configure the Azure provider +terraform { + required_providers { + azurerm = { + source = "hashicorp/azurerm" + version = "~> 3.0.0" + } + } + required_version = ">= 0.14.9" +} +provider "azurerm" { + features {} +} + +# Create the resource group +resource "azurerm_resource_group" "rg" { + name = "blazorserver-app-tier-rg" + location = "westeurope" +} + +# Create the Linux App Service Plan +resource "azurerm_service_plan" "appserviceplan" { + name = "blazorserver-app-tier-plan" + location = azurerm_resource_group.rg.location + resource_group_name = azurerm_resource_group.rg.name + os_type = "Linux" + sku_name = "B3" +} + # Create the web app, pass in the App Service Plan ID resource "azurerm_linux_web_app" "authserver" { name = "authserver-blazorserver" @@ -237,6 +284,9 @@ resource "azurerm_linux_web_app" "authserver" { } minimum_tls_version = "1.2" } + app_settings = { + "Redis__Configuration" = azurerm_redis_cache.redis.primary_connection_string + } } resource "azurerm_linux_web_app" "apihost" { name = "apihost-blazorserver" @@ -250,6 +300,9 @@ resource "azurerm_linux_web_app" "apihost" { } minimum_tls_version = "1.2" } + app_settings = { + "Redis__Configuration" = azurerm_redis_cache.redis.primary_connection_string + } } resource "azurerm_linux_web_app" "webapp" { name = "webapp-blazorserver" @@ -263,6 +316,77 @@ resource "azurerm_linux_web_app" "webapp" { } minimum_tls_version = "1.2" } + app_settings = { + "Redis__Configuration" = azurerm_redis_cache.redis.primary_connection_string + } +} + +resource "azurerm_redis_cache" "redis" { + name = "redis-blazorserver" + location = azurerm_resource_group.rg.location + resource_group_name = azurerm_resource_group.rg.name + capacity = 0 + family = "C" + sku_name = "Basic" + enable_non_ssl_port = false + minimum_tls_version = "1.2" + + redis_configuration { + maxmemory_reserved = 2 + maxmemory_delta = 2 + maxmemory_policy = "volatile-lru" + } +} +``` + + {{end}} + +{{ else if UI == "BlazorWebApp" }} + + {{if Tiered == "No"}} + +```terraform +# Configure the Azure provider +terraform { + required_providers { + azurerm = { + source = "hashicorp/azurerm" + version = "~> 3.0.0" + } + } + required_version = ">= 0.14.9" +} +provider "azurerm" { + features {} +} + +# Create the resource group +resource "azurerm_resource_group" "rg" { + name = "blazorwebapp-app-nontier-rg" + location = "westeurope" +} + +# Create the Linux App Service Plan +resource "azurerm_service_plan" "appserviceplan" { + name = "blazorwebapp-app-nontier-plan" + location = azurerm_resource_group.rg.location + resource_group_name = azurerm_resource_group.rg.name + os_type = "Linux" + sku_name = "B3" +} + +resource "azurerm_linux_web_app" "webapp" { + name = "webapp-blazorwebapp" + location = azurerm_resource_group.rg.location + resource_group_name = azurerm_resource_group.rg.name + service_plan_id = azurerm_service_plan.appserviceplan.id + https_only = true + site_config { + application_stack { + dotnet_version = "6.0" + } + minimum_tls_version = "1.2" + } } ``` @@ -285,13 +409,13 @@ provider "azurerm" { # Create the resource group resource "azurerm_resource_group" "rg" { - name = "blazorserver-app-tier-rg" + name = "blazorwebapp-app-tier-rg" location = "westeurope" } # Create the Linux App Service Plan resource "azurerm_service_plan" "appserviceplan" { - name = "blazorserver-app-tier-plan" + name = "blazorwebapp-app-tier-plan" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name os_type = "Linux" @@ -300,7 +424,7 @@ resource "azurerm_service_plan" "appserviceplan" { # Create the web app, pass in the App Service Plan ID resource "azurerm_linux_web_app" "authserver" { - name = "authserver-blazorserver" + name = "authserver-blazorwebapp" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name service_plan_id = azurerm_service_plan.appserviceplan.id @@ -316,7 +440,7 @@ resource "azurerm_linux_web_app" "authserver" { } } resource "azurerm_linux_web_app" "apihost" { - name = "apihost-blazorserver" + name = "apihost-blazorwebapp" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name service_plan_id = azurerm_service_plan.appserviceplan.id @@ -332,7 +456,7 @@ resource "azurerm_linux_web_app" "apihost" { } } resource "azurerm_linux_web_app" "webapp" { - name = "webapp-blazorserver" + name = "webapp-blazorwebapp" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name service_plan_id = azurerm_service_plan.appserviceplan.id @@ -349,7 +473,7 @@ resource "azurerm_linux_web_app" "webapp" { } resource "azurerm_redis_cache" "redis" { - name = "redis-blazorserver" + name = "redis-blazorwebapp" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name capacity = 0 diff --git a/docs/en/tutorials/microservice/part-01.md b/docs/en/tutorials/microservice/part-01.md index d843e744ca..b2d0dade7f 100644 --- a/docs/en/tutorials/microservice/part-01.md +++ b/docs/en/tutorials/microservice/part-01.md @@ -21,7 +21,7 @@ Follow the *[Get Started](../../get-started/microservice.md)* guide to create a You can select the other options based on your preference. -> **Please complete the *[Get Started](../../get-started/layered-web-application.md)* guide and run the web application before going further.** You can skip the sections after the *Running the Solution* section, if you don't prefer to complete all. +> **Please complete the *[Get Started](../../get-started/microservice.md)* guide and run the applications before going further.** You can skip the sections after the *Running the Solution* section, if you don't prefer to complete all. The initial solution structure should be like the following in ABP Studio's *[Solution Explorer](../../studio/solution-explorer.md)*: @@ -37,4 +37,4 @@ You can see the *[Microservice Solution Template](../../solution-templates/micro ## Summary -In this part, you've created the initial microservice solution, which already contains a few infrastructure services. We will create our first business service in the [next part](part-02.md). \ No newline at end of file +In this part, you've created the initial microservice solution, which already contains a few infrastructure services. We will create our first business service in the [next part](part-02.md). 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 6b2fe0d98f..de95e4d4cb 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 @@ -85,10 +85,10 @@ public abstract class AbpComponentBase : OwningComponentBase if (ObjectMapperContext == null) { - return LazyGetRequiredService(ref _objectMapper)!; + return LazyGetNonScopedRequiredService(ref _objectMapper)!; } - return LazyGetRequiredService( + return LazyGetNonScopedRequiredService( typeof(IObjectMapper<>).MakeGenericType(ObjectMapperContext), ref _objectMapper )!; diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/bootstrap/modal-manager.js b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/bootstrap/modal-manager.js index d232dbd28a..f8c9543e0d 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/bootstrap/modal-manager.js +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/bootstrap/modal-manager.js @@ -104,6 +104,7 @@ $.validator.defaults.ignore = ''; //TODO: Would be better if we can apply only f } } + var focusElement = null; if (!options.focusElement) { //focuses first element if it's a typeable input. var $firstVisibleInput = _$modal.find('input:not([type=hidden]):first'); @@ -120,11 +121,18 @@ $.validator.defaults.ignore = ''; //TODO: Would be better if we can apply only f } $firstVisibleInput.focus(); + focusElement = $firstVisibleInput; } else if (typeof options.focusElement === 'function') { - var focusElement = options.focusElement(); + focusElement = options.focusElement(); focusElement.focus(); } else if (typeof options.focusElement === 'string') { - $(options.focusElement).focus(); + focusElement = $(options.focusElement); + focusElement.focus(); + } + + if (focusElement && $(focusElement).is('input')) { + var value = focusElement.val(); + focusElement[0].setSelectionRange(value.length, value.length); } }); diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/date-range-picker/date-range-picker-extensions.js b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/date-range-picker/date-range-picker-extensions.js index e10ceefbf9..d05c8dab37 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/date-range-picker/date-range-picker-extensions.js +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/date-range-picker/date-range-picker-extensions.js @@ -438,6 +438,13 @@ date = date.local(); } if (options.isIso) { + if(abp.clock.supportsMultipleTimezone()){ + var timeZone = abp.clock.timeZone(); + if(timeZone){ + return abp.clock.normalizeToString(date.toDate()); + } + } + return date.toISOString(); } return date.locale('en').format(options.inputDateFormat) diff --git a/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/DefaultAbpRequestLocalizationOptionsProvider.cs b/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/DefaultAbpRequestLocalizationOptionsProvider.cs index bd767f93fb..cf9f128852 100644 --- a/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/DefaultAbpRequestLocalizationOptionsProvider.cs +++ b/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/DefaultAbpRequestLocalizationOptionsProvider.cs @@ -4,7 +4,6 @@ using System.Globalization; using System.Linq; using System.Threading; using System.Threading.Tasks; -using DeviceDetectorNET; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Localization; using Microsoft.Extensions.DependencyInjection; diff --git a/framework/src/Volo.Abp.AspNetCore/Volo.Abp.AspNetCore.csproj b/framework/src/Volo.Abp.AspNetCore/Volo.Abp.AspNetCore.csproj index d88febbfe9..886e1ed700 100644 --- a/framework/src/Volo.Abp.AspNetCore/Volo.Abp.AspNetCore.csproj +++ b/framework/src/Volo.Abp.AspNetCore/Volo.Abp.AspNetCore.csproj @@ -31,7 +31,7 @@ - + diff --git a/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/AbpAspNetCoreModule.cs b/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/AbpAspNetCoreModule.cs index 64fab10ac6..405e49753c 100644 --- a/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/AbpAspNetCoreModule.cs +++ b/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/AbpAspNetCoreModule.cs @@ -4,6 +4,7 @@ using Microsoft.AspNetCore.Hosting.StaticWebAssets; using Microsoft.AspNetCore.RequestLocalization; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.FileProviders; +using MyCSharp.HttpUserAgentParser.DependencyInjection; using Volo.Abp.AspNetCore.Auditing; using Volo.Abp.AspNetCore.VirtualFileSystem; using Volo.Abp.Auditing; @@ -59,6 +60,8 @@ public class AbpAspNetCoreModule : AbpModule context.Services.AddAbpDynamicOptions(); StaticWebAssetsLoader.UseStaticWebAssets(context.Services.GetHostingEnvironment(), context.Services.GetConfiguration()); + + context.Services.AddHttpUserAgentCachedParser(); } private static void AddAspNetServices(IServiceCollection services) diff --git a/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/WebClientInfo/HttpContextWebClientInfoProvider.cs b/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/WebClientInfo/HttpContextWebClientInfoProvider.cs index 6e450efbcd..b34a9752f7 100644 --- a/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/WebClientInfo/HttpContextWebClientInfoProvider.cs +++ b/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/WebClientInfo/HttpContextWebClientInfoProvider.cs @@ -1,7 +1,8 @@ using System; -using DeviceDetectorNET; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Logging; +using MyCSharp.HttpUserAgentParser; +using MyCSharp.HttpUserAgentParser.Providers; using Volo.Abp.DependencyInjection; namespace Volo.Abp.AspNetCore.WebClientInfo; @@ -11,13 +12,16 @@ public class HttpContextWebClientInfoProvider : IWebClientInfoProvider, ITransie { protected ILogger Logger { get; } protected IHttpContextAccessor HttpContextAccessor { get; } + protected IHttpUserAgentParserProvider HttpUserAgentParser { get; } public HttpContextWebClientInfoProvider( ILogger logger, - IHttpContextAccessor httpContextAccessor) + IHttpContextAccessor httpContextAccessor, + IHttpUserAgentParserProvider httpUserAgentParser) { Logger = logger; HttpContextAccessor = httpContextAccessor; + HttpUserAgentParser = httpUserAgentParser; } public string? BrowserInfo => GetBrowserInfo(); @@ -46,27 +50,21 @@ public class HttpContextWebClientInfoProvider : IWebClientInfoProvider, ITransie protected virtual string? GetDeviceInfo() { - string? deviceInfo = null; - var deviceDetector = new DeviceDetector(GetBrowserInfo()); - deviceDetector.Parse(); - if (!deviceDetector.IsParsed()) + var browserInfo = GetBrowserInfo(); + if (browserInfo.IsNullOrWhiteSpace()) { - return deviceInfo; - } - - var osInfo = deviceDetector.GetOs(); - if (osInfo.Success) - { - deviceInfo = osInfo.Match.Name; + return null; } - var clientInfo = deviceDetector.GetClient(); - if (clientInfo.Success) + var httpUserAgentInformation = HttpUserAgentParser.Parse(browserInfo); + switch (httpUserAgentInformation.Type) { - deviceInfo = deviceInfo.IsNullOrWhiteSpace() ? clientInfo.Match.Name : deviceInfo + " " + clientInfo.Match.Name; + case HttpUserAgentType.Browser: + case HttpUserAgentType.Robot: + return (httpUserAgentInformation.Platform.HasValue ? httpUserAgentInformation.Platform.Value.Name + " " : string.Empty) + httpUserAgentInformation.Name; + case HttpUserAgentType.Unknown: + default: + return httpUserAgentInformation.UserAgent; } - - return deviceInfo; } - } diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AbpBackgroundJobOptions.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AbpBackgroundJobOptions.cs index 6b3aaa52b8..1a6cb6a9e9 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AbpBackgroundJobOptions.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AbpBackgroundJobOptions.cs @@ -14,10 +14,17 @@ public class AbpBackgroundJobOptions /// public bool IsJobExecutionEnabled { get; set; } = true; + /// + /// The delegate to get the name of a background job. + /// Default: . + /// + public Func GetBackgroundJobName { get; set; } + public AbpBackgroundJobOptions() { _jobConfigurationsByArgsType = new Dictionary(); _jobConfigurationsByName = new Dictionary(); + GetBackgroundJobName = BackgroundJobNameAttribute.GetName; } public BackgroundJobConfiguration GetJob() @@ -61,7 +68,7 @@ public class AbpBackgroundJobOptions public void AddJob(Type jobType) { - AddJob(new BackgroundJobConfiguration(jobType)); + AddJob(new BackgroundJobConfiguration(jobType, GetBackgroundJobName(BackgroundJobArgsHelper.GetJobArgsType(jobType)))); } public void AddJob(BackgroundJobConfiguration jobConfiguration) diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobConfiguration.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobConfiguration.cs index d9f08da2e7..c17ccdc443 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobConfiguration.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobConfiguration.cs @@ -10,10 +10,10 @@ public class BackgroundJobConfiguration public string JobName { get; } - public BackgroundJobConfiguration(Type jobType) + public BackgroundJobConfiguration(Type jobType, string jobName) { JobType = jobType; ArgsType = BackgroundJobArgsHelper.GetJobArgsType(jobType); - JobName = BackgroundJobNameAttribute.GetName(ArgsType); + JobName = jobName; } } diff --git a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/DefaultBackgroundJobManager.cs b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/DefaultBackgroundJobManager.cs index 68851c5043..586b66b5d1 100644 --- a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/DefaultBackgroundJobManager.cs +++ b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/DefaultBackgroundJobManager.cs @@ -18,6 +18,7 @@ public class DefaultBackgroundJobManager : IBackgroundJobManager, ITransientDepe protected IBackgroundJobSerializer Serializer { get; } protected IGuidGenerator GuidGenerator { get; } protected IBackgroundJobStore Store { get; } + protected IOptions BackgroundJobOptions { get; } protected IOptions BackgroundJobWorkerOptions { get; } public DefaultBackgroundJobManager( @@ -25,18 +26,20 @@ public class DefaultBackgroundJobManager : IBackgroundJobManager, ITransientDepe IBackgroundJobSerializer serializer, IBackgroundJobStore store, IGuidGenerator guidGenerator, + IOptions backgroundJobOptions, IOptions backgroundJobWorkerOptions) { Clock = clock; Serializer = serializer; GuidGenerator = guidGenerator; + BackgroundJobOptions = backgroundJobOptions; BackgroundJobWorkerOptions = backgroundJobWorkerOptions; Store = store; } public virtual async Task EnqueueAsync(TArgs args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, TimeSpan? delay = null) { - var jobName = BackgroundJobNameAttribute.GetName(); + var jobName = BackgroundJobOptions.Value.GetBackgroundJobName(typeof(TArgs)); var jobId = await EnqueueAsync(jobName, args!, priority, delay); return jobId.ToString(); } diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerManager.cs b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerManager.cs index 1ed3561cac..fe9a8ad983 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerManager.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerManager.cs @@ -1,14 +1,15 @@ using System; +using System.Linq.Expressions; using System.Reflection; using System.Threading; using System.Threading.Tasks; using Hangfire; +using Hangfire.Common; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Volo.Abp.DependencyInjection; using Volo.Abp.DynamicProxy; using Volo.Abp.Hangfire; -using Volo.Abp.Threading; namespace Volo.Abp.BackgroundWorkers.Hangfire; @@ -55,40 +56,40 @@ public class HangfireBackgroundWorkerManager : BackgroundWorkerManager, ISinglet } case AsyncPeriodicBackgroundWorkerBase or PeriodicBackgroundWorkerBase: { - var timer = worker.GetType().GetProperty("Timer", BindingFlags.Instance | BindingFlags.NonPublic)?.GetValue(worker); - var period = worker is AsyncPeriodicBackgroundWorkerBase ? ((AbpAsyncTimer?)timer)?.Period : ((AbpTimer?)timer)?.Period; + int? period = null; + string? CronExpression = null; - if (period == null) + if (worker is AsyncPeriodicBackgroundWorkerBase asyncPeriodicBackgroundWorkerBase) { - return; + period = asyncPeriodicBackgroundWorkerBase.Period; + CronExpression = asyncPeriodicBackgroundWorkerBase.CronExpression; } - - var adapterType = typeof(HangfirePeriodicBackgroundWorkerAdapter<>).MakeGenericType(ProxyHelper.GetUnProxiedType(worker)); - var workerAdapter = (Activator.CreateInstance(adapterType) as IHangfireBackgroundWorker)!; - - if (workerAdapter.RecurringJobId.IsNullOrWhiteSpace()) + else if (worker is PeriodicBackgroundWorkerBase periodicBackgroundWorkerBase) { - RecurringJob.AddOrUpdate( - () => workerAdapter.DoWorkAsync(cancellationToken), - GetCron(period.Value), - workerAdapter.TimeZone , - workerAdapter.Queue.IsNullOrWhiteSpace() ? defaultQueue : defaultQueuePrefix + workerAdapter.Queue); + period = periodicBackgroundWorkerBase.Period; + CronExpression = periodicBackgroundWorkerBase.CronExpression; } - else - { - RecurringJob.AddOrUpdate( - workerAdapter.RecurringJobId, - workerAdapter.Queue.IsNullOrWhiteSpace() ? defaultQueue : defaultQueuePrefix + workerAdapter.Queue, - () => workerAdapter.DoWorkAsync(cancellationToken), - GetCron(period.Value), - new RecurringJobOptions - { - TimeZone = workerAdapter.TimeZone - }); + if (period == null && CronExpression.IsNullOrWhiteSpace()) + { + return; } + var adapterType = typeof(HangfirePeriodicBackgroundWorkerAdapter<>).MakeGenericType(ProxyHelper.GetUnProxiedType(worker)); + var workerAdapter = (Activator.CreateInstance(adapterType) as IHangfireBackgroundWorker)!; + + Expression> methodCall = () => workerAdapter.DoWorkAsync(cancellationToken); + var recurringJobId = !workerAdapter.RecurringJobId.IsNullOrWhiteSpace() ? workerAdapter.RecurringJobId : GetRecurringJobId(worker, methodCall); + RecurringJob.AddOrUpdate( + recurringJobId, + workerAdapter.Queue.IsNullOrWhiteSpace() ? defaultQueue : defaultQueuePrefix + workerAdapter.Queue, + methodCall, + CronExpression ?? GetCron(period!.Value), + new RecurringJobOptions + { + TimeZone = workerAdapter.TimeZone + }); break; } default: @@ -97,6 +98,24 @@ public class HangfireBackgroundWorkerManager : BackgroundWorkerManager, ISinglet } } + private readonly static MethodInfo? GetRecurringJobIdMethodInfo = typeof(RecurringJob).GetMethod("GetRecurringJobId", BindingFlags.NonPublic | BindingFlags.Static); + protected virtual string? GetRecurringJobId(IBackgroundWorker worker, Expression> methodCall) + { + string? recurringJobId = null; + if (GetRecurringJobIdMethodInfo != null) + { + var job = Job.FromExpression(methodCall); + recurringJobId = (string)GetRecurringJobIdMethodInfo.Invoke(null, [job])!; + } + + if (recurringJobId.IsNullOrWhiteSpace()) + { + recurringJobId = $"HangfirePeriodicBackgroundWorkerAdapter<{worker.GetType().Name}>.DoWorkAsync"; + } + + return recurringJobId; + } + protected virtual string GetCron(int period) { var time = TimeSpan.FromMilliseconds(period); @@ -120,8 +139,7 @@ public class HangfireBackgroundWorkerManager : BackgroundWorkerManager, ISinglet } else { - throw new AbpException( - $"Cannot convert period: {period} to cron expression, use HangfireBackgroundWorkerBase to define worker"); + throw new AbpException($"Cannot convert period: {period} to cron expression, use HangfireBackgroundWorkerBase to define worker"); } return cron; diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzPeriodicBackgroundWorkerAdapter.cs b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzPeriodicBackgroundWorkerAdapter.cs index 522ef7a807..2967b1a508 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzPeriodicBackgroundWorkerAdapter.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzPeriodicBackgroundWorkerAdapter.cs @@ -3,8 +3,6 @@ using System.Reflection; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Quartz; -using Volo.Abp.DynamicProxy; -using Volo.Abp.Threading; namespace Volo.Abp.BackgroundWorkers.Quartz; @@ -25,28 +23,23 @@ public class QuartzPeriodicBackgroundWorkerAdapter : QuartzBackgroundWo } - public void BuildWorker(IBackgroundWorker worker) + public virtual void BuildWorker(IBackgroundWorker worker) { - int? period; - var workerType = ProxyHelper.GetUnProxiedType(worker); + int? period = null; + string? CronExpression = null; - if (worker is AsyncPeriodicBackgroundWorkerBase or PeriodicBackgroundWorkerBase) + if (worker is AsyncPeriodicBackgroundWorkerBase asyncPeriodicBackgroundWorkerBase) { - if (typeof(TWorker) != workerType) - { - throw new ArgumentException($"{nameof(worker)} type is different from the generic type"); - } - - var timer = workerType.GetProperty("Timer", BindingFlags.Instance | BindingFlags.NonPublic)?.GetValue(worker); - - period = worker is AsyncPeriodicBackgroundWorkerBase ? ((AbpAsyncTimer?)timer)?.Period : ((AbpTimer?)timer)?.Period; + period = asyncPeriodicBackgroundWorkerBase.Period; + CronExpression = asyncPeriodicBackgroundWorkerBase.CronExpression; } - else + else if (worker is PeriodicBackgroundWorkerBase periodicBackgroundWorkerBase) { - return; + period = periodicBackgroundWorkerBase.Period; + CronExpression = periodicBackgroundWorkerBase.CronExpression; } - if (period == null) + if (period == null && CronExpression.IsNullOrWhiteSpace()) { return; } @@ -55,10 +48,21 @@ public class QuartzPeriodicBackgroundWorkerAdapter : QuartzBackgroundWo .Create>() .WithIdentity(BackgroundWorkerNameAttribute.GetName()) .Build(); - Trigger = TriggerBuilder.Create() - .WithIdentity(BackgroundWorkerNameAttribute.GetName()) - .WithSimpleSchedule(builder => builder.WithInterval(TimeSpan.FromMilliseconds(period.Value)).RepeatForever()) - .Build(); + + var triggerBuilder = TriggerBuilder.Create() + .ForJob(JobDetail) + .WithIdentity(BackgroundWorkerNameAttribute.GetName()); + + if (!CronExpression.IsNullOrWhiteSpace()) + { + triggerBuilder.WithCronSchedule(CronExpression); + } + else + { + triggerBuilder.WithSimpleSchedule(builder => builder.WithInterval(TimeSpan.FromMilliseconds(period!.Value)).RepeatForever()); + } + + Trigger = triggerBuilder.Build(); } public async override Task Execute(IJobExecutionContext context) diff --git a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/AsyncPeriodicBackgroundWorkerBase.cs b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/AsyncPeriodicBackgroundWorkerBase.cs index 37911feae5..781d3535ba 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/AsyncPeriodicBackgroundWorkerBase.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/AsyncPeriodicBackgroundWorkerBase.cs @@ -13,6 +13,11 @@ public abstract class AsyncPeriodicBackgroundWorkerBase : BackgroundWorkerBase protected IServiceScopeFactory ServiceScopeFactory { get; } protected AbpAsyncTimer Timer { get; } protected CancellationToken StartCancellationToken { get; set; } + public int Period => Timer.Period; + /// + /// CronExpression has high priority over Period. + /// + public string? CronExpression { get; protected set; } protected AsyncPeriodicBackgroundWorkerBase( AbpAsyncTimer timer, diff --git a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/PeriodicBackgroundWorkerBase.cs b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/PeriodicBackgroundWorkerBase.cs index 9d78d9237d..c7f9af7016 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/PeriodicBackgroundWorkerBase.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/PeriodicBackgroundWorkerBase.cs @@ -15,6 +15,11 @@ public abstract class PeriodicBackgroundWorkerBase : BackgroundWorkerBase { protected IServiceScopeFactory ServiceScopeFactory { get; } protected AbpTimer Timer { get; } + public int Period => Timer.Period; + /// + /// CronExpression has high priority over Period. + /// + public string? CronExpression { get; protected set; } protected PeriodicBackgroundWorkerBase( AbpTimer timer, @@ -25,13 +30,13 @@ public abstract class PeriodicBackgroundWorkerBase : BackgroundWorkerBase Timer.Elapsed += Timer_Elapsed; } - public override async Task StartAsync(CancellationToken cancellationToken = default) + public async override Task StartAsync(CancellationToken cancellationToken = default) { await base.StartAsync(cancellationToken); Timer.Start(cancellationToken); } - public override async Task StopAsync(CancellationToken cancellationToken = default) + public async override Task StopAsync(CancellationToken cancellationToken = default) { Timer.Stop(cancellationToken); await base.StopAsync(cancellationToken); diff --git a/framework/src/Volo.Abp.BlazoriseUI/wwwroot/volo.abp.blazoriseui.css b/framework/src/Volo.Abp.BlazoriseUI/wwwroot/volo.abp.blazoriseui.css index f42b6735bd..8299895e1e 100644 --- a/framework/src/Volo.Abp.BlazoriseUI/wwwroot/volo.abp.blazoriseui.css +++ b/framework/src/Volo.Abp.BlazoriseUI/wwwroot/volo.abp.blazoriseui.css @@ -61,4 +61,11 @@ .table-responsive .dropdown-menu-position-strategy-fixed { position: fixed !important; -} \ No newline at end of file +} + +/* + blazorise picker workaround for https://github.com/Megabit/Blazorise/issues/4917 +*/ +.card .flatpickr-calendar.static { + top: unset !important; +} diff --git a/framework/src/Volo.Abp.Cli.Core/Volo.Abp.Cli.Core.csproj b/framework/src/Volo.Abp.Cli.Core/Volo.Abp.Cli.Core.csproj index 48d756465f..547f9f0aff 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo.Abp.Cli.Core.csproj +++ b/framework/src/Volo.Abp.Cli.Core/Volo.Abp.Cli.Core.csproj @@ -16,23 +16,26 @@ - + + + + + - diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Version/PackageVersionCheckerService.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Version/PackageVersionCheckerService.cs index 316c53e01e..da54e226f2 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Version/PackageVersionCheckerService.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Version/PackageVersionCheckerService.cs @@ -247,7 +247,7 @@ public class PackageVersionCheckerService : ITransientDependency var content = await responseMessage.Content.ReadAsStringAsync(); var result = JsonSerializer.Deserialize>(content); - return result.OrderBy(q => q.Type.ToLowerInvariant() == "stable").ThenBy(q => SemanticVersion.Parse(q.Version)).ToList(); + return result.Where(q => q.Type.ToLowerInvariant() == "stable").OrderByDescending(q => SemanticVersion.Parse(q.Version)).ToList(); } } catch diff --git a/framework/src/Volo.Abp.Cli/Volo.Abp.Cli.csproj b/framework/src/Volo.Abp.Cli/Volo.Abp.Cli.csproj index 92753dc30d..e714fcd0b3 100644 --- a/framework/src/Volo.Abp.Cli/Volo.Abp.Cli.csproj +++ b/framework/src/Volo.Abp.Cli/Volo.Abp.Cli.csproj @@ -15,7 +15,6 @@ - diff --git a/framework/src/Volo.Abp.Core/Microsoft/Extensions/DependencyInjection/ServiceCollectionLoggingExtensions.cs b/framework/src/Volo.Abp.Core/Microsoft/Extensions/DependencyInjection/ServiceCollectionLoggingExtensions.cs index be365df686..be906c9e74 100644 --- a/framework/src/Volo.Abp.Core/Microsoft/Extensions/DependencyInjection/ServiceCollectionLoggingExtensions.cs +++ b/framework/src/Volo.Abp.Core/Microsoft/Extensions/DependencyInjection/ServiceCollectionLoggingExtensions.cs @@ -1,4 +1,5 @@ using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Abstractions; using Volo.Abp.Logging; namespace Microsoft.Extensions.DependencyInjection; @@ -7,6 +8,7 @@ public static class ServiceCollectionLoggingExtensions { public static ILogger GetInitLogger(this IServiceCollection services) { - return services.GetSingletonInstance().Create(); + var loggerFactory = services.GetSingletonInstanceOrNull(); + return loggerFactory == null ? NullLogger.Instance : loggerFactory.Create(); } } diff --git a/framework/src/Volo.Abp.Core/Volo.Abp.Core.csproj b/framework/src/Volo.Abp.Core/Volo.Abp.Core.csproj index f89fdbdfb6..5cb2169ffd 100644 --- a/framework/src/Volo.Abp.Core/Volo.Abp.Core.csproj +++ b/framework/src/Volo.Abp.Core/Volo.Abp.Core.csproj @@ -27,19 +27,10 @@ - - - - - - - - $(DefineConstants);WINDOWS - @@ -47,10 +38,13 @@ + + + + all runtime; build; native; contentfiles; analyzers - diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/ConventionalRegistrarBase.cs b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/ConventionalRegistrarBase.cs index 6d1c345840..d9fae16e16 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/ConventionalRegistrarBase.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/ConventionalRegistrarBase.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Reflection; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; using Volo.Abp.Reflection; namespace Volo.Abp.DependencyInjection; @@ -11,14 +12,30 @@ public abstract class ConventionalRegistrarBase : IConventionalRegistrar { public virtual void AddAssembly(IServiceCollection services, Assembly assembly) { - var types = AssemblyHelper - .GetAllTypes(assembly) - .Where( - type => type != null && - type.IsClass && - !type.IsAbstract && - !type.IsGenericType - ).ToArray(); + var logger = services.GetInitLogger(); + var types = Array.Empty(); + + try + { + types = AssemblyHelper + .GetAllTypes(assembly) + .Where( + type => type != null && + type.IsClass && + !type.IsAbstract && + !type.IsGenericType + ).ToArray(); + } + catch (ReflectionTypeLoadException e) + { + types = e.Types.Select(x => x!).ToArray(); + logger.LogException(e); + } + catch (Exception e) + { + //TODO: Trigger a global event? + logger.LogException(e); + } AddTypes(services, types); } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Internal/InternalServiceCollectionExtensions.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Internal/InternalServiceCollectionExtensions.cs index 3f638defe8..be28f569ea 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Internal/InternalServiceCollectionExtensions.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Internal/InternalServiceCollectionExtensions.cs @@ -23,7 +23,6 @@ internal static class InternalServiceCollectionExtensions { var moduleLoader = new ModuleLoader(); var assemblyFinder = new AssemblyFinder(abpApplication); - var typeFinder = new TypeFinder(assemblyFinder); if (!services.IsAdded()) { @@ -36,8 +35,9 @@ internal static class InternalServiceCollectionExtensions services.TryAddSingleton(moduleLoader); services.TryAddSingleton(assemblyFinder); - services.TryAddSingleton(typeFinder); services.TryAddSingleton(new DefaultInitLoggerFactory()); + var typeFinder = new TypeFinder(services.GetInitLogger(), assemblyFinder); + services.TryAddSingleton(typeFinder); services.AddAssemblyOf(); diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Reflection/AssemblyHelper.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Reflection/AssemblyHelper.cs index 8e71f011fe..040159dcc8 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Reflection/AssemblyHelper.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Reflection/AssemblyHelper.cs @@ -25,13 +25,6 @@ internal static class AssemblyHelper public static IReadOnlyList GetAllTypes(Assembly assembly) { - try - { - return assembly.GetTypes(); - } - catch (ReflectionTypeLoadException ex) - { - return ex.Types!; - } + return assembly.GetTypes(); } } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Reflection/TypeFinder.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Reflection/TypeFinder.cs index c7350cde18..c4b52604d6 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Reflection/TypeFinder.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Reflection/TypeFinder.cs @@ -1,19 +1,24 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Reflection; using System.Threading; +using Microsoft.Extensions.Logging; namespace Volo.Abp.Reflection; public class TypeFinder : ITypeFinder { + private readonly ILogger _logger; + private readonly IAssemblyFinder _assemblyFinder; private readonly Lazy> _types; - public TypeFinder(IAssemblyFinder assemblyFinder) + public TypeFinder(ILogger logger, IAssemblyFinder assemblyFinder) { _assemblyFinder = assemblyFinder; + _logger = logger; _types = new Lazy>(FindAll, LazyThreadSafetyMode.ExecutionAndPublication); } @@ -37,9 +42,15 @@ public class TypeFinder : ITypeFinder allTypes.AddRange(typesInThisAssembly.Where(type => type != null)); } - catch + catch (ReflectionTypeLoadException e) + { + allTypes = e.Types.Select(x => x!).ToList(); + _logger.LogException(e); + } + catch (Exception e) { //TODO: Trigger a global event? + _logger.LogException(e); } } diff --git a/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/AbpEventBusRabbitMqModule.cs b/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/AbpEventBusRabbitMqModule.cs index 92399b43b0..5d811a76cc 100644 --- a/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/AbpEventBusRabbitMqModule.cs +++ b/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/AbpEventBusRabbitMqModule.cs @@ -1,4 +1,6 @@ using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; +using Microsoft.Extensions.Options; using Volo.Abp.Modularity; using Volo.Abp.RabbitMQ; @@ -12,8 +14,8 @@ public class AbpEventBusRabbitMqModule : AbpModule public override void ConfigureServices(ServiceConfigurationContext context) { var configuration = context.Services.GetConfiguration(); - Configure(configuration.GetSection("RabbitMQ:EventBus")); + context.Services.TryAddEnumerable(ServiceDescriptor.Singleton, PostConfigureAbpRabbitMqEventBusOptions>()); } public override void OnApplicationInitialization(ApplicationInitializationContext context) diff --git a/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/PostConfigureAbpRabbitMqEventBusOptions.cs b/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/PostConfigureAbpRabbitMqEventBusOptions.cs new file mode 100644 index 0000000000..f4e69c46c6 --- /dev/null +++ b/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/PostConfigureAbpRabbitMqEventBusOptions.cs @@ -0,0 +1,54 @@ +using System.Collections.Generic; +using Microsoft.Extensions.Options; + +namespace Volo.Abp.EventBus.RabbitMq; + +public class PostConfigureAbpRabbitMqEventBusOptions : IPostConfigureOptions +{ + private readonly HashSet _uint64QueueArguments = + [ + "x-delivery-limit", + "x-expires", + "x-message-ttl", + "x-max-length", + "x-max-length-bytes", + "x-quorum-initial-group-size", + "x-quorum-target-group-size", + "x-stream-filter-size-bytes", + "x-stream-max-segment-size-bytes", + ]; + + private readonly HashSet _boolQueueArguments = + [ + "x-single-active-consumer" + ]; + + public virtual void PostConfigure(string? name, AbpRabbitMqEventBusOptions options) + { + ParseBoolQueueArguments(options); + ParseIntegerQueueArguments(options); + } + + protected virtual void ParseBoolQueueArguments(AbpRabbitMqEventBusOptions options) + { + foreach (var argument in _boolQueueArguments) + { + if (options.QueueArguments.TryGetValue(argument, out var value) && value is string stringValue && bool.TryParse(stringValue, out var boolValue)) + { + options.QueueArguments[argument] = boolValue; + } + } + } + + protected virtual void ParseIntegerQueueArguments(AbpRabbitMqEventBusOptions options) + { + foreach (var argument in _uint64QueueArguments) + { + if (options.QueueArguments.TryGetValue(argument, out var value) && value is string stringValue && int.TryParse(stringValue, out var intValue)) + { + options.QueueArguments[argument] = intValue; + } + } + } + +} diff --git a/framework/src/Volo.Abp.Features/Volo/Abp/Features/EditionFeatureValueProvider.cs b/framework/src/Volo.Abp.Features/Volo/Abp/Features/EditionFeatureValueProvider.cs index 94822284f5..cdab8e74c8 100644 --- a/framework/src/Volo.Abp.Features/Volo/Abp/Features/EditionFeatureValueProvider.cs +++ b/framework/src/Volo.Abp.Features/Volo/Abp/Features/EditionFeatureValueProvider.cs @@ -1,5 +1,7 @@ -using System.Security.Principal; +using System; +using System.Security.Principal; using System.Threading.Tasks; +using Volo.Abp.MultiTenancy; using Volo.Abp.Security.Claims; namespace Volo.Abp.Features; @@ -12,15 +14,25 @@ public class EditionFeatureValueProvider : FeatureValueProvider protected ICurrentPrincipalAccessor PrincipalAccessor; - public EditionFeatureValueProvider(IFeatureStore featureStore, ICurrentPrincipalAccessor principalAccessor) + protected ITenantStore TenantStore { get; } + + protected ICurrentTenant CurrentTenant { get; } + + public EditionFeatureValueProvider( + IFeatureStore featureStore, + ICurrentPrincipalAccessor principalAccessor, + ITenantStore tenantStore, + ICurrentTenant currentTenant) : base(featureStore) { PrincipalAccessor = principalAccessor; + TenantStore = tenantStore; + CurrentTenant = currentTenant; } - public override async Task GetOrNullAsync(FeatureDefinition feature) + public async override Task GetOrNullAsync(FeatureDefinition feature) { - var editionId = PrincipalAccessor.Principal?.FindEditionId(); + var editionId = await FindEditionIdAsync(); if (editionId == null) { return null; @@ -28,4 +40,21 @@ public class EditionFeatureValueProvider : FeatureValueProvider return await FeatureStore.GetOrNullAsync(feature.Name, Name, editionId.Value.ToString()); } + + protected virtual async Task FindEditionIdAsync() + { + var editionId = PrincipalAccessor.Principal?.FindEditionId(); + if (editionId != null) + { + return editionId; + } + + if (CurrentTenant.Id == null) + { + return null; + } + + var tenant = await TenantStore.FindAsync(CurrentTenant.Id.Value); + return tenant?.EditionId; + } } diff --git a/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/ClientProxying/ClientProxyUrlBuilder.cs b/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/ClientProxying/ClientProxyUrlBuilder.cs index 5be598af20..09ec183929 100644 --- a/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/ClientProxying/ClientProxyUrlBuilder.cs +++ b/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/ClientProxying/ClientProxyUrlBuilder.cs @@ -119,8 +119,8 @@ public class ClientProxyUrlBuilder : ITransientDependency if (path != null) { urlBuilder = urlBuilder.Replace($"{{{pathParameter.Name}}}", path); - continue; } + continue; } } @@ -164,8 +164,8 @@ public class ClientProxyUrlBuilder : ITransientDependency urlBuilder.Append(isFirstParam ? "?" : "&"); urlBuilder.Append(queryString); isFirstParam = false; - continue; } + continue; } } diff --git a/framework/src/Volo.Abp.Json.SystemTextJson/Volo.Abp.Json.SystemTextJson.csproj b/framework/src/Volo.Abp.Json.SystemTextJson/Volo.Abp.Json.SystemTextJson.csproj index 15a6e37336..6d388b5764 100644 --- a/framework/src/Volo.Abp.Json.SystemTextJson/Volo.Abp.Json.SystemTextJson.csproj +++ b/framework/src/Volo.Abp.Json.SystemTextJson/Volo.Abp.Json.SystemTextJson.csproj @@ -20,6 +20,9 @@ + + + diff --git a/framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/Clients/AbpMongoClientFactory.cs b/framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/Clients/AbpMongoClientFactory.cs new file mode 100644 index 0000000000..983f7e067e --- /dev/null +++ b/framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/Clients/AbpMongoClientFactory.cs @@ -0,0 +1,44 @@ +using System.Collections.Concurrent; +using System.Threading.Tasks; +using Microsoft.Extensions.Options; +using MongoDB.Driver; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.MongoDB.Clients; + +public class AbpMongoClientFactory : IAbpMongoClientFactory, ISingletonDependency +{ + protected ConcurrentDictionary ClientCache { get; } + protected AbpMongoDbContextOptions Options { get; } + + public AbpMongoClientFactory(IOptions options) + { + Options = options.Value; + ClientCache = new ConcurrentDictionary(); + } + + public virtual Task GetAsync(MongoUrl mongoUrl) + { + Check.NotNull(mongoUrl, nameof(mongoUrl)); + + return Task.FromResult( + ClientCache.GetOrAdd(mongoUrl.ToString(), _ => + { + var mongoClientSettings = MongoClientSettings.FromUrl(mongoUrl); + Options.MongoClientSettingsConfigurer?.Invoke(mongoClientSettings); + return new MongoClient(mongoClientSettings); + })); + } + + public virtual MongoClient Get(MongoUrl mongoUrl) + { + Check.NotNull(mongoUrl, nameof(mongoUrl)); + + return ClientCache.GetOrAdd(mongoUrl.ToString(), _ => + { + var mongoClientSettings = MongoClientSettings.FromUrl(mongoUrl); + Options.MongoClientSettingsConfigurer?.Invoke(mongoClientSettings); + return new MongoClient(mongoClientSettings); + }); + } +} diff --git a/framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/Clients/IAbpMongoClientFactory.cs b/framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/Clients/IAbpMongoClientFactory.cs new file mode 100644 index 0000000000..bf0d20d3ae --- /dev/null +++ b/framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/Clients/IAbpMongoClientFactory.cs @@ -0,0 +1,13 @@ +using System; +using System.Threading.Tasks; +using MongoDB.Driver; + +namespace Volo.Abp.MongoDB.Clients; + +public interface IAbpMongoClientFactory +{ + Task GetAsync(MongoUrl mongoUrl); + + [Obsolete("Use GetAsync method")] + MongoClient Get(MongoUrl mongoUrl); +} diff --git a/framework/src/Volo.Abp.MongoDB/Volo/Abp/Uow/MongoDB/UnitOfWorkMongoDbContextProvider.cs b/framework/src/Volo.Abp.MongoDB/Volo/Abp/Uow/MongoDB/UnitOfWorkMongoDbContextProvider.cs index 1585bc1332..acea595dce 100644 --- a/framework/src/Volo.Abp.MongoDB/Volo/Abp/Uow/MongoDB/UnitOfWorkMongoDbContextProvider.cs +++ b/framework/src/Volo.Abp.MongoDB/Volo/Abp/Uow/MongoDB/UnitOfWorkMongoDbContextProvider.cs @@ -4,11 +4,11 @@ using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; -using Microsoft.Extensions.Options; using MongoDB.Bson; using MongoDB.Driver; using Volo.Abp.Data; using Volo.Abp.MongoDB; +using Volo.Abp.MongoDB.Clients; using Volo.Abp.MultiTenancy; using Volo.Abp.Threading; @@ -24,23 +24,23 @@ public class UnitOfWorkMongoDbContextProvider : IMongoDbContext protected readonly IConnectionStringResolver ConnectionStringResolver; protected readonly ICancellationTokenProvider CancellationTokenProvider; protected readonly ICurrentTenant CurrentTenant; - protected readonly AbpMongoDbContextOptions Options; protected readonly IMongoDbContextTypeProvider DbContextTypeProvider; + protected readonly IAbpMongoClientFactory MongoClientFactory; public UnitOfWorkMongoDbContextProvider( IUnitOfWorkManager unitOfWorkManager, IConnectionStringResolver connectionStringResolver, ICancellationTokenProvider cancellationTokenProvider, ICurrentTenant currentTenant, - IOptions options, - IMongoDbContextTypeProvider dbContextTypeProvider) + IMongoDbContextTypeProvider dbContextTypeProvider, + IAbpMongoClientFactory mongoClientFactory) { UnitOfWorkManager = unitOfWorkManager; ConnectionStringResolver = connectionStringResolver; CancellationTokenProvider = cancellationTokenProvider; CurrentTenant = currentTenant; DbContextTypeProvider = dbContextTypeProvider; - Options = options.Value; + MongoClientFactory = mongoClientFactory; Logger = NullLogger>.Instance; } @@ -77,12 +77,11 @@ public class UnitOfWorkMongoDbContextProvider : IMongoDbContext databaseName = ConnectionStringNameAttribute.GetConnStringName(targetDbContextType); } - //TODO: Create only single MongoDbClient per connection string in an application (extract MongoClientCache for example). var databaseApi = unitOfWork.GetOrAddDatabaseApi( dbContextKey, () => new MongoDbDatabaseApi(CreateDbContext(unitOfWork, mongoUrl, databaseName))); - return (TMongoDbContext)((MongoDbDatabaseApi) databaseApi).DbContext; + return (TMongoDbContext)((MongoDbDatabaseApi)databaseApi).DbContext; } public virtual async Task GetDbContextAsync(CancellationToken cancellationToken = default) @@ -121,14 +120,13 @@ public class UnitOfWorkMongoDbContextProvider : IMongoDbContext unitOfWork.AddDatabaseApi(dbContextKey, databaseApi); } - return (TMongoDbContext)((MongoDbDatabaseApi) databaseApi).DbContext; + return (TMongoDbContext)((MongoDbDatabaseApi)databaseApi).DbContext; } [Obsolete("Use CreateDbContextAsync")] - private TMongoDbContext CreateDbContext(IUnitOfWork unitOfWork, MongoUrl mongoUrl, string databaseName) { - var client = CreateMongoClient(mongoUrl); + var client = MongoClientFactory.Get(mongoUrl); var database = client.GetDatabase(databaseName); if (unitOfWork.Options.IsTransactional) @@ -148,7 +146,7 @@ public class UnitOfWorkMongoDbContextProvider : IMongoDbContext string databaseName, CancellationToken cancellationToken = default) { - var client = CreateMongoClient(mongoUrl); + var client = await MongoClientFactory.GetAsync(mongoUrl); var database = client.GetDatabase(databaseName); if (unitOfWork.Options.IsTransactional) @@ -297,14 +295,6 @@ public class UnitOfWorkMongoDbContextProvider : IMongoDbContext return ConnectionStringResolver.Resolve(dbContextType); } - protected virtual MongoClient CreateMongoClient(MongoUrl mongoUrl) - { - var mongoClientSettings = MongoClientSettings.FromUrl(mongoUrl); - Options.MongoClientSettingsConfigurer?.Invoke(mongoClientSettings); - - return new MongoClient(mongoClientSettings); - } - protected virtual CancellationToken GetCancellationToken(CancellationToken preferredValue = default) { return CancellationTokenProvider.FallbackToProvider(preferredValue); diff --git a/framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/TenantConfiguration.cs b/framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/TenantConfiguration.cs index 29b0971708..674bce6e94 100644 --- a/framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/TenantConfiguration.cs +++ b/framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/TenantConfiguration.cs @@ -17,6 +17,8 @@ public class TenantConfiguration public bool IsActive { get; set; } + public Guid? EditionId { get; set; } + public TenantConfiguration() { IsActive = true; @@ -33,11 +35,12 @@ public class TenantConfiguration ConnectionStrings = new ConnectionStrings(); } - public TenantConfiguration(Guid id, [NotNull] string name, [NotNull] string normalizedName) + public TenantConfiguration(Guid id, [NotNull] string name, [NotNull] string normalizedName, Guid? editionId = null) : this(id, name) { Check.NotNull(normalizedName, nameof(normalizedName)); NormalizedName = normalizedName; + EditionId = editionId; } } diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/FakeAuthenticationScheme.cs b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/FakeAuthenticationScheme.cs index 641bbe03d7..0f9da48f68 100644 --- a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/FakeAuthenticationScheme.cs +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/FakeAuthenticationScheme.cs @@ -1,8 +1,8 @@ using System; +using System.Linq; using System.Security.Claims; using System.Text.Encodings.Web; using System.Threading.Tasks; -using DeviceDetectorNET; using Microsoft.AspNetCore.Authentication; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/WebClientInfoProvider/WebClientInfoProviderDto.cs b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/WebClientInfoProvider/WebClientInfoProviderDto.cs new file mode 100644 index 0000000000..85f96a65e3 --- /dev/null +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/WebClientInfoProvider/WebClientInfoProviderDto.cs @@ -0,0 +1,8 @@ +namespace Volo.Abp.AspNetCore.Mvc.WebClientInfoProvider; + +public class WebClientInfoProviderDto +{ + public string BrowserInfo { get; set; } + + public string DeviceInfo { get; set; } +} diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/WebClientInfoProvider/WebClientInfoProviderTestController.cs b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/WebClientInfoProvider/WebClientInfoProviderTestController.cs new file mode 100644 index 0000000000..0d09c6e8ee --- /dev/null +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/WebClientInfoProvider/WebClientInfoProviderTestController.cs @@ -0,0 +1,26 @@ +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using Volo.Abp.AspNetCore.WebClientInfo; + +namespace Volo.Abp.AspNetCore.Mvc.WebClientInfoProvider; + +[Route("api/web-client-info")] +public class WebClientInfoProviderTestController : AbpController +{ + private IWebClientInfoProvider _webClientInfoProvider { get; } + + public WebClientInfoProviderTestController(IWebClientInfoProvider webClientInfoProvider) + { + _webClientInfoProvider = webClientInfoProvider; + } + + [HttpGet] + public Task GetAsync() + { + return Task.FromResult(new WebClientInfoProviderDto + { + BrowserInfo = _webClientInfoProvider.BrowserInfo, + DeviceInfo = _webClientInfoProvider.DeviceInfo + }); + } +} diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/WebClientInfoProvider/WebClientInfoProviderTestController_Tests.cs b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/WebClientInfoProvider/WebClientInfoProviderTestController_Tests.cs new file mode 100644 index 0000000000..0a5f13082b --- /dev/null +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/WebClientInfoProvider/WebClientInfoProviderTestController_Tests.cs @@ -0,0 +1,36 @@ +using System.Net; +using System.Net.Http; +using System.Text.Json; +using System.Threading.Tasks; +using Shouldly; +using Xunit; + +namespace Volo.Abp.AspNetCore.Mvc.WebClientInfoProvider; + +public class WebClientInfoProviderTestController_Tests : AspNetCoreMvcTestBase +{ + [Theory] + [InlineData("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36", "Windows 10 Chrome")] + [InlineData("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36", "Mac OS X Chrome")] + [InlineData("PostmanRuntime/7.43.4", "PostmanRuntime/7.43.4")] + [InlineData("curl/7.64.1", "curl/7.64.1")] + [InlineData("Mozilla/5.0 (compatible; MojeekBot/0.11; +mojeek.com/bot.html)", "MojeekBot")] + public async Task TestAsync(string ua, string device) + { + var clientInfo = await GetWebClientInfoAsync(ua); + clientInfo.ShouldNotBeNull(); + clientInfo.BrowserInfo.ShouldBe(ua); + clientInfo.DeviceInfo.ShouldBe(device); + } + + private async Task GetWebClientInfoAsync(string userAgent ) + { + using (var requestMessage = new HttpRequestMessage(HttpMethod.Get, "api/web-client-info")) + { + requestMessage.Headers.Add("User-Agent", userAgent); + var response = await Client.SendAsync(requestMessage); + response.StatusCode.ShouldBe(HttpStatusCode.OK); + return JsonSerializer.Deserialize(await response.Content.ReadAsStringAsync(), JsonSerializerOptions.Web); + } + } +} diff --git a/framework/test/Volo.Abp.Core.Tests/Volo/Abp/Reflection/TypeFinder_Tests.cs b/framework/test/Volo.Abp.Core.Tests/Volo/Abp/Reflection/TypeFinder_Tests.cs index 480352d69c..4884f07d16 100644 --- a/framework/test/Volo.Abp.Core.Tests/Volo/Abp/Reflection/TypeFinder_Tests.cs +++ b/framework/test/Volo.Abp.Core.Tests/Volo/Abp/Reflection/TypeFinder_Tests.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Reflection; +using Microsoft.Extensions.Logging.Abstractions; using NSubstitute; using Shouldly; using Xunit; @@ -21,7 +22,7 @@ public class TypeFinder_Tests //Act - var typeFinder = new TypeFinder(fakeAssemblyFinder); + var typeFinder = new TypeFinder(NullLogger.Instance, fakeAssemblyFinder); //Assert diff --git a/framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/DynamicProxying/TestObjectToPath.cs b/framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/DynamicProxying/TestObjectToPath.cs index a9b7936578..358d842228 100644 --- a/framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/DynamicProxying/TestObjectToPath.cs +++ b/framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/DynamicProxying/TestObjectToPath.cs @@ -15,9 +15,8 @@ public class TestObjectToPath : IObjectToPath, ITransientDependency { value = 888; } - return Task.FromResult(value.ToString()); } - return Task.FromResult(null); + return Task.FromResult(value.ToString()); } } diff --git a/framework/test/Volo.Abp.MongoDB.Tests/Volo/Abp/MongoDB/Clients/MongoClient_Factory_Tests.cs b/framework/test/Volo.Abp.MongoDB.Tests/Volo/Abp/MongoDB/Clients/MongoClient_Factory_Tests.cs new file mode 100644 index 0000000000..df649132fa --- /dev/null +++ b/framework/test/Volo.Abp.MongoDB.Tests/Volo/Abp/MongoDB/Clients/MongoClient_Factory_Tests.cs @@ -0,0 +1,79 @@ +using System; +using System.Threading.Tasks; +using MongoDB.Driver; +using Xunit; + +namespace Volo.Abp.MongoDB.Clients; + +[Collection(MongoTestCollection.Name)] +public class MongoClient_Factory_Tests : MongoDbTestBase +{ + private readonly IAbpMongoClientFactory _factory; + + public MongoClient_Factory_Tests() + { + _factory = GetRequiredService(); + } + + [Fact] + public async Task Should_Return_Same_Instance_For_Same_ConnectionString() + { + // Arrange + var mongoUrl = new MongoUrl("mongodb://localhost:27017/my-db"); + + // Act + var client1 = await _factory.GetAsync(mongoUrl); + var client2 = await _factory.GetAsync(mongoUrl); + + // Assert + Assert.Same(client1, client2); + } + + [Fact] + public async Task Should_Return_Different_Instances_For_Different_ConnectionStrings() + { + // Arrange + var mongoUrl1 = new MongoUrl("mongodb://localhost:27017/db1"); + var mongoUrl2 = new MongoUrl("mongodb://localhost:27017/db2"); + + // Act + var client1 = await _factory.GetAsync(mongoUrl1); + var client2 = await _factory.GetAsync(mongoUrl2); + + // Assert + Assert.NotSame(client1, client2); + } + + [Fact] + public async Task Should_Not_Throw_For_Valid_But_Unreachable_Connection() + { + // Arrange + var mongoUrl = new MongoUrl("mongodb://unreachablehost:12345/any"); + + // Act + var client = await _factory.GetAsync(mongoUrl); + + // Assert + Assert.NotNull(client); // Even though it's not connectable now, the instance can be created + } + + [Fact] + public async Task Should_Be_ThreadSafe_When_Accessed_Concurrently() + { + var mongoUrl = new MongoUrl("mongodb://localhost:27017/threadsafe"); + var results = new MongoClient[100]; + + await Parallel.ForAsync(0, 100, async (i, _) => + { + results[i] = await _factory.GetAsync(mongoUrl); + }); + + Assert.All(results, client => Assert.Same(results[0], client)); + } + + [Fact] + public async Task Should_Throw_If_ConnectionString_Is_Null_Or_Empty() + { + await Assert.ThrowsAsync(() => _factory.GetAsync(null!)); + } +} diff --git a/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Application/PeopleAppService.cs b/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Application/PeopleAppService.cs index a7d64228bd..6981eb1e57 100644 --- a/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Application/PeopleAppService.cs +++ b/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Application/PeopleAppService.cs @@ -5,7 +5,9 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; +using Shouldly; using Volo.Abp.Application.Dtos; using Volo.Abp.TestApp.Domain; using Volo.Abp.Domain.Repositories; @@ -17,10 +19,11 @@ namespace Volo.Abp.TestApp.Application; public class PeopleAppService : CrudAppService, IPeopleAppService { - public PeopleAppService(IRepository repository) + private readonly IHttpContextAccessor _httpContextAccessor; + public PeopleAppService(IRepository repository, IHttpContextAccessor httpContextAccessor) : base(repository) { - + _httpContextAccessor = httpContextAccessor; } public async Task> GetPhones(Guid id, GetPersonPhonesFilter filter) @@ -129,6 +132,11 @@ public class PeopleAppService : CrudAppService, IPeople public Task GetParamsFromQueryAsync([FromQuery] GetParamsInput input) { + if (_httpContextAccessor.HttpContext != null) + { + _httpContextAccessor.HttpContext.Request.QueryString.ToString().ShouldNotContain("ExtraProperties=Volo.Abp.Data.ExtraPropertyDictionary"); + } + return Task.FromResult(input.NameValues?.FirstOrDefault()?.Name + "-" + input.NameValues?.FirstOrDefault()?.Value + ":" + input.NameValues?.FirstOrDefault()?.ExtraProperties["TestPropertyInList"] + ":" + input.NameValues?.LastOrDefault()?.Name + "-" + input.NameValues?.LastOrDefault()?.Value + ":" + diff --git a/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/TestAppModule.cs b/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/TestAppModule.cs index 0c8339d6f7..f30774838e 100644 --- a/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/TestAppModule.cs +++ b/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/TestAppModule.cs @@ -27,7 +27,8 @@ public class TestAppModule : AbpModule { ConfigureAutoMapper(); ConfigureDistributedEventBus(); - + + context.Services.AddHttpContextAccessor(); context.Services.Replace(ServiceDescriptor.Singleton()); context.Services.AddEntityCache(); context.Services.AddEntityCache(); diff --git a/latest-versions.json b/latest-versions.json index da8c7b754d..7e756d726b 100644 --- a/latest-versions.json +++ b/latest-versions.json @@ -1,4 +1,13 @@ [ + { + "version": "9.2.0", + "releaseDate": "", + "type": "stable", + "message": "", + "leptonx": { + "version": "4.2.0" + } + }, { "version": "9.1.3", "releaseDate": "", diff --git a/modules/account/src/Volo.Abp.Account.Application/Volo.Abp.Account.Application.csproj b/modules/account/src/Volo.Abp.Account.Application/Volo.Abp.Account.Application.csproj index e32c705afb..d8c149f8b5 100644 --- a/modules/account/src/Volo.Abp.Account.Application/Volo.Abp.Account.Application.csproj +++ b/modules/account/src/Volo.Abp.Account.Application/Volo.Abp.Account.Application.csproj @@ -17,7 +17,6 @@ - diff --git a/modules/account/src/Volo.Abp.Account.Web.IdentityServer/Volo.Abp.Account.Web.IdentityServer.csproj b/modules/account/src/Volo.Abp.Account.Web.IdentityServer/Volo.Abp.Account.Web.IdentityServer.csproj index e4235dbd94..6abd877a2c 100644 --- a/modules/account/src/Volo.Abp.Account.Web.IdentityServer/Volo.Abp.Account.Web.IdentityServer.csproj +++ b/modules/account/src/Volo.Abp.Account.Web.IdentityServer/Volo.Abp.Account.Web.IdentityServer.csproj @@ -33,10 +33,6 @@ - - - - diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/AuditLogExcelFileConsts.cs b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/AuditLogExcelFileConsts.cs new file mode 100644 index 0000000000..7e74632910 --- /dev/null +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/AuditLogExcelFileConsts.cs @@ -0,0 +1,9 @@ +namespace Volo.Abp.AuditLogging; + +public static class AuditLogExcelFileConsts +{ + /// + /// Default value: 256 + /// + public static int MaxFileNameLength { get; set; } = 256; +} 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 58f1b5bf7a..86a9ad9581 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 @@ -79,9 +79,39 @@ "DurationMs": "المدة (مللي ثانية)", "StartDate": "تاريخ البدء", "EndDate": "تاريخ الانتهاء", - "Feature:AuditLoggingGroup": "تدوين التسجيل", + "Feature:AuditLoggingGroup": "تسجيل التدقيق", "Feature:AuditLoggingEnable": "تمكين صفحة تسجيل التدقيق", - "Feature:AuditLoggingEnableDescription": "تفعيل صفحة تسجيل التدقيق في التطبيق.", - "TenantId": "معرف المستأجر" + "Feature:AuditLoggingEnableDescription": "تمكين صفحة تسجيل التدقيق في التطبيق.", + "Feature:AuditLoggingSettingManagementEnable": "تمكين إدارة إعدادات تسجيل التدقيق", + "Feature:AuditLoggingSettingManagementEnableDescription": "تمكين تكوين إدارة إعدادات تسجيل التدقيق داخل التطبيق.", + "InvalidAuditLogDeletionSettings": "إعدادات حذف سجل التدقيق غير صالحة. إذا تم تمكين الحذف، يجب أن تكون الفترة أكبر من 0 أيام.", + "AuditLogSettingsGeneral": "عام", + "AuditLogSettingsGlobal": "عالمي", + "DisplayName:IsPeriodicDeleterEnabled": "تمكين خدمة التنظيف على مستوى النظام", + "Description:IsPeriodicDeleterEnabled": "إذا تم تعطيل هذا الخيار، فلن يعمل المحذف الدوري. لن يتم حذف سجلات التدقيق تلقائياً.", + "DisplayName:GlobalIsExpiredDeleterEnabled": "تمكين خدمة التنظيف لجميع المستأجرين والمضيف", + "Description:GlobalIsExpiredDeleterEnabled": "إذا تم تمكين هذا الخيار، سيتم حذف جميع العناصر المنتهية الصلاحية للمستأجرين والمضيف تلقائياً ما لم يكن لديها إعداد محدد.", + "DisplayName:IsExpiredDeleterEnabled": "تمكين خدمة التنظيف", + "Description:IsExpiredDeleterEnabled": "إذا تم تمكين هذا الخيار، سيتم حذف العناصر المنتهية الصلاحية تلقائياً.", + "DisplayName:ExpiredDeleterPeriod": "فترة حذف العناصر المنتهية الصلاحية", + "Description:ExpiredDeleterPeriod": "حدد عدد الأيام التي سيتم بعدها حذف العناصر المنتهية الصلاحية تلقائياً.", + "ExpiredDeleterPeriodUnit": "يوم (أيام)", + "AuditLogsBeforeXWillBeDeleted": "سيتم حذف سجلات التدقيق قبل {0}.", + "TenantId": "معرف المستأجر", + "Permission:Export": "تصدير سجلات التدقيق", + "ExportToExcel": "تصدير إلى Excel", + "Exporting": "جاري التصدير", + "ExportCompleted": "تم إكمال التصدير بنجاح", + "ExportFailed": "فشل التصدير", + "ExportJobQueued": "تم وضع مهمة التصدير في الطابور لـ {0} سجل. ستتلقى بريداً إلكترونياً عند اكتمال التصدير.", + "ExportReady": "تم إكمال التصدير لـ {0} سجل وجاهز للتنزيل.", + "FileName": "اسم الملف", + "TotalRecords": "إجمالي السجلات", + "ExcelFileAttachedMessage": "ملف Excel مرفق بهذا البريد الإلكتروني.", + "EntityChangeExportCompletedSubject": "تم إكمال تصدير تغييرات الكيان", + "AuditLogExportCompletedSubject": "تم إكمال تصدير سجل التدقيق", + "DownloadLinkExplanation": "يمكنك تنزيل الملف باستخدام الرابط أدناه حتى {0} (UTC)", + "DownloadNow": "تنزيل الآن", + "TryAgainMessage": "الرجاء المحاولة مرة أخرى. إذا استمرت المشكلة، يرجى الاتصال بالدعم." } } \ 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 b415c41556..a98da37703 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 @@ -82,6 +82,36 @@ "Feature:AuditLoggingGroup": "Protokolování auditu", "Feature:AuditLoggingEnable": "Povolena stránka protokolování auditu", "Feature:AuditLoggingEnableDescription": "Povolit stránku protokolování auditu v aplikaci.", - "TenantId": "ID nájemce" + "Feature:AuditLoggingSettingManagementEnable": "Povolit správu nastavení protokolování auditu", + "Feature:AuditLoggingSettingManagementEnableDescription": "Povolit konfiguraci správy nastavení protokolování auditu v aplikaci.", + "InvalidAuditLogDeletionSettings": "Neplatná nastavení mazání protokolu auditu. Pokud je mazání povoleno, období by mělo být větší než 0 dní.", + "AuditLogSettingsGeneral": "Obecné", + "AuditLogSettingsGlobal": "Globální", + "DisplayName:IsPeriodicDeleterEnabled": "Povolit službu čištění v celém systému", + "Description:IsPeriodicDeleterEnabled": "Pokud je tato možnost zakázána, periodický mazač nebude fungovat. Protokoly auditu nebudou automaticky mazány.", + "DisplayName:GlobalIsExpiredDeleterEnabled": "Povolit službu čištění pro všechny nájemce a hostitele", + "Description:GlobalIsExpiredDeleterEnabled": "Pokud je tato možnost povolena, všechny prošlé položky nájemců a hostitele budou automaticky smazány, pokud nemají specifické nastavení.", + "DisplayName:IsExpiredDeleterEnabled": "Povolit službu čištění", + "Description:IsExpiredDeleterEnabled": "Pokud je tato možnost povolena, prošlé položky budou automaticky smazány.", + "DisplayName:ExpiredDeleterPeriod": "Období mazání prošlých položek", + "Description:ExpiredDeleterPeriod": "Nastavte počet dní, po kterých budou prošlé položky automaticky smazány.", + "ExpiredDeleterPeriodUnit": "den(dny)", + "AuditLogsBeforeXWillBeDeleted": "Protokoly auditu před {0} budou smazány.", + "TenantId": "ID nájemce", + "Permission:Export": "Exportovat protokoly auditu", + "ExportToExcel": "Exportovat do Excelu", + "Exporting": "Exportování", + "ExportCompleted": "Export úspěšně dokončen", + "ExportFailed": "Export se nezdařil", + "ExportJobQueued": "Úloha exportu byla zařazena do fronty pro {0} záznamů. Obdržíte e-mail, když bude export dokončen.", + "ExportReady": "Export dokončen pro {0} záznamů a připraven ke stažení.", + "FileName": "Název souboru", + "TotalRecords": "Celkem záznamů", + "ExcelFileAttachedMessage": "Soubor Excel je připojen k tomuto e-mailu.", + "EntityChangeExportCompletedSubject": "Export změn entit dokončen", + "AuditLogExportCompletedSubject": "Export protokolu auditu dokončen", + "DownloadLinkExplanation": "Soubor můžete stáhnout pomocí odkazu níže až do {0} (UTC)", + "DownloadNow": "Stáhnout nyní", + "TryAgainMessage": "Zkuste to prosím znovu. Pokud problém přetrvává, kontaktujte podporu." } } \ 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 512556988f..334ada8c9a 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 @@ -81,6 +81,9 @@ "Feature:AuditLoggingGroup": "Audit-Protokollierung", "Feature:AuditLoggingEnable": "Aktivieren Sie die Überwachungsprotokollseite", "Feature:AuditLoggingEnableDescription": "Aktivieren Sie die Überwachungsprotokollseite in der App.", - "TenantId": "Mandanten-ID" + "TenantId": "Mandanten-ID", + "DownloadLinkExplanation": "Sie können die Datei über den Link unten bis {0} (UTC) herunterladen", + "DownloadNow": "Jetzt herunterladen", + "TryAgainMessage": "Bitte versuchen Sie es erneut. Wenn das Problem weiterhin besteht, wenden Sie sich bitte an den Support." } } \ 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 06d2a825f4..cc316ff867 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 @@ -82,6 +82,36 @@ "Feature:AuditLoggingGroup": "Audit-Protokollierung", "Feature:AuditLoggingEnable": "Aktivierte Audit-Logging-Seite", "Feature:AuditLoggingEnableDescription": "Aktivieren Sie die Audit-Logging-Seite in der Anwendung.", - "TenantId": "Mandanten-ID" + "Feature:AuditLoggingSettingManagementEnable": "Audit-Log-Einstellungsverwaltung aktivieren", + "Feature:AuditLoggingSettingManagementEnableDescription": "Aktivieren Sie die Konfiguration der Audit-Log-Einstellungsverwaltung in der Anwendung.", + "InvalidAuditLogDeletionSettings": "Ungültige Audit-Log-Löscheinstellungen. Wenn das Löschen aktiviert ist, sollte der Zeitraum größer als 0 Tage sein.", + "AuditLogSettingsGeneral": "Allgemein", + "AuditLogSettingsGlobal": "Global", + "DisplayName:IsPeriodicDeleterEnabled": "Bereinigungsdienst systemweit aktivieren", + "Description:IsPeriodicDeleterEnabled": "Wenn diese Option deaktiviert ist, funktioniert der periodische Löscher nicht. Audit-Logs werden nicht automatisch gelöscht.", + "DisplayName:GlobalIsExpiredDeleterEnabled": "Bereinigungsdienst für alle Mandanten und Host aktivieren", + "Description:GlobalIsExpiredDeleterEnabled": "Wenn diese Option aktiviert ist, werden alle abgelaufenen Elemente der Mandanten und des Hosts automatisch gelöscht, es sei denn, es gibt eine spezifische Einstellung.", + "DisplayName:IsExpiredDeleterEnabled": "Bereinigungsdienst aktivieren", + "Description:IsExpiredDeleterEnabled": "Wenn diese Option aktiviert ist, werden abgelaufene Elemente automatisch gelöscht.", + "DisplayName:ExpiredDeleterPeriod": "Löschzeitraum für abgelaufene Elemente", + "Description:ExpiredDeleterPeriod": "Legen Sie die Anzahl der Tage fest, nach denen abgelaufene Elemente automatisch gelöscht werden.", + "ExpiredDeleterPeriodUnit": "Tag(e)", + "AuditLogsBeforeXWillBeDeleted": "Audit-Logs vor {0} werden gelöscht.", + "TenantId": "Mandanten-ID", + "Permission:Export": "Audit-Logs exportieren", + "ExportToExcel": "Nach Excel exportieren", + "Exporting": "Exportieren", + "ExportCompleted": "Export erfolgreich abgeschlossen", + "ExportFailed": "Export fehlgeschlagen", + "ExportJobQueued": "Export-Job wurde für {0} Datensätze in die Warteschlange eingereiht. Sie erhalten eine E-Mail, wenn der Export abgeschlossen ist.", + "ExportReady": "Export für {0} Datensätze abgeschlossen und zum Download bereit.", + "FileName": "Dateiname", + "TotalRecords": "Gesamtdatensätze", + "ExcelFileAttachedMessage": "Die Excel-Datei ist an diese E-Mail angehängt.", + "EntityChangeExportCompletedSubject": "Entity-Änderungsexport abgeschlossen", + "AuditLogExportCompletedSubject": "Audit-Log-Export abgeschlossen", + "DownloadLinkExplanation": "Sie können die Datei über den Link unten bis {0} (UTC) herunterladen", + "DownloadNow": "Jetzt herunterladen", + "TryAgainMessage": "Bitte versuchen Sie es erneut. Wenn das Problem weiterhin besteht, wenden Sie sich bitte an den Support." } } \ 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 ac03e75db7..e837e01666 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 @@ -97,6 +97,21 @@ "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.", - "TenantId": "Tenant Id" + "TenantId": "Tenant Id", + "Permission:Export": "Export audit logs", + "ExportToExcel": "Export to Excel", + "Exporting": "Exporting", + "ExportCompleted": "Export completed successfully", + "ExportFailed": "Export failed", + "ExportJobQueued": "Export job has been queued for {0} records. You will receive an email when the export is completed.", + "ExportReady": "Export completed for {0} records and is ready for download.", + "FileName": "File name", + "TotalRecords": "Total records", + "ExcelFileAttachedMessage": "The Excel file is attached to this email.", + "EntityChangeExportCompletedSubject": "Entity change export completed", + "AuditLogExportCompletedSubject": "Audit log export completed", + "DownloadLinkExplanation": "You can download the file using the link below until {0} (UTC)", + "DownloadNow": "Download now", + "TryAgainMessage": "Please try again. If the problem persists, please contact support." } } 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 310b5de91b..518c29d0ea 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 @@ -82,6 +82,36 @@ "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.", - "TenantId": "ID de inquilino" + "Feature:AuditLoggingSettingManagementEnable": "Habilitar la gestión de configuración de registro de auditoría", + "Feature:AuditLoggingSettingManagementEnableDescription": "Habilite la configuración de la gestión de configuración de registro de auditoría dentro de la aplicación.", + "InvalidAuditLogDeletionSettings": "Configuración de eliminación de registro de auditoría no válida. Si la eliminación está habilitada, el período debe ser mayor a 0 días.", + "AuditLogSettingsGeneral": "General", + "AuditLogSettingsGlobal": "Global", + "DisplayName:IsPeriodicDeleterEnabled": "Habilitar servicio de limpieza en todo el sistema", + "Description:IsPeriodicDeleterEnabled": "Si esta opción está deshabilitada, el eliminador periódico no funcionará. Los registros de auditoría no se eliminarán automáticamente.", + "DisplayName:GlobalIsExpiredDeleterEnabled": "Habilitar servicio de limpieza para todos los inquilinos y host", + "Description:GlobalIsExpiredDeleterEnabled": "Si esta opción está habilitada, todos los elementos vencidos de los inquilinos y el host se eliminarán automáticamente a menos que tenga una configuración específica.", + "DisplayName:IsExpiredDeleterEnabled": "Habilitar servicio de limpieza", + "Description:IsExpiredDeleterEnabled": "Si esta opción está habilitada, los elementos vencidos se eliminarán automáticamente.", + "DisplayName:ExpiredDeleterPeriod": "Período de eliminación de elementos vencidos", + "Description:ExpiredDeleterPeriod": "Establezca el número de días después de los cuales los elementos vencidos se eliminarán automáticamente.", + "ExpiredDeleterPeriodUnit": "día(s)", + "AuditLogsBeforeXWillBeDeleted": "Los registros de auditoría antes de {0} serán eliminados.", + "TenantId": "ID de inquilino", + "Permission:Export": "Exportar registros de auditoría", + "ExportToExcel": "Exportar a Excel", + "Exporting": "Exportando", + "ExportCompleted": "Exportación completada exitosamente", + "ExportFailed": "Exportación fallida", + "ExportJobQueued": "El trabajo de exportación ha sido puesto en cola para {0} registros. Recibirá un correo electrónico cuando se complete la exportación.", + "ExportReady": "Exportación completada para {0} registros y lista para descarga.", + "FileName": "Nombre del archivo", + "TotalRecords": "Total de registros", + "ExcelFileAttachedMessage": "El archivo de Excel está adjunto a este correo electrónico.", + "EntityChangeExportCompletedSubject": "Exportación de cambios de entidad completada", + "AuditLogExportCompletedSubject": "Exportación de registro de auditoría completada", + "DownloadLinkExplanation": "Puede descargar el archivo usando el enlace a continuación hasta {0} (UTC)", + "DownloadNow": "Descargar ahora", + "TryAgainMessage": "Por favor, inténtelo de nuevo. Si el problema persiste, contacte con soporte." } } \ 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 76b374f51a..a71a9cf5e8 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 @@ -79,9 +79,39 @@ "DurationMs": "Kesto (ms)", "StartDate": "Aloituspäivämäärä", "EndDate": "Päättymispäivä", - "Feature:AuditLoggingGroup": "Tarkastusten kirjaaminen", - "Feature:AuditLoggingEnable": "Aktivoi auditointilokisivu", - "Feature:AuditLoggingEnableDescription": "Ota käyttöön tarkastuksen kirjaussivu sovelluksessa.", - "TenantId": "Vuokralaisen tunnus" + "Feature:AuditLoggingGroup": "Tarkastuslokin kirjaaminen", + "Feature:AuditLoggingEnable": "Ota käyttöön tarkastuslokin kirjaussivu", + "Feature:AuditLoggingEnableDescription": "Ota käyttöön tarkastuslokin kirjaussivu sovelluksessa.", + "Feature:AuditLoggingSettingManagementEnable": "Ota käyttöön tarkastuslokin asetusten hallinta", + "Feature:AuditLoggingSettingManagementEnableDescription": "Ota käyttöön tarkastuslokin asetusten hallinnan konfigurointi sovelluksessa.", + "InvalidAuditLogDeletionSettings": "Virheelliset tarkastuslokin poisto-asetukset. Jos poistaminen on käytössä, ajanjakson tulee olla suurempi kuin 0 päivää.", + "AuditLogSettingsGeneral": "Yleinen", + "AuditLogSettingsGlobal": "Globaali", + "DisplayName:IsPeriodicDeleterEnabled": "Ota käyttöön siivouspalvelu koko järjestelmässä", + "Description:IsPeriodicDeleterEnabled": "Jos tämä vaihtoehto on poistettu käytöstä, jaksollinen poistaja ei toimi. Tarkastuslokeja ei poisteta automaattisesti.", + "DisplayName:GlobalIsExpiredDeleterEnabled": "Ota käyttöön siivouspalvelu kaikille vuokralaisille ja isännälle", + "Description:GlobalIsExpiredDeleterEnabled": "Jos tämä vaihtoehto on käytössä, kaikki vuokralaisten ja isännän vanhentuneet kohteet poistetaan automaattisesti, ellei niillä ole erityistä asetusta.", + "DisplayName:IsExpiredDeleterEnabled": "Ota käyttöön siivouspalvelu", + "Description:IsExpiredDeleterEnabled": "Jos tämä vaihtoehto on käytössä, vanhentuneet kohteet poistetaan automaattisesti.", + "DisplayName:ExpiredDeleterPeriod": "Vanhentuneiden kohteiden poistojakso", + "Description:ExpiredDeleterPeriod": "Aseta päivien määrä, jonka jälkeen vanhentuneet kohteet poistetaan automaattisesti.", + "ExpiredDeleterPeriodUnit": "päivä(ä)", + "AuditLogsBeforeXWillBeDeleted": "Tarkastuslokit ennen {0} poistetaan.", + "TenantId": "Vuokralaisen tunnus", + "Permission:Export": "Vie tarkastuslokit", + "ExportToExcel": "Vie Exceliin", + "Exporting": "Viedään", + "ExportCompleted": "Vienti suoritettu onnistuneesti", + "ExportFailed": "Vienti epäonnistui", + "ExportJobQueued": "Vientityö on asetettu jonoon {0} tietueelle. Saat sähköpostin, kun vienti on valmis.", + "ExportReady": "Vienti valmis {0} tietueelle ja valmis ladattavaksi.", + "FileName": "Tiedostonimi", + "TotalRecords": "Tietueiden kokonaismäärä", + "ExcelFileAttachedMessage": "Excel-tiedosto on liitetty tähän sähköpostiin.", + "EntityChangeExportCompletedSubject": "Entiteettimuutosten vienti valmis", + "AuditLogExportCompletedSubject": "Tarkastuslokin vienti valmis", + "DownloadLinkExplanation": "Voit ladata tiedoston alla olevan linkin kautta {0} (UTC) asti", + "DownloadNow": "Lataa nyt", + "TryAgainMessage": "Yritä uudelleen. Jos ongelma jatkuu, ota yhteyttä tukeen." } } \ 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 5ea79065aa..c12e499403 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 @@ -82,6 +82,36 @@ "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.", - "TenantId": "ID du locataire" + "Feature:AuditLoggingSettingManagementEnable": "Activer la gestion des paramètres de journalisation d'audit", + "Feature:AuditLoggingSettingManagementEnableDescription": "Activez la configuration de la gestion des paramètres de journalisation d'audit dans l'application.", + "InvalidAuditLogDeletionSettings": "Paramètres de suppression de journal d'audit non valides. Si la suppression est activée, la période doit être supérieure à 0 jour.", + "AuditLogSettingsGeneral": "Général", + "AuditLogSettingsGlobal": "Global", + "DisplayName:IsPeriodicDeleterEnabled": "Activer le service de nettoyage à l'échelle du système", + "Description:IsPeriodicDeleterEnabled": "Si cette option est désactivée, le suppresseur périodique ne fonctionnera pas. Les journaux d'audit ne seront pas supprimés automatiquement.", + "DisplayName:GlobalIsExpiredDeleterEnabled": "Activer le service de nettoyage pour tous les locataires et l'hôte", + "Description:GlobalIsExpiredDeleterEnabled": "Si cette option est activée, tous les éléments expirés des locataires et de l'hôte seront supprimés automatiquement, sauf s'il y a un paramètre spécifique.", + "DisplayName:IsExpiredDeleterEnabled": "Activer le service de nettoyage", + "Description:IsExpiredDeleterEnabled": "Si cette option est activée, les éléments expirés seront supprimés automatiquement.", + "DisplayName:ExpiredDeleterPeriod": "Période de suppression des éléments expirés", + "Description:ExpiredDeleterPeriod": "Définissez le nombre de jours après lesquels les éléments expirés seront automatiquement supprimés.", + "ExpiredDeleterPeriodUnit": "jour(s)", + "AuditLogsBeforeXWillBeDeleted": "Les journaux d'audit avant {0} seront supprimés.", + "TenantId": "ID du locataire", + "Permission:Export": "Exporter les journaux d'audit", + "ExportToExcel": "Exporter vers Excel", + "Exporting": "Exportation", + "ExportCompleted": "Exportation terminée avec succès", + "ExportFailed": "Échec de l'exportation", + "ExportJobQueued": "Le travail d'exportation a été mis en file d'attente pour {0} enregistrements. Vous recevrez un e-mail lorsque l'exportation sera terminée.", + "ExportReady": "Exportation terminée pour {0} enregistrements et prête pour le téléchargement.", + "FileName": "Nom du fichier", + "TotalRecords": "Total des enregistrements", + "ExcelFileAttachedMessage": "Le fichier Excel est joint à cet e-mail.", + "EntityChangeExportCompletedSubject": "Exportation des changements d'entité terminée", + "AuditLogExportCompletedSubject": "Exportation du journal d'audit terminée", + "DownloadLinkExplanation": "Vous pouvez télécharger le fichier en utilisant le lien ci-dessous jusqu'au {0} (UTC)", + "DownloadNow": "Télécharger maintenant", + "TryAgainMessage": "Veuillez réessayer. Si le problème persiste, veuillez contacter le support." } } \ 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 7e1e84de7e..b2e2788e52 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 @@ -82,6 +82,9 @@ "Feature:AuditLoggingGroup": "ऑडिट लॉगिंग", "Feature:AuditLoggingEnable": "सक्षम ऑडिट लॉगिंग पृष्ठ", "Feature:AuditLoggingEnableDescription": "एप्लिकेशन में ऑडिट लॉगिंग पृष्ठ सक्षम करें।", - "TenantId": "किरायेदार आईडी" + "TenantId": "किरायेदार आईडी", + "DownloadLinkExplanation": "आप {0} (UTC) तक नीचे दिए गए लिंक का उपयोग करके फ़ाइल डाउनलोड कर सकते हैं", + "DownloadNow": "अभी डाउनलोड करें", + "TryAgainMessage": "कृपया पुनः प्रयास करें। यदि समस्या बनी रहती है, तो कृपया सहायता से संपर्क करें।" } } \ 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 ed6c345578..7d4a3f57b6 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 @@ -82,6 +82,9 @@ "Feature:AuditLoggingGroup": "Zapisivanje revizije", "Feature:AuditLoggingEnable": "Omogućena stranica za bilježenje revizije", "Feature:AuditLoggingEnableDescription": "Omogućite stranicu za bilježenje revizije u aplikaciji.", - "TenantId": "ID stanara" + "TenantId": "ID stanara", + "DownloadLinkExplanation": "Datoteku možete preuzeti pomoću veze u nastavku do {0} (UTC)", + "DownloadNow": "Preuzmi odmah", + "TryAgainMessage": "Molimo pokušajte ponovno. Ako se problem nastavi, obratite se podršci." } } \ 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 816aa4c0d5..af744ac07b 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 @@ -80,8 +80,38 @@ "StartDate": "Kezdő dátum", "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.", - "TenantId": "Bérlő azonosító" + "Feature:AuditLoggingEnable": "Audit naplózási oldal engedélyezése", + "Feature:AuditLoggingEnableDescription": "Engedélyezze az audit naplózási oldalt az alkalmazásban.", + "Feature:AuditLoggingSettingManagementEnable": "Audit napló beállítások kezelésének engedélyezése", + "Feature:AuditLoggingSettingManagementEnableDescription": "Engedélyezze az audit napló beállítások kezelésének konfigurációját az alkalmazásban.", + "InvalidAuditLogDeletionSettings": "Érvénytelen audit napló törlési beállítások. Ha a törlés engedélyezett, az időszaknak nagyobbnak kell lennie 0 napnál.", + "AuditLogSettingsGeneral": "Általános", + "AuditLogSettingsGlobal": "Globális", + "DisplayName:IsPeriodicDeleterEnabled": "Takarítási szolgáltatás engedélyezése rendszerszinten", + "Description:IsPeriodicDeleterEnabled": "Ha ez az opció le van tiltva, a periodikus törlő nem fog működni. Az audit naplók nem lesznek automatikusan törölve.", + "DisplayName:GlobalIsExpiredDeleterEnabled": "Takarítási szolgáltatás engedélyezése minden bérlő és host számára", + "Description:GlobalIsExpiredDeleterEnabled": "Ha ez az opció engedélyezett, minden bérlő és host lejárt elemei automatikusan törölve lesznek, kivéve ha van specifikus beállítás.", + "DisplayName:IsExpiredDeleterEnabled": "Takarítási szolgáltatás engedélyezése", + "Description:IsExpiredDeleterEnabled": "Ha ez az opció engedélyezett, a lejárt elemek automatikusan törölve lesznek.", + "DisplayName:ExpiredDeleterPeriod": "Lejárt elemek törlési időszaka", + "Description:ExpiredDeleterPeriod": "Állítsa be a napok számát, amely után a lejárt elemek automatikusan törölve lesznek.", + "ExpiredDeleterPeriodUnit": "nap(ok)", + "AuditLogsBeforeXWillBeDeleted": "Az audit naplók {0} előtt törölve lesznek.", + "TenantId": "Bérlő azonosító", + "Permission:Export": "Audit naplók exportálása", + "ExportToExcel": "Exportálás Excelbe", + "Exporting": "Exportálás", + "ExportCompleted": "Exportálás sikeresen befejezve", + "ExportFailed": "Exportálás sikertelen", + "ExportJobQueued": "Exportálási feladat sorba állítva {0} rekordhoz. E-mailt fog kapni, amikor az exportálás befejeződött.", + "ExportReady": "Exportálás befejezve {0} rekordhoz és letöltésre kész.", + "FileName": "Fájlnév", + "TotalRecords": "Összes rekord", + "ExcelFileAttachedMessage": "Az Excel fájl csatolva van ehhez az e-mailhez.", + "EntityChangeExportCompletedSubject": "Entitás változás exportálás befejezve", + "AuditLogExportCompletedSubject": "Audit napló exportálás befejezve", + "DownloadLinkExplanation": "A fájlt letöltheti az alábbi linken keresztül {0} (UTC) időpontig", + "DownloadNow": "Letöltés most", + "TryAgainMessage": "Kérjük, próbálja újra. Ha a probléma továbbra is fennáll, forduljon az ügyfélszolgálathoz." } } \ 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 fc556570ff..2d2f8915f3 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 @@ -82,6 +82,9 @@ "Feature:AuditLoggingGroup": "Endurskoðunarskráning", "Feature:AuditLoggingEnable": "Virkjað endurskoðunarskráningarsíða", "Feature:AuditLoggingEnableDescription": "Virkjaðu endurskoðunarskráningarsíðu í forritinu.", - "TenantId": "Leigutakaauðkenni" + "TenantId": "Leigutakaauðkenni", + "DownloadLinkExplanation": "Þú getur sótt skrána með tenglinum hér að neðan til {0} (UTC)", + "DownloadNow": "Sækja núna", + "TryAgainMessage": "Vinsamlegast reyndu aftur. Ef vandamálið er viðvarandi, hafðu samband við þjónustuaðila." } } \ 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 6e3ef94959..b43511d03b 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 @@ -82,6 +82,36 @@ "Feature:AuditLoggingGroup": "Registrazione di controllo", "Feature:AuditLoggingEnable": "Pagina di registrazione di controllo abilitata", "Feature:AuditLoggingEnableDescription": "Abilita la pagina di registrazione dell'audit nell'applicazione.", - "TenantId": "ID inquilino" + "Feature:AuditLoggingSettingManagementEnable": "Abilita gestione impostazioni log di audit", + "Feature:AuditLoggingSettingManagementEnableDescription": "Abilita la configurazione della gestione delle impostazioni del log di audit nell'applicazione.", + "InvalidAuditLogDeletionSettings": "Impostazioni di eliminazione del log di audit non valide. Se l'eliminazione è abilitata, il periodo dovrebbe essere maggiore di 0 giorni.", + "AuditLogSettingsGeneral": "Generale", + "AuditLogSettingsGlobal": "Globale", + "DisplayName:IsPeriodicDeleterEnabled": "Abilita servizio di pulizia a livello di sistema", + "Description:IsPeriodicDeleterEnabled": "Se questa opzione è disabilitata, l'eliminatore periodico non funzionerà. I log di audit non verranno eliminati automaticamente.", + "DisplayName:GlobalIsExpiredDeleterEnabled": "Abilita servizio di pulizia per tutti i tenant e l'host", + "Description:GlobalIsExpiredDeleterEnabled": "Se questa opzione è abilitata, tutti gli elementi scaduti dei tenant e dell'host verranno eliminati automaticamente a meno che non abbiano un'impostazione specifica.", + "DisplayName:IsExpiredDeleterEnabled": "Abilita servizio di pulizia", + "Description:IsExpiredDeleterEnabled": "Se questa opzione è abilitata, gli elementi scaduti verranno eliminati automaticamente.", + "DisplayName:ExpiredDeleterPeriod": "Periodo di eliminazione elementi scaduti", + "Description:ExpiredDeleterPeriod": "Imposta il numero di giorni dopo i quali gli elementi scaduti verranno eliminati automaticamente.", + "ExpiredDeleterPeriodUnit": "giorno(i)", + "AuditLogsBeforeXWillBeDeleted": "I log di audit prima di {0} verranno eliminati.", + "TenantId": "ID inquilino", + "Permission:Export": "Esporta log di audit", + "ExportToExcel": "Esporta in Excel", + "Exporting": "Esportazione", + "ExportCompleted": "Esportazione completata con successo", + "ExportFailed": "Esportazione fallita", + "ExportJobQueued": "Il lavoro di esportazione è stato messo in coda per {0} record. Riceverai un'email quando l'esportazione sarà completata.", + "ExportReady": "Esportazione completata per {0} record e pronta per il download.", + "FileName": "Nome file", + "TotalRecords": "Record totali", + "ExcelFileAttachedMessage": "Il file Excel è allegato a questa email.", + "EntityChangeExportCompletedSubject": "Esportazione modifiche entità completata", + "AuditLogExportCompletedSubject": "Esportazione log di audit completata", + "DownloadLinkExplanation": "Puoi scaricare il file utilizzando il link qui sotto fino a {0} (UTC)", + "DownloadNow": "Scarica ora", + "TryAgainMessage": "Per favore riprova. Se il problema persiste, contatta il supporto." } } \ 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 289b2318e3..9b44a3c884 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 @@ -79,9 +79,39 @@ "DurationMs": "Duur (ms)", "StartDate": "Begin datum", "EndDate": "Einddatum", - "Feature:AuditLoggingGroup": "Auditregistratie", - "Feature:AuditLoggingEnable": "Pagina voor auditregistratie ingeschakeld", - "Feature:AuditLoggingEnableDescription": "Schakel de auditlogboekpagina in de applicatie in.", - "TenantId": "Huurder-ID" + "Feature:AuditLoggingGroup": "Auditlogboekregistratie", + "Feature:AuditLoggingEnable": "Auditlogboekregistratiepagina ingeschakeld", + "Feature:AuditLoggingEnableDescription": "Schakel de auditlogboekregistratiepagina in de applicatie in.", + "Feature:AuditLoggingSettingManagementEnable": "Beheer van auditlog-instellingen inschakelen", + "Feature:AuditLoggingSettingManagementEnableDescription": "Schakel de configuratie van het beheer van auditlog-instellingen binnen de applicatie in.", + "InvalidAuditLogDeletionSettings": "Ongeldige instellingen voor het verwijderen van auditlogs. Als verwijdering is ingeschakeld, moet de periode groter zijn dan 0 dagen.", + "AuditLogSettingsGeneral": "Algemeen", + "AuditLogSettingsGlobal": "Globaal", + "DisplayName:IsPeriodicDeleterEnabled": "Opruimservice systeembreed inschakelen", + "Description:IsPeriodicDeleterEnabled": "Als deze optie is uitgeschakeld, werkt de periodieke verwijderaar niet. Auditlogs worden niet automatisch verwijderd.", + "DisplayName:GlobalIsExpiredDeleterEnabled": "Opruimservice inschakelen voor alle huurders en host", + "Description:GlobalIsExpiredDeleterEnabled": "Als deze optie is ingeschakeld, worden alle verlopen items van huurders en de host automatisch verwijderd, tenzij er een specifieke instelling is.", + "DisplayName:IsExpiredDeleterEnabled": "Opruimservice inschakelen", + "Description:IsExpiredDeleterEnabled": "Als deze optie is ingeschakeld, worden verlopen items automatisch verwijderd.", + "DisplayName:ExpiredDeleterPeriod": "Verwijderingsperiode voor verlopen items", + "Description:ExpiredDeleterPeriod": "Stel het aantal dagen in waarna verlopen items automatisch worden verwijderd.", + "ExpiredDeleterPeriodUnit": "dag(en)", + "AuditLogsBeforeXWillBeDeleted": "Auditlogs vóór {0} worden verwijderd.", + "TenantId": "Huurder-ID", + "Permission:Export": "Auditlogs exporteren", + "ExportToExcel": "Exporteren naar Excel", + "Exporting": "Exporteren", + "ExportCompleted": "Export succesvol voltooid", + "ExportFailed": "Export mislukt", + "ExportJobQueued": "Exporttaak is in de wachtrij geplaatst voor {0} records. U ontvangt een e-mail wanneer de export is voltooid.", + "ExportReady": "Export voltooid voor {0} records en klaar voor download.", + "FileName": "Bestandsnaam", + "TotalRecords": "Totaal aantal records", + "ExcelFileAttachedMessage": "Het Excel-bestand is bijgevoegd bij deze e-mail.", + "EntityChangeExportCompletedSubject": "Export van entiteitswijzigingen voltooid", + "AuditLogExportCompletedSubject": "Auditlog export voltooid", + "DownloadLinkExplanation": "U kunt het bestand downloaden via de onderstaande link tot {0} (UTC)", + "DownloadNow": "Download nu", + "TryAgainMessage": "Probeer het opnieuw. Als het probleem aanhoudt, neem dan contact op met de ondersteuning." } } \ 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 9f4f6db58f..17162d6af8 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 @@ -80,8 +80,38 @@ "StartDate": "Data rozpoczęcia", "EndDate": "Data końcowa", "Feature:AuditLoggingGroup": "Rejestrowanie audytu", - "Feature:AuditLoggingEnable": "Włączono stronę rejestrowania audytu", + "Feature:AuditLoggingEnable": "Włącz stronę rejestrowania audytu", "Feature:AuditLoggingEnableDescription": "Włącz stronę rejestrowania audytu w aplikacji.", - "TenantId": "Identyfikator najemcy" + "Feature:AuditLoggingSettingManagementEnable": "Włącz zarządzanie ustawieniami dziennika audytu", + "Feature:AuditLoggingSettingManagementEnableDescription": "Włącz konfigurację zarządzania ustawieniami dziennika audytu w aplikacji.", + "InvalidAuditLogDeletionSettings": "Nieprawidłowe ustawienia usuwania dziennika audytu. Jeśli usuwanie jest włączone, okres powinien być większy niż 0 dni.", + "AuditLogSettingsGeneral": "Ogólne", + "AuditLogSettingsGlobal": "Globalne", + "DisplayName:IsPeriodicDeleterEnabled": "Włącz usługę czyszczenia w całym systemie", + "Description:IsPeriodicDeleterEnabled": "Jeśli ta opcja jest wyłączona, okresowy usuwacz nie będzie działać. Dzienniki audytu nie będą automatycznie usuwane.", + "DisplayName:GlobalIsExpiredDeleterEnabled": "Włącz usługę czyszczenia dla wszystkich najemców i hosta", + "Description:GlobalIsExpiredDeleterEnabled": "Jeśli ta opcja jest włączona, wszystkie wygasłe elementy najemców i hosta będą automatycznie usuwane, chyba że mają określone ustawienie.", + "DisplayName:IsExpiredDeleterEnabled": "Włącz usługę czyszczenia", + "Description:IsExpiredDeleterEnabled": "Jeśli ta opcja jest włączona, wygasłe elementy będą automatycznie usuwane.", + "DisplayName:ExpiredDeleterPeriod": "Okres usuwania wygasłych elementów", + "Description:ExpiredDeleterPeriod": "Ustaw liczbę dni, po których wygasłe elementy będą automatycznie usuwane.", + "ExpiredDeleterPeriodUnit": "dzień(dni)", + "AuditLogsBeforeXWillBeDeleted": "Dzienniki audytu przed {0} zostaną usunięte.", + "TenantId": "ID najemcy", + "Permission:Export": "Eksportuj dzienniki audytu", + "ExportToExcel": "Eksportuj do Excela", + "Exporting": "Eksportowanie", + "ExportCompleted": "Eksport zakończony pomyślnie", + "ExportFailed": "Eksport nieudany", + "ExportJobQueued": "Zadanie eksportu zostało umieszczone w kolejce dla {0} rekordów. Otrzymasz e-mail po zakończeniu eksportu.", + "ExportReady": "Eksport zakończony dla {0} rekordów i gotowy do pobrania.", + "FileName": "Nazwa pliku", + "TotalRecords": "Łączna liczba rekordów", + "ExcelFileAttachedMessage": "Plik Excel jest załączony do tego e-maila.", + "EntityChangeExportCompletedSubject": "Eksport zmian encji zakończony", + "AuditLogExportCompletedSubject": "Eksport dziennika audytu zakończony", + "DownloadLinkExplanation": "Możesz pobrać plik, korzystając z poniższego łącza do {0} (UTC)", + "DownloadNow": "Pobierz teraz", + "TryAgainMessage": "Proszę spróbuj ponownie. Jeśli problem nie ustąpi, skontaktuj się z pomocą techniczną." } } \ 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 d88aba16a6..03ec81d51e 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 @@ -82,6 +82,36 @@ "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.", - "TenantId": "ID do inquilino" + "Feature:AuditLoggingSettingManagementEnable": "Habilitar gerenciamento de configurações de log de auditoria", + "Feature:AuditLoggingSettingManagementEnableDescription": "Habilite a configuração do gerenciamento de configurações de log de auditoria dentro do aplicativo.", + "InvalidAuditLogDeletionSettings": "Configurações de exclusão de log de auditoria inválidas. Se a exclusão estiver habilitada, o período deve ser maior que 0 dias.", + "AuditLogSettingsGeneral": "Geral", + "AuditLogSettingsGlobal": "Global", + "DisplayName:IsPeriodicDeleterEnabled": "Habilitar serviço de limpeza em todo o sistema", + "Description:IsPeriodicDeleterEnabled": "Se esta opção estiver desabilitada, o excluidor periódico não funcionará. Os logs de auditoria não serão excluídos automaticamente.", + "DisplayName:GlobalIsExpiredDeleterEnabled": "Habilitar serviço de limpeza para todos os inquilinos e host", + "Description:GlobalIsExpiredDeleterEnabled": "Se esta opção estiver habilitada, todos os itens expirados dos inquilinos e do host serão excluídos automaticamente, a menos que tenham uma configuração específica.", + "DisplayName:IsExpiredDeleterEnabled": "Habilitar serviço de limpeza", + "Description:IsExpiredDeleterEnabled": "Se esta opção estiver habilitada, os itens expirados serão excluídos automaticamente.", + "DisplayName:ExpiredDeleterPeriod": "Período de exclusão de itens expirados", + "Description:ExpiredDeleterPeriod": "Defina o número de dias após os quais os itens expirados serão excluídos automaticamente.", + "ExpiredDeleterPeriodUnit": "dia(s)", + "AuditLogsBeforeXWillBeDeleted": "Os logs de auditoria antes de {0} serão excluídos.", + "TenantId": "ID do inquilino", + "Permission:Export": "Exportar logs de auditoria", + "ExportToExcel": "Exportar para Excel", + "Exporting": "Exportando", + "ExportCompleted": "Exportação concluída com sucesso", + "ExportFailed": "Exportação falhou", + "ExportJobQueued": "O trabalho de exportação foi enfileirado para {0} registros. Você receberá um email quando a exportação for concluída.", + "ExportReady": "Exportação concluída para {0} registros e pronta para download.", + "FileName": "Nome do arquivo", + "TotalRecords": "Total de registros", + "ExcelFileAttachedMessage": "O arquivo Excel está anexado a este email.", + "EntityChangeExportCompletedSubject": "Exportação de mudanças de entidade concluída", + "AuditLogExportCompletedSubject": "Exportação de log de auditoria concluída", + "DownloadLinkExplanation": "Você pode baixar o arquivo usando o link abaixo até {0} (UTC)", + "DownloadNow": "Baixar agora", + "TryAgainMessage": "Por favor, tente novamente. Se o problema persistir, entre em contato com o suporte." } } \ 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 0b546c4866..2cc471a1e4 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 @@ -82,6 +82,9 @@ "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.", - "TenantId": "ID chiriaș" + "TenantId": "ID chiriaș", + "DownloadLinkExplanation": "Puteți descărca fișierul folosind link-ul de mai jos până la {0} (UTC)", + "DownloadNow": "Descărcați acum", + "TryAgainMessage": "Vă rugăm să încercați din nou. Dacă problema persistă, vă rugăm să contactați asistența." } } \ 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 9d12238ac2..f07c7baa78 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 @@ -82,6 +82,36 @@ "Feature:AuditLoggingGroup": "Ведение журнала аудита", "Feature:AuditLoggingEnable": "Включенная страница ведения журнала аудита", "Feature:AuditLoggingEnableDescription": "Включить страницу ведения журнала аудита в приложении.", - "TenantId": "Идентификатор арендатора" + "Feature:AuditLoggingSettingManagementEnable": "Включить управление настройками журнала аудита", + "Feature:AuditLoggingSettingManagementEnableDescription": "Включить конфигурацию управления настройками журнала аудита в приложении.", + "InvalidAuditLogDeletionSettings": "Недопустимые настройки удаления журнала аудита. Если удаление включено, период должен быть больше 0 дней.", + "AuditLogSettingsGeneral": "Общие", + "AuditLogSettingsGlobal": "Глобальные", + "DisplayName:IsPeriodicDeleterEnabled": "Включить службу очистки в масштабе системы", + "Description:IsPeriodicDeleterEnabled": "Если эта опция отключена, периодический удалитель не будет работать. Журналы аудита не будут удаляться автоматически.", + "DisplayName:GlobalIsExpiredDeleterEnabled": "Включить службу очистки для всех арендаторов и хоста", + "Description:GlobalIsExpiredDeleterEnabled": "Если эта опция включена, все просроченные элементы арендаторов и хоста будут удаляться автоматически, если у них нет специальной настройки.", + "DisplayName:IsExpiredDeleterEnabled": "Включить службу очистки", + "Description:IsExpiredDeleterEnabled": "Если эта опция включена, просроченные элементы будут удаляться автоматически.", + "DisplayName:ExpiredDeleterPeriod": "Период удаления просроченных элементов", + "Description:ExpiredDeleterPeriod": "Установите количество дней, после которых просроченные элементы будут автоматически удалены.", + "ExpiredDeleterPeriodUnit": "день(дни)", + "AuditLogsBeforeXWillBeDeleted": "Журналы аудита до {0} будут удалены.", + "TenantId": "Идентификатор арендатора", + "Permission:Export": "Экспорт журналов аудита", + "ExportToExcel": "Экспорт в Excel", + "Exporting": "Экспорт", + "ExportCompleted": "Экспорт успешно завершен", + "ExportFailed": "Экспорт не удался", + "ExportJobQueued": "Задача экспорта поставлена в очередь для {0} записей. Вы получите электронное письмо, когда экспорт будет завершен.", + "ExportReady": "Экспорт завершен для {0} записей и готов к загрузке.", + "FileName": "Имя файла", + "TotalRecords": "Всего записей", + "ExcelFileAttachedMessage": "Файл Excel прикреплен к этому электронному письму.", + "EntityChangeExportCompletedSubject": "Экспорт изменений сущности завершен", + "AuditLogExportCompletedSubject": "Экспорт журнала аудита завершен", + "DownloadLinkExplanation": "Вы можете скачать файл по ссылке ниже до {0} (UTC)", + "DownloadNow": "Скачать сейчас", + "TryAgainMessage": "Пожалуйста, попробуйте еще раз. Если проблема не исчезнет, обратитесь в службу поддержки." } } \ 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 ae3925ea79..e406b3ec25 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 @@ -79,9 +79,39 @@ "DurationMs": "Trvanie (ms)", "StartDate": "Dátum začiatku", "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.", - "TenantId": "ID nájomníka" + "Feature:AuditLoggingGroup": "Protokolovanie auditu", + "Feature:AuditLoggingEnable": "Povoliť stránku protokolovania auditu", + "Feature:AuditLoggingEnableDescription": "Povoliť stránku protokolovania auditu v aplikácii.", + "Feature:AuditLoggingSettingManagementEnable": "Povoliť správu nastavení protokolu auditu", + "Feature:AuditLoggingSettingManagementEnableDescription": "Povoliť konfiguráciu správy nastavení protokolu auditu v aplikácii.", + "InvalidAuditLogDeletionSettings": "Neplatné nastavenia mazania protokolu auditu. Ak je mazanie povolené, obdobie by malo byť väčšie ako 0 dní.", + "AuditLogSettingsGeneral": "Všeobecné", + "AuditLogSettingsGlobal": "Globálne", + "DisplayName:IsPeriodicDeleterEnabled": "Povoliť službu čistenia v celom systéme", + "Description:IsPeriodicDeleterEnabled": "Ak je táto možnosť zakázaná, periodický mazač nebude fungovať. Protokoly auditu nebudú automaticky mazané.", + "DisplayName:GlobalIsExpiredDeleterEnabled": "Povoliť službu čistenia pre všetkých nájomcov a hostiteľa", + "Description:GlobalIsExpiredDeleterEnabled": "Ak je táto možnosť povolená, všetky prešlé položky nájomcov a hostiteľa budú automaticky zmazané, pokiaľ nemajú špecifické nastavenie.", + "DisplayName:IsExpiredDeleterEnabled": "Povoliť službu čistenia", + "Description:IsExpiredDeleterEnabled": "Ak je táto možnosť povolená, prešlé položky budú automaticky zmazané.", + "DisplayName:ExpiredDeleterPeriod": "Obdobie mazania prešlých položiek", + "Description:ExpiredDeleterPeriod": "Nastavte počet dní, po ktorých budú prešlé položky automaticky zmazané.", + "ExpiredDeleterPeriodUnit": "deň(dni)", + "AuditLogsBeforeXWillBeDeleted": "Protokoly auditu pred {0} budú zmazané.", + "TenantId": "ID nájomcu", + "Permission:Export": "Exportovať protokoly auditu", + "ExportToExcel": "Exportovať do Excelu", + "Exporting": "Exportovanie", + "ExportCompleted": "Export úspešne dokončený", + "ExportFailed": "Export sa nepodaril", + "ExportJobQueued": "Úloha exportu bola zaradená do fronty pre {0} záznamov. Dostanete e-mail, keď bude export dokončený.", + "ExportReady": "Export dokončený pre {0} záznamov a pripravený na stiahnutie.", + "FileName": "Názov súboru", + "TotalRecords": "Celkom záznamov", + "ExcelFileAttachedMessage": "Súbor Excel je pripojený k tomuto e-mailu.", + "EntityChangeExportCompletedSubject": "Export zmien entít dokončený", + "AuditLogExportCompletedSubject": "Export protokolu auditu dokončený", + "DownloadLinkExplanation": "Súbor si môžete stiahnuť pomocou odkazu nižšie do {0} (UTC)", + "DownloadNow": "Stiahnuť teraz", + "TryAgainMessage": "Skúste to prosím znova. Ak problém pretrváva, kontaktujte podporu." } } \ 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 460e43458e..0efc30a3d0 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 @@ -79,9 +79,39 @@ "DurationMs": "Trajanje (ms)", "StartDate": "Začetni datum", "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.", - "TenantId": "ID najemnika" + "Feature:AuditLoggingGroup": "Beleženje revizije", + "Feature:AuditLoggingEnable": "Omogoči stran beleženja revizije", + "Feature:AuditLoggingEnableDescription": "Omogočite stran beleženja revizije v aplikaciji.", + "Feature:AuditLoggingSettingManagementEnable": "Omogoči upravljanje nastavitev dnevnika revizije", + "Feature:AuditLoggingSettingManagementEnableDescription": "Omogočite konfiguracijo upravljanja nastavitev dnevnika revizije v aplikaciji.", + "InvalidAuditLogDeletionSettings": "Neveljavne nastavitve brisanja dnevnika revizije. Če je brisanje omogočeno, mora biti obdobje večje od 0 dni.", + "AuditLogSettingsGeneral": "Splošno", + "AuditLogSettingsGlobal": "Globalno", + "DisplayName:IsPeriodicDeleterEnabled": "Omogoči storitev čiščenja po celotnem sistemu", + "Description:IsPeriodicDeleterEnabled": "Če je ta možnost onemogočena, periodični brisalec ne bo deloval. Dnevniki revizije ne bodo samodejno izbrisani.", + "DisplayName:GlobalIsExpiredDeleterEnabled": "Omogoči storitev čiščenja za vse najemnike in gostitelja", + "Description:GlobalIsExpiredDeleterEnabled": "Če je ta možnost omogočena, bodo vsi potekli elementi najemnikov in gostitelja samodejno izbrisani, razen če imajo specifično nastavitev.", + "DisplayName:IsExpiredDeleterEnabled": "Omogoči storitev čiščenja", + "Description:IsExpiredDeleterEnabled": "Če je ta možnost omogočena, bodo potekli elementi samodejno izbrisani.", + "DisplayName:ExpiredDeleterPeriod": "Obdobje brisanja poteklih elementov", + "Description:ExpiredDeleterPeriod": "Nastavite število dni, po katerih bodo potekli elementi samodejno izbrisani.", + "ExpiredDeleterPeriodUnit": "dan(i)", + "AuditLogsBeforeXWillBeDeleted": "Dnevniki revizije pred {0} bodo izbrisani.", + "TenantId": "ID najemnika", + "Permission:Export": "Izvozi dnevnike revizije", + "ExportToExcel": "Izvozi v Excel", + "Exporting": "Izvažanje", + "ExportCompleted": "Izvoz uspešno dokončan", + "ExportFailed": "Izvoz neuspešen", + "ExportJobQueued": "Naloga izvoza je bila postavljena v vrsto za {0} zapisov. Prejeli boste e-pošto, ko bo izvoz dokončan.", + "ExportReady": "Izvoz dokončan za {0} zapisov in pripravljen za prenos.", + "FileName": "Ime datoteke", + "TotalRecords": "Skupaj zapisov", + "ExcelFileAttachedMessage": "Datoteka Excel je priložena tej e-pošti.", + "EntityChangeExportCompletedSubject": "Izvoz sprememb entitet dokončan", + "AuditLogExportCompletedSubject": "Izvoz dnevnika revizije dokončan", + "DownloadLinkExplanation": "Datoteko lahko prenesete s spodnjo povezavo do {0} (UTC)", + "DownloadNow": "Prenesi zdaj", + "TryAgainMessage": "Prosimo, poskusite znova. Če težava vztraja, se obrnite na podporo." } } \ 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 3c57005a3d..b3a44c27ed 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 @@ -79,24 +79,39 @@ "DurationMs": "Varaktighet (ms)", "StartDate": "Startdatum", "EndDate": "Slutdatum", - "Feature:AuditLoggingGroup": "Granskning av loggning", - "Feature:AuditLoggingEnable": "Aktivera granskningsloggning sida", - "Feature:AuditLoggingEnableDescription": "Aktivera sidan för granskningsloggning i programmet.", - "Feature:AuditLoggingSettingManagementEnable": "Aktivera hantering av inställningar för granskningslogg", - "Feature:AuditLoggingSettingManagementEnableDescription": "Aktivera konfigurationen av inställningshanteringen för granskningsloggen i programmet.", - "InvalidAuditLogDeletionSettings": "Ogiltiga inställningar för radering av revisionslogg. Om radering är aktiverad ska perioden vara större än 0 dagar.", + "Feature:AuditLoggingGroup": "Granskningsloggning", + "Feature:AuditLoggingEnable": "Aktivera granskningsloggningssida", + "Feature:AuditLoggingEnableDescription": "Aktivera granskningsloggningssidan i applikationen.", + "Feature:AuditLoggingSettingManagementEnable": "Aktivera hantering av granskningslogginställningar", + "Feature:AuditLoggingSettingManagementEnableDescription": "Aktivera konfiguration av hantering av granskningslogginställningar inom applikationen.", + "InvalidAuditLogDeletionSettings": "Ogiltiga inställningar för borttagning av granskningslogg. Om borttagning är aktiverat ska perioden vara större än 0 dagar.", "AuditLogSettingsGeneral": "Allmänt", "AuditLogSettingsGlobal": "Globalt", - "DisplayName:IsPeriodicDeleterEnabled": "Möjliggör uppstädning av hela systemet", - "Description:IsPeriodicDeleterEnabled": "Om detta alternativ är avaktiverat fungerar inte den periodiska raderingen. Granskningsloggar kommer inte att raderas automatiskt.", - "DisplayName:GlobalIsExpiredDeleterEnabled": "Aktivera städservice för alla hyresgäster och värd", - "Description:GlobalIsExpiredDeleterEnabled": "Om det här alternativet är aktiverat raderas alla förfallna objekt för hyresgäster och värd automatiskt om det inte har en specifik inställning.", - "DisplayName:IsExpiredDeleterEnabled": "Möjliggör städning", - "Description:IsExpiredDeleterEnabled": "Om detta alternativ är aktiverat raderas de utgångna artiklarna automatiskt.", - "DisplayName:ExpiredDeleterPeriod": "Utgången raderingsperiod för objekt", - "Description:ExpiredDeleterPeriod": "Ställ in antalet dagar efter vilka utgångna objekt automatiskt ska raderas.", + "DisplayName:IsPeriodicDeleterEnabled": "Aktivera rengöringstjänst systemomfattande", + "Description:IsPeriodicDeleterEnabled": "Om detta alternativ är inaktiverat kommer den periodiska raderaren inte att fungera. Granskningsloggar kommer inte att raderas automatiskt.", + "DisplayName:GlobalIsExpiredDeleterEnabled": "Aktivera rengöringstjänst för alla hyresgäster och värd", + "Description:GlobalIsExpiredDeleterEnabled": "Om detta alternativ är aktiverat kommer alla utgångna objekt för hyresgäster och värd att raderas automatiskt såvida de inte har en specifik inställning.", + "DisplayName:IsExpiredDeleterEnabled": "Aktivera rengöringstjänst", + "Description:IsExpiredDeleterEnabled": "Om detta alternativ är aktiverat kommer utgångna objekt att raderas automatiskt.", + "DisplayName:ExpiredDeleterPeriod": "Period för radering av utgångna objekt", + "Description:ExpiredDeleterPeriod": "Ange antalet dagar efter vilka utgångna objekt kommer att raderas automatiskt.", "ExpiredDeleterPeriodUnit": "dag(ar)", "AuditLogsBeforeXWillBeDeleted": "Granskningsloggar före {0} kommer att raderas.", - "TenantId": "Hyresgäst-ID" + "TenantId": "Hyresgäst-ID", + "Permission:Export": "Exportera granskningsloggar", + "ExportToExcel": "Exportera till Excel", + "Exporting": "Exporterar", + "ExportCompleted": "Export slutförd framgångsrikt", + "ExportFailed": "Export misslyckades", + "ExportJobQueued": "Exportjobb har köats för {0} poster. Du kommer att få ett e-postmeddelande när exporten är klar.", + "ExportReady": "Export slutförd för {0} poster och redo för nedladdning.", + "FileName": "Filnamn", + "TotalRecords": "Totalt antal poster", + "ExcelFileAttachedMessage": "Excel-filen är bifogad till detta e-postmeddelande.", + "EntityChangeExportCompletedSubject": "Export av entitetsändringar slutförd", + "AuditLogExportCompletedSubject": "Export av granskningslogg slutförd", + "DownloadLinkExplanation": "Du kan ladda ner filen via länken nedan fram till {0} (UTC)", + "DownloadNow": "Ladda ner nu", + "TryAgainMessage": "Försök igen. Om problemet kvarstår, kontakta support." } } \ 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 b3e09335fc..86105e1a08 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 @@ -82,6 +82,21 @@ "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.)", - "TenantId": "Müşteri Id" + "TenantId": "Müşteri Id", + "Permission:Export": "İşlem kayıtlarını dışa aktar", + "ExportToExcel": "Excel'e Aktar", + "Exporting": "Aktarılıyor", + "ExportCompleted": "Aktarma başarıyla tamamlandı", + "ExportFailed": "Aktarma başarısız", + "ExportJobQueued": "{0} kayıt için dışa aktarma işi sıraya alındı. İşlem tamamlandığında e-posta ile bilgilendirileceksiniz.", + "ExportReady": "{0} kayıt için dışa aktarma tamamlandı ve indirme için hazır.", + "FileName": "Dosya adı", + "TotalRecords": "Toplam kayıt", + "ExcelFileAttachedMessage": "Excel dosyası bu e-postaya eklenmiştir.", + "EntityChangeExportCompletedSubject": "Entity değişiklik dışa aktarma tamamlandı", + "AuditLogExportCompletedSubject": "İşlem log dışa aktarma tamamlandı", + "DownloadLinkExplanation": "Dosyayı aşağıdaki bağlantıyı kullanarak {0} (UTC) tarihine kadar indirebilirsiniz", + "DownloadNow": "Şimdi İndir", + "TryAgainMessage": "Lütfen tekrar deneyin. Sorun devam ederse, lütfen destek ekibiyle iletişime geçin." } } 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 933593c168..ad4f040a96 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 @@ -82,6 +82,9 @@ "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.", - "TenantId": "ID người thuê" + "TenantId": "ID người thuê", + "DownloadLinkExplanation": "Bạn có thể tải xuống tệp bằng liên kết bên dưới cho đến {0} (UTC)", + "DownloadNow": "Tải xuống ngay", + "TryAgainMessage": "Vui lòng thử lại. Nếu sự cố vẫn tiếp diễn, vui lòng liên hệ bộ phận hỗ trợ." } } \ 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 dc9cc4d667..4b3d61f2a3 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 @@ -80,8 +80,38 @@ "StartDate": "开始日期", "EndDate": "结束日期", "Feature:AuditLoggingGroup": "审计日志", - "Feature:AuditLoggingEnable": "启用审计记录页面", + "Feature:AuditLoggingEnable": "启用审计日志页面", "Feature:AuditLoggingEnableDescription": "在应用程序中启用审计日志页面。", - "TenantId": "租户 ID" + "Feature:AuditLoggingSettingManagementEnable": "启用审计日志设置管理", + "Feature:AuditLoggingSettingManagementEnableDescription": "在应用程序中启用审计日志设置管理的配置。", + "InvalidAuditLogDeletionSettings": "无效的审计日志删除设置。如果启用删除,期间应大于0天。", + "AuditLogSettingsGeneral": "常规", + "AuditLogSettingsGlobal": "全局", + "DisplayName:IsPeriodicDeleterEnabled": "启用系统范围的清理服务", + "Description:IsPeriodicDeleterEnabled": "如果禁用此选项,定期删除器将不工作。审计日志不会自动删除。", + "DisplayName:GlobalIsExpiredDeleterEnabled": "为所有租户和主机启用清理服务", + "Description:GlobalIsExpiredDeleterEnabled": "如果启用此选项,所有租户和主机的过期项目将自动删除,除非有特定设置。", + "DisplayName:IsExpiredDeleterEnabled": "启用清理服务", + "Description:IsExpiredDeleterEnabled": "如果启用此选项,过期项目将自动删除。", + "DisplayName:ExpiredDeleterPeriod": "过期项目删除期间", + "Description:ExpiredDeleterPeriod": "设置过期项目自动删除的天数。", + "ExpiredDeleterPeriodUnit": "天", + "AuditLogsBeforeXWillBeDeleted": "{0}之前的审计日志将被删除。", + "TenantId": "租户ID", + "Permission:Export": "导出审计日志", + "ExportToExcel": "导出到Excel", + "Exporting": "导出中", + "ExportCompleted": "导出成功完成", + "ExportFailed": "导出失败", + "ExportJobQueued": "导出作业已为{0}条记录排队。导出完成后您将收到电子邮件。", + "ExportReady": "{0}条记录的导出已完成,可以下载。", + "FileName": "文件名", + "TotalRecords": "总记录数", + "ExcelFileAttachedMessage": "Excel文件已附加到此电子邮件。", + "EntityChangeExportCompletedSubject": "实体变更导出已完成", + "AuditLogExportCompletedSubject": "审计日志导出已完成", + "DownloadLinkExplanation": "您可以使用下面的链接下载文件,直到{0}(UTC)", + "DownloadNow": "立即下载", + "TryAgainMessage": "请再试一次。如果问题仍然存在,请联系支持人员。" } } \ 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 dc0275186d..00e9cc4c08 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 @@ -79,9 +79,39 @@ "DurationMs": "持續時間(毫秒)", "StartDate": "開始時間", "EndDate": "結束時間", - "Feature:AuditLoggingGroup": "審計日誌", - "Feature:AuditLoggingEnable": "啟用審計日誌頁面", - "Feature:AuditLoggingEnableDescription": "在應用程序中啟用審計日誌頁面.", - "TenantId": "租戶 ID" + "Feature:AuditLoggingGroup": "稽核日誌", + "Feature:AuditLoggingEnable": "啟用稽核日誌頁面", + "Feature:AuditLoggingEnableDescription": "在應用程式中啟用稽核日誌頁面。", + "Feature:AuditLoggingSettingManagementEnable": "啟用稽核日誌設定管理", + "Feature:AuditLoggingSettingManagementEnableDescription": "在應用程式中啟用稽核日誌設定管理的配置。", + "InvalidAuditLogDeletionSettings": "無效的稽核日誌刪除設定。如果啟用刪除,期間應大於0天。", + "AuditLogSettingsGeneral": "一般", + "AuditLogSettingsGlobal": "全域", + "DisplayName:IsPeriodicDeleterEnabled": "啟用系統範圍的清理服務", + "Description:IsPeriodicDeleterEnabled": "如果停用此選項,定期刪除器將不工作。稽核日誌不會自動刪除。", + "DisplayName:GlobalIsExpiredDeleterEnabled": "為所有租戶和主機啟用清理服務", + "Description:GlobalIsExpiredDeleterEnabled": "如果啟用此選項,所有租戶和主機的過期項目將自動刪除,除非有特定設定。", + "DisplayName:IsExpiredDeleterEnabled": "啟用清理服務", + "Description:IsExpiredDeleterEnabled": "如果啟用此選項,過期項目將自動刪除。", + "DisplayName:ExpiredDeleterPeriod": "過期項目刪除期間", + "Description:ExpiredDeleterPeriod": "設定過期項目自動刪除的天數。", + "ExpiredDeleterPeriodUnit": "天", + "AuditLogsBeforeXWillBeDeleted": "{0}之前的稽核日誌將被刪除。", + "TenantId": "租戶ID", + "Permission:Export": "匯出稽核日誌", + "ExportToExcel": "匯出到Excel", + "Exporting": "匯出中", + "ExportCompleted": "匯出成功完成", + "ExportFailed": "匯出失敗", + "ExportJobQueued": "匯出作業已為{0}條記錄排隊。匯出完成後您將收到電子郵件。", + "ExportReady": "{0}條記錄的匯出已完成,可以下載。", + "FileName": "檔案名稱", + "TotalRecords": "總記錄數", + "ExcelFileAttachedMessage": "Excel檔案已附加到此電子郵件。", + "EntityChangeExportCompletedSubject": "實體變更匯出已完成", + "AuditLogExportCompletedSubject": "稽核日誌匯出已完成", + "DownloadLinkExplanation": "您可以使用下面的連結下載檔案,直到{0}(UTC)", + "DownloadNow": "立即下載", + "TryAgainMessage": "請再試一次。如果問題仍然存在,請聯絡支援人員。" } } \ No newline at end of file diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain/Volo/Abp/AuditLogging/AuditLogExcelFile.cs b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain/Volo/Abp/AuditLogging/AuditLogExcelFile.cs new file mode 100644 index 0000000000..ed2e99db4c --- /dev/null +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain/Volo/Abp/AuditLogging/AuditLogExcelFile.cs @@ -0,0 +1,27 @@ +using System; +using Volo.Abp.Domain.Entities.Auditing; +using Volo.Abp.MultiTenancy; + +namespace Volo.Abp.AuditLogging; + +public class AuditLogExcelFile : CreationAuditedEntity, IMultiTenant +{ + public virtual Guid? TenantId { get; protected set; } + + public virtual string FileName { get; protected set; } + + protected AuditLogExcelFile() + { + } + + public AuditLogExcelFile( + Guid id, + string fileName, + Guid? tenantId = null, + Guid? creatorId = null) : base(id) + { + FileName = Check.NotNullOrWhiteSpace(fileName, nameof(fileName), AuditLogExcelFileConsts.MaxFileNameLength); + TenantId = tenantId; + CreatorId = creatorId; + } +} \ No newline at end of file diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain/Volo/Abp/AuditLogging/IAuditLogExcelFileRepository.cs b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain/Volo/Abp/AuditLogging/IAuditLogExcelFileRepository.cs new file mode 100644 index 0000000000..b29ec07684 --- /dev/null +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain/Volo/Abp/AuditLogging/IAuditLogExcelFileRepository.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using Volo.Abp.Domain.Repositories; + +namespace Volo.Abp.AuditLogging; + +public interface IAuditLogExcelFileRepository : IRepository +{ + Task> GetListCreationTimeBeforeAsync( + DateTime creationTimeBefore, + int maxResultCount = 50, + CancellationToken cancellationToken = default); +} \ No newline at end of file diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.EntityFrameworkCore/Volo/Abp/AuditLogging/EntityFrameworkCore/AbpAuditLoggingDbContext.cs b/modules/audit-logging/src/Volo.Abp.AuditLogging.EntityFrameworkCore/Volo/Abp/AuditLogging/EntityFrameworkCore/AbpAuditLoggingDbContext.cs index b0e4eee5ba..16f6ac5603 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.EntityFrameworkCore/Volo/Abp/AuditLogging/EntityFrameworkCore/AbpAuditLoggingDbContext.cs +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.EntityFrameworkCore/Volo/Abp/AuditLogging/EntityFrameworkCore/AbpAuditLoggingDbContext.cs @@ -9,6 +9,8 @@ public class AbpAuditLoggingDbContext : AbpDbContext, { public DbSet AuditLogs { get; set; } + public DbSet AuditLogExcelFiles { get; set; } + public AbpAuditLoggingDbContext(DbContextOptions options) : base(options) { diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.EntityFrameworkCore/Volo/Abp/AuditLogging/EntityFrameworkCore/AbpAuditLoggingDbContextModelBuilderExtensions.cs b/modules/audit-logging/src/Volo.Abp.AuditLogging.EntityFrameworkCore/Volo/Abp/AuditLogging/EntityFrameworkCore/AbpAuditLoggingDbContextModelBuilderExtensions.cs index e63d806993..da73060c8e 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.EntityFrameworkCore/Volo/Abp/AuditLogging/EntityFrameworkCore/AbpAuditLoggingDbContextModelBuilderExtensions.cs +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.EntityFrameworkCore/Volo/Abp/AuditLogging/EntityFrameworkCore/AbpAuditLoggingDbContextModelBuilderExtensions.cs @@ -103,6 +103,13 @@ public static class AbpAuditLoggingDbContextModelBuilderExtensions b.ApplyObjectExtensionMappings(); }); + builder.Entity(b => + { + b.ToTable(AbpAuditLoggingDbProperties.DbTablePrefix + "AuditLogExcelFiles", AbpAuditLoggingDbProperties.DbSchema); + b.ConfigureByConvention(); + b.Property(x => x.FileName).HasMaxLength(AuditLogExcelFileConsts.MaxFileNameLength).HasColumnName(nameof(AuditLogExcelFile.FileName)); + }); + builder.TryConfigureObjectExtensions(); } } diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.EntityFrameworkCore/Volo/Abp/AuditLogging/EntityFrameworkCore/AbpAuditLoggingEntityFrameworkCoreModule.cs b/modules/audit-logging/src/Volo.Abp.AuditLogging.EntityFrameworkCore/Volo/Abp/AuditLogging/EntityFrameworkCore/AbpAuditLoggingEntityFrameworkCoreModule.cs index d413994f87..28d1436088 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.EntityFrameworkCore/Volo/Abp/AuditLogging/EntityFrameworkCore/AbpAuditLoggingEntityFrameworkCoreModule.cs +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.EntityFrameworkCore/Volo/Abp/AuditLogging/EntityFrameworkCore/AbpAuditLoggingEntityFrameworkCoreModule.cs @@ -13,6 +13,7 @@ public class AbpAuditLoggingEntityFrameworkCoreModule : AbpModule context.Services.AddAbpDbContext(options => { options.AddRepository(); + options.AddRepository(); }); } } diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.EntityFrameworkCore/Volo/Abp/AuditLogging/EntityFrameworkCore/EfCoreAuditLogExcelFileRepository.cs b/modules/audit-logging/src/Volo.Abp.AuditLogging.EntityFrameworkCore/Volo/Abp/AuditLogging/EntityFrameworkCore/EfCoreAuditLogExcelFileRepository.cs new file mode 100644 index 0000000000..d3b8cc8d7c --- /dev/null +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.EntityFrameworkCore/Volo/Abp/AuditLogging/EntityFrameworkCore/EfCoreAuditLogExcelFileRepository.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.EntityFrameworkCore; +using Volo.Abp.Domain.Repositories.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore; + +namespace Volo.Abp.AuditLogging.EntityFrameworkCore; + +public class EfCoreAuditLogExcelFileRepository : EfCoreRepository, IAuditLogExcelFileRepository +{ + public EfCoreAuditLogExcelFileRepository(IDbContextProvider dbContextProvider) : base(dbContextProvider) + { + } + + public async Task> GetListCreationTimeBeforeAsync( + DateTime creationTimeBefore, + int maxResultCount = 50, + CancellationToken cancellationToken = default) + { + var queryable = await GetQueryableAsync(); + return await queryable.Where(x => x.CreationTime < creationTimeBefore).Take(maxResultCount).ToListAsync(cancellationToken); + } +} \ No newline at end of file diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.EntityFrameworkCore/Volo/Abp/AuditLogging/EntityFrameworkCore/IAuditLoggingDbContext.cs b/modules/audit-logging/src/Volo.Abp.AuditLogging.EntityFrameworkCore/Volo/Abp/AuditLogging/EntityFrameworkCore/IAuditLoggingDbContext.cs index ca03f6b6a3..d2f47e574b 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.EntityFrameworkCore/Volo/Abp/AuditLogging/EntityFrameworkCore/IAuditLoggingDbContext.cs +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.EntityFrameworkCore/Volo/Abp/AuditLogging/EntityFrameworkCore/IAuditLoggingDbContext.cs @@ -8,4 +8,6 @@ namespace Volo.Abp.AuditLogging.EntityFrameworkCore; public interface IAuditLoggingDbContext : IEfCoreDbContext { DbSet AuditLogs { get; } + + DbSet AuditLogExcelFiles { get; } } diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.MongoDB/Volo/Abp/AuditLogging/MongoDB/AbpAuditLoggingMongoDbContextExtensions.cs b/modules/audit-logging/src/Volo.Abp.AuditLogging.MongoDB/Volo/Abp/AuditLogging/MongoDB/AbpAuditLoggingMongoDbContextExtensions.cs index b20a2b20a2..3f48b34bb2 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.MongoDB/Volo/Abp/AuditLogging/MongoDB/AbpAuditLoggingMongoDbContextExtensions.cs +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.MongoDB/Volo/Abp/AuditLogging/MongoDB/AbpAuditLoggingMongoDbContextExtensions.cs @@ -13,5 +13,10 @@ public static class AbpAuditLoggingMongoDbContextExtensions { b.CollectionName = AbpAuditLoggingDbProperties.DbTablePrefix + "AuditLogs"; }); + + builder.Entity(b => + { + b.CollectionName = AbpAuditLoggingDbProperties.DbTablePrefix + "AuditLogExcelFiles"; + }); } } diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.MongoDB/Volo/Abp/AuditLogging/MongoDB/AbpAuditLoggingMongoDbModule.cs b/modules/audit-logging/src/Volo.Abp.AuditLogging.MongoDB/Volo/Abp/AuditLogging/MongoDB/AbpAuditLoggingMongoDbModule.cs index 116df1f0f6..ab46e8d1cc 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.MongoDB/Volo/Abp/AuditLogging/MongoDB/AbpAuditLoggingMongoDbModule.cs +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.MongoDB/Volo/Abp/AuditLogging/MongoDB/AbpAuditLoggingMongoDbModule.cs @@ -13,6 +13,7 @@ public class AbpAuditLoggingMongoDbModule : AbpModule context.Services.AddMongoDbContext(options => { options.AddRepository(); + options.AddRepository(); }); } } diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.MongoDB/Volo/Abp/AuditLogging/MongoDB/AuditLoggingMongoDbContext.cs b/modules/audit-logging/src/Volo.Abp.AuditLogging.MongoDB/Volo/Abp/AuditLogging/MongoDB/AuditLoggingMongoDbContext.cs index d755029372..1d286022e1 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.MongoDB/Volo/Abp/AuditLogging/MongoDB/AuditLoggingMongoDbContext.cs +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.MongoDB/Volo/Abp/AuditLogging/MongoDB/AuditLoggingMongoDbContext.cs @@ -9,6 +9,8 @@ public class AuditLoggingMongoDbContext : AbpMongoDbContext, IAuditLoggingMongoD { public IMongoCollection AuditLogs => Collection(); + public IMongoCollection AuditLogExcelFiles => Collection(); + protected override void CreateModel(IMongoModelBuilder modelBuilder) { base.CreateModel(modelBuilder); diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.MongoDB/Volo/Abp/AuditLogging/MongoDB/IAuditLoggingMongoDbContext.cs b/modules/audit-logging/src/Volo.Abp.AuditLogging.MongoDB/Volo/Abp/AuditLogging/MongoDB/IAuditLoggingMongoDbContext.cs index 54350672ab..e11241ddb1 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.MongoDB/Volo/Abp/AuditLogging/MongoDB/IAuditLoggingMongoDbContext.cs +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.MongoDB/Volo/Abp/AuditLogging/MongoDB/IAuditLoggingMongoDbContext.cs @@ -8,4 +8,6 @@ namespace Volo.Abp.AuditLogging.MongoDB; public interface IAuditLoggingMongoDbContext : IAbpMongoDbContext { IMongoCollection AuditLogs { get; } + + IMongoCollection AuditLogExcelFiles { get; } } diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.MongoDB/Volo/Abp/AuditLogging/MongoDB/MongoAuditLogExcelFileRepository.cs b/modules/audit-logging/src/Volo.Abp.AuditLogging.MongoDB/Volo/Abp/AuditLogging/MongoDB/MongoAuditLogExcelFileRepository.cs new file mode 100644 index 0000000000..3e2ab68361 --- /dev/null +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.MongoDB/Volo/Abp/AuditLogging/MongoDB/MongoAuditLogExcelFileRepository.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using MongoDB.Driver.Linq; +using Volo.Abp.Domain.Repositories.MongoDB; +using Volo.Abp.MongoDB; + +namespace Volo.Abp.AuditLogging.MongoDB; + +public class MongoAuditLogExcelFileRepository : MongoDbRepository, IAuditLogExcelFileRepository +{ + public MongoAuditLogExcelFileRepository(IMongoDbContextProvider dbContextProvider) : base(dbContextProvider) + { + } + + public async Task> GetListCreationTimeBeforeAsync(DateTime creationTimeBefore, int maxResultCount = 50, CancellationToken cancellationToken = default) + { + var queryable = await GetQueryableAsync(); + return await queryable.Where(x => x.CreationTime < creationTimeBefore).Take(maxResultCount).ToListAsync(cancellationToken); + } +} \ No newline at end of file diff --git a/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/package.json b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/package.json index 761ce4be75..d0e6ac3931 100644 --- a/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/package.json +++ b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/package.json @@ -3,8 +3,8 @@ "name": "asp.net", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.shared": "~9.2.0-rc.4", - "@abp/prismjs": "~9.2.0-rc.4", - "@abp/highlight.js": "~9.2.0-rc.4" + "@abp/aspnetcore.mvc.ui.theme.shared": "~9.2.0", + "@abp/prismjs": "~9.2.0", + "@abp/highlight.js": "~9.2.0" } } diff --git a/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/yarn.lock b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/yarn.lock index 36daf84280..267e042944 100644 --- a/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/yarn.lock +++ b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/yarn.lock @@ -2,203 +2,203 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.shared@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-9.2.0-rc.4.tgz#4212523cc2d2db881d2a0a9c1b28f372c53c19d7" - integrity sha512-z6nCmIfcaiQ6CPHhVq0C6RYljjrqScVVj+Sf0uI8eP6qG+CVT/aEVgb+3Nc5EM5SjDvR/eTxH4J3YcVNDj32Lg== - dependencies: - "@abp/aspnetcore.mvc.ui" "~9.2.0-rc.4" - "@abp/bootstrap" "~9.2.0-rc.4" - "@abp/bootstrap-datepicker" "~9.2.0-rc.4" - "@abp/bootstrap-daterangepicker" "~9.2.0-rc.4" - "@abp/datatables.net-bs5" "~9.2.0-rc.4" - "@abp/font-awesome" "~9.2.0-rc.4" - "@abp/jquery-form" "~9.2.0-rc.4" - "@abp/jquery-validation-unobtrusive" "~9.2.0-rc.4" - "@abp/lodash" "~9.2.0-rc.4" - "@abp/luxon" "~9.2.0-rc.4" - "@abp/malihu-custom-scrollbar-plugin" "~9.2.0-rc.4" - "@abp/moment" "~9.2.0-rc.4" - "@abp/select2" "~9.2.0-rc.4" - "@abp/sweetalert2" "~9.2.0-rc.4" - "@abp/timeago" "~9.2.0-rc.4" - -"@abp/aspnetcore.mvc.ui@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-9.2.0-rc.4.tgz#a47763a480e488363b901327d94556fdad6cccb7" - integrity sha512-7fxC3zifdnpJZwKsP1hgK0+mu9y/w4zrMY1rR8AVvcpMdt8/Mmtj6mJi+Ompv3YtO9F/Zgnxqma5R0pYMTke7g== +"@abp/aspnetcore.mvc.ui.theme.shared@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-9.2.0.tgz#791f419e8e0fab229e3f93f7a90edcd259100206" + integrity sha512-Mrs+kQg0S5OyRsPBwXQTqOq2DBWDdot7emETcX/gatv26GFbRe3nTOk1E+VWD/nsxHEOKTSE8LClC6TgkMxD8Q== + dependencies: + "@abp/aspnetcore.mvc.ui" "~9.2.0" + "@abp/bootstrap" "~9.2.0" + "@abp/bootstrap-datepicker" "~9.2.0" + "@abp/bootstrap-daterangepicker" "~9.2.0" + "@abp/datatables.net-bs5" "~9.2.0" + "@abp/font-awesome" "~9.2.0" + "@abp/jquery-form" "~9.2.0" + "@abp/jquery-validation-unobtrusive" "~9.2.0" + "@abp/lodash" "~9.2.0" + "@abp/luxon" "~9.2.0" + "@abp/malihu-custom-scrollbar-plugin" "~9.2.0" + "@abp/moment" "~9.2.0" + "@abp/select2" "~9.2.0" + "@abp/sweetalert2" "~9.2.0" + "@abp/timeago" "~9.2.0" + +"@abp/aspnetcore.mvc.ui@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-9.2.0.tgz#e3e703ea46caf04cc966ea0af6deb64427a90d4c" + integrity sha512-VHH68/7Bw7r8p70T9grnVISgYPe2t3m9199S/wAXGtpGHML/lbHhDflWbm7y1MHcrmCfaXy42O9SmTHV25BJhA== dependencies: ansi-colors "^4.1.3" -"@abp/bootstrap-datepicker@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-9.2.0-rc.4.tgz#0aec67332e3148e21658650bfaaa08c64180e2ad" - integrity sha512-CaD709aGigfQk76XDshSrctm9TkgjA+7XgnDuVraPRPwq4dwXGIhbNAiJ1+5k6OXrUHqJP3nPc4NDPZiXDwgqw== +"@abp/bootstrap-datepicker@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-9.2.0.tgz#271ff68e2cee7b4ffe5a60406561a05948d6bbe6" + integrity sha512-V8o1cn1MKXE5GH1ZpBHiWWilzxjHIp4IS6rNoCDBSnaQcVvRku9KPI8tPNQSf+4x3jBfHDV9aOBDbDGTQ6J2yw== dependencies: bootstrap-datepicker "^1.10.0" -"@abp/bootstrap-daterangepicker@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-9.2.0-rc.4.tgz#b08d564b0dfc8be62a052fc205e1445764b6a2d0" - integrity sha512-zwWkb6JaUqN2rtIGLtb0Cf1RtP0nuCFK0x2r4J9kYnv1vKiT8vrK2Jl5mJVjvdnO0JifS1rueDMPglVpOeghRw== +"@abp/bootstrap-daterangepicker@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-9.2.0.tgz#a239f8c2efce57d2e2beca70ceeede52d1b177d5" + integrity sha512-Cd9naCyepTvmUotkR1VyOBqUMgyeSXnOVWR7HxXm+jugKtnWRzrztZB6UyfnNzzjc1RMOyiAUEjzitKSJrXeoA== dependencies: bootstrap-daterangepicker "^3.1.0" -"@abp/bootstrap@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-9.2.0-rc.4.tgz#0615ec9fa7422d76e8f4af22ec28fe9672d60c38" - integrity sha512-m1ORR/R84nPEfid/x5rC5jy4orsw4yhkk4nApiW11H4Eb7ssbcviR75ugJ5GBt3GOevHHlTZWwvf8K4C+zdqZg== +"@abp/bootstrap@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-9.2.0.tgz#08859288b8372ea111a240b507047b144d6caca9" + integrity sha512-L3EZQza2c/5VmvZkLsf0EOuaMi8fseyyiwlFN65i1hpcDwhOLcaqnxMneeaSJ+Dy4xczJT+oBml9D9OSTuzmkA== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" bootstrap "^5.3.3" -"@abp/clipboard@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-9.2.0-rc.4.tgz#e91e8c9b9947cef648e31f17ac8050d342a88416" - integrity sha512-iUvCQK3YJKPflLWkXNsueXit+Ipez5+R5q4OdngcvTmVXIUoH8t+3iiM+Q7ohA0vRknsdEGPMUUS7TnDW9fVqA== +"@abp/clipboard@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-9.2.0.tgz#348a0e45752c7eb055fb00af52660593ad340caf" + integrity sha512-2+wt2ShLBfoHqx0DNNevJkaz1POLcs1tcK1hL4ZqsjOnS7BrTk1r8zwNvCw1XEeH2S1rPftAWH4PvzL4j86DFA== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" clipboard "^2.0.11" -"@abp/core@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-9.2.0-rc.4.tgz#b758ea117ae3e3e3596e407a347617b8fcb6c112" - integrity sha512-eNklBpyUAort/UEhgmnvMglBS/FSAzUiKalN7hgJFKx0nd3cDDkjkN6YFY8VuPInt3YfRz5omZQsGNq7eyjtbQ== +"@abp/core@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-9.2.0.tgz#db08fd34cfc891e94eb9e59ed3c0d0e6ef45c51a" + integrity sha512-3iESoHFj8I2xK81dwQVpCI6C1bc87VfWKyJE3/IUv4zWvG4QvI0aKhe1wxocmJqTjjowPUA3/fa2hvpfqPs2Bw== dependencies: - "@abp/utils" "~9.2.0-rc.4" + "@abp/utils" "~9.2.0" -"@abp/datatables.net-bs5@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-9.2.0-rc.4.tgz#75c12fe053d593b738bb5ca7394b2954409f5e00" - integrity sha512-5FG5Jc6Co9q/1xYmmW2SabSaXVkdJohPJ9XtzTthwnY8Ko5eGV7TPkEfwwsk0PLXp+Wu3ifQaZI4CIE9WR81XA== +"@abp/datatables.net-bs5@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-9.2.0.tgz#eab201c959727c27aaab30dc5bd8159249d8b54b" + integrity sha512-bmK6GKffXzYbfkDIlN27D7mohnYsXoODEiHqhZnBdIzeSJyHwrwRPRVbO1EcBn1SEBHjGJp3S69Z6gDbRs018g== dependencies: - "@abp/datatables.net" "~9.2.0-rc.4" + "@abp/datatables.net" "~9.2.0" datatables.net-bs5 "^2.1.8" -"@abp/datatables.net@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-9.2.0-rc.4.tgz#523b017e4b9ea9d3a6d3262f66bd3daaade05c0b" - integrity sha512-udCSjJYYpi/Ql/KJZxYDMxbtX6gXw7hsfMxQjP0u37JsyNLgd4fTrzaXCe7OKn3x7poJcANoqsEgWow/9R/WIg== +"@abp/datatables.net@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-9.2.0.tgz#e4880fe074d86d3c5dbd7f48c86244790fc376c2" + integrity sha512-bKaaa+tl0Pt4oNaV+X8pBbvsHc2mPYoL7yuAs+LN8ZLwBdsGoUw7RNhLQ63O3tuYdHuaHhI/mx23X6JThr0SYw== dependencies: - "@abp/jquery" "~9.2.0-rc.4" + "@abp/jquery" "~9.2.0" datatables.net "^2.1.8" -"@abp/font-awesome@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-9.2.0-rc.4.tgz#31d9fa475af3b543ddaff16e6af8caba966bd331" - integrity sha512-FYmfrf2mX5rzU+GqK078rn85UmfAwdCB8JQhnGfkylybMRJvmocRsPBIEThjlFZAPGqqvULHUTRMwnRPTgpuNw== +"@abp/font-awesome@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-9.2.0.tgz#3e359da2510cbc0e5b9e46e9cb3664baf285722e" + integrity sha512-HRGg6XK3bCxFdVvEBnBKyLamqMUrenj//E4JuKOs8DtGLVH0jTyh8TwUT5/E/pI+POV7HEOpv9WpSB2p8pfsAg== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" "@fortawesome/fontawesome-free" "^6.6.0" -"@abp/highlight.js@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/highlight.js/-/highlight.js-9.2.0-rc.4.tgz#34b5e4ac1c340b6da27a3f9f2c9d565f08a69438" - integrity sha512-Rwn6YUIbty5LuDm0PH5OM0j7Vk4OrZgWncgsubSekc/r8fh/ry6spoxdjuBB/AjwM8ZlJ0DWMQLw51K6Y18z7A== +"@abp/highlight.js@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/highlight.js/-/highlight.js-9.2.0.tgz#85ac7c252aee377c2ff9e15153c692fdea5cb96d" + integrity sha512-zD6UVZNUQEJ22ynqQs14jR8eBWQR7loOCpt9lPlIjXF6tnoBvcc7NBeBFw9ehKjkG2cegJCmahYb4cFnlJFigA== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" "@highlightjs/cdn-assets" "~11.10.0" -"@abp/jquery-form@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-9.2.0-rc.4.tgz#b200be90031b58305a2ebfd646ffbd5ce4cca40c" - integrity sha512-ohCtIfz48E0+vNdNyKTsLlfW0NYMJfKWXd9BPp2szgBaDbC7jYdGYyABbxGxRc7mp1B8xQzRhLnTzdRtWaJemg== +"@abp/jquery-form@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-9.2.0.tgz#40fac992584c26e6c54f66e7f68f8abf8944a626" + integrity sha512-B7Shq1itQjsnzdU1kjLpGHWjkSGFhIM2iF5BNMkqcylG3Yq1Se4+8QPoJpn/soilmtX8gbO2fx8TOejfIazXIw== dependencies: - "@abp/jquery" "~9.2.0-rc.4" + "@abp/jquery" "~9.2.0" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-9.2.0-rc.4.tgz#0329f9268b83e0832e26ea3f6523dbc5226b9114" - integrity sha512-iOnw5YoiC3bCIFRjuXPagz+ixFV+PM36hP0UJ4x03BK6GDJnAvjLshYe6qnQG9Xnz1arzmIX5ud5EjWvWSBIoA== +"@abp/jquery-validation-unobtrusive@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-9.2.0.tgz#c2df51d024d48e71f0e7fb8d4207a8b2855393f4" + integrity sha512-c1cPfWVdo+gpaMoegAkw0DzGL2fy/1ylEi/shb95MAGt3iyECVx+X+R/XOxbVHKVI57D4d5IGj6cXYBhdKkvAw== dependencies: - "@abp/jquery-validation" "~9.2.0-rc.4" + "@abp/jquery-validation" "~9.2.0" jquery-validation-unobtrusive "^4.0.0" -"@abp/jquery-validation@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-9.2.0-rc.4.tgz#073e4cbf905f652ce83633b98696b559916b984d" - integrity sha512-pS2Y2c6gXFOzfKeM2/JlW56ZmrUeflT2av64aWrFYnv7IgJUp38PEjR10uPy3g/mP2c9jis8dOfkdbRrlHwf+g== +"@abp/jquery-validation@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-9.2.0.tgz#97688d2e3c25699d4368ebf7234e04943aa5e6ab" + integrity sha512-UO+T6SqXBrh0ODwvMm840CGbE2fdYNo5oqJL4V4JbHv9uz7MH+k0bB1DK7mFb94iDM7QcglLzIfcN4hLRV7arw== dependencies: - "@abp/jquery" "~9.2.0-rc.4" + "@abp/jquery" "~9.2.0" jquery-validation "^1.21.0" -"@abp/jquery@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-9.2.0-rc.4.tgz#ac8a6ce969d58cc4f05d33adcfad76e7442231e8" - integrity sha512-N5hZ8VGXJUn5QW1mSXHIO7SjdvoyrkCyH5j8DhXJO1mDlS1L36n+MJHFwQK7UZpHcFOuklAJ7f417r3sISOBCw== +"@abp/jquery@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-9.2.0.tgz#38c249be6eda0cdc899cc8a1f20e5152c39ae9a0" + integrity sha512-sIe3Zk+8549ytydCtDlECZ930PapW/2J0652two/sJwYG/SGUGxYQbw3QnJGFTcL9TFwcWwRj5iWX0gWrLEIyA== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" jquery "~3.7.1" -"@abp/lodash@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-9.2.0-rc.4.tgz#e428df195ed90414a9a412e1dcb6494344475f82" - integrity sha512-WsbyBNA57/giyI5pnM7Y7dk0p56hMDS5OMdmNilaGOWMnvz7mMTJNvStMBqS7fqekzfXsFGfrLbTmehY3pTYwQ== +"@abp/lodash@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-9.2.0.tgz#7fa4c9e956c766e34ec4677d2102a6d00f899a4b" + integrity sha512-2elXj/eWw875tF9ixbOm3uqXCxGaG5gL9Tub5k7cP+XhFpNBOYijNaXdN8SeDSxr83WDVWdrk//OQL8BF7XPdw== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" lodash "^4.17.21" -"@abp/luxon@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-9.2.0-rc.4.tgz#dacb173d24987a1ab4fb7e53dff9f91728a1efaa" - integrity sha512-qNuYml25Q2ODzZ830FhijGY66WvAUa02mB9hgulpFlF0p2UiFmhA0dMNVahEuytoFodjkSrhLP6cGfONf7ht8A== +"@abp/luxon@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-9.2.0.tgz#865db7b60dba4029134fb4a4b5eaa08c723dcea8" + integrity sha512-LWjczvzu1gFIq0/2fRz+bJW2+zsmXAmfz0I+lZ3wmqUdkViqAqwTa+5NMIl2tC92u4Dv3LGXKtH37Jw8m+XjTg== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" luxon "^3.5.0" -"@abp/malihu-custom-scrollbar-plugin@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-9.2.0-rc.4.tgz#9b0c0444ec8f11c8c8040387f83080e51a281657" - integrity sha512-cvYJI/4jkzOWSvTY0C/PxSq62SxEq3UlaXpefj/W+CAwPVjG+Yik2YHt5qgcmRRn0oF5V/XRJHB7A4H23+VKyA== +"@abp/malihu-custom-scrollbar-plugin@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-9.2.0.tgz#09722b1e7ca34b96e2a68368db0e96cdf9ab0e6c" + integrity sha512-kfDf/1RwGtAlos/7BW+7xbh3LtJ4VG0Z4mxS+b2HsywAwlt/kE5FltfBj2ResQb030bsGNl7A5JglV9Pv1UlPw== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/moment@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-9.2.0-rc.4.tgz#527ed54f4330a77ec2ea1411bfffe2d57e62d172" - integrity sha512-zIRTuMCcPAfJAU64DUeU7dJPUJqoyJ7TvHBhrUcmmGZK7IzNtaP3/KAGjZIHhHbUwIjidjCxlF2YnW1io7hcJg== +"@abp/moment@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-9.2.0.tgz#137d688af4df195742061ac2b8a2bf460a027071" + integrity sha512-15aTjYAxHK+upkiZ94XCe8CoSPKMl1D8f6GXJIfwPkuYZ+na4ma17qBu4P8bFsc4gu3ngxYiLHRSzYzr4oCSYQ== dependencies: moment "^2.30.1" -"@abp/prismjs@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-9.2.0-rc.4.tgz#5164e64fa04d2a852043e1f7d02952d54112748a" - integrity sha512-fUCqWhmmRMu5DgpDxyH7uyEHS6lCFk+BY+JuS22sTvyhu+Q9M4rYhFEl/E9S+cA2rfxSNAG5h7HPXUWTqHPLgg== +"@abp/prismjs@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-9.2.0.tgz#03fca8cd2f4bdc09a68bd9b1fcdeaede56f96542" + integrity sha512-OUbjaxeXKxmrR9fZe/wazS9hGrYXYam/CypnQNTVaNNgSpwvgoKoCFCll9SJUGV8tXA6iEpVdszMGyRY5Hov+g== dependencies: - "@abp/clipboard" "~9.2.0-rc.4" - "@abp/core" "~9.2.0-rc.4" + "@abp/clipboard" "~9.2.0" + "@abp/core" "~9.2.0" prismjs "^1.29.0" -"@abp/select2@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-9.2.0-rc.4.tgz#6a8c6347ec75fcf60d76bc50ecca8008253fc7c7" - integrity sha512-OMyXr+gYMM81CQliqDVnEGsK2/WbmC4N5IZ1ZSJl+mW7cUClmyg9CLg418ID/7OU+ItUwbw9YvG4RPwnGF1ujw== +"@abp/select2@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-9.2.0.tgz#c96d869be0d3298ed7c0888288ea9829e6266cd4" + integrity sha512-V+qx9hw3oe7o0WbG03ZgAjbqRJPVuedzrdy7ExEdueTc6LRP/WEgbVpXhsNISObtouE6Dadwp3iXYSExgNUC6A== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" select2 "^4.0.13" -"@abp/sweetalert2@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-9.2.0-rc.4.tgz#26d4e9c935f20a7e0bde23327c6761fe6466cd41" - integrity sha512-zhwnA0WpkNO6JuqbBgO6PQ817wuThw6mtGcP96V1m/xtckJWNDub1gby0gJqnWqnq5Cuj4u9gPRkkcVmfPn8ZA== +"@abp/sweetalert2@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-9.2.0.tgz#826d6dd0b70c35a7401cc884fb1e82af99a0305d" + integrity sha512-0r338ayjaL9uzmLKE8oHpcMgJeVgVoMYfhQAPINeQHv1TPXuYCLo0aoRNoLsfmUo3ayYBBa3zOrugFIVis7Q6A== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" sweetalert2 "^11.14.1" -"@abp/timeago@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-9.2.0-rc.4.tgz#494b25062f14f8a139ed66958991d34fcf4023a3" - integrity sha512-6HoEkdQCYDxrEGSjxHXN2Vj5ipc3rIXTbCqj7dYI9K5tuaQ4Wq0Obz/Wx6UZ71ZjzGAeAQkDeXVc68GjQyLX6Q== +"@abp/timeago@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-9.2.0.tgz#79bbe6dd32b0ee7df2e8ebd05274a0ecc7882ba7" + integrity sha512-hEUi5re5N1YkDSpaUaUtXF1Mz4YyiEvNzVADbKRz11kbR4ZAFzcvVqsQLeNo7qnuFLfJNAtuzyjkuxwL75kmaA== dependencies: - "@abp/jquery" "~9.2.0-rc.4" + "@abp/jquery" "~9.2.0" timeago "^1.6.7" -"@abp/utils@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-9.2.0-rc.4.tgz#350eb915af78ecdbc2a0a15a1ad4bac4212cefc2" - integrity sha512-PZzfkiq6sthX5+Icw7h3HVpnDVgN7ZnmOnIyzKhBeHALpH+JfO7QruwJl96Moba4LGmzPdFdLkwm2qznVoqyZA== +"@abp/utils@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-9.2.0.tgz#bf32ced1175e45fbe010c3cb806c7cd37f85089c" + integrity sha512-aciBuXhzlaqe+o7mNt536bCk425cmxY5BE0wwl13u3pX3LfWYWLEgwl8GS0aeI11TS1/7+1N85RJELyz/+y0hQ== dependencies: just-compare "^2.3.0" diff --git a/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/package.json b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/package.json index 16a8f597fc..63f441f6f3 100644 --- a/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/package.json +++ b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/package.json @@ -3,8 +3,8 @@ "name": "asp.net", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "~9.2.0-rc.4", - "@abp/prismjs": "~9.2.0-rc.4" + "@abp/aspnetcore.mvc.ui.theme.basic": "~9.2.0", + "@abp/prismjs": "~9.2.0" }, "devDependencies": {} } diff --git a/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/yarn.lock b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/yarn.lock index 112d32cf1e..e2f54a2f6b 100644 --- a/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/yarn.lock +++ b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/yarn.lock @@ -2,202 +2,202 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-9.2.0-rc.4.tgz#2659ec541028ec6a1688b748414fb181924f1f58" - integrity sha512-KSpfnvgRPxDb9oJWBnjpFm/FcXSTRO6aAVBlCERi4jtGzp04e//3rHnOWjv+JyxJqOP0JszWSALXK4A/oMQFNQ== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~9.2.0-rc.4" - -"@abp/aspnetcore.mvc.ui.theme.shared@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-9.2.0-rc.4.tgz#4212523cc2d2db881d2a0a9c1b28f372c53c19d7" - integrity sha512-z6nCmIfcaiQ6CPHhVq0C6RYljjrqScVVj+Sf0uI8eP6qG+CVT/aEVgb+3Nc5EM5SjDvR/eTxH4J3YcVNDj32Lg== - dependencies: - "@abp/aspnetcore.mvc.ui" "~9.2.0-rc.4" - "@abp/bootstrap" "~9.2.0-rc.4" - "@abp/bootstrap-datepicker" "~9.2.0-rc.4" - "@abp/bootstrap-daterangepicker" "~9.2.0-rc.4" - "@abp/datatables.net-bs5" "~9.2.0-rc.4" - "@abp/font-awesome" "~9.2.0-rc.4" - "@abp/jquery-form" "~9.2.0-rc.4" - "@abp/jquery-validation-unobtrusive" "~9.2.0-rc.4" - "@abp/lodash" "~9.2.0-rc.4" - "@abp/luxon" "~9.2.0-rc.4" - "@abp/malihu-custom-scrollbar-plugin" "~9.2.0-rc.4" - "@abp/moment" "~9.2.0-rc.4" - "@abp/select2" "~9.2.0-rc.4" - "@abp/sweetalert2" "~9.2.0-rc.4" - "@abp/timeago" "~9.2.0-rc.4" - -"@abp/aspnetcore.mvc.ui@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-9.2.0-rc.4.tgz#a47763a480e488363b901327d94556fdad6cccb7" - integrity sha512-7fxC3zifdnpJZwKsP1hgK0+mu9y/w4zrMY1rR8AVvcpMdt8/Mmtj6mJi+Ompv3YtO9F/Zgnxqma5R0pYMTke7g== +"@abp/aspnetcore.mvc.ui.theme.basic@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-9.2.0.tgz#af6ff5071cadb480b4aece0f15400d56b105a350" + integrity sha512-+LOmhSfsua7i3VQy9vYTDv7nE0fdIA+kNvorQ4wkkRzijOAlwmS4fkupglwOKJQSCWGAM7VXccPy2NzdmwvEtw== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~9.2.0" + +"@abp/aspnetcore.mvc.ui.theme.shared@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-9.2.0.tgz#791f419e8e0fab229e3f93f7a90edcd259100206" + integrity sha512-Mrs+kQg0S5OyRsPBwXQTqOq2DBWDdot7emETcX/gatv26GFbRe3nTOk1E+VWD/nsxHEOKTSE8LClC6TgkMxD8Q== + dependencies: + "@abp/aspnetcore.mvc.ui" "~9.2.0" + "@abp/bootstrap" "~9.2.0" + "@abp/bootstrap-datepicker" "~9.2.0" + "@abp/bootstrap-daterangepicker" "~9.2.0" + "@abp/datatables.net-bs5" "~9.2.0" + "@abp/font-awesome" "~9.2.0" + "@abp/jquery-form" "~9.2.0" + "@abp/jquery-validation-unobtrusive" "~9.2.0" + "@abp/lodash" "~9.2.0" + "@abp/luxon" "~9.2.0" + "@abp/malihu-custom-scrollbar-plugin" "~9.2.0" + "@abp/moment" "~9.2.0" + "@abp/select2" "~9.2.0" + "@abp/sweetalert2" "~9.2.0" + "@abp/timeago" "~9.2.0" + +"@abp/aspnetcore.mvc.ui@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-9.2.0.tgz#e3e703ea46caf04cc966ea0af6deb64427a90d4c" + integrity sha512-VHH68/7Bw7r8p70T9grnVISgYPe2t3m9199S/wAXGtpGHML/lbHhDflWbm7y1MHcrmCfaXy42O9SmTHV25BJhA== dependencies: ansi-colors "^4.1.3" -"@abp/bootstrap-datepicker@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-9.2.0-rc.4.tgz#0aec67332e3148e21658650bfaaa08c64180e2ad" - integrity sha512-CaD709aGigfQk76XDshSrctm9TkgjA+7XgnDuVraPRPwq4dwXGIhbNAiJ1+5k6OXrUHqJP3nPc4NDPZiXDwgqw== +"@abp/bootstrap-datepicker@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-9.2.0.tgz#271ff68e2cee7b4ffe5a60406561a05948d6bbe6" + integrity sha512-V8o1cn1MKXE5GH1ZpBHiWWilzxjHIp4IS6rNoCDBSnaQcVvRku9KPI8tPNQSf+4x3jBfHDV9aOBDbDGTQ6J2yw== dependencies: bootstrap-datepicker "^1.10.0" -"@abp/bootstrap-daterangepicker@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-9.2.0-rc.4.tgz#b08d564b0dfc8be62a052fc205e1445764b6a2d0" - integrity sha512-zwWkb6JaUqN2rtIGLtb0Cf1RtP0nuCFK0x2r4J9kYnv1vKiT8vrK2Jl5mJVjvdnO0JifS1rueDMPglVpOeghRw== +"@abp/bootstrap-daterangepicker@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-9.2.0.tgz#a239f8c2efce57d2e2beca70ceeede52d1b177d5" + integrity sha512-Cd9naCyepTvmUotkR1VyOBqUMgyeSXnOVWR7HxXm+jugKtnWRzrztZB6UyfnNzzjc1RMOyiAUEjzitKSJrXeoA== dependencies: bootstrap-daterangepicker "^3.1.0" -"@abp/bootstrap@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-9.2.0-rc.4.tgz#0615ec9fa7422d76e8f4af22ec28fe9672d60c38" - integrity sha512-m1ORR/R84nPEfid/x5rC5jy4orsw4yhkk4nApiW11H4Eb7ssbcviR75ugJ5GBt3GOevHHlTZWwvf8K4C+zdqZg== +"@abp/bootstrap@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-9.2.0.tgz#08859288b8372ea111a240b507047b144d6caca9" + integrity sha512-L3EZQza2c/5VmvZkLsf0EOuaMi8fseyyiwlFN65i1hpcDwhOLcaqnxMneeaSJ+Dy4xczJT+oBml9D9OSTuzmkA== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" bootstrap "^5.3.3" -"@abp/clipboard@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-9.2.0-rc.4.tgz#e91e8c9b9947cef648e31f17ac8050d342a88416" - integrity sha512-iUvCQK3YJKPflLWkXNsueXit+Ipez5+R5q4OdngcvTmVXIUoH8t+3iiM+Q7ohA0vRknsdEGPMUUS7TnDW9fVqA== +"@abp/clipboard@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-9.2.0.tgz#348a0e45752c7eb055fb00af52660593ad340caf" + integrity sha512-2+wt2ShLBfoHqx0DNNevJkaz1POLcs1tcK1hL4ZqsjOnS7BrTk1r8zwNvCw1XEeH2S1rPftAWH4PvzL4j86DFA== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" clipboard "^2.0.11" -"@abp/core@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-9.2.0-rc.4.tgz#b758ea117ae3e3e3596e407a347617b8fcb6c112" - integrity sha512-eNklBpyUAort/UEhgmnvMglBS/FSAzUiKalN7hgJFKx0nd3cDDkjkN6YFY8VuPInt3YfRz5omZQsGNq7eyjtbQ== +"@abp/core@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-9.2.0.tgz#db08fd34cfc891e94eb9e59ed3c0d0e6ef45c51a" + integrity sha512-3iESoHFj8I2xK81dwQVpCI6C1bc87VfWKyJE3/IUv4zWvG4QvI0aKhe1wxocmJqTjjowPUA3/fa2hvpfqPs2Bw== dependencies: - "@abp/utils" "~9.2.0-rc.4" + "@abp/utils" "~9.2.0" -"@abp/datatables.net-bs5@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-9.2.0-rc.4.tgz#75c12fe053d593b738bb5ca7394b2954409f5e00" - integrity sha512-5FG5Jc6Co9q/1xYmmW2SabSaXVkdJohPJ9XtzTthwnY8Ko5eGV7TPkEfwwsk0PLXp+Wu3ifQaZI4CIE9WR81XA== +"@abp/datatables.net-bs5@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-9.2.0.tgz#eab201c959727c27aaab30dc5bd8159249d8b54b" + integrity sha512-bmK6GKffXzYbfkDIlN27D7mohnYsXoODEiHqhZnBdIzeSJyHwrwRPRVbO1EcBn1SEBHjGJp3S69Z6gDbRs018g== dependencies: - "@abp/datatables.net" "~9.2.0-rc.4" + "@abp/datatables.net" "~9.2.0" datatables.net-bs5 "^2.1.8" -"@abp/datatables.net@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-9.2.0-rc.4.tgz#523b017e4b9ea9d3a6d3262f66bd3daaade05c0b" - integrity sha512-udCSjJYYpi/Ql/KJZxYDMxbtX6gXw7hsfMxQjP0u37JsyNLgd4fTrzaXCe7OKn3x7poJcANoqsEgWow/9R/WIg== +"@abp/datatables.net@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-9.2.0.tgz#e4880fe074d86d3c5dbd7f48c86244790fc376c2" + integrity sha512-bKaaa+tl0Pt4oNaV+X8pBbvsHc2mPYoL7yuAs+LN8ZLwBdsGoUw7RNhLQ63O3tuYdHuaHhI/mx23X6JThr0SYw== dependencies: - "@abp/jquery" "~9.2.0-rc.4" + "@abp/jquery" "~9.2.0" datatables.net "^2.1.8" -"@abp/font-awesome@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-9.2.0-rc.4.tgz#31d9fa475af3b543ddaff16e6af8caba966bd331" - integrity sha512-FYmfrf2mX5rzU+GqK078rn85UmfAwdCB8JQhnGfkylybMRJvmocRsPBIEThjlFZAPGqqvULHUTRMwnRPTgpuNw== +"@abp/font-awesome@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-9.2.0.tgz#3e359da2510cbc0e5b9e46e9cb3664baf285722e" + integrity sha512-HRGg6XK3bCxFdVvEBnBKyLamqMUrenj//E4JuKOs8DtGLVH0jTyh8TwUT5/E/pI+POV7HEOpv9WpSB2p8pfsAg== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" "@fortawesome/fontawesome-free" "^6.6.0" -"@abp/jquery-form@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-9.2.0-rc.4.tgz#b200be90031b58305a2ebfd646ffbd5ce4cca40c" - integrity sha512-ohCtIfz48E0+vNdNyKTsLlfW0NYMJfKWXd9BPp2szgBaDbC7jYdGYyABbxGxRc7mp1B8xQzRhLnTzdRtWaJemg== +"@abp/jquery-form@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-9.2.0.tgz#40fac992584c26e6c54f66e7f68f8abf8944a626" + integrity sha512-B7Shq1itQjsnzdU1kjLpGHWjkSGFhIM2iF5BNMkqcylG3Yq1Se4+8QPoJpn/soilmtX8gbO2fx8TOejfIazXIw== dependencies: - "@abp/jquery" "~9.2.0-rc.4" + "@abp/jquery" "~9.2.0" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-9.2.0-rc.4.tgz#0329f9268b83e0832e26ea3f6523dbc5226b9114" - integrity sha512-iOnw5YoiC3bCIFRjuXPagz+ixFV+PM36hP0UJ4x03BK6GDJnAvjLshYe6qnQG9Xnz1arzmIX5ud5EjWvWSBIoA== +"@abp/jquery-validation-unobtrusive@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-9.2.0.tgz#c2df51d024d48e71f0e7fb8d4207a8b2855393f4" + integrity sha512-c1cPfWVdo+gpaMoegAkw0DzGL2fy/1ylEi/shb95MAGt3iyECVx+X+R/XOxbVHKVI57D4d5IGj6cXYBhdKkvAw== dependencies: - "@abp/jquery-validation" "~9.2.0-rc.4" + "@abp/jquery-validation" "~9.2.0" jquery-validation-unobtrusive "^4.0.0" -"@abp/jquery-validation@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-9.2.0-rc.4.tgz#073e4cbf905f652ce83633b98696b559916b984d" - integrity sha512-pS2Y2c6gXFOzfKeM2/JlW56ZmrUeflT2av64aWrFYnv7IgJUp38PEjR10uPy3g/mP2c9jis8dOfkdbRrlHwf+g== +"@abp/jquery-validation@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-9.2.0.tgz#97688d2e3c25699d4368ebf7234e04943aa5e6ab" + integrity sha512-UO+T6SqXBrh0ODwvMm840CGbE2fdYNo5oqJL4V4JbHv9uz7MH+k0bB1DK7mFb94iDM7QcglLzIfcN4hLRV7arw== dependencies: - "@abp/jquery" "~9.2.0-rc.4" + "@abp/jquery" "~9.2.0" jquery-validation "^1.21.0" -"@abp/jquery@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-9.2.0-rc.4.tgz#ac8a6ce969d58cc4f05d33adcfad76e7442231e8" - integrity sha512-N5hZ8VGXJUn5QW1mSXHIO7SjdvoyrkCyH5j8DhXJO1mDlS1L36n+MJHFwQK7UZpHcFOuklAJ7f417r3sISOBCw== +"@abp/jquery@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-9.2.0.tgz#38c249be6eda0cdc899cc8a1f20e5152c39ae9a0" + integrity sha512-sIe3Zk+8549ytydCtDlECZ930PapW/2J0652two/sJwYG/SGUGxYQbw3QnJGFTcL9TFwcWwRj5iWX0gWrLEIyA== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" jquery "~3.7.1" -"@abp/lodash@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-9.2.0-rc.4.tgz#e428df195ed90414a9a412e1dcb6494344475f82" - integrity sha512-WsbyBNA57/giyI5pnM7Y7dk0p56hMDS5OMdmNilaGOWMnvz7mMTJNvStMBqS7fqekzfXsFGfrLbTmehY3pTYwQ== +"@abp/lodash@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-9.2.0.tgz#7fa4c9e956c766e34ec4677d2102a6d00f899a4b" + integrity sha512-2elXj/eWw875tF9ixbOm3uqXCxGaG5gL9Tub5k7cP+XhFpNBOYijNaXdN8SeDSxr83WDVWdrk//OQL8BF7XPdw== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" lodash "^4.17.21" -"@abp/luxon@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-9.2.0-rc.4.tgz#dacb173d24987a1ab4fb7e53dff9f91728a1efaa" - integrity sha512-qNuYml25Q2ODzZ830FhijGY66WvAUa02mB9hgulpFlF0p2UiFmhA0dMNVahEuytoFodjkSrhLP6cGfONf7ht8A== +"@abp/luxon@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-9.2.0.tgz#865db7b60dba4029134fb4a4b5eaa08c723dcea8" + integrity sha512-LWjczvzu1gFIq0/2fRz+bJW2+zsmXAmfz0I+lZ3wmqUdkViqAqwTa+5NMIl2tC92u4Dv3LGXKtH37Jw8m+XjTg== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" luxon "^3.5.0" -"@abp/malihu-custom-scrollbar-plugin@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-9.2.0-rc.4.tgz#9b0c0444ec8f11c8c8040387f83080e51a281657" - integrity sha512-cvYJI/4jkzOWSvTY0C/PxSq62SxEq3UlaXpefj/W+CAwPVjG+Yik2YHt5qgcmRRn0oF5V/XRJHB7A4H23+VKyA== +"@abp/malihu-custom-scrollbar-plugin@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-9.2.0.tgz#09722b1e7ca34b96e2a68368db0e96cdf9ab0e6c" + integrity sha512-kfDf/1RwGtAlos/7BW+7xbh3LtJ4VG0Z4mxS+b2HsywAwlt/kE5FltfBj2ResQb030bsGNl7A5JglV9Pv1UlPw== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/moment@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-9.2.0-rc.4.tgz#527ed54f4330a77ec2ea1411bfffe2d57e62d172" - integrity sha512-zIRTuMCcPAfJAU64DUeU7dJPUJqoyJ7TvHBhrUcmmGZK7IzNtaP3/KAGjZIHhHbUwIjidjCxlF2YnW1io7hcJg== +"@abp/moment@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-9.2.0.tgz#137d688af4df195742061ac2b8a2bf460a027071" + integrity sha512-15aTjYAxHK+upkiZ94XCe8CoSPKMl1D8f6GXJIfwPkuYZ+na4ma17qBu4P8bFsc4gu3ngxYiLHRSzYzr4oCSYQ== dependencies: moment "^2.30.1" -"@abp/prismjs@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-9.2.0-rc.4.tgz#5164e64fa04d2a852043e1f7d02952d54112748a" - integrity sha512-fUCqWhmmRMu5DgpDxyH7uyEHS6lCFk+BY+JuS22sTvyhu+Q9M4rYhFEl/E9S+cA2rfxSNAG5h7HPXUWTqHPLgg== +"@abp/prismjs@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-9.2.0.tgz#03fca8cd2f4bdc09a68bd9b1fcdeaede56f96542" + integrity sha512-OUbjaxeXKxmrR9fZe/wazS9hGrYXYam/CypnQNTVaNNgSpwvgoKoCFCll9SJUGV8tXA6iEpVdszMGyRY5Hov+g== dependencies: - "@abp/clipboard" "~9.2.0-rc.4" - "@abp/core" "~9.2.0-rc.4" + "@abp/clipboard" "~9.2.0" + "@abp/core" "~9.2.0" prismjs "^1.29.0" -"@abp/select2@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-9.2.0-rc.4.tgz#6a8c6347ec75fcf60d76bc50ecca8008253fc7c7" - integrity sha512-OMyXr+gYMM81CQliqDVnEGsK2/WbmC4N5IZ1ZSJl+mW7cUClmyg9CLg418ID/7OU+ItUwbw9YvG4RPwnGF1ujw== +"@abp/select2@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-9.2.0.tgz#c96d869be0d3298ed7c0888288ea9829e6266cd4" + integrity sha512-V+qx9hw3oe7o0WbG03ZgAjbqRJPVuedzrdy7ExEdueTc6LRP/WEgbVpXhsNISObtouE6Dadwp3iXYSExgNUC6A== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" select2 "^4.0.13" -"@abp/sweetalert2@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-9.2.0-rc.4.tgz#26d4e9c935f20a7e0bde23327c6761fe6466cd41" - integrity sha512-zhwnA0WpkNO6JuqbBgO6PQ817wuThw6mtGcP96V1m/xtckJWNDub1gby0gJqnWqnq5Cuj4u9gPRkkcVmfPn8ZA== +"@abp/sweetalert2@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-9.2.0.tgz#826d6dd0b70c35a7401cc884fb1e82af99a0305d" + integrity sha512-0r338ayjaL9uzmLKE8oHpcMgJeVgVoMYfhQAPINeQHv1TPXuYCLo0aoRNoLsfmUo3ayYBBa3zOrugFIVis7Q6A== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" sweetalert2 "^11.14.1" -"@abp/timeago@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-9.2.0-rc.4.tgz#494b25062f14f8a139ed66958991d34fcf4023a3" - integrity sha512-6HoEkdQCYDxrEGSjxHXN2Vj5ipc3rIXTbCqj7dYI9K5tuaQ4Wq0Obz/Wx6UZ71ZjzGAeAQkDeXVc68GjQyLX6Q== +"@abp/timeago@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-9.2.0.tgz#79bbe6dd32b0ee7df2e8ebd05274a0ecc7882ba7" + integrity sha512-hEUi5re5N1YkDSpaUaUtXF1Mz4YyiEvNzVADbKRz11kbR4ZAFzcvVqsQLeNo7qnuFLfJNAtuzyjkuxwL75kmaA== dependencies: - "@abp/jquery" "~9.2.0-rc.4" + "@abp/jquery" "~9.2.0" timeago "^1.6.7" -"@abp/utils@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-9.2.0-rc.4.tgz#350eb915af78ecdbc2a0a15a1ad4bac4212cefc2" - integrity sha512-PZzfkiq6sthX5+Icw7h3HVpnDVgN7ZnmOnIyzKhBeHALpH+JfO7QruwJl96Moba4LGmzPdFdLkwm2qznVoqyZA== +"@abp/utils@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-9.2.0.tgz#bf32ced1175e45fbe010c3cb806c7cd37f85089c" + integrity sha512-aciBuXhzlaqe+o7mNt536bCk425cmxY5BE0wwl13u3pX3LfWYWLEgwl8GS0aeI11TS1/7+1N85RJELyz/+y0hQ== dependencies: just-compare "^2.3.0" diff --git a/modules/blogging/app/Volo.BloggingTestApp/package.json b/modules/blogging/app/Volo.BloggingTestApp/package.json index 092346326a..7a947aa7e3 100644 --- a/modules/blogging/app/Volo.BloggingTestApp/package.json +++ b/modules/blogging/app/Volo.BloggingTestApp/package.json @@ -3,7 +3,7 @@ "name": "volo.blogtestapp", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "~9.2.0-rc.4", - "@abp/blogging": "~9.2.0-rc.4" + "@abp/aspnetcore.mvc.ui.theme.basic": "~9.2.0", + "@abp/blogging": "~9.2.0" } } diff --git a/modules/blogging/app/Volo.BloggingTestApp/yarn.lock b/modules/blogging/app/Volo.BloggingTestApp/yarn.lock index 03db0b59ea..7da6e7ae57 100644 --- a/modules/blogging/app/Volo.BloggingTestApp/yarn.lock +++ b/modules/blogging/app/Volo.BloggingTestApp/yarn.lock @@ -2,228 +2,228 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-9.2.0-rc.4.tgz#2659ec541028ec6a1688b748414fb181924f1f58" - integrity sha512-KSpfnvgRPxDb9oJWBnjpFm/FcXSTRO6aAVBlCERi4jtGzp04e//3rHnOWjv+JyxJqOP0JszWSALXK4A/oMQFNQ== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~9.2.0-rc.4" - -"@abp/aspnetcore.mvc.ui.theme.shared@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-9.2.0-rc.4.tgz#4212523cc2d2db881d2a0a9c1b28f372c53c19d7" - integrity sha512-z6nCmIfcaiQ6CPHhVq0C6RYljjrqScVVj+Sf0uI8eP6qG+CVT/aEVgb+3Nc5EM5SjDvR/eTxH4J3YcVNDj32Lg== - dependencies: - "@abp/aspnetcore.mvc.ui" "~9.2.0-rc.4" - "@abp/bootstrap" "~9.2.0-rc.4" - "@abp/bootstrap-datepicker" "~9.2.0-rc.4" - "@abp/bootstrap-daterangepicker" "~9.2.0-rc.4" - "@abp/datatables.net-bs5" "~9.2.0-rc.4" - "@abp/font-awesome" "~9.2.0-rc.4" - "@abp/jquery-form" "~9.2.0-rc.4" - "@abp/jquery-validation-unobtrusive" "~9.2.0-rc.4" - "@abp/lodash" "~9.2.0-rc.4" - "@abp/luxon" "~9.2.0-rc.4" - "@abp/malihu-custom-scrollbar-plugin" "~9.2.0-rc.4" - "@abp/moment" "~9.2.0-rc.4" - "@abp/select2" "~9.2.0-rc.4" - "@abp/sweetalert2" "~9.2.0-rc.4" - "@abp/timeago" "~9.2.0-rc.4" - -"@abp/aspnetcore.mvc.ui@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-9.2.0-rc.4.tgz#a47763a480e488363b901327d94556fdad6cccb7" - integrity sha512-7fxC3zifdnpJZwKsP1hgK0+mu9y/w4zrMY1rR8AVvcpMdt8/Mmtj6mJi+Ompv3YtO9F/Zgnxqma5R0pYMTke7g== +"@abp/aspnetcore.mvc.ui.theme.basic@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-9.2.0.tgz#af6ff5071cadb480b4aece0f15400d56b105a350" + integrity sha512-+LOmhSfsua7i3VQy9vYTDv7nE0fdIA+kNvorQ4wkkRzijOAlwmS4fkupglwOKJQSCWGAM7VXccPy2NzdmwvEtw== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~9.2.0" + +"@abp/aspnetcore.mvc.ui.theme.shared@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-9.2.0.tgz#791f419e8e0fab229e3f93f7a90edcd259100206" + integrity sha512-Mrs+kQg0S5OyRsPBwXQTqOq2DBWDdot7emETcX/gatv26GFbRe3nTOk1E+VWD/nsxHEOKTSE8LClC6TgkMxD8Q== + dependencies: + "@abp/aspnetcore.mvc.ui" "~9.2.0" + "@abp/bootstrap" "~9.2.0" + "@abp/bootstrap-datepicker" "~9.2.0" + "@abp/bootstrap-daterangepicker" "~9.2.0" + "@abp/datatables.net-bs5" "~9.2.0" + "@abp/font-awesome" "~9.2.0" + "@abp/jquery-form" "~9.2.0" + "@abp/jquery-validation-unobtrusive" "~9.2.0" + "@abp/lodash" "~9.2.0" + "@abp/luxon" "~9.2.0" + "@abp/malihu-custom-scrollbar-plugin" "~9.2.0" + "@abp/moment" "~9.2.0" + "@abp/select2" "~9.2.0" + "@abp/sweetalert2" "~9.2.0" + "@abp/timeago" "~9.2.0" + +"@abp/aspnetcore.mvc.ui@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-9.2.0.tgz#e3e703ea46caf04cc966ea0af6deb64427a90d4c" + integrity sha512-VHH68/7Bw7r8p70T9grnVISgYPe2t3m9199S/wAXGtpGHML/lbHhDflWbm7y1MHcrmCfaXy42O9SmTHV25BJhA== dependencies: ansi-colors "^4.1.3" -"@abp/blogging@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/blogging/-/blogging-9.2.0-rc.4.tgz#e7d7b5dceb2bc82b4d9b5d8797da89e373cd965a" - integrity sha512-oVeiq9zFOKJihsRmQLCmIOWvgCxgnbxyZXgwgJhi2MzFaE54jg67JT+x3Pibw6LdpxHl58icdHMFuVXrqFM9aw== +"@abp/blogging@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/blogging/-/blogging-9.2.0.tgz#62f4490e4c454fff8e10a84c1a7d8aee85b94313" + integrity sha512-ptaawKmyUTgGCWOxKPjLCxTY7X/fYTyxoB4sTy2O9vcaDrNqZephppKGl/nTn2EBxsYLKRGDKCl5z0Kl9MG6pQ== dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~9.2.0-rc.4" - "@abp/owl.carousel" "~9.2.0-rc.4" - "@abp/prismjs" "~9.2.0-rc.4" - "@abp/tui-editor" "~9.2.0-rc.4" + "@abp/aspnetcore.mvc.ui.theme.shared" "~9.2.0" + "@abp/owl.carousel" "~9.2.0" + "@abp/prismjs" "~9.2.0" + "@abp/tui-editor" "~9.2.0" -"@abp/bootstrap-datepicker@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-9.2.0-rc.4.tgz#0aec67332e3148e21658650bfaaa08c64180e2ad" - integrity sha512-CaD709aGigfQk76XDshSrctm9TkgjA+7XgnDuVraPRPwq4dwXGIhbNAiJ1+5k6OXrUHqJP3nPc4NDPZiXDwgqw== +"@abp/bootstrap-datepicker@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-9.2.0.tgz#271ff68e2cee7b4ffe5a60406561a05948d6bbe6" + integrity sha512-V8o1cn1MKXE5GH1ZpBHiWWilzxjHIp4IS6rNoCDBSnaQcVvRku9KPI8tPNQSf+4x3jBfHDV9aOBDbDGTQ6J2yw== dependencies: bootstrap-datepicker "^1.10.0" -"@abp/bootstrap-daterangepicker@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-9.2.0-rc.4.tgz#b08d564b0dfc8be62a052fc205e1445764b6a2d0" - integrity sha512-zwWkb6JaUqN2rtIGLtb0Cf1RtP0nuCFK0x2r4J9kYnv1vKiT8vrK2Jl5mJVjvdnO0JifS1rueDMPglVpOeghRw== +"@abp/bootstrap-daterangepicker@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-9.2.0.tgz#a239f8c2efce57d2e2beca70ceeede52d1b177d5" + integrity sha512-Cd9naCyepTvmUotkR1VyOBqUMgyeSXnOVWR7HxXm+jugKtnWRzrztZB6UyfnNzzjc1RMOyiAUEjzitKSJrXeoA== dependencies: bootstrap-daterangepicker "^3.1.0" -"@abp/bootstrap@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-9.2.0-rc.4.tgz#0615ec9fa7422d76e8f4af22ec28fe9672d60c38" - integrity sha512-m1ORR/R84nPEfid/x5rC5jy4orsw4yhkk4nApiW11H4Eb7ssbcviR75ugJ5GBt3GOevHHlTZWwvf8K4C+zdqZg== +"@abp/bootstrap@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-9.2.0.tgz#08859288b8372ea111a240b507047b144d6caca9" + integrity sha512-L3EZQza2c/5VmvZkLsf0EOuaMi8fseyyiwlFN65i1hpcDwhOLcaqnxMneeaSJ+Dy4xczJT+oBml9D9OSTuzmkA== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" bootstrap "^5.3.3" -"@abp/clipboard@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-9.2.0-rc.4.tgz#e91e8c9b9947cef648e31f17ac8050d342a88416" - integrity sha512-iUvCQK3YJKPflLWkXNsueXit+Ipez5+R5q4OdngcvTmVXIUoH8t+3iiM+Q7ohA0vRknsdEGPMUUS7TnDW9fVqA== +"@abp/clipboard@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-9.2.0.tgz#348a0e45752c7eb055fb00af52660593ad340caf" + integrity sha512-2+wt2ShLBfoHqx0DNNevJkaz1POLcs1tcK1hL4ZqsjOnS7BrTk1r8zwNvCw1XEeH2S1rPftAWH4PvzL4j86DFA== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" clipboard "^2.0.11" -"@abp/core@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-9.2.0-rc.4.tgz#b758ea117ae3e3e3596e407a347617b8fcb6c112" - integrity sha512-eNklBpyUAort/UEhgmnvMglBS/FSAzUiKalN7hgJFKx0nd3cDDkjkN6YFY8VuPInt3YfRz5omZQsGNq7eyjtbQ== +"@abp/core@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-9.2.0.tgz#db08fd34cfc891e94eb9e59ed3c0d0e6ef45c51a" + integrity sha512-3iESoHFj8I2xK81dwQVpCI6C1bc87VfWKyJE3/IUv4zWvG4QvI0aKhe1wxocmJqTjjowPUA3/fa2hvpfqPs2Bw== dependencies: - "@abp/utils" "~9.2.0-rc.4" + "@abp/utils" "~9.2.0" -"@abp/datatables.net-bs5@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-9.2.0-rc.4.tgz#75c12fe053d593b738bb5ca7394b2954409f5e00" - integrity sha512-5FG5Jc6Co9q/1xYmmW2SabSaXVkdJohPJ9XtzTthwnY8Ko5eGV7TPkEfwwsk0PLXp+Wu3ifQaZI4CIE9WR81XA== +"@abp/datatables.net-bs5@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-9.2.0.tgz#eab201c959727c27aaab30dc5bd8159249d8b54b" + integrity sha512-bmK6GKffXzYbfkDIlN27D7mohnYsXoODEiHqhZnBdIzeSJyHwrwRPRVbO1EcBn1SEBHjGJp3S69Z6gDbRs018g== dependencies: - "@abp/datatables.net" "~9.2.0-rc.4" + "@abp/datatables.net" "~9.2.0" datatables.net-bs5 "^2.1.8" -"@abp/datatables.net@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-9.2.0-rc.4.tgz#523b017e4b9ea9d3a6d3262f66bd3daaade05c0b" - integrity sha512-udCSjJYYpi/Ql/KJZxYDMxbtX6gXw7hsfMxQjP0u37JsyNLgd4fTrzaXCe7OKn3x7poJcANoqsEgWow/9R/WIg== +"@abp/datatables.net@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-9.2.0.tgz#e4880fe074d86d3c5dbd7f48c86244790fc376c2" + integrity sha512-bKaaa+tl0Pt4oNaV+X8pBbvsHc2mPYoL7yuAs+LN8ZLwBdsGoUw7RNhLQ63O3tuYdHuaHhI/mx23X6JThr0SYw== dependencies: - "@abp/jquery" "~9.2.0-rc.4" + "@abp/jquery" "~9.2.0" datatables.net "^2.1.8" -"@abp/font-awesome@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-9.2.0-rc.4.tgz#31d9fa475af3b543ddaff16e6af8caba966bd331" - integrity sha512-FYmfrf2mX5rzU+GqK078rn85UmfAwdCB8JQhnGfkylybMRJvmocRsPBIEThjlFZAPGqqvULHUTRMwnRPTgpuNw== +"@abp/font-awesome@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-9.2.0.tgz#3e359da2510cbc0e5b9e46e9cb3664baf285722e" + integrity sha512-HRGg6XK3bCxFdVvEBnBKyLamqMUrenj//E4JuKOs8DtGLVH0jTyh8TwUT5/E/pI+POV7HEOpv9WpSB2p8pfsAg== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" "@fortawesome/fontawesome-free" "^6.6.0" -"@abp/jquery-form@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-9.2.0-rc.4.tgz#b200be90031b58305a2ebfd646ffbd5ce4cca40c" - integrity sha512-ohCtIfz48E0+vNdNyKTsLlfW0NYMJfKWXd9BPp2szgBaDbC7jYdGYyABbxGxRc7mp1B8xQzRhLnTzdRtWaJemg== +"@abp/jquery-form@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-9.2.0.tgz#40fac992584c26e6c54f66e7f68f8abf8944a626" + integrity sha512-B7Shq1itQjsnzdU1kjLpGHWjkSGFhIM2iF5BNMkqcylG3Yq1Se4+8QPoJpn/soilmtX8gbO2fx8TOejfIazXIw== dependencies: - "@abp/jquery" "~9.2.0-rc.4" + "@abp/jquery" "~9.2.0" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-9.2.0-rc.4.tgz#0329f9268b83e0832e26ea3f6523dbc5226b9114" - integrity sha512-iOnw5YoiC3bCIFRjuXPagz+ixFV+PM36hP0UJ4x03BK6GDJnAvjLshYe6qnQG9Xnz1arzmIX5ud5EjWvWSBIoA== +"@abp/jquery-validation-unobtrusive@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-9.2.0.tgz#c2df51d024d48e71f0e7fb8d4207a8b2855393f4" + integrity sha512-c1cPfWVdo+gpaMoegAkw0DzGL2fy/1ylEi/shb95MAGt3iyECVx+X+R/XOxbVHKVI57D4d5IGj6cXYBhdKkvAw== dependencies: - "@abp/jquery-validation" "~9.2.0-rc.4" + "@abp/jquery-validation" "~9.2.0" jquery-validation-unobtrusive "^4.0.0" -"@abp/jquery-validation@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-9.2.0-rc.4.tgz#073e4cbf905f652ce83633b98696b559916b984d" - integrity sha512-pS2Y2c6gXFOzfKeM2/JlW56ZmrUeflT2av64aWrFYnv7IgJUp38PEjR10uPy3g/mP2c9jis8dOfkdbRrlHwf+g== +"@abp/jquery-validation@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-9.2.0.tgz#97688d2e3c25699d4368ebf7234e04943aa5e6ab" + integrity sha512-UO+T6SqXBrh0ODwvMm840CGbE2fdYNo5oqJL4V4JbHv9uz7MH+k0bB1DK7mFb94iDM7QcglLzIfcN4hLRV7arw== dependencies: - "@abp/jquery" "~9.2.0-rc.4" + "@abp/jquery" "~9.2.0" jquery-validation "^1.21.0" -"@abp/jquery@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-9.2.0-rc.4.tgz#ac8a6ce969d58cc4f05d33adcfad76e7442231e8" - integrity sha512-N5hZ8VGXJUn5QW1mSXHIO7SjdvoyrkCyH5j8DhXJO1mDlS1L36n+MJHFwQK7UZpHcFOuklAJ7f417r3sISOBCw== +"@abp/jquery@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-9.2.0.tgz#38c249be6eda0cdc899cc8a1f20e5152c39ae9a0" + integrity sha512-sIe3Zk+8549ytydCtDlECZ930PapW/2J0652two/sJwYG/SGUGxYQbw3QnJGFTcL9TFwcWwRj5iWX0gWrLEIyA== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" jquery "~3.7.1" -"@abp/lodash@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-9.2.0-rc.4.tgz#e428df195ed90414a9a412e1dcb6494344475f82" - integrity sha512-WsbyBNA57/giyI5pnM7Y7dk0p56hMDS5OMdmNilaGOWMnvz7mMTJNvStMBqS7fqekzfXsFGfrLbTmehY3pTYwQ== +"@abp/lodash@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-9.2.0.tgz#7fa4c9e956c766e34ec4677d2102a6d00f899a4b" + integrity sha512-2elXj/eWw875tF9ixbOm3uqXCxGaG5gL9Tub5k7cP+XhFpNBOYijNaXdN8SeDSxr83WDVWdrk//OQL8BF7XPdw== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" lodash "^4.17.21" -"@abp/luxon@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-9.2.0-rc.4.tgz#dacb173d24987a1ab4fb7e53dff9f91728a1efaa" - integrity sha512-qNuYml25Q2ODzZ830FhijGY66WvAUa02mB9hgulpFlF0p2UiFmhA0dMNVahEuytoFodjkSrhLP6cGfONf7ht8A== +"@abp/luxon@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-9.2.0.tgz#865db7b60dba4029134fb4a4b5eaa08c723dcea8" + integrity sha512-LWjczvzu1gFIq0/2fRz+bJW2+zsmXAmfz0I+lZ3wmqUdkViqAqwTa+5NMIl2tC92u4Dv3LGXKtH37Jw8m+XjTg== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" luxon "^3.5.0" -"@abp/malihu-custom-scrollbar-plugin@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-9.2.0-rc.4.tgz#9b0c0444ec8f11c8c8040387f83080e51a281657" - integrity sha512-cvYJI/4jkzOWSvTY0C/PxSq62SxEq3UlaXpefj/W+CAwPVjG+Yik2YHt5qgcmRRn0oF5V/XRJHB7A4H23+VKyA== +"@abp/malihu-custom-scrollbar-plugin@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-9.2.0.tgz#09722b1e7ca34b96e2a68368db0e96cdf9ab0e6c" + integrity sha512-kfDf/1RwGtAlos/7BW+7xbh3LtJ4VG0Z4mxS+b2HsywAwlt/kE5FltfBj2ResQb030bsGNl7A5JglV9Pv1UlPw== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/moment@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-9.2.0-rc.4.tgz#527ed54f4330a77ec2ea1411bfffe2d57e62d172" - integrity sha512-zIRTuMCcPAfJAU64DUeU7dJPUJqoyJ7TvHBhrUcmmGZK7IzNtaP3/KAGjZIHhHbUwIjidjCxlF2YnW1io7hcJg== +"@abp/moment@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-9.2.0.tgz#137d688af4df195742061ac2b8a2bf460a027071" + integrity sha512-15aTjYAxHK+upkiZ94XCe8CoSPKMl1D8f6GXJIfwPkuYZ+na4ma17qBu4P8bFsc4gu3ngxYiLHRSzYzr4oCSYQ== dependencies: moment "^2.30.1" -"@abp/owl.carousel@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/owl.carousel/-/owl.carousel-9.2.0-rc.4.tgz#0e225bb0a5b0b9103dc9ec837f45c8dc71bb960d" - integrity sha512-SQFusBIWxYSBzkmjbQLXfd1qz7iIzT55lGcb5y8IhlBp19UwkbeyJq68Oj6maL6COyZT0O4lSBRqkGmIC1UR8A== +"@abp/owl.carousel@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/owl.carousel/-/owl.carousel-9.2.0.tgz#e2bd2c6a67cf942302393cd12c44519ea55eb27b" + integrity sha512-nu1noD/VX9Fae6PGDPMGMTV+/973xoRS4oolYDiYUBVcCzXjPNI6bvVGpnwNJbx+pgHyW07eh008qZ6pR3R3ug== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" owl.carousel "^2.3.4" -"@abp/prismjs@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-9.2.0-rc.4.tgz#5164e64fa04d2a852043e1f7d02952d54112748a" - integrity sha512-fUCqWhmmRMu5DgpDxyH7uyEHS6lCFk+BY+JuS22sTvyhu+Q9M4rYhFEl/E9S+cA2rfxSNAG5h7HPXUWTqHPLgg== +"@abp/prismjs@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-9.2.0.tgz#03fca8cd2f4bdc09a68bd9b1fcdeaede56f96542" + integrity sha512-OUbjaxeXKxmrR9fZe/wazS9hGrYXYam/CypnQNTVaNNgSpwvgoKoCFCll9SJUGV8tXA6iEpVdszMGyRY5Hov+g== dependencies: - "@abp/clipboard" "~9.2.0-rc.4" - "@abp/core" "~9.2.0-rc.4" + "@abp/clipboard" "~9.2.0" + "@abp/core" "~9.2.0" prismjs "^1.29.0" -"@abp/select2@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-9.2.0-rc.4.tgz#6a8c6347ec75fcf60d76bc50ecca8008253fc7c7" - integrity sha512-OMyXr+gYMM81CQliqDVnEGsK2/WbmC4N5IZ1ZSJl+mW7cUClmyg9CLg418ID/7OU+ItUwbw9YvG4RPwnGF1ujw== +"@abp/select2@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-9.2.0.tgz#c96d869be0d3298ed7c0888288ea9829e6266cd4" + integrity sha512-V+qx9hw3oe7o0WbG03ZgAjbqRJPVuedzrdy7ExEdueTc6LRP/WEgbVpXhsNISObtouE6Dadwp3iXYSExgNUC6A== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" select2 "^4.0.13" -"@abp/sweetalert2@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-9.2.0-rc.4.tgz#26d4e9c935f20a7e0bde23327c6761fe6466cd41" - integrity sha512-zhwnA0WpkNO6JuqbBgO6PQ817wuThw6mtGcP96V1m/xtckJWNDub1gby0gJqnWqnq5Cuj4u9gPRkkcVmfPn8ZA== +"@abp/sweetalert2@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-9.2.0.tgz#826d6dd0b70c35a7401cc884fb1e82af99a0305d" + integrity sha512-0r338ayjaL9uzmLKE8oHpcMgJeVgVoMYfhQAPINeQHv1TPXuYCLo0aoRNoLsfmUo3ayYBBa3zOrugFIVis7Q6A== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" sweetalert2 "^11.14.1" -"@abp/timeago@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-9.2.0-rc.4.tgz#494b25062f14f8a139ed66958991d34fcf4023a3" - integrity sha512-6HoEkdQCYDxrEGSjxHXN2Vj5ipc3rIXTbCqj7dYI9K5tuaQ4Wq0Obz/Wx6UZ71ZjzGAeAQkDeXVc68GjQyLX6Q== +"@abp/timeago@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-9.2.0.tgz#79bbe6dd32b0ee7df2e8ebd05274a0ecc7882ba7" + integrity sha512-hEUi5re5N1YkDSpaUaUtXF1Mz4YyiEvNzVADbKRz11kbR4ZAFzcvVqsQLeNo7qnuFLfJNAtuzyjkuxwL75kmaA== dependencies: - "@abp/jquery" "~9.2.0-rc.4" + "@abp/jquery" "~9.2.0" timeago "^1.6.7" -"@abp/tui-editor@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/tui-editor/-/tui-editor-9.2.0-rc.4.tgz#dca06d694d7105a807887c4ddebc01c7f2a9c5f7" - integrity sha512-dpSrv1SYZh947AuN95GlrGyI61CeysJHnbsAKPmGsmZ5CH6VSDM5gpI9teo8SdhXsi9L5rtVBehCXBgDHSsiQQ== +"@abp/tui-editor@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/tui-editor/-/tui-editor-9.2.0.tgz#f28e1099e39def76ff81d1db64f5e352f0d28f02" + integrity sha512-h3Nq0LmkmPWBx1tzPnImJAhPFlAD8sX/GnlAvEZGY3XJ7X6146TPl7HIzZ4fnttm+ilhuDUG2qydgIek/5pWLw== dependencies: - "@abp/jquery" "~9.2.0-rc.4" - "@abp/prismjs" "~9.2.0-rc.4" + "@abp/jquery" "~9.2.0" + "@abp/prismjs" "~9.2.0" -"@abp/utils@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-9.2.0-rc.4.tgz#350eb915af78ecdbc2a0a15a1ad4bac4212cefc2" - integrity sha512-PZzfkiq6sthX5+Icw7h3HVpnDVgN7ZnmOnIyzKhBeHALpH+JfO7QruwJl96Moba4LGmzPdFdLkwm2qznVoqyZA== +"@abp/utils@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-9.2.0.tgz#bf32ced1175e45fbe010c3cb806c7cd37f85089c" + integrity sha512-aciBuXhzlaqe+o7mNt536bCk425cmxY5BE0wwl13u3pX3LfWYWLEgwl8GS0aeI11TS1/7+1N85RJELyz/+y0hQ== dependencies: just-compare "^2.3.0" diff --git a/modules/client-simulation/demo/Volo.ClientSimulation.Demo/package.json b/modules/client-simulation/demo/Volo.ClientSimulation.Demo/package.json index 4795c5195d..d190683ea4 100644 --- a/modules/client-simulation/demo/Volo.ClientSimulation.Demo/package.json +++ b/modules/client-simulation/demo/Volo.ClientSimulation.Demo/package.json @@ -3,6 +3,6 @@ "name": "client-simulation-web", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "~9.2.0-rc.4" + "@abp/aspnetcore.mvc.ui.theme.basic": "~9.2.0" } } diff --git a/modules/client-simulation/demo/Volo.ClientSimulation.Demo/yarn.lock b/modules/client-simulation/demo/Volo.ClientSimulation.Demo/yarn.lock index 682f82ae14..6c8afa8deb 100644 --- a/modules/client-simulation/demo/Volo.ClientSimulation.Demo/yarn.lock +++ b/modules/client-simulation/demo/Volo.ClientSimulation.Demo/yarn.lock @@ -2,185 +2,185 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-9.2.0-rc.4.tgz#2659ec541028ec6a1688b748414fb181924f1f58" - integrity sha512-KSpfnvgRPxDb9oJWBnjpFm/FcXSTRO6aAVBlCERi4jtGzp04e//3rHnOWjv+JyxJqOP0JszWSALXK4A/oMQFNQ== +"@abp/aspnetcore.mvc.ui.theme.basic@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-9.2.0.tgz#af6ff5071cadb480b4aece0f15400d56b105a350" + integrity sha512-+LOmhSfsua7i3VQy9vYTDv7nE0fdIA+kNvorQ4wkkRzijOAlwmS4fkupglwOKJQSCWGAM7VXccPy2NzdmwvEtw== dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~9.2.0-rc.4" + "@abp/aspnetcore.mvc.ui.theme.shared" "~9.2.0" -"@abp/aspnetcore.mvc.ui.theme.shared@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-9.2.0-rc.4.tgz#4212523cc2d2db881d2a0a9c1b28f372c53c19d7" - integrity sha512-z6nCmIfcaiQ6CPHhVq0C6RYljjrqScVVj+Sf0uI8eP6qG+CVT/aEVgb+3Nc5EM5SjDvR/eTxH4J3YcVNDj32Lg== +"@abp/aspnetcore.mvc.ui.theme.shared@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-9.2.0.tgz#791f419e8e0fab229e3f93f7a90edcd259100206" + integrity sha512-Mrs+kQg0S5OyRsPBwXQTqOq2DBWDdot7emETcX/gatv26GFbRe3nTOk1E+VWD/nsxHEOKTSE8LClC6TgkMxD8Q== dependencies: - "@abp/aspnetcore.mvc.ui" "~9.2.0-rc.4" - "@abp/bootstrap" "~9.2.0-rc.4" - "@abp/bootstrap-datepicker" "~9.2.0-rc.4" - "@abp/bootstrap-daterangepicker" "~9.2.0-rc.4" - "@abp/datatables.net-bs5" "~9.2.0-rc.4" - "@abp/font-awesome" "~9.2.0-rc.4" - "@abp/jquery-form" "~9.2.0-rc.4" - "@abp/jquery-validation-unobtrusive" "~9.2.0-rc.4" - "@abp/lodash" "~9.2.0-rc.4" - "@abp/luxon" "~9.2.0-rc.4" - "@abp/malihu-custom-scrollbar-plugin" "~9.2.0-rc.4" - "@abp/moment" "~9.2.0-rc.4" - "@abp/select2" "~9.2.0-rc.4" - "@abp/sweetalert2" "~9.2.0-rc.4" - "@abp/timeago" "~9.2.0-rc.4" - -"@abp/aspnetcore.mvc.ui@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-9.2.0-rc.4.tgz#a47763a480e488363b901327d94556fdad6cccb7" - integrity sha512-7fxC3zifdnpJZwKsP1hgK0+mu9y/w4zrMY1rR8AVvcpMdt8/Mmtj6mJi+Ompv3YtO9F/Zgnxqma5R0pYMTke7g== + "@abp/aspnetcore.mvc.ui" "~9.2.0" + "@abp/bootstrap" "~9.2.0" + "@abp/bootstrap-datepicker" "~9.2.0" + "@abp/bootstrap-daterangepicker" "~9.2.0" + "@abp/datatables.net-bs5" "~9.2.0" + "@abp/font-awesome" "~9.2.0" + "@abp/jquery-form" "~9.2.0" + "@abp/jquery-validation-unobtrusive" "~9.2.0" + "@abp/lodash" "~9.2.0" + "@abp/luxon" "~9.2.0" + "@abp/malihu-custom-scrollbar-plugin" "~9.2.0" + "@abp/moment" "~9.2.0" + "@abp/select2" "~9.2.0" + "@abp/sweetalert2" "~9.2.0" + "@abp/timeago" "~9.2.0" + +"@abp/aspnetcore.mvc.ui@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-9.2.0.tgz#e3e703ea46caf04cc966ea0af6deb64427a90d4c" + integrity sha512-VHH68/7Bw7r8p70T9grnVISgYPe2t3m9199S/wAXGtpGHML/lbHhDflWbm7y1MHcrmCfaXy42O9SmTHV25BJhA== dependencies: ansi-colors "^4.1.3" -"@abp/bootstrap-datepicker@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-9.2.0-rc.4.tgz#0aec67332e3148e21658650bfaaa08c64180e2ad" - integrity sha512-CaD709aGigfQk76XDshSrctm9TkgjA+7XgnDuVraPRPwq4dwXGIhbNAiJ1+5k6OXrUHqJP3nPc4NDPZiXDwgqw== +"@abp/bootstrap-datepicker@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-9.2.0.tgz#271ff68e2cee7b4ffe5a60406561a05948d6bbe6" + integrity sha512-V8o1cn1MKXE5GH1ZpBHiWWilzxjHIp4IS6rNoCDBSnaQcVvRku9KPI8tPNQSf+4x3jBfHDV9aOBDbDGTQ6J2yw== dependencies: bootstrap-datepicker "^1.10.0" -"@abp/bootstrap-daterangepicker@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-9.2.0-rc.4.tgz#b08d564b0dfc8be62a052fc205e1445764b6a2d0" - integrity sha512-zwWkb6JaUqN2rtIGLtb0Cf1RtP0nuCFK0x2r4J9kYnv1vKiT8vrK2Jl5mJVjvdnO0JifS1rueDMPglVpOeghRw== +"@abp/bootstrap-daterangepicker@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-9.2.0.tgz#a239f8c2efce57d2e2beca70ceeede52d1b177d5" + integrity sha512-Cd9naCyepTvmUotkR1VyOBqUMgyeSXnOVWR7HxXm+jugKtnWRzrztZB6UyfnNzzjc1RMOyiAUEjzitKSJrXeoA== dependencies: bootstrap-daterangepicker "^3.1.0" -"@abp/bootstrap@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-9.2.0-rc.4.tgz#0615ec9fa7422d76e8f4af22ec28fe9672d60c38" - integrity sha512-m1ORR/R84nPEfid/x5rC5jy4orsw4yhkk4nApiW11H4Eb7ssbcviR75ugJ5GBt3GOevHHlTZWwvf8K4C+zdqZg== +"@abp/bootstrap@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-9.2.0.tgz#08859288b8372ea111a240b507047b144d6caca9" + integrity sha512-L3EZQza2c/5VmvZkLsf0EOuaMi8fseyyiwlFN65i1hpcDwhOLcaqnxMneeaSJ+Dy4xczJT+oBml9D9OSTuzmkA== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" bootstrap "^5.3.3" -"@abp/core@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-9.2.0-rc.4.tgz#b758ea117ae3e3e3596e407a347617b8fcb6c112" - integrity sha512-eNklBpyUAort/UEhgmnvMglBS/FSAzUiKalN7hgJFKx0nd3cDDkjkN6YFY8VuPInt3YfRz5omZQsGNq7eyjtbQ== +"@abp/core@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-9.2.0.tgz#db08fd34cfc891e94eb9e59ed3c0d0e6ef45c51a" + integrity sha512-3iESoHFj8I2xK81dwQVpCI6C1bc87VfWKyJE3/IUv4zWvG4QvI0aKhe1wxocmJqTjjowPUA3/fa2hvpfqPs2Bw== dependencies: - "@abp/utils" "~9.2.0-rc.4" + "@abp/utils" "~9.2.0" -"@abp/datatables.net-bs5@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-9.2.0-rc.4.tgz#75c12fe053d593b738bb5ca7394b2954409f5e00" - integrity sha512-5FG5Jc6Co9q/1xYmmW2SabSaXVkdJohPJ9XtzTthwnY8Ko5eGV7TPkEfwwsk0PLXp+Wu3ifQaZI4CIE9WR81XA== +"@abp/datatables.net-bs5@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-9.2.0.tgz#eab201c959727c27aaab30dc5bd8159249d8b54b" + integrity sha512-bmK6GKffXzYbfkDIlN27D7mohnYsXoODEiHqhZnBdIzeSJyHwrwRPRVbO1EcBn1SEBHjGJp3S69Z6gDbRs018g== dependencies: - "@abp/datatables.net" "~9.2.0-rc.4" + "@abp/datatables.net" "~9.2.0" datatables.net-bs5 "^2.1.8" -"@abp/datatables.net@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-9.2.0-rc.4.tgz#523b017e4b9ea9d3a6d3262f66bd3daaade05c0b" - integrity sha512-udCSjJYYpi/Ql/KJZxYDMxbtX6gXw7hsfMxQjP0u37JsyNLgd4fTrzaXCe7OKn3x7poJcANoqsEgWow/9R/WIg== +"@abp/datatables.net@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-9.2.0.tgz#e4880fe074d86d3c5dbd7f48c86244790fc376c2" + integrity sha512-bKaaa+tl0Pt4oNaV+X8pBbvsHc2mPYoL7yuAs+LN8ZLwBdsGoUw7RNhLQ63O3tuYdHuaHhI/mx23X6JThr0SYw== dependencies: - "@abp/jquery" "~9.2.0-rc.4" + "@abp/jquery" "~9.2.0" datatables.net "^2.1.8" -"@abp/font-awesome@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-9.2.0-rc.4.tgz#31d9fa475af3b543ddaff16e6af8caba966bd331" - integrity sha512-FYmfrf2mX5rzU+GqK078rn85UmfAwdCB8JQhnGfkylybMRJvmocRsPBIEThjlFZAPGqqvULHUTRMwnRPTgpuNw== +"@abp/font-awesome@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-9.2.0.tgz#3e359da2510cbc0e5b9e46e9cb3664baf285722e" + integrity sha512-HRGg6XK3bCxFdVvEBnBKyLamqMUrenj//E4JuKOs8DtGLVH0jTyh8TwUT5/E/pI+POV7HEOpv9WpSB2p8pfsAg== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" "@fortawesome/fontawesome-free" "^6.6.0" -"@abp/jquery-form@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-9.2.0-rc.4.tgz#b200be90031b58305a2ebfd646ffbd5ce4cca40c" - integrity sha512-ohCtIfz48E0+vNdNyKTsLlfW0NYMJfKWXd9BPp2szgBaDbC7jYdGYyABbxGxRc7mp1B8xQzRhLnTzdRtWaJemg== +"@abp/jquery-form@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-9.2.0.tgz#40fac992584c26e6c54f66e7f68f8abf8944a626" + integrity sha512-B7Shq1itQjsnzdU1kjLpGHWjkSGFhIM2iF5BNMkqcylG3Yq1Se4+8QPoJpn/soilmtX8gbO2fx8TOejfIazXIw== dependencies: - "@abp/jquery" "~9.2.0-rc.4" + "@abp/jquery" "~9.2.0" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-9.2.0-rc.4.tgz#0329f9268b83e0832e26ea3f6523dbc5226b9114" - integrity sha512-iOnw5YoiC3bCIFRjuXPagz+ixFV+PM36hP0UJ4x03BK6GDJnAvjLshYe6qnQG9Xnz1arzmIX5ud5EjWvWSBIoA== +"@abp/jquery-validation-unobtrusive@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-9.2.0.tgz#c2df51d024d48e71f0e7fb8d4207a8b2855393f4" + integrity sha512-c1cPfWVdo+gpaMoegAkw0DzGL2fy/1ylEi/shb95MAGt3iyECVx+X+R/XOxbVHKVI57D4d5IGj6cXYBhdKkvAw== dependencies: - "@abp/jquery-validation" "~9.2.0-rc.4" + "@abp/jquery-validation" "~9.2.0" jquery-validation-unobtrusive "^4.0.0" -"@abp/jquery-validation@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-9.2.0-rc.4.tgz#073e4cbf905f652ce83633b98696b559916b984d" - integrity sha512-pS2Y2c6gXFOzfKeM2/JlW56ZmrUeflT2av64aWrFYnv7IgJUp38PEjR10uPy3g/mP2c9jis8dOfkdbRrlHwf+g== +"@abp/jquery-validation@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-9.2.0.tgz#97688d2e3c25699d4368ebf7234e04943aa5e6ab" + integrity sha512-UO+T6SqXBrh0ODwvMm840CGbE2fdYNo5oqJL4V4JbHv9uz7MH+k0bB1DK7mFb94iDM7QcglLzIfcN4hLRV7arw== dependencies: - "@abp/jquery" "~9.2.0-rc.4" + "@abp/jquery" "~9.2.0" jquery-validation "^1.21.0" -"@abp/jquery@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-9.2.0-rc.4.tgz#ac8a6ce969d58cc4f05d33adcfad76e7442231e8" - integrity sha512-N5hZ8VGXJUn5QW1mSXHIO7SjdvoyrkCyH5j8DhXJO1mDlS1L36n+MJHFwQK7UZpHcFOuklAJ7f417r3sISOBCw== +"@abp/jquery@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-9.2.0.tgz#38c249be6eda0cdc899cc8a1f20e5152c39ae9a0" + integrity sha512-sIe3Zk+8549ytydCtDlECZ930PapW/2J0652two/sJwYG/SGUGxYQbw3QnJGFTcL9TFwcWwRj5iWX0gWrLEIyA== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" jquery "~3.7.1" -"@abp/lodash@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-9.2.0-rc.4.tgz#e428df195ed90414a9a412e1dcb6494344475f82" - integrity sha512-WsbyBNA57/giyI5pnM7Y7dk0p56hMDS5OMdmNilaGOWMnvz7mMTJNvStMBqS7fqekzfXsFGfrLbTmehY3pTYwQ== +"@abp/lodash@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-9.2.0.tgz#7fa4c9e956c766e34ec4677d2102a6d00f899a4b" + integrity sha512-2elXj/eWw875tF9ixbOm3uqXCxGaG5gL9Tub5k7cP+XhFpNBOYijNaXdN8SeDSxr83WDVWdrk//OQL8BF7XPdw== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" lodash "^4.17.21" -"@abp/luxon@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-9.2.0-rc.4.tgz#dacb173d24987a1ab4fb7e53dff9f91728a1efaa" - integrity sha512-qNuYml25Q2ODzZ830FhijGY66WvAUa02mB9hgulpFlF0p2UiFmhA0dMNVahEuytoFodjkSrhLP6cGfONf7ht8A== +"@abp/luxon@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-9.2.0.tgz#865db7b60dba4029134fb4a4b5eaa08c723dcea8" + integrity sha512-LWjczvzu1gFIq0/2fRz+bJW2+zsmXAmfz0I+lZ3wmqUdkViqAqwTa+5NMIl2tC92u4Dv3LGXKtH37Jw8m+XjTg== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" luxon "^3.5.0" -"@abp/malihu-custom-scrollbar-plugin@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-9.2.0-rc.4.tgz#9b0c0444ec8f11c8c8040387f83080e51a281657" - integrity sha512-cvYJI/4jkzOWSvTY0C/PxSq62SxEq3UlaXpefj/W+CAwPVjG+Yik2YHt5qgcmRRn0oF5V/XRJHB7A4H23+VKyA== +"@abp/malihu-custom-scrollbar-plugin@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-9.2.0.tgz#09722b1e7ca34b96e2a68368db0e96cdf9ab0e6c" + integrity sha512-kfDf/1RwGtAlos/7BW+7xbh3LtJ4VG0Z4mxS+b2HsywAwlt/kE5FltfBj2ResQb030bsGNl7A5JglV9Pv1UlPw== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/moment@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-9.2.0-rc.4.tgz#527ed54f4330a77ec2ea1411bfffe2d57e62d172" - integrity sha512-zIRTuMCcPAfJAU64DUeU7dJPUJqoyJ7TvHBhrUcmmGZK7IzNtaP3/KAGjZIHhHbUwIjidjCxlF2YnW1io7hcJg== +"@abp/moment@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-9.2.0.tgz#137d688af4df195742061ac2b8a2bf460a027071" + integrity sha512-15aTjYAxHK+upkiZ94XCe8CoSPKMl1D8f6GXJIfwPkuYZ+na4ma17qBu4P8bFsc4gu3ngxYiLHRSzYzr4oCSYQ== dependencies: moment "^2.30.1" -"@abp/select2@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-9.2.0-rc.4.tgz#6a8c6347ec75fcf60d76bc50ecca8008253fc7c7" - integrity sha512-OMyXr+gYMM81CQliqDVnEGsK2/WbmC4N5IZ1ZSJl+mW7cUClmyg9CLg418ID/7OU+ItUwbw9YvG4RPwnGF1ujw== +"@abp/select2@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-9.2.0.tgz#c96d869be0d3298ed7c0888288ea9829e6266cd4" + integrity sha512-V+qx9hw3oe7o0WbG03ZgAjbqRJPVuedzrdy7ExEdueTc6LRP/WEgbVpXhsNISObtouE6Dadwp3iXYSExgNUC6A== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" select2 "^4.0.13" -"@abp/sweetalert2@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-9.2.0-rc.4.tgz#26d4e9c935f20a7e0bde23327c6761fe6466cd41" - integrity sha512-zhwnA0WpkNO6JuqbBgO6PQ817wuThw6mtGcP96V1m/xtckJWNDub1gby0gJqnWqnq5Cuj4u9gPRkkcVmfPn8ZA== +"@abp/sweetalert2@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-9.2.0.tgz#826d6dd0b70c35a7401cc884fb1e82af99a0305d" + integrity sha512-0r338ayjaL9uzmLKE8oHpcMgJeVgVoMYfhQAPINeQHv1TPXuYCLo0aoRNoLsfmUo3ayYBBa3zOrugFIVis7Q6A== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" sweetalert2 "^11.14.1" -"@abp/timeago@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-9.2.0-rc.4.tgz#494b25062f14f8a139ed66958991d34fcf4023a3" - integrity sha512-6HoEkdQCYDxrEGSjxHXN2Vj5ipc3rIXTbCqj7dYI9K5tuaQ4Wq0Obz/Wx6UZ71ZjzGAeAQkDeXVc68GjQyLX6Q== +"@abp/timeago@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-9.2.0.tgz#79bbe6dd32b0ee7df2e8ebd05274a0ecc7882ba7" + integrity sha512-hEUi5re5N1YkDSpaUaUtXF1Mz4YyiEvNzVADbKRz11kbR4ZAFzcvVqsQLeNo7qnuFLfJNAtuzyjkuxwL75kmaA== dependencies: - "@abp/jquery" "~9.2.0-rc.4" + "@abp/jquery" "~9.2.0" timeago "^1.6.7" -"@abp/utils@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-9.2.0-rc.4.tgz#350eb915af78ecdbc2a0a15a1ad4bac4212cefc2" - integrity sha512-PZzfkiq6sthX5+Icw7h3HVpnDVgN7ZnmOnIyzKhBeHALpH+JfO7QruwJl96Moba4LGmzPdFdLkwm2qznVoqyZA== +"@abp/utils@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-9.2.0.tgz#bf32ced1175e45fbe010c3cb806c7cd37f85089c" + integrity sha512-aciBuXhzlaqe+o7mNt536bCk425cmxY5BE0wwl13u3pX3LfWYWLEgwl8GS0aeI11TS1/7+1N85RJELyz/+y0hQ== dependencies: just-compare "^2.3.0" diff --git a/modules/cms-kit/angular/package.json b/modules/cms-kit/angular/package.json index 6b7c357c9a..c3f2f5712a 100644 --- a/modules/cms-kit/angular/package.json +++ b/modules/cms-kit/angular/package.json @@ -15,11 +15,11 @@ }, "private": true, "dependencies": { - "@abp/ng.account": "~9.2.0-rc.4", - "@abp/ng.identity": "~9.2.0-rc.4", - "@abp/ng.setting-management": "~9.2.0-rc.4", - "@abp/ng.tenant-management": "~9.2.0-rc.4", - "@abp/ng.theme.basic": "~9.2.0-rc.4", + "@abp/ng.account": "~9.2.0", + "@abp/ng.identity": "~9.2.0", + "@abp/ng.setting-management": "~9.2.0", + "@abp/ng.tenant-management": "~9.2.0", + "@abp/ng.theme.basic": "~9.2.0", "@angular/animations": "~10.0.0", "@angular/common": "~10.0.0", "@angular/compiler": "~10.0.0", diff --git a/modules/cms-kit/angular/projects/cms-kit/package.json b/modules/cms-kit/angular/projects/cms-kit/package.json index a312a0ff35..b02a75bb34 100644 --- a/modules/cms-kit/angular/projects/cms-kit/package.json +++ b/modules/cms-kit/angular/projects/cms-kit/package.json @@ -4,8 +4,8 @@ "peerDependencies": { "@angular/common": "^9.1.11", "@angular/core": "^9.1.11", - "@abp/ng.core": ">=9.2.0-rc.4", - "@abp/ng.theme.shared": ">=9.2.0-rc.4" + "@abp/ng.core": ">=9.2.0", + "@abp/ng.theme.shared": ">=9.2.0" }, "dependencies": { "tslib": "^2.0.0" diff --git a/modules/cms-kit/host/Volo.CmsKit.IdentityServer/package.json b/modules/cms-kit/host/Volo.CmsKit.IdentityServer/package.json index cb48f8ff94..39e7548d18 100644 --- a/modules/cms-kit/host/Volo.CmsKit.IdentityServer/package.json +++ b/modules/cms-kit/host/Volo.CmsKit.IdentityServer/package.json @@ -3,6 +3,6 @@ "name": "my-app-identityserver", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "~9.2.0-rc.4" + "@abp/aspnetcore.mvc.ui.theme.basic": "~9.2.0" } } diff --git a/modules/cms-kit/host/Volo.CmsKit.IdentityServer/yarn.lock b/modules/cms-kit/host/Volo.CmsKit.IdentityServer/yarn.lock index 682f82ae14..6c8afa8deb 100644 --- a/modules/cms-kit/host/Volo.CmsKit.IdentityServer/yarn.lock +++ b/modules/cms-kit/host/Volo.CmsKit.IdentityServer/yarn.lock @@ -2,185 +2,185 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-9.2.0-rc.4.tgz#2659ec541028ec6a1688b748414fb181924f1f58" - integrity sha512-KSpfnvgRPxDb9oJWBnjpFm/FcXSTRO6aAVBlCERi4jtGzp04e//3rHnOWjv+JyxJqOP0JszWSALXK4A/oMQFNQ== +"@abp/aspnetcore.mvc.ui.theme.basic@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-9.2.0.tgz#af6ff5071cadb480b4aece0f15400d56b105a350" + integrity sha512-+LOmhSfsua7i3VQy9vYTDv7nE0fdIA+kNvorQ4wkkRzijOAlwmS4fkupglwOKJQSCWGAM7VXccPy2NzdmwvEtw== dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~9.2.0-rc.4" + "@abp/aspnetcore.mvc.ui.theme.shared" "~9.2.0" -"@abp/aspnetcore.mvc.ui.theme.shared@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-9.2.0-rc.4.tgz#4212523cc2d2db881d2a0a9c1b28f372c53c19d7" - integrity sha512-z6nCmIfcaiQ6CPHhVq0C6RYljjrqScVVj+Sf0uI8eP6qG+CVT/aEVgb+3Nc5EM5SjDvR/eTxH4J3YcVNDj32Lg== +"@abp/aspnetcore.mvc.ui.theme.shared@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-9.2.0.tgz#791f419e8e0fab229e3f93f7a90edcd259100206" + integrity sha512-Mrs+kQg0S5OyRsPBwXQTqOq2DBWDdot7emETcX/gatv26GFbRe3nTOk1E+VWD/nsxHEOKTSE8LClC6TgkMxD8Q== dependencies: - "@abp/aspnetcore.mvc.ui" "~9.2.0-rc.4" - "@abp/bootstrap" "~9.2.0-rc.4" - "@abp/bootstrap-datepicker" "~9.2.0-rc.4" - "@abp/bootstrap-daterangepicker" "~9.2.0-rc.4" - "@abp/datatables.net-bs5" "~9.2.0-rc.4" - "@abp/font-awesome" "~9.2.0-rc.4" - "@abp/jquery-form" "~9.2.0-rc.4" - "@abp/jquery-validation-unobtrusive" "~9.2.0-rc.4" - "@abp/lodash" "~9.2.0-rc.4" - "@abp/luxon" "~9.2.0-rc.4" - "@abp/malihu-custom-scrollbar-plugin" "~9.2.0-rc.4" - "@abp/moment" "~9.2.0-rc.4" - "@abp/select2" "~9.2.0-rc.4" - "@abp/sweetalert2" "~9.2.0-rc.4" - "@abp/timeago" "~9.2.0-rc.4" - -"@abp/aspnetcore.mvc.ui@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-9.2.0-rc.4.tgz#a47763a480e488363b901327d94556fdad6cccb7" - integrity sha512-7fxC3zifdnpJZwKsP1hgK0+mu9y/w4zrMY1rR8AVvcpMdt8/Mmtj6mJi+Ompv3YtO9F/Zgnxqma5R0pYMTke7g== + "@abp/aspnetcore.mvc.ui" "~9.2.0" + "@abp/bootstrap" "~9.2.0" + "@abp/bootstrap-datepicker" "~9.2.0" + "@abp/bootstrap-daterangepicker" "~9.2.0" + "@abp/datatables.net-bs5" "~9.2.0" + "@abp/font-awesome" "~9.2.0" + "@abp/jquery-form" "~9.2.0" + "@abp/jquery-validation-unobtrusive" "~9.2.0" + "@abp/lodash" "~9.2.0" + "@abp/luxon" "~9.2.0" + "@abp/malihu-custom-scrollbar-plugin" "~9.2.0" + "@abp/moment" "~9.2.0" + "@abp/select2" "~9.2.0" + "@abp/sweetalert2" "~9.2.0" + "@abp/timeago" "~9.2.0" + +"@abp/aspnetcore.mvc.ui@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-9.2.0.tgz#e3e703ea46caf04cc966ea0af6deb64427a90d4c" + integrity sha512-VHH68/7Bw7r8p70T9grnVISgYPe2t3m9199S/wAXGtpGHML/lbHhDflWbm7y1MHcrmCfaXy42O9SmTHV25BJhA== dependencies: ansi-colors "^4.1.3" -"@abp/bootstrap-datepicker@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-9.2.0-rc.4.tgz#0aec67332e3148e21658650bfaaa08c64180e2ad" - integrity sha512-CaD709aGigfQk76XDshSrctm9TkgjA+7XgnDuVraPRPwq4dwXGIhbNAiJ1+5k6OXrUHqJP3nPc4NDPZiXDwgqw== +"@abp/bootstrap-datepicker@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-9.2.0.tgz#271ff68e2cee7b4ffe5a60406561a05948d6bbe6" + integrity sha512-V8o1cn1MKXE5GH1ZpBHiWWilzxjHIp4IS6rNoCDBSnaQcVvRku9KPI8tPNQSf+4x3jBfHDV9aOBDbDGTQ6J2yw== dependencies: bootstrap-datepicker "^1.10.0" -"@abp/bootstrap-daterangepicker@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-9.2.0-rc.4.tgz#b08d564b0dfc8be62a052fc205e1445764b6a2d0" - integrity sha512-zwWkb6JaUqN2rtIGLtb0Cf1RtP0nuCFK0x2r4J9kYnv1vKiT8vrK2Jl5mJVjvdnO0JifS1rueDMPglVpOeghRw== +"@abp/bootstrap-daterangepicker@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-9.2.0.tgz#a239f8c2efce57d2e2beca70ceeede52d1b177d5" + integrity sha512-Cd9naCyepTvmUotkR1VyOBqUMgyeSXnOVWR7HxXm+jugKtnWRzrztZB6UyfnNzzjc1RMOyiAUEjzitKSJrXeoA== dependencies: bootstrap-daterangepicker "^3.1.0" -"@abp/bootstrap@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-9.2.0-rc.4.tgz#0615ec9fa7422d76e8f4af22ec28fe9672d60c38" - integrity sha512-m1ORR/R84nPEfid/x5rC5jy4orsw4yhkk4nApiW11H4Eb7ssbcviR75ugJ5GBt3GOevHHlTZWwvf8K4C+zdqZg== +"@abp/bootstrap@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-9.2.0.tgz#08859288b8372ea111a240b507047b144d6caca9" + integrity sha512-L3EZQza2c/5VmvZkLsf0EOuaMi8fseyyiwlFN65i1hpcDwhOLcaqnxMneeaSJ+Dy4xczJT+oBml9D9OSTuzmkA== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" bootstrap "^5.3.3" -"@abp/core@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-9.2.0-rc.4.tgz#b758ea117ae3e3e3596e407a347617b8fcb6c112" - integrity sha512-eNklBpyUAort/UEhgmnvMglBS/FSAzUiKalN7hgJFKx0nd3cDDkjkN6YFY8VuPInt3YfRz5omZQsGNq7eyjtbQ== +"@abp/core@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-9.2.0.tgz#db08fd34cfc891e94eb9e59ed3c0d0e6ef45c51a" + integrity sha512-3iESoHFj8I2xK81dwQVpCI6C1bc87VfWKyJE3/IUv4zWvG4QvI0aKhe1wxocmJqTjjowPUA3/fa2hvpfqPs2Bw== dependencies: - "@abp/utils" "~9.2.0-rc.4" + "@abp/utils" "~9.2.0" -"@abp/datatables.net-bs5@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-9.2.0-rc.4.tgz#75c12fe053d593b738bb5ca7394b2954409f5e00" - integrity sha512-5FG5Jc6Co9q/1xYmmW2SabSaXVkdJohPJ9XtzTthwnY8Ko5eGV7TPkEfwwsk0PLXp+Wu3ifQaZI4CIE9WR81XA== +"@abp/datatables.net-bs5@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-9.2.0.tgz#eab201c959727c27aaab30dc5bd8159249d8b54b" + integrity sha512-bmK6GKffXzYbfkDIlN27D7mohnYsXoODEiHqhZnBdIzeSJyHwrwRPRVbO1EcBn1SEBHjGJp3S69Z6gDbRs018g== dependencies: - "@abp/datatables.net" "~9.2.0-rc.4" + "@abp/datatables.net" "~9.2.0" datatables.net-bs5 "^2.1.8" -"@abp/datatables.net@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-9.2.0-rc.4.tgz#523b017e4b9ea9d3a6d3262f66bd3daaade05c0b" - integrity sha512-udCSjJYYpi/Ql/KJZxYDMxbtX6gXw7hsfMxQjP0u37JsyNLgd4fTrzaXCe7OKn3x7poJcANoqsEgWow/9R/WIg== +"@abp/datatables.net@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-9.2.0.tgz#e4880fe074d86d3c5dbd7f48c86244790fc376c2" + integrity sha512-bKaaa+tl0Pt4oNaV+X8pBbvsHc2mPYoL7yuAs+LN8ZLwBdsGoUw7RNhLQ63O3tuYdHuaHhI/mx23X6JThr0SYw== dependencies: - "@abp/jquery" "~9.2.0-rc.4" + "@abp/jquery" "~9.2.0" datatables.net "^2.1.8" -"@abp/font-awesome@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-9.2.0-rc.4.tgz#31d9fa475af3b543ddaff16e6af8caba966bd331" - integrity sha512-FYmfrf2mX5rzU+GqK078rn85UmfAwdCB8JQhnGfkylybMRJvmocRsPBIEThjlFZAPGqqvULHUTRMwnRPTgpuNw== +"@abp/font-awesome@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-9.2.0.tgz#3e359da2510cbc0e5b9e46e9cb3664baf285722e" + integrity sha512-HRGg6XK3bCxFdVvEBnBKyLamqMUrenj//E4JuKOs8DtGLVH0jTyh8TwUT5/E/pI+POV7HEOpv9WpSB2p8pfsAg== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" "@fortawesome/fontawesome-free" "^6.6.0" -"@abp/jquery-form@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-9.2.0-rc.4.tgz#b200be90031b58305a2ebfd646ffbd5ce4cca40c" - integrity sha512-ohCtIfz48E0+vNdNyKTsLlfW0NYMJfKWXd9BPp2szgBaDbC7jYdGYyABbxGxRc7mp1B8xQzRhLnTzdRtWaJemg== +"@abp/jquery-form@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-9.2.0.tgz#40fac992584c26e6c54f66e7f68f8abf8944a626" + integrity sha512-B7Shq1itQjsnzdU1kjLpGHWjkSGFhIM2iF5BNMkqcylG3Yq1Se4+8QPoJpn/soilmtX8gbO2fx8TOejfIazXIw== dependencies: - "@abp/jquery" "~9.2.0-rc.4" + "@abp/jquery" "~9.2.0" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-9.2.0-rc.4.tgz#0329f9268b83e0832e26ea3f6523dbc5226b9114" - integrity sha512-iOnw5YoiC3bCIFRjuXPagz+ixFV+PM36hP0UJ4x03BK6GDJnAvjLshYe6qnQG9Xnz1arzmIX5ud5EjWvWSBIoA== +"@abp/jquery-validation-unobtrusive@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-9.2.0.tgz#c2df51d024d48e71f0e7fb8d4207a8b2855393f4" + integrity sha512-c1cPfWVdo+gpaMoegAkw0DzGL2fy/1ylEi/shb95MAGt3iyECVx+X+R/XOxbVHKVI57D4d5IGj6cXYBhdKkvAw== dependencies: - "@abp/jquery-validation" "~9.2.0-rc.4" + "@abp/jquery-validation" "~9.2.0" jquery-validation-unobtrusive "^4.0.0" -"@abp/jquery-validation@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-9.2.0-rc.4.tgz#073e4cbf905f652ce83633b98696b559916b984d" - integrity sha512-pS2Y2c6gXFOzfKeM2/JlW56ZmrUeflT2av64aWrFYnv7IgJUp38PEjR10uPy3g/mP2c9jis8dOfkdbRrlHwf+g== +"@abp/jquery-validation@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-9.2.0.tgz#97688d2e3c25699d4368ebf7234e04943aa5e6ab" + integrity sha512-UO+T6SqXBrh0ODwvMm840CGbE2fdYNo5oqJL4V4JbHv9uz7MH+k0bB1DK7mFb94iDM7QcglLzIfcN4hLRV7arw== dependencies: - "@abp/jquery" "~9.2.0-rc.4" + "@abp/jquery" "~9.2.0" jquery-validation "^1.21.0" -"@abp/jquery@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-9.2.0-rc.4.tgz#ac8a6ce969d58cc4f05d33adcfad76e7442231e8" - integrity sha512-N5hZ8VGXJUn5QW1mSXHIO7SjdvoyrkCyH5j8DhXJO1mDlS1L36n+MJHFwQK7UZpHcFOuklAJ7f417r3sISOBCw== +"@abp/jquery@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-9.2.0.tgz#38c249be6eda0cdc899cc8a1f20e5152c39ae9a0" + integrity sha512-sIe3Zk+8549ytydCtDlECZ930PapW/2J0652two/sJwYG/SGUGxYQbw3QnJGFTcL9TFwcWwRj5iWX0gWrLEIyA== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" jquery "~3.7.1" -"@abp/lodash@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-9.2.0-rc.4.tgz#e428df195ed90414a9a412e1dcb6494344475f82" - integrity sha512-WsbyBNA57/giyI5pnM7Y7dk0p56hMDS5OMdmNilaGOWMnvz7mMTJNvStMBqS7fqekzfXsFGfrLbTmehY3pTYwQ== +"@abp/lodash@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-9.2.0.tgz#7fa4c9e956c766e34ec4677d2102a6d00f899a4b" + integrity sha512-2elXj/eWw875tF9ixbOm3uqXCxGaG5gL9Tub5k7cP+XhFpNBOYijNaXdN8SeDSxr83WDVWdrk//OQL8BF7XPdw== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" lodash "^4.17.21" -"@abp/luxon@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-9.2.0-rc.4.tgz#dacb173d24987a1ab4fb7e53dff9f91728a1efaa" - integrity sha512-qNuYml25Q2ODzZ830FhijGY66WvAUa02mB9hgulpFlF0p2UiFmhA0dMNVahEuytoFodjkSrhLP6cGfONf7ht8A== +"@abp/luxon@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-9.2.0.tgz#865db7b60dba4029134fb4a4b5eaa08c723dcea8" + integrity sha512-LWjczvzu1gFIq0/2fRz+bJW2+zsmXAmfz0I+lZ3wmqUdkViqAqwTa+5NMIl2tC92u4Dv3LGXKtH37Jw8m+XjTg== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" luxon "^3.5.0" -"@abp/malihu-custom-scrollbar-plugin@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-9.2.0-rc.4.tgz#9b0c0444ec8f11c8c8040387f83080e51a281657" - integrity sha512-cvYJI/4jkzOWSvTY0C/PxSq62SxEq3UlaXpefj/W+CAwPVjG+Yik2YHt5qgcmRRn0oF5V/XRJHB7A4H23+VKyA== +"@abp/malihu-custom-scrollbar-plugin@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-9.2.0.tgz#09722b1e7ca34b96e2a68368db0e96cdf9ab0e6c" + integrity sha512-kfDf/1RwGtAlos/7BW+7xbh3LtJ4VG0Z4mxS+b2HsywAwlt/kE5FltfBj2ResQb030bsGNl7A5JglV9Pv1UlPw== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/moment@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-9.2.0-rc.4.tgz#527ed54f4330a77ec2ea1411bfffe2d57e62d172" - integrity sha512-zIRTuMCcPAfJAU64DUeU7dJPUJqoyJ7TvHBhrUcmmGZK7IzNtaP3/KAGjZIHhHbUwIjidjCxlF2YnW1io7hcJg== +"@abp/moment@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-9.2.0.tgz#137d688af4df195742061ac2b8a2bf460a027071" + integrity sha512-15aTjYAxHK+upkiZ94XCe8CoSPKMl1D8f6GXJIfwPkuYZ+na4ma17qBu4P8bFsc4gu3ngxYiLHRSzYzr4oCSYQ== dependencies: moment "^2.30.1" -"@abp/select2@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-9.2.0-rc.4.tgz#6a8c6347ec75fcf60d76bc50ecca8008253fc7c7" - integrity sha512-OMyXr+gYMM81CQliqDVnEGsK2/WbmC4N5IZ1ZSJl+mW7cUClmyg9CLg418ID/7OU+ItUwbw9YvG4RPwnGF1ujw== +"@abp/select2@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-9.2.0.tgz#c96d869be0d3298ed7c0888288ea9829e6266cd4" + integrity sha512-V+qx9hw3oe7o0WbG03ZgAjbqRJPVuedzrdy7ExEdueTc6LRP/WEgbVpXhsNISObtouE6Dadwp3iXYSExgNUC6A== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" select2 "^4.0.13" -"@abp/sweetalert2@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-9.2.0-rc.4.tgz#26d4e9c935f20a7e0bde23327c6761fe6466cd41" - integrity sha512-zhwnA0WpkNO6JuqbBgO6PQ817wuThw6mtGcP96V1m/xtckJWNDub1gby0gJqnWqnq5Cuj4u9gPRkkcVmfPn8ZA== +"@abp/sweetalert2@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-9.2.0.tgz#826d6dd0b70c35a7401cc884fb1e82af99a0305d" + integrity sha512-0r338ayjaL9uzmLKE8oHpcMgJeVgVoMYfhQAPINeQHv1TPXuYCLo0aoRNoLsfmUo3ayYBBa3zOrugFIVis7Q6A== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" sweetalert2 "^11.14.1" -"@abp/timeago@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-9.2.0-rc.4.tgz#494b25062f14f8a139ed66958991d34fcf4023a3" - integrity sha512-6HoEkdQCYDxrEGSjxHXN2Vj5ipc3rIXTbCqj7dYI9K5tuaQ4Wq0Obz/Wx6UZ71ZjzGAeAQkDeXVc68GjQyLX6Q== +"@abp/timeago@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-9.2.0.tgz#79bbe6dd32b0ee7df2e8ebd05274a0ecc7882ba7" + integrity sha512-hEUi5re5N1YkDSpaUaUtXF1Mz4YyiEvNzVADbKRz11kbR4ZAFzcvVqsQLeNo7qnuFLfJNAtuzyjkuxwL75kmaA== dependencies: - "@abp/jquery" "~9.2.0-rc.4" + "@abp/jquery" "~9.2.0" timeago "^1.6.7" -"@abp/utils@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-9.2.0-rc.4.tgz#350eb915af78ecdbc2a0a15a1ad4bac4212cefc2" - integrity sha512-PZzfkiq6sthX5+Icw7h3HVpnDVgN7ZnmOnIyzKhBeHALpH+JfO7QruwJl96Moba4LGmzPdFdLkwm2qznVoqyZA== +"@abp/utils@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-9.2.0.tgz#bf32ced1175e45fbe010c3cb806c7cd37f85089c" + integrity sha512-aciBuXhzlaqe+o7mNt536bCk425cmxY5BE0wwl13u3pX3LfWYWLEgwl8GS0aeI11TS1/7+1N85RJELyz/+y0hQ== dependencies: just-compare "^2.3.0" diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Host/package.json b/modules/cms-kit/host/Volo.CmsKit.Web.Host/package.json index 367ececa5e..8bcd4ab173 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Host/package.json +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Host/package.json @@ -3,6 +3,6 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "~9.2.0-rc.4" + "@abp/aspnetcore.mvc.ui.theme.basic": "~9.2.0" } } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Host/yarn.lock b/modules/cms-kit/host/Volo.CmsKit.Web.Host/yarn.lock index 682f82ae14..6c8afa8deb 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Host/yarn.lock +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Host/yarn.lock @@ -2,185 +2,185 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-9.2.0-rc.4.tgz#2659ec541028ec6a1688b748414fb181924f1f58" - integrity sha512-KSpfnvgRPxDb9oJWBnjpFm/FcXSTRO6aAVBlCERi4jtGzp04e//3rHnOWjv+JyxJqOP0JszWSALXK4A/oMQFNQ== +"@abp/aspnetcore.mvc.ui.theme.basic@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-9.2.0.tgz#af6ff5071cadb480b4aece0f15400d56b105a350" + integrity sha512-+LOmhSfsua7i3VQy9vYTDv7nE0fdIA+kNvorQ4wkkRzijOAlwmS4fkupglwOKJQSCWGAM7VXccPy2NzdmwvEtw== dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~9.2.0-rc.4" + "@abp/aspnetcore.mvc.ui.theme.shared" "~9.2.0" -"@abp/aspnetcore.mvc.ui.theme.shared@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-9.2.0-rc.4.tgz#4212523cc2d2db881d2a0a9c1b28f372c53c19d7" - integrity sha512-z6nCmIfcaiQ6CPHhVq0C6RYljjrqScVVj+Sf0uI8eP6qG+CVT/aEVgb+3Nc5EM5SjDvR/eTxH4J3YcVNDj32Lg== +"@abp/aspnetcore.mvc.ui.theme.shared@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-9.2.0.tgz#791f419e8e0fab229e3f93f7a90edcd259100206" + integrity sha512-Mrs+kQg0S5OyRsPBwXQTqOq2DBWDdot7emETcX/gatv26GFbRe3nTOk1E+VWD/nsxHEOKTSE8LClC6TgkMxD8Q== dependencies: - "@abp/aspnetcore.mvc.ui" "~9.2.0-rc.4" - "@abp/bootstrap" "~9.2.0-rc.4" - "@abp/bootstrap-datepicker" "~9.2.0-rc.4" - "@abp/bootstrap-daterangepicker" "~9.2.0-rc.4" - "@abp/datatables.net-bs5" "~9.2.0-rc.4" - "@abp/font-awesome" "~9.2.0-rc.4" - "@abp/jquery-form" "~9.2.0-rc.4" - "@abp/jquery-validation-unobtrusive" "~9.2.0-rc.4" - "@abp/lodash" "~9.2.0-rc.4" - "@abp/luxon" "~9.2.0-rc.4" - "@abp/malihu-custom-scrollbar-plugin" "~9.2.0-rc.4" - "@abp/moment" "~9.2.0-rc.4" - "@abp/select2" "~9.2.0-rc.4" - "@abp/sweetalert2" "~9.2.0-rc.4" - "@abp/timeago" "~9.2.0-rc.4" - -"@abp/aspnetcore.mvc.ui@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-9.2.0-rc.4.tgz#a47763a480e488363b901327d94556fdad6cccb7" - integrity sha512-7fxC3zifdnpJZwKsP1hgK0+mu9y/w4zrMY1rR8AVvcpMdt8/Mmtj6mJi+Ompv3YtO9F/Zgnxqma5R0pYMTke7g== + "@abp/aspnetcore.mvc.ui" "~9.2.0" + "@abp/bootstrap" "~9.2.0" + "@abp/bootstrap-datepicker" "~9.2.0" + "@abp/bootstrap-daterangepicker" "~9.2.0" + "@abp/datatables.net-bs5" "~9.2.0" + "@abp/font-awesome" "~9.2.0" + "@abp/jquery-form" "~9.2.0" + "@abp/jquery-validation-unobtrusive" "~9.2.0" + "@abp/lodash" "~9.2.0" + "@abp/luxon" "~9.2.0" + "@abp/malihu-custom-scrollbar-plugin" "~9.2.0" + "@abp/moment" "~9.2.0" + "@abp/select2" "~9.2.0" + "@abp/sweetalert2" "~9.2.0" + "@abp/timeago" "~9.2.0" + +"@abp/aspnetcore.mvc.ui@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-9.2.0.tgz#e3e703ea46caf04cc966ea0af6deb64427a90d4c" + integrity sha512-VHH68/7Bw7r8p70T9grnVISgYPe2t3m9199S/wAXGtpGHML/lbHhDflWbm7y1MHcrmCfaXy42O9SmTHV25BJhA== dependencies: ansi-colors "^4.1.3" -"@abp/bootstrap-datepicker@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-9.2.0-rc.4.tgz#0aec67332e3148e21658650bfaaa08c64180e2ad" - integrity sha512-CaD709aGigfQk76XDshSrctm9TkgjA+7XgnDuVraPRPwq4dwXGIhbNAiJ1+5k6OXrUHqJP3nPc4NDPZiXDwgqw== +"@abp/bootstrap-datepicker@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-9.2.0.tgz#271ff68e2cee7b4ffe5a60406561a05948d6bbe6" + integrity sha512-V8o1cn1MKXE5GH1ZpBHiWWilzxjHIp4IS6rNoCDBSnaQcVvRku9KPI8tPNQSf+4x3jBfHDV9aOBDbDGTQ6J2yw== dependencies: bootstrap-datepicker "^1.10.0" -"@abp/bootstrap-daterangepicker@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-9.2.0-rc.4.tgz#b08d564b0dfc8be62a052fc205e1445764b6a2d0" - integrity sha512-zwWkb6JaUqN2rtIGLtb0Cf1RtP0nuCFK0x2r4J9kYnv1vKiT8vrK2Jl5mJVjvdnO0JifS1rueDMPglVpOeghRw== +"@abp/bootstrap-daterangepicker@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-9.2.0.tgz#a239f8c2efce57d2e2beca70ceeede52d1b177d5" + integrity sha512-Cd9naCyepTvmUotkR1VyOBqUMgyeSXnOVWR7HxXm+jugKtnWRzrztZB6UyfnNzzjc1RMOyiAUEjzitKSJrXeoA== dependencies: bootstrap-daterangepicker "^3.1.0" -"@abp/bootstrap@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-9.2.0-rc.4.tgz#0615ec9fa7422d76e8f4af22ec28fe9672d60c38" - integrity sha512-m1ORR/R84nPEfid/x5rC5jy4orsw4yhkk4nApiW11H4Eb7ssbcviR75ugJ5GBt3GOevHHlTZWwvf8K4C+zdqZg== +"@abp/bootstrap@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-9.2.0.tgz#08859288b8372ea111a240b507047b144d6caca9" + integrity sha512-L3EZQza2c/5VmvZkLsf0EOuaMi8fseyyiwlFN65i1hpcDwhOLcaqnxMneeaSJ+Dy4xczJT+oBml9D9OSTuzmkA== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" bootstrap "^5.3.3" -"@abp/core@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-9.2.0-rc.4.tgz#b758ea117ae3e3e3596e407a347617b8fcb6c112" - integrity sha512-eNklBpyUAort/UEhgmnvMglBS/FSAzUiKalN7hgJFKx0nd3cDDkjkN6YFY8VuPInt3YfRz5omZQsGNq7eyjtbQ== +"@abp/core@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-9.2.0.tgz#db08fd34cfc891e94eb9e59ed3c0d0e6ef45c51a" + integrity sha512-3iESoHFj8I2xK81dwQVpCI6C1bc87VfWKyJE3/IUv4zWvG4QvI0aKhe1wxocmJqTjjowPUA3/fa2hvpfqPs2Bw== dependencies: - "@abp/utils" "~9.2.0-rc.4" + "@abp/utils" "~9.2.0" -"@abp/datatables.net-bs5@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-9.2.0-rc.4.tgz#75c12fe053d593b738bb5ca7394b2954409f5e00" - integrity sha512-5FG5Jc6Co9q/1xYmmW2SabSaXVkdJohPJ9XtzTthwnY8Ko5eGV7TPkEfwwsk0PLXp+Wu3ifQaZI4CIE9WR81XA== +"@abp/datatables.net-bs5@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-9.2.0.tgz#eab201c959727c27aaab30dc5bd8159249d8b54b" + integrity sha512-bmK6GKffXzYbfkDIlN27D7mohnYsXoODEiHqhZnBdIzeSJyHwrwRPRVbO1EcBn1SEBHjGJp3S69Z6gDbRs018g== dependencies: - "@abp/datatables.net" "~9.2.0-rc.4" + "@abp/datatables.net" "~9.2.0" datatables.net-bs5 "^2.1.8" -"@abp/datatables.net@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-9.2.0-rc.4.tgz#523b017e4b9ea9d3a6d3262f66bd3daaade05c0b" - integrity sha512-udCSjJYYpi/Ql/KJZxYDMxbtX6gXw7hsfMxQjP0u37JsyNLgd4fTrzaXCe7OKn3x7poJcANoqsEgWow/9R/WIg== +"@abp/datatables.net@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-9.2.0.tgz#e4880fe074d86d3c5dbd7f48c86244790fc376c2" + integrity sha512-bKaaa+tl0Pt4oNaV+X8pBbvsHc2mPYoL7yuAs+LN8ZLwBdsGoUw7RNhLQ63O3tuYdHuaHhI/mx23X6JThr0SYw== dependencies: - "@abp/jquery" "~9.2.0-rc.4" + "@abp/jquery" "~9.2.0" datatables.net "^2.1.8" -"@abp/font-awesome@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-9.2.0-rc.4.tgz#31d9fa475af3b543ddaff16e6af8caba966bd331" - integrity sha512-FYmfrf2mX5rzU+GqK078rn85UmfAwdCB8JQhnGfkylybMRJvmocRsPBIEThjlFZAPGqqvULHUTRMwnRPTgpuNw== +"@abp/font-awesome@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-9.2.0.tgz#3e359da2510cbc0e5b9e46e9cb3664baf285722e" + integrity sha512-HRGg6XK3bCxFdVvEBnBKyLamqMUrenj//E4JuKOs8DtGLVH0jTyh8TwUT5/E/pI+POV7HEOpv9WpSB2p8pfsAg== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" "@fortawesome/fontawesome-free" "^6.6.0" -"@abp/jquery-form@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-9.2.0-rc.4.tgz#b200be90031b58305a2ebfd646ffbd5ce4cca40c" - integrity sha512-ohCtIfz48E0+vNdNyKTsLlfW0NYMJfKWXd9BPp2szgBaDbC7jYdGYyABbxGxRc7mp1B8xQzRhLnTzdRtWaJemg== +"@abp/jquery-form@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-9.2.0.tgz#40fac992584c26e6c54f66e7f68f8abf8944a626" + integrity sha512-B7Shq1itQjsnzdU1kjLpGHWjkSGFhIM2iF5BNMkqcylG3Yq1Se4+8QPoJpn/soilmtX8gbO2fx8TOejfIazXIw== dependencies: - "@abp/jquery" "~9.2.0-rc.4" + "@abp/jquery" "~9.2.0" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-9.2.0-rc.4.tgz#0329f9268b83e0832e26ea3f6523dbc5226b9114" - integrity sha512-iOnw5YoiC3bCIFRjuXPagz+ixFV+PM36hP0UJ4x03BK6GDJnAvjLshYe6qnQG9Xnz1arzmIX5ud5EjWvWSBIoA== +"@abp/jquery-validation-unobtrusive@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-9.2.0.tgz#c2df51d024d48e71f0e7fb8d4207a8b2855393f4" + integrity sha512-c1cPfWVdo+gpaMoegAkw0DzGL2fy/1ylEi/shb95MAGt3iyECVx+X+R/XOxbVHKVI57D4d5IGj6cXYBhdKkvAw== dependencies: - "@abp/jquery-validation" "~9.2.0-rc.4" + "@abp/jquery-validation" "~9.2.0" jquery-validation-unobtrusive "^4.0.0" -"@abp/jquery-validation@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-9.2.0-rc.4.tgz#073e4cbf905f652ce83633b98696b559916b984d" - integrity sha512-pS2Y2c6gXFOzfKeM2/JlW56ZmrUeflT2av64aWrFYnv7IgJUp38PEjR10uPy3g/mP2c9jis8dOfkdbRrlHwf+g== +"@abp/jquery-validation@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-9.2.0.tgz#97688d2e3c25699d4368ebf7234e04943aa5e6ab" + integrity sha512-UO+T6SqXBrh0ODwvMm840CGbE2fdYNo5oqJL4V4JbHv9uz7MH+k0bB1DK7mFb94iDM7QcglLzIfcN4hLRV7arw== dependencies: - "@abp/jquery" "~9.2.0-rc.4" + "@abp/jquery" "~9.2.0" jquery-validation "^1.21.0" -"@abp/jquery@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-9.2.0-rc.4.tgz#ac8a6ce969d58cc4f05d33adcfad76e7442231e8" - integrity sha512-N5hZ8VGXJUn5QW1mSXHIO7SjdvoyrkCyH5j8DhXJO1mDlS1L36n+MJHFwQK7UZpHcFOuklAJ7f417r3sISOBCw== +"@abp/jquery@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-9.2.0.tgz#38c249be6eda0cdc899cc8a1f20e5152c39ae9a0" + integrity sha512-sIe3Zk+8549ytydCtDlECZ930PapW/2J0652two/sJwYG/SGUGxYQbw3QnJGFTcL9TFwcWwRj5iWX0gWrLEIyA== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" jquery "~3.7.1" -"@abp/lodash@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-9.2.0-rc.4.tgz#e428df195ed90414a9a412e1dcb6494344475f82" - integrity sha512-WsbyBNA57/giyI5pnM7Y7dk0p56hMDS5OMdmNilaGOWMnvz7mMTJNvStMBqS7fqekzfXsFGfrLbTmehY3pTYwQ== +"@abp/lodash@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-9.2.0.tgz#7fa4c9e956c766e34ec4677d2102a6d00f899a4b" + integrity sha512-2elXj/eWw875tF9ixbOm3uqXCxGaG5gL9Tub5k7cP+XhFpNBOYijNaXdN8SeDSxr83WDVWdrk//OQL8BF7XPdw== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" lodash "^4.17.21" -"@abp/luxon@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-9.2.0-rc.4.tgz#dacb173d24987a1ab4fb7e53dff9f91728a1efaa" - integrity sha512-qNuYml25Q2ODzZ830FhijGY66WvAUa02mB9hgulpFlF0p2UiFmhA0dMNVahEuytoFodjkSrhLP6cGfONf7ht8A== +"@abp/luxon@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-9.2.0.tgz#865db7b60dba4029134fb4a4b5eaa08c723dcea8" + integrity sha512-LWjczvzu1gFIq0/2fRz+bJW2+zsmXAmfz0I+lZ3wmqUdkViqAqwTa+5NMIl2tC92u4Dv3LGXKtH37Jw8m+XjTg== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" luxon "^3.5.0" -"@abp/malihu-custom-scrollbar-plugin@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-9.2.0-rc.4.tgz#9b0c0444ec8f11c8c8040387f83080e51a281657" - integrity sha512-cvYJI/4jkzOWSvTY0C/PxSq62SxEq3UlaXpefj/W+CAwPVjG+Yik2YHt5qgcmRRn0oF5V/XRJHB7A4H23+VKyA== +"@abp/malihu-custom-scrollbar-plugin@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-9.2.0.tgz#09722b1e7ca34b96e2a68368db0e96cdf9ab0e6c" + integrity sha512-kfDf/1RwGtAlos/7BW+7xbh3LtJ4VG0Z4mxS+b2HsywAwlt/kE5FltfBj2ResQb030bsGNl7A5JglV9Pv1UlPw== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/moment@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-9.2.0-rc.4.tgz#527ed54f4330a77ec2ea1411bfffe2d57e62d172" - integrity sha512-zIRTuMCcPAfJAU64DUeU7dJPUJqoyJ7TvHBhrUcmmGZK7IzNtaP3/KAGjZIHhHbUwIjidjCxlF2YnW1io7hcJg== +"@abp/moment@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-9.2.0.tgz#137d688af4df195742061ac2b8a2bf460a027071" + integrity sha512-15aTjYAxHK+upkiZ94XCe8CoSPKMl1D8f6GXJIfwPkuYZ+na4ma17qBu4P8bFsc4gu3ngxYiLHRSzYzr4oCSYQ== dependencies: moment "^2.30.1" -"@abp/select2@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-9.2.0-rc.4.tgz#6a8c6347ec75fcf60d76bc50ecca8008253fc7c7" - integrity sha512-OMyXr+gYMM81CQliqDVnEGsK2/WbmC4N5IZ1ZSJl+mW7cUClmyg9CLg418ID/7OU+ItUwbw9YvG4RPwnGF1ujw== +"@abp/select2@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-9.2.0.tgz#c96d869be0d3298ed7c0888288ea9829e6266cd4" + integrity sha512-V+qx9hw3oe7o0WbG03ZgAjbqRJPVuedzrdy7ExEdueTc6LRP/WEgbVpXhsNISObtouE6Dadwp3iXYSExgNUC6A== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" select2 "^4.0.13" -"@abp/sweetalert2@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-9.2.0-rc.4.tgz#26d4e9c935f20a7e0bde23327c6761fe6466cd41" - integrity sha512-zhwnA0WpkNO6JuqbBgO6PQ817wuThw6mtGcP96V1m/xtckJWNDub1gby0gJqnWqnq5Cuj4u9gPRkkcVmfPn8ZA== +"@abp/sweetalert2@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-9.2.0.tgz#826d6dd0b70c35a7401cc884fb1e82af99a0305d" + integrity sha512-0r338ayjaL9uzmLKE8oHpcMgJeVgVoMYfhQAPINeQHv1TPXuYCLo0aoRNoLsfmUo3ayYBBa3zOrugFIVis7Q6A== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" sweetalert2 "^11.14.1" -"@abp/timeago@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-9.2.0-rc.4.tgz#494b25062f14f8a139ed66958991d34fcf4023a3" - integrity sha512-6HoEkdQCYDxrEGSjxHXN2Vj5ipc3rIXTbCqj7dYI9K5tuaQ4Wq0Obz/Wx6UZ71ZjzGAeAQkDeXVc68GjQyLX6Q== +"@abp/timeago@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-9.2.0.tgz#79bbe6dd32b0ee7df2e8ebd05274a0ecc7882ba7" + integrity sha512-hEUi5re5N1YkDSpaUaUtXF1Mz4YyiEvNzVADbKRz11kbR4ZAFzcvVqsQLeNo7qnuFLfJNAtuzyjkuxwL75kmaA== dependencies: - "@abp/jquery" "~9.2.0-rc.4" + "@abp/jquery" "~9.2.0" timeago "^1.6.7" -"@abp/utils@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-9.2.0-rc.4.tgz#350eb915af78ecdbc2a0a15a1ad4bac4212cefc2" - integrity sha512-PZzfkiq6sthX5+Icw7h3HVpnDVgN7ZnmOnIyzKhBeHALpH+JfO7QruwJl96Moba4LGmzPdFdLkwm2qznVoqyZA== +"@abp/utils@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-9.2.0.tgz#bf32ced1175e45fbe010c3cb806c7cd37f85089c" + integrity sha512-aciBuXhzlaqe+o7mNt536bCk425cmxY5BE0wwl13u3pX3LfWYWLEgwl8GS0aeI11TS1/7+1N85RJELyz/+y0hQ== dependencies: just-compare "^2.3.0" diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/package.json b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/package.json index 1134f3a375..697f1c7ba2 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/package.json +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/package.json @@ -3,7 +3,7 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "~9.2.0-rc.4", - "@abp/cms-kit": "9.2.0-rc.4" + "@abp/aspnetcore.mvc.ui.theme.basic": "~9.2.0", + "@abp/cms-kit": "9.2.0" } } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/yarn.lock b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/yarn.lock index 1f632241e5..37cacca8fb 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/yarn.lock +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/yarn.lock @@ -2,293 +2,293 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-9.2.0-rc.4.tgz#2659ec541028ec6a1688b748414fb181924f1f58" - integrity sha512-KSpfnvgRPxDb9oJWBnjpFm/FcXSTRO6aAVBlCERi4jtGzp04e//3rHnOWjv+JyxJqOP0JszWSALXK4A/oMQFNQ== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~9.2.0-rc.4" - -"@abp/aspnetcore.mvc.ui.theme.shared@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-9.2.0-rc.4.tgz#4212523cc2d2db881d2a0a9c1b28f372c53c19d7" - integrity sha512-z6nCmIfcaiQ6CPHhVq0C6RYljjrqScVVj+Sf0uI8eP6qG+CVT/aEVgb+3Nc5EM5SjDvR/eTxH4J3YcVNDj32Lg== - dependencies: - "@abp/aspnetcore.mvc.ui" "~9.2.0-rc.4" - "@abp/bootstrap" "~9.2.0-rc.4" - "@abp/bootstrap-datepicker" "~9.2.0-rc.4" - "@abp/bootstrap-daterangepicker" "~9.2.0-rc.4" - "@abp/datatables.net-bs5" "~9.2.0-rc.4" - "@abp/font-awesome" "~9.2.0-rc.4" - "@abp/jquery-form" "~9.2.0-rc.4" - "@abp/jquery-validation-unobtrusive" "~9.2.0-rc.4" - "@abp/lodash" "~9.2.0-rc.4" - "@abp/luxon" "~9.2.0-rc.4" - "@abp/malihu-custom-scrollbar-plugin" "~9.2.0-rc.4" - "@abp/moment" "~9.2.0-rc.4" - "@abp/select2" "~9.2.0-rc.4" - "@abp/sweetalert2" "~9.2.0-rc.4" - "@abp/timeago" "~9.2.0-rc.4" - -"@abp/aspnetcore.mvc.ui@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-9.2.0-rc.4.tgz#a47763a480e488363b901327d94556fdad6cccb7" - integrity sha512-7fxC3zifdnpJZwKsP1hgK0+mu9y/w4zrMY1rR8AVvcpMdt8/Mmtj6mJi+Ompv3YtO9F/Zgnxqma5R0pYMTke7g== +"@abp/aspnetcore.mvc.ui.theme.basic@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-9.2.0.tgz#af6ff5071cadb480b4aece0f15400d56b105a350" + integrity sha512-+LOmhSfsua7i3VQy9vYTDv7nE0fdIA+kNvorQ4wkkRzijOAlwmS4fkupglwOKJQSCWGAM7VXccPy2NzdmwvEtw== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~9.2.0" + +"@abp/aspnetcore.mvc.ui.theme.shared@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-9.2.0.tgz#791f419e8e0fab229e3f93f7a90edcd259100206" + integrity sha512-Mrs+kQg0S5OyRsPBwXQTqOq2DBWDdot7emETcX/gatv26GFbRe3nTOk1E+VWD/nsxHEOKTSE8LClC6TgkMxD8Q== + dependencies: + "@abp/aspnetcore.mvc.ui" "~9.2.0" + "@abp/bootstrap" "~9.2.0" + "@abp/bootstrap-datepicker" "~9.2.0" + "@abp/bootstrap-daterangepicker" "~9.2.0" + "@abp/datatables.net-bs5" "~9.2.0" + "@abp/font-awesome" "~9.2.0" + "@abp/jquery-form" "~9.2.0" + "@abp/jquery-validation-unobtrusive" "~9.2.0" + "@abp/lodash" "~9.2.0" + "@abp/luxon" "~9.2.0" + "@abp/malihu-custom-scrollbar-plugin" "~9.2.0" + "@abp/moment" "~9.2.0" + "@abp/select2" "~9.2.0" + "@abp/sweetalert2" "~9.2.0" + "@abp/timeago" "~9.2.0" + +"@abp/aspnetcore.mvc.ui@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-9.2.0.tgz#e3e703ea46caf04cc966ea0af6deb64427a90d4c" + integrity sha512-VHH68/7Bw7r8p70T9grnVISgYPe2t3m9199S/wAXGtpGHML/lbHhDflWbm7y1MHcrmCfaXy42O9SmTHV25BJhA== dependencies: ansi-colors "^4.1.3" -"@abp/bootstrap-datepicker@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-9.2.0-rc.4.tgz#0aec67332e3148e21658650bfaaa08c64180e2ad" - integrity sha512-CaD709aGigfQk76XDshSrctm9TkgjA+7XgnDuVraPRPwq4dwXGIhbNAiJ1+5k6OXrUHqJP3nPc4NDPZiXDwgqw== +"@abp/bootstrap-datepicker@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-9.2.0.tgz#271ff68e2cee7b4ffe5a60406561a05948d6bbe6" + integrity sha512-V8o1cn1MKXE5GH1ZpBHiWWilzxjHIp4IS6rNoCDBSnaQcVvRku9KPI8tPNQSf+4x3jBfHDV9aOBDbDGTQ6J2yw== dependencies: bootstrap-datepicker "^1.10.0" -"@abp/bootstrap-daterangepicker@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-9.2.0-rc.4.tgz#b08d564b0dfc8be62a052fc205e1445764b6a2d0" - integrity sha512-zwWkb6JaUqN2rtIGLtb0Cf1RtP0nuCFK0x2r4J9kYnv1vKiT8vrK2Jl5mJVjvdnO0JifS1rueDMPglVpOeghRw== +"@abp/bootstrap-daterangepicker@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-9.2.0.tgz#a239f8c2efce57d2e2beca70ceeede52d1b177d5" + integrity sha512-Cd9naCyepTvmUotkR1VyOBqUMgyeSXnOVWR7HxXm+jugKtnWRzrztZB6UyfnNzzjc1RMOyiAUEjzitKSJrXeoA== dependencies: bootstrap-daterangepicker "^3.1.0" -"@abp/bootstrap@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-9.2.0-rc.4.tgz#0615ec9fa7422d76e8f4af22ec28fe9672d60c38" - integrity sha512-m1ORR/R84nPEfid/x5rC5jy4orsw4yhkk4nApiW11H4Eb7ssbcviR75ugJ5GBt3GOevHHlTZWwvf8K4C+zdqZg== +"@abp/bootstrap@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-9.2.0.tgz#08859288b8372ea111a240b507047b144d6caca9" + integrity sha512-L3EZQza2c/5VmvZkLsf0EOuaMi8fseyyiwlFN65i1hpcDwhOLcaqnxMneeaSJ+Dy4xczJT+oBml9D9OSTuzmkA== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" bootstrap "^5.3.3" -"@abp/clipboard@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-9.2.0-rc.4.tgz#e91e8c9b9947cef648e31f17ac8050d342a88416" - integrity sha512-iUvCQK3YJKPflLWkXNsueXit+Ipez5+R5q4OdngcvTmVXIUoH8t+3iiM+Q7ohA0vRknsdEGPMUUS7TnDW9fVqA== +"@abp/clipboard@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-9.2.0.tgz#348a0e45752c7eb055fb00af52660593ad340caf" + integrity sha512-2+wt2ShLBfoHqx0DNNevJkaz1POLcs1tcK1hL4ZqsjOnS7BrTk1r8zwNvCw1XEeH2S1rPftAWH4PvzL4j86DFA== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" clipboard "^2.0.11" -"@abp/cms-kit.admin@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/cms-kit.admin/-/cms-kit.admin-9.2.0-rc.4.tgz#0e83fbeac3fe1191b82defaeb8959c69c9458593" - integrity sha512-xpuaCV+/G9kgzTCWhIfLuEIwWTCq1W3B780eyJ4fnLmg+17BOv+LsP6ygGqARnmjsWYEX6wG1C3NdDkkNE4Dlg== +"@abp/cms-kit.admin@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/cms-kit.admin/-/cms-kit.admin-9.2.0.tgz#b86b76692214ab793175d275c9c2845ac44524ce" + integrity sha512-s5Mh7OrDBngxD67AE5amtFFCpqY3ZaYVCPnboIvsMNiGk5U3JTqRZU+Ec1L1OpuoBg+jJDbKvPGQEFRuadMKQA== dependencies: - "@abp/codemirror" "~9.2.0-rc.4" - "@abp/jstree" "~9.2.0-rc.4" - "@abp/markdown-it" "~9.2.0-rc.4" - "@abp/slugify" "~9.2.0-rc.4" - "@abp/tui-editor" "~9.2.0-rc.4" - "@abp/uppy" "~9.2.0-rc.4" + "@abp/codemirror" "~9.2.0" + "@abp/jstree" "~9.2.0" + "@abp/markdown-it" "~9.2.0" + "@abp/slugify" "~9.2.0" + "@abp/tui-editor" "~9.2.0" + "@abp/uppy" "~9.2.0" -"@abp/cms-kit.public@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/cms-kit.public/-/cms-kit.public-9.2.0-rc.4.tgz#5d2f4bdf4db020c2fb60d58a67314c28dac953a0" - integrity sha512-WFRLfDQDL9WNRlvRgzOI2TWliGWkdk3hzVwnYcPint0p7tBjeVFkpEPVYBR33hkLYJJAKCgPKf1xnzPfLwfUgg== +"@abp/cms-kit.public@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/cms-kit.public/-/cms-kit.public-9.2.0.tgz#a85c5923593354614f7a339a5ef17b12ea71a2ea" + integrity sha512-W2KhpFZLBK+Q9ZdHI0IYhrfC1ZRem+Ox55tg1G0Ai3TabOLMyr6ubgE4maU6BUNak76DKBkzDXB/SxNFWMvS+g== dependencies: - "@abp/highlight.js" "~9.2.0-rc.4" - "@abp/star-rating-svg" "~9.2.0-rc.4" + "@abp/highlight.js" "~9.2.0" + "@abp/star-rating-svg" "~9.2.0" -"@abp/cms-kit@9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/cms-kit/-/cms-kit-9.2.0-rc.4.tgz#008a367579f14ccc192eefe4e8f10a3e2835093d" - integrity sha512-nzCQ1k7gEsfBjdgF+vtU0w4NEKnSlEGhK0D3HlWeakqJYi5CuMNIpMYmJCijaHOBUrmT59BfL00hoz/BNcKHwA== +"@abp/cms-kit@9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/cms-kit/-/cms-kit-9.2.0.tgz#da9a3dfc3c83755a3c920b0392ec2b37106b5bf1" + integrity sha512-JHAiyppt9+Vx9f70duawR8OSWFaSrlPl1mOdLOD4fUWek7j7HhSyFgjddwzaBjLXqSnicTFwg2pmY1qTa8XjMw== dependencies: - "@abp/cms-kit.admin" "~9.2.0-rc.4" - "@abp/cms-kit.public" "~9.2.0-rc.4" + "@abp/cms-kit.admin" "~9.2.0" + "@abp/cms-kit.public" "~9.2.0" -"@abp/codemirror@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/codemirror/-/codemirror-9.2.0-rc.4.tgz#69430d5882f60c6d2b76557c76ef31143cafaeff" - integrity sha512-uYcmMb5j/eDYY6GSOUZ/kdlrwY8QD5JAThFetzZpc2j/lfbnXwA7sA/JYLBOrud6ChwTCqE293wXpldtWbqm4A== +"@abp/codemirror@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/codemirror/-/codemirror-9.2.0.tgz#83b9c805669640e739a68ad26788547202958bff" + integrity sha512-feYwaVZT7LH46BZPEkgpRHIEpn/vqcU5yo4QQ/u8t/D4veYfgLUdMqzt6P6kyFpgzb0X1+SOqvlWBRHBAHeQrQ== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" codemirror "^5.65.1" -"@abp/core@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-9.2.0-rc.4.tgz#b758ea117ae3e3e3596e407a347617b8fcb6c112" - integrity sha512-eNklBpyUAort/UEhgmnvMglBS/FSAzUiKalN7hgJFKx0nd3cDDkjkN6YFY8VuPInt3YfRz5omZQsGNq7eyjtbQ== +"@abp/core@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-9.2.0.tgz#db08fd34cfc891e94eb9e59ed3c0d0e6ef45c51a" + integrity sha512-3iESoHFj8I2xK81dwQVpCI6C1bc87VfWKyJE3/IUv4zWvG4QvI0aKhe1wxocmJqTjjowPUA3/fa2hvpfqPs2Bw== dependencies: - "@abp/utils" "~9.2.0-rc.4" + "@abp/utils" "~9.2.0" -"@abp/datatables.net-bs5@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-9.2.0-rc.4.tgz#75c12fe053d593b738bb5ca7394b2954409f5e00" - integrity sha512-5FG5Jc6Co9q/1xYmmW2SabSaXVkdJohPJ9XtzTthwnY8Ko5eGV7TPkEfwwsk0PLXp+Wu3ifQaZI4CIE9WR81XA== +"@abp/datatables.net-bs5@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-9.2.0.tgz#eab201c959727c27aaab30dc5bd8159249d8b54b" + integrity sha512-bmK6GKffXzYbfkDIlN27D7mohnYsXoODEiHqhZnBdIzeSJyHwrwRPRVbO1EcBn1SEBHjGJp3S69Z6gDbRs018g== dependencies: - "@abp/datatables.net" "~9.2.0-rc.4" + "@abp/datatables.net" "~9.2.0" datatables.net-bs5 "^2.1.8" -"@abp/datatables.net@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-9.2.0-rc.4.tgz#523b017e4b9ea9d3a6d3262f66bd3daaade05c0b" - integrity sha512-udCSjJYYpi/Ql/KJZxYDMxbtX6gXw7hsfMxQjP0u37JsyNLgd4fTrzaXCe7OKn3x7poJcANoqsEgWow/9R/WIg== +"@abp/datatables.net@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-9.2.0.tgz#e4880fe074d86d3c5dbd7f48c86244790fc376c2" + integrity sha512-bKaaa+tl0Pt4oNaV+X8pBbvsHc2mPYoL7yuAs+LN8ZLwBdsGoUw7RNhLQ63O3tuYdHuaHhI/mx23X6JThr0SYw== dependencies: - "@abp/jquery" "~9.2.0-rc.4" + "@abp/jquery" "~9.2.0" datatables.net "^2.1.8" -"@abp/font-awesome@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-9.2.0-rc.4.tgz#31d9fa475af3b543ddaff16e6af8caba966bd331" - integrity sha512-FYmfrf2mX5rzU+GqK078rn85UmfAwdCB8JQhnGfkylybMRJvmocRsPBIEThjlFZAPGqqvULHUTRMwnRPTgpuNw== +"@abp/font-awesome@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-9.2.0.tgz#3e359da2510cbc0e5b9e46e9cb3664baf285722e" + integrity sha512-HRGg6XK3bCxFdVvEBnBKyLamqMUrenj//E4JuKOs8DtGLVH0jTyh8TwUT5/E/pI+POV7HEOpv9WpSB2p8pfsAg== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" "@fortawesome/fontawesome-free" "^6.6.0" -"@abp/highlight.js@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/highlight.js/-/highlight.js-9.2.0-rc.4.tgz#34b5e4ac1c340b6da27a3f9f2c9d565f08a69438" - integrity sha512-Rwn6YUIbty5LuDm0PH5OM0j7Vk4OrZgWncgsubSekc/r8fh/ry6spoxdjuBB/AjwM8ZlJ0DWMQLw51K6Y18z7A== +"@abp/highlight.js@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/highlight.js/-/highlight.js-9.2.0.tgz#85ac7c252aee377c2ff9e15153c692fdea5cb96d" + integrity sha512-zD6UVZNUQEJ22ynqQs14jR8eBWQR7loOCpt9lPlIjXF6tnoBvcc7NBeBFw9ehKjkG2cegJCmahYb4cFnlJFigA== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" "@highlightjs/cdn-assets" "~11.10.0" -"@abp/jquery-form@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-9.2.0-rc.4.tgz#b200be90031b58305a2ebfd646ffbd5ce4cca40c" - integrity sha512-ohCtIfz48E0+vNdNyKTsLlfW0NYMJfKWXd9BPp2szgBaDbC7jYdGYyABbxGxRc7mp1B8xQzRhLnTzdRtWaJemg== +"@abp/jquery-form@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-9.2.0.tgz#40fac992584c26e6c54f66e7f68f8abf8944a626" + integrity sha512-B7Shq1itQjsnzdU1kjLpGHWjkSGFhIM2iF5BNMkqcylG3Yq1Se4+8QPoJpn/soilmtX8gbO2fx8TOejfIazXIw== dependencies: - "@abp/jquery" "~9.2.0-rc.4" + "@abp/jquery" "~9.2.0" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-9.2.0-rc.4.tgz#0329f9268b83e0832e26ea3f6523dbc5226b9114" - integrity sha512-iOnw5YoiC3bCIFRjuXPagz+ixFV+PM36hP0UJ4x03BK6GDJnAvjLshYe6qnQG9Xnz1arzmIX5ud5EjWvWSBIoA== +"@abp/jquery-validation-unobtrusive@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-9.2.0.tgz#c2df51d024d48e71f0e7fb8d4207a8b2855393f4" + integrity sha512-c1cPfWVdo+gpaMoegAkw0DzGL2fy/1ylEi/shb95MAGt3iyECVx+X+R/XOxbVHKVI57D4d5IGj6cXYBhdKkvAw== dependencies: - "@abp/jquery-validation" "~9.2.0-rc.4" + "@abp/jquery-validation" "~9.2.0" jquery-validation-unobtrusive "^4.0.0" -"@abp/jquery-validation@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-9.2.0-rc.4.tgz#073e4cbf905f652ce83633b98696b559916b984d" - integrity sha512-pS2Y2c6gXFOzfKeM2/JlW56ZmrUeflT2av64aWrFYnv7IgJUp38PEjR10uPy3g/mP2c9jis8dOfkdbRrlHwf+g== +"@abp/jquery-validation@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-9.2.0.tgz#97688d2e3c25699d4368ebf7234e04943aa5e6ab" + integrity sha512-UO+T6SqXBrh0ODwvMm840CGbE2fdYNo5oqJL4V4JbHv9uz7MH+k0bB1DK7mFb94iDM7QcglLzIfcN4hLRV7arw== dependencies: - "@abp/jquery" "~9.2.0-rc.4" + "@abp/jquery" "~9.2.0" jquery-validation "^1.21.0" -"@abp/jquery@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-9.2.0-rc.4.tgz#ac8a6ce969d58cc4f05d33adcfad76e7442231e8" - integrity sha512-N5hZ8VGXJUn5QW1mSXHIO7SjdvoyrkCyH5j8DhXJO1mDlS1L36n+MJHFwQK7UZpHcFOuklAJ7f417r3sISOBCw== +"@abp/jquery@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-9.2.0.tgz#38c249be6eda0cdc899cc8a1f20e5152c39ae9a0" + integrity sha512-sIe3Zk+8549ytydCtDlECZ930PapW/2J0652two/sJwYG/SGUGxYQbw3QnJGFTcL9TFwcWwRj5iWX0gWrLEIyA== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" jquery "~3.7.1" -"@abp/jstree@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/jstree/-/jstree-9.2.0-rc.4.tgz#352c40541706b9b49ac47eaad6253475086527d1" - integrity sha512-bkOL5Ip/ZiD1hjG7CC55sP/+79HcIYa/jVfVWj86ke6d/taA2IUhzmvVYcxJ2gABbK3nz0bVTrF7nqTBD9HaxA== +"@abp/jstree@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/jstree/-/jstree-9.2.0.tgz#eb167f0909aacbe3652f169f35b8e62743ed43b8" + integrity sha512-Aj35TeMTN1zwgITeCUsg9rFsiJ0r3IeGfKCv7PEL1AJUh37fU0CwVtHNhM0aOi1oUNJeMjs4XnFVYCqzJzVaNw== dependencies: - "@abp/jquery" "~9.2.0-rc.4" + "@abp/jquery" "~9.2.0" jstree "^3.3.17" -"@abp/lodash@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-9.2.0-rc.4.tgz#e428df195ed90414a9a412e1dcb6494344475f82" - integrity sha512-WsbyBNA57/giyI5pnM7Y7dk0p56hMDS5OMdmNilaGOWMnvz7mMTJNvStMBqS7fqekzfXsFGfrLbTmehY3pTYwQ== +"@abp/lodash@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-9.2.0.tgz#7fa4c9e956c766e34ec4677d2102a6d00f899a4b" + integrity sha512-2elXj/eWw875tF9ixbOm3uqXCxGaG5gL9Tub5k7cP+XhFpNBOYijNaXdN8SeDSxr83WDVWdrk//OQL8BF7XPdw== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" lodash "^4.17.21" -"@abp/luxon@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-9.2.0-rc.4.tgz#dacb173d24987a1ab4fb7e53dff9f91728a1efaa" - integrity sha512-qNuYml25Q2ODzZ830FhijGY66WvAUa02mB9hgulpFlF0p2UiFmhA0dMNVahEuytoFodjkSrhLP6cGfONf7ht8A== +"@abp/luxon@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-9.2.0.tgz#865db7b60dba4029134fb4a4b5eaa08c723dcea8" + integrity sha512-LWjczvzu1gFIq0/2fRz+bJW2+zsmXAmfz0I+lZ3wmqUdkViqAqwTa+5NMIl2tC92u4Dv3LGXKtH37Jw8m+XjTg== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" luxon "^3.5.0" -"@abp/malihu-custom-scrollbar-plugin@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-9.2.0-rc.4.tgz#9b0c0444ec8f11c8c8040387f83080e51a281657" - integrity sha512-cvYJI/4jkzOWSvTY0C/PxSq62SxEq3UlaXpefj/W+CAwPVjG+Yik2YHt5qgcmRRn0oF5V/XRJHB7A4H23+VKyA== +"@abp/malihu-custom-scrollbar-plugin@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-9.2.0.tgz#09722b1e7ca34b96e2a68368db0e96cdf9ab0e6c" + integrity sha512-kfDf/1RwGtAlos/7BW+7xbh3LtJ4VG0Z4mxS+b2HsywAwlt/kE5FltfBj2ResQb030bsGNl7A5JglV9Pv1UlPw== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/markdown-it@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/markdown-it/-/markdown-it-9.2.0-rc.4.tgz#f22ba1310cc23406706acb708d4a4953ff7bc2dc" - integrity sha512-Uz8Y8P0yn8vo8+WtlRD39wjJy1euz+Q+7DwaxY7GJE1fnLCdWMowK+umPihhgTE0hoXmsDuXHvE3ZxsgptayIA== +"@abp/markdown-it@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/markdown-it/-/markdown-it-9.2.0.tgz#74946415e4893deb5952e626d7314db1b926e4a3" + integrity sha512-yc0N0MeaqhBYkUw3/mIMuafNCk/tnh/paG3xObTFrGTqvU7yhlNH5je3ZQ2oBOlF3wHe/6ge0foS/3/fuGvsOQ== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" markdown-it "^14.1.0" -"@abp/moment@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-9.2.0-rc.4.tgz#527ed54f4330a77ec2ea1411bfffe2d57e62d172" - integrity sha512-zIRTuMCcPAfJAU64DUeU7dJPUJqoyJ7TvHBhrUcmmGZK7IzNtaP3/KAGjZIHhHbUwIjidjCxlF2YnW1io7hcJg== +"@abp/moment@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-9.2.0.tgz#137d688af4df195742061ac2b8a2bf460a027071" + integrity sha512-15aTjYAxHK+upkiZ94XCe8CoSPKMl1D8f6GXJIfwPkuYZ+na4ma17qBu4P8bFsc4gu3ngxYiLHRSzYzr4oCSYQ== dependencies: moment "^2.30.1" -"@abp/prismjs@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-9.2.0-rc.4.tgz#5164e64fa04d2a852043e1f7d02952d54112748a" - integrity sha512-fUCqWhmmRMu5DgpDxyH7uyEHS6lCFk+BY+JuS22sTvyhu+Q9M4rYhFEl/E9S+cA2rfxSNAG5h7HPXUWTqHPLgg== +"@abp/prismjs@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-9.2.0.tgz#03fca8cd2f4bdc09a68bd9b1fcdeaede56f96542" + integrity sha512-OUbjaxeXKxmrR9fZe/wazS9hGrYXYam/CypnQNTVaNNgSpwvgoKoCFCll9SJUGV8tXA6iEpVdszMGyRY5Hov+g== dependencies: - "@abp/clipboard" "~9.2.0-rc.4" - "@abp/core" "~9.2.0-rc.4" + "@abp/clipboard" "~9.2.0" + "@abp/core" "~9.2.0" prismjs "^1.29.0" -"@abp/select2@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-9.2.0-rc.4.tgz#6a8c6347ec75fcf60d76bc50ecca8008253fc7c7" - integrity sha512-OMyXr+gYMM81CQliqDVnEGsK2/WbmC4N5IZ1ZSJl+mW7cUClmyg9CLg418ID/7OU+ItUwbw9YvG4RPwnGF1ujw== +"@abp/select2@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-9.2.0.tgz#c96d869be0d3298ed7c0888288ea9829e6266cd4" + integrity sha512-V+qx9hw3oe7o0WbG03ZgAjbqRJPVuedzrdy7ExEdueTc6LRP/WEgbVpXhsNISObtouE6Dadwp3iXYSExgNUC6A== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" select2 "^4.0.13" -"@abp/slugify@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/slugify/-/slugify-9.2.0-rc.4.tgz#d20d6013182f15c6129f4b9bcbd2fb2f5abebfa8" - integrity sha512-247cvIVnAhiw+KOSrBdRjQoi/igBH8mcpf2wR3Ag2Mng9L0NWEnx+aqBP92/3nXQi2HDwIZ3N0TQUf6Q8BLU0Q== +"@abp/slugify@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/slugify/-/slugify-9.2.0.tgz#b71ae2f237866a97422c4fe1720ab62b8971ead5" + integrity sha512-yjNKhWOTxW9T87g+5CGH9R3w/Pm97H5eJLAEMYs4th5CqpU6ECtab4+1xIboF7LEkB1HwLHjAxa80UUKpdGe+A== dependencies: slugify "^1.6.6" -"@abp/star-rating-svg@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/star-rating-svg/-/star-rating-svg-9.2.0-rc.4.tgz#af32f85a2b74ac2d1debc2cb4eeb74c3b577d77c" - integrity sha512-3SdcXMbPzRWlCzuALUwYmdAYptHuVjVOD6trvw8WuZ4X2ix0S0UZ2vaQFeX+mrVZoPHnp5PruoZhcnm8t+N9rw== +"@abp/star-rating-svg@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/star-rating-svg/-/star-rating-svg-9.2.0.tgz#a1cccb2dd82bbaf1288dc530b3c5ff81a4dd772e" + integrity sha512-eMYhBlWzEK8EUIS/FYEafhyc1CbCB3qL8PpenFYyLDjMb9kfv3z5x05MYIn2o8vTYYuMrTS/bWAYCAYQOVJCBg== dependencies: - "@abp/jquery" "~9.2.0-rc.4" + "@abp/jquery" "~9.2.0" star-rating-svg "^3.5.0" -"@abp/sweetalert2@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-9.2.0-rc.4.tgz#26d4e9c935f20a7e0bde23327c6761fe6466cd41" - integrity sha512-zhwnA0WpkNO6JuqbBgO6PQ817wuThw6mtGcP96V1m/xtckJWNDub1gby0gJqnWqnq5Cuj4u9gPRkkcVmfPn8ZA== +"@abp/sweetalert2@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-9.2.0.tgz#826d6dd0b70c35a7401cc884fb1e82af99a0305d" + integrity sha512-0r338ayjaL9uzmLKE8oHpcMgJeVgVoMYfhQAPINeQHv1TPXuYCLo0aoRNoLsfmUo3ayYBBa3zOrugFIVis7Q6A== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" sweetalert2 "^11.14.1" -"@abp/timeago@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-9.2.0-rc.4.tgz#494b25062f14f8a139ed66958991d34fcf4023a3" - integrity sha512-6HoEkdQCYDxrEGSjxHXN2Vj5ipc3rIXTbCqj7dYI9K5tuaQ4Wq0Obz/Wx6UZ71ZjzGAeAQkDeXVc68GjQyLX6Q== +"@abp/timeago@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-9.2.0.tgz#79bbe6dd32b0ee7df2e8ebd05274a0ecc7882ba7" + integrity sha512-hEUi5re5N1YkDSpaUaUtXF1Mz4YyiEvNzVADbKRz11kbR4ZAFzcvVqsQLeNo7qnuFLfJNAtuzyjkuxwL75kmaA== dependencies: - "@abp/jquery" "~9.2.0-rc.4" + "@abp/jquery" "~9.2.0" timeago "^1.6.7" -"@abp/tui-editor@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/tui-editor/-/tui-editor-9.2.0-rc.4.tgz#dca06d694d7105a807887c4ddebc01c7f2a9c5f7" - integrity sha512-dpSrv1SYZh947AuN95GlrGyI61CeysJHnbsAKPmGsmZ5CH6VSDM5gpI9teo8SdhXsi9L5rtVBehCXBgDHSsiQQ== +"@abp/tui-editor@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/tui-editor/-/tui-editor-9.2.0.tgz#f28e1099e39def76ff81d1db64f5e352f0d28f02" + integrity sha512-h3Nq0LmkmPWBx1tzPnImJAhPFlAD8sX/GnlAvEZGY3XJ7X6146TPl7HIzZ4fnttm+ilhuDUG2qydgIek/5pWLw== dependencies: - "@abp/jquery" "~9.2.0-rc.4" - "@abp/prismjs" "~9.2.0-rc.4" + "@abp/jquery" "~9.2.0" + "@abp/prismjs" "~9.2.0" -"@abp/uppy@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/uppy/-/uppy-9.2.0-rc.4.tgz#a2241128f0e2ada9ae667aa45ba29ac08c4c97ef" - integrity sha512-hIrmltycYeDINFixb3AjnU7UiOdZ/uIIYx9Na4K2Zk2Gc3gyChsAtQ35UIH0UpRYBDf/+4r1G2GddP8TQ2nwQw== +"@abp/uppy@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/uppy/-/uppy-9.2.0.tgz#319cc21b655c310e5bf76bca787a181cd59bb2df" + integrity sha512-8SpMK46F9nNwZpXGn1AjzSTARC47K1hPqX2uzuNePCC0nT4RtP/711XrloawOhlefFwvG7n66cknU9LSBvwcMA== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" uppy "^4.4.1" -"@abp/utils@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-9.2.0-rc.4.tgz#350eb915af78ecdbc2a0a15a1ad4bac4212cefc2" - integrity sha512-PZzfkiq6sthX5+Icw7h3HVpnDVgN7ZnmOnIyzKhBeHALpH+JfO7QruwJl96Moba4LGmzPdFdLkwm2qznVoqyZA== +"@abp/utils@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-9.2.0.tgz#bf32ced1175e45fbe010c3cb806c7cd37f85089c" + integrity sha512-aciBuXhzlaqe+o7mNt536bCk425cmxY5BE0wwl13u3pX3LfWYWLEgwl8GS0aeI11TS1/7+1N85RJELyz/+y0hQ== dependencies: just-compare "^2.3.0" diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Comments/Details.cshtml b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Comments/Details.cshtml index a9d064235f..8cb0b482b5 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Comments/Details.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Comments/Details.cshtml @@ -3,6 +3,7 @@ @using System.Globalization @using Microsoft.AspNetCore.Mvc.Localization @using Volo.Abp.AspNetCore.Mvc.UI.Layout +@using Volo.Abp.Timing @using Volo.CmsKit.Admin.Web.Pages.CmsKit.Comments @using Volo.CmsKit.Admin.Web.Menus @using Volo.CmsKit.Comments @@ -10,6 +11,7 @@ @inject IPageLayout PageLayout @inject IHtmlLocalizer L +@inject IClock Clock @model DetailsModel @@ -50,7 +52,7 @@ @L["CreationTime"]: - @Model.CommentWithAuthorDto.CreationTime.ToString(CultureInfo.CurrentUICulture) + @Clock.ConvertToUserTime(Model.CommentWithAuthorDto.CreationTime).ToString(CultureInfo.CurrentUICulture)) @L["Username"]: diff --git a/modules/docs/Volo.Docs.abpmdl b/modules/docs/Volo.Docs.abpmdl index 77c70bddf8..bb861a309d 100644 --- a/modules/docs/Volo.Docs.abpmdl +++ b/modules/docs/Volo.Docs.abpmdl @@ -86,6 +86,22 @@ "Volo.Docs.MongoDB.Tests": { "path": "test/Volo.Docs.MongoDB.Tests/Volo.Docs.MongoDB.Tests.abppkg", "folder": "test" + }, + "Volo.Docs.Common.Application": { + "path": "src/Volo.Docs.Common.Application/Volo.Docs.Common.Application.abppkg", + "folder": "src" + }, + "Volo.Docs.Common.Application.Contracts": { + "path": "src/Volo.Docs.Common.Application.Contracts/Volo.Docs.Common.Application.Contracts.abppkg", + "folder": "src" + }, + "Volo.Docs.Common.HttpApi": { + "path": "src/Volo.Docs.Common.HttpApi/Volo.Docs.Common.HttpApi.abppkg", + "folder": "src" + }, + "Volo.Docs.Common.HttpApi.Client": { + "path": "src/Volo.Docs.Common.HttpApi.Client/Volo.Docs.Common.HttpApi.Client.abppkg", + "folder": "src" } } } \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/VoloDocs.Web.csproj b/modules/docs/app/VoloDocs.Web/VoloDocs.Web.csproj index 0a59f42c87..316f29f84c 100644 --- a/modules/docs/app/VoloDocs.Web/VoloDocs.Web.csproj +++ b/modules/docs/app/VoloDocs.Web/VoloDocs.Web.csproj @@ -43,6 +43,7 @@ + diff --git a/modules/docs/app/VoloDocs.Web/VoloDocsWebModule.cs b/modules/docs/app/VoloDocs.Web/VoloDocsWebModule.cs index 5af8b1c129..a28da09273 100644 --- a/modules/docs/app/VoloDocs.Web/VoloDocsWebModule.cs +++ b/modules/docs/app/VoloDocs.Web/VoloDocsWebModule.cs @@ -32,6 +32,7 @@ using Localization.Resources.AbpUi; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Hosting; using Volo.Abp.Account; +using Volo.Abp.BackgroundJobs; using Volo.Abp.BlobStoring; using Volo.Abp.BlobStoring.Database; using Volo.Abp.PermissionManagement.HttpApi; @@ -62,7 +63,8 @@ namespace VoloDocs.Web typeof(AbpPermissionManagementApplicationModule), typeof(AbpPermissionManagementHttpApiModule), typeof(AbpAspNetCoreMvcUiBasicThemeModule) - ,typeof(AbpCachingStackExchangeRedisModule) + ,typeof(AbpCachingStackExchangeRedisModule), + typeof(AbpBackgroundJobsModule) )] public class VoloDocsWebModule : AbpModule { @@ -72,6 +74,11 @@ namespace VoloDocs.Web { options.AddAssemblyResource(typeof(DocsResource), typeof(VoloDocsWebModule).Assembly); }); + + PreConfigure(options => + { + options.ApplicationName = context.Services.GetApplicationName()!; + }); } public override void ConfigureServices(ServiceConfigurationContext context) diff --git a/modules/docs/app/VoloDocs.Web/package.json b/modules/docs/app/VoloDocs.Web/package.json index e4a2f9b7ad..440ad2c655 100644 --- a/modules/docs/app/VoloDocs.Web/package.json +++ b/modules/docs/app/VoloDocs.Web/package.json @@ -3,7 +3,7 @@ "name": "volo.docstestapp", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "~9.2.0-rc.4", - "@abp/docs": "~9.2.0-rc.4" + "@abp/aspnetcore.mvc.ui.theme.basic": "~9.2.0", + "@abp/docs": "~9.2.0" } } diff --git a/modules/docs/app/VoloDocs.Web/yarn.lock b/modules/docs/app/VoloDocs.Web/yarn.lock index 866cb958a5..6cff27f688 100644 --- a/modules/docs/app/VoloDocs.Web/yarn.lock +++ b/modules/docs/app/VoloDocs.Web/yarn.lock @@ -2,229 +2,229 @@ # yarn lockfile v1 -"@abp/anchor-js@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/anchor-js/-/anchor-js-9.2.0-rc.4.tgz#eba5e85a5ec3227e0c00a2f79974043ee84c0acd" - integrity sha512-GCO0WYUdVQiuX6efr3WdxqwYrtP6rcymcIurFSa1qqV2X4qIqlM4yzO6Q36JrEMeU8qOW7w3OuUvQkAOZC/j+g== +"@abp/anchor-js@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/anchor-js/-/anchor-js-9.2.0.tgz#86aab2407c30a61be5babadb54e137e5ad4bfa9c" + integrity sha512-CdWo4jUxHiAFA6T0rx1ZxpmGB6GwUmklTSfugRbCRdhoUSTXXoh+xdUaoMkBmygP+S/o2BWekhIz1TE0dUeseg== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" anchor-js "^5.0.0" -"@abp/aspnetcore.mvc.ui.theme.basic@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-9.2.0-rc.4.tgz#2659ec541028ec6a1688b748414fb181924f1f58" - integrity sha512-KSpfnvgRPxDb9oJWBnjpFm/FcXSTRO6aAVBlCERi4jtGzp04e//3rHnOWjv+JyxJqOP0JszWSALXK4A/oMQFNQ== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~9.2.0-rc.4" - -"@abp/aspnetcore.mvc.ui.theme.shared@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-9.2.0-rc.4.tgz#4212523cc2d2db881d2a0a9c1b28f372c53c19d7" - integrity sha512-z6nCmIfcaiQ6CPHhVq0C6RYljjrqScVVj+Sf0uI8eP6qG+CVT/aEVgb+3Nc5EM5SjDvR/eTxH4J3YcVNDj32Lg== - dependencies: - "@abp/aspnetcore.mvc.ui" "~9.2.0-rc.4" - "@abp/bootstrap" "~9.2.0-rc.4" - "@abp/bootstrap-datepicker" "~9.2.0-rc.4" - "@abp/bootstrap-daterangepicker" "~9.2.0-rc.4" - "@abp/datatables.net-bs5" "~9.2.0-rc.4" - "@abp/font-awesome" "~9.2.0-rc.4" - "@abp/jquery-form" "~9.2.0-rc.4" - "@abp/jquery-validation-unobtrusive" "~9.2.0-rc.4" - "@abp/lodash" "~9.2.0-rc.4" - "@abp/luxon" "~9.2.0-rc.4" - "@abp/malihu-custom-scrollbar-plugin" "~9.2.0-rc.4" - "@abp/moment" "~9.2.0-rc.4" - "@abp/select2" "~9.2.0-rc.4" - "@abp/sweetalert2" "~9.2.0-rc.4" - "@abp/timeago" "~9.2.0-rc.4" - -"@abp/aspnetcore.mvc.ui@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-9.2.0-rc.4.tgz#a47763a480e488363b901327d94556fdad6cccb7" - integrity sha512-7fxC3zifdnpJZwKsP1hgK0+mu9y/w4zrMY1rR8AVvcpMdt8/Mmtj6mJi+Ompv3YtO9F/Zgnxqma5R0pYMTke7g== +"@abp/aspnetcore.mvc.ui.theme.basic@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-9.2.0.tgz#af6ff5071cadb480b4aece0f15400d56b105a350" + integrity sha512-+LOmhSfsua7i3VQy9vYTDv7nE0fdIA+kNvorQ4wkkRzijOAlwmS4fkupglwOKJQSCWGAM7VXccPy2NzdmwvEtw== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~9.2.0" + +"@abp/aspnetcore.mvc.ui.theme.shared@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-9.2.0.tgz#791f419e8e0fab229e3f93f7a90edcd259100206" + integrity sha512-Mrs+kQg0S5OyRsPBwXQTqOq2DBWDdot7emETcX/gatv26GFbRe3nTOk1E+VWD/nsxHEOKTSE8LClC6TgkMxD8Q== + dependencies: + "@abp/aspnetcore.mvc.ui" "~9.2.0" + "@abp/bootstrap" "~9.2.0" + "@abp/bootstrap-datepicker" "~9.2.0" + "@abp/bootstrap-daterangepicker" "~9.2.0" + "@abp/datatables.net-bs5" "~9.2.0" + "@abp/font-awesome" "~9.2.0" + "@abp/jquery-form" "~9.2.0" + "@abp/jquery-validation-unobtrusive" "~9.2.0" + "@abp/lodash" "~9.2.0" + "@abp/luxon" "~9.2.0" + "@abp/malihu-custom-scrollbar-plugin" "~9.2.0" + "@abp/moment" "~9.2.0" + "@abp/select2" "~9.2.0" + "@abp/sweetalert2" "~9.2.0" + "@abp/timeago" "~9.2.0" + +"@abp/aspnetcore.mvc.ui@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-9.2.0.tgz#e3e703ea46caf04cc966ea0af6deb64427a90d4c" + integrity sha512-VHH68/7Bw7r8p70T9grnVISgYPe2t3m9199S/wAXGtpGHML/lbHhDflWbm7y1MHcrmCfaXy42O9SmTHV25BJhA== dependencies: ansi-colors "^4.1.3" -"@abp/bootstrap-datepicker@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-9.2.0-rc.4.tgz#0aec67332e3148e21658650bfaaa08c64180e2ad" - integrity sha512-CaD709aGigfQk76XDshSrctm9TkgjA+7XgnDuVraPRPwq4dwXGIhbNAiJ1+5k6OXrUHqJP3nPc4NDPZiXDwgqw== +"@abp/bootstrap-datepicker@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-9.2.0.tgz#271ff68e2cee7b4ffe5a60406561a05948d6bbe6" + integrity sha512-V8o1cn1MKXE5GH1ZpBHiWWilzxjHIp4IS6rNoCDBSnaQcVvRku9KPI8tPNQSf+4x3jBfHDV9aOBDbDGTQ6J2yw== dependencies: bootstrap-datepicker "^1.10.0" -"@abp/bootstrap-daterangepicker@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-9.2.0-rc.4.tgz#b08d564b0dfc8be62a052fc205e1445764b6a2d0" - integrity sha512-zwWkb6JaUqN2rtIGLtb0Cf1RtP0nuCFK0x2r4J9kYnv1vKiT8vrK2Jl5mJVjvdnO0JifS1rueDMPglVpOeghRw== +"@abp/bootstrap-daterangepicker@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-9.2.0.tgz#a239f8c2efce57d2e2beca70ceeede52d1b177d5" + integrity sha512-Cd9naCyepTvmUotkR1VyOBqUMgyeSXnOVWR7HxXm+jugKtnWRzrztZB6UyfnNzzjc1RMOyiAUEjzitKSJrXeoA== dependencies: bootstrap-daterangepicker "^3.1.0" -"@abp/bootstrap@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-9.2.0-rc.4.tgz#0615ec9fa7422d76e8f4af22ec28fe9672d60c38" - integrity sha512-m1ORR/R84nPEfid/x5rC5jy4orsw4yhkk4nApiW11H4Eb7ssbcviR75ugJ5GBt3GOevHHlTZWwvf8K4C+zdqZg== +"@abp/bootstrap@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-9.2.0.tgz#08859288b8372ea111a240b507047b144d6caca9" + integrity sha512-L3EZQza2c/5VmvZkLsf0EOuaMi8fseyyiwlFN65i1hpcDwhOLcaqnxMneeaSJ+Dy4xczJT+oBml9D9OSTuzmkA== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" bootstrap "^5.3.3" -"@abp/clipboard@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-9.2.0-rc.4.tgz#e91e8c9b9947cef648e31f17ac8050d342a88416" - integrity sha512-iUvCQK3YJKPflLWkXNsueXit+Ipez5+R5q4OdngcvTmVXIUoH8t+3iiM+Q7ohA0vRknsdEGPMUUS7TnDW9fVqA== +"@abp/clipboard@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-9.2.0.tgz#348a0e45752c7eb055fb00af52660593ad340caf" + integrity sha512-2+wt2ShLBfoHqx0DNNevJkaz1POLcs1tcK1hL4ZqsjOnS7BrTk1r8zwNvCw1XEeH2S1rPftAWH4PvzL4j86DFA== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" clipboard "^2.0.11" -"@abp/core@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-9.2.0-rc.4.tgz#b758ea117ae3e3e3596e407a347617b8fcb6c112" - integrity sha512-eNklBpyUAort/UEhgmnvMglBS/FSAzUiKalN7hgJFKx0nd3cDDkjkN6YFY8VuPInt3YfRz5omZQsGNq7eyjtbQ== +"@abp/core@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-9.2.0.tgz#db08fd34cfc891e94eb9e59ed3c0d0e6ef45c51a" + integrity sha512-3iESoHFj8I2xK81dwQVpCI6C1bc87VfWKyJE3/IUv4zWvG4QvI0aKhe1wxocmJqTjjowPUA3/fa2hvpfqPs2Bw== dependencies: - "@abp/utils" "~9.2.0-rc.4" + "@abp/utils" "~9.2.0" -"@abp/datatables.net-bs5@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-9.2.0-rc.4.tgz#75c12fe053d593b738bb5ca7394b2954409f5e00" - integrity sha512-5FG5Jc6Co9q/1xYmmW2SabSaXVkdJohPJ9XtzTthwnY8Ko5eGV7TPkEfwwsk0PLXp+Wu3ifQaZI4CIE9WR81XA== +"@abp/datatables.net-bs5@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-9.2.0.tgz#eab201c959727c27aaab30dc5bd8159249d8b54b" + integrity sha512-bmK6GKffXzYbfkDIlN27D7mohnYsXoODEiHqhZnBdIzeSJyHwrwRPRVbO1EcBn1SEBHjGJp3S69Z6gDbRs018g== dependencies: - "@abp/datatables.net" "~9.2.0-rc.4" + "@abp/datatables.net" "~9.2.0" datatables.net-bs5 "^2.1.8" -"@abp/datatables.net@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-9.2.0-rc.4.tgz#523b017e4b9ea9d3a6d3262f66bd3daaade05c0b" - integrity sha512-udCSjJYYpi/Ql/KJZxYDMxbtX6gXw7hsfMxQjP0u37JsyNLgd4fTrzaXCe7OKn3x7poJcANoqsEgWow/9R/WIg== +"@abp/datatables.net@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-9.2.0.tgz#e4880fe074d86d3c5dbd7f48c86244790fc376c2" + integrity sha512-bKaaa+tl0Pt4oNaV+X8pBbvsHc2mPYoL7yuAs+LN8ZLwBdsGoUw7RNhLQ63O3tuYdHuaHhI/mx23X6JThr0SYw== dependencies: - "@abp/jquery" "~9.2.0-rc.4" + "@abp/jquery" "~9.2.0" datatables.net "^2.1.8" -"@abp/docs@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/docs/-/docs-9.2.0-rc.4.tgz#54196f7225245006fa56f3f4d1c20b5e90fa2525" - integrity sha512-rYpTDOoa7ruI7+bUFlfX+4W6NPCSiKqRMMRFvTkWqR5Y/DsbjElOJdHPQ0S8sfNIuXpG+RMuR5/KMlzbX0iLbA== +"@abp/docs@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/docs/-/docs-9.2.0.tgz#6a400df7f91710ff529cbcfbaa6c6657bad9927b" + integrity sha512-zW3gh+VpaBubCMMMsH5gu8mcq3Mdm8kNCAQs/BlzRsrX1XqgRwXGOh9Dmrw7f5Ul1htbibsMYMDEXH0HNumebg== dependencies: - "@abp/anchor-js" "~9.2.0-rc.4" - "@abp/clipboard" "~9.2.0-rc.4" - "@abp/malihu-custom-scrollbar-plugin" "~9.2.0-rc.4" - "@abp/popper.js" "~9.2.0-rc.4" - "@abp/prismjs" "~9.2.0-rc.4" + "@abp/anchor-js" "~9.2.0" + "@abp/clipboard" "~9.2.0" + "@abp/malihu-custom-scrollbar-plugin" "~9.2.0" + "@abp/popper.js" "~9.2.0" + "@abp/prismjs" "~9.2.0" -"@abp/font-awesome@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-9.2.0-rc.4.tgz#31d9fa475af3b543ddaff16e6af8caba966bd331" - integrity sha512-FYmfrf2mX5rzU+GqK078rn85UmfAwdCB8JQhnGfkylybMRJvmocRsPBIEThjlFZAPGqqvULHUTRMwnRPTgpuNw== +"@abp/font-awesome@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-9.2.0.tgz#3e359da2510cbc0e5b9e46e9cb3664baf285722e" + integrity sha512-HRGg6XK3bCxFdVvEBnBKyLamqMUrenj//E4JuKOs8DtGLVH0jTyh8TwUT5/E/pI+POV7HEOpv9WpSB2p8pfsAg== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" "@fortawesome/fontawesome-free" "^6.6.0" -"@abp/jquery-form@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-9.2.0-rc.4.tgz#b200be90031b58305a2ebfd646ffbd5ce4cca40c" - integrity sha512-ohCtIfz48E0+vNdNyKTsLlfW0NYMJfKWXd9BPp2szgBaDbC7jYdGYyABbxGxRc7mp1B8xQzRhLnTzdRtWaJemg== +"@abp/jquery-form@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-9.2.0.tgz#40fac992584c26e6c54f66e7f68f8abf8944a626" + integrity sha512-B7Shq1itQjsnzdU1kjLpGHWjkSGFhIM2iF5BNMkqcylG3Yq1Se4+8QPoJpn/soilmtX8gbO2fx8TOejfIazXIw== dependencies: - "@abp/jquery" "~9.2.0-rc.4" + "@abp/jquery" "~9.2.0" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-9.2.0-rc.4.tgz#0329f9268b83e0832e26ea3f6523dbc5226b9114" - integrity sha512-iOnw5YoiC3bCIFRjuXPagz+ixFV+PM36hP0UJ4x03BK6GDJnAvjLshYe6qnQG9Xnz1arzmIX5ud5EjWvWSBIoA== +"@abp/jquery-validation-unobtrusive@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-9.2.0.tgz#c2df51d024d48e71f0e7fb8d4207a8b2855393f4" + integrity sha512-c1cPfWVdo+gpaMoegAkw0DzGL2fy/1ylEi/shb95MAGt3iyECVx+X+R/XOxbVHKVI57D4d5IGj6cXYBhdKkvAw== dependencies: - "@abp/jquery-validation" "~9.2.0-rc.4" + "@abp/jquery-validation" "~9.2.0" jquery-validation-unobtrusive "^4.0.0" -"@abp/jquery-validation@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-9.2.0-rc.4.tgz#073e4cbf905f652ce83633b98696b559916b984d" - integrity sha512-pS2Y2c6gXFOzfKeM2/JlW56ZmrUeflT2av64aWrFYnv7IgJUp38PEjR10uPy3g/mP2c9jis8dOfkdbRrlHwf+g== +"@abp/jquery-validation@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-9.2.0.tgz#97688d2e3c25699d4368ebf7234e04943aa5e6ab" + integrity sha512-UO+T6SqXBrh0ODwvMm840CGbE2fdYNo5oqJL4V4JbHv9uz7MH+k0bB1DK7mFb94iDM7QcglLzIfcN4hLRV7arw== dependencies: - "@abp/jquery" "~9.2.0-rc.4" + "@abp/jquery" "~9.2.0" jquery-validation "^1.21.0" -"@abp/jquery@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-9.2.0-rc.4.tgz#ac8a6ce969d58cc4f05d33adcfad76e7442231e8" - integrity sha512-N5hZ8VGXJUn5QW1mSXHIO7SjdvoyrkCyH5j8DhXJO1mDlS1L36n+MJHFwQK7UZpHcFOuklAJ7f417r3sISOBCw== +"@abp/jquery@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-9.2.0.tgz#38c249be6eda0cdc899cc8a1f20e5152c39ae9a0" + integrity sha512-sIe3Zk+8549ytydCtDlECZ930PapW/2J0652two/sJwYG/SGUGxYQbw3QnJGFTcL9TFwcWwRj5iWX0gWrLEIyA== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" jquery "~3.7.1" -"@abp/lodash@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-9.2.0-rc.4.tgz#e428df195ed90414a9a412e1dcb6494344475f82" - integrity sha512-WsbyBNA57/giyI5pnM7Y7dk0p56hMDS5OMdmNilaGOWMnvz7mMTJNvStMBqS7fqekzfXsFGfrLbTmehY3pTYwQ== +"@abp/lodash@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-9.2.0.tgz#7fa4c9e956c766e34ec4677d2102a6d00f899a4b" + integrity sha512-2elXj/eWw875tF9ixbOm3uqXCxGaG5gL9Tub5k7cP+XhFpNBOYijNaXdN8SeDSxr83WDVWdrk//OQL8BF7XPdw== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" lodash "^4.17.21" -"@abp/luxon@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-9.2.0-rc.4.tgz#dacb173d24987a1ab4fb7e53dff9f91728a1efaa" - integrity sha512-qNuYml25Q2ODzZ830FhijGY66WvAUa02mB9hgulpFlF0p2UiFmhA0dMNVahEuytoFodjkSrhLP6cGfONf7ht8A== +"@abp/luxon@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-9.2.0.tgz#865db7b60dba4029134fb4a4b5eaa08c723dcea8" + integrity sha512-LWjczvzu1gFIq0/2fRz+bJW2+zsmXAmfz0I+lZ3wmqUdkViqAqwTa+5NMIl2tC92u4Dv3LGXKtH37Jw8m+XjTg== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" luxon "^3.5.0" -"@abp/malihu-custom-scrollbar-plugin@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-9.2.0-rc.4.tgz#9b0c0444ec8f11c8c8040387f83080e51a281657" - integrity sha512-cvYJI/4jkzOWSvTY0C/PxSq62SxEq3UlaXpefj/W+CAwPVjG+Yik2YHt5qgcmRRn0oF5V/XRJHB7A4H23+VKyA== +"@abp/malihu-custom-scrollbar-plugin@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-9.2.0.tgz#09722b1e7ca34b96e2a68368db0e96cdf9ab0e6c" + integrity sha512-kfDf/1RwGtAlos/7BW+7xbh3LtJ4VG0Z4mxS+b2HsywAwlt/kE5FltfBj2ResQb030bsGNl7A5JglV9Pv1UlPw== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/moment@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-9.2.0-rc.4.tgz#527ed54f4330a77ec2ea1411bfffe2d57e62d172" - integrity sha512-zIRTuMCcPAfJAU64DUeU7dJPUJqoyJ7TvHBhrUcmmGZK7IzNtaP3/KAGjZIHhHbUwIjidjCxlF2YnW1io7hcJg== +"@abp/moment@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-9.2.0.tgz#137d688af4df195742061ac2b8a2bf460a027071" + integrity sha512-15aTjYAxHK+upkiZ94XCe8CoSPKMl1D8f6GXJIfwPkuYZ+na4ma17qBu4P8bFsc4gu3ngxYiLHRSzYzr4oCSYQ== dependencies: moment "^2.30.1" -"@abp/popper.js@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/popper.js/-/popper.js-9.2.0-rc.4.tgz#25812c2f8033e667f03c580e1c8e2649ebb8da44" - integrity sha512-ASjq3wwY5Klkr/3iX7O9oW7cyxGE8I+IXU24uR3L2jpxMdh4knCZAU9333XQHdlVIn5Yvi5a5SZZgV5zOGJxMA== +"@abp/popper.js@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/popper.js/-/popper.js-9.2.0.tgz#674cda57e74e3ce20d7e6e1a21fa48b72c35aeb6" + integrity sha512-OVsAbW1UbuLZlfoQg1BR8GNQpARvUMx2GE7MrobVVDQ0l8a9JM1i/MQzmCi1XAns5nCk/NqPzSN0NywF/G4FTg== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" "@popperjs/core" "^2.11.8" -"@abp/prismjs@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-9.2.0-rc.4.tgz#5164e64fa04d2a852043e1f7d02952d54112748a" - integrity sha512-fUCqWhmmRMu5DgpDxyH7uyEHS6lCFk+BY+JuS22sTvyhu+Q9M4rYhFEl/E9S+cA2rfxSNAG5h7HPXUWTqHPLgg== +"@abp/prismjs@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-9.2.0.tgz#03fca8cd2f4bdc09a68bd9b1fcdeaede56f96542" + integrity sha512-OUbjaxeXKxmrR9fZe/wazS9hGrYXYam/CypnQNTVaNNgSpwvgoKoCFCll9SJUGV8tXA6iEpVdszMGyRY5Hov+g== dependencies: - "@abp/clipboard" "~9.2.0-rc.4" - "@abp/core" "~9.2.0-rc.4" + "@abp/clipboard" "~9.2.0" + "@abp/core" "~9.2.0" prismjs "^1.29.0" -"@abp/select2@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-9.2.0-rc.4.tgz#6a8c6347ec75fcf60d76bc50ecca8008253fc7c7" - integrity sha512-OMyXr+gYMM81CQliqDVnEGsK2/WbmC4N5IZ1ZSJl+mW7cUClmyg9CLg418ID/7OU+ItUwbw9YvG4RPwnGF1ujw== +"@abp/select2@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-9.2.0.tgz#c96d869be0d3298ed7c0888288ea9829e6266cd4" + integrity sha512-V+qx9hw3oe7o0WbG03ZgAjbqRJPVuedzrdy7ExEdueTc6LRP/WEgbVpXhsNISObtouE6Dadwp3iXYSExgNUC6A== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" select2 "^4.0.13" -"@abp/sweetalert2@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-9.2.0-rc.4.tgz#26d4e9c935f20a7e0bde23327c6761fe6466cd41" - integrity sha512-zhwnA0WpkNO6JuqbBgO6PQ817wuThw6mtGcP96V1m/xtckJWNDub1gby0gJqnWqnq5Cuj4u9gPRkkcVmfPn8ZA== +"@abp/sweetalert2@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-9.2.0.tgz#826d6dd0b70c35a7401cc884fb1e82af99a0305d" + integrity sha512-0r338ayjaL9uzmLKE8oHpcMgJeVgVoMYfhQAPINeQHv1TPXuYCLo0aoRNoLsfmUo3ayYBBa3zOrugFIVis7Q6A== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" sweetalert2 "^11.14.1" -"@abp/timeago@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-9.2.0-rc.4.tgz#494b25062f14f8a139ed66958991d34fcf4023a3" - integrity sha512-6HoEkdQCYDxrEGSjxHXN2Vj5ipc3rIXTbCqj7dYI9K5tuaQ4Wq0Obz/Wx6UZ71ZjzGAeAQkDeXVc68GjQyLX6Q== +"@abp/timeago@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-9.2.0.tgz#79bbe6dd32b0ee7df2e8ebd05274a0ecc7882ba7" + integrity sha512-hEUi5re5N1YkDSpaUaUtXF1Mz4YyiEvNzVADbKRz11kbR4ZAFzcvVqsQLeNo7qnuFLfJNAtuzyjkuxwL75kmaA== dependencies: - "@abp/jquery" "~9.2.0-rc.4" + "@abp/jquery" "~9.2.0" timeago "^1.6.7" -"@abp/utils@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-9.2.0-rc.4.tgz#350eb915af78ecdbc2a0a15a1ad4bac4212cefc2" - integrity sha512-PZzfkiq6sthX5+Icw7h3HVpnDVgN7ZnmOnIyzKhBeHALpH+JfO7QruwJl96Moba4LGmzPdFdLkwm2qznVoqyZA== +"@abp/utils@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-9.2.0.tgz#bf32ced1175e45fbe010c3cb806c7cd37f85089c" + integrity sha512-aciBuXhzlaqe+o7mNt536bCk425cmxY5BE0wwl13u3pX3LfWYWLEgwl8GS0aeI11TS1/7+1N85RJELyz/+y0hQ== dependencies: just-compare "^2.3.0" diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Documents/IDocumentPdfAdminAppService.cs b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Documents/IDocumentPdfAdminAppService.cs new file mode 100644 index 0000000000..ad253cecef --- /dev/null +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Documents/IDocumentPdfAdminAppService.cs @@ -0,0 +1,15 @@ +using System.Threading.Tasks; +using Volo.Abp.Application.Dtos; +using Volo.Docs.Admin.Projects; +using Volo.Docs.Common.Documents; + +namespace Volo.Docs.Admin.Documents; + +public interface IDocumentPdfAdminAppService : IDocumentPdfAppService +{ + Task GeneratePdfAsync(DocumentPdfGeneratorInput input); + + Task> GetPdfFilesAsync(GetPdfFilesInput input); + + Task DeletePdfFileAsync(DeletePdfFileInput input); +} \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/ar.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/ar.json index bd93067140..bd2b0c6526 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/ar.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/ar.json @@ -1,7 +1,7 @@ { "culture": "ar", "texts": { - "Permission:DocumentManagement": "إدارة الوثائق", + "Permission:DocumentManagement": "إدارة المستندات", "Permission:Projects": "المشروعات", "Permission:Edit": "تعديل", "Permission:Delete": "حذف", @@ -66,6 +66,9 @@ "GenerateAndDownloadPdf": "توليد وتحميل PDF", "PdfFileDeletionWarningMessage": "هل أنت متأكد أنك تريد حذف ملف PDF \"{0}\"?", "ManagePdfFiles": "إدارة ملفات PDF", - "Permission:ManagePdfFiles": "إدارة ملفات PDF" + "Permission:ManagePdfFiles": "إدارة ملفات PDF", + "PdfDeletedSuccessfully": "تم حذف ملف PDF بنجاح", + "PdfGenerationStarted": "بدأ إنشاء ملف PDF", + "PdfGenerationStartedInfoMessage": "بدأ إنشاء ملف PDF. بمجرد اكتمال العملية، يمكنك التحقق مما إذا تمت إضافة الملف في قسم ملفات PDF." } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/cs.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/cs.json index 9543166ac4..da63abd836 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/cs.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/cs.json @@ -66,6 +66,9 @@ "GenerateAndDownloadPdf": "Generovat a stáhnout PDF", "PdfFileDeletionWarningMessage": "Opravdu chcete odstranit soubor PDF \"{0}\"?", "ManagePdfFiles": "Správa PDF souborů", - "Permission:ManagePdfFiles": "Správa PDF souborů" + "Permission:ManagePdfFiles": "Správa PDF souborů", + "PdfDeletedSuccessfully": "PDF soubor byl úspěšně smazán", + "PdfGenerationStarted": "Generování PDF bylo zahájeno", + "PdfGenerationStartedInfoMessage": "Generování PDF bylo zahájeno. Po dokončení můžete zkontrolovat, zda byl soubor přidán do sekce PDF souborů." } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/de-DE.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/de-DE.json index a69c9283ea..dcbc32e310 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/de-DE.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/de-DE.json @@ -65,6 +65,9 @@ "GenerateAndDownloadPdf": "PDF generieren und herunterladen", "PdfFileDeletionWarningMessage": "Sind Sie sicher, dass Sie das PDF-Datei \"{0}\" löschen wollen?", "ManagePdfFiles": "PDF-Dateien verwalten", - "Permission:ManagePdfFiles": "PDF-Dateien verwalten" + "Permission:ManagePdfFiles": "PDF-Dateien verwalten", + "PdfDeletedSuccessfully": "PDF-Datei wurde erfolgreich gelöscht", + "PdfGenerationStarted": "PDF-Generierung wurde gestartet", + "PdfGenerationStartedInfoMessage": "Die PDF-Generierung wurde gestartet. Nach Abschluss können Sie überprüfen, ob die Datei im PDF-Dateibereich hinzugefügt wurde." } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/de.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/de.json index 1278047f50..972553c8ab 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/de.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/de.json @@ -66,6 +66,9 @@ "GenerateAndDownloadPdf": "PDF generieren und herunterladen", "PdfFileDeletionWarningMessage": "Sind Sie sicher, dass Sie das PDF-Datei \"{0}\" löschen wollen?", "ManagePdfFiles": "PDF-Dateien verwalten", - "Permission:ManagePdfFiles": "PDF-Dateien verwalten" + "Permission:ManagePdfFiles": "PDF-Dateien verwalten", + "PdfDeletedSuccessfully": "PDF-Datei wurde erfolgreich gelöscht", + "PdfGenerationStarted": "PDF-Generierung gestartet", + "PdfGenerationStartedInfoMessage": "Die PDF-Generierung wurde gestartet. Nach Abschluss können Sie überprüfen, ob die Datei im PDF-Dateibereich hinzugefügt wurde." } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/el.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/el.json index ae8108dfb5..d4142c99ad 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/el.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/el.json @@ -1,7 +1,7 @@ { "culture": "el", "texts": { - "Permission:DocumentManagement": "Διαχείρηση αρχείων", + "Permission:DocumentManagement": "Διαχείριση εγγράφων", "Permission:Projects": "Εργα", "Permission:Edit": "Επεξεργασία", "Permission:Delete": "Διαγραφή", @@ -65,6 +65,9 @@ "GenerateAndDownloadPdf": "Δημιουργία και λήψη PDF", "PdfFileDeletionWarningMessage": "Είστε βέβαιοι ότι θέλετε να διαγράψετε το PDF αρχείο \"{0}\";", "ManagePdfFiles": "Διαχείρηση PDF αρχείων", - "Permission:ManagePdfFiles": "Διαχείρηση PDF αρχείων" + "Permission:ManagePdfFiles": "Διαχείρηση PDF αρχείων", + "PdfDeletedSuccessfully": "Το αρχείο PDF διαγράφηκε με επιτυχία", + "PdfGenerationStarted": "Η δημιουργία PDF ξεκίνησε", + "PdfGenerationStartedInfoMessage": "Η δημιουργία PDF ξεκίνησε. Μόλις ολοκληρωθεί, μπορείτε να ελέγξετε αν το αρχείο έχει προστεθεί στην ενότητα αρχείων PDF." } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/en-GB.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/en-GB.json index 6ed2bb94cd..2ccbdcf18a 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/en-GB.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/en-GB.json @@ -65,6 +65,9 @@ "GenerateAndDownloadPdf": "Generate and download PDF", "PdfFileDeletionWarningMessage": "Are you sure you want to delete the PDF file \"{0}\"?", "ManagePdfFiles": "Manage PDF files", - "Permission:ManagePdfFiles": "Manage PDF files" + "Permission:ManagePdfFiles": "Manage PDF files", + "PdfDeletedSuccessfully": "PDF file has been deleted successfully", + "PdfGenerationStarted": "PDF generation has started", + "PdfGenerationStartedInfoMessage": "PDF generation has started. Once completed, you can check if the file has been added to the PDF files section." } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/en.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/en.json index bc606f7df7..0710e96f2b 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/en.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/en.json @@ -66,6 +66,9 @@ "GenerateAndDownloadPdf": "Generate and download PDF", "PdfFileDeletionWarningMessage": "Are you sure you want to delete the PDF file \"{0}\"?", "ManagePdfFiles": "Manage PDF files", - "Permission:ManagePdfFiles": "Manage PDF files" + "Permission:ManagePdfFiles": "Manage PDF files", + "PdfDeletedSuccessfully": "PDF file has been deleted successfully", + "PdfGenerationStarted": "PDF generation started", + "PdfGenerationStartedInfoMessage": "PDF generation has started. Once completed, you can check if the file has been added to the PDF files section." } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/es.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/es.json index 79937b772d..9be8d72207 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/es.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/es.json @@ -66,6 +66,9 @@ "GenerateAndDownloadPdf": "Generar y descargar PDF", "PdfFileDeletionWarningMessage": "¿Está seguro de querer eliminar el archivo PDF \"{0}\"?", "ManagePdfFiles": "Administrar archivos PDF", - "Permission:ManagePdfFiles": "Administrar archivos PDF" + "Permission:ManagePdfFiles": "Administrar archivos PDF", + "PdfDeletedSuccessfully": "El archivo PDF se ha eliminado correctamente", + "PdfGenerationStarted": "Se inició la generación de PDF", + "PdfGenerationStartedInfoMessage": "La generación del PDF ha comenzado. Una vez completado, puede verificar si el archivo se ha agregado en la sección de archivos PDF." } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/fi.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/fi.json index d227037f32..9393234a44 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/fi.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/fi.json @@ -1,7 +1,7 @@ { "culture": "fi", "texts": { - "Permission:DocumentManagement": "Asiakirjojen hallinta", + "Permission:DocumentManagement": "Asiakirjahallinta", "Permission:Projects": "Projektit", "Permission:Edit": "Muokkaus", "Permission:Delete": "Poisto", @@ -66,6 +66,9 @@ "GenerateAndDownloadPdf": "Generoi ja lataa PDF", "PdfFileDeletionWarningMessage": "Oletko varma, että haluat poistaa PDF-tiedoston \"{0}\"?", "ManagePdfFiles": "Hallitse PDF-tiedostoja", - "Permission:ManagePdfFiles": "Hallitse PDF-tiedostoja" + "Permission:ManagePdfFiles": "Hallitse PDF-tiedostoja", + "PdfDeletedSuccessfully": "PDF-tiedosto poistettu onnistuneesti", + "PdfGenerationStarted": "PDF:n luonti on aloitettu", + "PdfGenerationStartedInfoMessage": "PDF:n luonti on aloitettu. Kun se on valmis, voit tarkistaa, onko tiedosto lisätty PDF-tiedostot-osioon." } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/fr.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/fr.json index 6efe4fe888..3e7affcaf7 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/fr.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/fr.json @@ -1,7 +1,7 @@ { "culture": "fr", "texts": { - "Permission:DocumentManagement": "Gestion de documents", + "Permission:DocumentManagement": "Gestion des documents", "Permission:Projects": "Projets", "Permission:Edit": "Éditer", "Permission:Delete": "Effacer", @@ -66,6 +66,9 @@ "GenerateAndDownloadPdf": "Générer et télécharger PDF", "PdfFileDeletionWarningMessage": "Êtes-vous sûr de vouloir supprimer le fichier PDF \"{0}\"?", "ManagePdfFiles": "Gérer les fichiers PDF", - "Permission:ManagePdfFiles": "Gérer les fichiers PDF" + "Permission:ManagePdfFiles": "Gérer les fichiers PDF", + "PdfDeletedSuccessfully": "Le fichier PDF a été supprimé avec succès", + "PdfGenerationStarted": "La génération du PDF a commencé", + "PdfGenerationStartedInfoMessage": "La génération du PDF a commencé. Une fois terminé, vous pouvez vérifier si le fichier a été ajouté dans la section des fichiers PDF." } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/hi.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/hi.json index cdca790f20..75e43a2bde 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/hi.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/hi.json @@ -66,6 +66,9 @@ "GenerateAndDownloadPdf": "PDF उत्पन्न और डाउनलोड करें", "PdfFileDeletionWarningMessage": "क्या आप वाकई \"{0}\" के PDF फ़ाइल को हटाना चाहते हैं?", "ManagePdfFiles": "PDF फ़ाइलें प्रबंधित करें", - "Permission:ManagePdfFiles": "PDF फ़ाइलें प्रबंधित करें" + "Permission:ManagePdfFiles": "PDF फ़ाइलें प्रबंधित करें", + "PdfDeletedSuccessfully": "PDF फ़ाइल सफलतापूर्वक हटा दी गई", + "PdfGenerationStarted": "PDF जनरेशन शुरू हो गया है", + "PdfGenerationStartedInfoMessage": "PDF जनरेशन शुरू हो गया है। पूरा होने के बाद, आप जांच सकते हैं कि फ़ाइल PDF फ़ाइल सेक्शन में जोड़ी गई है या नहीं।" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/hr.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/hr.json index 547484a062..b58648d7c5 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/hr.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/hr.json @@ -66,6 +66,9 @@ "GenerateAndDownloadPdf": "Generiraj i preuzmi PDF", "PdfFileDeletionWarningMessage": "Jeste li sigurni da želite izbrisati PDF datoteku \"{0}\"?", "ManagePdfFiles": "Upravljanje PDF datotekama", - "Permission:ManagePdfFiles": "Upravljanje PDF datotekama" + "Permission:ManagePdfFiles": "Upravljanje PDF datotekama", + "PdfDeletedSuccessfully": "PDF datoteka je uspješno izbrisana", + "PdfGenerationStarted": "Započelo je generiranje PDF-a", + "PdfGenerationStartedInfoMessage": "Započelo je generiranje PDF-a. Nakon završetka možete provjeriti je li datoteka dodana u odjeljak PDF datoteka." } } diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/is.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/is.json index 64b41ce3b7..e262069bf7 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/is.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/is.json @@ -66,6 +66,9 @@ "GenerateAndDownloadPdf": "Generate and download PDF", "PdfFileDeletionWarningMessage": "Are you sure you want to delete the PDF file \"{0}\"?", "ManagePdfFiles": "Manage PDF files", - "Permission:ManagePdfFiles": "Manage PDF files" + "Permission:ManagePdfFiles": "Manage PDF files", + "PdfDeletedSuccessfully": "PDF skrá var eytt með góðum árangri", + "PdfGenerationStarted": "PDF gerð hefur hafist", + "PdfGenerationStartedInfoMessage": "PDF gerð hefur hafist. Þegar henni er lokið geturðu athugað hvort skráin hafi verið bætt við í PDF skráarhlutanum." } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/it.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/it.json index 29e7d1ba80..f253db8eb0 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/it.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/it.json @@ -66,6 +66,9 @@ "GenerateAndDownloadPdf": "Genera e scarica PDF", "PdfFileDeletionWarningMessage": "Sei sicuro di voler eliminare il file PDF \"{0}\"?", "ManagePdfFiles": "Gestione file PDF", - "Permission:ManagePdfFiles": "Gestione file PDF" + "Permission:ManagePdfFiles": "Gestione file PDF", + "PdfDeletedSuccessfully": "Il file PDF è stato eliminato con successo", + "PdfGenerationStarted": "La generazione del PDF è iniziata", + "PdfGenerationStartedInfoMessage": "La generazione del PDF è iniziata. Al termine, puoi verificare se il file è stato aggiunto nella sezione dei file PDF." } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/nl.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/nl.json index 6f43a26ac8..377d0e3b84 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/nl.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/nl.json @@ -66,6 +66,9 @@ "GenerateAndDownloadPdf": "PDF genereren en downloaden", "PdfFileDeletionWarningMessage": "Weet u zeker dat u het PDF-bestand \"{0}\" wilt verwijderen?", "ManagePdfFiles": "PDF-bestanden beheren", - "Permission:ManagePdfFiles": "PDF-bestanden beheren" + "Permission:ManagePdfFiles": "PDF-bestanden beheren", + "PdfDeletedSuccessfully": "PDF-bestand is succesvol verwijderd", + "PdfGenerationStarted": "PDF-generatie is gestart", + "PdfGenerationStartedInfoMessage": "PDF-generatie is gestart. Na voltooiing kunt u controleren of het bestand is toegevoegd in de PDF-bestandssectie." } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/pl-PL.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/pl-PL.json index a93ee2bd0f..d82a792077 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/pl-PL.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/pl-PL.json @@ -1,7 +1,7 @@ { "culture": "pl-PL", "texts": { - "Permission:DocumentManagement": "Zarządzanie dokumentacją", + "Permission:DocumentManagement": "Zarządzanie dokumentami", "Permission:Projects": "Projekty", "Permission:Edit": "Edytuj", "Permission:Delete": "Usuń", @@ -66,6 +66,9 @@ "GenerateAndDownloadPdf": "Generuj i pobierz PDF", "PdfFileDeletionWarningMessage": "Czy na pewno chcesz usunąć plik PDF \"{0}\"?", "ManagePdfFiles": "Zarządzanie plikami PDF", - "Permission:ManagePdfFiles": "Zarządzanie plikami PDF" + "Permission:ManagePdfFiles": "Zarządzaj plikami PDF", + "PdfDeletedSuccessfully": "Plik PDF został pomyślnie usunięty", + "PdfGenerationStarted": "Rozpoczęto generowanie PDF", + "PdfGenerationStartedInfoMessage": "Rozpoczęto generowanie PDF. Po zakończeniu możesz sprawdzić, czy plik został dodany w sekcji plików PDF." } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/pt-BR.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/pt-BR.json index ff8be45830..b1e0810dee 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/pt-BR.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/pt-BR.json @@ -1,7 +1,7 @@ { "culture": "pt-BR", "texts": { - "Permission:DocumentManagement": "Gerenciar Documentos", + "Permission:DocumentManagement": "Gerenciamento de documentos", "Permission:Projects": "Projetos", "Permission:Edit": "Editar", "Permission:Delete": "Excluir", @@ -66,6 +66,9 @@ "GenerateAndDownloadPdf": "Gerar e baixar PDF", "PdfFileDeletionWarningMessage": "Tem certeza de que deseja excluir o arquivo PDF \"{0}\"?", "ManagePdfFiles": "Gerenciar arquivos PDF", - "Permission:ManagePdfFiles": "Gerenciar arquivos PDF" + "Permission:ManagePdfFiles": "Gerenciar arquivos PDF", + "PdfDeletedSuccessfully": "Arquivo PDF foi excluído com sucesso", + "PdfGenerationStarted": "A geração do PDF foi iniciada", + "PdfGenerationStartedInfoMessage": "A geração do PDF foi iniciada. Após a conclusão, você pode verificar se o arquivo foi adicionado na seção de arquivos PDF." } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/ro-RO.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/ro-RO.json index 68f40183d8..2da365c7c5 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/ro-RO.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/ro-RO.json @@ -1,7 +1,7 @@ { "culture": "ro-RO", "texts": { - "Permission:DocumentManagement": "Administrarea documentelor", + "Permission:DocumentManagement": "Gestionare documente", "Permission:Projects": "Proiecte", "Permission:Edit": "Editează", "Permission:Delete": "Şterge", @@ -66,6 +66,9 @@ "GenerateAndDownloadPdf": "Generare și descărcare PDF", "PdfFileDeletionWarningMessage": "Sunteți sigur(ă) că doriți să ștergeți fișierul PDF \"{0}\"?", "ManagePdfFiles": "Gestionare fișiere PDF", - "Permission:ManagePdfFiles": "Gestionare fișiere PDF" + "Permission:ManagePdfFiles": "Gestionare fișiere PDF", + "PdfDeletedSuccessfully": "Fișierul PDF a fost șters cu succes", + "PdfGenerationStarted": "Generarea PDF-ului a început", + "PdfGenerationStartedInfoMessage": "Generarea PDF-ului a început. După finalizare, puteți verifica dacă fișierul a fost adăugat în secțiunea de fișiere PDF." } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/ru.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/ru.json index bc2691121d..5f05e906bc 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/ru.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/ru.json @@ -1,7 +1,7 @@ { "culture": "ru", "texts": { - "Permission:DocumentManagement": "Управление документацией", + "Permission:DocumentManagement": "Управление документами", "Permission:Projects": "Проекты", "Permission:Edit": "Редактировать", "Permission:Delete": "Удалить", @@ -65,7 +65,10 @@ "PdfGeneratedSuccessfully": "PDF успешно сгенерирован", "GenerateAndDownloadPdf": "Сгенерировать и скачать PDF", "PdfFileDeletionWarningMessage": "Вы уверены, что хотите удалить файл PDF \"{0}\"?", - "ManagePdfFiles": "Управление файлами PDF", - "Permission:ManagePdfFiles": "Управление файлами PDF" + "ManagePdfFiles": "Управление PDF файлами", + "Permission:ManagePdfFiles": "Управление PDF файлами", + "PdfDeletedSuccessfully": "PDF файл успешно удален", + "PdfGenerationStarted": "Началась генерация PDF", + "PdfGenerationStartedInfoMessage": "Началась генерация PDF. После завершения вы можете проверить, добавлен ли файл в раздел PDF файлов." } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/sk.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/sk.json index 8b06da0e82..8ba521bb71 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/sk.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/sk.json @@ -66,6 +66,9 @@ "GenerateAndDownloadPdf": "Generovať a stiahnuť PDF", "PdfFileDeletionWarningMessage": "Ste si istý, že chcete odstrániť súbor PDF \"{0}\"?", "ManagePdfFiles": "Správa PDF súborov", - "Permission:ManagePdfFiles": "Správa PDF súborov" + "Permission:ManagePdfFiles": "Správa PDF súborov", + "PdfDeletedSuccessfully": "PDF súbor bol úspešne odstránený", + "PdfGenerationStarted": "Začala sa generácia PDF", + "PdfGenerationStartedInfoMessage": "Začala sa generácia PDF. Po dokončení môžete skontrolovať, či bol súbor pridaný v sekcii PDF súborov." } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/sl.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/sl.json index 0fe64f8903..dbf648bed2 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/sl.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/sl.json @@ -66,6 +66,9 @@ "GenerateAndDownloadPdf": "Generiraj in prenesi PDF", "PdfFileDeletionWarningMessage": "Ali ste prepričani, da želite izbrisati datoteko PDF »{0}«?", "ManagePdfFiles": "Upravljanje datotek PDF", - "Permission:ManagePdfFiles": "Upravljanje datotek PDF" + "Permission:ManagePdfFiles": "Upravljanje datotek PDF", + "PdfDeletedSuccessfully": "PDF datoteka je bila uspešno izbrisana", + "PdfGenerationStarted": "Začelo se je ustvarjanje PDF-ja", + "PdfGenerationStartedInfoMessage": "Začelo se je ustvarjanje PDF-ja. Ko bo končano, lahko preverite, ali je bila datoteka dodana v razdelek PDF datotek." } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/sv.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/sv.json index db67ecb79b..08571922d8 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/sv.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/sv.json @@ -66,6 +66,9 @@ "GenerateAndDownloadPdf": "Generate and download PDF", "PdfFileDeletionWarningMessage": "Are you sure you want to delete the PDF file \"{0}\"?", "ManagePdfFiles": "Manage PDF files", - "Permission:ManagePdfFiles": "Manage PDF files" + "Permission:ManagePdfFiles": "Manage PDF files", + "PdfDeletedSuccessfully": "PDF-filen har tagits bort", + "PdfGenerationStarted": "PDF-generering har påbörjats", + "PdfGenerationStartedInfoMessage": "PDF-generering har påbörjats. När den är klar kan du kontrollera om filen har lagts till i PDF-filsektionen." } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/tr.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/tr.json index 42283a4b89..6f2989cf2c 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/tr.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/tr.json @@ -1,7 +1,7 @@ { "culture": "tr", "texts": { - "Permission:DocumentManagement": "Döküman yönetimi", + "Permission:DocumentManagement": "Belge Yönetimi", "Permission:Projects": "Projeler", "Permission:Edit": "Düzenle", "Permission:Delete": "Sil", @@ -66,6 +66,9 @@ "GenerateAndDownloadPdf": "PDF oluştur ve indir", "PdfFileDeletionWarningMessage": "{0} PDF dosyasını silmek istediğinizden emin misiniz?", "ManagePdfFiles": "PDF dosyalarını yönet", - "Permission:ManagePdfFiles": "PDF dosyalarını yönet" + "Permission:ManagePdfFiles": "PDF dosyalarını yönet", + "PdfDeletedSuccessfully": "PDF dosyası başarıyla silindi", + "PdfGenerationStarted": "PDF oluşturma başladı", + "PdfGenerationStartedInfoMessage": "PDF oluşturma işlemi başlatıldı. İşlem tamamlandığında, dosyanın PDF dosyaları bölümüne eklenip eklenmediğini kontrol edebilirsiniz." } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/vi.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/vi.json index 176b427e59..1b716f20f2 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/vi.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/vi.json @@ -66,6 +66,9 @@ "GenerateAndDownloadPdf": "Tạo và tải xuống PDF", "PdfFileDeletionWarningMessage": "Bạn có chắc chắn muốn xóa tệp PDF \"{0}\" không?", "ManagePdfFiles": "Quản lý tệp PDF", - "Permission:ManagePdfFiles": "Quản lý tệp PDF" + "Permission:ManagePdfFiles": "Quản lý tệp PDF", + "PdfDeletedSuccessfully": "Tệp PDF đã được xóa thành công", + "PdfGenerationStarted": "Bắt đầu tạo PDF", + "PdfGenerationStartedInfoMessage": "Quá trình tạo PDF đã bắt đầu. Sau khi hoàn thành, bạn có thể kiểm tra xem tệp đã được thêm vào phần tệp PDF chưa." } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/zh-Hans.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/zh-Hans.json index 137e42e4ae..a7af969a12 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/zh-Hans.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/zh-Hans.json @@ -66,6 +66,9 @@ "GenerateAndDownloadPdf": "生成并下载PDF", "PdfFileDeletionWarningMessage": "你确定要删除PDF文件“{0}”吗?", "ManagePdfFiles": "管理PDF文件", - "Permission:ManagePdfFiles": "管理PDF文件" + "Permission:ManagePdfFiles": "管理PDF文件", + "PdfDeletedSuccessfully": "PDF文件已成功删除", + "PdfGenerationStarted": "PDF生成已开始", + "PdfGenerationStartedInfoMessage": "PDF生成已开始。完成后,您可以在PDF文件部分检查文件是否已添加。" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/zh-Hant.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/zh-Hant.json index bfa6e4ea97..99cc9cec27 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/zh-Hant.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/zh-Hant.json @@ -66,6 +66,9 @@ "GenerateAndDownloadPdf": "生成并下载PDF", "PdfFileDeletionWarningMessage": "你確定要刪除PDF文件“{0}”嗎?", "ManagePdfFiles": "管理PDF文件", - "Permission:ManagePdfFiles": "管理PDF文件" + "Permission:ManagePdfFiles": "管理PDF文件", + "PdfDeletedSuccessfully": "PDF文件已成功刪除", + "PdfGenerationStarted": "PDF生成已開始", + "PdfGenerationStartedInfoMessage": "PDF生成已開始。完成後,您可以在PDF文件部分檢查文件是否已添加。" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Projects/IProjectAdminAppService.cs b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Projects/IProjectAdminAppService.cs index 41b309f308..6f3d503f44 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Projects/IProjectAdminAppService.cs +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Projects/IProjectAdminAppService.cs @@ -22,9 +22,5 @@ namespace Volo.Docs.Admin.Projects Task ReindexAllAsync(); Task> GetListWithoutDetailsAsync(); - - Task> GetPdfFilesAsync(GetPdfFilesInput input); - - Task DeletePdfFileAsync(DeletePdfFileInput input); } } diff --git a/modules/docs/src/Volo.Docs.Admin.Application/Volo.Docs.Admin.Application.csproj b/modules/docs/src/Volo.Docs.Admin.Application/Volo.Docs.Admin.Application.csproj index 7279eeee67..725c70bc2b 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application/Volo.Docs.Admin.Application.csproj +++ b/modules/docs/src/Volo.Docs.Admin.Application/Volo.Docs.Admin.Application.csproj @@ -17,6 +17,7 @@ + diff --git a/modules/docs/src/Volo.Docs.Admin.Application/Volo/Docs/Admin/BackgroundJobs/DocumentPdfGenerateJob.cs b/modules/docs/src/Volo.Docs.Admin.Application/Volo/Docs/Admin/BackgroundJobs/DocumentPdfGenerateJob.cs new file mode 100644 index 0000000000..2921039a91 --- /dev/null +++ b/modules/docs/src/Volo.Docs.Admin.Application/Volo/Docs/Admin/BackgroundJobs/DocumentPdfGenerateJob.cs @@ -0,0 +1,41 @@ +using System; +using System.Threading.Tasks; +using Microsoft.Extensions.Logging; +using Volo.Abp.BackgroundJobs; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Uow; +using Volo.Docs.Projects; +using Volo.Docs.Projects.Pdf; + +namespace Volo.Docs.Admin.BackgroundJobs; + +public class DocumentPdfGenerateJob : AsyncBackgroundJob, ITransientDependency +{ + protected IProjectPdfGenerator ProjectPdfGenerator { get; } + protected IProjectRepository ProjectRepository { get; } + + protected IUnitOfWorkManager UnitOfWorkManager { get; } + + public DocumentPdfGenerateJob(IProjectPdfGenerator projectPdfGenerator, IProjectRepository projectRepository, IUnitOfWorkManager unitOfWorkManager) + { + ProjectPdfGenerator = projectPdfGenerator; + ProjectRepository = projectRepository; + UnitOfWorkManager = unitOfWorkManager; + } + + public async override Task ExecuteAsync(DocumentPdfGenerateJobArgs args) + { + try + { + Logger.LogInformation("Generating PDF for project {ProjectId}, version {Version}, language {LanguageCode}", args.ProjectId, args.Version, args.LanguageCode); + using var uow = UnitOfWorkManager.Begin(requiresNew: true); + var project = await ProjectRepository.GetAsync(args.ProjectId, includeDetails: true); + await ProjectPdfGenerator.GenerateAsync(project, args.Version, args.LanguageCode); + await uow.CompleteAsync(); + } + catch (Exception e) + { + Logger.LogError(e, "Error while generating PDF for project {ProjectId}, version {Version}, language {LanguageCode}", args.ProjectId, args.Version, args.LanguageCode); + } + } +} \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application/Volo/Docs/Admin/BackgroundJobs/DocumentPdfGenerateJobArgs.cs b/modules/docs/src/Volo.Docs.Admin.Application/Volo/Docs/Admin/BackgroundJobs/DocumentPdfGenerateJobArgs.cs new file mode 100644 index 0000000000..ce8b734f2c --- /dev/null +++ b/modules/docs/src/Volo.Docs.Admin.Application/Volo/Docs/Admin/BackgroundJobs/DocumentPdfGenerateJobArgs.cs @@ -0,0 +1,13 @@ +using System; +using Volo.Abp.BackgroundJobs; + +namespace Volo.Docs.Admin.BackgroundJobs; + +public class DocumentPdfGenerateJobArgs +{ + public Guid ProjectId { get; set; } + + public string Version { get; set; } + + public string LanguageCode { get; set; } +} \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application/Volo/Docs/Admin/DocsAdminApplicationModule.cs b/modules/docs/src/Volo.Docs.Admin.Application/Volo/Docs/Admin/DocsAdminApplicationModule.cs index 7e6983d65e..2491bf5fb6 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application/Volo/Docs/Admin/DocsAdminApplicationModule.cs +++ b/modules/docs/src/Volo.Docs.Admin.Application/Volo/Docs/Admin/DocsAdminApplicationModule.cs @@ -4,6 +4,7 @@ using Volo.Abp.AutoMapper; using Volo.Abp.Caching; using Volo.Abp.Modularity; using Volo.Docs.Common; +using Volo.Abp.BackgroundJobs; namespace Volo.Docs.Admin { @@ -13,7 +14,8 @@ namespace Volo.Docs.Admin typeof(DocsCommonApplicationModule), typeof(AbpCachingModule), typeof(AbpAutoMapperModule), - typeof(AbpDddApplicationModule) + typeof(AbpDddApplicationModule), + typeof(AbpBackgroundJobsAbstractionsModule) )] public class DocsAdminApplicationModule : AbpModule { diff --git a/modules/docs/src/Volo.Docs.Admin.Application/Volo/Docs/Admin/Documents/DocumentPdfAdminAppService.cs b/modules/docs/src/Volo.Docs.Admin.Application/Volo/Docs/Admin/Documents/DocumentPdfAdminAppService.cs new file mode 100644 index 0000000000..9d10d0d99a --- /dev/null +++ b/modules/docs/src/Volo.Docs.Admin.Application/Volo/Docs/Admin/Documents/DocumentPdfAdminAppService.cs @@ -0,0 +1,64 @@ +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Authorization; +using Microsoft.Extensions.Options; +using Volo.Abp.Application.Dtos; +using Volo.Abp.BackgroundJobs; +using Volo.Abp.DistributedLocking; +using Volo.Docs.Admin.BackgroundJobs; +using Volo.Docs.Admin.Projects; +using Volo.Docs.Common.Documents; +using Volo.Docs.Projects; +using Volo.Docs.Projects.Pdf; + +namespace Volo.Docs.Admin.Documents; + +[Authorize(DocsAdminPermissions.Projects.ManagePdfFiles)] +public class DocumentPdfAdminAppService : DocumentPdfAppService, IDocumentPdfAdminAppService +{ + protected IBackgroundJobManager BackgroundJobManager { get; } + protected IAbpDistributedLock DistributedLock { get; } + + public DocumentPdfAdminAppService( + IProjectPdfGenerator projectPdfGenerator, + IProjectRepository projectRepository, + IProjectPdfFileStore projectPdfFileStore, + IOptions options, + IBackgroundJobManager backgroundJobManager, + IAbpDistributedLock distributedLock) : + base(projectPdfGenerator, projectRepository, projectPdfFileStore, options) + { + BackgroundJobManager = backgroundJobManager; + DistributedLock = distributedLock; + } + + public virtual async Task GeneratePdfAsync(DocumentPdfGeneratorInput input) + { + var project = await ProjectRepository.GetAsync(input.ProjectId, includeDetails: true); + await BackgroundJobManager.EnqueueAsync(new DocumentPdfGenerateJobArgs + { + Version = project.GetFullVersion(input.Version), + LanguageCode = input.LanguageCode, + ProjectId = input.ProjectId, + }); + } + + public virtual async Task> GetPdfFilesAsync(GetPdfFilesInput input) + { + var project = await ProjectRepository.GetAsync(input.ProjectId, includeDetails: true); + + var pdfFiles = project.PdfFiles.Skip(input.SkipCount).Take(input.MaxResultCount).ToList(); + + return new PagedResultDto( + project.PdfFiles.Count, + ObjectMapper.Map, List>(pdfFiles) + ); + } + + public virtual async Task DeletePdfFileAsync(DeletePdfFileInput input) + { + var project = await ProjectRepository.GetAsync(input.ProjectId, includeDetails: true); + await ProjectPdfFileStore.DeleteAsync(project, input.Version, input.LanguageCode); + } +} \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application/Volo/Docs/Admin/Projects/ProjectAdminAppService.cs b/modules/docs/src/Volo.Docs.Admin.Application/Volo/Docs/Admin/Projects/ProjectAdminAppService.cs index abbb26abe5..af4ca2230b 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application/Volo/Docs/Admin/Projects/ProjectAdminAppService.cs +++ b/modules/docs/src/Volo.Docs.Admin.Application/Volo/Docs/Admin/Projects/ProjectAdminAppService.cs @@ -181,25 +181,5 @@ namespace Volo.Docs.Admin.Projects var projects = await _projectRepository.GetListWithoutDetailsAsync(); return ObjectMapper.Map, List>(projects); } - - [Authorize(DocsAdminPermissions.Projects.ManagePdfFiles)] - public virtual async Task> GetPdfFilesAsync(GetPdfFilesInput input) - { - var project = await _projectRepository.GetAsync(input.ProjectId, includeDetails: true); - - var pdfFiles = project.PdfFiles.Skip(input.SkipCount).Take(input.MaxResultCount).ToList(); - - return new PagedResultDto( - project.PdfFiles.Count, - ObjectMapper.Map, List>(pdfFiles) - ); - } - - [Authorize(DocsAdminPermissions.Projects.ManagePdfFiles)] - public virtual async Task DeletePdfFileAsync(DeletePdfFileInput input) - { - var project = await _projectRepository.GetAsync(input.ProjectId, includeDetails: true); - await _projectPdfFileStore.DeleteAsync(project, input.Version, input.LanguageCode); - } } } diff --git a/modules/docs/src/Volo.Docs.Admin.HttpApi.Client/ClientProxies/Volo/Docs/Admin/DocumentPdfAdminClientProxy.Generated.cs b/modules/docs/src/Volo.Docs.Admin.HttpApi.Client/ClientProxies/Volo/Docs/Admin/DocumentPdfAdminClientProxy.Generated.cs new file mode 100644 index 0000000000..8c14d65460 --- /dev/null +++ b/modules/docs/src/Volo.Docs.Admin.HttpApi.Client/ClientProxies/Volo/Docs/Admin/DocumentPdfAdminClientProxy.Generated.cs @@ -0,0 +1,61 @@ +// This file is automatically generated by ABP framework to use MVC Controllers from CSharp +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Volo.Abp; +using Volo.Abp.Application.Dtos; +using Volo.Abp.Content; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Http.Client; +using Volo.Abp.Http.Client.ClientProxying; +using Volo.Abp.Http.Modeling; +using Volo.Docs.Admin.Projects; +using Volo.Docs.Common.Documents; + +// ReSharper disable once CheckNamespace +namespace Volo.Docs.Admin; + +[Dependency(ReplaceServices = true)] +[ExposeServices(typeof(IDocumentPdfAppService), typeof(DocumentPdfAdminClientProxy))] +public partial class DocumentPdfAdminClientProxy : ClientProxyBase, IDocumentPdfAppService +{ + public virtual async Task GeneratePdfAsync(DocumentPdfGeneratorInput input) + { + await RequestAsync(nameof(GeneratePdfAsync), new ClientProxyRequestTypeValue + { + { typeof(DocumentPdfGeneratorInput), input } + }); + } + + public virtual async Task> GetPdfFilesAsync(GetPdfFilesInput input) + { + return await RequestAsync>(nameof(GetPdfFilesAsync), new ClientProxyRequestTypeValue + { + { typeof(GetPdfFilesInput), input } + }); + } + + public virtual async Task DeletePdfFileAsync(DeletePdfFileInput input) + { + await RequestAsync(nameof(DeletePdfFileAsync), new ClientProxyRequestTypeValue + { + { typeof(DeletePdfFileInput), input } + }); + } + + public virtual async Task DownloadPdfAsync(DocumentPdfGeneratorInput input) + { + return await RequestAsync(nameof(DownloadPdfAsync), new ClientProxyRequestTypeValue + { + { typeof(DocumentPdfGeneratorInput), input } + }); + } + + public virtual async Task ExistsAsync(DocumentPdfGeneratorInput input) + { + return await RequestAsync(nameof(ExistsAsync), new ClientProxyRequestTypeValue + { + { typeof(DocumentPdfGeneratorInput), input } + }); + } +} diff --git a/modules/docs/src/Volo.Docs.Admin.HttpApi.Client/ClientProxies/Volo/Docs/Admin/DocumentPdfAdminClientProxy.cs b/modules/docs/src/Volo.Docs.Admin.HttpApi.Client/ClientProxies/Volo/Docs/Admin/DocumentPdfAdminClientProxy.cs new file mode 100644 index 0000000000..a8d5f82116 --- /dev/null +++ b/modules/docs/src/Volo.Docs.Admin.HttpApi.Client/ClientProxies/Volo/Docs/Admin/DocumentPdfAdminClientProxy.cs @@ -0,0 +1,7 @@ +// This file is part of DocumentPdfAdminClientProxy, you can customize it here +// ReSharper disable once CheckNamespace +namespace Volo.Docs.Admin; + +public partial class DocumentPdfAdminClientProxy +{ +} diff --git a/modules/docs/src/Volo.Docs.Admin.HttpApi.Client/ClientProxies/Volo/Docs/Admin/ProjectsAdminClientProxy.Generated.cs b/modules/docs/src/Volo.Docs.Admin.HttpApi.Client/ClientProxies/Volo/Docs/Admin/ProjectsAdminClientProxy.Generated.cs index 9437ee487d..54f1ec22d5 100644 --- a/modules/docs/src/Volo.Docs.Admin.HttpApi.Client/ClientProxies/Volo/Docs/Admin/ProjectsAdminClientProxy.Generated.cs +++ b/modules/docs/src/Volo.Docs.Admin.HttpApi.Client/ClientProxies/Volo/Docs/Admin/ProjectsAdminClientProxy.Generated.cs @@ -68,22 +68,6 @@ public partial class ProjectsAdminClientProxy : ClientProxyBase>(nameof(GetListWithoutDetailsAsync)); } - public virtual async Task> GetPdfFilesAsync(GetPdfFilesInput input) - { - return await RequestAsync>(nameof(GetPdfFilesAsync), new ClientProxyRequestTypeValue - { - { typeof(GetPdfFilesInput), input } - }); - } - - public virtual async Task DeletePdfFileAsync(DeletePdfFileInput input) - { - await RequestAsync(nameof(DeletePdfFileAsync), new ClientProxyRequestTypeValue - { - { typeof(DeletePdfFileInput), input } - }); - } - public virtual async Task ReindexAsync(ReindexInput input) { await RequestAsync(nameof(ReindexAsync), new ClientProxyRequestTypeValue diff --git a/modules/docs/src/Volo.Docs.Admin.HttpApi.Client/ClientProxies/Volo/Docs/Admin/docs-admin-generate-proxy.json b/modules/docs/src/Volo.Docs.Admin.HttpApi.Client/ClientProxies/Volo/Docs/Admin/docs-admin-generate-proxy.json index e433e06ef9..0b3e9f9445 100644 --- a/modules/docs/src/Volo.Docs.Admin.HttpApi.Client/ClientProxies/Volo/Docs/Admin/docs-admin-generate-proxy.json +++ b/modules/docs/src/Volo.Docs.Admin.HttpApi.Client/ClientProxies/Volo/Docs/Admin/docs-admin-generate-proxy.json @@ -4,6 +4,466 @@ "rootPath": "docs-admin", "remoteServiceName": "AbpDocsAdmin", "controllers": { + "Volo.Docs.Admin.DocumentPdfAdminController": { + "controllerName": "DocumentPdfAdmin", + "controllerGroupName": "DocumentsPdfAdmin", + "isRemoteService": true, + "isIntegrationService": false, + "apiVersion": null, + "type": "Volo.Docs.Admin.DocumentPdfAdminController", + "interfaces": [ + { + "type": "Volo.Docs.Admin.Documents.IDocumentPdfAdminAppService", + "name": "IDocumentPdfAdminAppService", + "methods": [ + { + "name": "GeneratePdfAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Docs.Common.Documents.DocumentPdfGeneratorInput, Volo.Docs.Common.Application.Contracts", + "type": "Volo.Docs.Common.Documents.DocumentPdfGeneratorInput", + "typeSimple": "Volo.Docs.Common.Documents.DocumentPdfGeneratorInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + }, + { + "name": "GetPdfFilesAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Docs.Admin.Projects.GetPdfFilesInput, Volo.Docs.Admin.Application.Contracts", + "type": "Volo.Docs.Admin.Projects.GetPdfFilesInput", + "typeSimple": "Volo.Docs.Admin.Projects.GetPdfFilesInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.PagedResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto" + } + }, + { + "name": "DeletePdfFileAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Docs.Admin.Projects.DeletePdfFileInput, Volo.Docs.Admin.Application.Contracts", + "type": "Volo.Docs.Admin.Projects.DeletePdfFileInput", + "typeSimple": "Volo.Docs.Admin.Projects.DeletePdfFileInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + } + }, + { + "name": "DownloadPdfAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Docs.Common.Documents.DocumentPdfGeneratorInput, Volo.Docs.Common.Application.Contracts", + "type": "Volo.Docs.Common.Documents.DocumentPdfGeneratorInput", + "typeSimple": "Volo.Docs.Common.Documents.DocumentPdfGeneratorInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Content.IRemoteStreamContent", + "typeSimple": "Volo.Abp.Content.IRemoteStreamContent" + } + }, + { + "name": "ExistsAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Docs.Common.Documents.DocumentPdfGeneratorInput, Volo.Docs.Common.Application.Contracts", + "type": "Volo.Docs.Common.Documents.DocumentPdfGeneratorInput", + "typeSimple": "Volo.Docs.Common.Documents.DocumentPdfGeneratorInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Boolean", + "typeSimple": "boolean" + } + } + ] + }, + { + "type": "Volo.Docs.Common.Documents.IDocumentPdfAppService", + "name": "IDocumentPdfAppService", + "methods": [ + { + "name": "DownloadPdfAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Docs.Common.Documents.DocumentPdfGeneratorInput, Volo.Docs.Common.Application.Contracts", + "type": "Volo.Docs.Common.Documents.DocumentPdfGeneratorInput", + "typeSimple": "Volo.Docs.Common.Documents.DocumentPdfGeneratorInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Content.IRemoteStreamContent", + "typeSimple": "Volo.Abp.Content.IRemoteStreamContent" + } + }, + { + "name": "ExistsAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Docs.Common.Documents.DocumentPdfGeneratorInput, Volo.Docs.Common.Application.Contracts", + "type": "Volo.Docs.Common.Documents.DocumentPdfGeneratorInput", + "typeSimple": "Volo.Docs.Common.Documents.DocumentPdfGeneratorInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Boolean", + "typeSimple": "boolean" + } + } + ] + } + ], + "actions": { + "GeneratePdfAsyncByInput": { + "uniqueName": "GeneratePdfAsyncByInput", + "name": "GeneratePdfAsync", + "httpMethod": "GET", + "url": "api/docs/admin/documents/pdf/generate", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Docs.Common.Documents.DocumentPdfGeneratorInput, Volo.Docs.Common.Application.Contracts", + "type": "Volo.Docs.Common.Documents.DocumentPdfGeneratorInput", + "typeSimple": "Volo.Docs.Common.Documents.DocumentPdfGeneratorInput", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "ProjectId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "Version", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "LanguageCode", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Docs.Admin.Documents.IDocumentPdfAdminAppService" + }, + "GetPdfFilesAsyncByInput": { + "uniqueName": "GetPdfFilesAsyncByInput", + "name": "GetPdfFilesAsync", + "httpMethod": "GET", + "url": "api/docs/admin/documents/pdf/files", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Docs.Admin.Projects.GetPdfFilesInput, Volo.Docs.Admin.Application.Contracts", + "type": "Volo.Docs.Admin.Projects.GetPdfFilesInput", + "typeSimple": "Volo.Docs.Admin.Projects.GetPdfFilesInput", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "ProjectId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "Sorting", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "SkipCount", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "MaxResultCount", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + } + ], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.PagedResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Docs.Admin.Documents.IDocumentPdfAdminAppService" + }, + "DeletePdfFileAsyncByInput": { + "uniqueName": "DeletePdfFileAsyncByInput", + "name": "DeletePdfFileAsync", + "httpMethod": "DELETE", + "url": "api/docs/admin/documents/pdf/delete-file", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Docs.Admin.Projects.DeletePdfFileInput, Volo.Docs.Admin.Application.Contracts", + "type": "Volo.Docs.Admin.Projects.DeletePdfFileInput", + "typeSimple": "Volo.Docs.Admin.Projects.DeletePdfFileInput", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "ProjectId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "Version", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "LanguageCode", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Docs.Admin.Documents.IDocumentPdfAdminAppService" + }, + "DownloadPdfAsyncByInput": { + "uniqueName": "DownloadPdfAsyncByInput", + "name": "DownloadPdfAsync", + "httpMethod": "GET", + "url": "api/docs/admin/documents/pdf/download", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Docs.Common.Documents.DocumentPdfGeneratorInput, Volo.Docs.Common.Application.Contracts", + "type": "Volo.Docs.Common.Documents.DocumentPdfGeneratorInput", + "typeSimple": "Volo.Docs.Common.Documents.DocumentPdfGeneratorInput", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "ProjectId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "Version", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "LanguageCode", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + } + ], + "returnValue": { + "type": "Volo.Abp.Content.IRemoteStreamContent", + "typeSimple": "Volo.Abp.Content.IRemoteStreamContent" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Docs.Common.Documents.IDocumentPdfAppService" + }, + "ExistsAsyncByInput": { + "uniqueName": "ExistsAsyncByInput", + "name": "ExistsAsync", + "httpMethod": "GET", + "url": "api/docs/admin/documents/pdf/exists", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Docs.Common.Documents.DocumentPdfGeneratorInput, Volo.Docs.Common.Application.Contracts", + "type": "Volo.Docs.Common.Documents.DocumentPdfGeneratorInput", + "typeSimple": "Volo.Docs.Common.Documents.DocumentPdfGeneratorInput", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "ProjectId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "Version", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "LanguageCode", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + } + ], + "returnValue": { + "type": "System.Boolean", + "typeSimple": "boolean" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Docs.Common.Documents.IDocumentPdfAppService" + } + } + }, "Volo.Docs.Admin.DocumentsAdminController": { "controllerName": "DocumentsAdmin", "controllerGroupName": "DocumentsAdmin", diff --git a/modules/docs/src/Volo.Docs.Admin.HttpApi.Client/ClientProxies/docs-admin-generate-proxy.json b/modules/docs/src/Volo.Docs.Admin.HttpApi.Client/ClientProxies/docs-admin-generate-proxy.json deleted file mode 100644 index 636c7b6d25..0000000000 --- a/modules/docs/src/Volo.Docs.Admin.HttpApi.Client/ClientProxies/docs-admin-generate-proxy.json +++ /dev/null @@ -1,1199 +0,0 @@ -{ - "modules": { - "docs-admin": { - "rootPath": "docs-admin", - "remoteServiceName": "AbpDocsAdmin", - "controllers": { - "Volo.Docs.Admin.DocumentsAdminController": { - "controllerName": "DocumentsAdmin", - "controllerGroupName": "DocumentsAdmin", - "isRemoteService": true, - "isIntegrationService": false, - "apiVersion": null, - "type": "Volo.Docs.Admin.DocumentsAdminController", - "interfaces": [ - { - "type": "Volo.Docs.Admin.Documents.IDocumentAdminAppService", - "name": "IDocumentAdminAppService", - "methods": [ - { - "name": "ClearCacheAsync", - "parametersOnMethod": [ - { - "name": "input", - "typeAsString": "Volo.Docs.Admin.Documents.ClearCacheInput, Volo.Docs.Admin.Application.Contracts", - "type": "Volo.Docs.Admin.Documents.ClearCacheInput", - "typeSimple": "Volo.Docs.Admin.Documents.ClearCacheInput", - "isOptional": false, - "defaultValue": null - } - ], - "returnValue": { - "type": "System.Void", - "typeSimple": "System.Void" - } - }, - { - "name": "PullAllAsync", - "parametersOnMethod": [ - { - "name": "input", - "typeAsString": "Volo.Docs.Admin.Documents.PullAllDocumentInput, Volo.Docs.Admin.Application.Contracts", - "type": "Volo.Docs.Admin.Documents.PullAllDocumentInput", - "typeSimple": "Volo.Docs.Admin.Documents.PullAllDocumentInput", - "isOptional": false, - "defaultValue": null - } - ], - "returnValue": { - "type": "System.Void", - "typeSimple": "System.Void" - } - }, - { - "name": "PullAsync", - "parametersOnMethod": [ - { - "name": "input", - "typeAsString": "Volo.Docs.Admin.Documents.PullDocumentInput, Volo.Docs.Admin.Application.Contracts", - "type": "Volo.Docs.Admin.Documents.PullDocumentInput", - "typeSimple": "Volo.Docs.Admin.Documents.PullDocumentInput", - "isOptional": false, - "defaultValue": null - } - ], - "returnValue": { - "type": "System.Void", - "typeSimple": "System.Void" - } - }, - { - "name": "GetAllAsync", - "parametersOnMethod": [ - { - "name": "input", - "typeAsString": "Volo.Docs.Admin.Documents.GetAllInput, Volo.Docs.Admin.Application.Contracts", - "type": "Volo.Docs.Admin.Documents.GetAllInput", - "typeSimple": "Volo.Docs.Admin.Documents.GetAllInput", - "isOptional": false, - "defaultValue": null - } - ], - "returnValue": { - "type": "Volo.Abp.Application.Dtos.PagedResultDto", - "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto" - } - }, - { - "name": "RemoveFromCacheAsync", - "parametersOnMethod": [ - { - "name": "documentId", - "typeAsString": "System.Guid, System.Private.CoreLib", - "type": "System.Guid", - "typeSimple": "string", - "isOptional": false, - "defaultValue": null - } - ], - "returnValue": { - "type": "System.Void", - "typeSimple": "System.Void" - } - }, - { - "name": "ReindexAsync", - "parametersOnMethod": [ - { - "name": "documentId", - "typeAsString": "System.Guid, System.Private.CoreLib", - "type": "System.Guid", - "typeSimple": "string", - "isOptional": false, - "defaultValue": null - } - ], - "returnValue": { - "type": "System.Void", - "typeSimple": "System.Void" - } - }, - { - "name": "GetFilterItemsAsync", - "parametersOnMethod": [], - "returnValue": { - "type": "System.Collections.Generic.List", - "typeSimple": "[Volo.Docs.Admin.Documents.DocumentInfoDto]" - } - }, - { - "name": "GetProjectsAsync", - "parametersOnMethod": [], - "returnValue": { - "type": "System.Collections.Generic.List", - "typeSimple": "[Volo.Docs.Admin.Projects.ProjectWithoutDetailsDto]" - } - } - ] - } - ], - "actions": { - "ClearCacheAsyncByInput": { - "uniqueName": "ClearCacheAsyncByInput", - "name": "ClearCacheAsync", - "httpMethod": "POST", - "url": "api/docs/admin/documents/ClearCache", - "supportedVersions": [], - "parametersOnMethod": [ - { - "name": "input", - "typeAsString": "Volo.Docs.Admin.Documents.ClearCacheInput, Volo.Docs.Admin.Application.Contracts", - "type": "Volo.Docs.Admin.Documents.ClearCacheInput", - "typeSimple": "Volo.Docs.Admin.Documents.ClearCacheInput", - "isOptional": false, - "defaultValue": null - } - ], - "parameters": [ - { - "nameOnMethod": "input", - "name": "input", - "jsonName": null, - "type": "Volo.Docs.Admin.Documents.ClearCacheInput", - "typeSimple": "Volo.Docs.Admin.Documents.ClearCacheInput", - "isOptional": false, - "defaultValue": null, - "constraintTypes": null, - "bindingSourceId": "Body", - "descriptorName": "" - } - ], - "returnValue": { - "type": "System.Void", - "typeSimple": "System.Void" - }, - "allowAnonymous": null, - "implementFrom": "Volo.Docs.Admin.Documents.IDocumentAdminAppService" - }, - "PullAllAsyncByInput": { - "uniqueName": "PullAllAsyncByInput", - "name": "PullAllAsync", - "httpMethod": "POST", - "url": "api/docs/admin/documents/PullAll", - "supportedVersions": [], - "parametersOnMethod": [ - { - "name": "input", - "typeAsString": "Volo.Docs.Admin.Documents.PullAllDocumentInput, Volo.Docs.Admin.Application.Contracts", - "type": "Volo.Docs.Admin.Documents.PullAllDocumentInput", - "typeSimple": "Volo.Docs.Admin.Documents.PullAllDocumentInput", - "isOptional": false, - "defaultValue": null - } - ], - "parameters": [ - { - "nameOnMethod": "input", - "name": "input", - "jsonName": null, - "type": "Volo.Docs.Admin.Documents.PullAllDocumentInput", - "typeSimple": "Volo.Docs.Admin.Documents.PullAllDocumentInput", - "isOptional": false, - "defaultValue": null, - "constraintTypes": null, - "bindingSourceId": "Body", - "descriptorName": "" - } - ], - "returnValue": { - "type": "System.Void", - "typeSimple": "System.Void" - }, - "allowAnonymous": null, - "implementFrom": "Volo.Docs.Admin.Documents.IDocumentAdminAppService" - }, - "PullAsyncByInput": { - "uniqueName": "PullAsyncByInput", - "name": "PullAsync", - "httpMethod": "POST", - "url": "api/docs/admin/documents/Pull", - "supportedVersions": [], - "parametersOnMethod": [ - { - "name": "input", - "typeAsString": "Volo.Docs.Admin.Documents.PullDocumentInput, Volo.Docs.Admin.Application.Contracts", - "type": "Volo.Docs.Admin.Documents.PullDocumentInput", - "typeSimple": "Volo.Docs.Admin.Documents.PullDocumentInput", - "isOptional": false, - "defaultValue": null - } - ], - "parameters": [ - { - "nameOnMethod": "input", - "name": "input", - "jsonName": null, - "type": "Volo.Docs.Admin.Documents.PullDocumentInput", - "typeSimple": "Volo.Docs.Admin.Documents.PullDocumentInput", - "isOptional": false, - "defaultValue": null, - "constraintTypes": null, - "bindingSourceId": "Body", - "descriptorName": "" - } - ], - "returnValue": { - "type": "System.Void", - "typeSimple": "System.Void" - }, - "allowAnonymous": null, - "implementFrom": "Volo.Docs.Admin.Documents.IDocumentAdminAppService" - }, - "GetAllAsyncByInput": { - "uniqueName": "GetAllAsyncByInput", - "name": "GetAllAsync", - "httpMethod": "GET", - "url": "api/docs/admin/documents/GetAll", - "supportedVersions": [], - "parametersOnMethod": [ - { - "name": "input", - "typeAsString": "Volo.Docs.Admin.Documents.GetAllInput, Volo.Docs.Admin.Application.Contracts", - "type": "Volo.Docs.Admin.Documents.GetAllInput", - "typeSimple": "Volo.Docs.Admin.Documents.GetAllInput", - "isOptional": false, - "defaultValue": null - } - ], - "parameters": [ - { - "nameOnMethod": "input", - "name": "ProjectId", - "jsonName": null, - "type": "System.Guid?", - "typeSimple": "string?", - "isOptional": false, - "defaultValue": null, - "constraintTypes": null, - "bindingSourceId": "ModelBinding", - "descriptorName": "input" - }, - { - "nameOnMethod": "input", - "name": "Name", - "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isOptional": false, - "defaultValue": null, - "constraintTypes": null, - "bindingSourceId": "ModelBinding", - "descriptorName": "input" - }, - { - "nameOnMethod": "input", - "name": "Version", - "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isOptional": false, - "defaultValue": null, - "constraintTypes": null, - "bindingSourceId": "ModelBinding", - "descriptorName": "input" - }, - { - "nameOnMethod": "input", - "name": "LanguageCode", - "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isOptional": false, - "defaultValue": null, - "constraintTypes": null, - "bindingSourceId": "ModelBinding", - "descriptorName": "input" - }, - { - "nameOnMethod": "input", - "name": "FileName", - "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isOptional": false, - "defaultValue": null, - "constraintTypes": null, - "bindingSourceId": "ModelBinding", - "descriptorName": "input" - }, - { - "nameOnMethod": "input", - "name": "Format", - "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isOptional": false, - "defaultValue": null, - "constraintTypes": null, - "bindingSourceId": "ModelBinding", - "descriptorName": "input" - }, - { - "nameOnMethod": "input", - "name": "CreationTimeMin", - "jsonName": null, - "type": "System.DateTime?", - "typeSimple": "string?", - "isOptional": false, - "defaultValue": null, - "constraintTypes": null, - "bindingSourceId": "ModelBinding", - "descriptorName": "input" - }, - { - "nameOnMethod": "input", - "name": "CreationTimeMax", - "jsonName": null, - "type": "System.DateTime?", - "typeSimple": "string?", - "isOptional": false, - "defaultValue": null, - "constraintTypes": null, - "bindingSourceId": "ModelBinding", - "descriptorName": "input" - }, - { - "nameOnMethod": "input", - "name": "LastUpdatedTimeMin", - "jsonName": null, - "type": "System.DateTime?", - "typeSimple": "string?", - "isOptional": false, - "defaultValue": null, - "constraintTypes": null, - "bindingSourceId": "ModelBinding", - "descriptorName": "input" - }, - { - "nameOnMethod": "input", - "name": "LastUpdatedTimeMax", - "jsonName": null, - "type": "System.DateTime?", - "typeSimple": "string?", - "isOptional": false, - "defaultValue": null, - "constraintTypes": null, - "bindingSourceId": "ModelBinding", - "descriptorName": "input" - }, - { - "nameOnMethod": "input", - "name": "LastSignificantUpdateTimeMin", - "jsonName": null, - "type": "System.DateTime?", - "typeSimple": "string?", - "isOptional": false, - "defaultValue": null, - "constraintTypes": null, - "bindingSourceId": "ModelBinding", - "descriptorName": "input" - }, - { - "nameOnMethod": "input", - "name": "LastSignificantUpdateTimeMax", - "jsonName": null, - "type": "System.DateTime?", - "typeSimple": "string?", - "isOptional": false, - "defaultValue": null, - "constraintTypes": null, - "bindingSourceId": "ModelBinding", - "descriptorName": "input" - }, - { - "nameOnMethod": "input", - "name": "LastCachedTimeMin", - "jsonName": null, - "type": "System.DateTime?", - "typeSimple": "string?", - "isOptional": false, - "defaultValue": null, - "constraintTypes": null, - "bindingSourceId": "ModelBinding", - "descriptorName": "input" - }, - { - "nameOnMethod": "input", - "name": "LastCachedTimeMax", - "jsonName": null, - "type": "System.DateTime?", - "typeSimple": "string?", - "isOptional": false, - "defaultValue": null, - "constraintTypes": null, - "bindingSourceId": "ModelBinding", - "descriptorName": "input" - }, - { - "nameOnMethod": "input", - "name": "Sorting", - "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isOptional": false, - "defaultValue": null, - "constraintTypes": null, - "bindingSourceId": "ModelBinding", - "descriptorName": "input" - }, - { - "nameOnMethod": "input", - "name": "SkipCount", - "jsonName": null, - "type": "System.Int32", - "typeSimple": "number", - "isOptional": false, - "defaultValue": null, - "constraintTypes": null, - "bindingSourceId": "ModelBinding", - "descriptorName": "input" - }, - { - "nameOnMethod": "input", - "name": "MaxResultCount", - "jsonName": null, - "type": "System.Int32", - "typeSimple": "number", - "isOptional": false, - "defaultValue": null, - "constraintTypes": null, - "bindingSourceId": "ModelBinding", - "descriptorName": "input" - } - ], - "returnValue": { - "type": "Volo.Abp.Application.Dtos.PagedResultDto", - "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto" - }, - "allowAnonymous": null, - "implementFrom": "Volo.Docs.Admin.Documents.IDocumentAdminAppService" - }, - "RemoveFromCacheAsyncByDocumentId": { - "uniqueName": "RemoveFromCacheAsyncByDocumentId", - "name": "RemoveFromCacheAsync", - "httpMethod": "PUT", - "url": "api/docs/admin/documents/RemoveDocumentFromCache", - "supportedVersions": [], - "parametersOnMethod": [ - { - "name": "documentId", - "typeAsString": "System.Guid, System.Private.CoreLib", - "type": "System.Guid", - "typeSimple": "string", - "isOptional": false, - "defaultValue": null - } - ], - "parameters": [ - { - "nameOnMethod": "documentId", - "name": "documentId", - "jsonName": null, - "type": "System.Guid", - "typeSimple": "string", - "isOptional": false, - "defaultValue": null, - "constraintTypes": null, - "bindingSourceId": "ModelBinding", - "descriptorName": "" - } - ], - "returnValue": { - "type": "System.Void", - "typeSimple": "System.Void" - }, - "allowAnonymous": null, - "implementFrom": "Volo.Docs.Admin.Documents.IDocumentAdminAppService" - }, - "ReindexAsyncByDocumentId": { - "uniqueName": "ReindexAsyncByDocumentId", - "name": "ReindexAsync", - "httpMethod": "PUT", - "url": "api/docs/admin/documents/ReindexDocument", - "supportedVersions": [], - "parametersOnMethod": [ - { - "name": "documentId", - "typeAsString": "System.Guid, System.Private.CoreLib", - "type": "System.Guid", - "typeSimple": "string", - "isOptional": false, - "defaultValue": null - } - ], - "parameters": [ - { - "nameOnMethod": "documentId", - "name": "documentId", - "jsonName": null, - "type": "System.Guid", - "typeSimple": "string", - "isOptional": false, - "defaultValue": null, - "constraintTypes": null, - "bindingSourceId": "ModelBinding", - "descriptorName": "" - } - ], - "returnValue": { - "type": "System.Void", - "typeSimple": "System.Void" - }, - "allowAnonymous": null, - "implementFrom": "Volo.Docs.Admin.Documents.IDocumentAdminAppService" - }, - "GetFilterItemsAsync": { - "uniqueName": "GetFilterItemsAsync", - "name": "GetFilterItemsAsync", - "httpMethod": "GET", - "url": "api/docs/admin/documents/GetFilterItems", - "supportedVersions": [], - "parametersOnMethod": [], - "parameters": [], - "returnValue": { - "type": "System.Collections.Generic.List", - "typeSimple": "[Volo.Docs.Admin.Documents.DocumentInfoDto]" - }, - "allowAnonymous": null, - "implementFrom": "Volo.Docs.Admin.Documents.IDocumentAdminAppService" - }, - "GetProjectsAsync": { - "uniqueName": "GetProjectsAsync", - "name": "GetProjectsAsync", - "httpMethod": "GET", - "url": "api/docs/admin/documents/GetProjects", - "supportedVersions": [], - "parametersOnMethod": [], - "parameters": [], - "returnValue": { - "type": "System.Collections.Generic.List", - "typeSimple": "[Volo.Docs.Admin.Projects.ProjectWithoutDetailsDto]" - }, - "allowAnonymous": null, - "implementFrom": "Volo.Docs.Admin.Documents.IDocumentAdminAppService" - } - } - }, - "Volo.Docs.Admin.ProjectsAdminController": { - "controllerName": "ProjectsAdmin", - "controllerGroupName": "ProjectsAdmin", - "isRemoteService": true, - "isIntegrationService": false, - "apiVersion": null, - "type": "Volo.Docs.Admin.ProjectsAdminController", - "interfaces": [ - { - "type": "Volo.Docs.Admin.Projects.IProjectAdminAppService", - "name": "IProjectAdminAppService", - "methods": [ - { - "name": "GetListAsync", - "parametersOnMethod": [ - { - "name": "input", - "typeAsString": "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto, Volo.Abp.Ddd.Application.Contracts", - "type": "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto", - "typeSimple": "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto", - "isOptional": false, - "defaultValue": null - } - ], - "returnValue": { - "type": "Volo.Abp.Application.Dtos.PagedResultDto", - "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto" - } - }, - { - "name": "GetAsync", - "parametersOnMethod": [ - { - "name": "id", - "typeAsString": "System.Guid, System.Private.CoreLib", - "type": "System.Guid", - "typeSimple": "string", - "isOptional": false, - "defaultValue": null - } - ], - "returnValue": { - "type": "Volo.Docs.Admin.Projects.ProjectDto", - "typeSimple": "Volo.Docs.Admin.Projects.ProjectDto" - } - }, - { - "name": "CreateAsync", - "parametersOnMethod": [ - { - "name": "input", - "typeAsString": "Volo.Docs.Admin.Projects.CreateProjectDto, Volo.Docs.Admin.Application.Contracts", - "type": "Volo.Docs.Admin.Projects.CreateProjectDto", - "typeSimple": "Volo.Docs.Admin.Projects.CreateProjectDto", - "isOptional": false, - "defaultValue": null - } - ], - "returnValue": { - "type": "Volo.Docs.Admin.Projects.ProjectDto", - "typeSimple": "Volo.Docs.Admin.Projects.ProjectDto" - } - }, - { - "name": "UpdateAsync", - "parametersOnMethod": [ - { - "name": "id", - "typeAsString": "System.Guid, System.Private.CoreLib", - "type": "System.Guid", - "typeSimple": "string", - "isOptional": false, - "defaultValue": null - }, - { - "name": "input", - "typeAsString": "Volo.Docs.Admin.Projects.UpdateProjectDto, Volo.Docs.Admin.Application.Contracts", - "type": "Volo.Docs.Admin.Projects.UpdateProjectDto", - "typeSimple": "Volo.Docs.Admin.Projects.UpdateProjectDto", - "isOptional": false, - "defaultValue": null - } - ], - "returnValue": { - "type": "Volo.Docs.Admin.Projects.ProjectDto", - "typeSimple": "Volo.Docs.Admin.Projects.ProjectDto" - } - }, - { - "name": "DeleteAsync", - "parametersOnMethod": [ - { - "name": "id", - "typeAsString": "System.Guid, System.Private.CoreLib", - "type": "System.Guid", - "typeSimple": "string", - "isOptional": false, - "defaultValue": null - } - ], - "returnValue": { - "type": "System.Void", - "typeSimple": "System.Void" - } - }, - { - "name": "ReindexAsync", - "parametersOnMethod": [ - { - "name": "input", - "typeAsString": "Volo.Docs.Admin.Projects.ReindexInput, Volo.Docs.Admin.Application.Contracts", - "type": "Volo.Docs.Admin.Projects.ReindexInput", - "typeSimple": "Volo.Docs.Admin.Projects.ReindexInput", - "isOptional": false, - "defaultValue": null - } - ], - "returnValue": { - "type": "System.Void", - "typeSimple": "System.Void" - } - }, - { - "name": "ReindexAllAsync", - "parametersOnMethod": [], - "returnValue": { - "type": "System.Void", - "typeSimple": "System.Void" - } - }, - { - "name": "GetListWithoutDetailsAsync", - "parametersOnMethod": [], - "returnValue": { - "type": "System.Collections.Generic.List", - "typeSimple": "[Volo.Docs.Admin.Projects.ProjectWithoutDetailsDto]" - } - }, - { - "name": "GetPdfFilesAsync", - "parametersOnMethod": [ - { - "name": "input", - "typeAsString": "Volo.Docs.Admin.Projects.GetPdfFilesInput, Volo.Docs.Admin.Application.Contracts", - "type": "Volo.Docs.Admin.Projects.GetPdfFilesInput", - "typeSimple": "Volo.Docs.Admin.Projects.GetPdfFilesInput", - "isOptional": false, - "defaultValue": null - } - ], - "returnValue": { - "type": "Volo.Abp.Application.Dtos.PagedResultDto", - "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto" - } - }, - { - "name": "DeletePdfFileAsync", - "parametersOnMethod": [ - { - "name": "input", - "typeAsString": "Volo.Docs.Admin.Projects.DeletePdfFileInput, Volo.Docs.Admin.Application.Contracts", - "type": "Volo.Docs.Admin.Projects.DeletePdfFileInput", - "typeSimple": "Volo.Docs.Admin.Projects.DeletePdfFileInput", - "isOptional": false, - "defaultValue": null - } - ], - "returnValue": { - "type": "System.Void", - "typeSimple": "System.Void" - } - } - ] - } - ], - "actions": { - "GetListAsyncByInput": { - "uniqueName": "GetListAsyncByInput", - "name": "GetListAsync", - "httpMethod": "GET", - "url": "api/docs/admin/projects", - "supportedVersions": [], - "parametersOnMethod": [ - { - "name": "input", - "typeAsString": "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto, Volo.Abp.Ddd.Application.Contracts", - "type": "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto", - "typeSimple": "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto", - "isOptional": false, - "defaultValue": null - } - ], - "parameters": [ - { - "nameOnMethod": "input", - "name": "Sorting", - "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isOptional": false, - "defaultValue": null, - "constraintTypes": null, - "bindingSourceId": "ModelBinding", - "descriptorName": "input" - }, - { - "nameOnMethod": "input", - "name": "SkipCount", - "jsonName": null, - "type": "System.Int32", - "typeSimple": "number", - "isOptional": false, - "defaultValue": null, - "constraintTypes": null, - "bindingSourceId": "ModelBinding", - "descriptorName": "input" - }, - { - "nameOnMethod": "input", - "name": "MaxResultCount", - "jsonName": null, - "type": "System.Int32", - "typeSimple": "number", - "isOptional": false, - "defaultValue": null, - "constraintTypes": null, - "bindingSourceId": "ModelBinding", - "descriptorName": "input" - } - ], - "returnValue": { - "type": "Volo.Abp.Application.Dtos.PagedResultDto", - "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto" - }, - "allowAnonymous": null, - "implementFrom": "Volo.Docs.Admin.Projects.IProjectAdminAppService" - }, - "GetAsyncById": { - "uniqueName": "GetAsyncById", - "name": "GetAsync", - "httpMethod": "GET", - "url": "api/docs/admin/projects/{id}", - "supportedVersions": [], - "parametersOnMethod": [ - { - "name": "id", - "typeAsString": "System.Guid, System.Private.CoreLib", - "type": "System.Guid", - "typeSimple": "string", - "isOptional": false, - "defaultValue": null - } - ], - "parameters": [ - { - "nameOnMethod": "id", - "name": "id", - "jsonName": null, - "type": "System.Guid", - "typeSimple": "string", - "isOptional": false, - "defaultValue": null, - "constraintTypes": [], - "bindingSourceId": "Path", - "descriptorName": "" - } - ], - "returnValue": { - "type": "Volo.Docs.Admin.Projects.ProjectDto", - "typeSimple": "Volo.Docs.Admin.Projects.ProjectDto" - }, - "allowAnonymous": null, - "implementFrom": "Volo.Docs.Admin.Projects.IProjectAdminAppService" - }, - "CreateAsyncByInput": { - "uniqueName": "CreateAsyncByInput", - "name": "CreateAsync", - "httpMethod": "POST", - "url": "api/docs/admin/projects", - "supportedVersions": [], - "parametersOnMethod": [ - { - "name": "input", - "typeAsString": "Volo.Docs.Admin.Projects.CreateProjectDto, Volo.Docs.Admin.Application.Contracts", - "type": "Volo.Docs.Admin.Projects.CreateProjectDto", - "typeSimple": "Volo.Docs.Admin.Projects.CreateProjectDto", - "isOptional": false, - "defaultValue": null - } - ], - "parameters": [ - { - "nameOnMethod": "input", - "name": "input", - "jsonName": null, - "type": "Volo.Docs.Admin.Projects.CreateProjectDto", - "typeSimple": "Volo.Docs.Admin.Projects.CreateProjectDto", - "isOptional": false, - "defaultValue": null, - "constraintTypes": null, - "bindingSourceId": "Body", - "descriptorName": "" - } - ], - "returnValue": { - "type": "Volo.Docs.Admin.Projects.ProjectDto", - "typeSimple": "Volo.Docs.Admin.Projects.ProjectDto" - }, - "allowAnonymous": null, - "implementFrom": "Volo.Docs.Admin.Projects.IProjectAdminAppService" - }, - "UpdateAsyncByIdAndInput": { - "uniqueName": "UpdateAsyncByIdAndInput", - "name": "UpdateAsync", - "httpMethod": "PUT", - "url": "api/docs/admin/projects/{id}", - "supportedVersions": [], - "parametersOnMethod": [ - { - "name": "id", - "typeAsString": "System.Guid, System.Private.CoreLib", - "type": "System.Guid", - "typeSimple": "string", - "isOptional": false, - "defaultValue": null - }, - { - "name": "input", - "typeAsString": "Volo.Docs.Admin.Projects.UpdateProjectDto, Volo.Docs.Admin.Application.Contracts", - "type": "Volo.Docs.Admin.Projects.UpdateProjectDto", - "typeSimple": "Volo.Docs.Admin.Projects.UpdateProjectDto", - "isOptional": false, - "defaultValue": null - } - ], - "parameters": [ - { - "nameOnMethod": "id", - "name": "id", - "jsonName": null, - "type": "System.Guid", - "typeSimple": "string", - "isOptional": false, - "defaultValue": null, - "constraintTypes": [], - "bindingSourceId": "Path", - "descriptorName": "" - }, - { - "nameOnMethod": "input", - "name": "input", - "jsonName": null, - "type": "Volo.Docs.Admin.Projects.UpdateProjectDto", - "typeSimple": "Volo.Docs.Admin.Projects.UpdateProjectDto", - "isOptional": false, - "defaultValue": null, - "constraintTypes": null, - "bindingSourceId": "Body", - "descriptorName": "" - } - ], - "returnValue": { - "type": "Volo.Docs.Admin.Projects.ProjectDto", - "typeSimple": "Volo.Docs.Admin.Projects.ProjectDto" - }, - "allowAnonymous": null, - "implementFrom": "Volo.Docs.Admin.Projects.IProjectAdminAppService" - }, - "DeleteAsyncById": { - "uniqueName": "DeleteAsyncById", - "name": "DeleteAsync", - "httpMethod": "DELETE", - "url": "api/docs/admin/projects", - "supportedVersions": [], - "parametersOnMethod": [ - { - "name": "id", - "typeAsString": "System.Guid, System.Private.CoreLib", - "type": "System.Guid", - "typeSimple": "string", - "isOptional": false, - "defaultValue": null - } - ], - "parameters": [ - { - "nameOnMethod": "id", - "name": "id", - "jsonName": null, - "type": "System.Guid", - "typeSimple": "string", - "isOptional": false, - "defaultValue": null, - "constraintTypes": null, - "bindingSourceId": "ModelBinding", - "descriptorName": "" - } - ], - "returnValue": { - "type": "System.Void", - "typeSimple": "System.Void" - }, - "allowAnonymous": null, - "implementFrom": "Volo.Docs.Admin.Projects.IProjectAdminAppService" - }, - "ReindexAllAsync": { - "uniqueName": "ReindexAllAsync", - "name": "ReindexAllAsync", - "httpMethod": "POST", - "url": "api/docs/admin/projects/ReindexAll", - "supportedVersions": [], - "parametersOnMethod": [], - "parameters": [], - "returnValue": { - "type": "System.Void", - "typeSimple": "System.Void" - }, - "allowAnonymous": null, - "implementFrom": "Volo.Docs.Admin.Projects.IProjectAdminAppService" - }, - "GetListWithoutDetailsAsync": { - "uniqueName": "GetListWithoutDetailsAsync", - "name": "GetListWithoutDetailsAsync", - "httpMethod": "GET", - "url": "api/docs/admin/projects/GetListProjectWithoutDetailsAsync", - "supportedVersions": [], - "parametersOnMethod": [], - "parameters": [], - "returnValue": { - "type": "System.Collections.Generic.List", - "typeSimple": "[Volo.Docs.Admin.Projects.ProjectWithoutDetailsDto]" - }, - "allowAnonymous": null, - "implementFrom": "Volo.Docs.Admin.Projects.IProjectAdminAppService" - }, - "GetPdfFilesAsyncByInput": { - "uniqueName": "GetPdfFilesAsyncByInput", - "name": "GetPdfFilesAsync", - "httpMethod": "GET", - "url": "api/docs/admin/projects/PdfFiles", - "supportedVersions": [], - "parametersOnMethod": [ - { - "name": "input", - "typeAsString": "Volo.Docs.Admin.Projects.GetPdfFilesInput, Volo.Docs.Admin.Application.Contracts", - "type": "Volo.Docs.Admin.Projects.GetPdfFilesInput", - "typeSimple": "Volo.Docs.Admin.Projects.GetPdfFilesInput", - "isOptional": false, - "defaultValue": null - } - ], - "parameters": [ - { - "nameOnMethod": "input", - "name": "ProjectId", - "jsonName": null, - "type": "System.Guid", - "typeSimple": "string", - "isOptional": false, - "defaultValue": null, - "constraintTypes": null, - "bindingSourceId": "ModelBinding", - "descriptorName": "input" - }, - { - "nameOnMethod": "input", - "name": "Sorting", - "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isOptional": false, - "defaultValue": null, - "constraintTypes": null, - "bindingSourceId": "ModelBinding", - "descriptorName": "input" - }, - { - "nameOnMethod": "input", - "name": "SkipCount", - "jsonName": null, - "type": "System.Int32", - "typeSimple": "number", - "isOptional": false, - "defaultValue": null, - "constraintTypes": null, - "bindingSourceId": "ModelBinding", - "descriptorName": "input" - }, - { - "nameOnMethod": "input", - "name": "MaxResultCount", - "jsonName": null, - "type": "System.Int32", - "typeSimple": "number", - "isOptional": false, - "defaultValue": null, - "constraintTypes": null, - "bindingSourceId": "ModelBinding", - "descriptorName": "input" - } - ], - "returnValue": { - "type": "Volo.Abp.Application.Dtos.PagedResultDto", - "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto" - }, - "allowAnonymous": null, - "implementFrom": "Volo.Docs.Admin.Projects.IProjectAdminAppService" - }, - "DeletePdfFileAsyncByInput": { - "uniqueName": "DeletePdfFileAsyncByInput", - "name": "DeletePdfFileAsync", - "httpMethod": "DELETE", - "url": "api/docs/admin/projects/DeletePdfFile", - "supportedVersions": [], - "parametersOnMethod": [ - { - "name": "input", - "typeAsString": "Volo.Docs.Admin.Projects.DeletePdfFileInput, Volo.Docs.Admin.Application.Contracts", - "type": "Volo.Docs.Admin.Projects.DeletePdfFileInput", - "typeSimple": "Volo.Docs.Admin.Projects.DeletePdfFileInput", - "isOptional": false, - "defaultValue": null - } - ], - "parameters": [ - { - "nameOnMethod": "input", - "name": "ProjectId", - "jsonName": null, - "type": "System.Guid", - "typeSimple": "string", - "isOptional": false, - "defaultValue": null, - "constraintTypes": null, - "bindingSourceId": "ModelBinding", - "descriptorName": "input" - }, - { - "nameOnMethod": "input", - "name": "Version", - "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isOptional": false, - "defaultValue": null, - "constraintTypes": null, - "bindingSourceId": "ModelBinding", - "descriptorName": "input" - }, - { - "nameOnMethod": "input", - "name": "LanguageCode", - "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isOptional": false, - "defaultValue": null, - "constraintTypes": null, - "bindingSourceId": "ModelBinding", - "descriptorName": "input" - } - ], - "returnValue": { - "type": "System.Void", - "typeSimple": "System.Void" - }, - "allowAnonymous": null, - "implementFrom": "Volo.Docs.Admin.Projects.IProjectAdminAppService" - }, - "ReindexAsyncByInput": { - "uniqueName": "ReindexAsyncByInput", - "name": "ReindexAsync", - "httpMethod": "POST", - "url": "api/docs/admin/projects/Reindex", - "supportedVersions": [], - "parametersOnMethod": [ - { - "name": "input", - "typeAsString": "Volo.Docs.Admin.Projects.ReindexInput, Volo.Docs.Admin.Application.Contracts", - "type": "Volo.Docs.Admin.Projects.ReindexInput", - "typeSimple": "Volo.Docs.Admin.Projects.ReindexInput", - "isOptional": false, - "defaultValue": null - } - ], - "parameters": [ - { - "nameOnMethod": "input", - "name": "input", - "jsonName": null, - "type": "Volo.Docs.Admin.Projects.ReindexInput", - "typeSimple": "Volo.Docs.Admin.Projects.ReindexInput", - "isOptional": false, - "defaultValue": null, - "constraintTypes": null, - "bindingSourceId": "Body", - "descriptorName": "" - } - ], - "returnValue": { - "type": "System.Void", - "typeSimple": "System.Void" - }, - "allowAnonymous": null, - "implementFrom": "Volo.Docs.Admin.Projects.IProjectAdminAppService" - } - } - } - } - } - }, - "types": {} -} \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.HttpApi/Volo/Docs/Admin/DocumentPdfAdminController.cs b/modules/docs/src/Volo.Docs.Admin.HttpApi/Volo/Docs/Admin/DocumentPdfAdminController.cs new file mode 100644 index 0000000000..4cc49efc79 --- /dev/null +++ b/modules/docs/src/Volo.Docs.Admin.HttpApi/Volo/Docs/Admin/DocumentPdfAdminController.cs @@ -0,0 +1,60 @@ +using System.Threading.Tasks; +using Asp.Versioning; +using Microsoft.AspNetCore.Mvc; +using Volo.Abp; +using Volo.Abp.Application.Dtos; +using Volo.Abp.AspNetCore.Mvc; +using Volo.Abp.Content; +using Volo.Docs.Admin.Documents; +using Volo.Docs.Admin.Projects; +using Volo.Docs.Common.Documents; + +namespace Volo.Docs.Admin; +[RemoteService(Name = DocsAdminRemoteServiceConsts.RemoteServiceName)] +[Area(DocsAdminRemoteServiceConsts.ModuleName)] +[ControllerName("DocumentsPdfAdmin")] +[Route("api/docs/admin/documents/pdf")] +public class DocumentPdfAdminController : AbpControllerBase, IDocumentPdfAdminAppService +{ + private readonly IDocumentPdfAdminAppService _documentPdfAdminAppService; + + public DocumentPdfAdminController(IDocumentPdfAdminAppService documentPdfAdminAppService) + { + _documentPdfAdminAppService = documentPdfAdminAppService; + } + + [HttpGet] + [Route("generate")] + public Task GeneratePdfAsync(DocumentPdfGeneratorInput input) + { + return _documentPdfAdminAppService.GeneratePdfAsync(input); + } + + [HttpGet] + [Route("files")] + public Task> GetPdfFilesAsync(GetPdfFilesInput input) + { + return _documentPdfAdminAppService.GetPdfFilesAsync(input); + } + + [HttpDelete] + [Route("delete-file")] + public Task DeletePdfFileAsync(DeletePdfFileInput input) + { + return _documentPdfAdminAppService.DeletePdfFileAsync(input); + } + + [HttpGet] + [Route("download")] + public Task DownloadPdfAsync(DocumentPdfGeneratorInput input) + { + return _documentPdfAdminAppService.DownloadPdfAsync(input); + } + + [HttpGet] + [Route("exists")] + public Task ExistsAsync(DocumentPdfGeneratorInput input) + { + return _documentPdfAdminAppService.ExistsAsync(input); + } +} \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.HttpApi/Volo/Docs/Admin/ProjectsAdminController.cs b/modules/docs/src/Volo.Docs.Admin.HttpApi/Volo/Docs/Admin/ProjectsAdminController.cs index e020486887..5b1cffeae1 100644 --- a/modules/docs/src/Volo.Docs.Admin.HttpApi/Volo/Docs/Admin/ProjectsAdminController.cs +++ b/modules/docs/src/Volo.Docs.Admin.HttpApi/Volo/Docs/Admin/ProjectsAdminController.cs @@ -70,20 +70,6 @@ namespace Volo.Docs.Admin return _projectAppService.GetListWithoutDetailsAsync(); } - [HttpGet] - [Route("PdfFiles")] - public Task> GetPdfFilesAsync(GetPdfFilesInput input) - { - return _projectAppService.GetPdfFilesAsync(input); - } - - [HttpDelete] - [Route("DeletePdfFile")] - public Task DeletePdfFileAsync(DeletePdfFileInput input) - { - return _projectAppService.DeletePdfFileAsync(input); - } - [HttpPost] [Route("Reindex")] public Task ReindexAsync(ReindexInput input) diff --git a/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Projects/GeneratePdf.cshtml b/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Projects/GeneratePdf.cshtml index b8ad9742d8..64cb3d3b01 100644 --- a/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Projects/GeneratePdf.cshtml +++ b/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Projects/GeneratePdf.cshtml @@ -8,40 +8,34 @@ @{ Layout = null; } - - - - - - -
- - -
-
- - -
-
- -
-
- - - - - -
\ No newline at end of file +
+ + + + + +
+ + +
+
+ + +
+
+ + + + +
+
\ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Projects/GeneratePdf.cshtml.cs b/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Projects/GeneratePdf.cshtml.cs index 231f7c56eb..3396f3335c 100644 --- a/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Projects/GeneratePdf.cshtml.cs +++ b/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Projects/GeneratePdf.cshtml.cs @@ -4,6 +4,7 @@ using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Rendering; +using Volo.Docs.Admin.Documents; using Volo.Docs.Admin.Projects; using Volo.Docs.Common.Documents; using Volo.Docs.Common.Projects; @@ -15,20 +16,32 @@ public class GeneratePdfModal : DocsAdminPageModel { protected IProjectAppService ProjectAppService { get; } protected IProjectAdminAppService ProjectAdminAppService { get; } + protected IDocumentPdfAdminAppService DocumentPdfAdminAppService { get; } public GeneratePdfViewModel ViewModel { get; set; } + + [BindProperty(SupportsGet = true)] + public Guid ProjectId { get; set; } + + [BindProperty(SupportsGet = true)] + public string Version { get; set; } + + [BindProperty(SupportsGet = true)] + public string Language { get; set; } public GeneratePdfModal( IProjectAppService projectAppService, - IProjectAdminAppService projectAdminAppService) + IProjectAdminAppService projectAdminAppService, + IDocumentPdfAdminAppService documentPdfAdminAppService) { ProjectAppService = projectAppService; ProjectAdminAppService = projectAdminAppService; + DocumentPdfAdminAppService = documentPdfAdminAppService; } - public virtual async Task OnGetAsync(Guid id) + public virtual async Task OnGetAsync() { - var project = await ProjectAdminAppService.GetAsync(id); + var project = await ProjectAdminAppService.GetAsync(ProjectId); var versions = await ProjectAppService.GetVersionsAsync(project.ShortName); if(versions.Items.Count == 0) { @@ -40,7 +53,6 @@ public class GeneratePdfModal : DocsAdminPageModel var languages = await ProjectAppService.GetLanguageListAsync(project.ShortName, versions.Items.FirstOrDefault()?.Name); ViewModel = new GeneratePdfViewModel { - ProjectId = id, ShortName = project.ShortName, Versions = versions.Items.Select(x => new SelectListItem(x.DisplayName, x.Name)).ToList(), Languages = languages.Languages.Select(x => new SelectListItem(x.DisplayName, x.Code)).ToList() @@ -49,9 +61,20 @@ public class GeneratePdfModal : DocsAdminPageModel return Page(); } + public virtual async Task OnPostAsync() + { + await DocumentPdfAdminAppService.GeneratePdfAsync(new DocumentPdfGeneratorInput + { + ProjectId = ProjectId, + Version = Version, + LanguageCode = Language + }); + + return NoContent(); + } + public class GeneratePdfViewModel { - public Guid ProjectId { get; set; } public string ShortName { get; set; } public List Versions { get; set; } public List Languages { get; set; } diff --git a/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Projects/ManagePdfFiles.cshtml b/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Projects/ManagePdfFiles.cshtml index e4d9ecda72..895f876fe5 100644 --- a/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Projects/ManagePdfFiles.cshtml +++ b/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Projects/ManagePdfFiles.cshtml @@ -36,6 +36,6 @@ - + \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Projects/generatePdf.js b/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Projects/generatePdf.js index 91015b1584..42883088b8 100644 --- a/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Projects/generatePdf.js +++ b/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Projects/generatePdf.js @@ -4,8 +4,6 @@ $(function () { var l = abp.localization.getResource('Docs'); var projectAppService = volo.docs.projects.docsProject; - var pdfGeneratorAppService = volo.docs.documents.docsDocumentPdfGenerator; - var projectAdminAppService = volo.docs.admin.projectsAdmin; var initModal = function (publicApi, args) { @@ -22,58 +20,6 @@ $(function () { }); }) - $("#GenerateBtn").click(function () { - var $btn = $(this); - $btn.buttonBusy(true); - $("#GenerateAndDownloadPdfBtn").buttonBusy(true); - var input = { - projectId: $("#ProjectId").val(), - version: $("#Version").val(), - languageCode: $("#Language").val(), - } - - function generatePdf(input) { - pdfGeneratorAppService.generatePdf(input, { - abpHandleError : false, - error: function (jqXHR) { - if (jqXHR.status === 200) { - abp.message.success(l('PdfFileGeneratedSuccessfully')); - $btn.buttonBusy(false); - $("#GenerateAndDownloadPdfBtn").buttonBusy(false); - } else { - abp.ajax.handleErrorStatusCode(jqXHR.status); - } - } - }); - } - if(shouldForceToGenerate(input)){ - projectAdminAppService.deletePdfFile(input).done(() =>{ - generatePdf(input); - }); - }else{ - generatePdf(input); - } - }) - - $("#GenerateAndDownloadPdfBtn").click(function () { - var input = { - projectId: $("#ProjectId").val(), - version: $("#Version").val(), - languageCode: $("#Language").val(), - } - if(shouldForceToGenerate(input)){ - projectAdminAppService.deletePdfFile(input).done(() =>{ - window.open(abp.appPath + 'api/docs/documents/pdf' + abp.utils.buildQueryString([{ name: 'projectId', value: input.projectId }, { name: 'version', value: input.version }, { name: 'languageCode', value: input.languageCode }]), '_blank'); - }); - }else{ - window.open(abp.appPath + 'api/docs/documents/pdf' + abp.utils.buildQueryString([{ name: 'projectId', value: input.projectId }, { name: 'version', value: input.version }, { name: 'languageCode', value: input.languageCode }]), '_blank'); - } - }) - - function shouldForceToGenerate(input) { - return $("#ForceToGenerate").is(":checked"); - } - return { initModal: initModal, }; diff --git a/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Projects/managePdfFiles.js b/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Projects/managePdfFiles.js index 8481867f46..de71403878 100644 --- a/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Projects/managePdfFiles.js +++ b/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Projects/managePdfFiles.js @@ -3,7 +3,7 @@ $(function () { abp.modals.projectManagePdfFiles = function () { var l = abp.localization.getResource('Docs'); - var projectAdminAppService = volo.docs.admin.projectsAdmin; + var documentPdfAdminAppService = volo.docs.admin.documentPdfAdmin; var _generatePdfModal = new abp.ModalManager({ viewUrl: abp.appPath + 'Docs/Admin/Projects/GeneratePdf', @@ -22,7 +22,7 @@ $(function () { scrollCollapse: true, order: [[2, 'desc']], ajax: abp.libs.datatables.createAjax( - volo.docs.admin.projectsAdmin.getPdfFiles, + documentPdfAdminAppService.getPdfFiles, { projectId : args.projectId } @@ -37,16 +37,23 @@ $(function () { return l('PdfFileDeletionWarningMessage', data.record.fileName); }, action: function (data) { - projectAdminAppService.deletePdfFile({ + documentPdfAdminAppService.deletePdfFile({ projectId: data.record.projectId, version: data.record.version, languageCode: data.record.languageCode }).then(() => { _dataTable.ajax.reloadEx(); - abp.notify.success(l('PdfGeneratedSuccessfully')); + abp.notify.success(l('PdfDeletedSuccessfully')); }) }, - } + }, + { + text: l('Download'), + action: function (data) { + var url = abp.appPath + 'api/docs/admin/documents/pdf/download?projectId=' + data.record.projectId + '&version=' + data.record.version + '&languageCode=' + data.record.languageCode; + window.open(url, '_blank'); + }, + }, ], }, }, @@ -78,13 +85,17 @@ $(function () { $('#GeneratePdfBtn').click(function () { _generatePdfModal.open({ - Id: args.projectId, + ProjectId: args.projectId, }); }); _generatePdfModal.onClose(function () { _dataTable.ajax.reloadEx(); }); + + _generatePdfModal.onResult(function (){ + abp.message.info(l('PdfGenerationStartedInfoMessage')); + }); }; return { diff --git a/modules/docs/src/Volo.Docs.Admin.Web/Volo.Docs.Admin.Web.abppkg b/modules/docs/src/Volo.Docs.Admin.Web/Volo.Docs.Admin.Web.abppkg index 4e12d28da1..1c2d273971 100644 --- a/modules/docs/src/Volo.Docs.Admin.Web/Volo.Docs.Admin.Web.abppkg +++ b/modules/docs/src/Volo.Docs.Admin.Web/Volo.Docs.Admin.Web.abppkg @@ -6,7 +6,7 @@ "applicationName": "VoloDocs.Web", "module": "docs-admin", "url": "https://localhost:5001", - "output": "wwwroot/client-proxies", + "output": "wwwroot/client-proxies/", "serviceType": "application" } } diff --git a/modules/docs/src/Volo.Docs.Admin.Web/wwwroot/client-proxies/docs-admin-proxy.js b/modules/docs/src/Volo.Docs.Admin.Web/wwwroot/client-proxies/docs-admin-proxy.js index a1e2aafaca..2551021a80 100644 --- a/modules/docs/src/Volo.Docs.Admin.Web/wwwroot/client-proxies/docs-admin-proxy.js +++ b/modules/docs/src/Volo.Docs.Admin.Web/wwwroot/client-proxies/docs-admin-proxy.js @@ -5,6 +5,51 @@ (function(){ + // controller volo.docs.admin.documentPdfAdmin + + (function(){ + + abp.utils.createNamespace(window, 'volo.docs.admin.documentPdfAdmin'); + + volo.docs.admin.documentPdfAdmin.generatePdf = function(input, ajaxParams) { + return abp.ajax($.extend(true, { + url: abp.appPath + 'api/docs/admin/documents/pdf/generate' + abp.utils.buildQueryString([{ name: 'projectId', value: input.projectId }, { name: 'version', value: input.version }, { name: 'languageCode', value: input.languageCode }]) + '', + type: 'GET', + dataType: null + }, ajaxParams)); + }; + + volo.docs.admin.documentPdfAdmin.getPdfFiles = function(input, ajaxParams) { + return abp.ajax($.extend(true, { + url: abp.appPath + 'api/docs/admin/documents/pdf/files' + abp.utils.buildQueryString([{ name: 'projectId', value: input.projectId }, { name: 'sorting', value: input.sorting }, { name: 'skipCount', value: input.skipCount }, { name: 'maxResultCount', value: input.maxResultCount }]) + '', + type: 'GET' + }, ajaxParams)); + }; + + volo.docs.admin.documentPdfAdmin.deletePdfFile = function(input, ajaxParams) { + return abp.ajax($.extend(true, { + url: abp.appPath + 'api/docs/admin/documents/pdf/delete-file' + abp.utils.buildQueryString([{ name: 'projectId', value: input.projectId }, { name: 'version', value: input.version }, { name: 'languageCode', value: input.languageCode }]) + '', + type: 'DELETE', + dataType: null + }, ajaxParams)); + }; + + volo.docs.admin.documentPdfAdmin.downloadPdf = function(input, ajaxParams) { + return abp.ajax($.extend(true, { + url: abp.appPath + 'api/docs/admin/documents/pdf/download' + abp.utils.buildQueryString([{ name: 'projectId', value: input.projectId }, { name: 'version', value: input.version }, { name: 'languageCode', value: input.languageCode }]) + '', + type: 'GET' + }, ajaxParams)); + }; + + volo.docs.admin.documentPdfAdmin.exists = function(input, ajaxParams) { + return abp.ajax($.extend(true, { + url: abp.appPath + 'api/docs/admin/documents/pdf/exists' + abp.utils.buildQueryString([{ name: 'projectId', value: input.projectId }, { name: 'version', value: input.version }, { name: 'languageCode', value: input.languageCode }]) + '', + type: 'GET' + }, ajaxParams)); + }; + + })(); + // controller volo.docs.admin.documentsAdmin (function(){ @@ -136,21 +181,6 @@ }, ajaxParams)); }; - volo.docs.admin.projectsAdmin.getPdfFiles = function(input, ajaxParams) { - return abp.ajax($.extend(true, { - url: abp.appPath + 'api/docs/admin/projects/PdfFiles' + abp.utils.buildQueryString([{ name: 'projectId', value: input.projectId }, { name: 'sorting', value: input.sorting }, { name: 'skipCount', value: input.skipCount }, { name: 'maxResultCount', value: input.maxResultCount }]) + '', - type: 'GET' - }, ajaxParams)); - }; - - volo.docs.admin.projectsAdmin.deletePdfFile = function(input, ajaxParams) { - return abp.ajax($.extend(true, { - url: abp.appPath + 'api/docs/admin/projects/DeletePdfFile' + abp.utils.buildQueryString([{ name: 'projectId', value: input.projectId }, { name: 'version', value: input.version }, { name: 'languageCode', value: input.languageCode }]) + '', - type: 'DELETE', - dataType: null - }, ajaxParams)); - }; - volo.docs.admin.projectsAdmin.reindex = function(input, ajaxParams) { return abp.ajax($.extend(true, { url: abp.appPath + 'api/docs/admin/projects/Reindex', diff --git a/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo.Docs.Common.Application.Contracts.abppkg b/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo.Docs.Common.Application.Contracts.abppkg new file mode 100644 index 0000000000..5ae23d89fc --- /dev/null +++ b/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo.Docs.Common.Application.Contracts.abppkg @@ -0,0 +1,3 @@ +{ + "role": "Volo.Docs.Application.Contracts" +} \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/DocsCommonPermissionDefinitionProvider.cs b/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/DocsCommonPermissionDefinitionProvider.cs index 0bdfc7fa1d..4007cb2598 100644 --- a/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/DocsCommonPermissionDefinitionProvider.cs +++ b/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/DocsCommonPermissionDefinitionProvider.cs @@ -10,7 +10,7 @@ namespace Volo.Docs.Common { var group = context.AddGroup(DocsCommonPermissions.GroupName, L("Permission:DocumentManagement.Common")); - group.AddPermission(DocsCommonPermissions.Projects.PdfGeneration, L("Permission:PdfGeneration")); + group.AddPermission(DocsCommonPermissions.Projects.PdfDownload, L("Permission:PdfDownload")); } private static LocalizableString L(string name) diff --git a/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/DocsCommonPermissions.cs b/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/DocsCommonPermissions.cs index f668f00813..e07d950110 100644 --- a/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/DocsCommonPermissions.cs +++ b/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/DocsCommonPermissions.cs @@ -8,7 +8,7 @@ namespace Volo.Docs.Common public static class Projects { - public const string PdfGeneration = GroupName + ".PdfGeneration"; + public const string PdfDownload = GroupName + ".PdfDownload"; } public static string[] GetAll() diff --git a/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Documents/IDocumentPdfAppService.cs b/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Documents/IDocumentPdfAppService.cs new file mode 100644 index 0000000000..f5ab523b1f --- /dev/null +++ b/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Documents/IDocumentPdfAppService.cs @@ -0,0 +1,12 @@ +using System.Threading.Tasks; +using Volo.Abp.Application.Services; +using Volo.Abp.Content; + +namespace Volo.Docs.Common.Documents; + +public interface IDocumentPdfAppService : IApplicationService +{ + Task DownloadPdfAsync(DocumentPdfGeneratorInput input); + + Task ExistsAsync(DocumentPdfGeneratorInput input); +} \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Documents/IDocumentPdfGeneratorAppService.cs b/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Documents/IDocumentPdfGeneratorAppService.cs deleted file mode 100644 index dc8d87e820..0000000000 --- a/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Documents/IDocumentPdfGeneratorAppService.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System.Threading.Tasks; -using Volo.Abp.Application.Services; -using Volo.Abp.Content; - -namespace Volo.Docs.Common.Documents; - -public interface IDocumentPdfGeneratorAppService : IApplicationService -{ - Task GeneratePdfAsync(DocumentPdfGeneratorInput input); -} \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/ar.json b/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/ar.json index ff14b26dc6..71e129fa64 100644 --- a/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/ar.json +++ b/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/ar.json @@ -2,6 +2,6 @@ "culture": "ar", "texts": { "Permission:DocumentManagement.Common": "إدارة المستندات العامة", - "Permission:PdfGeneration": "إنشاء ملفات PDF" + "Permission:PdfDownload": "تحميل ملفات PDF" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/cs.json b/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/cs.json index 7999e95a27..213dddc37d 100644 --- a/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/cs.json +++ b/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/cs.json @@ -2,6 +2,6 @@ "culture": "cs", "texts": { "Permission:DocumentManagement.Common": "Správa dokumentů", - "Permission:PdfGeneration": "Generování PDF" + "Permission:PdfDownload": "Stahování PDF" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/de-DE.json b/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/de-DE.json index 0b2c842bb3..3310b5e4a3 100644 --- a/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/de-DE.json +++ b/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/de-DE.json @@ -2,6 +2,6 @@ "culture": "de-DE", "texts": { "Permission:DocumentManagement.Common": "Dokumentenverwaltung", - "Permission:PdfGeneration": "PDF-Generierung" + "Permission:PdfDownload": "PDF-Herunterladen" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/de.json b/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/de.json index 95d2923d1e..0b8d5986b1 100644 --- a/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/de.json +++ b/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/de.json @@ -2,6 +2,6 @@ "culture": "de", "texts": { "Permission:DocumentManagement.Common": "Dokumentenverwaltung", - "Permission:PdfGeneration": "PDF-Generierung" + "Permission:PdfDownload": "PDF-Herunterladen" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/el.json b/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/el.json index 3200537f6d..176c9fed46 100644 --- a/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/el.json +++ b/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/el.json @@ -2,6 +2,6 @@ "culture": "el", "texts": { "Permission:DocumentManagement.Common": "Διαχείριση Εγγράφων", - "Permission:PdfGeneration": "Δημιουργία PDF" + "Permission:PdfDownload": "Λήψη PDF" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/en-GB.json b/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/en-GB.json index 8f01efadbf..ffe3694967 100644 --- a/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/en-GB.json +++ b/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/en-GB.json @@ -2,6 +2,6 @@ "culture": "en-GB", "texts": { "Permission:DocumentManagement.Common": "Document Management Common", - "Permission:PdfGeneration": "PDF Generation" + "Permission:PdfDownload": "PDF Download" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/en.json b/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/en.json index 3901eb8d1c..1113f1909f 100644 --- a/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/en.json +++ b/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/en.json @@ -2,6 +2,6 @@ "culture": "en", "texts": { "Permission:DocumentManagement.Common": "Document Management Common", - "Permission:PdfGeneration": "PDF Generation" + "Permission:PdfDownload": "PDF Download" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/es.json b/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/es.json index 707bd71c72..4d96926a28 100644 --- a/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/es.json +++ b/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/es.json @@ -2,6 +2,6 @@ "culture": "es", "texts": { "Permission:DocumentManagement.Common": "Gestión de documentos comunes", - "Permission:PdfGeneration": "Generación de PDF" + "Permission:PdfDownload": "Descarga de PDF" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/fi.json b/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/fi.json index 7e3a84ff00..f9791278f6 100644 --- a/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/fi.json +++ b/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/fi.json @@ -2,6 +2,6 @@ "culture": "fi", "texts": { "Permission:DocumentManagement.Common": "Tiedostonhallinta", - "Permission:PdfGeneration": "PDF-generointi" + "Permission:PdfDownload": "PDF-lataaminen" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/fr.json b/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/fr.json index 6eba3e78c1..6cf85a2294 100644 --- a/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/fr.json +++ b/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/fr.json @@ -2,6 +2,6 @@ "culture": "fr", "texts": { "Permission:DocumentManagement.Common": "Gestion des documents communs", - "Permission:PdfGeneration": "Génération de PDF" + "Permission:PdfDownload": "Téléchargement de PDF" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/hi.json b/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/hi.json index 5208d04868..80485999b5 100644 --- a/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/hi.json +++ b/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/hi.json @@ -2,6 +2,6 @@ "culture": "hi", "texts": { "Permission:DocumentManagement.Common": "सामान्य दस्तावेज़ प्रबंधन", - "Permission:PdfGeneration": "PDF उत्पन्न करना" + "Permission:PdfDownload": "PDF डाउनलोड करना" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/hr.json b/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/hr.json index 8da0d89a98..ae3e2b219a 100644 --- a/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/hr.json +++ b/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/hr.json @@ -2,6 +2,6 @@ "culture": "hr", "texts": { "Permission:DocumentManagement.Common": "Upravljanje zajedničkih dokumenata", - "Permission:PdfGeneration": "Generiranje PDF-a" + "Permission:PdfDownload": "Preuzimanje PDF-a" } } diff --git a/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/hu.json b/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/hu.json index 30a2bd39f8..32868a4c7c 100644 --- a/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/hu.json +++ b/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/hu.json @@ -2,6 +2,6 @@ "culture": "hu", "texts": { "Permission:DocumentManagement.Common": "Általános dokumentumkezelés", - "Permission:PdfGeneration": "PDF generálás" + "Permission:PdfDownload": "PDF letöltése" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/is.json b/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/is.json index 9e0f6b19c9..7f39fb6170 100644 --- a/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/is.json +++ b/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/is.json @@ -2,6 +2,6 @@ "culture": "is", "texts": { "Permission:DocumentManagement.Common": "Almennir skjöl", - "Permission:PdfGeneration": "Breyta í PDF" + "Permission:PdfDownload": "Breyta í PDF" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/it.json b/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/it.json index 1616e2cecb..fd586ae4a0 100644 --- a/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/it.json +++ b/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/it.json @@ -2,6 +2,6 @@ "culture": "it", "texts": { "Permission:DocumentManagement.Common": "Gestione documenti comuni", - "Permission:PdfGeneration": "Generazione PDF" + "Permission:PdfDownload": "Download PDF" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/nl.json b/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/nl.json index 64e170aaf8..29e5bf8a9c 100644 --- a/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/nl.json +++ b/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/nl.json @@ -2,6 +2,6 @@ "culture": "nl", "texts": { "Permission:DocumentManagement.Common": "Algemene documentbeheer", - "Permission:PdfGeneration": "PDF-generatie" + "Permission:PdfDownload": "PDF downloaden" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/pl-PL.json b/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/pl-PL.json index 89c83f4063..8268413768 100644 --- a/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/pl-PL.json +++ b/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/pl-PL.json @@ -2,6 +2,6 @@ "culture": "pl-PL", "texts": { "Permission:DocumentManagement.Common": "Zarządzanie dokumentami", - "Permission:PdfGeneration": "Generowanie PDF" + "Permission:PdfDownload": "Pobieranie PDF" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/pt-BR.json b/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/pt-BR.json index e9c83fc560..a84f075202 100644 --- a/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/pt-BR.json +++ b/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/pt-BR.json @@ -2,6 +2,6 @@ "culture": "pt-BR", "texts": { "Permission:DocumentManagement.Common": "Gerenciamento de documentos comuns", - "Permission:PdfGeneration": "Geração de PDF" + "Permission:PdfDownload": "Download de PDF" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/ro-RO.json b/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/ro-RO.json index b5cc16b376..8c037ebff5 100644 --- a/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/ro-RO.json +++ b/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/ro-RO.json @@ -2,6 +2,6 @@ "culture": "ro-RO", "texts": { "Permission:DocumentManagement.Common": "Gestionarea documentelor comune", - "Permission:PdfGeneration": "Generarea PDF" + "Permission:PdfDownload": "Descărcare PDF" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/ru.json b/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/ru.json index f110638da1..950217d67c 100644 --- a/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/ru.json +++ b/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/ru.json @@ -2,6 +2,6 @@ "culture": "ru", "texts": { "Permission:DocumentManagement.Common": "Общее управление документами", - "Permission:PdfGeneration": "Генерация PDF" + "Permission:PdfDownload": "Скачивание PDF" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/sk.json b/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/sk.json index aca12e8304..d6a97d88f8 100644 --- a/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/sk.json +++ b/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/sk.json @@ -2,6 +2,6 @@ "culture": "sk", "texts": { "Permission:DocumentManagement.Common": "Správa dokumentov", - "Permission:PdfGeneration": "Generovanie PDF" + "Permission:PdfDownload": "Generovanie PDF" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/sl.json b/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/sl.json index 1adc834a47..0f8d8bd2ae 100644 --- a/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/sl.json +++ b/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/sl.json @@ -2,6 +2,6 @@ "culture": "sl", "texts": { "Permission:DocumentManagement.Common": "Skupna dokumentna upravljanja", - "Permission:PdfGeneration": "Generiranje PDF" + "Permission:PdfDownload": "Prenos PDF" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/sv.json b/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/sv.json index c0df8c8fa9..4a8e23575b 100644 --- a/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/sv.json +++ b/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/sv.json @@ -2,6 +2,6 @@ "culture": "sv", "texts": { "Permission:DocumentManagement.Common": "Dokumenthantering", - "Permission:PdfGeneration": "PDF-generering" + "Permission:PdfDownload": "PDF-generering" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/tr.json b/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/tr.json index 19c39d619b..1b40bdb92a 100644 --- a/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/tr.json +++ b/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/tr.json @@ -2,6 +2,6 @@ "culture": "tr", "texts": { "Permission:DocumentManagement.Common": "Genel Belge Yönetimi", - "Permission:PdfGeneration": "PDF Oluşturma" + "Permission:PdfDownload": "PDF İndirme" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/vi.json b/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/vi.json index e0f7a86c7d..53b86e5ce3 100644 --- a/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/vi.json +++ b/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/vi.json @@ -2,6 +2,6 @@ "culture": "vi", "texts": { "Permission:DocumentManagement.Common": "Quản lý tài liệu chung", - "Permission:PdfGeneration": "Tạo PDF" + "Permission:PdfDownload": "Tải xuống PDF" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/zh-Hans.json b/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/zh-Hans.json index f92de5bc99..70f0eaab4d 100644 --- a/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/zh-Hans.json +++ b/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/zh-Hans.json @@ -2,6 +2,6 @@ "culture": "zh-Hans", "texts": { "Permission:DocumentManagement.Common": "通用文档管理", - "Permission:PdfGeneration": "PDF生成" + "Permission:PdfDownload": "PDF下载" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/zh-Hant.json b/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/zh-Hant.json index 82b5257eed..d37a0ff67a 100644 --- a/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/zh-Hant.json +++ b/modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Localization/Resources/Docs/ApplicationContracts/zh-Hant.json @@ -2,6 +2,6 @@ "culture": "zh-Hant", "texts": { "Permission:DocumentManagement.Common": "通用文件管理", - "Permission:PdfGeneration": "PDF生成" + "Permission:PdfDownload": "PDF下載" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Common.Application/Volo.Docs.Common.Application.abppkg b/modules/docs/src/Volo.Docs.Common.Application/Volo.Docs.Common.Application.abppkg new file mode 100644 index 0000000000..d8358a94f1 --- /dev/null +++ b/modules/docs/src/Volo.Docs.Common.Application/Volo.Docs.Common.Application.abppkg @@ -0,0 +1,3 @@ +{ + "role": "Volo.Docs.Application" +} \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Common.Application/Volo/Docs/Common/Documents/DocumentPdfAppService.cs b/modules/docs/src/Volo.Docs.Common.Application/Volo/Docs/Common/Documents/DocumentPdfAppService.cs new file mode 100644 index 0000000000..0cfdf48bd7 --- /dev/null +++ b/modules/docs/src/Volo.Docs.Common.Application/Volo/Docs/Common/Documents/DocumentPdfAppService.cs @@ -0,0 +1,55 @@ +using System.Threading.Tasks; +using Microsoft.AspNetCore.Authorization; +using Microsoft.Extensions.Options; +using Volo.Abp.Content; +using Volo.Abp.Http; +using Volo.Docs.Projects; +using Volo.Docs.Projects.Pdf; + +namespace Volo.Docs.Common.Documents; + +[Authorize(DocsCommonPermissions.Projects.PdfDownload)] +public class DocumentPdfAppService : DocsCommonAppServiceBase, IDocumentPdfAppService +{ + protected IProjectPdfGenerator ProjectPdfGenerator { get; } + protected IProjectRepository ProjectRepository { get; } + protected IProjectPdfFileStore ProjectPdfFileStore { get; } + protected IOptions Options { get; } + + public DocumentPdfAppService( + IProjectPdfGenerator projectPdfGenerator, + IProjectRepository projectRepository, + IProjectPdfFileStore projectPdfFileStore, + IOptions options) + { + ProjectPdfGenerator = projectPdfGenerator; + ProjectRepository = projectRepository; + ProjectPdfFileStore = projectPdfFileStore; + Options = options; + } + + public virtual async Task DownloadPdfAsync(DocumentPdfGeneratorInput input) + { + var project = await ProjectRepository.GetAsync(input.ProjectId); + var version = project.GetFullVersion(input.Version); + var languageCode = input.LanguageCode; + var fileName = Options.Value.CalculatePdfFileName(project, version, languageCode); + var fileStream = await ProjectPdfFileStore.GetOrNullAsync(project, version, languageCode); + + if (fileStream != null) + { + return new RemoteStreamContent(fileStream, fileName, MimeTypes.Application.Zip); + } + + return null; + } + + public virtual async Task ExistsAsync(DocumentPdfGeneratorInput input) + { + var project = await ProjectRepository.GetAsync(input.ProjectId); + var version = project.GetFullVersion(input.Version); + var languageCode = input.LanguageCode; + var fileName = Options.Value.CalculatePdfFileName(project, version, languageCode); + return project.FindPdfFile(fileName) != null; + } +} \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Common.Application/Volo/Docs/Common/Documents/DocumentPdfGeneratorAppService.cs b/modules/docs/src/Volo.Docs.Common.Application/Volo/Docs/Common/Documents/DocumentPdfGeneratorAppService.cs deleted file mode 100644 index 3960a16179..0000000000 --- a/modules/docs/src/Volo.Docs.Common.Application/Volo/Docs/Common/Documents/DocumentPdfGeneratorAppService.cs +++ /dev/null @@ -1,52 +0,0 @@ -using System.Text; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Authorization; -using Volo.Abp.Application.Services; -using Volo.Abp.Content; -using Volo.Abp.Data; -using Volo.Docs.Projects; -using Volo.Docs.Projects.Pdf; - -namespace Volo.Docs.Common.Documents; - -[Authorize(DocsCommonPermissions.Projects.PdfGeneration)] -public class DocumentPdfGeneratorAppService : ApplicationService, IDocumentPdfGeneratorAppService -{ - protected IProjectPdfGenerator ProjectPdfGenerator { get; } - protected IProjectRepository ProjectRepository { get; } - - public DocumentPdfGeneratorAppService( - IProjectPdfGenerator projectPdfGenerator, - IProjectRepository projectRepository) - { - ProjectPdfGenerator = projectPdfGenerator; - ProjectRepository = projectRepository; - } - - public virtual async Task GeneratePdfAsync(DocumentPdfGeneratorInput input) - { - var project = await ProjectRepository.GetAsync(input.ProjectId, includeDetails: true); - - // https://github.com/abpframework/abp/blob/e96f601641ab8a4bb7d704d3b9df2c00517d96f6/modules/docs/src/Volo.Docs.Application/Volo/Docs/Documents/DocumentAppService.cs#L73 - var inputVersionStringBuilder = new StringBuilder(); - input.Version = inputVersionStringBuilder.Append(GetProjectVersionPrefixIfExist(project)).Append(input.Version).ToString(); - return await ProjectPdfGenerator.GenerateAsync(project, input.Version, input.LanguageCode); - } - - private string GetProjectVersionPrefixIfExist(Project project) - { - if (GetGithubVersionProviderSource(project) != GithubVersionProviderSource.Branches) - { - return string.Empty; - } - - return project.GetProperty("VersionBranchPrefix"); - } - - private GithubVersionProviderSource GetGithubVersionProviderSource(Project project) - { - return project.HasProperty("GithubVersionProviderSource") - ? project.GetProperty("GithubVersionProviderSource") - : GithubVersionProviderSource.Releases; - } -} \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Common.HttpApi.Client/ClientProxies/Volo/Docs/Documents/DocsDocumentPdfGeneratorClientProxy.Generated.cs b/modules/docs/src/Volo.Docs.Common.HttpApi.Client/ClientProxies/DocsDocumentPdfClientProxy.Generated.cs similarity index 50% rename from modules/docs/src/Volo.Docs.Common.HttpApi.Client/ClientProxies/Volo/Docs/Documents/DocsDocumentPdfGeneratorClientProxy.Generated.cs rename to modules/docs/src/Volo.Docs.Common.HttpApi.Client/ClientProxies/DocsDocumentPdfClientProxy.Generated.cs index 39608380c5..e40ce0d1ec 100644 --- a/modules/docs/src/Volo.Docs.Common.HttpApi.Client/ClientProxies/Volo/Docs/Documents/DocsDocumentPdfGeneratorClientProxy.Generated.cs +++ b/modules/docs/src/Volo.Docs.Common.HttpApi.Client/ClientProxies/DocsDocumentPdfClientProxy.Generated.cs @@ -15,12 +15,20 @@ using Volo.Docs.Common.Documents; namespace Volo.Docs.Documents; [Dependency(ReplaceServices = true)] -[ExposeServices(typeof(IDocumentPdfGeneratorAppService), typeof(DocsDocumentPdfGeneratorClientProxy))] -public partial class DocsDocumentPdfGeneratorClientProxy : ClientProxyBase, IDocumentPdfGeneratorAppService +[ExposeServices(typeof(IDocumentPdfAppService), typeof(DocsDocumentPdfClientProxy))] +public partial class DocsDocumentPdfClientProxy : ClientProxyBase, IDocumentPdfAppService { - public virtual async Task GeneratePdfAsync(DocumentPdfGeneratorInput input) + public virtual async Task DownloadPdfAsync(DocumentPdfGeneratorInput input) { - return await RequestAsync(nameof(GeneratePdfAsync), new ClientProxyRequestTypeValue + return await RequestAsync(nameof(DownloadPdfAsync), new ClientProxyRequestTypeValue + { + { typeof(DocumentPdfGeneratorInput), input } + }); + } + + public virtual async Task ExistsAsync(DocumentPdfGeneratorInput input) + { + return await RequestAsync(nameof(ExistsAsync), new ClientProxyRequestTypeValue { { typeof(DocumentPdfGeneratorInput), input } }); diff --git a/modules/docs/src/Volo.Docs.Common.HttpApi.Client/ClientProxies/DocsDocumentPdfClientProxy.cs b/modules/docs/src/Volo.Docs.Common.HttpApi.Client/ClientProxies/DocsDocumentPdfClientProxy.cs new file mode 100644 index 0000000000..e692a1a0ee --- /dev/null +++ b/modules/docs/src/Volo.Docs.Common.HttpApi.Client/ClientProxies/DocsDocumentPdfClientProxy.cs @@ -0,0 +1,7 @@ +// This file is part of DocsDocumentPdfClientProxy, you can customize it here +// ReSharper disable once CheckNamespace +namespace Volo.Docs.Documents; + +public partial class DocsDocumentPdfClientProxy +{ +} diff --git a/modules/docs/src/Volo.Docs.Common.HttpApi.Client/ClientProxies/Volo/Docs/Projects/DocsProjectClientProxy.Generated.cs b/modules/docs/src/Volo.Docs.Common.HttpApi.Client/ClientProxies/DocsProjectClientProxy.Generated.cs similarity index 100% rename from modules/docs/src/Volo.Docs.Common.HttpApi.Client/ClientProxies/Volo/Docs/Projects/DocsProjectClientProxy.Generated.cs rename to modules/docs/src/Volo.Docs.Common.HttpApi.Client/ClientProxies/DocsProjectClientProxy.Generated.cs diff --git a/modules/docs/src/Volo.Docs.Common.HttpApi.Client/ClientProxies/Volo/Docs/Projects/DocsProjectClientProxy.cs b/modules/docs/src/Volo.Docs.Common.HttpApi.Client/ClientProxies/DocsProjectClientProxy.cs similarity index 100% rename from modules/docs/src/Volo.Docs.Common.HttpApi.Client/ClientProxies/Volo/Docs/Projects/DocsProjectClientProxy.cs rename to modules/docs/src/Volo.Docs.Common.HttpApi.Client/ClientProxies/DocsProjectClientProxy.cs diff --git a/modules/docs/src/Volo.Docs.Common.HttpApi.Client/ClientProxies/Volo/Docs/Documents/DocsDocumentPdfGeneratorClientProxy.cs b/modules/docs/src/Volo.Docs.Common.HttpApi.Client/ClientProxies/Volo/Docs/Documents/DocsDocumentPdfGeneratorClientProxy.cs deleted file mode 100644 index e14c1c25be..0000000000 --- a/modules/docs/src/Volo.Docs.Common.HttpApi.Client/ClientProxies/Volo/Docs/Documents/DocsDocumentPdfGeneratorClientProxy.cs +++ /dev/null @@ -1,7 +0,0 @@ -// This file is part of DocsDocumentPdfGeneratorClientProxy, you can customize it here -// ReSharper disable once CheckNamespace -namespace Volo.Docs.Documents; - -public partial class DocsDocumentPdfGeneratorClientProxy -{ -} diff --git a/modules/docs/src/Volo.Docs.Common.HttpApi.Client/ClientProxies/docs-common-generate-proxy.json b/modules/docs/src/Volo.Docs.Common.HttpApi.Client/ClientProxies/docs-common-generate-proxy.json index db7303a427..16b7c6d4b0 100644 --- a/modules/docs/src/Volo.Docs.Common.HttpApi.Client/ClientProxies/docs-common-generate-proxy.json +++ b/modules/docs/src/Volo.Docs.Common.HttpApi.Client/ClientProxies/docs-common-generate-proxy.json @@ -4,20 +4,20 @@ "rootPath": "docs-common", "remoteServiceName": "AbpDocsCommon", "controllers": { - "Volo.Docs.Documents.DocsDocumentPdfGeneratorController": { - "controllerName": "DocsDocumentPdfGenerator", - "controllerGroupName": "Document", + "Volo.Docs.Documents.DocsDocumentPdfController": { + "controllerName": "DocsDocumentPdf", + "controllerGroupName": "DocumentPdf", "isRemoteService": true, "isIntegrationService": false, "apiVersion": null, - "type": "Volo.Docs.Documents.DocsDocumentPdfGeneratorController", + "type": "Volo.Docs.Documents.DocsDocumentPdfController", "interfaces": [ { - "type": "Volo.Docs.Common.Documents.IDocumentPdfGeneratorAppService", - "name": "IDocumentPdfGeneratorAppService", + "type": "Volo.Docs.Common.Documents.IDocumentPdfAppService", + "name": "IDocumentPdfAppService", "methods": [ { - "name": "GeneratePdfAsync", + "name": "DownloadPdfAsync", "parametersOnMethod": [ { "name": "input", @@ -32,16 +32,33 @@ "type": "Volo.Abp.Content.IRemoteStreamContent", "typeSimple": "Volo.Abp.Content.IRemoteStreamContent" } + }, + { + "name": "ExistsAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Docs.Common.Documents.DocumentPdfGeneratorInput, Volo.Docs.Common.Application.Contracts", + "type": "Volo.Docs.Common.Documents.DocumentPdfGeneratorInput", + "typeSimple": "Volo.Docs.Common.Documents.DocumentPdfGeneratorInput", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "System.Boolean", + "typeSimple": "boolean" + } } ] } ], "actions": { - "GeneratePdfAsyncByInput": { - "uniqueName": "GeneratePdfAsyncByInput", - "name": "GeneratePdfAsync", + "DownloadPdfAsyncByInput": { + "uniqueName": "DownloadPdfAsyncByInput", + "name": "DownloadPdfAsync", "httpMethod": "GET", - "url": "api/docs/documents/pdf", + "url": "api/docs/documents/pdf/download", "supportedVersions": [], "parametersOnMethod": [ { @@ -96,7 +113,68 @@ "typeSimple": "Volo.Abp.Content.IRemoteStreamContent" }, "allowAnonymous": null, - "implementFrom": "Volo.Docs.Common.Documents.IDocumentPdfGeneratorAppService" + "implementFrom": "Volo.Docs.Common.Documents.IDocumentPdfAppService" + }, + "ExistsAsyncByInput": { + "uniqueName": "ExistsAsyncByInput", + "name": "ExistsAsync", + "httpMethod": "GET", + "url": "api/docs/documents/pdf/exists", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Docs.Common.Documents.DocumentPdfGeneratorInput, Volo.Docs.Common.Application.Contracts", + "type": "Volo.Docs.Common.Documents.DocumentPdfGeneratorInput", + "typeSimple": "Volo.Docs.Common.Documents.DocumentPdfGeneratorInput", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "ProjectId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "Version", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, + { + "nameOnMethod": "input", + "name": "LanguageCode", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + } + ], + "returnValue": { + "type": "System.Boolean", + "typeSimple": "boolean" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Docs.Common.Documents.IDocumentPdfAppService" } } }, diff --git a/modules/docs/src/Volo.Docs.Common.HttpApi.Client/Volo.Docs.Common.HttpApi.Client.abppkg b/modules/docs/src/Volo.Docs.Common.HttpApi.Client/Volo.Docs.Common.HttpApi.Client.abppkg new file mode 100644 index 0000000000..a4939ea991 --- /dev/null +++ b/modules/docs/src/Volo.Docs.Common.HttpApi.Client/Volo.Docs.Common.HttpApi.Client.abppkg @@ -0,0 +1,15 @@ +{ + "role": "Volo.Docs.HttpApi.Client", + "proxies": { + "csharp": { + "VoloDocs.Web-docs-common": { + "applicationName": "VoloDocs.Web", + "module": "docs-common", + "url": "https://localhost:5001", + "folder": "ClientProxies", + "serviceType": "all", + "withoutContracts": true + } + } + } +} \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Common.HttpApi/Volo.Docs.Common.HttpApi.abppkg b/modules/docs/src/Volo.Docs.Common.HttpApi/Volo.Docs.Common.HttpApi.abppkg new file mode 100644 index 0000000000..bbc082c681 --- /dev/null +++ b/modules/docs/src/Volo.Docs.Common.HttpApi/Volo.Docs.Common.HttpApi.abppkg @@ -0,0 +1,3 @@ +{ + "role": "Volo.Docs.HttpApi" +} \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Common.HttpApi/Volo/Docs/Documents/DocsDocumentPdfController.cs b/modules/docs/src/Volo.Docs.Common.HttpApi/Volo/Docs/Documents/DocsDocumentPdfController.cs new file mode 100644 index 0000000000..040373269e --- /dev/null +++ b/modules/docs/src/Volo.Docs.Common.HttpApi/Volo/Docs/Documents/DocsDocumentPdfController.cs @@ -0,0 +1,37 @@ +using System.Threading.Tasks; +using Asp.Versioning; +using Microsoft.AspNetCore.Mvc; +using Volo.Abp; +using Volo.Abp.Content; +using Volo.Docs.Common; +using Volo.Docs.Common.Documents; + +namespace Volo.Docs.Documents; + +[RemoteService(Name = DocsCommonRemoteServiceConsts.RemoteServiceName)] +[Area(DocsCommonRemoteServiceConsts.ModuleName)] +[ControllerName("DocumentPdf")] +[Route("api/docs/documents/pdf")] +public class DocsDocumentPdfController : DocsControllerBase, IDocumentPdfAppService +{ + protected IDocumentPdfAppService DocumentPdfAppService { get; } + + public DocsDocumentPdfController(IDocumentPdfAppService documentPdfAppService) + { + DocumentPdfAppService = documentPdfAppService; + } + + [HttpGet] + [Route("download")] + public virtual Task DownloadPdfAsync(DocumentPdfGeneratorInput input) + { + return DocumentPdfAppService.DownloadPdfAsync(input); + } + + [HttpGet] + [Route("exists")] + public virtual Task ExistsAsync(DocumentPdfGeneratorInput input) + { + return DocumentPdfAppService.ExistsAsync(input); + } +} \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Common.HttpApi/Volo/Docs/Documents/DocsDocumentPdfGeneratorController.cs b/modules/docs/src/Volo.Docs.Common.HttpApi/Volo/Docs/Documents/DocsDocumentPdfGeneratorController.cs deleted file mode 100644 index 31ae2a2f44..0000000000 --- a/modules/docs/src/Volo.Docs.Common.HttpApi/Volo/Docs/Documents/DocsDocumentPdfGeneratorController.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System.Threading.Tasks; -using Asp.Versioning; -using Microsoft.AspNetCore.Mvc; -using Volo.Abp; -using Volo.Abp.Content; -using Volo.Docs.Common; -using Volo.Docs.Common.Documents; - -namespace Volo.Docs.Documents; - -[RemoteService(Name = DocsCommonRemoteServiceConsts.RemoteServiceName)] -[Area(DocsCommonRemoteServiceConsts.ModuleName)] -[ControllerName("Document")] -[Route("api/docs/documents")] -public class DocsDocumentPdfGeneratorController : DocsControllerBase, IDocumentPdfGeneratorAppService -{ - protected IDocumentPdfGeneratorAppService DocumentPdfGeneratorAppService { get; } - - public DocsDocumentPdfGeneratorController(IDocumentPdfGeneratorAppService documentPdfGeneratorAppService) - { - DocumentPdfGeneratorAppService = documentPdfGeneratorAppService; - } - - [HttpGet] - [Route("pdf")] - public async Task GeneratePdfAsync(DocumentPdfGeneratorInput input) - { - var streamContent = await DocumentPdfGeneratorAppService.GeneratePdfAsync(input); - Response.Headers.ContentDisposition = $"inline; filename=\"{streamContent.FileName}\""; - return streamContent; - } -} \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Projects/Pdf/BlobProjectPdfFileStore.cs b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Projects/Pdf/BlobProjectPdfFileStore.cs index 315d89c49c..9d12923325 100644 --- a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Projects/Pdf/BlobProjectPdfFileStore.cs +++ b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Projects/Pdf/BlobProjectPdfFileStore.cs @@ -53,12 +53,6 @@ public class BlobProjectPdfFileStore : IProjectPdfFileStore, ITransientDependenc return null; } - var lastModificationTime = pdfFile.LastModificationTime ?? pdfFile.CreationTime; - if(lastModificationTime.Add(Options.Value.PdfFileCacheExpiration) <= Clock.Now) - { - return null; - } - return await BlobContainer.GetOrNullAsync(Options.Value.CalculatePdfFileName(project, version, languageCode)); } diff --git a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Projects/Pdf/DocsProjectPdfGeneratorOptions.cs b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Projects/Pdf/DocsProjectPdfGeneratorOptions.cs index ef24e6ffd7..8b8678930d 100644 --- a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Projects/Pdf/DocsProjectPdfGeneratorOptions.cs +++ b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Projects/Pdf/DocsProjectPdfGeneratorOptions.cs @@ -1,5 +1,4 @@ using System; -using Scriban.Syntax; namespace Volo.Docs.Projects.Pdf; @@ -29,15 +28,9 @@ public class DocsProjectPdfGeneratorOptions /// public string IndexPagePath { get; set; } - /// - /// PDF file cache expiration time. - /// Default value is 24 hours. - /// - public TimeSpan PdfFileCacheExpiration { get; set; } = TimeSpan.FromHours(24); - /// /// The function to calculate the PDF file name. - /// Default is "{project.ShortName}-{version}-{languageCode}.pdf". + /// Default is "{project.ShortName}-{version}-{languageCode}.zip". /// public Func CalculatePdfFileName { get; set; } @@ -115,6 +108,6 @@ public class DocsProjectPdfGeneratorOptions width: 100%; }"; - CalculatePdfFileName = (project, version, languageCode) => $"{project.ShortName}-{version}-{languageCode}.pdf"; + CalculatePdfFileName = (project, version, languageCode) => $"{project.ShortName}-{version}-{languageCode}.zip"; } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Projects/Pdf/IHtmlToPdfRenderer.cs b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Projects/Pdf/IHtmlToPdfRenderer.cs index c17908af51..56fdc2f995 100644 --- a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Projects/Pdf/IHtmlToPdfRenderer.cs +++ b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Projects/Pdf/IHtmlToPdfRenderer.cs @@ -6,5 +6,5 @@ namespace Volo.Docs.Projects.Pdf; public interface IHtmlToPdfRenderer { - Task RenderAsync(string title, string html, List documents); + Task RenderAsync(string title, string html, List documents); } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Projects/Pdf/IProjectPdfGenerator.cs b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Projects/Pdf/IProjectPdfGenerator.cs index af685659fa..dad173bc19 100644 --- a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Projects/Pdf/IProjectPdfGenerator.cs +++ b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Projects/Pdf/IProjectPdfGenerator.cs @@ -1,9 +1,8 @@ using System.Threading.Tasks; -using Volo.Abp.Content; namespace Volo.Docs.Projects.Pdf; public interface IProjectPdfGenerator { - Task GenerateAsync(Project project, string version, string languageCode); + Task GenerateAsync(Project project, string version, string languageCode); } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Projects/Pdf/IText/ITextHtmlToPdfRenderer.cs b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Projects/Pdf/IText/ITextHtmlToPdfRenderer.cs index 1ee6b679e3..cd83333495 100644 --- a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Projects/Pdf/IText/ITextHtmlToPdfRenderer.cs +++ b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Projects/Pdf/IText/ITextHtmlToPdfRenderer.cs @@ -8,11 +8,10 @@ using iText.Kernel.Pdf.Action; using Microsoft.Extensions.Options; using Volo.Abp.DependencyInjection; using Volo.Docs.Utils; -using ITextDocument = iText.Layout.Document; namespace Volo.Docs.Projects.Pdf.IText; -public class ITextHtmlToPdfRenderer : IHtmlToPdfRenderer ,ITransientDependency +public class ITextHtmlToPdfRenderer : IHtmlToPdfRenderer, ITransientDependency { protected IOptions Options { get; } @@ -21,15 +20,26 @@ public class ITextHtmlToPdfRenderer : IHtmlToPdfRenderer ,ITransientDependency Options = options; } - public virtual Task RenderAsync(string title, string html, List documents) + public virtual Task RenderAsync(string title, string html, List documents) { var pdfStream = new MemoryStream(); - var pdfWrite = new PdfWriter(pdfStream); - var pdfDocument = new iText.Kernel.Pdf.PdfDocument(pdfWrite); - pdfDocument.GetDocumentInfo().SetTitle(title); - var textDocument = new ITextDocument(pdfDocument); - pdfWrite.SetCloseStream(false); - + using (var pdfWriter = new PdfWriter(pdfStream)) + { + pdfWriter.SetCloseStream(false); + using (var pdfDocument = new iText.Kernel.Pdf.PdfDocument(pdfWriter)) + { + pdfDocument.GetDocumentInfo().SetTitle(title); + CreatePdfFromHtml(html, pdfDocument); + AddOutlinesToPdf(pdfDocument, documents); + } + } + + pdfStream.Position = 0; + return Task.FromResult(pdfStream); + } + + private void CreatePdfFromHtml(string html, iText.Kernel.Pdf.PdfDocument pdfDocument) + { var converter = new ConverterProperties(); var tagWorkerFactory = new HtmlIdTagWorkerFactory(pdfDocument); converter.SetTagWorkerFactory(tagWorkerFactory); @@ -37,12 +47,12 @@ public class ITextHtmlToPdfRenderer : IHtmlToPdfRenderer ,ITransientDependency HtmlConverter.ConvertToDocument(html, pdfDocument, converter); tagWorkerFactory.AddNamedDestinations(); + } + + private void AddOutlinesToPdf(iText.Kernel.Pdf.PdfDocument pdfDocument, List documents) + { var pdfOutlines = pdfDocument.GetOutlines(false); BuildPdfOutlines(pdfOutlines, documents); - - textDocument.Close(); - pdfStream.Position = 0; - return Task.FromResult(pdfStream); } private void BuildPdfOutlines(PdfOutline parentOutline, List pdfDocumentNodes) diff --git a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Projects/Pdf/Markdig/AnchorLinkRenderer.cs b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Projects/Pdf/Markdig/AnchorLinkRenderer.cs index 33fd2fd83a..881b2915e3 100644 --- a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Projects/Pdf/Markdig/AnchorLinkRenderer.cs +++ b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Projects/Pdf/Markdig/AnchorLinkRenderer.cs @@ -24,12 +24,9 @@ public class AnchorLinkRenderer : LinkInlineRenderer return; } - var anchor = ResolveRelativeMarkdownPath(_document.Document.Name, link.Url) - .Replace(".md",string.Empty).Replace("/","-").Replace(" ", "-").ToLower(); - - renderer.Write(""); - renderer.Write(link.FirstChild?.ToString() ?? anchor); - renderer.Write(""); + link.GetDynamicUrl = () => "#" + ResolveRelativeMarkdownPath(_document.Document.Name, link.Url) + .Replace(".md", string.Empty).Replace("/", "-").Replace(" ", "-").ToLower(); + base.Write(renderer, link); } private string ResolveRelativeMarkdownPath(string currentPath, string relativePath) diff --git a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Projects/Pdf/ProjectPdfGenerator.cs b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Projects/Pdf/ProjectPdfGenerator.cs index c00973b3e8..f91e341d6f 100644 --- a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Projects/Pdf/ProjectPdfGenerator.cs +++ b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Projects/Pdf/ProjectPdfGenerator.cs @@ -1,14 +1,13 @@ using System; using System.Collections.Generic; using System.IO; +using System.IO.Compression; using System.Linq; using System.Text; using System.Threading.Tasks; using Microsoft.Extensions.Logging; -using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; using Volo.Abp; -using Volo.Abp.Content; using Volo.Abp.DependencyInjection; using Volo.Docs.Documents; using Volo.Docs.Documents.Rendering; @@ -24,7 +23,7 @@ public class ProjectPdfGenerator : IProjectPdfGenerator, ITransientDependency protected IDocumentToHtmlConverterFactory DocumentToHtmlConverterFactory { get; } protected IDocumentRepository DocumentRepository { get; } protected IDocumentSectionRenderer DocumentSectionRenderer { get; } - protected IOptions Options { get; } + protected IOptions Options { get; } protected IProjectPdfFileStore ProjectPdfFileStore { get; } protected IHtmlToPdfRenderer HtmlToPdfRenderer { get; } protected ILogger Logger { get; set; } @@ -34,13 +33,14 @@ public class ProjectPdfGenerator : IProjectPdfGenerator, ITransientDependency protected List AllPdfDocuments { get; } = []; public ProjectPdfGenerator( - IDocumentSourceFactory documentStoreFactory, + IDocumentSourceFactory documentStoreFactory, IDocumentRepository documentRepository, IOptions options, IDocumentSectionRenderer documentSectionRenderer, - IProjectPdfFileStore projectPdfFileStore, - IHtmlToPdfRenderer htmlToPdfRenderer, - IDocumentToHtmlConverterFactory documentToHtmlConverterFactory) + IProjectPdfFileStore projectPdfFileStore, + IHtmlToPdfRenderer htmlToPdfRenderer, + IDocumentToHtmlConverterFactory documentToHtmlConverterFactory, + ILogger logger) { DocumentStoreFactory = documentStoreFactory; DocumentRepository = documentRepository; @@ -49,47 +49,75 @@ public class ProjectPdfGenerator : IProjectPdfGenerator, ITransientDependency ProjectPdfFileStore = projectPdfFileStore; HtmlToPdfRenderer = htmlToPdfRenderer; DocumentToHtmlConverterFactory = documentToHtmlConverterFactory; - Logger = NullLogger.Instance; + Logger = logger; } - - public virtual async Task GenerateAsync(Project project, string version, string languageCode) + + public virtual async Task GenerateAsync(Project project, string version, string languageCode) { - var fileName = Options.Value.CalculatePdfFileName(project, version, languageCode); - var fileStream = await ProjectPdfFileStore.GetOrNullAsync(project, version, languageCode); - - if (fileStream != null) - { - return new RemoteStreamContent(fileStream, fileName, "application/pdf"); - } - Project = project; DocumentSource = DocumentStoreFactory.Create(project.DocumentStoreType); DocumentParams = await GetDocumentParamsAsync(project, version, languageCode); - + var navigation = await GetNavigationAsync(project, version, languageCode); await SetAllPdfDocumentsAsync(navigation.Items, project, version, languageCode); - - var html = await BuildHtmlAsync(); + var title = Options.Value.CalculatePdfFileTitle?.Invoke(project) ?? project.Name; - var pdfStream = await HtmlToPdfRenderer.RenderAsync(title, html, AllPdfDocuments); - - await ProjectPdfFileStore.SetAsync(project, version, languageCode, pdfStream); - - return new RemoteStreamContent(pdfStream, fileName, "application/pdf"); + var tempFiles = new List<(PdfDocument pdfDocument, Stream stream)>(); + + try + { + for (var i = 0; i < AllPdfDocuments.Count; i++) + { + var document = AllPdfDocuments[i]; + Logger.LogInformation("Processing chunk {Index}/{Total}", i + 1, AllPdfDocuments.Count); + + var chunkHtml = await BuildHtmlAsync([document]); + + var pdfStream = await HtmlToPdfRenderer.RenderAsync($"{title} - Part {document.Title}", chunkHtml, [document]); + + Logger.LogInformation("Chunk {Index} rendered to PDF", i + 1); + + tempFiles.Add((document, pdfStream)); + } + + Logger.LogInformation("All chunks processed, merging PDF files"); + + var mergedPdfStream = await MergePdfFilesAsync(tempFiles); + await ProjectPdfFileStore.SetAsync(project, version, languageCode, mergedPdfStream); + } + catch (Exception e) + { + Logger.LogError(e, "An error occurred while generating the PDF for project {ProjectName}", project.Name); + foreach (var tempStream in tempFiles) + { + try + { + await tempStream.stream.DisposeAsync(); + } + catch + { + // ignore any exceptions during disposal + } + } + } + finally + { + AllPdfDocuments.Clear(); + } } - - protected virtual async Task BuildHtmlAsync() + + protected virtual async Task BuildHtmlAsync(List pdfDocuments) { - var htmlContent = await ConvertDocumentsToHtmlAsync(AllPdfDocuments); - + var htmlContent = await ConvertDocumentsToHtmlAsync(pdfDocuments); + var htmlBuilder = new StringBuilder(); htmlBuilder.Append(Options.Value.HtmlLayout); htmlBuilder.Replace(DocsProjectPdfGeneratorOptions.StylePlaceholder, Options.Value.HtmlStyle); htmlBuilder.Replace(DocsProjectPdfGeneratorOptions.ContentPlaceholder, htmlContent); - + return htmlBuilder.ToString(); } - + protected virtual async Task ConvertDocumentsToHtmlAsync(List pdfDocuments) { var contentBuilder = new StringBuilder(); @@ -100,7 +128,9 @@ public class ProjectPdfGenerator : IProjectPdfGenerator, ITransientDependency { var renderedDocument = await RenderDocumentAsync(pdfDocument); var documentToHtmlConverter = GetDocumentToHtmlConverter(Project, pdfDocument); - var htmlContent = documentToHtmlConverter.Convert(new PdfDocumentToHtmlConverterContext(renderedDocument, pdfDocument, DocumentParams)); + var htmlContent = + documentToHtmlConverter.Convert( + new PdfDocumentToHtmlConverterContext(renderedDocument, pdfDocument, DocumentParams)); contentBuilder.AppendLine(htmlContent); } @@ -109,31 +139,73 @@ public class ProjectPdfGenerator : IProjectPdfGenerator, ITransientDependency contentBuilder.AppendLine(await ConvertDocumentsToHtmlAsync(pdfDocument.Children)); } } - + return contentBuilder.ToString(); } - protected virtual IDocumentToHtmlConverter GetDocumentToHtmlConverter(Project project, PdfDocument pdfDocument) + protected virtual async Task MergePdfFilesAsync( + List<(PdfDocument pdfDocument, Stream stream)> pdfFiles) { - return DocumentToHtmlConverterFactory.Create(DocsDomainConsts.PdfDocumentToHtmlConverterPrefix +(pdfDocument.Document.Format ?? project.Format)); + if (pdfFiles.Count == 0) + { + throw new ArgumentException("No PDF files to merge", nameof(pdfFiles)); + } + + var zipStream = new MemoryStream(); + + + using (var zipArchive = new ZipArchive(zipStream, ZipArchiveMode.Create, true)) + { + for (var index = 0; index < pdfFiles.Count; index++) + { + var (doc, pdfFile) = pdfFiles[index]; + var entry = zipArchive.CreateEntry($"{index + 1}_{doc.Title}.pdf", CompressionLevel.Fastest); + await using var entryStream = entry.Open(); + await pdfFile.CopyToAsync(entryStream); + + try + { + await pdfFile.DisposeAsync(); + } + catch (Exception e) + { + Logger.LogWarning(e, "Error disposing PDF file stream for document {DocumentTitle}", doc.Title); + } + } + } + + + zipStream.Position = 0; + return zipStream; + } + + + protected virtual IDocumentToHtmlConverter GetDocumentToHtmlConverter( + Project project, PdfDocument pdfDocument) + { + return DocumentToHtmlConverterFactory.Create( + DocsDomainConsts.PdfDocumentToHtmlConverterPrefix + (pdfDocument.Document.Format ?? project.Format)); } - + protected virtual async Task RenderDocumentAsync(PdfDocument pdfDocument) { var parameters = new DocumentRenderParameters(); - if (pdfDocument.RenderParameters != null) + if (pdfDocument.RenderParameters == null) { - foreach (var renderParameter in pdfDocument.RenderParameters) - { - var documentParam = DocumentParams.Parameters.FirstOrDefault(p => p.Name == renderParameter.Key); - parameters.Add(renderParameter.Key, renderParameter.Value); - parameters.Add(renderParameter.Key + "_Value",documentParam?.Values[renderParameter.Value] ?? renderParameter.Value); - } + return await DocumentSectionRenderer.RenderAsync(pdfDocument.Document.Content, parameters); + } + + foreach (var renderParameter in pdfDocument.RenderParameters) + { + var documentParam = DocumentParams.Parameters.FirstOrDefault(p => p.Name == renderParameter.Key); + parameters.Add(renderParameter.Key, renderParameter.Value); + parameters.Add(renderParameter.Key + "_Value", + documentParam?.Values[renderParameter.Value] ?? renderParameter.Value); } - + return await DocumentSectionRenderer.RenderAsync(pdfDocument.Document.Content, parameters); } - + protected virtual async Task SetAllPdfDocumentsAsync( List navigations, Project project, @@ -156,10 +228,11 @@ public class ProjectPdfGenerator : IProjectPdfGenerator, ITransientDependency { Title = navigation.Text, IgnoreOnOutline = navigation.Path == Options.Value.IndexPagePath, - Id = UrlHelper.IsExternalLink(navigation.Path) ? navigation.Path: null + Id = UrlHelper.IsExternalLink(navigation.Path) ? navigation.Path : null }; - if (!navigation.Path.IsNullOrWhiteSpace() && !UrlHelper.IsExternalLink(navigation.Path) && !navigation.HasChildItems) + if (!navigation.Path.IsNullOrWhiteSpace() && !UrlHelper.IsExternalLink(navigation.Path) && + !navigation.HasChildItems) { await HandleLeafDocumentAsync( navigation, @@ -183,7 +256,7 @@ public class ProjectPdfGenerator : IProjectPdfGenerator, ITransientDependency parentPdfDocument.Children.AddIfNotContains(pdfDocument); } } - + if (navigation.HasChildItems) { AddParameterCombinationsDocuments(parentPdfDocument, groupedCombinationsDocuments); @@ -197,11 +270,12 @@ public class ProjectPdfGenerator : IProjectPdfGenerator, ITransientDependency } catch (Exception e) { - Logger.LogWarning(e, $"Cannot get document for the path '{navigation.Path}' in the project {project.Name}."); + Logger.LogWarning(e, + $"Cannot get document for the path '{navigation.Path}' in the project {project.Name}."); } } } - + private async Task HandleLeafDocumentAsync( NavigationNode navigation, Project project, @@ -237,22 +311,25 @@ public class ProjectPdfGenerator : IProjectPdfGenerator, ITransientDependency groupedCombinationsDocuments[key] = []; } - var combinationDocument = i == 0 ? leafDocument : new PdfDocument - { - Document = document, - Id = GetDocumentId(document.Name, document.Format ?? project.Format, combination, false), - Title = GetDocumentTitle(navigation.Text, combination, DocumentParams), - RenderParameters = combination - }; + var combinationDocument = i == 0 + ? leafDocument + : new PdfDocument + { + Document = document, + Id = GetDocumentId(document.Name, document.Format ?? project.Format, combination, false), + Title = GetDocumentTitle(navigation.Text, combination, DocumentParams), + RenderParameters = combination + }; groupedCombinationsDocuments[key].Add(combinationDocument); } - } - - private void AddParameterCombinationsDocuments(PdfDocument parentPdfDocument, Dictionary> groupedCombinationsDocuments) + } + + private void AddParameterCombinationsDocuments(PdfDocument parentPdfDocument, + Dictionary> groupedCombinationsDocuments) { foreach (var combinations in groupedCombinationsDocuments) - { + { if (parentPdfDocument == null) { AllPdfDocuments.AddIfNotContains(combinations.Value); @@ -262,33 +339,31 @@ public class ProjectPdfGenerator : IProjectPdfGenerator, ITransientDependency parentPdfDocument.Children.AddIfNotContains(combinations.Value); } } - + groupedCombinationsDocuments.Clear(); } - + private async Task GetNavigationAsync( Project project, string version, string languageCode) { var navigationDocument = await GetDocumentAsync(project, project.NavigationDocumentName, version, languageCode); - + if (!DocsJsonSerializerHelper.TryDeserialize(navigationDocument.Content, out var navigation)) { - throw new UserFriendlyException($"Cannot validate navigation file '{project.NavigationDocumentName}' for the project {project.Name}."); + throw new UserFriendlyException( + $"Cannot validate navigation file '{project.NavigationDocumentName}' for the project {project.Name}."); } if (!Options.Value.IndexPagePath.IsNullOrWhiteSpace()) { - navigation.Items.Insert(0, new NavigationNode - { - Path = Options.Value.IndexPagePath - }); + navigation.Items.Insert(0, new NavigationNode { Path = Options.Value.IndexPagePath }); } - + return navigation; } - + private async Task GetDocumentParamsAsync( Project project, string version, @@ -301,13 +376,16 @@ public class ProjectPdfGenerator : IProjectPdfGenerator, ITransientDependency try { - var documentParamsDocument = await GetDocumentAsync(project, project.ParametersDocumentName, version, languageCode); - - if (!DocsJsonSerializerHelper.TryDeserialize(documentParamsDocument.Content, out var documentParams)) + var documentParamsDocument = + await GetDocumentAsync(project, project.ParametersDocumentName, version, languageCode); + + if (!DocsJsonSerializerHelper.TryDeserialize(documentParamsDocument.Content, + out var documentParams)) { - throw new UserFriendlyException($"Cannot validate document params file '{project.ParametersDocumentName}' for the project {project.Name}."); + throw new UserFriendlyException( + $"Cannot validate document params file '{project.ParametersDocumentName}' for the project {project.Name}."); } - + return documentParams; } catch (Exception e) @@ -316,25 +394,25 @@ public class ProjectPdfGenerator : IProjectPdfGenerator, ITransientDependency return new DocumentParams(); } } - + private async Task GetDocumentAsync( - Project project, + Project project, string documentName, string version, string languageCode) { version = string.IsNullOrWhiteSpace(version) ? project.LatestVersionBranchName : version; - + Document document = null; Exception firstException = null; - + var possibleNames = GetPossibleNames(documentName, project.Format); document = await DocumentRepository.FindAsync(project.Id, possibleNames, languageCode, version); if (document != null) { return document; } - + foreach (var name in possibleNames) { try @@ -349,15 +427,16 @@ public class ProjectPdfGenerator : IProjectPdfGenerator, ITransientDependency } } - if(document == null) + if (document == null) { throw firstException!; } return document; } - - private List GenerateAllParameterCombinations(List parameterKeys, Dictionary> parameters) + + private static List GenerateAllParameterCombinations(List parameterKeys, + Dictionary> parameters) { var parameterCombinations = new List(); @@ -365,7 +444,7 @@ public class ProjectPdfGenerator : IProjectPdfGenerator, ITransientDependency { return parameterCombinations; } - + GenerateCombinations(0, new DocumentRenderParameters()); return parameterCombinations; @@ -386,33 +465,35 @@ public class ProjectPdfGenerator : IProjectPdfGenerator, ITransientDependency } } - private static string GetDocumentId(string documentName, string format, DocumentRenderParameters parameters, bool isFirstCombinationDocument) + private static string GetDocumentId(string documentName, string format, DocumentRenderParameters parameters, + bool isFirstCombinationDocument) { - var id = documentName.Replace("." + format, string.Empty).Replace("/","-").Replace(" ", "-").ToLower(); - if (parameters != null && !isFirstCombinationDocument) - { - id = $"{id}{parameters.Select(x => $"{x.Key}_{x.Value}").JoinAsString("-")}"; - } - - return id; + var id = documentName.Replace("." + format, string.Empty).Replace("/", "-").Replace(" ", "-").ToLower(); + if (parameters != null && !isFirstCombinationDocument) + { + id = $"{id}{parameters.Select(x => $"{x.Key}_{x.Value}").JoinAsString("-")}"; + } + + return id; } - - private static string GetDocumentTitle(string title, DocumentRenderParameters parameters, DocumentParams documentParams) + + private static string GetDocumentTitle(string title, DocumentRenderParameters parameters, + DocumentParams documentParams) { if (parameters == null || parameters.Count <= 0) { return title; } - + var paramValues = parameters.Select(x => { var documentParam = documentParams.Parameters.FirstOrDefault(p => p.Name == x.Key); return $"{documentParam?.DisplayName ?? x.Key} : {documentParam?.Values[x.Value] ?? x.Value}"; }); - + return title.Trim() + $" ({string.Join(", ", paramValues)})"; } - + private static List GetPossibleNames(string originalDocumentName, string format) { var extension = Path.GetExtension(originalDocumentName); @@ -420,7 +501,7 @@ public class ProjectPdfGenerator : IProjectPdfGenerator, ITransientDependency { extension = "." + format; } - + if (!extension.Equals("." + format, StringComparison.OrdinalIgnoreCase)) { return [originalDocumentName]; @@ -430,33 +511,36 @@ public class ProjectPdfGenerator : IProjectPdfGenerator, ITransientDependency var titleCaseIndex = "Index." + format; var indexLength = lowerCaseIndex.Length; - var possibleNames = new List {originalDocumentName}; - if (originalDocumentName.EndsWith("/" + lowerCaseIndex, StringComparison.OrdinalIgnoreCase) || originalDocumentName.Equals(lowerCaseIndex, StringComparison.OrdinalIgnoreCase)) + var possibleNames = new List { originalDocumentName }; + if (originalDocumentName.EndsWith("/" + lowerCaseIndex, StringComparison.OrdinalIgnoreCase) || + originalDocumentName.Equals(lowerCaseIndex, StringComparison.OrdinalIgnoreCase)) { var indexPart = originalDocumentName.Right(indexLength); - var documentNameWithoutIndex = originalDocumentName.Left(originalDocumentName.Length - lowerCaseIndex.Length); + var documentNameWithoutIndex = + originalDocumentName.Left(originalDocumentName.Length - lowerCaseIndex.Length); - if(indexPart != lowerCaseIndex) + if (indexPart != lowerCaseIndex) { possibleNames.Add(documentNameWithoutIndex + lowerCaseIndex); } - if(indexPart != titleCaseIndex) + if (indexPart != titleCaseIndex) { possibleNames.Add(documentNameWithoutIndex + titleCaseIndex); } } else { - var documentNameWithoutExtension = RemoveFileExtensionFromPath(originalDocumentName, format).EnsureEndsWith('/'); + var documentNameWithoutExtension = + RemoveFileExtensionFromPath(originalDocumentName, format).EnsureEndsWith('/'); possibleNames.Add(documentNameWithoutExtension + lowerCaseIndex); possibleNames.Add(documentNameWithoutExtension + titleCaseIndex); } return possibleNames; } - + private static string RemoveFileExtensionFromPath(string path, string format) { if (path == null) diff --git a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Projects/Project.cs b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Projects/Project.cs index 69fa3a7056..03020494d8 100644 --- a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Projects/Project.cs +++ b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Projects/Project.cs @@ -1,7 +1,9 @@ using System; using System.Collections.Generic; +using System.Text; using JetBrains.Annotations; using Volo.Abp; +using Volo.Abp.Data; using Volo.Abp.Domain.Entities; namespace Volo.Docs.Projects @@ -126,5 +128,34 @@ namespace Volo.Docs.Projects PdfFiles.Remove(pdfFile); } } + + public virtual string GetFullVersion(string version) + { + var prefix = GetProjectVersionPrefixIfExist(this); + if (string.IsNullOrWhiteSpace(prefix) || version.StartsWith(prefix, StringComparison.OrdinalIgnoreCase)) + { + return version; + } + + var inputVersionStringBuilder = new StringBuilder(); + return inputVersionStringBuilder.Append(prefix).Append(version).ToString(); + } + + protected virtual string GetProjectVersionPrefixIfExist(Project project) + { + if (GetGithubVersionProviderSource(project) != GithubVersionProviderSource.Branches) + { + return string.Empty; + } + + return project.GetProperty("VersionBranchPrefix"); + } + + protected virtual GithubVersionProviderSource GetGithubVersionProviderSource(Project project) + { + return project.HasProperty("GithubVersionProviderSource") + ? project.GetProperty("GithubVersionProviderSource") + : GithubVersionProviderSource.Releases; + } } } diff --git a/modules/docs/src/Volo.Docs.HttpApi.Client/ClientProxies/Volo/Docs/Documents/DocsDocumentClientProxy.Generated.cs b/modules/docs/src/Volo.Docs.HttpApi.Client/ClientProxies/DocsDocumentClientProxy.Generated.cs similarity index 100% rename from modules/docs/src/Volo.Docs.HttpApi.Client/ClientProxies/Volo/Docs/Documents/DocsDocumentClientProxy.Generated.cs rename to modules/docs/src/Volo.Docs.HttpApi.Client/ClientProxies/DocsDocumentClientProxy.Generated.cs diff --git a/modules/docs/src/Volo.Docs.HttpApi.Client/ClientProxies/Volo/Docs/Documents/DocsDocumentClientProxy.cs b/modules/docs/src/Volo.Docs.HttpApi.Client/ClientProxies/DocsDocumentClientProxy.cs similarity index 100% rename from modules/docs/src/Volo.Docs.HttpApi.Client/ClientProxies/Volo/Docs/Documents/DocsDocumentClientProxy.cs rename to modules/docs/src/Volo.Docs.HttpApi.Client/ClientProxies/DocsDocumentClientProxy.cs diff --git a/modules/docs/src/Volo.Docs.HttpApi.Client/Volo.Docs.HttpApi.Client.abppkg b/modules/docs/src/Volo.Docs.HttpApi.Client/Volo.Docs.HttpApi.Client.abppkg index 7deef5e383..f32651686a 100644 --- a/modules/docs/src/Volo.Docs.HttpApi.Client/Volo.Docs.HttpApi.Client.abppkg +++ b/modules/docs/src/Volo.Docs.HttpApi.Client/Volo.Docs.HttpApi.Client.abppkg @@ -1,3 +1,15 @@ { - "role": "lib.http-api-client" + "role": "lib.http-api-client", + "proxies": { + "csharp": { + "VoloDocs.Web-docs": { + "applicationName": "VoloDocs.Web", + "module": "docs", + "url": "https://localhost:5001", + "folder": "ClientProxies", + "serviceType": "all", + "withoutContracts": true + } + } + } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Index.cshtml b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Index.cshtml index b856fff614..57a26bdbcb 100644 --- a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Index.cshtml +++ b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Index.cshtml @@ -31,7 +31,7 @@ {
  • - + @project.Name

    diff --git a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Index.cshtml.cs b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Index.cshtml.cs index baa440dccd..c00ebf32d6 100644 --- a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Index.cshtml.cs +++ b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Index.cshtml.cs @@ -43,5 +43,24 @@ namespace Volo.Docs.Pages.Documents return Page(); } + + public string GetUrlForProject(ProjectDto project = null, string language = "en", string version = null) + { + var routeValues = new Dictionary { + { nameof(Project.IndexModel.Version), version ?? DocsAppConsts.Latest } + }; + + if (!_uiOptions.SingleProjectMode.Enable) + { + routeValues.Add(nameof(Project.IndexModel.ProjectName), project?.ShortName); + } + + if (_uiOptions.MultiLanguageMode) + { + routeValues.Add(nameof(Project.IndexModel.LanguageCode), language); + } + + return Url.Page("/Documents/Project/Index", routeValues); + } } } diff --git a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml index e6a6f8470a..21d4aab5ac 100644 --- a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml +++ b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml @@ -291,12 +291,12 @@ id="sidebar-scroll" class="nav nav-list"> - @if (Model.HasDownloadPdfPermission) + @if (Model.HasDownloadPdf) { } } 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 471747fac1..8ffe5c4c7a 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 @@ -18,6 +18,7 @@ using Volo.Abp.Data; using Volo.Abp.Domain.Entities; using Volo.Abp.EventBus.Local; using Volo.Docs.Common; +using Volo.Docs.Common.Documents; using Volo.Docs.Common.Projects; using Volo.Docs.Documents; using Volo.Docs.Documents.Rendering; @@ -92,7 +93,7 @@ namespace Volo.Docs.Pages.Documents.Project public bool IsLatestVersion { get; private set; } - public bool HasDownloadPdfPermission { get; set; } + public bool HasDownloadPdf { get; set; } public DocumentNavigationsDto DocumentNavigationsDto { get; private set; } @@ -103,6 +104,7 @@ namespace Volo.Docs.Pages.Documents.Project private readonly IWebDocumentSectionRenderer _webDocumentSectionRenderer; private readonly DocsUiOptions _uiOptions; private readonly IPermissionChecker _permissionChecker; + private readonly IDocumentPdfAppService _documentPdfAppService; protected IDocsLinkGenerator DocsLinkGenerator => LazyServiceProvider.LazyGetRequiredService(); @@ -114,7 +116,8 @@ namespace Volo.Docs.Pages.Documents.Project IProjectAppService projectAppService, IOptions options, IWebDocumentSectionRenderer webDocumentSectionRenderer, - IPermissionChecker permissionChecker) + IPermissionChecker permissionChecker, + IDocumentPdfAppService documentPdfAppService) { ObjectMapperContext = typeof(DocsWebModule); @@ -123,6 +126,7 @@ namespace Volo.Docs.Pages.Documents.Project _projectAppService = projectAppService; _webDocumentSectionRenderer = webDocumentSectionRenderer; _permissionChecker = permissionChecker; + _documentPdfAppService = documentPdfAppService; _uiOptions = options.Value; LocalizationResourceType = typeof(DocsResource); @@ -152,7 +156,7 @@ namespace Volo.Docs.Pages.Documents.Project ShowProjectsCombobox = _uiOptions.ShowProjectsCombobox && !_uiOptions.SingleProjectMode.Enable; ShowProjectsComboboxLabel = ShowProjectsCombobox && _uiOptions.ShowProjectsComboboxLabel; FullSearchEnabled = await _documentAppService.FullSearchEnabledAsync(); - HasDownloadPdfPermission = await _permissionChecker.IsGrantedAsync(DocsCommonPermissions.Projects.PdfGeneration); + try { await SetProjectAsync(); @@ -210,6 +214,12 @@ namespace Volo.Docs.Pages.Documents.Project await SetNavigationAsync(); SetLanguageSelectListItems(); + HasDownloadPdf = await _permissionChecker.IsGrantedAsync(DocsCommonPermissions.Projects.PdfDownload) + && await _documentPdfAppService.ExistsAsync(new() + { + ProjectId = Project.Id, Version = LatestVersionInfo.IsSelected ? LatestVersionInfo.Version : Version, LanguageCode = DocumentLanguageCode + }); + return Page(); } 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 23eca169b5..d55d9f2ef9 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 @@ -421,5 +421,12 @@ var doc = doc || {}; return originalSet.call(this, key, value); }; + $('#DownloadPdfBtn').click(function () { + var url = $(this).data('url'); + if (url) { + window.open(url, '_blank'); + } + }); + }); })(jQuery); diff --git a/modules/docs/src/Volo.Docs.Web/Volo.Docs.Web.abppkg b/modules/docs/src/Volo.Docs.Web/Volo.Docs.Web.abppkg index 8f16736603..f25f6f3d3e 100644 --- a/modules/docs/src/Volo.Docs.Web/Volo.Docs.Web.abppkg +++ b/modules/docs/src/Volo.Docs.Web/Volo.Docs.Web.abppkg @@ -2,7 +2,18 @@ "role": "lib.mvc", "npmDependencies": { "@abp/docs": { - "version": "" + "version": "" + } + }, + "proxies": { + "Javascript": { + "VoloDocs.Web-docs": { + "applicationName": "VoloDocs.Web", + "module": "docs", + "url": "https://localhost:5001", + "output": "wwwroot/client-proxies/", + "serviceType": "application" + } } } } \ No newline at end of file diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/EditionFeatureManagementProvider.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/EditionFeatureManagementProvider.cs index 82c1c98cb9..f9de4cbd1f 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/EditionFeatureManagementProvider.cs +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/EditionFeatureManagementProvider.cs @@ -1,7 +1,9 @@ -using System.Security.Principal; +using System; +using System.Security.Principal; using System.Threading.Tasks; using Volo.Abp.DependencyInjection; using Volo.Abp.Features; +using Volo.Abp.MultiTenancy; using Volo.Abp.Security.Claims; namespace Volo.Abp.FeatureManagement; @@ -11,22 +13,58 @@ public class EditionFeatureManagementProvider : FeatureManagementProvider, ITran public override string Name => EditionFeatureValueProvider.ProviderName; protected ICurrentPrincipalAccessor PrincipalAccessor { get; } + protected ITenantStore TenantStore { get; } + protected ICurrentTenant CurrentTenant { get; } + protected string CurrentCompatibleProviderName { get; set; } public EditionFeatureManagementProvider( IFeatureManagementStore store, - ICurrentPrincipalAccessor principalAccessor) + ICurrentPrincipalAccessor principalAccessor, + ITenantStore tenantStore, + ICurrentTenant currentTenant) : base(store) { PrincipalAccessor = principalAccessor; + TenantStore = tenantStore; + CurrentTenant = currentTenant; } - protected override Task NormalizeProviderKeyAsync(string providerKey) + public override bool Compatible(string providerName) { - if (providerKey != null) + CurrentCompatibleProviderName = providerName; + return providerName == TenantFeatureValueProvider.ProviderName || base.Compatible(providerName); + } + + protected async override Task NormalizeProviderKeyAsync(string providerKey) + { + return (await FindEditionIdAsync(providerKey))?.ToString(); + } + + protected virtual async Task FindEditionIdAsync(string providerKey) + { + if (Guid.TryParse(providerKey, out var parsedEditionOrTenantId)) + { + if (CurrentCompatibleProviderName == TenantFeatureValueProvider.ProviderName) + { + var tenant = await TenantStore.FindAsync(parsedEditionOrTenantId); + if (tenant != null) + { + return tenant?.EditionId; + } + } + + return parsedEditionOrTenantId; + } + + if (CurrentTenant.Id.HasValue) { - return Task.FromResult(providerKey); + var tenant = await TenantStore.FindAsync(CurrentTenant.GetId()); + if (tenant != null) + { + return tenant?.EditionId; + } } - return Task.FromResult(PrincipalAccessor.Principal?.FindEditionId()?.ToString("N")); + return PrincipalAccessor.Principal?.FindEditionId(); } } diff --git a/modules/openiddict/app/OpenIddict.Demo.Server/package.json b/modules/openiddict/app/OpenIddict.Demo.Server/package.json index 367ececa5e..8bcd4ab173 100644 --- a/modules/openiddict/app/OpenIddict.Demo.Server/package.json +++ b/modules/openiddict/app/OpenIddict.Demo.Server/package.json @@ -3,6 +3,6 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "~9.2.0-rc.4" + "@abp/aspnetcore.mvc.ui.theme.basic": "~9.2.0" } } diff --git a/modules/openiddict/app/angular/package.json b/modules/openiddict/app/angular/package.json index bf85a461fb..5829ce8bfd 100644 --- a/modules/openiddict/app/angular/package.json +++ b/modules/openiddict/app/angular/package.json @@ -12,15 +12,15 @@ }, "private": true, "dependencies": { - "@abp/ng.account": "~9.2.0-rc.4", - "@abp/ng.components": "~9.2.0-rc.4", - "@abp/ng.core": "~9.2.0-rc.4", - "@abp/ng.oauth": "~9.2.0-rc.4", - "@abp/ng.identity": "~9.2.0-rc.4", - "@abp/ng.setting-management": "~9.2.0-rc.4", - "@abp/ng.tenant-management": "~9.2.0-rc.4", - "@abp/ng.theme.shared": "~9.2.0-rc.4", - "@abp/ng.theme.lepton-x": "~4.2.0-rc.4", + "@abp/ng.account": "~9.2.0", + "@abp/ng.components": "~9.2.0", + "@abp/ng.core": "~9.2.0", + "@abp/ng.oauth": "~9.2.0", + "@abp/ng.identity": "~9.2.0", + "@abp/ng.setting-management": "~9.2.0", + "@abp/ng.tenant-management": "~9.2.0", + "@abp/ng.theme.shared": "~9.2.0", + "@abp/ng.theme.lepton-x": "~4.2.0", "@angular/animations": "^15.0.1", "@angular/common": "^15.0.1", "@angular/compiler": "^15.0.1", @@ -36,7 +36,7 @@ "zone.js": "~0.11.4" }, "devDependencies": { - "@abp/ng.schematics": "~9.2.0-rc.4", + "@abp/ng.schematics": "~9.2.0", "@angular-devkit/build-angular": "^15.0.1", "@angular-eslint/builder": "~15.1.0", "@angular-eslint/eslint-plugin": "~15.1.0", diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Application.Contracts/Volo/Abp/PermissionManagement/IPermissionAppService.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Application.Contracts/Volo/Abp/PermissionManagement/IPermissionAppService.cs index 0b0dd59968..819d643a21 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Application.Contracts/Volo/Abp/PermissionManagement/IPermissionAppService.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Application.Contracts/Volo/Abp/PermissionManagement/IPermissionAppService.cs @@ -8,5 +8,7 @@ public interface IPermissionAppService : IApplicationService { Task GetAsync([NotNull] string providerName, [NotNull] string providerKey); + Task GetByGroupAsync([NotNull] string groupName, [NotNull] string providerName, [NotNull] string providerKey); + Task UpdateAsync([NotNull] string providerName, [NotNull] string providerKey, UpdatePermissionsDto input); } diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Application/Volo/Abp/PermissionManagement/PermissionAppService.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Application/Volo/Abp/PermissionManagement/PermissionAppService.cs index aa9bfe0029..28abc4d75b 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Application/Volo/Abp/PermissionManagement/PermissionAppService.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Application/Volo/Abp/PermissionManagement/PermissionAppService.cs @@ -33,6 +33,16 @@ public class PermissionAppService : ApplicationService, IPermissionAppService } public virtual async Task GetAsync(string providerName, string providerKey) + { + return await GetInternalAsync(null, providerName, providerKey); + } + + public virtual async Task GetByGroupAsync(string groupName, string providerName, string providerKey) + { + return await GetInternalAsync(groupName, providerName, providerKey); + } + + protected virtual async Task GetInternalAsync(string groupName, string providerName, string providerKey) { await CheckProviderPolicy(providerName); @@ -45,7 +55,7 @@ public class PermissionAppService : ApplicationService, IPermissionAppService var multiTenancySide = CurrentTenant.GetMultiTenancySide(); var permissionGroups = new List(); - foreach (var group in await PermissionDefinitionManager.GetGroupsAsync()) + foreach (var group in (await PermissionDefinitionManager.GetGroupsAsync()).WhereIf(!groupName.IsNullOrWhiteSpace(), x => x.Name == groupName)) { var groupDto = CreatePermissionGroupDto(group); var permissions = group.GetPermissionsWithChildren() @@ -108,7 +118,7 @@ public class PermissionAppService : ApplicationService, IPermissionAppService return result; } - protected virtual PermissionGrantInfoDto CreatePermissionGrantInfoDto(PermissionDefinition permission) + protected virtual PermissionGrantInfoDto CreatePermissionGrantInfoDto(PermissionDefinition permission) { return new PermissionGrantInfoDto { diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.HttpApi.Client/ClientProxies/Volo/Abp/PermissionManagement/PermissionsClientProxy.Generated.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.HttpApi.Client/ClientProxies/Volo/Abp/PermissionManagement/PermissionsClientProxy.Generated.cs index c89b505da2..2fe22472f0 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.HttpApi.Client/ClientProxies/Volo/Abp/PermissionManagement/PermissionsClientProxy.Generated.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.HttpApi.Client/ClientProxies/Volo/Abp/PermissionManagement/PermissionsClientProxy.Generated.cs @@ -26,6 +26,16 @@ public partial class PermissionsClientProxy : ClientProxyBase GetByGroupAsync(string groupName, string providerName, string providerKey) + { + return await RequestAsync(nameof(GetByGroupAsync), new ClientProxyRequestTypeValue + { + { typeof(string), groupName }, + { typeof(string), providerName }, + { typeof(string), providerKey } + }); + } + public virtual async Task UpdateAsync(string providerName, string providerKey, UpdatePermissionsDto input) { await RequestAsync(nameof(UpdateAsync), new ClientProxyRequestTypeValue diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.HttpApi.Client/ClientProxies/permissionManagement-generate-proxy.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.HttpApi.Client/ClientProxies/permissionManagement-generate-proxy.json index 2a57defab4..208271e67d 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.HttpApi.Client/ClientProxies/permissionManagement-generate-proxy.json +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.HttpApi.Client/ClientProxies/permissionManagement-generate-proxy.json @@ -4,6 +4,78 @@ "rootPath": "permissionManagement", "remoteServiceName": "AbpPermissionManagement", "controllers": { + "Volo.Abp.PermissionManagement.Integration.PermissionIntegrationController": { + "controllerName": "PermissionIntegration", + "controllerGroupName": "PermissionIntegration", + "isRemoteService": true, + "isIntegrationService": true, + "apiVersion": null, + "type": "Volo.Abp.PermissionManagement.Integration.PermissionIntegrationController", + "interfaces": [ + { + "type": "Volo.Abp.PermissionManagement.Integration.IPermissionIntegrationService", + "name": "IPermissionIntegrationService", + "methods": [ + { + "name": "IsGrantedAsync", + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "System.Collections.Generic.List`1[[Volo.Abp.PermissionManagement.IsGrantedRequest, Volo.Abp.PermissionManagement.Domain.Shared, Version=9.3.0.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib", + "type": "System.Collections.Generic.List", + "typeSimple": "[Volo.Abp.PermissionManagement.IsGrantedRequest]", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.ListResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.ListResultDto" + } + } + ] + } + ], + "actions": { + "IsGrantedAsyncByInput": { + "uniqueName": "IsGrantedAsyncByInput", + "name": "IsGrantedAsync", + "httpMethod": "GET", + "url": "integration-api/permission-management/permissions/is-granted", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "System.Collections.Generic.List`1[[Volo.Abp.PermissionManagement.IsGrantedRequest, Volo.Abp.PermissionManagement.Domain.Shared, Version=9.3.0.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib", + "type": "System.Collections.Generic.List", + "typeSimple": "[Volo.Abp.PermissionManagement.IsGrantedRequest]", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "System.Collections.Generic.List", + "typeSimple": "[Volo.Abp.PermissionManagement.IsGrantedRequest]", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.Abp.Application.Dtos.ListResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.ListResultDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.PermissionManagement.Integration.IPermissionIntegrationService" + } + } + }, "Volo.Abp.PermissionManagement.PermissionsController": { "controllerName": "Permissions", "controllerGroupName": "Permissions", @@ -41,6 +113,39 @@ "typeSimple": "Volo.Abp.PermissionManagement.GetPermissionListResultDto" } }, + { + "name": "GetByGroupAsync", + "parametersOnMethod": [ + { + "name": "groupName", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "providerName", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "providerKey", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "returnValue": { + "type": "Volo.Abp.PermissionManagement.GetPermissionListResultDto", + "typeSimple": "Volo.Abp.PermissionManagement.GetPermissionListResultDto" + } + }, { "name": "UpdateAsync", "parametersOnMethod": [ @@ -135,15 +240,15 @@ "allowAnonymous": null, "implementFrom": "Volo.Abp.PermissionManagement.IPermissionAppService" }, - "UpdateAsyncByProviderNameAndProviderKeyAndInput": { - "uniqueName": "UpdateAsyncByProviderNameAndProviderKeyAndInput", - "name": "UpdateAsync", - "httpMethod": "PUT", - "url": "api/permission-management/permissions", + "GetByGroupAsyncByGroupNameAndProviderNameAndProviderKey": { + "uniqueName": "GetByGroupAsyncByGroupNameAndProviderNameAndProviderKey", + "name": "GetByGroupAsync", + "httpMethod": "GET", + "url": "api/permission-management/permissions/by-group", "supportedVersions": [], "parametersOnMethod": [ { - "name": "providerName", + "name": "groupName", "typeAsString": "System.String, System.Private.CoreLib", "type": "System.String", "typeSimple": "string", @@ -151,7 +256,7 @@ "defaultValue": null }, { - "name": "providerKey", + "name": "providerName", "typeAsString": "System.String, System.Private.CoreLib", "type": "System.String", "typeSimple": "string", @@ -159,18 +264,18 @@ "defaultValue": null }, { - "name": "input", - "typeAsString": "Volo.Abp.PermissionManagement.UpdatePermissionsDto, Volo.Abp.PermissionManagement.Application.Contracts", - "type": "Volo.Abp.PermissionManagement.UpdatePermissionsDto", - "typeSimple": "Volo.Abp.PermissionManagement.UpdatePermissionsDto", + "name": "providerKey", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", "isOptional": false, "defaultValue": null } ], "parameters": [ { - "nameOnMethod": "providerName", - "name": "providerName", + "nameOnMethod": "groupName", + "name": "groupName", "jsonName": null, "type": "System.String", "typeSimple": "string", @@ -181,8 +286,8 @@ "descriptorName": "" }, { - "nameOnMethod": "providerKey", - "name": "providerKey", + "nameOnMethod": "providerName", + "name": "providerName", "jsonName": null, "type": "System.String", "typeSimple": "string", @@ -193,96 +298,101 @@ "descriptorName": "" }, { - "nameOnMethod": "input", - "name": "input", + "nameOnMethod": "providerKey", + "name": "providerKey", "jsonName": null, - "type": "Volo.Abp.PermissionManagement.UpdatePermissionsDto", - "typeSimple": "Volo.Abp.PermissionManagement.UpdatePermissionsDto", + "type": "System.String", + "typeSimple": "string", "isOptional": false, "defaultValue": null, "constraintTypes": null, - "bindingSourceId": "Body", + "bindingSourceId": "ModelBinding", "descriptorName": "" } ], "returnValue": { - "type": "System.Void", - "typeSimple": "System.Void" + "type": "Volo.Abp.PermissionManagement.GetPermissionListResultDto", + "typeSimple": "Volo.Abp.PermissionManagement.GetPermissionListResultDto" }, "allowAnonymous": null, "implementFrom": "Volo.Abp.PermissionManagement.IPermissionAppService" - } - } - }, - "Volo.Abp.PermissionManagement.Integration.PermissionIntegrationController": { - "controllerName": "PermissionIntegration", - "controllerGroupName": "PermissionIntegration", - "isRemoteService": true, - "isIntegrationService": true, - "apiVersion": null, - "type": "Volo.Abp.PermissionManagement.Integration.PermissionIntegrationController", - "interfaces": [ - { - "type": "Volo.Abp.PermissionManagement.Integration.IPermissionIntegrationService", - "name": "IPermissionIntegrationService", - "methods": [ - { - "name": "IsGrantedAsync", - "parametersOnMethod": [ - { - "name": "input", - "typeAsString": "System.Collections.Generic.List`1[[Volo.Abp.PermissionManagement.IsGrantedRequest, Volo.Abp.PermissionManagement.Domain.Shared, Version=7.4.0.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib", - "type": "System.Collections.Generic.List", - "typeSimple": "[Volo.Abp.PermissionManagement.IsGrantedRequest]", - "isOptional": false, - "defaultValue": null - } - ], - "returnValue": { - "type": "Volo.Abp.Application.Dtos.ListResultDto", - "typeSimple": "Volo.Abp.Application.Dtos.ListResultDto" - } - } - ] - } - ], - "actions": { - "IsGrantedAsyncByInput": { - "uniqueName": "IsGrantedAsyncByInput", - "name": "IsGrantedAsync", - "httpMethod": "GET", - "url": "integration-api/permission-management/permissions/is-granted", + }, + "UpdateAsyncByProviderNameAndProviderKeyAndInput": { + "uniqueName": "UpdateAsyncByProviderNameAndProviderKeyAndInput", + "name": "UpdateAsync", + "httpMethod": "PUT", + "url": "api/permission-management/permissions", "supportedVersions": [], "parametersOnMethod": [ + { + "name": "providerName", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "providerKey", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, { "name": "input", - "typeAsString": "System.Collections.Generic.List`1[[Volo.Abp.PermissionManagement.IsGrantedRequest, Volo.Abp.PermissionManagement.Domain.Shared, Version=7.4.0.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib", - "type": "System.Collections.Generic.List", - "typeSimple": "[Volo.Abp.PermissionManagement.IsGrantedRequest]", + "typeAsString": "Volo.Abp.PermissionManagement.UpdatePermissionsDto, Volo.Abp.PermissionManagement.Application.Contracts", + "type": "Volo.Abp.PermissionManagement.UpdatePermissionsDto", + "typeSimple": "Volo.Abp.PermissionManagement.UpdatePermissionsDto", "isOptional": false, "defaultValue": null } ], "parameters": [ + { + "nameOnMethod": "providerName", + "name": "providerName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "" + }, + { + "nameOnMethod": "providerKey", + "name": "providerKey", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "" + }, { "nameOnMethod": "input", "name": "input", "jsonName": null, - "type": "System.Collections.Generic.List", - "typeSimple": "[Volo.Abp.PermissionManagement.IsGrantedRequest]", + "type": "Volo.Abp.PermissionManagement.UpdatePermissionsDto", + "typeSimple": "Volo.Abp.PermissionManagement.UpdatePermissionsDto", "isOptional": false, "defaultValue": null, "constraintTypes": null, - "bindingSourceId": "ModelBinding", + "bindingSourceId": "Body", "descriptorName": "" } ], "returnValue": { - "type": "Volo.Abp.Application.Dtos.ListResultDto", - "typeSimple": "Volo.Abp.Application.Dtos.ListResultDto" + "type": "System.Void", + "typeSimple": "System.Void" }, "allowAnonymous": null, - "implementFrom": "Volo.Abp.PermissionManagement.Integration.IPermissionIntegrationService" + "implementFrom": "Volo.Abp.PermissionManagement.IPermissionAppService" } } } diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.HttpApi/Volo/Abp/PermissionManagement/PermissionsController.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.HttpApi/Volo/Abp/PermissionManagement/PermissionsController.cs index 28dab8da28..ff6d7e6128 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.HttpApi/Volo/Abp/PermissionManagement/PermissionsController.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.HttpApi/Volo/Abp/PermissionManagement/PermissionsController.cs @@ -22,6 +22,13 @@ public class PermissionsController : AbpControllerBase, IPermissionAppService return PermissionAppService.GetAsync(providerName, providerKey); } + [HttpGet] + [Route("by-group")] + public virtual Task GetByGroupAsync(string groupName, string providerName, string providerKey) + { + return PermissionAppService.GetByGroupAsync(groupName, providerName, providerKey); + } + [HttpPut] public virtual Task UpdateAsync(string providerName, string providerKey, UpdatePermissionsDto input) { diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/wwwroot/client-proxies/permissionManagement-proxy.js b/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/wwwroot/client-proxies/permissionManagement-proxy.js index ab0daefa90..a296877917 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/wwwroot/client-proxies/permissionManagement-proxy.js +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/wwwroot/client-proxies/permissionManagement-proxy.js @@ -18,6 +18,13 @@ }, ajaxParams)); }; + volo.abp.permissionManagement.permissions.getByGroup = function(groupName, providerName, providerKey, ajaxParams) { + return abp.ajax($.extend(true, { + url: abp.appPath + 'api/permission-management/permissions/by-group' + abp.utils.buildQueryString([{ name: 'groupName', value: groupName }, { name: 'providerName', value: providerName }, { name: 'providerKey', value: providerKey }]) + '', + type: 'GET' + }, ajaxParams)); + }; + volo.abp.permissionManagement.permissions.update = function(providerName, providerKey, input, ajaxParams) { return abp.ajax($.extend(true, { url: abp.appPath + 'api/permission-management/permissions' + abp.utils.buildQueryString([{ name: 'providerName', value: providerName }, { name: 'providerKey', value: providerKey }]) + '', diff --git a/modules/permission-management/test/Volo.Abp.PermissionManagement.Application.Tests/Volo/Abp/PermissionManagement/PermissionAppService_Tests.cs b/modules/permission-management/test/Volo.Abp.PermissionManagement.Application.Tests/Volo/Abp/PermissionManagement/PermissionAppService_Tests.cs index 52a68f60d3..11e9e8ca04 100644 --- a/modules/permission-management/test/Volo.Abp.PermissionManagement.Application.Tests/Volo/Abp/PermissionManagement/PermissionAppService_Tests.cs +++ b/modules/permission-management/test/Volo.Abp.PermissionManagement.Application.Tests/Volo/Abp/PermissionManagement/PermissionAppService_Tests.cs @@ -32,7 +32,7 @@ public class PermissionAppService_Tests : AbpPermissionManagementApplicationTest permissionListResultDto.ShouldNotBeNull(); permissionListResultDto.EntityDisplayName.ShouldBe(PermissionTestDataBuilder.User1Id.ToString()); - permissionListResultDto.Groups.Count.ShouldBe(1); + permissionListResultDto.Groups.Count.ShouldBe(2); permissionListResultDto.Groups.ShouldContain(x => x.Name == "TestGroup"); permissionListResultDto.Groups.First().Permissions.ShouldContain(x => x.Name == "MyPermission1"); @@ -50,11 +50,11 @@ public class PermissionAppService_Tests : AbpPermissionManagementApplicationTest result.Groups.First().Permissions.ShouldContain(x => x.Name == "MyPermission5"); result.Groups.First().Permissions.ShouldContain(x => x.Name == "MyPermission5.ChildPermission1"); } - + permissionListResultDto.Groups.First().Permissions.ShouldContain(x => x.Name == "MyPermission6"); permissionListResultDto.Groups.First().Permissions.ShouldNotContain(x => x.Name == "MyPermission6.ChildDisabledPermission1"); permissionListResultDto.Groups.First().Permissions.ShouldContain(x => x.Name == "MyPermission6.ChildPermission2"); - + permissionListResultDto.Groups.First().Permissions.ShouldNotContain(x => x.Name == "MyDisabledPermission1"); permissionListResultDto.Groups.First().Permissions.ShouldNotContain(x => x.Name == "MyDisabledPermission2"); permissionListResultDto.Groups.First().Permissions.ShouldNotContain(x => x.Name == "MyDisabledPermission2.ChildPermission1"); @@ -62,6 +62,21 @@ public class PermissionAppService_Tests : AbpPermissionManagementApplicationTest permissionListResultDto.Groups.First().Permissions.ShouldNotContain(x => x.Name == "MyDisabledPermission2.ChildPermission2.ChildPermission1"); } + [Fact] + public async Task GetByGroupAsync() + { + var permissionListResultDto = await _permissionAppService.GetByGroupAsync("TestGroup2", UserPermissionValueProvider.ProviderName, + PermissionTestDataBuilder.User1Id.ToString()); + + permissionListResultDto.ShouldNotBeNull(); + permissionListResultDto.EntityDisplayName.ShouldBe(PermissionTestDataBuilder.User1Id.ToString()); + permissionListResultDto.Groups.Count.ShouldBe(1); + permissionListResultDto.Groups.ShouldContain(x => x.Name == "TestGroup2"); + + permissionListResultDto.Groups.First().Permissions.ShouldContain(x => x.Name == "MyPermission7"); + permissionListResultDto.Groups.First().Permissions.ShouldContain(x => x.Name == "MyPermission8"); + } + [Fact] public async Task UpdateAsync() { diff --git a/modules/permission-management/test/Volo.Abp.PermissionManagement.TestBase/Volo/Abp/PermissionManagement/TestPermissionDefinitionProvider.cs b/modules/permission-management/test/Volo.Abp.PermissionManagement.TestBase/Volo/Abp/PermissionManagement/TestPermissionDefinitionProvider.cs index 55d034ad61..e644de8d71 100644 --- a/modules/permission-management/test/Volo.Abp.PermissionManagement.TestBase/Volo/Abp/PermissionManagement/TestPermissionDefinitionProvider.cs +++ b/modules/permission-management/test/Volo.Abp.PermissionManagement.TestBase/Volo/Abp/PermissionManagement/TestPermissionDefinitionProvider.cs @@ -22,14 +22,18 @@ public class TestPermissionDefinitionProvider : PermissionDefinitionProvider var myPermission5 = testGroup.AddPermission("MyPermission5"); myPermission5.StateCheckers.Add(new TestRequireRolePermissionStateProvider("super-admin")); myPermission5.AddChild("MyPermission5.ChildPermission1"); - + var myPermission6 = testGroup.AddPermission("MyPermission6"); myPermission6.AddChild("MyPermission6.ChildDisabledPermission1", isEnabled: false); myPermission6.AddChild("MyPermission6.ChildPermission2"); - + var myDisabledPermission2 = testGroup.AddPermission("MyDisabledPermission2", isEnabled: false); myDisabledPermission2.AddChild("MyDisabledPermission2.ChildPermission1"); var myDisabledPermission2Child2 = myDisabledPermission2.AddChild("MyDisabledPermission2.ChildPermission2"); myDisabledPermission2Child2.AddChild("MyDisabledPermission2.ChildPermission2.ChildPermission1"); + + var testGroup2 = context.AddGroup("TestGroup2"); + testGroup2.AddPermission("MyPermission7"); + testGroup2.AddPermission("MyPermission8"); } } diff --git a/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/package.json b/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/package.json index 38d2fecfdf..a155a90e38 100644 --- a/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/package.json +++ b/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/package.json @@ -3,6 +3,6 @@ "name": "demo-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "~9.2.0-rc.4" + "@abp/aspnetcore.mvc.ui.theme.basic": "~9.2.0" } } diff --git a/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/yarn.lock b/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/yarn.lock index 682f82ae14..6c8afa8deb 100644 --- a/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/yarn.lock +++ b/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/yarn.lock @@ -2,185 +2,185 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-9.2.0-rc.4.tgz#2659ec541028ec6a1688b748414fb181924f1f58" - integrity sha512-KSpfnvgRPxDb9oJWBnjpFm/FcXSTRO6aAVBlCERi4jtGzp04e//3rHnOWjv+JyxJqOP0JszWSALXK4A/oMQFNQ== +"@abp/aspnetcore.mvc.ui.theme.basic@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-9.2.0.tgz#af6ff5071cadb480b4aece0f15400d56b105a350" + integrity sha512-+LOmhSfsua7i3VQy9vYTDv7nE0fdIA+kNvorQ4wkkRzijOAlwmS4fkupglwOKJQSCWGAM7VXccPy2NzdmwvEtw== dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~9.2.0-rc.4" + "@abp/aspnetcore.mvc.ui.theme.shared" "~9.2.0" -"@abp/aspnetcore.mvc.ui.theme.shared@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-9.2.0-rc.4.tgz#4212523cc2d2db881d2a0a9c1b28f372c53c19d7" - integrity sha512-z6nCmIfcaiQ6CPHhVq0C6RYljjrqScVVj+Sf0uI8eP6qG+CVT/aEVgb+3Nc5EM5SjDvR/eTxH4J3YcVNDj32Lg== +"@abp/aspnetcore.mvc.ui.theme.shared@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-9.2.0.tgz#791f419e8e0fab229e3f93f7a90edcd259100206" + integrity sha512-Mrs+kQg0S5OyRsPBwXQTqOq2DBWDdot7emETcX/gatv26GFbRe3nTOk1E+VWD/nsxHEOKTSE8LClC6TgkMxD8Q== dependencies: - "@abp/aspnetcore.mvc.ui" "~9.2.0-rc.4" - "@abp/bootstrap" "~9.2.0-rc.4" - "@abp/bootstrap-datepicker" "~9.2.0-rc.4" - "@abp/bootstrap-daterangepicker" "~9.2.0-rc.4" - "@abp/datatables.net-bs5" "~9.2.0-rc.4" - "@abp/font-awesome" "~9.2.0-rc.4" - "@abp/jquery-form" "~9.2.0-rc.4" - "@abp/jquery-validation-unobtrusive" "~9.2.0-rc.4" - "@abp/lodash" "~9.2.0-rc.4" - "@abp/luxon" "~9.2.0-rc.4" - "@abp/malihu-custom-scrollbar-plugin" "~9.2.0-rc.4" - "@abp/moment" "~9.2.0-rc.4" - "@abp/select2" "~9.2.0-rc.4" - "@abp/sweetalert2" "~9.2.0-rc.4" - "@abp/timeago" "~9.2.0-rc.4" - -"@abp/aspnetcore.mvc.ui@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-9.2.0-rc.4.tgz#a47763a480e488363b901327d94556fdad6cccb7" - integrity sha512-7fxC3zifdnpJZwKsP1hgK0+mu9y/w4zrMY1rR8AVvcpMdt8/Mmtj6mJi+Ompv3YtO9F/Zgnxqma5R0pYMTke7g== + "@abp/aspnetcore.mvc.ui" "~9.2.0" + "@abp/bootstrap" "~9.2.0" + "@abp/bootstrap-datepicker" "~9.2.0" + "@abp/bootstrap-daterangepicker" "~9.2.0" + "@abp/datatables.net-bs5" "~9.2.0" + "@abp/font-awesome" "~9.2.0" + "@abp/jquery-form" "~9.2.0" + "@abp/jquery-validation-unobtrusive" "~9.2.0" + "@abp/lodash" "~9.2.0" + "@abp/luxon" "~9.2.0" + "@abp/malihu-custom-scrollbar-plugin" "~9.2.0" + "@abp/moment" "~9.2.0" + "@abp/select2" "~9.2.0" + "@abp/sweetalert2" "~9.2.0" + "@abp/timeago" "~9.2.0" + +"@abp/aspnetcore.mvc.ui@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-9.2.0.tgz#e3e703ea46caf04cc966ea0af6deb64427a90d4c" + integrity sha512-VHH68/7Bw7r8p70T9grnVISgYPe2t3m9199S/wAXGtpGHML/lbHhDflWbm7y1MHcrmCfaXy42O9SmTHV25BJhA== dependencies: ansi-colors "^4.1.3" -"@abp/bootstrap-datepicker@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-9.2.0-rc.4.tgz#0aec67332e3148e21658650bfaaa08c64180e2ad" - integrity sha512-CaD709aGigfQk76XDshSrctm9TkgjA+7XgnDuVraPRPwq4dwXGIhbNAiJ1+5k6OXrUHqJP3nPc4NDPZiXDwgqw== +"@abp/bootstrap-datepicker@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-9.2.0.tgz#271ff68e2cee7b4ffe5a60406561a05948d6bbe6" + integrity sha512-V8o1cn1MKXE5GH1ZpBHiWWilzxjHIp4IS6rNoCDBSnaQcVvRku9KPI8tPNQSf+4x3jBfHDV9aOBDbDGTQ6J2yw== dependencies: bootstrap-datepicker "^1.10.0" -"@abp/bootstrap-daterangepicker@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-9.2.0-rc.4.tgz#b08d564b0dfc8be62a052fc205e1445764b6a2d0" - integrity sha512-zwWkb6JaUqN2rtIGLtb0Cf1RtP0nuCFK0x2r4J9kYnv1vKiT8vrK2Jl5mJVjvdnO0JifS1rueDMPglVpOeghRw== +"@abp/bootstrap-daterangepicker@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-9.2.0.tgz#a239f8c2efce57d2e2beca70ceeede52d1b177d5" + integrity sha512-Cd9naCyepTvmUotkR1VyOBqUMgyeSXnOVWR7HxXm+jugKtnWRzrztZB6UyfnNzzjc1RMOyiAUEjzitKSJrXeoA== dependencies: bootstrap-daterangepicker "^3.1.0" -"@abp/bootstrap@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-9.2.0-rc.4.tgz#0615ec9fa7422d76e8f4af22ec28fe9672d60c38" - integrity sha512-m1ORR/R84nPEfid/x5rC5jy4orsw4yhkk4nApiW11H4Eb7ssbcviR75ugJ5GBt3GOevHHlTZWwvf8K4C+zdqZg== +"@abp/bootstrap@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-9.2.0.tgz#08859288b8372ea111a240b507047b144d6caca9" + integrity sha512-L3EZQza2c/5VmvZkLsf0EOuaMi8fseyyiwlFN65i1hpcDwhOLcaqnxMneeaSJ+Dy4xczJT+oBml9D9OSTuzmkA== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" bootstrap "^5.3.3" -"@abp/core@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-9.2.0-rc.4.tgz#b758ea117ae3e3e3596e407a347617b8fcb6c112" - integrity sha512-eNklBpyUAort/UEhgmnvMglBS/FSAzUiKalN7hgJFKx0nd3cDDkjkN6YFY8VuPInt3YfRz5omZQsGNq7eyjtbQ== +"@abp/core@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-9.2.0.tgz#db08fd34cfc891e94eb9e59ed3c0d0e6ef45c51a" + integrity sha512-3iESoHFj8I2xK81dwQVpCI6C1bc87VfWKyJE3/IUv4zWvG4QvI0aKhe1wxocmJqTjjowPUA3/fa2hvpfqPs2Bw== dependencies: - "@abp/utils" "~9.2.0-rc.4" + "@abp/utils" "~9.2.0" -"@abp/datatables.net-bs5@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-9.2.0-rc.4.tgz#75c12fe053d593b738bb5ca7394b2954409f5e00" - integrity sha512-5FG5Jc6Co9q/1xYmmW2SabSaXVkdJohPJ9XtzTthwnY8Ko5eGV7TPkEfwwsk0PLXp+Wu3ifQaZI4CIE9WR81XA== +"@abp/datatables.net-bs5@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-9.2.0.tgz#eab201c959727c27aaab30dc5bd8159249d8b54b" + integrity sha512-bmK6GKffXzYbfkDIlN27D7mohnYsXoODEiHqhZnBdIzeSJyHwrwRPRVbO1EcBn1SEBHjGJp3S69Z6gDbRs018g== dependencies: - "@abp/datatables.net" "~9.2.0-rc.4" + "@abp/datatables.net" "~9.2.0" datatables.net-bs5 "^2.1.8" -"@abp/datatables.net@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-9.2.0-rc.4.tgz#523b017e4b9ea9d3a6d3262f66bd3daaade05c0b" - integrity sha512-udCSjJYYpi/Ql/KJZxYDMxbtX6gXw7hsfMxQjP0u37JsyNLgd4fTrzaXCe7OKn3x7poJcANoqsEgWow/9R/WIg== +"@abp/datatables.net@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-9.2.0.tgz#e4880fe074d86d3c5dbd7f48c86244790fc376c2" + integrity sha512-bKaaa+tl0Pt4oNaV+X8pBbvsHc2mPYoL7yuAs+LN8ZLwBdsGoUw7RNhLQ63O3tuYdHuaHhI/mx23X6JThr0SYw== dependencies: - "@abp/jquery" "~9.2.0-rc.4" + "@abp/jquery" "~9.2.0" datatables.net "^2.1.8" -"@abp/font-awesome@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-9.2.0-rc.4.tgz#31d9fa475af3b543ddaff16e6af8caba966bd331" - integrity sha512-FYmfrf2mX5rzU+GqK078rn85UmfAwdCB8JQhnGfkylybMRJvmocRsPBIEThjlFZAPGqqvULHUTRMwnRPTgpuNw== +"@abp/font-awesome@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-9.2.0.tgz#3e359da2510cbc0e5b9e46e9cb3664baf285722e" + integrity sha512-HRGg6XK3bCxFdVvEBnBKyLamqMUrenj//E4JuKOs8DtGLVH0jTyh8TwUT5/E/pI+POV7HEOpv9WpSB2p8pfsAg== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" "@fortawesome/fontawesome-free" "^6.6.0" -"@abp/jquery-form@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-9.2.0-rc.4.tgz#b200be90031b58305a2ebfd646ffbd5ce4cca40c" - integrity sha512-ohCtIfz48E0+vNdNyKTsLlfW0NYMJfKWXd9BPp2szgBaDbC7jYdGYyABbxGxRc7mp1B8xQzRhLnTzdRtWaJemg== +"@abp/jquery-form@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-9.2.0.tgz#40fac992584c26e6c54f66e7f68f8abf8944a626" + integrity sha512-B7Shq1itQjsnzdU1kjLpGHWjkSGFhIM2iF5BNMkqcylG3Yq1Se4+8QPoJpn/soilmtX8gbO2fx8TOejfIazXIw== dependencies: - "@abp/jquery" "~9.2.0-rc.4" + "@abp/jquery" "~9.2.0" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-9.2.0-rc.4.tgz#0329f9268b83e0832e26ea3f6523dbc5226b9114" - integrity sha512-iOnw5YoiC3bCIFRjuXPagz+ixFV+PM36hP0UJ4x03BK6GDJnAvjLshYe6qnQG9Xnz1arzmIX5ud5EjWvWSBIoA== +"@abp/jquery-validation-unobtrusive@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-9.2.0.tgz#c2df51d024d48e71f0e7fb8d4207a8b2855393f4" + integrity sha512-c1cPfWVdo+gpaMoegAkw0DzGL2fy/1ylEi/shb95MAGt3iyECVx+X+R/XOxbVHKVI57D4d5IGj6cXYBhdKkvAw== dependencies: - "@abp/jquery-validation" "~9.2.0-rc.4" + "@abp/jquery-validation" "~9.2.0" jquery-validation-unobtrusive "^4.0.0" -"@abp/jquery-validation@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-9.2.0-rc.4.tgz#073e4cbf905f652ce83633b98696b559916b984d" - integrity sha512-pS2Y2c6gXFOzfKeM2/JlW56ZmrUeflT2av64aWrFYnv7IgJUp38PEjR10uPy3g/mP2c9jis8dOfkdbRrlHwf+g== +"@abp/jquery-validation@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-9.2.0.tgz#97688d2e3c25699d4368ebf7234e04943aa5e6ab" + integrity sha512-UO+T6SqXBrh0ODwvMm840CGbE2fdYNo5oqJL4V4JbHv9uz7MH+k0bB1DK7mFb94iDM7QcglLzIfcN4hLRV7arw== dependencies: - "@abp/jquery" "~9.2.0-rc.4" + "@abp/jquery" "~9.2.0" jquery-validation "^1.21.0" -"@abp/jquery@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-9.2.0-rc.4.tgz#ac8a6ce969d58cc4f05d33adcfad76e7442231e8" - integrity sha512-N5hZ8VGXJUn5QW1mSXHIO7SjdvoyrkCyH5j8DhXJO1mDlS1L36n+MJHFwQK7UZpHcFOuklAJ7f417r3sISOBCw== +"@abp/jquery@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-9.2.0.tgz#38c249be6eda0cdc899cc8a1f20e5152c39ae9a0" + integrity sha512-sIe3Zk+8549ytydCtDlECZ930PapW/2J0652two/sJwYG/SGUGxYQbw3QnJGFTcL9TFwcWwRj5iWX0gWrLEIyA== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" jquery "~3.7.1" -"@abp/lodash@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-9.2.0-rc.4.tgz#e428df195ed90414a9a412e1dcb6494344475f82" - integrity sha512-WsbyBNA57/giyI5pnM7Y7dk0p56hMDS5OMdmNilaGOWMnvz7mMTJNvStMBqS7fqekzfXsFGfrLbTmehY3pTYwQ== +"@abp/lodash@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-9.2.0.tgz#7fa4c9e956c766e34ec4677d2102a6d00f899a4b" + integrity sha512-2elXj/eWw875tF9ixbOm3uqXCxGaG5gL9Tub5k7cP+XhFpNBOYijNaXdN8SeDSxr83WDVWdrk//OQL8BF7XPdw== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" lodash "^4.17.21" -"@abp/luxon@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-9.2.0-rc.4.tgz#dacb173d24987a1ab4fb7e53dff9f91728a1efaa" - integrity sha512-qNuYml25Q2ODzZ830FhijGY66WvAUa02mB9hgulpFlF0p2UiFmhA0dMNVahEuytoFodjkSrhLP6cGfONf7ht8A== +"@abp/luxon@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-9.2.0.tgz#865db7b60dba4029134fb4a4b5eaa08c723dcea8" + integrity sha512-LWjczvzu1gFIq0/2fRz+bJW2+zsmXAmfz0I+lZ3wmqUdkViqAqwTa+5NMIl2tC92u4Dv3LGXKtH37Jw8m+XjTg== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" luxon "^3.5.0" -"@abp/malihu-custom-scrollbar-plugin@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-9.2.0-rc.4.tgz#9b0c0444ec8f11c8c8040387f83080e51a281657" - integrity sha512-cvYJI/4jkzOWSvTY0C/PxSq62SxEq3UlaXpefj/W+CAwPVjG+Yik2YHt5qgcmRRn0oF5V/XRJHB7A4H23+VKyA== +"@abp/malihu-custom-scrollbar-plugin@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-9.2.0.tgz#09722b1e7ca34b96e2a68368db0e96cdf9ab0e6c" + integrity sha512-kfDf/1RwGtAlos/7BW+7xbh3LtJ4VG0Z4mxS+b2HsywAwlt/kE5FltfBj2ResQb030bsGNl7A5JglV9Pv1UlPw== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/moment@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-9.2.0-rc.4.tgz#527ed54f4330a77ec2ea1411bfffe2d57e62d172" - integrity sha512-zIRTuMCcPAfJAU64DUeU7dJPUJqoyJ7TvHBhrUcmmGZK7IzNtaP3/KAGjZIHhHbUwIjidjCxlF2YnW1io7hcJg== +"@abp/moment@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-9.2.0.tgz#137d688af4df195742061ac2b8a2bf460a027071" + integrity sha512-15aTjYAxHK+upkiZ94XCe8CoSPKMl1D8f6GXJIfwPkuYZ+na4ma17qBu4P8bFsc4gu3ngxYiLHRSzYzr4oCSYQ== dependencies: moment "^2.30.1" -"@abp/select2@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-9.2.0-rc.4.tgz#6a8c6347ec75fcf60d76bc50ecca8008253fc7c7" - integrity sha512-OMyXr+gYMM81CQliqDVnEGsK2/WbmC4N5IZ1ZSJl+mW7cUClmyg9CLg418ID/7OU+ItUwbw9YvG4RPwnGF1ujw== +"@abp/select2@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-9.2.0.tgz#c96d869be0d3298ed7c0888288ea9829e6266cd4" + integrity sha512-V+qx9hw3oe7o0WbG03ZgAjbqRJPVuedzrdy7ExEdueTc6LRP/WEgbVpXhsNISObtouE6Dadwp3iXYSExgNUC6A== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" select2 "^4.0.13" -"@abp/sweetalert2@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-9.2.0-rc.4.tgz#26d4e9c935f20a7e0bde23327c6761fe6466cd41" - integrity sha512-zhwnA0WpkNO6JuqbBgO6PQ817wuThw6mtGcP96V1m/xtckJWNDub1gby0gJqnWqnq5Cuj4u9gPRkkcVmfPn8ZA== +"@abp/sweetalert2@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-9.2.0.tgz#826d6dd0b70c35a7401cc884fb1e82af99a0305d" + integrity sha512-0r338ayjaL9uzmLKE8oHpcMgJeVgVoMYfhQAPINeQHv1TPXuYCLo0aoRNoLsfmUo3ayYBBa3zOrugFIVis7Q6A== dependencies: - "@abp/core" "~9.2.0-rc.4" + "@abp/core" "~9.2.0" sweetalert2 "^11.14.1" -"@abp/timeago@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-9.2.0-rc.4.tgz#494b25062f14f8a139ed66958991d34fcf4023a3" - integrity sha512-6HoEkdQCYDxrEGSjxHXN2Vj5ipc3rIXTbCqj7dYI9K5tuaQ4Wq0Obz/Wx6UZ71ZjzGAeAQkDeXVc68GjQyLX6Q== +"@abp/timeago@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-9.2.0.tgz#79bbe6dd32b0ee7df2e8ebd05274a0ecc7882ba7" + integrity sha512-hEUi5re5N1YkDSpaUaUtXF1Mz4YyiEvNzVADbKRz11kbR4ZAFzcvVqsQLeNo7qnuFLfJNAtuzyjkuxwL75kmaA== dependencies: - "@abp/jquery" "~9.2.0-rc.4" + "@abp/jquery" "~9.2.0" timeago "^1.6.7" -"@abp/utils@~9.2.0-rc.4": - version "9.2.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-9.2.0-rc.4.tgz#350eb915af78ecdbc2a0a15a1ad4bac4212cefc2" - integrity sha512-PZzfkiq6sthX5+Icw7h3HVpnDVgN7ZnmOnIyzKhBeHALpH+JfO7QruwJl96Moba4LGmzPdFdLkwm2qznVoqyZA== +"@abp/utils@~9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-9.2.0.tgz#bf32ced1175e45fbe010c3cb806c7cd37f85089c" + integrity sha512-aciBuXhzlaqe+o7mNt536bCk425cmxY5BE0wwl13u3pX3LfWYWLEgwl8GS0aeI11TS1/7+1N85RJELyz/+y0hQ== dependencies: just-compare "^2.3.0" diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo/Abp/TenantManagement/AbpTenantManagementDomainMappingProfile.cs b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo/Abp/TenantManagement/AbpTenantManagementDomainMappingProfile.cs index 496095c807..6fe1edafc6 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo/Abp/TenantManagement/AbpTenantManagementDomainMappingProfile.cs +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo/Abp/TenantManagement/AbpTenantManagementDomainMappingProfile.cs @@ -28,7 +28,8 @@ public class AbpTenantManagementDomainMappingProfile : Profile return connStrings; }); }) - .ForMember(x => x.IsActive, x => x.Ignore()); + .ForMember(x => x.IsActive, x => x.Ignore()) + .ForMember(x => x.EditionId, x => x.Ignore()); CreateMap(); } diff --git a/modules/virtual-file-explorer/app/package.json b/modules/virtual-file-explorer/app/package.json index 55f5e8cf07..8218af60fc 100644 --- a/modules/virtual-file-explorer/app/package.json +++ b/modules/virtual-file-explorer/app/package.json @@ -3,7 +3,7 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "~9.2.0-rc.4", - "@abp/virtual-file-explorer": "~9.2.0-rc.4" + "@abp/aspnetcore.mvc.ui.theme.basic": "~9.2.0", + "@abp/virtual-file-explorer": "~9.2.0" } } diff --git a/npm/lerna.json b/npm/lerna.json index 76c12999c1..c0ef92d64e 100644 --- a/npm/lerna.json +++ b/npm/lerna.json @@ -1,5 +1,5 @@ { - "version": "9.2.0-rc.4", + "version": "9.2.0", "packages": [ "packs/*" ], diff --git a/npm/ng-packs/package.json b/npm/ng-packs/package.json index 8930406a56..92326eadb4 100644 --- a/npm/ng-packs/package.json +++ b/npm/ng-packs/package.json @@ -44,8 +44,8 @@ }, "private": true, "devDependencies": { - "@abp/ng.theme.lepton-x": "~4.2.0-rc.4", - "@abp/utils": "~9.2.0-rc.4", + "@abp/ng.theme.lepton-x": "~4.2.0", + "@abp/utils": "~9.2.0", "@angular-devkit/build-angular": "~19.1.0", "@angular-devkit/core": "~19.1.0", "@angular-devkit/schematics": "~19.1.0", diff --git a/npm/ng-packs/packages/account-core/package.json b/npm/ng-packs/packages/account-core/package.json index b472d6bf03..6cba82d222 100644 --- a/npm/ng-packs/packages/account-core/package.json +++ b/npm/ng-packs/packages/account-core/package.json @@ -1,14 +1,14 @@ { "name": "@abp/ng.account.core", - "version": "9.2.0-rc.4", + "version": "9.2.0", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.core": "~9.2.0-rc.4", - "@abp/ng.theme.shared": "~9.2.0-rc.4", + "@abp/ng.core": "~9.2.0", + "@abp/ng.theme.shared": "~9.2.0", "tslib": "^2.0.0" }, "publishConfig": { diff --git a/npm/ng-packs/packages/account/package.json b/npm/ng-packs/packages/account/package.json index 6c608b2245..fc34941743 100644 --- a/npm/ng-packs/packages/account/package.json +++ b/npm/ng-packs/packages/account/package.json @@ -1,14 +1,14 @@ { "name": "@abp/ng.account", - "version": "9.2.0-rc.4", + "version": "9.2.0", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.account.core": "~9.2.0-rc.4", - "@abp/ng.theme.shared": "~9.2.0-rc.4", + "@abp/ng.account.core": "~9.2.0", + "@abp/ng.theme.shared": "~9.2.0", "tslib": "^2.0.0" }, "publishConfig": { diff --git a/npm/ng-packs/packages/components/extensible/src/lib/components/extensible-table/extensible-table.component.html b/npm/ng-packs/packages/components/extensible/src/lib/components/extensible-table/extensible-table.component.html index cca0f284f9..85eb36ffee 100644 --- a/npm/ng-packs/packages/components/extensible/src/lib/components/extensible-table/extensible-table.component.html +++ b/npm/ng-packs/packages/components/extensible/src/lib/components/extensible-table/extensible-table.component.html @@ -3,8 +3,40 @@ [rows]="data" [count]="recordsTotal" [list]="list" + [selectionType]="selectable ? _selectionType : undefined" (activate)="tableActivate.emit($event)" + (select)="onSelect($event)" + [selected]="selected" > +@if(selectable) { + + + + @if (_selectionType !== 'single') { +
    + +
    + } +
    + + + @if(_selectionType === 'single') { +
    + +
    + } + @if (_selectionType !== 'single') { +
    + +
    + } +
    + +
    + } @if (actionsTemplate || (actionList.length && hasAtLeastOnePermittedAction)) { implements OnChanges, AfterViewIn @Output() tableActivate = new EventEmitter(); + @Input() selectable = false; + + @Input() set selectionType(value: SelectionType | string) { + this._selectionType = typeof value === 'string' ? SelectionType[value] : value; + } + _selectionType: SelectionType = SelectionType.multiClick; + + + @Input() selected: any[] = []; + @Output() selectionChange = new EventEmitter(); + hasAtLeastOnePermittedAction: boolean; readonly columnWidths!: number[]; @@ -225,6 +236,12 @@ export class ExtensibleTableComponent implements OnChanges, AfterViewIn return visibleActions.length > 0; } + onSelect({ selected }) { + this.selected.splice(0, this.selected.length); + this.selected.push(...selected); + this.selectionChange.emit(selected); + } + ngAfterViewInit(): void { this.list?.requestStatus$?.pipe(filter(status => status === 'loading')).subscribe(() => { this.data = []; diff --git a/npm/ng-packs/packages/components/extensible/src/lib/components/multi-select/extensible-form-multiselect.component.ts b/npm/ng-packs/packages/components/extensible/src/lib/components/multi-select/extensible-form-multiselect.component.ts index d55d55614d..96860b31b4 100644 --- a/npm/ng-packs/packages/components/extensible/src/lib/components/multi-select/extensible-form-multiselect.component.ts +++ b/npm/ng-packs/packages/components/extensible/src/lib/components/multi-select/extensible-form-multiselect.component.ts @@ -1,8 +1,9 @@ import { Component, ChangeDetectionStrategy, forwardRef, input } from '@angular/core'; import { NG_VALUE_ACCESSOR, ControlValueAccessor, ReactiveFormsModule } from '@angular/forms'; import { CommonModule } from '@angular/common'; -import { ABP, LocalizationModule } from '@abp/ng.core'; +import { ABP, LocalizationPipe } from '@abp/ng.core'; import { FormProp } from '../../models/form-props'; +import { NgxValidateCoreModule } from '@ngx-validate/core'; const EXTENSIBLE_FORM_MULTI_SELECT_CONTROL_VALUE_ACCESSOR = { provide: NG_VALUE_ACCESSOR, @@ -19,21 +20,24 @@ const EXTENSIBLE_FORM_MULTI_SELECT_CONTROL_VALUE_ACCESSOR = { - @if (prop().isExtra) { - {{ '::' + option.key | abpLocalization }} - } @else { - {{ option.key }} - } + } `, providers: [EXTENSIBLE_FORM_MULTI_SELECT_CONTROL_VALUE_ACCESSOR], - imports: [LocalizationModule, CommonModule, ReactiveFormsModule], + imports: [LocalizationPipe, CommonModule, ReactiveFormsModule, NgxValidateCoreModule], changeDetection: ChangeDetectionStrategy.OnPush, }) export class ExtensibleFormMultiselectComponent implements ControlValueAccessor { diff --git a/npm/ng-packs/packages/components/package.json b/npm/ng-packs/packages/components/package.json index f41162f25e..5c20f29f33 100644 --- a/npm/ng-packs/packages/components/package.json +++ b/npm/ng-packs/packages/components/package.json @@ -1,14 +1,14 @@ { "name": "@abp/ng.components", - "version": "9.2.0-rc.4", + "version": "9.2.0", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "peerDependencies": { - "@abp/ng.core": ">=9.2.0-rc.4", - "@abp/ng.theme.shared": ">=9.2.0-rc.4" + "@abp/ng.core": ">=9.2.0", + "@abp/ng.theme.shared": ">=9.2.0" }, "dependencies": { "chart.js": "^3.5.1", diff --git a/npm/ng-packs/packages/components/tree/src/lib/components/tree.component.html b/npm/ng-packs/packages/components/tree/src/lib/components/tree.component.html index 82b3048868..8cd2058699 100644 --- a/npm/ng-packs/packages/components/tree/src/lib/components/tree.component.html +++ b/npm/ng-packs/packages/components/tree/src/lib/components/tree.component.html @@ -12,7 +12,7 @@ (nzCheckboxChange)="onCheckboxChange($event)" (nzOnDrop)="onDrop($event)" [nzNoAnimation]="noAnimation" - (nzContextMenu)="dropdowns[$event.node?.key]?.toggle()" + (nzContextMenu)="onContextMenuChange($event)" />
    { + if (key !== dropdownKey && dropdown?.isOpen()) { + dropdown.close(); + } + }); + this.dropdowns[dropdownKey]?.toggle(); + } + setSelectedNode(node: any) { const newSelectedNode = this.findNode(node, this.nodes); this.selectedNode = { ...newSelectedNode }; diff --git a/npm/ng-packs/packages/core/package.json b/npm/ng-packs/packages/core/package.json index 38e96fd0f4..52b51d5bb6 100644 --- a/npm/ng-packs/packages/core/package.json +++ b/npm/ng-packs/packages/core/package.json @@ -1,13 +1,13 @@ { "name": "@abp/ng.core", - "version": "9.2.0-rc.4", + "version": "9.2.0", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/utils": "~9.2.0-rc.4", + "@abp/utils": "~9.2.0", "just-clone": "^6.0.0", "just-compare": "^2.0.0", "ts-toolbelt": "^9.0.0", diff --git a/npm/ng-packs/packages/feature-management/package.json b/npm/ng-packs/packages/feature-management/package.json index 33c2d44259..cb2b921f24 100644 --- a/npm/ng-packs/packages/feature-management/package.json +++ b/npm/ng-packs/packages/feature-management/package.json @@ -1,13 +1,13 @@ { "name": "@abp/ng.feature-management", - "version": "9.2.0-rc.4", + "version": "9.2.0", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.theme.shared": "~9.2.0-rc.4", + "@abp/ng.theme.shared": "~9.2.0", "tslib": "^2.0.0" }, "publishConfig": { diff --git a/npm/ng-packs/packages/feature-management/src/lib/components/feature-management/feature-management.component.html b/npm/ng-packs/packages/feature-management/src/lib/components/feature-management/feature-management.component.html index b5dc440c76..a81444e56c 100644 --- a/npm/ng-packs/packages/feature-management/src/lib/components/feature-management/feature-management.component.html +++ b/npm/ng-packs/packages/feature-management/src/lib/components/feature-management/feature-management.component.html @@ -28,6 +28,10 @@
    @for (feature of features[group.name]; track feature.id || i; let i = $index) { + @let provider = feature.provider.name; + @let isFeatureDisabled = + provider !== providerName && provider !== defaultProviderName; +
    @switch (feature.valueType?.name) { @case (valueTypes.ToggleStringValueType) { @@ -38,11 +42,15 @@ [id]="feature.name" [(ngModel)]="feature.value" (ngModelChange)="onCheckboxClick($event, feature)" + [disabled]="isFeatureDisabled" /> - + - + - +