diff --git a/.github/workflows/angular.yml b/.github/workflows/angular.yml index 0c0f8d5b6c..ee66fbcf2c 100644 --- a/.github/workflows/angular.yml +++ b/.github/workflows/angular.yml @@ -10,8 +10,17 @@ on: branches: - 'rel-*' - 'dev' + types: + - opened + - synchronize + - reopened + - ready_for_review +permissions: + contents: read + jobs: build-test-lint: + if: ${{ !github.event.pull_request.draft }} runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 diff --git a/.github/workflows/auto-pr.yml b/.github/workflows/auto-pr.yml index 084b0977d0..1d9a8750e6 100644 --- a/.github/workflows/auto-pr.yml +++ b/.github/workflows/auto-pr.yml @@ -1,10 +1,16 @@ -name: Merge branch dev with rel-5.3 +name: Merge branch dev with rel-6.0 on: push: branches: - - rel-5.3 + - rel-6.0 +permissions: + contents: read + jobs: - merge-rel-5-3-with-rel-5-2: + merge-dev-with-rel-6-0: + 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 runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 @@ -12,13 +18,13 @@ jobs: ref: dev - name: Reset promotion branch run: | - git fetch origin rel-5.3:rel-5.3 - git reset --hard rel-5.3 + git fetch origin rel-6.0:rel-6.0 + git reset --hard rel-6.0 - name: Create Pull Request uses: peter-evans/create-pull-request@v3 with: - branch: auto-merge/rel-5-3/${{github.run_number}} - title: Merge branch dev with rel-5.3 - body: This PR generated automatically to merge dev with rel-5.3. Please review the changed files before merging to prevent any errors that may occur. + branch: auto-merge/rel-6-0/${{github.run_number}} + title: Merge branch dev with rel-6.0 + body: This PR generated automatically to merge dev with rel-6.0. Please review the changed files before merging to prevent any errors that may occur. reviewers: ${{github.actor}} token: ${{ github.token }} diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index 0210efcec9..4a993352ba 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -31,9 +31,18 @@ on: - 'templates/**/*.cshtml' - 'templates/**/*.csproj' - 'templates/**/*.razor' + types: + - opened + - synchronize + - reopened + - ready_for_review +permissions: + contents: read + jobs: build-test: runs-on: windows-latest + if: ${{ !github.event.pull_request.draft }} steps: - uses: actions/checkout@v2 - uses: actions/setup-dotnet@master diff --git a/.github/workflows/cancel-workflow.yml b/.github/workflows/cancel-workflow.yml index 78bbf94b3b..039943ad66 100644 --- a/.github/workflows/cancel-workflow.yml +++ b/.github/workflows/cancel-workflow.yml @@ -1,7 +1,12 @@ name: cancel-workflow on: [push] +permissions: + contents: read + jobs: cancel: + permissions: + actions: write # for styfle/cancel-workflow-action to cancel/stop running workflows name: 'Cancel Previous Runs' runs-on: ubuntu-latest timeout-minutes: 3 diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 7aaad739e9..d1f6c0c503 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -9,23 +9,36 @@ on: push: branches: [dev, rel-*] paths: - - 'abp/**/*.js' - - 'abp/**/*.cs' - - 'abp/**/*.cshtml' - - 'abp/**/*.csproj' - - 'abp/**/*.razor' + - "abp/**/*.js" + - "abp/**/*.cs" + - "abp/**/*.cshtml" + - "abp/**/*.csproj" + - "abp/**/*.razor" pull_request: # The branches below must be a subset of the branches above branches: [dev] paths: - - 'abp/**/*.js' - - 'abp/**/*.cs' - - 'abp/**/*.cshtml' - - 'abp/**/*.csproj' - - 'abp/**/*.razor' + - "abp/**/*.js" + - "abp/**/*.cs" + - "abp/**/*.cshtml" + - "abp/**/*.csproj" + - "abp/**/*.razor" + types: + - opened + - synchronize + - reopened + - ready_for_review + +permissions: + contents: read jobs: analyze: + if: ${{ !github.event.pull_request.draft }} + permissions: + actions: read # for github/codeql-action/init to get workflow details + contents: read # for actions/checkout to fetch code + security-events: write # for github/codeql-action/autobuild to send a status report name: Analyze runs-on: ubuntu-latest @@ -34,48 +47,48 @@ jobs: matrix: # Override automatic language detection by changing the below list # Supported options are ['csharp', 'cpp', 'go', 'java', 'javascript', 'python'] - language: ['csharp', 'javascript'] + language: ["csharp", "javascript"] # Learn more... # https://docs.github.com/en/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#overriding-automatic-language-detection steps: - - name: Checkout repository - uses: actions/checkout@v2 - with: - # We must fetch at least the immediate parents so that if this is - # a pull request then we can checkout the head. - fetch-depth: 2 + - name: Checkout repository + uses: actions/checkout@v2 + with: + # We must fetch at least the immediate parents so that if this is + # a pull request then we can checkout the head. + fetch-depth: 2 - # If this run was triggered by a pull request event, then checkout - # the head of the pull request instead of the merge commit. - - run: git checkout HEAD^2 - if: ${{ github.event_name == 'pull_request' }} + # If this run was triggered by a pull request event, then checkout + # the head of the pull request instead of the merge commit. + - run: git checkout HEAD^2 + if: ${{ github.event_name == 'pull_request' }} - # Initializes the CodeQL tools for scanning. - - name: Initialize CodeQL - uses: github/codeql-action/init@v1 - with: - languages: ${{ matrix.language }} - # If you wish to specify custom queries, you can do so here or in a config file. - # By default, queries listed here will override any specified in a config file. - # Prefix the list here with "+" to use these queries and those in the config file. - # queries: ./path/to/local/query, your-org/your-repo/queries@main + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v1 + with: + languages: ${{ matrix.language }} + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. + # queries: ./path/to/local/query, your-org/your-repo/queries@main - # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). - # If this step fails, then you should remove it and run the build manually (see below) - - name: Autobuild - uses: github/codeql-action/autobuild@v1 + # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). + # If this step fails, then you should remove it and run the build manually (see below) + - name: Autobuild + uses: github/codeql-action/autobuild@v1 - # ℹ️ Command-line programs to run using the OS shell. - # 📚 https://git.io/JvXDl + # ℹ️ Command-line programs to run using the OS shell. + # 📚 https://git.io/JvXDl - # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines - # and modify them (or add more) to build your code if your project - # uses a compiled language + # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines + # and modify them (or add more) to build your code if your project + # uses a compiled language - #- run: | - # make bootstrap - # make release + #- run: | + # make bootstrap + # make release - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v1 + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v1 diff --git a/.github/workflows/image-compression.yml b/.github/workflows/image-compression.yml index 9cbaa00d90..4556622e4a 100644 --- a/.github/workflows/image-compression.yml +++ b/.github/workflows/image-compression.yml @@ -1,21 +1,26 @@ -name: Compress Images -on: - pull_request: - paths: - - '**.jpg' - - '**.jpeg' - - '**.png' - - '**.webp' -jobs: - build: - if: github.event.pull_request.head.repo.full_name == github.repository - name: calibreapp/image-actions - runs-on: ubuntu-latest - steps: - - name: Checkout Repo - uses: actions/checkout@v2 - - - name: Compress Images - uses: calibreapp/image-actions@main - with: - githubToken: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file +name: Compress Images +on: + pull_request: + paths: + - "**.jpg" + - "**.jpeg" + - "**.png" + - "**.webp" + types: + - opened + - synchronize + - reopened + - ready_for_review +jobs: + build: + if: github.event.pull_request.head.repo.full_name == github.repository && !github.event.pull_request.draft + name: calibreapp/image-actions + runs-on: ubuntu-latest + steps: + - name: Checkout Repo + uses: actions/checkout@v2 + + - name: Compress Images + uses: calibreapp/image-actions@main + with: + githubToken: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml index f24ba57949..5c464400cc 100644 --- a/.github/workflows/labeler.yml +++ b/.github/workflows/labeler.yml @@ -2,8 +2,12 @@ name: Pull request labeler on: schedule: - cron: '0 12 */1 * *' +permissions: + contents: read jobs: labeler: + permissions: + pull-requests: write runs-on: ubuntu-latest steps: - uses: paulfantom/periodic-labeler@master diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Account/Localization/Resources/zh-Hans.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Account/Localization/Resources/zh-Hans.json index e790ad80af..a773568a31 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Account/Localization/Resources/zh-Hans.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Account/Localization/Resources/zh-Hans.json @@ -11,6 +11,6 @@ "CommercialSupportWebSite": "商业版支持网站", "CommunityWebSite": "ABP社区网站", "ManageAccount": "我的帐户 | ABP.IO", - "ManageYourAccount": "管理您的帐户" + "ManageYourProfile": "管理您的个人资料" } -} +} \ No newline at end of file diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json index 22ef0df894..7a064a8ce7 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json @@ -397,6 +397,8 @@ "BookDiscountDeletionConfirmationMessage": "Are you sure you want to delete this book discount?", "CustomPaymentFlexSwitchDescription": "With license", "AllowFeatureUpgradeOnLicenseExpire": "Allow feature upgrade on license expire", - "Deleted{0}": "[Deleted {0}]" + "Deleted{0}": "[Deleted {0}]", + "Tags": "Tags", + "SetTagsInfo": "Tags should be comma-separated. Eg: CSharp, Entity Framework" } } diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/ro-RO.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/ro-RO.json index 44ac964263..409ab816a5 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/ro-RO.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/ro-RO.json @@ -30,7 +30,7 @@ "NugetPackageDeletionWarningMessage": "Sunteţi sigur(ă) că doriţi să ştergeţi acest pachet de tip Nuget?", "ModuleDeletionWarningMessage": "Sunteţi sigur(ă) că doriţi să ştergeţi acest modul?", "Name": "Nume", - "DisplayName": "Nume de afişare", + "DisplayName": "Nume afişat", "ShortDescription": "Descriere scurtă", "NameFilter": "Nume", "CreationTime": "Data şi ora creării", @@ -317,7 +317,7 @@ "TrialLicenseStartDateFilter": "Data de început", "TrialLicenseEndDateFilter": "Data de încheiere", "FirsName": "Nume", - "LastName": "Nume", + "LastName": "Nume de familie", "StartDate": "Data de început", "EndDate": "Data de încheiere", "PurchasedDate": "Data achiziției", @@ -350,4 +350,4 @@ "Volo.AbpIo.Commercial:030010": "Pentru a achiziționa licența de probă, mai întâi trebuie să vă activați licența de probă!", "Volo.AbpIo.Commercial:030011": "Nu puteți șterge o licență de probă atunci când este achiziționată!" } -} \ No newline at end of file +} diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json index 382d31dd5d..b0555bfe32 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json @@ -73,6 +73,7 @@ "DeveloperFocused": "Developer Focused", "ShareYourExperiences": "Share your experiences with the ABP Framework", "LatestPosts": "Latest Posts", + "LatestVideos": "Latest Videos", "Views": "Views", "LearnLatestNewsAboutABPFramework": "Get information about happenings in ABP like new releases, free sources, posts, and more.", "DeveloperTools": "Developer Tools", @@ -98,6 +99,7 @@ "Logout": "Logout", "Home": "Home", "Posts": "Posts", + "Videos": "Videos", "JoinTheABPCommunity": "Join the ABP Community", "SubmitYourPost": "Submit Your Post", "Modules": "Modules", @@ -161,6 +163,22 @@ "Error_Page_500_Title": "Looks like something went wrong!", "Error_Page_500_Description_1": "We track these errors automatically, but if the problem persists feel free to
contact us. In the meantime, try refreshing.", "Error_Page_500_Description_2": "Contact with us at info@abp.io.", - "Books": "Books" + "Books": "Books", + "ABPDiscordServer": "ABP Discord Server", + "ABPCommunityTalks": "ABP Community Talks", + "ABPCommunityPosts": "ABP Community Posts", + "BuyAndGetMonths": "BUY 12 MONTHS, GET 14 MONTHS!", + "GetYourDeal": "Get Your Deal", + "BuyOrRenewLicense": "Buy or Renew License Now and Get 2 Extra Months!", + "BuyOrRenewLicenseToGetExtra2Months": "Buy or Renew License Now and Get 2 Extra Months! HURRY UP! ⏰ Last Day: {0}", + "HurryUp": "HURRY UP!", + "LastDay": "Last Day: {0}", + "BuyNewLicenseBetweenDatesToGetBenefit": "Buy a new license between {0} and {1} to get benefit for extra 2 months!", + "CheckAllCommunityTalks": "Check All Community Posts", + "ReadMore": "Read More", + "Post": "Post", + "ExploreTheContentsCreatedByTheCoreABPTeamAndTheABPCommunity": "Explore the contents created by the core ABP team and the ABP community.", + "WelcomeFallCampaign": "Welcome Fall Campaign!", + "GiveAwayForNewPurchases": "Application Development Classroom Training will be given away for the new purchases!" } } diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/tr.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/tr.json index 818b4cab5e..1eedb98c61 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/tr.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/tr.json @@ -39,6 +39,8 @@ "TrialLicensePeriodHasExpired": "Deneme lisansınızın süresi {0} gün önce sona erdi.", "TrialLicensePeriodWillExpire": "Deneme lisansınızın süresi {0} gün içinde dolacak.", "TrialLicensePeriodExpireToday": "Deneme lisans süreniz bugün sona erecek.", - "PurchaseNow": "Şimdi satın al!" + "PurchaseNow": "Şimdi satın al!", + "WelcomeFallCampaign": "Hoş Geldin Sonbahar Kampanyası!", + "GiveAwayForNewPurchases": "Yeni alımlar için Uygulama Geliştirme Sınıfı Eğitimi hediye edilecektir!" } } \ No newline at end of file diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/zh-Hans.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/zh-Hans.json index 01335e7921..e1ad37704f 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/zh-Hans.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/zh-Hans.json @@ -14,6 +14,20 @@ "Volo.AbpIo.Domain:020002": "不能删除该NPM包因为\"{Modules}\"模块正在使用此包.", "Volo.AbpIo.Domain:020003": "不能删除该NPM包因为\"{Modules}\"模块正在使用此包并且\"{NugetPackages}\"Nuget包依赖此包.", "Volo.AbpIo.Domain:020004": "不能删除该Nuget包因为\"{Modules}\"模块正在使用此包.", + "Volo.AbpIo.Domain:030000": "您已经完成了试用期。", + "Volo.AbpIo.Domain:030001": "此组织名称已存在。", + "Volo.AbpIo.Domain:030002": "一旦激活,您将无法将试用许可证切换到 -requested- 状态!", + "Volo.AbpIo.Domain:030003": "没有这种状态!", + "Volo.AbpIo.Domain:030004": "由于意外错误,无法更改状态!", + "Volo.AbpIo.Domain:030005": "试用许可证处于激活状态时可以更新开始和结束日期!", + "Volo.AbpIo.Domain:030006": "结束日期必须大于开始日期!", + "Volo.AbpIo.Domain:030007": "此试用许可证已激活!", + "Volo.AbpIo.Domain:030008": "只有状态为-purchased-时才能设置购买日期!", + "Volo.AbpIo.Domain:030009": "找不到用户!", + "Volo.AbpIo.Domain:030010": "要购买试用许可证,您首先需要激活您的试用许可证!", + "Volo.AbpIo.Domain:030011": "购买后不能删除试用许可证!", + "Volo.AbpIo.Domain:070000": "组织名称只能包含拉丁字母、数字、点和连字符!", + "Volo.AbpIo.Domain:070001": "公司名称只能包含拉丁字母、数字、点、空格和连字符!", "WantToLearn?": "想学习吗?", "ReadyToGetStarted?": "准备开始了吗?", "JoinOurCommunity": "加入我们的社区", @@ -39,6 +53,129 @@ "TrialLicensePeriodHasExpired": "您的试用许可期限已于 {0} 天前到期。", "TrialLicensePeriodWillExpire": "您的试用许可期限将在 {0} 天后到期。", "TrialLicensePeriodExpireToday": "您的试用许可期将于今天到期。", - "PurchaseNow": "现在买!" + "PurchaseNow": "现在买!", + "LatestReleaseLogs": "最新发布日志", + "RoadMap": "路线图", + "FAQ": "常见问题", + "SourceCode": "源代码", + "SeeAllPosts": "查看所有帖子", + "Contribute": "贡献", + "LiveDemo": "在线演示", + "GetLicense": "获得许可证", + "OpenSource": "开源", + "WebApplication": "Web应用程序", + "MeetTheABP": "认识 ABP", + "CompleteWebDevelopment": "一个完整的 Web 开发", + "Platform": "平台", + "ABPDescription": "ABP 框架是一个完整的基础架构,可通过遵循软件开发最佳实践和约定来创建现代 Web 应用程序。", + "StrongInfrastructure": "强大的基础设施", + "CompleteArchitecture": "完整的架构", + "DeveloperFocused": "以开发者为中心", + "ShareYourExperiences": "分享您使用 ABP 框架的经验", + "LatestPosts": "最新的帖子", + "LatestVideos": "最新的视频", + "Views": "意见", + "LearnLatestNewsAboutABPFramework": "获取有关 ABP 的最新相关信息,例如新版本、免费资源、帖子等。", + "DeveloperTools": "开发者工具", + "StartupTemplates": "启动模板", + "ApplicationModules": "应用模块", + "UI": "UI", + "Themes": "主题", + "Premium": "高级的", + "PrivacyPolicy": "隐私政策", + "TermsAndConditions": "条款 & 条件", + "WouldLikeToReceiveMarketingMaterials": "我想收到产品交易和特别优惠等市场推广材料。", + "JoinOurMarketingNewsletter": "加入我们市场推广时事通讯", + "CommunityPrivacyPolicyConfirmation": "我同意条款 & 条件和隐私政策 。", + "WouldLikeToReceiveNotification": "我想从 abp.io 网站接收最新消息。", + "CommercialNewsletterConfirmationMessage": "我同意条款 & 条件隐私政策。", + "FreeDDDEBook": "免费 DDD 电子书", + "AdditionalServices": "额外服务", + "Learn": "学习", + "AccountOverview": "账户信息", + "MyOrganizations": "我的组织", + "MySupportQuestions": "我的支持问题", + "MyProfile": "我的简介", + "Logout": "登出", + "Home": "主页", + "Posts": "帖子", + "Videos": "视频", + "JoinTheABPCommunity": "加入 ABP 社区", + "SubmitYourPost": "提交您的帖子", + "Modules": "模块", + "Tools": "工具", + "Pricing": "价格", + "ChangeLogs": "更改日志", + "SubscribeToNewsletter": "订阅时事通讯", + "SubscribeToNewsletterDescription": "获取有关 ABP 的最新相关信息,例如新版本、免费资源、帖子等。", + "EmailAddress": "邮箱地址", + "Subscribe": "订阅", + "WelcomeToABP": "欢迎来到 ABP", + "EULA": "最终用户许可协议", + "ABPCommercialIntroductionMessage": "预建应用程序模块、高级启动模板、快速应用程序开发工具、专业 UI 主题和高级支持。", + "MasteringAbpFrameworkEBook": "掌握 ABP 框架", + "MasteringTheABPFrameworkExplanation": "本书由 ABP 框架的创建者撰写,将帮助您全面了解框架和现代 Web 应用程序开发技术。", + "Speakers": "发言者", + "PreviousEvents": "以往活动", + "WatchTheEvent": "观看活动", + "RegisterNow": "现在注册", + "ThereIsNoEvent": "没有活动。", + "Events": "活动", + "Volo.AbpIo.Domain:080000": "已有一个名为 \"{Name}\" 的购买项目", + "MasteringAbpFrameworkBook": "书籍:掌握 ABP 框架", + "ABPIO-CommonPreferenceDefinition": "获取有关 ABP 平台的最新消息,例如新帖子、活动等。", + "BuiltOn": "建立在", + "AbpFramework": "ABP 框架", + "Volo.AbpIo.Domain:080001": "开始时间不能大于结束时间", + "Enum:BookType:0": "掌握 ABP 框架", + "Enum:PurchasePlatform:0": "亚马逊", + "Enum:PurchasePlatform:1": "Packt", + "Copied": "已复制!", + "CouldNotCopy": "无法复制!", + "CopyNotSupportByYourBrowser": "此功能在您使用的浏览器中不起作用。", + "City": "城市", + "ZipCode": "邮政编码", + "Address": "地址", + "Homepage": "主页", + "Year": "年份", + "Copyright": "版权所有 © {1}", + "DomainDrivenDesign": "领域驱动设计", + "CrossCuttingConcerns": "横切关注点", + "AbpCommunity": "ABP 社区", + "Footer_GithubStarCount": "{0} GitHub Stars", + "Footer_NugetDownloadCount": "{0} NuGet 下载量", + "AbpDescription": "ABP 是一个开源应用程序框架,专注于基于 AspNet Core 的 Web 应用程序开发。 Don't repeat yourself,专注于自己的业务代码。", + "Layout_AbpFramework_MetaTitle": "ABP 框架 - 开源 Web 应用程序框架", + "CommunityTalks_CountdownDays": "天", + "CommunityTalks_CountdownHours": "小时", + "CommunityTalks_CountdownMinutes": "分钟", + "CommunityTalks_CountdownSeconds": "秒", + "SeePreviousEvents": "查看以前的活动", + "CookieConsent_Accept": "接受", + "CookieConsent_Explanation_1": "我们使用 cookie 为您提供在我们网站上的最佳体验。", + "CookieConsent_Explanation_2": "如果您继续浏览,则表示您同意我们的隐私政策和cookie 政策。。", + "Error_Page_400_Title": "提供请求的页面时出现问题。", + "Error_Page_400_Description_1": "通常这意味着在处理您的请求时发生了意外错误。", + "Error_Page_400_Description_2": "如果问题仍然存在,请通过 info@abp.io 联系我们,我们将帮助您开始。", + "GoToHomepage": "去首页", + "Error_Page_404_Title": "页面未找到!", + "Error_Page_404_Description_1": "这不是您要查找的网页。", + "Error_Page_500_Title": "好像出了什么问题!", + "Error_Page_500_Description_1": "我们会自动跟踪这些错误,但如果问题仍然存在,请随时
联系我们。 与此同时,尝试刷新。", + "Error_Page_500_Description_2": "通过 info@abp.io 与我们联系。", + "Books": "书籍", + "BuyAndGetMonths": "购买 12 个月,获得 14 个月!", + "GetYourDeal": "得到你的交易", + "BuyOrRenewLicense": "立即购买或续订许可证并额外获得 2 个月!", + "BuyOrRenewLicenseToGetExtra2Months": "立即购买或续订 ABP 商业许可证(适用于所有版本)并额外获得 2 个月!", + "HurryUp": "赶快下单!", + "LastDay": "活动截止日期: {0}", + "BuyNewLicenseBetweenDatesToGetBenefit": "在 {0} 和 {1} 之间购买一个新的许可证以获得额外 2 个月的收益!", + "CheckAllCommunityTalks": "检查所有社区帖子", + "ReadMore": "阅读更多", + "Post": "邮政", + "ExploreTheContentsCreatedByTheCoreABPTeamAndTheABPCommunity": "探索核心 ABP 团队和 ABP 社区创建的内容。", + "WelcomeFallCampaign": "欢迎秋季活动!", + "GiveAwayForNewPurchases": "新购买将赠送应用程序开发课堂培训!" } } \ No newline at end of file diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/zh-Hant.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/zh-Hant.json index dbf04ae25b..f55f4a7f85 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/zh-Hant.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/zh-Hant.json @@ -39,6 +39,8 @@ "TrialLicensePeriodHasExpired": "您的試用許可期限已於 {0} 天前到期。", "TrialLicensePeriodWillExpire": "您的試用許可期限將在 {0} 天后到期。", "TrialLicensePeriodExpireToday": "您的試用許可期將於今天到期。", - "PurchaseNow": "現在買!" + "PurchaseNow": "現在買!", + "WelcomeFallCampaign": "欢迎秋季活动!", + "GiveAwayForNewPurchases": "新购买将赠送应用程序开发课堂培训!" } } \ No newline at end of file diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Blog/Localization/Resources/zh-Hans.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Blog/Localization/Resources/zh-Hans.json index df772fa60b..524c3345e3 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Blog/Localization/Resources/zh-Hans.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Blog/Localization/Resources/zh-Hans.json @@ -1,5 +1,7 @@ { "culture": "zh-Hans", "texts": { + "AbpTitle": "ABP 框架 - 开源 Web 应用程序框架", + "AbpDescription": "ABP 是一个开源应用程序框架,专注于基于 AspNet Core 的 Web 应用程序开发。 Don't repeat yourself,专注于自己的业务代码。" } } \ No newline at end of file diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ar.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ar.json index 1a9aa7cba2..c7b91a99a0 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ar.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ar.json @@ -89,7 +89,7 @@ "Blogging": "التدوين", "Identity": "هوية", "IdentityServer": "خادم الهوية", - "Saas": "ساس", + "Saas": "البرمجيات كخدمة", "LanguageManagement": "إدارة اللغة", "TextTemplateManagement": "إدارة قالب النص", "See All Modules": "انظر جميع الوحدات", @@ -382,4 +382,4 @@ "RenewLicenseEarly": "إذا قمت بتجديد رخصتي في وقت مبكر ، هل سأحصل على السنة كاملة؟", "RenewLicenseEarylExplanation": "عند تجديد الترخيص الخاص بك قبل تاريخ انتهاء الترخيص الخاص بك ، ستتم إضافة سنة واحدة إلى تاريخ انتهاء الترخيص الخاص بك. على سبيل المثال ، إذا انتهت صلاحية ترخيصك في {0} -06-06 وقمت بتجديده في {0} -01-01 ، فسيكون تاريخ انتهاء صلاحية الترخيص الجديد {1} -06-06." } -} \ No newline at end of file +} diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json index 36c00e9015..64cefef9af 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json @@ -536,6 +536,7 @@ "Pricing_Page_Testimonial_2": "We are seeing the value of using ABP Commercial to reduce the overhead of custom development projects. And the team is able to unify the code pattern in different project streams. We see more potential in the framework for us to build new features faster than before. We trust we will be constantly seeing the value of leveraging ABP Commercial.", "Pricing_Page_Testimonial_3": "We love ABP. We don't have to write everything from scratch. We start from out-of-the-box features and just focus on what we really need to write. Also, ABP is well-architected and the code is high quality with fewer bugs. If we would have to write everything we needed on our own, we might have to spend years. Once more things we like is that the new version, or issue fixing, or improvement come out very soon every other week. We don't wait too long.", "Pricing_Page_Testimonial_4": "ABP Commercial is a fantastic product would recommend. Commercial products to market for our customers in a single configurable platform. The jump start that the framework and tooling provide any team is worth every cent. ABP Commercial was the best fit for our needs.", + "Pricing_Page_Testimonial_5": "ABP Framework is not only a framework, but it is also a guide for project development/management, because it provides DDD, GenericRepository, DI, Microservice, and Modularity training. Even if you are not going to use the framework itself, you can develop yourself with docs.abp.io which is well and professionally prepared (OpenIddict, Redis, Quartz etc.). Because many things are pre-built, it shortens project development time significantly (Such as login page, exception handling, data filtering, seeding, audit logging, localization, auto API controller etc.). As an example from our application, I have used Local Event Bus for stock control. So, I am able to manage order movements by writing stock handler. It is wonderful not to lose time for CreationTime, CreatorId. They are being filled automatically.", "AbpBookDownloadArea_ClaimYourEBook": "Claim your Mastering ABP Framework E-Book", "AddMemberModal_Warning_1": "If the username you are trying to add doesn't exist in the system, please ask your team member to register on {0} and share the username of his/her account with you.", "MyOrganizations_Detail_WelcomeMessage": "Welcome to your organization, {0}", @@ -730,7 +731,18 @@ "Welcome_Page_UseSameCredentialForCommercialWebsites": "Use the same credentials for both commercial.abp.io and support.abp.io.", "WatchCrudPagesVideo": "Watch the \"Creating CRUD Pages with ABP Suite\" Video!", "WatchGeneratingFromDatabaseVideo": "Watch the \"ABP Suite: Generating CRUD Pages From Existing Database Tables\" Video!", - "WatchTakeCloserLookVideo": "Watch the \"Take a closer look at the code generation: ABP Suite\" Video!" - + "WatchTakeCloserLookVideo": "Watch the \"Take a closer look at the code generation: ABP Suite\" Video!", + "ConfirmedEmailAddressRequiredToStartTrial": "You should have a confirmed email address in order to start a trial license.", + "EmailVerificationMailNotSent": "Email verification mail couldn't send.", + "GetConfirmationEmail": "Click here to get a confirmation email if you haven't got it before.", + "WhichLicenseTypeYouAreInterestedIn": "Which license type you are interested in?", + "DontTakeOurWordForIt": "Don't take our word for it...", + "ReadAbpCommercialUsersWantYouToKnow": "Read what ABP Commercial users want you to know", + "Testimonial_ShortDescription_1": "The modularity of ABP made it possible for the team to deliver in time.", + "Testimonial_ShortDescription_2": "Build new features faster than before.", + "Testimonial_ShortDescription_3": "We start from out-of-the-box features and just focus on what we really need to write.", + "Testimonial_ShortDescription_4": "ABP Commercial was the best fit for our needs.", + "OnlineReviewersOnAbpCommercial": "Online Reviews on ABP Commercial", + "SeeWhatToldAboutAbpCommercial": "See what has been told about ABP Commercial and write your thoughts if you want." } } diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ro-RO.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ro-RO.json index 44b6f66037..be56afbb43 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ro-RO.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ro-RO.json @@ -341,7 +341,7 @@ "SignIn": "Autentificare", "Or": "Sau", "TellUsAboutYourself": "Spuneţi-ne despre dumneavoastră", - "Surname": "Nume", + "Surname": "Nume de familie", "DoYouAgreePrivacyPolicy": "Sunt de acord cu Termenii şi condiţiile şi Politica de confidenţialitate.", "VolosoftMarketingInformationMessage": "Sunt de acord să primesc informaţii, sfaturi şi oferte despre soluţii pentru afaceri şi organizaţii şi alte produse şi servicii Volosoft.", "VolosoftSharingInformationMessage": "Sunt de acord ca Volosoft să partajeze informaţiile mele cu partenerii selectaţi astfel încât să primesc informaţii relevante despre produsele şi serviciile lor.", @@ -380,4 +380,4 @@ "TrialLicenseExpiredInfo": "Perioada de licență de probă a expirat!", "CommercialNewsletterConfirmationMessage": "Sunt de acord cu Termenii și condițiile și cu Politica de confidențialitate ." } -} \ No newline at end of file +} diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hans.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hans.json index 4fe47cb523..0d67d9cca5 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hans.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hans.json @@ -9,9 +9,10 @@ "QuestionCount": "剩余/问题总数", "Unlimited": "无限制", "Owners": "所有者", + "Owner": "所有者", "AddMember": "添加成员", - "AddOwner": "添加所有者", - "AddDeveloper": "添加开发者", + "AddNewOwner": "添加新的所有者", + "AddNewDeveloper": "添加新的开发者", "UserName": "用户名", "Name": "名称", "EmailAddress": "电子邮件地址", @@ -62,8 +63,6 @@ "Themes": "主题", "JoinOurNewsletter": "加入我们的时事通讯", "Send": "发送", - "Learn": "学习", - "AdditionalServices": "额外的服务", "WhatIsABPFramework": "什么是ABP框架?", "OpenSourceBaseFramework": "开源的框架", "ABPFrameworkExplanation": "

ABP商业版基于ABP框架, 这是一个开源和社区驱动的ASP.NET Core web应用程序开发框架.

ABP框架提供了出色的基础设施, 使用最佳实践编写可维护,可扩展,可测试的代码.

基于你已经知道的流行工具. 低学习曲线,容易适应,舒适的开发体检.

", @@ -110,7 +109,7 @@ "LightTheme": "浅色主题", "ProudToWorkWith": "荣幸与你合作", "OurConsumers": "全球70多个国家的数百家企业和开发商使用ABP商业版.", - "JoinOurConsumers": "加它他们并快速构建令人惊叹的产品.", + "JoinOurConsumers": "加入他们并快速构建令人惊叹的产品.", "AdditionalServicesExplanation": "你是否需要额外或自定义的服务? 我们和我们的合作伙伴可以提供;", "CustomProjectDevelopment": "自定义项目开发", "CustomProjectDevelopmentExplanation": "专为你的自定义的开发人员.", @@ -129,6 +128,8 @@ "TellUsWhatYouNeed": "告诉我们你需要什么.", "YourMessage": "你的消息", "YourFullName": "你的全名", + "FirstNameField": "名字", + "LastNameField": "姓氏", "EmailField": "E-mail地址", "YourEmailAddress": "你的e-mail地址", "HowMayWeHelpYou": "需要获得购买帮助?(提供中文服务)", @@ -136,6 +137,7 @@ "Success": "成功", "WeWillReplyYou": "你的消息已经发送! 我们会在短时间内给你答复.", "GoHome": "回到主页面", + "Home": "主页", "CreateLiveDemo": "创建在线演示", "RegisterToTheNewsletter": "注册到时事简报以获取有关ABP.IO的消息,比如新发布的内容.", "EnterYourEmailOrLogin": "输入你的e-mail地址来创建你的演示或者使用你的已有账号登录.", @@ -159,6 +161,8 @@ "SearchQuestionPlaceholder": "搜索常见的问题", "WhatIsTheABPCommercial": "什么是ABP商业版?", "WhatAreDifferencesThanAbpFramework": "ABP框架与ABP商业版有什么不同?", + "AbpCommercialMetaTitle": "ABP 商业版 - 完整的网页开发平台 : {0} | ABP 商业版 ", + "AbpCommercialMetaDescription": "ABP 商业版是在开源ABP框架之上构建的一组预构建应用程序模块、快速开发工具、UI主题和服务架构", "ABPCommercialExplanation": "ABP商业版是一套基于开源ABP框架之上的高级模块,工具,主题和服务. ABP商业版由ABP框架背后的同一团队开发和支持.", "WhatAreDifferencesThanABPFrameworkExplanation": "

ABP框架是模块化,主题化,微服务兼容的ASP.NET Core应用程序开发框架. 它提供了一个完整的架构和强大的基础设施,让你专注于自己的业务代码而不是重复自己的每一个项目. 它基于软件开发的最佳实践和你已经知道的流行工具

ABP框架是完全免费,开源和由社区驱动的. 它还提供了一个免费的主题和一些预构建的模块 (如 identity管理和租户管理).

", "VisitTheFrameworkVSCommercialDocument": "访问以下链接,了解更多信息 {1} ", @@ -191,6 +195,7 @@ "IsSourceCodeIncludedExplanation4": "

将模块的源代码包含到解决方案中,可以最大程度地自定义该模块. 但是当新版本发布时,将无法自动升级模块.

这些许可均不包含ABP Suite源代码,该源代码是一个外部工具,可以为你生成代码并帮助你进行开发

有关许可类型之间的其它差异查看定价页面.

", "ChangingDevelopers": "我将来可以更改我组织的注册开发人员吗?", "ChangingDevelopersExplanation": "除了将新的开发人员添加到你的许可中之外,你还可以更改现有的开发人员(可以删除一个开发人员并将新的开发人员添加到同一位置),而无需任何额外费用.", + "WhatHappensWhenLicenseEndsExplanation8": "您生成的 ABP 项目未存储在我们的服务器上。 因此,您有责任保留下载的源代码。 当您的许可证到期时,将无法获取您生成的 ABP 项目源代码。", "WhenShouldIRenewMyLicense": "我什么时候应该续订我的许可?", "WhenShouldIRenewMyLicenseExplanation": "如果您在许可证到期后 1 个月内续订许可证,将享受以下折扣:团队许可证 {0}% 折扣、商业许可证 {1}% 折扣、企业许可证 {2}% 折扣 . 如果您在许可证到期后 1 个月续订许可证,续订价格将与许可证购买价格相同,并且续订不会有折扣。", "TrialPlan": "你们有试用计划吗?", @@ -320,7 +325,7 @@ "ImplementingDDDBuildingBlocks": "实现 DDD 构建块", "DomainVsApplicationLogic": "领域逻辑与应用逻辑", "SamplesAndDiscussions": "示例和讨论", - "Free": "自由", + "Free": "免费", "Download": "下载", "DDDEBook": "DDD电子书", "ImplementingDDD": "实现领域驱动设计", @@ -350,7 +355,6 @@ "WeWillSendYouADownloadLink": "下载电子书的链接已发送至{0}。
检查您的收件箱/垃圾箱/垃圾邮件箱!", "InvalidFormInputs": "请输入表格中指定的有效信息。", "DDDBookEmailBody": "谢谢你。
要下载您的图书,请点击此处。", - "FreeDDDEBook": "免费 DDD 电子书", "StartFree": "免费开始", "FreeTrial": "免费试用", "AcceptsMarketingCommunications": " 是的,我想接收 ABP 商业营销通讯。", @@ -361,7 +365,6 @@ "CompanySize": "公司规模", "Next": "下一个", "StartTrial": "开始我的免费试用", - "ContactUsIssues": "如果您有任何问题,请联系我们", "TrialActivatedWarning": "亲爱的{0},用户只能享受 1 个免费试用期。您已经使用了试用期。", "SaveAndDownload": "保存和下载", "CompanyNameValidationMessage": "公司名称太长!", @@ -369,17 +372,346 @@ "TaxNoValidationMessage": "TAX/VAT No 太长了!", "NotesValidationMessage": "备注字段太长!", "CheckYourBillingInfo": "您只能创建一次发票!在创建发票之前检查您的帐单信息。", - "Volo.AbpIo.Commercial:030000": "您已经使用了试用期。", - "Volo.AbpIo.Commercial:030001": "此组织名称已存在。", "StartYourFreeTrial": "开始你的免费试用", "TrialLicenseModelInvalidErrorMessage": "以下字段之一无效:国家名称、公司规模、行业或使用目的。", "Trial": "审判", "Purchased": "已购买", - "PurchaseLicense": "购买许可证", + "PurchaseNow": "立即购买", "PurchaseTrialLicenseMessage": "您的许可证到期日期是 {0}。
如果您想继续使用您在免费试用期内创建的项目,您需要更改 appsettings.secrets.json 文件中的许可证密钥。这是您的许可证密钥:", "TrialLicenseExpireMessage": "您正在使用试用许可证,您的试用许可证将于 {0}到期。", "TryForFree": "免费试用", "TrialLicenseExpiredInfo": "您的试用许可期限已过!", - "CommercialNewsletterConfirmationMessage": "我同意条款和条件隐私政策。" + "DowngradeLicensePlan": "我将来可以降级到较低的许可版本吗?", + "DowngradeLicensePlanExplanation": "您不能降级现有的许可版本。 但是您可以购买新的较低许可版本并继续使用新许可证进行开发。 购买较低的许可版本后,您只需通过 ABP CLI 命令登录到新的许可版本:` abp login -o `。", + "LicenseTransfer": "许可证可以从一个开发者转移到另一个开发者吗?", + "LicenseTransferExplanation": "是的! 购买许可证后,您将成为许可证持有者,因此您可以访问组织管理页面。 组织具有所有者和开发者角色。 业主可以管理开发者席位和分配开发者。 每个分配的开发者都将通过 ABP CLI 命令登录系统,并拥有开发和支持权限。", + "UserOwnerDescription": "组织的“所有者”是此帐户的管理员。 他/她通过购买许可证和分配开发者来管理组织。 “所有者”不能在 ABP 商业项目中编写代码,不能下载 ABP 示例项目,也不能在支持的网站上进行提问。 如果你想拥有这些操作权限,你必须也将自己添加为开发人员。", + "UserDeveloperDescription": "“开发人员”可以在 ABP 商业版项目中编写代码,下载 ABP 示例项目,并在支持的网站上进行提问。 然而另一方面,“开发者”无法管理这个组织。", + "RemoveCurrentUserFromOrganizationWarningMessage": "您正在将自己从自己的组织中移除。 您将无法再管理此组织,您确定吗?", + "RenewExistingOrganizationOrCreateNewOneMessage": "您可以通过单击下面的 \"立即延长\"按钮来更新您组织的许可证,因此您可以将许可证到期日期延长 1 年。 如果您继续结帐,您将拥有一个新的组织。 您想继续开始新的组织许可吗?", + "ExtendNow": "立即延长", + "CreateNewOrganization": "建立新的组织", + "RenewLicenseEarly": "如果我提前更新我的许可证,我会得到一整年吗?", + "RenewLicenseEarylExplanation": "当您在许可证到期日期之前续订许可证时,您的许可证到期日期仍将增加 1 年。 例如,如果您的许可在 {0}-06-06 到期,而您在 {0}-01-01 续订,那么您的新许可到期日期仍将是 {1}-06-06。", + "OpenSourceWebApplication": "开源Web应用程序", + "CompleteWebDevelopment": "一个完整的Web开发", + "ABPFrameworkDescription": "ABP 框架是一个完整的基础架构,可通过遵循软件开发和约定的最佳实践来创建现代 Web 应用程序。", + "CommunityDescription": "分享您使用 ABP 框架的经验!", + "GetStarted": "开始使用", + "Views": "意见", + "LatestPosts": "最新的帖子", + "PreBuiltApplication": "预构建应用程序", + "DatabaseProviders": "数据库提供者", + "UIFrameworks": "用户界面框架", + "UsefulLinks": "有用的链接", + "Platform": "平台", + "CoolestCompaniesUseABPCommercial": "最酷的公司都已经在使用 ABP Commercial。", + "UserInterface": "用户界面", + "APIGateway": "网关", + "Microservice": "微服务", + "Database": "数据库", + "Architecture": "结构", + "MicroserviceArchitectureExplanation": "这是一个完整的解决方案架构,由多个应用程序、API 网关、微服务和数据库组成,使用最新技术构建可扩展的微服务解决方案。", + "BusinessLogic": "业务逻辑", + "DataAccessLayer": "数据访问层", + "Monolith": "单体", + "ModularArchitectureExplanation": "此启动模板提供了分层、模块化和基于 DDD 的解决方案架构,以构建清晰且可维护的代码库。", + "SeeDetails": "阅读详情", + "SeeDocumentation": "查看文档", + "Bs5Compatible": "Bootstrap 5 兼容的专业主题,非常适合您的管理网站。", + "LeptonXTheme": "LeptonX 主题", + "LeptonXDark": "LeptonX 深色", + "LeptonXLight": "LeptonX 浅色", + "LeptonXSemiDark": "LeptonX 半深色", + "BuiltOnBs5Library": "基于 Bootstrap 5 库构建", + "FullyCompatibleWithBs5": "100% 兼容 Bootstrap 5 HTML 结构和 CSS 类", + "ResponsiveAndMobileCompatible": "响应式、移动兼容、RTL 支持", + "ProvidesStylesForDatatables": "为数据表提供样式", + "MultipleLayoutOptions": "多种布局选项", + "EasilyInstallAndUpgrade": "轻松安装和升级", + "SupportForum": "支持论坛", + "TrustedBy": "授信于", + "OurPricing": "我们的 价格", + "Plans": "计划", + "NameSurname": "姓名", + "Unspecified": "未指定的", + "LicenceType": "许可证类型", + "LicenseDiscountWarning": "此折扣页面使用默认折扣代码并适用于 VOLOSOFT 开发人员。 下面的购买链接不起作用。", + "DiscountedLicenseExplanation": "这些许可价格适用于小型初创公司、个人开发者、学生、非营利组织和项目!", + "General": "一般的", + "License": "许可证", + "Development": "开发", + "Payment": "支付", + "WatchExplainerVideo": "让我们见面吧! 观看解说视频", + "LightDarkAndSemiDarkThemes": "浅色、深色和半深色", + "LeptonXThemeExplanation": "Lepton Theme 可以根据您的系统设置更改您的主题。", + "PRO": "专业版", + "WelcomeToABPCommercial": "欢迎来到 ABP 商业版!", + "YourAccountDetails": "您的帐户详细信息", + "OrganizationName": "组织名称", + "AddDevelopers": "添加开发者", + "StartDevelopment": "开始开发", + "CreateAndRunApplicationUsingStartupTemplate": "了解如何使用 ABP Commercial 启动模板创建和运行新的 Web 应用程序。", + "CommunityDescription2": "community.abp.io 是人们可以分享 ABP 相关文章的地方。 搜索文章、教程、代码示例、案例研究并结识与您同路的人。", + "UseABPSuiteExplanation": "使用 ABP Suite 下载模块和主题的源代码。", + "ManageModulesWithSuite": "您还可以使用 Suite 管理您的 ABP 模块。", + "LearnHowToInstallSuite": "了解如何安装和使用 ABP 套件。", + "SeeMore": "查看更多", + "SeeLess": "收起全文", + "LayeredSolutionStructure": "分层解决方案结构", + "LayeredSolutionStructureExplanation": "该解决方案基于领域驱动设计原则和模式进行分层,以将您的业务逻辑与基础架构和集成隔离开来,并最大限度地提高代码的可维护性和可重用性。 ABP 框架已经提供了抽象、基类和指南来真正为您的应用程序实现 DDD。", + "MultipleUIOptions": "多个用户界面选项", + "MultipleUIOptionsExplanation": "我们喜欢不同的方式来创建用户界面。 此启动解决方案为您的业务应用程序提供了三种不同的 UI 框架选项。", + "MultipleDatabaseOptions": "多个数据库选项", + "MultipleDatabaseOptionsExplanation": "您有两个数据库提供程序选项(除了在单个应用程序中使用两者)。 使用 Entity Framework Core 处理任何关系数据库,当您需要编写低级查询以获得更好的性能时,可以选择使用 Dapper。 如果您需要使用基于文档的 NoSQL 数据库,MongoDB 是另一种选择。 虽然这些提供程序是良好集成、抽象和预配置的,但您实际上可以与任何可与 .NET 一起使用的数据库系统进行交互。", + "ModularArchitectureExplanation2": "模块化是 ABP.IO 平台的一等公民。 所有应用程序功能都被拆分为隔离良好的可选模块。 启动解决方案已经预装了基本的 ABP 商业模块。 您还可以创建自己的模块来为自己的应用程序构建模块化系统。", + "MultiTenancyForSaasBusiness": "SaaS 业务的多租户", + "MultiTenancyForSaasBusinessExplanation": "ABP 商业版 提供完整的端到端多租户系统来创建您的 SaaS(软件即服务)系统。 它允许租户通过动态数据库创建和迁移系统共享或拥有自己的数据库。", + "MicroserviceStartupSolution": "微服务启动解决方案", + "MicroserviceArchitectureExplanation2": "您可以将它用于您的下一个微服务系统,以利用预先构建的基础解决方案和提炼的经验。", + "PreIntegratedTools": "预集成到流行工具", + "PreIntegratedToolsExplanation": "该解决方案已集成到行业标准工具和技术中,而您可以随时更改它们并集成到您喜欢的工具中。", + "SingleSignOnAuthenticationServer": "单点登录认证服务器", + "SingleSignOnAuthenticationServerExplanation": "该解决方案有一个身份验证服务器应用程序,其他应用程序将其用作具有 API 访问管理功能的单点登录服务器。 它基于 IdentityServer。", + "WebAppsWithGateways": "2 个 Web 应用程序和 2 个 API 网关", + "WebAppsWithGatewaysExplanation": "该解决方案包含两个 Web 应用程序,每个应用程序都有一个专用的 API 网关(BFF - Backend For Frontend 模式)。", + "BackOfficeApplication": "后台应用程序", + "BackOfficeApplicationExplanation": "系统的实际 Web 应用程序,具有多个 UI 框架选项。 您可以创建任何类型的业务应用程序。", + "LandingWebsite": "登陆网站", + "LandingWebsiteExplanation": "可用于多种目的的通用登陆/公共网站,例如介绍您的公司、销售您的产品等。", + "ABPFrameworkEBook": "掌握 ABP 框架电子书", + "MasteringAbpFrameworkEBookDescription": "包含在您的 ABP 商业许可证中", + "FullName": "全名", + "LicenseTypeNotCorrect": "许可类型不正确!", + "Trainings": "培训", + "ChooseTrainingPlaceholder": "选择培训...", + "DoYouNeedTrainings": "您需要这些培训之一吗?", + "DoYouNeedTraining": "您需要 {0} 培训吗?", + "GetInTouchUs": "请与我们联系", + "ForMoreInformationClickHere": "如需更多信息,请点击此处。", + "IsGetOnboardingTraining": "您想获得入职和 Web 应用程序开发培训吗?", + "OnboardingWebApplicationDevelopmentTrainingMessage": "要安排您的培训日历,请在创建组织后联系 {0}", + "CustomPurchaseMessage": "对于下一步,单击 {0} 与我们联系。", + "Note": "说明", + "AdditionalNote": "附加说明", + "OnboardingTrainingFaqTitle": "你有 ABP 熟练使用培训吗?", + "OnboardingTrainingFaqExplanation": "是的,我们有 ABP 培训服务来帮助您快速启动您的 ABP 项目。 您将从 ABP 核心团队成员那里了解 ABP,并获得开始您的 ABP 项目的技能。 在 ABP 培训中,我们将解释如何设置开发环境、安装所需工具、创建功能齐全的 CRUD 页面。 培训将会以直播的形式并使用 Zoom 应用程序,我们也对使用其他在线会议平台持开放态度。 主要培训语言为英语。 您也可以在会议期间询问有关 ABP 的问题。 我们将安排一个方便双方的时间和日期。 要获取更多信息,请通过 info@abp.io 联系我们。", + "AddBasket": "添加到购物车", + "SendTrainingRequest": "发送培训请求", + "OnlyEnglishVersionOfThisDocumentIsTheRecentAndValid": "* 本文件的英文版本为最新版本,如有任何争议,以英文版本为准。", + "Pricing_Page_Title": "计划 & 定价", + "Pricing_Page_Description": "现在就选择您的业务及需要的特性和功能。 购买 ABP 商业许可证创建无限量项目。", + "Pricing_Page_HurryUp": "赶快行动吧!", + "Pricing_Page_BuyLicense": "在 1 月 16 日前以 2021 年价格 购买许可证!", + "Pricing_Page_ValidForExistingCustomers": "也适用于现有客户和许可证续订。", + "Pricing_Page_Hint1": "许可价格包括一定数量的开发者席位。 如果您有更多的开发人员,您可以随时购买额外的席位。", + "Pricing_Page_Hint2": "您现在或将来都可以购买更多的开发者许可证。 许可证是基于席位的,因此您可以将席位从开发人员转移到另一个开发人员。", + "Pricing_Page_Hint3": "您可以使用您的许可证开发无限数量的不同产品。", + "Pricing_Page_Hint4": "ABP Suite 是帮助您开发以提高生产力的工具。 它支持生成 CRUD 页面和创建新项目。", + "Pricing_Page_Hint5": "您可以在应用程序中使用所有预构建的模块。", + "Pricing_Page_Hint6": "您可以在应用程序中使用所有预构建的主题。", + "Pricing_Page_Hint7": "启动模板是一种 Visual Studio 解决方案,可让您快速启动项目。 所有基本模块都为您添加和预配置。", + "Pricing_Page_Hint8": "掌握 ABP 框架电子书解释了如何使用最佳实践实施 .NET 解决方案。它在 Amazon.com 上出售,您可以在许可证范围内免费下载该书。", + "Pricing_Page_Hint9": "您可以下载任何模块的源代码。 您可能希望将源代码添加到您的解决方案中以进行彻底的更改,或者出于安全原因将其自己保留。", + "Pricing_Page_Hint10": "许可证是终身的。 这意味着您可以永远继续开发您的应用程序。 在许可期限内(1 年,除非您续订)授予访问最新版本并获得支持。", + "Pricing_Page_Hint11": "部署没有限制! 您可以根据需要部署到任意数量的服务器,包括云服务或本地。", + "Pricing_Page_Hint12": "您可以在有效许可期内将模块、主题和工具更新到最新版本。 在您的许可证到期后,您需要对其进行续订,以继续获取错误修复、新功能和增强功能的更新。", + "Pricing_Page_Hint13": "您可以获得一年的高级支持(您可以续订许可证以延长它)。", + "Pricing_Page_Hint14": "团队和营业许可有事件/问题计数限制。 如果您购买额外的开发者许可,您的事件限制会按开发人员增加 {0}(对于团队许可)或 {1}(对于商业许可)每个开发者增加。", + "Pricing_Page_Hint15": "只有企业许可证包括私人支持。 您可以直接向 ABP 团队发送电子邮件或在 support.abp.io 上使用私人门票选项提问。 私人门票对公众不可见。", + "Pricing_Page_Hint16": "您可以下载所有 ABP 主题的源代码。 您可能希望将源代码添加到您的解决方案中以进行彻底的更改,或者出于安全原因将其自己保留。", + "Pricing_Page_Testimonial_1": "ABP Commercial 允许 SC Ventures 在 9 个月内交付银行级多租户silo数据库 SaaS 平台,以支持来自多个集成锚点的大额发票的应收账款/应付账款供应链融资。 ABP 的模块化使团队能够在创纪录的时间内交付,通过所有 VAPT,并通过完整的 CI/CD 和管道将容器化的微服务码部署到生产中。", + "Pricing_Page_Testimonial_2": "我们看到了使用 ABP Commercial 能减少定制开发项目开销的价值。 并且团队能够在不同的项目流中统一代码模式。 我们在框架中看到了能比以前更快地构建新功能的更多潜力。 我们相信我们将会持续地看到使用 ABP Commercial 的价值。", + "Pricing_Page_Testimonial_3": "我们大爱 ABP。 我们不必从头开始编写所有内容。 我们从\"开箱即用\"的功能开始,只需关注我们真正需要编写的内容。 此外,ABP 架构良好,代码质量高,错误少。 如果我们需要自己来编写所需的一切,我们可能需要花费数年时间。 另一点让我们喜欢的是新版本、问题修复或改进每隔一周很快地就会出现。 我们不会等太久。", + "Pricing_Page_Testimonial_4": "ABP 商业版 是一款很值得推荐的出色产品。 是在一个可配置的平台上为我们的客户推向市场的商业产品。 其框架和工具为任何团队提供的快速启动值得每一分钱。 ABP 商业版 最适合我们的需求。", + "AbpBookDownloadArea_ClaimYourEBook": "领取您的掌握ABP框架电子书", + "AddMemberModal_Warning_1": "如果您尝试添加的用户名在系统中不存在,请让您的团队成员在 {0} 并与您分享他/她帐户的用户名。", + "MyOrganizations_Detail_WelcomeMessage": "欢迎加入您的组织,{0}", + "MyOrganizations_Detail_OrganizationManagement": "组织管理", + "OrganizationDisplayName": "组织显示名称", + "MyOrganizations_Detail_EditDisplayName": "编辑显示名称", + "MyOrganizations_Detail_UpgradeYourLicense": "升级您的许可证", + "MyOrganizations_Detail_LicenseStartAndExpiryDate": "许可证开始日期 - 到期日期", + "MyOrganizations_Detail_OwnerRightInfo": "您正在使用您的 {1} 所有者权利中的 {0}。", + "MyOrganizations_Detail_CopyApiKey": "复制密钥", + "MyOrganizations_Detail_ApiKeyDescription": "API 密钥是托管在 {1} 上的 PRO 包的令牌。 ", + "MyOrganizations_Detail_YourPrivateNugetSource": "您的私有 NuGet 源是 {0}", + "MyOrganizations_Detail_PrivateNugetSourceWarning": "这将自动添加一个源到您的 ABP 解决方案中的 NuGet.Config。 不要与未经授权的用户共享您的私钥!", + "MyOrganizations_Detail_DeveloperSeatInfo": "您正在使用您的 {1} 个开发者席位中的 {0} 个。", + "NeedMoreSeatsForYourTeam": "您的团队需要更多席位吗?", + "MyOrganizations_Detail_PricePerYear": "{0} / 每年", + "MyOrganizations_Detail_PurchaseDeveloperSeats": "购买开发者席位", + "Invoices": "发票", + "RequestInvoice": "索取发票", + "OrderNumber": "订单号", + "Date": "日期", + "Products": "产品", + "TotalPrice": "总价格", + "ThereIsNoInvoice": "没有发票", + "MyOrganizations_Detail_PaymentProviderInfo": "如果您通过 {0} 网关购买了许可证,PDF 发票会被发送到您的电子邮件地址,请参阅 { 0} 发票。", + "MyOrganizations_Detail_PayUInfo": "如果您是通过PayU网关购买的,请点击\"索取发票\"按钮并填写账单信息。", + "MyOrganizations_Detail_ConclusionInfo": "您的发票申请将在 {0} 个工作日内完成。", + "ExtendYourLicense": "延长您的 {0} 许可", + "Continue": "继续", + "PurchaseLicense": "购买许可证", + "DownloadInvoiceModal_DownloadInvoice": "下载发票", + "DownloadInvoiceModal_SaveInformationOnlyOnce": "您只能保存一次账单信息。", + "InvoiceModal_EnterCompanyName": "请输入您的法定公司名称...", + "InvoiceModal_EnterCompanyAddress": "请输入您的法定公司地址...", + "InvoiceModal_EnterTaxNumber": "请输入您的税号/增值税号(如果有)...", + "RequestInvoiceModal_EnterNotes": "请输入您的有关发票的额外信息...", + "PrePayment_PayWithIyzico": "您将使用 Iyzico 付款", + "ContinueToCheckout": "继续结帐", + "PrePayment_IyzicoRedirectionInfo": "您将被重定向到 Iyzico 支付网关以安全地完成您的购买。", + "PrePayment_IyzicoAcceptVisaAndMasterCard": "Iyzico 接受 Visa 和 MasterCard。", + "Purchase": "购买", + "AcceptTermsAndConditions": "我已阅读、理解并接受隐私政策条款和条件 EULA。", + "AcceptTermsAndConditionsWarningMessage": "请接受隐私政策和条款和条件", + "SelectGatewayToContinue": "请选择一个网关以继续!", + "GatewaySelection_SelectGateway": "选择支付网关", + "GatewaySelection_RedirectionMessage": "接下来,您将被重定向到所选支付网关的交易网站。", + "PaymentSucceed_PaymentSuccessMessage": "支付成功", + "PaymentSucceed_ThanksForPurchase": "感谢您的购买!", + "PaymentSucceed_CreateYourOrganization": "创建您的组织", + "PaymentSucceed_AddMeAsDeveloper": "我是开发人员,请将我作为开发人员添加到我的组织中。", + "PaymentSucceed_CreateOrganization": "创建组织", + "PaymentSucceed_OrganizationDescription": "一个组织由开发人员和所有者组成。 开发人员是在 ABP 项目上编写代码的用户,将受益于 {1} 网站。 所有者是分配开发者席位和管理许可的用户。", + "PaymentSucceed_ViewOrganization": "点击这里查看组织", + "Purchase_TotalAnnualPrice": "总计 (年费)", + "Purchase_TrainingPrice": "培训价格", + "Purchase_OnboardingTraining": "ABP 熟悉使用和 Web 应用程序开发现场培训", + "TotalDeveloperPrice": "开发商总价", + "Purchase_PricePerDeveloper": "{0} {1} 每个开发者", + "Purchase_IncludedDeveloperInfo": "{0} {1} 包括在内。", + "Purchase_LicenseExtraDeveloperPurchaseMessage": "{0} 许可 包含 {1} 个开发者。 您可以现在或以后添加其他开发人员。", + "StartupTemplates_Page_Title": "启动模板", + "StartupTemplates_Page_Description": "ABP 商业版 允许您构建任何复杂程度的解决方案。 它提供了两种主要的预构建启动解决方案。 您可以选择最接近您要求的解决方案,并在此基础上构建您自己的定制解决方案。", + "MicroserviceStartupSolutionForDotnet": ".NET 微服务启动解决方案", + "MonolithSolutionForDotnet": ".NET 的单体(模块化)解决方案", + "TrainingDetailsHeaderInfo_TrainingHour": "{0} 小时", + "Trainings_Content": "培训内容", + "Trial_Page_StartYourFreeTrial": "开始您的免费试用", + "Contact_Page_Title": "联系 ABP 开发团队", + "Contact_Page_Description": "如果您需要任何帮助或分享您的想法和意见,请与 ABP 开发团队联系! ABP 支持团队随时准备提供帮助。", + "Demo_Page_Title": "创建演示", + "Demo_Page_Description": "创建免费演示以查看使用 ABP 商业版 启动模板创建的示例应用程序。 不要重复自己的常见应用程序要求。", + "Discounted_Page_Title": "折扣价", + "Discounted_Page_Description": "现在就选择您的业务及需要的特性和功能。 购买 ABP 商业许可证并创建无限量项目", + "Faq_Page_Title": "常见问题 (FAQ)", + "Faq_Page_Description": "您有任何问题吗? 搜索常见问题或使用联系表向我们提问。", + "Faq_Page_SwiftCode": "SWIFT代码", + "Faq_Page_BankName": "银行名称", + "Faq_Page_AccountName": "账户名称", + "Faq_Page_AccountNumber": "账号", + "Faq_Page_Currency": "货币", + "Faq_Page_VatNumber": "增值税号", + "Faq_Page_OtherCurrenciesInfo": "对于其他货币,请参阅所有账户", + "ModuleDetail_Page_Title": "模块详细信息 - {0}", + "ProjectCreatedSuccess_Page_Title": "您的项目已创建", + "ProjectCreatedSuccess_Page_Description": "您的 ABP 项目创建成功!", + "Suite_Page_Title": "ABP 套件 - 创建 CRUD 页面", + "Suite_Page_Description": "ABP Commercial 提供快速应用程序开发工具以提高开发人员的工作效率。 ABP 套件 允许您轻松创建 CRUD 页面。", + "Themes_Page_Title": "现代和实用的 UI 主题", + "Themes_Page_Description": "ABP 商业版 提供多种专业、现代的 UI 主题。 创建免费演示以快速查看 UI 的外观。", + "Tools_Page_Title": "快速应用程序开发工具", + "Tools_Page_Description": "ABP 商业版 提供快速应用程序开发工具以提高开发人员的工作效率。 ABP 套件 允许您轻松创建 CRUD 页面。", + "DeveloperPrice": "开发者价格", + "AdditionalDeveloperPaymentInfoSection_AdditionalDevelopers": "{0} 开发者", + "LicenseRemainingDays": " {0} 天", + "ExtendPaymentInfoSection_Description": "通过延长/续订您的许可,您将继续获得高级支持。 您还将能够获得模块和主题的重大更新。 您将能够继续创建新项目。 您仍然可以使用 ABP 套件 来加速您的开发。", + "LicenseRenewalPrice": "许可证续订价格", + "LicensePrice": "许可证价格", + "TrialLicensePaymentInfoSection_Description": "购买许可证:通过购买许可证,您将继续获得高级支持。 您还将能够获得模块和主题的重大更新。 您将能够继续创建新项目。 而且您仍然可以使用 ABP 套件 加速您的开发。
请参阅 许可证比较表来查看许可证类型之间的差异。", + "SelectTargetLicense": "选择目标许可证", + "UpgradePaymentInfoSection_ExtendMyLicenseForOneYear": "是的,将我的许可证到期日期延长 1 年。", + "UpgradePaymentInfoSection_WantToExtendLicense": "您想将许可证再延长 {0} 年吗?", + "UpgradePaymentInfoSection_UpgradingWillNotExtendLicense": "升级不会延长您的许可证到期日期!", + "UpgradePaymentInfoSection_LicenseUpgradeDescription": "通过升级您的许可证,您将升级到更高的许可证类型,这将使您获得额外的好处。 请参阅许可证比较表以查看许可证类型之间的差异。", + "Landing_Page_CustomerStories": "客户故事", + "Landing_Page_OurGreatCustomers": "我们的大客户", + "Landing_Page_WebApplicationFramework": "Web应用框架", + "Landing_Page_WebDevelopmentPlatform": "网页开发平台", + "Landing_Page_CompleteWebDevelopmentPlatform": "完整的网页开发平台", + "Landing_Page_TryFreeDemo": "试用免费演示", + "Landing_Page_StartingPointForWebApplications": "基于 ASP.NET Core 的 Web 应用程序的起点! 它是基于最佳 Web 开发的 ABP 框架。", + "Landing_Page_AbpProvidesSoftwareInfrastructure": "ABP 框架提供了一个软件基础架构来开发基于最佳实践的优秀 Web 应用程序。", + "Landing_Page_MicroserviceCompatibleArchitecture": "微服务兼容架构", + "Landing_Page_PreBuiltApplicationModulesAndThemes": "预建的应用程序模块和主题", + "Landing_Page_MultiTenantArchitecture": "多租户架构", + "Landing_Page_MultiTenancyDescription": "SaaS 应用程序变得简单! 从数据库到 UI 的集成多租户。", + "Landing_Page_DDDIntroduction": "基于 DDD 模式和原则设计和开发。 为您的应用程序提供分层模型。", + "Landing_Page_CrossCuttingConcernsInfo": "用于授权、验证、异常处理、缓存、审计日志记录、事务管理等的完整基础架构。", + "Landing_Page_PreBuiltApplicationModules": "预建应用程序模块,其中包括最常见的 Web 应用程序要求。", + "Landing_Page_ChatModule": "聊天", + "Landing_Page_DocsModule": "文档", + "Landing_Page_FileManagementModule": "文档", + "Landing_Page_CustomerStory_1": "ABP 商业版 允许 SC Ventures 在 9 个月内交付银行级多租户silo数据库 SaaS 平台,以支持来自多个集成锚点的大额发票的应收账款/应付账款供应链融资。 ABP 的模块化使团队能够在创纪录的时间内交付,通过所有 VAPT,并通过完整的 CI/CD 和管道将容器化的微服务码部署到生产中。", + "Landing_Page_CustomerStory_2": "我们看到了使用 ABP 商业版 来减少定制开发项目开销的价值。 并且团队能够在不同的项目流中统一代码模式。 我们在框架中看到了比以前更快地构建新功能的更多潜力。 我们相信我们将不断看到使用 ABP 商业版 的价值。", + "Landing_Page_CustomerStory_3": "我们很爱 ABP。 我们不必从头开始编写所有内容。 我们从\"开箱即用\"的功能开始,只关注我们真正需要编写的内容。 此外,ABP 架构良好,代码质量高,错误少。 如果我们必须自己编写所需的一切,我们可能需要花费数年时间。 另一件事是我们喜欢的是新版本、问题修复或改进每隔一周就很快会出现\n。 我们不会等太久。", + "Landing_Page_CustomerStory_4": "ABP 商业版 是一款值得推荐的出色产品。 在一个可配置的平台上为我们的客户推向市场的商业产品。 为任何团队提供的框架和工具的快速启动都值得每一分钱。 ABP 商业版 最适合我们的需求。", + "Landing_Page_AdditionalServices": "定制或批量许可、熟悉使用培训、网上培训和支持、定制项目开发、移植现有项目等等...", + "Landing_Page_IncludedDeveloperLicenses": "包含 {0} 开发者许可", + "Landing_Page_SeeOnDemo": "见演示", + "Landing_Page_LeptonThemes": "Lepton主题", + "Landing_Page_AccountModuleDescription_1": "该模块实现了应用程序的认证系统;", + "Landing_Page_AccountModuleDescription_2": "提供带有用户名和密码的登录页面", + "Landing_Page_AccountModuleDescription_3": "提供一个注册页面来创建一个新账户。", + "Landing_Page_AccountModuleDescription_4": "提供忘记密码页面,以电子邮件形式发送密码重置链接。", + "Landing_Page_AccountModuleDescription_5": "通过 UI 提供电子邮件确认功能。", + "Landing_Page_AccountModuleDescription_6": "实现双重身份验证(短信和电子邮件)。", + "Landing_Page_AccountModuleDescription_7": "实现用户锁定(当在一定时间间隔内由于无效凭据发生一定次数的登录失败时,将账户锁定设定的时间)。", + "Landing_Page_AccountModuleDescription_8": "实现 身份验证 身份验证服务器 UI 和功能。", + "Landing_Page_AccountModuleDescription_9": "允许在多租户环境中在租户之间切换。", + "Landing_Page_AccountModuleDescription_10": "允许更改应用程序的UI 语言。", + "Landing_Page_AuditLoggingModuleDescription_1": "此模块为审计基础设施提供审计日志报告 UI。 允许搜索、过滤和显示审计日志条目和实体更改日志。", + "Landing_Page_AuditLoggingModuleDescription_2": "审核日志条目包含有关每个客户端请求的关键数据:", + "Landing_Page_AuditLoggingModuleDescription_3": "URL、浏览器、IP 地址、客户端名称", + "Landing_Page_AuditLoggingModuleDescription_4": "用户", + "Landing_Page_AuditLoggingModuleDescription_5": "HTTP方法,HTTP返回状态码", + "Landing_Page_AuditLoggingModuleDescription_6": "成功/失败,异常详细信息(如果有)", + "Landing_Page_AuditLoggingModuleDescription_7": "请求执行时长", + "Landing_Page_AuditLoggingModuleDescription_8": "此请求中已创建、删除或更新实体(具有更改的属性)。", + "Landing_Page_BloggingModuleDescription_1": "该模块将一个简单的博客添加到您的 ABP 应用程序;", + "Landing_Page_BloggingModuleDescription_2": "允许在单个应用程序中创建多个博客。", + "Landing_Page_BloggingModuleDescription_3": "支持 Markdown 格式。", + "Landing_Page_BloggingModuleDescription_4": "允许为帖子写评论。", + "Landing_Page_BloggingModuleDescription_5": "允许为博客文章分配标签。", + "Landing_Page_BloggingModuleDescription_6": "请参阅 blog.abp.io 网站作为博客模块的实时示例。", + "Landing_Page_ChatModuleDescription_1": "该模块用于应用程序中用户之间的实时消息传递。", + "Landing_Page_ChatModuleDescription_2": "聊天页面上的实时消息。", + "Landing_Page_ChatModuleDescription_3": "在应用程序中搜索用户以获取新对话。", + "Landing_Page_ChatModuleDescription_4": "最近对话的联系人列表。", + "Landing_Page_ChatModuleDescription_5": "当用户正在查看另一个页面时的新消息通知。", + "Landing_Page_ChatModuleDescription_6": "菜单图标上的未读消息总数徽章。", + "Landing_Page_ChatModuleDescription_7": "每个对话的未读消息计数。", + "Landing_Page_ChatModuleDescription_8": "延迟加载的对话。", + "Landing_Page_DocsModuleDescription_1": "该模块用于创建技术文档网站;", + "Landing_Page_DocsModuleDescription_2": "内置 GitHub 集成:直接在 GitHub 上编写和管理文档。", + "Landing_Page_DocsModuleDescription_3": "版本控制支持直接集成到 GitHub 版本。", + "Landing_Page_DocsModuleDescription_4": "支持多语言(回退支持默认语言)。", + "Landing_Page_DocsModuleDescription_5": "支持 Markdown 和 HTML 格式。", + "Landing_Page_DocsModuleDescription_6": "提供导航大纲部分。", + "Landing_Page_DocsModuleDescription_7": "允许在单个应用程序中托管多个项目文档。", + "Landing_Page_DocsModuleDescription_8": "GitHub 上文件的链接,因此任何人都可以通过单击编辑链接轻松贡献。", + "Landing_Page_DocsModuleDescription_9": "除了 GitHub 源之外,还允许简单地使用文件夹作为文档源。", + "Landing_Page_FileManagementModuleDescription_1": "在分层文件夹结构中上传、下载和组织文件。", + "Landing_Page_FileManagementModuleDescription_2": "该模块用于上传、下载和组织分层文件夹结构中的文件。 它还兼容多租户,您可以确定租户的总大小限制。", + "Landing_Page_FileManagementModuleDescription_3": "本模块基于BLOB Storing系统,因此可以使用不同的存储供应商存储文件内容。", + "Landing_Page_IdentityModuleDescription_1": "该模块实现了应用程序的用户和角色系统;", + "Landing_Page_IdentityModuleDescription_2": "基于 Microsoft 的 ASP.NET Core Identity 库构建。", + "Landing_Page_IdentityModuleDescription_3": "管理系统中的角色用户。 一个用户可以拥有多个角色。", + "Landing_Page_IdentityModuleDescription_4": "在角色和用户级别设置权限。", + "Landing_Page_IdentityModuleDescription_5": "为每个用户启用/禁用双重身份验证和用户锁定。", + "Landing_Page_IdentityModuleDescription_6": "管理基本的用户个人资料密码。", + "Landing_Page_IdentityModuleDescription_7": "管理系统中的声明类型,为角色和用户设置声明。,", + "Landing_Page_IdentityModuleDescription_8": "设置页面以管理密码复杂性、用户登录、账户和锁定。", + "Landing_Page_IdentityModuleDescription_9": "支持 LDAP 身份验证。", + "Landing_Page_IdentityModuleDescription_10": "提供电子邮件和电话号码验证。", + "Landing_Page_IdentityModuleDescription_11": "支持社交登录集成(Twitter、Facebook、GitHub 等)。", + "Landing_Page_IdentityModuleDescription_12": "管理系统中的组织单位。", + "Landing_Page_PaymentModuleDescription_1": "为不同的支付网关提供集成。", + "Landing_Page_PaymentModuleDescription_2": "该模块提供支付网关的集成,因此您可以轻松地从客户那里获得付款。", + "Landing_Page_PaymentModuleDescription_3": "该模块支持以下支付网关", + "Welcome_Page_UseSameCredentialForCommercialWebsites": "commercial.abp.iosupport.abp.io使用相同的凭据。" } } diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hant.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hant.json index 81e22f05ce..c258ea0800 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hant.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hant.json @@ -320,7 +320,7 @@ "ImplementingDDDBuildingBlocks": "實現 DDD 構建塊", "DomainVsApplicationLogic": "領域邏輯與應用邏輯", "SamplesAndDiscussions": "示例和討論", - "Free": "自由", + "Free": "免費", "Download": "下載", "DDDEBook": "DDD電子書", "ImplementingDDD": "實現領域驅動設計", diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en.json index 0ed3eda832..c73da26137 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en.json @@ -150,7 +150,6 @@ "GetStarted": "Get Started", "SourceCode": "Source Code", "LeaveComment": "Leave Comment", - "ReadMore": "Read more", "ShowMore": "Show More", "NoPublishedPostsYet": "No published posts yet.", "Name": "Name", @@ -184,6 +183,7 @@ "Post_Index_Page_MetaDescription": "ABP Community's purpose is to create a contribution environment for developers who use the ABP framework.", "Layout_Title": "{0} | ABP Community", "Layout_MetaDescription": "ABP Community is an environment where people can share posts about ABP framework and follows the projects.", - "Index_Page_CommunityIntroduction": "This is a hub for ABP Framework, .NET and software development. You can read the articles, watch the video tutorials, get informed about ABP’s development progress and ABP-related events, help other developers and share your expertise with the ABP community." + "Index_Page_CommunityIntroduction": "This is a hub for ABP Framework, .NET and software development. You can read the articles, watch the video tutorials, get informed about ABP’s development progress and ABP-related events, help other developers and share your expertise with the ABP community.", + "TagsInArticle": "Tags in article" } } diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/zh-Hans.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/zh-Hans.json index b5d9d65c82..8196d567a1 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/zh-Hans.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/zh-Hans.json @@ -29,14 +29,12 @@ "ContributionGuide": "贡献指南", "BugReport": "Bug报告", "SeeAllPosts": "查看所有的文章", - "WelcomeToABPCommunity!": "欢迎来到ABP社区!", - "MyProfile": "我的资料", - "MyOrganizations": "我的组织", + "WelcomeToABP": "欢迎来到ABP", "EmailNotValid": "请输入有效的电子邮箱地址.", "FeatureRequest": "功能请求", "CreatePostTitleInfo": "文章标题显示在文章列表中.", "CreatePostSummaryInfo": "文章的简短摘要将显示在文章列表中.", - "CreatePostCoverInfo": "为了创建有效的文章,请添加封面图. 仅支持16:9的图片!", + "CreatePostCoverInfo": "要创建一个有效的帖子,需要添加封面图片. 上传16:9的图片获取最佳视觉效果. 文件最大支持: 1MB", "ThisExtensionIsNotAllowed": "不允许此扩展名.", "TheFileIsTooLarge": "文件过大.", "GoToThePost": "转到文章", @@ -45,7 +43,7 @@ "Done": "完成", "Open": "打开", "Closed": "关闭", - "LatestQuestionOnThe": "有关的最新问题", + "RecentQuestionFrom": "最近的问题来自", "Stackoverflow": "Stackoverflow", "Votes": "票数", "Answer": "回答", @@ -59,7 +57,7 @@ "QuestionItemErrorMessage": "无法从Stackoverflow获取最新的问题详细信息.", "Oops": "哎呀!", "CreatePostSuccessMessage": "文章提交成功. 网站管理员审核通过后将被发布.", - "ChooseCoverImage": "选项一张封面图片", + "Browse": "浏览", "CoverImage": "封面图片", "ShareYourExperiencesWithTheABPFramework": "分享你的ABP Framework经验!", "Optional": "可选的", @@ -88,6 +86,8 @@ "PostRequestFromGithubIssue": "现在没有任何文章请求.", "LatestPosts": "最新的帖子", "ArticleRequests": "文章请求", + "ArticleRequestsDescription": "想在这里查看具体内容吗? 您可以要求社区创建它!", + "LatestContentRequests": "最新内容请求", "AllPostRequests": "查看所有文章请求", "SubscribeToTheNewsletter": "订阅简讯", "NewsletterEmailDefinition": "获取有关ABP发生的信息,例如新版本,免费资源,文章等.", @@ -115,7 +115,6 @@ "VideoUrl": "视频Url", "GithubPostUrl": "Github文章Url", "ExternalPostUrl": "外部文章Url", - "CreatePostCoverInfo": "要创建一个有效的帖子,需要添加封面图片. 上传16:9的图片获取最佳视觉效果. 文件最大支持: 1MB", "ThankYouForContribution": "感谢你对ABP社区的贡献", "GithubPost": "Github文章", "GithubPostSubmitStepOne": "1. 用Markdown格式在GitHub的任何公共存储库上写一篇文章. 示例", @@ -143,6 +142,47 @@ "Volo.AbpIo.Domain:060001": "源 URL(\"{PostUrl}\") 不是 Github URL", "Volo.AbpIo.Domain:060002": "文章内容无法从 Github(\"{PostUrl}\") 资源中获得。", "Volo.AbpIo.Domain:060003": "没有找到文章内容!", - "SeeMore": "查看更多" + "SeeMore": "查看更多", + "JoinTheABPCommunity": "加入 ABP 社区", + "ABPCommunityTalks": "ABP 社区会谈", + "LiveDemo": "现场演示", + "GetLicense": "获得许可证", + "GetStarted": "开始使用", + "SourceCode": "源代码", + "LeaveComment": "发表评论", + "ShowMore": "展示更多", + "NoPublishedPostsYet": "还没有发布的帖子。", + "Name": "名字", + "Surname": "姓氏", + "WebSite": "网站", + "FullURL": "完整网址", + "JobTitle": "职称", + "Prev": "上一页", + "Previous": "前面的", + "Next": "下一页", + "Share": "分享", + "SortBy": "排序方式", + "NoPublishedEventsYet": "尚未发布活动。", + "SubscribeYoutubeChannel": "订阅 Youtube 频道", + "Enum:EventType:0": "会谈", + "MemberNotPublishedPostYet": "该成员尚未发布任何帖子。", + "TimeAgo": "{0} 前", + "Discord_Page_JoinCommunityMessage": "加入 ABP Discord 社区", + "Discord_Page_Announce": "我们很高兴地宣布 ABP 社区 Discord 服务器!", + "Discord_Page_Description_1": "ABP 社区从第一天起就一直在壮大。 我们希望通过创建一个官方的 ABP Discord 服务器将其带入下一步,这样 ABP 社区就可以使用即时消息的功能彼此进行互动。", + "Discord_Page_Description_2": "ABP Community Discord Server 是您可以使用 ABP 框架来展示您的创作、分享对您有用的技巧、了解有关 ABP 框架的最新消息和公告、与社区成员聊天交流想法并玩得开心的地方!", + "Discord_Page_Description_3": "此 ABP 社区 Discord 服务器是 ABP 核心团队的官方服务器,存在于服务器上进行监控。", + "Discord_Page_JoinToServer": "加入 ABP Discord 服务器", + "Events_Page_MetaTitle": "ABP 社区活动", + "Events_Page_MetaDescription": "现场活动由 ABP 团队主持,是充满社区内容、演示、问答和围绕 ABP 正在发生的事情的讨论的休闲会议。", + "Events_Page_Title": "ABP社区会谈", + "Events_Page_WritingFromUser": "阅读来自 ABP 社区的 {0} 的文章。", + "Post_Create_Page_MetaTitle": "最新帖子", + "Post_Create_Page_MetaDescription": "创建您的帖子以分享您对 ABP 框架的经验并为 ABP 社区做出贡献。", + "Post_Create_Page_CreateNewPost": "创建新帖子", + "Post_Index_Page_MetaDescription": "ABP 社区的目的是为使用 ABP 框架的开发人员创建一个贡献环境。", + "Layout_Title": "{0} | ABP 社区", + "Layout_MetaDescription": "ABP 社区是一个人们可以分享有关 ABP 框架的帖子并关注项目的环境。", + "Index_Page_CommunityIntroduction": "这是 ABP 框架、.NET 和软件开发的中心。 您可以阅读文章,观看视频教程,了解 ABP 的开发进度和 ABP 相关事件,帮助其他开发人员并与 ABP 社区分享您的专业知识。" } } \ No newline at end of file diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/AbpIoWwwResource.cs b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/AbpIoWwwResource.cs index 552b5949e1..f64552be30 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/AbpIoWwwResource.cs +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/AbpIoWwwResource.cs @@ -1,5 +1,8 @@ -namespace AbpIoLocalization.Www +using Volo.Abp.Localization; + +namespace AbpIoLocalization.Www { + [LocalizationResourceName("AbpIoWww")] public class AbpIoWwwResource { diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json index 41eda60de6..0b9dfab886 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json @@ -293,7 +293,6 @@ "ExploreDocumentationAndGuides": "Explore the comprehensive documentation and guides.", "Documentations": "Documentation", "Views": "Views", - "ReadMore": "Read More", "EnterYouEmailToGetNews": "Enter your email to get the latest news about the ABP Framework", "Tiered": "Tiered", "SeparateIdentityServer": "Separate Identity Server", @@ -372,6 +371,27 @@ "MasteringAbpFramework_Book_What_You_Will_Learn_8": "Write unit, integration, and UI tests using ABP Framework.", "MasteringAbpFramework_Book_WhoIsThisBookFor": "Who's this book for", "MasteringAbpFramework_Book_WhoIsThisBookFor_Description": "This book is for web developers who want to learn software architectures and best practices for building\n maintainable web-based solutions using Microsoft technologies and ABP Framework. Basic knowledge of C#\n and ASP.NET Core is necessary to get started with this book.", - "ComputersAndTechnology": "Computers & Technology" + "ComputersAndTechnology": "Computers & Technology", + "BuildingMicroserviceSolutions": "Building Microservice Solutions", + "MicroserviceBookPracticalGuide": "This book is a reference guide for developing and managing microservice-based applications using the ABP Framework. It references the .NET Microservice Sample Reference Application: eShopOnContainers and discusses the architectural design and implementation approaches using the ABP Framework. By the end of this book, you'll learn how ABP approaches the common microservice complexities such as authorization, distributed transactions, inter-microservice communications, deployment, etc.", + "IntroducingTheSolution": "Introducing the eShopOnAbp Solution", + "RunningTheSolution": "Running the Solution", + "UnderstandingTheAuthenticationSystem": "Understanding the Authentication System", + "ExploringTheApplications": "Exploring the Applications", + "UnderstandingTheAPIGateways": "Understanding the API Gateways", + "DevelopingTheMicroservices": "Developing the Microservices", + "UnderstandingTheInfrastructure": "Understanding the Infrastructure", + "DiggingInTheUseCases": "Digging in the Use Cases", + "DeployingTheSolution": "Deploying the Solution", + "ThisBookIsInDraftStageAndIsNotCompletedYet": "This book is in draft stage and is not completed yet.", + "Authors": "Authors", + "MicroserviceEBook": "Microservice E-Book", + "SelectUITheme": "Select UI Theme", + "LeptonXLiteTheme": "LeptonX Lite Theme", + "BasicTheme": "Basic Theme", + "LeptonXLiteThemeInfo": " A modern and stylish Bootstrap UI theme. Ideal if you want to have a production ready UI theme. This is the newest theme and is the default.", + "BasicThemeInfo": "Minimalist UI theme with plain Bootstrap colors and styles. Ideal if you will build your own UI theme.", + "SeeDocumentation": "See documentation.", + "SeeFullScreen": "🖼️ See the screenshot" } } diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/ro-RO.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/ro-RO.json index bd04ba7f49..a1ff5f58ad 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/ro-RO.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/ro-RO.json @@ -253,18 +253,18 @@ "Or": "Sau", "TellUsAboutYourself": "Spuneţi-ne un pic despre dumneavoastră", "Name": "Nume", - "Surname": "Nume", + "Surname": "Nume de familie", "CompanyName": "Nume companie", "DoYouAgreePrivacyPolicy": "Sunt de acord cu Termenii & condiţiile şi Politica de confidenţialitate.", "Free": "Gratuit", "DDDEBook": "E-book DDD", "PracticalGuideForImplementingDDD": "Această carte este un ghid practic pentru implementarea Domain Driven Design în framework-ul ABP.", "IntroducingDDD": "Introducere în Domain Driven Design", - "DDDLayersAndCleanArchitecture": "Straturile DDD & Arhitectură curată", + "DDDLayersAndCleanArchitecture": "Straturile DDD şi Arhitectură curată", "LayeringOfADotnetSolution": "Stratificarea unei soluţii .NET", "ImplementingDDDBuildingBlocks": "Implementând DDD Building Blocks", "DomainVsApplicationLogic": "Domain Logic vs Application Logic", - "SamplesAndDiscussions": "Exemple & Discuţii", + "SamplesAndDiscussions": "Exemple şi Discuţii", "EmailNotValid": "Vă rugăm să introduceţi o adresa de email validă.", "WeWillSendYouADownloadLink": "Un link care conţine e-book-ul a fost trimis către {0}. Verificaţi-vă folderele de inbox, junk sau spam!", "GoHome": "Pagina principală", diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/tr.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/tr.json index 01fe9f8b7b..a4a6e142a9 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/tr.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/tr.json @@ -279,6 +279,7 @@ "SubscribeToNewsletter": "ABP.IO Platform'u ile ilgili yeni haberler, makaleler, teklifler ve daha fazlası gibi gelişmeler hakkında bilgi almak için bültene abone olun.", "FirstEdition": "İlk Baskı", "ThankYou": "Teşekkürler!", - "CheckboxMandatory": "Devam etmek için bunu kontrol etmeniz gerekiyor!" + "CheckboxMandatory": "Devam etmek için bunu kontrol etmeniz gerekiyor!", + "ThisBookIsInDraftStageAndIsNotCompletedYet": "Bu kitap taslak aşamasındadır ve henüz tamamlanmamıştır." } } \ No newline at end of file diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/zh-Hans.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/zh-Hans.json index dd91379201..7826f00ca2 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/zh-Hans.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/zh-Hans.json @@ -174,6 +174,7 @@ "CreateProjectWizard": "此向导让你从启动模板创建一个新项目,该启动模板已正确配置为可以快速启动你的项目.", "TieredOption": "创建一个分层解决方案,其中Web和Http API层在物理上是分离的. 如果没有选中则创建一个不那么复杂且适合大多数场景的分层解决方案.", "SeparateIdentityServerOption": "将服务器端分离为两个应用程序:第一个应用程序用于身份服务器,第二个应用程序用于服务器端HTTP API.", + "ProgressiveWebApplicationOption": "将项目指定为渐进式 Web 应用程序", "UseslatestPreVersion": "使用最新的预发布版本", "ReadTheDocumentation": "阅读文档", "Documentation": "文档", @@ -214,7 +215,11 @@ "SeeDocs": "查看文档", "None": "空", "Application": "应用程序", + "ApplicationExplanation": "基于领域驱动设计实践创建一个完全分层的解决方案。 推荐用于需要可维护和可扩展代码库的长期项目。", + "ApplicationNoLayer": "应用程序(单层)", + "ApplicationNoLayerExplanation": "创建单层 Web 应用程序。 推荐用于构建具有更简单且易于理解的架构的应用程序。", "Module": "模块", + "ModuleExplanation": "创建可重用、完全分层的应用程序模块解决方案。 您可以使用此选项为您的模块化应用程序创建模块。", "PackageName": "包名称", "LicenseURL": "许可URL", "License": "许可", @@ -256,7 +261,7 @@ "Surname": "姓", "CompanyName": "公司名", "DoYouAgreePrivacyPolicy": "我同意条款和条件隐私政策。", - "Free": "自由", + "Free": "免费", "DDDEBook": "DDD电子书", "PracticalGuideForImplementingDDD": "本书是使用 ABP 框架实现领域驱动设计的实用指南。", "IntroducingDDD": "介绍领域驱动设计", @@ -273,6 +278,100 @@ "SubscribeToNewsletter": "订阅时事通讯以获取有关 ABP.IO 平台中发生的事件的信息,例如新版本、文章、优惠等。", "FirstEdition": "第一版", "ThankYou": "谢谢!", - "CheckboxMandatory": "你需要检查这个才能继续!" + "CheckboxMandatory": "你需要检查这个才能继续!", + "UserInterface": "用户界面", + "APIGateway": "API 网关", + "Database": "数据库", + "Saas": "Saas", + "OpenSourceWebApp": "开源
Web 应用程序", + "Framework": "框架", + "AuditLoggingExplanation": "自动跟踪系统中的所有操作和数据更改。", + "AbpNewCommandExplanation": "使用 ABP 启动模板创建新的解决方案。", + "AbpAddModuleCommandExplanation": "将预构建的应用程序模块安装到您的解决方案中", + "AbpUpdateCommandExplanation": "自动更新解决方案中所有与 ABP 相关的 NuGet 和 NPM 包。", + "ExploreAllCLICommands": "探索所有 CLI 命令", + "ExploreDocumentationAndGuides": "探索全面的文档和指南。", + "Documentations": "文档", + "Views": "意见", + "EnterYouEmailToGetNews": "输入您的电子邮件以获取有关 ABP 框架的最新消息", + "Tiered": "分层", + "SeparateIdentityServer": "独立的身份服务器", + "ProgressiveWebApplication": "渐进式 Web 应用程序", + "Preview": "预览", + "CreateANewSolution": "创建一个新的解决方案", + "ABPFrameworkFeatures": "ABP 框架 功能", + "Commercial": "商业版", + "ThirdPartyTools": "第三方工具", + "Back": "后退", + "Community": "社区", + "SeeMore": "查看更多", + "DetailsOfTheEBook": "电子书详情", + "JoinOurMarketingNewsletter": "加入我们的市场推广时事通讯", + "FrameworkNewsletterConfirmationMessage": "我同意条款和条件隐私政策。", + "GetYourFreeEBook": "获取您的 免费 DDD 电子书", + "EverythingYouNeedToKnow": "您需要了解的一切。", + "PreOrderNow": "立即预订", + "UITheming": "用户界面主题", + "UIThemingExplanation": "创建可重用的 UI 主题和布局,或使用预构建的 UI 主题之一。", + "DataFilteringExplanation2": "自动过滤来自数据库的查询,以轻松实现软删除和多租户等模式。", + "NeedHelp": "您需要帮助吗?", + "GiveYourProjectAName": "给您的项目命名", + "SelectProjectType": "选择项目类型", + "SelectUIFramework": "选择 UI 框架", + "SelectDatabaseProvider": "选择数据库提供者", + "SelectDatabaseManagementSystem": "选择数据库管理系统", + "InstallingTheABPCLI": "安装 ABP CLI", + "CreateYourProjectNow": "立即创建您的项目", + "OrderOn": "在 {0} 订购", + "DownloadFreeDDDBook": "下载免费的 DDD 书", + "WhatIsABPFramework": "什么是 ABP 框架?", + "TenantDatabase": "租户 {0} 数据库", + "SharedDatabase": "共享数据库", + "ConnectionResolver": "连接解析器", + "TenantBasedDataFilter": "基于租户的数据过滤器", + "ApplicationCode": "申请代码", + "TenantResolution": "租户决议", + "TenantUser": "租户 {0} 用户", + "CardTitle": "卡片标题", + "View": "查看", + "Model": "模型", + "Email": "电子邮箱", + "Password": "密码", + "Address": "地址", + "Gender": "性别", + "Male": "男", + "Female": "女", + "Submit": "提交", + "Unspecified": "未指定", + "StaticFileMiddleware": "静态文件中间件", + "RazorViewEngine": "Razor 视图引擎", + "PhysicalFiles": "物理文件 (wwwroot)", + "EmbeddedFiles": "嵌入式文件(DDL) ", + "DynamicFiles": "动态文件(内存)", + "BuildSolutionsWithAbp": "遵循使用 ABP 的软件开发最佳实践,构建可维护的 .NET 解决方案。", + "BuyOnAmazon": "在亚马逊上购买", + "BuyOnPackt": "在 Packt 上购买", + "Discounted": "打折", + "MasteringAbpFramework_Book_KeyFeatures": "主要特性", + "MasteringAbpFramework_Book_Key_Features_Description_1": "使用 ABP 框架构建强大、可维护、模块化和可扩展的软件解决方案。", + "MasteringAbpFramework_Book_Key_Features_Description_2": "了解如何在您的 Web 应用程序中实施 SOLID 原则和领域驱动设计。", + "MasteringAbpFramework_Book_Key_Features_Description_3": "了解 ABP 框架如何通过自动执行重复性任务来加快您的开发周期。", + "MasteringAbpFramework_Book_Description": "书籍说明", + "MasteringAbpFramework_Book_Description_Details_1": "ABP 框架是一个完整的基础架构,用于通过遵循软件 \n 开发最佳实践和约定来创建现代 Web 应用程序。 借助 ABP 的高级框架和生态系统,您可以 \n 实现 Don't Repeat Yourself (DRY) 原则并专注于您的业务代码。", + "MasteringAbpFramework_Book_Description_Details_2": "本书由 ABP 框架的创建者撰写,将帮助您全面了解该框架和现代 Web 应用程序开发技术。 通过对基本概念和实际示例的逐步解释,您将了解现代 Web 解决方案的要求以及 ABP\n 框架如何使开发您自己的解决方案变得轻松愉快。 您将发现\n 企业 Web 应用程序开发的常见需求,并探索 ABP 提供的基础架构。 在整本书中,您将掌握构建可维护和模块化 Web 解决方案的软件开发最佳实践。", + "MasteringAbpFramework_Book_Description_Details_3": "在本书结束时,您将能够创建一个易于开发、\n 维护和测试的完整 Web 解决方案。", + "MasteringAbpFramework_Book_WhatYouWillLearn": "你将会学到什么", + "MasteringAbpFramework_Book_What_You_Will_Learn_1": "设置开发环境并开始使用 ABP 框架。", + "MasteringAbpFramework_Book_What_You_Will_Learn_2": "使用 Entity Framework Core 和 MongoDB 开发您的数据访问层。", + "MasteringAbpFramework_Book_What_You_Will_Learn_3": "了解横切关注点以及 ABP 如何自动执行重复性任务。", + "MasteringAbpFramework_Book_What_You_Will_Learn_4": "掌握使用 ABP 框架实施领域驱动设计。", + "MasteringAbpFramework_Book_What_You_Will_Learn_5": "使用 ASP.NET Core MVC (Razor Pages) 和 Blazor 构建 UI 页面和组件。", + "MasteringAbpFramework_Book_What_You_Will_Learn_6": "使用多租户创建模块化 Web 应用程序。", + "MasteringAbpFramework_Book_What_You_Will_Learn_7": "了解模块化并创建可重用的应用程序模块。", + "MasteringAbpFramework_Book_What_You_Will_Learn_8": "使用 ABP 框架编写单元、集成和 UI 测试。", + "MasteringAbpFramework_Book_WhoIsThisBookFor": "这本书是给谁看的", + "MasteringAbpFramework_Book_WhoIsThisBookFor_Description": "本书适用于希望学习软件架构和最佳实践的 Web 开发人员,以使用 Microsoft 技术和 ABP 框架构建\n 可维护的基于 Web 的解决方案。 C#\n 和 ASP.NET Core 的基本知识是开始阅读本书所必需的。", + "ComputersAndTechnology": "计算机与技术", + "ThisBookIsInDraftStageAndIsNotCompletedYet": "这本书正在草案阶段,还没有完成。" } } \ No newline at end of file diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/zh-Hant.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/zh-Hant.json index c8d31d2002..62a941951e 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/zh-Hant.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/zh-Hant.json @@ -256,7 +256,7 @@ "Surname": "姓", "CompanyName": "公司名", "DoYouAgreePrivacyPolicy": "我同意條款和條件隱私政策。", - "Free": "自由", + "Free": "免費", "DDDEBook": "DDD電子書", "PracticalGuideForImplementingDDD": "本書是使用 ABP 框架實現領域驅動設計的實用指南。", "IntroducingDDD": "介紹領域驅動設計", diff --git a/common.DotSettings b/common.DotSettings index 5c1cda48fd..f2cc0339ae 100644 --- a/common.DotSettings +++ b/common.DotSettings @@ -38,5 +38,6 @@ False False False + True True \ No newline at end of file diff --git a/common.props b/common.props index e6c9c40c28..f8b7c620c2 100644 --- a/common.props +++ b/common.props @@ -1,7 +1,7 @@ latest - 6.0.0 + 7.0.0 $(NoWarn);CS1591;CS0436 https://abp.io/assets/abp_nupkg.png https://abp.io/ diff --git a/docs/en/Apps/VoloDocs.md b/docs/en/Apps/VoloDocs.md index f85aa78bbd..9fe8ff2507 100644 --- a/docs/en/Apps/VoloDocs.md +++ b/docs/en/Apps/VoloDocs.md @@ -23,13 +23,13 @@ https://github.com/abpframework/abp/tree/master/modules/docs You can download the VoloDocs release from the following links: -http://apps.abp.io/VoloDocs/VoloDocs.win-x64.zip - **Windows 64 bit** +https://apps.abp.io/VoloDocs/VoloDocs.win-x64.zip - **Windows 64 bit** -http://apps.abp.io/VoloDocs/VoloDocs.win-x86.zip - **Windows 32 bit** +https://apps.abp.io/VoloDocs/VoloDocs.win-x86.zip - **Windows 32 bit** -http://apps.abp.io/VoloDocs/VoloDocs.osx-x64.zip - **MacOS** +https://apps.abp.io/VoloDocs/VoloDocs.osx-x64.zip - **MacOS** -http://apps.abp.io/VoloDocs/VoloDocs.linux-x64.zip - **Linux** +https://apps.abp.io/VoloDocs/VoloDocs.linux-x64.zip - **Linux** Notice that, all installations are self-contained deployments. It means all the required third-party dependencies along with the version of .NET Core is included. So you don't need to install any .NET Core SDK / Runtime. diff --git a/docs/en/Authorization.md b/docs/en/Authorization.md index 869c49a52a..063af84708 100644 --- a/docs/en/Authorization.md +++ b/docs/en/Authorization.md @@ -459,6 +459,15 @@ public static class CurrentUserExtensions } ``` +> If you use Identity Server please add your claims to `RequestedClaims` of `AbpClaimsServiceOptions`. + +```csharp +Configure(options => +{ + options.RequestedClaims.AddRange(new[]{ "SocialSecurityNumber" }); +}); +``` + ## See Also * [Permission Management Module](Modules/Permission-Management.md) diff --git a/docs/en/Background-Jobs-Hangfire.md b/docs/en/Background-Jobs-Hangfire.md index 4ee58d84ef..869a8075af 100644 --- a/docs/en/Background-Jobs-Hangfire.md +++ b/docs/en/Background-Jobs-Hangfire.md @@ -80,6 +80,41 @@ After you have installed these NuGet packages, you need to configure your projec } ```` +### Specifying Queue + +You can use the [`QueueAttribute`](https://docs.hangfire.io/en/latest/background-processing/configuring-queues.html) to specify the queue. + +````csharp +using System.Threading.Tasks; +using Volo.Abp.BackgroundJobs; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Emailing; + +namespace MyProject +{ + [Queue("alpha")] + public class EmailSendingJob + : AsyncBackgroundJob, ITransientDependency + { + private readonly IEmailSender _emailSender; + + public EmailSendingJob(IEmailSender emailSender) + { + _emailSender = emailSender; + } + + public override async Task ExecuteAsync(EmailSendingArgs args) + { + await _emailSender.SendAsync( + args.EmailAddress, + args.Subject, + args.Body + ); + } + } +} +```` + ### Dashboard Authorization Hangfire Dashboard provides information about your background jobs, including method names and serialized arguments as well as gives you an opportunity to manage them by performing different actions – retry, delete, trigger, etc. So it is important to restrict access to the Dashboard. diff --git a/docs/en/Background-Jobs-RabbitMq.md b/docs/en/Background-Jobs-RabbitMq.md index 16b8b0981a..8eec3733fb 100644 --- a/docs/en/Background-Jobs-RabbitMq.md +++ b/docs/en/Background-Jobs-RabbitMq.md @@ -126,25 +126,31 @@ By default, all the job types use the `Default` RabbitMQ connection. Configure(options => { options.DefaultQueueNamePrefix = "my_app_jobs."; + options.DefaultDelayedQueueNamePrefix = "my_app_jobs.delayed" + options.PrefetchCount = 1; options.JobQueues[typeof(EmailSendingArgs)] = new JobQueueConfiguration( typeof(EmailSendingArgs), queueName: "my_app_jobs.emails", - connectionName: "SecondConnection" + connectionName: "SecondConnection", + delayedQueueName:"my_app_jobs.emails.delayed" ); }); ```` -* This example sets the default queue name prefix to `my_app_jobs.`. If different applications use the same RabbitMQ server, it would be important to use different prefixes for each application to not consume jobs of each other. +* This example sets the default queue name prefix to `my_app_jobs.` and default delayed queue name prefix to `my_app_jobs.delayed`. If different applications use the same RabbitMQ server, it would be important to use different prefixes for each application to not consume jobs of each other. +* Sets `PrefetchCount` for all queues. * Also specifies a different connection string for the `EmailSendingArgs`. `JobQueueConfiguration` class has some additional options in its constructor; * `queueName`: The queue name that is used for this job. The prefix is not added, so you need to specify the full name of the queue. +* `DelayedQueueName`: The delayed queue name that is used for delayed execution of job. The prefix is not added, so you need to specify the full name of the queue. * `connectionName`: The RabbitMQ connection name (see the connection configuration above). This is optional and the default value is `Default`. * `durable` (optional, default: `true`). * `exclusive` (optional, default: `false`). -* `autoDelete` (optional, default: `false`) +* `autoDelete` (optional, default: `false`). +* `PrefetchCount` (optional, default: null) See the RabbitMQ documentation if you want to understand the `durable`, `exclusive` and `autoDelete` options better, while most of the times the default configuration is what you want. diff --git a/docs/en/Background-Workers.md b/docs/en/Background-Workers.md index 286d6ab7b0..6206e2fbd1 100644 --- a/docs/en/Background-Workers.md +++ b/docs/en/Background-Workers.md @@ -128,7 +128,7 @@ Be careful if you run multiple instances of your application simultaneously in a If that's a problem for your workers, you have the following options: -* Implement your background workers so that they work in a clustered environment without any problem. Using the [distributed lock](../Distributed-Locking.md) to ensure concurrency control is a way of doing that. A background worker in an application instance may handle a distributed lock, so the workers in other application instances will wait for the lock. In this way, only one worker does the actual work, while others wait in idle. If you implement this, your workers run safely without caring about how the application is deployed. +* Implement your background workers so that they work in a clustered environment without any problem. Using the [distributed lock](Distributed-Locking.md) to ensure concurrency control is a way of doing that. A background worker in an application instance may handle a distributed lock, so the workers in other application instances will wait for the lock. In this way, only one worker does the actual work, while others wait in idle. If you implement this, your workers run safely without caring about how the application is deployed. * Stop the background workers (set `AbpBackgroundWorkerOptions.IsEnabled` to `false`) in all application instances except one of them, so only the single instance runs the workers. * Stop the background workers (set `AbpBackgroundWorkerOptions.IsEnabled` to `false`) in all application instances and create a dedicated application (maybe a console application running in its own container or a Windows Service running in the background) to execute all the background tasks. This can be a good option if your background workers consume high system resources (CPU, RAM or Disk), so you can deploy that background application to a dedicated server and your background tasks don't affect your application's performance. diff --git a/docs/en/Blog-Posts/2022-07-26 v6_0_Preview/POST.md b/docs/en/Blog-Posts/2022-07-26 v6_0_Preview/POST.md new file mode 100644 index 0000000000..2b756f2958 --- /dev/null +++ b/docs/en/Blog-Posts/2022-07-26 v6_0_Preview/POST.md @@ -0,0 +1,380 @@ +# ABP.IO Platform 6.0 RC Has Been Released + +Today, we are happy to release the [ABP Framework](https://abp.io/) and [ABP Commercial](https://commercial.abp.io/) version **6.0 RC** (release candidate). This blog post introduces the new features and important changes in this new version. + +> **The planned release date for the [6.0.0 Stable](https://github.com/abpframework/abp/milestone/71) version is September 06, 2022**. + +Try this version and provide feedback for the stable ABP v6.0! Thank you to all. + +## Get Started with the 6.0 RC + +Follow the steps below to try version 6.0.0 RC today: + +1) **Upgrade** the ABP CLI to version `6.0.0-rc.1` using a command line terminal: + +````bash +dotnet tool update Volo.Abp.Cli -g --version 6.0.0-rc.1 +```` + +**or install** it if you haven't before: + +````bash +dotnet tool install Volo.Abp.Cli -g --version 6.0.0-rc.1 +```` + +2) Create a **new application** with the `--preview` option: + +````bash +abp new BookStore --preview +```` + +See the [ABP CLI documentation](https://docs.abp.io/en/abp/latest/CLI) for all the available options. + +> You can also use the *Direct Download* tab on the [Get Started](https://abp.io/get-started) page by selecting the **Preview checkbox**. + +You can use any IDE that supports .NET 6.x, like **[Visual Studio 2022](https://visualstudio.microsoft.com/downloads/)**. + +## Migration Guides + +There are breaking changes in this version that may affect your application. +Please see the following migration documents, if you are upgrading from v5.3.0: + +* [ABP Framework 5.3 to 6.0 Migration Guide](https://docs.abp.io/en/abp/6.0/Migration-Guides/Abp-6_0) +* [ABP Commercial 5.3 to 6.0 Migration Guide](https://docs.abp.io/en/commercial/6.0/migration-guides/v6_0) + +## What's New with ABP Framework 6.0? + +In this section, I will introduce some major features released in this version. Here is a brief list of titles explained in the next sections: + +* **LeptonX Lite** is now the **default theme** for startup templates. +* Optional PWA support is added to [*Get Started*](https://abp.io/get-started) page. +* Introducing the **OpenIddict Module** and switching to OpenIddict for the startup templates. +* New **.NET MAUI** Startup Template. +* Introducing the `ITransientCachedServiceProvider` interface. +* Introducing the dynamic components for Blazor UI. +* Improvements on ABP CLI. +* Introducing the `Volo.Abp.RemoteServices` package. +* Create/Update user accounts for external logins. +* Sending test email in the setting page for MVC and Blazor user interfaces. +* Improvements on the **eShopOnAbp** project. +* Other news... + +### LeptonX Lite Theme on Startup Templates + +![](leptonx-lite-theme.png) + +With this version, startup templates (`app` and `app-nolayers` templates) use the **LeptonX Lite** as the default theme. However, it's still possible to create a project with **Basic Theme** either using the **ABP CLI** or downloading the project via [*Get Started*](https://abp.io/get-started) page on the [abp.io](https://abp.io/) website. + +#### via ABP CLI + +To create a new project with **Basic Theme**, you can use the `--theme` option as below: + +```bash +abp new Acme.BookStore --theme basic --preview +``` + +#### via Get Started page + +Also, you can create a new project with **LeptonX Lite** or **Basic Theme** on *Get Started* page. + +![](get-started-page.png) + +> The "Preview" checkbox should be checked to be able to see the theme selection section on the *Get Started* page. + + + +### Optional PWA Support is Added to the Get Started Page + +We've introduced the PWA (Progressive Web Application) support for the startup templates for Angular & Blazor WASM UIs in **v5.3**. In this version, we also added this PWA support to the [*Get Started*](https://abp.io/get-started) page on the [abp.io](https://abp.io/) website. + +![](pwa-support-get-started-page.png) + +If you check the "Progressive Web Application" checkbox while creating an application, the all required configurations will be done for you and you will get the benefit of PWA features in your application. + + + +### Introducing the **OpenIddict Module** and Switching to OpenIddict in the Startup Templates + +We already [announced the plan of replacing the IdentityServer with OpenIddict](https://github.com/abpframework/abp/issues/11989). + +Therefore, we have created the `OpenIddict` module in this version and switched to **OpenIddict** in the startup templates. The ABP Framework uses this module to add **OAuth** features to the applications. We created documentation for the **OpenIddict Module**. + +- You can see the following document to **learn about the OpenIddict Module**: + [https://docs.abp.io/en/abp/6.0/Modules/OpenIddict](https://docs.abp.io/en/abp/6.0/Modules/OpenIddict) +- You can check out the following migration guide to learn **how to migrate to OpenIddict**: + [https://docs.abp.io/en/abp/6.0/Migration-Guides/IdentityServer_To_OpenIddict](https://docs.abp.io/en/abp/6.0/Migration-Guides/IdentityServer_To_OpenIddict) + + + +> We will continue to ship Identity Server packages for a while but in the long term, you may need to replace it, because Identity Server support ends at the end of 2022. Please see the [announcement]((https://github.com/abpframework/abp/issues/11989)) for more info. + + + +### New .NET MAUI Startup Template + +![](maui-template.png) + +ABP Framework provides .NET MAUI startup templates with **v6.0.0**. You can create a new .NET MAUI project with the command below: + +```bash +abp new Acme.BookStore -t maui +``` + + + +### Introducing the `ITransientCachedServiceProvider` + +`ICachedServiceProvider` interface is used to resolve the cached services within a new scope. We created a new interface to resolve cached services **without creating scopes**. It's called `ITransientCachedServiceProvider`. The difference between `ICachedServiceProvider` and `ITransientCachedServiceProvider` is; `ITransientCachedServiceProvider` is transient. Check out [this issue](https://github.com/abpframework/abp/issues/12918) for more information. + + + +### Introducing the dynamic layout components for Blazor UI + +ABP Framework provides different ways of customizing the UI and one of them is to use [Layout Hooks](https://docs.abp.io/en/abp/latest/UI/AspNetCore/Layout-Hooks) in MVC. The **Layout Hook System** allows you to add code to some specific parts of the layout and all layouts of the themes provided by the ABP Framework implement these hooks. + +However, Blazor UI doesn't have such a system yet and we are planning to implement [Layout Hooks for the Blazor UI](https://github.com/abpframework/abp/issues/6261) in version 7.0. + +We are introducing the dynamic layout components for the Blazor UI to be able to add components to the Blazor layouts. + +You can configure the `AbpDynamicLayoutComponentOptions` to render your components in the layout, as below: + +```csharp +Configure(options => +{ + options.Components.Add(typeof(MyBlazorComponent), null); +}); +``` + + + +### Improvements in ABP CLI + +There are some enhancements in [ABP CLI](https://docs.abp.io/en/abp/6.0/CLI). You can see the brief list of some of these improvements below: + +* You can list all available templates by using the `abp list-templates` command with v6.0. See [#13083](https://github.com/abpframework/abp/pull/13083). +* You can select the theme when creating a new project by specifying the `--theme` option. You can see the *LeptonX Lite Theme on the Startup Templates* section above for an example. +* `abp update` command has been updating the version of the main application until now. With v6.0.0, this command updates all package versions **inside all solutions in the sub-folders**. Checkout the issue [#12735](https://github.com/abpframework/abp/pull/12738) for more information. + + + +### Introducing the `Volo.Abp.RemoteService` Package + +A new `Volo.Abp.RemoteService` package has been added to the framework. Some of the classes that are related to the remote service configurations such as `AbpRemoteServiceOptions` class moved from `Volo.Abp.Http.Client` to this package. In this way, it became more reusable for further usages. + + + +### Create/Update User Accounts For External Logins + +If a user authenticates from an external provider like `Keycloak`, the user is being redirected to this external provider, and comes back to the main application. In this process, the user's data is not being saved in the main application's database. With this version, ABP saves the user information and lists in the users page. And this fixes permission management, user information mismatches and other issues. For more info, see [the related issue](https://github.com/abpframework/abp/issues/12203). + + + +### Sending test email in the setting page for MVC and Blazor UIs + +"Sending Test Email" feature is added to the [Setting Management](https://docs.abp.io/en/abp/6.0/Modules/Setting-Management) module, which allows checking the email settings are configured properly and sending emails successfully to the target email address. + +![](setting-management-emailing.png) + +After configuring the email settings such as the target email address, you can click the "Send" button to send a test email to see if everything went well. + +> Note that this feature will be implemented for the Angular UI in the stable v6.0. + + + +### Improvements on eShopOnAbp Project + +The following improvements have been made on [eShopOnAbp project](https://github.com/abpframework/eShopOnAbp) with this version: + +* Some improvements have been made on the Admin Application for Order Management for Angular UI. See [#110](https://github.com/abpframework/eShopOnAbp/pull/110). +* `SignalR` error on Kubernetes & Docker Compose has been fixed. See [#113](https://github.com/abpframework/eShopOnAbp/pull/113). +* eShopOnAbp project has been deployed to Azure Kubernetes Service. See [#114](https://github.com/abpframework/eShopOnAbp/pull/114). The live demo can be seen from [eshoponabp.com](https://eshoponabp.com/). +* Configurations have been made for some services on the `docker-compose.yml` file. See [#112](https://github.com/abpframework/eShopOnAbp/pull/112). +* Gateway Redirect Loop problem on Kubernetes has been fixed. See [the commit](https://github.com/abpframework/eShopOnAbp/commit/6413ef15c91cd8a5309050b63bb4dbca23587607). + + + +### Other News + +* Autofac library has been upgraded to **v6.4.0**. Please see [#12816](https://github.com/abpframework/abp/pull/12816) for more info. +* Performance Improvements have been made in the **Settings Module** and tabs on the *Settings* page are lazy loading now. +* Some improvements have been made in the CMS Kit Module. You can see the improvements from [here](https://github.com/abpframework/abp/issues/11965). + +If you want to see more details, you can check [the release on GitHub](https://github.com/abpframework/abp/releases/tag/6.0.0-rc.1), which contains a list of all the issues and pull requests closed in this version. + + + +## What's New with ABP Commercial 6.0? + + + +### LeptonX Theme is the Default Theme + +With this version, the startup templates (`app-pro`, `app-nolayers-pro` and `microservice-pro` templates) use the **LeptonX Theme** as the default theme. However, it's still possible to create a new project with **Lepton Theme** or **Basic Theme**, either using the **ABP CLI** or **ABP Suite**. + +#### via ABP CLI + +To create a new project with **Lepton Theme** or **Basic Theme**, you can use the `--theme` option as below. For "Basic Theme" specify the theme name as `--theme basic`. + +```bash +abp new Acme.BookStore --theme lepton --preview +``` + + + +#### via ABP Suite + +Also, you can create a new project with **Lepton Theme** or **Basic Theme** from ABP Suite. + +![](suite-create-new-solution.png) + +### Switching to OpenIddict in the Startup Templates + +We have also switched to the **OpenIddict** for the startup templates for ABP Commercial as explained above. + + + +### New .NET MAUI Mobile + +![](maui-mobile-option.gif) + +ABP Commercial has been providing a [React Native](https://docs.abp.io/en/commercial/latest/getting-started-react-native) mobile app since with the very early versions. Alternative to this application, we created a new .NET MAUI mobile app. To create a new `app-pro` ABP project with the .NET MAUI mobile app, you can use the command below: + +```bash +abp new Acme.BookStore -t app-pro --mobile maui +``` + +> Note that, when Microsoft supports `WebAuthenticator` on Windows, we'll also support it to work on Windows OS. + + + +### GDPR: Cookie Consent + +![](cookie-banner.png) + +With this version, the **Cookie Consent** feature has been added to the **GDPR** module. It's enabled by default for the new startup templates. There are two pages in the templates: "Cookie Policy" page and "Privacy Policy" page. + +If you want to disable/hide the "Cookie Consent", you can simply open the startup project module class and set the `IsEnabled` property as **false** for the **AddAbpCookieConsent** method as below: + +```csharp +context.Services.AddAbpCookieConsent(options => +{ + options.IsEnabled = false; //disabled + options.CookiePolicyUrl = "/CookiePolicy"; + options.PrivacyPolicyUrl = "/PrivacyPolicy"; +}); +``` + +> These pages are used to build up the cookie consent text and you can change the content or url of these pages by your needs. + +If you want to use the Cookie Consent feature of the GDPR module in your existing project, please see the [GDPR Module](https://docs.abp.io/en/commercial/6.0/modules/gdpr) documentation for configurations. + +### Improvements/Developments on CMS Kit Poll + +Some improvements have been made on the Poll System of CMS Kit module as listed below: + +* The Widget rendering and Admin side for the Blazor UI improvements. +* A Widget can be picked from the editor as seen in the image below. + +![](poll-add-widget.png) + + + +### Blazor UI for the Chat Module + +Chat Module is now also available for the Blazor UI after the MVC and Angular UIs. You can read the [Chat Module](https://docs.abp.io/en/commercial/6.0/modules/chat) documentation to get the overall knowledge about the module and add to your application. + +![](blazor-chat-module-1.png) +![](blazor-chat-module-2.png) + + + +### Blazor Admin UI for CMS Kit Module + +All admin side **CMS Kit** and **CMS Kit Pro** features have been implemented for the Blazor UI. Blazor UI will only be available to ABP Commercial customers. + +![](cms-blog-blazor.png) + +![](cms-blog-post-blazor.png) + + +### Suite: Excel Export + +With v6.0, now it's possible to export the records as Excel for Blazor & MVC UIs. Angular UI is still in-progress, and we will implement it with the stable v6.0 release. Check the "Excel export" checkbox to add this feature. + +![](excel-export.png) + + + +A new Excel Export button is being located at the top of the generated page as seen below: + +![](export-excel-page.png) + +Then, you can download the records as `.xlsx` format by clicking the "Excel Export" button. Note that the exported Excel list is the filtered list. + + + +### ABP Suite: Optional PWA Support + +With this version, it's possible to add the [PWA (Progressive Web App)](https://web.dev/progressive-web-apps/?gclid=Cj0KCQjwxIOXBhCrARIsAL1QFCY0IB-W5k-lsXmRCbm00sl4nyBIYynAX3IdJkjyizyNUjuCE8zeu24aApxtEALw_wcB) support for Blazor & Angular UIs while creating the application via Suite. + +![](suite-pwa-support.png) + +You just need to check the "Progressive web application" checkbox, when creating a new application. Then, ABP Suite will add the PWA support to your application. When you publish your application, you get the full benefits of PWA features such as offline support. + + + +### Other News + +#### Explainer Videos + +We are creating explainer videos for the ABP Commercial Modules to provide an overview. Within this milestone, we've created four new explainer videos: + +* [Audit Logging Module](https://www.youtube.com/watch?v=NzSuFBpqfsc) +* [Identity Module](https://www.youtube.com/watch?v=W87jA_GBE54) +* [SaaS Module](https://www.youtube.com/watch?v=xXlaaXP6qqQ) +* [Forms Module](https://www.youtube.com/watch?v=MousWEPfrA8) + +You can subscribe to [Volosoft's YouTube channel](https://www.youtube.com/channel/UCO3XKlpvq8CA5MQNVS6b3dQ) to be informed about the future ABP events and videos. + + + +### Trial License is now available! + +![](pricing-page.png) + +If you are considering purchasing a new ABP Commercial license, and you want to see ABP in action then, check out https://commercial.abp.io/pricing and click FREE TRIAL button. + + + +## Community News + +### New ABP Community Posts + +* [Alper Ebicoglu](https://twitter.com/alperebicoglu) has created a new community article to give a full overview of .NET MAUI. You can read it [here](https://community.abp.io/posts/all-about-.net-maui-gb4gkdg5). +* [Anto Subash](https://twitter.com/antosubash) has created a new video content to show "State Management in Blazor with Fluxor". You can read it [here](https://community.abp.io/posts/blazor-state-management-with-fluxor-raskpv19). +* [Learn ABP Framework](https://community.abp.io/members/learnabp) has also created a new video content to show "How to install LeptonX Lite Theme for ABP Framework 5.3 MVC UI". You can read it [here](https://community.abp.io/posts/how-to-install-leptonx-lite-theme-on-abp-framework-5.3-mvc-ui-epzng137). +* [Kirti Kulkarni](https://twitter.com/kirtimkulkarni) has created three new community articles. You can use the links below to read the articles: + * [Integrating the file management module with ABP Commercial application](https://community.abp.io/posts/integrating-the-file-management-module-with-abp-commercial-application-qd6v4dsr) + * [Work with PDF's in ABP Commercial Project using PDFTron](https://community.abp.io/posts/work-with-pdfs-in-abp-commercial-project-using-pdftron-tjw0hlgu) + * [Create a custom login page in ABP Commercial Angular app](https://community.abp.io/posts/create-a-custom-login-page-in-abp-commercial-angular-app-r2huidx7) +* [Don Boutwell](https://community.abp.io/members/dboutwell) has created his first ABP Community article. You can read it from [here](https://community.abp.io/posts/password-required-redis-with-abp-framework-and-docker-94old5rm). + + + +### Volosoft Has Attended the DNF Summit 2022 + +![](dnf-summit.png) + +Core team members of ABP Framework, [Halil Ibrahim Kalkan](https://twitter.com/hibrahimkalkan) and [Alper Ebicoglu](https://twitter.com/alperebicoglu) have attended the [DNF Summit](https://t.co/ngWnBLiAn5) on the 20th of July. Halil Ibrahim Kalkan talked about the creation of the ABP Framework and Alper Ebicoglu showed how easy to create a project with ABP Framework within 15 minutes. + +Watch DNF Summit session 👉 https://www.youtube.com/embed/VL0ewZ-0ruo + +![](dnf-summit-attendees.jpg) + + + +## Conclusion + +This version comes with some features and enhancements to the existing features. You can see the [Road Map](https://docs.abp.io/en/abp/6.0/Road-Map) documentation to learn about the release schedule and planned features for the next releases. The planned release date for the [6.0.0 Stable](https://github.com/abpframework/abp/milestone/71) version is September 06, 2022. Please try the ABP v6.0 RC and provide feedback to us. + +Thanks for being a part of this community! \ No newline at end of file diff --git a/docs/en/Blog-Posts/2022-07-26 v6_0_Preview/blazor-chat-module-1.png b/docs/en/Blog-Posts/2022-07-26 v6_0_Preview/blazor-chat-module-1.png new file mode 100644 index 0000000000..6d847c9065 Binary files /dev/null and b/docs/en/Blog-Posts/2022-07-26 v6_0_Preview/blazor-chat-module-1.png differ diff --git a/docs/en/Blog-Posts/2022-07-26 v6_0_Preview/blazor-chat-module-2.png b/docs/en/Blog-Posts/2022-07-26 v6_0_Preview/blazor-chat-module-2.png new file mode 100644 index 0000000000..24f0688319 Binary files /dev/null and b/docs/en/Blog-Posts/2022-07-26 v6_0_Preview/blazor-chat-module-2.png differ diff --git a/docs/en/Blog-Posts/2022-07-26 v6_0_Preview/cms-blog-blazor.png b/docs/en/Blog-Posts/2022-07-26 v6_0_Preview/cms-blog-blazor.png new file mode 100644 index 0000000000..5d169aa322 Binary files /dev/null and b/docs/en/Blog-Posts/2022-07-26 v6_0_Preview/cms-blog-blazor.png differ diff --git a/docs/en/Blog-Posts/2022-07-26 v6_0_Preview/cms-blog-post-blazor.png b/docs/en/Blog-Posts/2022-07-26 v6_0_Preview/cms-blog-post-blazor.png new file mode 100644 index 0000000000..1722a85b10 Binary files /dev/null and b/docs/en/Blog-Posts/2022-07-26 v6_0_Preview/cms-blog-post-blazor.png differ diff --git a/docs/en/Blog-Posts/2022-07-26 v6_0_Preview/cookie-banner.png b/docs/en/Blog-Posts/2022-07-26 v6_0_Preview/cookie-banner.png new file mode 100644 index 0000000000..cbfafbc907 Binary files /dev/null and b/docs/en/Blog-Posts/2022-07-26 v6_0_Preview/cookie-banner.png differ diff --git a/docs/en/Blog-Posts/2022-07-26 v6_0_Preview/cover-image.png b/docs/en/Blog-Posts/2022-07-26 v6_0_Preview/cover-image.png new file mode 100644 index 0000000000..1a6e267b86 Binary files /dev/null and b/docs/en/Blog-Posts/2022-07-26 v6_0_Preview/cover-image.png differ diff --git a/docs/en/Blog-Posts/2022-07-26 v6_0_Preview/dnf-summit-attendees.jpg b/docs/en/Blog-Posts/2022-07-26 v6_0_Preview/dnf-summit-attendees.jpg new file mode 100644 index 0000000000..42df8aaf4e Binary files /dev/null and b/docs/en/Blog-Posts/2022-07-26 v6_0_Preview/dnf-summit-attendees.jpg differ diff --git a/docs/en/Blog-Posts/2022-07-26 v6_0_Preview/dnf-summit.png b/docs/en/Blog-Posts/2022-07-26 v6_0_Preview/dnf-summit.png new file mode 100644 index 0000000000..dff3609c20 Binary files /dev/null and b/docs/en/Blog-Posts/2022-07-26 v6_0_Preview/dnf-summit.png differ diff --git a/docs/en/Blog-Posts/2022-07-26 v6_0_Preview/excel-export.png b/docs/en/Blog-Posts/2022-07-26 v6_0_Preview/excel-export.png new file mode 100644 index 0000000000..393ea33ada Binary files /dev/null and b/docs/en/Blog-Posts/2022-07-26 v6_0_Preview/excel-export.png differ diff --git a/docs/en/Blog-Posts/2022-07-26 v6_0_Preview/export-excel-page.png b/docs/en/Blog-Posts/2022-07-26 v6_0_Preview/export-excel-page.png new file mode 100644 index 0000000000..243752969e Binary files /dev/null and b/docs/en/Blog-Posts/2022-07-26 v6_0_Preview/export-excel-page.png differ diff --git a/docs/en/Blog-Posts/2022-07-26 v6_0_Preview/get-started-page.png b/docs/en/Blog-Posts/2022-07-26 v6_0_Preview/get-started-page.png new file mode 100644 index 0000000000..5ae76b1398 Binary files /dev/null and b/docs/en/Blog-Posts/2022-07-26 v6_0_Preview/get-started-page.png differ diff --git a/docs/en/Blog-Posts/2022-07-26 v6_0_Preview/leptonx-lite-theme.png b/docs/en/Blog-Posts/2022-07-26 v6_0_Preview/leptonx-lite-theme.png new file mode 100644 index 0000000000..e87a06f4fb Binary files /dev/null and b/docs/en/Blog-Posts/2022-07-26 v6_0_Preview/leptonx-lite-theme.png differ diff --git a/docs/en/Blog-Posts/2022-07-26 v6_0_Preview/maui-mobile-option.gif b/docs/en/Blog-Posts/2022-07-26 v6_0_Preview/maui-mobile-option.gif new file mode 100644 index 0000000000..645346abc6 Binary files /dev/null and b/docs/en/Blog-Posts/2022-07-26 v6_0_Preview/maui-mobile-option.gif differ diff --git a/docs/en/Blog-Posts/2022-07-26 v6_0_Preview/maui-template.png b/docs/en/Blog-Posts/2022-07-26 v6_0_Preview/maui-template.png new file mode 100644 index 0000000000..0d9df0e63f Binary files /dev/null and b/docs/en/Blog-Posts/2022-07-26 v6_0_Preview/maui-template.png differ diff --git a/docs/en/Blog-Posts/2022-07-26 v6_0_Preview/poll-add-widget.png b/docs/en/Blog-Posts/2022-07-26 v6_0_Preview/poll-add-widget.png new file mode 100644 index 0000000000..51cd34b9bf Binary files /dev/null and b/docs/en/Blog-Posts/2022-07-26 v6_0_Preview/poll-add-widget.png differ diff --git a/docs/en/Blog-Posts/2022-07-26 v6_0_Preview/pricing-page.png b/docs/en/Blog-Posts/2022-07-26 v6_0_Preview/pricing-page.png new file mode 100644 index 0000000000..21b19b4ed7 Binary files /dev/null and b/docs/en/Blog-Posts/2022-07-26 v6_0_Preview/pricing-page.png differ diff --git a/docs/en/Blog-Posts/2022-07-26 v6_0_Preview/pwa-support-get-started-page.png b/docs/en/Blog-Posts/2022-07-26 v6_0_Preview/pwa-support-get-started-page.png new file mode 100644 index 0000000000..e91e4e5223 Binary files /dev/null and b/docs/en/Blog-Posts/2022-07-26 v6_0_Preview/pwa-support-get-started-page.png differ diff --git a/docs/en/Blog-Posts/2022-07-26 v6_0_Preview/setting-management-emailing.png b/docs/en/Blog-Posts/2022-07-26 v6_0_Preview/setting-management-emailing.png new file mode 100644 index 0000000000..f2c5475655 Binary files /dev/null and b/docs/en/Blog-Posts/2022-07-26 v6_0_Preview/setting-management-emailing.png differ diff --git a/docs/en/Blog-Posts/2022-07-26 v6_0_Preview/suite-create-new-solution.png b/docs/en/Blog-Posts/2022-07-26 v6_0_Preview/suite-create-new-solution.png new file mode 100644 index 0000000000..5756a65ad0 Binary files /dev/null and b/docs/en/Blog-Posts/2022-07-26 v6_0_Preview/suite-create-new-solution.png differ diff --git a/docs/en/Blog-Posts/2022-07-26 v6_0_Preview/suite-pwa-support.png b/docs/en/Blog-Posts/2022-07-26 v6_0_Preview/suite-pwa-support.png new file mode 100644 index 0000000000..bf5982b68a Binary files /dev/null and b/docs/en/Blog-Posts/2022-07-26 v6_0_Preview/suite-pwa-support.png differ diff --git a/docs/en/CLI-New-Command-Samples.md b/docs/en/CLI-New-Command-Samples.md index 1a7a8a551a..26d098c98e 100644 --- a/docs/en/CLI-New-Command-Samples.md +++ b/docs/en/CLI-New-Command-Samples.md @@ -1,6 +1,6 @@ # ABP CLI - New Solution Sample Commands -The `abp new` command creates an ABP solution or other artifacts based on an ABP template. [ABP CLI](CLI.md) has several parameters to create a new ABP solution. In this document we will show you some sample commands to create a new solution. All the project names are `Acme.BookStore`. Currently, the only available mobile project is a `React Native` mobile app. Available database providers are `Entity Framework Core` and `MongoDB`. All the commands starts with `abp new`. +The `abp new` command creates an ABP solution or other artifacts based on an ABP template. [ABP CLI](CLI.md) has several parameters to create a new ABP solution. In this document we will show you some sample commands to create a new solution. All the project names are `Acme.BookStore`. Currently, the available mobile projects are `React Native` and `MAUI` mobile app. Available database providers are `Entity Framework Core` and `MongoDB`. All the commands starts with `abp new`. ## Angular @@ -64,6 +64,14 @@ The following commands are for creating MVC UI projects: abp new Acme.BookStore -u mvc --tiered --database-provider mongodb -csf ``` +* **Public Website**, Entity Framework Core, no mobile app, creates the project in a new folder: + + ```bash + abp new Acme.BookStore -t app -u mvc --mobile none --database-provider ef -csf --with-public-website + ``` + + _Note that Public Website is only included in PRO templates._ + ## Blazor diff --git a/docs/en/CLI.md b/docs/en/CLI.md index cc85f0e573..7a5e59a62a 100644 --- a/docs/en/CLI.md +++ b/docs/en/CLI.md @@ -34,6 +34,7 @@ Here, is the list of all available commands before explaining their details: * **`add-package`**: Adds an ABP package to a project. * **`add-module`**: Adds a [multi-package application module](https://docs.abp.io/en/abp/latest/Modules/Index) to a solution. * **`list-modules`**: Lists names of open-source application modules. +* **`list-templates`**: Lists the names of available templates to create a solution. * **`get-source`**: Downloads the source code of a module. * **`generate-proxy`**: Generates client side proxies to use HTTP API endpoints. * **`remove-proxy`**: Removes previously generated client side proxies. @@ -123,6 +124,7 @@ For more samples, go to [ABP CLI Create Solution Samples](CLI-New-Command-Sample * `--separate-auth-server`: The Identity Server project comes as a separate project and runs at a different endpoint. It separates the Identity Server from the API Host application. If not specified, you will have a single endpoint in the server side. * `--mobile` or `-m`: Specifies the mobile application framework. If not specified, no mobile application will be created. Available options: * `react-native`: React Native. + * `maui`: MAUI. This mobile option is only available for ABP Commercial. * `--database-provider` or `-d`: Specifies the database provider. Default provider is `ef`. Available providers: * `ef`: Entity Framework Core. * `mongodb`: MongoDB. @@ -143,7 +145,8 @@ For more samples, go to [ABP CLI Create Solution Samples](CLI-New-Command-Sample * `mongodb`: MongoDB. * `--theme`: Specifes the theme. Default theme is `leptonx-lite`. Available themes: * `leptonx-lite`: [LeptonX Lite Theme](/Themes/LeptonXLite/mvc.md). - * `basic`: [Basic Theme](/UI/AspNetCore/Basic-Theme.md). + * `basic`: [Basic Theme](/UI/AspNetCore/Basic-Theme.md). + * **`maui`**: .NET MAUI. A minimalist .NET MAUI application will be created if you specify this option. * `--output-folder` or `-o`: Specifies the output folder. Default value is the current directory. * `--version` or `-v`: Specifies the ABP & template version. It can be a [release tag](https://github.com/abpframework/abp/releases) or a [branch name](https://github.com/abpframework/abp/branches). Uses the latest release if not specified. Most of the times, you will want to use the latest version. * `--preview`: Use latest preview version. @@ -159,6 +162,7 @@ For more samples, go to [ABP CLI Create Solution Samples](CLI-New-Command-Sample * `PostgreSQL` * `--local-framework-ref --abp-path`: Uses local projects references to the ABP framework instead of using the NuGet packages. This can be useful if you download the ABP Framework source code and have a local reference to the framework from your application. * `--no-random-port`: Uses template's default ports. +* `--skip-installing-libs` or `-sib`: Skip installing client side packages. See some [examples for the new command](CLI-New-Command-Samples.md) here. @@ -242,7 +246,7 @@ It can also create a new module for your solution and add it to your solution. S > A business module generally consists of several packages (because of layering, different database provider options or other reasons). Using `add-module` command dramatically simplifies adding a module to a solution. However, each module may require some additional configurations which is generally indicated in the documentation of the related module. -Usage +Usage: ````bash abp add-module [options] @@ -276,7 +280,7 @@ abp add-module ProductManagement --new --add-to-solution-file Lists names of open-source application modules. -Usage +Usage: ````bash abp list-modules [options] @@ -292,11 +296,21 @@ abp list-modules * `--include-pro-modules`: Includes commercial (pro) modules in the output. +### list-templates + +Lists all available templates to create a solution. + +Usage: + +```bash +abp list-templates +``` + ### get-source Downloads the source code of a module to your computer. -Usage +Usage: ````bash abp get-source [options] diff --git a/docs/en/Community-Articles/15-08-2022-How-to-Design-Multi-Lingual-Entity/How-to-Design-Multi-Lingual-Entity.md b/docs/en/Community-Articles/15-08-2022-How-to-Design-Multi-Lingual-Entity/How-to-Design-Multi-Lingual-Entity.md new file mode 100644 index 0000000000..2c4b860c95 --- /dev/null +++ b/docs/en/Community-Articles/15-08-2022-How-to-Design-Multi-Lingual-Entity/How-to-Design-Multi-Lingual-Entity.md @@ -0,0 +1,690 @@ +# How to Design Multi-Lingual Entity + +## Introduction + +If you want to open up to the global market these days, end-to-end localization is a must. ABP provides an already established infrastructure for static texts. However, this may not be sufficient for many applications. You may need to fully customize your app for a particular language and region. + +Let's take a look at a few quotes from Christian Arno's article "[How Foreign-Language Internet Strategies Boost Sales](https://www.mediapost.com/publications/article/155250/how-foreign-language-internet-strategies-boost-sal.html)" to better understand the impact of this: + +- 82% of European consumers are less likely to buy online if the site is not in their native tongue ([Eurobarometer survey](http://europa.eu/rapid/pressReleasesAction.do?reference=IP/11/556)). +- 72.4% of global consumers are more likely to buy a product if the information is available in their own language ([Common Sense Advisory](http://www.commonsenseadvisory.com/)). +- The English language currently only accounts for 31% of all online use, and more than half of all searches are in languages other than English. +- Today, 42% of all Internet users are in Asia, while almost one-quarter are in Europe and just over 10% are in Latin America. + +- Foreign languages have experienced exponential growth in online usage in the past decade -- with Chinese now officially the [second-most-prominent-language](http://english.peopledaily.com.cn/90001/90776/90882/7438489.html) on the Web. [Arabic](http://www.internetworldstats.com/stats7.htm) has increased by a whopping 2500%, while English has only risen by 204% + +If you are looking for ways to expand your market share by fully customizing your application for a particular language and region, in this article I will explain how you can do it with ABP framework. + +### Source Code + +You can find the source code of the application at [abpframework/abp-samples](https://github.com/abpframework/abp-samples/tree/master/AcmeBookStoreMultiLingual). + +### Demo of the Final Application + +At the end of this article, we will have created an application same as in the gif below. + +![data-model](./result.gif) + +## Development + +In order to keep the article short and get rid of unrelated information in the article (like defining entities etc.), we'll be using the [BookStore](https://github.com/abpframework/abp-samples/tree/master/BookStore-Mvc-EfCore) example, which is used in the "[Web Application Development Tutorial](https://docs.abp.io/en/abp/latest/Tutorials/Part-1?UI=MVC&DB=EF)" documentation of ABP Framework and we will make the Book entity as multi-lingual. If you do not want to finish this tutorial, you can find the application [here](https://github.com/abpframework/abp-samples/tree/master/BookStore-Mvc-EfCore). + +### Determining the data model + +We need a robust, maintainable, and efficient data model to store content in multiple languages. + +> I read many articles to determine the data model correctly, and as a result, I decided to use one of the many approaches that suit us. +> However, as in everything, there is a trade-off here. If you are wondering about the advantages and disadvantages of the model we will implement compared to other models, I recommend you to read [this article](https://vertabelo.com/blog/data-modeling-for-multiple-languages-how-to-design-a-localization-ready-system/). + +![data-model](./data-model.png) + +As a result of the tutorial, we already have the `Book` and `Author` entities, as an extra, we will just add the `BookTranslation`. + +> In the article, we will make the Name property of the Book entity multi-lingual, but the article is independent of the Book entity, you can make the entity you want multi-lingual with similar codes according to your requirements. + +#### Acme.BookStore.Domain.Shared + +Create a folder named `MultiLingualObjects` and create the following interfaces in its contents. + +We will use the `IObjectTranslation` interface to mark the translation of a multi-lingual entity: + +```csharp +public interface IObjectTranslation +{ + string Language { get; set; } +} +``` + +We will use the `IMultiLingualObject` interface to mark multi-lingual entities: + +```csharp +public interface IMultiLingualObject + where TTranslation : class, IObjectTranslation +{ + ICollection Translations { get; set; } +} +``` + +#### Acme.BookStore.Domain + +In the `Books` folder, create the `BookTranslation` class as follows: + +```csharp +public class BookTranslation : Entity, IObjectTranslation +{ + public Guid BookId { get; set; } + + public string Name { get; set; } + + public string Language { get; set; } + + public override object[] GetKeys() + { + return new object[] {BookId, Language}; + } +} +``` + +`BookTranslation` contains the `Language` property, which contains a language code for translation and a reference to the multi-lingual entity. We also have the `BookId` foreign key to help us know which book is translated. + +Implement `IMultiLingualObject` in the `Book` class as follows: + +```csharp +public class Book : AuditedAggregateRoot, IMultiLingualObject +{ + public Guid AuthorId { get; set; } + + public string Name { get; set; } + + public BookType Type { get; set; } + + public DateTime PublishDate { get; set; } + + public float Price { get; set; } + + public ICollection Translations { get; set; } +} +``` + +Create a folder named `MultiLingualObjects` and add the following class inside of this folder: + +```csharp +public class MultiLingualObjectManager : ITransientDependency +{ + protected const int MaxCultureFallbackDepth = 5; + + public async Task FindTranslationAsync( + TMultiLingual multiLingual, + string culture = null, + bool fallbackToParentCultures = true) + where TMultiLingual : IMultiLingualObject + where TTranslation : class, IObjectTranslation + { + culture ??= CultureInfo.CurrentUICulture.Name; + + if (multiLingual.Translations.IsNullOrEmpty()) + { + return null; + } + + var translation = multiLingual.Translations.FirstOrDefault(pt => pt.Language == culture); + if (translation != null) + { + return translation; + } + + if (fallbackToParentCultures) + { + translation = GetTranslationBasedOnCulturalRecursive( + CultureInfo.CurrentUICulture.Parent, + multiLingual.Translations, + 0 + ); + + if (translation != null) + { + return translation; + } + } + + return null; + } + + protected TTranslation GetTranslationBasedOnCulturalRecursive( + CultureInfo culture, ICollection translations, int currentDepth) + where TTranslation : class, IObjectTranslation + { + if (culture == null || + culture.Name.IsNullOrWhiteSpace() || + translations.IsNullOrEmpty() || + currentDepth > MaxCultureFallbackDepth) + { + return null; + } + + var translation = translations.FirstOrDefault(pt => pt.Language.Equals(culture.Name, StringComparison.OrdinalIgnoreCase)); + return translation ?? GetTranslationBasedOnCulturalRecursive(culture.Parent, translations, currentDepth + 1); + } +} +``` + +With `MultiLingualObjectManager`'s `FindTranslationAsync` method, we get the translated version of the book according to `CurrentUICulture`. If no translation of culture is found, we return null. + +> Every thread in .NET has `CurrentCulture` and `CurrentUICulture` objects. + +#### Acme.BookStore.EntityFrameworkCore + +In the `OnModelCreating` method of the `BookStoreDbContext` class, configure the `BookTranslation` as follows: + +```csharp +builder.Entity(b => +{ + b.ToTable(BookStoreConsts.DbTablePrefix + "BookTranslations", + BookStoreConsts.DbSchema); + + b.ConfigureByConvention(); + + b.HasKey(x => new {x.BookId, x.Language}); +}); +``` + +> I haven't explicitly set up a one-to-many relationship between `Book` and `BookTranslation` here, but the entity framework will do it for us. + +After that, you can just run the following command in a command-line terminal to add a new database migration (in the directory of the `EntityFrameworkCore` project): + +```bash +dotnet ef migrations add Added_BookTranslation +``` + +This will add a new migration class to your project. You can then run the following command (or run the `.DbMigrator` application) to apply changes to the database: + +```bash +dotnet ef database update +``` + +Add the following code to the `ConfigureServices` method of the `BookStoreEntityFrameworkCoreModule`: + +```csharp + Configure(options => + { + options.Entity(bookOptions => + { + bookOptions.DefaultWithDetailsFunc = query => query.Include(o => o.Translations); + }); +}); +``` + +Now we can use `WithDetailsAsync` without any parameters on `BookAppService` knowing that `Translations` will be included. + +#### Acme.BookStore.Application.Contracts + +Implement `IObjectTranslation` in the `BookDto` class as follows: + +```csharp +public class BookDto : AuditedEntityDto, IObjectTranslation +{ + public Guid AuthorId { get; set; } + + public string AuthorName { get; set; } + + public string Name { get; set; } + + public BookType Type { get; set; } + + public DateTime PublishDate { get; set; } + + public float Price { get; set; } + + public string Language { get; set; } +} +``` + +`Language` property is required to understand which language the translated book name belongs to in the UI. + +Create the `AddBookTranslationDto` class in the `Books` folder as follows: + +```csharp +public class AddBookTranslationDto : IObjectTranslation +{ + [Required] + public string Language { get; set; } + + [Required] + public string Name { get; set; } +} +``` + +Add the `AddTranslationsAsync` method to the `IBookAppService` as follows: + +```csharp +public interface IBookAppService : + ICrudAppService< + BookDto, + Guid, + PagedAndSortedResultRequestDto, + CreateUpdateBookDto> +{ + Task> GetAuthorLookupAsync(); + + Task AddTranslationsAsync(Guid id, AddBookTranslationDto input); // added this line +} +``` + +#### Acme.BookStore.Application + +Now, we need to implement the `AddTranslationsAsync` method in `BookAppService` and include `Translations` in the `Book` entity, for this you can change the `BookAppService` as follows: + +```csharp +[Authorize(BookStorePermissions.Books.Default)] +public class BookAppService : + CrudAppService< + Book, //The Book entity + BookDto, //Used to show books + Guid, //Primary key of the book entity + PagedAndSortedResultRequestDto, //Used for paging/sorting + CreateUpdateBookDto>, //Used to create/update a book + IBookAppService //implement the IBookAppService +{ + private readonly IAuthorRepository _authorRepository; + + public BookAppService( + IRepository repository, + IAuthorRepository authorRepository) + : base(repository) + { + _authorRepository = authorRepository; + GetPolicyName = BookStorePermissions.Books.Default; + GetListPolicyName = BookStorePermissions.Books.Default; + CreatePolicyName = BookStorePermissions.Books.Create; + UpdatePolicyName = BookStorePermissions.Books.Edit; + DeletePolicyName = BookStorePermissions.Books.Create; + } + + public override async Task GetAsync(Guid id) + { + //Get the IQueryable from the repository + var queryable = await Repository.WithDetailsAsync(); // this line changed + + //Prepare a query to join books and authors + var query = from book in queryable + join author in await _authorRepository.GetQueryableAsync() on book.AuthorId equals author.Id + where book.Id == id + select new { book, author }; + + //Execute the query and get the book with author + var queryResult = await AsyncExecuter.FirstOrDefaultAsync(query); + if (queryResult == null) + { + throw new EntityNotFoundException(typeof(Book), id); + } + + var bookDto = ObjectMapper.Map(queryResult.book); + bookDto.AuthorName = queryResult.author.Name; + return bookDto; + } + + public override async Task> GetListAsync(PagedAndSortedResultRequestDto input) + { + //Get the IQueryable from the repository + var queryable = await Repository.WithDetailsAsync(); // this line changed + + //Prepare a query to join books and authors + var query = from book in queryable + join author in await _authorRepository.GetQueryableAsync() on book.AuthorId equals author.Id + select new {book, author}; + + //Paging + query = query + .OrderBy(NormalizeSorting(input.Sorting)) + .Skip(input.SkipCount) + .Take(input.MaxResultCount); + + //Execute the query and get a list + var queryResult = await AsyncExecuter.ToListAsync(query); + + //Convert the query result to a list of BookDto objects + var bookDtos = queryResult.Select(x => + { + var bookDto = ObjectMapper.Map(x.book); + bookDto.AuthorName = x.author.Name; + return bookDto; + }).ToList(); + + //Get the total count with another query + var totalCount = await Repository.GetCountAsync(); + + return new PagedResultDto( + totalCount, + bookDtos + ); + } + + public async Task> GetAuthorLookupAsync() + { + var authors = await _authorRepository.GetListAsync(); + + return new ListResultDto( + ObjectMapper.Map, List>(authors) + ); + } + + public async Task AddTranslationsAsync(Guid id, AddBookTranslationDto input) + { + var queryable = await Repository.WithDetailsAsync(); + + var book = await AsyncExecuter.FirstOrDefaultAsync(queryable, x => x.Id == id); + + if (book.Translations.Any(x => x.Language == input.Language)) + { + throw new UserFriendlyException($"Translation already available for {input.Language}"); + } + + book.Translations.Add(new BookTranslation + { + BookId = book.Id, + Name = input.Name, + Language = input.Language + }); + + await Repository.UpdateAsync(book); + } + + private static string NormalizeSorting(string sorting) + { + if (sorting.IsNullOrEmpty()) + { + return $"book.{nameof(Book.Name)}"; + } + + if (sorting.Contains("authorName", StringComparison.OrdinalIgnoreCase)) + { + return sorting.Replace( + "authorName", + "author.Name", + StringComparison.OrdinalIgnoreCase + ); + } + + return $"book.{sorting}"; + } +} +``` + +Create the `MultiLingualBookObjectMapper` class as follows: + +```csharp +public class MultiLingualBookObjectMapper : IObjectMapper, ITransientDependency +{ + private readonly MultiLingualObjectManager _multiLingualObjectManager; + + private readonly ISettingProvider _settingProvider; + + public MultiLingualBookObjectMapper( + MultiLingualObjectManager multiLingualObjectManager, + ISettingProvider settingProvider) + { + _multiLingualObjectManager = multiLingualObjectManager; + _settingProvider = settingProvider; + } + + public BookDto Map(Book source) + { + var translation = AsyncHelper.RunSync(() => + _multiLingualObjectManager.FindTranslationAsync(source)); + + return new BookDto + { + Id = source.Id, + AuthorId = source.AuthorId, + Type = source.Type, + Name = translation?.Name ?? source.Name, + PublishDate = source.PublishDate, + Price = source.Price, + Language = translation?.Language ?? AsyncHelper.RunSync(() => _settingProvider.GetOrNullAsync(LocalizationSettingNames.DefaultLanguage)), + CreationTime = source.CreationTime, + CreatorId = source.CreatorId, + LastModificationTime = source.LastModificationTime, + LastModifierId = source.LastModifierId + }; + } + + public BookDto Map(Book source, BookDto destination) + { + return default; + } +} +``` + +To map the multi-lingual `Book` entity to `BookDto`, we implement custom mapping using the `IObjectMapper` interface. If no translation is found, default values are returned. + +So far we have created the entire infrastructure. We don't need to change anything in the UI, if there is a translation according to the language chosen by the user, the list view will change. However, I want to create a simple modal where we can add new translations to an existing book in order to see what we have done. + +#### Acme.BookStore.Web + +Create a new razor page named `AddTranslationModal` in the `Books` folder as below. + +**View** + +```html +@page +@using Microsoft.AspNetCore.Mvc.TagHelpers +@using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Modal +@model Acme.BookStore.Web.Pages.Books.AddTranslationModal + +@{ + Layout = null; +} + +
+ + Translations + + + + + + + + + +
+``` + +**Model** + +```csharp +public class AddTranslationModal : BookStorePageModel +{ + [HiddenInput] + [BindProperty(SupportsGet = true)] + public Guid Id { get; set; } + + public List Languages { get; set; } + + [BindProperty] + public BookTranslationViewModel TranslationViewModel { get; set; } + + private readonly IBookAppService _bookAppService; + private readonly ILanguageProvider _languageProvider; + + public AddTranslationModal( + IBookAppService bookAppService, + ILanguageProvider languageProvider) + { + _bookAppService = bookAppService; + _languageProvider = languageProvider; + } + + public async Task OnGetAsync() + { + Languages = await GetLanguagesSelectItem(); + + TranslationViewModel = new BookTranslationViewModel(); + } + + public async Task OnPostAsync() + { + await _bookAppService.AddTranslationsAsync(Id, ObjectMapper.Map(TranslationViewModel)); + + return NoContent(); + } + + private async Task> GetLanguagesSelectItem() + { + var result = await _languageProvider.GetLanguagesAsync(); + + return result.Select( + languageInfo => new SelectListItem + { + Value = languageInfo.CultureName, + Text = languageInfo.DisplayName + " (" + languageInfo.CultureName + ")" + } + ).ToList(); + } + + public class BookTranslationViewModel + { + [Required] + [SelectItems(nameof(Languages))] + public string Language { get; set; } + + [Required] + public string Name { get; set; } + + } +} +``` + +Then, we can open the `BookStoreWebAutoMapperProfile` class and define the required mapping as follows: + +```csharp +CreateMap(); +``` + +Finally, change the content of `index.js` in the `Books` folder as follows: + +```javascript +$(function () { + var l = abp.localization.getResource('BookStore'); + var createModal = new abp.ModalManager(abp.appPath + 'Books/CreateModal'); + var editModal = new abp.ModalManager(abp.appPath + 'Books/EditModal'); + var addTranslationModal = new abp.ModalManager(abp.appPath + 'Books/AddTranslationModal'); // added this line + + var dataTable = $('#BooksTable').DataTable( + abp.libs.datatables.normalizeConfiguration({ + serverSide: true, + paging: true, + order: [[1, "asc"]], + searching: false, + scrollX: true, + ajax: abp.libs.datatables.createAjax(acme.bookStore.books.book.getList), + columnDefs: [ + { + title: l('Actions'), + rowAction: { + items: + [ + { + text: l('Edit'), + visible: abp.auth.isGranted('BookStore.Books.Edit'), + action: function (data) { + editModal.open({ id: data.record.id }); + } + }, + { + text: l('Add Translation'), // added this action + visible: abp.auth.isGranted('BookStore.Books.Edit'), + action: function (data) { + addTranslationModal.open({ id: data.record.id }); + } + }, + { + text: l('Delete'), + visible: abp.auth.isGranted('BookStore.Books.Delete'), + confirmMessage: function (data) { + return l( + 'BookDeletionConfirmationMessage', + data.record.name + ); + }, + action: function (data) { + acme.bookStore.books.book + .delete(data.record.id) + .then(function() { + abp.notify.info( + l('SuccessfullyDeleted') + ); + dataTable.ajax.reload(); + }); + } + } + ] + } + }, + { + title: l('Name'), + data: "name" + }, + { + title: l('Author'), + data: "authorName" + }, + { + title: l('Type'), + data: "type", + render: function (data) { + return l('Enum:BookType:' + data); + } + }, + { + title: l('PublishDate'), + data: "publishDate", + render: function (data) { + return luxon + .DateTime + .fromISO(data, { + locale: abp.localization.currentCulture.name + }).toLocaleString(); + } + }, + { + title: l('Price'), + data: "price" + }, + { + title: l('CreationTime'), + data: "creationTime", + render: function (data) { + return luxon + .DateTime + .fromISO(data, { + locale: abp.localization.currentCulture.name + }).toLocaleString(luxon.DateTime.DATETIME_SHORT); + } + } + ] + }) + ); + + createModal.onResult(function () { + dataTable.ajax.reload(); + }); + + editModal.onResult(function () { + dataTable.ajax.reload(); + }); + + $('#NewBookButton').click(function (e) { + e.preventDefault(); + createModal.open(); + }); +}); +``` + +## Conclusion + +With a multi-lingual application, you can expand your market share, but if not designed well, may your application will be unusable. So, I've tried to explain how to design a sustainable multi-lingual entity in this article. + +### Source Code + +You can find source code of the example solution used in this article [here](https://github.com/abpframework/abp-samples/tree/master/AcmeBookStoreMultiLingual). diff --git a/docs/en/Community-Articles/15-08-2022-How-to-Design-Multi-Lingual-Entity/data-model.png b/docs/en/Community-Articles/15-08-2022-How-to-Design-Multi-Lingual-Entity/data-model.png new file mode 100644 index 0000000000..c7e02bc2cd Binary files /dev/null and b/docs/en/Community-Articles/15-08-2022-How-to-Design-Multi-Lingual-Entity/data-model.png differ diff --git a/docs/en/Community-Articles/15-08-2022-How-to-Design-Multi-Lingual-Entity/result.gif b/docs/en/Community-Articles/15-08-2022-How-to-Design-Multi-Lingual-Entity/result.gif new file mode 100644 index 0000000000..0bc41cb8f1 Binary files /dev/null and b/docs/en/Community-Articles/15-08-2022-How-to-Design-Multi-Lingual-Entity/result.gif differ diff --git a/docs/en/Community-Articles/2020-09-09-Replacing-Email-Template-and-Sending-Emails/POST.md b/docs/en/Community-Articles/2020-09-09-Replacing-Email-Template-and-Sending-Emails/POST.md index 049171731b..f412ca3170 100644 --- a/docs/en/Community-Articles/2020-09-09-Replacing-Email-Template-and-Sending-Emails/POST.md +++ b/docs/en/Community-Articles/2020-09-09-Replacing-Email-Template-and-Sending-Emails/POST.md @@ -335,7 +335,7 @@ After sending the email we should see the template like below.
-

Share your experiences with the ABP Framework!
ABP is an open source and community driven project. This guide is aims to help anyone wants to contribute to the project.

+

Share your experiences with the ABP Framework!
ABP is an open source and community driven project. This guide is aimed to help anyone who wants to contribute to the project.

If you want to write articles or "how to" guides related to the ABP Framework and ASP.NET Core, please submit your article to the community.abp.io web site.

diff --git a/docs/en/Community-Articles/2020-10-08-How-To-Add-Custom-Property-To-The-User-Entity/How-To-Add-Custom-Property-To-The-User-Entity.md b/docs/en/Community-Articles/2020-10-08-How-To-Add-Custom-Property-To-The-User-Entity/How-To-Add-Custom-Property-To-The-User-Entity.md index 308358bb67..8e46bd6944 100644 --- a/docs/en/Community-Articles/2020-10-08-How-To-Add-Custom-Property-To-The-User-Entity/How-To-Add-Custom-Property-To-The-User-Entity.md +++ b/docs/en/Community-Articles/2020-10-08-How-To-Add-Custom-Property-To-The-User-Entity/How-To-Add-Custom-Property-To-The-User-Entity.md @@ -1,9 +1,13 @@ # How to Add Custom Properties to the User Entity +> **Note:** If your application is greater than version 4.3.3, please follow [this article](../2022-07-19-How-To-Add-Custom-Property-To-The-User-Entity/How-To-Add-Custom-Property-To-The-User-Entity.md). + ## Introduction In this step-by-step article, I will explain how you can customize the user entity class, which is available in every web application you create using the ABP framework, according to your needs. When you read this article, you will learn how to override the services of built-in modules, extend the entities, extend data transfer objects and customize the user interface in the applications you develop using the ABP framework. +> **Note:** This article is not about customizing the `Login` page. If you have such a need, please follow [this article](../2020-05-09-Customize-the-Login-Page-for-MVC-Razor-Page-Applications/POST.md). + You can see the screenshots below which we will reach at the end of the article. ![custom-identity-user-list](./custom-identity-user-list.png) diff --git a/docs/en/Community-Articles/2022-02-06-How-to-Hide-ABP-Related-Endpoints-on-Swagger-UI/POST.md b/docs/en/Community-Articles/2022-02-06-How-to-Hide-ABP-Related-Endpoints-on-Swagger-UI/POST.md index 056c14c6e7..a6ad7596d4 100644 --- a/docs/en/Community-Articles/2022-02-06-How-to-Hide-ABP-Related-Endpoints-on-Swagger-UI/POST.md +++ b/docs/en/Community-Articles/2022-02-06-How-to-Hide-ABP-Related-Endpoints-on-Swagger-UI/POST.md @@ -425,4 +425,26 @@ That's it. Now we can open the Setting Management page and enable/disable the sw ![](./swagger-hide-endpoints.gif) -Thanks for reading. +--- + +## July 2022 Update + +With ABP v5.2+, there is a built-in option to hide/show ABP related endpoints on runtime. To hide ABP's default endpoints, call the `HideAbpEndpoints` method in your Swagger configuration as below: + +```csharp +services.AddAbpSwaggerGen( + options => + { + //... other options + + //Hides ABP Related endpoints on Swagger UI + options.HideAbpEndpoints(); + } +) +``` + +> For more info, please see the [Swagger Integration](https://docs.abp.io/en/abp/latest/API/Swagger-Integration#hide-abp-endpoints-on-swagger-ui) docs. + +--- + +Thanks for reading. \ No newline at end of file diff --git a/docs/en/Community-Articles/2022-07-19-How-To-Add-Custom-Property-To-The-User-Entity/How-To-Add-Custom-Property-To-The-User-Entity.md b/docs/en/Community-Articles/2022-07-19-How-To-Add-Custom-Property-To-The-User-Entity/How-To-Add-Custom-Property-To-The-User-Entity.md new file mode 100644 index 0000000000..7c119c6e66 --- /dev/null +++ b/docs/en/Community-Articles/2022-07-19-How-To-Add-Custom-Property-To-The-User-Entity/How-To-Add-Custom-Property-To-The-User-Entity.md @@ -0,0 +1,154 @@ +# How to Add Custom Properties to the User Entity + +> **Note:** If your application is less than version 4.4.x, please follow [this article](../2020-10-08-How-To-Add-Custom-Property-To-The-User-Entity/How-To-Add-Custom-Property-To-The-User-Entity.md). + +## Introduction + +In this step-by-step article, I will explain how you can customize the user entity class, which is available in every web application you create using the ABP framework, according to your needs. When you read this article, you will learn how to override the services of built-in modules, extend the entities, extend data transfer objects and customize the user interface in the applications you develop using the ABP framework. + +> **Note:** This article is not about customizing the `Login` page. If you have such a need, please follow [this article](../2020-05-09-Customize-the-Login-Page-for-MVC-Razor-Page-Applications/POST.md). + +You can see the screenshots below which we will reach at the end of the article. + +![custom-identity-user-list](./custom-identity-user-list.png) + +![new-user](./new-user.png) + +## Preparing the Project + +### Startup template and the initial run + +Abp Framework offers startup templates to get into the work faster. We can create a new startup template using Abp CLI: + +`abp new CustomizeUserDemo` + +> In this article, I will go through the MVC application, but it will work also in the [Angular](https://docs.abp.io/en/abp/latest/Getting-Started?UI=NG&DB=EF&Tiered=No), [Blazor Server](https://docs.abp.io/en/abp/latest/Getting-Started?UI=BlazorServer&DB=EF&Tiered=No), and [Blazor WebAssembly](https://docs.abp.io/en/abp/latest/Getting-Started?UI=Blazor&DB=EF&Tiered=No) application. + +After the download is finished, we can run **CustomizeUserDemo.DbMigrator** project to create the database migrations and seed the initial data (admin user, role, etc). Then we can run `CustomizeUserDemo.Web` to see that our application is working. + +> Default admin username is **admin** and password is **1q2w3E\*** + +![initial-project](./initial-project.png) + +In this article, we will go through a scenario together and find the solutions to our questions through this scenario. However, since the scenario is not a real-life scenario, it may be strange, please don't get too about this issue :) + +## Step-1 + +Create the Users folder in the **CustomizeUserDemo.Domain.Shared** project, create the class `UserConsts` inside the folder and update the class you created as below: + +```csharp +public static class UserConsts +{ + public const string TitlePropertyName = "Title"; + + public const string ReputationPropertyName = "Reputation"; + + public const int MaxTitleLength = 64; + + public const double MaxReputationValue = 1_000; + + public const double MinReputationValue = 1; +} +``` + +## Step-2 + +Update the `CustomizeUserDemoEfCoreEntityExtensionMappings` class in the **CustomizeUserDemo.EntityFramework** project in the EntityFrameworkCore folder as below: + +```csharp +public static class CustomizeUserDemoEfCoreEntityExtensionMappings +{ + private static readonly OneTimeRunner OneTimeRunner = new OneTimeRunner(); + + public static void Configure() + { + CustomizeUserDemoGlobalFeatureConfigurator.Configure(); + CustomizeUserDemoModuleExtensionConfigurator.Configure(); + + OneTimeRunner.Run(() => + { + ObjectExtensionManager.Instance + .MapEfCoreProperty( + UserConsts.TitlePropertyName, + (_, propertyBuilder) => + { + propertyBuilder.HasDefaultValue(""); + propertyBuilder.HasMaxLength(UserConsts.MaxTitleLength); + } + ).MapEfCoreProperty( + UserConsts.ReputationPropertyName, + (_, propertyBuilder) => + { + propertyBuilder.HasDefaultValue(UserConsts.MinReputationValue); + } + ); + }); + } +} +``` + +This class can be used to map these extra properties to table fields in the database. Please read [this](https://docs.abp.io/en/abp/latest/Customizing-Application-Modules-Extending-Entities) article to improve your understanding of what we are doing. + +So far, we have added our extra features to the `User` entity and matched these features with the `ef core`. + +Now we need to add migration to see what has changed in our database. This for, open the Package Manager Console (PMC) under the menu Tools > NuGet Package Manager. + +![nuget-package-manager](./nuget-package-manager.png) + +Select the **CustomizeUserDemo.EntityFramework** as the **default project** and execute the following command: + +```bash +Add-Migration "Updated-User-Entity" +``` + +![added-new-migration](./added-new-migration.png) + +This will create a new migration class inside the `Migrations` folder of the **CustomizeUserDemo.EntityFrameworkCore** project. + +> If you are using another IDE than the Visual Studio, you can use `dotnet-ef` tool as [documented here](https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations/?tabs=dotnet-core-cli#create-a-migration). + +Finally, run the **CustomizeUserDemo.DbMigrator** project to update the database. + +When we updated the database, you can see that the `Title` and `Reputation` columns are added to the `Users` table. + +![user-table](./user-table.png) + +## Step-3 +Open the `CustomizeUserDemoModuleExtensionConfigurator` in the **CustomizeUserDemo.Domain.Shared** project, and change the contents of the `ConfigureExtraProperties` method as shown below: +```csharp +private static void ConfigureExtraProperties() +{ + ObjectExtensionManager.Instance.Modules().ConfigureIdentity(identity => + { + identity.ConfigureUser(user => + { + user.AddOrUpdateProperty( + UserConsts.TitlePropertyName, + options => + { + options.Attributes.Add(new RequiredAttribute()); + options.Attributes.Add( + new StringLengthAttribute(UserConsts.MaxTitleLength) + ); + } + ); + user.AddOrUpdateProperty( + UserConsts.ReputationPropertyName, + options => + { + options.DefaultValue = UserConsts.MinReputationValue; + options.Attributes.Add( + new RangeAttribute(UserConsts.MinReputationValue, UserConsts.MaxReputationValue) + ); + } + ); + }); + }); +} +``` + +That's it. Now let's run the application and look at the Identity user page. You can also try to edit and recreate a record if you want, it will work even though we haven't done anything extra. Here is the magic code behind ABP framework. + +If there is a situation you want to add, you can click the contribute button or make a comment. Also, if you like the article, don't forget to share it :) + +Happy coding :) diff --git a/docs/en/Community-Articles/2022-07-19-How-To-Add-Custom-Property-To-The-User-Entity/added-new-migration.png b/docs/en/Community-Articles/2022-07-19-How-To-Add-Custom-Property-To-The-User-Entity/added-new-migration.png new file mode 100755 index 0000000000..d459fdeed2 Binary files /dev/null and b/docs/en/Community-Articles/2022-07-19-How-To-Add-Custom-Property-To-The-User-Entity/added-new-migration.png differ diff --git a/docs/en/Community-Articles/2022-07-19-How-To-Add-Custom-Property-To-The-User-Entity/custom-identity-user-list.png b/docs/en/Community-Articles/2022-07-19-How-To-Add-Custom-Property-To-The-User-Entity/custom-identity-user-list.png new file mode 100644 index 0000000000..896ed947aa Binary files /dev/null and b/docs/en/Community-Articles/2022-07-19-How-To-Add-Custom-Property-To-The-User-Entity/custom-identity-user-list.png differ diff --git a/docs/en/Community-Articles/2022-07-19-How-To-Add-Custom-Property-To-The-User-Entity/initial-project.png b/docs/en/Community-Articles/2022-07-19-How-To-Add-Custom-Property-To-The-User-Entity/initial-project.png new file mode 100755 index 0000000000..b64e93a99f Binary files /dev/null and b/docs/en/Community-Articles/2022-07-19-How-To-Add-Custom-Property-To-The-User-Entity/initial-project.png differ diff --git a/docs/en/Community-Articles/2022-07-19-How-To-Add-Custom-Property-To-The-User-Entity/new-user.png b/docs/en/Community-Articles/2022-07-19-How-To-Add-Custom-Property-To-The-User-Entity/new-user.png new file mode 100644 index 0000000000..d3a5c66198 Binary files /dev/null and b/docs/en/Community-Articles/2022-07-19-How-To-Add-Custom-Property-To-The-User-Entity/new-user.png differ diff --git a/docs/en/Community-Articles/2022-07-19-How-To-Add-Custom-Property-To-The-User-Entity/nuget-package-manager.png b/docs/en/Community-Articles/2022-07-19-How-To-Add-Custom-Property-To-The-User-Entity/nuget-package-manager.png new file mode 100755 index 0000000000..680bc9d2e7 Binary files /dev/null and b/docs/en/Community-Articles/2022-07-19-How-To-Add-Custom-Property-To-The-User-Entity/nuget-package-manager.png differ diff --git a/docs/en/Community-Articles/2022-07-19-How-To-Add-Custom-Property-To-The-User-Entity/user-table.png b/docs/en/Community-Articles/2022-07-19-How-To-Add-Custom-Property-To-The-User-Entity/user-table.png new file mode 100755 index 0000000000..5bb71b8325 Binary files /dev/null and b/docs/en/Community-Articles/2022-07-19-How-To-Add-Custom-Property-To-The-User-Entity/user-table.png differ diff --git a/docs/en/Dependency-Injection.md b/docs/en/Dependency-Injection.md index 668eac6644..a0ad342c4c 100644 --- a/docs/en/Dependency-Injection.md +++ b/docs/en/Dependency-Injection.md @@ -244,25 +244,35 @@ One restriction of property injection is that you cannot use the dependency in y Property injection is also useful when you want to design a base class that has some common services injected by default. If you're going to use constructor injection, all derived classes should also inject depended services into their own constructors which makes development harder. However, be very careful using property injection for non-optional services as it makes it harder to clearly see the requirements of a class. -### Resolve Service from IServiceProvider +#### DisablePropertyInjectionAttribute -You may want to resolve a service directly from ``IServiceProvider``. In that case, you can inject IServiceProvider into your class and use ``GetService`` method as shown below: +You can use `[DisablePropertyInjection]` attribute on class or properties to disable property injection for the whole class or some specific properties. ````C# +[DisablePropertyInjection] public class MyService : ITransientDependency { - private readonly IServiceProvider _serviceProvider; + public ITaxCalculator TaxCalculator { get; set; } +} - public MyService(IServiceProvider serviceProvider) - { - _serviceProvider = serviceProvider; - } +public class MyService : ITransientDependency +{ + public ILogger Logger { get; set; } - public void DoSomething() - { - var taxCalculator = _serviceProvider.GetService(); - //... - } + [DisablePropertyInjection] + public ITaxCalculator TaxCalculator { get; set; } +} + +```` + +### Resolve Service from IServiceProvider + +You may want to resolve a service directly from ``IServiceProvider``. In that case, you can inject IServiceProvider into your class and use ``GetService`` method as shown below: + +````C# +public class MyService : ITransientDependency +{ + public ILogger Logger { get; set; } } ```` diff --git a/docs/en/Deploy-azure-app-service.md b/docs/en/Deploy-azure-app-service.md new file mode 100644 index 0000000000..9e0309f3b9 --- /dev/null +++ b/docs/en/Deploy-azure-app-service.md @@ -0,0 +1,452 @@ +# Deploying ABP Project to Azure App Service + +In this document, you will learn how to create and deploy your first ABP web app to [Azure App Service](https://docs.microsoft.com/en-us/azure/app-service/overview). The App Service supports various versions of .NET apps, and provides a highly scalable, self-patching web hosting service. ABP web apps are cross-platform and can be hosted on Linux, Windows or MacOS. + +****Prerequisites**** + +- An Azure account with an active subscription. [Create an account for free](https://azure.microsoft.com/free/dotnet). +- A GitHub account [Create an account for free](http://github.com/). + + + +## Creating a new ABP application + +Create a repository on [GitHub.com](https://github.com/) (keep all settings as default). + +Open the command prompt and clone the repository into a folder on your computer + +```bash +git clone https://github.com/your-username/your-repository-name.git +``` + +Check your dotnet version. It should be at least 3.1.x + +```bash +dotnet --version +``` + +Install or update the [ABP CLI](https://docs.abp.io/en/abp/latest/cli) with the following command: + +```bash +dotnet tool install -g Volo.Abp.Cli || dotnet tool update -g Volo.Abp.Cli +``` + +Open the command prompt in the *GitHub repository folder* and create a new ABP Blazor solution with the command below: + +```bash +abp new YourAppName -u blazor +``` + + + +## Running the application + +Open the command prompt in the *[YourAppName].DbMigrator* project and enter the command below to apply the database migrations: + +```bash +dotnet run +``` + +Open the command prompt in the *[YourAppName].HttpApi.Host* project to run the API project: + +```bash +dotnet run +``` + +Navigate to the *applicationUrl* specified in *the launchSettings.json* file of the *[YourAppName].HttpApi.Host project*. You should get the *Swagger window* + +Open the command prompt in the *[YourAppName].Blazor* folder and enter the command below to run the Blazor project: + +```bash +dotnet run +``` + +Navigate to the *applicationUrl* specified in the *launchSettings.json* file of the *[YourAppName].Blazor* project and you should see the landing page. + +Stop both the *API* and the *Blazor* project by pressing **CTRL+C** + + + +## Committing to GitHub + +Before the GitHub commit, you have to delete the line "**/wwwroot/libs/*" at *.gitignore* file. + +![azdevops-23](images/azdevops-23.png) + +Open the command prompt in the root folder of your project and *add, commit and push* all your changes to your GitHub repository: + +```bash +git add . +git commit -m initialcommit +git push +``` + + + +## Configuring Azure database connection string + +Create a SQL database on Azure and change the connection string in all the *appsettings.json* files. + +* Login into [Azure Portal](https://portal.azure.com/) + +* Click **Create a resource** + +* Search for *SQL Database* + +* Click the **Create** button in the *SQL Database window* + +* Create a new resource group. Name it *rg[YourAppName]* + +* Enter *[YourAppName]Db* as database name + +* Create a new Server and name it *[yourappname]server* + +* Enter a serveradmin login and passwords. Click the **OK** button + +* Select your *Location* + +* Check *Allow Azure services to access server* + +* Click **Configure database**. Go to the *Basic* version and click the **Apply** button + +* Click the **Review + create** button. Click **Create** + +* Click **Go to resource** and click **SQL server** when the SQL Database is created + +* Click **Networking** under Security left side menu + +* Select **Selected networks** and click **Add your client IP$ address** at the Firewall rules + +* Select **Allow Azure and resources to access this seerver** and save + +* Go to your **SQL database**, click **Connection strings** and copy the connection string + +* Copy/paste the *appsettings.json* files of the *[YourAppName].HttpApi.Host* and the *[YourAppName].DbMigrator* project + +* Do not forget to replace {your_password} with the correct server password you entered in Azure SQL Database + + + +## Running DB Migrations + +Open the command prompt in the *[YourAppName].DbMigrator* project again and enter the command below to apply the database migrations: + +```bash +dotnet run +``` + +Open the command prompt in the *[YourAppName].HttpApi.Host* project and enter the command below to check your API is working: + +```bash +dotnet run +``` + +Stop the *[YourAppName].HttpApi.Host* by pressing CTRL+C. + + + +## Committing to GitHub + +Open the command prompt in the root folder of your project and add, commit and push all your changes to your GitHub repository + +```bash +git add . +git commit -m initialcommit +git push +``` + + + +## Setting up the Build pipeline in AzureDevops and publish the Build Artifacts + +* Sign in Azure DevOps + +* Click **New organization** and follow the steps to create a new organisation. Name it [YourAppName]org + +* Enter [YourAppName]Proj as project name in the ***Create a project to get started*** window + +* Select **Public visibility** and click the **Create project** button + +* Click the **Pipelines** button to continue + +* Click the **Create Pipeline** button + + Select GitHub in the Select your repository window + +![azdevops-1](images/azdevops-1.png) + +* Enter the Connection name. *[YourAppName]GitHubConnection* and click **Authorize using OAuth** + +* Select your **GitHub** [YourAppName]repo and click Continue + +* Search for **ASP.NET** in the ***Select a template*** window + +![azdevops-2](images/azdevops-2.png) + +* Select the ASP.NET Core template and click the **Apply** button + +* Add the below commands block as a first step in the pipeline + + ``` + - task: UseDotNet@2 + inputs: + packageType: 'sdk' + version: '6.0.106' + ``` + +![azdevops-18](images/azdevops-18.png) + +* Select **Settings** on the second task(Nugetcommand@2) in the pipeline + +* Select **Feeds in my Nuget.config** and type **Nuget.config** in the text box + +![azdevops-3](images/azdevops-3.png) + +* Add the below commands block to the end of the pipeline + + ``` + - task: PublishBuildArtifacts@1 + displayName: 'Publish Artifact' + inputs: + PathtoPublish: '$(build.artifactstagingdirectory)' + ArtifactName: '$(Parameters.ArtifactName)' + condition: succeededOrFailed() + ``` + + ![azdevops-4](images/azdevops-4.png) + +``` +# ASP.NET +# Build and test ASP.NET projects. +# Add steps that publish symbols, save build artifacts, deploy, and more: +# https://docs.microsoft.com/azure/devops/pipelines/apps/aspnet/build-aspnet-4 + +trigger: +- main + +pool: + vmImage: 'windows-latest' + +variables: + solution: '**/*.sln' + buildPlatform: 'Any CPU' + buildConfiguration: 'Release' + +steps: +- task: UseDotNet@2 + inputs: + packageType: 'sdk' + version: '6.0.106' + +- task: NuGetToolInstaller@1 + +- task: NuGetCommand@2 + inputs: + command: 'restore' + restoreSolution: '$(solution)' + feedsToUse: 'config' + nugetConfigPath: 'NuGet.config' + +- task: VSBuild@1 + inputs: + solution: '$(solution)' + msbuildArgs: '/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:PackageLocation="$(build.artifactStagingDirectory)"' + platform: '$(buildPlatform)' + configuration: '$(buildConfiguration)' + +- task: VSTest@2 + inputs: + platform: '$(buildPlatform)' + configuration: '$(buildConfiguration)' + +- task: PublishBuildArtifacts@1 + displayName: 'Publish Artifact' + inputs: + PathtoPublish: '$(build.artifactstagingdirectory)' + ArtifactName: '$(Parameters.ArtifactName)' + publishLocation: 'Container' + condition: succeededOrFailed() +``` + +* Click **Save & queue** in the top menu. Click **Save & queue** again and click **Save and run** to run the Build pipeline + +* When the Build pipeline has finished. Click **1 published; 1 consumed** + + + +## Creating a Web App in the Azure Portal to deploy [YourAppName].HttpApi.Host project + +* Search for Web App in the *Search the Marketplace* field + +* Click the **Create** button in the Web App window + +* Select rg[YourAppName] in the *Resource Group* dropdown + +* Enter [YourAppName]API in the *Name input* field + +* Select code, .NET Core 3.1 (LTS) and windows as *Operating System* + +* Enter [YourAppName]API in the *Name input* field + +* Select .NET Core 3.1 (LTS) in the *Runtime stack* dropdown + +* Select Windows as *Operating System* + +* Select the same *Region* as in the SQL server you created in Part 3 + +![azdevops-5](images/azdevops-5.png) + +* Click **Create new** in the Windows Plan. Name it [YourAppName]ApiWinPlan + +* Click **Change size** in Sku and size. Go to the Dev/Test Free F1 version and click the **Apply** button + +![azdevops-6](images/azdevops-6.png) + +* Click the **Review + create** button. Click the **Create** button + +* Click **Go to resource** when the Web App has been created + + + +## Creating a release pipeline in the AzureDevops and deploy [YourAppName].HttpApi.Host project + +* Sign in into [Azure DevOps](https://azure.microsoft.com/en-us/services/devops/) + +* Click [YourAppName]Proj and click **Releases** in the *Pipelines* menu + +* Click the **New pipeline** button in the *No release pipelines found* window + +* Select *Azure App Service deployment* and click the **Apply** button + +![azdevops-7](images/azdevops-7.png) + +* Enter *[YourAppName]staging* in the *Stage name* field in the *Stage* window. And close the window + +* Click **+ Add an artifact** in the *Pipeline* tab + +* Select the **Build** icon as *Source type* in the *Add an artifact* window + +* Select Build pipeline in the *Source (build pipeline)* dropdown and click the **Add** button + +![azdevops-8](images/azdevops-8.png) + +* Click the **Continuous deployment trigger (thunderbolt icon)** + +* Set the toggle to **Enabled** in the the *Continuous deployment trigger* window + +* Click **+ Add** in *No filters added*. Select **Include** in the *Type* dropdown. Select your branch in the *Build branch* dropdown and close the window + +![azdevops-9](images/azdevops-9.png) + +* Click **the little red circle with the exclamation mark** in the *Tasks* tab menu + +* Select your subscription in the *Azure subscription* dropdown. + +![azdevops-10](images/azdevops-10.png) + +* Click **Authorize** and enter your credentials in the next screens + +* After Authorization, select the **[YourAppName]API** in the *App service name* dropdown + +* Click the **Deploy Azure App Service** task + +* Select **[YourAppName].HttpApi.Host.zip** in the *Package or folder* input field + +![azdevops-11](images/azdevops-11.png) + +* Click the **Save** icon in the top menu and click **OK** + +* Click **Create release** in the top menu. Click **Create** to create a release + +* Click the *Pipeline* tab and wait until the Deployment succeeds + +![azdevops-12](images/azdevops-12.png) + +* Open a browser and navigate to the URL of your Web App + +``` +https://[YourAppName]api.azurewebsites.net +``` + +![azdevops-13](images/azdevops-13.png) + + + +## Creating a Web App in Azure Portal to deploy [YourAppName].Blazor project + +* Login into [Azure Portal](https://portal.azure.com/) + +* Click **Create a resource** + +* Search for *Web App* in the *Search the Marketplace* field + +* Click the **Create** button in the *Web App* window + +* Select *rg[YourAppName]* in the *Resource Group* dropdown + +* Enter *[YourAppName]Blazor* in the *Name* input field + +* Select *.NET Core 3.1 (LTS)* in the *Runtime stack* dropdown + +* Select *Windows* as *Operating System* + +* Select the same region as the SQL server you created in Part 3 + +* Select the [YourAppName]ApiWinPlan in the *Windows Plan* dropdown + +![azdevops-14](images/azdevops-14.png) + +* Click the **Review + create** button. Click **Create** button + +* Click **Go to resource** when the Web App has been created + +* Copy the URL of the Blazor Web App for later use + +``` +https://[YourAppName]blazor.azurewebsites.net +``` + + +## Changing the Web App configuration for the Azure App Service + +Copy the URL of the Api Host and Blazor Web App. Change appsettings.json files in the Web App as follows images. + +![azdevops-19](images/azdevops-19.png) + +![azdevops-20](images/azdevops-20.png) + +![azdevops-21](images/azdevops-21.png) + + + +## Adding an extra Stage in the Release pipeline in the AzureDevops to deploy [YourAppName].Blazor project + +* Go to the *Release* pipeline in [Azure DevOps](https://azure.microsoft.com/en-us/services/devops/) and click **Edit** + +* Click the **+ Add** link and add a **New Stage** + +![azdevops-15](images/azdevops-15.png) + +* Select *Azure App Service deployment* and click the **Apply** button + +* Enter *BlazorDeployment* in the *Stage name* input field and close the *Stage* window + +* Click the **little red circle with the exclamation mark** in the BlazorDeployment stage + +* Select your subscription in the *Azure subscription* dropdown + +* Select your Blazor Web App in the *App service name* dropdown + +* Click the **Deploy Azure App Service task** + +* Select *[YourAppName].Blazor.zip* in the *Package or folder* input field + +![azdevops-16](images/azdevops-16.png) + +* Click **Save** in the top menu and click the **OK** button after + +* Click **Create release** in the top menu and click the **Create** button + +![azdevops-17](images/azdevops-17.png) + +![azdevops-22](images/azdevops-22.png) diff --git a/docs/en/Deployment/Index.md b/docs/en/Deployment/Index.md index dc1cca300e..6503f8b664 100644 --- a/docs/en/Deployment/Index.md +++ b/docs/en/Deployment/Index.md @@ -6,4 +6,4 @@ However, there are some topics that you should care about when you are deploying ## Guides -* [Deploying to a clustered environment](Clustered-Environment.md): Explains how to configure your application when you want to run multiple instances of your application concurrently. \ No newline at end of file +* [Deploying to a clustered environment](Clustered-Environment.md): Explains how to configure your application when you want to run multiple instances of your application concurrently. diff --git a/docs/en/Distributed-Event-Bus-RabbitMQ-Integration.md b/docs/en/Distributed-Event-Bus-RabbitMQ-Integration.md index 3d99e1e3cf..4823cbaae9 100644 --- a/docs/en/Distributed-Event-Bus-RabbitMQ-Integration.md +++ b/docs/en/Distributed-Event-Bus-RabbitMQ-Integration.md @@ -86,7 +86,7 @@ Defining multiple connections is allowed. In this case, you can specify the conn This allows you to use multiple RabbitMQ server in your application, but select one of them for the event bus. -You can use any of the [ConnectionFactry](http://rabbitmq.github.io/rabbitmq-dotnet-client/api/RabbitMQ.Client.ConnectionFactory.html#properties) properties as the connection properties. +You can use any of the [ConnectionFactory](http://rabbitmq.github.io/rabbitmq-dotnet-client/api/RabbitMQ.Client.ConnectionFactory.html#properties) properties as the connection properties. **Example: Specify the connection port** @@ -141,14 +141,15 @@ Configure(options => }); ```` -**Example: Configure the client and exchange names** +**Example: Configure the client, exchange names and prefetchCount** ````csharp Configure(options => { options.ClientName = "TestApp1"; options.ExchangeName = "TestMessages"; + options.PrefetchCount = 1; }); ```` -Using these options classes can be combined with the `appsettings.json` way. Configuring an option property in the code overrides the value in the configuration file. \ No newline at end of file +Using these options classes can be combined with the `appsettings.json` way. Configuring an option property in the code overrides the value in the configuration file. diff --git a/docs/en/Distributed-Event-Bus.md b/docs/en/Distributed-Event-Bus.md index 5fe85a468d..21b1b07256 100644 --- a/docs/en/Distributed-Event-Bus.md +++ b/docs/en/Distributed-Event-Bus.md @@ -228,7 +228,7 @@ namespace AbpDemo ```` * `MyHandler` implements the `IDistributedEventHandler>`. -* It is required to register your handler class to the [dependency injection](Dependency-Injection.md) system. Implementing `ITransient` like in this example is an easy way. +* It is required to register your handler class to the [dependency injection](Dependency-Injection.md) system. Implementing `ITransientDependency` like in this example is an easy way. ### Configuration diff --git a/docs/en/Entities.md b/docs/en/Entities.md index c57af27457..ef8f52a04f 100644 --- a/docs/en/Entities.md +++ b/docs/en/Entities.md @@ -112,6 +112,21 @@ For the example above, the composite key is composed of `UserId` and `RoleId`. F > Also note that Entities with Composite Primary Keys cannot utilize the `IRepository` interface since it requires a single Id property. However, you can always use `IRepository`. See [repositories documentation](Repositories.md) for more. +### EntityEquals + +`Entity.EntityEquals(...)` method is used to check if two Entity Objects are equals. + +Example: + +```csharp +Book book1 = ... +Book book2 = ... + +if (book1.EntityEquals(book2)) //Check equality +{ + ... +} +``` ## AggregateRoot Class diff --git a/docs/en/Getting-Started-AspNetCore-Application.md b/docs/en/Getting-Started-AspNetCore-Application.md index 0ccd900b1f..c7f329878c 100644 --- a/docs/en/Getting-Started-AspNetCore-Application.md +++ b/docs/en/Getting-Started-AspNetCore-Application.md @@ -77,7 +77,7 @@ using BasicAspNetCoreApplication; var builder = WebApplication.CreateBuilder(args); -await builder.Services.AddApplicationAsync(); +await builder.AddApplicationAsync(); var app = builder.Build(); @@ -85,7 +85,7 @@ await app.InitializeApplicationAsync(); await app.RunAsync(); ```` -``builder.Services.AddApplicationAsync();`` adds all services defined in all modules starting from the ``AppModule``. +``builder.AddApplicationAsync();`` adds all services defined in all modules starting from the ``AppModule``. ``app.InitializeApplicationAsync()`` initializes and starts the application. @@ -125,7 +125,7 @@ var builder = WebApplication.CreateBuilder(args); builder.Host.UseAutofac(); //Add this line -await builder.Services.AddApplicationAsync(); +await builder.AddApplicationAsync(); var app = builder.Build(); diff --git a/docs/en/Getting-Started-Running-Solution.md b/docs/en/Getting-Started-Running-Solution.md index 66230c7aef..44fbd3eb03 100644 --- a/docs/en/Getting-Started-Running-Solution.md +++ b/docs/en/Getting-Started-Running-Solution.md @@ -163,6 +163,8 @@ You can see the application APIs and test them here. Get [more info](https://swa ### Running the Blazor Application (Client Side) +Go to the Blazor project folder, open a command line terminal, type the `abp bundle -f` command (If the project was created by ABP Cli tool, you don't need to do this). + Ensure that the `.Blazor` project is the startup project and run the application. > Use Ctrl+F5 in Visual Studio (instead of F5) to run the application without debugging. If you don't have a debug purpose, this will be faster. diff --git a/docs/en/Migration-Guides/Abp-6_0.md b/docs/en/Migration-Guides/Abp-6_0.md new file mode 100644 index 0000000000..1436990e56 --- /dev/null +++ b/docs/en/Migration-Guides/Abp-6_0.md @@ -0,0 +1,29 @@ +# ABP Version 6.0 Migration Guide + +This document is a guide for upgrading ABP v5.3 solutions to ABP v6.0. There is a change in this version that may affect your applications, please read it carefully and apply the necessary changes to your application. + +## Added IsActive property + +`IsActive` property is added to `IUserData`. This property is set to **true** by default. **Cmskit** and **Blog** modules are affected by this change. You need to add new migration to your existing application if you are using any of these modules. Please see [#11417](https://github.com/abpframework/abp/pull/11417) for more info. + +## Default behavior change in MultiTenancyMiddlewareErrorPageBuilder + +If you have customized the `MultiTenancyMiddlewareErrorPageBuilder` of `AbpMultiTenancyOptions`, the pipeline now returns **true** to stop the pipeline as the default behavior. See [AbpMultiTenancyOptions: Handle inactive and non-existent tenants](https://github.com/abpframework/abp/blob/dev/docs/en/Multi-Tenancy.md#abpmultitenancyoptions-handle-inactive-and-non-existent-tenants) for more info. + +## Migrating to LeptonX Lite + +LeptonX Lite is now being introduced and you can follow the guides below to migrate your existing applications: + +- [Migrating to LeptonX MVC UI](../themes/LeptonXLite/AspNetCore.md) +- [Migrating to LeptonX Angular UI](../themes/LeptonXLite/angular.md) +- [Migrating to LeptonX Blazor UI](../themes/LeptonXLite/blazor.md) + +## Migrating to OpenIddict + +After the [announcement of plan to replace the IdentityServer](https://github.com/abpframework/abp/issues/11989), we have successfully implemented [Openiddict](https://github.com/openiddict/openiddict-core) as a replacement for IdentityServer4 as an OpenID-Provider. + +You can follow the [IdentityServer to OpenIddict Step by Step Guide](OpenIddict-Step-by-Step.md) for migrating your existing application in detail with a sample projects. + +## See Also + +* [Official blog post for the 6.0 release](https://blog.abp.io/abp/ABP.IO-Platform-6.0-RC-Has-Been-Published) diff --git a/docs/en/Migration-Guides/IdentityServer_To_OpenIddict.md b/docs/en/Migration-Guides/IdentityServer_To_OpenIddict.md new file mode 100644 index 0000000000..a4baa79d9f --- /dev/null +++ b/docs/en/Migration-Guides/IdentityServer_To_OpenIddict.md @@ -0,0 +1,78 @@ +# Migration Identity Server to OpenIddict Guide + +This document explains how to migrate to [OpenIddict](https://github.com/openiddict/openiddict-core) from Identity Server. From now on the ABP startup templates uses `OpenIddict` as the auth server by default since version v6.0.0. + +## History +We are not removing Identity Server packages and we will continue to release new versions of Identity Server related NuGet/NPM packages. That means you won't have an issue while upgrading to v6.0 when the stable version releases. We will continue to fix bugs in our packages for a while. ABP 7.0 will be based on .NET 7. If Identity Server continues to work with .NET 7, we will also continue to ship NuGet packages for our IDS integration. + +On the other hand, Identity Server ends support for the open-source Identity Server in the end of 2022. The Identity Server team has decided to move to Duende IDS and ABP will not be migrated to the commercial Duende IDS. You can see the Duende Identity Server announcement from [this link](https://blog.duendesoftware.com/posts/20220111_fair_trade). + +## OpenIddict Migration Steps + +* Update all `Volo's` packages to `6.x`. +* Replace all `Volo's` `IdentityServer.*` packages with corresponding `OpenIddict.*` packages. eg `Volo.Abp.IdentityServer.Domain` to `Volo.Abp.OpenIddict.Domain`, `Volo.Abp.Account.Web.IdentityServer` to `Volo.Abp.Account.Web.OpenIddict`. +* Replace all `IdentityServer` modules with corresponding `OpenIddict` modules. eg `AbpIdentityServerDomainModule` to `AbpOpenIddictDomainModule`, `AbpAccountWebIdentityServerModule` to `AbpAccountWebOpenIddictModule`. +* Rename the `ConfigureIdentityServer` to `ConfigureOpenIddict` in your `ProjectNameDbContext` class. +* Remove the `UseIdentityServer` and add `UseAbpOpenIddictValidation` after `UseAuthentication`. +* Add follow code to your startup module. + +```cs +public override void PreConfigureServices(ServiceConfigurationContext context) +{ + PreConfigure(builder => + { + builder.AddValidation(options => + { + options.AddAudiences("ProjectName"); // Change ProjectName to your project name. + options.UseLocalServer(); + options.UseAspNetCore(); + }); + }); +} +``` + +* If your project is not separate AuthServer please also add `ForwardIdentityAuthenticationForBearer` + +```cs +private void ConfigureAuthentication(ServiceConfigurationContext context) +{ + context.Services.ForwardIdentityAuthenticationForBearer(OpenIddictValidationAspNetCoreDefaults.AuthenticationScheme); +} +``` + +* Remove the `IdentityServerDataSeedContributor` from the `Domain` project. +* Create a new version of the project, with the same name as your existing project. +* Copy the `ProjectName.Domain\OpenIddict\OpenIddictDataSeedContributor.cs` of new project into your project and update `appsettings.json` base on `ProjectName.DbMigrator\appsettings.json`, Be careful to change the port number. +* Copy the `Index.cshtml.cs` and `Index.cs` of new project to your project if you're using `IClientRepository` in `IndexModel`. +* Update the scope name from `role` to `roles` in `AddAbpOpenIdConnect` method. +* Remove `options.OAuthClientSecret(configuration["AuthServer:SwaggerClientSecret"]);` from `HttpApi.Host` project. +* AuthServer no longer requires `JWT bearer authentication`. Please remove it. eg `AddJwtBearer` and `UseJwtTokenMiddleware`. +* Try compiling the project in the IDE and following the errors to remove and reference the code and namespaces. +* Add migrations and update the database if you are using EF Core as the database provider. + +## Module packages +### Open source side +* Volo.Abp.OpenIddict.Domain (`AbpOpenIddictDomainModule`) +* Volo.Abp.OpenIddict.Domain.Shared (`AbpOpenIddictDomainSharedModule`) +* Volo.Abp.OpenIddict.EntityFrameworkCore (`AbpOpenIddictEntityFrameworkCoreModule`) +* Volo.Abp.OpenIddict.AspNetCore (`AbpOpenIddictAspNetCoreModule`) +* Volo.Abp.OpenIddict.MongoDB (`AbpOpenIddictMongoDbModule`) +* Volo.Abp.Account.Web.OpenIddict (`AbpAccountWebOpenIddictModule`) +* Volo.Abp.PermissionManagement.Domain.OpenIddict (`AbpPermissionManagementDomainOpenIddictModule`) + +### Commercial side +* Volo.Abp.OpenIddict.Pro.Application.Contracts (`AbpOpenIddictProApplicationContractsModule`) +* Volo.Abp.OpenIddict.Pro.Application (`AbpOpenIddictProApplicationModule`) +* Volo.Abp.OpenIddict.Pro.HttpApi.Client (`AbpOpenIddictProHttpApiClientModule`) +* Volo.Abp.OpenIddict.Pro.HttpApi (`AbpOpenIddictProHttpApiModule`) +* Volo.Abp.OpenIddict.Pro.Blazor(`AbpOpenIddictProBlazorModule`) +* Volo.Abp.OpenIddict.Pro.Blazor.Server (`AbpOpenIddictProBlazorServerModule`) +* Volo.Abp.OpenIddict.Pro.Blazor.WebAssembly (`AbpOpenIddictProBlazorWebAssemblyModule`) +* Volo.Abp.OpenIddict.Pro.Web (`AbpOpenIddictProWebModule`) + +## Source code of samples and module + +* [Open source tiered & separate auth server application migrate Identity Server to OpenIddct](https://github.com/abpframework/abp-samples/tree/master/Ids2OpenId) +* [Commercial tiered & separate auth server application migrate Identity Server to OpenIddct](https://abp.io/Account/Login?returnUrl=/api/download/samples/Ids2OpenId) +* [OpenIddict module document](https://docs.abp.io/en/abp/6.0/Modules/OpenIddict) +* [OpenIddict module source code](https://github.com/abpframework/abp/tree/rel-6.0/modules/openiddict) diff --git a/docs/en/Migration-Guides/Index.md b/docs/en/Migration-Guides/Index.md index c24ac09eee..e3ea77db1f 100644 --- a/docs/en/Migration-Guides/Index.md +++ b/docs/en/Migration-Guides/Index.md @@ -2,6 +2,7 @@ The following documents explain how to migrate your existing ABP applications. We write migration documents only if you need to take an action while upgrading your solution. Otherwise, you can easily upgrade your solution using the [abp update command](../Upgrading.md). +- [5.3 to 6.0](Abp-6_0.md) - [5.2 to 5.3](Abp-5_3.md) - [5.1 to 5.2](Abp-5_2.md) - [4.x to 5.0](Abp-5_0.md) diff --git a/docs/en/Migration-Guides/OpenIddict-Angular.md b/docs/en/Migration-Guides/OpenIddict-Angular.md new file mode 100644 index 0000000000..e8d34cb5fc --- /dev/null +++ b/docs/en/Migration-Guides/OpenIddict-Angular.md @@ -0,0 +1,170 @@ +# OpenIddict Angular UI Migration Guide + +## Angular Project + +- In `environment.ts` and `environment.prod.ts` **add a trailing slash at the end of the issuer**: + + ```typescript + oAuthConfig: { + issuer: 'https://localhost:44377/', + ... + }, + ``` + +## Http.Api.Host (Non-Separated IdentityServer) + +- In **MyApplication.HttpApi.Host.csproj** replace **project references**: + + ```csharp + + + ``` + + with + + ```csharp + + ``` + +- In the **MyApplicationHttpApiHostModule.cs** replace usings and **module dependencies**: + + ```csharp + using Volo.Abp.AspNetCore.Authentication.JwtBearer; + ... + typeof(AbpAspNetCoreAuthenticationJwtBearerModule), + typeof(AbpAccountWebIdentityServerModule), + ``` + + with + + ```csharp + using OpenIddict.Validation.AspNetCore; + ... + typeof(AbpAccountWebOpenIddictModule), + ``` + +- In the **MyApplicationHttpApiHostModule.cs** add `PreConfigureServices` like below with your application name as the audience: + + ```csharp + public override void PreConfigureServices(ServiceConfigurationContext context) + { + PreConfigure(builder => + { + builder.AddValidation(options => + { + options.AddAudiences("MyApplication"); // Replace with your application name + options.UseLocalServer(); + options.UseAspNetCore(); + }); + }); + } + ``` + +- In the **MyApplicationHttpApiHostModule.cs** `ConfigureServices` method, **replace the method call**: + + From `ConfigureAuthentication(context, configuration);` to `ConfigureAuthentication(context);` and update the method as: + + ```csharp + private void ConfigureAuthentication(ServiceConfigurationContext context) + { + context.Services.ForwardIdentityAuthenticationForBearer(OpenIddictValidationAspNetCoreDefaults.AuthenticationScheme); + } + ``` + +- In the **MyApplicationHttpApiHostModule.cs** `OnApplicationInitialization` method, **replace the midware**: + + ```csharp + app.UseJwtTokenMiddleware(); + app.UseIdentityServer(); + ``` + + with + + ```csharp + app.UseAbpOpenIddictValidation(); + ``` + +- In the **MyApplicationHttpApiHostModule.cs** `OnApplicationInitialization` method, delete `c.OAuthClientSecret(configuration["AuthServer:SwaggerClientSecret"]);` in `app.UseAbpSwaggerUI` options configurations which is no longer needed. + +- In `appsettings.json` delete **SwaggerClientSecret** from the *AuthServer* section like below: + + ```json + "AuthServer": { + "Authority": "https://localhost:44345", + "RequireHttpsMetadata": "false", + "SwaggerClientId": "MyApplication_Swagger" + }, + ``` + +## Http.Api.Host (Separated IdentityServer) + +- In the **MyApplicationHttpApiHostModule.cs** `OnApplicationInitialization` method, delete `c.OAuthClientSecret(configuration["AuthServer:SwaggerClientSecret"]);` in `app.UseAbpSwaggerUI` options configurations which is no longer needed. + +- In `appsettings.json` delete **SwaggerClientSecret** from the *AuthServer* section like below: + + ```json + "AuthServer": { + "Authority": "https://localhost:44345", + "RequireHttpsMetadata": "false", + "SwaggerClientId": "MyApplication_Swagger" + }, + ``` + +## IdentityServer + +This project is renamed to **AuthServer** after v6.0.0-rc1. You can also refactor and rename your project to *AuthServer* for easier updates in the future. + +- In **MyApplication.IdentityServer.csproj** replace **project references**: + + ```csharp + + ``` + + with + + ```csharp + + ``` + +- In the **MyApplicationIdentityServerModule.cs** replace usings and **module dependencies**: + + ```csharp + typeof(AbpAccountWebIdentityServerModule), + ``` + + with + + ```csharp + typeof(AbpAccountWebOpenIddictModule), + ``` + +- In the **MyApplicationIdentityServerModule.cs** add `PreConfigureServices` like below with your application name as the audience: + + ```csharp + public override void PreConfigureServices(ServiceConfigurationContext context) + { + PreConfigure(builder => + { + builder.AddValidation(options => + { + options.AddAudiences("MyApplication"); // Replace with your application name + options.UseLocalServer(); + options.UseAspNetCore(); + }); + }); + } + ``` + +- In the **MyApplicationIdentityServerModule.cs** `OnApplicationInitialization` method, **remove the midware**: + + ```csharp + app.UseIdentityServer(); + ``` + +- To use the new AuthServer page, replace **Index.cshtml.cs** with [AuthServer Index.cshtml.cs](https://github.com/abpframework/abp-samples/blob/master/Ids2OpenId/src/Ids2OpenId.IdentityServer/Pages/Index.cshtml) and **Index.cshtml** file with [AuthServer Index.cshtml](https://github.com/abpframework/abp-samples/blob/master/Ids2OpenId/src/Ids2OpenId.IdentityServer/Pages/Index.cshtml.cs) and rename **Ids2OpenId** with your application namespace. + + > Note: It can be found under the *Pages* folder. + +## See Also + +* [OpenIddict Step-by-Step Guide](OpenIddict-Step-by-Step.md) diff --git a/docs/en/Migration-Guides/OpenIddict-Blazor-Server.md b/docs/en/Migration-Guides/OpenIddict-Blazor-Server.md new file mode 100644 index 0000000000..4db4556479 --- /dev/null +++ b/docs/en/Migration-Guides/OpenIddict-Blazor-Server.md @@ -0,0 +1,175 @@ +# OpenIddict Blazor-Server UI Migration Guide + +## Blazor Project (Non-Tiered Solution) + +- In the **MyApplication.Blazor.csproj** replace **project references**: + + ```csharp + + + ``` + + with + + ```csharp + + ``` + +- In the **MyApplicationBlazorModule.cs** replace usings and **module dependencies**: + + ```csharp + using System; + using System.Net.Http; + using Volo.Abp.AspNetCore.Authentication.JwtBearer; + ... + typeof(AbpAspNetCoreAuthenticationJwtBearerModule), + typeof(AbpAccountWebIdentityServerModule), + ``` + + with + + ```csharp + using OpenIddict.Validation.AspNetCore; + ... + typeof(AbpAccountWebOpenIddictModule), + ``` + +- In the **MyApplicationBlazorModule.cs** add `PreConfigureServices` like below with your application name as the audience: + + ```csharp + public override void PreConfigureServices(ServiceConfigurationContext context) + { + PreConfigure(builder => + { + builder.AddValidation(options => + { + options.AddAudiences("MyApplication"); // Replace with your application name + options.UseLocalServer(); + options.UseAspNetCore(); + }); + }); + } + ``` + +- In the **MyApplicationBlazorModule.cs** `ConfigureServices` method, **replace the method call**: + + From `ConfigureAuthentication(context, configuration);` to `ConfigureAuthentication(context);` and update the method as: + + ```csharp + private void ConfigureAuthentication(ServiceConfigurationContext context) + { + context.Services.ForwardIdentityAuthenticationForBearer(OpenIddictValidationAspNetCoreDefaults.AuthenticationScheme); + } + ``` + +- In the **MyApplicationBlazorModule.cs** `OnApplicationInitialization` method, **replace the midware**: + + ```csharp + app.UseJwtTokenMiddleware(); + app.UseIdentityServer(); + ``` + + with + + ```csharp + app.UseAbpOpenIddictValidation(); + ``` + +## Blazor Project (Tiered Solution) + +- In the **MyApplicationWebModule.cs** update the `AddAbpOpenIdConnect` configurations: + + ```csharp + .AddAbpOpenIdConnect("oidc", options => + { + options.Authority = configuration["AuthServer:Authority"]; + options.RequireHttpsMetadata = Convert.ToBoolean(configuration["AuthServer:RequireHttpsMetadata"]); + options.ResponseType = OpenIdConnectResponseType.CodeIdToken; + + options.ClientId = configuration["AuthServer:ClientId"]; + options.ClientSecret = configuration["AuthServer:ClientSecret"]; + + options.SaveTokens = true; + options.GetClaimsFromUserInfoEndpoint = true; + + options.Scope.Add("roles"); // Replace "role" with "roles" + options.Scope.Add("email"); + options.Scope.Add("phone"); + options.Scope.Add("MyApplication"); + }); + ``` + + Replace **role** scope with **roles**. + +## IdentityServer + +This project is renamed to **AuthServer** after v6.0.0-rc1. You can also refactor and rename your project to *AuthServer* for easier updates in the future. + +- In **MyApplication.IdentityServer.csproj** replace **project references**: + + ```csharp + + ``` + + with + + ```csharp + + ``` + +- In **MyApplicationIdentityServerModule.cs** replace usings and **module dependencies**: + + ```csharp + typeof(AbpAccountWebIdentityServerModule), + ``` + + with + + ```csharp + typeof(AbpAccountWebOpenIddictModule), + ``` + +- In the **MyApplicationIdentityServerModule.cs** add `PreConfigureServices` like below with your application name as the audience: + + ```csharp + public override void PreConfigureServices(ServiceConfigurationContext context) + { + PreConfigure(builder => + { + builder.AddValidation(options => + { + options.AddAudiences("MyApplication"); // Replace with your application name + options.UseLocalServer(); + options.UseAspNetCore(); + }); + }); + } + ``` + +- In **MyApplicationIdentityServerModule.cs** `OnApplicationInitialization` method **remove IdentityServer midware**: + + ```csharp + app.UseIdentityServer(); + ``` + +## Http.Api.Host + +- In the **MyApplicationHttpApiHostModule.cs** `OnApplicationInitialization` method, delete `c.OAuthClientSecret(configuration["AuthServer:SwaggerClientSecret"]);` in `app.UseAbpSwaggerUI` options configurations which is no longer needed. + +- In `appsettings.json` delete **SwaggerClientSecret** from the *AuthServer* section like below: + +```json +"AuthServer": { + "Authority": "https://localhost:44345", + "RequireHttpsMetadata": "false", + "SwaggerClientId": "MyApplication_Swagger" +}, +``` + +- To use the new AuthServer page, replace **Index.cshtml.cs** with [AuthServer Index.cshtml.cs](https://github.com/abpframework/abp-samples/blob/master/Ids2OpenId/src/Ids2OpenId.IdentityServer/Pages/Index.cshtml) and **Index.cshtml** file with [AuthServer Index.cshtml](https://github.com/abpframework/abp-samples/blob/master/Ids2OpenId/src/Ids2OpenId.IdentityServer/Pages/Index.cshtml.cs) and rename **Ids2OpenId** with your application namespace. + + > Note: It can be found under the *Pages* folder. + +## See Also + +* [OpenIddict Step-by-Step Guide](OpenIddict-Step-by-Step.md) diff --git a/docs/en/Migration-Guides/OpenIddict-Blazor.md b/docs/en/Migration-Guides/OpenIddict-Blazor.md new file mode 100644 index 0000000000..0dc1c0f123 --- /dev/null +++ b/docs/en/Migration-Guides/OpenIddict-Blazor.md @@ -0,0 +1,189 @@ +# OpenIddict Blazor Wasm UI Migration Guide + +## Blazor Project + +- In the **MyApplicationBlazorModule.cs** update the `ConfigureAuthentication` method: + + ```csharp + builder.Services.AddOidcAuthentication(options => + { + ... + options.UserOptions.RoleClaim = JwtClaimTypes.Role; + + options.ProviderOptions.DefaultScopes.Add("role"); + ... + }); + ``` + + Update **UserOptions** and **role scope** as below + + ```csharp + builder.Services.AddOidcAuthentication(options => + { + ... + options.UserOptions.NameClaim = OpenIddictConstants.Claims.Name; + options.UserOptions.RoleClaim = OpenIddictConstants.Claims.Role; + + options.ProviderOptions.DefaultScopes.Add("roles"); + ... + }); + ``` + +## Http.Api.Host (Non-Separated IdentityServer) + +- In the **MyApplication.HttpApi.Host.csproj** replace **project references**: + + ```csharp + + + ``` + + with + + ```csharp + + ``` + +- In the **MyApplicationHttpApiHostModule.cs** replace usings and **module dependencies**: + + ```csharp + using System.Net.Http; + using Volo.Abp.AspNetCore.Authentication.JwtBearer; + ... + typeof(AbpAspNetCoreAuthenticationJwtBearerModule), + typeof(AbpAccountWebIdentityServerModule), + ``` + + with + + ```csharp + using OpenIddict.Validation.AspNetCore; + ... + typeof(AbpAccountWebOpenIddictModule), + ``` + +- In the **MyApplicationBlazorModule.cs** add `PreConfigureServices` like below with your application name as the audience: + + ```csharp + public override void PreConfigureServices(ServiceConfigurationContext context) + { + PreConfigure(builder => + { + builder.AddValidation(options => + { + options.AddAudiences("MyApplication"); // Replace with your application name + options.UseLocalServer(); + options.UseAspNetCore(); + }); + }); + } + ``` + +- In the **MyApplicationBlazorModule.cs** `ConfigureServices` method, **replace the method call**: + + From `ConfigureAuthentication(context, configuration);` to `ConfigureAuthentication(context);` and update the method as: + + ```csharp + private void ConfigureAuthentication(ServiceConfigurationContext context) + { + context.Services.ForwardIdentityAuthenticationForBearer(OpenIddictValidationAspNetCoreDefaults.AuthenticationScheme); + } + ``` + +- In the **MyApplicationBlazorModule.cs** `OnApplicationInitialization` method, **replace the midware**: + + ```csharp + app.UseJwtTokenMiddleware(); + app.UseIdentityServer(); + ``` + + with + + ```csharp + app.UseAbpOpenIddictValidation(); + ``` + +- Delete `c.OAuthClientSecret(configuration["AuthServer:SwaggerClientSecret"]);` in `app.UseAbpSwaggerUI` options configurations which is no longer needed. + +- In `appsettings.json` delete **SwaggerClientSecret** from the *AuthServer* section like below: + + ```json + "AuthServer": { + "Authority": "https://localhost:44345", + "RequireHttpsMetadata": "false", + "SwaggerClientId": "MyApplication_Swagger" + }, + ``` + +## Http.Api.Host (Separated IdentityServer) + +- In the **MyApplicationHttpApiHostModule.cs** `OnApplicationInitialization` method, delete `c.OAuthClientSecret(configuration["AuthServer:SwaggerClientSecret"]);` in `app.UseAbpSwaggerUI` options configurations which is no longer needed. + +- In `appsettings.json` delete **SwaggerClientSecret** from the *AuthServer* section like below: + + ```json + "AuthServer": { + "Authority": "https://localhost:44345", + "RequireHttpsMetadata": "false", + "SwaggerClientId": "MyApplication_Swagger" + }, + ``` + +## IdentityServer + +This project is renamed to **AuthServer** after v6.0.0-rc1. You can also refactor and rename your project to *AuthServer* for easier updates in the future. + +- In **MyApplication.IdentityServer.csproj** replace **project references**: + + ```csharp + + ``` + + with + + ```csharp + + ``` + +- In the **MyApplicationIdentityServerModule.cs** replace usings and **module dependencies**: + + ```csharp + typeof(AbpAccountWebIdentityServerModule), + ``` + + with + + ```csharp + typeof(AbpAccountWebOpenIddictModule), + ``` + +- In the **MyApplicationIdentityServerModule.cs** add `PreConfigureServices` like below with your application name as the audience: + + ```csharp + public override void PreConfigureServices(ServiceConfigurationContext context) + { + PreConfigure(builder => + { + builder.AddValidation(options => + { + options.AddAudiences("MyApplication"); // Replace with your application name + options.UseLocalServer(); + options.UseAspNetCore(); + }); + }); + } + ``` + +- In the **MyApplicationIdentityServerModule.cs** `OnApplicationInitialization` method, **remove the midware**: + + ```csharp + app.UseIdentityServer(); + ``` + +- To use the new AuthServer page, replace **Index.cshtml.cs** with [AuthServer Index.cshtml.cs](https://github.com/abpframework/abp-samples/blob/master/Ids2OpenId/src/Ids2OpenId.IdentityServer/Pages/Index.cshtml) and **Index.cshtml** file with [AuthServer Index.cshtml](https://github.com/abpframework/abp-samples/blob/master/Ids2OpenId/src/Ids2OpenId.IdentityServer/Pages/Index.cshtml.cs) and rename **Ids2OpenId** with your application namespace. + + > Note: It can be found under the *Pages* folder. + +## See Also + +* [OpenIddict Step-by-Step Guide](OpenIddict-Step-by-Step.md) diff --git a/docs/en/Migration-Guides/OpenIddict-Mvc.md b/docs/en/Migration-Guides/OpenIddict-Mvc.md new file mode 100644 index 0000000000..e772de272c --- /dev/null +++ b/docs/en/Migration-Guides/OpenIddict-Mvc.md @@ -0,0 +1,166 @@ +# OpenIddict MVC/Razor UI Migration Guide + +## Web Project (Non-Tiered Solution) + +- In **MyApplication.Web.csproj** replace **project references**: + + ```csharp + + + ``` + + with + + ```csharp + + ``` + +- In **MyApplicationWebModule.cs** replace usings and **module dependencies**: + + ```csharp + using Volo.Abp.AspNetCore.Authentication.JwtBearer; + ... + typeof(AbpAccountWebIdentityServerModule), + typeof(AbpAspNetCoreAuthenticationJwtBearerModule), + ``` + + with + + ```csharp + typeof(AbpAccountWebModule), + ``` + +- In **MyApplicationWebModule.cs** `ConfigureServices` method **update authentication configuration**: + + ```csharp + ConfigureAuthentication(context, configuration); + ``` + + with + + ```csharp + ConfigureAuthentication(context); + ``` + + and update the `ConfigureAuthentication` private method to: + + ```csharp + private void ConfigureAuthentication(ServiceConfigurationContext context) + { + context.Services.ForwardIdentityAuthenticationForBearer(OpenIddictValidationAspNetCoreDefaults.AuthenticationScheme); + } + ``` + +- In **MyApplicationWebModule.cs** `OnApplicationInitialization` method **replace IdentityServer and JwtToken midwares**: + + ```csharp + app.UseJwtTokenMiddleware(); + app.UseIdentityServer(); + ``` + + with + + ```csharp + app.UseAbpOpenIddictValidation(); + ``` + + +## Web Project (Tiered Solution) + +- In the **MyApplicationWebModule.cs** update the `AddAbpOpenIdConnect` configurations: + + ```csharp + .AddAbpOpenIdConnect("oidc", options => + { + options.Authority = configuration["AuthServer:Authority"]; + options.RequireHttpsMetadata = Convert.ToBoolean(configuration["AuthServer:RequireHttpsMetadata"]); + options.ResponseType = OpenIdConnectResponseType.CodeIdToken; + + options.ClientId = configuration["AuthServer:ClientId"]; + options.ClientSecret = configuration["AuthServer:ClientSecret"]; + + options.UsePkce = true; // Add this line + options.SaveTokens = true; + options.GetClaimsFromUserInfoEndpoint = true + + options.Scope.Add("roles"); // Replace "role" with "roles" + options.Scope.Add("email"); + options.Scope.Add("phone"); + options.Scope.Add("MyApplication"); + }); + ``` + +Replace role scope to **roles** and add **UsePkce** and **SignoutScheme** options. + +## IdentityServer + +This project is renamed to **AuthServer** after v6.0.0-rc1. You can also refactor and rename your project to *AuthServer* for easier updates in the future. + +- In **MyApplication.IdentityServer.csproj** replace **project references**: + + ```csharp + + ``` + + with + + ```csharp + + ``` + +- In **MyApplicationIdentityServerModule.cs** replace usings and **module dependencies**: + + ```csharp + typeof(AbpAccountWebIdentityServerModule), + ``` + + with + + ```csharp + typeof(AbpAccountWebOpenIddictModule), + ``` + +- In the **MyApplicationIdentityServerModule.cs** add `PreConfigureServices` like below with your application name as the audience: + + ```csharp + public override void PreConfigureServices(ServiceConfigurationContext context) + { + PreConfigure(builder => + { + builder.AddValidation(options => + { + options.AddAudiences("MyApplication"); // Replace with your application name + options.UseLocalServer(); + options.UseAspNetCore(); + }); + }); + } + ``` + +- In **MyApplicationIdentityServerModule.cs** `OnApplicationInitialization` method **remove IdentityServer midware**: + + ```csharp + app.UseIdentityServer(); + ``` + +- To use the new AuthServer page, replace **Index.cshtml.cs** with [AuthServer Index.cshtml.cs](https://github.com/abpframework/abp-samples/blob/master/Ids2OpenId/src/Ids2OpenId.IdentityServer/Pages/Index.cshtml) and **Index.cshtml** file with [AuthServer Index.cshtml](https://github.com/abpframework/abp-samples/blob/master/Ids2OpenId/src/Ids2OpenId.IdentityServer/Pages/Index.cshtml.cs) and rename **Ids2OpenId** with your application namespace. + + > Note: It can be found under the *Pages* folder. + +## Http.Api.Host + +- In the **MyApplicationHttpApiHostModule.cs** `OnApplicationInitialization` method, delete `c.OAuthClientSecret(configuration["AuthServer:SwaggerClientSecret"]);` in `app.UseAbpSwaggerUI` options configurations which is no longer needed. + +- In `appsettings.json` delete **SwaggerClientSecret** from the *AuthServer* section like below: + + ```json + "AuthServer": { + "Authority": "https://localhost:44345", + "RequireHttpsMetadata": "false", + "SwaggerClientId": "MyApplication_Swagger" + }, + ``` + +## See Also + +* [OpenIddict Step-by-Step Guide](OpenIddict-Step-by-Step.md) diff --git a/docs/en/Migration-Guides/OpenIddict-Step-by-Step.md b/docs/en/Migration-Guides/OpenIddict-Step-by-Step.md new file mode 100644 index 0000000000..3567ea5c06 --- /dev/null +++ b/docs/en/Migration-Guides/OpenIddict-Step-by-Step.md @@ -0,0 +1,231 @@ +# Migrating from IdentityServer to OpenIddict Step by Step Guide + +This guide provides layer-by-layer guidance for migrating your existing application to [OpenIddict](https://github.com/openiddict/openiddict-core) from IdentityServer. ABP startup templates use `OpenIddict` OpenId provider from v6.0.0-rc1 by default and `IdentityServer` projects are renamed to `AuthServer` in tiered/separated solutions. Since OpenIddict is only available with ABP v6.0, you will need to update your existing application in order to apply OpenIddict changes. + +## History +We are not removing Identity Server packages and we will continue to release new versions of IdentityServer-related NuGet/NPM packages. That means you won't have an issue while upgrading to v6.0 when the stable version releases. We will continue to fix bugs in our packages for a while. ABP 7.0 will be based on .NET 7. If Identity Server continues to work with .NET 7, we will also continue to ship NuGet packages for our IDS integration. + +On the other hand, Identity Server ends support for the open-source Identity Server at the end of 2022. The Identity Server team has decided to move to Duende IDS and ABP will not be migrated to the commercial Duende IDS. You can see the Duende Identity Server announcement from [this link](https://blog.duendesoftware.com/posts/20220111_fair_trade). + +## OpenIddict Migration Steps + +Use the `abp update` command to update your existing application. See [Upgrading docs](../Upgrading.md) for more info. Apply required migrations by following the [Migration Guides](Index.md) based on your application version. + +### Domain.Shared Layer + +- In **MyApplication.Domain.Shared.csproj** replace **project reference**: + ```csharp + + ``` + with + ```csharp + + ``` + +- In **MyApplicationDomainSharedModule.cs** replace usings and **module dependencies:** + + ```csharp + using Volo.Abp.IdentityServer; + ... + typeof(AbpIdentityServerDomainSharedModule) + ``` + with + ```csharp + using Volo.Abp.OpenIddict; + ... + typeof(AbpOpenIddictDomainSharedModule) + +### Domain Layer + +- In **MyApplication.Domain.csproj** replace **project references**: + + ```csharp + + + ``` + + with + + ```csharp + + + ``` + +- In **MyApplicationDomainModule.cs** replace usings and **module dependencies**: + + ```csharp + using Volo.Abp.IdentityServer; + using Volo.Abp.PermissionManagement.IdentityServer; + ... + typeof(AbpIdentityServerDomainModule), + typeof(AbpPermissionManagementDomainIdentityServerModule), + ``` + + with + + ```csharp + using Volo.Abp.OpenIddict; + using Volo.Abp.PermissionManagement.OpenIddict; + ... + typeof(AbpOpenIddictDomainModule), + typeof(AbpPermissionManagementDomainOpenIddictModule), + ``` + +#### OpenIddictDataSeedContributor + +- Create a folder named *OpenIddict* under the Domain project and copy the [OpenIddictDataSeedContributor.cs](https://github.com/abpframework/abp-samples/blob/master/Ids2OpenId/src/Ids2OpenId.Domain/OpenIddict/OpenIddictDataSeedContributor.cs) under this folder. Rename all the `Ids2OpenId` with your project name. +- Delete *IdentityServer* folder that contains `IdentityServerDataSeedContributor.cs` which is no longer needed. + +You can also create a project with the same name and copy the `OpenIddict` folder of the new project into your project. + +### EntityFrameworkCore Layer + +If you are using MongoDB, skip this step and check the *MongoDB* layer section. + +- In **MyApplication.EntityFrameworkCore.csproj** replace **project reference**: + + ```csharp + + ``` + + with + + ```csharp + + ``` + +- In **MyApplicationEntityFrameworkCoreModule.cs** replace usings and **module dependencies**: + + ```csharp + using Volo.Abp.IdentityServer.EntityFrameworkCore; + ... + typeof(AbpIdentityServerEntityFrameworkCoreModule), + ``` + + with + + ```csharp + using Volo.Abp.OpenIddict.EntityFrameworkCore; + ... + typeof(AbpOpenIddictEntityFrameworkCoreModule), + ``` + +- In **MyApplicationDbContext.cs** replace usings and **fluent api configurations**: + + ```csharp + using Volo.Abp.IdentityServer.EntityFrameworkCore; + ... + using Volo.Abp.OpenIddict.EntityFrameworkCore; + ... + protected override void OnModelCreating(ModelBuilder builder) + { + base.OnModelCreating(builder); + + /* Include modules to your migration db context */ + + ... + builder.ConfigureIdentityServer(); + ``` + + with + + ```csharp + using Volo.Abp.OpenIddict.EntityFrameworkCore; + ... + protected override void OnModelCreating(ModelBuilder builder) + { + base.OnModelCreating(builder); + + /* Include modules to your migration db context */ + + ... + builder.ConfigureOpenIddict(); + ``` + +### MongoDB Layer + +If you are using EntityFrameworkCore, skip this step and check the *EntityFrameworkCore* layer section. + +- In **MyApplication.MongoDB.csproj** replace **project reference**: + + ```csharp + + ``` + + with + + ```csharp + + ``` + +- In **MyApplicationMongoDbModule.cs** replace usings and **module dependencies**: + + ```csharp + using Volo.Abp.IdentityServer.MongoDB; + ... + typeof(AbpIdentityServerMongoDbModule), + ``` + + with + + ```csharp + using Volo.Abp.OpenIddict.MongoDB; + ... + typeof(AbpOpenIddictMongoDbModule), + ``` + +### DbMigrator Project + +- In **MyApplication.DbMigrator.csproj** **add project reference**: + + ```csharp + + ``` + +for creating the host builder. + +- In `appsettings.json` **replace IdentityServer section with OpenIddict:** + + ```json + "OpenIddict": { + "Applications": { + "MyApplication_Web": { + "ClientId": "MyApplication_Web", + "ClientSecret": "1q2w3e*", + "RootUrl": "https://localhost:44384" + }, + "MyApplication_App": { + "ClientId": "MyApplication_App", + "RootUrl": "http://localhost:4200" + }, + "MyApplication_BlazorServerTiered": { + "ClientId": "MyApplication_BlazorServerTiered", + "ClientSecret": "1q2w3e*", + "RootUrl": "https://localhost:44346" + }, + "MyApplication_Swagger": { + "ClientId": "MyApplication_Swagger", + "RootUrl": "https://localhost:44391" + } + } + } + ``` + + Replace **MyApplication** with your application name. + +### UI Layer + +- [Angular UI Migration](OpenIddict-Angular.md) +- [MVC/Razor UI Migration](OpenIddict-Mvc.md) +- [Blazor-Server UI Migration](OpenIddict-Blazor-Server.md) +- [Blazor-Wasm UI Migration](OpenIddict-Blazor.md) + +## Source code of samples and module + +* [Open source tiered & separate auth server application migrate Identity Server to OpenIddct](https://github.com/abpframework/abp-samples/tree/master/Ids2OpenId) +* [OpenIddict module document](https://docs.abp.io/en/abp/6.0/Modules/OpenIddict) +* [OpenIddict module source code](https://github.com/abpframework/abp/tree/rel-6.0/modules/openiddict) + +## See Also + +* [ABP Version 6.0 Migration Guide](Abp-6_0.md) diff --git a/docs/en/Modules/Cms-Kit/Dynamic-Widget.md b/docs/en/Modules/Cms-Kit/Dynamic-Widget.md new file mode 100644 index 0000000000..88c0be6750 --- /dev/null +++ b/docs/en/Modules/Cms-Kit/Dynamic-Widget.md @@ -0,0 +1,137 @@ +# Dynamic Widget + +CMS kit provides a dynamic [widget](https://docs.abp.io/en/abp/latest/UI/AspNetCore/Widgets) used to render the components previously developed by the software in the content of the pages and blog posts. Its means, that in static content you can use dynamic content. We will mention how you can do it. You have two choices to define the widget in the system: Writing and UI. + +### Adding the widget +Firstly we will show how to use the widget system via writing manually in the page and blogpost contents. + +Let's define the view component + +```csharp +[Widget] +[ViewComponent(Name = "CmsToday")] +public class TodayViewComponent : AbpViewComponent +{ + public IViewComponentResult Invoke() + { + return View("~/ViewComponents/Today.cshtml", + new TodayViewComponent()); + } +} +``` + +```html +@model Volo.CmsKit.ViewComponents.TodayViewComponent + +

Welcome Today Component

+

@DateTime.Now.ToString()

+ +``` + +Now configuration time on YourModule.cs +```csharp +Configure(options => + { + options.AddWidget("Today","CmsToday"); + }); +``` + +Now you're ready to add your widget by writing. +[Widget Type="Today"] + +After completing the above steps, you can see the output at the right of the below screenshot. +![cmskit-without-parameter.png](../../images/cmskit-without-parameter.png) + +### Adding by using UI +Now we will mention the second option, using UI. +Once writing these definitions can make some mistakes hence we added a new feature to use the widget system easily. To the right of the editor, you will see the customized `W` button to add a dynamic widget like the below image. Don't forget please this is design mode and you need to view your page in view mode after saving. Also `Preview` tab on the editor will be ready to check your output easily for widget configurations in the next features. + +![cms-kit-page-editor](../../images/cms-kit-page-editor.png) + +### Adding by using UI with parameters +Let's improve the above example by adding a new parameter named format. Via this feature, we can use the widget system with many different scenarios but not prolong the document. Also, these examples can be expandable with dependency injection and getting values from the database, but we will use a basic example. We will add the format parameter to customize the date. + +```csharp +[Widget] +[ViewComponent(Name = "CmsToday")] +public class TodayViewComponent : AbpViewComponent +{ + public string Format { get; set; } + + public IViewComponentResult Invoke(string format) + { + return View("~/ViewComponents/Today.cshtml", + new TodayViewComponent() { Format = format }); + } +} +``` + +```html +@model Volo.CmsKit.ViewComponents.TodayViewComponent + +

Welcome Today Component

+

@DateTime.Now.ToString(Format)

+ +``` + +Let's define the format component. +```csharp +[Widget] +[ViewComponent(Name = "Format")] +public class FormatViewComponent : AbpViewComponent +{ + public IViewComponentResult Invoke() + { + return View("~/ViewComponents/Format.cshtml", + new FormatViewModel()); + } +} + +public class FormatViewModel +{ + [DisplayName("Format your date in the component")] + public string Format { get; set; } +} +``` +> Important Note: To get properties properly you should set the `name` property on the razor page or you may use the ABP component. ABP handles that automatically. + +```html +@using Volo.CmsKit.ViewComponents +@model FormatViewModel + +
+ +
+``` + +```csharp +Configure(options => + { + options.AddWidget("Today", "CmsToday", "Format"); + }); +``` + +![cmskit-module-editor-parameter](../../images/cmskit-module-editor-parameter.png) + +In this image, after choosing your widget (on the other case, it changes automatically up to your configuration, mine is `Today`. Its parameter name `parameterWidgetName` and its value is `Format`) you will see the next widget. Enter input values or choose them and click `Add`. You will see the underlined output in the editor. Right of the image, also you can see its previewed output. + +You can edit this output manually if do any wrong coding for that (wrong value or typo) you won't see the widget, even so, your page will be viewed successfully. + +## Options +To configure the widget, you should define the below code in YourModule.cs + +```csharp +Configure(options => + { + options.AddWidget(widgetType: "Today", widgetName: "CmsToday", parameterWidgetName: "Format"); + }); +``` + +Let's look at these parameters in detail +* `widgetType` is used for end-user and more readable names. The following bold word represents widgetType. +[Widget Type="**Today**" Format="yyyy-dd-mm HH:mm:ss"]. + +* `widgetName` is used for your widget name used in code for the name of the `ViewComponent`. + +* `parameterWidgetName` is used the for editor component side to see on the `Add Widget` modal. +After choosing the widget type from listbox (now just defined `Format`) and renders this widget automatically. It's required only to see UI once using parameters \ No newline at end of file diff --git a/docs/en/Modules/Cms-Kit/Index.md b/docs/en/Modules/Cms-Kit/Index.md index 072f196f10..b8cbe89d20 100644 --- a/docs/en/Modules/Cms-Kit/Index.md +++ b/docs/en/Modules/Cms-Kit/Index.md @@ -14,6 +14,7 @@ The following features are currently available: * Provides a [**rating**](Ratings.md) system to add rating feature to any kind of resource. * Provides a [**menu**](Menus.md) system to manage public menus dynamically. * Provides a [**global resources**](Global-Resources.md) system to add global styles and scripts dynamically. +* Provides a [**Dynamic Widget**](Dynamic-Widget.md) system to create dynamic widgets for page and blog posts. Click to a feature to understand and learn how to use it. diff --git a/docs/en/Modules/OpenIddict.md b/docs/en/Modules/OpenIddict.md index ed25147be2..22cb22bf55 100644 --- a/docs/en/Modules/OpenIddict.md +++ b/docs/en/Modules/OpenIddict.md @@ -1,98 +1,268 @@ -## ABP OpenIddict Modules +## ABP OpenIddict Module + +OpenIddict module provides an integration with the [OpenIddict](https://github.com/openiddict/openiddict-core) which provides advanced authentication features like single sign-on, single log-out, and API access control. This module persists applications, scopes, and other OpenIddict-related objects to the database. ## How to Install -TODO: +This module comes as pre-installed (as NuGet/NPM packages) when you [create a new solution](https://abp.io/get-started) with the ABP Framework. You can continue to use it as a package and get updates easily, or you can include its source code into your solution (see `get-source` [CLI](../CLI.md) command) to develop your custom module. + +### The Source Code + +The source code of this module can be accessed [here](https://github.com/abpframework/abp/tree/dev/modules/openiddict). The source code is licensed by [MIT](https://choosealicense.com/licenses/mit/), so you can freely use and customize it. ## User Interface -This module implements the domain logic and database integrations, but not provides any UI. Management UI is useful if you need to add applications and scopes on the fly. In this case, you may build the management UI yourself or consider to purchase the [ABP Commercial](https://commercial.abp.io/) which provides the management UI for this module. +This module implements the domain logic and database integrations but does not provide any UI. Management UI is useful if you need to add applications and scopes on the fly. In this case, you may build the management UI yourself or consider purchasing the [ABP Commercial](https://commercial.abp.io/) which provides the management UI for this module. ## Relations to Other Modules -This module is based on the [Identity Module](Identity.md) and have an [integration package](https://www.nuget.org/packages/Volo.Abp.Account.Web.OpenIddict) with the [Account Module](Account.md). +This module is based on the [Identity Module](Identity.md) and has an [integration package](https://www.nuget.org/packages/Volo.Abp.Account.Web.OpenIddict) with the [Account Module](Account.md). -## The module +## Options -### Demo projects +### OpenIddictBuilder -In the module's `app` directory there are six projects(including `angular`) +`OpenIddictBuilder` can be configured in the `PreConfigureServices` method of your OpenIddict [module](https://docs.abp.io/en/abp/latest/Module-Development-Basics). -* `OpenIddict.Demo.Server`: An abp application with integrated modules (has two `clients` and a `scope`). -* `OpenIddict.Demo.API`: ASP NET Core API application using JwtBearer authentication -* `OpenIddict.Demo.Client.Mvc`: ASP NET Core MVC application using `OpenIdConnect` for authentication -* `OpenIddict.Demo.Client.Console`: Use `IdentityModel` to test OpenIddict's various endpoints, and call the api of `OpenIddict.Demo.API` -* `OpenIddict.Demo.Client.BlazorWASM:` ASP NET Core Blazor application using `OidcAuthentication` for authentication -* `angular`: An angular application that integrates the abp ng modules and uses oauth for authentication +Example: -#### How to run? - -Confirm the connection string of `appsettings.json` in the `OpenIddict.Demo.Server` project. Running the project will automatically create the database and initialize the data. -After running the `OpenIddict.Demo.API` project, then you can run the rest of the projects to test. +```csharp +public override void PreConfigureServices(ServiceConfigurationContext context) +{ + PreConfigure(builder => + { + //Set options here... + }); +} +``` -### Domain module +`OpenIddictBuilder` contains various extension methods to configure the OpenIddict services: -There are four main entities included in this module. +- `AddServer()` registers the OpenIddict token server services in the DI container. Contains `OpenIddictServerBuilder` configurations. +- `AddCore()` registers the OpenIddict core services in the DI container. Contains `OpenIddictCoreBuilder` configurations. +- `AddValidation()` registers the OpenIddict token validation services in the DI container. Contains `OpenIddictValidationBuilder` configurations. -* OpenIddictApplication: **Represents applications(client)** -* OpenIddictScope: **Represents scopes** -* OpenIddictAuthorization: **Represents authorizations, Track of logical chains of tokens and user consent..** -* OpenIddictToken: **Represents various tokens.** +### OpenIddictCoreBuilder -Domain also implements four store interfaces in OpenIddict, OpenIddict uses store to manage entities, corresponding to the above four entities, Custom entity repository is used in the store. +`OpenIddictCoreBuilder` contains extension methods to configure the OpenIddict core services. +Example: -```cs -//Manager -OpenIddictApplicationManager -OpenIddictScopeManager -OpenIddictAuthorizationManager -OpenIddictTokenManager - -//Store -IOpenIddictApplicationStore -IOpenIddictScopeStore -IOpenIddictAuthorizationStore -IOpenIddictTokenStore - -//Repository -IOpenIddictApplicationRepository -IOpenIddictScopeRepository -IOpenIddictAuthorizationRepository -IOpenIddictTokenRepository +```csharp +public override void PreConfigureServices(ServiceConfigurationContext context) +{ + PreConfigure(builder => + { + //Set options here... + }); +} ``` -We enabled most of OpenIddict's features in the `AddOpenIddict` method, You can change OpenIddict's related builder options via `PreConfigure`. +These services contain: -```cs -PreConfigure(builder => -{ - //builder -}); +- Adding `ApplicationStore`, `AuthorizationStore`, `ScopeStore`, `TokenStore`. +- Replacing `ApplicationManager`, `AuthorizationManager`, `ScopeManager`, `TokenManager`. +- Replacing `ApplicationStoreResolver`, `AuthorizationStoreResolver`, `ScopeStoreResolver`, `TokenStoreResolver`. +- Setting `DefaultApplicationEntity`, `DefaultAuthorizationEntity`, `DefaultScopeEntity`, `DefaultTokenEntity`. + +### OpenIddictServerBuilder + +`OpenIddictServerBuilder` contains extension methods to configure OpenIddict server services. + +Example: -PreConfigure(builder => +```csharp +public override void PreConfigureServices(ServiceConfigurationContext context) { - //builder -}); + PreConfigure(builder => + { + //Set options here... + }); +} +``` -PreConfigure(builder => +These services contain: + +- Registering claims, scopes. +- Setting the `Issuer` URI that is used as the base address for the endpoint URIs returned from the discovery endpoint. +- Adding development signing keys, encryption/signing keys, credentials, and certificates. +- Adding/removing event handlers. +- Enabling/disabling grant types. +- Setting authentication server endpoint URIs. + +### OpenIddictValidationBuilder + +`OpenIddictValidationBuilder` contains extension methods to configure OpenIddict validation services. + +Example: + +```csharp +public override void PreConfigureServices(ServiceConfigurationContext context) { - //builder -}); + PreConfigure(builder => + { + //Set options here... + }); +} ``` -#### AbpOpenIddictAspNetCoreOptions +These services contain: + +- `AddAudiances()` for resource servers. +- `SetIssuer()` URI that is used to determine the actual location of the OAuth 2.0/OpenID Connect configuration document when using provider discovery. +- `SetConfiguration()` to configure `OpenIdConnectConfiguration`. +- `UseIntrospection()` to use introspection instead of local/direct validation. +- Adding encryption key, credentials, and certificates. +- Adding/removing event handlers. +- `SetClientId() ` to set the client identifier `client_id ` when communicating with the remote authorization server (e.g for introspection). +- `SetClientSecret()` to set the identifier `client_secret` when communicating with the remote authorization server (e.g for introspection). +- `EnableAuthorizationEntryValidation()` to enable authorization validation to ensure the `access token` is still valid by making a database call for each API request. *Note:* This may have a negative impact on performance and can only be used with an OpenIddict-based authorization server. +- `EnableTokenEntryValidation()` to enable authorization validation to ensure the `access token` is still valid by making a database call for each API request. *Note:* This may have a negative impact on performance and it is required when the OpenIddict server is configured to use reference tokens. +- `UseLocalServer()` to register the OpenIddict validation/server integration services. +- `UseAspNetCore()` to register the OpenIddict validation services for ASP.NET Core in the DI container. + +## Internals + +### Domain Layer + +#### Aggregates + +##### OpenIddictApplication + +OpenIddictApplications represent the applications that can request tokens from your OpenIddict Server. + +- `OpenIddictApplications` (aggregate root): Represents an OpenIddict application. + - `ClientId` (string): The client identifier associated with the current application. + - `ClientSecret` (string): The client secret associated with the current application. Maybe hashed or encrypted for security reasons. + - `ConsentType` (string): The consent type associated with the current application. + - `DisplayName` (string): The display name associated with the current application. + - `DisplayNames` (string): The localized display names associated with the current application serialized as a JSON object. + - `Permissions` (string): The permissions associated with the current application, serialized as a JSON array. + - `PostLogoutRedirectUris` (string): The logout callback URLs associated with the current application, serialized as a JSON array. + - `Properties` (string): The additional properties associated with the current application serialized as a JSON object or null. + - `RedirectUris` (string): The callback URLs associated with the current application, serialized as a JSON array. + - `Requirements` (string): The requirements associated with the current application + - `Type` (string): The application type associated with the current application. + - `ClientUri` (string): URI to further information about client. + - `LogoUri` (string): URI to client logo. + +##### OpenIddictAuthorization + +OpenIddictAuthorizations are used to keep the allowed scopes, authorization flow types. + +- `OpenIddictAuthorization` (aggregate root): Represents an OpenIddict authorization. + + - `ApplicationId` (Guid?): The application associated with the current authorization. + + - `Properties` (string): The additional properties associated with the current authorization serialized as a JSON object or null. + + - `Scopes` (string): The scopes associated with the current authorization, serialized as a JSON array. + + - `Status` (string): The status of the current authorization. + + - `Subject` (string): The subject associated with the current authorization. + + - `Type` (string): The type of the current authorization. + +##### OpenIddictScope + +OpenIddictScopes are used to keep the scopes of resources. + +- `OpenIddictScope` (aggregate root): Represents an OpenIddict scope. + + - `Description` (string): The public description associated with the current scope. + + - `Descriptions` (string): The localized public descriptions associated with the current scope, serialized as a JSON object. + + - `DisplayName` (string): The display name associated with the current scope. + + - `DisplayNames` (string): The localized display names associated with the current scope serialized as a JSON object. + + - `Name` (string): The unique name associated with the current scope. + - `Properties` (string): The additional properties associated with the current scope serialized as a JSON object or null. + - `Resources` (string): The resources associated with the current scope, serialized as a JSON array. + +##### OpenIddictToken + +OpenIddictTokens are used to persist the application tokens. + +- `OpenIddictToken` (aggregate root): Represents an OpenIddict token. + + - `ApplicationId` (Guid?): The application associated with the current token. + - `AuthorizationId` (Guid?): The application associated with the current token. + - `CreationDate` (DateTime?): The UTC creation date of the current token. + - `ExpirationDate` (DateTime?): The UTC expiration date of the current token. + - `Payload` (string): The payload of the current token, if applicable. Only used for reference tokens and may be encrypted for security reasons. + + - `Properties` (string): The additional properties associated with the current token serialized as a JSON object or null. + - `RedemptionDate` (DateTime?): The UTC redemption date of the current token. + - `Status` (string): The status of the current authorization. + + - `ReferenceId` (string): The reference identifier associated with the current token, if applicable. Only used for reference tokens and may be hashed or encrypted for security reasons. + + - `Status` (string): The status of the current token. + + - `Subject` (string): The subject associated with the current token. + + - `Type` (string): The type of the current token. -`UpdateAbpClaimTypes(default: true)`: Updates AbpClaimTypes to be compatible with identity server claims. -`AddDevelopmentEncryptionAndSigningCertificate(default: true)`: Registers (and generates if necessary) a user-specific development encryption/development signing certificate. +#### Stores -You can also change this options via `PreConfigure`. +This module implements OpenIddict stores: -#### Automatically removing orphaned tokens/authorizations +- `IAbpOpenIdApplicationStore` +- `IOpenIddictAuthorizationStore` +- `IOpenIddictScopeStore` +- `IOpenIddictTokenStore` -There is a background task in the `Domain` module (`enabled by default`) that automatically removes orphaned tokens/authorizations, you can configure `TokenCleanupOptions` to manage it. +##### Repositories -### ASP NET Core module +The following custom repositories are defined in this module: + +- `IOpenIddictApplicationRepository` +- `IOpenIddictAuthorizationRepository` +- `IOpenIddictScopeRepository` +- `IOpenIddictTokenRepository` + +##### Domain Services + +This module doesn't contain any domain service but overrides the service below: + +- `AbpApplicationManager` used to populate/get `AbpApplicationDescriptor` information that contains `ClientUri` and `LogoUri`. + +### Database Providers + +#### Common + +##### Table/Collection Prefix & Schema + +All tables/collections use the `OpenIddict` prefix by default. Set static properties on the `AbpOpenIddictDbProperties` class if you need to change the table prefix or set a schema name (if supported by your database provider). + +##### Connection String + +This module uses `AbpOpenIddict` for the connection string name. If you don't define a connection string with this name, it fallbacks to the `Default` connection string. + +See the [connection strings](https://docs.abp.io/en/abp/latest/Connection-Strings) documentation for details. + +#### Entity Framework Core + +##### Tables + +- **OpenIddictApplications** +- **OpenIddictAuthorizations** +- **OpenIddictScopes** +- **OpenIddictTokens** + +#### MongoDB + +##### Collections + +- **OpenIddictApplications** +- **OpenIddictAuthorizations** +- **OpenIddictScopes** +- **OpenIddictTokens** + +## ASP.NET Core Module This module integrates ASP NET Core, with built-in MVC controllers for four protocols. It uses OpenIddict's [Pass-through mode](https://documentation.openiddict.com/guides/index.html#pass-through-mode). @@ -103,22 +273,76 @@ LogoutController -> connect/logout UserInfoController -> connect/userinfo ``` -> We will implement the related functions of **device flow** in the PRO module.. +> **Device flow** implementation will be done in the commercial module. -#### How to control claims in access_token and id_token +#### AbpOpenIddictAspNetCoreOptions + +`AbpOpenIddictAspNetCoreOptions` can be configured in the `PreConfigureServices` method of your OpenIddict [module](https://docs.abp.io/en/abp/latest/Module-Development-Basics). + +Example: + +```csharp +PreConfigure(options => +{ + //Set options here... +}); +``` + +`AbpOpenIddictAspNetCoreOptions` properties: + +- `UpdateAbpClaimTypes(default: true)`: Updates `AbpClaimTypes` to be compatible with the Openiddict claims. +- `AddDevelopmentEncryptionAndSigningCertificate(default: true)`: Registers (and generates if necessary) a user-specific development encryption/development signing certificate. + +#### Automatically Removing Orphaned Tokens/Authorizations + +The background task that automatically removes orphaned tokens/authorizations. This can be configured by `TokenCleanupOptions` to manage it. + +`TokenCleanupOptions` can be configured in the `PreConfigureServices` method of your OpenIddict [module](https://docs.abp.io/en/abp/latest/Module-Development-Basics). + +Example: + +```csharp +PreConfigure(options => +{ + //Set options here... +}); +``` -You can use the [Claims Principal Factory](https://docs.abp.io/en/abp/latest/Authorization#claims-principal-factory) to add/remove claims to the `ClaimsPrincipal`. +`TokenCleanupOptions` properties: -The `AbpDefaultOpenIddictClaimDestinationsProvider` service will add `Name`, `Email` and `Role` types of Claims to `access_token` and `id_token`, other claims are only added to `access_token` by default, and remove the `SecurityStampClaimType` secret claim of `Identity`. +- `IsCleanupEnabled` (default: true): Enable/disable token clean up. +- `CleanupPeriod` (default: 3,600,000 ms): Setting clean up period. +- `DisableAuthorizationPruning`: Setting a boolean indicating whether authorizations pruning should be disabled. +- `DisableTokenPruning`: Setting a boolean indicating whether token pruning should be disabled. +- `MinimumAuthorizationLifespan` (default: 14 days): Setting the minimum lifespan authorizations must have to be pruned. Cannot be less than 10 minutes. +- `MinimumTokenLifespan` (default: 14 days): Setting the minimum lifespan tokens must have to be pruned. Cannot be less than 10 minutes. -You can create a service that inherits from `IAbpOpenIddictClaimDestinationsProvider` and add it to DI to fully control the destinations of claims +#### Updating Claims In Access_token and Id_token + +[Claims Principal Factory](https://docs.abp.io/en/abp/latest/Authorization#claims-principal-factory) can be used to add/remove claims to the `ClaimsPrincipal`. + +The `AbpDefaultOpenIddictClaimDestinationsProvider` service will add `Name`, `Email,` and `Role` types of Claims to `access_token` and `id_token`, other claims are only added to `access_token` by default, and remove the `SecurityStampClaimType` secret claim of `Identity`. + +Create a service that inherits from `IAbpOpenIddictClaimDestinationsProvider` and add it to DI to fully control the destinations of claims. ```cs public class MyClaimDestinationsProvider : IAbpOpenIddictClaimDestinationsProvider, ITransientDependency { public virtual Task SetDestinationsAsync(AbpOpenIddictClaimDestinationsProviderContext context) { - // ... + foreach (var claim in context.Claims) + { + if (claim.Type == MyClaims.MyClaimsType) + { + claim.SetDestinations(OpenIddictConstants.Destinations.AccessToken, OpenIddictConstants.Destinations.IdentityToken); + } + + if (claim.Type == MyClaims.MyClaimsType2) + { + claim.SetDestinations(OpenIddictConstants.Destinations.AccessToken); + } + } + return Task.CompletedTask; } } @@ -129,30 +353,11 @@ Configure(options => }); ``` -For detailed information, please refer to: [OpenIddict claim destinations](https://documentation.openiddict.com/configuration/claim-destinations.html) - -### EF Core module - -Implements the above four repository interfaces. - -### MongoDB module - -Implements the above four repository interfaces. - +For detailed information, please refer to: [OpenIddict claim destinations](https://documentation.openiddict.com/configuration/claim-destinations.html) -## OpenIddict +#### Disable AccessToken Encryption -### Documentation - -For more details about OpenIddict, please refer to its official documentation and Github. - -https://documentation.openiddict.com - -https://github.com/openiddict/openiddict-core#resources - -### Disable AccessToken Encryption - -ABP disables the `access token encryption` by default for compatibility, you can manually enable it if needed. +ABP disables the `access token encryption` by default for compatibility, it can be enabled manually if needed. ```cs public override void PreConfigureServices(ServiceConfigurationContext context) @@ -166,22 +371,15 @@ public override void PreConfigureServices(ServiceConfigurationContext context) https://documentation.openiddict.com/configuration/token-formats.html#disabling-jwt-access-token-encryption - -### PKCE - -https://documentation.openiddict.com/configuration/proof-key-for-code-exchange.html - -### Request/Response process - -I will briefly introduce the principle of OpenIddict so that everyone can quickly understand it. +### Request/Response Process The `OpenIddict.Server.AspNetCore` adds an authentication scheme(`Name: OpenIddict.Server.AspNetCore, handler: OpenIddictServerAspNetCoreHandler`) and implements the `IAuthenticationRequestHandler` interface. It will be executed first in `AuthenticationMiddleware` and can short-circuit the current request. Otherwise, `DefaultAuthenticateScheme` will be called and continue to execute the pipeline. -`OpenIddictServerAspNetCoreHandler` will call various built-in handlers(Handling requests and responses), And the handler will process according to the context or skip logic that has nothing to do with it. +`OpenIddictServerAspNetCoreHandler` will call various built-in handlers (handling requests and responses), And the handler will process according to the context or skip logic that has nothing to do with it. -Example a token request: +Example of a token request: ``` POST /connect/token HTTP/1.1 @@ -195,11 +393,11 @@ Content-Type: application/x-www-form-urlencoded scope=AbpAPI offline_access ``` -This request will be processed by various handlers. They will confirm the endpoint type of the request, check `http/https`, verify that the request parameters (`client. scope etc`) are valid and exist in the database, etc. Various protocol checks. And build a `OpenIddictRequest` object, If there are any errors, the response content may be set and directly short-circuit the current request. +This request will be processed by various handlers. They will confirm the endpoint type of the request, check `HTTP/HTTPS`, verify that the request parameters (`client. scope, etc`) are valid and exist in the database, etc. Various protocol checks. And build a `OpenIddictRequest` object, If there are any errors, the response content may be set and directly short-circuit the current request. -If everything is ok, the request will go to our processing controller(eg `TokenController`), we can get an `OpenIddictRequest` from the http request at this time. The rest of our work will be based on this object. +If everything is ok, the request will go to our processing controller(eg `TokenController`), we can get an `OpenIddictRequest` from the HTTP request at this time. The rest will be based on this object. -We may check the `username` and `password` in the request. If it is correct we create a `ClaimsPrincipal` object and return a `SignInResult`, which uses the `OpenIddict.Validation.AspNetCore` authentication scheme name, will calls `OpenIddictServerAspNetCoreHandler` for processing. +Check the `username` and `password` in the request. If it is correct create a `ClaimsPrincipal` object and return a `SignInResult`, which uses the `OpenIddict.Validation.AspNetCore` authentication scheme name, will calls `OpenIddictServerAspNetCoreHandler` for processing. `OpenIddictServerAspNetCoreHandler` do some checks to generate json and replace the http response content. @@ -210,6 +408,26 @@ If you need to customize OpenIddict, you need to replace/delete/add new handlers Please refer to: https://documentation.openiddict.com/guides/index.html#events-model -## Sponsor +### PKCE + +https://documentation.openiddict.com/configuration/proof-key-for-code-exchange.html + +## Demo projects + +In the module's `app` directory there are six projects(including `angular`) + +* `OpenIddict.Demo.Server`: An abp application with integrated modules (has two `clients` and a `scope`). +* `OpenIddict.Demo.API`: ASP NET Core API application using JwtBearer authentication. +* `OpenIddict.Demo.Client.Mvc`: ASP NET Core MVC application using `OpenIdConnect` for authentication. +* `OpenIddict.Demo.Client.Console`: Use `IdentityModel` to test OpenIddict's various endpoints, and call the api of `OpenIddict.Demo.API`. +* `OpenIddict.Demo.Client.BlazorWASM:` ASP NET Core Blazor application using `OidcAuthentication` for authentication. +* `angular`: An angular application that integrates the abp ng modules and uses oauth for authentication. + +#### How to run? + +Confirm the connection string of `appsettings.json` in the `OpenIddict.Demo.Server` project. Running the project will automatically create the database and initialize the data. +After running the `OpenIddict.Demo.API` project, then you can run the rest of the projects to test. + +## Migrating Guide -Please consider sponsoring this project: https://github.com/sponsors/kevinchalet +[Migrating from IdentityServer to OpenIddict Step by Step Guide ](../Migration-Guides/OpenIddict-Step-by-Step.md) diff --git a/docs/en/Modules/Setting-Management.md b/docs/en/Modules/Setting-Management.md index e54993cf79..354fbdd539 100644 --- a/docs/en/Modules/Setting-Management.md +++ b/docs/en/Modules/Setting-Management.md @@ -118,7 +118,13 @@ The order of the providers are important. Providers are executed in the reverse ## Setting Management UI -Setting Mangement module provided the email setting UI by default, and it is extensible; You can add your tabs to this page for your application settings. +Setting Mangement module provided the email setting UI by default. + +![EmailSettingUi](../images/setting-management-email-ui.png) + +> You can click the Send test email button to send a test email to check your email settings. + +Setting it is extensible; You can add your tabs to this page for your application settings. ### MVC UI @@ -302,5 +308,4 @@ export class AppComponent { Navigate to `/setting-management` route to see the changes: -![Custom Settings Tab](../images/custom-settings.png) - +![Custom Settings Tab](../images/custom-settings.png) \ No newline at end of file diff --git a/docs/en/Multi-Tenancy.md b/docs/en/Multi-Tenancy.md index 2603cb0436..7dac3762aa 100644 --- a/docs/en/Multi-Tenancy.md +++ b/docs/en/Multi-Tenancy.md @@ -32,6 +32,25 @@ Configure(options => > Multi-Tenancy is disabled in the ABP Framework by default. However, it is **enabled by default** when you create a new solution using the [startup template](Startup-Templates/Application.md). `MultiTenancyConsts` class in the solution has a constant to control it in a single place. +### AbpMultiTenancyOptions: Handle inactive and non-existent tenants. + +The `MultiTenancyMiddlewareErrorPageBuilder` of `AbpMultiTenancyOptions` is used to handle inactive and non-existent tenants. + +It will respond to an error page by default, you can change it if you want, eg: only output the error log and continue ASP NET Core's request pipeline. + +```csharp +Configure(options => +{ + options.MultiTenancyMiddlewareErrorPageBuilder = async (context, exception) => + { + // Handle the exception. + + // Return true to stop the pipeline, false to continue. + return true; + }; +}); +``` + ### Database Architecture ABP Framework supports all the following approaches to store the tenant data in the database; @@ -203,7 +222,6 @@ The following resolvers are provided and configured by default; * `CurrentUserTenantResolveContributor`: Gets the tenant id from claims of the current user, if the current user has logged in. **This should always be the first contributor for the security**. * `QueryStringTenantResolveContributor`: Tries to find current tenant id from query string parameters. The parameter name is `__tenant` by default. -* `FormTenantResolveContributor`:Tries to find current tenant id from form parameters. The parameter name is `__tenant` by default. * `RouteTenantResolveContributor`: Tries to find current tenant id from route (URL path). The variable name is `__tenant` by default. If you defined a route with this variable, then it can determine the current tenant from the route. * `HeaderTenantResolveContributor`: Tries to find current tenant id from HTTP headers. The header name is `__tenant` by default. * `CookieTenantResolveContributor`: Tries to find current tenant id from cookie values. The cookie name is `__tenant` by default. diff --git a/docs/en/Nightly-Builds.md b/docs/en/Nightly-Builds.md index f835dcda9e..cf44b51045 100644 --- a/docs/en/Nightly-Builds.md +++ b/docs/en/Nightly-Builds.md @@ -1,19 +1,27 @@ # Nightly Builds -All framework & module packages are deployed to MyGet every night in weekdays. So, you can use or test the latest code without waiting the next release. +All framework & module packages are deployed to MyGet every night in weekdays. So, you can install the latest dev-brach builds to try out functionality prior to release. ## Install & Uninstall Nightly Preview Packages -The latest version of nightly preview packages can be installed by the running below command in the root folder of application: +The latest version of nightly preview packages can be installed by the running below command in the root folder of the application: ```bash abp switch-to-nightly ``` +> Note that this command doesn't create a project with nightly preview packages. Instead, it switches package versions of a project with the nightly preview packages. + +After this command, a new NuGet feed will be added to the `NuGet.Config` file of your project. Then, you can get the latest code of ABP Framework without waiting for the next release. + +> You can check the [abp-nightly gallery](https://www.myget.org/gallery/abp-nightly) to see the all nightly preview packages. + If you're using the ABP Framework nightly preview packages, you can switch back to stable version using this command: ```bash abp switch-to-stable ``` +ABP nightly NuGet feed is [https://www.myget.org/F/abp-nightly/api/v3/index.json](https://www.myget.org/F/abp-nightly/api/v3/index.json). + See the [ABP CLI documentation](./CLI.md) for more information. diff --git a/docs/en/Object-To-Object-Mapping.md b/docs/en/Object-To-Object-Mapping.md index f5ca805611..c12b260921 100644 --- a/docs/en/Object-To-Object-Mapping.md +++ b/docs/en/Object-To-Object-Mapping.md @@ -12,7 +12,7 @@ public class UserAppService : ApplicationService _userRepository = userRepository; } - public void CreateUser(CreateUserInput input) + public async Task CreateUser(CreateUserInput input) { //Manually creating a User object from the CreateUserInput object var user = new User @@ -23,7 +23,7 @@ public class UserAppService : ApplicationService Password = input.Password }; - _userRepository.Insert(user); + await _userRepository.InsertAsync(user); } } ``` @@ -46,12 +46,12 @@ public class UserAppService : ApplicationService _userRepository = userRepository; } - public void CreateUser(CreateUserInput input) + public async Task CreateUser(CreateUserInput input) { //Automatically creating a new User object using the CreateUserInput object var user = ObjectMapper.Map(input); - _userRepository.Insert(user); + await _userRepository.InsertAsync(user); } } ```` diff --git a/docs/en/Road-Map.md b/docs/en/Road-Map.md index d7fb13a9a8..ec9b8fac01 100644 --- a/docs/en/Road-Map.md +++ b/docs/en/Road-Map.md @@ -4,18 +4,18 @@ This document provides a road map, release schedule and planned features for the ## Next Versions -### v6.0 +### v7.0 -In [6.0 milestone](https://github.com/abpframework/abp/milestone/61), we will be mostly working on the following topics: +In the [7.0 milestone](https://github.com/abpframework/abp/milestone/75), we will be mostly working on the following topics: -* Providing an OpenIddict integration to replace current IdentityServer4 integration. +* Dapr integration ([#13337](https://github.com/abpframework/abp/issues/13337)) +* Upgrade to .NET 7.0 ([#13336](https://github.com/abpframework/abp/issues/13336)) +* Integration Services ([#12470](https://github.com/abpframework/abp/issues/12470)) * Maturing and documenting the [eShopOnAbp](https://github.com/abpframework/eShopOnAbp) project, writing a free e-book that explains the solution. -* Working on the [LeptonX](https://blog.abp.io/abp/LeptonX-Theme-for-ABP-Framework-Alpha-Release) theme and making it as the default theme for the ABP Framework UI options. +* Working on the [LeptonX](https://blog.abp.io/abp/LeptonX-Theme-for-ABP-Framework-Alpha-Release) theme. * Improvements on the existing features and providing more guides. -The planned stable release date for v6.0 is **July, 2022**. - -> After the version 6.0, we will be working for ABP 7.0 which will be released in the end of 2022 based on .NET 7.0. +The planned stable release date for v7.0 is **December, 2022**. We will be publishing more than one pre-release versions before that date. ## Backlog Items @@ -23,7 +23,6 @@ The *Next Versions* section above shows the main focus of the planned versions. Here, a list of major items in the backlog we are considering to work on in the next versions. -* [#2183](https://github.com/abpframework/abp/issues/2183) / Dapr integration * [#6655](https://github.com/abpframework/abp/pull/6655) / Use Typescript for the MVC UI * [#236](https://github.com/abpframework/abp/issues/236) / Resource based authorization system * [#2882](https://github.com/abpframework/abp/issues/2882) / Providing a gRPC integration infrastructure (while it is [already possible](https://github.com/abpframework/abp-samples/tree/master/GrpcDemo) to create or consume gRPC endpoints for your application, we plan to create endpoints for the [standard application modules](https://docs.abp.io/en/abp/latest/Modules/Index)) diff --git a/docs/en/SMS-Sending.md b/docs/en/SMS-Sending.md index 0dca487a69..efe63c3c91 100644 --- a/docs/en/SMS-Sending.md +++ b/docs/en/SMS-Sending.md @@ -80,7 +80,7 @@ The given `SendAsync` method in the example is an extension method to send an SM ## NullSmsSender -`NullSmsSender` is a the default implementation of the `ISmsSender`. It writes SMS content to the [standard logler](Logging.md), rather than actually sending the SMS. +`NullSmsSender` is a the default implementation of the `ISmsSender`. It writes SMS content to the [standard logger](Logging.md), rather than actually sending the SMS. This class can be useful especially in development time where you generally don't want to send real SMS. **However, if you want to actually send SMS, you should implement the `ISmsSender` in your application code.** diff --git a/docs/en/Startup-Templates/Application.md b/docs/en/Startup-Templates/Application.md index ec89f479ab..6a47363e8c 100644 --- a/docs/en/Startup-Templates/Application.md +++ b/docs/en/Startup-Templates/Application.md @@ -78,7 +78,7 @@ Based on the options you've specified, you will get a slightly different solutio If you don't specify any additional options, you will have a solution as shown below: -![bookstore-visual-studio-solution-v3](../images/bookstore-visual-studio-solution-v3.png) +![bookstore-rider-solution-v6](../images/solution-structure-solution-explorer-rider.png) Projects are organized in `src` and `test` folders. `src` folder contains the actual application which is layered based on [DDD](../Domain-Driven-Design.md) principles as mentioned before. @@ -225,7 +225,7 @@ So, the resulting solution allows a 4-tiered deployment, by comparing to 3-tiere The solution structure is shown below: -![bookstore-visual-studio-solution-v3](../images/bookstore-visual-studio-solution-tiered.png) +![bookstore-rider-solution-v6](../images/bookstore-rider-solution-tiered.png) As different from the default structure, two new projects come into play: `.AuthServer` & `.HttpApi.Host`. @@ -233,9 +233,9 @@ As different from the default structure, two new projects come into play: `.Auth This project is used as an authentication server for other projects. `.Web` project uses OpenId Connect Authentication to get identity and access tokens for the current user from the AuthServer. Then uses the access token to call the HTTP API server. HTTP API server uses bearer token authentication to obtain claims from the access token to authorize the current user. -![tiered-solution-applications](../images/tiered-solution-applications.png) +![tiered-solution-applications](../images/tiered-solution-applications-authserver.png) -ABP uses the open source [OpenIddcit](https://github.com/openiddict/openiddict-core) framework for the authentication between applications. See [OpenIddcit documentation](https://documentation.openiddict.com/) for details about the OpenIddict and OpenID Connect protocol. +ABP uses the [OpenIddict Module](../Modules/OpenIddict.md) that uses the open-source [OpenIddict-core](https://github.com/openiddict/openiddict-core) library for the authentication between applications. See [OpenIddict documentation](https://documentation.openiddict.com/) for details about the OpenIddict and OpenID Connect protocol. It has its own `appsettings.json` that contains database connection and other configurations. diff --git a/docs/en/Themes/LeptonXLite/angular.md b/docs/en/Themes/LeptonXLite/Angular.md similarity index 91% rename from docs/en/Themes/LeptonXLite/angular.md rename to docs/en/Themes/LeptonXLite/Angular.md index 805ababd69..506ffaf753 100644 --- a/docs/en/Themes/LeptonXLite/angular.md +++ b/docs/en/Themes/LeptonXLite/Angular.md @@ -7,6 +7,8 @@ LeptonX Lite has implementation for the ABP Framework Angular Client. It's a sim ## Installation +This theme is **already installed** when you create a new solution using the startup templates. If you are using any other template, you can install this theme by following the steps below: + To add `LeptonX-lite` into your project, * Install `@abp/ng.theme.lepton-x` @@ -79,4 +81,4 @@ To change the logos and brand color of `LeptonX`, simply add the following CSS t ### Server Side -In order to migrate to LeptonX on your server side projects (Host and/or AuthServer projects), please follow the [Server Side Migration](mvc.md) document. +In order to migrate to LeptonX on your server side projects (Host and/or AuthServer projects), please follow the [Server Side Migration](AspNetCore.md) document. diff --git a/docs/en/Themes/LeptonXLite/AspNetCore.md b/docs/en/Themes/LeptonXLite/AspNetCore.md new file mode 100644 index 0000000000..f480141120 --- /dev/null +++ b/docs/en/Themes/LeptonXLite/AspNetCore.md @@ -0,0 +1,215 @@ +# LeptonX Lite MVC UI +LeptonX Lite has implementation for the ABP Framework Razor Pages. It's a simplified variation of the [LeptonX Theme](https://x.leptontheme.com/). + +> If you are looking for a professional, enterprise ready theme, you can check the [LeptonX Theme](https://x.leptontheme.com/), which is a part of [ABP Commercial](https://commercial.abp.io/). + +> See the [Theming document](https://docs.abp.io/en/abp/latest/UI/AspNetCore/Theming) to learn about themes. + +## Installation + +This theme is **already installed** when you create a new solution using the startup templates. If you are using any other template, you can install this theme by following the steps below: + +- Add the **Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite** package to your **Web** application. + +```bash +dotnet add package Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite --prerelease +``` + +- Remove the **Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic** reference from the project since it's not necessary after switching to LeptonX Lite. + +- Make sure the old theme is removed and LeptonX is added in your Module class. + +```diff +[DependsOn( + // Remove the BasicTheme module from DependsOn attribute +- typeof(AbpAspNetCoreMvcUiBasicThemeModule), + + // Add the LeptonX Lite module to DependsOn attribute ++ typeof(AbpAspNetCoreMvcUiLeptonXLiteThemeModule), +)] +``` + +- Replace `BasicThemeBundles` with `LeptonXLiteThemeBundles` in AbpBundlingOptions + +```diff +Configure(options => +{ + options.StyleBundles.Configure( + // Remove the following line +- BasicThemeBundles.Styles.Global, + // Add the following line instead ++ LeptonXLiteThemeBundles.Styles.Global + bundle => + { + bundle.AddFiles("/global-styles.css"); + } + ); +}); +``` + +## Customization + +### Layouts + +LeptonX Lite Mvc provides **layouts** for your **user interface** based [ABP Framework Theming](https://docs.abp.io/en/abp/latest/UI/AspNetCore/Theming). You can use **layouts** to **organize your user interface**. + +The main responsibility of a theme is to **provide** the layouts. There are **three pre-defined layouts that must be implemented by all the themes:** + +* **Application:** The **default** layout which is used by the **main** application pages. + +* **Account:** Mostly used by the **account module** for **login**, **register**, **forgot password**... pages. + +* **Empty:** The **Minimal** layout that **has no layout components** at all. + +**Layout names** are **constants** defined in the `LeptonXLiteTheme` class in the **Mvc** project **root**. + +> The layout pages define under the `Themes/LeptonXLite/Layouts` folder and you can **override it** by creating a file with the **same name** and **under** the **same folder**. + +### Toolbars +LeptonX Lite includes separeted toolbars for desktop & mobile. You can manage toolbars independently. Toolbar names can be accessible in the **LeptonXLiteToolbars** class. + +- `LeptonXLiteToolbars.Main` +- `LeptonXLiteToolbars.MainMobile` + +```csharp +public class MyProjectNameMainToolbarContributor : IToolbarContributor +{ + public async Task ConfigureToolbarAsync(IToolbarConfigurationContext context) + { + if (context.Toolbar.Name == LeptonXLiteToolbars.Main) + { + context.Toolbar.Items.Add(new ToolbarItem(typeof(MyDesktopComponent))); + } + + if (context.Toolbar.Name == LeptonXLiteToolbars.MainMobile) + { + context.Toolbar.Items.Add(new ToolbarItem(typeof(MyMobileComponent))); + } + } +} +``` +# LeptonX Lite Mvc Components + +Abp **helps** you make **highly customizable UI**. You can easily **customize** your themes to fit your needs. **The Virtual File System** makes it possible to **manage files** that **do not physically** exist on the **file system** (disk). It's mainly used to embed **(js, css, image..)** files into assemblies and **use them like** physical files at runtime. An application (or another module) can **override** a **virtual file of a module** just like placing a file with the **same name** and **extension** into the **same folder** of the **virtual file**. + +LeptonX Lite is built on the [Abp Framework](https://abp.io/), so you can **easily** customize your Asp.Net Core Mvc user interface by following [Abp Mvc UI Customization](https://docs.abp.io/en/abp/latest/UI/AspNetCore/Customization-xUser-Interface). + +## Brand Component + +The **brand component** is a simple component that can be used to display your brand. It contains a **logo** and a **company name**. + +![Brand component](../../images/leptonxlite-brand-component.png) + +### How to override the Brand Component in LeptonX Lite Mvc + +* The **brand component page (.cshtml file)** is defined in the `Themes/LeptonXLite/Components/Brand/Default.cshtml` file and you can **override it** by creating a file with the **same name** and **under** the **same folder**. + +* The **brand component (C# file)** is defined in the `Themes/LeptonXLite/Components/Brand/MainNavbarBrandViewComponent.cs` file and you can **override it** by creating a file with the **same name** and under the **same folder**. + +## Breadcrumb Component + +On websites that have a lot of pages, **breadcrumb navigation** can greatly **enhance the way users find their way** around. In terms of **usability**, breadcrumbs reduce the number of actions a website **visitor** needs to take in order to get to a **higher-level page**, and they **improve** the **findability** of **website sections** and **pages**. + +![Breadcrumb component](../../images/leptonxlite-breadcrumb-component.png) + +### How to override the Breadcrumb Component in LeptonX Lite Mvc + +* The **breadcrumb component page (.cshtml file)** is defined in the `Themes/LeptonXLite/Components/Breadcrumbs/Default.cshtml` file and you can **override it** by creating a file with the **same name** and **under** the **same folder**. + +* The **breadcrumb component (C# file)** is defined in the `Themes/LeptonXLite/Components/Breadcrumbs/BreadcrumbsViewComponent.cs` file and you can **override it** by creating a file with the **same name** and **under** the **same folder**. + +## Sidebar Menu Component + +Sidebar menus have been used as **a directory for Related Pages** to a **Service** offering, **Navigation** items to a **specific service** or topic and even just as **Links** the user may be interested in. + +![Sidebar menu component](../../images/leptonxlite-sidebar-menu-component.png) + +### How to override the Sidebar Menu Component in LeptonX Lite Mvc + +* **Sidebar menu page (.cshtml)** is defined in the `Themes/LeptonXLite/Components/Menu/Default.cshtml` file and you can **override it** by creating a file with the **same name** and **under** the **same folder**. + +* If you want to **override the menu component (C#)** you can override the `Themes/LeptonXLite/Components/Menu/MainMenuViewComponent.cs` file and you can **override it** by creating a file with the **same name** and **under** the **same folder**. + +> The **sidebar menu** renders menu items **dynamically**. The **menu item** is a **partial view** and is defined in the `Themes/LeptonXLite/Components/Menu/_MenuItem.cshtml` file and you can **override it** by creating a file with the **same name** and **under** the **same folder**. + +## Page Alerts Component + +Provides contextual **feedback messages** for typical user actions with the handful of **available** and **flexible** **alert messages**. Alerts are available for any length of text, as well as an **optional dismiss button**. + +![Page alerts component](../../images/leptonxlite-page-alerts-component.png) + +### How to override the Page Alerts Component in LeptonX Lite Mvc + +* The **page alerts component page (.cshtml file)** is defined in the `Themes/LeptonXLite/Components/PageAlerts/Default.cshtml` file and you can **override it** by creating a file with the **same name** and **under** the **same folder**. + +* The **page alerts component (C#)** is defined in the `Themes/LeptonXLite/Components/PageAlerts/PageAlertsViewComponent.cs` file and you can **override it** by creating a file with the **same name** and **under** the **same folder**. + +## Toolbar Component + +Toolbar items are used to add **extra functionality to the toolbar**. The toolbar is a **horizontal bar** that **contains** a group of **toolbar items**. + +### How to override the Toolbar Component in LeptonX Lite Mvc + +* The **toolbar component page (.cshtml file)** is defined in the `Themes/LeptonXLite/Components/Toolbar/Default.cshtml` file and you can **override it** by creating a file with the **same name** and **under** the **same folder**. + +* The **toolbar component (C#)** is defined in the `Themes/LeptonXLite/Components/Toolbar/ToolbarViewComponent.cs` file and you can **override it** by creating a file with the **same name** and **under** the **same folder**. + +## Toolbar Item Component + +The toolbar item is a **single item** that **contains** a **link**, an **icon**, a **label** etc.. + +### How to override the Toolbar Item Component in LeptonX Lite Mvc + +* The **toolbar item component page (.cshtml file)** is defined in the `Themes/LeptonXLite/Components/ToolbarItems/Default.cshtml` file and you can **override it** by creating a file with the **same name** and **under** the **same folder**. + +* The **toolbar item component (C#)** is defined in the `Themes/LeptonXLite/Components/ToolbarItems/ToolbarItemsViewComponent.cs` file and you can **override it** by creating a file with the **same name** and **under** the **same folder**. + +You can find the toolbar components below: + +## Language Switch Component + +Think about a **multi-lingual** website and the first thing that could **hit your mind** is **the language switch component**. A **navigation bar** is a **great place** to **embed a language switch**. By embedding the language switch in the navigation bar of your website, you would **make it simpler** for users to **find it** and **easily** switch the **language** **without trying to locate it across the website.** + +![Language switch component](../../images/leptonxlite-language-switch-component.png) + +### How to override the Language Switch Component in LeptonX Lite Mvc + +* The **language switch component page (.cshtml file)** is defined in the `Themes/LeptonXLite/Components/LanguageSwitch/Default.cshtml` file and you can **override it** by creating a file with the **same name** and **under** the **same folder**. + +* The **language switch component (C#)** is defined in the `Themes/LeptonXLite/Components/LanguageSwitch/LanguageSwitchViewComponent.cs` file and you can **override it** by creating a file with the **same name** and **under** the **same folder**. + +## Mobile Language Switch Component + +The **mobile** **language switch component** is used to switch the language of the website **on mobile devices**. The mobile language switch component is a **dropdown menu** that **contains all the languages** of the website. + +![Mobil language switch component](../../images/leptonxlite-mobile-language-switch-component.png) + +### How to override the Mobile Language Switch Component in LeptonX Lite Mvc + +* The **mobile language switch component page (.cshtml file)** is defined in the `Themes/LeptonXLite/Components/MobileLanguageSwitch/Default.cshtml` file and you can **override it** by creating a file with the **same name** and **under** the **same folder**. + +* The **mobile language switch component (C#)** is defined in the `Themes/LeptonXLite/Components/MobileLanguageSwitch/MobileLanguageSwitchViewComponent.cs` file and you can **override it** by creating a file with the **same name** and **under** the **same folder**. + +## User Menu Component + +The **User Menu** is the **menu** that **drops down** when you **click your name** or **profile picture** in the **upper right corner** of your page (**in the toolbar**). It drops down options such as **Settings**, **Logout**, etc. + +![User menu component](../../images/leptonxlite-user-menu-component.png) + +### How to override the User Menu Component in LeptonX Lite Mvc + +* The **user menu component page (.cshtml file)** is defined in the `Themes/LeptonXLite/Components/UserMenu/Default.cshtml` file and you can **override it** by creating a file with the **same name** and **under** the **same folder**. + +* The **user menu component (C#)** is defined in the `Themes/LeptonXLite/Components/UserMenu/UserMenuViewComponent.cs` file and you can **override it** by creating a file with the **same name** and **under** the **same folder**. + +## Mobile User Menu Component + +The **mobile user menu component** is used to display the **user menu on mobile devices**. The mobile user menu component is a **dropdown menu** that contains all the **options** of the **user menu**. + +![Mobile user menu component](../../images/leptonxlite-mobile-user-menu-component.png) + +### How to override the Mobile User Menu Component in LeptonX Lite Mvc + +* The **mobile user menu component page (.cshtml file)** is defined in the `Themes/LeptonXLite/Components/MobileUserMenu/Default.cshtml` file and you can **override it** by creating a file with the **same name** and **under** the **same folder**. + +* The **mobile user menu component (C#)** is defined in the `Themes/LeptonLite/Components/MobileUserMenu/MobileUserMenuViewComponent.cs` file and you can **override it** by creating a file with the **same name** and **under** the **same folder**. diff --git a/docs/en/Themes/LeptonXLite/blazor.md b/docs/en/Themes/LeptonXLite/Blazor.md similarity index 87% rename from docs/en/Themes/LeptonXLite/blazor.md rename to docs/en/Themes/LeptonXLite/Blazor.md index f443336e7c..636c33ef28 100644 --- a/docs/en/Themes/LeptonXLite/blazor.md +++ b/docs/en/Themes/LeptonXLite/Blazor.md @@ -15,8 +15,11 @@ LeptonX Lite has implementation for the ABP Framework Blazor WebAssembly & Blazo ## Installation +This theme is **already installed** when you create a new solution using the startup templates. If you are using any other template, you can install this theme by following the steps below: + {{if UI == "Blazor"}} -- Complete the [MVC Razor Pages Installation](mvc.md#installation) for the **HttpApi.Host** application first. _If the solution is tiered/micro-service, complete the MVC steps for all MVC applications such as **HttpApi.Host** and if identity server is separated, install to the **OpenIddict**_. +- Complete the [MVC Razor Pages Installation](AspNetCore.md#installation) for the **HttpApi.Host** application first. _If the solution is tiered/micro-service, complete the MVC steps for all MVC applications such as **HttpApi.Host** and if identity server is separated, install to the **OpenIddict**_. + - Add **Volo.Abp.AspNetCore.Components.WebAssembly.LeptonXLiteTheme** package to your **Blazor WebAssembly** application with the following command: @@ -52,7 +55,7 @@ builder.RootComponents.Add("#ApplicationContainer"); {{if UI == "BlazorServer"}} -- Complete the [MVC Razor Pages Installation](mvc.md#installation) first. _If the solution is tiered/micro-service, complete the MVC steps for all MVC applications such as **HttpApi.Host** and **AuthServer**_. +- Complete the [MVC Razor Pages Installation](AspNetCore.md#installation) first. _If the solution is tiered/micro-service, complete the MVC steps for all MVC applications such as **HttpApi.Host** and **AuthServer**_. - Add **Volo.Abp.AspNetCore.Components.Server.LeptonXLiteTheme** package to your **Blazor server** application with the following command: diff --git a/docs/en/Themes/LeptonXLite/mvc.md b/docs/en/Themes/LeptonXLite/mvc.md deleted file mode 100644 index 5c2c515613..0000000000 --- a/docs/en/Themes/LeptonXLite/mvc.md +++ /dev/null @@ -1,74 +0,0 @@ -# LeptonX Lite MVC UI -LeptonX Lite has implementation for the ABP Framework Razor Pages. It's a simplified variation of the [LeptonX Theme](https://x.leptontheme.com/). - -> If you are looking for a professional, enterprise ready theme, you can check the [LeptonX Theme](https://x.leptontheme.com/), which is a part of [ABP Commercial](https://commercial.abp.io/). - -> See the [Theming document](https://docs.abp.io/en/abp/latest/UI/AspNetCore/Theming) to learn about themes. - -## Installation - -- Add **Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite** package to your **Web** application. - -```bash -dotnet add package Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite --prerelease -``` - -- Remove **Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic** reference from the project since it's not necessary after switching to LeptonX Lite. - -- Make sure the old theme is removed and LeptonX is added in your Module class. - -```diff -[DependsOn( - // Remove BasicTheme module from DependsOn attribute -- typeof(AbpAspNetCoreMvcUiBasicThemeModule), - - // Add LeptonX Lite module to DependsOn attribute -+ typeof(AbpAspNetCoreMvcUiLeptonXLiteThemeModule), -)] -``` - -- Replace `BasicThemeBundles` with `LeptonXLiteThemeBundles` in AbpBundlingOptions - -```diff -Configure(options => -{ - options.StyleBundles.Configure( - // Remove following line -- BasicThemeBundles.Styles.Global, - // Add following line instead -+ LeptonXLiteThemeBundles.Styles.Global - bundle => - { - bundle.AddFiles("/global-styles.css"); - } - ); -}); -``` - ---- - -## Customization - -### Toolbars -LeptonX Lite includes separeted toolbars for desktop & mobile. You can manage toolbars independently. Toolbar names can be accessible in the **LeptonXLiteToolbars** class. - -- `LeptonXLiteToolbars.Main` -- `LeptonXLiteToolbars.MainMobile` - -```csharp -public class MyProjectNameMainToolbarContributor : IToolbarContributor -{ - public async Task ConfigureToolbarAsync(IToolbarConfigurationContext context) - { - if (context.Toolbar.Name == LeptonXLiteToolbars.Main) - { - context.Toolbar.Items.Add(new ToolbarItem(typeof(MyDesktopComponent))); - } - - if (context.Toolbar.Name == LeptonXLiteToolbars.MainMobile) - { - context.Toolbar.Items.Add(new ToolbarItem(typeof(MyMobileComponent))); - } - } -} -``` diff --git a/docs/en/Tutorials/Part-2.md b/docs/en/Tutorials/Part-2.md index 50b90b516d..3e7a1bc735 100644 --- a/docs/en/Tutorials/Part-2.md +++ b/docs/en/Tutorials/Part-2.md @@ -135,22 +135,22 @@ Open the `en.json` (*the English translations*) file and change the content as s "CreationTime": "Creation time", "AreYouSure": "Are you sure?", "AreYouSureToDelete": "Are you sure you want to delete this item?", - "Enum:BookType:0": "Undefined", - "Enum:BookType:1": "Adventure", - "Enum:BookType:2": "Biography", - "Enum:BookType:3": "Dystopia", - "Enum:BookType:4": "Fantastic", - "Enum:BookType:5": "Horror", - "Enum:BookType:6": "Science", - "Enum:BookType:7": "Science fiction", - "Enum:BookType:8": "Poetry" + "Enum:BookType.Undefined": "Undefined", + "Enum:BookType.Adventure": "Adventure", + "Enum:BookType.Biography": "Biography", + "Enum:BookType.Dystopia": "Dystopia", + "Enum:BookType.Fantastic": "Fantastic", + "Enum:BookType.Horror": "Horror", + "Enum:BookType.Science": "Science", + "Enum:BookType.ScienceFiction": "Science fiction", + "Enum:BookType.Poetry": "Poetry" } } ```` * Localization key names are arbitrary. You can set any name. We prefer some conventions for specific text types; * Add `Menu:` prefix for menu items. - * Use `Enum::` naming convention to localize the enum members. When you do it like that, ABP can automatically localize the enums in some proper cases. + * Use `Enum:.` or `.` or `` naming convention to localize the enum members. When you do it like that, ABP can automatically localize the enums in some proper cases. If a text is not defined in the localization file, it **falls back** to the localization key (as ASP.NET Core's standard behavior). @@ -624,7 +624,7 @@ Open the `Books.razor` and replace the content as the following: Field="@nameof(BookDto.Type)" Caption="@L["Type"]"> - @L[$"Enum:BookType:{(int)context.Type}"] + @L[$"Enum:BookType.{Enum.GetName(context.Type)}"] - @L[$"Enum:BookType:{bookTypeValue}"] + @L[$"Enum:BookType.{Enum.GetName((BookType)bookTypeValue)}"] } @@ -1322,7 +1322,7 @@ We can now define a modal to edit the book. Add the following code to the end of @foreach (int bookTypeValue in Enum.GetValues(typeof(BookType))) { - @L[$"Enum:BookType:{bookTypeValue}"] + @L[$"Enum:BookType.{Enum.GetName((BookType)bookTypeValue)}"] } @@ -1459,7 +1459,7 @@ Here's the complete code to create the book management CRUD page, that has been Field="@nameof(BookDto.Type)" Caption="@L["Type"]"> - @L[$"Enum:BookType:{(int) context.Type}"] + @L[$"Enum:BookType.{Enum.GetName(context.Type)}"] - @L[$"Enum:BookType:{bookTypeValue}"] + @L[$"Enum:BookType.{Enum.GetName((BookType)bookTypeValue)}"] } @@ -1564,7 +1564,7 @@ Here's the complete code to create the book management CRUD page, that has been @foreach (int bookTypeValue in Enum.GetValues(typeof(BookType))) { - @L[$"Enum:BookType:{bookTypeValue}"] + @L[$"Enum:BookType.{Enum.GetName((BookType)bookTypeValue)}"] } diff --git a/docs/en/Tutorials/Todo/Index.md b/docs/en/Tutorials/Todo/Index.md index 5ecee2074b..e373871183 100644 --- a/docs/en/Tutorials/Todo/Index.md +++ b/docs/en/Tutorials/Todo/Index.md @@ -25,15 +25,17 @@ You can find the source code of the completed application [here](https://github. {{end}} -## Creating a New Solution +## Install ABP CLI Tool -We will use the [ABP CLI](../../CLI.md) to create new solutions with the ABP Framework. You can run the following command in a command-line terminal to install it: +We will use the [ABP CLI](../../CLI.md) to create new ABP solutions. You can run the following command on a terminal window to install this dotnet tool: ````bash dotnet tool install -g Volo.Abp.Cli ```` -Then create an empty folder, open a command-line terminal and execute the following command in the terminal: +## Create Your ABP Solution + +Create an empty folder, open a command-line terminal and execute the following command in the terminal: ````bash abp new TodoApp{{if UI=="Blazor"}} -u blazor{{else if UI=="BlazorServer"}} -u blazor-server{{else if UI=="NG"}} -u angular{{end}}{{if DB=="Mongo"}} -d mongodb{{end}} diff --git a/docs/en/UI/Angular/Basic-Theme.md b/docs/en/UI/Angular/Basic-Theme.md index 7b6c98fdcc..6b9ffcfeb1 100644 --- a/docs/en/UI/Angular/Basic-Theme.md +++ b/docs/en/UI/Angular/Basic-Theme.md @@ -8,7 +8,7 @@ The Basic Theme is a theme implementation for the Angular UI. It is a minimalist ## Installation -**This theme is already installed** when you create a new solution using the [startup templates](../../Startup-Templates/Index.md). If you need to manually install it, follow the steps below: +If you need to manually this theme, follow the steps below: * Install the [@abp/ng.theme.basic](https://www.npmjs.com/package/@abp/ng.theme.basic) NPM package to your Angular project. * Open the `src/app/app.module.ts` file, import `ThemeBasicModule` (it can be imported from `@abp/ng.theme.basic` package), and add `ThemeBasicModule.forRoot()` to the `imports` array. diff --git a/docs/en/UI/Angular/Config-State-Service.md b/docs/en/UI/Angular/Config-State-Service.md index b3884f65e1..c457184fc2 100644 --- a/docs/en/UI/Angular/Config-State-Service.md +++ b/docs/en/UI/Angular/Config-State-Service.md @@ -120,10 +120,10 @@ Please refer to `ApplicationConfigurationDto` type for all the properties you ca You can get the application configuration response and set the `ConfigStateService` state value as shown below: ```js -import {ApplicationConfigurationService, ConfigStateService} from '@abp/ng.core'; +import {AbpApplicationConfigurationService, ConfigStateService} from '@abp/ng.core'; -constructor(private applicationConfigurationService: ApplicationConfigurationService, private config: ConfigStateService) { - this.applicationConfigurationService.getConfiguration().subscribe(config => { +constructor(private abpApplicationConfigurationService: AbpApplicationConfigurationService, private config: ConfigStateService) { + this.abpApplicationConfigurationService.get().subscribe(config => { this.config.setState(config); }) } diff --git a/docs/en/UI/Angular/Current-User.md b/docs/en/UI/Angular/Current-User.md new file mode 100644 index 0000000000..820a787b5c --- /dev/null +++ b/docs/en/UI/Angular/Current-User.md @@ -0,0 +1,20 @@ +# Angular UI: Current User + +The current user information stored in Config State. + +### How to Get a Current User Information Configuration + +You can use the `getOne` or `getOne$` method of `ConfigStateService` to get a specific configuration property. For that, the property name should be passed to the method as parameter. + +```js +// this.config is an instance of ConfigStateService + +const currentUser = this.config.getOne("currentUser"); + +// or +this.config.getOne$("currentUser").subscribe(currentUser => { + // use currentUser here +}) +``` + +> See the [ConfigStateService](./Config-State-Service) for more information. diff --git a/docs/en/UI/Angular/Theming.md b/docs/en/UI/Angular/Theming.md index c7f303763d..435acc6930 100644 --- a/docs/en/UI/Angular/Theming.md +++ b/docs/en/UI/Angular/Theming.md @@ -16,10 +16,11 @@ In order to accomplish these goals, ABP Framework; ### Current Themes -Currently, two themes are **officially provided**: +Currently, three themes are **officially provided**: * The [Basic Theme](Basic-Theme.md) is the minimalist theme with the plain Bootstrap style. It is **open source and free**. * The [Lepton Theme](https://commercial.abp.io/themes) is a **commercial** theme developed by the core ABP team and is a part of the [ABP Commercial](https://commercial.abp.io/) license. +* The [LeptonX Theme](https://x.leptontheme.com/) is a theme that has both [commercial](https://docs.abp.io/en/commercial/latest/themes/lepton-x/commercial/angular) and [lite](../../Themes/LeptonXLite/Angular.md) choices. ## Overall diff --git a/docs/en/UI/AspNetCore/Basic-Theme.md b/docs/en/UI/AspNetCore/Basic-Theme.md index e74799a423..903231a20a 100644 --- a/docs/en/UI/AspNetCore/Basic-Theme.md +++ b/docs/en/UI/AspNetCore/Basic-Theme.md @@ -10,7 +10,7 @@ The Basic Theme has RTL (Right-to-Left language) support. ## Installation -**This theme is already installed** when you create a new solution using the [startup templates](../../Startup-Templates/Index.md). If you need to manually install it, follow the steps below: +If you need to manually this theme, follow the steps below: * Install the [Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic](https://www.nuget.org/packages/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic) NuGet package to your web project. * Add `AbpAspNetCoreMvcUiBasicThemeModule` into the `[DependsOn(...)]` attribute for your [module class](../../Module-Development-Basics.md) in the web project. diff --git a/docs/en/UI/AspNetCore/Modals.md b/docs/en/UI/AspNetCore/Modals.md index 3824c45983..b0a0ba922e 100644 --- a/docs/en/UI/AspNetCore/Modals.md +++ b/docs/en/UI/AspNetCore/Modals.md @@ -9,7 +9,7 @@ While you can continue to use the standard [Bootstrap way](https://getbootstrap. ABP Framework provides the following benefits for such a modal with a form inside it; * **Lazy loads** the modal HTML into the page and **removes** it from the DOM once its closed. This makes easy to consume a reusable modal dialog. Also, every time you open the modal, it will be a fresh new modal, so you don't have to deal with resetting the modal content. -* **Auto-focuses** the first input of the form once the modal has been opened. +* **Auto-focuses** the first input of the form once the modal has been opened. You can also specify it using a `function` or `jquery selector`. * Automatically determines the **form** inside a modal and posts the form via **AJAX** instead of normal page post. * Automatically checks if the form inside the modal **has changed, but not saved**. It warns the user in this case. * Automatically **disables the modal buttons** (save & cancel) until the AJAX operation completes. @@ -429,6 +429,7 @@ Here, the list of all available options; * `viewUrl` (required, `string`): The URL to lazy load the HTML of the modal. * `scriptUrl` (optional, `string`): A URL to lazy load a JavaScript file. It is loaded only once, when the modal first opened. * `modalClass` (optional, `string`): A JavaScript class defined in the `abp.modals` namespace that can be used to execute code related to the modal. +* `focusElement` (optional, `function or string`): Specifies the element that gets focus. ### Functions diff --git a/docs/en/UI/AspNetCore/Overall.md b/docs/en/UI/AspNetCore/Overall.md index 8cd9dd3f5e..bc24c56fb8 100644 --- a/docs/en/UI/AspNetCore/Overall.md +++ b/docs/en/UI/AspNetCore/Overall.md @@ -32,10 +32,11 @@ ABP Framework provides a complete [Theming](Theming.md) system with the followin ### Current Themes -Currently, two themes are **officially provided**: +Currently, three themes are **officially provided**: * The [Basic Theme](Basic-Theme.md) is the minimalist theme with the plain Bootstrap style. It is **open source and free**. * The [Lepton Theme](https://commercial.abp.io/themes) is a **commercial** theme developed by the core ABP team and is a part of the [ABP Commercial](https://commercial.abp.io/) license. +* The [LeptonX Theme](https://x.leptontheme.com/) is a theme that has both [commercial](https://docs.abp.io/en/commercial/latest/themes/lepton-x/commercial/mvc) and [lite](../../Themes/LeptonXLite/AspNetCore.md) choices. There are also some community-driven themes for the ABP Framework (you can search on the web). diff --git a/docs/en/UI/AspNetCore/Page-Header.md b/docs/en/UI/AspNetCore/Page-Header.md index f6ec3074de..8b045c89ab 100644 --- a/docs/en/UI/AspNetCore/Page-Header.md +++ b/docs/en/UI/AspNetCore/Page-Header.md @@ -23,6 +23,8 @@ Page Title can be set as shown in the example below: ### Breadcrumb > **The [Basic Theme](Basic-Theme.md) currently doesn't implement the breadcrumbs.** +> +> The [LeptonX Lite Theme](../../Themes/LeptonXLite/AspNetCore.md) supports breadcrumbs. Breadcrumb items can be added to the `PageLayout.Content.BreadCrumb`. @@ -48,11 +50,13 @@ Any item that you add is inserted between Home and Current Page items. You can a ### The Selected Menu Item > **The [Basic Theme](Basic-Theme.md) currently doesn't implement the selected menu item since it is not applicable to the top menu which is the only option for the Basic Theme for now.** +> +> The [LeptonX Lite Theme](../../Themes/LeptonXLite/AspNetCore.md) supports selected menu item. You can set the Menu Item name related to this page: -````csharp +```csharp PageLayout.Content.MenuItemName = "BookStore.Books"; -```` +``` Menu item name should match a unique menu item name defined using the [Navigation / Menu](Navigation-Menu.md) system. In this case, it is expected from the theme to make the menu item "active" in the main menu. \ No newline at end of file diff --git a/docs/en/UI/AspNetCore/Theming.md b/docs/en/UI/AspNetCore/Theming.md index fd2e7312de..050228de2d 100644 --- a/docs/en/UI/AspNetCore/Theming.md +++ b/docs/en/UI/AspNetCore/Theming.md @@ -16,10 +16,12 @@ In order to accomplish these goals, ABP Framework; ### Current Themes -Currently, two themes are **officially provided**: +Currently, four themes are **officially provided**: * The [Basic Theme](Basic-Theme.md) is the minimalist theme with the plain Bootstrap style. It is **open source and free**. +* The [LeptonX Lite Theme](../../Themes/LeptonXLite/AspNetCore.md) is modern and stylish Bootstrap UI theme. It is ideal if you want to have a production ready UI theme. It is also **open source and free**. * The [Lepton Theme](https://commercial.abp.io/themes) is a **commercial** theme developed by the core ABP team and is a part of the [ABP Commercial](https://commercial.abp.io/) license. +* The [LeptonX Theme](https://docs.abp.io/en/commercial/6.0/themes/leptonx) is also a **commercial** theme developed by the core ABP theme and is a part of the [ABP Commercial](https://commercial.abp.io/) license. This is the default theme after ABP v6.0.0. There are also some community-driven themes for the ABP Framework (you can search on the web). diff --git a/docs/en/UI/AspNetCore/Toolbars.md b/docs/en/UI/AspNetCore/Toolbars.md index d82150b47e..975157151f 100644 --- a/docs/en/UI/AspNetCore/Toolbars.md +++ b/docs/en/UI/AspNetCore/Toolbars.md @@ -8,6 +8,12 @@ There is only one **standard toolbar** named "Main" (defined as a constant: `Sta In the screenshot above, there are two items added to the main toolbar: Language switch component & user menu. You can add your own items here. +Also, [LeptonX Lite Theme](../../Themes/LeptonXLite/AspNetCore.md) has 2 different toolbars for desktop and mobile views which defined as constants: `LeptonXLiteToolbars.Main`, `LeptonXLiteToolbars.MainMobile`. + +| LeptonXLiteToolbars.Main | LeptonXLiteToolbars.MainMobile | +| :---: | :---: | +| ![leptonx](../../images/leptonxlite-toolbar-main-example.png) | ![leptonx](../../images/leptonxlite-toolbar-mainmobile-example.png) | + ## Example: Add a Notification Icon In this example, we will add a **notification (bell) icon** to the left of the language switch item. A item in the toolbar should be a **view component**. So, first, create a new view component in your project: diff --git a/docs/en/UI/Blazor/Basic-Theme.md b/docs/en/UI/Blazor/Basic-Theme.md index 2cd0914e2f..4060f097ba 100644 --- a/docs/en/UI/Blazor/Basic-Theme.md +++ b/docs/en/UI/Blazor/Basic-Theme.md @@ -15,7 +15,7 @@ The Basic Theme is a theme implementation for the Blazor UI. It is a minimalist ## Installation -**This theme is already installed** when you create a new solution using the [startup templates](../../Startup-Templates/Index.md). If you need to manually install it, follow the steps below: +If you need to manually this theme, follow the steps below: {{if UI == "Blazor"}} diff --git a/docs/en/UI/Blazor/Overall.md b/docs/en/UI/Blazor/Overall.md index ff361d6784..402d61acb0 100644 --- a/docs/en/UI/Blazor/Overall.md +++ b/docs/en/UI/Blazor/Overall.md @@ -75,10 +75,11 @@ ABP Framework provides a complete [Theming](Theming.md) system with the followin ### Current Themes -Currently, two themes are **officially provided**: +Currently, three themes are **officially provided**: * The [Basic Theme](Basic-Theme.md) is the minimalist theme with the plain Bootstrap style. It is **open source and free**. * The [Lepton Theme](https://commercial.abp.io/themes) is a **commercial** theme developed by the core ABP team and is a part of the [ABP Commercial](https://commercial.abp.io/) license. +* The [LeptonX Theme](https://x.leptontheme.com/) is a theme that has both [commercial](https://docs.abp.io/en/commercial/latest/themes/lepton-x/commercial/blazor) and [lite](../../Themes/LeptonXLite/Blazor.md) choices. ### Base Libraries diff --git a/docs/en/UI/Blazor/Page-Header.md b/docs/en/UI/Blazor/Page-Header.md index 29cb006bd3..1bdc9c93c0 100644 --- a/docs/en/UI/Blazor/Page-Header.md +++ b/docs/en/UI/Blazor/Page-Header.md @@ -16,6 +16,8 @@ Once you add the `PageHeader` component to your page, you can control the relate ## Breadcrumb > **The [Basic Theme](Basic-Theme.md) currently doesn't implement the breadcrumbs.** +> +> The [LeptonX Lite Theme](../../Themes/LeptonXLite/Blazor.md) supports breadcrumbs. Breadcrumbs can be added using the `BreadcrumbItems` property. diff --git a/docs/en/UI/Blazor/Page-Layout.md b/docs/en/UI/Blazor/Page-Layout.md index 49ed1659f4..c6f3d62000 100644 --- a/docs/en/UI/Blazor/Page-Layout.md +++ b/docs/en/UI/Blazor/Page-Layout.md @@ -42,6 +42,10 @@ Menu item name can be set on runtime too. } ``` + +![leptonx selected menu item](../../images/leptonx-selected-menu-item-example.gif) + + > Be aware, The [Basic Theme](../Blazor/Basic-Theme.md) currently doesn't support the selected menu item since it is not applicable to the top menu. ## BreadCrumbs diff --git a/docs/en/UI/Blazor/Theming.md b/docs/en/UI/Blazor/Theming.md index c7f92189de..d8cec07cb3 100644 --- a/docs/en/UI/Blazor/Theming.md +++ b/docs/en/UI/Blazor/Theming.md @@ -27,7 +27,7 @@ Currently, three themes are **officially provided**: * The [Basic Theme](Basic-Theme.md) is the minimalist theme with the plain Bootstrap style. It is **open source and free**. * The [Lepton Theme](https://commercial.abp.io/themes) is a **commercial** theme developed by the core ABP team and is a part of the [ABP Commercial](https://commercial.abp.io/) license. -* The [LeptonX Theme](https://x.leptontheme.com/) is a theme that has a [commercial](https://docs.abp.io/en/commercial/latest/themes/lepton-x/commercial/blazor) and a [lite](../../Themes/LeptonXLite/blazor.md) version. +* The [LeptonX Theme](https://x.leptontheme.com/) is a theme that has a [commercial](https://docs.abp.io/en/commercial/latest/themes/lepton-x/commercial/blazor) and a [lite](../../Themes/LeptonXLite/Blazor.md) version. ## Overall diff --git a/docs/en/UI/Blazor/Toolbars.md b/docs/en/UI/Blazor/Toolbars.md index 3ff1b7f135..c0878f080a 100644 --- a/docs/en/UI/Blazor/Toolbars.md +++ b/docs/en/UI/Blazor/Toolbars.md @@ -8,6 +8,12 @@ There is only one **standard toolbar** named "Main" (defined as a constant: `Sta In the screenshot above, there are two items added to the main toolbar: Language switch component & user menu. You can add your own items here. +Also, [LeptonX Lite Theme](../../Themes/LeptonXLite/Blazor.md) has 2 different toolbars for desktop and mobile views which defined as constants: `LeptonXLiteToolbars.Main`, `LeptonXLiteToolbars.MainMobile`. + +| LeptonXLiteToolbars.Main | LeptonXLiteToolbars.MainMobile | +| :---: | :---: | +| ![leptonx](../../images/leptonxlite-toolbar-main-example.png) | ![leptonx](../../images/leptonxlite-toolbar-mainmobile-example.png) | + ## Example: Add a Notification Icon In this example, we will add a **notification (bell) icon** to the left of the language switch item. A item in the toolbar should be a **Razor Component**. So, first, create a new razor component in your project (the location of the component doesn't matter): diff --git a/docs/en/docs-nav.json b/docs/en/docs-nav.json index 7950313217..14c584d376 100644 --- a/docs/en/docs-nav.json +++ b/docs/en/docs-nav.json @@ -43,6 +43,10 @@ "text": "WPF Application", "path": "Startup-Templates/WPF.md" }, + { + "text": "MAUI", + "path": "Startup-Templates/MAUI.md" + }, { "text": "Empty Web Project", "path": "Getting-Started-AspNetCore-Application.md" @@ -721,7 +725,7 @@ }, { "text": "LeptonX Lite", - "path": "Themes/LeptonXLite/mvc.md" + "path": "Themes/LeptonXLite/AspNetCore.md" } ] }, @@ -837,7 +841,7 @@ }, { "text": "LeptonX Lite", - "path": "Themes/LeptonXLite/blazor.md" + "path": "Themes/LeptonXLite/Blazor.md" }, { "text": "Branding", @@ -847,6 +851,10 @@ "text": "Page Header", "path": "UI/Blazor/Page-Header.md" }, + { + "text": "Page Layout", + "path": "UI/Blazor/Page-Layout.md" + }, { "text": "Toolbars", "path": "UI/Blazor/Toolbars.md" @@ -977,6 +985,10 @@ "text": "Authorization", "path": "UI/Angular/Authorization.md" }, + { + "text": "Current User", + "path": "UI/Angular/Current-User.md" + }, { "text": "HTTP Requests", "path": "UI/Angular/HTTP-Requests.md" @@ -1112,7 +1124,7 @@ }, { "text": "LeptonX Lite", - "path": "Themes/LeptonXLite/angular.md" + "path": "Themes/LeptonXLite/Angular.md" } ] }, @@ -1322,6 +1334,12 @@ }, { "text": "OpenIddict", + "items": [ + { + "text": "OpenIddict Migration Guide", + "path": "Migration-Guides/OpenIddict-Step-by-Step.md" + } + ], "path": "Modules/OpenIddict.md" }, { diff --git a/docs/en/images/bookstore-rider-solution-tiered.png b/docs/en/images/bookstore-rider-solution-tiered.png new file mode 100644 index 0000000000..25114bc51c Binary files /dev/null and b/docs/en/images/bookstore-rider-solution-tiered.png differ diff --git a/docs/en/images/breadcrumbs-example.png b/docs/en/images/breadcrumbs-example.png index 17ae5f8ba5..8b4bbc62d7 100644 Binary files a/docs/en/images/breadcrumbs-example.png and b/docs/en/images/breadcrumbs-example.png differ diff --git a/docs/en/images/cms-kit-page-editor.png b/docs/en/images/cms-kit-page-editor.png new file mode 100644 index 0000000000..2906da8663 Binary files /dev/null and b/docs/en/images/cms-kit-page-editor.png differ diff --git a/docs/en/images/cms-kit-widget-preview.png b/docs/en/images/cms-kit-widget-preview.png new file mode 100644 index 0000000000..df071adc65 Binary files /dev/null and b/docs/en/images/cms-kit-widget-preview.png differ diff --git a/docs/en/images/cmskit-module-editor-parameter.png b/docs/en/images/cmskit-module-editor-parameter.png new file mode 100644 index 0000000000..1424716591 Binary files /dev/null and b/docs/en/images/cmskit-module-editor-parameter.png differ diff --git a/docs/en/images/cmskit-without-parameter.png b/docs/en/images/cmskit-without-parameter.png new file mode 100644 index 0000000000..49ec3b754f Binary files /dev/null and b/docs/en/images/cmskit-without-parameter.png differ diff --git a/docs/en/images/leptonx-selected-menu-item-example.gif b/docs/en/images/leptonx-selected-menu-item-example.gif new file mode 100644 index 0000000000..8f1170cd55 Binary files /dev/null and b/docs/en/images/leptonx-selected-menu-item-example.gif differ diff --git a/docs/en/images/leptonxlite-brand-component.png b/docs/en/images/leptonxlite-brand-component.png new file mode 100644 index 0000000000..c06a51612f Binary files /dev/null and b/docs/en/images/leptonxlite-brand-component.png differ diff --git a/docs/en/images/leptonxlite-breadcrumb-component.png b/docs/en/images/leptonxlite-breadcrumb-component.png new file mode 100644 index 0000000000..9026ca4c52 Binary files /dev/null and b/docs/en/images/leptonxlite-breadcrumb-component.png differ diff --git a/docs/en/images/leptonxlite-language-switch-component.png b/docs/en/images/leptonxlite-language-switch-component.png new file mode 100644 index 0000000000..027910c23b Binary files /dev/null and b/docs/en/images/leptonxlite-language-switch-component.png differ diff --git a/docs/en/images/leptonxlite-mobile-language-switch-component.png b/docs/en/images/leptonxlite-mobile-language-switch-component.png new file mode 100644 index 0000000000..a058820743 Binary files /dev/null and b/docs/en/images/leptonxlite-mobile-language-switch-component.png differ diff --git a/docs/en/images/leptonxlite-mobile-user-menu-component.png b/docs/en/images/leptonxlite-mobile-user-menu-component.png new file mode 100644 index 0000000000..1a51c341d7 Binary files /dev/null and b/docs/en/images/leptonxlite-mobile-user-menu-component.png differ diff --git a/docs/en/images/leptonxlite-page-alerts-component.png b/docs/en/images/leptonxlite-page-alerts-component.png new file mode 100644 index 0000000000..7976412fb2 Binary files /dev/null and b/docs/en/images/leptonxlite-page-alerts-component.png differ diff --git a/docs/en/images/leptonxlite-sidebar-menu-component.png b/docs/en/images/leptonxlite-sidebar-menu-component.png new file mode 100644 index 0000000000..6afe4029e8 Binary files /dev/null and b/docs/en/images/leptonxlite-sidebar-menu-component.png differ diff --git a/docs/en/images/leptonxlite-toolbar-main-example.png b/docs/en/images/leptonxlite-toolbar-main-example.png new file mode 100644 index 0000000000..30edcf547b Binary files /dev/null and b/docs/en/images/leptonxlite-toolbar-main-example.png differ diff --git a/docs/en/images/leptonxlite-toolbar-mainmobile-example.png b/docs/en/images/leptonxlite-toolbar-mainmobile-example.png new file mode 100644 index 0000000000..95815b5843 Binary files /dev/null and b/docs/en/images/leptonxlite-toolbar-mainmobile-example.png differ diff --git a/docs/en/images/leptonxlite-user-menu-component.png b/docs/en/images/leptonxlite-user-menu-component.png new file mode 100644 index 0000000000..a0039e996c Binary files /dev/null and b/docs/en/images/leptonxlite-user-menu-component.png differ diff --git a/docs/en/images/setting-management-email-ui.png b/docs/en/images/setting-management-email-ui.png new file mode 100644 index 0000000000..f8f1270c15 Binary files /dev/null and b/docs/en/images/setting-management-email-ui.png differ diff --git a/docs/en/images/solution-structure-solution-explorer-rider.png b/docs/en/images/solution-structure-solution-explorer-rider.png new file mode 100644 index 0000000000..8a09cec74e Binary files /dev/null and b/docs/en/images/solution-structure-solution-explorer-rider.png differ diff --git a/docs/en/images/tiered-solution-applications-authserver.png b/docs/en/images/tiered-solution-applications-authserver.png new file mode 100644 index 0000000000..6d96bf31b4 Binary files /dev/null and b/docs/en/images/tiered-solution-applications-authserver.png differ diff --git a/docs/es/Getting-Started-AspNetCore-Application.md b/docs/es/Getting-Started-AspNetCore-Application.md new file mode 100644 index 0000000000..c4d124d827 --- /dev/null +++ b/docs/es/Getting-Started-AspNetCore-Application.md @@ -0,0 +1,140 @@ +# Empezando con ABP y una Aplicacion AspNet Core MVC Web + +Este tutorial explica como empezar una aplicacion ABP desde cero usando las dependencias minimas. Uno generalmente desea +empezar con la **[plantilla de inicio](Getting-Started-AspNetCore-MVC-Template.md)**. + +## Crea un Proyecto Nuevo + +1. Crea una Aplicacion Web AspNet Core nueva usando Visual Studio 2022 (17.0.0+): + +![](images/create-new-aspnet-core-application-v2.png) + +2. Configura el nuevo proyecto: + +![](images/select-empty-web-application-v2.png) + +3. Presione el boton Create: + +![create-aspnet-core-application](images/create-aspnet-core-application.png) + +## Instale el paquete Volo.Abp.AspNetCore.Mvc + +Volo.Abp.AspNetCore.Mvc es el paquete de integracion con AspNet Core MVC para ABP. Siendo asi, instalalo en su proyecto: + +```` +Install-Package Volo.Abp.AspNetCore.Mvc +```` + +## Crea el primer modulo ABP + +ABP es un marco de referencia modular y require una clase de **inicio (raíz) tipo modulo** derivada de ``AbpModule``: + +````C# +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.Hosting; +using Volo.Abp; +using Volo.Abp.AspNetCore.Mvc; +using Volo.Abp.Modularity; + +namespace BasicAspNetCoreApplication +{ + [DependsOn(typeof(AbpAspNetCoreMvcModule))] + public class AppModule : AbpModule + { + public override void OnApplicationInitialization(ApplicationInitializationContext context) + { + var app = context.GetApplicationBuilder(); + var env = context.GetEnvironment(); + + // Configura la canalización de peticiones HTTP. + if (env.IsDevelopment()) + { + app.UseExceptionHandler("/Error"); + // El valor por defecto de HSTS es 30 dias. Debes cambiar esto en ambientes productivos. Referencia https://aka.ms/aspnetcore-hsts. + app.UseHsts(); + } + + app.UseHttpsRedirection(); + app.UseStaticFiles(); + app.UseRouting(); + app.UseConfiguredEndpoints(); + } + } +} +```` + +``AppModule`` es un buen nombre para el modulo de inicio de una aplicacion. + +Los paquetes de ABP definen clases de tipo modulo y cada modulo puede depender de otro. +En el codigo anterior, el ``AppModule`` depende de el modulo ``AbpAspNetCoreMvcModule`` (definido por el paquete [Volo.Abp.AspNetCore.Mvc](https://www.nuget.org/packages/Volo.Abp.AspNetCore.Mvc)). Es comun agregar el atributo ``DependsOn`` despues de instalar un paquete ABP nuevo. + +En vez de la clase de inicion Startup, estamos configurando una canalizacion de ASP.NET Core en este modulo. + +## La clase Program + +El proximo paso es modificar la clase Program para integrate el sistema de modulos ABP: + +````C# +using BasicAspNetCoreApplication; + +var builder = WebApplication.CreateBuilder(args); + +await builder.Services.AddApplicationAsync(); + +var app = builder.Build(); + +await app.InitializeApplicationAsync(); +await app.RunAsync(); +```` + +``builder.Services.AddApplicationAsync();`` Agrega todos los servicios definidos en todos los modulos empezando desde ``AppModule``. + +``app.InitializeApplicationAsync()`` inicializa y empieza la aplicacion. + +## Ejecutar la Aplicación + +Es todo! Ejecuta la aplicación, debe funcionar como esperado. + +## Uso de Autofac como Marco de Inyección de Dependencia + +Mientras el sistema de Inyección de Dependencia de ASP.NET Core es suficiente para requerimientos basico, [Autofac](https://autofac.org/) proporciona características avanzadas como Inyección de Propiedades e Intercepcion de Metodos, los cuales son necesarios para que ABP pueda llevar a cabo funciones avanzadas. + +El acto de remplazar el sistema DI de ASP.NET Core por Autofac e integrarlo con ABP es facil. + +1. Instala el paquete [Volo.Abp.Autofac](https://www.nuget.org/packages/Volo.Abp.Autofac) + +```` +Install-Package Volo.Abp.Autofac +```` + +2. Agrega la dependencia sobre el modulo ``AbpAutofacModule`` + +````C# +[DependsOn(typeof(AbpAspNetCoreMvcModule))] +[DependsOn(typeof(AbpAutofacModule))] //Agrega la dependencia sobre el modulo ABP Autofac +public class AppModule : AbpModule +{ + ... +} +```` + +3. Actualiza `Program.cs` para que use Autofac: + +````C# +using BasicAspNetCoreApplication; + +var builder = WebApplication.CreateBuilder(args); + +builder.Host.UseAutofac(); //Agrega esta linea + +await builder.Services.AddApplicationAsync(); + +var app = builder.Build(); + +await app.InitializeApplicationAsync(); +await app.RunAsync(); +```` + +## Codigo fuente + + Obten el codigo fuente del ejemplo creado en este tutorial de [aqui](https://github.com/abpframework/abp-samples/tree/master/BasicAspNetCoreApplication). diff --git a/docs/es/images/create-aspnet-core-application.png b/docs/es/images/create-aspnet-core-application.png new file mode 100644 index 0000000000..b8b98f5c32 Binary files /dev/null and b/docs/es/images/create-aspnet-core-application.png differ diff --git a/docs/es/images/create-new-aspnet-core-application-v2.png b/docs/es/images/create-new-aspnet-core-application-v2.png new file mode 100644 index 0000000000..f8274ae2a4 Binary files /dev/null and b/docs/es/images/create-new-aspnet-core-application-v2.png differ diff --git a/docs/es/images/select-empty-web-application-v2.png b/docs/es/images/select-empty-web-application-v2.png new file mode 100644 index 0000000000..da32f71857 Binary files /dev/null and b/docs/es/images/select-empty-web-application-v2.png differ diff --git a/docs/pt-BR/Validation.md b/docs/pt-BR/Validation.md index 5818566cdd..662235431a 100644 --- a/docs/pt-BR/Validation.md +++ b/docs/pt-BR/Validation.md @@ -1,3 +1,182 @@ -## Validation +# Validação -Façam \ No newline at end of file +O sistema de validação é utilizado para validar a entrada do usuário ou a requisição do cliente para uma ação de um controller ou por um serviço. + +O ABP é compatível com o sistema de Validação de Modelos do ASP.NET Core e tudo escrito na [sua documentação](https://docs.microsoft.com/en-us/aspnet/core/mvc/models/validation) é válido para aplicações baseadas no ABP. Logo, esse documento foca nas funcionalidades do ABP ao invés de repetir a documentação da Microsoft. + +Além disso, o ABP adiciona os seguintes benefícios: + +* Define `IValidationEnabled` para adicionar validação automática para uma classe qualquer. Como todos os [serviços de aplicação](Application-Services.md) já o implementam, eles também são validados automaticamente. +* Automaticamente traduz os erros de validação para os atributos de anotação de dados. +* Provê serviços extensíveis para validar a chamada de um método ou o estado de um objeto. +* Provê integração com o [FluentValidation](https://fluentvalidation.net/) + +## Validando DTOs + +Essa seção introduz brevemente o sistema de validação. Para mais detalhes, veja a [Documentação da Validação de Modelo em ASP.NET Core](https://docs.microsoft.com/en-us/aspnet/core/mvc/models/validation). + +### Atributos de anotação de dados + +Utilizar anotações de dados é uma maneira simples de implementar uma validação formal para um [DTO](Data-Transfer-Objects.md) de uma forma declarativa. Exemplo: + +````csharp +public class CreateBookDto +{ + [Required] + [StringLength(100)] + public string Name { get; set; } + + [Required] + [StringLength(1000)] + public string Description { get; set; } + + [Range(0, 999.99)] + public decimal Price { get; set; } +} +```` +Quando você utilizar essa classe como parâmetro para um [serviço da aplicação](Application-Services.md) ou um controller, ele será automaticamente validado e a validação traduzida será lançada ([e tratada](Exception-Handling.md) pelo ABP framework). + +### IValidatableObject + +`IValidatableObject` pode ser implementado por um DTO para executar uma lógica customizada de validação. O `CreateBookDto` no exemplo a seguir implementa essa interface e verifica se o `Name` é igual a `Description` e retorna um erro de validação nesse caso. + +````csharp +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; + +namespace Acme.BookStore +{ + public class CreateBookDto : IValidatableObject + { + [Required] + [StringLength(100)] + public string Name { get; set; } + + [Required] + [StringLength(1000)] + public string Description { get; set; } + + [Range(0, 999.99)] + public decimal Price { get; set; } + + public IEnumerable Validate( + ValidationContext validationContext) + { + if (Name == Description) + { + yield return new ValidationResult( + "Name and Description can not be the same!", + new[] { "Name", "Description" } + ); + } + } + } +} +```` + +#### Resolvendo um serviço. + +Se você precisar resolver um serviço do [sistema de injeção de dependências](Dependency-Injection.md), você pode utilizar o objeto `ValidationContext`. + +````csharp +var myService = validationContext.GetRequiredService(); +```` + +> Enquanto resolver os serviços no método `Validate` permite várias possibilidades, não é um boa prática implementar sua lógica de validação do domínio nos DTOs. Mantenha os DTOs simples. Seu propósito é transferir dados (DTO: Data Transfer Object, ou Objeto de Transferência de Dados). + +## Infraestrutura de Validação. + +Essa seção explica alguns serviços adicionais fornecidos pelo ABP Framework. + +### Interface IValidationEnabled + +`IValidationEnabled` é um marcador vazio de interface que pode ser implementado por qualquer classe (registrada e resolvida a partir do [DI](Dependency-Injection.md)) para permitir que o ABP framework realize o sistema de validação para os métodos da classe. Por exemplo: + +````csharp +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Validation; + +namespace Acme.BookStore +{ + public class MyService : ITransientDependency, IValidationEnabled + { + public virtual async Task DoItAsync(MyInput input) + { + //... + } + } +} +```` + +> O ABP framework utiliza o sistema de [Proxying Dinâmico / Interceptadores](Dynamic-Proxying-Interceptors.md) para realizar a validação. Para fazê-lo funcionar, seu método deve ser **virtual** ou seu serviço deve ser injetado e utilizado através de uma **interface** (como `IMyService`). + +#### Habilitando e Desabilitando Validações + +Você pode utilizar o `[DisableValidation]` e desabilitar a validação para métodos, classes e propriedades. + +````csharp +[DisableValidation] +public Void MyMethod() +{ +} + +[DisableValidation] +public class InputClass +{ + public string MyProperty { get; set; } +} + +public class InputClass +{ + [DisableValidation] + public string MyProperty { get; set; } +} +```` + +### AbpValidationException + +Uma vez que o ABP determina um erro de validação, é lançada uma validação do tipo `AbpValidationException`. O código da sua aplicação poderá lançar o `AbpValidationException`, mas na maioria das vezes não será necessário. + +* A propriedade `ValidationErrors` do `AbpValidationException` contem a lista com os erros de validação. +* O nível de log do `AbpValidationException` é definido como `Warning`. Todos os erros de validação são logados no [Sistema de Logging](Logging.md). +* `AbpValidationException` é tratado automaticamente pelo ABP framework e é convertido em um erro utilizável com o código de status HTTP 400. Veja a documentação de [Manipulação de Exceção](Exception-Handling.md) para mais informações. + +## Tópicos Avançados + +### IObjectValidator + +Além da validação automática, você pode querer validar um objeto manualmente. Nesse caso, [injete](Dependency-Injection.md) e use o serviço `IObjectValidator`: + +* O método `ValidateAsync` valida o objeto informado baseado nas regras de validação e lança uma `AbpValidationException` se não estiver em um estado válido. + +* `GetErrorsAsync` não lança uma exceção, somente retorna os erros de validação. + +`IObjectValidator` é implementado pelo `ObjectValidator` por padrão. `ObjectValidator` é extensível; você pode implementar a interface `IObjectValidationContributor` para contribuir com uma lógica customizada. Exemplo: + +````csharp +public class MyObjectValidationContributor + : IObjectValidationContributor, ITransientDependency +{ + public Task AddErrorsAsync(ObjectValidationContext context) + { + //Get the validating object + var obj = context.ValidatingObject; + + //Add the validation errors if available + context.Errors.Add(...); + return Task.CompletedTask; + } +} +```` + +* Lembre-se de registrar sua classe no [DI](Dependency-Injection.md) (implementar `ITransientDependency` faz isso no exemplo anterior) +* ABP vai automaticamente descobrir sua classe e utilizá-la em qualquer tipo de validação de objetos (incluindo chamadas de métodos de validação automáticas). + +### IMethodInvocationValidator + +`IMethodInvocationValidator` é utilizado para validar a chamada de um método. Ele utiliza internamente o `IObjectValidator` para validar os objetos passados na chamada do método. Você normalmente não precisa deste serviço, já que ele é utilizado automaticamente pelo framework, mas você pode querer reutilizar ou substituir na sua aplicação em alguns casos raros. + +## Integração com FluentValidation + +O pacote Volo.Abp.FluentValidation integra a biblioteca FluentValidation com o sistema de validação (implementando o `IObjectValidationContributor`). Veja o [documento de Integração com o FluentValidation](FluentValidation.md) para mais informações. diff --git a/docs/zh-Hans/Authorization.md b/docs/zh-Hans/Authorization.md index db0dfdb654..39c64c0905 100644 --- a/docs/zh-Hans/Authorization.md +++ b/docs/zh-Hans/Authorization.md @@ -392,6 +392,45 @@ public override void ConfigureServices(ServiceConfigurationContext context) 启动模板的集成测试已经禁用了授权服务. +### Claims Principal Factory + +声明是认证和授权的重要组成部分. ABP 使用 `IAbpClaimsPrincipalFactory` 来服务创建身份认证声明. 该服务被设计为可扩展的. 如果你需要将自定义声明添加到身份认证票证中, 可以在你的应用程序中实现 `IAbpClaimsPrincipalContributor`. + +**示例:添加一个 `SocialSecurityNumber ` 声明并获取它:** + +```csharp +public class SocialSecurityNumberClaimsPrincipalContributor : IAbpClaimsPrincipalContributor, ITransientDependency +{ + public async Task ContributeAsync(AbpClaimsPrincipalContributorContext context) + { + var identity = context.ClaimsPrincipal.Identities.FirstOrDefault(); + var userId = identity?.FindUserId(); + if (userId.HasValue) + { + var userService = context.ServiceProvider.GetRequiredService(); //Your custom service + var socialSecurityNumber = await userService.GetSocialSecurityNumberAsync(userId.Value); + if (socialSecurityNumber != null) + { + identity.AddClaim(new Claim("SocialSecurityNumber", socialSecurityNumber)); + } + } + } +} + +Configure(options=> +{ + options.RequestedClaims.Add("SocialSecurityNumber") +}) + +public static class CurrentUserExtensions +{ + public static string GetSocialSecurityNumber(this ICurrentUser currentUser) + { + return currentUser.FindClaimValue("SocialSecurityNumber"); + } +} +``` + ## 接下来 * [权限管理模块](Modules/Permission-Management.md) diff --git a/docs/zh-Hans/Background-Jobs-Hangfire.md b/docs/zh-Hans/Background-Jobs-Hangfire.md index b1bf7b8c79..fb899758cc 100644 --- a/docs/zh-Hans/Background-Jobs-Hangfire.md +++ b/docs/zh-Hans/Background-Jobs-Hangfire.md @@ -66,6 +66,41 @@ public class YourModule : AbpModule } ```` +### 指定队列 + +你可以使用 [`QueueAttribute`](https://docs.hangfire.io/en/latest/background-processing/configuring-queues.html) 来指定队列. + +````csharp +using System.Threading.Tasks; +using Volo.Abp.BackgroundJobs; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Emailing; + +namespace MyProject +{ + [Queue("alpha")] + public class EmailSendingJob + : AsyncBackgroundJob, ITransientDependency + { + private readonly IEmailSender _emailSender; + + public EmailSendingJob(IEmailSender emailSender) + { + _emailSender = emailSender; + } + + public override async Task ExecuteAsync(EmailSendingArgs args) + { + await _emailSender.SendAsync( + args.EmailAddress, + args.Subject, + args.Body + ); + } + } +} +```` + 1. 如果你想要使用Hangfire的面板,你可以在 `Module` 类的 `OnApplicationInitialization` 方法添加: `UseHangfireDashboard` ````csharp diff --git a/docs/zh-Hans/Background-Jobs-RabbitMq.md b/docs/zh-Hans/Background-Jobs-RabbitMq.md index 0f9fb21d8a..8bf61846e7 100644 --- a/docs/zh-Hans/Background-Jobs-RabbitMq.md +++ b/docs/zh-Hans/Background-Jobs-RabbitMq.md @@ -126,25 +126,31 @@ Configure(options => Configure(options => { options.DefaultQueueNamePrefix = "my_app_jobs."; + options.DefaultDelayedQueueNamePrefix = "my_app_jobs.delayed" + options.PrefetchCount = 1; options.JobQueues[typeof(EmailSendingArgs)] = new JobQueueConfiguration( typeof(EmailSendingArgs), queueName: "my_app_jobs.emails", - connectionName: "SecondConnection" + connectionName: "SecondConnection", + delayedQueueName:"my_app_jobs.emails.delayed" ); }); ``` -- 这个示例将默认的队列名前缀设置为 `my_app_jobs.`,如果多个项目都使用的同一个 RabbitMQ 服务,设置不同的前缀可以避免执行其他项目的后台作业. +- 这个示例将默认的队列名前缀设置为 `my_app_jobs.`并且设置默认的延迟队列名为 `my_app_jobs.delayed`,如果多个项目都使用的同一个 RabbitMQ 服务,设置不同的前缀可以避免执行其他项目的后台作业. +- 设置了预取数量, 用于所有队列. - 这里还设置了 `EmailSendingArgs` 绑定的 RabbitMQ 连接. `JobQueueConfiguration` 类的构造函数中,还有一些其他的可选参数. - `queueName`: 指定后台作业对应的队列名称(全名). +* `DelayedQueueName`: 指定后台延迟执行的作业对于的队列名称(全名). - `connectionName`: 后台作业对应的 RabbitMQ 连接名称,默认是 `Default`. - `durable`: 可选参数,默认为 `true`. - `exclusive`: 可选参数,默认为 `false`. - `autoDelete`: 可选参数,默认为 `false`. +* `PrefetchCount` (可选参数, 默认为: null) 如果你想要更多地了解 `durable`,`exclusive`,`autoDelete` 的用法,请阅读 RabbitMQ 提供的文档. diff --git a/docs/zh-Hans/CLI.md b/docs/zh-Hans/CLI.md index f890534795..f108bbcfec 100644 --- a/docs/zh-Hans/CLI.md +++ b/docs/zh-Hans/CLI.md @@ -123,6 +123,7 @@ abp new Acme.BookStore * `module`: [Module template](Startup-Templates/Module.md). 其他选项: * `--no-ui`: 不包含UI.仅创建服务模块(也称为微服务 - 没有UI). * **`console`**: [Console template](Startup-Templates/Console.md). + * **`maui`**: [Maui template](Startup-Templates/MAUI.md). * **`app-nolayers`**: 应用程序单层模板 * `--ui` 或者 `-u`: 指定ui框架.默认`mvc`框架.其他选项: * `mvc`: ASP.NET Core MVC. diff --git a/docs/zh-Hans/Distributed-Event-Bus-RabbitMQ-Integration.md b/docs/zh-Hans/Distributed-Event-Bus-RabbitMQ-Integration.md index 1cd6b5b9dd..f45d4d90bf 100644 --- a/docs/zh-Hans/Distributed-Event-Bus-RabbitMQ-Integration.md +++ b/docs/zh-Hans/Distributed-Event-Bus-RabbitMQ-Integration.md @@ -141,13 +141,14 @@ Configure(options => }); ```` -**示例: 配置客户端和交换机名称** +**示例: 配置客户端,交换机名称和预取数量** ````csharp Configure(options => { options.ClientName = "TestApp1"; options.ExchangeName = "TestMessages"; + options.PrefetchCount = 1; }); ```` diff --git a/docs/zh-Hans/Entities.md b/docs/zh-Hans/Entities.md index 8fbf16ddd3..b9c236e346 100644 --- a/docs/zh-Hans/Entities.md +++ b/docs/zh-Hans/Entities.md @@ -105,6 +105,22 @@ public class UserRole : Entity > 需要注意,复合主键实体不可以使用 `IRepository` 接口,因为它需要一个唯一的Id属性. 但你可以使用 `IRepository`.更多信息请参见[仓储](Repositories.md)的文档. +### EntityEquals + +`Entity.EntityEquals(...)` 方法用于检查两个实体对象是否相等. + +示例: + +```csharp +Book book1 = ... +Book book2 = ... + +if (book1.EntityEquals(book2)) //Check equality +{ + ... +} +``` + ## 聚合根 "*聚合是域驱动设计中的一种模式.DDD的聚合是一组可以作为一个单元处理的域对象.例如,订单及订单系列的商品,这些是独立的对象,但将订单(连同订单系列的商品)视为一个聚合通常是很有用的*"( [查看详细介绍](http://martinfowler.com/bliki/DDD_Aggregate.html)) diff --git a/docs/zh-Hans/Modules/Cms-Kit/Dynamic-Widget.md b/docs/zh-Hans/Modules/Cms-Kit/Dynamic-Widget.md new file mode 100644 index 0000000000..14e861b204 --- /dev/null +++ b/docs/zh-Hans/Modules/Cms-Kit/Dynamic-Widget.md @@ -0,0 +1,47 @@ +# 动态部件 + +CMS kit提供了组件系统在页面和博客文章和生成动态部件. 这是一个在 `Page` 端的示例投票部件截图 + +> 重要提示: 投票部件是ABP Commercial实现的唯一部件 +![cmskit-example-output-on-page](../../images/cmskit-example-output-on-page.png) + +> 你也可以对其他小部件执行相同的操作.这只是一个例子. +要添加部件,你应该去页面或博客创建或更新, 然后单击 `W` 按钮添加一个动态部件, 如下图所示. 不要忘了这是设计模态框,你需要在保存后查看你的页面. 此外 `预览` 选项卡可以轻松的查看部件配置的部件输出. + +![cmskit-add-widget-on-page](../../images/cmskit-add-widget-on-page.png) + +在这张图中, 选择投票后(在其他情况下,它根据你的配置自动改变, 这里是投票组件,它的参数名是 `editorWidgetName`),你看到下一个部件, 输入值或选择值或选择并单击 `添加`. 你将看到以下输出 + +> [Widget Type="Poll" Code="SelectedValue"] +如果编码有任何错误(错误的值或拼写错误)你可以手动修改输出. + +## 选项 + +使添加的部件工作,你必须在模块类中进行配置: + +```csharp +Configure(options => +{ + options.AddWidget("widgetKey", "widgetName", "editorWidgetName"); +}); +``` + +* `widgetKey` 用于最终用户更具有可读性的名称. + [Widget Type="**Poll**" Code="SelectedValue"] +* `widgetName` 用于代码中通过 `[widget]` Attribute使用的小部件名称 + +```csharp +[Widget] +public class WidgetNameViewComponent : AbpViewComponent +{ + public IViewComponentResult Invoke() + { + return View(); + } +} + +``` + +* `editorWidgetName` 用于编辑器组件端,在 `添加部件` 模态框中查看. + +另请参阅[部件](https://docs.abp.io/zh-Hans/abp/latest/UI/AspNetCore/Widgets). \ No newline at end of file diff --git a/docs/zh-Hans/Modules/Cms-Kit/Index.md b/docs/zh-Hans/Modules/Cms-Kit/Index.md index 0751eb0ad0..2409a98156 100644 --- a/docs/zh-Hans/Modules/Cms-Kit/Index.md +++ b/docs/zh-Hans/Modules/Cms-Kit/Index.md @@ -13,6 +13,7 @@ * 提供 [**反应**](Reactions.md) 系统来添加对任何资源的反应 (表情符号) 功能, 如博客文章或评论. * 提供 [**评级**](Ratings.md) 系统来添加对任何资源的评级功能. * 提供 [**菜单**](Menus.md) 系统来动态管理公共菜单. +* 提供 [**动态部件**](Dynamic-Widget.md) 系统在页面和博客文章中创建动态部件. 点击功能以了解和学习如何去使用它. diff --git a/docs/zh-Hans/Modules/Setting-Management.md b/docs/zh-Hans/Modules/Setting-Management.md index c99397e4b4..242553c2c9 100644 --- a/docs/zh-Hans/Modules/Setting-Management.md +++ b/docs/zh-Hans/Modules/Setting-Management.md @@ -87,7 +87,13 @@ namespace Demo ## Setting Management UI. -设置管理模块默认提供了邮件设置页面并且它是可扩展的; 你可以为你的应用程序设置添加设置标签到设置页面. +设置管理模块默认提供了邮件设置页面. + +![EmailSettingUi](../images/setting-management-email-ui.png) + +> 你可以点击发送测试邮件按钮发送一封测试邮件来检查你的邮件设置. + +设置UI是可扩展的; 你可以为你的应用程序设置添加设置标签到设置页面. ### MVC UI diff --git a/docs/zh-Hans/Multi-Tenancy.md b/docs/zh-Hans/Multi-Tenancy.md index 8e92d10673..6db625e7d9 100644 --- a/docs/zh-Hans/Multi-Tenancy.md +++ b/docs/zh-Hans/Multi-Tenancy.md @@ -34,6 +34,22 @@ namespace MyCompany.MyProject > 随着"Multi-tenancy ready"的概念,我们打算开发我们的代码和多租户方法兼容.然后它可以被用于多租户和非多租户的程序中,这取决于最终程序的需求. +### AbpMultiTenancyOptions: 处理不活跃或不存在的租户 + +`MultiTenancyMiddlewareErrorPageBuilder` 或 `AbpMultiTenancyOptions` 用于 处理不活跃或不存在的租户. + +默认情况下会响应错误页面, 你可以根据自己的需要更改它, 比如: 只输出错误日志并继续ASP NET Core的请求管道 + +```csharp +Configure(options => +{ + options.MultiTenancyMiddlewareErrorPageBuilder = async (context, exception) => + { + // Handle the exception. + }; +}); +``` + #### 定义实体 你可以在你的实体中实现 **IMultiTenant** 接口来实现多租户,例如: @@ -306,7 +322,6 @@ Volo.Abp.AspNetCore.MultiTenancy 添加了下面这些租户解析器,从当前W * **CurrentUserTenantResolveContributor**: 如果当前用户已登录,从当前用户的声明中获取租户Id. **出于安全考虑,应该始终将其做为第一个Contributor**. * **QueryStringTenantResolveContributor**: 尝试从query string参数中获取当前租户,默认参数名为"__tenant". -* **FormTenantResolveContributor**: 尝试从form参数中获取当前租户,默认参数名为"__tenant". * **RouteTenantResolveContributor**:尝试从当前路由中获取(URL路径),默认是变量名是"__tenant".所以,如果你的路由中定义了这个变量,就可以从路由中确定当前租户. * **HeaderTenantResolveContributor**: 尝试从HTTP header中获取当前租户,默认的header名称是"__tenant". * **CookieTenantResolveContributor**: 尝试从当前cookie中获取当前租户.默认的Cookie名称是"__tenant". diff --git a/docs/zh-Hans/Object-To-Object-Mapping.md b/docs/zh-Hans/Object-To-Object-Mapping.md index 402acdc4f6..62c1d17add 100644 --- a/docs/zh-Hans/Object-To-Object-Mapping.md +++ b/docs/zh-Hans/Object-To-Object-Mapping.md @@ -12,7 +12,7 @@ public class UserAppService : ApplicationService _userRepository = userRepository; } - public void CreateUser(CreateUserInput input) + public async Task CreateUser(CreateUserInput input) { //Manually creating a User object from the CreateUserInput object var user = new User @@ -23,7 +23,7 @@ public class UserAppService : ApplicationService Password = input.Password }; - _userRepository.Insert(user); + await _userRepository.InsertAsync(user); } } ``` @@ -46,12 +46,12 @@ public class UserAppService : ApplicationService _userRepository = userRepository; } - public void CreateUser(CreateUserInput input) + public async Task CreateUser(CreateUserInput input) { //Automatically creating a new User object using the CreateUserInput object var user = ObjectMapper.Map(input); - _userRepository.Insert(user); + await _userRepository.InsertAsync(user); } } ```` diff --git a/docs/zh-Hans/Tutorials/Part-2.md b/docs/zh-Hans/Tutorials/Part-2.md index 346927acbe..dc8d804d5e 100644 --- a/docs/zh-Hans/Tutorials/Part-2.md +++ b/docs/zh-Hans/Tutorials/Part-2.md @@ -135,15 +135,15 @@ successfully created the book with id: 439b0ea8-923e-8e1e-5d97-39f2c7ac4246 "CreationTime": "Creation time", "AreYouSure": "Are you sure?", "AreYouSureToDelete": "Are you sure you want to delete this item?", - "Enum:BookType:0": "Undefined", - "Enum:BookType:1": "Adventure", - "Enum:BookType:2": "Biography", - "Enum:BookType:3": "Dystopia", - "Enum:BookType:4": "Fantastic", - "Enum:BookType:5": "Horror", - "Enum:BookType:6": "Science", - "Enum:BookType:7": "Science fiction", - "Enum:BookType:8": "Poetry" + "Enum:BookType.Undefined": "Undefined", + "Enum:BookType.Adventure": "Adventure", + "Enum:BookType.Biography": "Biography", + "Enum:BookType.Dystopia": "Dystopia", + "Enum:BookType.Fantastic": "Fantastic", + "Enum:BookType.Horror": "Horror", + "Enum:BookType.Science": "Science", + "Enum:BookType.ScienceFiction": "Science fiction", + "Enum:BookType.Poetry": "Poetry" } } ```` @@ -152,7 +152,7 @@ successfully created the book with id: 439b0ea8-923e-8e1e-5d97-39f2c7ac4246 * 本地化关键字名称是任意的. 你可以设置任何名称. 对于特定的文本类型,我们更喜欢遵循一些约定: * 为按钮项添加 `Menu:` 前缀. - * 使用 `Enum::` 命名约定来本地化枚举成员. 当您这样做时ABP可以在某些适当的情况下自动将枚举本地化. + * 使用 `Enum::` 或 `.` 或 `` 命名约定来本地化枚举成员. 当您这样做时ABP可以在某些适当的情况下自动将枚举本地化. 如果未在本地化文件中定义文本,则文本将**回退**到本地化键(ASP.NET Core的标准行为). @@ -626,7 +626,7 @@ ABP提供了一个通用的基类,`AbpCrudPageBase<...>`,用来创建CRUD风格 Field="@nameof(BookDto.Type)" Caption="@L["Type"]"> - @L[$"Enum:BookType:{(int)context.Type}"] + @L[$"Enum:BookType.{Enum.GetName(context.Type)}"] - @L[$"Enum:BookType:{bookTypeValue}"] + @L[$"Enum:BookType.{Enum.GetName((BookType)bookTypeValue)}"] } @@ -1323,7 +1323,7 @@ delete(id: string) { @foreach (int bookTypeValue in Enum.GetValues(typeof(BookType))) { - @L[$"Enum:BookType:{bookTypeValue}"] + @L[$"Enum:BookType.{Enum.GetName((BookType)bookTypeValue)}"] } @@ -1460,7 +1460,7 @@ namespace Acme.BookStore.Blazor Field="@nameof(BookDto.Type)" Caption="@L["Type"]"> - @L[$"Enum:BookType:{(int) context.Type}"] + @L[$"Enum:BookType.{Enum.GetName(context.Type)}"] - @L[$"Enum:BookType:{bookTypeValue}"] + @L[$"Enum:BookType.{Enum.GetName((BookType)bookTypeValue)}"] } @@ -1565,7 +1565,7 @@ namespace Acme.BookStore.Blazor @foreach (int bookTypeValue in Enum.GetValues(typeof(BookType))) { - @L[$"Enum:BookType:{bookTypeValue}"] + @L[$"Enum:BookType.{Enum.GetName((BookType)bookTypeValue)}"] } diff --git a/docs/zh-Hans/docs-nav.json b/docs/zh-Hans/docs-nav.json index 203000c6c6..be30753fb3 100644 --- a/docs/zh-Hans/docs-nav.json +++ b/docs/zh-Hans/docs-nav.json @@ -61,6 +61,10 @@ { "text": "WPF", "path": "Startup-Templates/WPF.md" + }, + { + "text": "MAUI", + "path": "Startup-Templates/MAUI.md" } ] }, diff --git a/docs/zh-Hans/images/cmskit-add-widget-on-page.png b/docs/zh-Hans/images/cmskit-add-widget-on-page.png new file mode 100644 index 0000000000..8e03964477 Binary files /dev/null and b/docs/zh-Hans/images/cmskit-add-widget-on-page.png differ diff --git a/docs/zh-Hans/images/cmskit-example-output-on-page.png b/docs/zh-Hans/images/cmskit-example-output-on-page.png new file mode 100644 index 0000000000..bdc5c52278 Binary files /dev/null and b/docs/zh-Hans/images/cmskit-example-output-on-page.png differ diff --git a/docs/zh-Hans/images/setting-management-email-ui.png b/docs/zh-Hans/images/setting-management-email-ui.png new file mode 100644 index 0000000000..f8f1270c15 Binary files /dev/null and b/docs/zh-Hans/images/setting-management-email-ui.png differ diff --git a/framework/Volo.Abp.sln b/framework/Volo.Abp.sln index fadd40bcc5..4ce47bdbc8 100644 --- a/framework/Volo.Abp.sln +++ b/framework/Volo.Abp.sln @@ -409,6 +409,18 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.RemoteServices", " EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.AspNetCore.Mvc.PlugIn", "test\Volo.Abp.AspNetCore.Mvc.PlugIn\Volo.Abp.AspNetCore.Mvc.PlugIn.csproj", "{C6D6D878-208A-4FD2-822E-365545D8681B}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Dapr", "src\Volo.Abp.Dapr\Volo.Abp.Dapr.csproj", "{192A829F-D608-4E41-8DE0-058E943E453F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.EventBus.Dapr", "src\Volo.Abp.EventBus.Dapr\Volo.Abp.EventBus.Dapr.csproj", "{DCC41E99-EBC7-4F19-BA0D-A6F770D8E431}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Http.Client.Dapr", "src\Volo.Abp.Http.Client.Dapr\Volo.Abp.Http.Client.Dapr.csproj", "{18B796D2-D45D-41AE-9A42-75C9B14B20DF}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.AspNetCore.Mvc.Dapr", "src\Volo.Abp.AspNetCore.Mvc.Dapr\Volo.Abp.AspNetCore.Mvc.Dapr.csproj", "{5EED625D-8D86-492A-BCB8-F6C8CD8D4AA1}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.AspNetCore.Mvc.Dapr.EventBus", "src\Volo.Abp.AspNetCore.Mvc.Dapr.EventBus\Volo.Abp.AspNetCore.Mvc.Dapr.EventBus.csproj", "{B02EF042-C39E-45C4-A92D-BF7554E1889D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.DistributedLocking.Dapr", "src\Volo.Abp.DistributedLocking.Dapr\Volo.Abp.DistributedLocking.Dapr.csproj", "{CAE48068-233C-47A9-BEAB-DDF521730E7A}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -1219,6 +1231,30 @@ Global {C6D6D878-208A-4FD2-822E-365545D8681B}.Debug|Any CPU.Build.0 = Debug|Any CPU {C6D6D878-208A-4FD2-822E-365545D8681B}.Release|Any CPU.ActiveCfg = Release|Any CPU {C6D6D878-208A-4FD2-822E-365545D8681B}.Release|Any CPU.Build.0 = Release|Any CPU + {192A829F-D608-4E41-8DE0-058E943E453F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {192A829F-D608-4E41-8DE0-058E943E453F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {192A829F-D608-4E41-8DE0-058E943E453F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {192A829F-D608-4E41-8DE0-058E943E453F}.Release|Any CPU.Build.0 = Release|Any CPU + {DCC41E99-EBC7-4F19-BA0D-A6F770D8E431}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DCC41E99-EBC7-4F19-BA0D-A6F770D8E431}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DCC41E99-EBC7-4F19-BA0D-A6F770D8E431}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DCC41E99-EBC7-4F19-BA0D-A6F770D8E431}.Release|Any CPU.Build.0 = Release|Any CPU + {18B796D2-D45D-41AE-9A42-75C9B14B20DF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {18B796D2-D45D-41AE-9A42-75C9B14B20DF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {18B796D2-D45D-41AE-9A42-75C9B14B20DF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {18B796D2-D45D-41AE-9A42-75C9B14B20DF}.Release|Any CPU.Build.0 = Release|Any CPU + {5EED625D-8D86-492A-BCB8-F6C8CD8D4AA1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5EED625D-8D86-492A-BCB8-F6C8CD8D4AA1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5EED625D-8D86-492A-BCB8-F6C8CD8D4AA1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5EED625D-8D86-492A-BCB8-F6C8CD8D4AA1}.Release|Any CPU.Build.0 = Release|Any CPU + {B02EF042-C39E-45C4-A92D-BF7554E1889D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B02EF042-C39E-45C4-A92D-BF7554E1889D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B02EF042-C39E-45C4-A92D-BF7554E1889D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B02EF042-C39E-45C4-A92D-BF7554E1889D}.Release|Any CPU.Build.0 = Release|Any CPU + {CAE48068-233C-47A9-BEAB-DDF521730E7A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CAE48068-233C-47A9-BEAB-DDF521730E7A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CAE48068-233C-47A9-BEAB-DDF521730E7A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CAE48068-233C-47A9-BEAB-DDF521730E7A}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -1425,6 +1461,12 @@ Global {3683340D-92F5-4B14-B77B-34A163333309} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} {EDFFDA74-090D-439C-A58D-06CCF86D4423} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} {C6D6D878-208A-4FD2-822E-365545D8681B} = {447C8A77-E5F0-4538-8687-7383196D04EA} + {192A829F-D608-4E41-8DE0-058E943E453F} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} + {DCC41E99-EBC7-4F19-BA0D-A6F770D8E431} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} + {18B796D2-D45D-41AE-9A42-75C9B14B20DF} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} + {5EED625D-8D86-492A-BCB8-F6C8CD8D4AA1} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} + {B02EF042-C39E-45C4-A92D-BF7554E1889D} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} + {CAE48068-233C-47A9-BEAB-DDF521730E7A} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {BB97ECF4-9A84-433F-A80B-2A3285BDD1D5} diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/AbpDynamicLayoutComponentOptions.cs b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/AbpDynamicLayoutComponentOptions.cs new file mode 100644 index 0000000000..5bba550eff --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/AbpDynamicLayoutComponentOptions.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using JetBrains.Annotations; + +namespace Volo.Abp.AspNetCore.Components.Web.Theming; + +public class AbpDynamicLayoutComponentOptions +{ + /// + /// Used to define components that renders in the layout + /// + [NotNull] + public Dictionary?> Components { get; set; } + + public AbpDynamicLayoutComponentOptions() + { + Components = new Dictionary?>(); + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Components/DynamicLayoutComponent.razor b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Components/DynamicLayoutComponent.razor new file mode 100644 index 0000000000..8354c02889 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Components/DynamicLayoutComponent.razor @@ -0,0 +1,7 @@ +@if (AbpDynamicLayoutComponentOptions.Value.Components.Any()) +{ + foreach (var (componentType, parameters) in AbpDynamicLayoutComponentOptions.Value.Components) + { + + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Components/DynamicLayoutComponent.razor.cs b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Components/DynamicLayoutComponent.razor.cs new file mode 100644 index 0000000000..3c4d68178e --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Components/DynamicLayoutComponent.razor.cs @@ -0,0 +1,10 @@ +using Microsoft.AspNetCore.Components; +using Microsoft.Extensions.Options; + +namespace Volo.Abp.AspNetCore.Components.Web.Theming.Components; + +public partial class DynamicLayoutComponent : ComponentBase +{ + [Inject] + protected IOptions AbpDynamicLayoutComponentOptions { get; set; } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Components/LayoutHooks/LayoutHook.razor b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Components/LayoutHooks/LayoutHook.razor new file mode 100644 index 0000000000..f512232b86 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Components/LayoutHooks/LayoutHook.razor @@ -0,0 +1,7 @@ +@if (LayoutHookViewModel.Hooks.Any()) +{ + foreach (var hook in LayoutHookViewModel.Hooks) + { + + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Components/LayoutHooks/LayoutHook.razor.cs b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Components/LayoutHooks/LayoutHook.razor.cs new file mode 100644 index 0000000000..18fbcd89c2 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Components/LayoutHooks/LayoutHook.razor.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Components; +using Microsoft.Extensions.Options; +using Volo.Abp.Ui.LayoutHooks; + +namespace Volo.Abp.AspNetCore.Components.Web.Theming.Components.LayoutHooks; + +public partial class LayoutHook : ComponentBase +{ + [Parameter] + public string Name { get; set; } + + [Parameter] + public string Layout { get; set; } + + [Inject] + protected IOptions LayoutHookOptions { get; set; } + + protected LayoutHookViewModel LayoutHookViewModel { get; private set; } + + protected override Task OnInitializedAsync() + { + if (LayoutHookOptions.Value.Hooks.TryGetValue(Name, out var layoutHooks)) + { + layoutHooks = layoutHooks + .WhereIf(string.IsNullOrWhiteSpace(Layout), x => x.Layout == Layout) + .ToList(); + } + + layoutHooks ??= new List(); + + LayoutHookViewModel = new LayoutHookViewModel(layoutHooks.ToArray(), Layout); + + return Task.CompletedTask; + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Layout/StandardLayouts.cs b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Layout/StandardLayouts.cs new file mode 100644 index 0000000000..ea73a5673f --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Layout/StandardLayouts.cs @@ -0,0 +1,6 @@ +namespace Volo.Abp.AspNetCore.Components.Web.Theming.Layout; + +public static class StandardLayouts +{ + public const string Application = "Application"; +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/PageToolbars/PageToolbarManager.cs b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/PageToolbars/PageToolbarManager.cs index 05531096d4..00f7f5da23 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/PageToolbars/PageToolbarManager.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/PageToolbars/PageToolbarManager.cs @@ -3,16 +3,17 @@ using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; using Volo.Abp.DependencyInjection; namespace Volo.Abp.AspNetCore.Components.Web.Theming.PageToolbars; public class PageToolbarManager : IPageToolbarManager, ITransientDependency { - protected IHybridServiceScopeFactory ServiceScopeFactory { get; } + protected IServiceScopeFactory ServiceScopeFactory { get; } public PageToolbarManager( - IHybridServiceScopeFactory serviceScopeFactory) + IServiceScopeFactory serviceScopeFactory) { ServiceScopeFactory = serviceScopeFactory; } diff --git a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/AbpAspNetCoreComponentsWebAssemblyModule.cs b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/AbpAspNetCoreComponentsWebAssemblyModule.cs index 33716d8383..229831141e 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/AbpAspNetCoreComponentsWebAssemblyModule.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/AbpAspNetCoreComponentsWebAssemblyModule.cs @@ -7,6 +7,7 @@ using Volo.Abp.AspNetCore.Components.Web; using Volo.Abp.AspNetCore.Components.Web.ExceptionHandling; using Volo.Abp.AspNetCore.Components.Web.Security; using Volo.Abp.AspNetCore.Mvc.Client; +using Volo.Abp.DependencyInjection; using Volo.Abp.Http.Client; using Volo.Abp.Modularity; using Volo.Abp.Threading; @@ -46,8 +47,8 @@ public class AbpAspNetCoreComponentsWebAssemblyModule : AbpModule public async override Task OnApplicationInitializationAsync(ApplicationInitializationContext context) { - await context.ServiceProvider.GetRequiredService().InitializeAsync(); - await context.ServiceProvider.GetRequiredService().InitializeAsync(); + await context.ServiceProvider.GetRequiredService().ServiceProvider.GetRequiredService().InitializeAsync(); + await context.ServiceProvider.GetRequiredService().ServiceProvider.GetRequiredService().InitializeAsync(); await SetCurrentLanguageAsync(context.ServiceProvider); } diff --git a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/AbpAspNetCoreMultiTenancyModule.cs b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/AbpAspNetCoreMultiTenancyModule.cs index ad36cf0f11..e0d8ecd806 100644 --- a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/AbpAspNetCoreMultiTenancyModule.cs +++ b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/AbpAspNetCoreMultiTenancyModule.cs @@ -15,7 +15,6 @@ public class AbpAspNetCoreMultiTenancyModule : AbpModule Configure(options => { options.TenantResolvers.Add(new QueryStringTenantResolveContributor()); - options.TenantResolvers.Add(new FormTenantResolveContributor()); options.TenantResolvers.Add(new RouteTenantResolveContributor()); options.TenantResolvers.Add(new HeaderTenantResolveContributor()); options.TenantResolvers.Add(new CookieTenantResolveContributor()); diff --git a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/AbpAspNetCoreMultiTenancyOptions.cs b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/AbpAspNetCoreMultiTenancyOptions.cs index 4f89ef7b97..aa0f62a699 100644 --- a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/AbpAspNetCoreMultiTenancyOptions.cs +++ b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/AbpAspNetCoreMultiTenancyOptions.cs @@ -3,6 +3,8 @@ using System.Globalization; using System.Net; using System.Threading.Tasks; using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; using Volo.Abp.MultiTenancy; namespace Volo.Abp.AspNetCore.MultiTenancy; @@ -14,13 +16,25 @@ public class AbpAspNetCoreMultiTenancyOptions /// public string TenantKey { get; set; } - public Func MultiTenancyMiddlewareErrorPageBuilder { get; set; } + /// + /// Return true to stop the pipeline, false to continue. + /// + public Func> MultiTenancyMiddlewareErrorPageBuilder { get; set; } public AbpAspNetCoreMultiTenancyOptions() { TenantKey = TenantResolverConsts.DefaultTenantKey; MultiTenancyMiddlewareErrorPageBuilder = async (context, exception) => { + // Try to delete the tenant's cookie if it does not exist or is inactive. + var tenantResolveResult = context.RequestServices.GetRequiredService().Result; + if (tenantResolveResult != null && + tenantResolveResult.AppliedResolvers.Contains(CookieTenantResolveContributor.ContributorName)) + { + var options = context.RequestServices.GetRequiredService>().Value; + AbpMultiTenancyCookieHelper.SetTenantCookie(context, null, options.TenantKey); + } + context.Response.StatusCode = (int)HttpStatusCode.InternalServerError; ; context.Response.ContentType = "text/html"; @@ -31,8 +45,10 @@ public class AbpAspNetCoreMultiTenancyOptions await context.Response.WriteAsync($"

{message}

{details}
\r\n"); await context.Response.WriteAsync("\r\n"); - // Note the 500 spaces are to work around an IE 'feature' - await context.Response.WriteAsync(new string(' ', 500)); + // Note the 500 spaces are to work around an IE 'feature' + await context.Response.WriteAsync(new string(' ', 500)); + + return true; }; } } diff --git a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/FormTenantResolveContributor.cs b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/FormTenantResolveContributor.cs index 67ef0a4c2c..d55343c94c 100644 --- a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/FormTenantResolveContributor.cs +++ b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/FormTenantResolveContributor.cs @@ -1,10 +1,11 @@ -using System.Linq; +using System; using System.Threading.Tasks; using Microsoft.AspNetCore.Http; using Volo.Abp.MultiTenancy; namespace Volo.Abp.AspNetCore.MultiTenancy; +[Obsolete("This may make some features of ASP NET Core unavailable, Will be removed in future versions.")] public class FormTenantResolveContributor : HttpTenantResolveContributorBase { public const string ContributorName = "Form"; diff --git a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/MultiTenancyMiddleware.cs b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/MultiTenancyMiddleware.cs index 9cd89272f4..8fc6a3995c 100644 --- a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/MultiTenancyMiddleware.cs +++ b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/MultiTenancyMiddleware.cs @@ -34,15 +34,17 @@ public class MultiTenancyMiddleware : IMiddleware, ITransientDependency public async Task InvokeAsync(HttpContext context, RequestDelegate next) { - TenantConfiguration tenant; + TenantConfiguration tenant = null; try { tenant = await _tenantConfigurationProvider.GetAsync(saveResolveResult: true); } catch (Exception e) { - await _options.MultiTenancyMiddlewareErrorPageBuilder(context, e); - return; + if (await _options.MultiTenancyMiddlewareErrorPageBuilder(context, e)) + { + return; + } } if (tenant?.Id != _currentTenant.Id) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo/Abp/AspNetCore/Mvc/Client/AbpAspNetCoreMvcClientModule.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo/Abp/AspNetCore/Mvc/Client/AbpAspNetCoreMvcClientModule.cs index 7a9168eefb..ae5421d947 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo/Abp/AspNetCore/Mvc/Client/AbpAspNetCoreMvcClientModule.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo/Abp/AspNetCore/Mvc/Client/AbpAspNetCoreMvcClientModule.cs @@ -1,8 +1,5 @@ -using System.Threading.Tasks; -using Microsoft.Extensions.DependencyInjection; using Volo.Abp.EventBus; using Volo.Abp.Modularity; -using Volo.Abp.Threading; namespace Volo.Abp.AspNetCore.Mvc.Client; @@ -12,13 +9,5 @@ namespace Volo.Abp.AspNetCore.Mvc.Client; )] public class AbpAspNetCoreMvcClientModule : AbpModule { - public override void OnApplicationInitialization(ApplicationInitializationContext context) - { - AsyncHelper.RunSync(() => OnApplicationInitializationAsync(context)); - } - - public async override Task OnApplicationInitializationAsync(ApplicationInitializationContext context) - { - await context.ServiceProvider.GetRequiredService().InitializeAsync(); - } + } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo/Abp/AspNetCore/Mvc/Client/MvcCachedApplicationConfigurationClient.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo/Abp/AspNetCore/Mvc/Client/MvcCachedApplicationConfigurationClient.cs index 59690b2d03..7bb2e67b49 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo/Abp/AspNetCore/Mvc/Client/MvcCachedApplicationConfigurationClient.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo/Abp/AspNetCore/Mvc/Client/MvcCachedApplicationConfigurationClient.cs @@ -30,11 +30,6 @@ public class MvcCachedApplicationConfigurationClient : ICachedApplicationConfigu Cache = cache; } - public async Task InitializeAsync() - { - await GetAsync(); - } - public async Task GetAsync() { var cacheKey = CreateCacheKey(); @@ -45,7 +40,6 @@ public class MvcCachedApplicationConfigurationClient : ICachedApplicationConfigu return configuration; } - configuration = await Cache.GetOrAddAsync( cacheKey, async () => await ApplicationConfigurationAppService.GetAsync(), diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/AbpApplicationConfigurationOptions.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/AbpApplicationConfigurationOptions.cs new file mode 100644 index 0000000000..e4e59bc197 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/AbpApplicationConfigurationOptions.cs @@ -0,0 +1,13 @@ +using System.Collections.Generic; + +namespace Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations; + +public class AbpApplicationConfigurationOptions +{ + public List Contributors { get; } + + public AbpApplicationConfigurationOptions() + { + Contributors = new List(); + } +} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationConfigurationContributorContext.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationConfigurationContributorContext.cs new file mode 100644 index 0000000000..3831cc1618 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationConfigurationContributorContext.cs @@ -0,0 +1,17 @@ +using System; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations; + +public class ApplicationConfigurationContributorContext : IServiceProviderAccessor +{ + public IServiceProvider ServiceProvider { get; } + + public ApplicationConfigurationDto ApplicationConfiguration { get; } + + public ApplicationConfigurationContributorContext(IServiceProvider serviceProvider, ApplicationConfigurationDto applicationConfiguration) + { + ServiceProvider = serviceProvider; + ApplicationConfiguration = applicationConfiguration; + } +} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationConfigurationDto.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationConfigurationDto.cs index eb29c5c7cb..61b5ec18db 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationConfigurationDto.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationConfigurationDto.cs @@ -1,11 +1,12 @@ using System; using Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending; using Volo.Abp.AspNetCore.Mvc.MultiTenancy; +using Volo.Abp.Data; namespace Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations; [Serializable] -public class ApplicationConfigurationDto +public class ApplicationConfigurationDto : IHasExtraProperties { public ApplicationLocalizationConfigurationDto Localization { get; set; } @@ -28,4 +29,6 @@ public class ApplicationConfigurationDto public ClockDto Clock { get; set; } public ObjectExtensionsDto ObjectExtensions { get; set; } + + public ExtraPropertyDictionary ExtraProperties { get; set; } } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationLocalizationConfigurationDto.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationLocalizationConfigurationDto.cs index 0b229235fa..f92c9d7bb9 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationLocalizationConfigurationDto.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationLocalizationConfigurationDto.cs @@ -7,7 +7,6 @@ namespace Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations; [Serializable] public class ApplicationLocalizationConfigurationDto { - //TODO: Rename to Texts? public Dictionary> Values { get; set; } public List Languages { get; set; } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/IApplicationConfigurationContributor.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/IApplicationConfigurationContributor.cs new file mode 100644 index 0000000000..7612ae6fec --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/IApplicationConfigurationContributor.cs @@ -0,0 +1,8 @@ +using System.Threading.Tasks; + +namespace Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations; + +public interface IApplicationConfigurationContributor +{ + Task ContributeAsync(ApplicationConfigurationContributorContext context); +} diff --git a/studio/source-codes/Volo.Abp.BasicTheme.SourceCode/FodyWeavers.xml b/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus/FodyWeavers.xml similarity index 63% rename from studio/source-codes/Volo.Abp.BasicTheme.SourceCode/FodyWeavers.xml rename to framework/src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus/FodyWeavers.xml index 00e1d9a1c1..be0de3a908 100644 --- a/studio/source-codes/Volo.Abp.BasicTheme.SourceCode/FodyWeavers.xml +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus/FodyWeavers.xml @@ -1,3 +1,3 @@  - + \ No newline at end of file diff --git a/studio/source-codes/Volo.Abp.Account.SourceCode/FodyWeavers.xsd b/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus/FodyWeavers.xsd similarity index 100% rename from studio/source-codes/Volo.Abp.Account.SourceCode/FodyWeavers.xsd rename to framework/src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus/FodyWeavers.xsd diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus.csproj b/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus.csproj new file mode 100644 index 0000000000..78b46cad27 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus.csproj @@ -0,0 +1,18 @@ + + + + + + + net6.0 + enable + enable + + + + + + + + + diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus/Volo/Abp/AspNetCore/Mvc/Dapr/EventBus/AbpAspNetCoreMvcDaprEventBusModule.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus/Volo/Abp/AspNetCore/Mvc/Dapr/EventBus/AbpAspNetCoreMvcDaprEventBusModule.cs new file mode 100644 index 0000000000..333a5aae9a --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus/Volo/Abp/AspNetCore/Mvc/Dapr/EventBus/AbpAspNetCoreMvcDaprEventBusModule.cs @@ -0,0 +1,29 @@ +using Microsoft.AspNetCore.Http.Json; +using Volo.Abp.AspNetCore.Mvc.Dapr.EventBus.SystemTextJson; +using Volo.Abp.EventBus.Dapr; +using Volo.Abp.Json.SystemTextJson; +using Volo.Abp.Modularity; + +namespace Volo.Abp.AspNetCore.Mvc.Dapr.EventBus; + +[DependsOn( + typeof(AbpAspNetCoreMvcDaprModule), + typeof(AbpEventBusDaprModule) +)] +public class AbpAspNetCoreMvcDaprEventBusModule : AbpModule +{ + public override void ConfigureServices(ServiceConfigurationContext context) + { + // TODO: Add NewtonsoftJson json converter. + + Configure(options => + { + options.SerializerOptions.Converters.Add(new AbpAspNetCoreMvcDaprSubscriptionDefinitionConverter()); + }); + + Configure(options => + { + options.JsonSerializerOptions.Converters.Add(new AbpAspNetCoreMvcDaprSubscriptionDefinitionConverter()); + }); + } +} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus/Volo/Abp/AspNetCore/Mvc/Dapr/EventBus/AbpAspNetCoreMvcDaprEventBusOptions.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus/Volo/Abp/AspNetCore/Mvc/Dapr/EventBus/AbpAspNetCoreMvcDaprEventBusOptions.cs new file mode 100644 index 0000000000..02ca4c8e22 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus/Volo/Abp/AspNetCore/Mvc/Dapr/EventBus/AbpAspNetCoreMvcDaprEventBusOptions.cs @@ -0,0 +1,11 @@ +namespace Volo.Abp.AspNetCore.Mvc.Dapr.EventBus; + +public class AbpAspNetCoreMvcDaprEventBusOptions +{ + public List Contributors { get; } + + public AbpAspNetCoreMvcDaprEventBusOptions() + { + Contributors = new List(); + } +} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus/Volo/Abp/AspNetCore/Mvc/Dapr/EventBus/AbpAspNetCoreMvcDaprPubSubConsts.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus/Volo/Abp/AspNetCore/Mvc/Dapr/EventBus/AbpAspNetCoreMvcDaprPubSubConsts.cs new file mode 100644 index 0000000000..e785f2e737 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus/Volo/Abp/AspNetCore/Mvc/Dapr/EventBus/AbpAspNetCoreMvcDaprPubSubConsts.cs @@ -0,0 +1,8 @@ +namespace Volo.Abp.AspNetCore.Mvc.Dapr.EventBus; + +public class AbpAspNetCoreMvcDaprPubSubConsts +{ + public const string DaprSubscribeUrl = "dapr/subscribe"; + + public const string DaprEventCallbackUrl = "api/abp/dapr/event"; +} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus/Volo/Abp/AspNetCore/Mvc/Dapr/EventBus/AbpAspNetCoreMvcDaprPubSubProvider.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus/Volo/Abp/AspNetCore/Mvc/Dapr/EventBus/AbpAspNetCoreMvcDaprPubSubProvider.cs new file mode 100644 index 0000000000..e797bd2fc0 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus/Volo/Abp/AspNetCore/Mvc/Dapr/EventBus/AbpAspNetCoreMvcDaprPubSubProvider.cs @@ -0,0 +1,63 @@ +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; +using Volo.Abp.AspNetCore.Mvc.Dapr.EventBus.Models; +using Volo.Abp.DependencyInjection; +using Volo.Abp.EventBus; +using Volo.Abp.EventBus.Dapr; +using Volo.Abp.EventBus.Distributed; + +namespace Volo.Abp.AspNetCore.Mvc.Dapr.EventBus; + +public class AbpAspNetCoreMvcDaprPubSubProvider : ITransientDependency +{ + protected IServiceProvider ServiceProvider { get; } + protected AbpAspNetCoreMvcDaprEventBusOptions AspNetCoreMvcDaprEventBusOptions { get; } + protected AbpDaprEventBusOptions DaprEventBusOptions { get; } + protected AbpDistributedEventBusOptions DistributedEventBusOptions { get; } + + public AbpAspNetCoreMvcDaprPubSubProvider( + IServiceProvider serviceProvider, + IOptions aspNetCoreDaprEventBusOptions, + IOptions daprEventBusOptions, + IOptions distributedEventBusOptions) + { + ServiceProvider = serviceProvider; + AspNetCoreMvcDaprEventBusOptions = aspNetCoreDaprEventBusOptions.Value; + DaprEventBusOptions = daprEventBusOptions.Value; + DistributedEventBusOptions = distributedEventBusOptions.Value; + } + + public virtual async Task> GetSubscriptionsAsync() + { + var subscriptions = new List(); + foreach (var handler in DistributedEventBusOptions.Handlers) + { + foreach (var @interface in handler.GetInterfaces().Where(x => x.IsGenericType && x.GetGenericTypeDefinition() == typeof(IDistributedEventHandler<>))) + { + var eventType = @interface.GetGenericArguments()[0]; + var eventName = EventNameAttribute.GetNameOrDefault(eventType); + + subscriptions.Add(new AbpAspNetCoreMvcDaprSubscriptionDefinition() + { + PubSubName = DaprEventBusOptions.PubSubName, + Topic = eventName, + Route = AbpAspNetCoreMvcDaprPubSubConsts.DaprEventCallbackUrl + }); + } + } + + if (AspNetCoreMvcDaprEventBusOptions.Contributors.Any()) + { + using (var scope = ServiceProvider.CreateScope()) + { + var context = new AbpAspNetCoreMvcDaprPubSubProviderContributorContext(scope.ServiceProvider, subscriptions); + foreach (var contributor in AspNetCoreMvcDaprEventBusOptions.Contributors) + { + await contributor.ContributeAsync(context); + } + } + } + + return subscriptions; + } +} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus/Volo/Abp/AspNetCore/Mvc/Dapr/EventBus/AbpAspNetCoreMvcDaprPubSubProviderContributorContext.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus/Volo/Abp/AspNetCore/Mvc/Dapr/EventBus/AbpAspNetCoreMvcDaprPubSubProviderContributorContext.cs new file mode 100644 index 0000000000..564b541dec --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus/Volo/Abp/AspNetCore/Mvc/Dapr/EventBus/AbpAspNetCoreMvcDaprPubSubProviderContributorContext.cs @@ -0,0 +1,16 @@ +using Volo.Abp.AspNetCore.Mvc.Dapr.EventBus.Models; + +namespace Volo.Abp.AspNetCore.Mvc.Dapr.EventBus; + +public class AbpAspNetCoreMvcDaprPubSubProviderContributorContext +{ + public IServiceProvider ServiceProvider { get; } + + public List Subscriptions { get; } + + public AbpAspNetCoreMvcDaprPubSubProviderContributorContext(IServiceProvider serviceProvider, List daprSubscriptionModels) + { + ServiceProvider = serviceProvider; + Subscriptions = daprSubscriptionModels; + } +} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus/Volo/Abp/AspNetCore/Mvc/Dapr/EventBus/Controllers/AbpAspNetCoreMvcDaprPubSubController.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus/Volo/Abp/AspNetCore/Mvc/Dapr/EventBus/Controllers/AbpAspNetCoreMvcDaprPubSubController.cs new file mode 100644 index 0000000000..c97e793b53 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus/Volo/Abp/AspNetCore/Mvc/Dapr/EventBus/Controllers/AbpAspNetCoreMvcDaprPubSubController.cs @@ -0,0 +1,36 @@ +using System.Text.Json; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; +using Volo.Abp.AspNetCore.Mvc.Dapr.EventBus.Models; +using Volo.Abp.Dapr; +using Volo.Abp.EventBus.Dapr; + +namespace Volo.Abp.AspNetCore.Mvc.Dapr.EventBus.Controllers; + +[Area("abp")] +[RemoteService(Name = "abp")] +public class AbpAspNetCoreMvcDaprPubSubController : AbpController +{ + [HttpGet(AbpAspNetCoreMvcDaprPubSubConsts.DaprSubscribeUrl)] + public virtual async Task> SubscribeAsync() + { + return await HttpContext.RequestServices.GetRequiredService().GetSubscriptionsAsync(); + } + + [HttpPost(AbpAspNetCoreMvcDaprPubSubConsts.DaprEventCallbackUrl)] + public virtual async Task EventsAsync() + { + var bodyJsonDocument = await JsonDocument.ParseAsync(HttpContext.Request.Body); + var request = JsonSerializer.Deserialize(bodyJsonDocument.RootElement.GetRawText(), + HttpContext.RequestServices.GetRequiredService>().Value.JsonSerializerOptions); + + var distributedEventBus = HttpContext.RequestServices.GetRequiredService(); + var daprSerializer = HttpContext.RequestServices.GetRequiredService(); + + var eventData = daprSerializer.Deserialize(bodyJsonDocument.RootElement.GetProperty("data").GetRawText(), distributedEventBus.GetEventType(request.Topic)); + await distributedEventBus.TriggerHandlersAsync(distributedEventBus.GetEventType(request.Topic), eventData); + + return Ok(); + } +} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus/Volo/Abp/AspNetCore/Mvc/Dapr/EventBus/IAbpAspNetCoreMvcDaprPubSubProviderContributor.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus/Volo/Abp/AspNetCore/Mvc/Dapr/EventBus/IAbpAspNetCoreMvcDaprPubSubProviderContributor.cs new file mode 100644 index 0000000000..87047cd7ec --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus/Volo/Abp/AspNetCore/Mvc/Dapr/EventBus/IAbpAspNetCoreMvcDaprPubSubProviderContributor.cs @@ -0,0 +1,6 @@ +namespace Volo.Abp.AspNetCore.Mvc.Dapr.EventBus; + +public interface IAbpAspNetCoreMvcDaprPubSubProviderContributor +{ + Task ContributeAsync(AbpAspNetCoreMvcDaprPubSubProviderContributorContext context); +} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus/Volo/Abp/AspNetCore/Mvc/Dapr/EventBus/Models/AbpAspNetCoreMvcDaprSubscriptionDefinition.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus/Volo/Abp/AspNetCore/Mvc/Dapr/EventBus/Models/AbpAspNetCoreMvcDaprSubscriptionDefinition.cs new file mode 100644 index 0000000000..287e78e01a --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus/Volo/Abp/AspNetCore/Mvc/Dapr/EventBus/Models/AbpAspNetCoreMvcDaprSubscriptionDefinition.cs @@ -0,0 +1,10 @@ +namespace Volo.Abp.AspNetCore.Mvc.Dapr.EventBus.Models; + +public class AbpAspNetCoreMvcDaprSubscriptionDefinition +{ + public string PubSubName { get; set; } + + public string Topic { get; set; } + + public string Route { get; set; } +} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus/Volo/Abp/AspNetCore/Mvc/Dapr/EventBus/Models/AbpAspNetCoreMvcDaprSubscriptionRequest.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus/Volo/Abp/AspNetCore/Mvc/Dapr/EventBus/Models/AbpAspNetCoreMvcDaprSubscriptionRequest.cs new file mode 100644 index 0000000000..46c04b5a44 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus/Volo/Abp/AspNetCore/Mvc/Dapr/EventBus/Models/AbpAspNetCoreMvcDaprSubscriptionRequest.cs @@ -0,0 +1,8 @@ +namespace Volo.Abp.AspNetCore.Mvc.Dapr.EventBus.Models; + +public class AbpAspNetCoreMvcDaprSubscriptionRequest +{ + public string PubSubName { get; set; } + + public string Topic { get; set; } +} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus/Volo/Abp/AspNetCore/Mvc/Dapr/EventBus/SystemTextJson/AbpAspNetCoreMvcDaprPubSubJsonNamingPolicy.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus/Volo/Abp/AspNetCore/Mvc/Dapr/EventBus/SystemTextJson/AbpAspNetCoreMvcDaprPubSubJsonNamingPolicy.cs new file mode 100644 index 0000000000..0aa6bd4f7c --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus/Volo/Abp/AspNetCore/Mvc/Dapr/EventBus/SystemTextJson/AbpAspNetCoreMvcDaprPubSubJsonNamingPolicy.cs @@ -0,0 +1,11 @@ +using System.Text.Json; + +namespace Volo.Abp.AspNetCore.Mvc.Dapr.EventBus.SystemTextJson; + +public class AbpAspNetCoreMvcDaprPubSubJsonNamingPolicy : JsonNamingPolicy +{ + public override string ConvertName(string name) + { + return name.ToLower(); + } +} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus/Volo/Abp/AspNetCore/Mvc/Dapr/EventBus/SystemTextJson/AbpAspNetCoreMvcDaprSubscriptionDefinitionConverter.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus/Volo/Abp/AspNetCore/Mvc/Dapr/EventBus/SystemTextJson/AbpAspNetCoreMvcDaprSubscriptionDefinitionConverter.cs new file mode 100644 index 0000000000..fa26d35ca6 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus/Volo/Abp/AspNetCore/Mvc/Dapr/EventBus/SystemTextJson/AbpAspNetCoreMvcDaprSubscriptionDefinitionConverter.cs @@ -0,0 +1,25 @@ +using System.Text.Json; +using System.Text.Json.Serialization; +using Volo.Abp.AspNetCore.Mvc.Dapr.EventBus.Models; + +namespace Volo.Abp.AspNetCore.Mvc.Dapr.EventBus.SystemTextJson; + +public class AbpAspNetCoreMvcDaprSubscriptionDefinitionConverter : JsonConverter +{ + private JsonSerializerOptions _writeJsonSerializerOptions; + + public override AbpAspNetCoreMvcDaprSubscriptionDefinition Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + throw new NotSupportedException(); + } + + public override void Write(Utf8JsonWriter writer, AbpAspNetCoreMvcDaprSubscriptionDefinition value, JsonSerializerOptions options) + { + _writeJsonSerializerOptions ??= JsonSerializerOptionsHelper.Create(new JsonSerializerOptions(options) + { + PropertyNamingPolicy = new AbpAspNetCoreMvcDaprPubSubJsonNamingPolicy() + }, x => x == this); + + JsonSerializer.Serialize(writer, value, _writeJsonSerializerOptions); + } +} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr/FodyWeavers.xml b/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr/FodyWeavers.xml new file mode 100644 index 0000000000..be0de3a908 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/studio/source-codes/Volo.Abp.AuditLogging.SourceCode/FodyWeavers.xsd b/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr/FodyWeavers.xsd similarity index 100% rename from studio/source-codes/Volo.Abp.AuditLogging.SourceCode/FodyWeavers.xsd rename to framework/src/Volo.Abp.AspNetCore.Mvc.Dapr/FodyWeavers.xsd diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr/Volo.Abp.AspNetCore.Mvc.Dapr.csproj b/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr/Volo.Abp.AspNetCore.Mvc.Dapr.csproj new file mode 100644 index 0000000000..d792a30b24 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr/Volo.Abp.AspNetCore.Mvc.Dapr.csproj @@ -0,0 +1,22 @@ + + + + + + + net6.0 + enable + enable + + + + + + + + + + + + + diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr/Volo/Abp/AspNetCore/Mvc/Dapr/AbpAspNetCoreMvcDaprModule.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr/Volo/Abp/AspNetCore/Mvc/Dapr/AbpAspNetCoreMvcDaprModule.cs new file mode 100644 index 0000000000..f8ba3fcfc2 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr/Volo/Abp/AspNetCore/Mvc/Dapr/AbpAspNetCoreMvcDaprModule.cs @@ -0,0 +1,13 @@ +using Volo.Abp.Dapr; +using Volo.Abp.Modularity; + +namespace Volo.Abp.AspNetCore.Mvc.Dapr; + +[DependsOn( + typeof(AbpAspNetCoreMvcModule), + typeof(AbpDaprModule) +)] +public class AbpAspNetCoreMvcDaprModule : AbpModule +{ + +} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Modal/AbpModalSize.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Modal/AbpModalSize.cs index f022dacce5..452a616365 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Modal/AbpModalSize.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Modal/AbpModalSize.cs @@ -5,5 +5,11 @@ public enum AbpModalSize Default, Small, Large, - ExtraLarge + ExtraLarge, + Fullscreen, + FullscreenSmDown, + FullscreenMdDown, + FullscreenLgDown, + FullscreenXlDown, + FullscreenXxlDown } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Modal/AbpModalSizeExtensions.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Modal/AbpModalSizeExtensions.cs index 7b0de7a595..9477783557 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Modal/AbpModalSizeExtensions.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Modal/AbpModalSizeExtensions.cs @@ -14,6 +14,18 @@ public static class AbpModalSizeExtensions return "modal-xl"; case AbpModalSize.Default: return ""; + case AbpModalSize.Fullscreen: + return "modal-fullscreen"; + case AbpModalSize.FullscreenSmDown: + return "modal-fullscreen-sm-down"; + case AbpModalSize.FullscreenMdDown: + return "modal-fullscreen-md-down"; + case AbpModalSize.FullscreenLgDown: + return "modal-fullscreen-lg-down"; + case AbpModalSize.FullscreenXlDown: + return "modal-fullscreen-xl-down"; + case AbpModalSize.FullscreenXxlDown: + return "modal-fullscreen-xxl-down"; default: throw new AbpException($"Unknown {nameof(AbpModalSize)}: {size}"); } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/PageToolbars/PageToolbarManager.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/PageToolbars/PageToolbarManager.cs index b795c62c39..ec27b8087c 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/PageToolbars/PageToolbarManager.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/PageToolbars/PageToolbarManager.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Volo.Abp.DependencyInjection; @@ -10,11 +11,11 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.PageToolbars; public class PageToolbarManager : IPageToolbarManager, ITransientDependency { protected AbpPageToolbarOptions Options { get; } - protected IHybridServiceScopeFactory ServiceScopeFactory { get; } + protected IServiceScopeFactory ServiceScopeFactory { get; } public PageToolbarManager( IOptions options, - IHybridServiceScopeFactory serviceScopeFactory) + IServiceScopeFactory serviceScopeFactory) { Options = options.Value; ServiceScopeFactory = serviceScopeFactory; 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 75d080feda..e524881176 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 @@ -96,21 +96,28 @@ $.validator.defaults.ignore = ''; //TODO: Would be better if we can apply only f }); _$modal.on('shown.bs.modal', function () { - //focuses first element if it's a typeable input. - var $firstVisibleInput = _$modal.find('input:not([type=hidden]):first'); + if (!options.focusElement) { + //focuses first element if it's a typeable input. + var $firstVisibleInput = _$modal.find('input:not([type=hidden]):first'); - _onOpenCallbacks.triggerAll(_publicApi); + _onOpenCallbacks.triggerAll(_publicApi); - if ($firstVisibleInput.hasClass("datepicker")) { - return; //don't pop-up date pickers... - } + if ($firstVisibleInput.hasClass("datepicker")) { + return; //don't pop-up date pickers... + } - var focusableInputs = ["text", "password", "email", "number", "search", "tel", "url"]; - if (!focusableInputs.includes($firstVisibleInput.prop("type"))) { - return; - } + var focusableInputs = ["text", "password", "email", "number", "search", "tel", "url"]; + if (!focusableInputs.includes($firstVisibleInput.prop("type"))) { + return; + } - $firstVisibleInput.focus(); + $firstVisibleInput.focus(); + } else if (typeof options.focusElement === 'function') { + var focusElement = options.focusElement(); + focusElement.focus(); + } else if (typeof options.focusElement === 'string') { + $(options.focusElement).focus(); + } }); var modalClass = abp.modals[options.modalClass]; diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo/Abp/AspNetCore/Mvc/UI/Components/LayoutHook/Default.cshtml b/framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo/Abp/AspNetCore/Mvc/UI/Components/LayoutHook/Default.cshtml index 61e9afbf6e..34536ec373 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo/Abp/AspNetCore/Mvc/UI/Components/LayoutHook/Default.cshtml +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo/Abp/AspNetCore/Mvc/UI/Components/LayoutHook/Default.cshtml @@ -1,5 +1,4 @@ -@using Volo.Abp.AspNetCore.Mvc.UI.Components.LayoutHook -@model LayoutHookViewModel +@model Volo.Abp.Ui.LayoutHooks.LayoutHookViewModel @if (Model.Hooks.Any()) { foreach (var hook in Model.Hooks) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo/Abp/AspNetCore/Mvc/UI/Components/LayoutHook/LayoutHookViewComponent.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo/Abp/AspNetCore/Mvc/UI/Components/LayoutHook/LayoutHookViewComponent.cs index 45eaa2b6a3..5bd18e4c31 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo/Abp/AspNetCore/Mvc/UI/Components/LayoutHook/LayoutHookViewComponent.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo/Abp/AspNetCore/Mvc/UI/Components/LayoutHook/LayoutHookViewComponent.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Options; +using Volo.Abp.Ui.LayoutHooks; namespace Volo.Abp.AspNetCore.Mvc.UI.Components.LayoutHook; diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/AbpApplicationConfigurationAppService.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/AbpApplicationConfigurationAppService.cs index b80a288e81..7bcc0b3cd9 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/AbpApplicationConfigurationAppService.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/AbpApplicationConfigurationAppService.cs @@ -13,6 +13,7 @@ using Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending; using Volo.Abp.AspNetCore.Mvc.MultiTenancy; using Volo.Abp.Authorization; using Volo.Abp.Authorization.Permissions; +using Volo.Abp.Data; using Volo.Abp.Features; using Volo.Abp.GlobalFeatures; using Volo.Abp.Localization; @@ -41,6 +42,7 @@ public class AbpApplicationConfigurationAppService : ApplicationService, IAbpApp private readonly ITimezoneProvider _timezoneProvider; private readonly AbpClockOptions _abpClockOptions; private readonly ICachedObjectExtensionsDtoService _cachedObjectExtensionsDtoService; + private readonly AbpApplicationConfigurationOptions _options; public AbpApplicationConfigurationAppService( IOptions localizationOptions, @@ -58,7 +60,8 @@ public class AbpApplicationConfigurationAppService : ApplicationService, IAbpApp ILanguageProvider languageProvider, ITimezoneProvider timezoneProvider, IOptions abpClockOptions, - ICachedObjectExtensionsDtoService cachedObjectExtensionsDtoService) + ICachedObjectExtensionsDtoService cachedObjectExtensionsDtoService, + IOptions options) { _serviceProvider = serviceProvider; _abpAuthorizationPolicyProvider = abpAuthorizationPolicyProvider; @@ -74,6 +77,7 @@ public class AbpApplicationConfigurationAppService : ApplicationService, IAbpApp _timezoneProvider = timezoneProvider; _abpClockOptions = abpClockOptions.Value; _cachedObjectExtensionsDtoService = cachedObjectExtensionsDtoService; + _options = options.Value; _localizationOptions = localizationOptions.Value; _multiTenancyOptions = multiTenancyOptions.Value; } @@ -96,9 +100,22 @@ public class AbpApplicationConfigurationAppService : ApplicationService, IAbpApp CurrentTenant = GetCurrentTenant(), Timing = await GetTimingConfigAsync(), Clock = GetClockConfig(), - ObjectExtensions = _cachedObjectExtensionsDtoService.Get() + ObjectExtensions = _cachedObjectExtensionsDtoService.Get(), + ExtraProperties = new ExtraPropertyDictionary() }; + if (_options.Contributors.Any()) + { + using (var scope = _serviceProvider.CreateScope()) + { + var context = new ApplicationConfigurationContributorContext(scope.ServiceProvider, result); + foreach (var contributor in _options.Contributors) + { + await contributor.ContributeAsync(context); + } + } + } + Logger.LogDebug("Executed AbpApplicationConfigurationAppService.GetAsync()."); return result; @@ -154,7 +171,8 @@ public class AbpApplicationConfigurationAppService : ApplicationService, IAbpApp foreach (var policyName in policyNames) { - if (await _defaultAuthorizationPolicyProvider.GetPolicyAsync(policyName) == null && _permissionDefinitionManager.GetOrNull(policyName) != null) + if (await _defaultAuthorizationPolicyProvider.GetPolicyAsync(policyName) == null && + await _permissionDefinitionManager.GetOrNullAsync(policyName) != null) { abpPolicyNames.Add(policyName); } @@ -197,9 +215,9 @@ public class AbpApplicationConfigurationAppService : ApplicationService, IAbpApp { var dictionary = new Dictionary(); - var localizer = _serviceProvider.GetRequiredService( + var localizer = (IStringLocalizer) _serviceProvider.GetRequiredService( typeof(IStringLocalizer<>).MakeGenericType(resource.ResourceType) - ) as IStringLocalizer; + ); foreach (var localizedString in localizer.GetAllStrings()) { diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ExceptionHandling/AbpExceptionFilter.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ExceptionHandling/AbpExceptionFilter.cs index 7b5e2aee2e..fdaf0e8ff1 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ExceptionHandling/AbpExceptionFilter.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ExceptionHandling/AbpExceptionFilter.cs @@ -20,7 +20,7 @@ namespace Volo.Abp.AspNetCore.Mvc.ExceptionHandling; public class AbpExceptionFilter : IAsyncExceptionFilter, ITransientDependency { - public async Task OnExceptionAsync(ExceptionContext context) + public virtual async Task OnExceptionAsync(ExceptionContext context) { if (!ShouldHandleException(context)) { diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ExceptionHandling/AbpExceptionPageFilter.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ExceptionHandling/AbpExceptionPageFilter.cs index eb335d6fd9..c60a00bbe9 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ExceptionHandling/AbpExceptionPageFilter.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ExceptionHandling/AbpExceptionPageFilter.cs @@ -25,7 +25,7 @@ public class AbpExceptionPageFilter : IAsyncPageFilter, ITransientDependency return Task.CompletedTask; } - public async Task OnPageHandlerExecutionAsync(PageHandlerExecutingContext context, PageHandlerExecutionDelegate next) + public virtual async Task OnPageHandlerExecutionAsync(PageHandlerExecutingContext context, PageHandlerExecutionDelegate next) { if (context.HandlerMethod == null || !ShouldHandleException(context)) { diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/AbpLanguagesController.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/AbpLanguagesController.cs index b697d1b194..dc44f12124 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/AbpLanguagesController.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/AbpLanguagesController.cs @@ -25,7 +25,7 @@ public class AbpLanguagesController : AbpController { if (!CultureHelper.IsValidCultureCode(culture)) { - throw new AbpException("Unknown language: " + culture + ". It must be a valid culture!"); + throw new AbpException("The selected culture is not valid! Make sure you enter a valid culture code."); } AbpRequestCultureCookieHelper.SetCultureCookie( diff --git a/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/Hosting/AbpHostingEnvironmentExtensions.cs b/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/Hosting/AbpHostingEnvironmentExtensions.cs index a6569d001b..15c1d74ccb 100644 --- a/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/Hosting/AbpHostingEnvironmentExtensions.cs +++ b/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/Hosting/AbpHostingEnvironmentExtensions.cs @@ -9,7 +9,7 @@ public static class AbpHostingEnvironmentExtensions this IWebHostEnvironment env, AbpConfigurationBuilderOptions options = null) { - options = options ?? new AbpConfigurationBuilderOptions(); + options ??= new AbpConfigurationBuilderOptions(); if (options.BasePath.IsNullOrEmpty()) { diff --git a/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/Auditing/AspNetCoreAuditLogContributor.cs b/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/Auditing/AspNetCoreAuditLogContributor.cs index dd9e6cfe62..c0c56053d3 100644 --- a/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/Auditing/AspNetCoreAuditLogContributor.cs +++ b/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/Auditing/AspNetCoreAuditLogContributor.cs @@ -1,11 +1,14 @@ using System; +using System.Linq; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; +using Volo.Abp.AspNetCore.ExceptionHandling; using Volo.Abp.AspNetCore.WebClientInfo; using Volo.Abp.Auditing; using Volo.Abp.DependencyInjection; +using Volo.Abp.ExceptionHandling; namespace Volo.Abp.AspNetCore.Auditing; @@ -57,28 +60,46 @@ public class AspNetCoreAuditLogContributor : AuditLogContributor, ITransientDepe public override void PostContribute(AuditLogContributionContext context) { + if (context.AuditInfo.HttpStatusCode != null) + { + return; + } + var httpContext = context.ServiceProvider.GetRequiredService().HttpContext; if (httpContext == null) { return; } - if (context.AuditInfo.HttpStatusCode == null) + if (context.AuditInfo.Exceptions.Any()) { - context.AuditInfo.HttpStatusCode = httpContext.Response.StatusCode; + var httpExceptionStatusCodeFinder = context.ServiceProvider.GetRequiredService(); + foreach (var auditInfoException in context.AuditInfo.Exceptions) + { + var statusCode = httpExceptionStatusCodeFinder.GetStatusCode(httpContext, auditInfoException); + context.AuditInfo.HttpStatusCode = (int) statusCode; + } + + if (context.AuditInfo.HttpStatusCode != null) + { + return; + } } + + context.AuditInfo.HttpStatusCode = httpContext.Response.StatusCode; } protected virtual string BuildUrl(HttpContext httpContext) { //TODO: Add options to include/exclude query, schema and host - var uriBuilder = new UriBuilder(); - - uriBuilder.Scheme = httpContext.Request.Scheme; - uriBuilder.Host = httpContext.Request.Host.Host; - uriBuilder.Path = httpContext.Request.Path.ToString(); - uriBuilder.Query = httpContext.Request.QueryString.ToString(); + var uriBuilder = new UriBuilder + { + Scheme = httpContext.Request.Scheme, + Host = httpContext.Request.Host.Host, + Path = httpContext.Request.Path.ToString(), + Query = httpContext.Request.QueryString.ToString() + }; return uriBuilder.Uri.AbsolutePath; } diff --git a/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/DependencyInjection/HttpContextServiceScopeFactory.cs b/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/DependencyInjection/HttpContextServiceScopeFactory.cs deleted file mode 100644 index a7f00f7451..0000000000 --- a/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/DependencyInjection/HttpContextServiceScopeFactory.cs +++ /dev/null @@ -1,52 +0,0 @@ -using System; -using Microsoft.AspNetCore.Http; -using Microsoft.Extensions.DependencyInjection; -using Volo.Abp.DependencyInjection; - -namespace Volo.Abp.AspNetCore.DependencyInjection; - -[ExposeServices( - typeof(IHybridServiceScopeFactory), - typeof(HttpContextServiceScopeFactory) - )] -[Dependency(ReplaceServices = true)] -public class HttpContextServiceScopeFactory : IHybridServiceScopeFactory, ITransientDependency -{ - protected IHttpContextAccessor HttpContextAccessor { get; } - - protected IServiceScopeFactory ServiceScopeFactory { get; } - - public HttpContextServiceScopeFactory( - IHttpContextAccessor httpContextAccessor, - IServiceScopeFactory serviceScopeFactory) - { - HttpContextAccessor = httpContextAccessor; - ServiceScopeFactory = serviceScopeFactory; - } - - public virtual IServiceScope CreateScope() - { - var httpContext = HttpContextAccessor.HttpContext; - if (httpContext == null) - { - return ServiceScopeFactory.CreateScope(); - } - - return new NonDisposedHttpContextServiceScope(httpContext.RequestServices); - } - - protected class NonDisposedHttpContextServiceScope : IServiceScope - { - public IServiceProvider ServiceProvider { get; } - - public NonDisposedHttpContextServiceScope(IServiceProvider serviceProvider) - { - ServiceProvider = serviceProvider; - } - - public void Dispose() - { - - } - } -} diff --git a/framework/src/Volo.Abp.Auditing.Contracts/Volo/Abp/Auditing/IDeletionAuditedObject.cs b/framework/src/Volo.Abp.Auditing.Contracts/Volo/Abp/Auditing/IDeletionAuditedObject.cs index be59ea0431..a7be0c29a1 100644 --- a/framework/src/Volo.Abp.Auditing.Contracts/Volo/Abp/Auditing/IDeletionAuditedObject.cs +++ b/framework/src/Volo.Abp.Auditing.Contracts/Volo/Abp/Auditing/IDeletionAuditedObject.cs @@ -10,7 +10,7 @@ public interface IDeletionAuditedObject : IHasDeletionTime /// /// Id of the deleter user. /// - Guid? DeleterId { get; set; } + Guid? DeleterId { get; } } /// @@ -22,5 +22,5 @@ public interface IDeletionAuditedObject : IDeletionAuditedObject /// /// Reference to the deleter user. /// - TUser Deleter { get; set; } + TUser Deleter { get; } } diff --git a/framework/src/Volo.Abp.Auditing.Contracts/Volo/Abp/Auditing/IHasDeletionTime.cs b/framework/src/Volo.Abp.Auditing.Contracts/Volo/Abp/Auditing/IHasDeletionTime.cs index a84fc78c41..ef45b1b057 100644 --- a/framework/src/Volo.Abp.Auditing.Contracts/Volo/Abp/Auditing/IHasDeletionTime.cs +++ b/framework/src/Volo.Abp.Auditing.Contracts/Volo/Abp/Auditing/IHasDeletionTime.cs @@ -11,5 +11,5 @@ public interface IHasDeletionTime : ISoftDelete /// /// Deletion time. /// - DateTime? DeletionTime { get; set; } + DateTime? DeletionTime { get; } } diff --git a/framework/src/Volo.Abp.Auditing.Contracts/Volo/Abp/Auditing/IHasModificationTime.cs b/framework/src/Volo.Abp.Auditing.Contracts/Volo/Abp/Auditing/IHasModificationTime.cs index b7b7494081..001d07d617 100644 --- a/framework/src/Volo.Abp.Auditing.Contracts/Volo/Abp/Auditing/IHasModificationTime.cs +++ b/framework/src/Volo.Abp.Auditing.Contracts/Volo/Abp/Auditing/IHasModificationTime.cs @@ -10,5 +10,5 @@ public interface IHasModificationTime /// /// The last modified time for this entity. /// - DateTime? LastModificationTime { get; set; } + DateTime? LastModificationTime { get; } } diff --git a/framework/src/Volo.Abp.Auditing.Contracts/Volo/Abp/Auditing/IModificationAuditedObject.cs b/framework/src/Volo.Abp.Auditing.Contracts/Volo/Abp/Auditing/IModificationAuditedObject.cs index 5ba4fd1e02..48f26b6299 100644 --- a/framework/src/Volo.Abp.Auditing.Contracts/Volo/Abp/Auditing/IModificationAuditedObject.cs +++ b/framework/src/Volo.Abp.Auditing.Contracts/Volo/Abp/Auditing/IModificationAuditedObject.cs @@ -10,7 +10,7 @@ public interface IModificationAuditedObject : IHasModificationTime /// /// Last modifier user for this entity. /// - Guid? LastModifierId { get; set; } + Guid? LastModifierId { get; } } /// @@ -22,5 +22,5 @@ public interface IModificationAuditedObject : IModificationAuditedObject /// /// Reference to the last modifier user of this entity. /// - TUser LastModifier { get; set; } + TUser LastModifier { get; } } diff --git a/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AbpAuditingModule.cs b/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AbpAuditingModule.cs index bb3f104ce4..b6527f10c8 100644 --- a/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AbpAuditingModule.cs +++ b/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AbpAuditingModule.cs @@ -1,4 +1,6 @@ -using Microsoft.Extensions.DependencyInjection; +using System; +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; using Volo.Abp.Data; using Volo.Abp.Json; using Volo.Abp.Modularity; @@ -24,4 +26,17 @@ public class AbpAuditingModule : AbpModule { context.Services.OnRegistred(AuditingInterceptorRegistrar.RegisterIfNeeded); } + + public override void ConfigureServices(ServiceConfigurationContext context) + { + var applicationName = context.Services.GetApplicationName(); + + if (!applicationName.IsNullOrEmpty()) + { + Configure(options => + { + options.ApplicationName = applicationName; + }); + } + } } diff --git a/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditPropertySetter.cs b/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditPropertySetter.cs index d85bad82eb..16632420d7 100644 --- a/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditPropertySetter.cs +++ b/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditPropertySetter.cs @@ -99,7 +99,7 @@ public class AuditPropertySetter : IAuditPropertySetter, ITransientDependency { if (targetObject is IHasModificationTime objectWithModificationTime) { - objectWithModificationTime.LastModificationTime = Clock.Now; + ObjectHelper.TrySetProperty(objectWithModificationTime, x => x.LastModificationTime, () => Clock.Now); } } @@ -112,7 +112,7 @@ public class AuditPropertySetter : IAuditPropertySetter, ITransientDependency if (!CurrentUser.Id.HasValue) { - modificationAuditedObject.LastModifierId = null; + ObjectHelper.TrySetProperty(modificationAuditedObject, x => x.LastModifierId, () => null); return; } @@ -120,7 +120,7 @@ public class AuditPropertySetter : IAuditPropertySetter, ITransientDependency { if (multiTenantEntity.TenantId != CurrentUser.TenantId) { - modificationAuditedObject.LastModifierId = null; + ObjectHelper.TrySetProperty(modificationAuditedObject, x => x.LastModifierId, () => null); return; } } @@ -134,7 +134,7 @@ public class AuditPropertySetter : IAuditPropertySetter, ITransientDependency } */ - modificationAuditedObject.LastModifierId = CurrentUser.Id; + ObjectHelper.TrySetProperty(modificationAuditedObject, x => x.LastModifierId, () => CurrentUser.Id); } protected virtual void SetDeletionTime(object targetObject) @@ -143,7 +143,7 @@ public class AuditPropertySetter : IAuditPropertySetter, ITransientDependency { if (objectWithDeletionTime.DeletionTime == null) { - objectWithDeletionTime.DeletionTime = Clock.Now; + ObjectHelper.TrySetProperty(objectWithDeletionTime, x => x.DeletionTime, () => Clock.Now); } } } @@ -162,7 +162,7 @@ public class AuditPropertySetter : IAuditPropertySetter, ITransientDependency if (!CurrentUser.Id.HasValue) { - deletionAuditedObject.DeleterId = null; + ObjectHelper.TrySetProperty(deletionAuditedObject, x => x.DeleterId, () => null); return; } @@ -170,11 +170,11 @@ public class AuditPropertySetter : IAuditPropertySetter, ITransientDependency { if (multiTenantEntity.TenantId != CurrentUser.TenantId) { - deletionAuditedObject.DeleterId = null; + ObjectHelper.TrySetProperty(deletionAuditedObject, x => x.DeleterId, () => null); return; } } - deletionAuditedObject.DeleterId = CurrentUser.Id; + ObjectHelper.TrySetProperty(deletionAuditedObject, x => x.DeleterId, () => CurrentUser.Id); } } diff --git a/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/ICanAddChildPermission.cs b/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/ICanAddChildPermission.cs new file mode 100644 index 0000000000..57a224699f --- /dev/null +++ b/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/ICanAddChildPermission.cs @@ -0,0 +1,14 @@ +using JetBrains.Annotations; +using Volo.Abp.Localization; +using Volo.Abp.MultiTenancy; + +namespace Volo.Abp.Authorization.Permissions; + +public interface ICanAddChildPermission +{ + PermissionDefinition AddPermission( + [NotNull] string name, + ILocalizableString displayName = null, + MultiTenancySides multiTenancySide = MultiTenancySides.Both, + bool isEnabled = true); +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/IPermissionDefinitionContext.cs b/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/IPermissionDefinitionContext.cs index 6d1f9a31fd..411b030b6a 100644 --- a/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/IPermissionDefinitionContext.cs +++ b/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/IPermissionDefinitionContext.cs @@ -37,8 +37,7 @@ public interface IPermissionDefinitionContext /// PermissionGroupDefinition AddGroup( [NotNull] string name, - ILocalizableString displayName = null, - MultiTenancySides multiTenancySide = MultiTenancySides.Both); + ILocalizableString displayName = null); /// /// Tries to remove a permission group. diff --git a/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/IPermissionDefinitionManager.cs b/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/IPermissionDefinitionManager.cs index 553148671c..b4628a15bc 100644 --- a/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/IPermissionDefinitionManager.cs +++ b/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/IPermissionDefinitionManager.cs @@ -1,17 +1,18 @@ using System.Collections.Generic; +using System.Threading.Tasks; using JetBrains.Annotations; namespace Volo.Abp.Authorization.Permissions; public interface IPermissionDefinitionManager { - [NotNull] - PermissionDefinition Get([NotNull] string name); + [ItemNotNull] + Task GetAsync([NotNull] string name); - [CanBeNull] - PermissionDefinition GetOrNull([NotNull] string name); + [ItemCanBeNull] + Task GetOrNullAsync([NotNull] string name); - IReadOnlyList GetPermissions(); + Task> GetPermissionsAsync(); - IReadOnlyList GetGroups(); + Task> GetGroupsAsync(); } diff --git a/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/PermissionDefinition.cs b/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/PermissionDefinition.cs index b477c6c11e..fb6f07690c 100644 --- a/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/PermissionDefinition.cs +++ b/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/PermissionDefinition.cs @@ -7,7 +7,9 @@ using Volo.Abp.SimpleStateChecking; namespace Volo.Abp.Authorization.Permissions; -public class PermissionDefinition : IHasSimpleStateCheckers +public class PermissionDefinition : + IHasSimpleStateCheckers, + ICanAddChildPermission { /// /// Unique name of the permission. @@ -30,7 +32,7 @@ public class PermissionDefinition : IHasSimpleStateCheckers - public List Providers { get; } //TODO: Rename to AllowedProviders? + public List Providers { get; } public List> StateCheckers { get; } @@ -110,6 +112,16 @@ public class PermissionDefinition : IHasSimpleStateCheckers /// Sets a property in the dictionary. @@ -122,14 +134,14 @@ public class PermissionDefinition : IHasSimpleStateCheckers - /// Set the property. + /// Adds one or more providers to the list. /// This is a shortcut for nested calls on this object. /// public virtual PermissionDefinition WithProviders(params string[] providers) { if (!providers.IsNullOrEmpty()) { - Providers.AddRange(providers); + Providers.AddIfNotContains(providers); } return this; diff --git a/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/PermissionDefinitionContext.cs b/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/PermissionDefinitionContext.cs index 7a10fe4b5e..5b5543e868 100644 --- a/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/PermissionDefinitionContext.cs +++ b/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/PermissionDefinitionContext.cs @@ -20,8 +20,7 @@ public class PermissionDefinitionContext : IPermissionDefinitionContext public virtual PermissionGroupDefinition AddGroup( string name, - ILocalizableString displayName = null, - MultiTenancySides multiTenancySide = MultiTenancySides.Both) + ILocalizableString displayName = null) { Check.NotNull(name, nameof(name)); @@ -30,7 +29,7 @@ public class PermissionDefinitionContext : IPermissionDefinitionContext throw new AbpException($"There is already an existing permission group with name: {name}"); } - return Groups[name] = new PermissionGroupDefinition(name, displayName, multiTenancySide); + return Groups[name] = new PermissionGroupDefinition(name, displayName); } [NotNull] diff --git a/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/PermissionGroupDefinition.cs b/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/PermissionGroupDefinition.cs index d2efedc0d9..9fd904f54c 100644 --- a/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/PermissionGroupDefinition.cs +++ b/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/PermissionGroupDefinition.cs @@ -6,7 +6,7 @@ using Volo.Abp.MultiTenancy; namespace Volo.Abp.Authorization.Permissions; -public class PermissionGroupDefinition //TODO: Consider to make possible a group have sub groups +public class PermissionGroupDefinition : ICanAddChildPermission { /// /// Unique name of the group. @@ -21,12 +21,6 @@ public class PermissionGroupDefinition //TODO: Consider to make possible a group } private ILocalizableString _displayName; - /// - /// MultiTenancy side. - /// Default: - /// - public MultiTenancySides MultiTenancySide { get; set; } - public IReadOnlyList Permissions => _permissions.ToImmutableList(); private readonly List _permissions; @@ -45,19 +39,17 @@ public class PermissionGroupDefinition //TODO: Consider to make possible a group protected internal PermissionGroupDefinition( string name, - ILocalizableString displayName = null, - MultiTenancySides multiTenancySide = MultiTenancySides.Both) + ILocalizableString displayName = null) { Name = name; DisplayName = displayName ?? new FixedLocalizableString(Name); - MultiTenancySide = multiTenancySide; Properties = new Dictionary(); _permissions = new List(); } public virtual PermissionDefinition AddPermission( - string name, + [NotNull] string name, ILocalizableString displayName = null, MultiTenancySides multiTenancySide = MultiTenancySides.Both, bool isEnabled = true) diff --git a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/AbpAuthorizationPolicyProvider.cs b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/AbpAuthorizationPolicyProvider.cs index 01037f3e96..fb37427c48 100644 --- a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/AbpAuthorizationPolicyProvider.cs +++ b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/AbpAuthorizationPolicyProvider.cs @@ -31,7 +31,7 @@ public class AbpAuthorizationPolicyProvider : DefaultAuthorizationPolicyProvider return policy; } - var permission = _permissionDefinitionManager.GetOrNull(policyName); + var permission = await _permissionDefinitionManager.GetOrNullAsync(policyName); if (permission != null) { //TODO: Optimize & Cache! @@ -43,16 +43,14 @@ public class AbpAuthorizationPolicyProvider : DefaultAuthorizationPolicyProvider return null; } - public Task> GetPoliciesNamesAsync() + public async Task> GetPoliciesNamesAsync() { - return Task.FromResult( - _options.GetPoliciesNames() - .Union( - _permissionDefinitionManager - .GetPermissions() - .Select(p => p.Name) - ) - .ToList() - ); + return _options.GetPoliciesNames() + .Union( + (await _permissionDefinitionManager + .GetPermissionsAsync()) + .Select(p => p.Name) + ) + .ToList(); } } diff --git a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/AuthenticatedSimpleStateCheckerSerializerContributor.cs b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/AuthenticatedSimpleStateCheckerSerializerContributor.cs new file mode 100644 index 0000000000..2a23b5bfcd --- /dev/null +++ b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/AuthenticatedSimpleStateCheckerSerializerContributor.cs @@ -0,0 +1,38 @@ +using System.Text.Json.Nodes; +using Volo.Abp.DependencyInjection; +using Volo.Abp.SimpleStateChecking; + +namespace Volo.Abp.Authorization.Permissions; + +public class AuthenticatedSimpleStateCheckerSerializerContributor : + ISimpleStateCheckerSerializerContributor, + ISingletonDependency +{ + public const string CheckerShortName = "A"; + + public string SerializeToJson(ISimpleStateChecker checker) + where TState : IHasSimpleStateCheckers + { + if (checker is not RequireAuthenticatedSimpleStateChecker) + { + return null; + } + + var jsonObject = new JsonObject { + ["T"] = CheckerShortName + }; + + return jsonObject.ToJsonString(); + } + + public ISimpleStateChecker Deserialize(JsonObject jsonObject, TState state) + where TState : IHasSimpleStateCheckers + { + if (jsonObject["T"]?.ToString() != CheckerShortName) + { + return null; + } + + return new RequireAuthenticatedSimpleStateChecker(); + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/IDynamicPermissionDefinitionStore.cs b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/IDynamicPermissionDefinitionStore.cs new file mode 100644 index 0000000000..ad74dae46b --- /dev/null +++ b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/IDynamicPermissionDefinitionStore.cs @@ -0,0 +1,13 @@ +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace Volo.Abp.Authorization.Permissions; + +public interface IDynamicPermissionDefinitionStore +{ + Task GetOrNullAsync(string name); + + Task> GetPermissionsAsync(); + + Task> GetGroupsAsync(); +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/IStaticPermissionDefinitionStore.cs b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/IStaticPermissionDefinitionStore.cs new file mode 100644 index 0000000000..719412e4db --- /dev/null +++ b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/IStaticPermissionDefinitionStore.cs @@ -0,0 +1,13 @@ +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace Volo.Abp.Authorization.Permissions; + +public interface IStaticPermissionDefinitionStore +{ + Task GetOrNullAsync(string name); + + Task> GetPermissionsAsync(); + + Task> GetGroupsAsync(); +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/NullDynamicPermissionDefinitionStore.cs b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/NullDynamicPermissionDefinitionStore.cs new file mode 100644 index 0000000000..61e70b057c --- /dev/null +++ b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/NullDynamicPermissionDefinitionStore.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.Authorization.Permissions; + +public class NullDynamicPermissionDefinitionStore : IDynamicPermissionDefinitionStore, ISingletonDependency +{ + private readonly static Task CachedPermissionResult = Task.FromResult((PermissionDefinition)null); + + private readonly static Task> CachedPermissionsResult = + Task.FromResult((IReadOnlyList)Array.Empty().ToImmutableList()); + + private readonly static Task> CachedGroupsResult = + Task.FromResult((IReadOnlyList)Array.Empty().ToImmutableList()); + + public Task GetOrNullAsync(string name) + { + return CachedPermissionResult; + } + + public Task> GetPermissionsAsync() + { + return CachedPermissionsResult; + } + + public Task> GetGroupsAsync() + { + return CachedGroupsResult; + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/PermissionChecker.cs b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/PermissionChecker.cs index fec8771afa..168eb3064b 100644 --- a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/PermissionChecker.cs +++ b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/PermissionChecker.cs @@ -43,8 +43,12 @@ public class PermissionChecker : IPermissionChecker, ITransientDependency { Check.NotNull(name, nameof(name)); - var permission = PermissionDefinitionManager.Get(name); - + var permission = await PermissionDefinitionManager.GetOrNullAsync(name); + if (permission == null) + { + return false; + } + if (!permission.IsEnabled) { return false; @@ -97,18 +101,24 @@ public class PermissionChecker : IPermissionChecker, ITransientDependency { Check.NotNull(names, nameof(names)); - var multiTenancySide = claimsPrincipal?.GetMultiTenancySide() ?? CurrentTenant.GetMultiTenancySide(); - var result = new MultiplePermissionGrantResult(); if (!names.Any()) { return result; } + var multiTenancySide = claimsPrincipal?.GetMultiTenancySide() ?? + CurrentTenant.GetMultiTenancySide(); + var permissionDefinitions = new List(); foreach (var name in names) { - var permission = PermissionDefinitionManager.Get(name); + var permission = await PermissionDefinitionManager.GetOrNullAsync(name); + if (permission == null) + { + result.Result.Add(name, PermissionGrantResult.Prohibited); + continue; + } result.Result.Add(name, PermissionGrantResult.Undefined); diff --git a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/PermissionDefinitionManager.cs b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/PermissionDefinitionManager.cs index 7f4de3c767..de24ff59c5 100644 --- a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/PermissionDefinitionManager.cs +++ b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/PermissionDefinitionManager.cs @@ -1,47 +1,27 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.Collections.Immutable; using System.Linq; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Options; +using System.Threading.Tasks; using Volo.Abp.DependencyInjection; namespace Volo.Abp.Authorization.Permissions; -public class PermissionDefinitionManager : IPermissionDefinitionManager, ISingletonDependency +public class PermissionDefinitionManager : IPermissionDefinitionManager, ITransientDependency { - protected IDictionary PermissionGroupDefinitions => _lazyPermissionGroupDefinitions.Value; - private readonly Lazy> _lazyPermissionGroupDefinitions; - - protected IDictionary PermissionDefinitions => _lazyPermissionDefinitions.Value; - private readonly Lazy> _lazyPermissionDefinitions; - - protected AbpPermissionOptions Options { get; } - - private readonly IServiceProvider _serviceProvider; + private readonly IStaticPermissionDefinitionStore _staticStore; + private readonly IDynamicPermissionDefinitionStore _dynamicStore; public PermissionDefinitionManager( - IOptions options, - IServiceProvider serviceProvider) + IStaticPermissionDefinitionStore staticStore, + IDynamicPermissionDefinitionStore dynamicStore) { - _serviceProvider = serviceProvider; - Options = options.Value; - - _lazyPermissionDefinitions = new Lazy>( - CreatePermissionDefinitions, - isThreadSafe: true - ); - - _lazyPermissionGroupDefinitions = new Lazy>( - CreatePermissionGroupDefinitions, - isThreadSafe: true - ); + _staticStore = staticStore; + _dynamicStore = dynamicStore; } - public virtual PermissionDefinition Get(string name) + public virtual async Task GetAsync(string name) { - var permission = GetOrNull(name); - + var permission = await GetOrNullAsync(name); if (permission == null) { throw new AbpException("Undefined permission: " + name); @@ -50,82 +30,41 @@ public class PermissionDefinitionManager : IPermissionDefinitionManager, ISingle return permission; } - public virtual PermissionDefinition GetOrNull(string name) + public virtual async Task GetOrNullAsync(string name) { Check.NotNull(name, nameof(name)); - return PermissionDefinitions.GetOrDefault(name); - } - - public virtual IReadOnlyList GetPermissions() - { - return PermissionDefinitions.Values.ToImmutableList(); - } - - public IReadOnlyList GetGroups() - { - return PermissionGroupDefinitions.Values.ToImmutableList(); - } - - protected virtual Dictionary CreatePermissionDefinitions() - { - var permissions = new Dictionary(); - - foreach (var groupDefinition in PermissionGroupDefinitions.Values) - { - foreach (var permission in groupDefinition.Permissions) - { - AddPermissionToDictionaryRecursively(permissions, permission); - } - } - - return permissions; + return await _staticStore.GetOrNullAsync(name) ?? + await _dynamicStore.GetOrNullAsync(name); } - protected virtual void AddPermissionToDictionaryRecursively( - Dictionary permissions, - PermissionDefinition permission) + public virtual async Task> GetPermissionsAsync() { - if (permissions.ContainsKey(permission.Name)) - { - throw new AbpException("Duplicate permission name: " + permission.Name); - } - - permissions[permission.Name] = permission; - - foreach (var child in permission.Children) - { - AddPermissionToDictionaryRecursively(permissions, child); - } + var staticPermissions = await _staticStore.GetPermissionsAsync(); + var staticPermissionNames = staticPermissions + .Select(p => p.Name) + .ToImmutableHashSet(); + + var dynamicPermissions = await _dynamicStore.GetPermissionsAsync(); + + /* We prefer static permissions over dynamics */ + return staticPermissions.Concat( + dynamicPermissions.Where(d => !staticPermissionNames.Contains(d.Name)) + ).ToImmutableList(); } - protected virtual Dictionary CreatePermissionGroupDefinitions() + public async Task> GetGroupsAsync() { - using (var scope = _serviceProvider.CreateScope()) - { - var context = new PermissionDefinitionContext(scope.ServiceProvider); - - var providers = Options - .DefinitionProviders - .Select(p => scope.ServiceProvider.GetRequiredService(p) as IPermissionDefinitionProvider) - .ToList(); - - foreach (var provider in providers) - { - provider.PreDefine(context); - } - - foreach (var provider in providers) - { - provider.Define(context); - } - - foreach (var provider in providers) - { - provider.PostDefine(context); - } - - return context.Groups; - } + var staticGroups = await _staticStore.GetGroupsAsync(); + var staticGroupNames = staticGroups + .Select(p => p.Name) + .ToImmutableHashSet(); + + var dynamicGroups = await _dynamicStore.GetGroupsAsync(); + + /* We prefer static groups over dynamics */ + return staticGroups.Concat( + dynamicGroups.Where(d => !staticGroupNames.Contains(d.Name)) + ).ToImmutableList(); } -} +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/PermissionsSimpleStateCheckerSerializerContributor.cs b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/PermissionsSimpleStateCheckerSerializerContributor.cs new file mode 100644 index 0000000000..3b890797f6 --- /dev/null +++ b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/PermissionsSimpleStateCheckerSerializerContributor.cs @@ -0,0 +1,62 @@ +using System.Linq; +using System.Text.Json.Nodes; +using Volo.Abp.Authorization.Permissions; +using Volo.Abp.DependencyInjection; +using Volo.Abp.SimpleStateChecking; + +namespace Volo.Abp.GlobalFeatures; + +public class PermissionsSimpleStateCheckerSerializerContributor : + ISimpleStateCheckerSerializerContributor, + ISingletonDependency +{ + public const string CheckerShortName = "P"; + + public string SerializeToJson(ISimpleStateChecker checker) + where TState : IHasSimpleStateCheckers + { + if (checker is not RequirePermissionsSimpleStateChecker permissionsSimpleStateChecker) + { + return null; + } + + var jsonObject = new JsonObject { + ["T"] = CheckerShortName, + ["A"] = permissionsSimpleStateChecker.RequiresAll + }; + + var nameArray = new JsonArray(); + foreach (var permissionName in permissionsSimpleStateChecker.PermissionNames) + { + nameArray.Add(permissionName); + } + + jsonObject["N"] = nameArray; + return jsonObject.ToJsonString(); + } + + public ISimpleStateChecker Deserialize( + JsonObject jsonObject, + TState state) + where TState : IHasSimpleStateCheckers + { + if (jsonObject["T"]?.ToString() != CheckerShortName) + { + return null; + } + + var nameArray = jsonObject["N"] as JsonArray; + if (nameArray == null) + { + throw new AbpException("'N' is not an array in the serialized state checker! JsonObject: " + jsonObject.ToJsonString()); + } + + return new RequirePermissionsSimpleStateChecker( + new RequirePermissionsSimpleBatchStateCheckerModel( + state, + nameArray.Select(x => x.ToString()).ToArray(), + (bool?)jsonObject["A"] ?? false + ) + ); + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/RequirePermissionsSimpleStateChecker.cs b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/RequirePermissionsSimpleStateChecker.cs index 3ae1809b55..fd8eef3791 100644 --- a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/RequirePermissionsSimpleStateChecker.cs +++ b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/RequirePermissionsSimpleStateChecker.cs @@ -8,6 +8,10 @@ namespace Volo.Abp.Authorization.Permissions; public class RequirePermissionsSimpleStateChecker : ISimpleStateChecker where TState : IHasSimpleStateCheckers { + public bool RequiresAll => _model.RequiresAll; + + public string[] PermissionNames => _model.Permissions; + private readonly RequirePermissionsSimpleBatchStateCheckerModel _model; public RequirePermissionsSimpleStateChecker(RequirePermissionsSimpleBatchStateCheckerModel model) diff --git a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/StaticPermissionDefinitionStore.cs b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/StaticPermissionDefinitionStore.cs new file mode 100644 index 0000000000..ee4803d61e --- /dev/null +++ b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/StaticPermissionDefinitionStore.cs @@ -0,0 +1,122 @@ +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.Authorization.Permissions; + +public class StaticPermissionDefinitionStore : IStaticPermissionDefinitionStore, ISingletonDependency +{ + protected IDictionary PermissionGroupDefinitions => _lazyPermissionGroupDefinitions.Value; + private readonly Lazy> _lazyPermissionGroupDefinitions; + + protected IDictionary PermissionDefinitions => _lazyPermissionDefinitions.Value; + private readonly Lazy> _lazyPermissionDefinitions; + + protected AbpPermissionOptions Options { get; } + + private readonly IServiceProvider _serviceProvider; + + public StaticPermissionDefinitionStore( + IServiceProvider serviceProvider, + IOptions options) + { + _serviceProvider = serviceProvider; + Options = options.Value; + + _lazyPermissionDefinitions = new Lazy>( + CreatePermissionDefinitions, + isThreadSafe: true + ); + + _lazyPermissionGroupDefinitions = new Lazy>( + CreatePermissionGroupDefinitions, + isThreadSafe: true + ); + } + + protected virtual Dictionary CreatePermissionDefinitions() + { + var permissions = new Dictionary(); + + foreach (var groupDefinition in PermissionGroupDefinitions.Values) + { + foreach (var permission in groupDefinition.Permissions) + { + AddPermissionToDictionaryRecursively(permissions, permission); + } + } + + return permissions; + } + + protected virtual void AddPermissionToDictionaryRecursively( + Dictionary permissions, + PermissionDefinition permission) + { + if (permissions.ContainsKey(permission.Name)) + { + throw new AbpException("Duplicate permission name: " + permission.Name); + } + + permissions[permission.Name] = permission; + + foreach (var child in permission.Children) + { + AddPermissionToDictionaryRecursively(permissions, child); + } + } + + protected virtual Dictionary CreatePermissionGroupDefinitions() + { + using (var scope = _serviceProvider.CreateScope()) + { + var context = new PermissionDefinitionContext(scope.ServiceProvider); + + var providers = Options + .DefinitionProviders + .Select(p => scope.ServiceProvider.GetRequiredService(p) as IPermissionDefinitionProvider) + .ToList(); + + foreach (var provider in providers) + { + provider.PreDefine(context); + } + + foreach (var provider in providers) + { + provider.Define(context); + } + + foreach (var provider in providers) + { + provider.PostDefine(context); + } + + return context.Groups; + } + } + + public Task GetOrNullAsync(string name) + { + return Task.FromResult(PermissionDefinitions.GetOrDefault(name)); + } + + public virtual Task> GetPermissionsAsync() + { + return Task.FromResult>( + PermissionDefinitions.Values.ToImmutableList() + ); + } + + public Task> GetGroupsAsync() + { + return Task.FromResult>( + PermissionGroupDefinitions.Values.ToImmutableList() + ); + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Autofac/Autofac/Builder/AbpRegistrationBuilderExtensions.cs b/framework/src/Volo.Abp.Autofac/Autofac/Builder/AbpRegistrationBuilderExtensions.cs index 868ecb3fa5..03084d8351 100644 --- a/framework/src/Volo.Abp.Autofac/Autofac/Builder/AbpRegistrationBuilderExtensions.cs +++ b/framework/src/Volo.Abp.Autofac/Autofac/Builder/AbpRegistrationBuilderExtensions.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using Autofac.Core; using Autofac.Extras.DynamicProxy; +using Volo.Abp.Autofac; using Volo.Abp.Castle.DynamicProxy; using Volo.Abp.DependencyInjection; using Volo.Abp.Modularity; @@ -67,10 +68,11 @@ public static class AbpRegistrationBuilderExtensions Type implementationType) where TActivatorData : ReflectionActivatorData { - //Enable Property Injection only for types in an assembly containing an AbpModule - if (moduleContainer.Modules.Any(m => m.Assembly == implementationType.Assembly)) + // Enable Property Injection only for types in an assembly containing an AbpModule and without a DisablePropertyInjection attribute on class or properties. + if (moduleContainer.Modules.Any(m => m.Assembly == implementationType.Assembly) && + implementationType.GetCustomAttributes(typeof(DisablePropertyInjectionAttribute), true).IsNullOrEmpty()) { - registrationBuilder = registrationBuilder.PropertiesAutowired(); + registrationBuilder = registrationBuilder.PropertiesAutowired(new AbpPropertySelector(false)); } return registrationBuilder; diff --git a/framework/src/Volo.Abp.Autofac/Volo/Abp/Autofac/AbpPropertySelector.cs b/framework/src/Volo.Abp.Autofac/Volo/Abp/Autofac/AbpPropertySelector.cs new file mode 100644 index 0000000000..00d20e9bca --- /dev/null +++ b/framework/src/Volo.Abp.Autofac/Volo/Abp/Autofac/AbpPropertySelector.cs @@ -0,0 +1,21 @@ +using System.Collections.Generic; +using System.Reflection; +using Autofac.Core; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.Autofac; + +public class AbpPropertySelector : DefaultPropertySelector +{ + public AbpPropertySelector(bool preserveSetValues) + : base(preserveSetValues) + { + } + + public override bool InjectProperty(PropertyInfo propertyInfo, object instance) + { + return propertyInfo.GetCustomAttributes(typeof(DisablePropertyInjectionAttribute), true).IsNullOrEmpty() && + base.InjectProperty(propertyInfo, instance); + } + +} diff --git a/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/HangfireBackgroundJobManager.cs b/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/HangfireBackgroundJobManager.cs index 2ebad0797f..2583ada9fc 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/HangfireBackgroundJobManager.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/HangfireBackgroundJobManager.cs @@ -1,6 +1,9 @@ using System; +using System.Reflection; using System.Threading.Tasks; using Hangfire; +using Hangfire.States; +using Microsoft.Extensions.Options; using Volo.Abp.DependencyInjection; namespace Volo.Abp.BackgroundJobs.Hangfire; @@ -8,16 +11,35 @@ namespace Volo.Abp.BackgroundJobs.Hangfire; [Dependency(ReplaceServices = true)] public class HangfireBackgroundJobManager : IBackgroundJobManager, ITransientDependency { + protected AbpBackgroundJobOptions Options { get; } + + public HangfireBackgroundJobManager(IOptions options) + { + Options = options.Value; + } + public virtual Task EnqueueAsync(TArgs args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, TimeSpan? delay = null) { return Task.FromResult(delay.HasValue ? BackgroundJob.Schedule>( - adapter => adapter.ExecuteAsync(args), + adapter => adapter.ExecuteAsync(GetQueueName(typeof(TArgs)),args), delay.Value ) : BackgroundJob.Enqueue>( - adapter => adapter.ExecuteAsync(args) + adapter => adapter.ExecuteAsync(GetQueueName(typeof(TArgs)) ,args) )); } + + protected virtual string GetQueueName(Type argsType) + { + var queueName = EnqueuedState.DefaultQueue; + var queueAttribute = Options.GetJob(argsType).JobType.GetCustomAttribute(); + if (queueAttribute != null) + { + queueName = queueAttribute.Queue; + } + + return queueName; + } } diff --git a/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/HangfireJobExecutionAdapter.cs b/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/HangfireJobExecutionAdapter.cs index a2ad7dc77d..7ba0cd7db4 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/HangfireJobExecutionAdapter.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/HangfireJobExecutionAdapter.cs @@ -1,4 +1,5 @@ using System.Threading.Tasks; +using Hangfire; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; @@ -20,7 +21,8 @@ public class HangfireJobExecutionAdapter Options = options.Value; } - public async Task ExecuteAsync(TArgs args) + [Queue("{0}")] + public async Task ExecuteAsync(string queue, TArgs args) { if (!Options.IsJobExecutionEnabled) { diff --git a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/AbpRabbitMqBackgroundJobOptions.cs b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/AbpRabbitMqBackgroundJobOptions.cs index 83efe8ff31..540d848412 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/AbpRabbitMqBackgroundJobOptions.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/AbpRabbitMqBackgroundJobOptions.cs @@ -19,6 +19,8 @@ public class AbpRabbitMqBackgroundJobOptions /// Default value: "AbpBackgroundJobsDelayed." /// public string DefaultDelayedQueueNamePrefix { get; set; } + + public ushort? PrefetchCount { get; set; } public AbpRabbitMqBackgroundJobOptions() { diff --git a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueue.cs b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueue.cs index 208d7ecd9f..9c3bf26e62 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueue.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueue.cs @@ -66,7 +66,8 @@ public class JobQueue : IJobQueue new JobQueueConfiguration( typeof(TArgs), AbpRabbitMqBackgroundJobOptions.DefaultQueueNamePrefix + JobConfiguration.JobName, - AbpRabbitMqBackgroundJobOptions.DefaultDelayedQueueNamePrefix + JobConfiguration.JobName + AbpRabbitMqBackgroundJobOptions.DefaultDelayedQueueNamePrefix + JobConfiguration.JobName, + prefetchCount: AbpRabbitMqBackgroundJobOptions.PrefetchCount ); } @@ -140,9 +141,14 @@ public class JobQueue : IJobQueue if (AbpBackgroundJobOptions.IsJobExecutionEnabled) { + if (QueueConfiguration.PrefetchCount.HasValue) + { + ChannelAccessor.Channel.BasicQos(0, QueueConfiguration.PrefetchCount.Value, false); + } + Consumer = new AsyncEventingBasicConsumer(ChannelAccessor.Channel); Consumer.Received += MessageReceived; - + //TODO: What BasicConsume returns? ChannelAccessor.Channel.BasicConsume( queue: QueueConfiguration.QueueName, diff --git a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueueConfiguration.cs b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueueConfiguration.cs index 792eb9815e..ee706ab864 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueueConfiguration.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueueConfiguration.cs @@ -20,12 +20,14 @@ public class JobQueueConfiguration : QueueDeclareConfiguration string connectionName = null, bool durable = true, bool exclusive = false, - bool autoDelete = false) + bool autoDelete = false, + ushort? prefetchCount = null) : base( queueName, durable, exclusive, - autoDelete) + autoDelete, + prefetchCount) { JobArgsType = jobArgsType; ConnectionName = connectionName; diff --git a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/InMemoryBackgroundJobStore.cs b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/InMemoryBackgroundJobStore.cs index 9e7071c89a..726d65d513 100644 --- a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/InMemoryBackgroundJobStore.cs +++ b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/InMemoryBackgroundJobStore.cs @@ -32,7 +32,7 @@ public class InMemoryBackgroundJobStore : IBackgroundJobStore, ISingletonDepende { _jobs[jobInfo.Id] = jobInfo; - return Task.FromResult(0); + return Task.CompletedTask; } public virtual Task> GetWaitingJobsAsync(int maxResultCount) @@ -53,7 +53,7 @@ public class InMemoryBackgroundJobStore : IBackgroundJobStore, ISingletonDepende { _jobs.TryRemove(jobId, out _); - return Task.FromResult(0); + return Task.CompletedTask; } public virtual Task UpdateAsync(BackgroundJobInfo jobInfo) @@ -63,6 +63,6 @@ public class InMemoryBackgroundJobStore : IBackgroundJobStore, ISingletonDepende return DeleteAsync(jobInfo.Id); } - return Task.FromResult(0); + return Task.CompletedTask; } } diff --git a/framework/src/Volo.Abp.BlazoriseUI/AbpBlazoriseUiModalExtensions.cs b/framework/src/Volo.Abp.BlazoriseUI/AbpBlazoriseUiModalExtensions.cs new file mode 100644 index 0000000000..3b71613fc5 --- /dev/null +++ b/framework/src/Volo.Abp.BlazoriseUI/AbpBlazoriseUiModalExtensions.cs @@ -0,0 +1,15 @@ +using System.Threading.Tasks; +using Blazorise; + +namespace Volo.Abp.BlazoriseUI; + +public static class AbpBlazoriseUiModalExtensions +{ + public static Task CancelClosingModalWhenFocusLost(this Modal modal, ModalClosingEventArgs eventArgs) + { + // cancel close if clicked outside of modal area + eventArgs.Cancel = eventArgs.CloseReason == CloseReason.FocusLostClosing; + + return Task.CompletedTask; + } +} diff --git a/framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo/Abp/Caching/StackExchangeRedis/AbpRedisCache.cs b/framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo/Abp/Caching/StackExchangeRedis/AbpRedisCache.cs index d52a40e5b5..68a59aab2d 100644 --- a/framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo/Abp/Caching/StackExchangeRedis/AbpRedisCache.cs +++ b/framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo/Abp/Caching/StackExchangeRedis/AbpRedisCache.cs @@ -15,18 +15,18 @@ namespace Volo.Abp.Caching.StackExchangeRedis; [DisableConventionalRegistration] public class AbpRedisCache : RedisCache, ICacheSupportsMultipleItems { - protected static readonly string SetScript; protected static readonly string AbsoluteExpirationKey; protected static readonly string SlidingExpirationKey; protected static readonly string DataKey; protected static readonly long NotPresent; - private static readonly FieldInfo RedisDatabaseField; - private static readonly MethodInfo ConnectMethod; - private static readonly MethodInfo ConnectAsyncMethod; - private static readonly MethodInfo MapMetadataMethod; - private static readonly MethodInfo GetAbsoluteExpirationMethod; - private static readonly MethodInfo GetExpirationInSecondsMethod; + private readonly static FieldInfo SetScriptField; + private readonly static FieldInfo RedisDatabaseField; + private readonly static MethodInfo ConnectMethod; + private readonly static MethodInfo ConnectAsyncMethod; + private readonly static MethodInfo MapMetadataMethod; + private readonly static MethodInfo GetAbsoluteExpirationMethod; + private readonly static MethodInfo GetExpirationInSecondsMethod; protected IDatabase RedisDatabase => GetRedisDatabase(); private IDatabase _redisDatabase; @@ -36,9 +36,11 @@ public class AbpRedisCache : RedisCache, ICacheSupportsMultipleItems static AbpRedisCache() { var type = typeof(RedisCache); - + RedisDatabaseField = type.GetField("_cache", BindingFlags.Instance | BindingFlags.NonPublic); + SetScriptField = type.GetField("_setScript", BindingFlags.Instance | BindingFlags.NonPublic); + ConnectMethod = type.GetMethod("Connect", BindingFlags.Instance | BindingFlags.NonPublic); ConnectAsyncMethod = type.GetMethod("ConnectAsync", BindingFlags.Instance | BindingFlags.NonPublic); @@ -51,9 +53,6 @@ public class AbpRedisCache : RedisCache, ICacheSupportsMultipleItems GetExpirationInSecondsMethod = type.GetMethod("GetExpirationInSeconds", BindingFlags.Static | BindingFlags.NonPublic); - SetScript = type.GetField("SetScript", BindingFlags.Static | BindingFlags.NonPublic)?.GetValue(null) - .ToString(); - AbsoluteExpirationKey = type.GetField("AbsoluteExpirationKey", BindingFlags.Static | BindingFlags.NonPublic) ?.GetValue(null).ToString(); @@ -83,14 +82,14 @@ public class AbpRedisCache : RedisCache, ICacheSupportsMultipleItems ConnectMethod.Invoke(this, Array.Empty()); } - protected virtual Task ConnectAsync(CancellationToken token = default) + protected virtual async Task ConnectAsync(CancellationToken token = default) { if (GetRedisDatabase() != null) { - return Task.CompletedTask; + return; } - return (Task)ConnectAsyncMethod.Invoke(this, new object[] { token }); + await (Task)ConnectAsyncMethod.Invoke(this, new object[] { token }); } public byte[][] GetMany( @@ -283,7 +282,7 @@ public class AbpRedisCache : RedisCache, ICacheSupportsMultipleItems for (var i = 0; i < itemArray.Length; i++) { - tasks[i] = RedisDatabase.ScriptEvaluateAsync(SetScript, new RedisKey[] { Instance + itemArray[i].Key }, + tasks[i] = RedisDatabase.ScriptEvaluateAsync(GetSetScript(), new RedisKey[] { Instance + itemArray[i].Key }, new RedisValue[] { absoluteExpiration?.Ticks ?? NotPresent, @@ -333,4 +332,9 @@ public class AbpRedisCache : RedisCache, ICacheSupportsMultipleItems return _redisDatabase; } + + private string GetSetScript() + { + return SetScriptField?.GetValue(this).ToString(); + } } diff --git a/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/DistributedCache.cs b/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/DistributedCache.cs index 7e8f90a397..c51ec76fc1 100644 --- a/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/DistributedCache.cs +++ b/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/DistributedCache.cs @@ -20,7 +20,9 @@ namespace Volo.Abp.Caching; /// Represents a distributed cache of type. /// /// The type of cache item being cached. -public class DistributedCache : DistributedCache, IDistributedCache +public class DistributedCache : + DistributedCache, + IDistributedCache where TCacheItem : class { public DistributedCache( diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/AbpCliCoreModule.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/AbpCliCoreModule.cs index 4fda075521..7aba9ae849 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/AbpCliCoreModule.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/AbpCliCoreModule.cs @@ -49,6 +49,7 @@ public class AbpCliCoreModule : AbpModule options.Commands[AddPackageCommand.Name] = typeof(AddPackageCommand); options.Commands[AddModuleCommand.Name] = typeof(AddModuleCommand); options.Commands[ListModulesCommand.Name] = typeof(ListModulesCommand); + options.Commands[ListTemplatesCommand.Name] = typeof(ListTemplatesCommand); options.Commands[LoginCommand.Name] = typeof(LoginCommand); options.Commands[LoginInfoCommand.Name] = typeof(LoginInfoCommand); options.Commands[LogoutCommand.Name] = typeof(LogoutCommand); diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/AbpCliOptions.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/AbpCliOptions.cs index 62a7e59d8e..3068016f33 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/AbpCliOptions.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/AbpCliOptions.cs @@ -16,6 +16,8 @@ public class AbpCliOptions /// Default value: "CLI". /// public string ToolName { get; set; } = "CLI"; + + public bool AlwaysHideExternalCommandOutput { get; set; } public AbpCliOptions() { diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Auth/AuthService.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Auth/AuthService.cs index c3ce0afb54..cc198e877b 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Auth/AuthService.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Auth/AuthService.cs @@ -74,9 +74,9 @@ public class AuthService : IAuthService, ITransientDependency { var configuration = new IdentityClientConfiguration( CliUrls.AccountAbpIo, - "role email abpio abpio_www abpio_commercial offline_access", + "abpio offline_access", "abp-cli", - "1q2w3e*", + null, OidcConstants.GrantTypes.Password, userName, password @@ -96,9 +96,9 @@ public class AuthService : IAuthService, ITransientDependency { var configuration = new IdentityClientConfiguration( CliUrls.AccountAbpIo, - "role email abpio abpio_www abpio_commercial openid offline_access", + "abpio offline_access", "abp-cli", - "1q2w3e*", + null, OidcConstants.GrantTypes.DeviceCode ); diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/BundlingService.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/BundlingService.cs index 314372ddc3..65212fe69f 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/BundlingService.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/BundlingService.cs @@ -113,8 +113,11 @@ public class BundlingService : IBundlingService, ITransientDependency var contributor = CreateContributorInstance(bundleDefinition.BundleContributorType); contributor.AddScripts(scriptContext); } + + scriptContext.BundleDefinitions.AddIfNotContains( + x => x.Source == "_framework/blazor.webassembly.js", + () => new BundleDefinition { Source = "_framework/blazor.webassembly.js" }); - scriptContext.Add("_framework/blazor.webassembly.js"); return scriptContext; } @@ -206,7 +209,7 @@ public class BundlingService : IBundlingService, ITransientDependency builder.Append($" "); @@ -229,7 +232,7 @@ public class BundlingService : IBundlingService, ITransientDependency { var bundleContributors = module.Assembly .GetTypes() - .Where(t => t.IsAssignableTo()) + .Where(t => !t.IsAbstract && !t.IsInterface && t.IsAssignableTo()) .ToList(); if (bundleContributors.Count > 1) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/GenerateProxyCommand.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/GenerateProxyCommand.cs index bf8e2e3028..7874fddb86 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/GenerateProxyCommand.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/GenerateProxyCommand.cs @@ -1,4 +1,5 @@ using System.Text; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Volo.Abp.Cli.ServiceProxying; using Volo.Abp.DependencyInjection; @@ -13,7 +14,7 @@ public class GenerateProxyCommand : ProxyCommandBase public GenerateProxyCommand( IOptions serviceProxyOptions, - IHybridServiceScopeFactory serviceScopeFactory) + IServiceScopeFactory serviceScopeFactory) : base(serviceProxyOptions, serviceScopeFactory) { } diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ListTemplatesCommand.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ListTemplatesCommand.cs new file mode 100644 index 0000000000..7274fb641d --- /dev/null +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ListTemplatesCommand.cs @@ -0,0 +1,106 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Abstractions; +using Volo.Abp.Cli.Args; +using Volo.Abp.Cli.Commands.Templates; +using Volo.Abp.Cli.Http; +using Volo.Abp.Cli.ProjectBuilding; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Json; +using Volo.Abp.Threading; + +namespace Volo.Abp.Cli.Commands; + +public class ListTemplatesCommand : IConsoleCommand, ITransientDependency +{ + public const string Name = "list-templates"; + + private readonly CliHttpClientFactory _cliHttpClientFactory; + private readonly IJsonSerializer _jsonSerializer; + private readonly ICancellationTokenProvider _cancellationTokenProvider; + private readonly IRemoteServiceExceptionHandler _remoteServiceExceptionHandler; + + public ILogger Logger { get; set; } + + public ListTemplatesCommand( + CliHttpClientFactory cliHttpClientFactory, + IJsonSerializer jsonSerializer, + ICancellationTokenProvider cancellationTokenProvider, + IRemoteServiceExceptionHandler remoteServiceExceptionHandler) + { + _cliHttpClientFactory = cliHttpClientFactory; + _jsonSerializer = jsonSerializer; + _cancellationTokenProvider = cancellationTokenProvider; + _remoteServiceExceptionHandler = remoteServiceExceptionHandler; + + Logger = NullLogger.Instance; + } + + public async Task ExecuteAsync(CommandLineArgs commandLineArgs) + { + var templateNameSpaceLength = 26; + var templateDisplayNameSpaceLength = 32; + + var templates = await GetTemplatesAsync(); + + var output = new StringBuilder(Environment.NewLine + Environment.NewLine); + + output.AppendLine( + $"{"Template".PadRight(templateNameSpaceLength)}" + + $"{"Template Name".PadRight(templateDisplayNameSpaceLength)}" + + "Document Url"); + + output.AppendLine( + $"{"--------".PadRight(templateNameSpaceLength)}" + + $"{"-------------".PadRight(templateDisplayNameSpaceLength)}" + + "------------"); + + output.AppendLine(); + + foreach (var template in templates) + { + output.AppendLine( + $"{template.Name?.PadRight(templateNameSpaceLength)}" + + $"{template.DisplayName?.PadRight(templateDisplayNameSpaceLength)}" + + $"{template.DocumentUrl}"); + } + + Logger.LogInformation(output.ToString()); + } + + private async Task> GetTemplatesAsync() + { + var client = _cliHttpClientFactory.CreateClient(); + + using (var responseMessage = await client.GetAsync( + $"{CliUrls.WwwAbpIo}api/download/templates/", + _cancellationTokenProvider.Token + )) + { + await _remoteServiceExceptionHandler.EnsureSuccessfulHttpResponseAsync(responseMessage); + var result = await responseMessage.Content.ReadAsStringAsync(); + return _jsonSerializer.Deserialize>(result); + } + } + + public string GetUsageInfo() + { + var sb = new StringBuilder(); + + sb.AppendLine(""); + sb.AppendLine("Usage:"); + sb.AppendLine(" abp list-templates"); + sb.AppendLine(""); + sb.AppendLine("See the documentation for more info: https://docs.abp.io/en/abp/latest/CLI"); + + return sb.ToString(); + } + + public string GetShortDescription() + { + return "Lists available templates to be created."; + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs index 1cffbfe407..b0927cbcc9 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs @@ -9,6 +9,7 @@ using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Volo.Abp.Cli.Args; +using Volo.Abp.Cli.Bundling; using Volo.Abp.Cli.Commands.Services; using Volo.Abp.Cli.LIbs; using Volo.Abp.Cli.ProjectBuilding; @@ -26,23 +27,35 @@ public class NewCommand : ProjectCreationCommandBase, IConsoleCommand, ITransien protected TemplateProjectBuilder TemplateProjectBuilder { get; } public ITemplateInfoProvider TemplateInfoProvider { get; } - - public NewCommand(TemplateProjectBuilder templateProjectBuilder - , ITemplateInfoProvider templateInfoProvider, - ConnectionStringProvider connectionStringProvider, + + public NewCommand( + ConnectionStringProvider connectionStringProvider, SolutionPackageVersionFinder solutionPackageVersionFinder, ICmdHelper cmdHelper, - IInstallLibsService installLibsService, - AngularPwaSupportAdder angularPwaSupportAdder, + IInstallLibsService installLibsService, + CliService cliService, + AngularPwaSupportAdder angularPwaSupportAdder, InitialMigrationCreator initialMigrationCreator, - ThemePackageAdder themePackageAdder, - ILocalEventBus eventBus) - : base(connectionStringProvider, solutionPackageVersionFinder, cmdHelper, installLibsService, angularPwaSupportAdder, initialMigrationCreator, themePackageAdder, eventBus) + ThemePackageAdder themePackageAdder, + ILocalEventBus eventBus, + IBundlingService bundlingService, + ITemplateInfoProvider templateInfoProvider, + TemplateProjectBuilder templateProjectBuilder) : + base(connectionStringProvider, + solutionPackageVersionFinder, + cmdHelper, + installLibsService, + cliService, + angularPwaSupportAdder, + initialMigrationCreator, + themePackageAdder, + eventBus, + bundlingService) { - TemplateProjectBuilder = templateProjectBuilder; TemplateInfoProvider = templateInfoProvider; + TemplateProjectBuilder = templateProjectBuilder; } - + public async Task ExecuteAsync(CommandLineArgs commandLineArgs) { var projectName = NamespaceHelper.NormalizeNamespace(commandLineArgs.Target); @@ -72,7 +85,7 @@ public class NewCommand : ProjectCreationCommandBase, IConsoleCommand, ITransien Logger.LogInformation("Tiered: yes"); } - var projectArgs = GetProjectBuildArgs(commandLineArgs, template, projectName); + var projectArgs = await GetProjectBuildArgsAsync(commandLineArgs, template, projectName); var result = await TemplateProjectBuilder.BuildAsync( projectArgs @@ -85,7 +98,15 @@ public class NewCommand : ProjectCreationCommandBase, IConsoleCommand, ITransien ConfigureNpmPackagesForTheme(projectArgs); await RunGraphBuildForMicroserviceServiceTemplate(projectArgs); await CreateInitialMigrationsAsync(projectArgs); - await RunInstallLibsForWebTemplateAsync(projectArgs); + + var skipInstallLibs = commandLineArgs.Options.ContainsKey(Options.SkipInstallingLibs.Long) || commandLineArgs.Options.ContainsKey(Options.SkipInstallingLibs.Short); + if (!skipInstallLibs) + { + await RunInstallLibsForWebTemplateAsync(projectArgs); + } + + await RunBundleForBlazorWasmTemplateAsync(projectArgs); + await ConfigurePwaSupportForAngular(projectArgs); OpenRelatedWebPage(projectArgs, template, isTiered, commandLineArgs); @@ -149,5 +170,4 @@ public class NewCommand : ProjectCreationCommandBase, IConsoleCommand, ITransien { return "Generate a new solution based on the ABP startup templates."; } - } diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ProjectCreationCommandBase.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ProjectCreationCommandBase.cs index fa1408e27b..813900ba18 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ProjectCreationCommandBase.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ProjectCreationCommandBase.cs @@ -10,6 +10,7 @@ using NuGet.Versioning; using NUglify.Helpers; using Volo.Abp.Cli.ProjectModification; using Volo.Abp.Cli.Args; +using Volo.Abp.Cli.Bundling; using Volo.Abp.Cli.Commands.Services; using Volo.Abp.Cli.LIbs; using Volo.Abp.Cli.ProjectBuilding; @@ -25,10 +26,12 @@ namespace Volo.Abp.Cli.Commands; public abstract class ProjectCreationCommandBase { + private readonly IBundlingService _bundlingService; public ConnectionStringProvider ConnectionStringProvider { get; } public SolutionPackageVersionFinder SolutionPackageVersionFinder { get; } public ICmdHelper CmdHelper { get; } public IInstallLibsService InstallLibsService { get; } + public CliService CliService { get; } public AngularPwaSupportAdder AngularPwaSupportAdder { get; } public InitialMigrationCreator InitialMigrationCreator { get; } public ILocalEventBus EventBus { get; } @@ -41,15 +44,19 @@ public abstract class ProjectCreationCommandBase SolutionPackageVersionFinder solutionPackageVersionFinder, ICmdHelper cmdHelper, IInstallLibsService installLibsService, + CliService cliService, AngularPwaSupportAdder angularPwaSupportAdder, InitialMigrationCreator initialMigrationCreator, ThemePackageAdder themePackageAdder, - ILocalEventBus eventBus) + ILocalEventBus eventBus, + IBundlingService bundlingService) { + _bundlingService = bundlingService; ConnectionStringProvider = connectionStringProvider; SolutionPackageVersionFinder = solutionPackageVersionFinder; CmdHelper = cmdHelper; InstallLibsService = installLibsService; + CliService = cliService; AngularPwaSupportAdder = angularPwaSupportAdder; InitialMigrationCreator = initialMigrationCreator; EventBus = eventBus; @@ -58,7 +65,7 @@ public abstract class ProjectCreationCommandBase Logger = NullLogger.Instance; } - protected ProjectBuildArgs GetProjectBuildArgs(CommandLineArgs commandLineArgs, string template, string projectName) + protected async Task GetProjectBuildArgsAsync(CommandLineArgs commandLineArgs, string template, string projectName) { var version = commandLineArgs.Options.GetOrNull(Options.Version.Short, Options.Version.Long); @@ -71,6 +78,15 @@ public abstract class ProjectCreationCommandBase if (preview) { Logger.LogInformation("Preview: yes"); + + var cliVersion = await CliService.GetCurrentCliVersionAsync(typeof(CliService).Assembly); + + if (!cliVersion.IsPrerelease) + { + throw new CliUsageException( + "You can only create a new preview solution with preview CLI version." + + " Update your ABP CLI to the preview version."); + } } var pwa = commandLineArgs.Options.ContainsKey(Options.ProgressiveWebApp.Short); @@ -103,12 +119,6 @@ public abstract class ProjectCreationCommandBase Logger.LogInformation("UI Framework: " + uiFramework); } - var theme = uiFramework == UiFramework.None ? (Theme?)null : GetTheme(commandLineArgs); - if (theme.HasValue) - { - Logger.LogInformation("Theme: " + theme); - } - var publicWebSite = uiFramework != UiFramework.None && commandLineArgs.Options.ContainsKey(Options.PublicWebSite.Long); if (publicWebSite) { @@ -149,17 +159,38 @@ public abstract class ProjectCreationCommandBase SolutionName solutionName; if (MicroserviceServiceTemplateBase.IsMicroserviceServiceTemplate(template)) { - var slnFile = Directory.GetFiles(outputFolderRoot, "*.sln").FirstOrDefault(); - if (slnFile == null) + var slnPath = commandLineArgs.Options.GetOrNull(Options.MainSolution.Short, Options.MainSolution.Long); + + if (slnPath == null) + { + slnPath = Directory.GetFiles(outputFolderRoot, "*.sln").FirstOrDefault(); + } + else if (slnPath.EndsWith(".sln")) + { + Directory.SetCurrentDirectory(Path.GetDirectoryName(slnPath)); + outputFolderRoot = Path.GetDirectoryName(slnPath); + } + else if (!Directory.Exists(slnPath)) + { + slnPath = null; + } + else + { + Directory.SetCurrentDirectory(slnPath); + outputFolderRoot = slnPath; + slnPath = Directory.GetFiles(outputFolderRoot, "*.sln").FirstOrDefault(); + } + + if (slnPath == null) { - throw new CliUsageException("This command should be run inside a folder that contains a microservice solution!"); + throw new CliUsageException($"This command should be run inside a folder that contains a microservice solution! Or use -{Options.MainSolution.Short} parameter."); } - var microserviceSolutionName = Path.GetFileName(slnFile).RemovePostFix(".sln"); + var microserviceSolutionName = Path.GetFileName(slnPath).RemovePostFix(".sln"); - version ??= SolutionPackageVersionFinder.Find(slnFile); + version ??= SolutionPackageVersionFinder.Find(slnPath); solutionName = SolutionName.Parse(microserviceSolutionName, projectName); - outputFolder = MicroserviceServiceTemplateBase.CalculateTargetFolder(outputFolderRoot, projectName); + outputFolder = MicroserviceServiceTemplateBase.CalculateTargetFolder(outputFolderRoot, solutionName.ProjectName); uiFramework = uiFramework == UiFramework.NotSpecified ? FindMicroserviceSolutionUiFramework(outputFolderRoot) : uiFramework; } else @@ -183,6 +214,9 @@ public abstract class ProjectCreationCommandBase } commandLineArgs.Options.Add(CliConsts.Command, commandLineArgs.Command); + + var theme = uiFramework == UiFramework.None ? (Theme?)null : GetThemeByTemplateOrNull(commandLineArgs, template); + var themeStyle = theme.HasValue ? GetThemeStyleOrNull(commandLineArgs, theme.Value) : (ThemeStyle?)null; return new ProjectBuildArgs( solutionName, @@ -200,16 +234,18 @@ public abstract class ProjectCreationCommandBase commandLineArgs.Options, connectionString, pwa, - theme + theme, + themeStyle ); } protected void ExtractProjectZip(ProjectBuildResult project, string outputFolder) { - EventBus.PublishAsync(new ProjectCreationProgressEvent { + EventBus.PublishAsync(new ProjectCreationProgressEvent + { Message = "Extracting the solution archieve" }, false); - + using (var templateFileStream = new MemoryStream(project.ZipContent)) { using (var zipInputStream = new ZipInputStream(templateFileStream)) @@ -297,14 +333,14 @@ public abstract class ProjectCreationCommandBase var tieredYesNo = tiered ? "yes" : "no"; var url = $"https://{urlPrefix}.abp.io/project-created-success?ui={uiFramework:g}&db={databaseProvider:g}&tiered={tieredYesNo}"; - CmdHelper.OpenWebPage(url); + CmdHelper.Open(url); } protected void OpenMicroserviceDocumentPage() { var url = "https://docs.abp.io/en/commercial/latest/startup-templates/microservice/index"; - CmdHelper.OpenWebPage(url); + CmdHelper.Open(url); } protected bool GetCreateSolutionFolderPreference(CommandLineArgs commandLineArgs) @@ -338,17 +374,18 @@ public abstract class ProjectCreationCommandBase return DatabaseProvider.MongoDb; } - throw new CliUsageException("The option you provided for Database Provider is invalid!"); + throw new CliUsageException(ExceptionMessageHelper.GetInvalidOptionExceptionMessage("Database Provider")); } protected virtual async Task RunGraphBuildForMicroserviceServiceTemplate(ProjectBuildArgs projectArgs) { if (MicroserviceServiceTemplateBase.IsMicroserviceServiceTemplate(projectArgs.TemplateName)) { - await EventBus.PublishAsync(new ProjectCreationProgressEvent { + await EventBus.PublishAsync(new ProjectCreationProgressEvent + { Message = "Building the microservice solution" }, false); - + CmdHelper.RunCmd("dotnet build /graphbuild", projectArgs.OutputFolder); } } @@ -361,15 +398,35 @@ public abstract class ProjectCreationCommandBase MicroserviceServiceTemplateBase.IsMicroserviceTemplate(projectArgs.TemplateName)) { Logger.LogInformation("Installing client-side packages..."); - - await EventBus.PublishAsync(new ProjectCreationProgressEvent { + + await EventBus.PublishAsync(new ProjectCreationProgressEvent + { Message = "Installing client-side packages" }, false); - + await InstallLibsService.InstallLibsAsync(projectArgs.OutputFolder); } } + protected async Task RunBundleForBlazorWasmTemplateAsync(ProjectBuildArgs projectArgs) + { + if (AppTemplateBase.IsAppTemplate(projectArgs.TemplateName) && projectArgs.UiFramework == UiFramework.Blazor) + { + Logger.LogInformation("Generating bundles for Blazor Wasm..."); + + await EventBus.PublishAsync(new ProjectCreationProgressEvent + { + Message = "Generating bundles for Blazor Wasm" + }, false); + + var directory = Path.GetDirectoryName( + Directory.GetFiles(projectArgs.OutputFolder, "*.Blazor.csproj", SearchOption.AllDirectories).First() + ); + + await _bundlingService.BundleAsync(directory, true); + } + } + protected async Task CreateInitialMigrationsAsync(ProjectBuildArgs projectArgs) { if (projectArgs.DatabaseProvider == DatabaseProvider.MongoDb) @@ -402,10 +459,11 @@ public abstract class ProjectCreationCommandBase return; } - await EventBus.PublishAsync(new ProjectCreationProgressEvent { + await EventBus.PublishAsync(new ProjectCreationProgressEvent + { Message = "Creating the initial DB migration" }, false); - + await InitialMigrationCreator.CreateAsync(Path.GetDirectoryName(efCoreProjectPath), isLayeredTemplate); } @@ -417,7 +475,7 @@ public abstract class ProjectCreationCommandBase if (isAngular && isPwa) { Logger.LogInformation("Adding PWA Support to Angular app."); - + AngularPwaSupportAdder.AddPwaSupport(projectArgs.OutputFolder); } } @@ -446,7 +504,7 @@ public abstract class ProjectCreationCommandBase case "oracle": return DatabaseManagementSystem.Oracle; default: - throw new CliUsageException("The option you provided for Database Management System is invalid!"); + throw new CliUsageException(ExceptionMessageHelper.GetInvalidOptionExceptionMessage("Database Management System")); } } @@ -461,8 +519,10 @@ public abstract class ProjectCreationCommandBase return MobileApp.None; case "react-native": return MobileApp.ReactNative; + case "maui": + return MobileApp.Maui; default: - throw new CliUsageException("The option you provided for Mobile App is invalid!"); + throw new CliUsageException(ExceptionMessageHelper.GetInvalidOptionExceptionMessage("Mobile App")); } } @@ -490,23 +550,60 @@ public abstract class ProjectCreationCommandBase case "blazor-server": return UiFramework.BlazorServer; default: - throw new CliUsageException("The option you provided for UI Framework is invalid!"); + throw new CliUsageException(ExceptionMessageHelper.GetInvalidOptionExceptionMessage("UI Framework")); } } - protected virtual Theme GetTheme(CommandLineArgs commandLineArgs) + protected virtual Theme? GetThemeByTemplateOrNull(CommandLineArgs commandLineArgs, string template = "app") { - var optionValue = commandLineArgs.Options.GetOrNull(Options.Theme.Long); - switch (optionValue) + var theme = commandLineArgs.Options.GetOrNull(Options.Theme.Long)?.ToLower(); + + return template switch { - case null: - case "leptonx-lite": - return Theme.LeptonXLite; - case "basic": - return Theme.Basic; - default: - throw new CliUsageException("The option you provided for Theme is invalid!"); + AppTemplate.TemplateName or AppNoLayersTemplate.TemplateName => GetAppTheme(), + AppProTemplate.TemplateName or AppNoLayersProTemplate.TemplateName or MicroserviceProTemplate.TemplateName => GetAppProTheme(), + _ => null + }; + + Theme GetAppTheme() + { + return theme switch + { + // null or "leptonx-lite" => Theme.LeptonXLite, + "basic" => Theme.Basic, + _ => Theme.LeptonXLite + }; + } + + Theme GetAppProTheme() + { + return theme switch + { + // null or "leptonx" => Theme.LeptonX, + "lepton" => Theme.Lepton, + "basic" => Theme.Basic, + _ => Theme.LeptonX //TODO: default??? + }; + } + } + + protected virtual ThemeStyle? GetThemeStyleOrNull(CommandLineArgs commandLineArgs, Theme theme) + { + if(theme != Theme.LeptonX) + { + return null; } + + var themeStyle = commandLineArgs.Options.GetOrNull(Options.ThemeStyle.Long)?.ToLower(); + + return themeStyle switch + { + "system" or null => ThemeStyle.System, + "dim" => ThemeStyle.Dim, + "light" => ThemeStyle.Light, + "dark" => ThemeStyle.Dark, + _ => null + }; } protected void ConfigureNpmPackagesForTheme(ProjectBuildArgs projectArgs) @@ -521,6 +618,15 @@ public abstract class ProjectCreationCommandBase case Theme.Basic: ConfigureNpmPackagesForBasicTheme(projectArgs); break; + case Theme.Lepton: + ConfigureNpmPackagesForLeptonTheme(projectArgs); + break; + case Theme.NotSpecified: + case Theme.LeptonXLite: + case Theme.LeptonX: + break; + default: + throw new CliUsageException(ExceptionMessageHelper.GetInvalidOptionExceptionMessage(Options.Theme.Long)); } } @@ -541,6 +647,25 @@ public abstract class ProjectCreationCommandBase ThemePackageAdder.AddAngularPackage(projectArgs.OutputFolder, "@abp/ng.theme.basic", projectArgs.Version); } } + + private void ConfigureNpmPackagesForLeptonTheme(ProjectBuildArgs projectArgs) + { + if (projectArgs.UiFramework is not UiFramework.None or UiFramework.Angular) + { + ThemePackageAdder.AddNpmPackage(projectArgs.OutputFolder, "@volo/abp.aspnetcore.mvc.ui.theme.lepton", projectArgs.Version); + } + + if (projectArgs.UiFramework is UiFramework.BlazorServer) + { + ThemePackageAdder.AddNpmPackage(projectArgs.OutputFolder, "@volo/abp.aspnetcore.components.server.leptontheme", projectArgs.Version); + ThemePackageAdder.AddNpmPackage(projectArgs.OutputFolder, "@volo/abp.aspnetcore.mvc.ui.theme.lepton", projectArgs.Version); + } + + if (projectArgs.UiFramework is UiFramework.Angular) + { + ThemePackageAdder.AddAngularPackage(projectArgs.OutputFolder, "@volo/abp.ng.theme.lepton", projectArgs.Version); + } + } public static class Options { @@ -619,6 +744,12 @@ public abstract class ProjectCreationCommandBase public const string Long = "create-solution-folder"; } + public static class SkipInstallingLibs + { + public const string Short = "sib"; + public const string Long = "skip-installing-libs"; + } + public static class Tiered { public const string Long = "tiered"; @@ -633,10 +764,21 @@ public abstract class ProjectCreationCommandBase { public const string Short = "pwa"; } - + + public static class MainSolution + { + public const string Short = "ms"; + public const string Long = "main-solution"; + } + public static class Theme { public const string Long = "theme"; } + + public static class ThemeStyle + { + public const string Long = "theme-style"; + } } -} +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ProxyCommandBase.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ProxyCommandBase.cs index 22311bb986..67c61b2a28 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ProxyCommandBase.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ProxyCommandBase.cs @@ -2,6 +2,7 @@ using System.IO; using System.Text; using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; @@ -19,11 +20,11 @@ public abstract class ProxyCommandBase : IConsoleCommand, ITransientDependenc protected AbpCliServiceProxyOptions ServiceProxyOptions { get; } - protected IHybridServiceScopeFactory ServiceScopeFactory { get; } + protected IServiceScopeFactory ServiceScopeFactory { get; } public ProxyCommandBase( IOptions serviceProxyOptions, - IHybridServiceScopeFactory serviceScopeFactory) + IServiceScopeFactory serviceScopeFactory) { ServiceScopeFactory = serviceScopeFactory; ServiceProxyOptions = serviceProxyOptions.Value; diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/RemoveProxyCommand.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/RemoveProxyCommand.cs index d89c19c892..3372584f1a 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/RemoveProxyCommand.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/RemoveProxyCommand.cs @@ -1,4 +1,5 @@ using System.Text; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Volo.Abp.Cli.ServiceProxying; using Volo.Abp.DependencyInjection; @@ -13,7 +14,7 @@ public class RemoveProxyCommand : ProxyCommandBase public RemoveProxyCommand( IOptions serviceProxyOptions, - IHybridServiceScopeFactory serviceScopeFactory) + IServiceScopeFactory serviceScopeFactory) : base(serviceProxyOptions, serviceScopeFactory) { } diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/Templates/TemplateInfo.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/Templates/TemplateInfo.cs new file mode 100644 index 0000000000..c0c269de5b --- /dev/null +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/Templates/TemplateInfo.cs @@ -0,0 +1,14 @@ +namespace Volo.Abp.Cli.Commands.Templates; + +public class TemplateInfo +{ + public string Name { get; set; } + + public string DisplayName { get; set; } + + public string ShortDescription { get; set; } + + public string DocumentUrl { get; set; } + + public bool IsPro { get; set; } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/NuGet/CommercialPackages.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/NuGet/CommercialPackages.cs index 97003287bb..096fe9f314 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/NuGet/CommercialPackages.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/NuGet/CommercialPackages.cs @@ -14,6 +14,16 @@ internal static class CommercialPackages public static bool IsCommercial(string packageId) { - return Packages.Contains(packageId.ToLowerInvariant()); + return Packages.Contains(packageId.ToLowerInvariant()) || IsLeptonXPackage(packageId); + } + + private static bool IsLeptonXPackage(string packageId) + { + return !IsLeptonXLitePackage(packageId) && packageId.Contains("LeptonX"); + } + + private static bool IsLeptonXLitePackage(string packageId) + { + return packageId.Contains("LeptonXLite"); } } diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/MobileApp.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/MobileApp.cs index 882cb9166c..641740bce0 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/MobileApp.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/MobileApp.cs @@ -7,7 +7,8 @@ namespace Volo.Abp.Cli.ProjectBuilding.Building; public enum MobileApp { None, - ReactNative + ReactNative, + Maui } public static class MobileAppExtensions @@ -18,6 +19,8 @@ public static class MobileAppExtensions { case MobileApp.ReactNative: return "react-native"; + case MobileApp.Maui: + return "MAUI"; } throw new Exception("Mobile app folder name is not set!"); diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/ChangeThemeStep.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/ChangeThemeStep.cs index 4409f258b3..d1236ce2eb 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/ChangeThemeStep.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/ChangeThemeStep.cs @@ -1,5 +1,10 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; +using System.Xml; +using Volo.Abp.Cli.ProjectBuilding.Files; +using Volo.Abp.Cli.ProjectBuilding.Templates.App; +using Volo.Abp.Cli.Utils; namespace Volo.Abp.Cli.ProjectBuilding.Building.Steps; @@ -17,419 +22,138 @@ public class ChangeThemeStep : ProjectBuildPipelineStep case Theme.Basic: ChangeToBasicTheme(context); break; + case Theme.Lepton: + ChangeToLeptonTheme(context); + break; } } protected void ChangeToBasicTheme(ProjectBuildContext context) { - #region MyCompanyName.MyProjectName.Web - - ReplacePackageReferenceWithProjectReference( - context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyCompanyName.MyProjectName.Web.csproj", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite", - @"..\..\..\..\..\modules\basic-theme\src\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.csproj" - ); + var defaultThemeName = context.BuildArgs.TemplateName is AppTemplate.TemplateName or AppNoLayersTemplate.TemplateName + ? "LeptonXLite" + : "LeptonX"; - ChangeNamespaceAndKeyword( - context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyProjectNameWebModule.cs", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic", - "AbpAspNetCoreMvcUiLeptonXLiteThemeModule", - "AbpAspNetCoreMvcUiBasicThemeModule" - ); + #region MVC Projects - ChangeNamespaceAndKeyword( - context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyProjectNameWebModule.cs", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite.Bundling", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Bundling", - "LeptonXLiteThemeBundles.Styles.Global", - "BasicThemeBundles.Styles.Global" - ); + ChangeThemeToBasicForMvcProjects(context, defaultThemeName); #endregion - - #region MyCompanyName.MyProjectName.HttpApi.Host - ReplacePackageReferenceWithProjectReference( - context, - "/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite", - @"..\..\..\..\..\modules\basic-theme\src\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.csproj" - ); - - ChangeNamespaceAndKeyword( - context, - "/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic", - "AbpAspNetCoreMvcUiLeptonXLiteThemeModule", - "AbpAspNetCoreMvcUiBasicThemeModule" - ); - - ChangeNamespaceAndKeyword( - context, - "/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite.Bundling", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Bundling", - "LeptonXLiteThemeBundles.Styles.Global", - "BasicThemeBundles.Styles.Global" - ); - - #endregion - #region MyCompanyName.MyProjectName.Blazor ReplacePackageReferenceWithProjectReference( context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj", - "Volo.Abp.AspNetCore.Components.WebAssembly.LeptonXLiteTheme", + "/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj", + $"Volo.Abp.AspNetCore.Components.WebAssembly.{defaultThemeName}Theme", @"..\..\..\..\..\modules\basic-theme\src\Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme\Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme.csproj" ); ChangeNamespaceAndKeyword( context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyProjectNameBlazorModule.cs", - "Volo.Abp.AspNetCore.Components.WebAssembly.LeptonXLiteTheme", + "/MyCompanyName.MyProjectName.Blazor/MyProjectNameBlazorModule.cs", + $"Volo.Abp.AspNetCore.Components.WebAssembly.{defaultThemeName}Theme", "Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme", - "AbpAspNetCoreComponentsWebAssemblyLeptonXLiteThemeModule", + $"AbpAspNetCoreComponentsWebAssembly{defaultThemeName}ThemeModule", "AbpAspNetCoreComponentsWebAssemblyBasicThemeModule" ); ChangeNamespace( context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyProjectNameBlazorModule.cs", - "Volo.Abp.AspNetCore.Components.Web.LeptonXLiteTheme.Themes.LeptonXLite", + "/MyCompanyName.MyProjectName.Blazor/MyProjectNameBlazorModule.cs", + $"Volo.Abp.AspNetCore.Components.Web.{defaultThemeName}Theme.Components", "Volo.Abp.AspNetCore.Components.Web.BasicTheme.Themes.Basic" ); #endregion - #region MyCompanyName.MyProjectName.Blazor.Server - ReplacePackageReferenceWithProjectReference( - context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj", - "Volo.Abp.AspNetCore.Components.Server.LeptonXLiteTheme", - @"..\..\..\..\..\modules\basic-theme\src\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.csproj" - ); + #region Blazor.Server Projects - ReplacePackageReferenceWithProjectReference( - context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite", - @"..\..\..\..\..\modules\basic-theme\src\Volo.Abp.AspNetCore.Components.Server.BasicTheme\Volo.Abp.AspNetCore.Components.Server.BasicTheme.csproj" - ); - - ChangeNamespaceAndKeyword( - context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyProjectNameBlazorModule.cs", - "Volo.Abp.AspNetCore.Components.Server.LeptonXLiteTheme", - "Volo.Abp.AspNetCore.Components.Server.BasicTheme", - "AbpAspNetCoreComponentsServerLeptonXLiteThemeModule", - "AbpAspNetCoreComponentsServerBasicThemeModule" - ); - - ChangeNamespaceAndKeyword( - context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyProjectNameBlazorModule.cs", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic", - "AbpAspNetCoreMvcUiLeptonXLiteThemeModule", - "AbpAspNetCoreMvcUiBasicThemeModule" - ); - - ChangeNamespaceAndKeyword( - context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyProjectNameBlazorModule.cs", - "Volo.Abp.AspNetCore.Components.Server.LeptonXLiteTheme.Bundling", - "Volo.Abp.AspNetCore.Components.Server.BasicTheme.Bundling", - "LeptonXLiteThemeBundles.Styles.Global", - "BasicThemeBundles.Styles.Global" - ); - - ChangeNamespaceAndKeyword( - context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyProjectNameBlazorModule.cs", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite.Bundling", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Bundling", - "BlazorLeptonXLiteThemeBundles.Styles.Global", - "BlazorBasicThemeBundles.Styles.Global" - ); - - ChangeNamespaceAndKeyword( - context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/Pages/_Host.cshtml", - "Volo.Abp.AspNetCore.Components.Web.LeptonXLiteTheme.Themes.LeptonXLite", - "Volo.Abp.AspNetCore.Components.Web.BasicTheme.Themes.Basic", - "BlazorLeptonXLiteThemeBundles.Styles.Global", - "BlazorBasicThemeBundles.Styles.Global" - ); - - ChangeNamespaceAndKeyword( - context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/Pages/_Host.cshtml", - "Volo.Abp.AspNetCore.Components.Server.LeptonXLiteTheme.Bundling", - "Volo.Abp.AspNetCore.Components.Server.BasicTheme.Bundling", - "BlazorLeptonXLiteThemeBundles.Scripts.Global", - "BlazorBasicThemeBundles.Scripts.Global" - ); + ChangeThemeToBasicForBlazorProjects(context, defaultThemeName); #endregion - - #region MyCompanyName.MyProjectName.Blazor.Server.Tiered - ReplacePackageReferenceWithProjectReference( - context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/MyCompanyName.MyProjectName.Blazor.Server.Tiered.csproj", - "Volo.Abp.AspNetCore.Components.Server.LeptonXLiteTheme", - @"..\..\..\..\..\modules\basic-theme\src\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.csproj" - ); + #region Angular - ReplacePackageReferenceWithProjectReference( - context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/MyCompanyName.MyProjectName.Blazor.Server.Tiered.csproj", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite", - @"..\..\..\..\..\modules\basic-theme\src\Volo.Abp.AspNetCore.Components.Server.BasicTheme\Volo.Abp.AspNetCore.Components.Server.BasicTheme.csproj" - ); - - ChangeNamespaceAndKeyword( - context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/MyProjectNameBlazorModule.cs", - "Volo.Abp.AspNetCore.Components.Server.LeptonXLiteTheme", - "Volo.Abp.AspNetCore.Components.Server.BasicTheme", - "AbpAspNetCoreComponentsServerLeptonXLiteThemeModule", - "AbpAspNetCoreComponentsServerBasicThemeModule" - ); - - ChangeNamespaceAndKeyword( - context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/MyProjectNameBlazorModule.cs", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic", - "AbpAspNetCoreMvcUiLeptonXLiteThemeModule", - "AbpAspNetCoreMvcUiBasicThemeModule" - ); + var angularPackageName = context.BuildArgs.TemplateName is AppTemplate.TemplateName or AppNoLayersTemplate.TemplateName + ? "@abp/ng.theme.lepton-x" + : "@volosoft/abp.ng.theme.lepton-x"; - ChangeNamespaceAndKeyword( - context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/MyProjectNameBlazorModule.cs", - "Volo.Abp.AspNetCore.Components.Server.LeptonXLiteTheme.Bundling", - "Volo.Abp.AspNetCore.Components.Server.BasicTheme.Bundling", - "LeptonXLiteThemeBundles.Styles.Global", - "BasicThemeBundles.Styles.Global" + ReplaceImportPackage( + context, + "/angular/src/app/app.module.ts", + angularPackageName, + "@abp/ng.theme.basic" ); - - ChangeNamespaceAndKeyword( + + RemoveLinesByStatement( context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/MyProjectNameBlazorModule.cs", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite.Bundling", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Bundling", - "BlazorLeptonXLiteThemeBundles.Styles.Global", - "BlazorBasicThemeBundles.Styles.Global" + "/angular/src/app/app.module.ts", + "SideMenuLayoutModule" ); - - - ChangeNamespaceAndKeyword( + + ReplaceMethodNames( context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/Pages/_Host.cshtml", - "Volo.Abp.AspNetCore.Components.Web.LeptonXLiteTheme.Themes.LeptonXLite", - "Volo.Abp.AspNetCore.Components.Web.BasicTheme.Themes.Basic", - "BlazorLeptonXLiteThemeBundles.Styles.Global", - "BlazorBasicThemeBundles.Styles.Global" + "/angular/src/app/app.module.ts", + "ThemeLeptonXModule", + "ThemeBasicModule" ); - ChangeNamespaceAndKeyword( + RemoveLinesByStatement( context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/Pages/_Host.cshtml", - "Volo.Abp.AspNetCore.Components.Server.LeptonXLiteTheme.Bundling", - "Volo.Abp.AspNetCore.Components.Server.BasicTheme.Bundling", - "BlazorLeptonXLiteThemeBundles.Scripts.Global", - "BlazorBasicThemeBundles.Scripts.Global" + "/angular/angular.json", + "node_modules/bootstrap-icons/font/bootstrap-icons.css" ); - + #endregion - - #region MyCompanyName.MyProjectName.AuthServer + } - ReplacePackageReferenceWithProjectReference( - context, - "/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/MyCompanyName.MyProjectName.AuthServer.csproj", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite", - @"..\..\..\..\..\modules\basic-theme\src\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.csproj" - ); + protected void ChangeToLeptonTheme(ProjectBuildContext context) + { + #region Common - ChangeNamespaceAndKeyword( - context, - "/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/MyProjectNameAuthServerModule.cs", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic", - "AbpAspNetCoreMvcUiLeptonXLiteThemeModule", - "AbpAspNetCoreMvcUiBasicThemeModule" - ); - - ChangeNamespaceAndKeyword( - context, - "/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/MyProjectNameAuthServerModule.cs", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite.Bundling", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Bundling", - "LeptonXLiteThemeBundles.Styles.Global", - "BasicThemeBundles.Styles.Global" - ); + RenameLeptonXFolders(context, folderName: "Lepton"); + AddLeptonThemeManagementReferenceToProjects(context); #endregion - - #region MyCompanyName.MyProjectName.Web.Mvc - - ReplacePackageReferenceWithProjectReference( - context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Web.Mvc/MyCompanyName.MyProjectName.Web.Mvc.csproj", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite", - @"..\..\..\..\..\modules\basic-theme\src\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.csproj" - ); - - ChangeNamespaceAndKeyword( - context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Web.Mvc/MyProjectNameWebModule.cs", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic", - "AbpAspNetCoreMvcUiLeptonXLiteThemeModule", - "AbpAspNetCoreMvcUiBasicThemeModule" - ); - ChangeNamespaceAndKeyword( - context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Web.Mvc/MyProjectNameWebModule.cs", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite.Bundling", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Bundling", - "LeptonXLiteThemeBundles.Styles.Global", - "BasicThemeBundles.Styles.Global" - ); - - #endregion - - #region MyCompanyName.MyProjectName.Web.Mvc.Mongo + #region MVC Projects - ReplacePackageReferenceWithProjectReference( - context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Web.Mvc.Mongo/MyCompanyName.MyProjectName.Web.Mvc.Mongo.csproj", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite", - @"..\..\..\..\..\modules\basic-theme\\src\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.csproj" - ); - - ChangeNamespaceAndKeyword( - context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Web.Mvc.Mongo/MyProjectNameWebModule.cs", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic", - "AbpAspNetCoreMvcUiLeptonXLiteThemeModule", - "AbpAspNetCoreMvcUiBasicThemeModule" - ); + ChangeThemeToLeptonForMvcProjects(context); - ChangeNamespaceAndKeyword( - context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Web.Mvc.Mongo/MyProjectNameWebModule.cs", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite.Bundling", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Bundling", - "LeptonXLiteThemeBundles.Styles.Global", - "BasicThemeBundles.Styles.Global" - ); - #endregion - #region MyCompanyName.MyProjectName.Blazor.Server - (app-nolayers) - - ChangeNamespaceAndKeyword( - context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/MyProjectNameModule.cs", - "Volo.Abp.AspNetCore.Components.Server.LeptonXLiteTheme", - "Volo.Abp.AspNetCore.Components.Server.BasicTheme", - "AbpAspNetCoreComponentsServerLeptonXLiteThemeModule", - "AbpAspNetCoreComponentsServerBasicThemeModule" - ); + #region MyCompanyName.MyProjectName.Blazor - ChangeNamespaceAndKeyword( + ReplacePackageReferenceWithProjectReference( context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/MyProjectNameModule.cs", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic", - "AbpAspNetCoreMvcUiLeptonXLiteThemeModule", - "AbpAspNetCoreMvcUiBasicThemeModule" + "/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj", + "Volo.Abp.AspNetCore.Components.WebAssembly.LeptonXTheme", + @"..\..\..\..\..\lepton-theme\src\Volo.Abp.AspNetCore.Components.WebAssembly.LeptonTheme\Volo.Abp.AspNetCore.Components.WebAssembly.LeptonTheme.csproj" ); ChangeNamespaceAndKeyword( context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/MyProjectNameModule.cs", - "Volo.Abp.AspNetCore.Components.Server.LeptonXLiteTheme.Bundling", - "Volo.Abp.AspNetCore.Components.Server.BasicTheme.Bundling", - "LeptonXLiteThemeBundles.Styles.Global", - "BasicThemeBundles.Styles.Global" + "/MyCompanyName.MyProjectName.Blazor/MyProjectNameBlazorModule.cs", + "Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components", + "Volo.Abp.AspNetCore.Components.Web.LeptonTheme.Components", + "AbpAspNetCoreComponentsWebAssemblyLeptonXThemeModule", + "AbpAspNetCoreComponentsWebAssemblyLeptonThemeModule" ); - - ChangeNamespaceAndKeyword( + + ChangeNamespace( context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/MyProjectNameModule.cs", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite.Bundling", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Bundling", - "BlazorLeptonXLiteThemeBundles.Styles.Global", - "BlazorBasicThemeBundles.Styles.Global" + "/MyCompanyName.MyProjectName.Blazor/MyProjectNameBlazorModule.cs", + "Volo.Abp.AspNetCore.Components.WebAssembly.LeptonXTheme", + "Volo.Abp.AspNetCore.Components.WebAssembly.LeptonTheme" ); - + #endregion - - #region MyCompanyName.MyProjectName.Blazor.Server.Mongo - ReplacePackageReferenceWithProjectReference( - context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyCompanyName.MyProjectName.Blazor.Server.Mongo.csproj", - "Volo.Abp.AspNetCore.Components.Server.LeptonXLiteTheme", - @"..\..\..\..\..\modules\basic-theme\src\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.csproj" - ); - - ReplacePackageReferenceWithProjectReference( - context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyCompanyName.MyProjectName.Blazor.Server.Mongo.csproj", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite", - @"..\..\..\..\..\modules\basic-theme\src\Volo.Abp.AspNetCore.Components.Server.BasicTheme\Volo.Abp.AspNetCore.Components.Server.BasicTheme.csproj" - ); - - ChangeNamespaceAndKeyword( - context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyProjectNameModule.cs", - "Volo.Abp.AspNetCore.Components.Server.LeptonXLiteTheme", - "Volo.Abp.AspNetCore.Components.Server.BasicTheme", - "AbpAspNetCoreComponentsServerLeptonXLiteThemeModule", - "AbpAspNetCoreComponentsServerBasicThemeModule" - ); - - ChangeNamespaceAndKeyword( - context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyProjectNameModule.cs", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic", - "AbpAspNetCoreMvcUiLeptonXLiteThemeModule", - "AbpAspNetCoreMvcUiBasicThemeModule" - ); - - ChangeNamespaceAndKeyword( - context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyProjectNameModule.cs", - "Volo.Abp.AspNetCore.Components.Server.LeptonXLiteTheme.Bundling", - "Volo.Abp.AspNetCore.Components.Server.BasicTheme.Bundling", - "LeptonXLiteThemeBundles.Styles.Global", - "BasicThemeBundles.Styles.Global" - ); - - ChangeNamespaceAndKeyword( - context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyProjectNameModule.cs", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite.Bundling", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Bundling", - "BlazorLeptonXLiteThemeBundles.Styles.Global", - "BlazorBasicThemeBundles.Styles.Global" - ); - + #region MyCompanyName.MyProjectName.Blazor.Server && MyCompanyName.MyProjectName.Blazor.Server.Tiered + + ChangeThemeToLeptonForBlazorServerProjects(context); + #endregion #region Angular @@ -437,33 +161,229 @@ public class ChangeThemeStep : ProjectBuildPipelineStep ReplaceImportPackage( context, "/angular/src/app/app.module.ts", - "@abp/ng.theme.lepton-x", - "@abp/ng.theme.basic" + "@volosoft/abp.ng.theme.lepton-x", + "@volo/abp.ng.theme.lepton" ); RemoveLinesByStatement( context, "/angular/src/app/app.module.ts", - "SideMenuLayoutModule" + "SideMenuLayoutModule" ); ReplaceMethodNames( context, "/angular/src/app/app.module.ts", "ThemeLeptonXModule", - "ThemeBasicModule" + "ThemeLeptonModule" + ); + + RemoveLinesByStatement( + context, + "/angular/angular.json", + "node_modules/bootstrap-icons/font/bootstrap-icons.css" ); #endregion + + #region MyCompanyName.MyProjectName.Mvc && MyCompanyName.MyProjectName.Mvc.Mongo + + var projectNames = new[] {"Web", "HttpApi", "Application"}; + ConfigureLeptonManagementPackagesForNoLayersMvc(context, @"/MyCompanyName.MyProjectName.Mvc/MyCompanyName.MyProjectName.csproj", projectNames); + + #endregion + + #region MyCompanyName.MyProjectName.Blazor.Server && MyCompanyName.MyProjectName.Blazor.Server.Mongo - (app-nolayers) + + ChangeThemeToLeptonForNoLayersBlazorServerProjects(context); + + #endregion + } + + private void ConfigureLeptonManagementPackagesForNoLayersMvc(ProjectBuildContext context, string targetProjectPath, string[] projectNames) + { + var file = context.Files.FirstOrDefault(f => !f.Name.Contains("Test") && f.Name.Contains(targetProjectPath) && f.Name.Contains(".csproj")); + if (file == null) + { + return; + } + + foreach (var projectName in projectNames) + { + var moduleFile = ConvertProjectFileToModuleFile(context, file); + if (moduleFile == null) + { + continue; + } + + AddProjectReference(file, $@"..\..\..\..\lepton-theme\src\Volo.Abp.LeptonTheme.Management.{projectName}\Volo.Abp.LeptonTheme.Management.{projectName}.csproj"); + AddModuleDependency(moduleFile, projectName, $"LeptonThemeManagement{ConvertProjectNameToModuleName($"{projectName}")}Module"); + } + } + + private void ChangeThemeToLeptonForMvcProjects(ProjectBuildContext context) + { + var projectNames = new[] + { + ".Web", ".HttpApi.Host", ".AuthServer", + "" //for app-nolayers-mvc + }; + + foreach (var projectName in projectNames) + { + var projectPath = $"/MyCompanyName.MyProjectName{projectName}/MyCompanyName.MyProjectName{projectName}.csproj"; + var projectFile = context.Files.FirstOrDefault(x => x.Name.Contains(projectPath)); + if (projectFile == null) + { + continue; + } + + var moduleFile = ConvertProjectFileToModuleFile(context, projectFile); + if (moduleFile == null) + { + continue; + } + + ReplacePackageReferenceWithProjectReference( + context, + projectFile.Name, + "Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonX", + @"..\..\..\..\..\lepton-theme\src\Volo.Abp.AspNetCore.Mvc.UI.Theme.Lepton\Volo.Abp.AspNetCore.Mvc.UI.Theme.Lepton.csproj" + ); + + ChangeNamespaceAndKeyword( + context, + moduleFile.Name, + "Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonX.Bundling", + "Volo.Abp.AspNetCore.Mvc.UI.Theme.Lepton.Bundling", + "LeptonXThemeBundles.Styles.Global", + "LeptonThemeBundles.Styles.Global" + ); + + ChangeNamespaceAndKeyword( + context, + moduleFile.Name, + "Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonX", + "Volo.Abp.AspNetCore.Mvc.UI.Theme.Lepton", + "AbpAspNetCoreMvcUiLeptonXThemeModule", + "AbpAspNetCoreMvcUiLeptonThemeModule" + ); + + RemoveLinesByStatement( + context, + moduleFile.Name, + "Volo.Abp.LeptonX.Shared;" + ); + } + } + + private void AddLeptonThemeManagementReferenceToProjects(ProjectBuildContext context) + { + var projects = new Dictionary + { + {"Domain", "MyCompanyName.MyProjectName.Domain.csproj"}, + {"Domain.Shared", "MyCompanyName.MyProjectName.Domain.Shared.csproj"}, + {"Application", "MyCompanyName.MyProjectName.Application.csproj"}, + {"Application.Contracts", "MyCompanyName.MyProjectName.Application.Contracts.csproj"}, + {"HttpApi", "MyCompanyName.MyProjectName.HttpApi.csproj"}, + {"HttpApi.Client", "MyCompanyName.MyProjectName.HttpApi.Client.csproj"} + }; + + AddUiProjectToProjects(projects, context); + + foreach (var project in projects) + { + AddLeptonThemeManagementReference(context, project); + } + + var microserviceServiceProjects = new Dictionary + { + {"Domain", "MyCompanyName.MyProjectName.AdministrationService.Domain.csproj"}, + {"Domain.Shared", "MyCompanyName.MyProjectName.AdministrationService.Domain.Shared.csproj"}, + {"Application", "MyCompanyName.MyProjectName.AdministrationService.Application.csproj"}, + {"Application.Contracts", "MyCompanyName.MyProjectName.AdministrationService.Application.Contracts.csproj"}, + {"HttpApi", "MyCompanyName.MyProjectName.AdministrationService.HttpApi.csproj"}, + {"HttpApi.Client", "MyCompanyName.MyProjectName.AdministrationService.HttpApi.Client.csproj"}, + {"Web", "MyCompanyName.MyProjectName.AdministrationService.Web.csproj"} + }; + + foreach (var microserviceServiceProject in microserviceServiceProjects) + { + AddLeptonThemeManagementReference(context, microserviceServiceProject); + } + } + + private void AddUiProjectToProjects(Dictionary projects, ProjectBuildContext context) + { + if (projects.IsNullOrEmpty()) + { + return; + } + + switch (context.BuildArgs.UiFramework) + { + case UiFramework.Mvc: + projects["Web.Host"] = "MyCompanyName.MyProjectName.Web.Host.csproj"; + projects["Web"] = "MyCompanyName.MyProjectName.Web.csproj"; + break; + case UiFramework.Blazor: + projects["Blazor.WebAssembly"] = "MyCompanyName.MyProjectName.Blazor.csproj"; + break; + case UiFramework.BlazorServer: + projects["Blazor.Server"] = "MyCompanyName.MyProjectName.Blazor.csproj"; + break; + } } + private void AddLeptonThemeManagementReference(ProjectBuildContext context, KeyValuePair projectInfo) + { + var reference = $@"..\..\..\..\..\lepton-theme\src\Volo.Abp.LeptonTheme.Management.{projectInfo.Key}\Volo.Abp.LeptonTheme.Management.{projectInfo.Key}.csproj"; + var projectFile = context.Files.FirstOrDefault(f => !f.Name.Contains("Test") && f.Name.Contains(projectInfo.Value) && f.Name.Contains(".csproj")); + if (projectFile is null) + { + return; + } + + var moduleFile = ConvertProjectFileToModuleFile(context, projectFile); + if (moduleFile == null) + { + return; + } + + AddProjectReference(projectFile, reference); + + AddModuleDependency(moduleFile, projectInfo.Key, $"LeptonThemeManagement{ConvertProjectNameToModuleName(projectInfo.Key)}Module", + underManagementFolder: projectInfo.Key != "HttpApi"); + } + + private void AddModuleDependency(FileEntry moduleFile, string projectName, string dependency, bool underManagementFolder = true) + { + var projectNames = new[] { "Blazor", "Blazor.Server", "Blazor.WebAssembly" }; + + var lines = moduleFile.GetLines(); + for (var i = 0; i < lines.Length; i++) + { + if (lines[i].Contains("namespace MyCompanyName.MyProjectName")) + { + lines[i - 1] = lines[i - 1] + ("using Volo.Abp.LeptonTheme" + (underManagementFolder ? ".Management." : ".") + (projectNames.Any(p => p == projectName) ? projectName : "")).TrimEnd('.').EnsureEndsWith(';') + Environment.NewLine; + } + + if (lines[i].Contains("public class MyProjectName") && lines[i-1].Contains(")]")) + { + lines[i - 2] = lines[i - 2] + "," + Environment.NewLine + $"\ttypeof({dependency})"; + } + } + + moduleFile.SetLines(lines); + } + protected void ReplacePackageReferenceWithProjectReference( ProjectBuildContext context, string targetProjectFilePath, string packageReference, string projectReference) { - var file = context.FindFile(targetProjectFilePath); + var file = context.Files.FirstOrDefault(x => x.Name.Contains(targetProjectFilePath)); if (file == null) { return; @@ -490,8 +410,7 @@ public class ChangeThemeStep : ProjectBuildPipelineStep string oldKeyword, string newKeyword) { - var file = context.FindFile(targetModuleFilePath); - + var file = context.Files.FirstOrDefault(x => x.Name.Contains(targetModuleFilePath)); if (file == null) { return; @@ -505,7 +424,7 @@ public class ChangeThemeStep : ProjectBuildPipelineStep { if (lines[i].Contains($"using {oldNamespace}")) { - lines[i] = $"using {newNamespace};"; + lines[i] = lines[i].Replace($"using {oldNamespace}", $"using {newNamespace}"); } else if (lines[i].Contains(oldKeyword)) { @@ -522,8 +441,7 @@ public class ChangeThemeStep : ProjectBuildPipelineStep string oldNamespace, string newNamespace) { - var file = context.FindFile(targetModuleFilePath); - + var file = context.Files.FirstOrDefault(x => x.Name.Contains(targetModuleFilePath)); if (file == null) { return; @@ -534,9 +452,9 @@ public class ChangeThemeStep : ProjectBuildPipelineStep var lines = file.GetLines(); for (var i = 0; i < lines.Length; i++) { - if (lines[i].Contains($"using {oldNamespace};")) + if (lines[i].Contains($"using {oldNamespace}")) { - lines[i] = $"using {newNamespace};"; + lines[i] = lines[i].Replace($"using {oldNamespace}", $"using {newNamespace}"); } } @@ -549,8 +467,7 @@ public class ChangeThemeStep : ProjectBuildPipelineStep string oldImportPackage, string newImportPackage) { - var file = context.FindFile(filePath); - + var file = context.Files.FirstOrDefault(x => x.Name.Contains(filePath)); if (file == null) { return; @@ -573,8 +490,7 @@ public class ChangeThemeStep : ProjectBuildPipelineStep string filePath, string statement) { - var file = context.FindFile(filePath); - + var file = context.Files.FirstOrDefault(x => x.Name.Contains(filePath)); if (file == null) { return; @@ -600,8 +516,7 @@ public class ChangeThemeStep : ProjectBuildPipelineStep string oldMethodName, string newMethodName) { - var file = context.FindFile(filePath); - + var file = context.Files.FirstOrDefault(x => x.Name.Contains(filePath)); if (file == null) { return; @@ -620,4 +535,380 @@ public class ChangeThemeStep : ProjectBuildPipelineStep file.SetLines(lines); } + + private static void AddProjectReference(FileEntry file, string reference) + { + if (!file.Name.Contains(".csproj")) + { + return; + } + + var doc = new XmlDocument() { PreserveWhitespace = true }; + using (var stream = StreamHelper.GenerateStreamFromString(file.Content)) + { + doc.Load(stream); + + var itemGroupNodes = doc.SelectNodes("/Project/ItemGroup"); + XmlNode itemGroupNode = null; + + if (itemGroupNodes == null || itemGroupNodes.Count < 1) + { + var projectNodes = doc.SelectNodes("/Project"); + var projectNode = projectNodes![0]; + + itemGroupNode = doc.CreateElement("ItemGroup"); + projectNode.AppendChild(itemGroupNode); + } + else + { + for (var i = 0; i < itemGroupNodes.Count; i++) + { + if (itemGroupNode is not null) + { + break; + } + for (var j = 0; j < itemGroupNodes[i].ChildNodes.Count; j++) + { + if (itemGroupNodes[i].ChildNodes[j].Name != "ProjectReference" || itemGroupNodes[i].ChildNodes[j].NodeType != XmlNodeType.Element) + { + continue; + } + + itemGroupNode = itemGroupNodes[i]; + break; + } + } + } + + itemGroupNode ??= itemGroupNodes[0]; + + var packageReferenceNode = doc.CreateElement("ProjectReference"); + + var includeAttr = doc.CreateAttribute("Include"); + includeAttr.Value = reference; + packageReferenceNode.Attributes.Append(includeAttr); + + itemGroupNode.AppendChild(doc.CreateTextNode("\t")); + itemGroupNode.AppendChild(packageReferenceNode); + itemGroupNode.AppendChild(doc.CreateTextNode(Environment.NewLine)); + file.SetContent(doc.OuterXml); + } + } + + private static FileEntry ConvertProjectFileToModuleFile(ProjectBuildContext context, FileEntry projectFile) + { + var splittedProjectFileName = projectFile.Name.RemovePostFix("/").Split("/"); + + splittedProjectFileName = splittedProjectFileName.Take(splittedProjectFileName.Length - 1).ToArray(); + + var fileName = splittedProjectFileName?.Last(); + if (fileName == null) + { + return null; + } + + fileName = fileName + .Replace("MyCompanyName.", "") + .Replace(".csproj", "Module") + .Replace(".", ""); + + return context.Files.FirstOrDefault(f => f.Name.Contains(splittedProjectFileName.Last() + "/" + fileName) && f.Name.EndsWith("Module.cs")); + } + + private static string ConvertProjectNameToModuleName(string moduleName) + { + return moduleName.Replace(".", ""); + } + + private static void RenameLeptonXFolders(ProjectBuildContext context, string folderName) + { + var leptonXFiles = context.Files.Where(x => x.Name.Contains("LeptonX") && x.IsDirectory); + foreach (var file in leptonXFiles) + { + new MoveFolderStep(file.Name, file.Name.Replace("LeptonX", folderName)).Execute(context); + } + } + + private void ChangeThemeToBasicForMvcProjects(ProjectBuildContext context, string defaultThemeName) + { + var projects = new Dictionary + { + {".Web", "MyProjectNameWebModule"}, + {".HttpApi.Host", "MyProjectNameHttpApiHostModule"}, + {".AuthServer", "MyProjectNameAuthServerModule"}, + {"", "MyProjectNameWebModule"} + }; + + foreach (var project in projects) + { + ReplacePackageReferenceWithProjectReference( + context, + $"/MyCompanyName.MyProjectName{project.Key}/MyCompanyName.MyProjectName{project.Key}.csproj", + $"Volo.Abp.AspNetCore.Mvc.UI.Theme.{defaultThemeName}", + @"..\..\..\..\..\modules\basic-theme\src\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.csproj" + ); + + ChangeNamespaceAndKeyword( + context, + $"/MyCompanyName.MyProjectName{project.Key}/{project.Value}.cs", + $"Volo.Abp.AspNetCore.Mvc.UI.Theme.{defaultThemeName}", + "Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic", + $"AbpAspNetCoreMvcUi{defaultThemeName}ThemeModule", + "AbpAspNetCoreMvcUiBasicThemeModule" + ); + + ChangeNamespaceAndKeyword( + context, + $"/MyCompanyName.MyProjectName{project.Key}/{project.Value}.cs", + $"Volo.Abp.AspNetCore.Mvc.UI.Theme.{defaultThemeName}.Bundling", + "Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Bundling", + $"{defaultThemeName}ThemeBundles.Styles.Global", + "BasicThemeBundles.Styles.Global" + ); + } + } + + private void ChangeThemeToBasicForBlazorProjects(ProjectBuildContext context, string defaultThemeName) + { + var projects = new Dictionary + { + {"Blazor", "MyProjectNameBlazorModule"}, + {"Blazor.Server.Tiered", "MyProjectNameBlazorModule"}, + {"Blazor.Server", "MyProjectNameModule"}, + {"Blazor.Server.Mongo", "MyProjectNameModule"} + }; + + foreach (var project in projects) + { + ReplacePackageReferenceWithProjectReference( + context, + $"/MyCompanyName.MyProjectName.{project.Key}/MyCompanyName.MyProjectName.{project.Key}.csproj", + $"Volo.Abp.AspNetCore.Components.Server.{defaultThemeName}Theme", + @"..\..\..\..\..\modules\basic-theme\src\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.csproj" + ); + + ReplacePackageReferenceWithProjectReference( + context, + $"/MyCompanyName.MyProjectName.{project.Key}/MyCompanyName.MyProjectName.{project.Key}.csproj", + $"Volo.Abp.AspNetCore.Mvc.UI.Theme.{defaultThemeName}", + @"..\..\..\..\..\modules\basic-theme\src\Volo.Abp.AspNetCore.Components.Server.BasicTheme\Volo.Abp.AspNetCore.Components.Server.BasicTheme.csproj" + ); + + ChangeNamespaceAndKeyword( + context, + $"/MyCompanyName.MyProjectName.{project.Key}/{project.Value}.cs", + $"Volo.Abp.AspNetCore.Components.Server.{defaultThemeName}Theme", + "Volo.Abp.AspNetCore.Components.Server.BasicTheme", + $"AbpAspNetCoreComponentsServer{defaultThemeName}ThemeModule", + "AbpAspNetCoreComponentsServerBasicThemeModule" + ); + + ChangeNamespaceAndKeyword( + context, + $"/MyCompanyName.MyProjectName.{project.Key}/{project.Value}.cs", + $"Volo.Abp.AspNetCore.Mvc.UI.Theme.{defaultThemeName}", + "Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic", + $"AbpAspNetCoreMvcUi{defaultThemeName}ThemeModule", + "AbpAspNetCoreMvcUiBasicThemeModule" + ); + + ChangeNamespaceAndKeyword( + context, + $"/MyCompanyName.MyProjectName.{project.Key}/{project.Value}.cs", + $"Volo.Abp.AspNetCore.Components.Server.{defaultThemeName}Theme.Bundling", + "Volo.Abp.AspNetCore.Components.Server.BasicTheme.Bundling", + $"{defaultThemeName}ThemeBundles.Styles.Global", + "BasicThemeBundles.Styles.Global" + ); + + ChangeNamespaceAndKeyword( + context, + $"/MyCompanyName.MyProjectName.{project.Key}/{project.Value}.cs", + $"Volo.Abp.AspNetCore.Mvc.UI.Theme.{defaultThemeName}.Bundling", + "Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Bundling", + $"Blazor{defaultThemeName}ThemeBundles.Styles.Global", + "BlazorBasicThemeBundles.Styles.Global" + ); + + ChangeNamespaceAndKeyword( + context, + $"/MyCompanyName.MyProjectName.{project.Key}/Pages/_Host.cshtml", + $"Volo.Abp.AspNetCore.Components.Web.{defaultThemeName}Theme.Components", + "Volo.Abp.AspNetCore.Components.Web.BasicTheme.Themes.Basic", + $"Blazor{defaultThemeName}ThemeBundles.Styles.Global", + "BlazorBasicThemeBundles.Styles.Global" + ); + + ChangeNamespaceAndKeyword( + context, + $"/MyCompanyName.MyProjectName.{project.Key}/Pages/_Host.cshtml", + $"Volo.Abp.AspNetCore.Components.Server.{defaultThemeName}Theme.Bundling", + "Volo.Abp.AspNetCore.Components.Server.BasicTheme.Bundling", + $"Blazor{defaultThemeName}ThemeBundles.Scripts.Global", + "BlazorBasicThemeBundles.Scripts.Global" + ); + } + } + + private void ChangeThemeToLeptonForBlazorServerProjects(ProjectBuildContext context) + { + var projectNames = new[] {"Blazor", "Blazor.Server.Tiered"}; + foreach (var projectName in projectNames) + { + ReplacePackageReferenceWithProjectReference( + context, + $"/MyCompanyName.MyProjectName.{projectName}/MyCompanyName.MyProjectName.{projectName}.csproj", + "Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonX", + @"..\..\..\..\..\lepton-theme\src\Volo.Abp.AspNetCore.Mvc.UI.Theme.Lepton\Volo.Abp.AspNetCore.Mvc.UI.Theme.Lepton.csproj" + ); + + ReplacePackageReferenceWithProjectReference( + context, + $"/MyCompanyName.MyProjectName.{projectName}/MyCompanyName.MyProjectName.{projectName}.csproj", + "Volo.Abp.AspNetCore.Components.Server.LeptonXTheme", + @"..\..\..\..\..\lepton-theme\src\Volo.Abp.AspNetCore.Components.Server.LeptonTheme\Volo.Abp.AspNetCore.Components.Server.LeptonTheme.csproj" + ); + + ChangeNamespaceAndKeyword( + context, + $"/MyCompanyName.MyProjectName.{projectName}/MyProjectNameBlazorModule.cs", + "Volo.Abp.AspNetCore.Components.Server.LeptonXTheme", + "Volo.Abp.AspNetCore.Components.Server.LeptonTheme", + "AbpAspNetCoreComponentsServerLeptonXThemeModule", + "AbpAspNetCoreComponentsServerLeptonThemeModule" + ); + + ChangeNamespaceAndKeyword( + context, + $"/MyCompanyName.MyProjectName.{projectName}/MyProjectNameBlazorModule.cs", + "Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonX", + "Volo.Abp.AspNetCore.Mvc.UI.Theme.Lepton", + "AbpAspNetCoreMvcUiLeptonXThemeModule", + "AbpAspNetCoreMvcUiLeptonThemeModule" + ); + + ChangeNamespaceAndKeyword( + context, + $"/MyCompanyName.MyProjectName.{projectName}/MyProjectNameBlazorModule.cs", + "Volo.Abp.AspNetCore.Components.Server.LeptonXTheme.Bundling", + "Volo.Abp.AspNetCore.Components.Server.LeptonTheme.Bundling", + "LeptonXThemeBundles.Styles.Global", + "LeptonThemeBundles.Styles.Global" + ); + + ChangeNamespaceAndKeyword( + context, + $"/MyCompanyName.MyProjectName.{projectName}/MyProjectNameBlazorModule.cs", + "Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonX.Bundling", + "Volo.Abp.AspNetCore.Mvc.UI.Theme.Lepton.Bundling", + "BlazorLeptonXThemeBundles.Styles.Global", + "BlazorLeptonThemeBundles.Styles.Global" + ); + + ChangeNamespaceAndKeyword( + context, + $"/MyCompanyName.MyProjectName.{projectName}/Pages/_Host.cshtml", + "Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components", + "Volo.Abp.AspNetCore.Components.Web.LeptonTheme.Components", + "BlazorLeptonXThemeBundles.Styles.Global", + "BlazorLeptonThemeBundles.Styles.Global" + ); + + ChangeNamespaceAndKeyword( + context, + $"/MyCompanyName.MyProjectName.{projectName}/Pages/_Host.cshtml", + "Volo.Abp.AspNetCore.Components.Server.LeptonXTheme.Bundling", + "Volo.Abp.AspNetCore.Components.Server.LeptonTheme.Bundling", + "BlazorLeptonXThemeBundles.Scripts.Global", + "BlazorLeptonThemeBundles.Scripts.Global" + ); + + RemoveLinesByStatement( + context, + $"/MyCompanyName.MyProjectName.{projectName}/MyProjectNameBlazorModule.cs", + "Volo.Abp.LeptonX.Shared;" + ); + } + } + + private void ChangeThemeToLeptonForNoLayersBlazorServerProjects(ProjectBuildContext context) + { + var blazorServerProjects = new[] { "Blazor.Server", "HttpApi", "Application" }; + + var projectNames = new[] { "Blazor.Server", "Blazor.Server.Mongo" }; + foreach (var projectName in projectNames) + { + ReplacePackageReferenceWithProjectReference( + context, + $"/MyCompanyName.MyProjectName.{projectName}/MyCompanyName.MyProjectName.{projectName}.csproj", + "Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonX", + @"..\..\..\..\lepton-theme\src\Volo.Abp.AspNetCore.Mvc.UI.Theme.Lepton\Volo.Abp.AspNetCore.Mvc.UI.Theme.Lepton.csproj" + ); + + ReplacePackageReferenceWithProjectReference( + context, + $"/MyCompanyName.MyProjectName.{projectName}/MyCompanyName.MyProjectName.{projectName}.csproj", + "Volo.Abp.AspNetCore.Components.Server.LeptonXTheme", + @"..\..\..\..\lepton-theme\src\Volo.Abp.AspNetCore.Components.Server.LeptonTheme\Volo.Abp.AspNetCore.Components.Server.LeptonTheme.csproj" + ); + + ConfigureLeptonManagementPackagesForNoLayersMvc(context, + $@"/MyCompanyName.MyProjectName.{projectName}/MyCompanyName.MyProjectName.{projectName}.csproj", + blazorServerProjects); + + ChangeNamespaceAndKeyword( + context, + $"/MyCompanyName.MyProjectName.{projectName}/MyProjectNameModule.cs", + "Volo.Abp.AspNetCore.Components.Server.LeptonXTheme", + "Volo.Abp.AspNetCore.Components.Server.LeptonTheme", + "AbpAspNetCoreComponentsServerLeptonXThemeModule", + "AbpAspNetCoreComponentsServerLeptonThemeModule" + ); + + ChangeNamespaceAndKeyword( + context, + $"/MyCompanyName.MyProjectName.{projectName}/MyProjectNameModule.cs", + "Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonX", + "Volo.Abp.AspNetCore.Mvc.UI.Theme.Lepton", + "AbpAspNetCoreMvcUiLeptonXThemeModule", + "AbpAspNetCoreMvcUiLeptonThemeModule" + ); + + ChangeNamespaceAndKeyword( + context, + $"/MyCompanyName.MyProjectName.{projectName}/MyProjectNameModule.cs", + "Volo.Abp.AspNetCore.Components.Server.LeptonXTheme.Bundling", + "Volo.Abp.AspNetCore.Components.Server.LeptonTheme.Bundling", + "LeptonXThemeBundles.Styles.Global", + "LeptonThemeBundles.Styles.Global" + ); + + ChangeNamespaceAndKeyword( + context, + $"/MyCompanyName.MyProjectName.{projectName}/MyProjectNameModule.cs", + "Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonX.Bundling", + "Volo.Abp.AspNetCore.Mvc.UI.Theme.Lepton.Bundling", + "BlazorLeptonXThemeBundles.Styles.Global", + "BlazorLeptonThemeBundles.Styles.Global" + ); + + ChangeNamespaceAndKeyword( + context, + $"/MyCompanyName.MyProjectName.{projectName}/Pages/_Host.cshtml", + "Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components", + "Volo.Abp.AspNetCore.Components.Web.LeptonTheme.Components", + "BlazorLeptonXThemeBundles.Styles.Global", + "BlazorLeptonThemeBundles.Styles.Global" + ); + + ChangeNamespaceAndKeyword( + context, + $"/MyCompanyName.MyProjectName.{projectName}/Pages/_Host.cshtml", + "Volo.Abp.AspNetCore.Components.Server.LeptonXTheme.Bundling", + "Volo.Abp.AspNetCore.Components.Server.LeptonTheme.Bundling", + "BlazorLeptonXThemeBundles.Scripts.Global", + "BlazorLeptonThemeBundles.Scripts.Global" + ); + } + } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/ChangeThemeStyleStep.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/ChangeThemeStyleStep.cs new file mode 100644 index 0000000000..5f4a0e5917 --- /dev/null +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/ChangeThemeStyleStep.cs @@ -0,0 +1,79 @@ +using System.Collections.Generic; +using System.Linq; + +namespace Volo.Abp.Cli.ProjectBuilding.Building.Steps; + +public class ChangeThemeStyleStep : ProjectBuildPipelineStep +{ + public override void Execute(ProjectBuildContext context) + { + if (context.BuildArgs.Theme != Theme.LeptonX) + { + return; + } + + switch (context.BuildArgs.ThemeStyle) + { + case ThemeStyle.Dim: + ChangeThemeStyle(context, themeStyleName: "Dim"); + break; + case ThemeStyle.Light: + ChangeThemeStyle(context, themeStyleName: "Light"); + break; + case ThemeStyle.Dark: + ChangeThemeStyle(context, themeStyleName: "Dark"); + break; + } + } + + private void ChangeThemeStyle(ProjectBuildContext context, string themeStyleName) + { + var defaultThemeStyleName = "LeptonXStyleNames.System"; + var newThemeStyleName = $"LeptonXStyleNames.{themeStyleName}"; + + var filePaths = new List + { + "/MyCompanyName.MyProjectName.Web/MyProjectNameWebModule.cs", + "/MyCompanyName.MyProjectName.Web.Host/MyProjectNameWebModule.cs", + "/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs", + "/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyProjectNameHttpApiHostModule.cs", + "/MyCompanyName.MyProjectName.Blazor/MyProjectNameBlazorModule.cs", + "/MyCompanyName.MyProjectName.Blazor.Server/MyProjectNameBlazorModule.cs", + "/MyCompanyName.MyProjectName.Blazor.Server/MyProjectNameModule.cs", + "/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyProjectNameModule.cs", + "/MyCompanyName.MyProjectName.Host/MyProjectNameModule.cs", + "/MyCompanyName.MyProjectName.Host.Mongo/MyProjectNameModule.cs", + "/MyCompanyName.MyProjectName.Mvc/MyProjectNameModule.cs", + "/MyCompanyName.MyProjectName.Mvc.Mongo/MyProjectNameModule.cs", + "/MyCompanyName.MyProjectName.Blazor.Server.Tiered/MyProjectNameBlazorModule.cs", + "/MyCompanyName.MyProjectName.AuthServer/MyProjectNameAuthServerModule.cs", + }; + + foreach(var filePath in filePaths) + { + ChangeThemeStyleName(context, filePath, defaultThemeStyleName, newThemeStyleName); + } + } + + protected void ChangeThemeStyleName(ProjectBuildContext context, string filePath, string oldThemeStyleName, string newThemeStyleName) + { + var file = context.Files.FirstOrDefault(x => x.Name.Contains(filePath)); + if (file == null) + { + return; + } + + file.NormalizeLineEndings(); + + var lines = file.GetLines(); + for (var i = 0; i < lines.Length; i++) + { + if (lines[i].Contains(oldThemeStyleName)) + { + lines[i] = lines[i].Replace(oldThemeStyleName, newThemeStyleName); + } + } + + file.SetLines(lines); + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/CreateAppSettingsSecretsStep.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/CreateAppSettingsSecretsStep.cs index 20e4f8fca6..f0ba4044d1 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/CreateAppSettingsSecretsStep.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/CreateAppSettingsSecretsStep.cs @@ -11,7 +11,7 @@ public class CreateAppSettingsSecretsStep : ProjectBuildPipelineStep public override void Execute(ProjectBuildContext context) { var appSettingsFiles = context.Files - .Where(x => x.Name.EndsWith(CliConsts.AppSettingsJsonFileName) && NotBlazorWasmProject(x.Name)) + .Where(x => x.Name.EndsWith(CliConsts.AppSettingsJsonFileName) && NotBlazorWasmProject(x.Name) && NotInDockerFiles(x.Name)) .ToList(); if (!appSettingsFiles.Any()) @@ -66,6 +66,11 @@ public class CreateAppSettingsSecretsStep : ProjectBuildPipelineStep return !fileName.Contains("Blazor/wwwroot") && !fileName.Contains("Blazor.Host/wwwroot"); } + private static bool NotInDockerFiles(string fileName) + { + return !fileName.Contains("etc/docker/"); + } + private static string ReplaceAppSettingsSecretsPlaceholder(string content) { var path = string.Empty; diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/RemoveDependencyFromPackageJsonFileStep.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/RemoveDependencyFromPackageJsonFileStep.cs index 00f7629f52..3eabb6621e 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/RemoveDependencyFromPackageJsonFileStep.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/RemoveDependencyFromPackageJsonFileStep.cs @@ -17,7 +17,7 @@ public class RemoveDependencyFromPackageJsonFileStep : ProjectBuildPipelineStep public override void Execute(ProjectBuildContext context) { - var packageJsonFile = context.Files.FirstOrDefault(f => f.Name == _packageJsonFilePath); + var packageJsonFile = context.Files.FirstOrDefault(f => f.Name.Contains(_packageJsonFilePath)); if (packageJsonFile == null) { diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/SolutionRenameStep.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/SolutionRenameStep.cs index d584611186..0b8e115dfb 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/SolutionRenameStep.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/SolutionRenameStep.cs @@ -1,7 +1,4 @@ -using System; -using System.Collections.Generic; -using Volo.Abp.Cli.ProjectBuilding.Files; -using Volo.Abp.Cli.ProjectBuilding.Templates.Microservice; +using Volo.Abp.Cli.ProjectBuilding.Templates.Microservice; namespace Volo.Abp.Cli.ProjectBuilding.Building.Steps; @@ -46,62 +43,4 @@ public class SolutionRenameStep : ProjectBuildPipelineStep ).Run(); } } - - private class SolutionRenamer - { - private readonly List _entries; - private readonly string _companyNamePlaceHolder; - private readonly string _projectNamePlaceHolder; - - private readonly string _companyName; - private readonly string _projectName; - - public SolutionRenamer(List entries, string companyNamePlaceHolder, string projectNamePlaceHolder, string companyName, string projectName) - { - if (string.IsNullOrWhiteSpace(companyName)) - { - companyName = null; - } - - if (companyNamePlaceHolder == null && companyName != null) - { - throw new UserFriendlyException($"Can not set {nameof(companyName)} if {nameof(companyNamePlaceHolder)} is null."); - } - - _entries = entries; - - _companyNamePlaceHolder = companyNamePlaceHolder; - _projectNamePlaceHolder = projectNamePlaceHolder ?? throw new ArgumentNullException(nameof(projectNamePlaceHolder)); - - _companyName = companyName; - _projectName = projectName ?? throw new ArgumentNullException(nameof(projectName)); - } - - public void Run() - { - if (_companyNamePlaceHolder != null) - { - if (_companyName != null) - { - RenameHelper.RenameAll(_entries, _companyNamePlaceHolder, _companyName); - RenameHelper.RenameAll(_entries, _companyNamePlaceHolder.ToCamelCase(), _companyName.ToCamelCase()); - RenameHelper.RenameAll(_entries, _companyNamePlaceHolder.ToKebabCase(), _companyName.ToKebabCase()); - RenameHelper.RenameAll(_entries, _companyNamePlaceHolder.ToLowerInvariant(), _companyName.ToLowerInvariant()); - } - else - { - RenameHelper.RenameAll(_entries, _companyNamePlaceHolder + "." + _projectNamePlaceHolder, _projectNamePlaceHolder); - RenameHelper.RenameAll(_entries, _companyNamePlaceHolder.ToCamelCase() + "." + _projectNamePlaceHolder.ToCamelCase(), _projectNamePlaceHolder.ToCamelCase()); - RenameHelper.RenameAll(_entries, _companyNamePlaceHolder.ToLowerInvariant() + "." + _projectNamePlaceHolder.ToLowerInvariant(), _projectNamePlaceHolder.ToLowerInvariant()); - RenameHelper.RenameAll(_entries, _companyNamePlaceHolder.ToKebabCase() + "/" + _projectNamePlaceHolder.ToKebabCase(), _projectNamePlaceHolder.ToKebabCase()); - } - } - - RenameHelper.RenameAll(_entries, _projectNamePlaceHolder, _projectName); - RenameHelper.RenameAll(_entries, _projectNamePlaceHolder.ToCamelCase(), _projectName.ToCamelCase()); - RenameHelper.RenameAll(_entries, _projectNamePlaceHolder.ToKebabCase(), _projectName.ToKebabCase()); - RenameHelper.RenameAll(_entries, _projectNamePlaceHolder.ToLowerInvariant(), _projectName.ToLowerInvariant()); - RenameHelper.RenameAll(_entries, _projectNamePlaceHolder.ToSnakeCase().ToUpper(), _projectName.ToSnakeCase().ToUpper()); - } - } -} +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/SolutionRenamer.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/SolutionRenamer.cs new file mode 100644 index 0000000000..36006ecd18 --- /dev/null +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/SolutionRenamer.cs @@ -0,0 +1,63 @@ +using System; +using System.Collections.Generic; +using Volo.Abp.Cli.ProjectBuilding.Files; + +namespace Volo.Abp.Cli.ProjectBuilding.Building.Steps; + +public class SolutionRenamer +{ + private readonly List _entries; + private readonly string _companyNamePlaceHolder; + private readonly string _projectNamePlaceHolder; + + private readonly string _companyName; + private readonly string _projectName; + + public SolutionRenamer(List entries, string companyNamePlaceHolder, string projectNamePlaceHolder, string companyName, string projectName) + { + if (string.IsNullOrWhiteSpace(companyName)) + { + companyName = null; + } + + if (companyNamePlaceHolder == null && companyName != null) + { + throw new UserFriendlyException($"Can not set {nameof(companyName)} if {nameof(companyNamePlaceHolder)} is null."); + } + + _entries = entries; + + _companyNamePlaceHolder = companyNamePlaceHolder; + _projectNamePlaceHolder = projectNamePlaceHolder ?? throw new ArgumentNullException(nameof(projectNamePlaceHolder)); + + _companyName = companyName; + _projectName = projectName ?? throw new ArgumentNullException(nameof(projectName)); + } + + public void Run() + { + if (_companyNamePlaceHolder != null) + { + if (_companyName != null) + { + RenameHelper.RenameAll(_entries, _companyNamePlaceHolder, _companyName); + RenameHelper.RenameAll(_entries, _companyNamePlaceHolder.ToCamelCase(), _companyName.ToCamelCase()); + RenameHelper.RenameAll(_entries, _companyNamePlaceHolder.ToKebabCase(), _companyName.ToKebabCase()); + RenameHelper.RenameAll(_entries, _companyNamePlaceHolder.ToLowerInvariant(), _companyName.ToLowerInvariant()); + } + else + { + RenameHelper.RenameAll(_entries, _companyNamePlaceHolder + "." + _projectNamePlaceHolder, _projectNamePlaceHolder); + RenameHelper.RenameAll(_entries, _companyNamePlaceHolder.ToCamelCase() + "." + _projectNamePlaceHolder.ToCamelCase(), _projectNamePlaceHolder.ToCamelCase()); + RenameHelper.RenameAll(_entries, _companyNamePlaceHolder.ToLowerInvariant() + "." + _projectNamePlaceHolder.ToLowerInvariant(), _projectNamePlaceHolder.ToLowerInvariant()); + RenameHelper.RenameAll(_entries, _companyNamePlaceHolder.ToKebabCase() + "/" + _projectNamePlaceHolder.ToKebabCase(), _projectNamePlaceHolder.ToKebabCase()); + } + } + + RenameHelper.RenameAll(_entries, _projectNamePlaceHolder, _projectName); + RenameHelper.RenameAll(_entries, _projectNamePlaceHolder.ToCamelCase(), _projectName.ToCamelCase()); + RenameHelper.RenameAll(_entries, _projectNamePlaceHolder.ToKebabCase(), _projectName.ToKebabCase()); + RenameHelper.RenameAll(_entries, _projectNamePlaceHolder.ToLowerInvariant(), _projectName.ToLowerInvariant()); + RenameHelper.RenameAll(_entries, _projectNamePlaceHolder.ToSnakeCase().ToUpper(), _projectName.ToSnakeCase().ToUpper()); + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/TemplateCodeDeleteStep.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/TemplateCodeDeleteStep.cs index 44f6d3e0bd..ce61d9775f 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/TemplateCodeDeleteStep.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/TemplateCodeDeleteStep.cs @@ -14,6 +14,8 @@ public class TemplateCodeDeleteStep : ProjectBuildPipelineStep file.Name.EndsWith(".json") || file.Name.EndsWith(".gitignore") || file.Name.EndsWith(".yml") || + file.Name.EndsWith(".yaml") || + file.Name.EndsWith(".md") || file.Name.EndsWith(".ps1") || file.Name.EndsWith(".html") || file.Name.EndsWith(".ts") || diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Theme.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Theme.cs index bc2ba89589..1ef1c0da55 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Theme.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Theme.cs @@ -1,7 +1,10 @@ namespace Volo.Abp.Cli.ProjectBuilding.Building; -public enum Theme +public enum Theme : byte { - LeptonXLite = 0, - Basic = 1 + NotSpecified = 0, + Basic = 1, + Lepton = 2, + LeptonXLite = 3, + LeptonX = 4 } \ No newline at end of file diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/ThemeStyle.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/ThemeStyle.cs new file mode 100644 index 0000000000..eae3a303ff --- /dev/null +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/ThemeStyle.cs @@ -0,0 +1,8 @@ +namespace Volo.Abp.Cli.ProjectBuilding.Building; +public enum ThemeStyle : byte +{ + System = 0, + Dim = 1, + Light = 2, + Dark = 3 +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Files/FileEntry.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Files/FileEntry.cs index 799c2e2755..c634f09fa8 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Files/FileEntry.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Files/FileEntry.cs @@ -33,10 +33,15 @@ public class FileEntry IsDirectory = isDirectory; Encoding = CalculateEncoding(); - Content = Encoding.GetString(bytes); + Content = GetContent(); IsBinaryFile = CalculateIsBinaryFile(); } + private string GetContent() + { + return Bytes == null ? null : Encoding.GetString(Bytes); + } + public void SetContent(string fileContent) { Content = fileContent; diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/ProjectBuildArgs.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/ProjectBuildArgs.cs index 18edb71863..b4b4429767 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/ProjectBuildArgs.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/ProjectBuildArgs.cs @@ -44,6 +44,8 @@ public class ProjectBuildArgs public Theme? Theme { get; set; } + public ThemeStyle? ThemeStyle { get; set; } + [NotNull] public Dictionary ExtraProperties { get; set; } @@ -63,7 +65,8 @@ public class ProjectBuildArgs Dictionary extraProperties = null, [CanBeNull] string connectionString = null, bool pwa = false, - Theme? theme = null) + Theme? theme = null, + ThemeStyle? themeStyle = null) { SolutionName = Check.NotNull(solutionName, nameof(solutionName)); TemplateName = templateName; @@ -81,5 +84,6 @@ public class ProjectBuildArgs ConnectionString = connectionString; Pwa = pwa; Theme = theme; + ThemeStyle = themeStyle; } } diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/SolutionName.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/SolutionName.cs index 784fca27ad..13f759c851 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/SolutionName.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/SolutionName.cs @@ -19,6 +19,8 @@ public class SolutionName public static SolutionName Parse(string fullName, string microserviceName) { + microserviceName = microserviceName.Replace(".", string.Empty); + return new SolutionName(fullName + "." + microserviceName, fullName, microserviceName); } diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/TemplateProjectBuilder.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/TemplateProjectBuilder.cs index 126e9bdbf9..33c2237773 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/TemplateProjectBuilder.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/TemplateProjectBuilder.cs @@ -71,6 +71,8 @@ public class TemplateProjectBuilder : IProjectBuilder, ITransientDependency args.ExtraProperties.ContainsKey(NewCommand.Options.Preview.Long) ); + ConfigureThemeOptions(args, templateFile.Version); + DeveloperApiKeyResult apiKeyResult = null; #if DEBUG @@ -207,4 +209,37 @@ public class TemplateProjectBuilder : IProjectBuilder, ITransientDependency return TemplateInfoProvider.Get(args.TemplateName); } } + + private bool IsThemeOptionEnabled(ProjectBuildArgs args, string templateVersion) + { + var version = string.IsNullOrWhiteSpace(args.Version) + ? templateVersion + : args.Version; + + if (!SemanticVersion.TryParse(version, out var semanticVersion)) + { + return false; + } + + return semanticVersion >= SemanticVersion.Parse("6.0.0-rc.1"); + } + + private void ConfigureThemeOptions(ProjectBuildArgs args, string templateVersion) + { + if (!IsThemeOptionEnabled(args, templateVersion)) + { + args.Theme = null; + args.ThemeStyle = null; + } + + if (args.Theme.HasValue) + { + Logger.LogInformation("Theme: " + args.Theme); + } + + if(args.ThemeStyle.HasValue) + { + Logger.LogInformation("Theme Style: " + args.ThemeStyle); + } + } } diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppNoLayersProTemplate.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppNoLayersProTemplate.cs index 7e7be0143f..73f00882bf 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppNoLayersProTemplate.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppNoLayersProTemplate.cs @@ -1,4 +1,6 @@ -namespace Volo.Abp.Cli.ProjectBuilding.Templates.App; +using Volo.Abp.Cli.ProjectBuilding.Building; + +namespace Volo.Abp.Cli.ProjectBuilding.Templates.App; public class AppNoLayersProTemplate : AppNoLayersTemplateBase { @@ -6,6 +8,8 @@ public class AppNoLayersProTemplate : AppNoLayersTemplateBase /// "app-nolayers-pro". /// public const string TemplateName = "app-nolayers-pro"; + + public const Theme DefaultTheme = Theme.LeptonX; public AppNoLayersProTemplate() : base(TemplateName) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppNoLayersTemplate.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppNoLayersTemplate.cs index 24119c43f2..d8bcdfe3f3 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppNoLayersTemplate.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppNoLayersTemplate.cs @@ -1,4 +1,6 @@ -namespace Volo.Abp.Cli.ProjectBuilding.Templates.App; +using Volo.Abp.Cli.ProjectBuilding.Building; + +namespace Volo.Abp.Cli.ProjectBuilding.Templates.App; public class AppNoLayersTemplate : AppNoLayersTemplateBase { @@ -7,6 +9,8 @@ public class AppNoLayersTemplate : AppNoLayersTemplateBase /// public const string TemplateName = "app-nolayers"; + public const Theme DefaultTheme = Theme.LeptonXLite; + public AppNoLayersTemplate() : base(TemplateName) { diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppNoLayersTemplateBase.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppNoLayersTemplateBase.cs index 0f249ceae7..abf1e515df 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppNoLayersTemplateBase.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppNoLayersTemplateBase.cs @@ -41,10 +41,7 @@ public abstract class AppNoLayersTemplateBase : AppTemplateBase break; } - if (context.BuildArgs.DatabaseManagementSystem == DatabaseManagementSystem.PostgreSQL) - { - context.Symbols.Add("dbms:PostgreSQL"); - } + context.Symbols.Add($"dbms:{context.BuildArgs.DatabaseManagementSystem}"); switch (context.BuildArgs.UiFramework) { diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppProTemplate.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppProTemplate.cs index 25a4797f7d..d9f32ee834 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppProTemplate.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppProTemplate.cs @@ -1,4 +1,6 @@ -namespace Volo.Abp.Cli.ProjectBuilding.Templates.App; +using Volo.Abp.Cli.ProjectBuilding.Building; + +namespace Volo.Abp.Cli.ProjectBuilding.Templates.App; public class AppProTemplate : AppTemplateBase { @@ -6,6 +8,8 @@ public class AppProTemplate : AppTemplateBase /// "app-pro". /// public const string TemplateName = "app-pro"; + + public const Theme DefaultTheme = Theme.LeptonX; public AppProTemplate() : base(TemplateName) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplate.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplate.cs index 8c533b1d94..ae9516f597 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplate.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplate.cs @@ -1,4 +1,6 @@ -namespace Volo.Abp.Cli.ProjectBuilding.Templates.App; +using Volo.Abp.Cli.ProjectBuilding.Building; + +namespace Volo.Abp.Cli.ProjectBuilding.Templates.App; public class AppTemplate : AppTemplateBase { @@ -6,6 +8,8 @@ public class AppTemplate : AppTemplateBase /// "app". /// public const string TemplateName = "app"; + + public const Theme DefaultTheme = Theme.LeptonXLite; public AppTemplate() : base(TemplateName) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateBase.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateBase.cs index 2503378828..22d33be136 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateBase.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateBase.cs @@ -1,9 +1,12 @@ using System; using System.Collections.Generic; +using System.Linq; using NuGet.Versioning; using Volo.Abp.Cli.Commands; using Volo.Abp.Cli.ProjectBuilding.Building; using Volo.Abp.Cli.ProjectBuilding.Building.Steps; +using Volo.Abp.Cli.ProjectBuilding.Templates.Maui; +using Volo.Abp.Cli.ProjectBuilding.Templates.Microservice; namespace Volo.Abp.Cli.ProjectBuilding.Templates.App; @@ -34,6 +37,7 @@ public abstract class AppTemplateBase : TemplateInfo ConfigureTieredArchitecture(context, steps); ConfigurePublicWebSite(context, steps); ConfigureTheme(context, steps); + ConfigureVersion(context, steps); RemoveUnnecessaryPorts(context, steps); RandomizeSslPorts(context, steps); RandomizeStringEncryption(context, steps); @@ -106,10 +110,7 @@ public abstract class AppTemplateBase : TemplateInfo steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.MongoDB.Tests", projectFolderPath: "/aspnet-core/test/MyCompanyName.MyProjectName.MongoDB.Tests")); } - if (context.BuildArgs.DatabaseManagementSystem == DatabaseManagementSystem.PostgreSQL) - { - context.Symbols.Add("dbms:PostgreSQL"); - } + context.Symbols.Add($"dbms:{context.BuildArgs.DatabaseManagementSystem}"); } protected void DeleteUnrelatedProjects(ProjectBuildContext context, List steps) @@ -159,6 +160,15 @@ public abstract class AppTemplateBase : TemplateInfo steps.Add(new RemoveFolderStep(MobileApp.ReactNative.GetFolderName().EnsureStartsWith('/'))); } + if (context.BuildArgs.MobileApp == MobileApp.Maui) + { + steps.Add(new MauiChangeApplicationIdGuidStep()); + } + else + { + steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.Maui")); + } + if (!context.BuildArgs.PublicWebSite) { steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.Web.Public")); @@ -183,56 +193,86 @@ public abstract class AppTemplateBase : TemplateInfo { return; } + + if (context.BuildArgs.Theme != Theme.NotSpecified) + { + context.Symbols.Add(context.BuildArgs.Theme.Value.ToString().ToUpper()); + } + + if (context.BuildArgs.Theme == Theme.LeptonX) + { + steps.Add(new ChangeThemeStyleStep()); + } - if (context.BuildArgs.Theme != Theme.LeptonXLite) + if (IsDefaultThemeForTemplate(context.BuildArgs.Theme.Value)) { - steps.Add(new ChangeThemeStep()); - RemoveLeptonXThemePackagesFromPackageJsonFiles(steps); + return; } + + steps.Add(new ChangeThemeStep()); + RemoveLeptonXThemePackagesFromPackageJsonFiles(steps, isProTemplate: IsPro(), uiFramework: context.BuildArgs.UiFramework); } - private void RemoveLeptonXThemePackagesFromPackageJsonFiles(List steps) + private static bool IsDefaultThemeForTemplate(Theme theme) { - var packageJsonFilePaths = new List() - { - "/aspnet-core/src/MyCompanyName.MyProjectName.Web/package.json", - "/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/package.json", - "/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/package.json", - "/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/package.json", - "/aspnet-core/MyCompanyName.MyProjectName.Mvc/package.json", - "/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/package.json", - "/aspnet-core/MyCompanyName.MyProjectName.Host/package.json", - "/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/package.json", - }; - - var blazorServerPackageJsonFilePaths = new List() + var defaultThemesForTemplates = new[] { - "/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/package.json", - "/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/package.json", - "/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/package.json", - "/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/package.json" + AppTemplate.DefaultTheme, AppProTemplate.DefaultTheme, + AppNoLayersTemplate.DefaultTheme, AppNoLayersProTemplate.DefaultTheme }; - - var angularPackageJsonFilePaths = new List() - { - "/angular/package.json" + + return defaultThemesForTemplates.Any(defaultTheme => defaultTheme == theme); + } + + private static void RemoveLeptonXThemePackagesFromPackageJsonFiles(List steps, bool isProTemplate, UiFramework uiFramework) + { + var mvcUiPackageName = isProTemplate ? "@volo/abp.aspnetcore.mvc.ui.theme.leptonx" : "@abp/aspnetcore.mvc.ui.theme.leptonxlite"; + var packageJsonFilePaths = new List + { + "/MyCompanyName.MyProjectName.Web/package.json", + "/MyCompanyName.MyProjectName.Web.Host/package.json", + "/MyCompanyName.MyProjectName.HttpApi.HostWithIds/package.json", + "/MyCompanyName.MyProjectName.HttpApi.Host/package.json", + "/MyCompanyName.MyProjectName.AuthServer/package.json", + "/MyCompanyName.MyProjectName/package.json", + "/MyCompanyName.MyProjectName.Host/package.json", + "/MyCompanyName.MyProjectName.Host.Mongo/package.json" }; - + foreach (var packageJsonFilePath in packageJsonFilePaths) { - steps.Add(new RemoveDependencyFromPackageJsonFileStep(packageJsonFilePath, "@abp/aspnetcore.mvc.ui.theme.leptonxlite")); + steps.Add(new RemoveDependencyFromPackageJsonFileStep(packageJsonFilePath, mvcUiPackageName)); } - foreach (var blazorServerPackageJsonFilePath in blazorServerPackageJsonFilePaths) + if (uiFramework == UiFramework.BlazorServer) { - steps.Add(new RemoveDependencyFromPackageJsonFileStep(blazorServerPackageJsonFilePath, "@abp/aspnetcore.mvc.ui.theme.leptonxlite")); - steps.Add(new RemoveDependencyFromPackageJsonFileStep(blazorServerPackageJsonFilePath, "@abp/aspnetcore.components.server.leptonxlitetheme")); + var blazorServerUiPackageName = isProTemplate ? "@volo/aspnetcore.components.server.leptonxtheme" : "@abp/aspnetcore.components.server.leptonxlitetheme"; + var blazorServerPackageJsonFilePaths = new List + { + "/MyCompanyName.MyProjectName.Blazor/package.json", + "/MyCompanyName.MyProjectName.Blazor.Server.Tiered/package.json", + "/MyCompanyName.MyProjectName.Blazor.Server.Mongo/package.json" + }; + + foreach (var blazorServerPackageJsonFilePath in blazorServerPackageJsonFilePaths) + { + steps.Add(new RemoveDependencyFromPackageJsonFileStep(blazorServerPackageJsonFilePath, mvcUiPackageName)); + steps.Add(new RemoveDependencyFromPackageJsonFileStep(blazorServerPackageJsonFilePath, blazorServerUiPackageName)); + } } - - foreach (var angularPackageJsonFilePath in angularPackageJsonFilePaths) + else if (uiFramework == UiFramework.Angular) { - steps.Add(new RemoveDependencyFromPackageJsonFileStep(angularPackageJsonFilePath, "@abp/ng.theme.lepton-x")); - steps.Add(new RemoveDependencyFromPackageJsonFileStep(angularPackageJsonFilePath, "bootstrap-icons")); + var ngUiPackageName = isProTemplate ? "@volosoft/abp.ng.theme.lepton-x" : "@abp/ng.theme.lepton-x"; + var angularPackageJsonFilePaths = new List + { + "/angular/package.json" + }; + + foreach (var angularPackageJsonFilePath in angularPackageJsonFilePaths) + { + steps.Add(new RemoveDependencyFromPackageJsonFileStep(angularPackageJsonFilePath, ngUiPackageName)); + steps.Add(new RemoveDependencyFromPackageJsonFileStep(angularPackageJsonFilePath, "bootstrap-icons")); + } } } @@ -459,6 +499,14 @@ public abstract class AppTemplateBase : TemplateInfo steps.Add(new RemoveUnnecessaryPortsStep()); } + protected void ConfigureVersion(ProjectBuildContext context, List steps) + { + if (context.BuildArgs.Version == null || SemanticVersion.Parse(context.BuildArgs.Version) >= SemanticVersion.Parse("6.0.0-rc.1")) + { + context.Symbols.Add("newer-than-6.0"); + } + } + protected void RandomizeSslPorts(ProjectBuildContext context, List steps) { if (context.BuildArgs.ExtraProperties.ContainsKey("no-random-port")) @@ -548,27 +596,41 @@ public abstract class AppTemplateBase : TemplateInfo { case UiFramework.None: steps.Add(new RemoveFileStep("/aspnet-core/etc/docker/docker-compose.Blazor.yml")); + steps.Add(new RemoveFileStep("/aspnet-core/etc/docker/docker-compose.Blazor.Server.yml")); steps.Add(new RemoveFileStep("/aspnet-core/etc/docker/docker-compose.Mvc.yml")); steps.Add(new RemoveFileStep("/aspnet-core/etc/docker/dynamic-env.json")); + steps.Add(new RemoveFileStep("/aspnet-core/etc/docker/appsettings.json")); steps.Add(new MoveFileStep("/aspnet-core/etc/docker/docker-compose.Angular.yml", "/aspnet-core/etc/docker/docker-compose.yml")); break; case UiFramework.Angular: steps.Add(new RemoveFileStep("/aspnet-core/etc/docker/docker-compose.Blazor.yml")); + steps.Add(new RemoveFileStep("/aspnet-core/etc/docker/docker-compose.Blazor.Server.yml")); steps.Add(new RemoveFileStep("/aspnet-core/etc/docker/docker-compose.Mvc.yml")); + steps.Add(new RemoveFileStep("/aspnet-core/etc/docker/appsettings.json")); steps.Add(new MoveFileStep("/aspnet-core/etc/docker/docker-compose.Angular.yml", "/aspnet-core/etc/docker/docker-compose.yml")); break; case UiFramework.Blazor: - case UiFramework.BlazorServer: steps.Add(new RemoveFileStep("/aspnet-core/etc/docker/docker-compose.Angular.yml")); + steps.Add(new RemoveFileStep("/aspnet-core/etc/docker/docker-compose.Blazor.Server.yml")); steps.Add(new RemoveFileStep("/aspnet-core/etc/docker/docker-compose.Mvc.yml")); steps.Add(new RemoveFileStep("/aspnet-core/etc/docker/dynamic-env.json")); steps.Add(new MoveFileStep("/aspnet-core/etc/docker/docker-compose.Blazor.yml", "/aspnet-core/etc/docker/docker-compose.yml")); break; + case UiFramework.BlazorServer: + steps.Add(new RemoveFileStep("/aspnet-core/etc/docker/docker-compose.Angular.yml")); + steps.Add(new RemoveFileStep("/aspnet-core/etc/docker/docker-compose.Mvc.yml")); + steps.Add(new RemoveFileStep("/aspnet-core/etc/docker/docker-compose.Blazor.yml")); + steps.Add(new RemoveFileStep("/aspnet-core/etc/docker/dynamic-env.json")); + steps.Add(new RemoveFileStep("/aspnet-core/etc/docker/appsettings.json")); + steps.Add(new MoveFileStep("/aspnet-core/etc/docker/docker-compose.Blazor.Server.yml", "/aspnet-core/etc/docker/docker-compose.yml")); + break; case UiFramework.NotSpecified: case UiFramework.Mvc: steps.Add(new RemoveFileStep("/aspnet-core/etc/docker/docker-compose.Blazor.yml")); + steps.Add(new RemoveFileStep("/aspnet-core/etc/docker/docker-compose.Blazor.Server.yml")); steps.Add(new RemoveFileStep("/aspnet-core/etc/docker/docker-compose.Angular.yml")); steps.Add(new RemoveFileStep("/aspnet-core/etc/docker/dynamic-env.json")); + steps.Add(new RemoveFileStep("/aspnet-core/etc/docker/appsettings.json")); steps.Add(new MoveFileStep("/aspnet-core/etc/docker/docker-compose.Mvc.yml", "/aspnet-core/etc/docker/docker-compose.yml")); break; } diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/Microservice/MicroserviceProTemplate.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/Microservice/MicroserviceProTemplate.cs index 6741a142dd..43b0884835 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/Microservice/MicroserviceProTemplate.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/Microservice/MicroserviceProTemplate.cs @@ -1,4 +1,6 @@ -namespace Volo.Abp.Cli.ProjectBuilding.Templates.Microservice; +using Volo.Abp.Cli.ProjectBuilding.Building; + +namespace Volo.Abp.Cli.ProjectBuilding.Templates.Microservice; public class MicroserviceProTemplate : MicroserviceTemplateBase { @@ -7,6 +9,8 @@ public class MicroserviceProTemplate : MicroserviceTemplateBase /// public const string TemplateName = "microservice-pro"; + public const Theme DefaultTheme = Theme.LeptonX; + public MicroserviceProTemplate() : base(TemplateName) { diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/Microservice/MicroserviceTemplateBase.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/Microservice/MicroserviceTemplateBase.cs index 309afae446..54d234b5c3 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/Microservice/MicroserviceTemplateBase.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/Microservice/MicroserviceTemplateBase.cs @@ -24,9 +24,76 @@ public abstract class MicroserviceTemplateBase : TemplateInfo DeleteUnrelatedProjects(context, steps); RandomizeStringEncryption(context, steps); UpdateNuGetConfig(context, steps); + ConfigureTheme(context, steps); return steps; } + + protected void ConfigureTheme(ProjectBuildContext context, List steps) + { + if (!context.BuildArgs.Theme.HasValue) + { + return; + } + + if (context.BuildArgs.Theme != Theme.NotSpecified) + { + context.Symbols.Add(context.BuildArgs.Theme.Value.ToString().ToUpper()); + } + + if (context.BuildArgs.Theme == Theme.LeptonX) + { + steps.Add(new ChangeThemeStyleStep()); + return; + } + + steps.Add(new ChangeThemeStep()); + RemoveLeptonXThemePackagesFromPackageJsonFiles(steps, uiFramework: context.BuildArgs.UiFramework); + } + + private static void RemoveLeptonXThemePackagesFromPackageJsonFiles(List steps, UiFramework uiFramework) + { + var mvcUiPackageName = "@volo/abp.aspnetcore.mvc.ui.theme.leptonx"; + var packageJsonFilePaths = new List + { + "/MyCompanyName.MyProjectName.AuthServer/package.json", + "/MyCompanyName.MyProjectName.Web/package.json" + }; + + foreach (var packageJsonFilePath in packageJsonFilePaths) + { + steps.Add(new RemoveDependencyFromPackageJsonFileStep(packageJsonFilePath, mvcUiPackageName)); + } + + if (uiFramework == UiFramework.BlazorServer) + { + var blazorServerUiPackageName = "@volo/aspnetcore.components.server.leptonxtheme"; + var blazorServerPackageJsonFilePaths = new List + { + "/MyCompanyName.MyProjectName.Blazor/package.json" + }; + + foreach (var blazorServerPackageJsonFilePath in blazorServerPackageJsonFilePaths) + { + steps.Add(new RemoveDependencyFromPackageJsonFileStep(blazorServerPackageJsonFilePath, mvcUiPackageName)); + steps.Add(new RemoveDependencyFromPackageJsonFileStep(blazorServerPackageJsonFilePath, blazorServerUiPackageName)); + } + } + else if (uiFramework == UiFramework.Angular) + { + var ngUiPackageName = "@volosoft/abp.ng.theme.lepton-x"; + var angularPackageJsonFilePaths = new List + { + "/angular/package.json" + }; + + foreach (var angularPackageJsonFilePath in angularPackageJsonFilePaths) + { + steps.Add(new RemoveDependencyFromPackageJsonFileStep(angularPackageJsonFilePath, ngUiPackageName)); + steps.Add(new RemoveDependencyFromPackageJsonFileStep(angularPackageJsonFilePath, "bootstrap-icons")); + } + } + } private static void DeleteUnrelatedProjects(ProjectBuildContext context, List steps) { @@ -71,6 +138,8 @@ public abstract class MicroserviceTemplateBase : TemplateInfo steps.Add(new RemoveFolderStep("/apps/blazor")); steps.Add(new RemoveProjectFromTyeStep("blazor")); steps.Add(new RemoveProjectFromTyeStep("blazor-server")); + + context.Symbols.Add("ui:angular"); break; case UiFramework.Blazor: @@ -88,7 +157,8 @@ public abstract class MicroserviceTemplateBase : TemplateInfo null, "/apps/blazor/src/MyCompanyName.MyProjectName.Blazor.Server")); steps.Add(new RemoveProjectFromTyeStep("blazor-server")); - + + context.Symbols.Add("ui:blazor"); break; case UiFramework.BlazorServer: @@ -110,7 +180,8 @@ public abstract class MicroserviceTemplateBase : TemplateInfo steps.Add(new TemplateProjectRenameStep("MyCompanyName.MyProjectName.Blazor.Server", "MyCompanyName.MyProjectName.Blazor")); steps.Add(new RenameProjectInTyeStep("blazor-server", "blazor")); - + + context.Symbols.Add("ui:blazor-server"); break; case UiFramework.Mvc: @@ -127,6 +198,8 @@ public abstract class MicroserviceTemplateBase : TemplateInfo steps.Add(new RemoveProjectFromTyeStep("blazor-server")); steps.Add(new RemoveFolderStep("/apps/angular")); + + context.Symbols.Add("ui:mvc"); break; } diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/AngularPwaSupportAdder.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/AngularPwaSupportAdder.cs index 891ac28ecb..86880aaacf 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/AngularPwaSupportAdder.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/AngularPwaSupportAdder.cs @@ -30,6 +30,6 @@ public class AngularPwaSupportAdder : ITransientDependency { var directory = Path.GetDirectoryName(filePath).EnsureEndsWith(Path.DirectorySeparatorChar); - CmdHelper.RunCmd("ng add @angular/pwa --skip-confirmation", workingDirectory: directory); + CmdHelper.RunCmd("ng add @angular/pwa@13 --skip-confirmation", workingDirectory: directory); } } diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/AngularSourceCodeAdder.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/AngularSourceCodeAdder.cs index 9847a2b7a5..84e995f1fd 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/AngularSourceCodeAdder.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/AngularSourceCodeAdder.cs @@ -246,6 +246,17 @@ public class AngularSourceCodeAdder : ITransientDependency foreach (var folder in angularPathsInDownloadedSourceCode) { + var nodeModulesFolder = Path.Combine(folder, "node_modules"); + var vscodeFolder = Path.Combine(folder, ".vscode"); + if (Directory.Exists(nodeModulesFolder)) + { + Directory.Delete(nodeModulesFolder, true); + } + if (Directory.Exists(vscodeFolder)) + { + Directory.Delete(vscodeFolder, true); + } + var projectsInFolder = Directory.GetDirectories(folder); if (projectsInFolder.Length == 1 && Path.GetFileName(projectsInFolder[0]) == "projects") @@ -286,7 +297,7 @@ public class AngularSourceCodeAdder : ITransientDependency Directory.Move(projectInFolder, destDirName); } - if (!Directory.GetFiles(folder).Any() && !Directory.GetDirectories(folder).Any()) + if (!Directory.GetDirectories(folder).Any()) { Directory.Delete(folder, true); } diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/SolutionModuleAdder.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/SolutionModuleAdder.cs index 8aa17596a2..ed90d16cfd 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/SolutionModuleAdder.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/SolutionModuleAdder.cs @@ -153,7 +153,7 @@ public class SolutionModuleAdder : ITransientDependency var documentationLink = module.GetFirstDocumentationLinkOrNull(); if (documentationLink != null) { - CmdHelper.OpenWebPage(documentationLink); + CmdHelper.Open(documentationLink); } return module; @@ -427,11 +427,6 @@ public class SolutionModuleAdder : ITransientDependency await PublishEventAsync(9, $"Adding angular source code"); - if (newTemplate) - { - MoveAngularFolderInNewTemplate(modulesFolderInSolution, moduleName); - } - await AngularSourceCodeAdder.AddFromModuleAsync(solutionFilePath, angularPath); } @@ -449,30 +444,6 @@ public class SolutionModuleAdder : ITransientDependency } } - private static void MoveAngularFolderInNewTemplate(string modulesFolderInSolution, string moduleName) - { - var moduleAngularFolder = Path.Combine(modulesFolderInSolution, moduleName, "angular"); - - if (!Directory.Exists(moduleAngularFolder)) - { - return; - } - - var files = Directory.GetFiles(moduleAngularFolder); - var folders = Directory.GetDirectories(moduleAngularFolder); - - Directory.CreateDirectory(Path.Combine(moduleAngularFolder, moduleName)); - - foreach (var file in files) - { - File.Move(file, Path.Combine(moduleAngularFolder, moduleName, Path.GetFileName(file))); - } - foreach (var folder in folders) - { - Directory.Move(folder, Path.Combine(moduleAngularFolder, moduleName, Path.GetFileName(folder))); - } - } - private async Task DownloadSourceCodesToSolutionFolder(ModuleWithMastersInfo module, string modulesFolderInSolution, string version = null, bool newTemplate = false, bool newProTemplate = false) @@ -518,6 +489,7 @@ public class SolutionModuleAdder : ITransientDependency args.Options.Add("t", newProTemplate ? ModuleProTemplate.TemplateName : ModuleTemplate.TemplateName); args.Options.Add("v", version); args.Options.Add("o", Path.Combine(modulesFolderInSolution, module.Name)); + args.Options.Add("sib", true.ToString()); await NewCommand.ExecuteAsync(args); } diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/SolutionPackageVersionFinder.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/SolutionPackageVersionFinder.cs index f33d7f8ff1..060a8cb8f2 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/SolutionPackageVersionFinder.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/SolutionPackageVersionFinder.cs @@ -1,5 +1,6 @@ -using System.IO; -using System.Text.RegularExpressions; +using System.Collections.Generic; +using System.IO; +using System.Linq; using System.Xml; using NuGet.Versioning; using Volo.Abp.Cli.Utils; @@ -9,13 +10,13 @@ namespace Volo.Abp.Cli.ProjectModification; public class SolutionPackageVersionFinder : ITransientDependency { - public string Find(string solutionFile, string packagePrefix = "Volo.Abp") + public string Find(string solutionFile, string packagePrefix = "Volo.Abp", string excludedKeywords = "LeptonX") { var projectFilesUnderSrc = GetProjectFilesOfSolution(solutionFile); foreach (var projectFile in projectFilesUnderSrc) { var content = File.ReadAllText(projectFile); - if (TryParseVersionFromCsprojViaXmlDocument(content, out var s, packagePrefix)) + if (TryParseVersionFromCsprojViaXmlDocument(content, out var s, packagePrefix, excludedKeywords)) { return s; } @@ -24,14 +25,35 @@ public class SolutionPackageVersionFinder : ITransientDependency return null; } - private static bool TryParseVersionFromCsprojViaXmlDocument(string content, out string version, string packagePrefix) + private static bool TryParseVersionFromCsprojViaXmlDocument(string content, out string version, string packagePrefix, string excludedKeywords) { var doc = new XmlDocument() { PreserveWhitespace = true }; using (var stream = StreamHelper.GenerateStreamFromString(content)) { doc.Load(stream); var nodes = doc.SelectNodes($"/Project/ItemGroup/PackageReference[starts-with(@Include, '{packagePrefix}')]"); - var value = nodes?[0]?.Attributes?["Version"]?.Value; + + var targetNodes = new List(); + + foreach (XmlNode node in nodes!) + { + var packageId = node!.Attributes["Include"]?.Value; + + if (excludedKeywords.Split(',').Any(ek => packageId!.Contains(ek))) + { + continue; + } + + targetNodes.Add(node); + } + + if (!targetNodes.Any()) + { + version = null; + return false; + } + + var value = targetNodes.First().Attributes?["Version"]?.Value; if (value == null) { version = null; @@ -43,40 +65,17 @@ public class SolutionPackageVersionFinder : ITransientDependency } } - public static bool TryParseVersionFromCsprojFile(string csprojContent, out string version, string packagePrefix = "Volo.Abp") + public static bool TryParseVersionFromCsprojFile(string csprojContent, out string version, string packagePrefix = "Volo.Abp", string excludedKeywords = "LeptonX") { - try - { - var matches = Regex.Matches(csprojContent, - @"PackageReference\s*Include\s*=\s*\""" + packagePrefix + @"(.*?)\""\s*Version\s*=\s*\""(.*?)\""", - RegexOptions.IgnoreCase | - RegexOptions.IgnorePatternWhitespace | - RegexOptions.Singleline | RegexOptions.Multiline); - - foreach (Match match in matches) - { - if (match.Groups.Count > 2) - { - version = match.Groups[2].Value; - return true; - } - } - } - catch - { - //ignored - } - - version = null; - return false; + return TryParseVersionFromCsprojViaXmlDocument(csprojContent, out version, packagePrefix, excludedKeywords); } - public static bool TryParseSemanticVersionFromCsprojFile(string csprojContent, out SemanticVersion version, string packagePrefix = "Volo.Abp") + public static bool TryParseSemanticVersionFromCsprojFile(string csprojContent, out SemanticVersion version, string packagePrefix = "Volo.Abp", string excludedKeywords = "LeptonX") { try { - if (TryParseVersionFromCsprojFile(csprojContent, out var versionText, packagePrefix)) + if (TryParseVersionFromCsprojViaXmlDocument(csprojContent, out var versionText, packagePrefix, excludedKeywords)) { return SemanticVersion.TryParse(versionText, out version); } @@ -90,51 +89,6 @@ public class SolutionPackageVersionFinder : ITransientDependency return false; } - public static bool TryFind(string solutionFile, out string version, string packagePrefix = "Volo.Abp") - { - var projectFiles = GetProjectFilesOfSolution(solutionFile); - foreach (var projectFile in projectFiles) - { - var csprojContent = File.ReadAllText(projectFile); - if (TryParseVersionFromCsprojFile(csprojContent, out var parsedVersion, packagePrefix)) - { - version = parsedVersion; - return true; - } - } - - version = null; - return false; - } - - public static bool TryFindSemanticVersion(string solutionFile, out SemanticVersion version, string packagePrefix = "Volo.Abp") - { - var projectFiles = GetProjectFilesOfSolution(solutionFile); - foreach (var projectFile in projectFiles) - { - var csprojContent = File.ReadAllText(projectFile); - if (TryParseSemanticVersionFromCsprojFile(csprojContent, out var parsedVersion, packagePrefix)) - { - version = parsedVersion; - return true; - } - } - - version = null; - return false; - } - - //public static bool TryFindSemanticVersion(string solutionFile, out SemanticVersion version) - //{ - // if (TryFind(solutionFile, out var versionText)) - // { - // return SemanticVersion.TryParse(versionText, out version); - // } - - // version = null; - // return false; - //} - private static string[] GetProjectFilesOfSolution(string solutionFile) { var solutionDirectory = Path.GetDirectoryName(solutionFile); diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/VoloNugetPackagesVersionUpdater.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/VoloNugetPackagesVersionUpdater.cs index 98ad57f4b4..578d010214 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/VoloNugetPackagesVersionUpdater.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/VoloNugetPackagesVersionUpdater.cs @@ -183,11 +183,18 @@ public class VoloNugetPackagesVersionUpdater : ITransientDependency var versionAttribute = package.Attributes["Version"]; var currentVersion = versionAttribute.Value; var currentSemanticVersion = SemanticVersion.Parse(currentVersion); + + var isLeptonXPackage = packageId.Contains("LeptonX"); Logger.LogDebug("Checking package: \"{0}\" - Current version: {1}", packageId, currentSemanticVersion); if (!specifiedVersion.IsNullOrWhiteSpace()) { + if (isLeptonXPackage) + { + continue; + } + if (await SpecifiedVersionExists(specifiedVersion, packageId)) { var specifiedSemanticVersion = SemanticVersion.Parse(specifiedVersion); @@ -210,7 +217,8 @@ public class VoloNugetPackagesVersionUpdater : ITransientDependency { if ((includeNightlyPreviews || (currentVersion.Contains("-preview") && !switchToStable)) && !includeReleaseCandidates) { - var latestVersion = latestMyGetVersion ?? await GetLatestVersionFromMyGet(packageId); + var latestVersion = latestMyGetVersion == null || isLeptonXPackage ? + await GetLatestVersionFromMyGet(packageId) : latestMyGetVersion; if (currentVersion != latestVersion) { @@ -227,11 +235,13 @@ public class VoloNugetPackagesVersionUpdater : ITransientDependency SemanticVersion latestVersion; if (currentSemanticVersion.IsPrerelease && !switchToStable) { - latestVersion = latestNugetReleaseCandidateVersion ?? await _nuGetService.GetLatestVersionOrNullAsync(packageId, includeReleaseCandidates: true); + latestVersion = latestNugetReleaseCandidateVersion == null || isLeptonXPackage ? + await _nuGetService.GetLatestVersionOrNullAsync(packageId, includeReleaseCandidates: true) : latestNugetReleaseCandidateVersion; } else { - latestVersion = latestNugetVersion ?? await _nuGetService.GetLatestVersionOrNullAsync(packageId, includeReleaseCandidates: includeReleaseCandidates); + latestVersion = latestNugetVersion == null || isLeptonXPackage ? + await _nuGetService.GetLatestVersionOrNullAsync(packageId, includeReleaseCandidates: includeReleaseCandidates) : latestNugetVersion; } if (latestVersion != null && (currentSemanticVersion < latestVersion || (currentSemanticVersion.IsPrerelease && switchToStable))) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Utils/CmdHelper.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Utils/CmdHelper.cs index c6325a4681..32c1acf5be 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Utils/CmdHelper.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Utils/CmdHelper.cs @@ -2,6 +2,7 @@ using System.Diagnostics; using System.IO; using System.Runtime.InteropServices; +using Microsoft.Extensions.Options; using Volo.Abp.DependencyInjection; namespace Volo.Abp.Cli.Utils; @@ -10,27 +11,39 @@ public class CmdHelper : ICmdHelper, ITransientDependency { private const int SuccessfulExitCode = 0; - public void OpenWebPage(string url) + protected AbpCliOptions CliOptions { get; } + + public CmdHelper(IOptionsSnapshot cliOptions) + { + CliOptions = cliOptions.Value; + } + + public void Open(string pathOrUrl) { if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { - url = url.Replace("&", "^&"); - Process.Start(new ProcessStartInfo("cmd", $"/c start {url}") { CreateNoWindow = true }); + pathOrUrl = pathOrUrl.Replace("&", "^&"); + Process.Start(new ProcessStartInfo("cmd", $"/c start {pathOrUrl}") { CreateNoWindow = true }); } else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) { - Process.Start("xdg-open", url); + Process.Start("xdg-open", pathOrUrl); } else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) { - Process.Start("open", url); + Process.Start("open", pathOrUrl); } } - public void Run(string file, string arguments) { var procStartInfo = new ProcessStartInfo(file, arguments); + + if (CliOptions.AlwaysHideExternalCommandOutput) + { + HideNewCommandWindow(procStartInfo); + } + Process.Start(procStartInfo)?.WaitForExit(); } @@ -46,6 +59,11 @@ public class CmdHelper : ICmdHelper, ITransientDependency GetArguments(command) ); + if (CliOptions.AlwaysHideExternalCommandOutput) + { + HideNewCommandWindow(procStartInfo); + } + if (!string.IsNullOrEmpty(workingDirectory)) { procStartInfo.WorkingDirectory = workingDirectory; @@ -66,10 +84,14 @@ public class CmdHelper : ICmdHelper, ITransientDependency GetArguments(command) ); + if (CliOptions.AlwaysHideExternalCommandOutput) + { + HideNewCommandWindow(procStartInfo); + } + if (!string.IsNullOrEmpty(workingDirectory)) { procStartInfo.WorkingDirectory = workingDirectory; - procStartInfo.CreateNoWindow = false; } return Process.Start(procStartInfo); @@ -98,6 +120,7 @@ public class CmdHelper : ICmdHelper, ITransientDependency Arguments = GetArguments(command), UseShellExecute = false, CreateNoWindow = true, + WindowStyle = ProcessWindowStyle.Hidden, RedirectStandardOutput = true, RedirectStandardError = true }; @@ -137,6 +160,11 @@ public class CmdHelper : ICmdHelper, ITransientDependency { procStartInfo.WorkingDirectory = workingDirectory; } + + if (CliOptions.AlwaysHideExternalCommandOutput) + { + HideNewCommandWindow(procStartInfo); + } Process.Start(procStartInfo); Environment.Exit(0); @@ -178,4 +206,10 @@ public class CmdHelper : ICmdHelper, ITransientDependency $"Framework: {System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription} | " + $"Process Architecture{System.Runtime.InteropServices.RuntimeInformation.ProcessArchitecture}"); } + + private void HideNewCommandWindow(ProcessStartInfo procStartInfo) + { + procStartInfo.WindowStyle = ProcessWindowStyle.Hidden; + procStartInfo.CreateNoWindow = true; + } } diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Utils/ExceptionMessageHelper.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Utils/ExceptionMessageHelper.cs new file mode 100644 index 0000000000..dd78be14db --- /dev/null +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Utils/ExceptionMessageHelper.cs @@ -0,0 +1,6 @@ +namespace Volo.Abp.Cli.Utils; + +public static class ExceptionMessageHelper +{ + public static string GetInvalidOptionExceptionMessage(string optionName) => $"The option you provided for {optionName} is invalid!"; +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Utils/ICmdHelper.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Utils/ICmdHelper.cs index f96697b1cc..2f71bda7b5 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Utils/ICmdHelper.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Utils/ICmdHelper.cs @@ -4,7 +4,7 @@ namespace Volo.Abp.Cli.Utils; public interface ICmdHelper { - void OpenWebPage(string url); + void Open(string pathOrUrl); void Run(string file, string arguments); diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Utils/NpmHelper.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Utils/NpmHelper.cs index 8923d2ebae..a2d75d48d9 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Utils/NpmHelper.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Utils/NpmHelper.cs @@ -1,4 +1,6 @@ -using Microsoft.Extensions.Logging; +using System; +using System.Linq; +using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using NuGet.Versioning; using Volo.Abp.DependencyInjection; @@ -19,15 +21,30 @@ public class NpmHelper : ITransientDependency public bool IsNpmInstalled() { var output = CmdHelper.RunCmdAndGetOutput("npm -v").Trim(); - return SemanticVersion.TryParse(output, out _); + var outputLines = output.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries); + + return outputLines.Any(ol => SemanticVersion.TryParse(ol, out _)); } public bool IsYarnAvailable() { var output = CmdHelper.RunCmdAndGetOutput("yarn -v").Trim(); - if (!SemanticVersion.TryParse(output, out var version)){ + var outputLines = output.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries); + SemanticVersion version = null; + + foreach (var outputLine in outputLines) + { + if (SemanticVersion.TryParse(outputLine, out version)) + { + break; + } + } + + if (version == null) + { return false; } + return version > SemanticVersion.Parse("1.20.0"); } diff --git a/framework/src/Volo.Abp.Core/Microsoft/Extensions/Configuration/AbpConfigurationBuilderOptions.cs b/framework/src/Volo.Abp.Core/Microsoft/Extensions/Configuration/AbpConfigurationBuilderOptions.cs index f922f2b7da..f9f2ca23ad 100644 --- a/framework/src/Volo.Abp.Core/Microsoft/Extensions/Configuration/AbpConfigurationBuilderOptions.cs +++ b/framework/src/Volo.Abp.Core/Microsoft/Extensions/Configuration/AbpConfigurationBuilderOptions.cs @@ -21,6 +21,16 @@ public class AbpConfigurationBuilderOptions /// public string FileName { get; set; } = "appsettings"; + /// + /// Whether the file is optional, Default value: true. + /// + public bool Optional { get; set; } = true; + + /// + /// Whether the configuration should be reloaded if the file changes, Default value: true. + /// + public bool ReloadOnChange { get; set; } = true; + /// /// Environment name. Generally used "Development", "Staging" or "Production". /// diff --git a/framework/src/Volo.Abp.Core/Microsoft/Extensions/Configuration/ConfigurationHelper.cs b/framework/src/Volo.Abp.Core/Microsoft/Extensions/Configuration/ConfigurationHelper.cs index a4dfa48db8..28ea8326ac 100644 --- a/framework/src/Volo.Abp.Core/Microsoft/Extensions/Configuration/ConfigurationHelper.cs +++ b/framework/src/Volo.Abp.Core/Microsoft/Extensions/Configuration/ConfigurationHelper.cs @@ -9,7 +9,7 @@ public static class ConfigurationHelper AbpConfigurationBuilderOptions options = null, Action builderAction = null) { - options = options ?? new AbpConfigurationBuilderOptions(); + options ??= new AbpConfigurationBuilderOptions(); if (options.BasePath.IsNullOrEmpty()) { @@ -18,11 +18,11 @@ public static class ConfigurationHelper var builder = new ConfigurationBuilder() .SetBasePath(options.BasePath) - .AddJsonFile(options.FileName + ".json", optional: true, reloadOnChange: true); + .AddJsonFile(options.FileName + ".json", optional: options.Optional, reloadOnChange: options.ReloadOnChange); if (!options.EnvironmentName.IsNullOrEmpty()) { - builder = builder.AddJsonFile($"{options.FileName}.{options.EnvironmentName}.json", optional: true, reloadOnChange: true); + builder = builder.AddJsonFile($"{options.FileName}.{options.EnvironmentName}.json", optional: options.Optional, reloadOnChange: options.ReloadOnChange); } if (options.EnvironmentName == "Development") diff --git a/framework/src/Volo.Abp.Core/Microsoft/Extensions/DependencyInjection/ServiceCollectionApplicationExtensions.cs b/framework/src/Volo.Abp.Core/Microsoft/Extensions/DependencyInjection/ServiceCollectionApplicationExtensions.cs index ce4af2befa..72ce661ed5 100644 --- a/framework/src/Volo.Abp.Core/Microsoft/Extensions/DependencyInjection/ServiceCollectionApplicationExtensions.cs +++ b/framework/src/Volo.Abp.Core/Microsoft/Extensions/DependencyInjection/ServiceCollectionApplicationExtensions.cs @@ -39,4 +39,10 @@ public static class ServiceCollectionApplicationExtensions { return await AbpApplicationFactory.CreateAsync(startupModuleType, services, optionsAction); } + + [CanBeNull] + public static string GetApplicationName(this IServiceCollection services) + { + return services.GetSingletonInstance().ApplicationName; + } } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationBase.cs b/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationBase.cs index 741f6f0586..87ddf14c1b 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationBase.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationBase.cs @@ -23,6 +23,8 @@ public abstract class AbpApplicationBase : IAbpApplication public IServiceCollection Services { get; } public IReadOnlyList Modules { get; } + + public string ApplicationName { get; } private bool _configuredServices; @@ -41,8 +43,11 @@ public abstract class AbpApplicationBase : IAbpApplication var options = new AbpApplicationCreationOptions(services); optionsAction?.Invoke(options); + + ApplicationName = options.ApplicationName; services.AddSingleton(this); + services.AddSingleton(this); services.AddSingleton(this); services.AddCoreServices(); diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationCreationOptions.cs b/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationCreationOptions.cs index d18e43275b..24a1bf8ee6 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationCreationOptions.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationCreationOptions.cs @@ -20,6 +20,9 @@ public class AbpApplicationCreationOptions public AbpConfigurationBuilderOptions Configuration { get; } public bool SkipConfigureServices { get; set; } + + [CanBeNull] + public string ApplicationName { get; set; } public AbpApplicationCreationOptions([NotNull] IServiceCollection services) { diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationWithInternalServiceProvider.cs b/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationWithInternalServiceProvider.cs index 245ce6fb06..5f09157fcc 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationWithInternalServiceProvider.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationWithInternalServiceProvider.cs @@ -60,6 +60,6 @@ internal class AbpApplicationWithInternalServiceProvider : AbpApplicationBase, I public override void Dispose() { base.Dispose(); - ServiceScope.Dispose(); + ServiceScope?.Dispose(); } } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/AbpLazyServiceProvider.cs b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/AbpLazyServiceProvider.cs index 363c3b3885..3aff8a78ad 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/AbpLazyServiceProvider.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/AbpLazyServiceProvider.cs @@ -1,19 +1,13 @@ using System; -using System.Collections.Generic; -using Microsoft.Extensions.DependencyInjection; namespace Volo.Abp.DependencyInjection; -public class AbpLazyServiceProvider : IAbpLazyServiceProvider, ITransientDependency +[ExposeServices(typeof(IAbpLazyServiceProvider))] +public class AbpLazyServiceProvider : CachedServiceProviderBase, IAbpLazyServiceProvider, ITransientDependency { - protected IDictionary CachedServices { get; set; } - - protected IServiceProvider ServiceProvider { get; set; } - public AbpLazyServiceProvider(IServiceProvider serviceProvider) + : base(serviceProvider) { - ServiceProvider = serviceProvider; - CachedServices = new Dictionary(); } public virtual T LazyGetRequiredService() @@ -23,7 +17,7 @@ public class AbpLazyServiceProvider : IAbpLazyServiceProvider, ITransientDepende public virtual object LazyGetRequiredService(Type serviceType) { - return CachedServices.GetOrAdd(serviceType, () => ServiceProvider.GetRequiredService(serviceType)); + return GetService(serviceType); } public virtual T LazyGetService() @@ -33,7 +27,7 @@ public class AbpLazyServiceProvider : IAbpLazyServiceProvider, ITransientDepende public virtual object LazyGetService(Type serviceType) { - return CachedServices.GetOrAdd(serviceType, () => ServiceProvider.GetService(serviceType)); + return GetService(serviceType); } public virtual T LazyGetService(T defaultValue) @@ -53,6 +47,9 @@ public class AbpLazyServiceProvider : IAbpLazyServiceProvider, ITransientDepende public virtual object LazyGetService(Type serviceType, Func factory) { - return CachedServices.GetOrAdd(serviceType, () => factory(ServiceProvider)); + return CachedServices.GetOrAdd( + serviceType, + _ => new Lazy(() => factory(ServiceProvider)) + ).Value; } } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/CachedServiceProviderBase.cs b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/CachedServiceProviderBase.cs index d543493ce9..c261d3a3bb 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/CachedServiceProviderBase.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/CachedServiceProviderBase.cs @@ -5,21 +5,21 @@ namespace Volo.Abp.DependencyInjection; public abstract class CachedServiceProviderBase { - private readonly IServiceProvider _serviceProvider; - private readonly ConcurrentDictionary> _cachedServices; + protected IServiceProvider ServiceProvider { get; } + protected ConcurrentDictionary> CachedServices { get; } protected CachedServiceProviderBase(IServiceProvider serviceProvider) { - _serviceProvider = serviceProvider; - _cachedServices = new ConcurrentDictionary>(); - _cachedServices.TryAdd(typeof(IServiceProvider), new Lazy(() => _serviceProvider)); + ServiceProvider = serviceProvider; + CachedServices = new ConcurrentDictionary>(); + CachedServices.TryAdd(typeof(IServiceProvider), new Lazy(() => ServiceProvider)); } public virtual object GetService(Type serviceType) { - return _cachedServices.GetOrAdd( + return CachedServices.GetOrAdd( serviceType, - _ => new Lazy(() => _serviceProvider.GetService(serviceType)) + _ => new Lazy(() => ServiceProvider.GetService(serviceType)) ).Value; } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/DefaultServiceScopeFactory.cs b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/DefaultServiceScopeFactory.cs deleted file mode 100644 index befcf7951e..0000000000 --- a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/DefaultServiceScopeFactory.cs +++ /dev/null @@ -1,22 +0,0 @@ -using Microsoft.Extensions.DependencyInjection; - -namespace Volo.Abp.DependencyInjection; - -[ExposeServices( - typeof(IHybridServiceScopeFactory), - typeof(DefaultServiceScopeFactory) - )] -public class DefaultServiceScopeFactory : IHybridServiceScopeFactory, ITransientDependency -{ - protected IServiceScopeFactory Factory { get; } - - public DefaultServiceScopeFactory(IServiceScopeFactory factory) - { - Factory = factory; - } - - public IServiceScope CreateScope() - { - return Factory.CreateScope(); - } -} diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/DisablePropertyInjectionAttribute.cs b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/DisablePropertyInjectionAttribute.cs new file mode 100644 index 0000000000..fad0d7334a --- /dev/null +++ b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/DisablePropertyInjectionAttribute.cs @@ -0,0 +1,9 @@ +using System; + +namespace Volo.Abp.DependencyInjection; + +[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property)] +public class DisablePropertyInjectionAttribute : Attribute +{ + +} diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/IHybridServiceScopeFactory.cs b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/IHybridServiceScopeFactory.cs deleted file mode 100644 index 62c3707352..0000000000 --- a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/IHybridServiceScopeFactory.cs +++ /dev/null @@ -1,8 +0,0 @@ -using Microsoft.Extensions.DependencyInjection; - -namespace Volo.Abp.DependencyInjection; - -public interface IHybridServiceScopeFactory : IServiceScopeFactory -{ - -} diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/IRootServiceProviderAccessor.cs b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/IRootServiceProviderAccessor.cs new file mode 100644 index 0000000000..8a3c1d09a5 --- /dev/null +++ b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/IRootServiceProviderAccessor.cs @@ -0,0 +1,14 @@ +using System; + +namespace Volo.Abp.DependencyInjection; + +/// +/// The root service provider of the application. +/// Be careful to use the root service provider since there is no way +/// to release/dispose objects resolved from the root service provider. +/// So, always create a new scope if you need to resolve any service. +/// +public interface IRootServiceProvider : IServiceProvider +{ + +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/RootServiceProvider.cs b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/RootServiceProvider.cs new file mode 100644 index 0000000000..cbb6fb8984 --- /dev/null +++ b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/RootServiceProvider.cs @@ -0,0 +1,19 @@ +using System; + +namespace Volo.Abp.DependencyInjection; + +[ExposeServices(typeof(IRootServiceProvider))] +public class RootServiceProvider : IRootServiceProvider, ISingletonDependency +{ + protected IServiceProvider ServiceProvider { get; } + + public RootServiceProvider(IObjectAccessor objectAccessor) + { + ServiceProvider = objectAccessor.Value; + } + + public virtual object GetService(Type serviceType) + { + return ServiceProvider.GetService(serviceType); + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/IAbpApplication.cs b/framework/src/Volo.Abp.Core/Volo/Abp/IAbpApplication.cs index 2fb66b735f..35542ee91f 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/IAbpApplication.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/IAbpApplication.cs @@ -5,7 +5,10 @@ using Volo.Abp.Modularity; namespace Volo.Abp; -public interface IAbpApplication : IModuleContainer, IDisposable +public interface IAbpApplication : + IModuleContainer, + IApplicationNameAccessor, + IDisposable { /// /// Type of the startup (entrance) module of the application. @@ -23,7 +26,7 @@ public interface IAbpApplication : IModuleContainer, IDisposable /// This can not be used before initialize the application. /// IServiceProvider ServiceProvider { get; } - + /// /// Calls the Pre/Post/ConfigureServicesAsync methods of the modules. /// If you use this method, you must have set the @@ -40,4 +43,4 @@ public interface IAbpApplication : IModuleContainer, IDisposable /// Used to gracefully shutdown the application and all modules. /// void Shutdown(); -} +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/IApplicationNameAccessor.cs b/framework/src/Volo.Abp.Core/Volo/Abp/IApplicationNameAccessor.cs new file mode 100644 index 0000000000..0047fcbcdf --- /dev/null +++ b/framework/src/Volo.Abp.Core/Volo/Abp/IApplicationNameAccessor.cs @@ -0,0 +1,11 @@ +namespace Volo.Abp; + +public interface IApplicationNameAccessor +{ + /// + /// Name of the application. + /// This is useful for systems with multiple applications, to distinguish + /// resources of the applications located together. + /// + string ApplicationName { get; } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/ISoftDelete.cs b/framework/src/Volo.Abp.Core/Volo/Abp/ISoftDelete.cs index 1d7ba66d81..704dd3ba11 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/ISoftDelete.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/ISoftDelete.cs @@ -9,7 +9,7 @@ public interface ISoftDelete { /// - /// Used to mark an Entity as 'Deleted'. + /// Used to mark an Entity as 'Deleted'. /// - bool IsDeleted { get; set; } + bool IsDeleted { get; } } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/ISimpleStateChecker.cs b/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/ISimpleStateChecker.cs index f1a2e40425..e919b981a6 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/ISimpleStateChecker.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/ISimpleStateChecker.cs @@ -6,4 +6,4 @@ public interface ISimpleStateChecker where TState : IHasSimpleStateCheckers { Task IsEnabledAsync(SimpleStateCheckerContext context); -} +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/ISimpleStateCheckerSerializer.cs b/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/ISimpleStateCheckerSerializer.cs new file mode 100644 index 0000000000..ffbed53cf7 --- /dev/null +++ b/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/ISimpleStateCheckerSerializer.cs @@ -0,0 +1,12 @@ +using System.Text.Json.Nodes; + +namespace Volo.Abp.SimpleStateChecking; + +public interface ISimpleStateCheckerSerializer +{ + public string Serialize(ISimpleStateChecker checker) + where TState : IHasSimpleStateCheckers; + + public ISimpleStateChecker Deserialize(JsonObject jsonObject, TState state) + where TState : IHasSimpleStateCheckers; +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/ISimpleStateCheckerSerializerContributor.cs b/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/ISimpleStateCheckerSerializerContributor.cs new file mode 100644 index 0000000000..d65c90eee6 --- /dev/null +++ b/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/ISimpleStateCheckerSerializerContributor.cs @@ -0,0 +1,15 @@ +using System.Text.Json.Nodes; +using JetBrains.Annotations; + +namespace Volo.Abp.SimpleStateChecking; + +public interface ISimpleStateCheckerSerializerContributor +{ + [CanBeNull] + public string SerializeToJson(ISimpleStateChecker checker) + where TState : IHasSimpleStateCheckers; + + [CanBeNull] + public ISimpleStateChecker Deserialize(JsonObject jsonObject, TState state) + where TState : IHasSimpleStateCheckers; +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/SimpleStateCheckerSerializer.cs b/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/SimpleStateCheckerSerializer.cs new file mode 100644 index 0000000000..d5d931ffae --- /dev/null +++ b/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/SimpleStateCheckerSerializer.cs @@ -0,0 +1,50 @@ +using System.Collections.Generic; +using System.Text.Json.Nodes; +using JetBrains.Annotations; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.SimpleStateChecking; + +public class SimpleStateCheckerSerializer : + ISimpleStateCheckerSerializer, + ISingletonDependency +{ + private readonly IEnumerable _contributors; + + public SimpleStateCheckerSerializer(IEnumerable contributors) + { + _contributors = contributors; + } + + [CanBeNull] + public string Serialize(ISimpleStateChecker checker) + where TState : IHasSimpleStateCheckers + { + foreach (var contributor in _contributors) + { + var result = contributor.SerializeToJson(checker); + if (result != null) + { + return result; + } + } + + return null; + } + + [CanBeNull] + public ISimpleStateChecker Deserialize(JsonObject jsonObject, TState state) + where TState : IHasSimpleStateCheckers + { + foreach (var contributor in _contributors) + { + var result = contributor.Deserialize(jsonObject, state); + if (result != null) + { + return result; + } + } + + return null; + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/SimpleStateCheckerSerializerExtensions.cs b/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/SimpleStateCheckerSerializerExtensions.cs new file mode 100644 index 0000000000..3594261741 --- /dev/null +++ b/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/SimpleStateCheckerSerializerExtensions.cs @@ -0,0 +1,90 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text.Json.Nodes; + +namespace Volo.Abp.SimpleStateChecking; + +public static class SimpleStateCheckerSerializerExtensions +{ + public static string Serialize( + this ISimpleStateCheckerSerializer serializer, + IList> stateCheckers) + where TState : IHasSimpleStateCheckers + { + switch (stateCheckers.Count) + { + case 0: + return null; + case 1: + var serializedChecker = serializer.Serialize(stateCheckers.Single()); + return serializedChecker != null + ? $"[{serializedChecker}]" + : null; + default: + var serializedCheckers = new List(stateCheckers.Count); + + foreach (var stateChecker in stateCheckers) + { + var serialized = serializer.Serialize(stateChecker); + if (serialized != null) + { + serializedCheckers.Add(serialized); + } + } + + return serializedCheckers.Any() + ? $"[{serializedCheckers.JoinAsString(",")}]" + : null; + } + } + + public static ISimpleStateChecker[] DeserializeArray( + this ISimpleStateCheckerSerializer serializer, + string value, + TState state) + where TState : IHasSimpleStateCheckers + { + if (value.IsNullOrWhiteSpace()) + { + return Array.Empty>(); + } + + var array = JsonNode.Parse(value) as JsonArray; + if (array == null || array.Count == 0) + { + return Array.Empty>(); + } + + if (array.Count == 1) + { + var jsonObject = array[0] as JsonObject; + if (jsonObject == null) + { + throw new AbpException("JSON value is not an array of objects: " + value); + } + + var checker = serializer.Deserialize(jsonObject, state); + if (checker == null) + { + return Array.Empty>(); + } + + return new[] { checker }; + } + + var checkers = new List>(); + + for (var i = 0; i < array.Count; i++) + { + if (array[i] is not JsonObject jsonObject) + { + throw new AbpException("JSON value is not an array of objects: " + value); + } + + checkers.Add(serializer.Deserialize(jsonObject, state)); + } + + return checkers.Where(x => x != null).ToArray(); + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Dapr/FodyWeavers.xml b/framework/src/Volo.Abp.Dapr/FodyWeavers.xml new file mode 100644 index 0000000000..be0de3a908 --- /dev/null +++ b/framework/src/Volo.Abp.Dapr/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/studio/source-codes/Volo.Abp.BackgroundJobs.SourceCode/FodyWeavers.xsd b/framework/src/Volo.Abp.Dapr/FodyWeavers.xsd similarity index 100% rename from studio/source-codes/Volo.Abp.BackgroundJobs.SourceCode/FodyWeavers.xsd rename to framework/src/Volo.Abp.Dapr/FodyWeavers.xsd diff --git a/framework/src/Volo.Abp.Dapr/Volo.Abp.Dapr.csproj b/framework/src/Volo.Abp.Dapr/Volo.Abp.Dapr.csproj new file mode 100644 index 0000000000..d3a8651086 --- /dev/null +++ b/framework/src/Volo.Abp.Dapr/Volo.Abp.Dapr.csproj @@ -0,0 +1,21 @@ + + + + + + + net6.0 + enable + enable + + + + + + + + + + + + diff --git a/framework/src/Volo.Abp.Dapr/Volo/Abp/Dapr/AbpDaprClientFactory.cs b/framework/src/Volo.Abp.Dapr/Volo/Abp/Dapr/AbpDaprClientFactory.cs new file mode 100644 index 0000000000..faaf450ddc --- /dev/null +++ b/framework/src/Volo.Abp.Dapr/Volo/Abp/Dapr/AbpDaprClientFactory.cs @@ -0,0 +1,48 @@ +using System.Collections.Concurrent; +using System.Text.Json; +using Dapr.Client; +using Microsoft.Extensions.Options; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Json.SystemTextJson; + +namespace Volo.Abp.Dapr; + +public class AbpDaprClientFactory : ITransientDependency +{ + protected AbpDaprOptions Options { get; } + protected AbpSystemTextJsonSerializerOptions SystemTextJsonSerializerOptions { get; } + + public AbpDaprClientFactory( + IOptions options, + IOptions systemTextJsonSerializerOptions) + { + Options = options.Value; + SystemTextJsonSerializerOptions = systemTextJsonSerializerOptions.Value; + } + + public virtual async Task CreateAsync() + { + var builder = new DaprClientBuilder() + .UseJsonSerializationOptions(await CreateJsonSerializerOptions()); + + if (!Options.HttpEndpoint.IsNullOrWhiteSpace()) + { + builder.UseHttpEndpoint(Options.HttpEndpoint); + } + + if (!Options.GrpcEndpoint.IsNullOrWhiteSpace()) + { + builder.UseGrpcEndpoint(Options.GrpcEndpoint); + } + + return builder.Build(); + } + + private readonly static ConcurrentDictionary JsonSerializerOptionsCache = new ConcurrentDictionary(); + + protected virtual Task CreateJsonSerializerOptions() + { + return Task.FromResult(JsonSerializerOptionsCache.GetOrAdd(nameof(AbpDaprClientFactory), + _ => new JsonSerializerOptions(SystemTextJsonSerializerOptions.JsonSerializerOptions))); + } +} diff --git a/framework/src/Volo.Abp.Dapr/Volo/Abp/Dapr/AbpDaprModule.cs b/framework/src/Volo.Abp.Dapr/Volo/Abp/Dapr/AbpDaprModule.cs new file mode 100644 index 0000000000..43d6d11033 --- /dev/null +++ b/framework/src/Volo.Abp.Dapr/Volo/Abp/Dapr/AbpDaprModule.cs @@ -0,0 +1,15 @@ +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.Json; +using Volo.Abp.Modularity; + +namespace Volo.Abp.Dapr; + +[DependsOn(typeof(AbpJsonModule))] +public class AbpDaprModule : AbpModule +{ + public override void ConfigureServices(ServiceConfigurationContext context) + { + var configuration = context.Services.GetConfiguration(); + Configure(configuration.GetSection("Dapr")); + } +} diff --git a/framework/src/Volo.Abp.Dapr/Volo/Abp/Dapr/AbpDaprOptions.cs b/framework/src/Volo.Abp.Dapr/Volo/Abp/Dapr/AbpDaprOptions.cs new file mode 100644 index 0000000000..9d743263c5 --- /dev/null +++ b/framework/src/Volo.Abp.Dapr/Volo/Abp/Dapr/AbpDaprOptions.cs @@ -0,0 +1,10 @@ +namespace Volo.Abp.Dapr; + +public class AbpDaprOptions +{ + public string AppId { get; set; } + + public string HttpEndpoint { get; set; } + + public string GrpcEndpoint { get; set; } +} diff --git a/framework/src/Volo.Abp.Dapr/Volo/Abp/Dapr/IDaprSerializer.cs b/framework/src/Volo.Abp.Dapr/Volo/Abp/Dapr/IDaprSerializer.cs new file mode 100644 index 0000000000..7eec2c5c1c --- /dev/null +++ b/framework/src/Volo.Abp.Dapr/Volo/Abp/Dapr/IDaprSerializer.cs @@ -0,0 +1,16 @@ +namespace Volo.Abp.Dapr; + +public interface IDaprSerializer +{ + byte[] Serialize(object obj); + + object Deserialize(byte[] value, Type type); + + T Deserialize(byte[] value); + + string SerializeToString(object obj); + + object Deserialize(string value, Type type); + + T Deserialize(string value); +} diff --git a/framework/src/Volo.Abp.Dapr/Volo/Abp/Dapr/Utf8JsonDaprSerializer.cs b/framework/src/Volo.Abp.Dapr/Volo/Abp/Dapr/Utf8JsonDaprSerializer.cs new file mode 100644 index 0000000000..ce9b4a8523 --- /dev/null +++ b/framework/src/Volo.Abp.Dapr/Volo/Abp/Dapr/Utf8JsonDaprSerializer.cs @@ -0,0 +1,45 @@ +using System.Text; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Json; + +namespace Volo.Abp.Dapr; + +public class Utf8JsonDaprSerializer : IDaprSerializer, ITransientDependency +{ + private readonly IJsonSerializer _jsonSerializer; + + public Utf8JsonDaprSerializer(IJsonSerializer jsonSerializer) + { + _jsonSerializer = jsonSerializer; + } + + public byte[] Serialize(object obj) + { + return Encoding.UTF8.GetBytes(_jsonSerializer.Serialize(obj)); + } + + public object Deserialize(byte[] value, Type type) + { + return _jsonSerializer.Deserialize(type, Encoding.UTF8.GetString(value)); + } + + public T Deserialize(byte[] value) + { + return _jsonSerializer.Deserialize(Encoding.UTF8.GetString(value)); + } + + public string SerializeToString(object obj) + { + return _jsonSerializer.Serialize(obj); + } + + public object Deserialize(string value, Type type) + { + return _jsonSerializer.Deserialize(type, value); + } + + public T Deserialize(string value) + { + return _jsonSerializer.Deserialize(value); + } +} diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/EntityChangeEventHelper.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/EntityChangeEventHelper.cs index 8f9be2318f..20556f16ff 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/EntityChangeEventHelper.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/EntityChangeEventHelper.cs @@ -42,18 +42,6 @@ public class EntityChangeEventHelper : IEntityChangeEventHelper, ITransientDepen Logger = NullLogger.Instance; } - public virtual void PublishEntityCreatingEvent(object entity) - { - TriggerEventWithEntity( - LocalEventBus, -#pragma warning disable 618 - typeof(EntityCreatingEventData<>), -#pragma warning restore 618 - entity, - entity - ); - } - public virtual void PublishEntityCreatedEvent(object entity) { TriggerEventWithEntity( @@ -89,18 +77,6 @@ public class EntityChangeEventHelper : IEntityChangeEventHelper, ITransientDepen ); } - public virtual void PublishEntityUpdatingEvent(object entity) - { - TriggerEventWithEntity( - LocalEventBus, -#pragma warning disable 618 - typeof(EntityUpdatingEventData<>), -#pragma warning restore 618 - entity, - entity - ); - } - public virtual void PublishEntityUpdatedEvent(object entity) { TriggerEventWithEntity( @@ -125,18 +101,6 @@ public class EntityChangeEventHelper : IEntityChangeEventHelper, ITransientDepen } } - public virtual void PublishEntityDeletingEvent(object entity) - { - TriggerEventWithEntity( - LocalEventBus, -#pragma warning disable 618 - typeof(EntityDeletingEventData<>), -#pragma warning restore 618 - entity, - entity - ); - } - public virtual void PublishEntityDeletedEvent(object entity) { TriggerEventWithEntity( diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/EntityChangingEventData.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/EntityChangingEventData.cs deleted file mode 100644 index ae24163966..0000000000 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/EntityChangingEventData.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System; - -namespace Volo.Abp.Domain.Entities.Events; - -/// -/// Used to pass data for an event when an entity () is being changed (creating, updating or deleting). -/// See , and classes. -/// -/// Entity type -[Serializable] -[Obsolete("This event is no longer needed and identical to EntityChangedEventData. Please use EntityChangedEventData instead.")] -public class EntityChangingEventData : EntityEventData -{ - /// - /// Constructor. - /// - /// Changing entity in this event - public EntityChangingEventData(TEntity entity) - : base(entity) - { - - } -} diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/EntityCreatingEventData.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/EntityCreatingEventData.cs deleted file mode 100644 index 914c8ca7c7..0000000000 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/EntityCreatingEventData.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; - -namespace Volo.Abp.Domain.Entities.Events; - -/// -/// This type of event is used to notify just before creation of an Entity. -/// -/// Entity type -[Serializable] -[Obsolete("This event is no longer needed and identical to EntityCreatedEventData. Please use EntityCreatedEventData instead.")] -public class EntityCreatingEventData : EntityChangingEventData -{ - /// - /// Constructor. - /// - /// The entity which is being created - public EntityCreatingEventData(TEntity entity) - : base(entity) - { - - } -} diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/EntityDeletingEventData.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/EntityDeletingEventData.cs deleted file mode 100644 index af0d1218f7..0000000000 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/EntityDeletingEventData.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; - -namespace Volo.Abp.Domain.Entities.Events; - -/// -/// This type of event is used to notify just before deletion of an Entity. -/// -/// Entity type -[Serializable] -[Obsolete("This event is no longer needed and identical to EntityDeletedEventData. Please use EntityDeletedEventData instead.")] -public class EntityDeletingEventData : EntityChangingEventData -{ - /// - /// Constructor. - /// - /// The entity which is being deleted - public EntityDeletingEventData(TEntity entity) - : base(entity) - { - - } -} diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/EntityUpdatingEventData.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/EntityUpdatingEventData.cs deleted file mode 100644 index 703304fefb..0000000000 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/EntityUpdatingEventData.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; - -namespace Volo.Abp.Domain.Entities.Events; - -/// -/// This type of event is used to notify just before update of an Entity. -/// -/// Entity type -[Serializable] -[Obsolete("This event is no longer needed and identical to EntityUpdatedEventData. Please use EntityUpdatedEventData instead.")] -public class EntityUpdatingEventData : EntityChangingEventData -{ - /// - /// Constructor. - /// - /// The entity which is being updated - public EntityUpdatingEventData(TEntity entity) - : base(entity) - { - - } -} diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/IEntityChangeEventHelper.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/IEntityChangeEventHelper.cs index db580a0682..aa63c7e3c9 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/IEntityChangeEventHelper.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/IEntityChangeEventHelper.cs @@ -5,12 +5,9 @@ namespace Volo.Abp.Domain.Entities.Events; /// public interface IEntityChangeEventHelper { - void PublishEntityCreatingEvent(object entity); void PublishEntityCreatedEvent(object entity); - void PublishEntityUpdatingEvent(object entity); void PublishEntityUpdatedEvent(object entity); - void PublishEntityDeletingEvent(object entity); void PublishEntityDeletedEvent(object entity); } diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/NullEntityChangeEventHelper.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/NullEntityChangeEventHelper.cs index d428f84d6f..4d849f2f27 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/NullEntityChangeEventHelper.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/NullEntityChangeEventHelper.cs @@ -14,26 +14,14 @@ public class NullEntityChangeEventHelper : IEntityChangeEventHelper { } - public void PublishEntityCreatingEvent(object entity) - { - } - public void PublishEntityCreatedEvent(object entity) { } - public void PublishEntityUpdatingEvent(object entity) - { - } - public void PublishEntityUpdatedEvent(object entity) { } - public void PublishEntityDeletingEvent(object entity) - { - } - public void PublishEntityDeletedEvent(object entity) { } diff --git a/framework/src/Volo.Abp.DistributedLocking.Abstractions/Volo.Abp.DistributedLocking.Abstractions.csproj b/framework/src/Volo.Abp.DistributedLocking.Abstractions/Volo.Abp.DistributedLocking.Abstractions.csproj index ab828ee9d3..19c1b4f869 100644 --- a/framework/src/Volo.Abp.DistributedLocking.Abstractions/Volo.Abp.DistributedLocking.Abstractions.csproj +++ b/framework/src/Volo.Abp.DistributedLocking.Abstractions/Volo.Abp.DistributedLocking.Abstractions.csproj @@ -16,6 +16,7 @@ + diff --git a/framework/src/Volo.Abp.DistributedLocking.Dapr/FodyWeavers.xml b/framework/src/Volo.Abp.DistributedLocking.Dapr/FodyWeavers.xml new file mode 100644 index 0000000000..be0de3a908 --- /dev/null +++ b/framework/src/Volo.Abp.DistributedLocking.Dapr/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/studio/source-codes/Volo.Abp.BasicTheme.SourceCode/FodyWeavers.xsd b/framework/src/Volo.Abp.DistributedLocking.Dapr/FodyWeavers.xsd similarity index 100% rename from studio/source-codes/Volo.Abp.BasicTheme.SourceCode/FodyWeavers.xsd rename to framework/src/Volo.Abp.DistributedLocking.Dapr/FodyWeavers.xsd diff --git a/framework/src/Volo.Abp.DistributedLocking.Dapr/Volo.Abp.DistributedLocking.Dapr.csproj b/framework/src/Volo.Abp.DistributedLocking.Dapr/Volo.Abp.DistributedLocking.Dapr.csproj new file mode 100644 index 0000000000..80cad677a3 --- /dev/null +++ b/framework/src/Volo.Abp.DistributedLocking.Dapr/Volo.Abp.DistributedLocking.Dapr.csproj @@ -0,0 +1,18 @@ + + + + + + + net6.0 + enable + enable + + + + + + + + + diff --git a/framework/src/Volo.Abp.DistributedLocking.Dapr/Volo/Abp/DistributedLocking/Dapr/AbpDistributedLockDaprOptions.cs b/framework/src/Volo.Abp.DistributedLocking.Dapr/Volo/Abp/DistributedLocking/Dapr/AbpDistributedLockDaprOptions.cs new file mode 100644 index 0000000000..43feba3c3b --- /dev/null +++ b/framework/src/Volo.Abp.DistributedLocking.Dapr/Volo/Abp/DistributedLocking/Dapr/AbpDistributedLockDaprOptions.cs @@ -0,0 +1,13 @@ +namespace Volo.Abp.DistributedLocking.Dapr; + +public class AbpDistributedLockDaprOptions +{ + public string StoreName { get; set; } + + public TimeSpan DefaultTimeout { get; set; } + + public AbpDistributedLockDaprOptions() + { + DefaultTimeout = TimeSpan.FromSeconds(30); + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.DistributedLocking.Dapr/Volo/Abp/DistributedLocking/Dapr/AbpDistributedLockingDaprModule.cs b/framework/src/Volo.Abp.DistributedLocking.Dapr/Volo/Abp/DistributedLocking/Dapr/AbpDistributedLockingDaprModule.cs new file mode 100644 index 0000000000..c915cfe2f7 --- /dev/null +++ b/framework/src/Volo.Abp.DistributedLocking.Dapr/Volo/Abp/DistributedLocking/Dapr/AbpDistributedLockingDaprModule.cs @@ -0,0 +1,11 @@ +using Volo.Abp.Dapr; +using Volo.Abp.Modularity; + +namespace Volo.Abp.DistributedLocking.Dapr; + +[DependsOn( + typeof(AbpDistributedLockingAbstractionsModule), + typeof(AbpDaprModule))] +public class AbpDistributedLockingDaprModule : AbpModule +{ +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.DistributedLocking.Dapr/Volo/Abp/DistributedLocking/Dapr/DaprAbpDistributedLock.cs b/framework/src/Volo.Abp.DistributedLocking.Dapr/Volo/Abp/DistributedLocking/Dapr/DaprAbpDistributedLock.cs new file mode 100644 index 0000000000..7f95a56542 --- /dev/null +++ b/framework/src/Volo.Abp.DistributedLocking.Dapr/Volo/Abp/DistributedLocking/Dapr/DaprAbpDistributedLock.cs @@ -0,0 +1,50 @@ +using Microsoft.Extensions.Options; +using Volo.Abp.Dapr; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.DistributedLocking.Dapr; + +[Dependency(ReplaceServices = true)] +public class DaprAbpDistributedLock : IAbpDistributedLock, ITransientDependency +{ + protected AbpDaprClientFactory DaprClientFactory { get; } + protected AbpDistributedLockDaprOptions DistributedLockDaprOptions { get; } + protected AbpDaprOptions DaprOptions { get; } + + public DaprAbpDistributedLock( + AbpDaprClientFactory daprClientFactory, + IOptions distributedLockDaprOptions, + IOptions daprOptions) + { + DaprClientFactory = daprClientFactory; + DaprOptions = daprOptions.Value; + DistributedLockDaprOptions = distributedLockDaprOptions.Value; + } + + public async Task TryAcquireAsync( + string name, + TimeSpan timeout = default, + CancellationToken cancellationToken = default) + { + if (timeout == default) + { + timeout = DistributedLockDaprOptions.DefaultTimeout; + } + + var daprClient = await DaprClientFactory.CreateAsync(); + + var lockResponse = await daprClient.Lock( + DistributedLockDaprOptions.StoreName, + name, + DaprOptions.AppId, + (int)timeout.TotalSeconds, + cancellationToken); + + if (lockResponse == null || !lockResponse.Success) + { + return null; + } + + return new DaprAbpDistributedLockHandle(lockResponse); + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.DistributedLocking.Dapr/Volo/Abp/DistributedLocking/Dapr/DaprAbpDistributedLockHandle.cs b/framework/src/Volo.Abp.DistributedLocking.Dapr/Volo/Abp/DistributedLocking/Dapr/DaprAbpDistributedLockHandle.cs new file mode 100644 index 0000000000..b10f0f3672 --- /dev/null +++ b/framework/src/Volo.Abp.DistributedLocking.Dapr/Volo/Abp/DistributedLocking/Dapr/DaprAbpDistributedLockHandle.cs @@ -0,0 +1,18 @@ +using Dapr.Client; + +namespace Volo.Abp.DistributedLocking.Dapr; + +public class DaprAbpDistributedLockHandle : IAbpDistributedLockHandle +{ + protected TryLockResponse LockResponse { get; } + + public DaprAbpDistributedLockHandle(TryLockResponse lockResponse) + { + LockResponse = lockResponse; + } + + public async ValueTask DisposeAsync() + { + await LockResponse.DisposeAsync(); + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.DistributedLocking/Volo.Abp.DistributedLocking.csproj b/framework/src/Volo.Abp.DistributedLocking/Volo.Abp.DistributedLocking.csproj index fd9b992133..0abb5e699c 100644 --- a/framework/src/Volo.Abp.DistributedLocking/Volo.Abp.DistributedLocking.csproj +++ b/framework/src/Volo.Abp.DistributedLocking/Volo.Abp.DistributedLocking.csproj @@ -16,6 +16,7 @@ + diff --git a/framework/src/Volo.Abp.DistributedLocking/Volo/Abp/DistributedLocking/AbpDistributedLockingModule.cs b/framework/src/Volo.Abp.DistributedLocking/Volo/Abp/DistributedLocking/AbpDistributedLockingModule.cs index 4c4abd3f32..eef5b396a2 100644 --- a/framework/src/Volo.Abp.DistributedLocking/Volo/Abp/DistributedLocking/AbpDistributedLockingModule.cs +++ b/framework/src/Volo.Abp.DistributedLocking/Volo/Abp/DistributedLocking/AbpDistributedLockingModule.cs @@ -1,11 +1,12 @@ using Volo.Abp.Modularity; +using Volo.Abp.Threading; namespace Volo.Abp.DistributedLocking; [DependsOn( - typeof(AbpDistributedLockingAbstractionsModule) + typeof(AbpDistributedLockingAbstractionsModule), + typeof(AbpThreadingModule) )] public class AbpDistributedLockingModule : AbpModule { - } diff --git a/framework/src/Volo.Abp.DistributedLocking/Volo/Abp/DistributedLocking/MedallionAbpDistributedLock.cs b/framework/src/Volo.Abp.DistributedLocking/Volo/Abp/DistributedLocking/MedallionAbpDistributedLock.cs index e78f1934c1..769303a348 100644 --- a/framework/src/Volo.Abp.DistributedLocking/Volo/Abp/DistributedLocking/MedallionAbpDistributedLock.cs +++ b/framework/src/Volo.Abp.DistributedLocking/Volo/Abp/DistributedLocking/MedallionAbpDistributedLock.cs @@ -3,6 +3,7 @@ using System.Threading; using System.Threading.Tasks; using Medallion.Threading; using Volo.Abp.DependencyInjection; +using Volo.Abp.Threading; namespace Volo.Abp.DistributedLocking; @@ -10,10 +11,14 @@ namespace Volo.Abp.DistributedLocking; public class MedallionAbpDistributedLock : IAbpDistributedLock, ITransientDependency { protected IDistributedLockProvider DistributedLockProvider { get; } + protected ICancellationTokenProvider CancellationTokenProvider { get; } - public MedallionAbpDistributedLock(IDistributedLockProvider distributedLockProvider) + public MedallionAbpDistributedLock( + IDistributedLockProvider distributedLockProvider, + ICancellationTokenProvider cancellationTokenProvider) { DistributedLockProvider = distributedLockProvider; + CancellationTokenProvider = cancellationTokenProvider; } public async Task TryAcquireAsync( @@ -23,7 +28,14 @@ public class MedallionAbpDistributedLock : IAbpDistributedLock, ITransientDepend { Check.NotNullOrWhiteSpace(name, nameof(name)); - var handle = await DistributedLockProvider.TryAcquireLockAsync(name, timeout, cancellationToken); + CancellationTokenProvider.FallbackToProvider(cancellationToken); + + var handle = await DistributedLockProvider.TryAcquireLockAsync( + name, + timeout, + CancellationTokenProvider.FallbackToProvider(cancellationToken) + ); + if (handle == null) { return null; diff --git a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Localization/pt-BR.json b/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Localization/pt-BR.json index b1f3878b88..c0d6227e48 100644 --- a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Localization/pt-BR.json +++ b/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Localization/pt-BR.json @@ -9,7 +9,7 @@ "DisplayName:Abp.Mailing.Smtp.Password": "Senha", "DisplayName:Abp.Mailing.Smtp.Domain": "Domínio", "DisplayName:Abp.Mailing.Smtp.EnableSsl": "Habilitar SSL", - "DisplayName:Abp.Mailing.Smtp.UseDefaultCredentials": "Use credenciais padrão", + "DisplayName:Abp.Mailing.Smtp.UseDefaultCredentials": "Usar credenciais padrão", "Description:Abp.Mailing.DefaultFromAddress": "O endereço de origem padrão", "Description:Abp.Mailing.DefaultFromDisplayName": "O nome de exibição padrão", "Description:Abp.Mailing.Smtp.Host": "O nome ou endereço IP do host usado para transações SMTP.", diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs index 1f55bce770..fd998510af 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs @@ -292,7 +292,6 @@ public abstract class AbpDbContext : DbContext, IAbpEfCoreDbContext, { case EntityState.Added: ApplyAbpConceptsForAddedEntity(entry); - EntityChangeEventHelper.PublishEntityCreatingEvent(entry.Entity); EntityChangeEventHelper.PublishEntityCreatedEvent(entry.Entity); break; case EntityState.Modified: @@ -301,12 +300,10 @@ public abstract class AbpDbContext : DbContext, IAbpEfCoreDbContext, { if (entry.Entity is ISoftDelete && entry.Entity.As().IsDeleted) { - EntityChangeEventHelper.PublishEntityDeletingEvent(entry.Entity); EntityChangeEventHelper.PublishEntityDeletedEvent(entry.Entity); } else { - EntityChangeEventHelper.PublishEntityUpdatingEvent(entry.Entity); EntityChangeEventHelper.PublishEntityUpdatedEvent(entry.Entity); } } @@ -314,7 +311,6 @@ public abstract class AbpDbContext : DbContext, IAbpEfCoreDbContext, break; case EntityState.Deleted: ApplyAbpConceptsForDeletedEntity(entry); - EntityChangeEventHelper.PublishEntityDeletingEvent(entry.Entity); EntityChangeEventHelper.PublishEntityDeletedEvent(entry.Entity); break; } @@ -485,7 +481,7 @@ public abstract class AbpDbContext : DbContext, IAbpEfCoreDbContext, } entry.Reload(); - entry.Entity.As().IsDeleted = true; + ObjectHelper.TrySetProperty(entry.Entity.As(), x => x.IsDeleted, () => true); SetDeletionAuditProperties(entry); } diff --git a/framework/src/Volo.Abp.EventBus.Dapr/FodyWeavers.xml b/framework/src/Volo.Abp.EventBus.Dapr/FodyWeavers.xml new file mode 100644 index 0000000000..be0de3a908 --- /dev/null +++ b/framework/src/Volo.Abp.EventBus.Dapr/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/studio/source-codes/Volo.Abp.BlobStoring.Database.SourceCode/FodyWeavers.xsd b/framework/src/Volo.Abp.EventBus.Dapr/FodyWeavers.xsd similarity index 100% rename from studio/source-codes/Volo.Abp.BlobStoring.Database.SourceCode/FodyWeavers.xsd rename to framework/src/Volo.Abp.EventBus.Dapr/FodyWeavers.xsd diff --git a/framework/src/Volo.Abp.EventBus.Dapr/Volo.Abp.EventBus.Dapr.csproj b/framework/src/Volo.Abp.EventBus.Dapr/Volo.Abp.EventBus.Dapr.csproj new file mode 100644 index 0000000000..2bef3f9dc9 --- /dev/null +++ b/framework/src/Volo.Abp.EventBus.Dapr/Volo.Abp.EventBus.Dapr.csproj @@ -0,0 +1,18 @@ + + + + + + + net6.0 + enable + enable + + + + + + + + + diff --git a/framework/src/Volo.Abp.EventBus.Dapr/Volo/Abp/EventBus/Dapr/AbpDaprEventBusOptions.cs b/framework/src/Volo.Abp.EventBus.Dapr/Volo/Abp/EventBus/Dapr/AbpDaprEventBusOptions.cs new file mode 100644 index 0000000000..d3ced52ba2 --- /dev/null +++ b/framework/src/Volo.Abp.EventBus.Dapr/Volo/Abp/EventBus/Dapr/AbpDaprEventBusOptions.cs @@ -0,0 +1,11 @@ +namespace Volo.Abp.EventBus.Dapr; + +public class AbpDaprEventBusOptions +{ + public string PubSubName { get; set; } + + public AbpDaprEventBusOptions() + { + PubSubName = "pubsub"; + } +} diff --git a/framework/src/Volo.Abp.EventBus.Dapr/Volo/Abp/EventBus/Dapr/AbpEventBusDaprModule.cs b/framework/src/Volo.Abp.EventBus.Dapr/Volo/Abp/EventBus/Dapr/AbpEventBusDaprModule.cs new file mode 100644 index 0000000000..5f6329a4bc --- /dev/null +++ b/framework/src/Volo.Abp.EventBus.Dapr/Volo/Abp/EventBus/Dapr/AbpEventBusDaprModule.cs @@ -0,0 +1,20 @@ +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.Dapr; +using Volo.Abp.Modularity; + +namespace Volo.Abp.EventBus.Dapr; + +[DependsOn( + typeof(AbpEventBusModule), + typeof(AbpDaprModule) + )] +public class AbpEventBusDaprModule : AbpModule +{ + public override void OnApplicationInitialization(ApplicationInitializationContext context) + { + context + .ServiceProvider + .GetRequiredService() + .Initialize(); + } +} diff --git a/framework/src/Volo.Abp.EventBus.Dapr/Volo/Abp/EventBus/Dapr/DaprDistributedEventBus.cs b/framework/src/Volo.Abp.EventBus.Dapr/Volo/Abp/EventBus/Dapr/DaprDistributedEventBus.cs new file mode 100644 index 0000000000..1f241b9c6d --- /dev/null +++ b/framework/src/Volo.Abp.EventBus.Dapr/Volo/Abp/EventBus/Dapr/DaprDistributedEventBus.cs @@ -0,0 +1,221 @@ +using System.Collections.Concurrent; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; +using Volo.Abp.Dapr; +using Volo.Abp.DependencyInjection; +using Volo.Abp.EventBus.Distributed; +using Volo.Abp.Guids; +using Volo.Abp.MultiTenancy; +using Volo.Abp.Threading; +using Volo.Abp.Timing; +using Volo.Abp.Uow; + +namespace Volo.Abp.EventBus.Dapr; + +[Dependency(ReplaceServices = true)] +[ExposeServices(typeof(IDistributedEventBus), typeof(DaprDistributedEventBus))] +public class DaprDistributedEventBus : DistributedEventBusBase, ISingletonDependency +{ + protected IDaprSerializer Serializer { get; } + protected AbpDaprEventBusOptions DaprEventBusOptions { get; } + protected AbpDaprClientFactory DaprClientFactory { get; } + + protected ConcurrentDictionary> HandlerFactories { get; } + protected ConcurrentDictionary EventTypes { get; } + + public DaprDistributedEventBus( + IServiceScopeFactory serviceScopeFactory, + ICurrentTenant currentTenant, + IUnitOfWorkManager unitOfWorkManager, + IOptions abpDistributedEventBusOptions, + IGuidGenerator guidGenerator, + IClock clock, + IEventHandlerInvoker eventHandlerInvoker, + IDaprSerializer serializer, + IOptions daprEventBusOptions, + AbpDaprClientFactory daprClientFactory) + : base(serviceScopeFactory, currentTenant, unitOfWorkManager, abpDistributedEventBusOptions, guidGenerator, clock, eventHandlerInvoker) + { + Serializer = serializer; + DaprEventBusOptions = daprEventBusOptions.Value; + DaprClientFactory = daprClientFactory; + + HandlerFactories = new ConcurrentDictionary>(); + EventTypes = new ConcurrentDictionary(); + } + + public void Initialize() + { + SubscribeHandlers(AbpDistributedEventBusOptions.Handlers); + } + + public override IDisposable Subscribe(Type eventType, IEventHandlerFactory factory) + { + var handlerFactories = GetOrCreateHandlerFactories(eventType); + + if (factory.IsInFactories(handlerFactories)) + { + return NullDisposable.Instance; + } + + handlerFactories.Add(factory); + + return new EventHandlerFactoryUnregistrar(this, eventType, factory); + } + + public override void Unsubscribe(Func action) + { + Check.NotNull(action, nameof(action)); + + GetOrCreateHandlerFactories(typeof(TEvent)) + .Locking(factories => + { + factories.RemoveAll( + factory => + { + var singleInstanceFactory = factory as SingleInstanceHandlerFactory; + if (singleInstanceFactory == null) + { + return false; + } + + var actionHandler = singleInstanceFactory.HandlerInstance as ActionEventHandler; + if (actionHandler == null) + { + return false; + } + + return actionHandler.Action == action; + }); + }); + } + + public override void Unsubscribe(Type eventType, IEventHandler handler) + { + GetOrCreateHandlerFactories(eventType) + .Locking(factories => + { + factories.RemoveAll( + factory => + factory is SingleInstanceHandlerFactory && + (factory as SingleInstanceHandlerFactory).HandlerInstance == handler + ); + }); + } + + public override void Unsubscribe(Type eventType, IEventHandlerFactory factory) + { + GetOrCreateHandlerFactories(eventType).Locking(factories => factories.Remove(factory)); + } + + public override void UnsubscribeAll(Type eventType) + { + GetOrCreateHandlerFactories(eventType).Locking(factories => factories.Clear()); + } + + protected async override Task PublishToEventBusAsync(Type eventType, object eventData) + { + await PublishToDaprAsync(eventType, eventData); + } + + protected override void AddToUnitOfWork(IUnitOfWork unitOfWork, UnitOfWorkEventRecord eventRecord) + { + unitOfWork.AddOrReplaceDistributedEvent(eventRecord); + } + + protected override IEnumerable GetHandlerFactories(Type eventType) + { + var handlerFactoryList = new List(); + + foreach (var handlerFactory in HandlerFactories.Where(hf => ShouldTriggerEventForHandler(eventType, hf.Key))) + { + handlerFactoryList.Add(new EventTypeWithEventHandlerFactories(handlerFactory.Key, handlerFactory.Value)); + } + + return handlerFactoryList.ToArray(); + } + + public async override Task PublishFromOutboxAsync(OutgoingEventInfo outgoingEvent, OutboxConfig outboxConfig) + { + await PublishToDaprAsync(outgoingEvent.EventName, Serializer.Deserialize(outgoingEvent.EventData, GetEventType(outgoingEvent.EventName))); + } + + public async override Task PublishManyFromOutboxAsync(IEnumerable outgoingEvents, OutboxConfig outboxConfig) + { + var outgoingEventArray = outgoingEvents.ToArray(); + + foreach (var outgoingEvent in outgoingEventArray) + { + await PublishToDaprAsync(outgoingEvent.EventName, Serializer.Deserialize(outgoingEvent.EventData, GetEventType(outgoingEvent.EventName))); + } + } + + public async override Task ProcessFromInboxAsync(IncomingEventInfo incomingEvent, InboxConfig inboxConfig) + { + var eventType = EventTypes.GetOrDefault(incomingEvent.EventName); + if (eventType == null) + { + return; + } + + var eventData = Serializer.Deserialize(incomingEvent.EventData, eventType); + var exceptions = new List(); + await TriggerHandlersAsync(eventType, eventData, exceptions, inboxConfig); + if (exceptions.Any()) + { + ThrowOriginalExceptions(eventType, exceptions); + } + } + + protected override byte[] Serialize(object eventData) + { + return Serializer.Serialize(eventData); + } + + private List GetOrCreateHandlerFactories(Type eventType) + { + return HandlerFactories.GetOrAdd( + eventType, + type => + { + var eventName = EventNameAttribute.GetNameOrDefault(type); + EventTypes[eventName] = type; + return new List(); + } + ); + } + + public Type GetEventType(string eventName) + { + return EventTypes.GetOrDefault(eventName); + } + + protected virtual async Task PublishToDaprAsync(Type eventType, object eventData) + { + await PublishToDaprAsync(EventNameAttribute.GetNameOrDefault(eventType), eventData); + } + + protected virtual async Task PublishToDaprAsync(string eventName, object eventData) + { + var client = await DaprClientFactory.CreateAsync(); + await client.PublishEventAsync(pubsubName: DaprEventBusOptions.PubSubName, topicName: eventName, data: eventData); + } + + private static bool ShouldTriggerEventForHandler(Type targetEventType, Type handlerEventType) + { + //Should trigger same type + if (handlerEventType == targetEventType) + { + return true; + } + + //TODO: Support inheritance? But it does not support on subscription to RabbitMq! + //Should trigger for inherited types + if (handlerEventType.IsAssignableFrom(targetEventType)) + { + return true; + } + + return false; + } +} diff --git a/framework/src/Volo.Abp.EventBus.Kafka/Volo/Abp/EventBus/Kafka/KafkaDistributedEventBus.cs b/framework/src/Volo.Abp.EventBus.Kafka/Volo/Abp/EventBus/Kafka/KafkaDistributedEventBus.cs index 4dba728c51..aa79c81f50 100644 --- a/framework/src/Volo.Abp.EventBus.Kafka/Volo/Abp/EventBus/Kafka/KafkaDistributedEventBus.cs +++ b/framework/src/Volo.Abp.EventBus.Kafka/Volo/Abp/EventBus/Kafka/KafkaDistributedEventBus.cs @@ -162,13 +162,13 @@ public class KafkaDistributedEventBus : DistributedEventBusBase, ISingletonDepen protected async override Task PublishToEventBusAsync(Type eventType, object eventData) { await PublishAsync( + AbpKafkaEventBusOptions.TopicName, eventType, eventData, new Headers { - { "messageId", System.Text.Encoding.UTF8.GetBytes(Guid.NewGuid().ToString("N")) } - }, - null + { "messageId", System.Text.Encoding.UTF8.GetBytes(Guid.NewGuid().ToString("N")) } + } ); } @@ -188,42 +188,31 @@ public class KafkaDistributedEventBus : DistributedEventBusBase, ISingletonDepen new Headers { { "messageId", System.Text.Encoding.UTF8.GetBytes(outgoingEvent.Id.ToString("N")) } - }, - null + } ); } public override Task PublishManyFromOutboxAsync(IEnumerable outgoingEvents, OutboxConfig outboxConfig) { - var producer = ProducerPool.Get(); + var producer = ProducerPool.Get(AbpKafkaEventBusOptions.ConnectionName); var outgoingEventArray = outgoingEvents.ToArray(); - producer.BeginTransaction(); - try + + foreach (var outgoingEvent in outgoingEventArray) { - foreach (var outgoingEvent in outgoingEventArray) + var messageId = outgoingEvent.Id.ToString("N"); + var headers = new Headers { - var messageId = outgoingEvent.Id.ToString("N"); - var headers = new Headers - { - { "messageId", System.Text.Encoding.UTF8.GetBytes(messageId)} - }; - - producer.Produce( - AbpKafkaEventBusOptions.TopicName, - new Message - { - Key = outgoingEvent.EventName, - Value = outgoingEvent.EventData, - Headers = headers - }); - } + { "messageId", System.Text.Encoding.UTF8.GetBytes(messageId)} + }; - producer.CommitTransaction(); - } - catch (Exception e) - { - producer.AbortTransaction(); - throw; + producer.Produce( + AbpKafkaEventBusOptions.TopicName, + new Message + { + Key = outgoingEvent.EventName, + Value = outgoingEvent.EventData, + Headers = headers + }); } return Task.CompletedTask; @@ -253,47 +242,22 @@ public class KafkaDistributedEventBus : DistributedEventBusBase, ISingletonDepen return Serializer.Serialize(eventData); } - public virtual async Task PublishAsync(Type eventType, object eventData, Headers headers, Dictionary headersArguments) - { - await PublishAsync( - AbpKafkaEventBusOptions.TopicName, - eventType, - eventData, - headers, - headersArguments - ); - } - - private Task PublishAsync(string topicName, Type eventType, object eventData, Headers headers, Dictionary headersArguments) + private Task PublishAsync(string topicName, Type eventType, object eventData, Headers headers) { var eventName = EventNameAttribute.GetNameOrDefault(eventType); var body = Serializer.Serialize(eventData); - return PublishAsync(topicName, eventName, body, headers, headersArguments); + return PublishAsync(topicName, eventName, body, headers); } private Task> PublishAsync( string topicName, string eventName, byte[] body, - Headers headers, - Dictionary headersArguments) + Headers headers) { var producer = ProducerPool.Get(AbpKafkaEventBusOptions.ConnectionName); - return PublishAsync(producer, topicName, eventName, body, headers, headersArguments); - } - - private Task> PublishAsync( - IProducer producer, - string topicName, - string eventName, - byte[] body, - Headers headers, - Dictionary headersArguments) - { - SetEventMessageHeaders(headers, headersArguments); - return producer.ProduceAsync( topicName, new Message @@ -304,20 +268,6 @@ public class KafkaDistributedEventBus : DistributedEventBusBase, ISingletonDepen }); } - private void SetEventMessageHeaders(Headers headers, Dictionary headersArguments) - { - if (headersArguments == null) - { - return; - } - - foreach (var header in headersArguments) - { - headers.Remove(header.Key); - headers.Add(header.Key, Serializer.Serialize(header.Value)); - } - } - private List GetOrCreateHandlerFactories(Type eventType) { return HandlerFactories.GetOrAdd( diff --git a/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/AbpRabbitMqEventBusOptions.cs b/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/AbpRabbitMqEventBusOptions.cs index addbc49171..bac9bdf0c9 100644 --- a/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/AbpRabbitMqEventBusOptions.cs +++ b/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/AbpRabbitMqEventBusOptions.cs @@ -13,6 +13,8 @@ public class AbpRabbitMqEventBusOptions public string ExchangeName { get; set; } public string ExchangeType { get; set; } + + public ushort? PrefetchCount { get; set; } public string GetExchangeTypeOrDefault() { diff --git a/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/RabbitMqDistributedEventBus.cs b/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/RabbitMqDistributedEventBus.cs index c9ec49bc7e..7e352ca530 100644 --- a/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/RabbitMqDistributedEventBus.cs +++ b/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/RabbitMqDistributedEventBus.cs @@ -78,7 +78,8 @@ public class RabbitMqDistributedEventBus : DistributedEventBusBase, ISingletonDe AbpRabbitMqEventBusOptions.ClientName, durable: true, exclusive: false, - autoDelete: false + autoDelete: false, + prefetchCount: AbpRabbitMqEventBusOptions.PrefetchCount ), AbpRabbitMqEventBusOptions.ConnectionName ); diff --git a/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeaturesSimpleStateCheckerSerializerContributor.cs b/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeaturesSimpleStateCheckerSerializerContributor.cs new file mode 100644 index 0000000000..58e2817139 --- /dev/null +++ b/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeaturesSimpleStateCheckerSerializerContributor.cs @@ -0,0 +1,56 @@ +using System.Linq; +using System.Text.Json.Nodes; +using Volo.Abp.DependencyInjection; +using Volo.Abp.SimpleStateChecking; + +namespace Volo.Abp.Features; + +public class FeaturesSimpleStateCheckerSerializerContributor : + ISimpleStateCheckerSerializerContributor, + ISingletonDependency +{ + public const string CheckerShortName = "F"; + + public string SerializeToJson(ISimpleStateChecker checker) + where TState : IHasSimpleStateCheckers + { + if (checker is not RequireFeaturesSimpleStateChecker featuresSimpleStateChecker) + { + return null; + } + + var jsonObject = new JsonObject { + ["T"] = CheckerShortName, + ["A"] = featuresSimpleStateChecker.RequiresAll + }; + + var nameArray = new JsonArray(); + foreach (var featureName in featuresSimpleStateChecker.FeatureNames) + { + nameArray.Add(featureName); + } + + jsonObject["N"] = nameArray; + return jsonObject.ToJsonString(); + } + + public ISimpleStateChecker Deserialize(JsonObject jsonObject, TState state) + where TState : IHasSimpleStateCheckers + { + if (jsonObject["T"]?.ToString() != CheckerShortName) + { + return null; + } + + var nameArray = jsonObject["N"] as JsonArray; + if (nameArray == null) + { + throw new AbpException("'N' is not an array in the serialized state checker! JsonObject: " + jsonObject.ToJsonString()); + } + + return new RequireFeaturesSimpleStateChecker( + (bool?)jsonObject["A"] ?? false, + nameArray.Select(x => x.ToString()).ToArray() + ); + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Features/Volo/Abp/Features/RequireFeaturesSimpleStateChecker.cs b/framework/src/Volo.Abp.Features/Volo/Abp/Features/RequireFeaturesSimpleStateChecker.cs index 1b437e623a..625d097441 100644 --- a/framework/src/Volo.Abp.Features/Volo/Abp/Features/RequireFeaturesSimpleStateChecker.cs +++ b/framework/src/Volo.Abp.Features/Volo/Abp/Features/RequireFeaturesSimpleStateChecker.cs @@ -7,8 +7,8 @@ namespace Volo.Abp.Features; public class RequireFeaturesSimpleStateChecker : ISimpleStateChecker where TState : IHasSimpleStateCheckers { - private readonly string[] _featureNames; - private readonly bool _requiresAll; + public string[] FeatureNames { get; } + public bool RequiresAll { get; } public RequireFeaturesSimpleStateChecker(params string[] featureNames) : this(true, featureNames) @@ -19,13 +19,13 @@ public class RequireFeaturesSimpleStateChecker : ISimpleStateChecker IsEnabledAsync(SimpleStateCheckerContext context) { var featureChecker = context.ServiceProvider.GetRequiredService(); - return await featureChecker.IsEnabledAsync(_requiresAll, _featureNames); + return await featureChecker.IsEnabledAsync(RequiresAll, FeatureNames); } } diff --git a/framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/GlobalFeaturesSimpleStateCheckerSerializerContributor.cs b/framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/GlobalFeaturesSimpleStateCheckerSerializerContributor.cs new file mode 100644 index 0000000000..d4abc25403 --- /dev/null +++ b/framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/GlobalFeaturesSimpleStateCheckerSerializerContributor.cs @@ -0,0 +1,56 @@ +using System.Linq; +using System.Text.Json.Nodes; +using Volo.Abp.DependencyInjection; +using Volo.Abp.SimpleStateChecking; + +namespace Volo.Abp.GlobalFeatures; + +public class GlobalFeaturesSimpleStateCheckerSerializerContributor : + ISimpleStateCheckerSerializerContributor, + ISingletonDependency +{ + public const string CheckerShortName = "G"; + + public string SerializeToJson(ISimpleStateChecker checker) + where TState : IHasSimpleStateCheckers + { + if (checker is not RequireGlobalFeaturesSimpleStateChecker globalFeaturesSimpleStateChecker) + { + return null; + } + + var jsonObject = new JsonObject { + ["T"] = CheckerShortName, + ["A"] = globalFeaturesSimpleStateChecker.RequiresAll + }; + + var nameArray = new JsonArray(); + foreach (var globalFeatureName in globalFeaturesSimpleStateChecker.GlobalFeatureNames) + { + nameArray.Add(globalFeatureName); + } + + jsonObject["N"] = nameArray; + return jsonObject.ToJsonString(); + } + + public ISimpleStateChecker Deserialize(JsonObject jsonObject, TState state) + where TState : IHasSimpleStateCheckers + { + if (jsonObject["T"]?.ToString() != CheckerShortName) + { + return null; + } + + var nameArray = jsonObject["N"] as JsonArray; + if (nameArray == null) + { + throw new AbpException("'N' is not an array in the serialized state checker! JsonObject: " + jsonObject.ToJsonString()); + } + + return new RequireGlobalFeaturesSimpleStateChecker( + (bool?)jsonObject["A"] ?? false, + nameArray.Select(x => x.ToString()).ToArray() + ); + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/RequireGlobalFeaturesSimpleStateChecker.cs b/framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/RequireGlobalFeaturesSimpleStateChecker.cs index 77fdaa0e1e..d37aba8397 100644 --- a/framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/RequireGlobalFeaturesSimpleStateChecker.cs +++ b/framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/RequireGlobalFeaturesSimpleStateChecker.cs @@ -8,8 +8,8 @@ namespace Volo.Abp.GlobalFeatures; public class RequireGlobalFeaturesSimpleStateChecker : ISimpleStateChecker where TState : IHasSimpleStateCheckers { - private readonly string[] _globalFeatureNames; - private readonly bool _requiresAll; + public string[] GlobalFeatureNames { get; } + public bool RequiresAll { get; } public RequireGlobalFeaturesSimpleStateChecker(params string[] globalFeatureNames) : this(true, globalFeatureNames) @@ -20,23 +20,23 @@ public class RequireGlobalFeaturesSimpleStateChecker : ISimpleStateCheck { Check.NotNullOrEmpty(globalFeatureNames, nameof(globalFeatureNames)); - _requiresAll = requiresAll; - _globalFeatureNames = globalFeatureNames; + RequiresAll = requiresAll; + GlobalFeatureNames = globalFeatureNames; } public RequireGlobalFeaturesSimpleStateChecker(bool requiresAll, params Type[] globalFeatureNames) { Check.NotNullOrEmpty(globalFeatureNames, nameof(globalFeatureNames)); - _requiresAll = requiresAll; - _globalFeatureNames = globalFeatureNames.Select(GlobalFeatureNameAttribute.GetName).ToArray(); + RequiresAll = requiresAll; + GlobalFeatureNames = globalFeatureNames.Select(GlobalFeatureNameAttribute.GetName).ToArray(); } public Task IsEnabledAsync(SimpleStateCheckerContext context) { - var isEnabled = _requiresAll - ? _globalFeatureNames.All(x => GlobalFeatureManager.Instance.IsEnabled(x)) - : _globalFeatureNames.Any(x => GlobalFeatureManager.Instance.IsEnabled(x)); + var isEnabled = RequiresAll + ? GlobalFeatureNames.All(x => GlobalFeatureManager.Instance.IsEnabled(x)) + : GlobalFeatureNames.Any(x => GlobalFeatureManager.Instance.IsEnabled(x)); return Task.FromResult(isEnabled); } diff --git a/framework/src/Volo.Abp.Http.Client.Dapr/FodyWeavers.xml b/framework/src/Volo.Abp.Http.Client.Dapr/FodyWeavers.xml new file mode 100644 index 0000000000..be0de3a908 --- /dev/null +++ b/framework/src/Volo.Abp.Http.Client.Dapr/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/studio/source-codes/Volo.Abp.FeatureManagement.SourceCode/FodyWeavers.xsd b/framework/src/Volo.Abp.Http.Client.Dapr/FodyWeavers.xsd similarity index 100% rename from studio/source-codes/Volo.Abp.FeatureManagement.SourceCode/FodyWeavers.xsd rename to framework/src/Volo.Abp.Http.Client.Dapr/FodyWeavers.xsd diff --git a/framework/src/Volo.Abp.Http.Client.Dapr/Volo.Abp.Http.Client.Dapr.csproj b/framework/src/Volo.Abp.Http.Client.Dapr/Volo.Abp.Http.Client.Dapr.csproj new file mode 100644 index 0000000000..909fb156c8 --- /dev/null +++ b/framework/src/Volo.Abp.Http.Client.Dapr/Volo.Abp.Http.Client.Dapr.csproj @@ -0,0 +1,18 @@ + + + + + + + net6.0 + enable + enable + + + + + + + + + diff --git a/framework/src/Volo.Abp.Http.Client.Dapr/Volo/Abp/Http/Client/Dapr/AbpHttpClientDaprModule.cs b/framework/src/Volo.Abp.Http.Client.Dapr/Volo/Abp/Http/Client/Dapr/AbpHttpClientDaprModule.cs new file mode 100644 index 0000000000..18a509d3ff --- /dev/null +++ b/framework/src/Volo.Abp.Http.Client.Dapr/Volo/Abp/Http/Client/Dapr/AbpHttpClientDaprModule.cs @@ -0,0 +1,23 @@ +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.Dapr; +using Volo.Abp.Modularity; + +namespace Volo.Abp.Http.Client.Dapr; + +[DependsOn( + typeof(AbpHttpClientModule), + typeof(AbpDaprModule) +)] +public class AbpHttpClientDaprModule : AbpModule +{ + public override void PreConfigureServices(ServiceConfigurationContext context) + { + PreConfigure(options => + { + options.ProxyClientBuildActions.Add((_, clientBuilder) => + { + clientBuilder.AddHttpMessageHandler(); + }); + }); + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Http.Client.Dapr/Volo/Abp/Http/Client/Dapr/AbpInvocationHandler.cs b/framework/src/Volo.Abp.Http.Client.Dapr/Volo/Abp/Http/Client/Dapr/AbpInvocationHandler.cs new file mode 100644 index 0000000000..a3397b55e4 --- /dev/null +++ b/framework/src/Volo.Abp.Http.Client.Dapr/Volo/Abp/Http/Client/Dapr/AbpInvocationHandler.cs @@ -0,0 +1,14 @@ +using Dapr.Client; +using Microsoft.Extensions.Options; +using Volo.Abp.Dapr; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.Http.Client.Dapr; + +public class AbpInvocationHandler : InvocationHandler, ITransientDependency +{ + public AbpInvocationHandler(IOptions daprOptions) + { + DaprEndpoint = daprOptions.Value.HttpEndpoint; + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Http.Client/Microsoft/Extensions/DependencyInjection/ServiceCollectionHttpClientProxyExtensions.cs b/framework/src/Volo.Abp.Http.Client/Microsoft/Extensions/DependencyInjection/ServiceCollectionHttpClientProxyExtensions.cs index 4ccac104cd..7bc239813d 100644 --- a/framework/src/Volo.Abp.Http.Client/Microsoft/Extensions/DependencyInjection/ServiceCollectionHttpClientProxyExtensions.cs +++ b/framework/src/Volo.Abp.Http.Client/Microsoft/Extensions/DependencyInjection/ServiceCollectionHttpClientProxyExtensions.cs @@ -212,7 +212,7 @@ public static class ServiceCollectionHttpClientProxyExtensions } /// - /// Checks wether the type is suitable to use with the proxying. + /// Checks whether the type is suitable to use with the proxying. /// Currently the type is checked statically against some fixed conditions. /// /// Type to check diff --git a/framework/src/Volo.Abp.Json/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializerProvider.cs b/framework/src/Volo.Abp.Json/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializerProvider.cs index 290dee4ea9..802dd3f528 100644 --- a/framework/src/Volo.Abp.Json/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializerProvider.cs +++ b/framework/src/Volo.Abp.Json/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializerProvider.cs @@ -40,11 +40,16 @@ public class AbpSystemTextJsonSerializerProvider : IJsonSerializerProvider, ITra return JsonSerializer.Deserialize(jsonString, type, CreateJsonSerializerOptions(camelCase)); } - private readonly ConcurrentDictionary JsonSerializerOptionsCache = new ConcurrentDictionary(); + private readonly static ConcurrentDictionary JsonSerializerOptionsCache = new ConcurrentDictionary(); protected virtual JsonSerializerOptions CreateJsonSerializerOptions(bool camelCase = true, bool indented = false) { - return JsonSerializerOptionsCache.GetOrAdd($"default{camelCase}{indented}", _ => + return JsonSerializerOptionsCache.GetOrAdd(new + { + camelCase, + indented, + Options.JsonSerializerOptions + }, _ => { var settings = new JsonSerializerOptions(Options.JsonSerializerOptions); diff --git a/framework/src/Volo.Abp.Json/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpStringToEnumConverter.cs b/framework/src/Volo.Abp.Json/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpStringToEnumConverter.cs index c4720c92db..6b7f32807e 100644 --- a/framework/src/Volo.Abp.Json/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpStringToEnumConverter.cs +++ b/framework/src/Volo.Abp.Json/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpStringToEnumConverter.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; using System.Text.Json; using System.Text.Json.Serialization; @@ -48,4 +47,14 @@ public class AbpStringToEnumConverter : JsonConverter JsonSerializer.Serialize(writer, value, _writeJsonSerializerOptions); } + + public override T ReadAsPropertyName(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + return (T)Enum.Parse(typeToConvert, reader.GetString()); + } + + public override void WriteAsPropertyName(Utf8JsonWriter writer, T value, JsonSerializerOptions options) + { + writer.WritePropertyName(Enum.GetName(typeof(T), value)); + } } diff --git a/framework/src/Volo.Abp.Kafka/Volo/Abp/Kafka/ConsumerPool.cs b/framework/src/Volo.Abp.Kafka/Volo/Abp/Kafka/ConsumerPool.cs index 7147c81271..7c73df0d51 100644 --- a/framework/src/Volo.Abp.Kafka/Volo/Abp/Kafka/ConsumerPool.cs +++ b/framework/src/Volo.Abp.Kafka/Volo/Abp/Kafka/ConsumerPool.cs @@ -37,7 +37,7 @@ public class ConsumerPool : IConsumerPool, ISingletonDependency return Consumers.GetOrAdd( connectionName, connection => new Lazy>(() => { - var config = new ConsumerConfig(Options.Connections.GetOrDefault(connection)) + var config = new ConsumerConfig(Options.Connections.GetOrDefault(connection).ToDictionary(k => k.Key, v => v.Value)) { GroupId = groupId, EnableAutoCommit = false diff --git a/framework/src/Volo.Abp.Kafka/Volo/Abp/Kafka/ProducerPool.cs b/framework/src/Volo.Abp.Kafka/Volo/Abp/Kafka/ProducerPool.cs index 0a31a3483a..ac2edf31a7 100644 --- a/framework/src/Volo.Abp.Kafka/Volo/Abp/Kafka/ProducerPool.cs +++ b/framework/src/Volo.Abp.Kafka/Volo/Abp/Kafka/ProducerPool.cs @@ -39,18 +39,10 @@ public class ProducerPool : IProducerPool, ISingletonDependency return Producers.GetOrAdd( connectionName, connection => new Lazy>(() => { - var producerConfig = new ProducerConfig(Options.Connections.GetOrDefault(connection)); + var producerConfig = new ProducerConfig(Options.Connections.GetOrDefault(connection).ToDictionary(k => k.Key, v => v.Value)); Options.ConfigureProducer?.Invoke(producerConfig); - - if (producerConfig.TransactionalId.IsNullOrWhiteSpace()) - { - producerConfig.TransactionalId = Guid.NewGuid().ToString(); - } - - var producer = new ProducerBuilder(producerConfig).Build(); - producer.InitTransactions(DefaultTransactionsWaitDuration); + return new ProducerBuilder(producerConfig).Build(); - return producer; })).Value; } diff --git a/framework/src/Volo.Abp.Localization.Abstractions/Volo/Abp/Localization/LocalizableString.cs b/framework/src/Volo.Abp.Localization.Abstractions/Volo/Abp/Localization/LocalizableString.cs index 61494d609e..88eb8a399d 100644 --- a/framework/src/Volo.Abp.Localization.Abstractions/Volo/Abp/Localization/LocalizableString.cs +++ b/framework/src/Volo.Abp.Localization.Abstractions/Volo/Abp/Localization/LocalizableString.cs @@ -12,7 +12,7 @@ public class LocalizableString : ILocalizableString [NotNull] public string Name { get; } - public LocalizableString(Type resourceType, [NotNull] string name) + public LocalizableString([CanBeNull] Type resourceType, [NotNull] string name) { Name = Check.NotNullOrEmpty(name, nameof(name)); ResourceType = resourceType; @@ -20,7 +20,28 @@ public class LocalizableString : ILocalizableString public LocalizedString Localize(IStringLocalizerFactory stringLocalizerFactory) { - return stringLocalizerFactory.Create(ResourceType)[Name]; + var localizer = ResourceType != null + ? stringLocalizerFactory.Create(ResourceType) + : stringLocalizerFactory.CreateDefaultOrNull(); + + if (localizer == null) + { + throw new AbpException($"Set {nameof(ResourceType)} or configure the default localization resource type (in the AbpLocalizationOptions)!"); + } + + var result = localizer[Name]; + + if (result.ResourceNotFound && ResourceType != null) + { + /* Search in the default resource if not found in the provided resource */ + localizer = stringLocalizerFactory.CreateDefaultOrNull(); + if (localizer != null) + { + result = localizer[Name]; + } + } + + return result; } public static LocalizableString Create([NotNull] string name) diff --git a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/ILocalizableStringSerializer.cs b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/ILocalizableStringSerializer.cs new file mode 100644 index 0000000000..6f7a487b6c --- /dev/null +++ b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/ILocalizableStringSerializer.cs @@ -0,0 +1,8 @@ +namespace Volo.Abp.Localization; + +public interface ILocalizableStringSerializer +{ + string Serialize(ILocalizableString localizableString); + + ILocalizableString Deserialize(string value); +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/LocalizableStringSerializer.cs b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/LocalizableStringSerializer.cs new file mode 100644 index 0000000000..4cfd6e2f32 --- /dev/null +++ b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/LocalizableStringSerializer.cs @@ -0,0 +1,69 @@ +using System; +using Microsoft.Extensions.Options; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.Localization; + +public class LocalizableStringSerializer : ILocalizableStringSerializer, ITransientDependency +{ + protected AbpLocalizationOptions LocalizationOptions { get; } + + public LocalizableStringSerializer(IOptions localizationOptions) + { + LocalizationOptions = localizationOptions.Value; + } + + public virtual string Serialize(ILocalizableString localizableString) + { + if (localizableString is LocalizableString realLocalizableString) + { + return $"L:{LocalizationResourceNameAttribute.GetName(realLocalizableString.ResourceType)},{realLocalizableString.Name}"; + } + + if (localizableString is FixedLocalizableString fixedLocalizableString) + { + return $"F:{fixedLocalizableString.Value}"; + } + + throw new AbpException($"Unknown {nameof(ILocalizableString)} type: {localizableString.GetType().FullName}"); + } + + public virtual ILocalizableString Deserialize(string value) + { + if (value.IsNullOrEmpty() || + value.Length < 3 || + value[1] != ':') + { + return new FixedLocalizableString(value); + } + + var type = value[0]; + switch (type) + { + case 'F': + return new FixedLocalizableString(value.Substring(2)); + case 'L': + var commaPosition = value.IndexOf(',', 2); + if (commaPosition == -1) + { + throw new AbpException("Invalid LocalizableString value: " + value); + } + + var resourceName = value.Substring(2, commaPosition - 2); + var name = value.Substring(commaPosition + 1); + if (name.IsNullOrWhiteSpace()) + { + throw new AbpException("Invalid LocalizableString value: " + value); + } + + var resourceType = LocalizationOptions.Resources.GetOrNull(resourceName)?.ResourceType; + + return new LocalizableString( + resourceType, + name + ); + default: + return new FixedLocalizableString(value); + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/LocalizationResourceDictionary.cs b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/LocalizationResourceDictionary.cs index e394e01202..d672a2f17a 100644 --- a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/LocalizationResourceDictionary.cs +++ b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/LocalizationResourceDictionary.cs @@ -6,6 +6,8 @@ namespace Volo.Abp.Localization; public class LocalizationResourceDictionary : Dictionary { + private readonly Dictionary _resourcesByNames = new(); + public LocalizationResource Add([CanBeNull] string defaultCultureName = null) { return Add(typeof(TResouce), defaultCultureName); @@ -18,7 +20,12 @@ public class LocalizationResourceDictionary : Dictionary() @@ -33,4 +40,20 @@ public class LocalizationResourceDictionary : Dictionary : RepositoryBase : RepositoryBase x.IsDeleted, () => true); (await GetCollectionAsync()).Update(entity); } else diff --git a/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/IMongoDbRepository.cs b/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/IMongoDbRepository.cs index a0cd792b21..eeac0dc2e2 100644 --- a/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/IMongoDbRepository.cs +++ b/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/IMongoDbRepository.cs @@ -23,9 +23,9 @@ public interface IMongoDbRepository : IRepository [Obsolete("Use GetMongoQueryableAsync method.")] IMongoQueryable GetMongoQueryable(); - Task> GetMongoQueryableAsync(CancellationToken cancellationToken = default); + Task> GetMongoQueryableAsync(CancellationToken cancellationToken = default, AggregateOptions options = null); - Task> GetAggregateAsync(CancellationToken cancellationToken = default); + Task> GetAggregateAsync(CancellationToken cancellationToken = default, AggregateOptions options = null); } public interface IMongoDbRepository : IMongoDbRepository, IRepository diff --git a/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/MongoDbRepository.cs b/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/MongoDbRepository.cs index 102564f8c9..e128c8dee8 100644 --- a/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/MongoDbRepository.cs +++ b/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/MongoDbRepository.cs @@ -294,7 +294,7 @@ public class MongoDbRepository if (typeof(ISoftDelete).IsAssignableFrom(typeof(TEntity)) && !IsHardDeleted(entity)) { - ((ISoftDelete)entity).IsDeleted = true; + ObjectHelper.TrySetProperty(((ISoftDelete)entity), x => x.IsDeleted, () => true); ApplyAbpConceptsForDeletedEntity(entity); ReplaceOneResult result; @@ -365,8 +365,7 @@ public class MongoDbRepository { if (typeof(ISoftDelete).IsAssignableFrom(typeof(TEntity)) && !IsHardDeleted(entity)) { - ((ISoftDelete)entity).IsDeleted = true; - + ObjectHelper.TrySetProperty(((ISoftDelete)entity), x => x.IsDeleted, () => true); softDeletedEntities.Add(entity, SetNewConcurrencyStamp(entity)); } else @@ -518,12 +517,12 @@ public class MongoDbRepository ); } - public virtual Task> GetMongoQueryableAsync(CancellationToken cancellationToken = default) + public virtual Task> GetMongoQueryableAsync(CancellationToken cancellationToken = default, AggregateOptions aggregateOptions = null) { - return GetMongoQueryableAsync(cancellationToken); + return GetMongoQueryableAsync(cancellationToken, aggregateOptions); } - protected virtual async Task> GetMongoQueryableAsync(CancellationToken cancellationToken = default) + protected virtual async Task> GetMongoQueryableAsync(CancellationToken cancellationToken = default, AggregateOptions aggregateOptions = null) { cancellationToken = GetCancellationToken(cancellationToken); @@ -532,12 +531,12 @@ public class MongoDbRepository return ApplyDataFilters, TOtherEntity>( dbContext.SessionHandle != null - ? collection.AsQueryable(dbContext.SessionHandle) - : collection.AsQueryable() + ? collection.AsQueryable(dbContext.SessionHandle, aggregateOptions) + : collection.AsQueryable(aggregateOptions) ); } - public virtual async Task> GetAggregateAsync(CancellationToken cancellationToken = default) + public virtual async Task> GetAggregateAsync(CancellationToken cancellationToken = default, AggregateOptions aggregateOptions = null) { cancellationToken = GetCancellationToken(cancellationToken); @@ -545,8 +544,8 @@ public class MongoDbRepository var collection = await GetCollectionAsync(cancellationToken); var aggregate = dbContext.SessionHandle != null - ? collection.Aggregate(dbContext.SessionHandle) - : collection.Aggregate(); + ? collection.Aggregate(dbContext.SessionHandle, aggregateOptions) + : collection.Aggregate(aggregateOptions); if (typeof(ISoftDelete).IsAssignableFrom(typeof(TEntity)) && DataFilter.IsEnabled()) { @@ -598,13 +597,11 @@ public class MongoDbRepository private void TriggerEntityCreateEvents(TEntity entity) { - EntityChangeEventHelper.PublishEntityCreatingEvent(entity); EntityChangeEventHelper.PublishEntityCreatedEvent(entity); } protected virtual void TriggerEntityUpdateEvents(TEntity entity) { - EntityChangeEventHelper.PublishEntityUpdatingEvent(entity); EntityChangeEventHelper.PublishEntityUpdatedEvent(entity); } @@ -617,7 +614,6 @@ public class MongoDbRepository protected virtual void TriggerEntityDeleteEvents(TEntity entity) { - EntityChangeEventHelper.PublishEntityDeletingEvent(entity); EntityChangeEventHelper.PublishEntityDeletedEvent(entity); } diff --git a/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDbCoreRepositoryExtensions.cs b/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDbCoreRepositoryExtensions.cs index 6a59640c70..c71c3e991d 100644 --- a/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDbCoreRepositoryExtensions.cs +++ b/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDbCoreRepositoryExtensions.cs @@ -43,16 +43,16 @@ public static class MongoDbCoreRepositoryExtensions return repository.ToMongoDbRepository().GetMongoQueryable(); } - public static Task> GetMongoQueryableAsync(this IReadOnlyBasicRepository repository, CancellationToken cancellationToken = default) + public static Task> GetMongoQueryableAsync(this IReadOnlyBasicRepository repository, CancellationToken cancellationToken = default, AggregateOptions aggregateOptions = null) where TEntity : class, IEntity { - return repository.ToMongoDbRepository().GetMongoQueryableAsync(cancellationToken); + return repository.ToMongoDbRepository().GetMongoQueryableAsync(cancellationToken, aggregateOptions); } - public static Task> GetAggregateAsync(this IReadOnlyBasicRepository repository, CancellationToken cancellationToken = default) + public static Task> GetAggregateAsync(this IReadOnlyBasicRepository repository, CancellationToken cancellationToken = default, AggregateOptions aggregateOptions = null) where TEntity : class, IEntity { - return repository.ToMongoDbRepository().GetAggregateAsync(cancellationToken); + return repository.ToMongoDbRepository().GetAggregateAsync(cancellationToken, aggregateOptions); } public static IMongoDbRepository ToMongoDbRepository(this IReadOnlyBasicRepository repository) diff --git a/framework/src/Volo.Abp.MultiLingualObjects/Volo/Abp/MultiLingualObjects/IMultiLingualObjectManager.cs b/framework/src/Volo.Abp.MultiLingualObjects/Volo/Abp/MultiLingualObjects/IMultiLingualObjectManager.cs index 81b7646a1c..904f3abd32 100644 --- a/framework/src/Volo.Abp.MultiLingualObjects/Volo/Abp/MultiLingualObjects/IMultiLingualObjectManager.cs +++ b/framework/src/Volo.Abp.MultiLingualObjects/Volo/Abp/MultiLingualObjects/IMultiLingualObjectManager.cs @@ -1,4 +1,5 @@ -using System.Threading.Tasks; +using System.Collections.Generic; +using System.Threading.Tasks; namespace Volo.Abp.MultiLingualObjects; @@ -10,4 +11,10 @@ public interface IMultiLingualObjectManager bool fallbackToParentCultures = true) where TMultiLingual : IMultiLingualObject where TTranslation : class, IObjectTranslation; + + Task GetTranslationAsync( + ICollection translations, + string culture = null, + bool fallbackToParentCultures = true) + where TTranslation : class, IObjectTranslation; } diff --git a/framework/src/Volo.Abp.MultiLingualObjects/Volo/Abp/MultiLingualObjects/MultiLingualObjectManager.cs b/framework/src/Volo.Abp.MultiLingualObjects/Volo/Abp/MultiLingualObjects/MultiLingualObjectManager.cs index b60e137e76..afb4509917 100644 --- a/framework/src/Volo.Abp.MultiLingualObjects/Volo/Abp/MultiLingualObjects/MultiLingualObjectManager.cs +++ b/framework/src/Volo.Abp.MultiLingualObjects/Volo/Abp/MultiLingualObjects/MultiLingualObjectManager.cs @@ -19,22 +19,21 @@ public class MultiLingualObjectManager : IMultiLingualObjectManager, ITransientD { SettingProvider = settingProvider; } - - public virtual async Task GetTranslationAsync( - TMultiLingual multiLingual, - string culture = null, - bool fallbackToParentCultures = true) - where TMultiLingual : IMultiLingualObject + public virtual async Task GetTranslationAsync( + ICollection translations, + string culture, + bool fallbackToParentCultures) where TTranslation : class, IObjectTranslation + { culture ??= CultureInfo.CurrentUICulture.Name; - if (multiLingual.Translations.IsNullOrEmpty()) + if (translations.IsNullOrEmpty()) { return null; } - var translation = multiLingual.Translations.FirstOrDefault(pt => pt.Language == culture); + var translation = translations.FirstOrDefault(pt => pt.Language == culture); if (translation != null) { return translation; @@ -44,7 +43,7 @@ public class MultiLingualObjectManager : IMultiLingualObjectManager, ITransientD { translation = GetTranslationBasedOnCulturalRecursive( CultureInfo.CurrentUICulture.Parent, - multiLingual.Translations, + translations, 0 ); @@ -56,16 +55,26 @@ public class MultiLingualObjectManager : IMultiLingualObjectManager, ITransientD var defaultLanguage = await SettingProvider.GetOrNullAsync(LocalizationSettingNames.DefaultLanguage); - translation = multiLingual.Translations.FirstOrDefault(pt => pt.Language == defaultLanguage); + translation = translations.FirstOrDefault(pt => pt.Language == defaultLanguage); if (translation != null) { return translation; } - translation = multiLingual.Translations.FirstOrDefault(); + translation = translations.FirstOrDefault(); return translation; } + public virtual Task GetTranslationAsync( + TMultiLingual multiLingual, + string culture = null, + bool fallbackToParentCultures = true) + where TMultiLingual : IMultiLingualObject + where TTranslation : class, IObjectTranslation + { + return GetTranslationAsync(multiLingual.Translations, culture: culture, fallbackToParentCultures: fallbackToParentCultures); + } + protected virtual TTranslation GetTranslationBasedOnCulturalRecursive( CultureInfo culture, ICollection translations, int currentDepth) where TTranslation : class, IObjectTranslation diff --git a/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/MultiTenancySides.cs b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/MultiTenancySides.cs index bf094c6bc3..0b848554bb 100644 --- a/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/MultiTenancySides.cs +++ b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/MultiTenancySides.cs @@ -6,7 +6,7 @@ namespace Volo.Abp.MultiTenancy; /// Represents sides in a multi tenancy application. /// [Flags] -public enum MultiTenancySides +public enum MultiTenancySides : byte { /// /// Tenant side. diff --git a/framework/src/Volo.Abp.ObjectExtending/Volo/Abp/Data/ExtraPropertyDictionaryExtensions.cs b/framework/src/Volo.Abp.ObjectExtending/Volo/Abp/Data/ExtraPropertyDictionaryExtensions.cs index b97b0056e9..d5de504afc 100644 --- a/framework/src/Volo.Abp.ObjectExtending/Volo/Abp/Data/ExtraPropertyDictionaryExtensions.cs +++ b/framework/src/Volo.Abp.ObjectExtending/Volo/Abp/Data/ExtraPropertyDictionaryExtensions.cs @@ -1,4 +1,5 @@ using System; +using JetBrains.Annotations; namespace Volo.Abp.Data; @@ -26,4 +27,28 @@ public static class ExtraPropertyDictionaryExtensions extraPropertyDictionary[key] = Enum.Parse(enumType, extraPropertyDictionary[key].ToString(), ignoreCase: true); return extraPropertyDictionary[key]; } -} + + public static bool HasSameItems( + [NotNull] this ExtraPropertyDictionary dictionary, + [NotNull] ExtraPropertyDictionary otherDictionary) + { + Check.NotNull(dictionary, nameof(dictionary)); + Check.NotNull(otherDictionary, nameof(otherDictionary)); + + if (dictionary.Count != otherDictionary.Count) + { + return false; + } + + foreach (var key in dictionary.Keys) + { + if (!otherDictionary.ContainsKey(key) || + dictionary[key]?.ToString() != otherDictionary[key]?.ToString()) + { + return false; + } + } + + return true; + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.ObjectExtending/Volo/Abp/Data/HasExtraPropertiesExtensions.cs b/framework/src/Volo.Abp.ObjectExtending/Volo/Abp/Data/HasExtraPropertiesExtensions.cs index 0bd64d55f1..db543bb67f 100644 --- a/framework/src/Volo.Abp.ObjectExtending/Volo/Abp/Data/HasExtraPropertiesExtensions.cs +++ b/framework/src/Volo.Abp.ObjectExtending/Volo/Abp/Data/HasExtraPropertiesExtensions.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.ComponentModel; using System.Globalization; using System.Linq; +using JetBrains.Annotations; using Volo.Abp.ObjectExtending; using Volo.Abp.Reflection; @@ -121,4 +122,14 @@ public static class HasExtraPropertiesExtensions source.RemoveProperty(property.Name); } } + + public static bool HasSameExtraProperties( + [NotNull] this IHasExtraProperties source, + [NotNull] IHasExtraProperties other) + { + Check.NotNull(source, nameof(source)); + Check.NotNull(other, nameof(other)); + + return source.ExtraProperties.HasSameItems(other.ExtraProperties); + } } diff --git a/framework/src/Volo.Abp.ObjectExtending/Volo/Abp/Data/IHasExtraProperties.cs b/framework/src/Volo.Abp.ObjectExtending/Volo/Abp/Data/IHasExtraProperties.cs index 03598e1164..ed2d11c250 100644 --- a/framework/src/Volo.Abp.ObjectExtending/Volo/Abp/Data/IHasExtraProperties.cs +++ b/framework/src/Volo.Abp.ObjectExtending/Volo/Abp/Data/IHasExtraProperties.cs @@ -1,7 +1,5 @@ namespace Volo.Abp.Data; -//TODO: Move to Volo.Abp.Data.ObjectExtending namespace at 4.0? - public interface IHasExtraProperties { ExtraPropertyDictionary ExtraProperties { get; } diff --git a/framework/src/Volo.Abp.RabbitMQ/Volo/Abp/RabbitMQ/QueueDeclareConfiguration.cs b/framework/src/Volo.Abp.RabbitMQ/Volo/Abp/RabbitMQ/QueueDeclareConfiguration.cs index 36f638668c..4b03c788c6 100644 --- a/framework/src/Volo.Abp.RabbitMQ/Volo/Abp/RabbitMQ/QueueDeclareConfiguration.cs +++ b/framework/src/Volo.Abp.RabbitMQ/Volo/Abp/RabbitMQ/QueueDeclareConfiguration.cs @@ -13,6 +13,8 @@ public class QueueDeclareConfiguration public bool Exclusive { get; set; } public bool AutoDelete { get; set; } + + public ushort? PrefetchCount { get; set; } public IDictionary Arguments { get; } @@ -20,13 +22,15 @@ public class QueueDeclareConfiguration [NotNull] string queueName, bool durable = true, bool exclusive = false, - bool autoDelete = false) + bool autoDelete = false, + ushort? prefetchCount = null) { QueueName = queueName; Durable = durable; Exclusive = exclusive; AutoDelete = autoDelete; Arguments = new Dictionary(); + PrefetchCount = prefetchCount; } public virtual QueueDeclareOk Declare(IModel channel) diff --git a/framework/src/Volo.Abp.RabbitMQ/Volo/Abp/RabbitMQ/RabbitMqMessageConsumer.cs b/framework/src/Volo.Abp.RabbitMQ/Volo/Abp/RabbitMQ/RabbitMqMessageConsumer.cs index 8ce184295a..5c45b6aefc 100644 --- a/framework/src/Volo.Abp.RabbitMQ/Volo/Abp/RabbitMQ/RabbitMqMessageConsumer.cs +++ b/framework/src/Volo.Abp.RabbitMQ/Volo/Abp/RabbitMQ/RabbitMqMessageConsumer.cs @@ -165,9 +165,14 @@ public class RabbitMqMessageConsumer : IRabbitMqMessageConsumer, ITransientDepen arguments: Queue.Arguments ); + if (Queue.PrefetchCount.HasValue) + { + Channel.BasicQos(0, Queue.PrefetchCount.Value, false); + } + var consumer = new AsyncEventingBasicConsumer(Channel); consumer.Received += HandleIncomingMessageAsync; - + Channel.BasicConsume( queue: Queue.QueueName, autoAck: false, diff --git a/framework/src/Volo.Abp.Settings/Volo/Abp/Settings/SettingDefinition.cs b/framework/src/Volo.Abp.Settings/Volo/Abp/Settings/SettingDefinition.cs index ee96d1c160..536a407271 100644 --- a/framework/src/Volo.Abp.Settings/Volo/Abp/Settings/SettingDefinition.cs +++ b/framework/src/Volo.Abp.Settings/Volo/Abp/Settings/SettingDefinition.cs @@ -39,7 +39,7 @@ public class SettingDefinition /// A list of allowed providers to get/set value of this setting. /// An empty list indicates that all providers are allowed. /// - public List Providers { get; } //TODO: Rename to AllowedProviders + public List Providers { get; } /// /// Is this setting inherited from parent scopes. @@ -91,14 +91,14 @@ public class SettingDefinition } /// - /// Sets a property in the dictionary. + /// Adds one or more providers to the list. /// This is a shortcut for nested calls on this object. /// public virtual SettingDefinition WithProviders(params string[] providers) { if (!providers.IsNullOrEmpty()) { - Providers.AddRange(providers); + Providers.AddIfNotContains(providers); } return this; diff --git a/framework/src/Volo.Abp.Swashbuckle/wwwroot/swagger/ui/abp.swagger.js b/framework/src/Volo.Abp.Swashbuckle/wwwroot/swagger/ui/abp.swagger.js index 249f75ebb0..c143b7e75e 100644 --- a/framework/src/Volo.Abp.Swashbuckle/wwwroot/swagger/ui/abp.swagger.js +++ b/framework/src/Volo.Abp.Swashbuckle/wwwroot/swagger/ui/abp.swagger.js @@ -1,24 +1,23 @@ var abp = abp || {}; -(function () { +(function() { - abp.SwaggerUIBundle = function (configObject) { + abp.SwaggerUIBundle = function(configObject) { var excludeUrl = ["swagger.json", "connect/token"] var firstRequest = true; abp.appPath = configObject.baseUrl || abp.appPath; var requestInterceptor = configObject.requestInterceptor; - - configObject.requestInterceptor = async function (request) { - if(request.url.includes(excludeUrl[1])){ + configObject.requestInterceptor = async function(request) { + + if (request.url.includes(excludeUrl[1])) { firstRequest = true; } - if(firstRequest && !excludeUrl.some(url => request.url.includes(url))) - { - await fetch(`${abp.appPath}abp/Swashbuckle/SetCsrfCookie`,{ + if (firstRequest && !excludeUrl.some(url => request.url.includes(url))) { + await fetch(`${abp.appPath}abp/Swashbuckle/SetCsrfCookie`, { headers: request.headers }); firstRequest = false; @@ -28,8 +27,12 @@ var abp = abp || {}; if (antiForgeryToken) { request.headers[abp.security.antiForgery.tokenHeaderName] = antiForgeryToken; } - - if(requestInterceptor){ + + if (!request.headers["X-Requested-With"]) { + request.headers["X-Requested-With"] = "XMLHttpRequest"; + } + + if (requestInterceptor) { requestInterceptor(request); } return request; diff --git a/framework/src/Volo.Abp.Threading/Volo/Abp/Threading/NullCancellationTokenProvider.cs b/framework/src/Volo.Abp.Threading/Volo/Abp/Threading/NullCancellationTokenProvider.cs index 8f8113ba0d..2da06632cd 100644 --- a/framework/src/Volo.Abp.Threading/Volo/Abp/Threading/NullCancellationTokenProvider.cs +++ b/framework/src/Volo.Abp.Threading/Volo/Abp/Threading/NullCancellationTokenProvider.cs @@ -4,7 +4,7 @@ namespace Volo.Abp.Threading; public class NullCancellationTokenProvider : CancellationTokenProviderBase { - public static NullCancellationTokenProvider Instance { get; } = new NullCancellationTokenProvider(); + public static NullCancellationTokenProvider Instance { get; } = new(); public override CancellationToken Token => OverrideValue?.CancellationToken ?? CancellationToken.None; diff --git a/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/MenuManager.cs b/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/MenuManager.cs index d325708175..aa933c6e09 100644 --- a/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/MenuManager.cs +++ b/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/MenuManager.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Volo.Abp.Authorization.Permissions; using Volo.Abp.DependencyInjection; @@ -13,11 +14,11 @@ namespace Volo.Abp.UI.Navigation; public class MenuManager : IMenuManager, ITransientDependency { protected AbpNavigationOptions Options { get; } - protected IHybridServiceScopeFactory ServiceScopeFactory { get; } + protected IServiceScopeFactory ServiceScopeFactory { get; } protected ISimpleStateCheckerManager SimpleStateCheckerManager { get; } public MenuManager( IOptions options, - IHybridServiceScopeFactory serviceScopeFactory, + IServiceScopeFactory serviceScopeFactory, ISimpleStateCheckerManager simpleStateCheckerManager) { Options = options.Value; diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/ar.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/ar.json index 7e667c1bbc..4717b1fe9b 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/ar.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/ar.json @@ -11,7 +11,7 @@ "Close": "أغلق", "Save": "حفظ", "SavingWithThreeDot": "حفظ...", - "Actions": "أجراءات", + "Actions": "الإجراءات", "Delete": "حذف", "SuccessfullyDeleted": "تم الحذف بنجاح", "Edit": "تعديل", @@ -50,4 +50,4 @@ "ItemWillBeDeletedMessage": "سوف يتم حذف هذا البند!", "ManageYourAccount": "إدارة حسابك" } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/pt-BR.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/pt-BR.json index aa915a704f..03855ec698 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/pt-BR.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/pt-BR.json @@ -1,10 +1,10 @@ { "culture": "pt-BR", "texts": { - "Languages": "línguas", + "Languages": "Idiomas", "AreYouSure": "Você tem certeza?", "Cancel": "Cancelar", - "Clear": "Claro", + "Clear": "Limpar", "Yes": "Sim", "No": "Não", "Ok": "OK", @@ -16,7 +16,7 @@ "SuccessfullyDeleted": "Excluído com sucesso", "Edit": "Editar", "Refresh": "Atualizar", - "Language": "Língua", + "Language": "Idioma", "LoadMore": "Carregar mais", "ProcessingWithThreeDot": "Processando...", "LoadingWithThreeDot": "Carregando...", diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/ro-RO.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/ro-RO.json index 94e56a66f3..7064064671 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/ro-RO.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/ro-RO.json @@ -31,14 +31,14 @@ "PagerPrevious": "Anterior", "PagerFirst": "Primul", "PagerLast": "Ultimul", - "PagerInfo": "Afişate _START_ to _END_ of _TOTAL_ înregistrări", - "PagerInfo{0}{1}{2}": "Afişate {0} to {1} of {2} înregistrări", - "PagerInfoEmpty": "Afişate 0 to 0 of 0 înregistrări", + "PagerInfo": "Afişate de la _START_ la _END_ din _TOTAL_ înregistrări", + "PagerInfo{0}{1}{2}": "Afişate de la {0} la {1} din {2} înregistrări", + "PagerInfoEmpty": "Afişate 0 din 0 înregistrări", "PagerInfoFiltered": "(filtrate de la _MAX_ înregistrări totale)", "NoDataAvailableInDatatable": "Nicio informaţie disponibilă", "Total": "total", "Selected": "selectate", - "PagerShowMenuEntries": "Arată _MENU_ intrări", + "PagerShowMenuEntries": "Afişează _MENU_ intrări", "DatatableActionDropdownDefaultText": "Acţiuni", "ChangePassword": "Schimbă parola", "PersonalInfo": "Profilul meu", @@ -50,4 +50,4 @@ "ItemWillBeDeletedMessage": "Acest articol va fi şters!", "ManageYourAccount": "Administraţi-vă contul" } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo/Abp/AspNetCore/Mvc/UI/Components/LayoutHook/AbpLayoutHookOptions.cs b/framework/src/Volo.Abp.UI/Volo/Abp/Ui/LayoutHooks/AbpLayoutHookOptions.cs similarity index 89% rename from framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo/Abp/AspNetCore/Mvc/UI/Components/LayoutHook/AbpLayoutHookOptions.cs rename to framework/src/Volo.Abp.UI/Volo/Abp/Ui/LayoutHooks/AbpLayoutHookOptions.cs index 68851c1860..d5ba4aa239 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo/Abp/AspNetCore/Mvc/UI/Components/LayoutHook/AbpLayoutHookOptions.cs +++ b/framework/src/Volo.Abp.UI/Volo/Abp/Ui/LayoutHooks/AbpLayoutHookOptions.cs @@ -1,7 +1,7 @@ using System; using System.Collections.Generic; -namespace Volo.Abp.AspNetCore.Mvc.UI.Components.LayoutHook; +namespace Volo.Abp.Ui.LayoutHooks; public class AbpLayoutHookOptions { diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo/Abp/AspNetCore/Mvc/UI/Components/LayoutHook/LayoutHookInfo.cs b/framework/src/Volo.Abp.UI/Volo/Abp/Ui/LayoutHooks/LayoutHookInfo.cs similarity index 84% rename from framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo/Abp/AspNetCore/Mvc/UI/Components/LayoutHook/LayoutHookInfo.cs rename to framework/src/Volo.Abp.UI/Volo/Abp/Ui/LayoutHooks/LayoutHookInfo.cs index e2bb26dac5..db4ca39466 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo/Abp/AspNetCore/Mvc/UI/Components/LayoutHook/LayoutHookInfo.cs +++ b/framework/src/Volo.Abp.UI/Volo/Abp/Ui/LayoutHooks/LayoutHookInfo.cs @@ -1,11 +1,11 @@ using System; -namespace Volo.Abp.AspNetCore.Mvc.UI.Components.LayoutHook; +namespace Volo.Abp.Ui.LayoutHooks; public class LayoutHookInfo { /// - /// ViewComponent type. + /// Component type. /// public Type ComponentType { get; } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo/Abp/AspNetCore/Mvc/UI/Components/LayoutHook/LayoutHookViewModel.cs b/framework/src/Volo.Abp.UI/Volo/Abp/Ui/LayoutHooks/LayoutHookViewModel.cs similarity index 79% rename from framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo/Abp/AspNetCore/Mvc/UI/Components/LayoutHook/LayoutHookViewModel.cs rename to framework/src/Volo.Abp.UI/Volo/Abp/Ui/LayoutHooks/LayoutHookViewModel.cs index fbc73d8dad..107ad6990a 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo/Abp/AspNetCore/Mvc/UI/Components/LayoutHook/LayoutHookViewModel.cs +++ b/framework/src/Volo.Abp.UI/Volo/Abp/Ui/LayoutHooks/LayoutHookViewModel.cs @@ -1,4 +1,4 @@ -namespace Volo.Abp.AspNetCore.Mvc.UI.Components.LayoutHook; +namespace Volo.Abp.Ui.LayoutHooks; public class LayoutHookViewModel { diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo/Abp/AspNetCore/Mvc/UI/Components/LayoutHook/LayoutHooks.cs b/framework/src/Volo.Abp.UI/Volo/Abp/Ui/LayoutHooks/LayoutHooks.cs similarity index 88% rename from framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo/Abp/AspNetCore/Mvc/UI/Components/LayoutHook/LayoutHooks.cs rename to framework/src/Volo.Abp.UI/Volo/Abp/Ui/LayoutHooks/LayoutHooks.cs index 588872c46b..fafab40161 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo/Abp/AspNetCore/Mvc/UI/Components/LayoutHook/LayoutHooks.cs +++ b/framework/src/Volo.Abp.UI/Volo/Abp/Ui/LayoutHooks/LayoutHooks.cs @@ -1,4 +1,4 @@ -namespace Volo.Abp.AspNetCore.Mvc.UI.Components.LayoutHook; +namespace Volo.Abp.Ui.LayoutHooks; public static class LayoutHooks { diff --git a/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/Localization/en.json b/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/Localization/en.json index 8ce00a7c5b..29035fb57f 100644 --- a/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/Localization/en.json +++ b/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/Localization/en.json @@ -24,6 +24,8 @@ "ThisFieldMustBeAStringOrArrayTypeWithAMinimumLengthOf{0}": "This field must be a string or array type with a minimum length of '{0}'.", "ThisFieldIsNotAValidPhoneNumber.": "This field is not a valid phone number.", "ThisFieldMustBeBetween{0}And{1}": "This field must be between {0} and {1}.", + "ThisFieldMustBeGreaterThanOrEqual{0}":"This field must be greater than or equal to {0}.", + "ThisFieldMustBeLessOrEqual{0}":"This field must be less than or equal to {0}.", "ThisFieldMustMatchTheRegularExpression{0}": "This field must match the regular expression '{0}'.", "ThisFieldIsRequired.": "This field is required.", "ThisFieldMustBeAStringWithAMaximumLengthOf{0}": "This field must be a string with a maximum length of {0}.", diff --git a/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/Localization/pt-BR.json b/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/Localization/pt-BR.json index 4adbd81e80..1168a19317 100644 --- a/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/Localization/pt-BR.json +++ b/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/Localization/pt-BR.json @@ -24,6 +24,8 @@ "ThisFieldMustBeAStringOrArrayTypeWithAMinimumLengthOf{0}": "Este campo deve ser do tipo palavra ou matriz com comprimento mínimo de '{0}'.", "ThisFieldIsNotAValidPhoneNumber.": "Número de telefone inválido.", "ThisFieldMustBeBetween{0}And{1}": "Este campo deve estar entre {0} e {1}.", + "ThisFieldMustBeGreaterThanOrEqual{0}": "Este campo deve ser maior ou igual a {0}.", + "ThisFieldMustBeLessOrEqual{0}": "Este campo deve ser menor ou igual a {0}.", "ThisFieldMustMatchTheRegularExpression{0}": "Este campo deve ser compatível com a expressão regular: '{0}'.", "ThisFieldIsRequired.": "Campo Obrigatório.", "ThisFieldMustBeAStringWithAMaximumLengthOf{0}": "Campo com no máximo {0} caracteres.", diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.PlugIn/Volo.Abp.AspNetCore.Mvc.PlugIn.csproj b/framework/test/Volo.Abp.AspNetCore.Mvc.PlugIn/Volo.Abp.AspNetCore.Mvc.PlugIn.csproj index 91ca2b1312..d917afa97f 100644 --- a/framework/test/Volo.Abp.AspNetCore.Mvc.PlugIn/Volo.Abp.AspNetCore.Mvc.PlugIn.csproj +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.PlugIn/Volo.Abp.AspNetCore.Mvc.PlugIn.csproj @@ -4,6 +4,7 @@ net6.0 Library true + true diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcTestModule.cs b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcTestModule.cs index 2e8d8c4689..e303a0fb5d 100644 --- a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcTestModule.cs +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcTestModule.cs @@ -6,6 +6,7 @@ using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Mvc.Razor; using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations; using Volo.Abp.AspNetCore.Mvc.Authorization; using Volo.Abp.AspNetCore.Mvc.GlobalFeatures; using Volo.Abp.AspNetCore.Mvc.Localization; @@ -127,6 +128,11 @@ public class AbpAspNetCoreMvcTestModule : AbpModule options.Maps.Add("SerialNumber", () => ClaimTypes.SerialNumber); options.Maps.Add("DateOfBirth", () => ClaimTypes.DateOfBirth); }); + + Configure(options => + { + options.Contributors.Add(new TestApplicationConfigurationContributor()); + }); } public override void OnApplicationInitialization(ApplicationInitializationContext context) diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationConfigurationBuilder_Tests.cs b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationConfigurationBuilder_Tests.cs index c932e09488..5d3cb09749 100644 --- a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationConfigurationBuilder_Tests.cs +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationConfigurationBuilder_Tests.cs @@ -1,5 +1,6 @@ using System.Threading.Tasks; using Shouldly; +using Volo.Abp.Data; using Xunit; namespace Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations; @@ -15,5 +16,6 @@ public class ApplicationConfigurationBuilder_Tests : AspNetCoreMvcTestBase config.Auth.ShouldNotBeNull(); config.Localization.ShouldNotBeNull(); + config.GetProperty("TestKey").ShouldBe("TestValue"); } } diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/TestApplicationConfigurationContributor.cs b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/TestApplicationConfigurationContributor.cs new file mode 100644 index 0000000000..4ae197d2a0 --- /dev/null +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/TestApplicationConfigurationContributor.cs @@ -0,0 +1,13 @@ +using System.Threading.Tasks; +using Volo.Abp.Data; + +namespace Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations; + +public class TestApplicationConfigurationContributor : IApplicationConfigurationContributor +{ + public Task ContributeAsync(ApplicationConfigurationContributorContext context) + { + context.ApplicationConfiguration.SetProperty("TestKey", "TestValue"); + return Task.CompletedTask; + } +} diff --git a/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/AbpAuditingOptions_Tests.cs b/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/AbpAuditingOptions_Tests.cs new file mode 100644 index 0000000000..6853046241 --- /dev/null +++ b/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/AbpAuditingOptions_Tests.cs @@ -0,0 +1,23 @@ +using Microsoft.Extensions.Options; +using Shouldly; +using Xunit; + +namespace Volo.Abp.Auditing; + +public class AbpAuditingOptions_Tests : AbpAuditingTestBase +{ + private const string ApplicationName = "TEST_APP_NAME"; + + protected override void SetAbpApplicationCreationOptions(AbpApplicationCreationOptions options) + { + base.SetAbpApplicationCreationOptions(options); + options.ApplicationName = ApplicationName; + } + + [Fact] + public void Should_Set_Application_Name_From_Global_Application_Name_By_Default() + { + var options = GetRequiredService>().Value; + options.ApplicationName.ShouldBe(ApplicationName); + } +} \ No newline at end of file diff --git a/framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/AuthenticatedSimpleStateCheckerSerializerContributor_Tests.cs b/framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/AuthenticatedSimpleStateCheckerSerializerContributor_Tests.cs new file mode 100644 index 0000000000..0d84d167de --- /dev/null +++ b/framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/AuthenticatedSimpleStateCheckerSerializerContributor_Tests.cs @@ -0,0 +1,41 @@ +using System.Collections.Generic; +using System.Text.Json.Nodes; +using Shouldly; +using Volo.Abp.Authorization.Permissions; +using Volo.Abp.SimpleStateChecking; +using Xunit; + +namespace Volo.Abp.Authorization; + +public class AuthenticatedSimpleStateCheckerSerializerContributor_Tests +{ + [Fact] + public void Should_Serialize_RequireGlobalFeaturesSimpleStateChecker() + { + var serializer = new AuthenticatedSimpleStateCheckerSerializerContributor(); + + var result = serializer.SerializeToJson( + new RequireAuthenticatedSimpleStateChecker() + ); + + result.ShouldBe("{\"T\":\"A\"}"); + } + + [Fact] + public void Should_Deserialize_RequireGlobalFeaturesSimpleStateChecker() + { + var serializer = new AuthenticatedSimpleStateCheckerSerializerContributor(); + + var jsonObject = (JsonObject)JsonNode.Parse("{\"T\":\"A\"}"); + var checker = serializer.Deserialize(jsonObject, new MyState()); + + checker.ShouldBeOfType>(); + var globalFeaturesSimpleStateChecker = checker as RequireAuthenticatedSimpleStateChecker; + globalFeaturesSimpleStateChecker.ShouldNotBeNull(); + } + + private class MyState : IHasSimpleStateCheckers + { + public List> StateCheckers { get; } = new(); + } +} \ No newline at end of file diff --git a/framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/Authorization_Tests.cs b/framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/Authorization_Tests.cs index 42f6d3ce4a..a32939fa53 100644 --- a/framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/Authorization_Tests.cs +++ b/framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/Authorization_Tests.cs @@ -67,9 +67,9 @@ public class Authorization_Tests : AuthorizationTestBase } [Fact] - public void Should_Permission_Definition_GetGroup() + public async Task Should_Permission_Definition_GetGroup() { - _permissionDefinitionManager.GetGroups().Count.ShouldBe(1); + (await _permissionDefinitionManager.GetGroupsAsync()).Count.ShouldBe(1); } [Fact] diff --git a/framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/PermissionStateProvider_Tests.cs b/framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/PermissionStateProvider_Tests.cs index b0be00fe01..50805d4b58 100644 --- a/framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/PermissionStateProvider_Tests.cs +++ b/framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/PermissionStateProvider_Tests.cs @@ -29,7 +29,8 @@ public class SpecifyPermissionStateProvider : PermissionStateProvider_Tests [Fact] public async Task PermissionState_Test() { - var myPermission1 = PermissionDefinitionManager.Get("MyPermission1"); + var myPermission1 = await PermissionDefinitionManager.GetOrNullAsync("MyPermission1"); + myPermission1.ShouldNotBeNull(); myPermission1.StateCheckers.ShouldContain(x => x.GetType() == typeof(TestRequireEditionPermissionSimpleStateChecker)); (await StateCheckerManager.IsEnabledAsync(myPermission1)).ShouldBeFalse(); @@ -54,7 +55,8 @@ public class GlobalPermissionStateProvider : PermissionStateProvider_Tests [Fact] public async Task Global_PermissionState_Test() { - var myPermission2 = PermissionDefinitionManager.Get("MyPermission2"); + var myPermission2 = await PermissionDefinitionManager.GetOrNullAsync("MyPermission2"); + myPermission2.ShouldNotBeNull(); (await StateCheckerManager.IsEnabledAsync(myPermission2)).ShouldBeFalse(); diff --git a/framework/test/Volo.Abp.Caching.Tests/Volo/Abp/Caching/DistributedCache_Tests.cs b/framework/test/Volo.Abp.Caching.Tests/Volo/Abp/Caching/DistributedCache_Tests.cs index fdba79f1af..7908dd3d96 100644 --- a/framework/test/Volo.Abp.Caching.Tests/Volo/Abp/Caching/DistributedCache_Tests.cs +++ b/framework/test/Volo.Abp.Caching.Tests/Volo/Abp/Caching/DistributedCache_Tests.cs @@ -947,4 +947,19 @@ public class DistributedCache_Tests : AbpIntegratedTest cacheValue[0].Value.ShouldBeNull(); cacheValue[1].Value.ShouldBeNull(); } + + [Fact] + public async Task Should_Get_Same_Cache_Set_When_Resolve_With_Or_Without_Key() + { + var cache1 = GetRequiredService>(); + var cache2 = GetRequiredService>(); + + await cache1.SetAsync("john", new PersonCacheItem("John Doe")); + + var item1 = await cache1.GetAsync("john"); + item1.Name.ShouldBe("John Doe"); + + var item2 = await cache2.GetAsync("john"); + item2.Name.ShouldBe("John Doe"); + } } diff --git a/framework/test/Volo.Abp.Cli.Core.Tests/Volo/Abp/Cli/ProjectVersionParse_Tests.cs b/framework/test/Volo.Abp.Cli.Core.Tests/Volo/Abp/Cli/ProjectVersionParse_Tests.cs index d132bdf0d8..d0569de4c7 100644 --- a/framework/test/Volo.Abp.Cli.Core.Tests/Volo/Abp/Cli/ProjectVersionParse_Tests.cs +++ b/framework/test/Volo.Abp.Cli.Core.Tests/Volo/Abp/Cli/ProjectVersionParse_Tests.cs @@ -19,8 +19,8 @@ public class ProjectVersionParse_Tests "" + "" + "" + - "< PackageReference Include = \"Volo.Abp.Emailing\" Version = \"4.4.0-rc.1\" />" + - "" + + "" + + "" + "" + "" + "" + @@ -54,7 +54,7 @@ public class ProjectVersionParse_Tests "" + "" + "" + - "< PackageReference Include = \"Volo.Abp.Emailing\" Version= \"12.8.3-beta.1\" />" + + "" + "" + ""; diff --git a/framework/test/Volo.Abp.Core.Tests/Microsoft/Extensions/DependencyInjection/DependencyInjection_Tests.cs b/framework/test/Volo.Abp.Core.Tests/Microsoft/Extensions/DependencyInjection/DependencyInjection_Tests.cs index 5d77c6a00e..52f07620fb 100644 --- a/framework/test/Volo.Abp.Core.Tests/Microsoft/Extensions/DependencyInjection/DependencyInjection_Tests.cs +++ b/framework/test/Volo.Abp.Core.Tests/Microsoft/Extensions/DependencyInjection/DependencyInjection_Tests.cs @@ -47,19 +47,36 @@ public abstract class DependencyInjection_Standard_Tests : AbpIntegratedTest().ProperyInjectedService.ShouldNotBeNull(); + GetRequiredService().PropertyInjectedService.ShouldNotBeNull(); } [Fact] public void Should_Inject_Services_As_Properties_For_Generic_Classes() { - GetRequiredService>().ProperyInjectedService.ShouldNotBeNull(); + GetRequiredService>().PropertyInjectedService.ShouldNotBeNull(); } [Fact] public void Should_Inject_Services_As_Properties_For_Generic_Concrete_Classes() { - GetRequiredService().ProperyInjectedService.ShouldNotBeNull(); + GetRequiredService().PropertyInjectedService.ShouldNotBeNull(); + } + + [Fact] + public void Should_Not_Inject_Services_As_Properties_When_Class_With_DisablePropertyInjection() + { + GetRequiredService().PropertyInjectedService.ShouldBeNull(); + GetRequiredService>().PropertyInjectedService.ShouldBeNull(); + } + + [Fact] + public void Should_Not_Inject_Services_As_Properties_When_Property_With_DisablePropertyInjection() + { + GetRequiredService().PropertyInjectedService.ShouldNotBeNull(); + GetRequiredService().DisablePropertyInjectionService.ShouldBeNull(); + + GetRequiredService>().PropertyInjectedService.ShouldNotBeNull(); + GetRequiredService>().DisablePropertyInjectionService.ShouldBeNull(); } [Fact] @@ -145,18 +162,19 @@ public abstract class DependencyInjection_Standard_Tests : AbpIntegratedTest(); context.Services.AddType(); context.Services.AddTransient(typeof(GenericServiceWithPropertyInject<>)); - context.Services.AddTransient(typeof(ConcreteGenericServiceWithPropertyInject)); + context.Services.AddTransient(typeof(GenericServiceWithDisablePropertyInjectionOnClass<>)); + context.Services.AddTransient(typeof(GenericServiceWithDisablePropertyInjectionOnProperty<>)); } } public class ServiceWithPropertyInject : ITransientDependency { - public MyEmptyTransientService ProperyInjectedService { get; set; } + public MyEmptyTransientService PropertyInjectedService { get; set; } } public class GenericServiceWithPropertyInject : ITransientDependency { - public MyEmptyTransientService ProperyInjectedService { get; set; } + public MyEmptyTransientService PropertyInjectedService { get; set; } public T Value { get; set; } } @@ -165,4 +183,36 @@ public abstract class DependencyInjection_Standard_Tests : AbpIntegratedTest : ITransientDependency + { + public MyEmptyTransientService PropertyInjectedService { get; set; } + + public T Value { get; set; } + } + + public class GenericServiceWithDisablePropertyInjectionOnProperty : ITransientDependency + { + public MyEmptyTransientService PropertyInjectedService { get; set; } + + [DisablePropertyInjection] + public MyEmptyTransientService DisablePropertyInjectionService { get; set; } + + public T Value { get; set; } + } } diff --git a/framework/test/Volo.Abp.Core.Tests/Volo/Abp/AbpApplication_Initialize_Tests.cs b/framework/test/Volo.Abp.Core.Tests/Volo/Abp/AbpApplication_Initialize_Tests.cs index f69d94ce61..9eff208198 100644 --- a/framework/test/Volo.Abp.Core.Tests/Volo/Abp/AbpApplication_Initialize_Tests.cs +++ b/framework/test/Volo.Abp.Core.Tests/Volo/Abp/AbpApplication_Initialize_Tests.cs @@ -1,6 +1,7 @@ using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Shouldly; +using Volo.Abp.DependencyInjection; using Volo.Abp.Modularity; using Volo.Abp.Modularity.PlugIns; using Xunit; @@ -142,4 +143,40 @@ public class AbpApplication_Initialize_Tests plugInModule.OnApplicationShutdownIsCalled.ShouldBeTrue(); } } + + [Fact] + public void Should_Set_And_Get_ApplicationName() + { + const string applicationName = "MyApplication"; + + using (var application = AbpApplicationFactory.Create(options => + { + options.ApplicationName = applicationName; + })) + { + application.ApplicationName.ShouldBe(applicationName); + application.Services.GetApplicationName().ShouldBe(applicationName); + + application.Initialize(); + + application.ServiceProvider + .GetRequiredService() + .ApplicationName + .ShouldBe(applicationName); + } + } + + [Fact] + public async Task Should_Resolve_Root_Service_Provider() + { + using (var application = await AbpApplicationFactory.CreateAsync()) + { + await application.InitializeAsync(); + + application + .ServiceProvider + .GetRequiredService() + .ShouldNotBeNull(); + } + } } diff --git a/framework/test/Volo.Abp.Core.Tests/Volo/Abp/DependencyInjection/AbpLazyServiceProvider_Tests.cs b/framework/test/Volo.Abp.Core.Tests/Volo/Abp/DependencyInjection/AbpLazyServiceProvider_Tests.cs new file mode 100644 index 0000000000..c78dc9c989 --- /dev/null +++ b/framework/test/Volo.Abp.Core.Tests/Volo/Abp/DependencyInjection/AbpLazyServiceProvider_Tests.cs @@ -0,0 +1,50 @@ +using Microsoft.Extensions.DependencyInjection; +using Shouldly; +using Volo.Abp.Modularity; +using Volo.Abp.Testing.Utils; +using Xunit; + +namespace Volo.Abp.DependencyInjection; + +public class AbpLazyServiceProvider_Tests +{ + [Fact] + public void LazyServiceProvider_Should_Cache_Services() + { + using (var application = AbpApplicationFactory.Create()) + { + application.Initialize(); + + var lazyServiceProvider = application.ServiceProvider.GetRequiredService(); + + var transientTestService1 = lazyServiceProvider.LazyGetRequiredService(); + var transientTestService2 = lazyServiceProvider.LazyGetRequiredService(); + transientTestService1.ShouldBeSameAs(transientTestService2); + + var testCounter = application.ServiceProvider.GetRequiredService(); + testCounter.GetValue(nameof(TransientTestService)).ShouldBe(1); + } + } + + [DependsOn(typeof(AbpTestBaseModule))] + private class TestModule : AbpModule + { + public TestModule() + { + SkipAutoServiceRegistration = true; + } + + public override void ConfigureServices(ServiceConfigurationContext context) + { + context.Services.AddType(); + } + } + + private class TransientTestService : ITransientDependency + { + public TransientTestService(ITestCounter counter) + { + counter.Increment(nameof(TransientTestService)); + } + } +} diff --git a/framework/test/Volo.Abp.Core.Tests/Volo/Abp/DependencyInjection/HybridServiceScopeFactory_Tests.cs b/framework/test/Volo.Abp.Core.Tests/Volo/Abp/DependencyInjection/HybridServiceScopeFactory_Tests.cs deleted file mode 100644 index 6a3f059ba8..0000000000 --- a/framework/test/Volo.Abp.Core.Tests/Volo/Abp/DependencyInjection/HybridServiceScopeFactory_Tests.cs +++ /dev/null @@ -1,71 +0,0 @@ -using System; -using System.Threading.Tasks; -using Microsoft.Extensions.DependencyInjection; -using Shouldly; -using Volo.Abp.Modularity; -using Xunit; - -namespace Volo.Abp.DependencyInjection; - -public class HybridServiceScopeFactory_Tests -{ - [Fact] - public async Task Should_Use_Default_ServiceScopeFactory_By_Default_Async() - { - using (var application = await AbpApplicationFactory.CreateAsync()) - { - application.Services.AddType(typeof(MyServiceAsync)); - - await application.InitializeAsync(); - - var serviceScopeFactory = application.ServiceProvider.GetRequiredService(); - - using (var scope = serviceScopeFactory.CreateScope()) - { - scope.ServiceProvider.GetRequiredService(); - } - - MyServiceAsync.DisposeCount.ShouldBe(1); - } - } - - [Fact] - public void Should_Use_Default_ServiceScopeFactory_By_Default() - { - using (var application = AbpApplicationFactory.Create()) - { - application.Services.AddType(typeof(MyService)); - - application.Initialize(); - - var serviceScopeFactory = application.ServiceProvider.GetRequiredService(); - - using (var scope = serviceScopeFactory.CreateScope()) - { - scope.ServiceProvider.GetRequiredService(); - } - - MyService.DisposeCount.ShouldBe(1); - } - } - - private class MyServiceAsync : ITransientDependency, IDisposable - { - public static int DisposeCount { get; private set; } - - public void Dispose() - { - ++DisposeCount; - } - } - - private class MyService : ITransientDependency, IDisposable - { - public static int DisposeCount { get; private set; } - - public void Dispose() - { - ++DisposeCount; - } - } -} diff --git a/framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/FeaturesSimpleStateCheckerSerializerContributor_Tests.cs b/framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/FeaturesSimpleStateCheckerSerializerContributor_Tests.cs new file mode 100644 index 0000000000..9791ac44bc --- /dev/null +++ b/framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/FeaturesSimpleStateCheckerSerializerContributor_Tests.cs @@ -0,0 +1,46 @@ +using System.Collections.Generic; +using System.Text.Json.Nodes; +using Shouldly; +using Volo.Abp.SimpleStateChecking; +using Xunit; + +namespace Volo.Abp.Features; + +public class FeaturesSimpleStateCheckerSerializerContributor_Tests +{ + [Fact] + public void Should_Serialize_RequireGlobalFeaturesSimpleStateChecker() + { + var serializer = new FeaturesSimpleStateCheckerSerializerContributor(); + + var result = serializer.SerializeToJson( + new RequireFeaturesSimpleStateChecker( + "FeatureA", + "FeatureB" + ) + ); + + result.ShouldBe("{\"T\":\"F\",\"A\":true,\"N\":[\"FeatureA\",\"FeatureB\"]}"); + } + + [Fact] + public void Should_Deserialize_RequireGlobalFeaturesSimpleStateChecker() + { + var serializer = new FeaturesSimpleStateCheckerSerializerContributor(); + + var jsonObject = (JsonObject)JsonNode.Parse("{\"T\":\"F\",\"A\":true,\"N\":[\"FeatureA\",\"FeatureB\"]}"); + var checker = serializer.Deserialize(jsonObject, new MyState()); + + checker.ShouldBeOfType>(); + var globalFeaturesSimpleStateChecker = checker as RequireFeaturesSimpleStateChecker; + globalFeaturesSimpleStateChecker.ShouldNotBeNull(); + globalFeaturesSimpleStateChecker.RequiresAll.ShouldBeTrue(); + globalFeaturesSimpleStateChecker.FeatureNames[0].ShouldBe("FeatureA"); + globalFeaturesSimpleStateChecker.FeatureNames[1].ShouldBe("FeatureB"); + } + + private class MyState : IHasSimpleStateCheckers + { + public List> StateCheckers { get; } = new(); + } +} \ No newline at end of file diff --git a/framework/test/Volo.Abp.GlobalFeatures.Tests/Volo/Abp/GlobalFeatures/GlobalFeaturesSimpleStateCheckerSerializerContributor_Tests.cs b/framework/test/Volo.Abp.GlobalFeatures.Tests/Volo/Abp/GlobalFeatures/GlobalFeaturesSimpleStateCheckerSerializerContributor_Tests.cs new file mode 100644 index 0000000000..e0425775dc --- /dev/null +++ b/framework/test/Volo.Abp.GlobalFeatures.Tests/Volo/Abp/GlobalFeatures/GlobalFeaturesSimpleStateCheckerSerializerContributor_Tests.cs @@ -0,0 +1,46 @@ +using System.Collections.Generic; +using System.Text.Json.Nodes; +using Shouldly; +using Volo.Abp.SimpleStateChecking; +using Xunit; + +namespace Volo.Abp.GlobalFeatures; + +public class GlobalFeaturesSimpleStateCheckerSerializerContributor_Tests +{ + [Fact] + public void Should_Serialize_RequireGlobalFeaturesSimpleStateChecker() + { + var serializer = new GlobalFeaturesSimpleStateCheckerSerializerContributor(); + + var result = serializer.SerializeToJson( + new RequireGlobalFeaturesSimpleStateChecker( + "FeatureA", + "FeatureB" + ) + ); + + result.ShouldBe("{\"T\":\"G\",\"A\":true,\"N\":[\"FeatureA\",\"FeatureB\"]}"); + } + + [Fact] + public void Should_Deserialize_RequireGlobalFeaturesSimpleStateChecker() + { + var serializer = new GlobalFeaturesSimpleStateCheckerSerializerContributor(); + + var jsonObject = (JsonObject)JsonNode.Parse("{\"T\":\"G\",\"A\":true,\"N\":[\"FeatureA\",\"FeatureB\"]}"); + var checker = serializer.Deserialize(jsonObject, new MyState()); + + checker.ShouldBeOfType>(); + var globalFeaturesSimpleStateChecker = checker as RequireGlobalFeaturesSimpleStateChecker; + globalFeaturesSimpleStateChecker.ShouldNotBeNull(); + globalFeaturesSimpleStateChecker.RequiresAll.ShouldBeTrue(); + globalFeaturesSimpleStateChecker.GlobalFeatureNames[0].ShouldBe("FeatureA"); + globalFeaturesSimpleStateChecker.GlobalFeatureNames[1].ShouldBe("FeatureB"); + } + + private class MyState : IHasSimpleStateCheckers + { + public List> StateCheckers { get; } = new(); + } +} \ No newline at end of file diff --git a/framework/test/Volo.Abp.Json.Tests/Volo/Abp/Json/AbpStringToEnum_Tests.cs b/framework/test/Volo.Abp.Json.Tests/Volo/Abp/Json/AbpStringToEnum_Tests.cs index d3bba36534..8336b4ce7d 100644 --- a/framework/test/Volo.Abp.Json.Tests/Volo/Abp/Json/AbpStringToEnum_Tests.cs +++ b/framework/test/Volo.Abp.Json.Tests/Volo/Abp/Json/AbpStringToEnum_Tests.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Text.Json; using Shouldly; using Volo.Abp.Json.SystemTextJson.JsonConverters; @@ -26,6 +27,16 @@ namespace Volo.Abp.Json testClass = JsonSerializer.Deserialize("{\"Day\": 1}", options); testClass.ShouldNotBeNull(); testClass.Day.ShouldBe(DayOfWeek.Monday); + + var dictionary = JsonSerializer.Deserialize>("{\"Monday\":\"Mo\"}", options); + dictionary.ShouldNotBeNull(); + dictionary.Keys.ShouldContain(DayOfWeek.Monday); + dictionary.Values.ShouldContain("Mo"); + + dictionary = JsonSerializer.Deserialize>("{\"1\":\"Mo\"}", options); + dictionary.ShouldNotBeNull(); + dictionary.Keys.ShouldContain(DayOfWeek.Monday); + dictionary.Values.ShouldContain("Mo"); } [Fact] @@ -45,6 +56,13 @@ namespace Volo.Abp.Json }); testClassJson.ShouldBe("{\"Day\":1}"); + + testClassJson = JsonSerializer.Serialize(new Dictionary + { + {DayOfWeek.Monday, "Mo"} + }, options); + + testClassJson.ShouldBe("{\"Monday\":\"Mo\"}"); } class TestClass diff --git a/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/AbpLocalizationTestModule.cs b/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/AbpLocalizationTestModule.cs new file mode 100644 index 0000000000..340d091330 --- /dev/null +++ b/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/AbpLocalizationTestModule.cs @@ -0,0 +1,39 @@ +using Volo.Abp.Localization.TestResources.Base.CountryNames; +using Volo.Abp.Localization.TestResources.Base.Validation; +using Volo.Abp.Localization.TestResources.Source; +using Volo.Abp.Modularity; +using Volo.Abp.VirtualFileSystem; + +namespace Volo.Abp.Localization; + +[DependsOn(typeof(AbpTestBaseModule))] +[DependsOn(typeof(AbpLocalizationModule))] +public class AbpLocalizationTestModule : AbpModule +{ + public override void ConfigureServices(ServiceConfigurationContext context) + { + Configure(options => + { + options.FileSets.AddEmbedded(); + }); + + Configure(options => + { + options.Resources + .Add("en") + .AddVirtualJson("/Volo/Abp/Localization/TestResources/Base/Validation"); + + options.Resources + .Add("en") + .AddVirtualJson("/Volo/Abp/Localization/TestResources/Base/CountryNames"); + + options.Resources + .Add("en") + .AddVirtualJson("/Volo/Abp/Localization/TestResources/Source"); + + options.Resources + .Get() + .AddVirtualJson("/Volo/Abp/Localization/TestResources/SourceExt"); + }); + } +} \ No newline at end of file diff --git a/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/AbpLocalization_Tests.cs b/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/AbpLocalization_Tests.cs index 6c4bdfff08..d643f163b9 100644 --- a/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/AbpLocalization_Tests.cs +++ b/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/AbpLocalization_Tests.cs @@ -2,17 +2,13 @@ using System.Globalization; using System.Linq; using Microsoft.Extensions.Localization; using Shouldly; -using Volo.Abp.Localization.TestResources.Base.CountryNames; -using Volo.Abp.Localization.TestResources.Base.Validation; using Volo.Abp.Localization.TestResources.Source; -using Volo.Abp.Modularity; using Volo.Abp.Testing; -using Volo.Abp.VirtualFileSystem; using Xunit; namespace Volo.Abp.Localization; -public class AbpLocalization_Tests : AbpIntegratedTest +public class AbpLocalization_Tests : AbpIntegratedTest { private readonly IStringLocalizer _localizer; private readonly IStringLocalizerFactory _localizerFactory; @@ -76,7 +72,6 @@ public class AbpLocalization_Tests : AbpIntegratedTest ls.Name == "USA"); } - } [Fact] @@ -275,7 +268,6 @@ public class AbpLocalization_Tests : AbpIntegratedTest(options => - { - options.FileSets.AddEmbedded(); - }); - - Configure(options => - { - options.Resources - .Add("en") - .AddVirtualJson("/Volo/Abp/Localization/TestResources/Base/Validation"); - - options.Resources - .Add("en") - .AddVirtualJson("/Volo/Abp/Localization/TestResources/Base/CountryNames"); - - options.Resources - .Add("en") - .AddVirtualJson("/Volo/Abp/Localization/TestResources/Source"); - - options.Resources - .Get() - .AddVirtualJson("/Volo/Abp/Localization/TestResources/SourceExt"); - }); - } - } -} +} \ No newline at end of file diff --git a/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/LocalizableStringSerializer_Tests.cs b/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/LocalizableStringSerializer_Tests.cs new file mode 100644 index 0000000000..d8fc1717d2 --- /dev/null +++ b/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/LocalizableStringSerializer_Tests.cs @@ -0,0 +1,75 @@ +using Shouldly; +using Volo.Abp.Localization.TestResources.Source; +using Volo.Abp.Testing; +using Xunit; + +namespace Volo.Abp.Localization; + +public class LocalizableStringSerializer_Tests : AbpIntegratedTest +{ + private readonly ILocalizableStringSerializer _serializer; + + public LocalizableStringSerializer_Tests() + { + _serializer = GetRequiredService(); + } + + [Fact] + public void Serialize_FixedLocalizableString() + { + _serializer + .Serialize(new FixedLocalizableString("")) + .ShouldBe("F:"); + + _serializer + .Serialize(new FixedLocalizableString("Hello World")) + .ShouldBe("F:Hello World"); + } + + [Fact] + public void Serialize_LocalizableString() + { + _serializer + .Serialize(new LocalizableString(typeof(LocalizationTestResource),"Car")) + .ShouldBe("L:Test,Car"); + } + + [Fact] + public void Deserialize_FixedLocalizableString() + { + _serializer + .Deserialize("") + .ShouldBeOfType() + .Value.ShouldBe(""); + + _serializer + .Deserialize("Hello") + .ShouldBeOfType() + .Value.ShouldBe("Hello"); + + _serializer + .Deserialize("F:Hello") + .ShouldBeOfType() + .Value.ShouldBe("Hello"); + } + + [Fact] + public void Deserialize_LocalizableString() + { + var localizableString = _serializer + .Deserialize("L:Test,Car") + .ShouldBeOfType(); + localizableString.ResourceType.ShouldBe(typeof(LocalizationTestResource)); + localizableString.Name.ShouldBe("Car"); + + Assert.Throws(() => + { + _serializer.Deserialize("L:Test"); + }); + + Assert.Throws(() => + { + _serializer.Deserialize("L:Test, "); + }); + } +} \ No newline at end of file diff --git a/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/Source/LocalizationTestResource.cs b/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/Source/LocalizationTestResource.cs index 772acd78d3..bc32e98bcc 100644 --- a/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/Source/LocalizationTestResource.cs +++ b/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/Source/LocalizationTestResource.cs @@ -7,6 +7,7 @@ namespace Volo.Abp.Localization.TestResources.Source; typeof(LocalizationTestValidationResource), typeof(LocalizationTestCountryNamesResource) )] +[LocalizationResourceName("Test")] public sealed class LocalizationTestResource { diff --git a/framework/test/Volo.Abp.MultiLingualObjects.Tests/Volo/Abp/MultiLingualObjects/MultiLingualObjectManager_Tests.cs b/framework/test/Volo.Abp.MultiLingualObjects.Tests/Volo/Abp/MultiLingualObjects/MultiLingualObjectManager_Tests.cs index 1b26b06297..afe15bff99 100644 --- a/framework/test/Volo.Abp.MultiLingualObjects.Tests/Volo/Abp/MultiLingualObjects/MultiLingualObjectManager_Tests.cs +++ b/framework/test/Volo.Abp.MultiLingualObjects.Tests/Volo/Abp/MultiLingualObjects/MultiLingualObjectManager_Tests.cs @@ -51,6 +51,17 @@ public class MultiLingualObjectManager_Tests : AbpIntegratedTest net6.0 + true diff --git a/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/EntityChangeEvents_Tests.cs b/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/EntityChangeEvents_Tests.cs index a94c722faf..12b3fa01c0 100644 --- a/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/EntityChangeEvents_Tests.cs +++ b/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/EntityChangeEvents_Tests.cs @@ -32,37 +32,18 @@ public abstract class EntityChangeEvents_Tests : TestAppTestBase { var personName = Guid.NewGuid().ToString("N"); - var creatingEventTriggered = false; var createdEventTriggered = false; var createdEtoTriggered = false; using (var uow = GetRequiredService().Begin()) { -#pragma warning disable 618 - LocalEventBus.Subscribe>(data => -#pragma warning restore 618 - { - creatingEventTriggered.ShouldBeFalse(); - createdEventTriggered.ShouldBeFalse(); - - creatingEventTriggered = true; - - data.Entity.Name.ShouldBe(personName); - - /* Want to change age from 15 to 18 */ - data.Entity.Age.ShouldBe(15); - data.Entity.Age = 18; - return Task.CompletedTask; - }); - LocalEventBus.Subscribe>(data => { - creatingEventTriggered.ShouldBeTrue(); createdEventTriggered.ShouldBeFalse(); createdEventTriggered = true; - data.Entity.Age.ShouldBe(18); + data.Entity.Age.ShouldBe(15); data.Entity.Name.ShouldBe(personName); return Task.CompletedTask; @@ -81,8 +62,7 @@ public abstract class EntityChangeEvents_Tests : TestAppTestBase await uow.CompleteAsync(); } - - creatingEventTriggered.ShouldBeTrue(); + createdEventTriggered.ShouldBeTrue(); createdEtoTriggered.ShouldBeTrue(); } diff --git a/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/HasExtraPropertiesExtensions_Tests.cs b/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/HasExtraPropertiesExtensions_Tests.cs index 95e222e2c7..4ad99fee1e 100644 --- a/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/HasExtraPropertiesExtensions_Tests.cs +++ b/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/HasExtraPropertiesExtensions_Tests.cs @@ -45,4 +45,25 @@ public class HasExtraPropertiesExtensions_Tests city.SetProperty("DateTime?", DateTime.MinValue); city.GetProperty("DateTime?").ShouldBe(DateTime.MinValue); } + + [Fact] + public void HasSameExtraProperties_Tests() + { + var adana = new City(Guid.NewGuid(), "Adana"); + adana.SetProperty("IsHot", true); + + var antalya = new City(Guid.NewGuid(), "Antalya"); + antalya.SetProperty("IsHot", true); + + adana.HasSameExtraProperties(antalya).ShouldBeTrue(); + + adana.SetProperty("IsHot", false); + adana.HasSameExtraProperties(antalya).ShouldBeFalse(); + + adana.SetProperty("IsHot", true); + adana.HasSameExtraProperties(antalya).ShouldBeTrue(); + + adana.SetProperty("Population", 3_000_000); + adana.HasSameExtraProperties(antalya).ShouldBeFalse(); + } } diff --git a/modules/account/Volo.Abp.Account.abpmdl.json b/modules/account/Volo.Abp.Account.abpmdl.json index 6762d81f33..dabb3f2ff9 100644 --- a/modules/account/Volo.Abp.Account.abpmdl.json +++ b/modules/account/Volo.Abp.Account.abpmdl.json @@ -38,8 +38,8 @@ "path": "src/Volo.Abp.Account.Blazor/Volo.Abp.Account.Blazor.abppkg.json", "folder": "src" }, - "Volo.Abp.Account.Installer": { - "path": "src/Volo.Abp.Account.Installer/Volo.Abp.Account.Installer.abppkg.json", + "Volo.Abp.Account.Web.OpenIddict": { + "path": "src/Volo.Abp.Account.Web.OpenIddict/Volo.Abp.Account.Web.OpenIddict.abppkg.json", "folder": "src" } } diff --git a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo.Abp.Account.Application.Contracts.abppkg.analyze.json b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo.Abp.Account.Application.Contracts.abppkg.analyze.json index 4edb52319f..8cb409b1fc 100644 --- a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo.Abp.Account.Application.Contracts.abppkg.analyze.json +++ b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo.Abp.Account.Application.Contracts.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.Abp.Account.Application.Contracts", - "hash": "eda5b3412f7e1dd8dc07761a04f3a064", + "hash": "63eee204db33a361b137b2cff508e53f", "contents": [ { "namespace": "Volo.Abp.Account", diff --git a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/AbpAccountApplicationContractsModule.cs b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/AbpAccountApplicationContractsModule.cs index 4cfe025e1c..1400fd5f25 100644 --- a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/AbpAccountApplicationContractsModule.cs +++ b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/AbpAccountApplicationContractsModule.cs @@ -3,6 +3,9 @@ using Volo.Abp.Identity; using Volo.Abp.Localization; using Volo.Abp.Localization.ExceptionHandling; using Volo.Abp.Modularity; +using Volo.Abp.ObjectExtending; +using Volo.Abp.ObjectExtending.Modularity; +using Volo.Abp.Threading; using Volo.Abp.Validation.Localization; using Volo.Abp.VirtualFileSystem; @@ -13,6 +16,8 @@ namespace Volo.Abp.Account; )] public class AbpAccountApplicationContractsModule : AbpModule { + private readonly static OneTimeRunner OneTimeRunner = new OneTimeRunner(); + public override void ConfigureServices(ServiceConfigurationContext context) { Configure(options => @@ -33,4 +38,17 @@ public class AbpAccountApplicationContractsModule : AbpModule options.MapCodeNamespace("Volo.Account", typeof(AccountResource)); }); } + + public override void PostConfigureServices(ServiceConfigurationContext context) + { + OneTimeRunner.Run(() => + { + ModuleExtensionConfigurationHelper.ApplyEntityConfigurationToApi( + IdentityModuleExtensionConsts.ModuleName, + IdentityModuleExtensionConsts.EntityNames.User, + getApiTypes: new[] { typeof(ProfileDto) }, + updateApiTypes: new[] { typeof(UpdateProfileDto) } + ); + }); + } } diff --git a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/ro-RO.json b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/ro-RO.json index c753009bb0..149ad71d95 100644 --- a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/ro-RO.json +++ b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/ro-RO.json @@ -27,7 +27,7 @@ "DisplayName:UserName": "Nume de utilizator", "DisplayName:Email": "Email", "DisplayName:Name": "Nume", - "DisplayName:Surname": "Surname", + "DisplayName:Surname": "Nume de familie", "DisplayName:Password": "Parolă", "DisplayName:EmailAddress": "Adresa de email", "DisplayName:PhoneNumber": "Număr de telefon", diff --git a/modules/account/src/Volo.Abp.Account.Application/Volo.Abp.Account.Application.abppkg.analyze.json b/modules/account/src/Volo.Abp.Account.Application/Volo.Abp.Account.Application.abppkg.analyze.json index db23b687a0..6f591b2e46 100644 --- a/modules/account/src/Volo.Abp.Account.Application/Volo.Abp.Account.Application.abppkg.analyze.json +++ b/modules/account/src/Volo.Abp.Account.Application/Volo.Abp.Account.Application.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.Abp.Account.Application", - "hash": "7fb9c3f35b18f2e9a0577d571fccf9df", + "hash": "9607ce81498fab564ea4a3681c15f72d", "contents": [ { "namespace": "Volo.Abp.Account", @@ -24,26 +24,6 @@ ], "contentType": "applicationService", "name": "ProfileAppService" - }, - { - "defaultValue": "true", - "displayName": "Is self-registration enabled", - "description": "Whether a user can register the account by him or herself.", - "isVisibleToClient": true, - "isInherited": true, - "isEncrypted": false, - "contentType": "setting", - "name": "Abp.Account.IsSelfRegistrationEnabled" - }, - { - "defaultValue": "true", - "displayName": "Authenticate with a local account", - "description": "Indicates if the server will allow users to authenticate with a local account.", - "isVisibleToClient": true, - "isInherited": true, - "isEncrypted": false, - "contentType": "setting", - "name": "Abp.Account.EnableLocalLogin" } ] } \ No newline at end of file diff --git a/modules/account/src/Volo.Abp.Account.Blazor/AbpAccountBlazorAutoMapperProfile.cs b/modules/account/src/Volo.Abp.Account.Blazor/AbpAccountBlazorAutoMapperProfile.cs index 8838cee634..af59d75321 100644 --- a/modules/account/src/Volo.Abp.Account.Blazor/AbpAccountBlazorAutoMapperProfile.cs +++ b/modules/account/src/Volo.Abp.Account.Blazor/AbpAccountBlazorAutoMapperProfile.cs @@ -10,10 +10,11 @@ public class AbpAccountBlazorAutoMapperProfile : Profile public AbpAccountBlazorAutoMapperProfile() { CreateMap() + .MapExtraProperties() .Ignore(x => x.PhoneNumberConfirmed) .Ignore(x => x.EmailConfirmed); CreateMap() - .Ignore(x => x.ExtraProperties); + .MapExtraProperties(); } } diff --git a/modules/account/src/Volo.Abp.Account.Blazor/AbpAccountBlazorModule.cs b/modules/account/src/Volo.Abp.Account.Blazor/AbpAccountBlazorModule.cs index c1e52e9b5f..61b42e1807 100644 --- a/modules/account/src/Volo.Abp.Account.Blazor/AbpAccountBlazorModule.cs +++ b/modules/account/src/Volo.Abp.Account.Blazor/AbpAccountBlazorModule.cs @@ -1,8 +1,12 @@ using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.Account.Blazor.Pages.Account; using Volo.Abp.AspNetCore.Components.Web.Theming; using Volo.Abp.AspNetCore.Components.Web.Theming.Routing; using Volo.Abp.AutoMapper; using Volo.Abp.Modularity; +using Volo.Abp.ObjectExtending; +using Volo.Abp.ObjectExtending.Modularity; +using Volo.Abp.Threading; using Volo.Abp.UI.Navigation; namespace Volo.Abp.Account.Blazor; @@ -14,6 +18,8 @@ namespace Volo.Abp.Account.Blazor; )] public class AbpAccountBlazorModule : AbpModule { + private readonly static OneTimeRunner OneTimeRunner = new OneTimeRunner(); + public override void ConfigureServices(ServiceConfigurationContext context) { context.Services.AddAutoMapperObjectMapper(); @@ -33,4 +39,17 @@ public class AbpAccountBlazorModule : AbpModule options.AdditionalAssemblies.Add(typeof(AbpAccountBlazorModule).Assembly); }); } + + public override void PostConfigureServices(ServiceConfigurationContext context) + { + OneTimeRunner.Run(() => + { + ModuleExtensionConfigurationHelper + .ApplyEntityConfigurationToUi( + IdentityModuleExtensionConsts.ModuleName, + IdentityModuleExtensionConsts.EntityNames.User, + editFormTypes: new[] { typeof(PersonalInfoModel) } + ); + }); + } } diff --git a/modules/account/src/Volo.Abp.Account.Blazor/Pages/Account/AccountManage.razor b/modules/account/src/Volo.Abp.Account.Blazor/Pages/Account/AccountManage.razor index a3a4e76b58..2a625f3e35 100644 --- a/modules/account/src/Volo.Abp.Account.Blazor/Pages/Account/AccountManage.razor +++ b/modules/account/src/Volo.Abp.Account.Blazor/Pages/Account/AccountManage.razor @@ -1,5 +1,9 @@ @page "/account/manage-profile" @using Microsoft.AspNetCore.Components.Forms +@using Volo.Abp.Account.Localization +@using Volo.Abp.AspNetCore.Components.Web +@using Volo.Abp.BlazoriseUI.Components.ObjectExtending +@inject AbpBlazorMessageLocalizerHelper LH @inherits AbpAccountComponentBase @@ -58,6 +62,7 @@ @L["DisplayName:PhoneNumber"] + diff --git a/modules/account/src/Volo.Abp.Account.Blazor/Pages/Account/AccountManage.razor.cs b/modules/account/src/Volo.Abp.Account.Blazor/Pages/Account/AccountManage.razor.cs index 3a0aff243b..567363843b 100644 --- a/modules/account/src/Volo.Abp.Account.Blazor/Pages/Account/AccountManage.razor.cs +++ b/modules/account/src/Volo.Abp.Account.Blazor/Pages/Account/AccountManage.razor.cs @@ -2,6 +2,7 @@ using Microsoft.AspNetCore.Components; using Volo.Abp.AspNetCore.Components.Messages; using Volo.Abp.Identity; +using Volo.Abp.ObjectExtending; namespace Volo.Abp.Account.Blazor.Pages.Account; @@ -58,7 +59,7 @@ public partial class AccountManage await UiMessageService.Success(L["PasswordChanged"]); } - protected async Task UpdatePersonalInfoAsync() + protected virtual async Task UpdatePersonalInfoAsync() { await ProfileAppService.UpdateAsync( ObjectMapper.Map(PersonalInfoModel) @@ -86,7 +87,7 @@ public class ChangePasswordModel } } -public class PersonalInfoModel +public class PersonalInfoModel : ExtensibleObject { public string UserName { get; set; } diff --git a/modules/account/src/Volo.Abp.Account.HttpApi.Client/Volo.Abp.Account.HttpApi.Client.abppkg.analyze.json b/modules/account/src/Volo.Abp.Account.HttpApi.Client/Volo.Abp.Account.HttpApi.Client.abppkg.analyze.json index 5fec7571fa..57bf3ed42d 100644 --- a/modules/account/src/Volo.Abp.Account.HttpApi.Client/Volo.Abp.Account.HttpApi.Client.abppkg.analyze.json +++ b/modules/account/src/Volo.Abp.Account.HttpApi.Client/Volo.Abp.Account.HttpApi.Client.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.Abp.Account.HttpApi.Client", - "hash": "ca67872e6cd8c25508461f7d171a8f04", + "hash": "62165afd5965b8041a9ac1f1356ad2e8", "contents": [ { "namespace": "Volo.Abp.Account", diff --git a/modules/account/src/Volo.Abp.Account.HttpApi/Volo.Abp.Account.HttpApi.abppkg.analyze.json b/modules/account/src/Volo.Abp.Account.HttpApi/Volo.Abp.Account.HttpApi.abppkg.analyze.json index 04d48dcab0..597cca045f 100644 --- a/modules/account/src/Volo.Abp.Account.HttpApi/Volo.Abp.Account.HttpApi.abppkg.analyze.json +++ b/modules/account/src/Volo.Abp.Account.HttpApi/Volo.Abp.Account.HttpApi.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.Abp.Account.HttpApi", - "hash": "b178895fe2a7f470f36c4fd121b7c07a", + "hash": "c789b459a83b26349ca6f0fcab82a244", "contents": [ { "namespace": "Volo.Abp.Account", diff --git a/modules/account/src/Volo.Abp.Account.Installer/Volo.Abp.Account.Installer.csproj b/modules/account/src/Volo.Abp.Account.Installer/Volo.Abp.Account.Installer.csproj index 73df3c03d9..7e53ddc078 100644 --- a/modules/account/src/Volo.Abp.Account.Installer/Volo.Abp.Account.Installer.csproj +++ b/modules/account/src/Volo.Abp.Account.Installer/Volo.Abp.Account.Installer.csproj @@ -4,19 +4,21 @@ - net5.0 + net6.0 true - + + + diff --git a/modules/account/src/Volo.Abp.Account.Installer/Volo.Abp.Account.Installer.abppkg.json b/modules/account/src/Volo.Abp.Account.Web.OpenIddict/Volo.Abp.Account.Web.OpenIddict.abppkg.json similarity index 100% rename from modules/account/src/Volo.Abp.Account.Installer/Volo.Abp.Account.Installer.abppkg.json rename to modules/account/src/Volo.Abp.Account.Web.OpenIddict/Volo.Abp.Account.Web.OpenIddict.abppkg.json diff --git a/modules/account/src/Volo.Abp.Account.Web/AbpAccountWebAutomapperProfile.cs b/modules/account/src/Volo.Abp.Account.Web/AbpAccountWebAutomapperProfile.cs index 329f8f7ac1..cdc92e8b19 100644 --- a/modules/account/src/Volo.Abp.Account.Web/AbpAccountWebAutomapperProfile.cs +++ b/modules/account/src/Volo.Abp.Account.Web/AbpAccountWebAutomapperProfile.cs @@ -9,6 +9,7 @@ public class AbpAccountWebAutoMapperProfile : Profile { public AbpAccountWebAutoMapperProfile() { - CreateMap(); + CreateMap() + .MapExtraProperties(); } } diff --git a/modules/account/src/Volo.Abp.Account.Web/AbpAccountWebModule.cs b/modules/account/src/Volo.Abp.Account.Web/AbpAccountWebModule.cs index 0dc4f2fc48..9f670ffc82 100644 --- a/modules/account/src/Volo.Abp.Account.Web/AbpAccountWebModule.cs +++ b/modules/account/src/Volo.Abp.Account.Web/AbpAccountWebModule.cs @@ -2,6 +2,7 @@ using Microsoft.Extensions.DependencyInjection; using Volo.Abp.Account.Localization; using Volo.Abp.Account.Web.Pages.Account; +using Volo.Abp.Account.Web.Pages.Account.Components.ProfileManagementGroup.PersonalInfo; using Volo.Abp.Account.Web.ProfileManagement; using Volo.Abp.AspNetCore.Mvc.Localization; using Volo.Abp.AspNetCore.Mvc.UI.Bundling; @@ -12,6 +13,9 @@ using Volo.Abp.ExceptionHandling; using Volo.Abp.Http.ProxyScripting.Generators.JQuery; using Volo.Abp.Identity.AspNetCore; using Volo.Abp.Modularity; +using Volo.Abp.ObjectExtending; +using Volo.Abp.ObjectExtending.Modularity; +using Volo.Abp.Threading; using Volo.Abp.UI.Navigation; using Volo.Abp.VirtualFileSystem; @@ -26,6 +30,8 @@ namespace Volo.Abp.Account.Web; )] public class AbpAccountWebModule : AbpModule { + private readonly static OneTimeRunner OneTimeRunner = new OneTimeRunner(); + public override void PreConfigureServices(ServiceConfigurationContext context) { context.Services.PreConfigure(options => @@ -95,4 +101,17 @@ public class AbpAccountWebModule : AbpModule }); } + + public override void PostConfigureServices(ServiceConfigurationContext context) + { + OneTimeRunner.Run(() => + { + ModuleExtensionConfigurationHelper + .ApplyEntityConfigurationToUi( + IdentityModuleExtensionConsts.ModuleName, + IdentityModuleExtensionConsts.EntityNames.User, + editFormTypes: new[] { typeof(AccountProfilePersonalInfoManagementGroupViewComponent.PersonalInfoModel) } + ); + }); + } } diff --git a/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Components/ProfileManagementGroup/PersonalInfo/AccountProfilePersonalInfoManagementGroupViewComponent.cs b/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Components/ProfileManagementGroup/PersonalInfo/AccountProfilePersonalInfoManagementGroupViewComponent.cs index 45705eb7f5..0dea3bc6eb 100644 --- a/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Components/ProfileManagementGroup/PersonalInfo/AccountProfilePersonalInfoManagementGroupViewComponent.cs +++ b/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Components/ProfileManagementGroup/PersonalInfo/AccountProfilePersonalInfoManagementGroupViewComponent.cs @@ -5,6 +5,7 @@ using Volo.Abp.AspNetCore.Mvc; using Volo.Abp.AspNetCore.Mvc.UI.Widgets; using Volo.Abp.Domain.Entities; using Volo.Abp.Identity; +using Volo.Abp.ObjectExtending; using Volo.Abp.Validation; namespace Volo.Abp.Account.Web.Pages.Account.Components.ProfileManagementGroup.PersonalInfo; @@ -30,7 +31,7 @@ public class AccountProfilePersonalInfoManagementGroupViewComponent : AbpViewCom return View("~/Pages/Account/Components/ProfileManagementGroup/PersonalInfo/Default.cshtml", model); } - public class PersonalInfoModel : IHasConcurrencyStamp + public class PersonalInfoModel : ExtensibleObject, IHasConcurrencyStamp { [Required] [DynamicStringLength(typeof(IdentityUserConsts), nameof(IdentityUserConsts.MaxUserNameLength))] @@ -54,7 +55,6 @@ public class AccountProfilePersonalInfoManagementGroupViewComponent : AbpViewCom [Display(Name = "DisplayName:PhoneNumber")] public string PhoneNumber { get; set; } - [HiddenInput] - public string ConcurrencyStamp { get; set; } + [HiddenInput] public string ConcurrencyStamp { get; set; } } -} +} \ No newline at end of file diff --git a/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Components/ProfileManagementGroup/PersonalInfo/Default.cshtml b/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Components/ProfileManagementGroup/PersonalInfo/Default.cshtml index ba695a8557..b9b0783ab9 100644 --- a/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Components/ProfileManagementGroup/PersonalInfo/Default.cshtml +++ b/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Components/ProfileManagementGroup/PersonalInfo/Default.cshtml @@ -1,13 +1,24 @@ @using Volo.Abp.Account.Localization @using Volo.Abp.Users @using Microsoft.AspNetCore.Mvc.Localization +@using Microsoft.AspNetCore.Mvc.TagHelpers +@using Microsoft.Extensions.Localization +@using Volo.Abp.Account.Web.Pages.Account.Components.ProfileManagementGroup.PersonalInfo +@using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Alert +@using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Button +@using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form +@using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Grid @using Volo.Abp.AspNetCore.Mvc.UI.Theming +@using Volo.Abp.Data @using Volo.Abp.Identity.Settings +@using Volo.Abp.Localization +@using Volo.Abp.ObjectExtending @using Volo.Abp.Settings @inject IHtmlLocalizer L @inject ICurrentUser CurrentUser @inject ISettingProvider SettingManager @inject IThemeManager ThemeManager +@inject IStringLocalizerFactory StringLocalizerFactory @model Volo.Abp.Account.Web.Pages.Account.Components.ProfileManagementGroup.PersonalInfo.AccountProfilePersonalInfoManagementGroupViewComponent.PersonalInfoModel @{ var isUserNameUpdateEnabled = string.Equals(await SettingManager.GetOrNullAsync(IdentitySettingNames.User.IsUserNameUpdateEnabled), "true", @@ -19,8 +30,8 @@

@L["PersonalSettings"]


- - + + @@ -37,5 +48,39 @@ + @foreach (var propertyInfo in ObjectExtensionManager.Instance.GetProperties()) + { + if (!propertyInfo.Name.EndsWith("_Text")) + { + if (propertyInfo.Type.IsEnum || !propertyInfo.Lookup.Url.IsNullOrEmpty()) + { + if (propertyInfo.Type.IsEnum) + { + Model.ExtraProperties.ToEnum(propertyInfo.Name, propertyInfo.Type); + } + + + } + else + { + + } + } + } + - + \ No newline at end of file diff --git a/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Components/ProfileManagementGroup/PersonalInfo/Default.js b/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Components/ProfileManagementGroup/PersonalInfo/Default.js index 55a88e52e3..c8ff17ec67 100644 --- a/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Components/ProfileManagementGroup/PersonalInfo/Default.js +++ b/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Components/ProfileManagementGroup/PersonalInfo/Default.js @@ -9,7 +9,7 @@ return false; } - var input = $('#PersonalSettingsForm').serializeFormToObject(); + var input = $('#PersonalSettingsForm').serializeFormToObject(false); volo.abp.account.profile.update(input).then(function (result) { abp.notify.success(l('PersonalSettingsSaved')); diff --git a/modules/account/src/Volo.Abp.Account.Web/Volo.Abp.Account.Web.abppkg.analyze.json b/modules/account/src/Volo.Abp.Account.Web/Volo.Abp.Account.Web.abppkg.analyze.json index a5848927a4..02531fd742 100644 --- a/modules/account/src/Volo.Abp.Account.Web/Volo.Abp.Account.Web.abppkg.analyze.json +++ b/modules/account/src/Volo.Abp.Account.Web/Volo.Abp.Account.Web.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.Abp.Account.Web", - "hash": "5fb2aa05261d4febe7ea7083d80fea74", + "hash": "56ee8c43448399a621216b5e54008a54", "contents": [ { "namespace": "Volo.Abp.Account.Web", diff --git a/modules/audit-logging/Volo.Abp.AuditLogging.abpmdl.json b/modules/audit-logging/Volo.Abp.AuditLogging.abpmdl.json index 9f425bc44e..5b2cc3f54b 100644 --- a/modules/audit-logging/Volo.Abp.AuditLogging.abpmdl.json +++ b/modules/audit-logging/Volo.Abp.AuditLogging.abpmdl.json @@ -37,10 +37,6 @@ "Volo.Abp.AuditLogging.MongoDB.Tests": { "path": "test/Volo.Abp.AuditLogging.MongoDB.Tests/Volo.Abp.AuditLogging.MongoDB.Tests.abppkg.json", "folder": "test" - }, - "Volo.Abp.AuditLogging.Installer": { - "path": "src/Volo.Abp.AuditLogging.Installer/Volo.Abp.AuditLogging.Installer.abppkg.json", - "folder": "src" } } } \ No newline at end of file diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Installer/Volo.Abp.AuditLogging.Installer.csproj b/modules/audit-logging/src/Volo.Abp.AuditLogging.Installer/Volo.Abp.AuditLogging.Installer.csproj index 27ab25e369..b76f01e430 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.Installer/Volo.Abp.AuditLogging.Installer.csproj +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Installer/Volo.Abp.AuditLogging.Installer.csproj @@ -4,13 +4,13 @@ - net5.0 + net6.0 true - + diff --git a/modules/background-jobs/Volo.Abp.BackgroundJobs.abpmdl.json b/modules/background-jobs/Volo.Abp.BackgroundJobs.abpmdl.json index 92042d254e..e3bea65da3 100644 --- a/modules/background-jobs/Volo.Abp.BackgroundJobs.abpmdl.json +++ b/modules/background-jobs/Volo.Abp.BackgroundJobs.abpmdl.json @@ -58,10 +58,6 @@ "Volo.Abp.BackgroundJobs.DemoApp.Quartz": { "path": "app/Volo.Abp.BackgroundJobs.DemoApp.Quartz/Volo.Abp.BackgroundJobs.DemoApp.Quartz.abppkg.json", "folder": "app" - }, - "Volo.Abp.BackgroundJobs.Installer": { - "path": "src/Volo.Abp.BackgroundJobs.Installer/Volo.Abp.BackgroundJobs.Installer.abppkg.json", - "folder": "src" } } } \ No newline at end of file diff --git a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.Domain.Shared/Volo.Abp.BackgroundJobs.Domain.Shared.abppkg.analyze.json b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.Domain.Shared/Volo.Abp.BackgroundJobs.Domain.Shared.abppkg.analyze.json index 958aef6df3..e142ef6357 100644 --- a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.Domain.Shared/Volo.Abp.BackgroundJobs.Domain.Shared.abppkg.analyze.json +++ b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.Domain.Shared/Volo.Abp.BackgroundJobs.Domain.Shared.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.Abp.BackgroundJobs.Domain.Shared", - "hash": "d48277ec610b23392edcb12ae3e29175", + "hash": "7be6cb28ee9246d901e9801978a44149", "contents": [ { "namespace": "Volo.Abp.BackgroundJobs", diff --git a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.Domain/Volo.Abp.BackgroundJobs.Domain.abppkg.analyze.json b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.Domain/Volo.Abp.BackgroundJobs.Domain.abppkg.analyze.json index 954692eeec..d8943cf9a5 100644 --- a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.Domain/Volo.Abp.BackgroundJobs.Domain.abppkg.analyze.json +++ b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.Domain/Volo.Abp.BackgroundJobs.Domain.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.Abp.BackgroundJobs.Domain", - "hash": "1398bbe3f228b2bfd0baec6a64c03b43", + "hash": "edcb98cb920b6d3805b6ff82d280b1bd", "contents": [ { "namespace": "Volo.Abp.BackgroundJobs", @@ -19,7 +19,7 @@ { "namespace": "Volo.Abp.BackgroundJobs", "summary": null, - "entityModel": { + "entityAnalyzeModel": { "namespace": "Volo.Abp.BackgroundJobs", "primaryKeyType": "Guid", "summary": null, diff --git a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.Domain/Volo/Abp/BackgroundJobs/BackgroundJobsDbProperties.cs b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.Domain/Volo/Abp/BackgroundJobs/AbpBackgroundJobsDbProperties.cs similarity index 86% rename from modules/background-jobs/src/Volo.Abp.BackgroundJobs.Domain/Volo/Abp/BackgroundJobs/BackgroundJobsDbProperties.cs rename to modules/background-jobs/src/Volo.Abp.BackgroundJobs.Domain/Volo/Abp/BackgroundJobs/AbpBackgroundJobsDbProperties.cs index 401aa379a7..85e44815a2 100644 --- a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.Domain/Volo/Abp/BackgroundJobs/BackgroundJobsDbProperties.cs +++ b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.Domain/Volo/Abp/BackgroundJobs/AbpBackgroundJobsDbProperties.cs @@ -2,7 +2,7 @@ namespace Volo.Abp.BackgroundJobs; -public static class BackgroundJobsDbProperties +public static class AbpBackgroundJobsDbProperties { public static string DbTablePrefix { get; set; } = AbpCommonDbProperties.DbTablePrefix; diff --git a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.EntityFrameworkCore/Volo.Abp.BackgroundJobs.EntityFrameworkCore.abppkg.analyze.json b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.EntityFrameworkCore/Volo.Abp.BackgroundJobs.EntityFrameworkCore.abppkg.analyze.json index 66951427ff..48b0997dc9 100644 --- a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.EntityFrameworkCore/Volo.Abp.BackgroundJobs.EntityFrameworkCore.abppkg.analyze.json +++ b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.EntityFrameworkCore/Volo.Abp.BackgroundJobs.EntityFrameworkCore.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.Abp.BackgroundJobs.EntityFrameworkCore", - "hash": "f3bf7c7db2ab764d6421df0b88ea535b", + "hash": "47c087243281aea34d16f03acf5254cd", "contents": [ { "namespace": "Volo.Abp.BackgroundJobs.EntityFrameworkCore", diff --git a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.EntityFrameworkCore/Volo/Abp/BackgroundJobs/EntityFrameworkCore/BackgroundJobsDbContext.cs b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.EntityFrameworkCore/Volo/Abp/BackgroundJobs/EntityFrameworkCore/BackgroundJobsDbContext.cs index fb01736cfa..0beef8d3ea 100644 --- a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.EntityFrameworkCore/Volo/Abp/BackgroundJobs/EntityFrameworkCore/BackgroundJobsDbContext.cs +++ b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.EntityFrameworkCore/Volo/Abp/BackgroundJobs/EntityFrameworkCore/BackgroundJobsDbContext.cs @@ -6,7 +6,7 @@ using Volo.Abp.MultiTenancy; namespace Volo.Abp.BackgroundJobs.EntityFrameworkCore; [IgnoreMultiTenancy] -[ConnectionStringName(BackgroundJobsDbProperties.ConnectionStringName)] +[ConnectionStringName(AbpBackgroundJobsDbProperties.ConnectionStringName)] public class BackgroundJobsDbContext : AbpDbContext, IBackgroundJobsDbContext { public DbSet BackgroundJobs { get; set; } diff --git a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.EntityFrameworkCore/Volo/Abp/BackgroundJobs/EntityFrameworkCore/BackgroundJobsDbContextModelCreatingExtensions.cs b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.EntityFrameworkCore/Volo/Abp/BackgroundJobs/EntityFrameworkCore/BackgroundJobsDbContextModelCreatingExtensions.cs index bf9f8d5ea3..849ac3c5d5 100644 --- a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.EntityFrameworkCore/Volo/Abp/BackgroundJobs/EntityFrameworkCore/BackgroundJobsDbContextModelCreatingExtensions.cs +++ b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.EntityFrameworkCore/Volo/Abp/BackgroundJobs/EntityFrameworkCore/BackgroundJobsDbContextModelCreatingExtensions.cs @@ -18,7 +18,7 @@ public static class BackgroundJobsDbContextModelCreatingExtensions builder.Entity(b => { - b.ToTable(BackgroundJobsDbProperties.DbTablePrefix + "BackgroundJobs", BackgroundJobsDbProperties.DbSchema); + b.ToTable(AbpBackgroundJobsDbProperties.DbTablePrefix + "BackgroundJobs", AbpBackgroundJobsDbProperties.DbSchema); b.ConfigureByConvention(); diff --git a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.EntityFrameworkCore/Volo/Abp/BackgroundJobs/EntityFrameworkCore/IBackgroundJobsDbContext.cs b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.EntityFrameworkCore/Volo/Abp/BackgroundJobs/EntityFrameworkCore/IBackgroundJobsDbContext.cs index b091ac126a..a6276e37f8 100644 --- a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.EntityFrameworkCore/Volo/Abp/BackgroundJobs/EntityFrameworkCore/IBackgroundJobsDbContext.cs +++ b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.EntityFrameworkCore/Volo/Abp/BackgroundJobs/EntityFrameworkCore/IBackgroundJobsDbContext.cs @@ -6,7 +6,7 @@ using Volo.Abp.MultiTenancy; namespace Volo.Abp.BackgroundJobs.EntityFrameworkCore; [IgnoreMultiTenancy] -[ConnectionStringName(BackgroundJobsDbProperties.ConnectionStringName)] +[ConnectionStringName(AbpBackgroundJobsDbProperties.ConnectionStringName)] public interface IBackgroundJobsDbContext : IEfCoreDbContext { DbSet BackgroundJobs { get; } diff --git a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.Installer/Volo.Abp.BackgroundJobs.Installer.csproj b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.Installer/Volo.Abp.BackgroundJobs.Installer.csproj index 59bd54205d..0aba8c2405 100644 --- a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.Installer/Volo.Abp.BackgroundJobs.Installer.csproj +++ b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.Installer/Volo.Abp.BackgroundJobs.Installer.csproj @@ -4,19 +4,21 @@ - net5.0 + net6.0 true - + + + diff --git a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.MongoDB/Volo.Abp.BackgroundJobs.MongoDB.abppkg.analyze.json b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.MongoDB/Volo.Abp.BackgroundJobs.MongoDB.abppkg.analyze.json index c1b355eb9a..708e849ca4 100644 --- a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.MongoDB/Volo.Abp.BackgroundJobs.MongoDB.abppkg.analyze.json +++ b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.MongoDB/Volo.Abp.BackgroundJobs.MongoDB.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.Abp.BackgroundJobs.MongoDB", - "hash": "def047f007cc2f8c9a74459f1df01330", + "hash": "0a592222ebb3efef215734b1617f8548", "contents": [ { "namespace": "Volo.Abp.BackgroundJobs.MongoDB", diff --git a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.MongoDB/Volo/Abp/BackgroundJobs/MongoDB/BackgroundJobsMongoDbContext.cs b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.MongoDB/Volo/Abp/BackgroundJobs/MongoDB/BackgroundJobsMongoDbContext.cs index 42b8a44f0d..8a94e26650 100644 --- a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.MongoDB/Volo/Abp/BackgroundJobs/MongoDB/BackgroundJobsMongoDbContext.cs +++ b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.MongoDB/Volo/Abp/BackgroundJobs/MongoDB/BackgroundJobsMongoDbContext.cs @@ -6,7 +6,7 @@ using Volo.Abp.MultiTenancy; namespace Volo.Abp.BackgroundJobs.MongoDB; [IgnoreMultiTenancy] -[ConnectionStringName(BackgroundJobsDbProperties.ConnectionStringName)] +[ConnectionStringName(AbpBackgroundJobsDbProperties.ConnectionStringName)] public class BackgroundJobsMongoDbContext : AbpMongoDbContext, IBackgroundJobsMongoDbContext { public IMongoCollection BackgroundJobs { get; set; } diff --git a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.MongoDB/Volo/Abp/BackgroundJobs/MongoDB/BackgroundJobsMongoDbContextExtensions.cs b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.MongoDB/Volo/Abp/BackgroundJobs/MongoDB/BackgroundJobsMongoDbContextExtensions.cs index b687bf8f90..a4f255c724 100644 --- a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.MongoDB/Volo/Abp/BackgroundJobs/MongoDB/BackgroundJobsMongoDbContextExtensions.cs +++ b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.MongoDB/Volo/Abp/BackgroundJobs/MongoDB/BackgroundJobsMongoDbContextExtensions.cs @@ -11,7 +11,7 @@ public static class BackgroundJobsMongoDbContextExtensions builder.Entity(b => { - b.CollectionName = BackgroundJobsDbProperties.DbTablePrefix + "BackgroundJobs"; + b.CollectionName = AbpBackgroundJobsDbProperties.DbTablePrefix + "BackgroundJobs"; }); } } diff --git a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.MongoDB/Volo/Abp/BackgroundJobs/MongoDB/IBackgroundJobsMongoDbContext.cs b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.MongoDB/Volo/Abp/BackgroundJobs/MongoDB/IBackgroundJobsMongoDbContext.cs index 4f93e1cbe5..d8a94b740d 100644 --- a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.MongoDB/Volo/Abp/BackgroundJobs/MongoDB/IBackgroundJobsMongoDbContext.cs +++ b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.MongoDB/Volo/Abp/BackgroundJobs/MongoDB/IBackgroundJobsMongoDbContext.cs @@ -6,7 +6,7 @@ using Volo.Abp.MultiTenancy; namespace Volo.Abp.BackgroundJobs.MongoDB; [IgnoreMultiTenancy] -[ConnectionStringName(BackgroundJobsDbProperties.ConnectionStringName)] +[ConnectionStringName(AbpBackgroundJobsDbProperties.ConnectionStringName)] public interface IBackgroundJobsMongoDbContext : IAbpMongoDbContext { IMongoCollection BackgroundJobs { get; } diff --git a/modules/basic-theme/Volo.Abp.BasicTheme.abpmdl.json b/modules/basic-theme/Volo.Abp.BasicTheme.abpmdl.json index 4dc0a1ec83..23dcc2e243 100644 --- a/modules/basic-theme/Volo.Abp.BasicTheme.abpmdl.json +++ b/modules/basic-theme/Volo.Abp.BasicTheme.abpmdl.json @@ -33,10 +33,6 @@ "Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.Tests": { "path": "test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.Tests/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.Tests.abppkg.json", "folder": "test" - }, - "Volo.Abp.BasicTheme.Installer": { - "path": "src/Volo.Abp.BasicTheme.Installer/Volo.Abp.BasicTheme.Installer.abppkg.json", - "folder": "src" } } } \ No newline at end of file diff --git a/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/MainLayout.razor b/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/MainLayout.razor index 82c7cc0fc7..3565d6add5 100644 --- a/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/MainLayout.razor +++ b/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/MainLayout.razor @@ -1,4 +1,6 @@ -@inherits LayoutComponentBase +@using Volo.Abp.Ui.LayoutHooks +@using Volo.Abp.AspNetCore.Components.Web.Theming.Layout +@inherits LayoutComponentBase
+ @Body - + + diff --git a/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/wwwroot/libs/abp/css/theme.css b/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/wwwroot/libs/abp/css/theme.css index 6aee7a5ba7..c10092d28f 100644 --- a/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/wwwroot/libs/abp/css/theme.css +++ b/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/wwwroot/libs/abp/css/theme.css @@ -169,4 +169,10 @@ div.dataTables_wrapper div.dataTables_length label { } } +h1.content-header-title{ + font-size: 1.5em; +} +.b-table h4.h4 { + text-align: center; +} diff --git a/modules/basic-theme/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Themes/Basic/Layouts/Account.cshtml b/modules/basic-theme/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Themes/Basic/Layouts/Account.cshtml index f71171912c..5e2ca98ba7 100644 --- a/modules/basic-theme/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Themes/Basic/Layouts/Account.cshtml +++ b/modules/basic-theme/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Themes/Basic/Layouts/Account.cshtml @@ -12,6 +12,7 @@ @using Volo.Abp.MultiTenancy @using Volo.Abp.Localization @using Volo.Abp.Ui.Branding +@using Volo.Abp.Ui.LayoutHooks @inject IBrandingProvider BrandingProvider @inject IOptions MultiTenancyOptions @inject ICurrentTenant CurrentTenant diff --git a/modules/basic-theme/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Themes/Basic/Layouts/Application.cshtml b/modules/basic-theme/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Themes/Basic/Layouts/Application.cshtml index 23c19c077d..42f2b2ead2 100644 --- a/modules/basic-theme/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Themes/Basic/Layouts/Application.cshtml +++ b/modules/basic-theme/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Themes/Basic/Layouts/Application.cshtml @@ -8,6 +8,7 @@ @using Volo.Abp.AspNetCore.Mvc.UI.Widgets.Components.WidgetStyles @using Volo.Abp.Localization @using Volo.Abp.Ui.Branding +@using Volo.Abp.Ui.LayoutHooks @inject IBrandingProvider BrandingProvider @inject IPageLayout PageLayout @{ diff --git a/modules/basic-theme/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Themes/Basic/Layouts/Empty.cshtml b/modules/basic-theme/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Themes/Basic/Layouts/Empty.cshtml index 70c7d5e1e8..6d3461be43 100644 --- a/modules/basic-theme/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Themes/Basic/Layouts/Empty.cshtml +++ b/modules/basic-theme/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Themes/Basic/Layouts/Empty.cshtml @@ -7,6 +7,7 @@ @using Volo.Abp.AspNetCore.Mvc.UI.Widgets.Components.WidgetStyles @using Volo.Abp.Localization @using Volo.Abp.Ui.Branding +@using Volo.Abp.Ui.LayoutHooks @inject IBrandingProvider BrandingProvider @inject IPageLayout PageLayout @{ diff --git a/modules/basic-theme/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.abppkg.analyze.json b/modules/basic-theme/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.abppkg.analyze.json new file mode 100644 index 0000000000..8bec0bacf0 --- /dev/null +++ b/modules/basic-theme/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.abppkg.analyze.json @@ -0,0 +1,11 @@ +{ + "name": "Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic", + "hash": "ce73ef1b1d433a5bd99fce51d9c76697", + "contents": [ + { + "namespace": "Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic", + "contentType": "abpModule", + "name": "AbpAspNetCoreMvcUiBasicThemeModule" + } + ] +} \ No newline at end of file diff --git a/modules/basic-theme/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.abppkg.json b/modules/basic-theme/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.abppkg.json index 9e26dfeeb6..930c4018b3 100644 --- a/modules/basic-theme/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.abppkg.json +++ b/modules/basic-theme/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.abppkg.json @@ -1 +1,3 @@ -{} \ No newline at end of file +{ + "role": "lib.mvc" +} \ No newline at end of file diff --git a/modules/basic-theme/src/Volo.Abp.BasicTheme.Installer/Volo.Abp.BasicTheme.Installer.csproj b/modules/basic-theme/src/Volo.Abp.BasicTheme.Installer/Volo.Abp.BasicTheme.Installer.csproj index 8a4b219092..342b9f7c64 100644 --- a/modules/basic-theme/src/Volo.Abp.BasicTheme.Installer/Volo.Abp.BasicTheme.Installer.csproj +++ b/modules/basic-theme/src/Volo.Abp.BasicTheme.Installer/Volo.Abp.BasicTheme.Installer.csproj @@ -4,19 +4,21 @@ - net5.0 + net6.0 true - + + + 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 76201505bd..33071a7428 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,7 +3,7 @@ "name": "asp.net", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.shared": "^5.3.0", + "@abp/aspnetcore.mvc.ui.theme.shared": "^6.0.0-rc.3", "highlight.js": "^9.13.1" }, "devDependencies": {} diff --git a/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/wwwroot/libs/abp/core/abp.js b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/wwwroot/libs/abp/core/abp.js index 9445e4e7f4..d8b7531660 100644 --- a/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/wwwroot/libs/abp/core/abp.js +++ b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/wwwroot/libs/abp/core/abp.js @@ -372,7 +372,9 @@ var abp = abp || {}; setTimeout(function () { if (element) { element.classList.remove('abp-block-area-disappearing'); - element.parentElement.removeChild(element); + if (element.parentElement) { + element.parentElement.removeChild(element); + } } }, 250); } 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 47b4380f81..cc8d424ae2 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,30 +2,30 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.shared@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-5.3.0.tgz#84e94845a247815ce981cda2d195944a350530b9" - integrity sha512-RwXxlncjidvh8Hgw91Hz1f5rnfG9hlNROr5bD/kxTUB47vIh/TIBd06UYrYw2/lqFLw5d6wd8q7VLuDjGUQbpg== - dependencies: - "@abp/aspnetcore.mvc.ui" "~5.3.0" - "@abp/bootstrap" "~5.3.0" - "@abp/bootstrap-datepicker" "~5.3.0" - "@abp/datatables.net-bs5" "~5.3.0" - "@abp/font-awesome" "~5.3.0" - "@abp/jquery-form" "~5.3.0" - "@abp/jquery-validation-unobtrusive" "~5.3.0" - "@abp/lodash" "~5.3.0" - "@abp/luxon" "~5.3.0" - "@abp/malihu-custom-scrollbar-plugin" "~5.3.0" - "@abp/select2" "~5.3.0" - "@abp/sweetalert2" "~5.3.0" - "@abp/timeago" "~5.3.0" - "@abp/toastr" "~5.3.0" - -"@abp/aspnetcore.mvc.ui@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-5.3.0.tgz#e947fd1aecbd2aabc5db4c6a64b78f2690fcf0d4" - integrity sha512-en2YDb/hRG1MKkbli1PYcoeU9OLU0YPSahkIBSfOmMLntAe8y0c2+Xe09chXP4r+GoZu0zd9FM3qqCRZojrlug== +"@abp/aspnetcore.mvc.ui.theme.shared@^6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-6.0.0-rc.3.tgz#664ca2ee712b7d9e66103c00beb41eb9648a6075" + integrity sha512-KxCsGuoUWKaDo7Oo9aKp51pli2m0DZ2tG8m+zK+m4M9U7g96uC+DOFy3gc7MdPlszvrw32Wwm7I0AughstByNA== + dependencies: + "@abp/aspnetcore.mvc.ui" "~6.0.0-rc.3" + "@abp/bootstrap" "~6.0.0-rc.3" + "@abp/bootstrap-datepicker" "~6.0.0-rc.3" + "@abp/datatables.net-bs5" "~6.0.0-rc.3" + "@abp/font-awesome" "~6.0.0-rc.3" + "@abp/jquery-form" "~6.0.0-rc.3" + "@abp/jquery-validation-unobtrusive" "~6.0.0-rc.3" + "@abp/lodash" "~6.0.0-rc.3" + "@abp/luxon" "~6.0.0-rc.3" + "@abp/malihu-custom-scrollbar-plugin" "~6.0.0-rc.3" + "@abp/select2" "~6.0.0-rc.3" + "@abp/sweetalert2" "~6.0.0-rc.3" + "@abp/timeago" "~6.0.0-rc.3" + "@abp/toastr" "~6.0.0-rc.3" + +"@abp/aspnetcore.mvc.ui@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-6.0.0-rc.3.tgz#47c23b57ed3908bd78a232230e53d1f3cba2de41" + integrity sha512-7eJZy2JUGQP94Tz3JJWXRHRmDfTcPZ/lS1/VNbU8B4qvgl5ChIXklVEJLR1fwrBhKXZV8fGVmqT1XlGTGFvFJA== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -34,144 +34,144 @@ merge-stream "^2.0.0" micromatch "^4.0.2" -"@abp/bootstrap-datepicker@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-5.3.0.tgz#09c44954774d8f52ca8ff6699ad4dbb7cc0308c2" - integrity sha512-AQ26I0jgoCioW1/4XmQIyn1c1+CLv8KTb4Vd4ZbtdYGBkkkUe+JEAWpJSeXlJRr/XrOs0BKWp/fa7Nnwx8srLg== +"@abp/bootstrap-datepicker@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-6.0.0-rc.3.tgz#89198b863dbfccf5f07ac3c4b20ce6199adcb17a" + integrity sha512-NLoUjcR66mqwSWuVftu2yFH4/j6QP+FiElRfZQ9OYmO8DQx2Ue5UZzjrFTrZ1DBBCfzhr2Bffj80dirGvGDyvg== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-5.3.0.tgz#42dac2d2d6374f39d068a638687039c5c74df123" - integrity sha512-rg9mLcvT4JQRc1rIAhGYK1P2eMRJ1+GArQXV5l7k3FrVU+bRLKdoE6PNpuwXHpdlom4/dOgekfuWH/SAuY5kyw== +"@abp/bootstrap@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-6.0.0-rc.3.tgz#4574bf574cc3484869e8ff8bc592f6212d20a969" + integrity sha512-Q5v7WRkGhGcjRg267HXtqs1oU7ts9UXPyCXmg5y2y5qMOyioD+m4MKV4iv67DgoQjabudp8X2egTKxkej6Lzkw== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" bootstrap "^5.1.3" -"@abp/core@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-5.3.0.tgz#032724dd0c0b850204896ce0275c7f9c8f516740" - integrity sha512-Uk9h98jiEF1dItWrvWnYB6s/UNZZapvFSyJ4+piAsZmXOSAbrObV+s19n5xfUagQQTWn4+aU5+aChEcfWpYv9A== +"@abp/core@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-6.0.0-rc.3.tgz#5662ce813d449d97d9fb7ea2552b2774c8df7825" + integrity sha512-X/VRdk5SGNYc5gQzPcBEPAvwcuD9WXsI4YIdrqjnes0s8u2/XmfrTixojh8Y5EYUoOblEE3Soj5hBhY1cVwcbQ== dependencies: - "@abp/utils" "~5.3.0" + "@abp/utils" "~6.0.0-rc.3" -"@abp/datatables.net-bs5@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-5.3.0.tgz#84771ce4eb7229bed347a5904c891b08e3230422" - integrity sha512-FpKrgrjaBKVgFAnbBsrvDIJJOy8gbWCEHm5Jy2vFWXmx25fITMw/2ckBDH87yrZtCNVTSUbMIdHYOIHMPfSavQ== +"@abp/datatables.net-bs5@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-6.0.0-rc.3.tgz#22865c7e621de720b71af6265b3193f6c78695bd" + integrity sha512-T+mhLc6uSzWmxDQogVwnJ6VxI4845gmF68/i9TmVKNlCtpa3EEfyuF/hgWT1hYfCb4XOsvd/CWrunbkC3fsmtg== dependencies: - "@abp/datatables.net" "~5.3.0" + "@abp/datatables.net" "~6.0.0-rc.3" datatables.net-bs5 "^1.11.4" -"@abp/datatables.net@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-5.3.0.tgz#dd27ae451df9551f5b815e10c87a8a89c6a38293" - integrity sha512-d4lQ09G7HY2gEN1lRAteCZzY0Fv3gPuUM+icgWm+UkmDZV9lhvovTQ58Xkwayw8vf+NPlit1eGMMQedn6MbeAQ== +"@abp/datatables.net@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-6.0.0-rc.3.tgz#d036defe6ad7fc989dffa020ae579362ee3150d1" + integrity sha512-4cUU8/Tn0Vz9bx7jjMOD/0Viyr29fcwoQAAkxaaYZp6qiQbENgz46/xpQf2oBCoudk8CLdzpmNa7jWte7PcJJw== dependencies: - "@abp/jquery" "~5.3.0" + "@abp/jquery" "~6.0.0-rc.3" datatables.net "^1.11.4" -"@abp/font-awesome@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-5.3.0.tgz#ce1d5bb59bd597cc9717885917d4dd2eae1f8b9c" - integrity sha512-JX62EVfZSJ7pv75Gd3ya/3c3He0hXF7KmpTizUNd/EbeHuNJoCND5wwq5OAFV9Ld3vdcGJChNTydNa5RsBzrpg== +"@abp/font-awesome@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-6.0.0-rc.3.tgz#803569d1a7e25f8a1c2be018312449c23fb78217" + integrity sha512-lYdh38UCTSkzzw0B/mpPEo7iFXzSKHCNbBOIHe6dd6O/Qli7wYukTtUOFn5Sh+yoydLY1as92HtiGL1ckSdu1g== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" "@fortawesome/fontawesome-free" "^5.15.4" -"@abp/jquery-form@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-5.3.0.tgz#5ae9906f0cffaf3e043681a5dd80a014b4860f6b" - integrity sha512-ZTpXCImHirJDZjfnJRtSEHLIbWMTYkqtTv7Z3GMRKnI4fllpmuco9EWLAKjAfYPyc/QpTx+MYnUg5SsXORhJyQ== +"@abp/jquery-form@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-6.0.0-rc.3.tgz#4ec503c07e2194148c3a7e7cf7ddef2871679e6a" + integrity sha512-Q3uEpflntqrSkYakcdsBnnYYfxJWXD/CDjMiwjbb6gIc8s4qkbIYxVxvYvlEezoIDYQkMSXOn7BS4clWsesiJg== dependencies: - "@abp/jquery" "~5.3.0" + "@abp/jquery" "~6.0.0-rc.3" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-5.3.0.tgz#ccf90a7840398e69e0a91ed6c32b80fa2eb82d14" - integrity sha512-6B3ywnpvPxpnxkrcXzjTjMWgKRImbzNPOZvv5ant/kQv3zXedV1GXSIILy+imX39FuDPslOmEfx8plwrNvIteA== +"@abp/jquery-validation-unobtrusive@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-6.0.0-rc.3.tgz#01da2a59663d373ff1c69022f4c9c66ad0b29403" + integrity sha512-ij1ML2D9rYF3pJthWO6mGQajsJhbDCtOoBvnh9yCZccuwOYkXP22PqfUxjjxtqL4HqFI31KRpFg0ANMGSzEEBg== dependencies: - "@abp/jquery-validation" "~5.3.0" + "@abp/jquery-validation" "~6.0.0-rc.3" jquery-validation-unobtrusive "^3.2.12" -"@abp/jquery-validation@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-5.3.0.tgz#a21696e7d5d54ef8bcdc0e8bd2debb1da1f7f5cc" - integrity sha512-4z2I9iORf+z5SlN9crC/Gx3X5GAOVePD+WN8SaHSYr4VWYNe8TV8LvCZPilN56sIPt3jYvy0N+bI1tAuZPu/NQ== +"@abp/jquery-validation@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-6.0.0-rc.3.tgz#724aea9572dcb2faccf8c6355332b0b2a4df9260" + integrity sha512-rTK5oHaMtycvWxunNwzbE/MbsXXIr6qDnOY3rVUmjTHjqUOHYz591t/XeQfjnSXPp4k/SZUjG6viTC3J2jzC1A== dependencies: - "@abp/jquery" "~5.3.0" + "@abp/jquery" "~6.0.0-rc.3" jquery-validation "^1.19.3" -"@abp/jquery@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-5.3.0.tgz#0279ee501ed774a788072c2ec8b003e348fec22c" - integrity sha512-rqYbU3LpsT7XT8ygn+TFVmjev5NlgEcDhGwQ8PraY1dEjlDbteeQ50N4adS8fdRfOM1UjGL19ueN3F8E5qNUSg== +"@abp/jquery@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-6.0.0-rc.3.tgz#ba19cc8b802c46490277939e6c674811127d8016" + integrity sha512-MbD38iInyag7/j5k42cvMT4jLZMtXH4lUK0rjvqUDVaxKEks46Ix/90uczQ9XajYONgx0CJKFj2urgM830+CCA== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" jquery "~3.6.0" -"@abp/lodash@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-5.3.0.tgz#45f1dba7bb65b6599b4973d7e0c617dfd2c46c49" - integrity sha512-vQVMv58QuYttWBfLjJzIsw92JunGbWYsqk6pp6/JuoBls5UJtdP1F7vM4JgQxsscGYHFRZB3F4a3h1cxZ+dblQ== +"@abp/lodash@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-6.0.0-rc.3.tgz#8a5bab02353e5cab4ca06ab82f6dbe6285faa95a" + integrity sha512-c8yhcapzPsXyeiFjeOC+2a4bn5wFjW5gUoN+p/p+tE+FIcH37yEgyw/tAr6aZPCmR770MqQXct4t7S4Czbbk+A== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" lodash "^4.17.21" -"@abp/luxon@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-5.3.0.tgz#8a6277046f6e38c3affbf79c06f8ac00d1ca8098" - integrity sha512-6tETR03i1NPJuDqSQWtpkOykdq/84awifQUqRyh+b8340wV7P54NqUMDXDit9sjITFDhq99V/R+Rj3PVjvJD3A== +"@abp/luxon@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-6.0.0-rc.3.tgz#ba515e122c61918d481467d5be39f08a363822f6" + integrity sha512-2lRSSC0DYShlnKdbJ/Pmha/azjt09ZRPx57NQ01dc7ungChPry5EJL6pC3kXWnJrCkrPCF0V5+A3+taut9+l3A== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" luxon "^2.3.0" -"@abp/malihu-custom-scrollbar-plugin@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-5.3.0.tgz#e6e12162aa50d3c3d98629378cec2f6fd5964338" - integrity sha512-GVwgAZQurH/tr4Hgmuby2dun//v1dT+wLGV4ZvjCJzBRs4FgrB+25pj4qKm20j6/NKRKc4V5re/b1y6njCubFQ== +"@abp/malihu-custom-scrollbar-plugin@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-6.0.0-rc.3.tgz#0798e37ec6a852748118692a5fbd30c99d9745db" + integrity sha512-FlyShmRxG3wGk1OJCjHIZAdi2/Y2FJPkVxaE72CVIceQSmg0nebGTv3a7bhd4QzKkDsSA3+t6gHjnuKlTlDFLA== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/select2@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-5.3.0.tgz#aae202b87dc23dfc7c8fd933413a8dbeb2f5b683" - integrity sha512-0aIxdtzgONkrYnUN5ACkIIIhsC9e61QLRq3K+/98fjf7NkHOjG3Sptr8EKu5U3IQ2hNHgqBjPGYjkztGuxZ9kw== +"@abp/select2@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-6.0.0-rc.3.tgz#deb8332bfce2102a562004893321a48d5194bf53" + integrity sha512-rb0qElmmhiP09xX8ZbjzNLF6ygFBwErysGWt6Bbgzz5waX2sGe575Cgoz53FaMQ4JaRBg1N0/nCejKyDtiINRA== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" select2 "^4.0.13" -"@abp/sweetalert2@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-5.3.0.tgz#67379cfa4cb8884cb66b58f4cafa79960cf8426a" - integrity sha512-EBr8J7MDsYmSvOYxTbqsSmw6c2yLokHZe8A+EW2vsY9VYFXkoOJLVpCkCK4fhvHUv8/+Y5QnHW7bs1I6SKYXOw== +"@abp/sweetalert2@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-6.0.0-rc.3.tgz#e61fc6c1bed1316c1d44ca5c92f590e422db24d4" + integrity sha512-+SNpBb4XrQlWzRQK9lfdJqA9IfJrlgoqmHwPDgf3Q+P922MzO33TgDlZWbeE7MzVj2y2WmNsPuCKwhjSjSL2rw== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" sweetalert2 "^11.3.6" -"@abp/timeago@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-5.3.0.tgz#3aaef3edca333224ba6b3e81c8ad1ebaae51a2f4" - integrity sha512-FxtoPYxyk2CHeoloC6kaeCj5YtXH0rebhOEaCjrfyg9/Ec6LEkvpfC7RWlcsHaEUAtFXZegJDfOk066EPH7RHQ== +"@abp/timeago@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-6.0.0-rc.3.tgz#0ef8c4801bfd4623e6895b1d047b1437063bda53" + integrity sha512-P3YRDVKjR5/Fz+cXiPg3IiUr7XGbNh7mgmJ1ywRXmKVmVMJmhQ2RsKmmtkGJn4TfVHu/l5iJXe4rqgL21/yX/g== dependencies: - "@abp/jquery" "~5.3.0" + "@abp/jquery" "~6.0.0-rc.3" timeago "^1.6.7" -"@abp/toastr@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-5.3.0.tgz#8a002c19ea25ac6b042a25c0f9d289d03c93c2fb" - integrity sha512-gjb2O/XrYkX8IeCERIqlOYPh15WlF9LxGR6t9jeVF/p6BTX/yaWabYCFfB9SkU2pQ6xrGl7WmSTAC06JOAtPTA== +"@abp/toastr@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-6.0.0-rc.3.tgz#6010d4247937531ebf7c8659d6254cd3db6c4855" + integrity sha512-sC9eCzYVgDrLSFIhJGe9hshzfwA1BkZNah4NQhyq+V6HQ8YF7goMS79N+/XmSoLQ9zzRhusqnPFnb+4FHjr7iA== dependencies: - "@abp/jquery" "~5.3.0" + "@abp/jquery" "~6.0.0-rc.3" toastr "^2.1.4" -"@abp/utils@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-5.3.0.tgz#e93739074a3cd445a5a221209506b7e663050ca0" - integrity sha512-Nm+h+3PL10+rBFSh8UUuenmGM+OBlEoNQeGzHRmhOc6hJ3oqCogPzY+zkq0e4pksrwhjxAu/cgCEGLAoEXXycw== +"@abp/utils@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-6.0.0-rc.3.tgz#6d3515694314175218606e9518618ce335b4b360" + integrity sha512-K2geJ9P1ztk4Ehzb9YG3CqqLOi+z8/4iBLUzooNZLQqS+KdlUhCmqfuCoI/A5Aq9DGbTYesalp+Fwoh3S2Dl8A== dependencies: just-compare "^1.3.0" diff --git a/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/Logs/logs.txt b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/Logs/logs.txt deleted file mode 100644 index 4a2b7f19c3..0000000000 --- a/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/Logs/logs.txt +++ /dev/null @@ -1,2242 +0,0 @@ -2021-06-01 16:47:06.126 +08:00 [INF] Starting web host. -2021-06-01 16:47:06.283 +08:00 [FTL] Host terminated unexpectedly! -System.IO.FileNotFoundException: Could not load file or assembly 'Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic, Version=4.4.0.0, Culture=neutral, PublicKeyToken=null'. The system cannot find the file specified. -File name: 'Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic, Version=4.4.0.0, Culture=neutral, PublicKeyToken=null' - at System.Reflection.CustomAttribute._CreateCaObject(RuntimeModule pModule, RuntimeType type, IRuntimeMethodInfo pCtor, Byte** ppBlob, Byte* pEndBlob, Int32* pcNamedArgs) - at System.Reflection.CustomAttribute.CreateCaObject(RuntimeModule module, RuntimeType type, IRuntimeMethodInfo ctor, IntPtr& blob, IntPtr blobEnd, Int32& namedArgs) - at System.Reflection.CustomAttribute.AddCustomAttributes(ListBuilder`1& attributes, RuntimeModule decoratedModule, Int32 decoratedMetadataToken, RuntimeType attributeFilterType, Boolean mustBeInheritable, ListBuilder`1 derivedAttributes) - at System.Reflection.CustomAttribute.GetCustomAttributes(RuntimeType type, RuntimeType caType, Boolean inherit) - at System.RuntimeType.GetCustomAttributes(Type attributeType, Boolean inherit) - at System.Attribute.GetCustomAttributes(MemberInfo element, Boolean inherit) - at System.Reflection.CustomAttributeExtensions.GetCustomAttributes(MemberInfo element) - at Volo.Abp.Modularity.AbpModuleHelper.FindDependedModuleTypes(Type moduleType) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.Core\Volo\Abp\Modularity\AbpModuleHelper.cs:line 25 - at Volo.Abp.Modularity.AbpModuleHelper.AddModuleAndDependenciesRecursively(List`1 moduleTypes, Type moduleType, ILogger logger, Int32 depth) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.Core\Volo\Abp\Modularity\AbpModuleHelper.cs:line 56 - at Volo.Abp.Modularity.AbpModuleHelper.FindAllModuleTypes(Type startupModuleType, ILogger logger) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.Core\Volo\Abp\Modularity\AbpModuleHelper.cs:line 15 - at Volo.Abp.Modularity.ModuleLoader.FillModules(List`1 modules, IServiceCollection services, Type startupModuleType, PlugInSourceList plugInSources) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.Core\Volo\Abp\Modularity\ModuleLoader.cs:line 49 - at Volo.Abp.Modularity.ModuleLoader.GetDescriptors(IServiceCollection services, Type startupModuleType, PlugInSourceList plugInSources) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.Core\Volo\Abp\Modularity\ModuleLoader.cs:line 34 - at Volo.Abp.Modularity.ModuleLoader.LoadModules(IServiceCollection services, Type startupModuleType, PlugInSourceList plugInSources) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.Core\Volo\Abp\Modularity\ModuleLoader.cs:line 20 - at Volo.Abp.AbpApplicationBase.LoadModules(IServiceCollection services, AbpApplicationCreationOptions options) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.Core\Volo\Abp\AbpApplicationBase.cs:line 103 - at Volo.Abp.AbpApplicationBase..ctor(Type startupModuleType, IServiceCollection services, Action`1 optionsAction) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.Core\Volo\Abp\AbpApplicationBase.cs:line 47 - at Volo.Abp.AbpApplicationWithExternalServiceProvider..ctor(Type startupModuleType, IServiceCollection services, Action`1 optionsAction) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.Core\Volo\Abp\AbpApplicationWithExternalServiceProvider.cs:line 13 - at Volo.Abp.AbpApplicationFactory.Create(Type startupModuleType, IServiceCollection services, Action`1 optionsAction) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.Core\Volo\Abp\AbpApplicationFactory.cs:line 37 - at Volo.Abp.AbpApplicationFactory.Create[TStartupModule](IServiceCollection services, Action`1 optionsAction) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.Core\Volo\Abp\AbpApplicationFactory.cs:line 29 - at Microsoft.Extensions.DependencyInjection.ServiceCollectionApplicationExtensions.AddApplication[TStartupModule](IServiceCollection services, Action`1 optionsAction) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.Core\Microsoft\Extensions\DependencyInjection\ServiceCollectionApplicationExtensions.cs:line 15 - at Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo.Startup.ConfigureServices(IServiceCollection services) in D:\Github\volo\volo5\abp\modules\basic-theme\app\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo\Startup.cs:line 11 - at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor, Boolean wrapExceptions) - at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) - at Microsoft.AspNetCore.Hosting.ConfigureServicesBuilder.InvokeCore(Object instance, IServiceCollection services) - at Microsoft.AspNetCore.Hosting.ConfigureServicesBuilder.<>c__DisplayClass9_0.g__Startup|0(IServiceCollection serviceCollection) - at Microsoft.AspNetCore.Hosting.ConfigureServicesBuilder.Invoke(Object instance, IServiceCollection services) - at Microsoft.AspNetCore.Hosting.ConfigureServicesBuilder.<>c__DisplayClass8_0.b__0(IServiceCollection services) - at Microsoft.AspNetCore.Hosting.GenericWebHostBuilder.UseStartup(Type startupType, HostBuilderContext context, IServiceCollection services, Object instance) - at Microsoft.AspNetCore.Hosting.GenericWebHostBuilder.<>c__DisplayClass13_0.b__0(HostBuilderContext context, IServiceCollection services) - at Microsoft.Extensions.Hosting.HostBuilder.CreateServiceProvider() - at Microsoft.Extensions.Hosting.HostBuilder.Build() - at Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo.Program.Main(String[] args) in D:\Github\volo\volo5\abp\modules\basic-theme\app\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo\Program.cs:line 23 -2021-06-01 16:47:41.930 +08:00 [INF] Starting web host. -2021-06-01 16:47:42.553 +08:00 [INF] Loaded ABP modules: -2021-06-01 16:47:42.554 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo.AbpAspNetCoreMvcUiThemeBasicDemoModule -2021-06-01 16:47:42.554 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.AbpAspNetCoreMvcUiBasicThemeModule -2021-06-01 16:47:42.554 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.AbpAspNetCoreMvcUiThemeSharedModule -2021-06-01 16:47:42.554 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.AbpAspNetCoreMvcUiBootstrapModule -2021-06-01 16:47:42.554 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.AbpAspNetCoreMvcUiModule -2021-06-01 16:47:42.554 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.AbpAspNetCoreMvcModule -2021-06-01 16:47:42.554 +08:00 [INF] - Volo.Abp.AspNetCore.AbpAspNetCoreModule -2021-06-01 16:47:42.554 +08:00 [INF] - Volo.Abp.Auditing.AbpAuditingModule -2021-06-01 16:47:42.554 +08:00 [INF] - Volo.Abp.Data.AbpDataModule -2021-06-01 16:47:42.554 +08:00 [INF] - Volo.Abp.ObjectExtending.AbpObjectExtendingModule -2021-06-01 16:47:42.554 +08:00 [INF] - Volo.Abp.Localization.AbpLocalizationAbstractionsModule -2021-06-01 16:47:42.554 +08:00 [INF] - Volo.Abp.Validation.AbpValidationAbstractionsModule -2021-06-01 16:47:42.554 +08:00 [INF] - Volo.Abp.Uow.AbpUnitOfWorkModule -2021-06-01 16:47:42.554 +08:00 [INF] - Volo.Abp.EventBus.Abstractions.AbpEventBusAbstractionsModule -2021-06-01 16:47:42.554 +08:00 [INF] - Volo.Abp.Json.AbpJsonModule -2021-06-01 16:47:42.554 +08:00 [INF] - Volo.Abp.Timing.AbpTimingModule -2021-06-01 16:47:42.554 +08:00 [INF] - Volo.Abp.Localization.AbpLocalizationModule -2021-06-01 16:47:42.554 +08:00 [INF] - Volo.Abp.VirtualFileSystem.AbpVirtualFileSystemModule -2021-06-01 16:47:42.554 +08:00 [INF] - Volo.Abp.Settings.AbpSettingsModule -2021-06-01 16:47:42.554 +08:00 [INF] - Volo.Abp.Security.AbpSecurityModule -2021-06-01 16:47:42.554 +08:00 [INF] - Volo.Abp.MultiTenancy.AbpMultiTenancyModule -2021-06-01 16:47:42.554 +08:00 [INF] - Volo.Abp.Threading.AbpThreadingModule -2021-06-01 16:47:42.554 +08:00 [INF] - Volo.Abp.Http.AbpHttpModule -2021-06-01 16:47:42.554 +08:00 [INF] - Volo.Abp.Http.AbpHttpAbstractionsModule -2021-06-01 16:47:42.554 +08:00 [INF] - Volo.Abp.Minify.AbpMinifyModule -2021-06-01 16:47:42.554 +08:00 [INF] - Volo.Abp.Authorization.AbpAuthorizationModule -2021-06-01 16:47:42.554 +08:00 [INF] - Volo.Abp.Authorization.AbpAuthorizationAbstractionsModule -2021-06-01 16:47:42.554 +08:00 [INF] - Volo.Abp.Validation.AbpValidationModule -2021-06-01 16:47:42.554 +08:00 [INF] - Volo.Abp.ExceptionHandling.AbpExceptionHandlingModule -2021-06-01 16:47:42.554 +08:00 [INF] - Volo.Abp.ApiVersioning.AbpApiVersioningAbstractionsModule -2021-06-01 16:47:42.554 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.AbpAspNetCoreMvcContractsModule -2021-06-01 16:47:42.554 +08:00 [INF] - Volo.Abp.Application.AbpDddApplicationContractsModule -2021-06-01 16:47:42.554 +08:00 [INF] - Volo.Abp.UI.Navigation.AbpUiNavigationModule -2021-06-01 16:47:42.554 +08:00 [INF] - Volo.Abp.UI.AbpUiModule -2021-06-01 16:47:42.554 +08:00 [INF] - Volo.Abp.GlobalFeatures.AbpGlobalFeaturesModule -2021-06-01 16:47:42.554 +08:00 [INF] - Volo.Abp.Application.AbpDddApplicationModule -2021-06-01 16:47:42.554 +08:00 [INF] - Volo.Abp.Domain.AbpDddDomainModule -2021-06-01 16:47:42.554 +08:00 [INF] - Volo.Abp.EventBus.AbpEventBusModule -2021-06-01 16:47:42.554 +08:00 [INF] - Volo.Abp.Guids.AbpGuidsModule -2021-06-01 16:47:42.554 +08:00 [INF] - Volo.Abp.ObjectMapping.AbpObjectMappingModule -2021-06-01 16:47:42.554 +08:00 [INF] - Volo.Abp.Specifications.AbpSpecificationsModule -2021-06-01 16:47:42.554 +08:00 [INF] - Volo.Abp.Features.AbpFeaturesModule -2021-06-01 16:47:42.554 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.Packages.AbpAspNetCoreMvcUiPackagesModule -2021-06-01 16:47:42.554 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.Bundling.AbpAspNetCoreMvcUiBundlingAbstractionsModule -2021-06-01 16:47:42.554 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.Widgets.AbpAspNetCoreMvcUiWidgetsModule -2021-06-01 16:47:42.554 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.Bundling.AbpAspNetCoreMvcUiBundlingModule -2021-06-01 16:47:42.554 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy.AbpAspNetCoreMvcUiMultiTenancyModule -2021-06-01 16:47:42.554 +08:00 [INF] - Volo.Abp.AspNetCore.MultiTenancy.AbpAspNetCoreMultiTenancyModule -2021-06-01 16:47:42.554 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo.AbpAspNetCoreMvcUiThemeSharedDemoModule -2021-06-01 16:47:42.554 +08:00 [INF] - Volo.Abp.Autofac.AbpAutofacModule -2021-06-01 16:47:42.554 +08:00 [INF] - Volo.Abp.Castle.AbpCastleCoreModule -2021-06-01 16:47:42.575 +08:00 [FTL] Application startup exception -Volo.Abp.AbpInitializationException: An error occurred during the initialize Volo.Abp.Modularity.OnApplicationInitializationModuleLifecycleContributor phase of the module Volo.Abp.AspNetCore.AbpAspNetCoreModule, Volo.Abp.AspNetCore, Version=4.4.0.0, Culture=neutral, PublicKeyToken=null: An exception was thrown while activating λ:Volo.Abp.AspNetCore.VirtualFileSystem.IWebContentFileProvider -> Volo.Abp.AspNetCore.VirtualFileSystem.WebContentFileProvider -> λ:Volo.Abp.VirtualFileSystem.IVirtualFileProvider -> Volo.Abp.VirtualFileSystem.VirtualFileProvider.. See the inner exception for details. - ---> Autofac.Core.DependencyResolutionException: An exception was thrown while activating λ:Volo.Abp.AspNetCore.VirtualFileSystem.IWebContentFileProvider -> Volo.Abp.AspNetCore.VirtualFileSystem.WebContentFileProvider -> λ:Volo.Abp.VirtualFileSystem.IVirtualFileProvider -> Volo.Abp.VirtualFileSystem.VirtualFileProvider. - ---> Autofac.Core.DependencyResolutionException: An exception was thrown while invoking the constructor 'Void .ctor(Microsoft.Extensions.Options.IOptions`1[Volo.Abp.VirtualFileSystem.AbpVirtualFileSystemOptions], Volo.Abp.VirtualFileSystem.IDynamicFileProvider)' on type 'VirtualFileProvider'. - ---> System.IO.DirectoryNotFoundException: D:\Github\volo\volo5\abp\modules\basic-theme\src\Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo\ - at Microsoft.Extensions.FileProviders.PhysicalFileProvider..ctor(String root, ExclusionFilters filters) - at Microsoft.Extensions.FileProviders.PhysicalFileProvider..ctor(String root) - at Volo.Abp.VirtualFileSystem.VirtualFileSetListExtensions.ReplaceEmbeddedByPhysical[T](VirtualFileSetList fileSets, String physicalPath) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.VirtualFileSystem\Volo\Abp\VirtualFileSystem\VirtualFileSetListExtensions.cs:line 86 - at Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo.AbpAspNetCoreMvcUiThemeBasicDemoModule.<>c__DisplayClass0_0.b__0(AbpVirtualFileSystemOptions options) in D:\Github\volo\volo5\abp\modules\basic-theme\app\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo\AbpAspNetCoreMvcUiThemeBasicDemoModule.cs:line 31 - at Microsoft.Extensions.Options.ConfigureNamedOptions`1.Configure(String name, TOptions options) - at Microsoft.Extensions.Options.OptionsFactory`1.Create(String name) - at Microsoft.Extensions.Options.OptionsManager`1.<>c__DisplayClass5_0.b__0() - at System.Lazy`1.ViaFactory(LazyThreadSafetyMode mode) - at System.Lazy`1.ExecutionAndPublication(LazyHelper executionAndPublication, Boolean useDefaultConstructor) - at System.Lazy`1.CreateValue() - at System.Lazy`1.get_Value() - at Microsoft.Extensions.Options.OptionsCache`1.GetOrAdd(String name, Func`1 createOptions) - at Microsoft.Extensions.Options.OptionsManager`1.Get(String name) - at Microsoft.Extensions.Options.OptionsManager`1.get_Value() - at Volo.Abp.VirtualFileSystem.VirtualFileProvider..ctor(IOptions`1 options, IDynamicFileProvider dynamicFileProvider) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.VirtualFileSystem\Volo\Abp\VirtualFileSystem\VirtualFileProvider.cs:line 19 - at lambda_method619(Closure , Object[] ) - at Autofac.Core.Activators.Reflection.BoundConstructor.Instantiate() - --- End of inner exception stack trace --- - at Autofac.Core.Activators.Reflection.BoundConstructor.Instantiate() - at Autofac.Core.Activators.Reflection.ReflectionActivator.ActivateInstance(IComponentContext context, IEnumerable`1 parameters) - at Autofac.Core.Activators.Reflection.ReflectionActivator.b__11_0(ResolveRequestContext ctxt, Action`1 next) - at Autofac.Core.Resolving.Middleware.DelegateMiddleware.Execute(ResolveRequestContext context, Action`1 next) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Core.Resolving.Middleware.DisposalTrackingMiddleware.Execute(ResolveRequestContext context, Action`1 next) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Builder.RegistrationBuilder`3.<>c__DisplayClass41_0.b__0(ResolveRequestContext ctxt, Action`1 next) - at Autofac.Core.Resolving.Middleware.DelegateMiddleware.Execute(ResolveRequestContext context, Action`1 next) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Core.Resolving.Middleware.ActivatorErrorHandlingMiddleware.Execute(ResolveRequestContext context, Action`1 next) - --- End of inner exception stack trace --- - at Autofac.Core.Resolving.Middleware.ActivatorErrorHandlingMiddleware.Execute(ResolveRequestContext context, Action`1 next) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Core.Pipeline.ResolvePipeline.Invoke(ResolveRequestContext ctxt) - at Autofac.Core.Resolving.Middleware.RegistrationPipelineInvokeMiddleware.Execute(ResolveRequestContext context, Action`1 next) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Core.Resolving.Middleware.SharingMiddleware.<>c__DisplayClass5_0.b__0() - at Autofac.Core.Lifetime.LifetimeScope.CreateSharedInstance(Guid id, Func`1 creator) - at Autofac.Core.Lifetime.LifetimeScope.CreateSharedInstance(Guid primaryId, Nullable`1 qualifyingId, Func`1 creator) - at Autofac.Core.Resolving.Middleware.SharingMiddleware.Execute(ResolveRequestContext context, Action`1 next) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Core.Resolving.Middleware.CircularDependencyDetectorMiddleware.Execute(ResolveRequestContext context, Action`1 next) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Core.Pipeline.ResolvePipeline.Invoke(ResolveRequestContext ctxt) - at Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, ResolveRequest request) - at Autofac.Core.Resolving.ResolveOperation.ExecuteOperation(ResolveRequest request) - at Autofac.Core.Resolving.ResolveOperation.Execute(ResolveRequest request) - at Autofac.Core.Lifetime.LifetimeScope.ResolveComponent(ResolveRequest request) - at Autofac.ResolutionExtensions.TryResolveService(IComponentContext context, Service service, IEnumerable`1 parameters, Object& instance) - at Autofac.ResolutionExtensions.ResolveService(IComponentContext context, Service service, IEnumerable`1 parameters) - at Autofac.ResolutionExtensions.Resolve(IComponentContext context, Type serviceType, IEnumerable`1 parameters) - at Autofac.ResolutionExtensions.Resolve(IComponentContext context, Type serviceType) - at Autofac.Extensions.DependencyInjection.AutofacServiceProvider.GetRequiredService(Type serviceType) - at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType) - at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider provider) - at Volo.Abp.AspNetCore.AbpAspNetCoreModule.OnApplicationInitialization(ApplicationInitializationContext context) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.AspNetCore\Volo\Abp\AspNetCore\AbpAspNetCoreModule.cs:line 61 - at Volo.Abp.Modularity.OnApplicationInitializationModuleLifecycleContributor.Initialize(ApplicationInitializationContext context, IAbpModule module) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.Core\Volo\Abp\Modularity\DefaultModuleLifecycleContributor.cs:line 7 - at Volo.Abp.Modularity.ModuleManager.InitializeModules(ApplicationInitializationContext context) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.Core\Volo\Abp\Modularity\ModuleManager.cs:line 41 - --- End of inner exception stack trace --- - at Volo.Abp.Modularity.ModuleManager.InitializeModules(ApplicationInitializationContext context) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.Core\Volo\Abp\Modularity\ModuleManager.cs:line 45 - at Volo.Abp.AbpApplicationBase.InitializeModules() in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.Core\Volo\Abp\AbpApplicationBase.cs:line 77 - at Volo.Abp.AbpApplicationWithExternalServiceProvider.Initialize(IServiceProvider serviceProvider) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.Core\Volo\Abp\AbpApplicationWithExternalServiceProvider.cs:line 44 - at Microsoft.AspNetCore.Builder.AbpApplicationBuilderExtensions.InitializeApplication(IApplicationBuilder app) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.AspNetCore\Microsoft\AspNetCore\Builder\AbpApplicationBuilderExtensions.cs:line 39 - at Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo.Startup.Configure(IApplicationBuilder app, ILoggerFactory loggerFactory) in D:\Github\volo\volo5\abp\modules\basic-theme\app\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo\Startup.cs:line 16 - at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor, Boolean wrapExceptions) - at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) - at Microsoft.AspNetCore.Hosting.ConfigureBuilder.Invoke(Object instance, IApplicationBuilder builder) - at Microsoft.AspNetCore.Hosting.ConfigureBuilder.<>c__DisplayClass4_0.b__0(IApplicationBuilder builder) - at Microsoft.AspNetCore.Hosting.GenericWebHostBuilder.<>c__DisplayClass15_0.b__1(IApplicationBuilder app) - at Microsoft.AspNetCore.Mvc.Filters.MiddlewareFilterBuilderStartupFilter.<>c__DisplayClass0_0.g__MiddlewareFilterBuilder|0(IApplicationBuilder builder) - at Microsoft.AspNetCore.HostFilteringStartupFilter.<>c__DisplayClass0_0.b__0(IApplicationBuilder app) - at Microsoft.AspNetCore.Hosting.GenericWebHostService.StartAsync(CancellationToken cancellationToken) -2021-06-01 16:47:42.599 +08:00 [FTL] Host terminated unexpectedly! -Volo.Abp.AbpInitializationException: An error occurred during the initialize Volo.Abp.Modularity.OnApplicationInitializationModuleLifecycleContributor phase of the module Volo.Abp.AspNetCore.AbpAspNetCoreModule, Volo.Abp.AspNetCore, Version=4.4.0.0, Culture=neutral, PublicKeyToken=null: An exception was thrown while activating λ:Volo.Abp.AspNetCore.VirtualFileSystem.IWebContentFileProvider -> Volo.Abp.AspNetCore.VirtualFileSystem.WebContentFileProvider -> λ:Volo.Abp.VirtualFileSystem.IVirtualFileProvider -> Volo.Abp.VirtualFileSystem.VirtualFileProvider.. See the inner exception for details. - ---> Autofac.Core.DependencyResolutionException: An exception was thrown while activating λ:Volo.Abp.AspNetCore.VirtualFileSystem.IWebContentFileProvider -> Volo.Abp.AspNetCore.VirtualFileSystem.WebContentFileProvider -> λ:Volo.Abp.VirtualFileSystem.IVirtualFileProvider -> Volo.Abp.VirtualFileSystem.VirtualFileProvider. - ---> Autofac.Core.DependencyResolutionException: An exception was thrown while invoking the constructor 'Void .ctor(Microsoft.Extensions.Options.IOptions`1[Volo.Abp.VirtualFileSystem.AbpVirtualFileSystemOptions], Volo.Abp.VirtualFileSystem.IDynamicFileProvider)' on type 'VirtualFileProvider'. - ---> System.IO.DirectoryNotFoundException: D:\Github\volo\volo5\abp\modules\basic-theme\src\Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo\ - at Microsoft.Extensions.FileProviders.PhysicalFileProvider..ctor(String root, ExclusionFilters filters) - at Microsoft.Extensions.FileProviders.PhysicalFileProvider..ctor(String root) - at Volo.Abp.VirtualFileSystem.VirtualFileSetListExtensions.ReplaceEmbeddedByPhysical[T](VirtualFileSetList fileSets, String physicalPath) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.VirtualFileSystem\Volo\Abp\VirtualFileSystem\VirtualFileSetListExtensions.cs:line 86 - at Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo.AbpAspNetCoreMvcUiThemeBasicDemoModule.<>c__DisplayClass0_0.b__0(AbpVirtualFileSystemOptions options) in D:\Github\volo\volo5\abp\modules\basic-theme\app\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo\AbpAspNetCoreMvcUiThemeBasicDemoModule.cs:line 31 - at Microsoft.Extensions.Options.ConfigureNamedOptions`1.Configure(String name, TOptions options) - at Microsoft.Extensions.Options.OptionsFactory`1.Create(String name) - at Microsoft.Extensions.Options.OptionsManager`1.<>c__DisplayClass5_0.b__0() - at System.Lazy`1.ViaFactory(LazyThreadSafetyMode mode) - at System.Lazy`1.ExecutionAndPublication(LazyHelper executionAndPublication, Boolean useDefaultConstructor) - at System.Lazy`1.CreateValue() - at System.Lazy`1.get_Value() - at Microsoft.Extensions.Options.OptionsCache`1.GetOrAdd(String name, Func`1 createOptions) - at Microsoft.Extensions.Options.OptionsManager`1.Get(String name) - at Microsoft.Extensions.Options.OptionsManager`1.get_Value() - at Volo.Abp.VirtualFileSystem.VirtualFileProvider..ctor(IOptions`1 options, IDynamicFileProvider dynamicFileProvider) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.VirtualFileSystem\Volo\Abp\VirtualFileSystem\VirtualFileProvider.cs:line 19 - at lambda_method619(Closure , Object[] ) - at Autofac.Core.Activators.Reflection.BoundConstructor.Instantiate() - --- End of inner exception stack trace --- - at Autofac.Core.Activators.Reflection.BoundConstructor.Instantiate() - at Autofac.Core.Activators.Reflection.ReflectionActivator.ActivateInstance(IComponentContext context, IEnumerable`1 parameters) - at Autofac.Core.Activators.Reflection.ReflectionActivator.b__11_0(ResolveRequestContext ctxt, Action`1 next) - at Autofac.Core.Resolving.Middleware.DelegateMiddleware.Execute(ResolveRequestContext context, Action`1 next) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Core.Resolving.Middleware.DisposalTrackingMiddleware.Execute(ResolveRequestContext context, Action`1 next) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Builder.RegistrationBuilder`3.<>c__DisplayClass41_0.b__0(ResolveRequestContext ctxt, Action`1 next) - at Autofac.Core.Resolving.Middleware.DelegateMiddleware.Execute(ResolveRequestContext context, Action`1 next) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Core.Resolving.Middleware.ActivatorErrorHandlingMiddleware.Execute(ResolveRequestContext context, Action`1 next) - --- End of inner exception stack trace --- - at Autofac.Core.Resolving.Middleware.ActivatorErrorHandlingMiddleware.Execute(ResolveRequestContext context, Action`1 next) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Core.Pipeline.ResolvePipeline.Invoke(ResolveRequestContext ctxt) - at Autofac.Core.Resolving.Middleware.RegistrationPipelineInvokeMiddleware.Execute(ResolveRequestContext context, Action`1 next) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Core.Resolving.Middleware.SharingMiddleware.<>c__DisplayClass5_0.b__0() - at Autofac.Core.Lifetime.LifetimeScope.CreateSharedInstance(Guid id, Func`1 creator) - at Autofac.Core.Lifetime.LifetimeScope.CreateSharedInstance(Guid primaryId, Nullable`1 qualifyingId, Func`1 creator) - at Autofac.Core.Resolving.Middleware.SharingMiddleware.Execute(ResolveRequestContext context, Action`1 next) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Core.Resolving.Middleware.CircularDependencyDetectorMiddleware.Execute(ResolveRequestContext context, Action`1 next) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Core.Pipeline.ResolvePipeline.Invoke(ResolveRequestContext ctxt) - at Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, ResolveRequest request) - at Autofac.Core.Resolving.ResolveOperation.ExecuteOperation(ResolveRequest request) - at Autofac.Core.Resolving.ResolveOperation.Execute(ResolveRequest request) - at Autofac.Core.Lifetime.LifetimeScope.ResolveComponent(ResolveRequest request) - at Autofac.ResolutionExtensions.TryResolveService(IComponentContext context, Service service, IEnumerable`1 parameters, Object& instance) - at Autofac.ResolutionExtensions.ResolveService(IComponentContext context, Service service, IEnumerable`1 parameters) - at Autofac.ResolutionExtensions.Resolve(IComponentContext context, Type serviceType, IEnumerable`1 parameters) - at Autofac.ResolutionExtensions.Resolve(IComponentContext context, Type serviceType) - at Autofac.Extensions.DependencyInjection.AutofacServiceProvider.GetRequiredService(Type serviceType) - at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType) - at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider provider) - at Volo.Abp.AspNetCore.AbpAspNetCoreModule.OnApplicationInitialization(ApplicationInitializationContext context) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.AspNetCore\Volo\Abp\AspNetCore\AbpAspNetCoreModule.cs:line 61 - at Volo.Abp.Modularity.OnApplicationInitializationModuleLifecycleContributor.Initialize(ApplicationInitializationContext context, IAbpModule module) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.Core\Volo\Abp\Modularity\DefaultModuleLifecycleContributor.cs:line 7 - at Volo.Abp.Modularity.ModuleManager.InitializeModules(ApplicationInitializationContext context) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.Core\Volo\Abp\Modularity\ModuleManager.cs:line 41 - --- End of inner exception stack trace --- - at Volo.Abp.Modularity.ModuleManager.InitializeModules(ApplicationInitializationContext context) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.Core\Volo\Abp\Modularity\ModuleManager.cs:line 45 - at Volo.Abp.AbpApplicationBase.InitializeModules() in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.Core\Volo\Abp\AbpApplicationBase.cs:line 77 - at Volo.Abp.AbpApplicationWithExternalServiceProvider.Initialize(IServiceProvider serviceProvider) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.Core\Volo\Abp\AbpApplicationWithExternalServiceProvider.cs:line 44 - at Microsoft.AspNetCore.Builder.AbpApplicationBuilderExtensions.InitializeApplication(IApplicationBuilder app) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.AspNetCore\Microsoft\AspNetCore\Builder\AbpApplicationBuilderExtensions.cs:line 39 - at Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo.Startup.Configure(IApplicationBuilder app, ILoggerFactory loggerFactory) in D:\Github\volo\volo5\abp\modules\basic-theme\app\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo\Startup.cs:line 16 - at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor, Boolean wrapExceptions) - at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) - at Microsoft.AspNetCore.Hosting.ConfigureBuilder.Invoke(Object instance, IApplicationBuilder builder) - at Microsoft.AspNetCore.Hosting.ConfigureBuilder.<>c__DisplayClass4_0.b__0(IApplicationBuilder builder) - at Microsoft.AspNetCore.Hosting.GenericWebHostBuilder.<>c__DisplayClass15_0.b__1(IApplicationBuilder app) - at Microsoft.AspNetCore.Mvc.Filters.MiddlewareFilterBuilderStartupFilter.<>c__DisplayClass0_0.g__MiddlewareFilterBuilder|0(IApplicationBuilder builder) - at Microsoft.AspNetCore.HostFilteringStartupFilter.<>c__DisplayClass0_0.b__0(IApplicationBuilder app) - at Microsoft.AspNetCore.Hosting.GenericWebHostService.StartAsync(CancellationToken cancellationToken) - at Microsoft.Extensions.Hosting.Internal.Host.StartAsync(CancellationToken cancellationToken) - at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost host, CancellationToken token) - at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost host, CancellationToken token) - at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.Run(IHost host) - at Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo.Program.Main(String[] args) in D:\Github\volo\volo5\abp\modules\basic-theme\app\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo\Program.cs:line 23 -2021-06-01 16:48:00.999 +08:00 [INF] Starting web host. -2021-06-01 16:48:01.586 +08:00 [INF] Loaded ABP modules: -2021-06-01 16:48:01.587 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo.AbpAspNetCoreMvcUiThemeBasicDemoModule -2021-06-01 16:48:01.587 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.AbpAspNetCoreMvcUiBasicThemeModule -2021-06-01 16:48:01.587 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.AbpAspNetCoreMvcUiThemeSharedModule -2021-06-01 16:48:01.587 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.AbpAspNetCoreMvcUiBootstrapModule -2021-06-01 16:48:01.587 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.AbpAspNetCoreMvcUiModule -2021-06-01 16:48:01.587 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.AbpAspNetCoreMvcModule -2021-06-01 16:48:01.587 +08:00 [INF] - Volo.Abp.AspNetCore.AbpAspNetCoreModule -2021-06-01 16:48:01.587 +08:00 [INF] - Volo.Abp.Auditing.AbpAuditingModule -2021-06-01 16:48:01.587 +08:00 [INF] - Volo.Abp.Data.AbpDataModule -2021-06-01 16:48:01.587 +08:00 [INF] - Volo.Abp.ObjectExtending.AbpObjectExtendingModule -2021-06-01 16:48:01.587 +08:00 [INF] - Volo.Abp.Localization.AbpLocalizationAbstractionsModule -2021-06-01 16:48:01.587 +08:00 [INF] - Volo.Abp.Validation.AbpValidationAbstractionsModule -2021-06-01 16:48:01.587 +08:00 [INF] - Volo.Abp.Uow.AbpUnitOfWorkModule -2021-06-01 16:48:01.587 +08:00 [INF] - Volo.Abp.EventBus.Abstractions.AbpEventBusAbstractionsModule -2021-06-01 16:48:01.587 +08:00 [INF] - Volo.Abp.Json.AbpJsonModule -2021-06-01 16:48:01.587 +08:00 [INF] - Volo.Abp.Timing.AbpTimingModule -2021-06-01 16:48:01.587 +08:00 [INF] - Volo.Abp.Localization.AbpLocalizationModule -2021-06-01 16:48:01.587 +08:00 [INF] - Volo.Abp.VirtualFileSystem.AbpVirtualFileSystemModule -2021-06-01 16:48:01.587 +08:00 [INF] - Volo.Abp.Settings.AbpSettingsModule -2021-06-01 16:48:01.587 +08:00 [INF] - Volo.Abp.Security.AbpSecurityModule -2021-06-01 16:48:01.587 +08:00 [INF] - Volo.Abp.MultiTenancy.AbpMultiTenancyModule -2021-06-01 16:48:01.587 +08:00 [INF] - Volo.Abp.Threading.AbpThreadingModule -2021-06-01 16:48:01.587 +08:00 [INF] - Volo.Abp.Http.AbpHttpModule -2021-06-01 16:48:01.587 +08:00 [INF] - Volo.Abp.Http.AbpHttpAbstractionsModule -2021-06-01 16:48:01.587 +08:00 [INF] - Volo.Abp.Minify.AbpMinifyModule -2021-06-01 16:48:01.587 +08:00 [INF] - Volo.Abp.Authorization.AbpAuthorizationModule -2021-06-01 16:48:01.587 +08:00 [INF] - Volo.Abp.Authorization.AbpAuthorizationAbstractionsModule -2021-06-01 16:48:01.587 +08:00 [INF] - Volo.Abp.Validation.AbpValidationModule -2021-06-01 16:48:01.587 +08:00 [INF] - Volo.Abp.ExceptionHandling.AbpExceptionHandlingModule -2021-06-01 16:48:01.587 +08:00 [INF] - Volo.Abp.ApiVersioning.AbpApiVersioningAbstractionsModule -2021-06-01 16:48:01.587 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.AbpAspNetCoreMvcContractsModule -2021-06-01 16:48:01.587 +08:00 [INF] - Volo.Abp.Application.AbpDddApplicationContractsModule -2021-06-01 16:48:01.587 +08:00 [INF] - Volo.Abp.UI.Navigation.AbpUiNavigationModule -2021-06-01 16:48:01.587 +08:00 [INF] - Volo.Abp.UI.AbpUiModule -2021-06-01 16:48:01.587 +08:00 [INF] - Volo.Abp.GlobalFeatures.AbpGlobalFeaturesModule -2021-06-01 16:48:01.587 +08:00 [INF] - Volo.Abp.Application.AbpDddApplicationModule -2021-06-01 16:48:01.587 +08:00 [INF] - Volo.Abp.Domain.AbpDddDomainModule -2021-06-01 16:48:01.587 +08:00 [INF] - Volo.Abp.EventBus.AbpEventBusModule -2021-06-01 16:48:01.587 +08:00 [INF] - Volo.Abp.Guids.AbpGuidsModule -2021-06-01 16:48:01.587 +08:00 [INF] - Volo.Abp.ObjectMapping.AbpObjectMappingModule -2021-06-01 16:48:01.587 +08:00 [INF] - Volo.Abp.Specifications.AbpSpecificationsModule -2021-06-01 16:48:01.587 +08:00 [INF] - Volo.Abp.Features.AbpFeaturesModule -2021-06-01 16:48:01.587 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.Packages.AbpAspNetCoreMvcUiPackagesModule -2021-06-01 16:48:01.587 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.Bundling.AbpAspNetCoreMvcUiBundlingAbstractionsModule -2021-06-01 16:48:01.587 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.Widgets.AbpAspNetCoreMvcUiWidgetsModule -2021-06-01 16:48:01.587 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.Bundling.AbpAspNetCoreMvcUiBundlingModule -2021-06-01 16:48:01.587 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy.AbpAspNetCoreMvcUiMultiTenancyModule -2021-06-01 16:48:01.587 +08:00 [INF] - Volo.Abp.AspNetCore.MultiTenancy.AbpAspNetCoreMultiTenancyModule -2021-06-01 16:48:01.587 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo.AbpAspNetCoreMvcUiThemeSharedDemoModule -2021-06-01 16:48:01.587 +08:00 [INF] - Volo.Abp.Autofac.AbpAutofacModule -2021-06-01 16:48:01.587 +08:00 [INF] - Volo.Abp.Castle.AbpCastleCoreModule -2021-06-01 16:48:01.606 +08:00 [FTL] Application startup exception -Volo.Abp.AbpInitializationException: An error occurred during the initialize Volo.Abp.Modularity.OnApplicationInitializationModuleLifecycleContributor phase of the module Volo.Abp.AspNetCore.AbpAspNetCoreModule, Volo.Abp.AspNetCore, Version=4.4.0.0, Culture=neutral, PublicKeyToken=null: An exception was thrown while activating λ:Volo.Abp.AspNetCore.VirtualFileSystem.IWebContentFileProvider -> Volo.Abp.AspNetCore.VirtualFileSystem.WebContentFileProvider -> λ:Volo.Abp.VirtualFileSystem.IVirtualFileProvider -> Volo.Abp.VirtualFileSystem.VirtualFileProvider.. See the inner exception for details. - ---> Autofac.Core.DependencyResolutionException: An exception was thrown while activating λ:Volo.Abp.AspNetCore.VirtualFileSystem.IWebContentFileProvider -> Volo.Abp.AspNetCore.VirtualFileSystem.WebContentFileProvider -> λ:Volo.Abp.VirtualFileSystem.IVirtualFileProvider -> Volo.Abp.VirtualFileSystem.VirtualFileProvider. - ---> Autofac.Core.DependencyResolutionException: An exception was thrown while invoking the constructor 'Void .ctor(Microsoft.Extensions.Options.IOptions`1[Volo.Abp.VirtualFileSystem.AbpVirtualFileSystemOptions], Volo.Abp.VirtualFileSystem.IDynamicFileProvider)' on type 'VirtualFileProvider'. - ---> System.IO.DirectoryNotFoundException: D:\Github\volo\volo5\abp\modules\basic-theme\src\Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo\ - at Microsoft.Extensions.FileProviders.PhysicalFileProvider..ctor(String root, ExclusionFilters filters) - at Microsoft.Extensions.FileProviders.PhysicalFileProvider..ctor(String root) - at Volo.Abp.VirtualFileSystem.VirtualFileSetListExtensions.ReplaceEmbeddedByPhysical[T](VirtualFileSetList fileSets, String physicalPath) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.VirtualFileSystem\Volo\Abp\VirtualFileSystem\VirtualFileSetListExtensions.cs:line 86 - at Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo.AbpAspNetCoreMvcUiThemeBasicDemoModule.<>c__DisplayClass0_0.b__0(AbpVirtualFileSystemOptions options) in D:\Github\volo\volo5\abp\modules\basic-theme\app\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo\AbpAspNetCoreMvcUiThemeBasicDemoModule.cs:line 31 - at Microsoft.Extensions.Options.ConfigureNamedOptions`1.Configure(String name, TOptions options) - at Microsoft.Extensions.Options.OptionsFactory`1.Create(String name) - at Microsoft.Extensions.Options.OptionsManager`1.<>c__DisplayClass5_0.b__0() - at System.Lazy`1.ViaFactory(LazyThreadSafetyMode mode) - at System.Lazy`1.ExecutionAndPublication(LazyHelper executionAndPublication, Boolean useDefaultConstructor) - at System.Lazy`1.CreateValue() - at System.Lazy`1.get_Value() - at Microsoft.Extensions.Options.OptionsCache`1.GetOrAdd(String name, Func`1 createOptions) - at Microsoft.Extensions.Options.OptionsManager`1.Get(String name) - at Microsoft.Extensions.Options.OptionsManager`1.get_Value() - at Volo.Abp.VirtualFileSystem.VirtualFileProvider..ctor(IOptions`1 options, IDynamicFileProvider dynamicFileProvider) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.VirtualFileSystem\Volo\Abp\VirtualFileSystem\VirtualFileProvider.cs:line 19 - at lambda_method619(Closure , Object[] ) - at Autofac.Core.Activators.Reflection.BoundConstructor.Instantiate() - --- End of inner exception stack trace --- - at Autofac.Core.Activators.Reflection.BoundConstructor.Instantiate() - at Autofac.Core.Activators.Reflection.ReflectionActivator.ActivateInstance(IComponentContext context, IEnumerable`1 parameters) - at Autofac.Core.Activators.Reflection.ReflectionActivator.b__11_0(ResolveRequestContext ctxt, Action`1 next) - at Autofac.Core.Resolving.Middleware.DelegateMiddleware.Execute(ResolveRequestContext context, Action`1 next) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Core.Resolving.Middleware.DisposalTrackingMiddleware.Execute(ResolveRequestContext context, Action`1 next) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Builder.RegistrationBuilder`3.<>c__DisplayClass41_0.b__0(ResolveRequestContext ctxt, Action`1 next) - at Autofac.Core.Resolving.Middleware.DelegateMiddleware.Execute(ResolveRequestContext context, Action`1 next) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Core.Resolving.Middleware.ActivatorErrorHandlingMiddleware.Execute(ResolveRequestContext context, Action`1 next) - --- End of inner exception stack trace --- - at Autofac.Core.Resolving.Middleware.ActivatorErrorHandlingMiddleware.Execute(ResolveRequestContext context, Action`1 next) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Core.Pipeline.ResolvePipeline.Invoke(ResolveRequestContext ctxt) - at Autofac.Core.Resolving.Middleware.RegistrationPipelineInvokeMiddleware.Execute(ResolveRequestContext context, Action`1 next) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Core.Resolving.Middleware.SharingMiddleware.<>c__DisplayClass5_0.b__0() - at Autofac.Core.Lifetime.LifetimeScope.CreateSharedInstance(Guid id, Func`1 creator) - at Autofac.Core.Lifetime.LifetimeScope.CreateSharedInstance(Guid primaryId, Nullable`1 qualifyingId, Func`1 creator) - at Autofac.Core.Resolving.Middleware.SharingMiddleware.Execute(ResolveRequestContext context, Action`1 next) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Core.Resolving.Middleware.CircularDependencyDetectorMiddleware.Execute(ResolveRequestContext context, Action`1 next) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Core.Pipeline.ResolvePipeline.Invoke(ResolveRequestContext ctxt) - at Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, ResolveRequest request) - at Autofac.Core.Resolving.ResolveOperation.ExecuteOperation(ResolveRequest request) - at Autofac.Core.Resolving.ResolveOperation.Execute(ResolveRequest request) - at Autofac.Core.Lifetime.LifetimeScope.ResolveComponent(ResolveRequest request) - at Autofac.ResolutionExtensions.TryResolveService(IComponentContext context, Service service, IEnumerable`1 parameters, Object& instance) - at Autofac.ResolutionExtensions.ResolveService(IComponentContext context, Service service, IEnumerable`1 parameters) - at Autofac.ResolutionExtensions.Resolve(IComponentContext context, Type serviceType, IEnumerable`1 parameters) - at Autofac.ResolutionExtensions.Resolve(IComponentContext context, Type serviceType) - at Autofac.Extensions.DependencyInjection.AutofacServiceProvider.GetRequiredService(Type serviceType) - at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType) - at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider provider) - at Volo.Abp.AspNetCore.AbpAspNetCoreModule.OnApplicationInitialization(ApplicationInitializationContext context) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.AspNetCore\Volo\Abp\AspNetCore\AbpAspNetCoreModule.cs:line 61 - at Volo.Abp.Modularity.OnApplicationInitializationModuleLifecycleContributor.Initialize(ApplicationInitializationContext context, IAbpModule module) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.Core\Volo\Abp\Modularity\DefaultModuleLifecycleContributor.cs:line 7 - at Volo.Abp.Modularity.ModuleManager.InitializeModules(ApplicationInitializationContext context) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.Core\Volo\Abp\Modularity\ModuleManager.cs:line 41 - --- End of inner exception stack trace --- - at Volo.Abp.Modularity.ModuleManager.InitializeModules(ApplicationInitializationContext context) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.Core\Volo\Abp\Modularity\ModuleManager.cs:line 45 - at Volo.Abp.AbpApplicationBase.InitializeModules() in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.Core\Volo\Abp\AbpApplicationBase.cs:line 77 - at Volo.Abp.AbpApplicationWithExternalServiceProvider.Initialize(IServiceProvider serviceProvider) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.Core\Volo\Abp\AbpApplicationWithExternalServiceProvider.cs:line 44 - at Microsoft.AspNetCore.Builder.AbpApplicationBuilderExtensions.InitializeApplication(IApplicationBuilder app) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.AspNetCore\Microsoft\AspNetCore\Builder\AbpApplicationBuilderExtensions.cs:line 39 - at Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo.Startup.Configure(IApplicationBuilder app, ILoggerFactory loggerFactory) in D:\Github\volo\volo5\abp\modules\basic-theme\app\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo\Startup.cs:line 16 - at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor, Boolean wrapExceptions) - at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) - at Microsoft.AspNetCore.Hosting.ConfigureBuilder.Invoke(Object instance, IApplicationBuilder builder) - at Microsoft.AspNetCore.Hosting.ConfigureBuilder.<>c__DisplayClass4_0.b__0(IApplicationBuilder builder) - at Microsoft.AspNetCore.Hosting.GenericWebHostBuilder.<>c__DisplayClass15_0.b__1(IApplicationBuilder app) - at Microsoft.AspNetCore.Mvc.Filters.MiddlewareFilterBuilderStartupFilter.<>c__DisplayClass0_0.g__MiddlewareFilterBuilder|0(IApplicationBuilder builder) - at Microsoft.AspNetCore.HostFilteringStartupFilter.<>c__DisplayClass0_0.b__0(IApplicationBuilder app) - at Microsoft.AspNetCore.Hosting.GenericWebHostService.StartAsync(CancellationToken cancellationToken) -2021-06-01 16:48:01.630 +08:00 [FTL] Host terminated unexpectedly! -Volo.Abp.AbpInitializationException: An error occurred during the initialize Volo.Abp.Modularity.OnApplicationInitializationModuleLifecycleContributor phase of the module Volo.Abp.AspNetCore.AbpAspNetCoreModule, Volo.Abp.AspNetCore, Version=4.4.0.0, Culture=neutral, PublicKeyToken=null: An exception was thrown while activating λ:Volo.Abp.AspNetCore.VirtualFileSystem.IWebContentFileProvider -> Volo.Abp.AspNetCore.VirtualFileSystem.WebContentFileProvider -> λ:Volo.Abp.VirtualFileSystem.IVirtualFileProvider -> Volo.Abp.VirtualFileSystem.VirtualFileProvider.. See the inner exception for details. - ---> Autofac.Core.DependencyResolutionException: An exception was thrown while activating λ:Volo.Abp.AspNetCore.VirtualFileSystem.IWebContentFileProvider -> Volo.Abp.AspNetCore.VirtualFileSystem.WebContentFileProvider -> λ:Volo.Abp.VirtualFileSystem.IVirtualFileProvider -> Volo.Abp.VirtualFileSystem.VirtualFileProvider. - ---> Autofac.Core.DependencyResolutionException: An exception was thrown while invoking the constructor 'Void .ctor(Microsoft.Extensions.Options.IOptions`1[Volo.Abp.VirtualFileSystem.AbpVirtualFileSystemOptions], Volo.Abp.VirtualFileSystem.IDynamicFileProvider)' on type 'VirtualFileProvider'. - ---> System.IO.DirectoryNotFoundException: D:\Github\volo\volo5\abp\modules\basic-theme\src\Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo\ - at Microsoft.Extensions.FileProviders.PhysicalFileProvider..ctor(String root, ExclusionFilters filters) - at Microsoft.Extensions.FileProviders.PhysicalFileProvider..ctor(String root) - at Volo.Abp.VirtualFileSystem.VirtualFileSetListExtensions.ReplaceEmbeddedByPhysical[T](VirtualFileSetList fileSets, String physicalPath) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.VirtualFileSystem\Volo\Abp\VirtualFileSystem\VirtualFileSetListExtensions.cs:line 86 - at Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo.AbpAspNetCoreMvcUiThemeBasicDemoModule.<>c__DisplayClass0_0.b__0(AbpVirtualFileSystemOptions options) in D:\Github\volo\volo5\abp\modules\basic-theme\app\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo\AbpAspNetCoreMvcUiThemeBasicDemoModule.cs:line 31 - at Microsoft.Extensions.Options.ConfigureNamedOptions`1.Configure(String name, TOptions options) - at Microsoft.Extensions.Options.OptionsFactory`1.Create(String name) - at Microsoft.Extensions.Options.OptionsManager`1.<>c__DisplayClass5_0.b__0() - at System.Lazy`1.ViaFactory(LazyThreadSafetyMode mode) - at System.Lazy`1.ExecutionAndPublication(LazyHelper executionAndPublication, Boolean useDefaultConstructor) - at System.Lazy`1.CreateValue() - at System.Lazy`1.get_Value() - at Microsoft.Extensions.Options.OptionsCache`1.GetOrAdd(String name, Func`1 createOptions) - at Microsoft.Extensions.Options.OptionsManager`1.Get(String name) - at Microsoft.Extensions.Options.OptionsManager`1.get_Value() - at Volo.Abp.VirtualFileSystem.VirtualFileProvider..ctor(IOptions`1 options, IDynamicFileProvider dynamicFileProvider) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.VirtualFileSystem\Volo\Abp\VirtualFileSystem\VirtualFileProvider.cs:line 19 - at lambda_method619(Closure , Object[] ) - at Autofac.Core.Activators.Reflection.BoundConstructor.Instantiate() - --- End of inner exception stack trace --- - at Autofac.Core.Activators.Reflection.BoundConstructor.Instantiate() - at Autofac.Core.Activators.Reflection.ReflectionActivator.ActivateInstance(IComponentContext context, IEnumerable`1 parameters) - at Autofac.Core.Activators.Reflection.ReflectionActivator.b__11_0(ResolveRequestContext ctxt, Action`1 next) - at Autofac.Core.Resolving.Middleware.DelegateMiddleware.Execute(ResolveRequestContext context, Action`1 next) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Core.Resolving.Middleware.DisposalTrackingMiddleware.Execute(ResolveRequestContext context, Action`1 next) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Builder.RegistrationBuilder`3.<>c__DisplayClass41_0.b__0(ResolveRequestContext ctxt, Action`1 next) - at Autofac.Core.Resolving.Middleware.DelegateMiddleware.Execute(ResolveRequestContext context, Action`1 next) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Core.Resolving.Middleware.ActivatorErrorHandlingMiddleware.Execute(ResolveRequestContext context, Action`1 next) - --- End of inner exception stack trace --- - at Autofac.Core.Resolving.Middleware.ActivatorErrorHandlingMiddleware.Execute(ResolveRequestContext context, Action`1 next) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Core.Pipeline.ResolvePipeline.Invoke(ResolveRequestContext ctxt) - at Autofac.Core.Resolving.Middleware.RegistrationPipelineInvokeMiddleware.Execute(ResolveRequestContext context, Action`1 next) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Core.Resolving.Middleware.SharingMiddleware.<>c__DisplayClass5_0.b__0() - at Autofac.Core.Lifetime.LifetimeScope.CreateSharedInstance(Guid id, Func`1 creator) - at Autofac.Core.Lifetime.LifetimeScope.CreateSharedInstance(Guid primaryId, Nullable`1 qualifyingId, Func`1 creator) - at Autofac.Core.Resolving.Middleware.SharingMiddleware.Execute(ResolveRequestContext context, Action`1 next) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Core.Resolving.Middleware.CircularDependencyDetectorMiddleware.Execute(ResolveRequestContext context, Action`1 next) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Core.Pipeline.ResolvePipeline.Invoke(ResolveRequestContext ctxt) - at Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, ResolveRequest request) - at Autofac.Core.Resolving.ResolveOperation.ExecuteOperation(ResolveRequest request) - at Autofac.Core.Resolving.ResolveOperation.Execute(ResolveRequest request) - at Autofac.Core.Lifetime.LifetimeScope.ResolveComponent(ResolveRequest request) - at Autofac.ResolutionExtensions.TryResolveService(IComponentContext context, Service service, IEnumerable`1 parameters, Object& instance) - at Autofac.ResolutionExtensions.ResolveService(IComponentContext context, Service service, IEnumerable`1 parameters) - at Autofac.ResolutionExtensions.Resolve(IComponentContext context, Type serviceType, IEnumerable`1 parameters) - at Autofac.ResolutionExtensions.Resolve(IComponentContext context, Type serviceType) - at Autofac.Extensions.DependencyInjection.AutofacServiceProvider.GetRequiredService(Type serviceType) - at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType) - at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider provider) - at Volo.Abp.AspNetCore.AbpAspNetCoreModule.OnApplicationInitialization(ApplicationInitializationContext context) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.AspNetCore\Volo\Abp\AspNetCore\AbpAspNetCoreModule.cs:line 61 - at Volo.Abp.Modularity.OnApplicationInitializationModuleLifecycleContributor.Initialize(ApplicationInitializationContext context, IAbpModule module) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.Core\Volo\Abp\Modularity\DefaultModuleLifecycleContributor.cs:line 7 - at Volo.Abp.Modularity.ModuleManager.InitializeModules(ApplicationInitializationContext context) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.Core\Volo\Abp\Modularity\ModuleManager.cs:line 41 - --- End of inner exception stack trace --- - at Volo.Abp.Modularity.ModuleManager.InitializeModules(ApplicationInitializationContext context) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.Core\Volo\Abp\Modularity\ModuleManager.cs:line 45 - at Volo.Abp.AbpApplicationBase.InitializeModules() in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.Core\Volo\Abp\AbpApplicationBase.cs:line 77 - at Volo.Abp.AbpApplicationWithExternalServiceProvider.Initialize(IServiceProvider serviceProvider) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.Core\Volo\Abp\AbpApplicationWithExternalServiceProvider.cs:line 44 - at Microsoft.AspNetCore.Builder.AbpApplicationBuilderExtensions.InitializeApplication(IApplicationBuilder app) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.AspNetCore\Microsoft\AspNetCore\Builder\AbpApplicationBuilderExtensions.cs:line 39 - at Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo.Startup.Configure(IApplicationBuilder app, ILoggerFactory loggerFactory) in D:\Github\volo\volo5\abp\modules\basic-theme\app\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo\Startup.cs:line 16 - at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor, Boolean wrapExceptions) - at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) - at Microsoft.AspNetCore.Hosting.ConfigureBuilder.Invoke(Object instance, IApplicationBuilder builder) - at Microsoft.AspNetCore.Hosting.ConfigureBuilder.<>c__DisplayClass4_0.b__0(IApplicationBuilder builder) - at Microsoft.AspNetCore.Hosting.GenericWebHostBuilder.<>c__DisplayClass15_0.b__1(IApplicationBuilder app) - at Microsoft.AspNetCore.Mvc.Filters.MiddlewareFilterBuilderStartupFilter.<>c__DisplayClass0_0.g__MiddlewareFilterBuilder|0(IApplicationBuilder builder) - at Microsoft.AspNetCore.HostFilteringStartupFilter.<>c__DisplayClass0_0.b__0(IApplicationBuilder app) - at Microsoft.AspNetCore.Hosting.GenericWebHostService.StartAsync(CancellationToken cancellationToken) - at Microsoft.Extensions.Hosting.Internal.Host.StartAsync(CancellationToken cancellationToken) - at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost host, CancellationToken token) - at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost host, CancellationToken token) - at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.Run(IHost host) - at Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo.Program.Main(String[] args) in D:\Github\volo\volo5\abp\modules\basic-theme\app\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo\Program.cs:line 23 -2021-06-01 16:49:56.102 +08:00 [INF] Starting web host. -2021-06-01 16:49:56.699 +08:00 [INF] Loaded ABP modules: -2021-06-01 16:49:56.701 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo.AbpAspNetCoreMvcUiThemeBasicDemoModule -2021-06-01 16:49:56.701 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.AbpAspNetCoreMvcUiBasicThemeModule -2021-06-01 16:49:56.701 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.AbpAspNetCoreMvcUiThemeSharedModule -2021-06-01 16:49:56.701 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.AbpAspNetCoreMvcUiBootstrapModule -2021-06-01 16:49:56.701 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.AbpAspNetCoreMvcUiModule -2021-06-01 16:49:56.701 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.AbpAspNetCoreMvcModule -2021-06-01 16:49:56.701 +08:00 [INF] - Volo.Abp.AspNetCore.AbpAspNetCoreModule -2021-06-01 16:49:56.701 +08:00 [INF] - Volo.Abp.Auditing.AbpAuditingModule -2021-06-01 16:49:56.701 +08:00 [INF] - Volo.Abp.Data.AbpDataModule -2021-06-01 16:49:56.701 +08:00 [INF] - Volo.Abp.ObjectExtending.AbpObjectExtendingModule -2021-06-01 16:49:56.701 +08:00 [INF] - Volo.Abp.Localization.AbpLocalizationAbstractionsModule -2021-06-01 16:49:56.701 +08:00 [INF] - Volo.Abp.Validation.AbpValidationAbstractionsModule -2021-06-01 16:49:56.701 +08:00 [INF] - Volo.Abp.Uow.AbpUnitOfWorkModule -2021-06-01 16:49:56.701 +08:00 [INF] - Volo.Abp.EventBus.Abstractions.AbpEventBusAbstractionsModule -2021-06-01 16:49:56.701 +08:00 [INF] - Volo.Abp.Json.AbpJsonModule -2021-06-01 16:49:56.701 +08:00 [INF] - Volo.Abp.Timing.AbpTimingModule -2021-06-01 16:49:56.701 +08:00 [INF] - Volo.Abp.Localization.AbpLocalizationModule -2021-06-01 16:49:56.701 +08:00 [INF] - Volo.Abp.VirtualFileSystem.AbpVirtualFileSystemModule -2021-06-01 16:49:56.701 +08:00 [INF] - Volo.Abp.Settings.AbpSettingsModule -2021-06-01 16:49:56.701 +08:00 [INF] - Volo.Abp.Security.AbpSecurityModule -2021-06-01 16:49:56.701 +08:00 [INF] - Volo.Abp.MultiTenancy.AbpMultiTenancyModule -2021-06-01 16:49:56.701 +08:00 [INF] - Volo.Abp.Threading.AbpThreadingModule -2021-06-01 16:49:56.701 +08:00 [INF] - Volo.Abp.Http.AbpHttpModule -2021-06-01 16:49:56.701 +08:00 [INF] - Volo.Abp.Http.AbpHttpAbstractionsModule -2021-06-01 16:49:56.701 +08:00 [INF] - Volo.Abp.Minify.AbpMinifyModule -2021-06-01 16:49:56.701 +08:00 [INF] - Volo.Abp.Authorization.AbpAuthorizationModule -2021-06-01 16:49:56.701 +08:00 [INF] - Volo.Abp.Authorization.AbpAuthorizationAbstractionsModule -2021-06-01 16:49:56.701 +08:00 [INF] - Volo.Abp.Validation.AbpValidationModule -2021-06-01 16:49:56.701 +08:00 [INF] - Volo.Abp.ExceptionHandling.AbpExceptionHandlingModule -2021-06-01 16:49:56.701 +08:00 [INF] - Volo.Abp.ApiVersioning.AbpApiVersioningAbstractionsModule -2021-06-01 16:49:56.701 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.AbpAspNetCoreMvcContractsModule -2021-06-01 16:49:56.701 +08:00 [INF] - Volo.Abp.Application.AbpDddApplicationContractsModule -2021-06-01 16:49:56.701 +08:00 [INF] - Volo.Abp.UI.Navigation.AbpUiNavigationModule -2021-06-01 16:49:56.701 +08:00 [INF] - Volo.Abp.UI.AbpUiModule -2021-06-01 16:49:56.701 +08:00 [INF] - Volo.Abp.GlobalFeatures.AbpGlobalFeaturesModule -2021-06-01 16:49:56.701 +08:00 [INF] - Volo.Abp.Application.AbpDddApplicationModule -2021-06-01 16:49:56.701 +08:00 [INF] - Volo.Abp.Domain.AbpDddDomainModule -2021-06-01 16:49:56.701 +08:00 [INF] - Volo.Abp.EventBus.AbpEventBusModule -2021-06-01 16:49:56.701 +08:00 [INF] - Volo.Abp.Guids.AbpGuidsModule -2021-06-01 16:49:56.701 +08:00 [INF] - Volo.Abp.ObjectMapping.AbpObjectMappingModule -2021-06-01 16:49:56.701 +08:00 [INF] - Volo.Abp.Specifications.AbpSpecificationsModule -2021-06-01 16:49:56.701 +08:00 [INF] - Volo.Abp.Features.AbpFeaturesModule -2021-06-01 16:49:56.701 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.Packages.AbpAspNetCoreMvcUiPackagesModule -2021-06-01 16:49:56.701 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.Bundling.AbpAspNetCoreMvcUiBundlingAbstractionsModule -2021-06-01 16:49:56.701 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.Widgets.AbpAspNetCoreMvcUiWidgetsModule -2021-06-01 16:49:56.701 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.Bundling.AbpAspNetCoreMvcUiBundlingModule -2021-06-01 16:49:56.701 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy.AbpAspNetCoreMvcUiMultiTenancyModule -2021-06-01 16:49:56.701 +08:00 [INF] - Volo.Abp.AspNetCore.MultiTenancy.AbpAspNetCoreMultiTenancyModule -2021-06-01 16:49:56.701 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo.AbpAspNetCoreMvcUiThemeSharedDemoModule -2021-06-01 16:49:56.701 +08:00 [INF] - Volo.Abp.Autofac.AbpAutofacModule -2021-06-01 16:49:56.701 +08:00 [INF] - Volo.Abp.Castle.AbpCastleCoreModule -2021-06-01 16:49:56.720 +08:00 [FTL] Application startup exception -Volo.Abp.AbpInitializationException: An error occurred during the initialize Volo.Abp.Modularity.OnApplicationInitializationModuleLifecycleContributor phase of the module Volo.Abp.AspNetCore.AbpAspNetCoreModule, Volo.Abp.AspNetCore, Version=4.4.0.0, Culture=neutral, PublicKeyToken=null: An exception was thrown while activating λ:Volo.Abp.AspNetCore.VirtualFileSystem.IWebContentFileProvider -> Volo.Abp.AspNetCore.VirtualFileSystem.WebContentFileProvider -> λ:Volo.Abp.VirtualFileSystem.IVirtualFileProvider -> Volo.Abp.VirtualFileSystem.VirtualFileProvider.. See the inner exception for details. - ---> Autofac.Core.DependencyResolutionException: An exception was thrown while activating λ:Volo.Abp.AspNetCore.VirtualFileSystem.IWebContentFileProvider -> Volo.Abp.AspNetCore.VirtualFileSystem.WebContentFileProvider -> λ:Volo.Abp.VirtualFileSystem.IVirtualFileProvider -> Volo.Abp.VirtualFileSystem.VirtualFileProvider. - ---> Autofac.Core.DependencyResolutionException: An exception was thrown while invoking the constructor 'Void .ctor(Microsoft.Extensions.Options.IOptions`1[Volo.Abp.VirtualFileSystem.AbpVirtualFileSystemOptions], Volo.Abp.VirtualFileSystem.IDynamicFileProvider)' on type 'VirtualFileProvider'. - ---> System.IO.DirectoryNotFoundException: D:\Github\volo\volo5\abp\modules\basic-theme\src\Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo\ - at Microsoft.Extensions.FileProviders.PhysicalFileProvider..ctor(String root, ExclusionFilters filters) - at Microsoft.Extensions.FileProviders.PhysicalFileProvider..ctor(String root) - at Volo.Abp.VirtualFileSystem.VirtualFileSetListExtensions.ReplaceEmbeddedByPhysical[T](VirtualFileSetList fileSets, String physicalPath) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.VirtualFileSystem\Volo\Abp\VirtualFileSystem\VirtualFileSetListExtensions.cs:line 86 - at Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo.AbpAspNetCoreMvcUiThemeBasicDemoModule.<>c__DisplayClass0_0.b__0(AbpVirtualFileSystemOptions options) in D:\Github\volo\volo5\abp\modules\basic-theme\app\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo\AbpAspNetCoreMvcUiThemeBasicDemoModule.cs:line 31 - at Microsoft.Extensions.Options.ConfigureNamedOptions`1.Configure(String name, TOptions options) - at Microsoft.Extensions.Options.OptionsFactory`1.Create(String name) - at Microsoft.Extensions.Options.OptionsManager`1.<>c__DisplayClass5_0.b__0() - at System.Lazy`1.ViaFactory(LazyThreadSafetyMode mode) - at System.Lazy`1.ExecutionAndPublication(LazyHelper executionAndPublication, Boolean useDefaultConstructor) - at System.Lazy`1.CreateValue() - at System.Lazy`1.get_Value() - at Microsoft.Extensions.Options.OptionsCache`1.GetOrAdd(String name, Func`1 createOptions) - at Microsoft.Extensions.Options.OptionsManager`1.Get(String name) - at Microsoft.Extensions.Options.OptionsManager`1.get_Value() - at Volo.Abp.VirtualFileSystem.VirtualFileProvider..ctor(IOptions`1 options, IDynamicFileProvider dynamicFileProvider) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.VirtualFileSystem\Volo\Abp\VirtualFileSystem\VirtualFileProvider.cs:line 19 - at lambda_method619(Closure , Object[] ) - at Autofac.Core.Activators.Reflection.BoundConstructor.Instantiate() - --- End of inner exception stack trace --- - at Autofac.Core.Activators.Reflection.BoundConstructor.Instantiate() - at Autofac.Core.Activators.Reflection.ReflectionActivator.ActivateInstance(IComponentContext context, IEnumerable`1 parameters) - at Autofac.Core.Activators.Reflection.ReflectionActivator.b__11_0(ResolveRequestContext ctxt, Action`1 next) - at Autofac.Core.Resolving.Middleware.DelegateMiddleware.Execute(ResolveRequestContext context, Action`1 next) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Core.Resolving.Middleware.DisposalTrackingMiddleware.Execute(ResolveRequestContext context, Action`1 next) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Builder.RegistrationBuilder`3.<>c__DisplayClass41_0.b__0(ResolveRequestContext ctxt, Action`1 next) - at Autofac.Core.Resolving.Middleware.DelegateMiddleware.Execute(ResolveRequestContext context, Action`1 next) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Core.Resolving.Middleware.ActivatorErrorHandlingMiddleware.Execute(ResolveRequestContext context, Action`1 next) - --- End of inner exception stack trace --- - at Autofac.Core.Resolving.Middleware.ActivatorErrorHandlingMiddleware.Execute(ResolveRequestContext context, Action`1 next) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Core.Pipeline.ResolvePipeline.Invoke(ResolveRequestContext ctxt) - at Autofac.Core.Resolving.Middleware.RegistrationPipelineInvokeMiddleware.Execute(ResolveRequestContext context, Action`1 next) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Core.Resolving.Middleware.SharingMiddleware.<>c__DisplayClass5_0.b__0() - at Autofac.Core.Lifetime.LifetimeScope.CreateSharedInstance(Guid id, Func`1 creator) - at Autofac.Core.Lifetime.LifetimeScope.CreateSharedInstance(Guid primaryId, Nullable`1 qualifyingId, Func`1 creator) - at Autofac.Core.Resolving.Middleware.SharingMiddleware.Execute(ResolveRequestContext context, Action`1 next) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Core.Resolving.Middleware.CircularDependencyDetectorMiddleware.Execute(ResolveRequestContext context, Action`1 next) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Core.Pipeline.ResolvePipeline.Invoke(ResolveRequestContext ctxt) - at Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, ResolveRequest request) - at Autofac.Core.Resolving.ResolveOperation.ExecuteOperation(ResolveRequest request) - at Autofac.Core.Resolving.ResolveOperation.Execute(ResolveRequest request) - at Autofac.Core.Lifetime.LifetimeScope.ResolveComponent(ResolveRequest request) - at Autofac.ResolutionExtensions.TryResolveService(IComponentContext context, Service service, IEnumerable`1 parameters, Object& instance) - at Autofac.ResolutionExtensions.ResolveService(IComponentContext context, Service service, IEnumerable`1 parameters) - at Autofac.ResolutionExtensions.Resolve(IComponentContext context, Type serviceType, IEnumerable`1 parameters) - at Autofac.ResolutionExtensions.Resolve(IComponentContext context, Type serviceType) - at Autofac.Extensions.DependencyInjection.AutofacServiceProvider.GetRequiredService(Type serviceType) - at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType) - at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider provider) - at Volo.Abp.AspNetCore.AbpAspNetCoreModule.OnApplicationInitialization(ApplicationInitializationContext context) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.AspNetCore\Volo\Abp\AspNetCore\AbpAspNetCoreModule.cs:line 61 - at Volo.Abp.Modularity.OnApplicationInitializationModuleLifecycleContributor.Initialize(ApplicationInitializationContext context, IAbpModule module) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.Core\Volo\Abp\Modularity\DefaultModuleLifecycleContributor.cs:line 7 - at Volo.Abp.Modularity.ModuleManager.InitializeModules(ApplicationInitializationContext context) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.Core\Volo\Abp\Modularity\ModuleManager.cs:line 41 - --- End of inner exception stack trace --- - at Volo.Abp.Modularity.ModuleManager.InitializeModules(ApplicationInitializationContext context) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.Core\Volo\Abp\Modularity\ModuleManager.cs:line 45 - at Volo.Abp.AbpApplicationBase.InitializeModules() in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.Core\Volo\Abp\AbpApplicationBase.cs:line 77 - at Volo.Abp.AbpApplicationWithExternalServiceProvider.Initialize(IServiceProvider serviceProvider) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.Core\Volo\Abp\AbpApplicationWithExternalServiceProvider.cs:line 44 - at Microsoft.AspNetCore.Builder.AbpApplicationBuilderExtensions.InitializeApplication(IApplicationBuilder app) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.AspNetCore\Microsoft\AspNetCore\Builder\AbpApplicationBuilderExtensions.cs:line 39 - at Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo.Startup.Configure(IApplicationBuilder app, ILoggerFactory loggerFactory) in D:\Github\volo\volo5\abp\modules\basic-theme\app\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo\Startup.cs:line 16 - at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor, Boolean wrapExceptions) - at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) - at Microsoft.AspNetCore.Hosting.ConfigureBuilder.Invoke(Object instance, IApplicationBuilder builder) - at Microsoft.AspNetCore.Hosting.ConfigureBuilder.<>c__DisplayClass4_0.b__0(IApplicationBuilder builder) - at Microsoft.AspNetCore.Hosting.GenericWebHostBuilder.<>c__DisplayClass15_0.b__1(IApplicationBuilder app) - at Microsoft.AspNetCore.Mvc.Filters.MiddlewareFilterBuilderStartupFilter.<>c__DisplayClass0_0.g__MiddlewareFilterBuilder|0(IApplicationBuilder builder) - at Microsoft.AspNetCore.HostFilteringStartupFilter.<>c__DisplayClass0_0.b__0(IApplicationBuilder app) - at Microsoft.AspNetCore.Hosting.GenericWebHostService.StartAsync(CancellationToken cancellationToken) -2021-06-01 16:49:56.744 +08:00 [FTL] Host terminated unexpectedly! -Volo.Abp.AbpInitializationException: An error occurred during the initialize Volo.Abp.Modularity.OnApplicationInitializationModuleLifecycleContributor phase of the module Volo.Abp.AspNetCore.AbpAspNetCoreModule, Volo.Abp.AspNetCore, Version=4.4.0.0, Culture=neutral, PublicKeyToken=null: An exception was thrown while activating λ:Volo.Abp.AspNetCore.VirtualFileSystem.IWebContentFileProvider -> Volo.Abp.AspNetCore.VirtualFileSystem.WebContentFileProvider -> λ:Volo.Abp.VirtualFileSystem.IVirtualFileProvider -> Volo.Abp.VirtualFileSystem.VirtualFileProvider.. See the inner exception for details. - ---> Autofac.Core.DependencyResolutionException: An exception was thrown while activating λ:Volo.Abp.AspNetCore.VirtualFileSystem.IWebContentFileProvider -> Volo.Abp.AspNetCore.VirtualFileSystem.WebContentFileProvider -> λ:Volo.Abp.VirtualFileSystem.IVirtualFileProvider -> Volo.Abp.VirtualFileSystem.VirtualFileProvider. - ---> Autofac.Core.DependencyResolutionException: An exception was thrown while invoking the constructor 'Void .ctor(Microsoft.Extensions.Options.IOptions`1[Volo.Abp.VirtualFileSystem.AbpVirtualFileSystemOptions], Volo.Abp.VirtualFileSystem.IDynamicFileProvider)' on type 'VirtualFileProvider'. - ---> System.IO.DirectoryNotFoundException: D:\Github\volo\volo5\abp\modules\basic-theme\src\Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo\ - at Microsoft.Extensions.FileProviders.PhysicalFileProvider..ctor(String root, ExclusionFilters filters) - at Microsoft.Extensions.FileProviders.PhysicalFileProvider..ctor(String root) - at Volo.Abp.VirtualFileSystem.VirtualFileSetListExtensions.ReplaceEmbeddedByPhysical[T](VirtualFileSetList fileSets, String physicalPath) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.VirtualFileSystem\Volo\Abp\VirtualFileSystem\VirtualFileSetListExtensions.cs:line 86 - at Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo.AbpAspNetCoreMvcUiThemeBasicDemoModule.<>c__DisplayClass0_0.b__0(AbpVirtualFileSystemOptions options) in D:\Github\volo\volo5\abp\modules\basic-theme\app\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo\AbpAspNetCoreMvcUiThemeBasicDemoModule.cs:line 31 - at Microsoft.Extensions.Options.ConfigureNamedOptions`1.Configure(String name, TOptions options) - at Microsoft.Extensions.Options.OptionsFactory`1.Create(String name) - at Microsoft.Extensions.Options.OptionsManager`1.<>c__DisplayClass5_0.b__0() - at System.Lazy`1.ViaFactory(LazyThreadSafetyMode mode) - at System.Lazy`1.ExecutionAndPublication(LazyHelper executionAndPublication, Boolean useDefaultConstructor) - at System.Lazy`1.CreateValue() - at System.Lazy`1.get_Value() - at Microsoft.Extensions.Options.OptionsCache`1.GetOrAdd(String name, Func`1 createOptions) - at Microsoft.Extensions.Options.OptionsManager`1.Get(String name) - at Microsoft.Extensions.Options.OptionsManager`1.get_Value() - at Volo.Abp.VirtualFileSystem.VirtualFileProvider..ctor(IOptions`1 options, IDynamicFileProvider dynamicFileProvider) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.VirtualFileSystem\Volo\Abp\VirtualFileSystem\VirtualFileProvider.cs:line 19 - at lambda_method619(Closure , Object[] ) - at Autofac.Core.Activators.Reflection.BoundConstructor.Instantiate() - --- End of inner exception stack trace --- - at Autofac.Core.Activators.Reflection.BoundConstructor.Instantiate() - at Autofac.Core.Activators.Reflection.ReflectionActivator.ActivateInstance(IComponentContext context, IEnumerable`1 parameters) - at Autofac.Core.Activators.Reflection.ReflectionActivator.b__11_0(ResolveRequestContext ctxt, Action`1 next) - at Autofac.Core.Resolving.Middleware.DelegateMiddleware.Execute(ResolveRequestContext context, Action`1 next) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Core.Resolving.Middleware.DisposalTrackingMiddleware.Execute(ResolveRequestContext context, Action`1 next) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Builder.RegistrationBuilder`3.<>c__DisplayClass41_0.b__0(ResolveRequestContext ctxt, Action`1 next) - at Autofac.Core.Resolving.Middleware.DelegateMiddleware.Execute(ResolveRequestContext context, Action`1 next) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Core.Resolving.Middleware.ActivatorErrorHandlingMiddleware.Execute(ResolveRequestContext context, Action`1 next) - --- End of inner exception stack trace --- - at Autofac.Core.Resolving.Middleware.ActivatorErrorHandlingMiddleware.Execute(ResolveRequestContext context, Action`1 next) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Core.Pipeline.ResolvePipeline.Invoke(ResolveRequestContext ctxt) - at Autofac.Core.Resolving.Middleware.RegistrationPipelineInvokeMiddleware.Execute(ResolveRequestContext context, Action`1 next) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Core.Resolving.Middleware.SharingMiddleware.<>c__DisplayClass5_0.b__0() - at Autofac.Core.Lifetime.LifetimeScope.CreateSharedInstance(Guid id, Func`1 creator) - at Autofac.Core.Lifetime.LifetimeScope.CreateSharedInstance(Guid primaryId, Nullable`1 qualifyingId, Func`1 creator) - at Autofac.Core.Resolving.Middleware.SharingMiddleware.Execute(ResolveRequestContext context, Action`1 next) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Core.Resolving.Middleware.CircularDependencyDetectorMiddleware.Execute(ResolveRequestContext context, Action`1 next) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Core.Pipeline.ResolvePipeline.Invoke(ResolveRequestContext ctxt) - at Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, ResolveRequest request) - at Autofac.Core.Resolving.ResolveOperation.ExecuteOperation(ResolveRequest request) - at Autofac.Core.Resolving.ResolveOperation.Execute(ResolveRequest request) - at Autofac.Core.Lifetime.LifetimeScope.ResolveComponent(ResolveRequest request) - at Autofac.ResolutionExtensions.TryResolveService(IComponentContext context, Service service, IEnumerable`1 parameters, Object& instance) - at Autofac.ResolutionExtensions.ResolveService(IComponentContext context, Service service, IEnumerable`1 parameters) - at Autofac.ResolutionExtensions.Resolve(IComponentContext context, Type serviceType, IEnumerable`1 parameters) - at Autofac.ResolutionExtensions.Resolve(IComponentContext context, Type serviceType) - at Autofac.Extensions.DependencyInjection.AutofacServiceProvider.GetRequiredService(Type serviceType) - at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType) - at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider provider) - at Volo.Abp.AspNetCore.AbpAspNetCoreModule.OnApplicationInitialization(ApplicationInitializationContext context) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.AspNetCore\Volo\Abp\AspNetCore\AbpAspNetCoreModule.cs:line 61 - at Volo.Abp.Modularity.OnApplicationInitializationModuleLifecycleContributor.Initialize(ApplicationInitializationContext context, IAbpModule module) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.Core\Volo\Abp\Modularity\DefaultModuleLifecycleContributor.cs:line 7 - at Volo.Abp.Modularity.ModuleManager.InitializeModules(ApplicationInitializationContext context) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.Core\Volo\Abp\Modularity\ModuleManager.cs:line 41 - --- End of inner exception stack trace --- - at Volo.Abp.Modularity.ModuleManager.InitializeModules(ApplicationInitializationContext context) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.Core\Volo\Abp\Modularity\ModuleManager.cs:line 45 - at Volo.Abp.AbpApplicationBase.InitializeModules() in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.Core\Volo\Abp\AbpApplicationBase.cs:line 77 - at Volo.Abp.AbpApplicationWithExternalServiceProvider.Initialize(IServiceProvider serviceProvider) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.Core\Volo\Abp\AbpApplicationWithExternalServiceProvider.cs:line 44 - at Microsoft.AspNetCore.Builder.AbpApplicationBuilderExtensions.InitializeApplication(IApplicationBuilder app) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.AspNetCore\Microsoft\AspNetCore\Builder\AbpApplicationBuilderExtensions.cs:line 39 - at Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo.Startup.Configure(IApplicationBuilder app, ILoggerFactory loggerFactory) in D:\Github\volo\volo5\abp\modules\basic-theme\app\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo\Startup.cs:line 16 - at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor, Boolean wrapExceptions) - at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) - at Microsoft.AspNetCore.Hosting.ConfigureBuilder.Invoke(Object instance, IApplicationBuilder builder) - at Microsoft.AspNetCore.Hosting.ConfigureBuilder.<>c__DisplayClass4_0.b__0(IApplicationBuilder builder) - at Microsoft.AspNetCore.Hosting.GenericWebHostBuilder.<>c__DisplayClass15_0.b__1(IApplicationBuilder app) - at Microsoft.AspNetCore.Mvc.Filters.MiddlewareFilterBuilderStartupFilter.<>c__DisplayClass0_0.g__MiddlewareFilterBuilder|0(IApplicationBuilder builder) - at Microsoft.AspNetCore.HostFilteringStartupFilter.<>c__DisplayClass0_0.b__0(IApplicationBuilder app) - at Microsoft.AspNetCore.Hosting.GenericWebHostService.StartAsync(CancellationToken cancellationToken) - at Microsoft.Extensions.Hosting.Internal.Host.StartAsync(CancellationToken cancellationToken) - at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost host, CancellationToken token) - at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost host, CancellationToken token) - at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.Run(IHost host) - at Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo.Program.Main(String[] args) in D:\Github\volo\volo5\abp\modules\basic-theme\app\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo\Program.cs:line 23 -2021-06-01 16:53:47.920 +08:00 [INF] Starting web host. -2021-06-01 16:53:48.484 +08:00 [DBG] Hosting starting -2021-06-01 16:53:48.505 +08:00 [INF] User profile is available. Using 'C:\Users\maliming\AppData\Local\ASP.NET\DataProtection-Keys' as key repository and Windows DPAPI to encrypt keys at rest. -2021-06-01 16:53:48.519 +08:00 [DBG] Reading data from file 'C:\Users\maliming\AppData\Local\ASP.NET\DataProtection-Keys\key-00882981-b76a-49b5-97d9-cba33d1b2fac.xml'. -2021-06-01 16:53:48.524 +08:00 [DBG] Reading data from file 'C:\Users\maliming\AppData\Local\ASP.NET\DataProtection-Keys\key-16f92a94-47c6-46c3-8316-64624f1d6374.xml'. -2021-06-01 16:53:48.524 +08:00 [DBG] Reading data from file 'C:\Users\maliming\AppData\Local\ASP.NET\DataProtection-Keys\key-1c739fbe-ac37-4841-96ff-95f2e8e442b6.xml'. -2021-06-01 16:53:48.524 +08:00 [DBG] Reading data from file 'C:\Users\maliming\AppData\Local\ASP.NET\DataProtection-Keys\key-57b510d8-7687-4faf-9958-44ff9cb04f85.xml'. -2021-06-01 16:53:48.524 +08:00 [DBG] Reading data from file 'C:\Users\maliming\AppData\Local\ASP.NET\DataProtection-Keys\key-5c61addd-ecc0-4e6c-a356-8f093efb281c.xml'. -2021-06-01 16:53:48.524 +08:00 [DBG] Reading data from file 'C:\Users\maliming\AppData\Local\ASP.NET\DataProtection-Keys\key-62bbda5c-8775-40d5-9b98-5e1d890c023f.xml'. -2021-06-01 16:53:48.525 +08:00 [DBG] Reading data from file 'C:\Users\maliming\AppData\Local\ASP.NET\DataProtection-Keys\key-932dc0fd-9093-43a6-8a06-44006a08abea.xml'. -2021-06-01 16:53:48.525 +08:00 [DBG] Reading data from file 'C:\Users\maliming\AppData\Local\ASP.NET\DataProtection-Keys\key-98010c23-29bf-4f0d-8110-366f7c36adb0.xml'. -2021-06-01 16:53:48.525 +08:00 [DBG] Reading data from file 'C:\Users\maliming\AppData\Local\ASP.NET\DataProtection-Keys\key-9a3631e8-55e8-43d3-9d4b-5fd16c26d658.xml'. -2021-06-01 16:53:48.525 +08:00 [DBG] Reading data from file 'C:\Users\maliming\AppData\Local\ASP.NET\DataProtection-Keys\key-d7ba675e-ffb5-4484-b396-0913c3c07df2.xml'. -2021-06-01 16:53:48.528 +08:00 [DBG] Found key {00882981-b76a-49b5-97d9-cba33d1b2fac}. -2021-06-01 16:53:48.532 +08:00 [DBG] Found key {16f92a94-47c6-46c3-8316-64624f1d6374}. -2021-06-01 16:53:48.532 +08:00 [DBG] Found key {1c739fbe-ac37-4841-96ff-95f2e8e442b6}. -2021-06-01 16:53:48.532 +08:00 [DBG] Found key {57b510d8-7687-4faf-9958-44ff9cb04f85}. -2021-06-01 16:53:48.532 +08:00 [DBG] Found key {5c61addd-ecc0-4e6c-a356-8f093efb281c}. -2021-06-01 16:53:48.533 +08:00 [DBG] Found key {62bbda5c-8775-40d5-9b98-5e1d890c023f}. -2021-06-01 16:53:48.533 +08:00 [DBG] Found key {932dc0fd-9093-43a6-8a06-44006a08abea}. -2021-06-01 16:53:48.533 +08:00 [DBG] Found key {98010c23-29bf-4f0d-8110-366f7c36adb0}. -2021-06-01 16:53:48.533 +08:00 [DBG] Found key {9a3631e8-55e8-43d3-9d4b-5fd16c26d658}. -2021-06-01 16:53:48.533 +08:00 [DBG] Found key {d7ba675e-ffb5-4484-b396-0913c3c07df2}. -2021-06-01 16:53:48.539 +08:00 [DBG] Considering key {1c739fbe-ac37-4841-96ff-95f2e8e442b6} with expiration date 2021-08-29 01:43:16Z as default key. -2021-06-01 16:53:48.551 +08:00 [DBG] Forwarded activator type request from Microsoft.AspNetCore.DataProtection.XmlEncryption.DpapiXmlDecryptor, Microsoft.AspNetCore.DataProtection, Version=5.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60 to Microsoft.AspNetCore.DataProtection.XmlEncryption.DpapiXmlDecryptor, Microsoft.AspNetCore.DataProtection, Culture=neutral, PublicKeyToken=adb9793829ddae60 -2021-06-01 16:53:48.553 +08:00 [DBG] Decrypting secret element using Windows DPAPI. -2021-06-01 16:53:48.553 +08:00 [DBG] Forwarded activator type request from Microsoft.AspNetCore.DataProtection.AuthenticatedEncryption.ConfigurationModel.AuthenticatedEncryptorDescriptorDeserializer, Microsoft.AspNetCore.DataProtection, Version=5.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60 to Microsoft.AspNetCore.DataProtection.AuthenticatedEncryption.ConfigurationModel.AuthenticatedEncryptorDescriptorDeserializer, Microsoft.AspNetCore.DataProtection, Culture=neutral, PublicKeyToken=adb9793829ddae60 -2021-06-01 16:53:48.556 +08:00 [DBG] Opening CNG algorithm 'AES' from provider 'null' with chaining mode CBC. -2021-06-01 16:53:48.557 +08:00 [DBG] Opening CNG algorithm 'SHA256' from provider 'null' with HMAC. -2021-06-01 16:53:48.559 +08:00 [DBG] Using key {1c739fbe-ac37-4841-96ff-95f2e8e442b6} as the default key. -2021-06-01 16:53:48.559 +08:00 [DBG] Key ring with default key {1c739fbe-ac37-4841-96ff-95f2e8e442b6} was loaded during application startup. -2021-06-01 16:53:48.564 +08:00 [INF] Loaded ABP modules: -2021-06-01 16:53:48.564 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo.AbpAspNetCoreMvcUiThemeBasicDemoModule -2021-06-01 16:53:48.564 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.AbpAspNetCoreMvcUiBasicThemeModule -2021-06-01 16:53:48.564 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.AbpAspNetCoreMvcUiThemeSharedModule -2021-06-01 16:53:48.564 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.AbpAspNetCoreMvcUiBootstrapModule -2021-06-01 16:53:48.564 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.AbpAspNetCoreMvcUiModule -2021-06-01 16:53:48.564 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.AbpAspNetCoreMvcModule -2021-06-01 16:53:48.564 +08:00 [INF] - Volo.Abp.AspNetCore.AbpAspNetCoreModule -2021-06-01 16:53:48.564 +08:00 [INF] - Volo.Abp.Auditing.AbpAuditingModule -2021-06-01 16:53:48.564 +08:00 [INF] - Volo.Abp.Data.AbpDataModule -2021-06-01 16:53:48.564 +08:00 [INF] - Volo.Abp.ObjectExtending.AbpObjectExtendingModule -2021-06-01 16:53:48.564 +08:00 [INF] - Volo.Abp.Localization.AbpLocalizationAbstractionsModule -2021-06-01 16:53:48.564 +08:00 [INF] - Volo.Abp.Validation.AbpValidationAbstractionsModule -2021-06-01 16:53:48.564 +08:00 [INF] - Volo.Abp.Uow.AbpUnitOfWorkModule -2021-06-01 16:53:48.564 +08:00 [INF] - Volo.Abp.EventBus.Abstractions.AbpEventBusAbstractionsModule -2021-06-01 16:53:48.564 +08:00 [INF] - Volo.Abp.Json.AbpJsonModule -2021-06-01 16:53:48.564 +08:00 [INF] - Volo.Abp.Timing.AbpTimingModule -2021-06-01 16:53:48.564 +08:00 [INF] - Volo.Abp.Localization.AbpLocalizationModule -2021-06-01 16:53:48.564 +08:00 [INF] - Volo.Abp.VirtualFileSystem.AbpVirtualFileSystemModule -2021-06-01 16:53:48.564 +08:00 [INF] - Volo.Abp.Settings.AbpSettingsModule -2021-06-01 16:53:48.564 +08:00 [INF] - Volo.Abp.Security.AbpSecurityModule -2021-06-01 16:53:48.564 +08:00 [INF] - Volo.Abp.MultiTenancy.AbpMultiTenancyModule -2021-06-01 16:53:48.564 +08:00 [INF] - Volo.Abp.Threading.AbpThreadingModule -2021-06-01 16:53:48.564 +08:00 [INF] - Volo.Abp.Http.AbpHttpModule -2021-06-01 16:53:48.564 +08:00 [INF] - Volo.Abp.Http.AbpHttpAbstractionsModule -2021-06-01 16:53:48.564 +08:00 [INF] - Volo.Abp.Minify.AbpMinifyModule -2021-06-01 16:53:48.564 +08:00 [INF] - Volo.Abp.Authorization.AbpAuthorizationModule -2021-06-01 16:53:48.564 +08:00 [INF] - Volo.Abp.Authorization.AbpAuthorizationAbstractionsModule -2021-06-01 16:53:48.564 +08:00 [INF] - Volo.Abp.Validation.AbpValidationModule -2021-06-01 16:53:48.564 +08:00 [INF] - Volo.Abp.ExceptionHandling.AbpExceptionHandlingModule -2021-06-01 16:53:48.564 +08:00 [INF] - Volo.Abp.ApiVersioning.AbpApiVersioningAbstractionsModule -2021-06-01 16:53:48.564 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.AbpAspNetCoreMvcContractsModule -2021-06-01 16:53:48.564 +08:00 [INF] - Volo.Abp.Application.AbpDddApplicationContractsModule -2021-06-01 16:53:48.564 +08:00 [INF] - Volo.Abp.UI.Navigation.AbpUiNavigationModule -2021-06-01 16:53:48.564 +08:00 [INF] - Volo.Abp.UI.AbpUiModule -2021-06-01 16:53:48.564 +08:00 [INF] - Volo.Abp.GlobalFeatures.AbpGlobalFeaturesModule -2021-06-01 16:53:48.564 +08:00 [INF] - Volo.Abp.Application.AbpDddApplicationModule -2021-06-01 16:53:48.564 +08:00 [INF] - Volo.Abp.Domain.AbpDddDomainModule -2021-06-01 16:53:48.564 +08:00 [INF] - Volo.Abp.EventBus.AbpEventBusModule -2021-06-01 16:53:48.564 +08:00 [INF] - Volo.Abp.Guids.AbpGuidsModule -2021-06-01 16:53:48.564 +08:00 [INF] - Volo.Abp.ObjectMapping.AbpObjectMappingModule -2021-06-01 16:53:48.564 +08:00 [INF] - Volo.Abp.Specifications.AbpSpecificationsModule -2021-06-01 16:53:48.564 +08:00 [INF] - Volo.Abp.Features.AbpFeaturesModule -2021-06-01 16:53:48.564 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.Packages.AbpAspNetCoreMvcUiPackagesModule -2021-06-01 16:53:48.564 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.Bundling.AbpAspNetCoreMvcUiBundlingAbstractionsModule -2021-06-01 16:53:48.564 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.Widgets.AbpAspNetCoreMvcUiWidgetsModule -2021-06-01 16:53:48.564 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.Bundling.AbpAspNetCoreMvcUiBundlingModule -2021-06-01 16:53:48.564 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy.AbpAspNetCoreMvcUiMultiTenancyModule -2021-06-01 16:53:48.564 +08:00 [INF] - Volo.Abp.AspNetCore.MultiTenancy.AbpAspNetCoreMultiTenancyModule -2021-06-01 16:53:48.564 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo.AbpAspNetCoreMvcUiThemeSharedDemoModule -2021-06-01 16:53:48.564 +08:00 [INF] - Volo.Abp.Autofac.AbpAutofacModule -2021-06-01 16:53:48.564 +08:00 [INF] - Volo.Abp.Castle.AbpCastleCoreModule -2021-06-01 16:53:48.585 +08:00 [FTL] Application startup exception -Volo.Abp.AbpInitializationException: An error occurred during the initialize Volo.Abp.Modularity.OnApplicationInitializationModuleLifecycleContributor phase of the module Volo.Abp.AspNetCore.AbpAspNetCoreModule, Volo.Abp.AspNetCore, Version=4.4.0.0, Culture=neutral, PublicKeyToken=null: An exception was thrown while activating λ:Volo.Abp.AspNetCore.VirtualFileSystem.IWebContentFileProvider -> Volo.Abp.AspNetCore.VirtualFileSystem.WebContentFileProvider -> λ:Volo.Abp.VirtualFileSystem.IVirtualFileProvider -> Volo.Abp.VirtualFileSystem.VirtualFileProvider.. See the inner exception for details. - ---> Autofac.Core.DependencyResolutionException: An exception was thrown while activating λ:Volo.Abp.AspNetCore.VirtualFileSystem.IWebContentFileProvider -> Volo.Abp.AspNetCore.VirtualFileSystem.WebContentFileProvider -> λ:Volo.Abp.VirtualFileSystem.IVirtualFileProvider -> Volo.Abp.VirtualFileSystem.VirtualFileProvider. - ---> Autofac.Core.DependencyResolutionException: An exception was thrown while invoking the constructor 'Void .ctor(Microsoft.Extensions.Options.IOptions`1[Volo.Abp.VirtualFileSystem.AbpVirtualFileSystemOptions], Volo.Abp.VirtualFileSystem.IDynamicFileProvider)' on type 'VirtualFileProvider'. - ---> System.IO.DirectoryNotFoundException: D:\Github\volo\volo5\abp\modules\basic-theme\src\Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo\ - at Microsoft.Extensions.FileProviders.PhysicalFileProvider..ctor(String root, ExclusionFilters filters) - at Microsoft.Extensions.FileProviders.PhysicalFileProvider..ctor(String root) - at Volo.Abp.VirtualFileSystem.VirtualFileSetListExtensions.ReplaceEmbeddedByPhysical[T](VirtualFileSetList fileSets, String physicalPath) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.VirtualFileSystem\Volo\Abp\VirtualFileSystem\VirtualFileSetListExtensions.cs:line 86 - at Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo.AbpAspNetCoreMvcUiThemeBasicDemoModule.<>c__DisplayClass0_0.b__0(AbpVirtualFileSystemOptions options) in D:\Github\volo\volo5\abp\modules\basic-theme\app\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo\AbpAspNetCoreMvcUiThemeBasicDemoModule.cs:line 31 - at Microsoft.Extensions.Options.ConfigureNamedOptions`1.Configure(String name, TOptions options) - at Microsoft.Extensions.Options.OptionsFactory`1.Create(String name) - at Microsoft.Extensions.Options.OptionsManager`1.<>c__DisplayClass5_0.b__0() - at System.Lazy`1.ViaFactory(LazyThreadSafetyMode mode) - at System.Lazy`1.ExecutionAndPublication(LazyHelper executionAndPublication, Boolean useDefaultConstructor) - at System.Lazy`1.CreateValue() - at System.Lazy`1.get_Value() - at Microsoft.Extensions.Options.OptionsCache`1.GetOrAdd(String name, Func`1 createOptions) - at Microsoft.Extensions.Options.OptionsManager`1.Get(String name) - at Microsoft.Extensions.Options.OptionsManager`1.get_Value() - at Volo.Abp.VirtualFileSystem.VirtualFileProvider..ctor(IOptions`1 options, IDynamicFileProvider dynamicFileProvider) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.VirtualFileSystem\Volo\Abp\VirtualFileSystem\VirtualFileProvider.cs:line 19 - at lambda_method619(Closure , Object[] ) - at Autofac.Core.Activators.Reflection.BoundConstructor.Instantiate() - --- End of inner exception stack trace --- - at Autofac.Core.Activators.Reflection.BoundConstructor.Instantiate() - at Autofac.Core.Activators.Reflection.ReflectionActivator.ActivateInstance(IComponentContext context, IEnumerable`1 parameters) - at Autofac.Core.Activators.Reflection.ReflectionActivator.b__11_0(ResolveRequestContext ctxt, Action`1 next) - at Autofac.Core.Resolving.Middleware.DelegateMiddleware.Execute(ResolveRequestContext context, Action`1 next) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Core.Resolving.Middleware.DisposalTrackingMiddleware.Execute(ResolveRequestContext context, Action`1 next) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Builder.RegistrationBuilder`3.<>c__DisplayClass41_0.b__0(ResolveRequestContext ctxt, Action`1 next) - at Autofac.Core.Resolving.Middleware.DelegateMiddleware.Execute(ResolveRequestContext context, Action`1 next) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Core.Resolving.Middleware.ActivatorErrorHandlingMiddleware.Execute(ResolveRequestContext context, Action`1 next) - --- End of inner exception stack trace --- - at Autofac.Core.Resolving.Middleware.ActivatorErrorHandlingMiddleware.Execute(ResolveRequestContext context, Action`1 next) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Core.Pipeline.ResolvePipeline.Invoke(ResolveRequestContext ctxt) - at Autofac.Core.Resolving.Middleware.RegistrationPipelineInvokeMiddleware.Execute(ResolveRequestContext context, Action`1 next) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Core.Resolving.Middleware.SharingMiddleware.<>c__DisplayClass5_0.b__0() - at Autofac.Core.Lifetime.LifetimeScope.CreateSharedInstance(Guid id, Func`1 creator) - at Autofac.Core.Lifetime.LifetimeScope.CreateSharedInstance(Guid primaryId, Nullable`1 qualifyingId, Func`1 creator) - at Autofac.Core.Resolving.Middleware.SharingMiddleware.Execute(ResolveRequestContext context, Action`1 next) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Core.Resolving.Middleware.CircularDependencyDetectorMiddleware.Execute(ResolveRequestContext context, Action`1 next) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Core.Pipeline.ResolvePipeline.Invoke(ResolveRequestContext ctxt) - at Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, ResolveRequest request) - at Autofac.Core.Resolving.ResolveOperation.ExecuteOperation(ResolveRequest request) - at Autofac.Core.Resolving.ResolveOperation.Execute(ResolveRequest request) - at Autofac.Core.Lifetime.LifetimeScope.ResolveComponent(ResolveRequest request) - at Autofac.ResolutionExtensions.TryResolveService(IComponentContext context, Service service, IEnumerable`1 parameters, Object& instance) - at Autofac.ResolutionExtensions.ResolveService(IComponentContext context, Service service, IEnumerable`1 parameters) - at Autofac.ResolutionExtensions.Resolve(IComponentContext context, Type serviceType, IEnumerable`1 parameters) - at Autofac.ResolutionExtensions.Resolve(IComponentContext context, Type serviceType) - at Autofac.Extensions.DependencyInjection.AutofacServiceProvider.GetRequiredService(Type serviceType) - at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType) - at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider provider) - at Volo.Abp.AspNetCore.AbpAspNetCoreModule.OnApplicationInitialization(ApplicationInitializationContext context) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.AspNetCore\Volo\Abp\AspNetCore\AbpAspNetCoreModule.cs:line 61 - at Volo.Abp.Modularity.OnApplicationInitializationModuleLifecycleContributor.Initialize(ApplicationInitializationContext context, IAbpModule module) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.Core\Volo\Abp\Modularity\DefaultModuleLifecycleContributor.cs:line 7 - at Volo.Abp.Modularity.ModuleManager.InitializeModules(ApplicationInitializationContext context) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.Core\Volo\Abp\Modularity\ModuleManager.cs:line 41 - --- End of inner exception stack trace --- - at Volo.Abp.Modularity.ModuleManager.InitializeModules(ApplicationInitializationContext context) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.Core\Volo\Abp\Modularity\ModuleManager.cs:line 45 - at Volo.Abp.AbpApplicationBase.InitializeModules() in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.Core\Volo\Abp\AbpApplicationBase.cs:line 77 - at Volo.Abp.AbpApplicationWithExternalServiceProvider.Initialize(IServiceProvider serviceProvider) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.Core\Volo\Abp\AbpApplicationWithExternalServiceProvider.cs:line 44 - at Microsoft.AspNetCore.Builder.AbpApplicationBuilderExtensions.InitializeApplication(IApplicationBuilder app) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.AspNetCore\Microsoft\AspNetCore\Builder\AbpApplicationBuilderExtensions.cs:line 39 - at Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo.Startup.Configure(IApplicationBuilder app, ILoggerFactory loggerFactory) in D:\Github\volo\volo5\abp\modules\basic-theme\app\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo\Startup.cs:line 16 - at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor, Boolean wrapExceptions) - at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) - at Microsoft.AspNetCore.Hosting.ConfigureBuilder.Invoke(Object instance, IApplicationBuilder builder) - at Microsoft.AspNetCore.Hosting.ConfigureBuilder.<>c__DisplayClass4_0.b__0(IApplicationBuilder builder) - at Microsoft.AspNetCore.Hosting.GenericWebHostBuilder.<>c__DisplayClass15_0.b__1(IApplicationBuilder app) - at Microsoft.AspNetCore.Mvc.Filters.MiddlewareFilterBuilderStartupFilter.<>c__DisplayClass0_0.g__MiddlewareFilterBuilder|0(IApplicationBuilder builder) - at Microsoft.AspNetCore.HostFilteringStartupFilter.<>c__DisplayClass0_0.b__0(IApplicationBuilder app) - at Microsoft.AspNetCore.Hosting.GenericWebHostService.StartAsync(CancellationToken cancellationToken) - at Microsoft.Extensions.Hosting.Internal.Host.StartAsync(CancellationToken cancellationToken) - at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost host, CancellationToken token) - at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost host, CancellationToken token) - at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.Run(IHost host) - at Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo.Program.Main(String[] args) in D:\Github\volo\volo5\abp\modules\basic-theme\app\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo\Program.cs:line 23 -2021-06-01 16:53:48.590 +08:00 [FTL] Host terminated unexpectedly! -Volo.Abp.AbpInitializationException: An error occurred during the initialize Volo.Abp.Modularity.OnApplicationInitializationModuleLifecycleContributor phase of the module Volo.Abp.AspNetCore.AbpAspNetCoreModule, Volo.Abp.AspNetCore, Version=4.4.0.0, Culture=neutral, PublicKeyToken=null: An exception was thrown while activating λ:Volo.Abp.AspNetCore.VirtualFileSystem.IWebContentFileProvider -> Volo.Abp.AspNetCore.VirtualFileSystem.WebContentFileProvider -> λ:Volo.Abp.VirtualFileSystem.IVirtualFileProvider -> Volo.Abp.VirtualFileSystem.VirtualFileProvider.. See the inner exception for details. - ---> Autofac.Core.DependencyResolutionException: An exception was thrown while activating λ:Volo.Abp.AspNetCore.VirtualFileSystem.IWebContentFileProvider -> Volo.Abp.AspNetCore.VirtualFileSystem.WebContentFileProvider -> λ:Volo.Abp.VirtualFileSystem.IVirtualFileProvider -> Volo.Abp.VirtualFileSystem.VirtualFileProvider. - ---> Autofac.Core.DependencyResolutionException: An exception was thrown while invoking the constructor 'Void .ctor(Microsoft.Extensions.Options.IOptions`1[Volo.Abp.VirtualFileSystem.AbpVirtualFileSystemOptions], Volo.Abp.VirtualFileSystem.IDynamicFileProvider)' on type 'VirtualFileProvider'. - ---> System.IO.DirectoryNotFoundException: D:\Github\volo\volo5\abp\modules\basic-theme\src\Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo\ - at Microsoft.Extensions.FileProviders.PhysicalFileProvider..ctor(String root, ExclusionFilters filters) - at Microsoft.Extensions.FileProviders.PhysicalFileProvider..ctor(String root) - at Volo.Abp.VirtualFileSystem.VirtualFileSetListExtensions.ReplaceEmbeddedByPhysical[T](VirtualFileSetList fileSets, String physicalPath) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.VirtualFileSystem\Volo\Abp\VirtualFileSystem\VirtualFileSetListExtensions.cs:line 86 - at Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo.AbpAspNetCoreMvcUiThemeBasicDemoModule.<>c__DisplayClass0_0.b__0(AbpVirtualFileSystemOptions options) in D:\Github\volo\volo5\abp\modules\basic-theme\app\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo\AbpAspNetCoreMvcUiThemeBasicDemoModule.cs:line 31 - at Microsoft.Extensions.Options.ConfigureNamedOptions`1.Configure(String name, TOptions options) - at Microsoft.Extensions.Options.OptionsFactory`1.Create(String name) - at Microsoft.Extensions.Options.OptionsManager`1.<>c__DisplayClass5_0.b__0() - at System.Lazy`1.ViaFactory(LazyThreadSafetyMode mode) - at System.Lazy`1.ExecutionAndPublication(LazyHelper executionAndPublication, Boolean useDefaultConstructor) - at System.Lazy`1.CreateValue() - at System.Lazy`1.get_Value() - at Microsoft.Extensions.Options.OptionsCache`1.GetOrAdd(String name, Func`1 createOptions) - at Microsoft.Extensions.Options.OptionsManager`1.Get(String name) - at Microsoft.Extensions.Options.OptionsManager`1.get_Value() - at Volo.Abp.VirtualFileSystem.VirtualFileProvider..ctor(IOptions`1 options, IDynamicFileProvider dynamicFileProvider) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.VirtualFileSystem\Volo\Abp\VirtualFileSystem\VirtualFileProvider.cs:line 19 - at lambda_method619(Closure , Object[] ) - at Autofac.Core.Activators.Reflection.BoundConstructor.Instantiate() - --- End of inner exception stack trace --- - at Autofac.Core.Activators.Reflection.BoundConstructor.Instantiate() - at Autofac.Core.Activators.Reflection.ReflectionActivator.ActivateInstance(IComponentContext context, IEnumerable`1 parameters) - at Autofac.Core.Activators.Reflection.ReflectionActivator.b__11_0(ResolveRequestContext ctxt, Action`1 next) - at Autofac.Core.Resolving.Middleware.DelegateMiddleware.Execute(ResolveRequestContext context, Action`1 next) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Core.Resolving.Middleware.DisposalTrackingMiddleware.Execute(ResolveRequestContext context, Action`1 next) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Builder.RegistrationBuilder`3.<>c__DisplayClass41_0.b__0(ResolveRequestContext ctxt, Action`1 next) - at Autofac.Core.Resolving.Middleware.DelegateMiddleware.Execute(ResolveRequestContext context, Action`1 next) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Core.Resolving.Middleware.ActivatorErrorHandlingMiddleware.Execute(ResolveRequestContext context, Action`1 next) - --- End of inner exception stack trace --- - at Autofac.Core.Resolving.Middleware.ActivatorErrorHandlingMiddleware.Execute(ResolveRequestContext context, Action`1 next) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Core.Pipeline.ResolvePipeline.Invoke(ResolveRequestContext ctxt) - at Autofac.Core.Resolving.Middleware.RegistrationPipelineInvokeMiddleware.Execute(ResolveRequestContext context, Action`1 next) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Core.Resolving.Middleware.SharingMiddleware.<>c__DisplayClass5_0.b__0() - at Autofac.Core.Lifetime.LifetimeScope.CreateSharedInstance(Guid id, Func`1 creator) - at Autofac.Core.Lifetime.LifetimeScope.CreateSharedInstance(Guid primaryId, Nullable`1 qualifyingId, Func`1 creator) - at Autofac.Core.Resolving.Middleware.SharingMiddleware.Execute(ResolveRequestContext context, Action`1 next) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Core.Resolving.Middleware.CircularDependencyDetectorMiddleware.Execute(ResolveRequestContext context, Action`1 next) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Core.Pipeline.ResolvePipeline.Invoke(ResolveRequestContext ctxt) - at Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, ResolveRequest request) - at Autofac.Core.Resolving.ResolveOperation.ExecuteOperation(ResolveRequest request) - at Autofac.Core.Resolving.ResolveOperation.Execute(ResolveRequest request) - at Autofac.Core.Lifetime.LifetimeScope.ResolveComponent(ResolveRequest request) - at Autofac.ResolutionExtensions.TryResolveService(IComponentContext context, Service service, IEnumerable`1 parameters, Object& instance) - at Autofac.ResolutionExtensions.ResolveService(IComponentContext context, Service service, IEnumerable`1 parameters) - at Autofac.ResolutionExtensions.Resolve(IComponentContext context, Type serviceType, IEnumerable`1 parameters) - at Autofac.ResolutionExtensions.Resolve(IComponentContext context, Type serviceType) - at Autofac.Extensions.DependencyInjection.AutofacServiceProvider.GetRequiredService(Type serviceType) - at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType) - at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider provider) - at Volo.Abp.AspNetCore.AbpAspNetCoreModule.OnApplicationInitialization(ApplicationInitializationContext context) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.AspNetCore\Volo\Abp\AspNetCore\AbpAspNetCoreModule.cs:line 61 - at Volo.Abp.Modularity.OnApplicationInitializationModuleLifecycleContributor.Initialize(ApplicationInitializationContext context, IAbpModule module) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.Core\Volo\Abp\Modularity\DefaultModuleLifecycleContributor.cs:line 7 - at Volo.Abp.Modularity.ModuleManager.InitializeModules(ApplicationInitializationContext context) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.Core\Volo\Abp\Modularity\ModuleManager.cs:line 41 - --- End of inner exception stack trace --- - at Volo.Abp.Modularity.ModuleManager.InitializeModules(ApplicationInitializationContext context) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.Core\Volo\Abp\Modularity\ModuleManager.cs:line 45 - at Volo.Abp.AbpApplicationBase.InitializeModules() in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.Core\Volo\Abp\AbpApplicationBase.cs:line 77 - at Volo.Abp.AbpApplicationWithExternalServiceProvider.Initialize(IServiceProvider serviceProvider) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.Core\Volo\Abp\AbpApplicationWithExternalServiceProvider.cs:line 44 - at Microsoft.AspNetCore.Builder.AbpApplicationBuilderExtensions.InitializeApplication(IApplicationBuilder app) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.AspNetCore\Microsoft\AspNetCore\Builder\AbpApplicationBuilderExtensions.cs:line 39 - at Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo.Startup.Configure(IApplicationBuilder app, ILoggerFactory loggerFactory) in D:\Github\volo\volo5\abp\modules\basic-theme\app\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo\Startup.cs:line 16 - at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor, Boolean wrapExceptions) - at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) - at Microsoft.AspNetCore.Hosting.ConfigureBuilder.Invoke(Object instance, IApplicationBuilder builder) - at Microsoft.AspNetCore.Hosting.ConfigureBuilder.<>c__DisplayClass4_0.b__0(IApplicationBuilder builder) - at Microsoft.AspNetCore.Hosting.GenericWebHostBuilder.<>c__DisplayClass15_0.b__1(IApplicationBuilder app) - at Microsoft.AspNetCore.Mvc.Filters.MiddlewareFilterBuilderStartupFilter.<>c__DisplayClass0_0.g__MiddlewareFilterBuilder|0(IApplicationBuilder builder) - at Microsoft.AspNetCore.HostFilteringStartupFilter.<>c__DisplayClass0_0.b__0(IApplicationBuilder app) - at Microsoft.AspNetCore.Hosting.GenericWebHostService.StartAsync(CancellationToken cancellationToken) - at Microsoft.Extensions.Hosting.Internal.Host.StartAsync(CancellationToken cancellationToken) - at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost host, CancellationToken token) - at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost host, CancellationToken token) - at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.Run(IHost host) - at Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo.Program.Main(String[] args) in D:\Github\volo\volo5\abp\modules\basic-theme\app\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo\Program.cs:line 23 -2021-06-01 16:58:25.730 +08:00 [INF] Starting web host. -2021-06-01 16:58:26.416 +08:00 [DBG] Hosting starting -2021-06-01 16:58:26.441 +08:00 [INF] User profile is available. Using 'C:\Users\maliming\AppData\Local\ASP.NET\DataProtection-Keys' as key repository and Windows DPAPI to encrypt keys at rest. -2021-06-01 16:58:26.457 +08:00 [DBG] Reading data from file 'C:\Users\maliming\AppData\Local\ASP.NET\DataProtection-Keys\key-00882981-b76a-49b5-97d9-cba33d1b2fac.xml'. -2021-06-01 16:58:26.462 +08:00 [DBG] Reading data from file 'C:\Users\maliming\AppData\Local\ASP.NET\DataProtection-Keys\key-16f92a94-47c6-46c3-8316-64624f1d6374.xml'. -2021-06-01 16:58:26.462 +08:00 [DBG] Reading data from file 'C:\Users\maliming\AppData\Local\ASP.NET\DataProtection-Keys\key-1c739fbe-ac37-4841-96ff-95f2e8e442b6.xml'. -2021-06-01 16:58:26.463 +08:00 [DBG] Reading data from file 'C:\Users\maliming\AppData\Local\ASP.NET\DataProtection-Keys\key-57b510d8-7687-4faf-9958-44ff9cb04f85.xml'. -2021-06-01 16:58:26.463 +08:00 [DBG] Reading data from file 'C:\Users\maliming\AppData\Local\ASP.NET\DataProtection-Keys\key-5c61addd-ecc0-4e6c-a356-8f093efb281c.xml'. -2021-06-01 16:58:26.463 +08:00 [DBG] Reading data from file 'C:\Users\maliming\AppData\Local\ASP.NET\DataProtection-Keys\key-62bbda5c-8775-40d5-9b98-5e1d890c023f.xml'. -2021-06-01 16:58:26.463 +08:00 [DBG] Reading data from file 'C:\Users\maliming\AppData\Local\ASP.NET\DataProtection-Keys\key-932dc0fd-9093-43a6-8a06-44006a08abea.xml'. -2021-06-01 16:58:26.463 +08:00 [DBG] Reading data from file 'C:\Users\maliming\AppData\Local\ASP.NET\DataProtection-Keys\key-98010c23-29bf-4f0d-8110-366f7c36adb0.xml'. -2021-06-01 16:58:26.464 +08:00 [DBG] Reading data from file 'C:\Users\maliming\AppData\Local\ASP.NET\DataProtection-Keys\key-9a3631e8-55e8-43d3-9d4b-5fd16c26d658.xml'. -2021-06-01 16:58:26.464 +08:00 [DBG] Reading data from file 'C:\Users\maliming\AppData\Local\ASP.NET\DataProtection-Keys\key-d7ba675e-ffb5-4484-b396-0913c3c07df2.xml'. -2021-06-01 16:58:26.470 +08:00 [DBG] Found key {00882981-b76a-49b5-97d9-cba33d1b2fac}. -2021-06-01 16:58:26.474 +08:00 [DBG] Found key {16f92a94-47c6-46c3-8316-64624f1d6374}. -2021-06-01 16:58:26.474 +08:00 [DBG] Found key {1c739fbe-ac37-4841-96ff-95f2e8e442b6}. -2021-06-01 16:58:26.474 +08:00 [DBG] Found key {57b510d8-7687-4faf-9958-44ff9cb04f85}. -2021-06-01 16:58:26.475 +08:00 [DBG] Found key {5c61addd-ecc0-4e6c-a356-8f093efb281c}. -2021-06-01 16:58:26.475 +08:00 [DBG] Found key {62bbda5c-8775-40d5-9b98-5e1d890c023f}. -2021-06-01 16:58:26.475 +08:00 [DBG] Found key {932dc0fd-9093-43a6-8a06-44006a08abea}. -2021-06-01 16:58:26.475 +08:00 [DBG] Found key {98010c23-29bf-4f0d-8110-366f7c36adb0}. -2021-06-01 16:58:26.475 +08:00 [DBG] Found key {9a3631e8-55e8-43d3-9d4b-5fd16c26d658}. -2021-06-01 16:58:26.475 +08:00 [DBG] Found key {d7ba675e-ffb5-4484-b396-0913c3c07df2}. -2021-06-01 16:58:26.485 +08:00 [DBG] Considering key {1c739fbe-ac37-4841-96ff-95f2e8e442b6} with expiration date 2021-08-29 01:43:16Z as default key. -2021-06-01 16:58:26.502 +08:00 [DBG] Forwarded activator type request from Microsoft.AspNetCore.DataProtection.XmlEncryption.DpapiXmlDecryptor, Microsoft.AspNetCore.DataProtection, Version=5.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60 to Microsoft.AspNetCore.DataProtection.XmlEncryption.DpapiXmlDecryptor, Microsoft.AspNetCore.DataProtection, Culture=neutral, PublicKeyToken=adb9793829ddae60 -2021-06-01 16:58:26.504 +08:00 [DBG] Decrypting secret element using Windows DPAPI. -2021-06-01 16:58:26.505 +08:00 [DBG] Forwarded activator type request from Microsoft.AspNetCore.DataProtection.AuthenticatedEncryption.ConfigurationModel.AuthenticatedEncryptorDescriptorDeserializer, Microsoft.AspNetCore.DataProtection, Version=5.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60 to Microsoft.AspNetCore.DataProtection.AuthenticatedEncryption.ConfigurationModel.AuthenticatedEncryptorDescriptorDeserializer, Microsoft.AspNetCore.DataProtection, Culture=neutral, PublicKeyToken=adb9793829ddae60 -2021-06-01 16:58:26.507 +08:00 [DBG] Opening CNG algorithm 'AES' from provider 'null' with chaining mode CBC. -2021-06-01 16:58:26.509 +08:00 [DBG] Opening CNG algorithm 'SHA256' from provider 'null' with HMAC. -2021-06-01 16:58:26.511 +08:00 [DBG] Using key {1c739fbe-ac37-4841-96ff-95f2e8e442b6} as the default key. -2021-06-01 16:58:26.512 +08:00 [DBG] Key ring with default key {1c739fbe-ac37-4841-96ff-95f2e8e442b6} was loaded during application startup. -2021-06-01 16:58:26.519 +08:00 [INF] Loaded ABP modules: -2021-06-01 16:58:26.519 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo.AbpAspNetCoreMvcUiThemeBasicDemoModule -2021-06-01 16:58:26.519 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.AbpAspNetCoreMvcUiBasicThemeModule -2021-06-01 16:58:26.519 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.AbpAspNetCoreMvcUiThemeSharedModule -2021-06-01 16:58:26.519 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.AbpAspNetCoreMvcUiBootstrapModule -2021-06-01 16:58:26.519 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.AbpAspNetCoreMvcUiModule -2021-06-01 16:58:26.519 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.AbpAspNetCoreMvcModule -2021-06-01 16:58:26.519 +08:00 [INF] - Volo.Abp.AspNetCore.AbpAspNetCoreModule -2021-06-01 16:58:26.519 +08:00 [INF] - Volo.Abp.Auditing.AbpAuditingModule -2021-06-01 16:58:26.519 +08:00 [INF] - Volo.Abp.Data.AbpDataModule -2021-06-01 16:58:26.519 +08:00 [INF] - Volo.Abp.ObjectExtending.AbpObjectExtendingModule -2021-06-01 16:58:26.519 +08:00 [INF] - Volo.Abp.Localization.AbpLocalizationAbstractionsModule -2021-06-01 16:58:26.519 +08:00 [INF] - Volo.Abp.Validation.AbpValidationAbstractionsModule -2021-06-01 16:58:26.519 +08:00 [INF] - Volo.Abp.Uow.AbpUnitOfWorkModule -2021-06-01 16:58:26.519 +08:00 [INF] - Volo.Abp.EventBus.Abstractions.AbpEventBusAbstractionsModule -2021-06-01 16:58:26.519 +08:00 [INF] - Volo.Abp.Json.AbpJsonModule -2021-06-01 16:58:26.519 +08:00 [INF] - Volo.Abp.Timing.AbpTimingModule -2021-06-01 16:58:26.519 +08:00 [INF] - Volo.Abp.Localization.AbpLocalizationModule -2021-06-01 16:58:26.519 +08:00 [INF] - Volo.Abp.VirtualFileSystem.AbpVirtualFileSystemModule -2021-06-01 16:58:26.519 +08:00 [INF] - Volo.Abp.Settings.AbpSettingsModule -2021-06-01 16:58:26.519 +08:00 [INF] - Volo.Abp.Security.AbpSecurityModule -2021-06-01 16:58:26.519 +08:00 [INF] - Volo.Abp.MultiTenancy.AbpMultiTenancyModule -2021-06-01 16:58:26.519 +08:00 [INF] - Volo.Abp.Threading.AbpThreadingModule -2021-06-01 16:58:26.519 +08:00 [INF] - Volo.Abp.Http.AbpHttpModule -2021-06-01 16:58:26.519 +08:00 [INF] - Volo.Abp.Http.AbpHttpAbstractionsModule -2021-06-01 16:58:26.519 +08:00 [INF] - Volo.Abp.Minify.AbpMinifyModule -2021-06-01 16:58:26.519 +08:00 [INF] - Volo.Abp.Authorization.AbpAuthorizationModule -2021-06-01 16:58:26.519 +08:00 [INF] - Volo.Abp.Authorization.AbpAuthorizationAbstractionsModule -2021-06-01 16:58:26.519 +08:00 [INF] - Volo.Abp.Validation.AbpValidationModule -2021-06-01 16:58:26.519 +08:00 [INF] - Volo.Abp.ExceptionHandling.AbpExceptionHandlingModule -2021-06-01 16:58:26.519 +08:00 [INF] - Volo.Abp.ApiVersioning.AbpApiVersioningAbstractionsModule -2021-06-01 16:58:26.519 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.AbpAspNetCoreMvcContractsModule -2021-06-01 16:58:26.519 +08:00 [INF] - Volo.Abp.Application.AbpDddApplicationContractsModule -2021-06-01 16:58:26.519 +08:00 [INF] - Volo.Abp.UI.Navigation.AbpUiNavigationModule -2021-06-01 16:58:26.519 +08:00 [INF] - Volo.Abp.UI.AbpUiModule -2021-06-01 16:58:26.519 +08:00 [INF] - Volo.Abp.GlobalFeatures.AbpGlobalFeaturesModule -2021-06-01 16:58:26.519 +08:00 [INF] - Volo.Abp.Application.AbpDddApplicationModule -2021-06-01 16:58:26.519 +08:00 [INF] - Volo.Abp.Domain.AbpDddDomainModule -2021-06-01 16:58:26.519 +08:00 [INF] - Volo.Abp.EventBus.AbpEventBusModule -2021-06-01 16:58:26.519 +08:00 [INF] - Volo.Abp.Guids.AbpGuidsModule -2021-06-01 16:58:26.519 +08:00 [INF] - Volo.Abp.ObjectMapping.AbpObjectMappingModule -2021-06-01 16:58:26.519 +08:00 [INF] - Volo.Abp.Specifications.AbpSpecificationsModule -2021-06-01 16:58:26.519 +08:00 [INF] - Volo.Abp.Features.AbpFeaturesModule -2021-06-01 16:58:26.519 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.Packages.AbpAspNetCoreMvcUiPackagesModule -2021-06-01 16:58:26.519 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.Bundling.AbpAspNetCoreMvcUiBundlingAbstractionsModule -2021-06-01 16:58:26.519 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.Widgets.AbpAspNetCoreMvcUiWidgetsModule -2021-06-01 16:58:26.519 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.Bundling.AbpAspNetCoreMvcUiBundlingModule -2021-06-01 16:58:26.519 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy.AbpAspNetCoreMvcUiMultiTenancyModule -2021-06-01 16:58:26.519 +08:00 [INF] - Volo.Abp.AspNetCore.MultiTenancy.AbpAspNetCoreMultiTenancyModule -2021-06-01 16:58:26.519 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo.AbpAspNetCoreMvcUiThemeSharedDemoModule -2021-06-01 16:58:26.519 +08:00 [INF] - Volo.Abp.Autofac.AbpAutofacModule -2021-06-01 16:58:26.519 +08:00 [INF] - Volo.Abp.Castle.AbpCastleCoreModule -2021-06-01 16:58:26.552 +08:00 [FTL] Application startup exception -Volo.Abp.AbpInitializationException: An error occurred during the initialize Volo.Abp.Modularity.OnApplicationInitializationModuleLifecycleContributor phase of the module Volo.Abp.AspNetCore.AbpAspNetCoreModule, Volo.Abp.AspNetCore, Version=4.4.0.0, Culture=neutral, PublicKeyToken=null: An exception was thrown while activating λ:Volo.Abp.AspNetCore.VirtualFileSystem.IWebContentFileProvider -> Volo.Abp.AspNetCore.VirtualFileSystem.WebContentFileProvider -> λ:Volo.Abp.VirtualFileSystem.IVirtualFileProvider -> Volo.Abp.VirtualFileSystem.VirtualFileProvider.. See the inner exception for details. - ---> Autofac.Core.DependencyResolutionException: An exception was thrown while activating λ:Volo.Abp.AspNetCore.VirtualFileSystem.IWebContentFileProvider -> Volo.Abp.AspNetCore.VirtualFileSystem.WebContentFileProvider -> λ:Volo.Abp.VirtualFileSystem.IVirtualFileProvider -> Volo.Abp.VirtualFileSystem.VirtualFileProvider. - ---> Autofac.Core.DependencyResolutionException: An exception was thrown while invoking the constructor 'Void .ctor(Microsoft.Extensions.Options.IOptions`1[Volo.Abp.VirtualFileSystem.AbpVirtualFileSystemOptions], Volo.Abp.VirtualFileSystem.IDynamicFileProvider)' on type 'VirtualFileProvider'. - ---> System.IO.DirectoryNotFoundException: D:\Github\volo\volo5\abp\modules\basic-theme\src\Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo\ - at Microsoft.Extensions.FileProviders.PhysicalFileProvider..ctor(String root, ExclusionFilters filters) - at Microsoft.Extensions.FileProviders.PhysicalFileProvider..ctor(String root) - at Volo.Abp.VirtualFileSystem.VirtualFileSetListExtensions.ReplaceEmbeddedByPhysical[T](VirtualFileSetList fileSets, String physicalPath) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.VirtualFileSystem\Volo\Abp\VirtualFileSystem\VirtualFileSetListExtensions.cs:line 86 - at Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo.AbpAspNetCoreMvcUiThemeBasicDemoModule.<>c__DisplayClass0_0.b__0(AbpVirtualFileSystemOptions options) in D:\Github\volo\volo5\abp\modules\basic-theme\app\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo\AbpAspNetCoreMvcUiThemeBasicDemoModule.cs:line 31 - at Microsoft.Extensions.Options.ConfigureNamedOptions`1.Configure(String name, TOptions options) - at Microsoft.Extensions.Options.OptionsFactory`1.Create(String name) - at Microsoft.Extensions.Options.OptionsManager`1.<>c__DisplayClass5_0.b__0() - at System.Lazy`1.ViaFactory(LazyThreadSafetyMode mode) - at System.Lazy`1.ExecutionAndPublication(LazyHelper executionAndPublication, Boolean useDefaultConstructor) - at System.Lazy`1.CreateValue() - at System.Lazy`1.get_Value() - at Microsoft.Extensions.Options.OptionsCache`1.GetOrAdd(String name, Func`1 createOptions) - at Microsoft.Extensions.Options.OptionsManager`1.Get(String name) - at Microsoft.Extensions.Options.OptionsManager`1.get_Value() - at Volo.Abp.VirtualFileSystem.VirtualFileProvider..ctor(IOptions`1 options, IDynamicFileProvider dynamicFileProvider) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.VirtualFileSystem\Volo\Abp\VirtualFileSystem\VirtualFileProvider.cs:line 19 - at lambda_method619(Closure , Object[] ) - at Autofac.Core.Activators.Reflection.BoundConstructor.Instantiate() - --- End of inner exception stack trace --- - at Autofac.Core.Activators.Reflection.BoundConstructor.Instantiate() - at Autofac.Core.Activators.Reflection.ReflectionActivator.ActivateInstance(IComponentContext context, IEnumerable`1 parameters) - at Autofac.Core.Activators.Reflection.ReflectionActivator.b__11_0(ResolveRequestContext ctxt, Action`1 next) - at Autofac.Core.Resolving.Middleware.DelegateMiddleware.Execute(ResolveRequestContext context, Action`1 next) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Core.Resolving.Middleware.DisposalTrackingMiddleware.Execute(ResolveRequestContext context, Action`1 next) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Builder.RegistrationBuilder`3.<>c__DisplayClass41_0.b__0(ResolveRequestContext ctxt, Action`1 next) - at Autofac.Core.Resolving.Middleware.DelegateMiddleware.Execute(ResolveRequestContext context, Action`1 next) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Core.Resolving.Middleware.ActivatorErrorHandlingMiddleware.Execute(ResolveRequestContext context, Action`1 next) - --- End of inner exception stack trace --- - at Autofac.Core.Resolving.Middleware.ActivatorErrorHandlingMiddleware.Execute(ResolveRequestContext context, Action`1 next) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Core.Pipeline.ResolvePipeline.Invoke(ResolveRequestContext ctxt) - at Autofac.Core.Resolving.Middleware.RegistrationPipelineInvokeMiddleware.Execute(ResolveRequestContext context, Action`1 next) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Core.Resolving.Middleware.SharingMiddleware.<>c__DisplayClass5_0.b__0() - at Autofac.Core.Lifetime.LifetimeScope.CreateSharedInstance(Guid id, Func`1 creator) - at Autofac.Core.Lifetime.LifetimeScope.CreateSharedInstance(Guid primaryId, Nullable`1 qualifyingId, Func`1 creator) - at Autofac.Core.Resolving.Middleware.SharingMiddleware.Execute(ResolveRequestContext context, Action`1 next) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Core.Resolving.Middleware.CircularDependencyDetectorMiddleware.Execute(ResolveRequestContext context, Action`1 next) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Core.Pipeline.ResolvePipeline.Invoke(ResolveRequestContext ctxt) - at Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, ResolveRequest request) - at Autofac.Core.Resolving.ResolveOperation.ExecuteOperation(ResolveRequest request) - at Autofac.Core.Resolving.ResolveOperation.Execute(ResolveRequest request) - at Autofac.Core.Lifetime.LifetimeScope.ResolveComponent(ResolveRequest request) - at Autofac.ResolutionExtensions.TryResolveService(IComponentContext context, Service service, IEnumerable`1 parameters, Object& instance) - at Autofac.ResolutionExtensions.ResolveService(IComponentContext context, Service service, IEnumerable`1 parameters) - at Autofac.ResolutionExtensions.Resolve(IComponentContext context, Type serviceType, IEnumerable`1 parameters) - at Autofac.ResolutionExtensions.Resolve(IComponentContext context, Type serviceType) - at Autofac.Extensions.DependencyInjection.AutofacServiceProvider.GetRequiredService(Type serviceType) - at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType) - at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider provider) - at Volo.Abp.AspNetCore.AbpAspNetCoreModule.OnApplicationInitialization(ApplicationInitializationContext context) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.AspNetCore\Volo\Abp\AspNetCore\AbpAspNetCoreModule.cs:line 61 - at Volo.Abp.Modularity.OnApplicationInitializationModuleLifecycleContributor.Initialize(ApplicationInitializationContext context, IAbpModule module) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.Core\Volo\Abp\Modularity\DefaultModuleLifecycleContributor.cs:line 7 - at Volo.Abp.Modularity.ModuleManager.InitializeModules(ApplicationInitializationContext context) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.Core\Volo\Abp\Modularity\ModuleManager.cs:line 41 - --- End of inner exception stack trace --- - at Volo.Abp.Modularity.ModuleManager.InitializeModules(ApplicationInitializationContext context) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.Core\Volo\Abp\Modularity\ModuleManager.cs:line 45 - at Volo.Abp.AbpApplicationBase.InitializeModules() in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.Core\Volo\Abp\AbpApplicationBase.cs:line 77 - at Volo.Abp.AbpApplicationWithExternalServiceProvider.Initialize(IServiceProvider serviceProvider) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.Core\Volo\Abp\AbpApplicationWithExternalServiceProvider.cs:line 44 - at Microsoft.AspNetCore.Builder.AbpApplicationBuilderExtensions.InitializeApplication(IApplicationBuilder app) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.AspNetCore\Microsoft\AspNetCore\Builder\AbpApplicationBuilderExtensions.cs:line 39 - at Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo.Startup.Configure(IApplicationBuilder app, ILoggerFactory loggerFactory) in D:\Github\volo\volo5\abp\modules\basic-theme\app\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo\Startup.cs:line 16 - at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor, Boolean wrapExceptions) - at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) - at Microsoft.AspNetCore.Hosting.ConfigureBuilder.Invoke(Object instance, IApplicationBuilder builder) - at Microsoft.AspNetCore.Hosting.ConfigureBuilder.<>c__DisplayClass4_0.b__0(IApplicationBuilder builder) - at Microsoft.AspNetCore.Hosting.GenericWebHostBuilder.<>c__DisplayClass15_0.b__1(IApplicationBuilder app) - at Microsoft.AspNetCore.Mvc.Filters.MiddlewareFilterBuilderStartupFilter.<>c__DisplayClass0_0.g__MiddlewareFilterBuilder|0(IApplicationBuilder builder) - at Microsoft.AspNetCore.HostFilteringStartupFilter.<>c__DisplayClass0_0.b__0(IApplicationBuilder app) - at Microsoft.AspNetCore.Hosting.GenericWebHostService.StartAsync(CancellationToken cancellationToken) - at Microsoft.Extensions.Hosting.Internal.Host.StartAsync(CancellationToken cancellationToken) - at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost host, CancellationToken token) - at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost host, CancellationToken token) - at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.Run(IHost host) - at Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo.Program.Main(String[] args) in D:\Github\volo\volo5\abp\modules\basic-theme\app\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo\Program.cs:line 23 -2021-06-01 16:58:26.561 +08:00 [FTL] Host terminated unexpectedly! -Volo.Abp.AbpInitializationException: An error occurred during the initialize Volo.Abp.Modularity.OnApplicationInitializationModuleLifecycleContributor phase of the module Volo.Abp.AspNetCore.AbpAspNetCoreModule, Volo.Abp.AspNetCore, Version=4.4.0.0, Culture=neutral, PublicKeyToken=null: An exception was thrown while activating λ:Volo.Abp.AspNetCore.VirtualFileSystem.IWebContentFileProvider -> Volo.Abp.AspNetCore.VirtualFileSystem.WebContentFileProvider -> λ:Volo.Abp.VirtualFileSystem.IVirtualFileProvider -> Volo.Abp.VirtualFileSystem.VirtualFileProvider.. See the inner exception for details. - ---> Autofac.Core.DependencyResolutionException: An exception was thrown while activating λ:Volo.Abp.AspNetCore.VirtualFileSystem.IWebContentFileProvider -> Volo.Abp.AspNetCore.VirtualFileSystem.WebContentFileProvider -> λ:Volo.Abp.VirtualFileSystem.IVirtualFileProvider -> Volo.Abp.VirtualFileSystem.VirtualFileProvider. - ---> Autofac.Core.DependencyResolutionException: An exception was thrown while invoking the constructor 'Void .ctor(Microsoft.Extensions.Options.IOptions`1[Volo.Abp.VirtualFileSystem.AbpVirtualFileSystemOptions], Volo.Abp.VirtualFileSystem.IDynamicFileProvider)' on type 'VirtualFileProvider'. - ---> System.IO.DirectoryNotFoundException: D:\Github\volo\volo5\abp\modules\basic-theme\src\Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo\ - at Microsoft.Extensions.FileProviders.PhysicalFileProvider..ctor(String root, ExclusionFilters filters) - at Microsoft.Extensions.FileProviders.PhysicalFileProvider..ctor(String root) - at Volo.Abp.VirtualFileSystem.VirtualFileSetListExtensions.ReplaceEmbeddedByPhysical[T](VirtualFileSetList fileSets, String physicalPath) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.VirtualFileSystem\Volo\Abp\VirtualFileSystem\VirtualFileSetListExtensions.cs:line 86 - at Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo.AbpAspNetCoreMvcUiThemeBasicDemoModule.<>c__DisplayClass0_0.b__0(AbpVirtualFileSystemOptions options) in D:\Github\volo\volo5\abp\modules\basic-theme\app\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo\AbpAspNetCoreMvcUiThemeBasicDemoModule.cs:line 31 - at Microsoft.Extensions.Options.ConfigureNamedOptions`1.Configure(String name, TOptions options) - at Microsoft.Extensions.Options.OptionsFactory`1.Create(String name) - at Microsoft.Extensions.Options.OptionsManager`1.<>c__DisplayClass5_0.b__0() - at System.Lazy`1.ViaFactory(LazyThreadSafetyMode mode) - at System.Lazy`1.ExecutionAndPublication(LazyHelper executionAndPublication, Boolean useDefaultConstructor) - at System.Lazy`1.CreateValue() - at System.Lazy`1.get_Value() - at Microsoft.Extensions.Options.OptionsCache`1.GetOrAdd(String name, Func`1 createOptions) - at Microsoft.Extensions.Options.OptionsManager`1.Get(String name) - at Microsoft.Extensions.Options.OptionsManager`1.get_Value() - at Volo.Abp.VirtualFileSystem.VirtualFileProvider..ctor(IOptions`1 options, IDynamicFileProvider dynamicFileProvider) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.VirtualFileSystem\Volo\Abp\VirtualFileSystem\VirtualFileProvider.cs:line 19 - at lambda_method619(Closure , Object[] ) - at Autofac.Core.Activators.Reflection.BoundConstructor.Instantiate() - --- End of inner exception stack trace --- - at Autofac.Core.Activators.Reflection.BoundConstructor.Instantiate() - at Autofac.Core.Activators.Reflection.ReflectionActivator.ActivateInstance(IComponentContext context, IEnumerable`1 parameters) - at Autofac.Core.Activators.Reflection.ReflectionActivator.b__11_0(ResolveRequestContext ctxt, Action`1 next) - at Autofac.Core.Resolving.Middleware.DelegateMiddleware.Execute(ResolveRequestContext context, Action`1 next) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Core.Resolving.Middleware.DisposalTrackingMiddleware.Execute(ResolveRequestContext context, Action`1 next) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Builder.RegistrationBuilder`3.<>c__DisplayClass41_0.b__0(ResolveRequestContext ctxt, Action`1 next) - at Autofac.Core.Resolving.Middleware.DelegateMiddleware.Execute(ResolveRequestContext context, Action`1 next) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Core.Resolving.Middleware.ActivatorErrorHandlingMiddleware.Execute(ResolveRequestContext context, Action`1 next) - --- End of inner exception stack trace --- - at Autofac.Core.Resolving.Middleware.ActivatorErrorHandlingMiddleware.Execute(ResolveRequestContext context, Action`1 next) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Core.Pipeline.ResolvePipeline.Invoke(ResolveRequestContext ctxt) - at Autofac.Core.Resolving.Middleware.RegistrationPipelineInvokeMiddleware.Execute(ResolveRequestContext context, Action`1 next) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Core.Resolving.Middleware.SharingMiddleware.<>c__DisplayClass5_0.b__0() - at Autofac.Core.Lifetime.LifetimeScope.CreateSharedInstance(Guid id, Func`1 creator) - at Autofac.Core.Lifetime.LifetimeScope.CreateSharedInstance(Guid primaryId, Nullable`1 qualifyingId, Func`1 creator) - at Autofac.Core.Resolving.Middleware.SharingMiddleware.Execute(ResolveRequestContext context, Action`1 next) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Core.Resolving.Middleware.CircularDependencyDetectorMiddleware.Execute(ResolveRequestContext context, Action`1 next) - at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) - at Autofac.Core.Pipeline.ResolvePipeline.Invoke(ResolveRequestContext ctxt) - at Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, ResolveRequest request) - at Autofac.Core.Resolving.ResolveOperation.ExecuteOperation(ResolveRequest request) - at Autofac.Core.Resolving.ResolveOperation.Execute(ResolveRequest request) - at Autofac.Core.Lifetime.LifetimeScope.ResolveComponent(ResolveRequest request) - at Autofac.ResolutionExtensions.TryResolveService(IComponentContext context, Service service, IEnumerable`1 parameters, Object& instance) - at Autofac.ResolutionExtensions.ResolveService(IComponentContext context, Service service, IEnumerable`1 parameters) - at Autofac.ResolutionExtensions.Resolve(IComponentContext context, Type serviceType, IEnumerable`1 parameters) - at Autofac.ResolutionExtensions.Resolve(IComponentContext context, Type serviceType) - at Autofac.Extensions.DependencyInjection.AutofacServiceProvider.GetRequiredService(Type serviceType) - at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType) - at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider provider) - at Volo.Abp.AspNetCore.AbpAspNetCoreModule.OnApplicationInitialization(ApplicationInitializationContext context) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.AspNetCore\Volo\Abp\AspNetCore\AbpAspNetCoreModule.cs:line 61 - at Volo.Abp.Modularity.OnApplicationInitializationModuleLifecycleContributor.Initialize(ApplicationInitializationContext context, IAbpModule module) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.Core\Volo\Abp\Modularity\DefaultModuleLifecycleContributor.cs:line 7 - at Volo.Abp.Modularity.ModuleManager.InitializeModules(ApplicationInitializationContext context) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.Core\Volo\Abp\Modularity\ModuleManager.cs:line 41 - --- End of inner exception stack trace --- - at Volo.Abp.Modularity.ModuleManager.InitializeModules(ApplicationInitializationContext context) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.Core\Volo\Abp\Modularity\ModuleManager.cs:line 45 - at Volo.Abp.AbpApplicationBase.InitializeModules() in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.Core\Volo\Abp\AbpApplicationBase.cs:line 77 - at Volo.Abp.AbpApplicationWithExternalServiceProvider.Initialize(IServiceProvider serviceProvider) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.Core\Volo\Abp\AbpApplicationWithExternalServiceProvider.cs:line 44 - at Microsoft.AspNetCore.Builder.AbpApplicationBuilderExtensions.InitializeApplication(IApplicationBuilder app) in D:\Github\volo\volo5\abp\framework\src\Volo.Abp.AspNetCore\Microsoft\AspNetCore\Builder\AbpApplicationBuilderExtensions.cs:line 39 - at Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo.Startup.Configure(IApplicationBuilder app, ILoggerFactory loggerFactory) in D:\Github\volo\volo5\abp\modules\basic-theme\app\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo\Startup.cs:line 16 - at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor, Boolean wrapExceptions) - at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) - at Microsoft.AspNetCore.Hosting.ConfigureBuilder.Invoke(Object instance, IApplicationBuilder builder) - at Microsoft.AspNetCore.Hosting.ConfigureBuilder.<>c__DisplayClass4_0.b__0(IApplicationBuilder builder) - at Microsoft.AspNetCore.Hosting.GenericWebHostBuilder.<>c__DisplayClass15_0.b__1(IApplicationBuilder app) - at Microsoft.AspNetCore.Mvc.Filters.MiddlewareFilterBuilderStartupFilter.<>c__DisplayClass0_0.g__MiddlewareFilterBuilder|0(IApplicationBuilder builder) - at Microsoft.AspNetCore.HostFilteringStartupFilter.<>c__DisplayClass0_0.b__0(IApplicationBuilder app) - at Microsoft.AspNetCore.Hosting.GenericWebHostService.StartAsync(CancellationToken cancellationToken) - at Microsoft.Extensions.Hosting.Internal.Host.StartAsync(CancellationToken cancellationToken) - at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost host, CancellationToken token) - at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost host, CancellationToken token) - at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.Run(IHost host) - at Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo.Program.Main(String[] args) in D:\Github\volo\volo5\abp\modules\basic-theme\app\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo\Program.cs:line 23 -2021-06-01 16:59:42.514 +08:00 [INF] Starting web host. -2021-06-01 16:59:43.181 +08:00 [DBG] Hosting starting -2021-06-01 16:59:43.206 +08:00 [INF] User profile is available. Using 'C:\Users\maliming\AppData\Local\ASP.NET\DataProtection-Keys' as key repository and Windows DPAPI to encrypt keys at rest. -2021-06-01 16:59:43.223 +08:00 [DBG] Reading data from file 'C:\Users\maliming\AppData\Local\ASP.NET\DataProtection-Keys\key-00882981-b76a-49b5-97d9-cba33d1b2fac.xml'. -2021-06-01 16:59:43.228 +08:00 [DBG] Reading data from file 'C:\Users\maliming\AppData\Local\ASP.NET\DataProtection-Keys\key-16f92a94-47c6-46c3-8316-64624f1d6374.xml'. -2021-06-01 16:59:43.229 +08:00 [DBG] Reading data from file 'C:\Users\maliming\AppData\Local\ASP.NET\DataProtection-Keys\key-1c739fbe-ac37-4841-96ff-95f2e8e442b6.xml'. -2021-06-01 16:59:43.229 +08:00 [DBG] Reading data from file 'C:\Users\maliming\AppData\Local\ASP.NET\DataProtection-Keys\key-57b510d8-7687-4faf-9958-44ff9cb04f85.xml'. -2021-06-01 16:59:43.229 +08:00 [DBG] Reading data from file 'C:\Users\maliming\AppData\Local\ASP.NET\DataProtection-Keys\key-5c61addd-ecc0-4e6c-a356-8f093efb281c.xml'. -2021-06-01 16:59:43.229 +08:00 [DBG] Reading data from file 'C:\Users\maliming\AppData\Local\ASP.NET\DataProtection-Keys\key-62bbda5c-8775-40d5-9b98-5e1d890c023f.xml'. -2021-06-01 16:59:43.229 +08:00 [DBG] Reading data from file 'C:\Users\maliming\AppData\Local\ASP.NET\DataProtection-Keys\key-932dc0fd-9093-43a6-8a06-44006a08abea.xml'. -2021-06-01 16:59:43.229 +08:00 [DBG] Reading data from file 'C:\Users\maliming\AppData\Local\ASP.NET\DataProtection-Keys\key-98010c23-29bf-4f0d-8110-366f7c36adb0.xml'. -2021-06-01 16:59:43.229 +08:00 [DBG] Reading data from file 'C:\Users\maliming\AppData\Local\ASP.NET\DataProtection-Keys\key-9a3631e8-55e8-43d3-9d4b-5fd16c26d658.xml'. -2021-06-01 16:59:43.230 +08:00 [DBG] Reading data from file 'C:\Users\maliming\AppData\Local\ASP.NET\DataProtection-Keys\key-d7ba675e-ffb5-4484-b396-0913c3c07df2.xml'. -2021-06-01 16:59:43.234 +08:00 [DBG] Found key {00882981-b76a-49b5-97d9-cba33d1b2fac}. -2021-06-01 16:59:43.238 +08:00 [DBG] Found key {16f92a94-47c6-46c3-8316-64624f1d6374}. -2021-06-01 16:59:43.238 +08:00 [DBG] Found key {1c739fbe-ac37-4841-96ff-95f2e8e442b6}. -2021-06-01 16:59:43.238 +08:00 [DBG] Found key {57b510d8-7687-4faf-9958-44ff9cb04f85}. -2021-06-01 16:59:43.239 +08:00 [DBG] Found key {5c61addd-ecc0-4e6c-a356-8f093efb281c}. -2021-06-01 16:59:43.239 +08:00 [DBG] Found key {62bbda5c-8775-40d5-9b98-5e1d890c023f}. -2021-06-01 16:59:43.239 +08:00 [DBG] Found key {932dc0fd-9093-43a6-8a06-44006a08abea}. -2021-06-01 16:59:43.239 +08:00 [DBG] Found key {98010c23-29bf-4f0d-8110-366f7c36adb0}. -2021-06-01 16:59:43.239 +08:00 [DBG] Found key {9a3631e8-55e8-43d3-9d4b-5fd16c26d658}. -2021-06-01 16:59:43.239 +08:00 [DBG] Found key {d7ba675e-ffb5-4484-b396-0913c3c07df2}. -2021-06-01 16:59:43.248 +08:00 [DBG] Considering key {1c739fbe-ac37-4841-96ff-95f2e8e442b6} with expiration date 2021-08-29 01:43:16Z as default key. -2021-06-01 16:59:43.261 +08:00 [DBG] Forwarded activator type request from Microsoft.AspNetCore.DataProtection.XmlEncryption.DpapiXmlDecryptor, Microsoft.AspNetCore.DataProtection, Version=5.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60 to Microsoft.AspNetCore.DataProtection.XmlEncryption.DpapiXmlDecryptor, Microsoft.AspNetCore.DataProtection, Culture=neutral, PublicKeyToken=adb9793829ddae60 -2021-06-01 16:59:43.263 +08:00 [DBG] Decrypting secret element using Windows DPAPI. -2021-06-01 16:59:43.264 +08:00 [DBG] Forwarded activator type request from Microsoft.AspNetCore.DataProtection.AuthenticatedEncryption.ConfigurationModel.AuthenticatedEncryptorDescriptorDeserializer, Microsoft.AspNetCore.DataProtection, Version=5.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60 to Microsoft.AspNetCore.DataProtection.AuthenticatedEncryption.ConfigurationModel.AuthenticatedEncryptorDescriptorDeserializer, Microsoft.AspNetCore.DataProtection, Culture=neutral, PublicKeyToken=adb9793829ddae60 -2021-06-01 16:59:43.267 +08:00 [DBG] Opening CNG algorithm 'AES' from provider 'null' with chaining mode CBC. -2021-06-01 16:59:43.268 +08:00 [DBG] Opening CNG algorithm 'SHA256' from provider 'null' with HMAC. -2021-06-01 16:59:43.270 +08:00 [DBG] Using key {1c739fbe-ac37-4841-96ff-95f2e8e442b6} as the default key. -2021-06-01 16:59:43.271 +08:00 [DBG] Key ring with default key {1c739fbe-ac37-4841-96ff-95f2e8e442b6} was loaded during application startup. -2021-06-01 16:59:43.277 +08:00 [INF] Loaded ABP modules: -2021-06-01 16:59:43.277 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo.AbpAspNetCoreMvcUiThemeBasicDemoModule -2021-06-01 16:59:43.277 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.AbpAspNetCoreMvcUiBasicThemeModule -2021-06-01 16:59:43.277 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.AbpAspNetCoreMvcUiThemeSharedModule -2021-06-01 16:59:43.277 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.AbpAspNetCoreMvcUiBootstrapModule -2021-06-01 16:59:43.277 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.AbpAspNetCoreMvcUiModule -2021-06-01 16:59:43.277 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.AbpAspNetCoreMvcModule -2021-06-01 16:59:43.277 +08:00 [INF] - Volo.Abp.AspNetCore.AbpAspNetCoreModule -2021-06-01 16:59:43.277 +08:00 [INF] - Volo.Abp.Auditing.AbpAuditingModule -2021-06-01 16:59:43.277 +08:00 [INF] - Volo.Abp.Data.AbpDataModule -2021-06-01 16:59:43.277 +08:00 [INF] - Volo.Abp.ObjectExtending.AbpObjectExtendingModule -2021-06-01 16:59:43.277 +08:00 [INF] - Volo.Abp.Localization.AbpLocalizationAbstractionsModule -2021-06-01 16:59:43.277 +08:00 [INF] - Volo.Abp.Validation.AbpValidationAbstractionsModule -2021-06-01 16:59:43.277 +08:00 [INF] - Volo.Abp.Uow.AbpUnitOfWorkModule -2021-06-01 16:59:43.277 +08:00 [INF] - Volo.Abp.EventBus.Abstractions.AbpEventBusAbstractionsModule -2021-06-01 16:59:43.277 +08:00 [INF] - Volo.Abp.Json.AbpJsonModule -2021-06-01 16:59:43.277 +08:00 [INF] - Volo.Abp.Timing.AbpTimingModule -2021-06-01 16:59:43.277 +08:00 [INF] - Volo.Abp.Localization.AbpLocalizationModule -2021-06-01 16:59:43.277 +08:00 [INF] - Volo.Abp.VirtualFileSystem.AbpVirtualFileSystemModule -2021-06-01 16:59:43.277 +08:00 [INF] - Volo.Abp.Settings.AbpSettingsModule -2021-06-01 16:59:43.277 +08:00 [INF] - Volo.Abp.Security.AbpSecurityModule -2021-06-01 16:59:43.277 +08:00 [INF] - Volo.Abp.MultiTenancy.AbpMultiTenancyModule -2021-06-01 16:59:43.277 +08:00 [INF] - Volo.Abp.Threading.AbpThreadingModule -2021-06-01 16:59:43.277 +08:00 [INF] - Volo.Abp.Http.AbpHttpModule -2021-06-01 16:59:43.278 +08:00 [INF] - Volo.Abp.Http.AbpHttpAbstractionsModule -2021-06-01 16:59:43.278 +08:00 [INF] - Volo.Abp.Minify.AbpMinifyModule -2021-06-01 16:59:43.278 +08:00 [INF] - Volo.Abp.Authorization.AbpAuthorizationModule -2021-06-01 16:59:43.278 +08:00 [INF] - Volo.Abp.Authorization.AbpAuthorizationAbstractionsModule -2021-06-01 16:59:43.278 +08:00 [INF] - Volo.Abp.Validation.AbpValidationModule -2021-06-01 16:59:43.278 +08:00 [INF] - Volo.Abp.ExceptionHandling.AbpExceptionHandlingModule -2021-06-01 16:59:43.278 +08:00 [INF] - Volo.Abp.ApiVersioning.AbpApiVersioningAbstractionsModule -2021-06-01 16:59:43.278 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.AbpAspNetCoreMvcContractsModule -2021-06-01 16:59:43.278 +08:00 [INF] - Volo.Abp.Application.AbpDddApplicationContractsModule -2021-06-01 16:59:43.278 +08:00 [INF] - Volo.Abp.UI.Navigation.AbpUiNavigationModule -2021-06-01 16:59:43.278 +08:00 [INF] - Volo.Abp.UI.AbpUiModule -2021-06-01 16:59:43.278 +08:00 [INF] - Volo.Abp.GlobalFeatures.AbpGlobalFeaturesModule -2021-06-01 16:59:43.278 +08:00 [INF] - Volo.Abp.Application.AbpDddApplicationModule -2021-06-01 16:59:43.278 +08:00 [INF] - Volo.Abp.Domain.AbpDddDomainModule -2021-06-01 16:59:43.278 +08:00 [INF] - Volo.Abp.EventBus.AbpEventBusModule -2021-06-01 16:59:43.278 +08:00 [INF] - Volo.Abp.Guids.AbpGuidsModule -2021-06-01 16:59:43.278 +08:00 [INF] - Volo.Abp.ObjectMapping.AbpObjectMappingModule -2021-06-01 16:59:43.278 +08:00 [INF] - Volo.Abp.Specifications.AbpSpecificationsModule -2021-06-01 16:59:43.278 +08:00 [INF] - Volo.Abp.Features.AbpFeaturesModule -2021-06-01 16:59:43.278 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.Packages.AbpAspNetCoreMvcUiPackagesModule -2021-06-01 16:59:43.278 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.Bundling.AbpAspNetCoreMvcUiBundlingAbstractionsModule -2021-06-01 16:59:43.278 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.Widgets.AbpAspNetCoreMvcUiWidgetsModule -2021-06-01 16:59:43.278 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.Bundling.AbpAspNetCoreMvcUiBundlingModule -2021-06-01 16:59:43.278 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy.AbpAspNetCoreMvcUiMultiTenancyModule -2021-06-01 16:59:43.278 +08:00 [INF] - Volo.Abp.AspNetCore.MultiTenancy.AbpAspNetCoreMultiTenancyModule -2021-06-01 16:59:43.278 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo.AbpAspNetCoreMvcUiThemeSharedDemoModule -2021-06-01 16:59:43.278 +08:00 [INF] - Volo.Abp.Autofac.AbpAutofacModule -2021-06-01 16:59:43.278 +08:00 [INF] - Volo.Abp.Castle.AbpCastleCoreModule -2021-06-01 16:59:43.797 +08:00 [INF] Initialized all ABP modules. -2021-06-01 16:59:43.828 +08:00 [INF] Now listening on: http://localhost:5000 -2021-06-01 16:59:43.828 +08:00 [DBG] Loaded hosting startup assembly Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo -2021-06-01 16:59:43.828 +08:00 [INF] Application started. Press Ctrl+C to shut down. -2021-06-01 16:59:43.828 +08:00 [INF] Hosting environment: Development -2021-06-01 16:59:43.828 +08:00 [INF] Content root path: D:\Github\volo\volo5\abp\modules\basic-theme\app\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo -2021-06-01 16:59:43.828 +08:00 [DBG] Hosting started -2021-06-01 16:59:43.900 +08:00 [DBG] Connection id "0HM94RECLNFIB" received FIN. -2021-06-01 16:59:43.909 +08:00 [DBG] Connection id "0HM94RECLNFIB" accepted. -2021-06-01 16:59:43.909 +08:00 [DBG] Connection id "0HM94RECLNFIB" started. -2021-06-01 16:59:43.914 +08:00 [DBG] Connection id "0HM94RECLNFIB" sending FIN because: "The client closed the connection." -2021-06-01 16:59:43.916 +08:00 [DBG] Connection id "0HM94RECLNFIB" disconnecting. -2021-06-01 16:59:43.918 +08:00 [DBG] Connection id "0HM94RECLNFIB" stopped. -2021-06-01 16:59:44.116 +08:00 [DBG] Connection id "0HM94RECLNFIC" accepted. -2021-06-01 16:59:44.116 +08:00 [DBG] Connection id "0HM94RECLNFIC" started. -2021-06-01 16:59:44.116 +08:00 [DBG] Connection id "0HM94RECLNFID" accepted. -2021-06-01 16:59:44.116 +08:00 [DBG] Connection id "0HM94RECLNFID" started. -2021-06-01 16:59:44.154 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/ - - -2021-06-01 16:59:44.155 +08:00 [DBG] Wildcard detected, all requests with hosts will be allowed. -2021-06-01 16:59:44.156 +08:00 [DBG] The request path / does not match a supported file type -2021-06-01 16:59:44.189 +08:00 [DBG] 1 candidate(s) found for the request path '/' -2021-06-01 16:59:44.192 +08:00 [DBG] Endpoint 'Page: /Index' with route pattern '' is valid for the request path '/' -2021-06-01 16:59:44.196 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/Components/Alerts/Index.cshtml'. -2021-06-01 16:59:44.196 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/Components/Badges/Index.cshtml'. -2021-06-01 16:59:44.196 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/Components/Borders/Index.cshtml'. -2021-06-01 16:59:44.196 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/Components/Breadcrumbs/Index.cshtml'. -2021-06-01 16:59:44.196 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/Components/ButtonGroups/Index.cshtml'. -2021-06-01 16:59:44.196 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/Components/Buttons/Index.cshtml'. -2021-06-01 16:59:44.196 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/Components/Cards/Index.cshtml'. -2021-06-01 16:59:44.196 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/Components/Carousel/Index.cshtml'. -2021-06-01 16:59:44.196 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/Components/Collapse/Index.cshtml'. -2021-06-01 16:59:44.196 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/Components/Dropdowns/Index.cshtml'. -2021-06-01 16:59:44.196 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/Components/DynamicForms/Index.cshtml'. -2021-06-01 16:59:44.196 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/Components/FormElements/Index.cshtml'. -2021-06-01 16:59:44.196 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/Components/Grids/Index.cshtml'. -2021-06-01 16:59:44.196 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/Components/Index.cshtml'. -2021-06-01 16:59:44.196 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/Components/ListGroups/Index.cshtml'. -2021-06-01 16:59:44.196 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/Components/Modals/Index.cshtml'. -2021-06-01 16:59:44.196 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/Components/Navbars/Index.cshtml'. -2021-06-01 16:59:44.196 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/Components/Navs/Index.cshtml'. -2021-06-01 16:59:44.196 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/Components/Paginator/Index.cshtml'. -2021-06-01 16:59:44.196 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/Components/Popovers/Index.cshtml'. -2021-06-01 16:59:44.196 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/Components/ProgressBars/Index.cshtml'. -2021-06-01 16:59:44.196 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/Components/Tables/Index.cshtml'. -2021-06-01 16:59:44.196 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/Components/Tabs/Index.cshtml'. -2021-06-01 16:59:44.196 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/Components/Tooltips/Index.cshtml'. -2021-06-01 16:59:44.196 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/Index.cshtml'. -2021-06-01 16:59:44.196 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/_ViewImports.cshtml'. -2021-06-01 16:59:44.196 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/_ViewImports.cshtml'. -2021-06-01 16:59:44.196 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Themes/Basic/Components/Brand/Default.cshtml'. -2021-06-01 16:59:44.196 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Themes/Basic/Components/MainNavbar/Default.cshtml'. -2021-06-01 16:59:44.196 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Themes/Basic/Components/Menu/Default.cshtml'. -2021-06-01 16:59:44.196 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Themes/Basic/Components/Menu/_MenuItem.cshtml'. -2021-06-01 16:59:44.196 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Themes/Basic/Components/PageAlerts/Default.cshtml'. -2021-06-01 16:59:44.196 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Themes/Basic/Components/Toolbar/Default.cshtml'. -2021-06-01 16:59:44.196 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Themes/Basic/Components/Toolbar/LanguageSwitch/Default.cshtml'. -2021-06-01 16:59:44.196 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Themes/Basic/Components/Toolbar/UserMenu/Default.cshtml'. -2021-06-01 16:59:44.196 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Themes/Basic/Layouts/Account.cshtml'. -2021-06-01 16:59:44.196 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Themes/Basic/Layouts/Application.cshtml'. -2021-06-01 16:59:44.196 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Themes/Basic/Layouts/Empty.cshtml'. -2021-06-01 16:59:44.196 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Themes/Basic/_ViewImports.cshtml'. -2021-06-01 16:59:44.196 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Views/_ViewImports.cshtml'. -2021-06-01 16:59:44.196 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/Abp/MultiTenancy/TenantSwitchModal.cshtml'. -2021-06-01 16:59:44.196 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/Abp/MultiTenancy/_ViewImports.cshtml'. -2021-06-01 16:59:44.196 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Areas/_ViewStart.cshtml'. -2021-06-01 16:59:44.196 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/Account/_ViewStart.cshtml'. -2021-06-01 16:59:44.196 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/Shared/Components/AbpApplicationPath/Default.cshtml'. -2021-06-01 16:59:44.196 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/Shared/Components/AbpPageSearchBox/Default.cshtml'. -2021-06-01 16:59:44.196 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/Shared/Components/AbpPageSearchBox/_ViewImports.cshtml'. -2021-06-01 16:59:44.196 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/Shared/Components/AbpPageToolbar/Button/Default.cshtml'. -2021-06-01 16:59:44.196 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/Shared/Components/AbpPageToolbar/Default.cshtml'. -2021-06-01 16:59:44.196 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/Shared/Components/AbpPageToolbar/_ViewImports.cshtml'. -2021-06-01 16:59:44.196 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/_ViewStart.cshtml'. -2021-06-01 16:59:44.196 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Views/Error/Default.cshtml'. -2021-06-01 16:59:44.196 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Views/_ViewStart.cshtml'. -2021-06-01 16:59:44.196 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Volo/Abp/AspNetCore/Mvc/UI/Widgets/Components/WidgetScripts/Default.cshtml'. -2021-06-01 16:59:44.196 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Volo/Abp/AspNetCore/Mvc/UI/Widgets/Components/WidgetStyles/Default.cshtml'. -2021-06-01 16:59:44.196 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Volo/Abp/AspNetCore/Mvc/UI/Widgets/Components/_ViewImports.cshtml'. -2021-06-01 16:59:44.196 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Volo/Abp/AspNetCore/Mvc/UI/Components/LayoutHook/Default.cshtml'. -2021-06-01 16:59:44.210 +08:00 [DBG] Request matched endpoint '/Index' -2021-06-01 16:59:44.210 +08:00 [INF] Executing endpoint '/Index' -2021-06-01 16:59:44.221 +08:00 [DBG] Registered model binder providers, in the following order: ["Volo.Abp.AspNetCore.Mvc.ModelBinding.AbpDateTimeModelBinderProvider","Volo.Abp.AspNetCore.Mvc.ModelBinding.AbpExtraPropertiesDictionaryModelBinderProvider","Volo.Abp.AspNetCore.Mvc.ContentFormatters.AbpRemoteStreamContentModelBinderProvider","Microsoft.AspNetCore.Mvc.ModelBinding.Binders.BinderTypeModelBinderProvider","Microsoft.AspNetCore.Mvc.ModelBinding.Binders.ServicesModelBinderProvider","Microsoft.AspNetCore.Mvc.ModelBinding.Binders.BodyModelBinderProvider","Microsoft.AspNetCore.Mvc.ModelBinding.Binders.HeaderModelBinderProvider","Microsoft.AspNetCore.Mvc.ModelBinding.Binders.FloatingPointTypeModelBinderProvider","Microsoft.AspNetCore.Mvc.ModelBinding.Binders.EnumTypeModelBinderProvider","Microsoft.AspNetCore.Mvc.ModelBinding.Binders.DateTimeModelBinderProvider","Microsoft.AspNetCore.Mvc.ModelBinding.Binders.SimpleTypeModelBinderProvider","Microsoft.AspNetCore.Mvc.ModelBinding.Binders.CancellationTokenModelBinderProvider","Microsoft.AspNetCore.Mvc.ModelBinding.Binders.ByteArrayModelBinderProvider","Microsoft.AspNetCore.Mvc.ModelBinding.Binders.FormFileModelBinderProvider","Microsoft.AspNetCore.Mvc.ModelBinding.Binders.FormCollectionModelBinderProvider","Microsoft.AspNetCore.Mvc.ModelBinding.Binders.KeyValuePairModelBinderProvider","Microsoft.AspNetCore.Mvc.ModelBinding.Binders.DictionaryModelBinderProvider","Microsoft.AspNetCore.Mvc.ModelBinding.Binders.ArrayModelBinderProvider","Microsoft.AspNetCore.Mvc.ModelBinding.Binders.CollectionModelBinderProvider","Microsoft.AspNetCore.Mvc.ModelBinding.Binders.ComplexObjectModelBinderProvider"] -2021-06-01 16:59:44.260 +08:00 [INF] Route matched with {page = "/Index", area = "", action = "", controller = ""}. Executing page /Index -2021-06-01 16:59:44.261 +08:00 [DBG] Execution plan of authorization filters (in the following order): ["Volo.Abp.AspNetCore.Mvc.AntiForgery.AbpAutoValidateAntiforgeryTokenAuthorizationFilter","Microsoft.AspNetCore.Mvc.ViewFeatures.Filters.AutoValidateAntiforgeryTokenAuthorizationFilter"] -2021-06-01 16:59:44.261 +08:00 [DBG] Execution plan of resource filters (in the following order): ["Microsoft.AspNetCore.Mvc.ViewFeatures.Filters.SaveTempDataFilter"] -2021-06-01 16:59:44.261 +08:00 [DBG] Execution plan of action filters (in the following order): ["Microsoft.AspNetCore.Mvc.ModelBinding.UnsupportedContentTypeFilter (Order: -3000)","Volo.Abp.AspNetCore.Mvc.GlobalFeatures.GlobalFeatureActionFilter","Volo.Abp.AspNetCore.Mvc.Auditing.AbpAuditActionFilter","Volo.Abp.AspNetCore.Mvc.Response.AbpNoContentActionFilter","Volo.Abp.AspNetCore.Mvc.Features.AbpFeatureActionFilter","Volo.Abp.AspNetCore.Mvc.Validation.AbpValidationActionFilter","Volo.Abp.AspNetCore.Mvc.Uow.AbpUowActionFilter"] -2021-06-01 16:59:44.261 +08:00 [DBG] Execution plan of exception filters (in the following order): ["Volo.Abp.AspNetCore.Mvc.ExceptionHandling.AbpExceptionFilter"] -2021-06-01 16:59:44.261 +08:00 [DBG] Execution plan of result filters (in the following order): ["Microsoft.AspNetCore.Mvc.ViewFeatures.Filters.SaveTempDataFilter"] -2021-06-01 16:59:44.262 +08:00 [INF] Skipping the execution of current filter as its not the most effective filter implementing the policy Microsoft.AspNetCore.Mvc.ViewFeatures.IAntiforgeryPolicy -2021-06-01 16:59:44.264 +08:00 [DBG] Executing page model factory for page AspNetCore.Pages_Index (Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo.Views) -2021-06-01 16:59:44.264 +08:00 [DBG] Executed page model factory for page AspNetCore.Pages_Index (Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo.Views) -2021-06-01 16:59:44.307 +08:00 [INF] Executing handler method Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo.Pages.IndexModel.OnGet - ModelState is "Valid" -2021-06-01 16:59:44.307 +08:00 [INF] Executed handler method OnGet, returned result . -2021-06-01 16:59:44.310 +08:00 [INF] Executing an implicit handler method - ModelState is "Valid" -2021-06-01 16:59:44.310 +08:00 [INF] Executed an implicit handler method, returned result Microsoft.AspNetCore.Mvc.RazorPages.PageResult. -2021-06-01 16:59:44.438 +08:00 [DBG] Executing view component Volo.Abp.AspNetCore.Mvc.UI.Components.LayoutHook.LayoutHookViewComponent with arguments (["Header.First","Application"]). -2021-06-01 16:59:44.443 +08:00 [DBG] Executed view component Volo.Abp.AspNetCore.Mvc.UI.Components.LayoutHook.LayoutHookViewComponent in 0.7006ms and returned Microsoft.AspNetCore.Mvc.ViewComponents.ViewViewComponentResult -2021-06-01 16:59:44.491 +08:00 [DBG] Added bundle 'Basic.Global' to the page in 13.07 ms. -2021-06-01 16:59:44.492 +08:00 [DBG] Executing view component Volo.Abp.AspNetCore.Mvc.UI.Widgets.Components.WidgetStyles.WidgetStylesViewComponent with arguments ([]). -2021-06-01 16:59:44.493 +08:00 [DBG] Executed view component Volo.Abp.AspNetCore.Mvc.UI.Widgets.Components.WidgetStyles.WidgetStylesViewComponent in 1.0895ms and returned Microsoft.AspNetCore.Mvc.ViewComponents.ViewViewComponentResult -2021-06-01 16:59:44.498 +08:00 [DBG] Executing view component Volo.Abp.AspNetCore.Mvc.UI.Components.LayoutHook.LayoutHookViewComponent with arguments (["Header.Last","Application"]). -2021-06-01 16:59:44.498 +08:00 [DBG] Executed view component Volo.Abp.AspNetCore.Mvc.UI.Components.LayoutHook.LayoutHookViewComponent in 0.008ms and returned Microsoft.AspNetCore.Mvc.ViewComponents.ViewViewComponentResult -2021-06-01 16:59:44.501 +08:00 [DBG] Executing view component Volo.Abp.AspNetCore.Mvc.UI.Components.LayoutHook.LayoutHookViewComponent with arguments (["Body.First","Application"]). -2021-06-01 16:59:44.501 +08:00 [DBG] Executed view component Volo.Abp.AspNetCore.Mvc.UI.Components.LayoutHook.LayoutHookViewComponent in 0.0066ms and returned Microsoft.AspNetCore.Mvc.ViewComponents.ViewViewComponentResult -2021-06-01 16:59:44.502 +08:00 [DBG] Executing view component Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Themes.Basic.Components.MainNavbar.MainNavbarViewComponent with arguments ([]). -2021-06-01 16:59:44.502 +08:00 [DBG] Executed view component Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Themes.Basic.Components.MainNavbar.MainNavbarViewComponent in 0.1375ms and returned Microsoft.AspNetCore.Mvc.ViewComponents.ViewViewComponentResult -2021-06-01 16:59:44.506 +08:00 [DBG] Executing view component Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Themes.Basic.Components.Brand.MainNavbarBrandViewComponent with arguments ([]). -2021-06-01 16:59:44.506 +08:00 [DBG] Executed view component Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Themes.Basic.Components.Brand.MainNavbarBrandViewComponent in 0.1416ms and returned Microsoft.AspNetCore.Mvc.ViewComponents.ViewViewComponentResult -2021-06-01 16:59:44.524 +08:00 [DBG] Executing view component Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Themes.Basic.Components.Menu.MainNavbarMenuViewComponent with arguments ([]). -2021-06-01 16:59:44.570 +08:00 [DBG] Executed view component Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Themes.Basic.Components.Menu.MainNavbarMenuViewComponent in 45.6548ms and returned Microsoft.AspNetCore.Mvc.ViewComponents.ViewViewComponentResult -2021-06-01 16:59:44.588 +08:00 [DBG] Executing view component Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Themes.Basic.Components.Toolbar.MainNavbarToolbarViewComponent with arguments ([]). -2021-06-01 16:59:44.596 +08:00 [DBG] Executed view component Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Themes.Basic.Components.Toolbar.MainNavbarToolbarViewComponent in 7.6763ms and returned Microsoft.AspNetCore.Mvc.ViewComponents.ViewViewComponentResult -2021-06-01 16:59:44.603 +08:00 [DBG] Executing view component Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Themes.Basic.Components.PageAlerts.PageAlertsViewComponent with arguments ([""]). -2021-06-01 16:59:44.604 +08:00 [DBG] Executed view component Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Themes.Basic.Components.PageAlerts.PageAlertsViewComponent in 0.4479ms and returned Microsoft.AspNetCore.Mvc.ViewComponents.ViewViewComponentResult -2021-06-01 16:59:44.608 +08:00 [DBG] Executing view component Volo.Abp.AspNetCore.Mvc.UI.Components.LayoutHook.LayoutHookViewComponent with arguments (["PageContent.First","Application"]). -2021-06-01 16:59:44.608 +08:00 [DBG] Executed view component Volo.Abp.AspNetCore.Mvc.UI.Components.LayoutHook.LayoutHookViewComponent in 0.0102ms and returned Microsoft.AspNetCore.Mvc.ViewComponents.ViewViewComponentResult -2021-06-01 16:59:44.608 +08:00 [DBG] Executing view component Volo.Abp.AspNetCore.Mvc.UI.Components.LayoutHook.LayoutHookViewComponent with arguments (["PageContent.Last","Application"]). -2021-06-01 16:59:44.608 +08:00 [DBG] Executed view component Volo.Abp.AspNetCore.Mvc.UI.Components.LayoutHook.LayoutHookViewComponent in 0.0056ms and returned Microsoft.AspNetCore.Mvc.ViewComponents.ViewViewComponentResult -2021-06-01 16:59:44.618 +08:00 [DBG] Added bundle 'Basic.Global' to the page in 7.72 ms. -2021-06-01 16:59:44.620 +08:00 [DBG] Executing view component Volo.Abp.AspNetCore.Mvc.UI.Widgets.Components.WidgetScripts.WidgetScriptsViewComponent with arguments ([]). -2021-06-01 16:59:44.620 +08:00 [DBG] Executed view component Volo.Abp.AspNetCore.Mvc.UI.Widgets.Components.WidgetScripts.WidgetScriptsViewComponent in 0.3236ms and returned Microsoft.AspNetCore.Mvc.ViewComponents.ViewViewComponentResult -2021-06-01 16:59:44.624 +08:00 [DBG] Executing view component Volo.Abp.AspNetCore.Mvc.UI.Components.LayoutHook.LayoutHookViewComponent with arguments (["Body.Last","Application"]). -2021-06-01 16:59:44.624 +08:00 [DBG] Executed view component Volo.Abp.AspNetCore.Mvc.UI.Components.LayoutHook.LayoutHookViewComponent in 0.0086ms and returned Microsoft.AspNetCore.Mvc.ViewComponents.ViewViewComponentResult -2021-06-01 16:59:44.634 +08:00 [INF] Executed page /Index in 368.9355ms -2021-06-01 16:59:44.634 +08:00 [INF] Executed endpoint '/Index' -2021-06-01 16:59:44.634 +08:00 [DBG] Connection id "0HM94RECLNFIC" completed keep alive response. -2021-06-01 16:59:44.640 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/ - - - 200 - text/html;+charset=utf-8 486.4731ms -2021-06-01 16:59:44.682 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/libs/abp/core/abp.css?_v=637543906070000000 - - -2021-06-01 16:59:44.686 +08:00 [DBG] Connection id "0HM94RECLNFIE" accepted. -2021-06-01 16:59:44.686 +08:00 [DBG] Connection id "0HM94RECLNFIE" started. -2021-06-01 16:59:44.687 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/libs/bootstrap/css/bootstrap.css?_v=637543906070000000 - - -2021-06-01 16:59:44.687 +08:00 [DBG] Connection id "0HM94RECLNFIF" accepted. -2021-06-01 16:59:44.687 +08:00 [DBG] Connection id "0HM94RECLNFIF" started. -2021-06-01 16:59:44.687 +08:00 [DBG] Connection id "0HM94RECLNFIG" accepted. -2021-06-01 16:59:44.687 +08:00 [DBG] Connection id "0HM94RECLNFIG" started. -2021-06-01 16:59:44.687 +08:00 [DBG] Connection id "0HM94RECLNFIH" accepted. -2021-06-01 16:59:44.688 +08:00 [DBG] Connection id "0HM94RECLNFIH" started. -2021-06-01 16:59:44.688 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/libs/@fortawesome/fontawesome-free/css/all.css?_v=637543906070000000 - - -2021-06-01 16:59:44.689 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/libs/toastr/toastr.min.css?_v=637543906070000000 - - -2021-06-01 16:59:44.689 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/libs/select2/css/select2.min.css?_v=637543906070000000 - - -2021-06-01 16:59:44.689 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/libs/@fortawesome/fontawesome-free/css/v4-shims.css?_v=637543906070000000 - - -2021-06-01 16:59:44.690 +08:00 [INF] Sending file. Request path: '/libs/select2/css/select2.min.css'. Physical path: 'D:\Github\volo\volo5\abp\modules\basic-theme\app\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo\wwwroot\libs\select2\css\select2.min.css' -2021-06-01 16:59:44.690 +08:00 [DBG] Connection id "0HM94RECLNFIH" completed keep alive response. -2021-06-01 16:59:44.690 +08:00 [INF] Sending file. Request path: '/libs/abp/core/abp.css'. Physical path: 'D:\Github\volo\volo5\abp\modules\basic-theme\app\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo\wwwroot\libs\abp\core\abp.css' -2021-06-01 16:59:44.690 +08:00 [INF] Sending file. Request path: '/libs/toastr/toastr.min.css'. Physical path: 'D:\Github\volo\volo5\abp\modules\basic-theme\app\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo\wwwroot\libs\toastr\toastr.min.css' -2021-06-01 16:59:44.690 +08:00 [DBG] Connection id "0HM94RECLNFIC" completed keep alive response. -2021-06-01 16:59:44.690 +08:00 [DBG] Connection id "0HM94RECLNFIG" completed keep alive response. -2021-06-01 16:59:44.690 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/libs/abp/core/abp.css?_v=637543906070000000 - - - 200 1331 text/css 8.0071ms -2021-06-01 16:59:44.690 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/libs/toastr/toastr.min.css?_v=637543906070000000 - - - 200 6454 text/css 1.3430ms -2021-06-01 16:59:44.690 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/libs/select2/css/select2.min.css?_v=637543906070000000 - - - 200 14967 text/css 1.1877ms -2021-06-01 16:59:44.696 +08:00 [INF] Sending file. Request path: '/libs/bootstrap/css/bootstrap.css'. Physical path: 'D:\Github\volo\volo5\abp\modules\basic-theme\app\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo\wwwroot\libs\bootstrap\css\bootstrap.css' -2021-06-01 16:59:44.696 +08:00 [INF] Sending file. Request path: '/libs/@fortawesome/fontawesome-free/css/all.css'. Physical path: 'D:\Github\volo\volo5\abp\modules\basic-theme\app\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo\wwwroot\libs\@fortawesome\fontawesome-free\css\all.css' -2021-06-01 16:59:44.696 +08:00 [INF] Sending file. Request path: '/libs/@fortawesome/fontawesome-free/css/v4-shims.css'. Physical path: 'D:\Github\volo\volo5\abp\modules\basic-theme\app\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo\wwwroot\libs\@fortawesome\fontawesome-free\css\v4-shims.css' -2021-06-01 16:59:44.697 +08:00 [DBG] Connection id "0HM94RECLNFIE" completed keep alive response. -2021-06-01 16:59:44.697 +08:00 [DBG] Connection id "0HM94RECLNFID" completed keep alive response. -2021-06-01 16:59:44.697 +08:00 [DBG] Connection id "0HM94RECLNFIF" completed keep alive response. -2021-06-01 16:59:44.697 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/libs/bootstrap/css/bootstrap.css?_v=637543906070000000 - - - 200 209709 text/css 10.3143ms -2021-06-01 16:59:44.697 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/libs/@fortawesome/fontawesome-free/css/all.css?_v=637543906070000000 - - - 200 77703 text/css 8.8328ms -2021-06-01 16:59:44.697 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/libs/@fortawesome/fontawesome-free/css/v4-shims.css?_v=637543906070000000 - - - 200 43484 text/css 7.9251ms -2021-06-01 16:59:44.704 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/libs/malihu-custom-scrollbar-plugin/jquery.mCustomScrollbar.css?_v=637543906070000000 - - -2021-06-01 16:59:44.705 +08:00 [INF] Sending file. Request path: '/libs/malihu-custom-scrollbar-plugin/jquery.mCustomScrollbar.css'. Physical path: 'D:\Github\volo\volo5\abp\modules\basic-theme\app\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo\wwwroot\libs\malihu-custom-scrollbar-plugin\jquery.mCustomScrollbar.css' -2021-06-01 16:59:44.705 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/libs/datatables.net-bs4/css/dataTables.bootstrap4.css?_v=637543906070000000 - - -2021-06-01 16:59:44.706 +08:00 [DBG] Connection id "0HM94RECLNFIC" completed keep alive response. -2021-06-01 16:59:44.706 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/libs/malihu-custom-scrollbar-plugin/jquery.mCustomScrollbar.css?_v=637543906070000000 - - - 200 54850 text/css 1.3867ms -2021-06-01 16:59:44.706 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/libs/bootstrap-datepicker/bootstrap-datepicker.min.css?_v=637543906070000000 - - -2021-06-01 16:59:44.706 +08:00 [INF] Sending file. Request path: '/libs/datatables.net-bs4/css/dataTables.bootstrap4.css'. Physical path: 'D:\Github\volo\volo5\abp\modules\basic-theme\app\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo\wwwroot\libs\datatables.net-bs4\css\dataTables.bootstrap4.css' -2021-06-01 16:59:44.706 +08:00 [DBG] Connection id "0HM94RECLNFIF" completed keep alive response. -2021-06-01 16:59:44.706 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/libs/datatables.net-bs4/css/dataTables.bootstrap4.css?_v=637543906070000000 - - - 200 6206 text/css 0.7286ms -2021-06-01 16:59:44.706 +08:00 [INF] Sending file. Request path: '/libs/bootstrap-datepicker/bootstrap-datepicker.min.css'. Physical path: 'D:\Github\volo\volo5\abp\modules\basic-theme\app\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo\wwwroot\libs\bootstrap-datepicker\bootstrap-datepicker.min.css' -2021-06-01 16:59:44.706 +08:00 [DBG] Connection id "0HM94RECLNFIG" completed keep alive response. -2021-06-01 16:59:44.706 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/libs/bootstrap-datepicker/bootstrap-datepicker.min.css?_v=637543906070000000 - - - 200 15737 text/css 0.4869ms -2021-06-01 16:59:44.707 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/libs/abp/aspnetcore-mvc-ui-theme-shared/datatables/datatables-styles.css?_v=637581344238055428 - - -2021-06-01 16:59:44.707 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/demo/styles/main.css?_v=637543906070000000 - - -2021-06-01 16:59:44.707 +08:00 [INF] Sending file. Request path: '/demo/styles/main.css'. Physical path: 'D:\Github\volo\volo5\abp\modules\basic-theme\app\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo\wwwroot\demo\styles\main.css' -2021-06-01 16:59:44.707 +08:00 [DBG] Connection id "0HM94RECLNFIH" completed keep alive response. -2021-06-01 16:59:44.707 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/demo/styles/main.css?_v=637543906070000000 - - - 200 572 text/css 0.6064ms -2021-06-01 16:59:44.708 +08:00 [INF] Sending file. Request path: '/libs/abp/aspnetcore-mvc-ui-theme-shared/datatables/datatables-styles.css'. Physical path: 'N/A' -2021-06-01 16:59:44.708 +08:00 [DBG] Connection id "0HM94RECLNFIE" completed keep alive response. -2021-06-01 16:59:44.708 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/libs/abp/aspnetcore-mvc-ui-theme-shared/datatables/datatables-styles.css?_v=637581344238055428 - - - 200 467 text/css 1.5342ms -2021-06-01 16:59:44.716 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/themes/basic/layout.css?_v=637581347776351428 - - -2021-06-01 16:59:44.716 +08:00 [INF] Sending file. Request path: '/themes/basic/layout.css'. Physical path: 'N/A' -2021-06-01 16:59:44.716 +08:00 [DBG] Connection id "0HM94RECLNFID" completed keep alive response. -2021-06-01 16:59:44.716 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/themes/basic/layout.css?_v=637581347776351428 - - - 200 1735 text/css 0.5265ms -2021-06-01 16:59:44.721 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/libs/abp/utils/abp-utils.umd.min.js?_v=637543906070000000 - - -2021-06-01 16:59:44.721 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/libs/abp/core/abp.js?_v=637543906070000000 - - -2021-06-01 16:59:44.721 +08:00 [INF] Sending file. Request path: '/libs/abp/utils/abp-utils.umd.min.js'. Physical path: 'D:\Github\volo\volo5\abp\modules\basic-theme\app\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo\wwwroot\libs\abp\utils\abp-utils.umd.min.js' -2021-06-01 16:59:44.721 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/libs/abp/jquery/abp.jquery.js?_v=637543906070000000 - - -2021-06-01 16:59:44.721 +08:00 [DBG] Connection id "0HM94RECLNFIC" completed keep alive response. -2021-06-01 16:59:44.721 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/libs/jquery/jquery.js?_v=637543906070000000 - - -2021-06-01 16:59:44.721 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/libs/abp/utils/abp-utils.umd.min.js?_v=637543906070000000 - - - 200 8257 application/javascript 0.6245ms -2021-06-01 16:59:44.721 +08:00 [INF] Sending file. Request path: '/libs/abp/jquery/abp.jquery.js'. Physical path: 'D:\Github\volo\volo5\abp\modules\basic-theme\app\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo\wwwroot\libs\abp\jquery\abp.jquery.js' -2021-06-01 16:59:44.721 +08:00 [DBG] Connection id "0HM94RECLNFIF" completed keep alive response. -2021-06-01 16:59:44.721 +08:00 [INF] Sending file. Request path: '/libs/abp/core/abp.js'. Physical path: 'D:\Github\volo\volo5\abp\modules\basic-theme\app\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo\wwwroot\libs\abp\core\abp.js' -2021-06-01 16:59:44.722 +08:00 [DBG] Connection id "0HM94RECLNFIH" completed keep alive response. -2021-06-01 16:59:44.722 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/libs/abp/jquery/abp.jquery.js?_v=637543906070000000 - - - 200 13191 application/javascript 0.4493ms -2021-06-01 16:59:44.722 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/libs/abp/core/abp.js?_v=637543906070000000 - - - 200 23271 application/javascript 0.6623ms -2021-06-01 16:59:44.722 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/libs/bootstrap/js/bootstrap.bundle.js?_v=637543906070000000 - - -2021-06-01 16:59:44.723 +08:00 [INF] Sending file. Request path: '/libs/bootstrap/js/bootstrap.bundle.js'. Physical path: 'D:\Github\volo\volo5\abp\modules\basic-theme\app\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo\wwwroot\libs\bootstrap\js\bootstrap.bundle.js' -2021-06-01 16:59:44.723 +08:00 [DBG] Connection id "0HM94RECLNFIG" completed keep alive response. -2021-06-01 16:59:44.724 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/libs/bootstrap/js/bootstrap.bundle.js?_v=637543906070000000 - - - 200 243909 application/javascript 1.4505ms -2021-06-01 16:59:44.727 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/libs/lodash/lodash.min.js?_v=637543906070000000 - - -2021-06-01 16:59:44.729 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/libs/jquery-validation/jquery.validate.js?_v=637543906070000000 - - -2021-06-01 16:59:44.730 +08:00 [INF] Sending file. Request path: '/libs/lodash/lodash.min.js'. Physical path: 'D:\Github\volo\volo5\abp\modules\basic-theme\app\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo\wwwroot\libs\lodash\lodash.min.js' -2021-06-01 16:59:44.730 +08:00 [DBG] Connection id "0HM94RECLNFID" completed keep alive response. -2021-06-01 16:59:44.730 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/libs/lodash/lodash.min.js?_v=637543906070000000 - - - 200 73397 application/javascript 3.3133ms -2021-06-01 16:59:44.730 +08:00 [INF] Sending file. Request path: '/libs/jquery/jquery.js'. Physical path: 'D:\Github\volo\volo5\abp\modules\basic-theme\app\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo\wwwroot\libs\jquery\jquery.js' -2021-06-01 16:59:44.730 +08:00 [DBG] Connection id "0HM94RECLNFIE" completed keep alive response. -2021-06-01 16:59:44.730 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/libs/jquery/jquery.js?_v=637543906070000000 - - - 200 282115 application/javascript 9.3333ms -2021-06-01 16:59:44.731 +08:00 [INF] Sending file. Request path: '/libs/jquery-validation/jquery.validate.js'. Physical path: 'D:\Github\volo\volo5\abp\modules\basic-theme\app\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo\wwwroot\libs\jquery-validation\jquery.validate.js' -2021-06-01 16:59:44.731 +08:00 [DBG] Connection id "0HM94RECLNFIH" completed keep alive response. -2021-06-01 16:59:44.731 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/libs/jquery-validation/jquery.validate.js?_v=637543906070000000 - - - 200 48696 application/javascript 1.7908ms -2021-06-01 16:59:44.731 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/libs/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js?_v=637543906070000000 - - -2021-06-01 16:59:44.731 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/libs/jquery-form/jquery.form.min.js?_v=637543906070000000 - - -2021-06-01 16:59:44.732 +08:00 [INF] Sending file. Request path: '/libs/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js'. Physical path: 'D:\Github\volo\volo5\abp\modules\basic-theme\app\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo\wwwroot\libs\jquery-validation-unobtrusive\jquery.validate.unobtrusive.js' -2021-06-01 16:59:44.732 +08:00 [DBG] Connection id "0HM94RECLNFIC" completed keep alive response. -2021-06-01 16:59:44.732 +08:00 [INF] Sending file. Request path: '/libs/jquery-form/jquery.form.min.js'. Physical path: 'D:\Github\volo\volo5\abp\modules\basic-theme\app\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo\wwwroot\libs\jquery-form\jquery.form.min.js' -2021-06-01 16:59:44.732 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/libs/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js?_v=637543906070000000 - - - 200 19798 application/javascript 0.9676ms -2021-06-01 16:59:44.732 +08:00 [DBG] Connection id "0HM94RECLNFIF" completed keep alive response. -2021-06-01 16:59:44.732 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/libs/jquery-form/jquery.form.min.js?_v=637543906070000000 - - - 200 17117 application/javascript 0.8753ms -2021-06-01 16:59:44.741 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/libs/select2/js/select2.min.js?_v=637543906070000000 - - -2021-06-01 16:59:44.743 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/libs/select2/js/select2-bootstrap-modal-patch.js?_v=637543906070000000 - - -2021-06-01 16:59:44.744 +08:00 [INF] Sending file. Request path: '/libs/select2/js/select2.min.js'. Physical path: 'D:\Github\volo\volo5\abp\modules\basic-theme\app\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo\wwwroot\libs\select2\js\select2.min.js' -2021-06-01 16:59:44.744 +08:00 [DBG] Connection id "0HM94RECLNFIH" completed keep alive response. -2021-06-01 16:59:44.744 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/libs/select2/js/select2.min.js?_v=637543906070000000 - - - 200 70852 application/javascript 3.7431ms -2021-06-01 16:59:44.744 +08:00 [INF] Sending file. Request path: '/libs/select2/js/select2-bootstrap-modal-patch.js'. Physical path: 'D:\Github\volo\volo5\abp\modules\basic-theme\app\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo\wwwroot\libs\select2\js\select2-bootstrap-modal-patch.js' -2021-06-01 16:59:44.745 +08:00 [DBG] Connection id "0HM94RECLNFID" completed keep alive response. -2021-06-01 16:59:44.745 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/libs/select2/js/select2-bootstrap-modal-patch.js?_v=637543906070000000 - - - 200 130 application/javascript 2.0735ms -2021-06-01 16:59:44.745 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/libs/datatables.net/js/jquery.dataTables.js?_v=637543906070000000 - - -2021-06-01 16:59:44.748 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/libs/datatables.net-bs4/js/dataTables.bootstrap4.js?_v=637543906070000000 - - -2021-06-01 16:59:44.748 +08:00 [INF] Sending file. Request path: '/libs/datatables.net-bs4/js/dataTables.bootstrap4.js'. Physical path: 'D:\Github\volo\volo5\abp\modules\basic-theme\app\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo\wwwroot\libs\datatables.net-bs4\js\dataTables.bootstrap4.js' -2021-06-01 16:59:44.748 +08:00 [DBG] Connection id "0HM94RECLNFIF" completed keep alive response. -2021-06-01 16:59:44.748 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/libs/datatables.net-bs4/js/dataTables.bootstrap4.js?_v=637543906070000000 - - - 200 4886 application/javascript 0.7070ms -2021-06-01 16:59:44.750 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/libs/sweetalert/sweetalert.min.js?_v=637543906070000000 - - -2021-06-01 16:59:44.751 +08:00 [INF] Sending file. Request path: '/libs/sweetalert/sweetalert.min.js'. Physical path: 'D:\Github\volo\volo5\abp\modules\basic-theme\app\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo\wwwroot\libs\sweetalert\sweetalert.min.js' -2021-06-01 16:59:44.751 +08:00 [DBG] Connection id "0HM94RECLNFID" completed keep alive response. -2021-06-01 16:59:44.751 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/libs/sweetalert/sweetalert.min.js?_v=637543906070000000 - - - 200 40808 application/javascript 1.0615ms -2021-06-01 16:59:44.751 +08:00 [INF] Sending file. Request path: '/libs/datatables.net/js/jquery.dataTables.js'. Physical path: 'D:\Github\volo\volo5\abp\modules\basic-theme\app\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo\wwwroot\libs\datatables.net\js\jquery.dataTables.js' -2021-06-01 16:59:44.751 +08:00 [DBG] Connection id "0HM94RECLNFIC" completed keep alive response. -2021-06-01 16:59:44.751 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/libs/datatables.net/js/jquery.dataTables.js?_v=637543906070000000 - - - 200 464600 application/javascript 6.0564ms -2021-06-01 16:59:44.753 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/libs/toastr/toastr.min.js?_v=637543906070000000 - - -2021-06-01 16:59:44.754 +08:00 [INF] Sending file. Request path: '/libs/toastr/toastr.min.js'. Physical path: 'D:\Github\volo\volo5\abp\modules\basic-theme\app\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo\wwwroot\libs\toastr\toastr.min.js' -2021-06-01 16:59:44.754 +08:00 [DBG] Connection id "0HM94RECLNFIG" completed keep alive response. -2021-06-01 16:59:44.754 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/libs/toastr/toastr.min.js?_v=637543906070000000 - - - 200 5253 application/javascript 1.0496ms -2021-06-01 16:59:44.756 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/libs/malihu-custom-scrollbar-plugin/jquery.mCustomScrollbar.concat.min.js?_v=637543906070000000 - - -2021-06-01 16:59:44.756 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/libs/luxon/luxon.min.js?_v=637543906070000000 - - -2021-06-01 16:59:44.756 +08:00 [INF] Sending file. Request path: '/libs/malihu-custom-scrollbar-plugin/jquery.mCustomScrollbar.concat.min.js'. Physical path: 'D:\Github\volo\volo5\abp\modules\basic-theme\app\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo\wwwroot\libs\malihu-custom-scrollbar-plugin\jquery.mCustomScrollbar.concat.min.js' -2021-06-01 16:59:44.756 +08:00 [DBG] Connection id "0HM94RECLNFIH" completed keep alive response. -2021-06-01 16:59:44.756 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/libs/malihu-custom-scrollbar-plugin/jquery.mCustomScrollbar.concat.min.js?_v=637543906070000000 - - - 200 45483 application/javascript 0.7728ms -2021-06-01 16:59:44.756 +08:00 [INF] Sending file. Request path: '/libs/luxon/luxon.min.js'. Physical path: 'D:\Github\volo\volo5\abp\modules\basic-theme\app\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo\wwwroot\libs\luxon\luxon.min.js' -2021-06-01 16:59:44.756 +08:00 [DBG] Connection id "0HM94RECLNFIF" completed keep alive response. -2021-06-01 16:59:44.756 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/libs/luxon/luxon.min.js?_v=637543906070000000 - - - 200 70063 application/javascript 0.9127ms -2021-06-01 16:59:44.757 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/libs/abp/luxon/abp.luxon.js?_v=637543906070000000 - - -2021-06-01 16:59:44.758 +08:00 [INF] Sending file. Request path: '/libs/abp/luxon/abp.luxon.js'. Physical path: 'D:\Github\volo\volo5\abp\modules\basic-theme\app\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo\wwwroot\libs\abp\luxon\abp.luxon.js' -2021-06-01 16:59:44.758 +08:00 [DBG] Connection id "0HM94RECLNFID" completed keep alive response. -2021-06-01 16:59:44.758 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/libs/abp/luxon/abp.luxon.js?_v=637543906070000000 - - - 200 1361 application/javascript 0.7110ms -2021-06-01 16:59:44.766 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/libs/timeago/jquery.timeago.js?_v=637543906070000000 - - -2021-06-01 16:59:44.766 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/libs/bootstrap-datepicker/bootstrap-datepicker.min.js?_v=637543906070000000 - - -2021-06-01 16:59:44.766 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/libs/abp/aspnetcore-mvc-ui-theme-shared/ui-extensions.js?_v=637581344238055428 - - -2021-06-01 16:59:44.767 +08:00 [INF] Sending file. Request path: '/libs/abp/aspnetcore-mvc-ui-theme-shared/ui-extensions.js'. Physical path: 'N/A' -2021-06-01 16:59:44.767 +08:00 [DBG] Connection id "0HM94RECLNFIG" completed keep alive response. -2021-06-01 16:59:44.767 +08:00 [INF] Sending file. Request path: '/libs/timeago/jquery.timeago.js'. Physical path: 'D:\Github\volo\volo5\abp\modules\basic-theme\app\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo\wwwroot\libs\timeago\jquery.timeago.js' -2021-06-01 16:59:44.767 +08:00 [DBG] Connection id "0HM94RECLNFIH" completed keep alive response. -2021-06-01 16:59:44.767 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/libs/abp/aspnetcore-mvc-ui-theme-shared/ui-extensions.js?_v=637581344238055428 - - - 200 10592 application/javascript 0.6870ms -2021-06-01 16:59:44.767 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/libs/timeago/jquery.timeago.js?_v=637543906070000000 - - - 200 7636 application/javascript 0.7293ms -2021-06-01 16:59:44.767 +08:00 [INF] Sending file. Request path: '/libs/bootstrap-datepicker/bootstrap-datepicker.min.js'. Physical path: 'D:\Github\volo\volo5\abp\modules\basic-theme\app\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo\wwwroot\libs\bootstrap-datepicker\bootstrap-datepicker.min.js' -2021-06-01 16:59:44.767 +08:00 [DBG] Connection id "0HM94RECLNFID" completed keep alive response. -2021-06-01 16:59:44.767 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/libs/bootstrap-datepicker/bootstrap-datepicker.min.js?_v=637543906070000000 - - - 200 33700 application/javascript 1.1213ms -2021-06-01 16:59:44.769 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/libs/abp/aspnetcore-mvc-ui-theme-shared/jquery-form/jquery-form-extensions.js?_v=637581344238055428 - - -2021-06-01 16:59:44.769 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/libs/abp/aspnetcore-mvc-ui-theme-shared/jquery/jquery-extensions.js?_v=637581344238055428 - - -2021-06-01 16:59:44.770 +08:00 [INF] Sending file. Request path: '/libs/abp/aspnetcore-mvc-ui-theme-shared/jquery/jquery-extensions.js'. Physical path: 'N/A' -2021-06-01 16:59:44.770 +08:00 [DBG] Connection id "0HM94RECLNFIF" completed keep alive response. -2021-06-01 16:59:44.770 +08:00 [INF] Sending file. Request path: '/libs/abp/aspnetcore-mvc-ui-theme-shared/jquery-form/jquery-form-extensions.js'. Physical path: 'N/A' -2021-06-01 16:59:44.770 +08:00 [DBG] Connection id "0HM94RECLNFIE" completed keep alive response. -2021-06-01 16:59:44.770 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/libs/abp/aspnetcore-mvc-ui-theme-shared/jquery/jquery-extensions.js?_v=637581344238055428 - - - 200 5627 application/javascript 0.6670ms -2021-06-01 16:59:44.770 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/libs/abp/aspnetcore-mvc-ui-theme-shared/jquery-form/jquery-form-extensions.js?_v=637581344238055428 - - - 200 3608 application/javascript 0.7256ms -2021-06-01 16:59:44.778 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/libs/abp/aspnetcore-mvc-ui-theme-shared/jquery/widget-manager.js?_v=637581344238055428 - - -2021-06-01 16:59:44.778 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/libs/abp/aspnetcore-mvc-ui-theme-shared/bootstrap/dom-event-handlers.js?_v=637581344238055428 - - -2021-06-01 16:59:44.779 +08:00 [INF] Sending file. Request path: '/libs/abp/aspnetcore-mvc-ui-theme-shared/jquery/widget-manager.js'. Physical path: 'N/A' -2021-06-01 16:59:44.779 +08:00 [INF] Sending file. Request path: '/libs/abp/aspnetcore-mvc-ui-theme-shared/bootstrap/dom-event-handlers.js'. Physical path: 'N/A' -2021-06-01 16:59:44.779 +08:00 [DBG] Connection id "0HM94RECLNFID" completed keep alive response. -2021-06-01 16:59:44.779 +08:00 [DBG] Connection id "0HM94RECLNFIG" completed keep alive response. -2021-06-01 16:59:44.779 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/libs/abp/aspnetcore-mvc-ui-theme-shared/jquery/widget-manager.js?_v=637581344238055428 - - - 200 4793 application/javascript 0.5806ms -2021-06-01 16:59:44.779 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/libs/abp/aspnetcore-mvc-ui-theme-shared/bootstrap/dom-event-handlers.js?_v=637581344238055428 - - - 200 8385 application/javascript 0.5888ms -2021-06-01 16:59:44.779 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/libs/abp/aspnetcore-mvc-ui-theme-shared/bootstrap/modal-manager.js?_v=637581344238055428 - - -2021-06-01 16:59:44.779 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/libs/abp/aspnetcore-mvc-ui-theme-shared/datatables/datatables-extensions.js?_v=637581344238055428 - - -2021-06-01 16:59:44.780 +08:00 [INF] Sending file. Request path: '/libs/abp/aspnetcore-mvc-ui-theme-shared/bootstrap/modal-manager.js'. Physical path: 'N/A' -2021-06-01 16:59:44.780 +08:00 [DBG] Connection id "0HM94RECLNFIE" completed keep alive response. -2021-06-01 16:59:44.780 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/libs/abp/aspnetcore-mvc-ui-theme-shared/bootstrap/modal-manager.js?_v=637581344238055428 - - - 200 6823 application/javascript 0.4926ms -2021-06-01 16:59:44.780 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/libs/abp/aspnetcore-mvc-ui-theme-shared/sweetalert/abp-sweetalert.js?_v=637581344238055428 - - -2021-06-01 16:59:44.780 +08:00 [INF] Sending file. Request path: '/libs/abp/aspnetcore-mvc-ui-theme-shared/datatables/datatables-extensions.js'. Physical path: 'N/A' -2021-06-01 16:59:44.780 +08:00 [DBG] Connection id "0HM94RECLNFIH" completed keep alive response. -2021-06-01 16:59:44.780 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/libs/abp/aspnetcore-mvc-ui-theme-shared/datatables/datatables-extensions.js?_v=637581344238055428 - - - 200 20212 application/javascript 0.5459ms -2021-06-01 16:59:44.780 +08:00 [INF] Sending file. Request path: '/libs/abp/aspnetcore-mvc-ui-theme-shared/sweetalert/abp-sweetalert.js'. Physical path: 'N/A' -2021-06-01 16:59:44.780 +08:00 [DBG] Connection id "0HM94RECLNFIF" completed keep alive response. -2021-06-01 16:59:44.780 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/libs/abp/aspnetcore-mvc-ui-theme-shared/sweetalert/abp-sweetalert.js?_v=637581344238055428 - - - 200 3005 application/javascript 0.1968ms -2021-06-01 16:59:44.784 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/libs/abp/aspnetcore-mvc-ui-theme-shared/toastr/abp-toastr.js?_v=637581344238055428 - - -2021-06-01 16:59:44.784 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/Pages/Abp/MultiTenancy/tenant-switch.js?_v=637581344246206036 - - -2021-06-01 16:59:44.784 +08:00 [INF] Sending file. Request path: '/libs/abp/aspnetcore-mvc-ui-theme-shared/toastr/abp-toastr.js'. Physical path: 'N/A' -2021-06-01 16:59:44.784 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/themes/basic/layout.js?_v=637581347776351428 - - -2021-06-01 16:59:44.784 +08:00 [DBG] Connection id "0HM94RECLNFID" completed keep alive response. -2021-06-01 16:59:44.785 +08:00 [INF] Sending file. Request path: '/Pages/Abp/MultiTenancy/tenant-switch.js'. Physical path: 'N/A' -2021-06-01 16:59:44.785 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/libs/abp/aspnetcore-mvc-ui-theme-shared/toastr/abp-toastr.js?_v=637581344238055428 - - - 200 954 application/javascript 0.5786ms -2021-06-01 16:59:44.785 +08:00 [DBG] Connection id "0HM94RECLNFIG" completed keep alive response. -2021-06-01 16:59:44.785 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/Pages/Abp/MultiTenancy/tenant-switch.js?_v=637581344246206036 - - - 200 417 application/javascript 0.3011ms -2021-06-01 16:59:44.785 +08:00 [INF] Sending file. Request path: '/themes/basic/layout.js'. Physical path: 'N/A' -2021-06-01 16:59:44.785 +08:00 [DBG] Connection id "0HM94RECLNFIF" completed keep alive response. -2021-06-01 16:59:44.785 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/themes/basic/layout.js?_v=637581347776351428 - - - 200 546 application/javascript 0.4804ms -2021-06-01 16:59:44.786 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/Abp/ApplicationConfigurationScript - - -2021-06-01 16:59:44.786 +08:00 [DBG] The request path /Abp/ApplicationConfigurationScript does not match a supported file type -2021-06-01 16:59:44.787 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/Abp/ServiceProxyScript - - -2021-06-01 16:59:44.787 +08:00 [DBG] The request path /Abp/ServiceProxyScript does not match a supported file type -2021-06-01 16:59:44.788 +08:00 [DBG] 1 candidate(s) found for the request path '/Abp/ServiceProxyScript' -2021-06-01 16:59:44.788 +08:00 [DBG] 1 candidate(s) found for the request path '/Abp/ApplicationConfigurationScript' -2021-06-01 16:59:44.789 +08:00 [DBG] Endpoint 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController.GetAll (Volo.Abp.AspNetCore.Mvc)' with route pattern 'Abp/ServiceProxyScript' is valid for the request path '/Abp/ServiceProxyScript' -2021-06-01 16:59:44.789 +08:00 [DBG] Endpoint 'Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController.Get (Volo.Abp.AspNetCore.Mvc)' with route pattern 'Abp/ApplicationConfigurationScript' is valid for the request path '/Abp/ApplicationConfigurationScript' -2021-06-01 16:59:44.789 +08:00 [DBG] Request matched endpoint 'Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController.Get (Volo.Abp.AspNetCore.Mvc)' -2021-06-01 16:59:44.789 +08:00 [DBG] Request matched endpoint 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController.GetAll (Volo.Abp.AspNetCore.Mvc)' -2021-06-01 16:59:44.789 +08:00 [INF] Executing endpoint 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController.GetAll (Volo.Abp.AspNetCore.Mvc)' -2021-06-01 16:59:44.789 +08:00 [INF] Executing endpoint 'Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController.Get (Volo.Abp.AspNetCore.Mvc)' -2021-06-01 16:59:44.796 +08:00 [INF] Route matched with {area = "Abp", action = "Get", controller = "AbpApplicationConfigurationScript", page = ""}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.ActionResult] Get() on controller Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController (Volo.Abp.AspNetCore.Mvc). -2021-06-01 16:59:44.796 +08:00 [DBG] Execution plan of authorization filters (in the following order): ["Volo.Abp.AspNetCore.Mvc.AntiForgery.AbpAutoValidateAntiforgeryTokenAuthorizationFilter"] -2021-06-01 16:59:44.796 +08:00 [DBG] Execution plan of resource filters (in the following order): ["Microsoft.AspNetCore.Mvc.ViewFeatures.Filters.SaveTempDataFilter"] -2021-06-01 16:59:44.796 +08:00 [DBG] Execution plan of action filters (in the following order): ["Microsoft.AspNetCore.Mvc.Filters.ControllerActionFilter (Order: -2147483648)","Microsoft.AspNetCore.Mvc.ModelBinding.UnsupportedContentTypeFilter (Order: -3000)","Volo.Abp.AspNetCore.Mvc.GlobalFeatures.GlobalFeatureActionFilter","Volo.Abp.AspNetCore.Mvc.Auditing.AbpAuditActionFilter","Volo.Abp.AspNetCore.Mvc.Response.AbpNoContentActionFilter","Volo.Abp.AspNetCore.Mvc.Features.AbpFeatureActionFilter","Volo.Abp.AspNetCore.Mvc.Validation.AbpValidationActionFilter","Volo.Abp.AspNetCore.Mvc.Uow.AbpUowActionFilter"] -2021-06-01 16:59:44.796 +08:00 [DBG] Execution plan of exception filters (in the following order): ["Volo.Abp.AspNetCore.Mvc.ExceptionHandling.AbpExceptionFilter"] -2021-06-01 16:59:44.796 +08:00 [DBG] Execution plan of result filters (in the following order): ["Microsoft.AspNetCore.Mvc.ViewFeatures.Filters.SaveTempDataFilter","Microsoft.AspNetCore.Mvc.ProducesAttribute (Order: 0)"] -2021-06-01 16:59:44.798 +08:00 [DBG] Executing controller factory for controller Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController (Volo.Abp.AspNetCore.Mvc) -2021-06-01 16:59:44.806 +08:00 [INF] Route matched with {area = "Abp", action = "GetAll", controller = "AbpServiceProxyScript", page = ""}. Executing controller action with signature Microsoft.AspNetCore.Mvc.ActionResult GetAll(Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel) on controller Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController (Volo.Abp.AspNetCore.Mvc). -2021-06-01 16:59:44.806 +08:00 [DBG] Execution plan of authorization filters (in the following order): ["Volo.Abp.AspNetCore.Mvc.AntiForgery.AbpAutoValidateAntiforgeryTokenAuthorizationFilter"] -2021-06-01 16:59:44.806 +08:00 [DBG] Execution plan of resource filters (in the following order): ["Microsoft.AspNetCore.Mvc.ViewFeatures.Filters.SaveTempDataFilter"] -2021-06-01 16:59:44.806 +08:00 [DBG] Execution plan of action filters (in the following order): ["Microsoft.AspNetCore.Mvc.Filters.ControllerActionFilter (Order: -2147483648)","Microsoft.AspNetCore.Mvc.ModelBinding.UnsupportedContentTypeFilter (Order: -3000)","Volo.Abp.AspNetCore.Mvc.GlobalFeatures.GlobalFeatureActionFilter","Volo.Abp.AspNetCore.Mvc.Auditing.AbpAuditActionFilter","Volo.Abp.AspNetCore.Mvc.Response.AbpNoContentActionFilter","Volo.Abp.AspNetCore.Mvc.Features.AbpFeatureActionFilter","Volo.Abp.AspNetCore.Mvc.Validation.AbpValidationActionFilter","Volo.Abp.AspNetCore.Mvc.Uow.AbpUowActionFilter"] -2021-06-01 16:59:44.806 +08:00 [DBG] Execution plan of exception filters (in the following order): ["Volo.Abp.AspNetCore.Mvc.ExceptionHandling.AbpExceptionFilter"] -2021-06-01 16:59:44.806 +08:00 [DBG] Execution plan of result filters (in the following order): ["Microsoft.AspNetCore.Mvc.ViewFeatures.Filters.SaveTempDataFilter","Microsoft.AspNetCore.Mvc.ProducesAttribute (Order: 0)"] -2021-06-01 16:59:44.806 +08:00 [DBG] Executing controller factory for controller Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController (Volo.Abp.AspNetCore.Mvc) -2021-06-01 16:59:44.828 +08:00 [DBG] Executed controller factory for controller Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController (Volo.Abp.AspNetCore.Mvc) -2021-06-01 16:59:44.833 +08:00 [DBG] Attempting to bind parameter 'model' of type 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel' ... -2021-06-01 16:59:44.834 +08:00 [DBG] Attempting to bind parameter 'model' of type 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel' using the name '' in request data ... -2021-06-01 16:59:44.838 +08:00 [DBG] Attempting to bind property 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel.Type' of type 'System.String' using the name 'Type' in request data ... -2021-06-01 16:59:44.839 +08:00 [DBG] Could not find a value in the request with name 'Type' for binding property 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel.Type' of type 'System.String'. -2021-06-01 16:59:44.839 +08:00 [DBG] Done attempting to bind property 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel.Type' of type 'System.String'. -2021-06-01 16:59:44.842 +08:00 [DBG] Attempting to bind property 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel.UseCache' of type 'System.Boolean' using the name 'UseCache' in request data ... -2021-06-01 16:59:44.842 +08:00 [DBG] Could not find a value in the request with name 'UseCache' for binding property 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel.UseCache' of type 'System.Boolean'. -2021-06-01 16:59:44.842 +08:00 [DBG] Done attempting to bind property 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel.UseCache' of type 'System.Boolean'. -2021-06-01 16:59:44.842 +08:00 [DBG] Attempting to bind property 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel.Modules' of type 'System.String' using the name 'Modules' in request data ... -2021-06-01 16:59:44.842 +08:00 [DBG] Could not find a value in the request with name 'Modules' for binding property 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel.Modules' of type 'System.String'. -2021-06-01 16:59:44.842 +08:00 [DBG] Done attempting to bind property 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel.Modules' of type 'System.String'. -2021-06-01 16:59:44.842 +08:00 [DBG] Attempting to bind property 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel.Controllers' of type 'System.String' using the name 'Controllers' in request data ... -2021-06-01 16:59:44.842 +08:00 [DBG] Could not find a value in the request with name 'Controllers' for binding property 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel.Controllers' of type 'System.String'. -2021-06-01 16:59:44.842 +08:00 [DBG] Done attempting to bind property 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel.Controllers' of type 'System.String'. -2021-06-01 16:59:44.842 +08:00 [DBG] Attempting to bind property 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel.Actions' of type 'System.String' using the name 'Actions' in request data ... -2021-06-01 16:59:44.842 +08:00 [DBG] Could not find a value in the request with name 'Actions' for binding property 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel.Actions' of type 'System.String'. -2021-06-01 16:59:44.842 +08:00 [DBG] Done attempting to bind property 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel.Actions' of type 'System.String'. -2021-06-01 16:59:44.844 +08:00 [DBG] Done attempting to bind parameter 'model' of type 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel'. -2021-06-01 16:59:44.844 +08:00 [DBG] Done attempting to bind parameter 'model' of type 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel'. -2021-06-01 16:59:44.844 +08:00 [DBG] Attempting to validate the bound parameter 'model' of type 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel' ... -2021-06-01 16:59:44.846 +08:00 [DBG] Done attempting to validate the bound parameter 'model' of type 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel'. -2021-06-01 16:59:44.861 +08:00 [DBG] Executed controller factory for controller Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController (Volo.Abp.AspNetCore.Mvc) -2021-06-01 16:59:44.904 +08:00 [DBG] ActionApiDescriptionModel.Create: AbpTenant.FindTenantByNameAsyncByName -2021-06-01 16:59:44.911 +08:00 [DBG] Executing AbpApplicationConfigurationAppService.GetAsync()... -2021-06-01 16:59:44.916 +08:00 [DBG] ActionApiDescriptionModel.Create: AbpTenant.FindTenantByIdAsyncById -2021-06-01 16:59:44.917 +08:00 [DBG] ActionApiDescriptionModel.Create: AbpApplicationConfiguration.GetAsync -2021-06-01 16:59:44.917 +08:00 [DBG] ActionApiDescriptionModel.Create: AbpApiDefinition.GetByModel -2021-06-01 16:59:44.933 +08:00 [INF] Executing ContentResult with HTTP Response ContentType of application/javascript -2021-06-01 16:59:44.933 +08:00 [INF] Executed action Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController.GetAll (Volo.Abp.AspNetCore.Mvc) in 127.3424ms -2021-06-01 16:59:44.934 +08:00 [INF] Executed endpoint 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController.GetAll (Volo.Abp.AspNetCore.Mvc)' -2021-06-01 16:59:44.934 +08:00 [DBG] Connection id "0HM94RECLNFIH" completed keep alive response. -2021-06-01 16:59:44.934 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/Abp/ServiceProxyScript - - - 200 1936 application/javascript 146.2921ms -2021-06-01 16:59:45.231 +08:00 [DBG] Executed AbpApplicationConfigurationAppService.GetAsync(). -2021-06-01 16:59:45.275 +08:00 [DBG] A new antiforgery cookie token was created. -2021-06-01 16:59:45.276 +08:00 [WRN] The cookie 'XSRF-TOKEN' has set 'SameSite=None' and must also set 'Secure'. -2021-06-01 16:59:45.277 +08:00 [INF] Executing ContentResult with HTTP Response ContentType of application/javascript -2021-06-01 16:59:45.278 +08:00 [INF] Executed action Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController.Get (Volo.Abp.AspNetCore.Mvc) in 482.1365ms -2021-06-01 16:59:45.278 +08:00 [INF] Executed endpoint 'Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController.Get (Volo.Abp.AspNetCore.Mvc)' -2021-06-01 16:59:45.278 +08:00 [DBG] Connection id "0HM94RECLNFIE" completed keep alive response. -2021-06-01 16:59:45.278 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/Abp/ApplicationConfigurationScript - - - 200 13072 application/javascript 492.0572ms -2021-06-01 16:59:45.319 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/favicon.ico - - -2021-06-01 16:59:45.319 +08:00 [DBG] The request path /favicon.ico does not match an existing file -2021-06-01 16:59:45.320 +08:00 [DBG] No candidates found for the request path '/favicon.ico' -2021-06-01 16:59:45.320 +08:00 [DBG] Request did not match any endpoints -2021-06-01 16:59:45.320 +08:00 [DBG] Connection id "0HM94RECLNFIE" completed keep alive response. -2021-06-01 16:59:45.320 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/favicon.ico - - - 404 0 - 1.5213ms -2021-06-01 16:59:46.609 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/Components - - -2021-06-01 16:59:46.610 +08:00 [DBG] The request path /Components does not match a supported file type -2021-06-01 16:59:46.610 +08:00 [DBG] 1 candidate(s) found for the request path '/Components' -2021-06-01 16:59:46.610 +08:00 [DBG] Endpoint 'Page: /Components/Index' with route pattern 'Components' is valid for the request path '/Components' -2021-06-01 16:59:46.613 +08:00 [DBG] Request matched endpoint '/Components/Index' -2021-06-01 16:59:46.613 +08:00 [INF] Executing endpoint '/Components/Index' -2021-06-01 16:59:46.615 +08:00 [INF] Route matched with {page = "/Components/Index", area = "", action = "", controller = ""}. Executing page /Components/Index -2021-06-01 16:59:46.615 +08:00 [DBG] Execution plan of authorization filters (in the following order): ["Volo.Abp.AspNetCore.Mvc.AntiForgery.AbpAutoValidateAntiforgeryTokenAuthorizationFilter","Microsoft.AspNetCore.Mvc.ViewFeatures.Filters.AutoValidateAntiforgeryTokenAuthorizationFilter"] -2021-06-01 16:59:46.615 +08:00 [DBG] Execution plan of resource filters (in the following order): ["Microsoft.AspNetCore.Mvc.ViewFeatures.Filters.SaveTempDataFilter"] -2021-06-01 16:59:46.615 +08:00 [DBG] Execution plan of action filters (in the following order): ["Microsoft.AspNetCore.Mvc.ModelBinding.UnsupportedContentTypeFilter (Order: -3000)","Volo.Abp.AspNetCore.Mvc.GlobalFeatures.GlobalFeatureActionFilter","Volo.Abp.AspNetCore.Mvc.Auditing.AbpAuditActionFilter","Volo.Abp.AspNetCore.Mvc.Response.AbpNoContentActionFilter","Volo.Abp.AspNetCore.Mvc.Features.AbpFeatureActionFilter","Volo.Abp.AspNetCore.Mvc.Validation.AbpValidationActionFilter","Volo.Abp.AspNetCore.Mvc.Uow.AbpUowActionFilter"] -2021-06-01 16:59:46.615 +08:00 [DBG] Execution plan of exception filters (in the following order): ["Volo.Abp.AspNetCore.Mvc.ExceptionHandling.AbpExceptionFilter"] -2021-06-01 16:59:46.615 +08:00 [DBG] Execution plan of result filters (in the following order): ["Microsoft.AspNetCore.Mvc.ViewFeatures.Filters.SaveTempDataFilter"] -2021-06-01 16:59:46.615 +08:00 [INF] Skipping the execution of current filter as its not the most effective filter implementing the policy Microsoft.AspNetCore.Mvc.ViewFeatures.IAntiforgeryPolicy -2021-06-01 16:59:46.615 +08:00 [DBG] Executing page model factory for page AspNetCore.Pages_Components_Index (Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo.Views) -2021-06-01 16:59:46.616 +08:00 [DBG] Executed page model factory for page AspNetCore.Pages_Components_Index (Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo.Views) -2021-06-01 16:59:46.617 +08:00 [INF] Executing handler method Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo.Pages.Components.IndexModel.OnGet - ModelState is "Valid" -2021-06-01 16:59:46.617 +08:00 [INF] Executed handler method OnGet, returned result . -2021-06-01 16:59:46.617 +08:00 [INF] Executing an implicit handler method - ModelState is "Valid" -2021-06-01 16:59:46.617 +08:00 [INF] Executed an implicit handler method, returned result Microsoft.AspNetCore.Mvc.RazorPages.PageResult. -2021-06-01 16:59:46.627 +08:00 [DBG] Executing view component Volo.Abp.AspNetCore.Mvc.UI.Components.LayoutHook.LayoutHookViewComponent with arguments (["Header.First","Application"]). -2021-06-01 16:59:46.627 +08:00 [DBG] Executed view component Volo.Abp.AspNetCore.Mvc.UI.Components.LayoutHook.LayoutHookViewComponent in 0.0081ms and returned Microsoft.AspNetCore.Mvc.ViewComponents.ViewViewComponentResult -2021-06-01 16:59:46.628 +08:00 [DBG] Added bundle 'Basic.Global' to the page in 0.76 ms. -2021-06-01 16:59:46.628 +08:00 [DBG] Executing view component Volo.Abp.AspNetCore.Mvc.UI.Widgets.Components.WidgetStyles.WidgetStylesViewComponent with arguments ([]). -2021-06-01 16:59:46.628 +08:00 [DBG] Executed view component Volo.Abp.AspNetCore.Mvc.UI.Widgets.Components.WidgetStyles.WidgetStylesViewComponent in 0.0177ms and returned Microsoft.AspNetCore.Mvc.ViewComponents.ViewViewComponentResult -2021-06-01 16:59:46.628 +08:00 [DBG] Executing view component Volo.Abp.AspNetCore.Mvc.UI.Components.LayoutHook.LayoutHookViewComponent with arguments (["Header.Last","Application"]). -2021-06-01 16:59:46.628 +08:00 [DBG] Executed view component Volo.Abp.AspNetCore.Mvc.UI.Components.LayoutHook.LayoutHookViewComponent in 0.0034ms and returned Microsoft.AspNetCore.Mvc.ViewComponents.ViewViewComponentResult -2021-06-01 16:59:46.628 +08:00 [DBG] Executing view component Volo.Abp.AspNetCore.Mvc.UI.Components.LayoutHook.LayoutHookViewComponent with arguments (["Body.First","Application"]). -2021-06-01 16:59:46.628 +08:00 [DBG] Executed view component Volo.Abp.AspNetCore.Mvc.UI.Components.LayoutHook.LayoutHookViewComponent in 0.0034ms and returned Microsoft.AspNetCore.Mvc.ViewComponents.ViewViewComponentResult -2021-06-01 16:59:46.628 +08:00 [DBG] Executing view component Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Themes.Basic.Components.MainNavbar.MainNavbarViewComponent with arguments ([]). -2021-06-01 16:59:46.628 +08:00 [DBG] Executed view component Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Themes.Basic.Components.MainNavbar.MainNavbarViewComponent in 0.0047ms and returned Microsoft.AspNetCore.Mvc.ViewComponents.ViewViewComponentResult -2021-06-01 16:59:46.628 +08:00 [DBG] Executing view component Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Themes.Basic.Components.Brand.MainNavbarBrandViewComponent with arguments ([]). -2021-06-01 16:59:46.628 +08:00 [DBG] Executed view component Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Themes.Basic.Components.Brand.MainNavbarBrandViewComponent in 0.0018ms and returned Microsoft.AspNetCore.Mvc.ViewComponents.ViewViewComponentResult -2021-06-01 16:59:46.628 +08:00 [DBG] Executing view component Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Themes.Basic.Components.Menu.MainNavbarMenuViewComponent with arguments ([]). -2021-06-01 16:59:46.629 +08:00 [DBG] Executed view component Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Themes.Basic.Components.Menu.MainNavbarMenuViewComponent in 0.5801ms and returned Microsoft.AspNetCore.Mvc.ViewComponents.ViewViewComponentResult -2021-06-01 16:59:46.630 +08:00 [DBG] Executing view component Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Themes.Basic.Components.Toolbar.MainNavbarToolbarViewComponent with arguments ([]). -2021-06-01 16:59:46.630 +08:00 [DBG] Executed view component Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Themes.Basic.Components.Toolbar.MainNavbarToolbarViewComponent in 0.2012ms and returned Microsoft.AspNetCore.Mvc.ViewComponents.ViewViewComponentResult -2021-06-01 16:59:46.631 +08:00 [DBG] Executing view component Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Themes.Basic.Components.PageAlerts.PageAlertsViewComponent with arguments ([""]). -2021-06-01 16:59:46.631 +08:00 [DBG] Executed view component Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Themes.Basic.Components.PageAlerts.PageAlertsViewComponent in 0.0154ms and returned Microsoft.AspNetCore.Mvc.ViewComponents.ViewViewComponentResult -2021-06-01 16:59:46.631 +08:00 [DBG] Executing view component Volo.Abp.AspNetCore.Mvc.UI.Components.LayoutHook.LayoutHookViewComponent with arguments (["PageContent.First","Application"]). -2021-06-01 16:59:46.631 +08:00 [DBG] Executed view component Volo.Abp.AspNetCore.Mvc.UI.Components.LayoutHook.LayoutHookViewComponent in 0.004ms and returned Microsoft.AspNetCore.Mvc.ViewComponents.ViewViewComponentResult -2021-06-01 16:59:46.631 +08:00 [DBG] Executing view component Volo.Abp.AspNetCore.Mvc.UI.Components.LayoutHook.LayoutHookViewComponent with arguments (["PageContent.Last","Application"]). -2021-06-01 16:59:46.631 +08:00 [DBG] Executed view component Volo.Abp.AspNetCore.Mvc.UI.Components.LayoutHook.LayoutHookViewComponent in 0.0031ms and returned Microsoft.AspNetCore.Mvc.ViewComponents.ViewViewComponentResult -2021-06-01 16:59:46.633 +08:00 [DBG] Added bundle 'Basic.Global' to the page in 1.98 ms. -2021-06-01 16:59:46.633 +08:00 [DBG] Executing view component Volo.Abp.AspNetCore.Mvc.UI.Widgets.Components.WidgetScripts.WidgetScriptsViewComponent with arguments ([]). -2021-06-01 16:59:46.633 +08:00 [DBG] Executed view component Volo.Abp.AspNetCore.Mvc.UI.Widgets.Components.WidgetScripts.WidgetScriptsViewComponent in 0.0094ms and returned Microsoft.AspNetCore.Mvc.ViewComponents.ViewViewComponentResult -2021-06-01 16:59:46.633 +08:00 [DBG] Executing view component Volo.Abp.AspNetCore.Mvc.UI.Components.LayoutHook.LayoutHookViewComponent with arguments (["Body.Last","Application"]). -2021-06-01 16:59:46.633 +08:00 [DBG] Executed view component Volo.Abp.AspNetCore.Mvc.UI.Components.LayoutHook.LayoutHookViewComponent in 0.0036ms and returned Microsoft.AspNetCore.Mvc.ViewComponents.ViewViewComponentResult -2021-06-01 16:59:46.634 +08:00 [INF] Executed page /Components/Index in 18.3018ms -2021-06-01 16:59:46.634 +08:00 [INF] Executed endpoint '/Components/Index' -2021-06-01 16:59:46.634 +08:00 [DBG] Connection id "0HM94RECLNFIE" completed keep alive response. -2021-06-01 16:59:46.634 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/Components - - - 200 - text/html;+charset=utf-8 24.2282ms -2021-06-01 16:59:46.663 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/themes/basic/layout.css?_v=637581347776351428 - - -2021-06-01 16:59:46.665 +08:00 [INF] The file /themes/basic/layout.css was not modified -2021-06-01 16:59:46.665 +08:00 [DBG] Handled. Status code: 304 File: /themes/basic/layout.css -2021-06-01 16:59:46.665 +08:00 [DBG] Connection id "0HM94RECLNFIE" completed keep alive response. -2021-06-01 16:59:46.665 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/themes/basic/layout.css?_v=637581347776351428 - - - 304 - text/css 2.0592ms -2021-06-01 16:59:46.672 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/Abp/ServiceProxyScript - - -2021-06-01 16:59:46.672 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/Abp/ApplicationConfigurationScript - - -2021-06-01 16:59:46.672 +08:00 [DBG] The request path /Abp/ServiceProxyScript does not match a supported file type -2021-06-01 16:59:46.672 +08:00 [DBG] The request path /Abp/ApplicationConfigurationScript does not match a supported file type -2021-06-01 16:59:46.672 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/themes/basic/layout.js?_v=637581347776351428 - - -2021-06-01 16:59:46.673 +08:00 [INF] The file /themes/basic/layout.js was not modified -2021-06-01 16:59:46.673 +08:00 [DBG] Handled. Status code: 304 File: /themes/basic/layout.js -2021-06-01 16:59:46.673 +08:00 [DBG] Connection id "0HM94RECLNFIC" completed keep alive response. -2021-06-01 16:59:46.673 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/themes/basic/layout.js?_v=637581347776351428 - - - 304 - application/javascript 0.5183ms -2021-06-01 16:59:46.673 +08:00 [DBG] 1 candidate(s) found for the request path '/Abp/ApplicationConfigurationScript' -2021-06-01 16:59:46.673 +08:00 [DBG] 1 candidate(s) found for the request path '/Abp/ServiceProxyScript' -2021-06-01 16:59:46.673 +08:00 [DBG] Endpoint 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController.GetAll (Volo.Abp.AspNetCore.Mvc)' with route pattern 'Abp/ServiceProxyScript' is valid for the request path '/Abp/ServiceProxyScript' -2021-06-01 16:59:46.673 +08:00 [DBG] Endpoint 'Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController.Get (Volo.Abp.AspNetCore.Mvc)' with route pattern 'Abp/ApplicationConfigurationScript' is valid for the request path '/Abp/ApplicationConfigurationScript' -2021-06-01 16:59:46.673 +08:00 [DBG] Request matched endpoint 'Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController.Get (Volo.Abp.AspNetCore.Mvc)' -2021-06-01 16:59:46.673 +08:00 [DBG] Request matched endpoint 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController.GetAll (Volo.Abp.AspNetCore.Mvc)' -2021-06-01 16:59:46.673 +08:00 [INF] Executing endpoint 'Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController.Get (Volo.Abp.AspNetCore.Mvc)' -2021-06-01 16:59:46.673 +08:00 [INF] Executing endpoint 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController.GetAll (Volo.Abp.AspNetCore.Mvc)' -2021-06-01 16:59:46.674 +08:00 [INF] Route matched with {area = "Abp", action = "GetAll", controller = "AbpServiceProxyScript", page = ""}. Executing controller action with signature Microsoft.AspNetCore.Mvc.ActionResult GetAll(Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel) on controller Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController (Volo.Abp.AspNetCore.Mvc). -2021-06-01 16:59:46.674 +08:00 [DBG] Execution plan of authorization filters (in the following order): ["Volo.Abp.AspNetCore.Mvc.AntiForgery.AbpAutoValidateAntiforgeryTokenAuthorizationFilter"] -2021-06-01 16:59:46.674 +08:00 [DBG] Execution plan of resource filters (in the following order): ["Microsoft.AspNetCore.Mvc.ViewFeatures.Filters.SaveTempDataFilter"] -2021-06-01 16:59:46.674 +08:00 [DBG] Execution plan of action filters (in the following order): ["Microsoft.AspNetCore.Mvc.Filters.ControllerActionFilter (Order: -2147483648)","Microsoft.AspNetCore.Mvc.ModelBinding.UnsupportedContentTypeFilter (Order: -3000)","Volo.Abp.AspNetCore.Mvc.GlobalFeatures.GlobalFeatureActionFilter","Volo.Abp.AspNetCore.Mvc.Auditing.AbpAuditActionFilter","Volo.Abp.AspNetCore.Mvc.Response.AbpNoContentActionFilter","Volo.Abp.AspNetCore.Mvc.Features.AbpFeatureActionFilter","Volo.Abp.AspNetCore.Mvc.Validation.AbpValidationActionFilter","Volo.Abp.AspNetCore.Mvc.Uow.AbpUowActionFilter"] -2021-06-01 16:59:46.674 +08:00 [DBG] Execution plan of exception filters (in the following order): ["Volo.Abp.AspNetCore.Mvc.ExceptionHandling.AbpExceptionFilter"] -2021-06-01 16:59:46.674 +08:00 [DBG] Execution plan of result filters (in the following order): ["Microsoft.AspNetCore.Mvc.ViewFeatures.Filters.SaveTempDataFilter","Microsoft.AspNetCore.Mvc.ProducesAttribute (Order: 0)"] -2021-06-01 16:59:46.674 +08:00 [DBG] Executing controller factory for controller Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController (Volo.Abp.AspNetCore.Mvc) -2021-06-01 16:59:46.674 +08:00 [DBG] Executed controller factory for controller Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController (Volo.Abp.AspNetCore.Mvc) -2021-06-01 16:59:46.674 +08:00 [DBG] Attempting to bind parameter 'model' of type 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel' ... -2021-06-01 16:59:46.674 +08:00 [DBG] Attempting to bind parameter 'model' of type 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel' using the name '' in request data ... -2021-06-01 16:59:46.674 +08:00 [DBG] Attempting to bind property 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel.Type' of type 'System.String' using the name 'Type' in request data ... -2021-06-01 16:59:46.674 +08:00 [DBG] Could not find a value in the request with name 'Type' for binding property 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel.Type' of type 'System.String'. -2021-06-01 16:59:46.674 +08:00 [DBG] Done attempting to bind property 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel.Type' of type 'System.String'. -2021-06-01 16:59:46.674 +08:00 [DBG] Attempting to bind property 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel.UseCache' of type 'System.Boolean' using the name 'UseCache' in request data ... -2021-06-01 16:59:46.674 +08:00 [DBG] Could not find a value in the request with name 'UseCache' for binding property 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel.UseCache' of type 'System.Boolean'. -2021-06-01 16:59:46.674 +08:00 [DBG] Done attempting to bind property 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel.UseCache' of type 'System.Boolean'. -2021-06-01 16:59:46.675 +08:00 [DBG] Attempting to bind property 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel.Modules' of type 'System.String' using the name 'Modules' in request data ... -2021-06-01 16:59:46.675 +08:00 [DBG] Could not find a value in the request with name 'Modules' for binding property 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel.Modules' of type 'System.String'. -2021-06-01 16:59:46.675 +08:00 [DBG] Done attempting to bind property 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel.Modules' of type 'System.String'. -2021-06-01 16:59:46.675 +08:00 [DBG] Attempting to bind property 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel.Controllers' of type 'System.String' using the name 'Controllers' in request data ... -2021-06-01 16:59:46.675 +08:00 [DBG] Could not find a value in the request with name 'Controllers' for binding property 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel.Controllers' of type 'System.String'. -2021-06-01 16:59:46.675 +08:00 [DBG] Done attempting to bind property 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel.Controllers' of type 'System.String'. -2021-06-01 16:59:46.675 +08:00 [DBG] Attempting to bind property 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel.Actions' of type 'System.String' using the name 'Actions' in request data ... -2021-06-01 16:59:46.675 +08:00 [DBG] Could not find a value in the request with name 'Actions' for binding property 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel.Actions' of type 'System.String'. -2021-06-01 16:59:46.675 +08:00 [DBG] Done attempting to bind property 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel.Actions' of type 'System.String'. -2021-06-01 16:59:46.675 +08:00 [DBG] Done attempting to bind parameter 'model' of type 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel'. -2021-06-01 16:59:46.675 +08:00 [DBG] Done attempting to bind parameter 'model' of type 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel'. -2021-06-01 16:59:46.675 +08:00 [DBG] Attempting to validate the bound parameter 'model' of type 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel' ... -2021-06-01 16:59:46.675 +08:00 [DBG] Done attempting to validate the bound parameter 'model' of type 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel'. -2021-06-01 16:59:46.676 +08:00 [INF] Route matched with {area = "Abp", action = "Get", controller = "AbpApplicationConfigurationScript", page = ""}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.ActionResult] Get() on controller Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController (Volo.Abp.AspNetCore.Mvc). -2021-06-01 16:59:46.676 +08:00 [DBG] Execution plan of authorization filters (in the following order): ["Volo.Abp.AspNetCore.Mvc.AntiForgery.AbpAutoValidateAntiforgeryTokenAuthorizationFilter"] -2021-06-01 16:59:46.676 +08:00 [DBG] Execution plan of resource filters (in the following order): ["Microsoft.AspNetCore.Mvc.ViewFeatures.Filters.SaveTempDataFilter"] -2021-06-01 16:59:46.676 +08:00 [DBG] Execution plan of action filters (in the following order): ["Microsoft.AspNetCore.Mvc.Filters.ControllerActionFilter (Order: -2147483648)","Microsoft.AspNetCore.Mvc.ModelBinding.UnsupportedContentTypeFilter (Order: -3000)","Volo.Abp.AspNetCore.Mvc.GlobalFeatures.GlobalFeatureActionFilter","Volo.Abp.AspNetCore.Mvc.Auditing.AbpAuditActionFilter","Volo.Abp.AspNetCore.Mvc.Response.AbpNoContentActionFilter","Volo.Abp.AspNetCore.Mvc.Features.AbpFeatureActionFilter","Volo.Abp.AspNetCore.Mvc.Validation.AbpValidationActionFilter","Volo.Abp.AspNetCore.Mvc.Uow.AbpUowActionFilter"] -2021-06-01 16:59:46.676 +08:00 [DBG] Execution plan of exception filters (in the following order): ["Volo.Abp.AspNetCore.Mvc.ExceptionHandling.AbpExceptionFilter"] -2021-06-01 16:59:46.676 +08:00 [DBG] Execution plan of result filters (in the following order): ["Microsoft.AspNetCore.Mvc.ViewFeatures.Filters.SaveTempDataFilter","Microsoft.AspNetCore.Mvc.ProducesAttribute (Order: 0)"] -2021-06-01 16:59:46.676 +08:00 [DBG] Executing controller factory for controller Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController (Volo.Abp.AspNetCore.Mvc) -2021-06-01 16:59:46.676 +08:00 [INF] Executing ContentResult with HTTP Response ContentType of application/javascript -2021-06-01 16:59:46.676 +08:00 [INF] Executed action Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController.GetAll (Volo.Abp.AspNetCore.Mvc) in 2.5315ms -2021-06-01 16:59:46.676 +08:00 [INF] Executed endpoint 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController.GetAll (Volo.Abp.AspNetCore.Mvc)' -2021-06-01 16:59:46.676 +08:00 [DBG] Connection id "0HM94RECLNFIG" completed keep alive response. -2021-06-01 16:59:46.676 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/Abp/ServiceProxyScript - - - 200 1936 application/javascript 4.3712ms -2021-06-01 16:59:46.678 +08:00 [DBG] Executed controller factory for controller Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController (Volo.Abp.AspNetCore.Mvc) -2021-06-01 16:59:46.679 +08:00 [DBG] Executing AbpApplicationConfigurationAppService.GetAsync()... -2021-06-01 16:59:46.681 +08:00 [DBG] Executed AbpApplicationConfigurationAppService.GetAsync(). -2021-06-01 16:59:46.692 +08:00 [DBG] An antiforgery cookie token was reused. -2021-06-01 16:59:46.692 +08:00 [WRN] The cookie 'XSRF-TOKEN' has set 'SameSite=None' and must also set 'Secure'. -2021-06-01 16:59:46.692 +08:00 [INF] Executing ContentResult with HTTP Response ContentType of application/javascript -2021-06-01 16:59:46.693 +08:00 [INF] Executed action Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController.Get (Volo.Abp.AspNetCore.Mvc) in 16.3898ms -2021-06-01 16:59:46.693 +08:00 [INF] Executed endpoint 'Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController.Get (Volo.Abp.AspNetCore.Mvc)' -2021-06-01 16:59:46.693 +08:00 [DBG] Connection id "0HM94RECLNFIH" completed keep alive response. -2021-06-01 16:59:46.693 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/Abp/ApplicationConfigurationScript - - - 200 13072 application/javascript 20.5098ms -2021-06-01 16:59:47.713 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/Components/Alerts - - -2021-06-01 16:59:47.713 +08:00 [DBG] The request path /Components/Alerts does not match a supported file type -2021-06-01 16:59:47.713 +08:00 [DBG] 1 candidate(s) found for the request path '/Components/Alerts' -2021-06-01 16:59:47.713 +08:00 [DBG] Endpoint 'Page: /Components/Alerts/Index' with route pattern 'Components/Alerts' is valid for the request path '/Components/Alerts' -2021-06-01 16:59:47.715 +08:00 [DBG] Request matched endpoint '/Components/Alerts/Index' -2021-06-01 16:59:47.715 +08:00 [INF] Executing endpoint '/Components/Alerts/Index' -2021-06-01 16:59:47.716 +08:00 [INF] Route matched with {page = "/Components/Alerts/Index", area = "", action = "", controller = ""}. Executing page /Components/Alerts/Index -2021-06-01 16:59:47.716 +08:00 [DBG] Execution plan of authorization filters (in the following order): ["Volo.Abp.AspNetCore.Mvc.AntiForgery.AbpAutoValidateAntiforgeryTokenAuthorizationFilter","Microsoft.AspNetCore.Mvc.ViewFeatures.Filters.AutoValidateAntiforgeryTokenAuthorizationFilter"] -2021-06-01 16:59:47.716 +08:00 [DBG] Execution plan of resource filters (in the following order): ["Microsoft.AspNetCore.Mvc.ViewFeatures.Filters.SaveTempDataFilter"] -2021-06-01 16:59:47.716 +08:00 [DBG] Execution plan of action filters (in the following order): ["Microsoft.AspNetCore.Mvc.ModelBinding.UnsupportedContentTypeFilter (Order: -3000)","Volo.Abp.AspNetCore.Mvc.GlobalFeatures.GlobalFeatureActionFilter","Volo.Abp.AspNetCore.Mvc.Auditing.AbpAuditActionFilter","Volo.Abp.AspNetCore.Mvc.Response.AbpNoContentActionFilter","Volo.Abp.AspNetCore.Mvc.Features.AbpFeatureActionFilter","Volo.Abp.AspNetCore.Mvc.Validation.AbpValidationActionFilter","Volo.Abp.AspNetCore.Mvc.Uow.AbpUowActionFilter"] -2021-06-01 16:59:47.716 +08:00 [DBG] Execution plan of exception filters (in the following order): ["Volo.Abp.AspNetCore.Mvc.ExceptionHandling.AbpExceptionFilter"] -2021-06-01 16:59:47.716 +08:00 [DBG] Execution plan of result filters (in the following order): ["Microsoft.AspNetCore.Mvc.ViewFeatures.Filters.SaveTempDataFilter"] -2021-06-01 16:59:47.716 +08:00 [INF] Skipping the execution of current filter as its not the most effective filter implementing the policy Microsoft.AspNetCore.Mvc.ViewFeatures.IAntiforgeryPolicy -2021-06-01 16:59:47.716 +08:00 [DBG] Executing page model factory for page AspNetCore.Pages_Components_Alerts_Index (Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo.Views) -2021-06-01 16:59:47.717 +08:00 [DBG] Executed page model factory for page AspNetCore.Pages_Components_Alerts_Index (Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo.Views) -2021-06-01 16:59:47.717 +08:00 [INF] Executing handler method Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo.Pages.Components.Alerts.IndexModel.OnGet - ModelState is "Valid" -2021-06-01 16:59:47.717 +08:00 [INF] Executed handler method OnGet, returned result . -2021-06-01 16:59:47.717 +08:00 [INF] Executing an implicit handler method - ModelState is "Valid" -2021-06-01 16:59:47.717 +08:00 [INF] Executed an implicit handler method, returned result Microsoft.AspNetCore.Mvc.RazorPages.PageResult. -2021-06-01 16:59:47.721 +08:00 [DBG] Executing view component Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo.Views.Components.Themes.Shared.Demos.AlertsDemo.AlertsDemoViewComponent with arguments ([]). -2021-06-01 16:59:47.721 +08:00 [DBG] Executed view component Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo.Views.Components.Themes.Shared.Demos.AlertsDemo.AlertsDemoViewComponent in 0.1226ms and returned Microsoft.AspNetCore.Mvc.ViewComponents.ViewViewComponentResult -2021-06-01 16:59:48.912 +08:00 [DBG] Compilation of the generated code for the Razor file at '/Views/Components/Themes/Shared/Demos/AlertsDemo/Default.cshtml' started. -2021-06-01 16:59:51.022 +08:00 [DBG] Compilation of the generated code for the Razor file at '/Views/Components/Themes/Shared/Demos/AlertsDemo/Default.cshtml' completed in 2108.9154ms. -2021-06-01 16:59:51.074 +08:00 [DBG] Executing view component Volo.Abp.AspNetCore.Mvc.UI.Components.LayoutHook.LayoutHookViewComponent with arguments (["Header.First","Application"]). -2021-06-01 16:59:51.074 +08:00 [DBG] Executed view component Volo.Abp.AspNetCore.Mvc.UI.Components.LayoutHook.LayoutHookViewComponent in 0.0043ms and returned Microsoft.AspNetCore.Mvc.ViewComponents.ViewViewComponentResult -2021-06-01 16:59:51.075 +08:00 [DBG] Added bundle 'Basic.Global' to the page in 0.54 ms. -2021-06-01 16:59:51.075 +08:00 [DBG] Executing view component Volo.Abp.AspNetCore.Mvc.UI.Widgets.Components.WidgetStyles.WidgetStylesViewComponent with arguments ([]). -2021-06-01 16:59:51.075 +08:00 [DBG] Executed view component Volo.Abp.AspNetCore.Mvc.UI.Widgets.Components.WidgetStyles.WidgetStylesViewComponent in 0.015ms and returned Microsoft.AspNetCore.Mvc.ViewComponents.ViewViewComponentResult -2021-06-01 16:59:51.084 +08:00 [DBG] Added bundle 'ED78B4CDC70064CB1FA5F31C4BFA513D' to the page in 1.72 ms. -2021-06-01 16:59:51.084 +08:00 [DBG] Executing view component Volo.Abp.AspNetCore.Mvc.UI.Components.LayoutHook.LayoutHookViewComponent with arguments (["Header.Last","Application"]). -2021-06-01 16:59:51.084 +08:00 [DBG] Executed view component Volo.Abp.AspNetCore.Mvc.UI.Components.LayoutHook.LayoutHookViewComponent in 0.0056ms and returned Microsoft.AspNetCore.Mvc.ViewComponents.ViewViewComponentResult -2021-06-01 16:59:51.085 +08:00 [DBG] Executing view component Volo.Abp.AspNetCore.Mvc.UI.Components.LayoutHook.LayoutHookViewComponent with arguments (["Body.First","Application"]). -2021-06-01 16:59:51.085 +08:00 [DBG] Executed view component Volo.Abp.AspNetCore.Mvc.UI.Components.LayoutHook.LayoutHookViewComponent in 0.0028ms and returned Microsoft.AspNetCore.Mvc.ViewComponents.ViewViewComponentResult -2021-06-01 16:59:51.085 +08:00 [DBG] Executing view component Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Themes.Basic.Components.MainNavbar.MainNavbarViewComponent with arguments ([]). -2021-06-01 16:59:51.085 +08:00 [DBG] Executed view component Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Themes.Basic.Components.MainNavbar.MainNavbarViewComponent in 0.0017ms and returned Microsoft.AspNetCore.Mvc.ViewComponents.ViewViewComponentResult -2021-06-01 16:59:51.085 +08:00 [DBG] Executing view component Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Themes.Basic.Components.Brand.MainNavbarBrandViewComponent with arguments ([]). -2021-06-01 16:59:51.085 +08:00 [DBG] Executed view component Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Themes.Basic.Components.Brand.MainNavbarBrandViewComponent in 0.0014ms and returned Microsoft.AspNetCore.Mvc.ViewComponents.ViewViewComponentResult -2021-06-01 16:59:51.085 +08:00 [DBG] Executing view component Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Themes.Basic.Components.Menu.MainNavbarMenuViewComponent with arguments ([]). -2021-06-01 16:59:51.086 +08:00 [DBG] Executed view component Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Themes.Basic.Components.Menu.MainNavbarMenuViewComponent in 0.67ms and returned Microsoft.AspNetCore.Mvc.ViewComponents.ViewViewComponentResult -2021-06-01 16:59:51.086 +08:00 [DBG] Executing view component Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Themes.Basic.Components.Toolbar.MainNavbarToolbarViewComponent with arguments ([]). -2021-06-01 16:59:51.086 +08:00 [DBG] Executed view component Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Themes.Basic.Components.Toolbar.MainNavbarToolbarViewComponent in 0.0808ms and returned Microsoft.AspNetCore.Mvc.ViewComponents.ViewViewComponentResult -2021-06-01 16:59:51.087 +08:00 [DBG] Executing view component Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Themes.Basic.Components.PageAlerts.PageAlertsViewComponent with arguments ([""]). -2021-06-01 16:59:51.087 +08:00 [DBG] Executed view component Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Themes.Basic.Components.PageAlerts.PageAlertsViewComponent in 0.0036ms and returned Microsoft.AspNetCore.Mvc.ViewComponents.ViewViewComponentResult -2021-06-01 16:59:51.087 +08:00 [DBG] Executing view component Volo.Abp.AspNetCore.Mvc.UI.Components.LayoutHook.LayoutHookViewComponent with arguments (["PageContent.First","Application"]). -2021-06-01 16:59:51.087 +08:00 [DBG] Executed view component Volo.Abp.AspNetCore.Mvc.UI.Components.LayoutHook.LayoutHookViewComponent in 0.0033ms and returned Microsoft.AspNetCore.Mvc.ViewComponents.ViewViewComponentResult -2021-06-01 16:59:51.087 +08:00 [DBG] Executing view component Volo.Abp.AspNetCore.Mvc.UI.Components.LayoutHook.LayoutHookViewComponent with arguments (["PageContent.Last","Application"]). -2021-06-01 16:59:51.087 +08:00 [DBG] Executed view component Volo.Abp.AspNetCore.Mvc.UI.Components.LayoutHook.LayoutHookViewComponent in 0.0024ms and returned Microsoft.AspNetCore.Mvc.ViewComponents.ViewViewComponentResult -2021-06-01 16:59:51.088 +08:00 [DBG] Added bundle 'Basic.Global' to the page in 1.43 ms. -2021-06-01 16:59:51.089 +08:00 [DBG] Executing view component Volo.Abp.AspNetCore.Mvc.UI.Widgets.Components.WidgetScripts.WidgetScriptsViewComponent with arguments ([]). -2021-06-01 16:59:51.089 +08:00 [DBG] Executed view component Volo.Abp.AspNetCore.Mvc.UI.Widgets.Components.WidgetScripts.WidgetScriptsViewComponent in 0.0085ms and returned Microsoft.AspNetCore.Mvc.ViewComponents.ViewViewComponentResult -2021-06-01 16:59:51.093 +08:00 [DBG] Added bundle '46556DCF52CF332ECC1340A1295AFE9A' to the page in 1.18 ms. -2021-06-01 16:59:51.094 +08:00 [DBG] Executing view component Volo.Abp.AspNetCore.Mvc.UI.Components.LayoutHook.LayoutHookViewComponent with arguments (["Body.Last","Application"]). -2021-06-01 16:59:51.094 +08:00 [DBG] Executed view component Volo.Abp.AspNetCore.Mvc.UI.Components.LayoutHook.LayoutHookViewComponent in 0.0053ms and returned Microsoft.AspNetCore.Mvc.ViewComponents.ViewViewComponentResult -2021-06-01 16:59:51.097 +08:00 [INF] Executed page /Components/Alerts/Index in 3380.4634ms -2021-06-01 16:59:51.097 +08:00 [INF] Executed endpoint '/Components/Alerts/Index' -2021-06-01 16:59:51.097 +08:00 [DBG] Connection id "0HM94RECLNFIH" completed keep alive response. -2021-06-01 16:59:51.097 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/Components/Alerts - - - 200 - text/html;+charset=utf-8 3383.6529ms -2021-06-01 16:59:51.126 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/themes/basic/layout.css?_v=637581347776351428 - - -2021-06-01 16:59:51.126 +08:00 [INF] The file /themes/basic/layout.css was not modified -2021-06-01 16:59:51.126 +08:00 [DBG] Handled. Status code: 304 File: /themes/basic/layout.css -2021-06-01 16:59:51.126 +08:00 [DBG] Connection id "0HM94RECLNFIH" completed keep alive response. -2021-06-01 16:59:51.126 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/themes/basic/layout.css?_v=637581347776351428 - - - 304 - text/css 0.4588ms -2021-06-01 16:59:51.132 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/libs/prismjs/themes/prism-okaidia.css?_v=637543906070000000 - - -2021-06-01 16:59:51.132 +08:00 [INF] Sending file. Request path: '/libs/prismjs/themes/prism-okaidia.css'. Physical path: 'D:\Github\volo\volo5\abp\modules\basic-theme\app\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo\wwwroot\libs\prismjs\themes\prism-okaidia.css' -2021-06-01 16:59:51.132 +08:00 [DBG] Connection id "0HM94RECLNFIH" completed keep alive response. -2021-06-01 16:59:51.132 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/libs/prismjs/themes/prism-okaidia.css?_v=637543906070000000 - - - 200 1935 text/css 0.4067ms -2021-06-01 16:59:51.144 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/Abp/ApplicationConfigurationScript - - -2021-06-01 16:59:51.144 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/themes/basic/layout.js?_v=637581347776351428 - - -2021-06-01 16:59:51.144 +08:00 [DBG] The request path /Abp/ApplicationConfigurationScript does not match a supported file type -2021-06-01 16:59:51.144 +08:00 [DBG] 1 candidate(s) found for the request path '/Abp/ApplicationConfigurationScript' -2021-06-01 16:59:51.144 +08:00 [DBG] Endpoint 'Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController.Get (Volo.Abp.AspNetCore.Mvc)' with route pattern 'Abp/ApplicationConfigurationScript' is valid for the request path '/Abp/ApplicationConfigurationScript' -2021-06-01 16:59:51.144 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/libs/clipboard/clipboard.js?_v=637543906070000000 - - -2021-06-01 16:59:51.144 +08:00 [DBG] Request matched endpoint 'Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController.Get (Volo.Abp.AspNetCore.Mvc)' -2021-06-01 16:59:51.144 +08:00 [INF] Executing endpoint 'Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController.Get (Volo.Abp.AspNetCore.Mvc)' -2021-06-01 16:59:51.144 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/Abp/ServiceProxyScript - - -2021-06-01 16:59:51.144 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/libs/prismjs/prism.js?_v=637543906070000000 - - -2021-06-01 16:59:51.144 +08:00 [DBG] The request path /Abp/ServiceProxyScript does not match a supported file type -2021-06-01 16:59:51.144 +08:00 [DBG] 1 candidate(s) found for the request path '/Abp/ServiceProxyScript' -2021-06-01 16:59:51.145 +08:00 [DBG] Endpoint 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController.GetAll (Volo.Abp.AspNetCore.Mvc)' with route pattern 'Abp/ServiceProxyScript' is valid for the request path '/Abp/ServiceProxyScript' -2021-06-01 16:59:51.145 +08:00 [DBG] Request matched endpoint 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController.GetAll (Volo.Abp.AspNetCore.Mvc)' -2021-06-01 16:59:51.145 +08:00 [INF] Route matched with {area = "Abp", action = "Get", controller = "AbpApplicationConfigurationScript", page = ""}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.ActionResult] Get() on controller Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController (Volo.Abp.AspNetCore.Mvc). -2021-06-01 16:59:51.145 +08:00 [INF] Executing endpoint 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController.GetAll (Volo.Abp.AspNetCore.Mvc)' -2021-06-01 16:59:51.145 +08:00 [INF] The file /themes/basic/layout.js was not modified -2021-06-01 16:59:51.145 +08:00 [DBG] Execution plan of authorization filters (in the following order): ["Volo.Abp.AspNetCore.Mvc.AntiForgery.AbpAutoValidateAntiforgeryTokenAuthorizationFilter"] -2021-06-01 16:59:51.145 +08:00 [DBG] Handled. Status code: 304 File: /themes/basic/layout.js -2021-06-01 16:59:51.145 +08:00 [DBG] Execution plan of resource filters (in the following order): ["Microsoft.AspNetCore.Mvc.ViewFeatures.Filters.SaveTempDataFilter"] -2021-06-01 16:59:51.145 +08:00 [DBG] Connection id "0HM94RECLNFIG" completed keep alive response. -2021-06-01 16:59:51.145 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/themes/basic/layout.js?_v=637581347776351428 - - - 304 - application/javascript 0.5384ms -2021-06-01 16:59:51.145 +08:00 [DBG] Execution plan of action filters (in the following order): ["Microsoft.AspNetCore.Mvc.Filters.ControllerActionFilter (Order: -2147483648)","Microsoft.AspNetCore.Mvc.ModelBinding.UnsupportedContentTypeFilter (Order: -3000)","Volo.Abp.AspNetCore.Mvc.GlobalFeatures.GlobalFeatureActionFilter","Volo.Abp.AspNetCore.Mvc.Auditing.AbpAuditActionFilter","Volo.Abp.AspNetCore.Mvc.Response.AbpNoContentActionFilter","Volo.Abp.AspNetCore.Mvc.Features.AbpFeatureActionFilter","Volo.Abp.AspNetCore.Mvc.Validation.AbpValidationActionFilter","Volo.Abp.AspNetCore.Mvc.Uow.AbpUowActionFilter"] -2021-06-01 16:59:51.145 +08:00 [DBG] Execution plan of exception filters (in the following order): ["Volo.Abp.AspNetCore.Mvc.ExceptionHandling.AbpExceptionFilter"] -2021-06-01 16:59:51.145 +08:00 [DBG] Execution plan of result filters (in the following order): ["Microsoft.AspNetCore.Mvc.ViewFeatures.Filters.SaveTempDataFilter","Microsoft.AspNetCore.Mvc.ProducesAttribute (Order: 0)"] -2021-06-01 16:59:51.145 +08:00 [DBG] Executing controller factory for controller Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController (Volo.Abp.AspNetCore.Mvc) -2021-06-01 16:59:51.145 +08:00 [INF] Sending file. Request path: '/libs/clipboard/clipboard.js'. Physical path: 'D:\Github\volo\volo5\abp\modules\basic-theme\app\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo\wwwroot\libs\clipboard\clipboard.js' -2021-06-01 16:59:51.145 +08:00 [DBG] Connection id "0HM94RECLNFIC" completed keep alive response. -2021-06-01 16:59:51.145 +08:00 [INF] Route matched with {area = "Abp", action = "GetAll", controller = "AbpServiceProxyScript", page = ""}. Executing controller action with signature Microsoft.AspNetCore.Mvc.ActionResult GetAll(Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel) on controller Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController (Volo.Abp.AspNetCore.Mvc). -2021-06-01 16:59:51.145 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/libs/clipboard/clipboard.js?_v=637543906070000000 - - - 200 30465 application/javascript 0.5769ms -2021-06-01 16:59:51.145 +08:00 [DBG] Execution plan of authorization filters (in the following order): ["Volo.Abp.AspNetCore.Mvc.AntiForgery.AbpAutoValidateAntiforgeryTokenAuthorizationFilter"] -2021-06-01 16:59:51.145 +08:00 [DBG] Execution plan of resource filters (in the following order): ["Microsoft.AspNetCore.Mvc.ViewFeatures.Filters.SaveTempDataFilter"] -2021-06-01 16:59:51.145 +08:00 [DBG] Execution plan of action filters (in the following order): ["Microsoft.AspNetCore.Mvc.Filters.ControllerActionFilter (Order: -2147483648)","Microsoft.AspNetCore.Mvc.ModelBinding.UnsupportedContentTypeFilter (Order: -3000)","Volo.Abp.AspNetCore.Mvc.GlobalFeatures.GlobalFeatureActionFilter","Volo.Abp.AspNetCore.Mvc.Auditing.AbpAuditActionFilter","Volo.Abp.AspNetCore.Mvc.Response.AbpNoContentActionFilter","Volo.Abp.AspNetCore.Mvc.Features.AbpFeatureActionFilter","Volo.Abp.AspNetCore.Mvc.Validation.AbpValidationActionFilter","Volo.Abp.AspNetCore.Mvc.Uow.AbpUowActionFilter"] -2021-06-01 16:59:51.145 +08:00 [DBG] Execution plan of exception filters (in the following order): ["Volo.Abp.AspNetCore.Mvc.ExceptionHandling.AbpExceptionFilter"] -2021-06-01 16:59:51.145 +08:00 [DBG] Execution plan of result filters (in the following order): ["Microsoft.AspNetCore.Mvc.ViewFeatures.Filters.SaveTempDataFilter","Microsoft.AspNetCore.Mvc.ProducesAttribute (Order: 0)"] -2021-06-01 16:59:51.145 +08:00 [INF] Sending file. Request path: '/libs/prismjs/prism.js'. Physical path: 'D:\Github\volo\volo5\abp\modules\basic-theme\app\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo\wwwroot\libs\prismjs\prism.js' -2021-06-01 16:59:51.145 +08:00 [DBG] Connection id "0HM94RECLNFIF" completed keep alive response. -2021-06-01 16:59:51.145 +08:00 [DBG] Executing controller factory for controller Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController (Volo.Abp.AspNetCore.Mvc) -2021-06-01 16:59:51.145 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/libs/prismjs/prism.js?_v=637543906070000000 - - - 200 51100 application/javascript 0.6572ms -2021-06-01 16:59:51.145 +08:00 [DBG] Executed controller factory for controller Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController (Volo.Abp.AspNetCore.Mvc) -2021-06-01 16:59:51.145 +08:00 [DBG] Attempting to bind parameter 'model' of type 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel' ... -2021-06-01 16:59:51.145 +08:00 [DBG] Attempting to bind parameter 'model' of type 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel' using the name '' in request data ... -2021-06-01 16:59:51.146 +08:00 [DBG] Executed controller factory for controller Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController (Volo.Abp.AspNetCore.Mvc) -2021-06-01 16:59:51.146 +08:00 [DBG] Attempting to bind property 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel.Type' of type 'System.String' using the name 'Type' in request data ... -2021-06-01 16:59:51.146 +08:00 [DBG] Could not find a value in the request with name 'Type' for binding property 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel.Type' of type 'System.String'. -2021-06-01 16:59:51.146 +08:00 [DBG] Done attempting to bind property 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel.Type' of type 'System.String'. -2021-06-01 16:59:51.146 +08:00 [DBG] Attempting to bind property 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel.UseCache' of type 'System.Boolean' using the name 'UseCache' in request data ... -2021-06-01 16:59:51.146 +08:00 [DBG] Could not find a value in the request with name 'UseCache' for binding property 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel.UseCache' of type 'System.Boolean'. -2021-06-01 16:59:51.146 +08:00 [DBG] Done attempting to bind property 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel.UseCache' of type 'System.Boolean'. -2021-06-01 16:59:51.146 +08:00 [DBG] Attempting to bind property 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel.Modules' of type 'System.String' using the name 'Modules' in request data ... -2021-06-01 16:59:51.146 +08:00 [DBG] Could not find a value in the request with name 'Modules' for binding property 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel.Modules' of type 'System.String'. -2021-06-01 16:59:51.146 +08:00 [DBG] Done attempting to bind property 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel.Modules' of type 'System.String'. -2021-06-01 16:59:51.146 +08:00 [DBG] Attempting to bind property 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel.Controllers' of type 'System.String' using the name 'Controllers' in request data ... -2021-06-01 16:59:51.146 +08:00 [DBG] Could not find a value in the request with name 'Controllers' for binding property 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel.Controllers' of type 'System.String'. -2021-06-01 16:59:51.146 +08:00 [DBG] Done attempting to bind property 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel.Controllers' of type 'System.String'. -2021-06-01 16:59:51.146 +08:00 [DBG] Attempting to bind property 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel.Actions' of type 'System.String' using the name 'Actions' in request data ... -2021-06-01 16:59:51.146 +08:00 [DBG] Could not find a value in the request with name 'Actions' for binding property 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel.Actions' of type 'System.String'. -2021-06-01 16:59:51.146 +08:00 [DBG] Done attempting to bind property 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel.Actions' of type 'System.String'. -2021-06-01 16:59:51.146 +08:00 [DBG] Done attempting to bind parameter 'model' of type 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel'. -2021-06-01 16:59:51.146 +08:00 [DBG] Done attempting to bind parameter 'model' of type 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel'. -2021-06-01 16:59:51.146 +08:00 [DBG] Attempting to validate the bound parameter 'model' of type 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel' ... -2021-06-01 16:59:51.146 +08:00 [DBG] Done attempting to validate the bound parameter 'model' of type 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel'. -2021-06-01 16:59:51.146 +08:00 [DBG] Executing AbpApplicationConfigurationAppService.GetAsync()... -2021-06-01 16:59:51.147 +08:00 [DBG] Executed AbpApplicationConfigurationAppService.GetAsync(). -2021-06-01 16:59:51.148 +08:00 [INF] Executing ContentResult with HTTP Response ContentType of application/javascript -2021-06-01 16:59:51.148 +08:00 [INF] Executed action Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController.GetAll (Volo.Abp.AspNetCore.Mvc) in 2.6784ms -2021-06-01 16:59:51.148 +08:00 [INF] Executed endpoint 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController.GetAll (Volo.Abp.AspNetCore.Mvc)' -2021-06-01 16:59:51.148 +08:00 [DBG] Connection id "0HM94RECLNFIE" completed keep alive response. -2021-06-01 16:59:51.148 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/Abp/ServiceProxyScript - - - 200 1936 application/javascript 3.3773ms -2021-06-01 16:59:51.160 +08:00 [DBG] An antiforgery cookie token was reused. -2021-06-01 16:59:51.161 +08:00 [WRN] The cookie 'XSRF-TOKEN' has set 'SameSite=None' and must also set 'Secure'. -2021-06-01 16:59:51.161 +08:00 [INF] Executing ContentResult with HTTP Response ContentType of application/javascript -2021-06-01 16:59:51.161 +08:00 [INF] Executed action Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController.Get (Volo.Abp.AspNetCore.Mvc) in 16.0269ms -2021-06-01 16:59:51.161 +08:00 [INF] Executed endpoint 'Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController.Get (Volo.Abp.AspNetCore.Mvc)' -2021-06-01 16:59:51.161 +08:00 [DBG] Connection id "0HM94RECLNFIH" completed keep alive response. -2021-06-01 16:59:51.161 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/Abp/ApplicationConfigurationScript - - - 200 13072 application/javascript 16.7010ms -2021-06-01 17:01:18.739 +08:00 [INF] Starting web host. -2021-06-01 17:01:19.447 +08:00 [DBG] Hosting starting -2021-06-01 17:01:19.475 +08:00 [INF] User profile is available. Using 'C:\Users\maliming\AppData\Local\ASP.NET\DataProtection-Keys' as key repository and Windows DPAPI to encrypt keys at rest. -2021-06-01 17:01:19.491 +08:00 [DBG] Reading data from file 'C:\Users\maliming\AppData\Local\ASP.NET\DataProtection-Keys\key-00882981-b76a-49b5-97d9-cba33d1b2fac.xml'. -2021-06-01 17:01:19.497 +08:00 [DBG] Reading data from file 'C:\Users\maliming\AppData\Local\ASP.NET\DataProtection-Keys\key-16f92a94-47c6-46c3-8316-64624f1d6374.xml'. -2021-06-01 17:01:19.498 +08:00 [DBG] Reading data from file 'C:\Users\maliming\AppData\Local\ASP.NET\DataProtection-Keys\key-1c739fbe-ac37-4841-96ff-95f2e8e442b6.xml'. -2021-06-01 17:01:19.498 +08:00 [DBG] Reading data from file 'C:\Users\maliming\AppData\Local\ASP.NET\DataProtection-Keys\key-57b510d8-7687-4faf-9958-44ff9cb04f85.xml'. -2021-06-01 17:01:19.498 +08:00 [DBG] Reading data from file 'C:\Users\maliming\AppData\Local\ASP.NET\DataProtection-Keys\key-5c61addd-ecc0-4e6c-a356-8f093efb281c.xml'. -2021-06-01 17:01:19.498 +08:00 [DBG] Reading data from file 'C:\Users\maliming\AppData\Local\ASP.NET\DataProtection-Keys\key-62bbda5c-8775-40d5-9b98-5e1d890c023f.xml'. -2021-06-01 17:01:19.498 +08:00 [DBG] Reading data from file 'C:\Users\maliming\AppData\Local\ASP.NET\DataProtection-Keys\key-932dc0fd-9093-43a6-8a06-44006a08abea.xml'. -2021-06-01 17:01:19.498 +08:00 [DBG] Reading data from file 'C:\Users\maliming\AppData\Local\ASP.NET\DataProtection-Keys\key-98010c23-29bf-4f0d-8110-366f7c36adb0.xml'. -2021-06-01 17:01:19.498 +08:00 [DBG] Reading data from file 'C:\Users\maliming\AppData\Local\ASP.NET\DataProtection-Keys\key-9a3631e8-55e8-43d3-9d4b-5fd16c26d658.xml'. -2021-06-01 17:01:19.499 +08:00 [DBG] Reading data from file 'C:\Users\maliming\AppData\Local\ASP.NET\DataProtection-Keys\key-d7ba675e-ffb5-4484-b396-0913c3c07df2.xml'. -2021-06-01 17:01:19.503 +08:00 [DBG] Found key {00882981-b76a-49b5-97d9-cba33d1b2fac}. -2021-06-01 17:01:19.507 +08:00 [DBG] Found key {16f92a94-47c6-46c3-8316-64624f1d6374}. -2021-06-01 17:01:19.507 +08:00 [DBG] Found key {1c739fbe-ac37-4841-96ff-95f2e8e442b6}. -2021-06-01 17:01:19.507 +08:00 [DBG] Found key {57b510d8-7687-4faf-9958-44ff9cb04f85}. -2021-06-01 17:01:19.508 +08:00 [DBG] Found key {5c61addd-ecc0-4e6c-a356-8f093efb281c}. -2021-06-01 17:01:19.508 +08:00 [DBG] Found key {62bbda5c-8775-40d5-9b98-5e1d890c023f}. -2021-06-01 17:01:19.508 +08:00 [DBG] Found key {932dc0fd-9093-43a6-8a06-44006a08abea}. -2021-06-01 17:01:19.508 +08:00 [DBG] Found key {98010c23-29bf-4f0d-8110-366f7c36adb0}. -2021-06-01 17:01:19.508 +08:00 [DBG] Found key {9a3631e8-55e8-43d3-9d4b-5fd16c26d658}. -2021-06-01 17:01:19.508 +08:00 [DBG] Found key {d7ba675e-ffb5-4484-b396-0913c3c07df2}. -2021-06-01 17:01:19.517 +08:00 [DBG] Considering key {1c739fbe-ac37-4841-96ff-95f2e8e442b6} with expiration date 2021-08-29 01:43:16Z as default key. -2021-06-01 17:01:19.531 +08:00 [DBG] Forwarded activator type request from Microsoft.AspNetCore.DataProtection.XmlEncryption.DpapiXmlDecryptor, Microsoft.AspNetCore.DataProtection, Version=5.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60 to Microsoft.AspNetCore.DataProtection.XmlEncryption.DpapiXmlDecryptor, Microsoft.AspNetCore.DataProtection, Culture=neutral, PublicKeyToken=adb9793829ddae60 -2021-06-01 17:01:19.533 +08:00 [DBG] Decrypting secret element using Windows DPAPI. -2021-06-01 17:01:19.534 +08:00 [DBG] Forwarded activator type request from Microsoft.AspNetCore.DataProtection.AuthenticatedEncryption.ConfigurationModel.AuthenticatedEncryptorDescriptorDeserializer, Microsoft.AspNetCore.DataProtection, Version=5.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60 to Microsoft.AspNetCore.DataProtection.AuthenticatedEncryption.ConfigurationModel.AuthenticatedEncryptorDescriptorDeserializer, Microsoft.AspNetCore.DataProtection, Culture=neutral, PublicKeyToken=adb9793829ddae60 -2021-06-01 17:01:19.536 +08:00 [DBG] Opening CNG algorithm 'AES' from provider 'null' with chaining mode CBC. -2021-06-01 17:01:19.538 +08:00 [DBG] Opening CNG algorithm 'SHA256' from provider 'null' with HMAC. -2021-06-01 17:01:19.540 +08:00 [DBG] Using key {1c739fbe-ac37-4841-96ff-95f2e8e442b6} as the default key. -2021-06-01 17:01:19.541 +08:00 [DBG] Key ring with default key {1c739fbe-ac37-4841-96ff-95f2e8e442b6} was loaded during application startup. -2021-06-01 17:01:19.548 +08:00 [INF] Loaded ABP modules: -2021-06-01 17:01:19.548 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo.AbpAspNetCoreMvcUiThemeBasicDemoModule -2021-06-01 17:01:19.548 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.AbpAspNetCoreMvcUiBasicThemeModule -2021-06-01 17:01:19.548 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.AbpAspNetCoreMvcUiThemeSharedModule -2021-06-01 17:01:19.548 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.AbpAspNetCoreMvcUiBootstrapModule -2021-06-01 17:01:19.548 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.AbpAspNetCoreMvcUiModule -2021-06-01 17:01:19.548 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.AbpAspNetCoreMvcModule -2021-06-01 17:01:19.548 +08:00 [INF] - Volo.Abp.AspNetCore.AbpAspNetCoreModule -2021-06-01 17:01:19.548 +08:00 [INF] - Volo.Abp.Auditing.AbpAuditingModule -2021-06-01 17:01:19.549 +08:00 [INF] - Volo.Abp.Data.AbpDataModule -2021-06-01 17:01:19.549 +08:00 [INF] - Volo.Abp.ObjectExtending.AbpObjectExtendingModule -2021-06-01 17:01:19.549 +08:00 [INF] - Volo.Abp.Localization.AbpLocalizationAbstractionsModule -2021-06-01 17:01:19.549 +08:00 [INF] - Volo.Abp.Validation.AbpValidationAbstractionsModule -2021-06-01 17:01:19.549 +08:00 [INF] - Volo.Abp.Uow.AbpUnitOfWorkModule -2021-06-01 17:01:19.549 +08:00 [INF] - Volo.Abp.EventBus.Abstractions.AbpEventBusAbstractionsModule -2021-06-01 17:01:19.549 +08:00 [INF] - Volo.Abp.Json.AbpJsonModule -2021-06-01 17:01:19.549 +08:00 [INF] - Volo.Abp.Timing.AbpTimingModule -2021-06-01 17:01:19.549 +08:00 [INF] - Volo.Abp.Localization.AbpLocalizationModule -2021-06-01 17:01:19.549 +08:00 [INF] - Volo.Abp.VirtualFileSystem.AbpVirtualFileSystemModule -2021-06-01 17:01:19.549 +08:00 [INF] - Volo.Abp.Settings.AbpSettingsModule -2021-06-01 17:01:19.549 +08:00 [INF] - Volo.Abp.Security.AbpSecurityModule -2021-06-01 17:01:19.549 +08:00 [INF] - Volo.Abp.MultiTenancy.AbpMultiTenancyModule -2021-06-01 17:01:19.549 +08:00 [INF] - Volo.Abp.Threading.AbpThreadingModule -2021-06-01 17:01:19.549 +08:00 [INF] - Volo.Abp.Http.AbpHttpModule -2021-06-01 17:01:19.549 +08:00 [INF] - Volo.Abp.Http.AbpHttpAbstractionsModule -2021-06-01 17:01:19.549 +08:00 [INF] - Volo.Abp.Minify.AbpMinifyModule -2021-06-01 17:01:19.549 +08:00 [INF] - Volo.Abp.Authorization.AbpAuthorizationModule -2021-06-01 17:01:19.549 +08:00 [INF] - Volo.Abp.Authorization.AbpAuthorizationAbstractionsModule -2021-06-01 17:01:19.549 +08:00 [INF] - Volo.Abp.Validation.AbpValidationModule -2021-06-01 17:01:19.549 +08:00 [INF] - Volo.Abp.ExceptionHandling.AbpExceptionHandlingModule -2021-06-01 17:01:19.549 +08:00 [INF] - Volo.Abp.ApiVersioning.AbpApiVersioningAbstractionsModule -2021-06-01 17:01:19.549 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.AbpAspNetCoreMvcContractsModule -2021-06-01 17:01:19.549 +08:00 [INF] - Volo.Abp.Application.AbpDddApplicationContractsModule -2021-06-01 17:01:19.549 +08:00 [INF] - Volo.Abp.UI.Navigation.AbpUiNavigationModule -2021-06-01 17:01:19.549 +08:00 [INF] - Volo.Abp.UI.AbpUiModule -2021-06-01 17:01:19.549 +08:00 [INF] - Volo.Abp.GlobalFeatures.AbpGlobalFeaturesModule -2021-06-01 17:01:19.549 +08:00 [INF] - Volo.Abp.Application.AbpDddApplicationModule -2021-06-01 17:01:19.549 +08:00 [INF] - Volo.Abp.Domain.AbpDddDomainModule -2021-06-01 17:01:19.549 +08:00 [INF] - Volo.Abp.EventBus.AbpEventBusModule -2021-06-01 17:01:19.549 +08:00 [INF] - Volo.Abp.Guids.AbpGuidsModule -2021-06-01 17:01:19.549 +08:00 [INF] - Volo.Abp.ObjectMapping.AbpObjectMappingModule -2021-06-01 17:01:19.549 +08:00 [INF] - Volo.Abp.Specifications.AbpSpecificationsModule -2021-06-01 17:01:19.549 +08:00 [INF] - Volo.Abp.Features.AbpFeaturesModule -2021-06-01 17:01:19.549 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.Packages.AbpAspNetCoreMvcUiPackagesModule -2021-06-01 17:01:19.549 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.Bundling.AbpAspNetCoreMvcUiBundlingAbstractionsModule -2021-06-01 17:01:19.549 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.Widgets.AbpAspNetCoreMvcUiWidgetsModule -2021-06-01 17:01:19.549 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.Bundling.AbpAspNetCoreMvcUiBundlingModule -2021-06-01 17:01:19.549 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy.AbpAspNetCoreMvcUiMultiTenancyModule -2021-06-01 17:01:19.549 +08:00 [INF] - Volo.Abp.AspNetCore.MultiTenancy.AbpAspNetCoreMultiTenancyModule -2021-06-01 17:01:19.549 +08:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo.AbpAspNetCoreMvcUiThemeSharedDemoModule -2021-06-01 17:01:19.549 +08:00 [INF] - Volo.Abp.Autofac.AbpAutofacModule -2021-06-01 17:01:19.549 +08:00 [INF] - Volo.Abp.Castle.AbpCastleCoreModule -2021-06-01 17:01:20.060 +08:00 [INF] Initialized all ABP modules. -2021-06-01 17:01:20.093 +08:00 [INF] Now listening on: http://localhost:5000 -2021-06-01 17:01:20.093 +08:00 [DBG] Loaded hosting startup assembly Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo -2021-06-01 17:01:20.093 +08:00 [INF] Application started. Press Ctrl+C to shut down. -2021-06-01 17:01:20.093 +08:00 [INF] Hosting environment: Development -2021-06-01 17:01:20.093 +08:00 [INF] Content root path: D:\Github\volo\volo5\abp\modules\basic-theme\app\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo -2021-06-01 17:01:20.093 +08:00 [DBG] Hosting started -2021-06-01 17:01:20.122 +08:00 [DBG] Connection id "0HM94RF9BC7D3" received FIN. -2021-06-01 17:01:20.131 +08:00 [DBG] Connection id "0HM94RF9BC7D3" accepted. -2021-06-01 17:01:20.131 +08:00 [DBG] Connection id "0HM94RF9BC7D3" started. -2021-06-01 17:01:20.136 +08:00 [DBG] Connection id "0HM94RF9BC7D3" sending FIN because: "The client closed the connection." -2021-06-01 17:01:20.138 +08:00 [DBG] Connection id "0HM94RF9BC7D3" disconnecting. -2021-06-01 17:01:20.140 +08:00 [DBG] Connection id "0HM94RF9BC7D3" stopped. -2021-06-01 17:01:20.189 +08:00 [DBG] Connection id "0HM94RF9BC7D4" accepted. -2021-06-01 17:01:20.189 +08:00 [DBG] Connection id "0HM94RF9BC7D4" started. -2021-06-01 17:01:20.189 +08:00 [DBG] Connection id "0HM94RF9BC7D5" accepted. -2021-06-01 17:01:20.189 +08:00 [DBG] Connection id "0HM94RF9BC7D5" started. -2021-06-01 17:01:20.218 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/ - - -2021-06-01 17:01:20.218 +08:00 [DBG] Wildcard detected, all requests with hosts will be allowed. -2021-06-01 17:01:20.220 +08:00 [DBG] The request path / does not match a supported file type -2021-06-01 17:01:20.250 +08:00 [DBG] 1 candidate(s) found for the request path '/' -2021-06-01 17:01:20.252 +08:00 [DBG] Endpoint 'Page: /Index' with route pattern '' is valid for the request path '/' -2021-06-01 17:01:20.256 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/Components/Alerts/Index.cshtml'. -2021-06-01 17:01:20.256 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/Components/Badges/Index.cshtml'. -2021-06-01 17:01:20.256 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/Components/Borders/Index.cshtml'. -2021-06-01 17:01:20.256 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/Components/Breadcrumbs/Index.cshtml'. -2021-06-01 17:01:20.256 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/Components/ButtonGroups/Index.cshtml'. -2021-06-01 17:01:20.256 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/Components/Buttons/Index.cshtml'. -2021-06-01 17:01:20.256 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/Components/Cards/Index.cshtml'. -2021-06-01 17:01:20.256 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/Components/Carousel/Index.cshtml'. -2021-06-01 17:01:20.256 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/Components/Collapse/Index.cshtml'. -2021-06-01 17:01:20.256 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/Components/Dropdowns/Index.cshtml'. -2021-06-01 17:01:20.256 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/Components/DynamicForms/Index.cshtml'. -2021-06-01 17:01:20.256 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/Components/FormElements/Index.cshtml'. -2021-06-01 17:01:20.256 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/Components/Grids/Index.cshtml'. -2021-06-01 17:01:20.256 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/Components/Index.cshtml'. -2021-06-01 17:01:20.256 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/Components/ListGroups/Index.cshtml'. -2021-06-01 17:01:20.256 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/Components/Modals/Index.cshtml'. -2021-06-01 17:01:20.256 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/Components/Navbars/Index.cshtml'. -2021-06-01 17:01:20.256 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/Components/Navs/Index.cshtml'. -2021-06-01 17:01:20.256 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/Components/Paginator/Index.cshtml'. -2021-06-01 17:01:20.256 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/Components/Popovers/Index.cshtml'. -2021-06-01 17:01:20.256 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/Components/ProgressBars/Index.cshtml'. -2021-06-01 17:01:20.256 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/Components/Tables/Index.cshtml'. -2021-06-01 17:01:20.256 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/Components/Tabs/Index.cshtml'. -2021-06-01 17:01:20.256 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/Components/Tooltips/Index.cshtml'. -2021-06-01 17:01:20.256 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/Index.cshtml'. -2021-06-01 17:01:20.256 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/_ViewImports.cshtml'. -2021-06-01 17:01:20.256 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/_ViewImports.cshtml'. -2021-06-01 17:01:20.256 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Themes/Basic/Components/Brand/Default.cshtml'. -2021-06-01 17:01:20.256 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Themes/Basic/Components/MainNavbar/Default.cshtml'. -2021-06-01 17:01:20.256 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Themes/Basic/Components/Menu/Default.cshtml'. -2021-06-01 17:01:20.256 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Themes/Basic/Components/Menu/_MenuItem.cshtml'. -2021-06-01 17:01:20.256 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Themes/Basic/Components/PageAlerts/Default.cshtml'. -2021-06-01 17:01:20.256 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Themes/Basic/Components/Toolbar/Default.cshtml'. -2021-06-01 17:01:20.256 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Themes/Basic/Components/Toolbar/LanguageSwitch/Default.cshtml'. -2021-06-01 17:01:20.256 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Themes/Basic/Components/Toolbar/UserMenu/Default.cshtml'. -2021-06-01 17:01:20.256 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Themes/Basic/Layouts/Account.cshtml'. -2021-06-01 17:01:20.256 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Themes/Basic/Layouts/Application.cshtml'. -2021-06-01 17:01:20.256 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Themes/Basic/Layouts/Empty.cshtml'. -2021-06-01 17:01:20.256 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Themes/Basic/_ViewImports.cshtml'. -2021-06-01 17:01:20.256 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Views/_ViewImports.cshtml'. -2021-06-01 17:01:20.256 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/Abp/MultiTenancy/TenantSwitchModal.cshtml'. -2021-06-01 17:01:20.256 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/Abp/MultiTenancy/_ViewImports.cshtml'. -2021-06-01 17:01:20.256 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Areas/_ViewStart.cshtml'. -2021-06-01 17:01:20.256 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/Account/_ViewStart.cshtml'. -2021-06-01 17:01:20.256 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/Shared/Components/AbpApplicationPath/Default.cshtml'. -2021-06-01 17:01:20.256 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/Shared/Components/AbpPageSearchBox/Default.cshtml'. -2021-06-01 17:01:20.256 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/Shared/Components/AbpPageSearchBox/_ViewImports.cshtml'. -2021-06-01 17:01:20.256 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/Shared/Components/AbpPageToolbar/Button/Default.cshtml'. -2021-06-01 17:01:20.256 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/Shared/Components/AbpPageToolbar/Default.cshtml'. -2021-06-01 17:01:20.256 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/Shared/Components/AbpPageToolbar/_ViewImports.cshtml'. -2021-06-01 17:01:20.256 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Pages/_ViewStart.cshtml'. -2021-06-01 17:01:20.256 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Views/Error/Default.cshtml'. -2021-06-01 17:01:20.256 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Views/_ViewStart.cshtml'. -2021-06-01 17:01:20.256 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Volo/Abp/AspNetCore/Mvc/UI/Widgets/Components/WidgetScripts/Default.cshtml'. -2021-06-01 17:01:20.256 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Volo/Abp/AspNetCore/Mvc/UI/Widgets/Components/WidgetStyles/Default.cshtml'. -2021-06-01 17:01:20.256 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Volo/Abp/AspNetCore/Mvc/UI/Widgets/Components/_ViewImports.cshtml'. -2021-06-01 17:01:20.256 +08:00 [DBG] Initializing Razor view compiler with compiled view: '/Volo/Abp/AspNetCore/Mvc/UI/Components/LayoutHook/Default.cshtml'. -2021-06-01 17:01:20.270 +08:00 [DBG] Request matched endpoint '/Index' -2021-06-01 17:01:20.270 +08:00 [INF] Executing endpoint '/Index' -2021-06-01 17:01:20.281 +08:00 [DBG] Registered model binder providers, in the following order: ["Volo.Abp.AspNetCore.Mvc.ModelBinding.AbpDateTimeModelBinderProvider","Volo.Abp.AspNetCore.Mvc.ModelBinding.AbpExtraPropertiesDictionaryModelBinderProvider","Volo.Abp.AspNetCore.Mvc.ContentFormatters.AbpRemoteStreamContentModelBinderProvider","Microsoft.AspNetCore.Mvc.ModelBinding.Binders.BinderTypeModelBinderProvider","Microsoft.AspNetCore.Mvc.ModelBinding.Binders.ServicesModelBinderProvider","Microsoft.AspNetCore.Mvc.ModelBinding.Binders.BodyModelBinderProvider","Microsoft.AspNetCore.Mvc.ModelBinding.Binders.HeaderModelBinderProvider","Microsoft.AspNetCore.Mvc.ModelBinding.Binders.FloatingPointTypeModelBinderProvider","Microsoft.AspNetCore.Mvc.ModelBinding.Binders.EnumTypeModelBinderProvider","Microsoft.AspNetCore.Mvc.ModelBinding.Binders.DateTimeModelBinderProvider","Microsoft.AspNetCore.Mvc.ModelBinding.Binders.SimpleTypeModelBinderProvider","Microsoft.AspNetCore.Mvc.ModelBinding.Binders.CancellationTokenModelBinderProvider","Microsoft.AspNetCore.Mvc.ModelBinding.Binders.ByteArrayModelBinderProvider","Microsoft.AspNetCore.Mvc.ModelBinding.Binders.FormFileModelBinderProvider","Microsoft.AspNetCore.Mvc.ModelBinding.Binders.FormCollectionModelBinderProvider","Microsoft.AspNetCore.Mvc.ModelBinding.Binders.KeyValuePairModelBinderProvider","Microsoft.AspNetCore.Mvc.ModelBinding.Binders.DictionaryModelBinderProvider","Microsoft.AspNetCore.Mvc.ModelBinding.Binders.ArrayModelBinderProvider","Microsoft.AspNetCore.Mvc.ModelBinding.Binders.CollectionModelBinderProvider","Microsoft.AspNetCore.Mvc.ModelBinding.Binders.ComplexObjectModelBinderProvider"] -2021-06-01 17:01:20.329 +08:00 [INF] Route matched with {page = "/Index", area = "", action = "", controller = ""}. Executing page /Index -2021-06-01 17:01:20.329 +08:00 [DBG] Execution plan of authorization filters (in the following order): ["Volo.Abp.AspNetCore.Mvc.AntiForgery.AbpAutoValidateAntiforgeryTokenAuthorizationFilter","Microsoft.AspNetCore.Mvc.ViewFeatures.Filters.AutoValidateAntiforgeryTokenAuthorizationFilter"] -2021-06-01 17:01:20.329 +08:00 [DBG] Execution plan of resource filters (in the following order): ["Microsoft.AspNetCore.Mvc.ViewFeatures.Filters.SaveTempDataFilter"] -2021-06-01 17:01:20.329 +08:00 [DBG] Execution plan of action filters (in the following order): ["Microsoft.AspNetCore.Mvc.ModelBinding.UnsupportedContentTypeFilter (Order: -3000)","Volo.Abp.AspNetCore.Mvc.GlobalFeatures.GlobalFeatureActionFilter","Volo.Abp.AspNetCore.Mvc.Auditing.AbpAuditActionFilter","Volo.Abp.AspNetCore.Mvc.Response.AbpNoContentActionFilter","Volo.Abp.AspNetCore.Mvc.Features.AbpFeatureActionFilter","Volo.Abp.AspNetCore.Mvc.Validation.AbpValidationActionFilter","Volo.Abp.AspNetCore.Mvc.Uow.AbpUowActionFilter"] -2021-06-01 17:01:20.329 +08:00 [DBG] Execution plan of exception filters (in the following order): ["Volo.Abp.AspNetCore.Mvc.ExceptionHandling.AbpExceptionFilter"] -2021-06-01 17:01:20.329 +08:00 [DBG] Execution plan of result filters (in the following order): ["Microsoft.AspNetCore.Mvc.ViewFeatures.Filters.SaveTempDataFilter"] -2021-06-01 17:01:20.331 +08:00 [INF] Skipping the execution of current filter as its not the most effective filter implementing the policy Microsoft.AspNetCore.Mvc.ViewFeatures.IAntiforgeryPolicy -2021-06-01 17:01:20.332 +08:00 [DBG] Executing page model factory for page AspNetCore.Pages_Index (Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo.Views) -2021-06-01 17:01:20.332 +08:00 [DBG] Executed page model factory for page AspNetCore.Pages_Index (Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo.Views) -2021-06-01 17:01:20.370 +08:00 [INF] Executing handler method Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo.Pages.IndexModel.OnGet - ModelState is "Valid" -2021-06-01 17:01:20.371 +08:00 [INF] Executed handler method OnGet, returned result . -2021-06-01 17:01:20.374 +08:00 [INF] Executing an implicit handler method - ModelState is "Valid" -2021-06-01 17:01:20.374 +08:00 [INF] Executed an implicit handler method, returned result Microsoft.AspNetCore.Mvc.RazorPages.PageResult. -2021-06-01 17:01:20.508 +08:00 [DBG] Executing view component Volo.Abp.AspNetCore.Mvc.UI.Components.LayoutHook.LayoutHookViewComponent with arguments (["Header.First","Application"]). -2021-06-01 17:01:20.513 +08:00 [DBG] Executed view component Volo.Abp.AspNetCore.Mvc.UI.Components.LayoutHook.LayoutHookViewComponent in 0.7273ms and returned Microsoft.AspNetCore.Mvc.ViewComponents.ViewViewComponentResult -2021-06-01 17:01:20.565 +08:00 [DBG] Added bundle 'Basic.Global' to the page in 14.97 ms. -2021-06-01 17:01:20.566 +08:00 [DBG] Executing view component Volo.Abp.AspNetCore.Mvc.UI.Widgets.Components.WidgetStyles.WidgetStylesViewComponent with arguments ([]). -2021-06-01 17:01:20.567 +08:00 [DBG] Executed view component Volo.Abp.AspNetCore.Mvc.UI.Widgets.Components.WidgetStyles.WidgetStylesViewComponent in 1.1947ms and returned Microsoft.AspNetCore.Mvc.ViewComponents.ViewViewComponentResult -2021-06-01 17:01:20.572 +08:00 [DBG] Executing view component Volo.Abp.AspNetCore.Mvc.UI.Components.LayoutHook.LayoutHookViewComponent with arguments (["Header.Last","Application"]). -2021-06-01 17:01:20.572 +08:00 [DBG] Executed view component Volo.Abp.AspNetCore.Mvc.UI.Components.LayoutHook.LayoutHookViewComponent in 0.0097ms and returned Microsoft.AspNetCore.Mvc.ViewComponents.ViewViewComponentResult -2021-06-01 17:01:20.577 +08:00 [DBG] Executing view component Volo.Abp.AspNetCore.Mvc.UI.Components.LayoutHook.LayoutHookViewComponent with arguments (["Body.First","Application"]). -2021-06-01 17:01:20.577 +08:00 [DBG] Executed view component Volo.Abp.AspNetCore.Mvc.UI.Components.LayoutHook.LayoutHookViewComponent in 0.0071ms and returned Microsoft.AspNetCore.Mvc.ViewComponents.ViewViewComponentResult -2021-06-01 17:01:20.578 +08:00 [DBG] Executing view component Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Themes.Basic.Components.MainNavbar.MainNavbarViewComponent with arguments ([]). -2021-06-01 17:01:20.578 +08:00 [DBG] Executed view component Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Themes.Basic.Components.MainNavbar.MainNavbarViewComponent in 0.2169ms and returned Microsoft.AspNetCore.Mvc.ViewComponents.ViewViewComponentResult -2021-06-01 17:01:20.582 +08:00 [DBG] Executing view component Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Themes.Basic.Components.Brand.MainNavbarBrandViewComponent with arguments ([]). -2021-06-01 17:01:20.582 +08:00 [DBG] Executed view component Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Themes.Basic.Components.Brand.MainNavbarBrandViewComponent in 0.1668ms and returned Microsoft.AspNetCore.Mvc.ViewComponents.ViewViewComponentResult -2021-06-01 17:01:20.601 +08:00 [DBG] Executing view component Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Themes.Basic.Components.Menu.MainNavbarMenuViewComponent with arguments ([]). -2021-06-01 17:01:20.645 +08:00 [DBG] Executed view component Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Themes.Basic.Components.Menu.MainNavbarMenuViewComponent in 43.2642ms and returned Microsoft.AspNetCore.Mvc.ViewComponents.ViewViewComponentResult -2021-06-01 17:01:20.663 +08:00 [DBG] Executing view component Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Themes.Basic.Components.Toolbar.MainNavbarToolbarViewComponent with arguments ([]). -2021-06-01 17:01:20.670 +08:00 [DBG] Executed view component Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Themes.Basic.Components.Toolbar.MainNavbarToolbarViewComponent in 6.9619ms and returned Microsoft.AspNetCore.Mvc.ViewComponents.ViewViewComponentResult -2021-06-01 17:01:20.675 +08:00 [DBG] Executing view component Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Themes.Basic.Components.PageAlerts.PageAlertsViewComponent with arguments ([""]). -2021-06-01 17:01:20.676 +08:00 [DBG] Executed view component Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Themes.Basic.Components.PageAlerts.PageAlertsViewComponent in 0.4039ms and returned Microsoft.AspNetCore.Mvc.ViewComponents.ViewViewComponentResult -2021-06-01 17:01:20.681 +08:00 [DBG] Executing view component Volo.Abp.AspNetCore.Mvc.UI.Components.LayoutHook.LayoutHookViewComponent with arguments (["PageContent.First","Application"]). -2021-06-01 17:01:20.681 +08:00 [DBG] Executed view component Volo.Abp.AspNetCore.Mvc.UI.Components.LayoutHook.LayoutHookViewComponent in 0.0079ms and returned Microsoft.AspNetCore.Mvc.ViewComponents.ViewViewComponentResult -2021-06-01 17:01:20.681 +08:00 [DBG] Executing view component Volo.Abp.AspNetCore.Mvc.UI.Components.LayoutHook.LayoutHookViewComponent with arguments (["PageContent.Last","Application"]). -2021-06-01 17:01:20.681 +08:00 [DBG] Executed view component Volo.Abp.AspNetCore.Mvc.UI.Components.LayoutHook.LayoutHookViewComponent in 0.0033ms and returned Microsoft.AspNetCore.Mvc.ViewComponents.ViewViewComponentResult -2021-06-01 17:01:20.691 +08:00 [DBG] Added bundle 'Basic.Global' to the page in 7.41 ms. -2021-06-01 17:01:20.693 +08:00 [DBG] Executing view component Volo.Abp.AspNetCore.Mvc.UI.Widgets.Components.WidgetScripts.WidgetScriptsViewComponent with arguments ([]). -2021-06-01 17:01:20.693 +08:00 [DBG] Executed view component Volo.Abp.AspNetCore.Mvc.UI.Widgets.Components.WidgetScripts.WidgetScriptsViewComponent in 0.2635ms and returned Microsoft.AspNetCore.Mvc.ViewComponents.ViewViewComponentResult -2021-06-01 17:01:20.696 +08:00 [DBG] Executing view component Volo.Abp.AspNetCore.Mvc.UI.Components.LayoutHook.LayoutHookViewComponent with arguments (["Body.Last","Application"]). -2021-06-01 17:01:20.696 +08:00 [DBG] Executed view component Volo.Abp.AspNetCore.Mvc.UI.Components.LayoutHook.LayoutHookViewComponent in 0.0056ms and returned Microsoft.AspNetCore.Mvc.ViewComponents.ViewViewComponentResult -2021-06-01 17:01:20.705 +08:00 [INF] Executed page /Index in 371.6076ms -2021-06-01 17:01:20.705 +08:00 [INF] Executed endpoint '/Index' -2021-06-01 17:01:20.705 +08:00 [DBG] Connection id "0HM94RF9BC7D4" completed keep alive response. -2021-06-01 17:01:20.711 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/ - - - 200 - text/html;+charset=utf-8 493.6915ms -2021-06-01 17:01:20.757 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/libs/abp/aspnetcore-mvc-ui-theme-shared/datatables/datatables-styles.css?_v=637581344238055428 - - -2021-06-01 17:01:20.758 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/themes/basic/layout.css?_v=637581348738017854 - - -2021-06-01 17:01:20.760 +08:00 [INF] The file /libs/abp/aspnetcore-mvc-ui-theme-shared/datatables/datatables-styles.css was not modified -2021-06-01 17:01:20.760 +08:00 [DBG] Handled. Status code: 304 File: /libs/abp/aspnetcore-mvc-ui-theme-shared/datatables/datatables-styles.css -2021-06-01 17:01:20.761 +08:00 [DBG] Connection id "0HM94RF9BC7D5" completed keep alive response. -2021-06-01 17:01:20.761 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/libs/abp/aspnetcore-mvc-ui-theme-shared/datatables/datatables-styles.css?_v=637581344238055428 - - - 304 - text/css 4.0093ms -2021-06-01 17:01:20.761 +08:00 [INF] Sending file. Request path: '/themes/basic/layout.css'. Physical path: 'N/A' -2021-06-01 17:01:20.762 +08:00 [DBG] Connection id "0HM94RF9BC7D4" completed keep alive response. -2021-06-01 17:01:20.762 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/themes/basic/layout.css?_v=637581348738017854 - - - 200 1735 text/css 3.7759ms -2021-06-01 17:01:20.765 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/libs/abp/aspnetcore-mvc-ui-theme-shared/ui-extensions.js?_v=637581344238055428 - - -2021-06-01 17:01:20.765 +08:00 [INF] The file /libs/abp/aspnetcore-mvc-ui-theme-shared/ui-extensions.js was not modified -2021-06-01 17:01:20.765 +08:00 [DBG] Handled. Status code: 304 File: /libs/abp/aspnetcore-mvc-ui-theme-shared/ui-extensions.js -2021-06-01 17:01:20.765 +08:00 [DBG] Connection id "0HM94RF9BC7D5" completed keep alive response. -2021-06-01 17:01:20.765 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/libs/abp/aspnetcore-mvc-ui-theme-shared/ui-extensions.js?_v=637581344238055428 - - - 304 - application/javascript 0.4319ms -2021-06-01 17:01:20.765 +08:00 [DBG] Connection id "0HM94RF9BC7D6" accepted. -2021-06-01 17:01:20.765 +08:00 [DBG] Connection id "0HM94RF9BC7D6" started. -2021-06-01 17:01:20.766 +08:00 [DBG] Connection id "0HM94RF9BC7D7" accepted. -2021-06-01 17:01:20.766 +08:00 [DBG] Connection id "0HM94RF9BC7D7" started. -2021-06-01 17:01:20.766 +08:00 [DBG] Connection id "0HM94RF9BC7D8" accepted. -2021-06-01 17:01:20.766 +08:00 [DBG] Connection id "0HM94RF9BC7D8" started. -2021-06-01 17:01:20.767 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/libs/abp/aspnetcore-mvc-ui-theme-shared/jquery/jquery-extensions.js?_v=637581344238055428 - - -2021-06-01 17:01:20.767 +08:00 [INF] The file /libs/abp/aspnetcore-mvc-ui-theme-shared/jquery/jquery-extensions.js was not modified -2021-06-01 17:01:20.767 +08:00 [DBG] Handled. Status code: 304 File: /libs/abp/aspnetcore-mvc-ui-theme-shared/jquery/jquery-extensions.js -2021-06-01 17:01:20.767 +08:00 [DBG] Connection id "0HM94RF9BC7D6" completed keep alive response. -2021-06-01 17:01:20.767 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/libs/abp/aspnetcore-mvc-ui-theme-shared/jquery/jquery-extensions.js?_v=637581344238055428 - - - 304 - application/javascript 0.4725ms -2021-06-01 17:01:20.767 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/libs/abp/aspnetcore-mvc-ui-theme-shared/jquery-form/jquery-form-extensions.js?_v=637581344238055428 - - -2021-06-01 17:01:20.768 +08:00 [INF] The file /libs/abp/aspnetcore-mvc-ui-theme-shared/jquery-form/jquery-form-extensions.js was not modified -2021-06-01 17:01:20.768 +08:00 [DBG] Handled. Status code: 304 File: /libs/abp/aspnetcore-mvc-ui-theme-shared/jquery-form/jquery-form-extensions.js -2021-06-01 17:01:20.768 +08:00 [DBG] Connection id "0HM94RF9BC7D7" completed keep alive response. -2021-06-01 17:01:20.768 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/libs/abp/aspnetcore-mvc-ui-theme-shared/jquery-form/jquery-form-extensions.js?_v=637581344238055428 - - - 304 - application/javascript 0.5060ms -2021-06-01 17:01:20.768 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/libs/abp/aspnetcore-mvc-ui-theme-shared/jquery/widget-manager.js?_v=637581344238055428 - - -2021-06-01 17:01:20.768 +08:00 [INF] The file /libs/abp/aspnetcore-mvc-ui-theme-shared/jquery/widget-manager.js was not modified -2021-06-01 17:01:20.768 +08:00 [DBG] Handled. Status code: 304 File: /libs/abp/aspnetcore-mvc-ui-theme-shared/jquery/widget-manager.js -2021-06-01 17:01:20.768 +08:00 [DBG] Connection id "0HM94RF9BC7D8" completed keep alive response. -2021-06-01 17:01:20.768 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/libs/abp/aspnetcore-mvc-ui-theme-shared/jquery/widget-manager.js?_v=637581344238055428 - - - 304 - application/javascript 0.4057ms -2021-06-01 17:01:20.769 +08:00 [DBG] Connection id "0HM94RF9BC7D9" accepted. -2021-06-01 17:01:20.769 +08:00 [DBG] Connection id "0HM94RF9BC7D9" started. -2021-06-01 17:01:20.769 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/libs/abp/aspnetcore-mvc-ui-theme-shared/bootstrap/dom-event-handlers.js?_v=637581344238055428 - - -2021-06-01 17:01:20.769 +08:00 [INF] The file /libs/abp/aspnetcore-mvc-ui-theme-shared/bootstrap/dom-event-handlers.js was not modified -2021-06-01 17:01:20.769 +08:00 [DBG] Handled. Status code: 304 File: /libs/abp/aspnetcore-mvc-ui-theme-shared/bootstrap/dom-event-handlers.js -2021-06-01 17:01:20.769 +08:00 [DBG] Connection id "0HM94RF9BC7D5" completed keep alive response. -2021-06-01 17:01:20.770 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/libs/abp/aspnetcore-mvc-ui-theme-shared/bootstrap/dom-event-handlers.js?_v=637581344238055428 - - - 304 - application/javascript 0.4231ms -2021-06-01 17:01:20.779 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/libs/abp/aspnetcore-mvc-ui-theme-shared/datatables/datatables-extensions.js?_v=637581344238055428 - - -2021-06-01 17:01:20.779 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/libs/abp/aspnetcore-mvc-ui-theme-shared/bootstrap/modal-manager.js?_v=637581344238055428 - - -2021-06-01 17:01:20.779 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/libs/abp/aspnetcore-mvc-ui-theme-shared/sweetalert/abp-sweetalert.js?_v=637581344238055428 - - -2021-06-01 17:01:20.779 +08:00 [INF] The file /libs/abp/aspnetcore-mvc-ui-theme-shared/datatables/datatables-extensions.js was not modified -2021-06-01 17:01:20.779 +08:00 [DBG] Handled. Status code: 304 File: /libs/abp/aspnetcore-mvc-ui-theme-shared/datatables/datatables-extensions.js -2021-06-01 17:01:20.779 +08:00 [DBG] Connection id "0HM94RF9BC7D6" completed keep alive response. -2021-06-01 17:01:20.779 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/libs/abp/aspnetcore-mvc-ui-theme-shared/datatables/datatables-extensions.js?_v=637581344238055428 - - - 304 - application/javascript 0.4264ms -2021-06-01 17:01:20.779 +08:00 [INF] The file /libs/abp/aspnetcore-mvc-ui-theme-shared/sweetalert/abp-sweetalert.js was not modified -2021-06-01 17:01:20.779 +08:00 [INF] The file /libs/abp/aspnetcore-mvc-ui-theme-shared/bootstrap/modal-manager.js was not modified -2021-06-01 17:01:20.779 +08:00 [DBG] Handled. Status code: 304 File: /libs/abp/aspnetcore-mvc-ui-theme-shared/sweetalert/abp-sweetalert.js -2021-06-01 17:01:20.779 +08:00 [DBG] Handled. Status code: 304 File: /libs/abp/aspnetcore-mvc-ui-theme-shared/bootstrap/modal-manager.js -2021-06-01 17:01:20.779 +08:00 [DBG] Connection id "0HM94RF9BC7D9" completed keep alive response. -2021-06-01 17:01:20.779 +08:00 [DBG] Connection id "0HM94RF9BC7D7" completed keep alive response. -2021-06-01 17:01:20.779 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/libs/abp/aspnetcore-mvc-ui-theme-shared/sweetalert/abp-sweetalert.js?_v=637581344238055428 - - - 304 - application/javascript 0.3476ms -2021-06-01 17:01:20.779 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/libs/abp/aspnetcore-mvc-ui-theme-shared/bootstrap/modal-manager.js?_v=637581344238055428 - - - 304 - application/javascript 0.3747ms -2021-06-01 17:01:20.780 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/themes/basic/layout.js?_v=637581348738017854 - - -2021-06-01 17:01:20.780 +08:00 [INF] Sending file. Request path: '/themes/basic/layout.js'. Physical path: 'N/A' -2021-06-01 17:01:20.780 +08:00 [DBG] Connection id "0HM94RF9BC7D4" completed keep alive response. -2021-06-01 17:01:20.780 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/libs/abp/aspnetcore-mvc-ui-theme-shared/toastr/abp-toastr.js?_v=637581344238055428 - - -2021-06-01 17:01:20.780 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/Pages/Abp/MultiTenancy/tenant-switch.js?_v=637581344246206036 - - -2021-06-01 17:01:20.780 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/themes/basic/layout.js?_v=637581348738017854 - - - 200 546 application/javascript 0.5435ms -2021-06-01 17:01:20.781 +08:00 [INF] The file /libs/abp/aspnetcore-mvc-ui-theme-shared/toastr/abp-toastr.js was not modified -2021-06-01 17:01:20.781 +08:00 [INF] The file /Pages/Abp/MultiTenancy/tenant-switch.js was not modified -2021-06-01 17:01:20.781 +08:00 [DBG] Handled. Status code: 304 File: /libs/abp/aspnetcore-mvc-ui-theme-shared/toastr/abp-toastr.js -2021-06-01 17:01:20.781 +08:00 [DBG] Handled. Status code: 304 File: /Pages/Abp/MultiTenancy/tenant-switch.js -2021-06-01 17:01:20.781 +08:00 [DBG] Connection id "0HM94RF9BC7D8" completed keep alive response. -2021-06-01 17:01:20.781 +08:00 [DBG] Connection id "0HM94RF9BC7D5" completed keep alive response. -2021-06-01 17:01:20.781 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/libs/abp/aspnetcore-mvc-ui-theme-shared/toastr/abp-toastr.js?_v=637581344238055428 - - - 304 - application/javascript 0.3322ms -2021-06-01 17:01:20.781 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/Pages/Abp/MultiTenancy/tenant-switch.js?_v=637581344246206036 - - - 304 - application/javascript 0.3554ms -2021-06-01 17:01:20.781 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/Abp/ApplicationConfigurationScript - - -2021-06-01 17:01:20.781 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5000/Abp/ServiceProxyScript - - -2021-06-01 17:01:20.782 +08:00 [DBG] The request path /Abp/ApplicationConfigurationScript does not match a supported file type -2021-06-01 17:01:20.782 +08:00 [DBG] The request path /Abp/ServiceProxyScript does not match a supported file type -2021-06-01 17:01:20.783 +08:00 [DBG] 1 candidate(s) found for the request path '/Abp/ServiceProxyScript' -2021-06-01 17:01:20.783 +08:00 [DBG] 1 candidate(s) found for the request path '/Abp/ApplicationConfigurationScript' -2021-06-01 17:01:20.783 +08:00 [DBG] Endpoint 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController.GetAll (Volo.Abp.AspNetCore.Mvc)' with route pattern 'Abp/ServiceProxyScript' is valid for the request path '/Abp/ServiceProxyScript' -2021-06-01 17:01:20.783 +08:00 [DBG] Endpoint 'Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController.Get (Volo.Abp.AspNetCore.Mvc)' with route pattern 'Abp/ApplicationConfigurationScript' is valid for the request path '/Abp/ApplicationConfigurationScript' -2021-06-01 17:01:20.783 +08:00 [DBG] Request matched endpoint 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController.GetAll (Volo.Abp.AspNetCore.Mvc)' -2021-06-01 17:01:20.783 +08:00 [DBG] Request matched endpoint 'Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController.Get (Volo.Abp.AspNetCore.Mvc)' -2021-06-01 17:01:20.783 +08:00 [INF] Executing endpoint 'Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController.Get (Volo.Abp.AspNetCore.Mvc)' -2021-06-01 17:01:20.783 +08:00 [INF] Executing endpoint 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController.GetAll (Volo.Abp.AspNetCore.Mvc)' -2021-06-01 17:01:20.790 +08:00 [INF] Route matched with {area = "Abp", action = "Get", controller = "AbpApplicationConfigurationScript", page = ""}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.ActionResult] Get() on controller Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController (Volo.Abp.AspNetCore.Mvc). -2021-06-01 17:01:20.790 +08:00 [DBG] Execution plan of authorization filters (in the following order): ["Volo.Abp.AspNetCore.Mvc.AntiForgery.AbpAutoValidateAntiforgeryTokenAuthorizationFilter"] -2021-06-01 17:01:20.790 +08:00 [DBG] Execution plan of resource filters (in the following order): ["Microsoft.AspNetCore.Mvc.ViewFeatures.Filters.SaveTempDataFilter"] -2021-06-01 17:01:20.790 +08:00 [DBG] Execution plan of action filters (in the following order): ["Microsoft.AspNetCore.Mvc.Filters.ControllerActionFilter (Order: -2147483648)","Microsoft.AspNetCore.Mvc.ModelBinding.UnsupportedContentTypeFilter (Order: -3000)","Volo.Abp.AspNetCore.Mvc.GlobalFeatures.GlobalFeatureActionFilter","Volo.Abp.AspNetCore.Mvc.Auditing.AbpAuditActionFilter","Volo.Abp.AspNetCore.Mvc.Response.AbpNoContentActionFilter","Volo.Abp.AspNetCore.Mvc.Features.AbpFeatureActionFilter","Volo.Abp.AspNetCore.Mvc.Validation.AbpValidationActionFilter","Volo.Abp.AspNetCore.Mvc.Uow.AbpUowActionFilter"] -2021-06-01 17:01:20.790 +08:00 [DBG] Execution plan of exception filters (in the following order): ["Volo.Abp.AspNetCore.Mvc.ExceptionHandling.AbpExceptionFilter"] -2021-06-01 17:01:20.790 +08:00 [DBG] Execution plan of result filters (in the following order): ["Microsoft.AspNetCore.Mvc.ViewFeatures.Filters.SaveTempDataFilter","Microsoft.AspNetCore.Mvc.ProducesAttribute (Order: 0)"] -2021-06-01 17:01:20.792 +08:00 [DBG] Executing controller factory for controller Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController (Volo.Abp.AspNetCore.Mvc) -2021-06-01 17:01:20.800 +08:00 [INF] Route matched with {area = "Abp", action = "GetAll", controller = "AbpServiceProxyScript", page = ""}. Executing controller action with signature Microsoft.AspNetCore.Mvc.ActionResult GetAll(Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel) on controller Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController (Volo.Abp.AspNetCore.Mvc). -2021-06-01 17:01:20.800 +08:00 [DBG] Execution plan of authorization filters (in the following order): ["Volo.Abp.AspNetCore.Mvc.AntiForgery.AbpAutoValidateAntiforgeryTokenAuthorizationFilter"] -2021-06-01 17:01:20.800 +08:00 [DBG] Execution plan of resource filters (in the following order): ["Microsoft.AspNetCore.Mvc.ViewFeatures.Filters.SaveTempDataFilter"] -2021-06-01 17:01:20.800 +08:00 [DBG] Execution plan of action filters (in the following order): ["Microsoft.AspNetCore.Mvc.Filters.ControllerActionFilter (Order: -2147483648)","Microsoft.AspNetCore.Mvc.ModelBinding.UnsupportedContentTypeFilter (Order: -3000)","Volo.Abp.AspNetCore.Mvc.GlobalFeatures.GlobalFeatureActionFilter","Volo.Abp.AspNetCore.Mvc.Auditing.AbpAuditActionFilter","Volo.Abp.AspNetCore.Mvc.Response.AbpNoContentActionFilter","Volo.Abp.AspNetCore.Mvc.Features.AbpFeatureActionFilter","Volo.Abp.AspNetCore.Mvc.Validation.AbpValidationActionFilter","Volo.Abp.AspNetCore.Mvc.Uow.AbpUowActionFilter"] -2021-06-01 17:01:20.800 +08:00 [DBG] Execution plan of exception filters (in the following order): ["Volo.Abp.AspNetCore.Mvc.ExceptionHandling.AbpExceptionFilter"] -2021-06-01 17:01:20.800 +08:00 [DBG] Execution plan of result filters (in the following order): ["Microsoft.AspNetCore.Mvc.ViewFeatures.Filters.SaveTempDataFilter","Microsoft.AspNetCore.Mvc.ProducesAttribute (Order: 0)"] -2021-06-01 17:01:20.800 +08:00 [DBG] Executing controller factory for controller Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController (Volo.Abp.AspNetCore.Mvc) -2021-06-01 17:01:20.825 +08:00 [DBG] Executed controller factory for controller Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController (Volo.Abp.AspNetCore.Mvc) -2021-06-01 17:01:20.830 +08:00 [DBG] Attempting to bind parameter 'model' of type 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel' ... -2021-06-01 17:01:20.832 +08:00 [DBG] Attempting to bind parameter 'model' of type 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel' using the name '' in request data ... -2021-06-01 17:01:20.837 +08:00 [DBG] Attempting to bind property 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel.Type' of type 'System.String' using the name 'Type' in request data ... -2021-06-01 17:01:20.838 +08:00 [DBG] Could not find a value in the request with name 'Type' for binding property 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel.Type' of type 'System.String'. -2021-06-01 17:01:20.838 +08:00 [DBG] Done attempting to bind property 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel.Type' of type 'System.String'. -2021-06-01 17:01:20.841 +08:00 [DBG] Attempting to bind property 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel.UseCache' of type 'System.Boolean' using the name 'UseCache' in request data ... -2021-06-01 17:01:20.841 +08:00 [DBG] Could not find a value in the request with name 'UseCache' for binding property 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel.UseCache' of type 'System.Boolean'. -2021-06-01 17:01:20.841 +08:00 [DBG] Done attempting to bind property 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel.UseCache' of type 'System.Boolean'. -2021-06-01 17:01:20.841 +08:00 [DBG] Attempting to bind property 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel.Modules' of type 'System.String' using the name 'Modules' in request data ... -2021-06-01 17:01:20.841 +08:00 [DBG] Could not find a value in the request with name 'Modules' for binding property 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel.Modules' of type 'System.String'. -2021-06-01 17:01:20.841 +08:00 [DBG] Done attempting to bind property 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel.Modules' of type 'System.String'. -2021-06-01 17:01:20.841 +08:00 [DBG] Attempting to bind property 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel.Controllers' of type 'System.String' using the name 'Controllers' in request data ... -2021-06-01 17:01:20.841 +08:00 [DBG] Could not find a value in the request with name 'Controllers' for binding property 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel.Controllers' of type 'System.String'. -2021-06-01 17:01:20.841 +08:00 [DBG] Done attempting to bind property 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel.Controllers' of type 'System.String'. -2021-06-01 17:01:20.841 +08:00 [DBG] Attempting to bind property 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel.Actions' of type 'System.String' using the name 'Actions' in request data ... -2021-06-01 17:01:20.841 +08:00 [DBG] Could not find a value in the request with name 'Actions' for binding property 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel.Actions' of type 'System.String'. -2021-06-01 17:01:20.841 +08:00 [DBG] Done attempting to bind property 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel.Actions' of type 'System.String'. -2021-06-01 17:01:20.843 +08:00 [DBG] Done attempting to bind parameter 'model' of type 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel'. -2021-06-01 17:01:20.843 +08:00 [DBG] Done attempting to bind parameter 'model' of type 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel'. -2021-06-01 17:01:20.843 +08:00 [DBG] Attempting to validate the bound parameter 'model' of type 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel' ... -2021-06-01 17:01:20.845 +08:00 [DBG] Done attempting to validate the bound parameter 'model' of type 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel'. -2021-06-01 17:01:20.857 +08:00 [DBG] Executed controller factory for controller Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController (Volo.Abp.AspNetCore.Mvc) -2021-06-01 17:01:20.903 +08:00 [DBG] ActionApiDescriptionModel.Create: AbpTenant.FindTenantByNameAsyncByName -2021-06-01 17:01:20.910 +08:00 [DBG] Executing AbpApplicationConfigurationAppService.GetAsync()... -2021-06-01 17:01:20.917 +08:00 [DBG] ActionApiDescriptionModel.Create: AbpTenant.FindTenantByIdAsyncById -2021-06-01 17:01:20.917 +08:00 [DBG] ActionApiDescriptionModel.Create: AbpApplicationConfiguration.GetAsync -2021-06-01 17:01:20.917 +08:00 [DBG] ActionApiDescriptionModel.Create: AbpApiDefinition.GetByModel -2021-06-01 17:01:20.935 +08:00 [INF] Executing ContentResult with HTTP Response ContentType of application/javascript -2021-06-01 17:01:20.935 +08:00 [INF] Executed action Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController.GetAll (Volo.Abp.AspNetCore.Mvc) in 134.8725ms -2021-06-01 17:01:20.935 +08:00 [INF] Executed endpoint 'Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController.GetAll (Volo.Abp.AspNetCore.Mvc)' -2021-06-01 17:01:20.935 +08:00 [DBG] Connection id "0HM94RF9BC7D9" completed keep alive response. -2021-06-01 17:01:20.935 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/Abp/ServiceProxyScript - - - 200 1936 application/javascript 153.9787ms -2021-06-01 17:01:21.214 +08:00 [DBG] Executed AbpApplicationConfigurationAppService.GetAsync(). -2021-06-01 17:01:21.254 +08:00 [DBG] An antiforgery cookie token was reused. -2021-06-01 17:01:21.255 +08:00 [WRN] The cookie 'XSRF-TOKEN' has set 'SameSite=None' and must also set 'Secure'. -2021-06-01 17:01:21.260 +08:00 [INF] Executing ContentResult with HTTP Response ContentType of application/javascript -2021-06-01 17:01:21.260 +08:00 [INF] Executed action Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController.Get (Volo.Abp.AspNetCore.Mvc) in 470.185ms -2021-06-01 17:01:21.260 +08:00 [INF] Executed endpoint 'Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController.Get (Volo.Abp.AspNetCore.Mvc)' -2021-06-01 17:01:21.260 +08:00 [DBG] Connection id "0HM94RF9BC7D6" completed keep alive response. -2021-06-01 17:01:21.260 +08:00 [INF] Request finished HTTP/1.1 GET http://localhost:5000/Abp/ApplicationConfigurationScript - - - 200 13072 application/javascript 478.9115ms 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 8b294fd2ef..fcad11c385 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": "^5.3.0", - "@abp/prismjs": "^5.3.0" + "@abp/aspnetcore.mvc.ui.theme.basic": "^6.0.0-rc.3", + "@abp/prismjs": "^6.0.0-rc.3" }, "devDependencies": {} } diff --git a/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/wwwroot/libs/abp/core/abp.js b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/wwwroot/libs/abp/core/abp.js index 9445e4e7f4..d8b7531660 100644 --- a/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/wwwroot/libs/abp/core/abp.js +++ b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/wwwroot/libs/abp/core/abp.js @@ -372,7 +372,9 @@ var abp = abp || {}; setTimeout(function () { if (element) { element.classList.remove('abp-block-area-disappearing'); - element.parentElement.removeChild(element); + if (element.parentElement) { + element.parentElement.removeChild(element); + } } }, 250); } 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 c9f19af8be..dabafb9f12 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,37 +2,37 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-5.3.0.tgz#dcdd73d8582c4d14438f70d765170398d5d582fb" - integrity sha512-H6UrafHRI1DHfIoi47gZWHKSanlyAkghtGgUO6GTmPqTubBXjl7Ky3owVUAXvFd49+72gwdCLA/DB0Khjc3Ayw== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~5.3.0" - -"@abp/aspnetcore.mvc.ui.theme.shared@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-5.3.0.tgz#84e94845a247815ce981cda2d195944a350530b9" - integrity sha512-RwXxlncjidvh8Hgw91Hz1f5rnfG9hlNROr5bD/kxTUB47vIh/TIBd06UYrYw2/lqFLw5d6wd8q7VLuDjGUQbpg== - dependencies: - "@abp/aspnetcore.mvc.ui" "~5.3.0" - "@abp/bootstrap" "~5.3.0" - "@abp/bootstrap-datepicker" "~5.3.0" - "@abp/datatables.net-bs5" "~5.3.0" - "@abp/font-awesome" "~5.3.0" - "@abp/jquery-form" "~5.3.0" - "@abp/jquery-validation-unobtrusive" "~5.3.0" - "@abp/lodash" "~5.3.0" - "@abp/luxon" "~5.3.0" - "@abp/malihu-custom-scrollbar-plugin" "~5.3.0" - "@abp/select2" "~5.3.0" - "@abp/sweetalert2" "~5.3.0" - "@abp/timeago" "~5.3.0" - "@abp/toastr" "~5.3.0" - -"@abp/aspnetcore.mvc.ui@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-5.3.0.tgz#e947fd1aecbd2aabc5db4c6a64b78f2690fcf0d4" - integrity sha512-en2YDb/hRG1MKkbli1PYcoeU9OLU0YPSahkIBSfOmMLntAe8y0c2+Xe09chXP4r+GoZu0zd9FM3qqCRZojrlug== +"@abp/aspnetcore.mvc.ui.theme.basic@^6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-6.0.0-rc.3.tgz#b95266387e562c635de795442f90470f8e9e6318" + integrity sha512-vVkEpotDST455E3rynvRQpBKPcNNJ2m1wLkz/B9dQNdUjvm8L4F6s0ls0XFlKUNvQfCVfedkRtGayuvNje/Oxg== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~6.0.0-rc.3" + +"@abp/aspnetcore.mvc.ui.theme.shared@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-6.0.0-rc.3.tgz#664ca2ee712b7d9e66103c00beb41eb9648a6075" + integrity sha512-KxCsGuoUWKaDo7Oo9aKp51pli2m0DZ2tG8m+zK+m4M9U7g96uC+DOFy3gc7MdPlszvrw32Wwm7I0AughstByNA== + dependencies: + "@abp/aspnetcore.mvc.ui" "~6.0.0-rc.3" + "@abp/bootstrap" "~6.0.0-rc.3" + "@abp/bootstrap-datepicker" "~6.0.0-rc.3" + "@abp/datatables.net-bs5" "~6.0.0-rc.3" + "@abp/font-awesome" "~6.0.0-rc.3" + "@abp/jquery-form" "~6.0.0-rc.3" + "@abp/jquery-validation-unobtrusive" "~6.0.0-rc.3" + "@abp/lodash" "~6.0.0-rc.3" + "@abp/luxon" "~6.0.0-rc.3" + "@abp/malihu-custom-scrollbar-plugin" "~6.0.0-rc.3" + "@abp/select2" "~6.0.0-rc.3" + "@abp/sweetalert2" "~6.0.0-rc.3" + "@abp/timeago" "~6.0.0-rc.3" + "@abp/toastr" "~6.0.0-rc.3" + +"@abp/aspnetcore.mvc.ui@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-6.0.0-rc.3.tgz#47c23b57ed3908bd78a232230e53d1f3cba2de41" + integrity sha512-7eJZy2JUGQP94Tz3JJWXRHRmDfTcPZ/lS1/VNbU8B4qvgl5ChIXklVEJLR1fwrBhKXZV8fGVmqT1XlGTGFvFJA== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -41,161 +41,161 @@ merge-stream "^2.0.0" micromatch "^4.0.2" -"@abp/bootstrap-datepicker@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-5.3.0.tgz#09c44954774d8f52ca8ff6699ad4dbb7cc0308c2" - integrity sha512-AQ26I0jgoCioW1/4XmQIyn1c1+CLv8KTb4Vd4ZbtdYGBkkkUe+JEAWpJSeXlJRr/XrOs0BKWp/fa7Nnwx8srLg== +"@abp/bootstrap-datepicker@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-6.0.0-rc.3.tgz#89198b863dbfccf5f07ac3c4b20ce6199adcb17a" + integrity sha512-NLoUjcR66mqwSWuVftu2yFH4/j6QP+FiElRfZQ9OYmO8DQx2Ue5UZzjrFTrZ1DBBCfzhr2Bffj80dirGvGDyvg== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-5.3.0.tgz#42dac2d2d6374f39d068a638687039c5c74df123" - integrity sha512-rg9mLcvT4JQRc1rIAhGYK1P2eMRJ1+GArQXV5l7k3FrVU+bRLKdoE6PNpuwXHpdlom4/dOgekfuWH/SAuY5kyw== +"@abp/bootstrap@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-6.0.0-rc.3.tgz#4574bf574cc3484869e8ff8bc592f6212d20a969" + integrity sha512-Q5v7WRkGhGcjRg267HXtqs1oU7ts9UXPyCXmg5y2y5qMOyioD+m4MKV4iv67DgoQjabudp8X2egTKxkej6Lzkw== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" bootstrap "^5.1.3" -"@abp/clipboard@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-5.3.0.tgz#579bbc786d32c4e07c969073872b936575df7a9c" - integrity sha512-J55jQnzPOOAwo70GK9hAB3JxG7rz75tex+17QSFjW7/dXVWt1bPIDRHh/a1wiLEgYc6btsSGhptLtkYAfWpq6w== +"@abp/clipboard@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-6.0.0-rc.3.tgz#ee3a586b491d89442eefff08aaebbf9d38cb46d4" + integrity sha512-01svpp3mR29z1FTM+2Qe+MUNLPbl95bWlOXY5zz2hvNSbdD45lGud+BiOHfeZwlDk5jjr3FqLel+hxx2ByBvOA== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" clipboard "^2.0.8" -"@abp/core@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-5.3.0.tgz#032724dd0c0b850204896ce0275c7f9c8f516740" - integrity sha512-Uk9h98jiEF1dItWrvWnYB6s/UNZZapvFSyJ4+piAsZmXOSAbrObV+s19n5xfUagQQTWn4+aU5+aChEcfWpYv9A== +"@abp/core@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-6.0.0-rc.3.tgz#5662ce813d449d97d9fb7ea2552b2774c8df7825" + integrity sha512-X/VRdk5SGNYc5gQzPcBEPAvwcuD9WXsI4YIdrqjnes0s8u2/XmfrTixojh8Y5EYUoOblEE3Soj5hBhY1cVwcbQ== dependencies: - "@abp/utils" "~5.3.0" + "@abp/utils" "~6.0.0-rc.3" -"@abp/datatables.net-bs5@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-5.3.0.tgz#84771ce4eb7229bed347a5904c891b08e3230422" - integrity sha512-FpKrgrjaBKVgFAnbBsrvDIJJOy8gbWCEHm5Jy2vFWXmx25fITMw/2ckBDH87yrZtCNVTSUbMIdHYOIHMPfSavQ== +"@abp/datatables.net-bs5@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-6.0.0-rc.3.tgz#22865c7e621de720b71af6265b3193f6c78695bd" + integrity sha512-T+mhLc6uSzWmxDQogVwnJ6VxI4845gmF68/i9TmVKNlCtpa3EEfyuF/hgWT1hYfCb4XOsvd/CWrunbkC3fsmtg== dependencies: - "@abp/datatables.net" "~5.3.0" + "@abp/datatables.net" "~6.0.0-rc.3" datatables.net-bs5 "^1.11.4" -"@abp/datatables.net@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-5.3.0.tgz#dd27ae451df9551f5b815e10c87a8a89c6a38293" - integrity sha512-d4lQ09G7HY2gEN1lRAteCZzY0Fv3gPuUM+icgWm+UkmDZV9lhvovTQ58Xkwayw8vf+NPlit1eGMMQedn6MbeAQ== +"@abp/datatables.net@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-6.0.0-rc.3.tgz#d036defe6ad7fc989dffa020ae579362ee3150d1" + integrity sha512-4cUU8/Tn0Vz9bx7jjMOD/0Viyr29fcwoQAAkxaaYZp6qiQbENgz46/xpQf2oBCoudk8CLdzpmNa7jWte7PcJJw== dependencies: - "@abp/jquery" "~5.3.0" + "@abp/jquery" "~6.0.0-rc.3" datatables.net "^1.11.4" -"@abp/font-awesome@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-5.3.0.tgz#ce1d5bb59bd597cc9717885917d4dd2eae1f8b9c" - integrity sha512-JX62EVfZSJ7pv75Gd3ya/3c3He0hXF7KmpTizUNd/EbeHuNJoCND5wwq5OAFV9Ld3vdcGJChNTydNa5RsBzrpg== +"@abp/font-awesome@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-6.0.0-rc.3.tgz#803569d1a7e25f8a1c2be018312449c23fb78217" + integrity sha512-lYdh38UCTSkzzw0B/mpPEo7iFXzSKHCNbBOIHe6dd6O/Qli7wYukTtUOFn5Sh+yoydLY1as92HtiGL1ckSdu1g== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" "@fortawesome/fontawesome-free" "^5.15.4" -"@abp/jquery-form@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-5.3.0.tgz#5ae9906f0cffaf3e043681a5dd80a014b4860f6b" - integrity sha512-ZTpXCImHirJDZjfnJRtSEHLIbWMTYkqtTv7Z3GMRKnI4fllpmuco9EWLAKjAfYPyc/QpTx+MYnUg5SsXORhJyQ== +"@abp/jquery-form@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-6.0.0-rc.3.tgz#4ec503c07e2194148c3a7e7cf7ddef2871679e6a" + integrity sha512-Q3uEpflntqrSkYakcdsBnnYYfxJWXD/CDjMiwjbb6gIc8s4qkbIYxVxvYvlEezoIDYQkMSXOn7BS4clWsesiJg== dependencies: - "@abp/jquery" "~5.3.0" + "@abp/jquery" "~6.0.0-rc.3" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-5.3.0.tgz#ccf90a7840398e69e0a91ed6c32b80fa2eb82d14" - integrity sha512-6B3ywnpvPxpnxkrcXzjTjMWgKRImbzNPOZvv5ant/kQv3zXedV1GXSIILy+imX39FuDPslOmEfx8plwrNvIteA== +"@abp/jquery-validation-unobtrusive@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-6.0.0-rc.3.tgz#01da2a59663d373ff1c69022f4c9c66ad0b29403" + integrity sha512-ij1ML2D9rYF3pJthWO6mGQajsJhbDCtOoBvnh9yCZccuwOYkXP22PqfUxjjxtqL4HqFI31KRpFg0ANMGSzEEBg== dependencies: - "@abp/jquery-validation" "~5.3.0" + "@abp/jquery-validation" "~6.0.0-rc.3" jquery-validation-unobtrusive "^3.2.12" -"@abp/jquery-validation@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-5.3.0.tgz#a21696e7d5d54ef8bcdc0e8bd2debb1da1f7f5cc" - integrity sha512-4z2I9iORf+z5SlN9crC/Gx3X5GAOVePD+WN8SaHSYr4VWYNe8TV8LvCZPilN56sIPt3jYvy0N+bI1tAuZPu/NQ== +"@abp/jquery-validation@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-6.0.0-rc.3.tgz#724aea9572dcb2faccf8c6355332b0b2a4df9260" + integrity sha512-rTK5oHaMtycvWxunNwzbE/MbsXXIr6qDnOY3rVUmjTHjqUOHYz591t/XeQfjnSXPp4k/SZUjG6viTC3J2jzC1A== dependencies: - "@abp/jquery" "~5.3.0" + "@abp/jquery" "~6.0.0-rc.3" jquery-validation "^1.19.3" -"@abp/jquery@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-5.3.0.tgz#0279ee501ed774a788072c2ec8b003e348fec22c" - integrity sha512-rqYbU3LpsT7XT8ygn+TFVmjev5NlgEcDhGwQ8PraY1dEjlDbteeQ50N4adS8fdRfOM1UjGL19ueN3F8E5qNUSg== +"@abp/jquery@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-6.0.0-rc.3.tgz#ba19cc8b802c46490277939e6c674811127d8016" + integrity sha512-MbD38iInyag7/j5k42cvMT4jLZMtXH4lUK0rjvqUDVaxKEks46Ix/90uczQ9XajYONgx0CJKFj2urgM830+CCA== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" jquery "~3.6.0" -"@abp/lodash@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-5.3.0.tgz#45f1dba7bb65b6599b4973d7e0c617dfd2c46c49" - integrity sha512-vQVMv58QuYttWBfLjJzIsw92JunGbWYsqk6pp6/JuoBls5UJtdP1F7vM4JgQxsscGYHFRZB3F4a3h1cxZ+dblQ== +"@abp/lodash@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-6.0.0-rc.3.tgz#8a5bab02353e5cab4ca06ab82f6dbe6285faa95a" + integrity sha512-c8yhcapzPsXyeiFjeOC+2a4bn5wFjW5gUoN+p/p+tE+FIcH37yEgyw/tAr6aZPCmR770MqQXct4t7S4Czbbk+A== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" lodash "^4.17.21" -"@abp/luxon@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-5.3.0.tgz#8a6277046f6e38c3affbf79c06f8ac00d1ca8098" - integrity sha512-6tETR03i1NPJuDqSQWtpkOykdq/84awifQUqRyh+b8340wV7P54NqUMDXDit9sjITFDhq99V/R+Rj3PVjvJD3A== +"@abp/luxon@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-6.0.0-rc.3.tgz#ba515e122c61918d481467d5be39f08a363822f6" + integrity sha512-2lRSSC0DYShlnKdbJ/Pmha/azjt09ZRPx57NQ01dc7ungChPry5EJL6pC3kXWnJrCkrPCF0V5+A3+taut9+l3A== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" luxon "^2.3.0" -"@abp/malihu-custom-scrollbar-plugin@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-5.3.0.tgz#e6e12162aa50d3c3d98629378cec2f6fd5964338" - integrity sha512-GVwgAZQurH/tr4Hgmuby2dun//v1dT+wLGV4ZvjCJzBRs4FgrB+25pj4qKm20j6/NKRKc4V5re/b1y6njCubFQ== +"@abp/malihu-custom-scrollbar-plugin@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-6.0.0-rc.3.tgz#0798e37ec6a852748118692a5fbd30c99d9745db" + integrity sha512-FlyShmRxG3wGk1OJCjHIZAdi2/Y2FJPkVxaE72CVIceQSmg0nebGTv3a7bhd4QzKkDsSA3+t6gHjnuKlTlDFLA== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/prismjs@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-5.3.0.tgz#658a371023d9a3de9ecfff1f10bae7a83064fac7" - integrity sha512-NPsYJ9oj/57vG+eVGpDkJcdPAx4WlXTVEUZWWxmaXuM9sHY1/2av975Qk8R5HG6fC74w3DrVCP8YQvU6jlaF1w== +"@abp/prismjs@^6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-6.0.0-rc.3.tgz#e4faf595e29db81c5a66030e59b0e09f09759bfd" + integrity sha512-zzd3iw/Im0M9FUmTviwkTCr4slkoZJExtK+qB1FmLxRY59+hyU9wxd6hwzic/QwhXxFQoYILJ3S3FNxsPIm76A== dependencies: - "@abp/clipboard" "~5.3.0" - "@abp/core" "~5.3.0" + "@abp/clipboard" "~6.0.0-rc.3" + "@abp/core" "~6.0.0-rc.3" prismjs "^1.26.0" -"@abp/select2@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-5.3.0.tgz#aae202b87dc23dfc7c8fd933413a8dbeb2f5b683" - integrity sha512-0aIxdtzgONkrYnUN5ACkIIIhsC9e61QLRq3K+/98fjf7NkHOjG3Sptr8EKu5U3IQ2hNHgqBjPGYjkztGuxZ9kw== +"@abp/select2@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-6.0.0-rc.3.tgz#deb8332bfce2102a562004893321a48d5194bf53" + integrity sha512-rb0qElmmhiP09xX8ZbjzNLF6ygFBwErysGWt6Bbgzz5waX2sGe575Cgoz53FaMQ4JaRBg1N0/nCejKyDtiINRA== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" select2 "^4.0.13" -"@abp/sweetalert2@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-5.3.0.tgz#67379cfa4cb8884cb66b58f4cafa79960cf8426a" - integrity sha512-EBr8J7MDsYmSvOYxTbqsSmw6c2yLokHZe8A+EW2vsY9VYFXkoOJLVpCkCK4fhvHUv8/+Y5QnHW7bs1I6SKYXOw== +"@abp/sweetalert2@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-6.0.0-rc.3.tgz#e61fc6c1bed1316c1d44ca5c92f590e422db24d4" + integrity sha512-+SNpBb4XrQlWzRQK9lfdJqA9IfJrlgoqmHwPDgf3Q+P922MzO33TgDlZWbeE7MzVj2y2WmNsPuCKwhjSjSL2rw== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" sweetalert2 "^11.3.6" -"@abp/timeago@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-5.3.0.tgz#3aaef3edca333224ba6b3e81c8ad1ebaae51a2f4" - integrity sha512-FxtoPYxyk2CHeoloC6kaeCj5YtXH0rebhOEaCjrfyg9/Ec6LEkvpfC7RWlcsHaEUAtFXZegJDfOk066EPH7RHQ== +"@abp/timeago@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-6.0.0-rc.3.tgz#0ef8c4801bfd4623e6895b1d047b1437063bda53" + integrity sha512-P3YRDVKjR5/Fz+cXiPg3IiUr7XGbNh7mgmJ1ywRXmKVmVMJmhQ2RsKmmtkGJn4TfVHu/l5iJXe4rqgL21/yX/g== dependencies: - "@abp/jquery" "~5.3.0" + "@abp/jquery" "~6.0.0-rc.3" timeago "^1.6.7" -"@abp/toastr@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-5.3.0.tgz#8a002c19ea25ac6b042a25c0f9d289d03c93c2fb" - integrity sha512-gjb2O/XrYkX8IeCERIqlOYPh15WlF9LxGR6t9jeVF/p6BTX/yaWabYCFfB9SkU2pQ6xrGl7WmSTAC06JOAtPTA== +"@abp/toastr@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-6.0.0-rc.3.tgz#6010d4247937531ebf7c8659d6254cd3db6c4855" + integrity sha512-sC9eCzYVgDrLSFIhJGe9hshzfwA1BkZNah4NQhyq+V6HQ8YF7goMS79N+/XmSoLQ9zzRhusqnPFnb+4FHjr7iA== dependencies: - "@abp/jquery" "~5.3.0" + "@abp/jquery" "~6.0.0-rc.3" toastr "^2.1.4" -"@abp/utils@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-5.3.0.tgz#e93739074a3cd445a5a221209506b7e663050ca0" - integrity sha512-Nm+h+3PL10+rBFSh8UUuenmGM+OBlEoNQeGzHRmhOc6hJ3oqCogPzY+zkq0e4pksrwhjxAu/cgCEGLAoEXXycw== +"@abp/utils@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-6.0.0-rc.3.tgz#6d3515694314175218606e9518618ce335b4b360" + integrity sha512-K2geJ9P1ztk4Ehzb9YG3CqqLOi+z8/4iBLUzooNZLQqS+KdlUhCmqfuCoI/A5Aq9DGbTYesalp+Fwoh3S2Dl8A== dependencies: just-compare "^1.3.0" diff --git a/modules/blob-storing-database/Volo.Abp.BlobStoring.Database.abpmdl.json b/modules/blob-storing-database/Volo.Abp.BlobStoring.Database.abpmdl.json index ee3e278929..f5f118cbdc 100644 --- a/modules/blob-storing-database/Volo.Abp.BlobStoring.Database.abpmdl.json +++ b/modules/blob-storing-database/Volo.Abp.BlobStoring.Database.abpmdl.json @@ -50,10 +50,6 @@ "BlobStoring.Database.Host.ConsoleApp.ConsoleApp": { "path": "host/BlobStoring.Database.Host.ConsoleApp/src/BlobStoring.Database.Host.ConsoleApp.ConsoleApp/BlobStoring.Database.Host.ConsoleApp.ConsoleApp.abppkg.json", "folder": "host/BlobStoring.Database.Host.ConsoleApp/src" - }, - "Volo.Abp.BlobStoring.Database.Installer": { - "path": "src/Volo.Abp.BlobStoring.Database.Installer/Volo.Abp.BlobStoring.Database.Installer.abppkg.json", - "folder": "src" } } } \ No newline at end of file diff --git a/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain.Shared/Volo.Abp.BlobStoring.Database.Domain.Shared.abppkg.analyze.json b/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain.Shared/Volo.Abp.BlobStoring.Database.Domain.Shared.abppkg.analyze.json index e046a9e56a..6948f16562 100644 --- a/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain.Shared/Volo.Abp.BlobStoring.Database.Domain.Shared.abppkg.analyze.json +++ b/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain.Shared/Volo.Abp.BlobStoring.Database.Domain.Shared.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.Abp.BlobStoring.Database.Domain.Shared", - "hash": "eed9ff456824aac8ba0fe73baa6cf288", + "hash": "a6127aa423bcf90505fde453d6852fd5", "contents": [ { "namespace": "Volo.Abp.BlobStoring.Database", diff --git a/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain/Volo.Abp.BlobStoring.Database.Domain.abppkg.analyze.json b/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain/Volo.Abp.BlobStoring.Database.Domain.abppkg.analyze.json index cf6d7ed1b3..7f830314ef 100644 --- a/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain/Volo.Abp.BlobStoring.Database.Domain.abppkg.analyze.json +++ b/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain/Volo.Abp.BlobStoring.Database.Domain.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.Abp.BlobStoring.Database.Domain", - "hash": "744c78df1c9addf5e9f6657295f0529c", + "hash": "35614e1fa8f4e0214b7f456228ba7565", "contents": [ { "namespace": "Volo.Abp.BlobStoring.Database", @@ -28,7 +28,7 @@ { "namespace": "Volo.Abp.BlobStoring.Database", "summary": null, - "entityModel": { + "entityAnalyzeModel": { "namespace": "Volo.Abp.BlobStoring.Database", "primaryKeyType": "Guid", "summary": null, @@ -43,7 +43,7 @@ { "namespace": "Volo.Abp.BlobStoring.Database", "summary": null, - "entityModel": { + "entityAnalyzeModel": { "namespace": "Volo.Abp.BlobStoring.Database", "primaryKeyType": "Guid", "summary": null, diff --git a/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain/Volo/Abp/BlobStoring/Database/BlobStoringDatabaseDbProperties.cs b/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain/Volo/Abp/BlobStoring/Database/AbpBlobStoringDatabaseDbProperties.cs similarity index 85% rename from modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain/Volo/Abp/BlobStoring/Database/BlobStoringDatabaseDbProperties.cs rename to modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain/Volo/Abp/BlobStoring/Database/AbpBlobStoringDatabaseDbProperties.cs index a9689eb9fd..19985351de 100644 --- a/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain/Volo/Abp/BlobStoring/Database/BlobStoringDatabaseDbProperties.cs +++ b/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain/Volo/Abp/BlobStoring/Database/AbpBlobStoringDatabaseDbProperties.cs @@ -2,7 +2,7 @@ namespace Volo.Abp.BlobStoring.Database; -public static class BlobStoringDatabaseDbProperties +public static class AbpBlobStoringDatabaseDbProperties { public static string DbTablePrefix { get; set; } = AbpCommonDbProperties.DbTablePrefix; diff --git a/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.EntityFrameworkCore/Volo.Abp.BlobStoring.Database.EntityFrameworkCore.abppkg.analyze.json b/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.EntityFrameworkCore/Volo.Abp.BlobStoring.Database.EntityFrameworkCore.abppkg.analyze.json index 0234edc71c..99fb06f13b 100644 --- a/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.EntityFrameworkCore/Volo.Abp.BlobStoring.Database.EntityFrameworkCore.abppkg.analyze.json +++ b/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.EntityFrameworkCore/Volo.Abp.BlobStoring.Database.EntityFrameworkCore.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.Abp.BlobStoring.Database.EntityFrameworkCore", - "hash": "91e3a724f35375f79d9505ca0e950b9e", + "hash": "cdddb35c205079b70e3b1e8010482930", "contents": [ { "namespace": "Volo.Abp.BlobStoring.Database.EntityFrameworkCore", diff --git a/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.EntityFrameworkCore/Volo/Abp/BlobStoring/Database/EntityFrameworkCore/BlobStoringDbContext.cs b/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.EntityFrameworkCore/Volo/Abp/BlobStoring/Database/EntityFrameworkCore/BlobStoringDbContext.cs index b20f5190c4..f3e7661366 100644 --- a/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.EntityFrameworkCore/Volo/Abp/BlobStoring/Database/EntityFrameworkCore/BlobStoringDbContext.cs +++ b/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.EntityFrameworkCore/Volo/Abp/BlobStoring/Database/EntityFrameworkCore/BlobStoringDbContext.cs @@ -4,7 +4,7 @@ using Volo.Abp.EntityFrameworkCore; namespace Volo.Abp.BlobStoring.Database.EntityFrameworkCore; -[ConnectionStringName(BlobStoringDatabaseDbProperties.ConnectionStringName)] +[ConnectionStringName(AbpBlobStoringDatabaseDbProperties.ConnectionStringName)] public class BlobStoringDbContext : AbpDbContext, IBlobStoringDbContext { public DbSet BlobContainers { get; set; } diff --git a/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.EntityFrameworkCore/Volo/Abp/BlobStoring/Database/EntityFrameworkCore/BlobStoringDbContextModelCreatingExtensions.cs b/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.EntityFrameworkCore/Volo/Abp/BlobStoring/Database/EntityFrameworkCore/BlobStoringDbContextModelCreatingExtensions.cs index e4fad62e37..6be009f3ec 100644 --- a/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.EntityFrameworkCore/Volo/Abp/BlobStoring/Database/EntityFrameworkCore/BlobStoringDbContextModelCreatingExtensions.cs +++ b/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.EntityFrameworkCore/Volo/Abp/BlobStoring/Database/EntityFrameworkCore/BlobStoringDbContextModelCreatingExtensions.cs @@ -12,7 +12,7 @@ public static class BlobStoringDbContextModelCreatingExtensions builder.Entity(b => { - b.ToTable(BlobStoringDatabaseDbProperties.DbTablePrefix + "BlobContainers", BlobStoringDatabaseDbProperties.DbSchema); + b.ToTable(AbpBlobStoringDatabaseDbProperties.DbTablePrefix + "BlobContainers", AbpBlobStoringDatabaseDbProperties.DbSchema); b.ConfigureByConvention(); @@ -27,7 +27,7 @@ public static class BlobStoringDbContextModelCreatingExtensions builder.Entity(b => { - b.ToTable(BlobStoringDatabaseDbProperties.DbTablePrefix + "Blobs", BlobStoringDatabaseDbProperties.DbSchema); + b.ToTable(AbpBlobStoringDatabaseDbProperties.DbTablePrefix + "Blobs", AbpBlobStoringDatabaseDbProperties.DbSchema); b.ConfigureByConvention(); diff --git a/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.EntityFrameworkCore/Volo/Abp/BlobStoring/Database/EntityFrameworkCore/IBlobStoringDbContext.cs b/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.EntityFrameworkCore/Volo/Abp/BlobStoring/Database/EntityFrameworkCore/IBlobStoringDbContext.cs index b36c0753d3..b139d8473b 100644 --- a/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.EntityFrameworkCore/Volo/Abp/BlobStoring/Database/EntityFrameworkCore/IBlobStoringDbContext.cs +++ b/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.EntityFrameworkCore/Volo/Abp/BlobStoring/Database/EntityFrameworkCore/IBlobStoringDbContext.cs @@ -4,7 +4,7 @@ using Volo.Abp.EntityFrameworkCore; namespace Volo.Abp.BlobStoring.Database.EntityFrameworkCore; -[ConnectionStringName(BlobStoringDatabaseDbProperties.ConnectionStringName)] +[ConnectionStringName(AbpBlobStoringDatabaseDbProperties.ConnectionStringName)] public interface IBlobStoringDbContext : IEfCoreDbContext { DbSet BlobContainers { get; } diff --git a/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Installer/Volo.Abp.BlobStoring.Database.Installer.csproj b/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Installer/Volo.Abp.BlobStoring.Database.Installer.csproj index a2054f574c..84be724466 100644 --- a/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Installer/Volo.Abp.BlobStoring.Database.Installer.csproj +++ b/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Installer/Volo.Abp.BlobStoring.Database.Installer.csproj @@ -4,19 +4,21 @@ - net5.0 + net6.0 true - + + + diff --git a/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.MongoDB/Volo.Abp.BlobStoring.Database.MongoDB.abppkg.analyze.json b/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.MongoDB/Volo.Abp.BlobStoring.Database.MongoDB.abppkg.analyze.json index b6fe5277b8..96b52b98c5 100644 --- a/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.MongoDB/Volo.Abp.BlobStoring.Database.MongoDB.abppkg.analyze.json +++ b/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.MongoDB/Volo.Abp.BlobStoring.Database.MongoDB.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.Abp.BlobStoring.Database.MongoDB", - "hash": "4c911e5e8a2e8c4630d12f394a157819", + "hash": "9732b597f54df4ab73a8ad8aab7743d2", "contents": [ { "namespace": "Volo.Abp.BlobStoring.Database.MongoDB", diff --git a/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.MongoDB/Volo/Abp/BlobStoring/Database/MongoDB/BlobStoringMongoDbContext.cs b/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.MongoDB/Volo/Abp/BlobStoring/Database/MongoDB/BlobStoringMongoDbContext.cs index d0be5f4973..108804fbb9 100644 --- a/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.MongoDB/Volo/Abp/BlobStoring/Database/MongoDB/BlobStoringMongoDbContext.cs +++ b/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.MongoDB/Volo/Abp/BlobStoring/Database/MongoDB/BlobStoringMongoDbContext.cs @@ -4,7 +4,7 @@ using Volo.Abp.MongoDB; namespace Volo.Abp.BlobStoring.Database.MongoDB; -[ConnectionStringName(BlobStoringDatabaseDbProperties.ConnectionStringName)] +[ConnectionStringName(AbpBlobStoringDatabaseDbProperties.ConnectionStringName)] public class BlobStoringMongoDbContext : AbpMongoDbContext, IBlobStoringMongoDbContext { public IMongoCollection BlobContainers => Collection(); diff --git a/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.MongoDB/Volo/Abp/BlobStoring/Database/MongoDB/BlobStoringMongoDbContextExtensions.cs b/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.MongoDB/Volo/Abp/BlobStoring/Database/MongoDB/BlobStoringMongoDbContextExtensions.cs index 7943215534..28c3bdde7f 100644 --- a/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.MongoDB/Volo/Abp/BlobStoring/Database/MongoDB/BlobStoringMongoDbContextExtensions.cs +++ b/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.MongoDB/Volo/Abp/BlobStoring/Database/MongoDB/BlobStoringMongoDbContextExtensions.cs @@ -11,12 +11,12 @@ public static class BlobStoringMongoDbContextExtensions builder.Entity(b => { - b.CollectionName = BlobStoringDatabaseDbProperties.DbTablePrefix + "BlobContainers"; + b.CollectionName = AbpBlobStoringDatabaseDbProperties.DbTablePrefix + "BlobContainers"; }); builder.Entity(b => { - b.CollectionName = BlobStoringDatabaseDbProperties.DbTablePrefix + "Blobs"; + b.CollectionName = AbpBlobStoringDatabaseDbProperties.DbTablePrefix + "Blobs"; }); } } diff --git a/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.MongoDB/Volo/Abp/BlobStoring/Database/MongoDB/IBlobStoringMongoDbContext.cs b/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.MongoDB/Volo/Abp/BlobStoring/Database/MongoDB/IBlobStoringMongoDbContext.cs index 1fcf61b146..803ed5171d 100644 --- a/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.MongoDB/Volo/Abp/BlobStoring/Database/MongoDB/IBlobStoringMongoDbContext.cs +++ b/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.MongoDB/Volo/Abp/BlobStoring/Database/MongoDB/IBlobStoringMongoDbContext.cs @@ -4,7 +4,7 @@ using Volo.Abp.MongoDB; namespace Volo.Abp.BlobStoring.Database.MongoDB; -[ConnectionStringName(BlobStoringDatabaseDbProperties.ConnectionStringName)] +[ConnectionStringName(AbpBlobStoringDatabaseDbProperties.ConnectionStringName)] public interface IBlobStoringMongoDbContext : IAbpMongoDbContext { IMongoCollection BlobContainers { get; } diff --git a/modules/blogging/Volo.Blogging.sln b/modules/blogging/Volo.Blogging.sln index ad5c0fa895..c6cd3f41d4 100644 --- a/modules/blogging/Volo.Blogging.sln +++ b/modules/blogging/Volo.Blogging.sln @@ -63,6 +63,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Shared", "Shared", "{9FAD5B EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Blogging.Application.Contracts.Shared", "src\Volo.Blogging.Application.Contracts.Shared\Volo.Blogging.Application.Contracts.Shared.csproj", "{E28EBBE0-8EB7-4FC1-9267-E6D30993EAE4}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Blogging.Installer", "src\Volo.Blogging.Installer\Volo.Blogging.Installer.csproj", "{C5EAF1A4-F1DE-44B4-9F8F-3602EC2575B5}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -161,6 +163,10 @@ Global {E28EBBE0-8EB7-4FC1-9267-E6D30993EAE4}.Debug|Any CPU.Build.0 = Debug|Any CPU {E28EBBE0-8EB7-4FC1-9267-E6D30993EAE4}.Release|Any CPU.ActiveCfg = Release|Any CPU {E28EBBE0-8EB7-4FC1-9267-E6D30993EAE4}.Release|Any CPU.Build.0 = Release|Any CPU + {C5EAF1A4-F1DE-44B4-9F8F-3602EC2575B5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C5EAF1A4-F1DE-44B4-9F8F-3602EC2575B5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C5EAF1A4-F1DE-44B4-9F8F-3602EC2575B5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C5EAF1A4-F1DE-44B4-9F8F-3602EC2575B5}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -193,6 +199,7 @@ Global {DB75CA32-96A5-4D10-8DD0-E62A3D0DDBCB} = {BE2A423C-271E-469A-AD90-5640DEBEE9C1} {9FAD5B78-0577-4500-92D5-DC86E05F773C} = {42BF26EF-B8C7-42DC-9FFB-3653109B7776} {E28EBBE0-8EB7-4FC1-9267-E6D30993EAE4} = {9FAD5B78-0577-4500-92D5-DC86E05F773C} + {C5EAF1A4-F1DE-44B4-9F8F-3602EC2575B5} = {9FAD5B78-0577-4500-92D5-DC86E05F773C} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {F2BAE819-78D4-407A-9201-22473B2850B0} diff --git a/modules/blogging/app/Volo.BloggingTestApp.EntityFrameworkCore/Volo.BloggingTestApp.EntityFrameworkCore.abppkg.analyze.json b/modules/blogging/app/Volo.BloggingTestApp.EntityFrameworkCore/Volo.BloggingTestApp.EntityFrameworkCore.abppkg.analyze.json new file mode 100644 index 0000000000..add4021907 --- /dev/null +++ b/modules/blogging/app/Volo.BloggingTestApp.EntityFrameworkCore/Volo.BloggingTestApp.EntityFrameworkCore.abppkg.analyze.json @@ -0,0 +1,18 @@ +{ + "name": "Volo.BloggingTestApp.EntityFrameworkCore", + "hash": "9bca59fa99494d82517715624e8b4974", + "contents": [ + { + "namespace": "Volo.BloggingTestApp.EntityFrameworkCore", + "contentType": "abpModule", + "name": "BloggingTestAppEntityFrameworkCoreModule" + }, + { + "namespace": "Volo.BloggingTestApp.EntityFrameworkCore", + "connectionStringName": null, + "databaseTables": [], + "contentType": "efCoreDbContext", + "name": "BloggingTestAppDbContext" + } + ] +} \ No newline at end of file diff --git a/modules/blogging/app/Volo.BloggingTestApp.MongoDB/Volo.BloggingTestApp.MongoDB.abppkg.analyze.json b/modules/blogging/app/Volo.BloggingTestApp.MongoDB/Volo.BloggingTestApp.MongoDB.abppkg.analyze.json new file mode 100644 index 0000000000..c923fe174c --- /dev/null +++ b/modules/blogging/app/Volo.BloggingTestApp.MongoDB/Volo.BloggingTestApp.MongoDB.abppkg.analyze.json @@ -0,0 +1,11 @@ +{ + "name": "Volo.BloggingTestApp.MongoDB", + "hash": "fad6ecadd947f85cb1e3da6b87211432", + "contents": [ + { + "namespace": "Volo.BloggingTestApp.MongoDB", + "contentType": "abpModule", + "name": "BloggingTestAppMongoDbModule" + } + ] +} \ No newline at end of file diff --git a/modules/blogging/app/Volo.BloggingTestApp/package.json b/modules/blogging/app/Volo.BloggingTestApp/package.json index 4b5eeb5694..779b6502b4 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": "^5.3.0", - "@abp/blogging": "^5.3.0" + "@abp/aspnetcore.mvc.ui.theme.basic": "^6.0.0-rc.3", + "@abp/blogging": "^6.0.0-rc.3" } } diff --git a/modules/blogging/app/Volo.BloggingTestApp/wwwroot/libs/abp/core/abp.js b/modules/blogging/app/Volo.BloggingTestApp/wwwroot/libs/abp/core/abp.js index 9445e4e7f4..d8b7531660 100644 --- a/modules/blogging/app/Volo.BloggingTestApp/wwwroot/libs/abp/core/abp.js +++ b/modules/blogging/app/Volo.BloggingTestApp/wwwroot/libs/abp/core/abp.js @@ -372,7 +372,9 @@ var abp = abp || {}; setTimeout(function () { if (element) { element.classList.remove('abp-block-area-disappearing'); - element.parentElement.removeChild(element); + if (element.parentElement) { + element.parentElement.removeChild(element); + } } }, 250); } diff --git a/modules/blogging/app/Volo.BloggingTestApp/yarn.lock b/modules/blogging/app/Volo.BloggingTestApp/yarn.lock index 193494fc04..80ace6ebb0 100644 --- a/modules/blogging/app/Volo.BloggingTestApp/yarn.lock +++ b/modules/blogging/app/Volo.BloggingTestApp/yarn.lock @@ -2,37 +2,37 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-5.3.0.tgz#dcdd73d8582c4d14438f70d765170398d5d582fb" - integrity sha512-H6UrafHRI1DHfIoi47gZWHKSanlyAkghtGgUO6GTmPqTubBXjl7Ky3owVUAXvFd49+72gwdCLA/DB0Khjc3Ayw== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~5.3.0" - -"@abp/aspnetcore.mvc.ui.theme.shared@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-5.3.0.tgz#84e94845a247815ce981cda2d195944a350530b9" - integrity sha512-RwXxlncjidvh8Hgw91Hz1f5rnfG9hlNROr5bD/kxTUB47vIh/TIBd06UYrYw2/lqFLw5d6wd8q7VLuDjGUQbpg== - dependencies: - "@abp/aspnetcore.mvc.ui" "~5.3.0" - "@abp/bootstrap" "~5.3.0" - "@abp/bootstrap-datepicker" "~5.3.0" - "@abp/datatables.net-bs5" "~5.3.0" - "@abp/font-awesome" "~5.3.0" - "@abp/jquery-form" "~5.3.0" - "@abp/jquery-validation-unobtrusive" "~5.3.0" - "@abp/lodash" "~5.3.0" - "@abp/luxon" "~5.3.0" - "@abp/malihu-custom-scrollbar-plugin" "~5.3.0" - "@abp/select2" "~5.3.0" - "@abp/sweetalert2" "~5.3.0" - "@abp/timeago" "~5.3.0" - "@abp/toastr" "~5.3.0" - -"@abp/aspnetcore.mvc.ui@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-5.3.0.tgz#e947fd1aecbd2aabc5db4c6a64b78f2690fcf0d4" - integrity sha512-en2YDb/hRG1MKkbli1PYcoeU9OLU0YPSahkIBSfOmMLntAe8y0c2+Xe09chXP4r+GoZu0zd9FM3qqCRZojrlug== +"@abp/aspnetcore.mvc.ui.theme.basic@^6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-6.0.0-rc.3.tgz#b95266387e562c635de795442f90470f8e9e6318" + integrity sha512-vVkEpotDST455E3rynvRQpBKPcNNJ2m1wLkz/B9dQNdUjvm8L4F6s0ls0XFlKUNvQfCVfedkRtGayuvNje/Oxg== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~6.0.0-rc.3" + +"@abp/aspnetcore.mvc.ui.theme.shared@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-6.0.0-rc.3.tgz#664ca2ee712b7d9e66103c00beb41eb9648a6075" + integrity sha512-KxCsGuoUWKaDo7Oo9aKp51pli2m0DZ2tG8m+zK+m4M9U7g96uC+DOFy3gc7MdPlszvrw32Wwm7I0AughstByNA== + dependencies: + "@abp/aspnetcore.mvc.ui" "~6.0.0-rc.3" + "@abp/bootstrap" "~6.0.0-rc.3" + "@abp/bootstrap-datepicker" "~6.0.0-rc.3" + "@abp/datatables.net-bs5" "~6.0.0-rc.3" + "@abp/font-awesome" "~6.0.0-rc.3" + "@abp/jquery-form" "~6.0.0-rc.3" + "@abp/jquery-validation-unobtrusive" "~6.0.0-rc.3" + "@abp/lodash" "~6.0.0-rc.3" + "@abp/luxon" "~6.0.0-rc.3" + "@abp/malihu-custom-scrollbar-plugin" "~6.0.0-rc.3" + "@abp/select2" "~6.0.0-rc.3" + "@abp/sweetalert2" "~6.0.0-rc.3" + "@abp/timeago" "~6.0.0-rc.3" + "@abp/toastr" "~6.0.0-rc.3" + +"@abp/aspnetcore.mvc.ui@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-6.0.0-rc.3.tgz#47c23b57ed3908bd78a232230e53d1f3cba2de41" + integrity sha512-7eJZy2JUGQP94Tz3JJWXRHRmDfTcPZ/lS1/VNbU8B4qvgl5ChIXklVEJLR1fwrBhKXZV8fGVmqT1XlGTGFvFJA== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -41,187 +41,187 @@ merge-stream "^2.0.0" micromatch "^4.0.2" -"@abp/blogging@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/blogging/-/blogging-5.3.0.tgz#ccc257d04e586e66e2350b3f3bdc77d55171b516" - integrity sha512-ZeMaprd1MXXebCX1ocyQO7n62tx3+ly0FFTbXRAL/aBRANWVZ+M3c6vPixwJZVyY8CfGHrN+chseD7Tnczw0zA== +"@abp/blogging@^6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/blogging/-/blogging-6.0.0-rc.3.tgz#604e3497bcdfa69a29d4cbbe062b5b691234a8c5" + integrity sha512-OZyqi2Xlq7PDDvmwcVRcssr0hElxSKGoa2UXXeqF8P7FP22TsMvuX81xsNtSn7Qlu3pcFs1pr4em+SfOb8H6jw== dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~5.3.0" - "@abp/owl.carousel" "~5.3.0" - "@abp/prismjs" "~5.3.0" - "@abp/tui-editor" "~5.3.0" + "@abp/aspnetcore.mvc.ui.theme.shared" "~6.0.0-rc.3" + "@abp/owl.carousel" "~6.0.0-rc.3" + "@abp/prismjs" "~6.0.0-rc.3" + "@abp/tui-editor" "~6.0.0-rc.3" -"@abp/bootstrap-datepicker@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-5.3.0.tgz#09c44954774d8f52ca8ff6699ad4dbb7cc0308c2" - integrity sha512-AQ26I0jgoCioW1/4XmQIyn1c1+CLv8KTb4Vd4ZbtdYGBkkkUe+JEAWpJSeXlJRr/XrOs0BKWp/fa7Nnwx8srLg== +"@abp/bootstrap-datepicker@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-6.0.0-rc.3.tgz#89198b863dbfccf5f07ac3c4b20ce6199adcb17a" + integrity sha512-NLoUjcR66mqwSWuVftu2yFH4/j6QP+FiElRfZQ9OYmO8DQx2Ue5UZzjrFTrZ1DBBCfzhr2Bffj80dirGvGDyvg== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-5.3.0.tgz#42dac2d2d6374f39d068a638687039c5c74df123" - integrity sha512-rg9mLcvT4JQRc1rIAhGYK1P2eMRJ1+GArQXV5l7k3FrVU+bRLKdoE6PNpuwXHpdlom4/dOgekfuWH/SAuY5kyw== +"@abp/bootstrap@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-6.0.0-rc.3.tgz#4574bf574cc3484869e8ff8bc592f6212d20a969" + integrity sha512-Q5v7WRkGhGcjRg267HXtqs1oU7ts9UXPyCXmg5y2y5qMOyioD+m4MKV4iv67DgoQjabudp8X2egTKxkej6Lzkw== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" bootstrap "^5.1.3" -"@abp/clipboard@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-5.3.0.tgz#579bbc786d32c4e07c969073872b936575df7a9c" - integrity sha512-J55jQnzPOOAwo70GK9hAB3JxG7rz75tex+17QSFjW7/dXVWt1bPIDRHh/a1wiLEgYc6btsSGhptLtkYAfWpq6w== +"@abp/clipboard@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-6.0.0-rc.3.tgz#ee3a586b491d89442eefff08aaebbf9d38cb46d4" + integrity sha512-01svpp3mR29z1FTM+2Qe+MUNLPbl95bWlOXY5zz2hvNSbdD45lGud+BiOHfeZwlDk5jjr3FqLel+hxx2ByBvOA== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" clipboard "^2.0.8" -"@abp/core@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-5.3.0.tgz#032724dd0c0b850204896ce0275c7f9c8f516740" - integrity sha512-Uk9h98jiEF1dItWrvWnYB6s/UNZZapvFSyJ4+piAsZmXOSAbrObV+s19n5xfUagQQTWn4+aU5+aChEcfWpYv9A== +"@abp/core@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-6.0.0-rc.3.tgz#5662ce813d449d97d9fb7ea2552b2774c8df7825" + integrity sha512-X/VRdk5SGNYc5gQzPcBEPAvwcuD9WXsI4YIdrqjnes0s8u2/XmfrTixojh8Y5EYUoOblEE3Soj5hBhY1cVwcbQ== dependencies: - "@abp/utils" "~5.3.0" + "@abp/utils" "~6.0.0-rc.3" -"@abp/datatables.net-bs5@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-5.3.0.tgz#84771ce4eb7229bed347a5904c891b08e3230422" - integrity sha512-FpKrgrjaBKVgFAnbBsrvDIJJOy8gbWCEHm5Jy2vFWXmx25fITMw/2ckBDH87yrZtCNVTSUbMIdHYOIHMPfSavQ== +"@abp/datatables.net-bs5@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-6.0.0-rc.3.tgz#22865c7e621de720b71af6265b3193f6c78695bd" + integrity sha512-T+mhLc6uSzWmxDQogVwnJ6VxI4845gmF68/i9TmVKNlCtpa3EEfyuF/hgWT1hYfCb4XOsvd/CWrunbkC3fsmtg== dependencies: - "@abp/datatables.net" "~5.3.0" + "@abp/datatables.net" "~6.0.0-rc.3" datatables.net-bs5 "^1.11.4" -"@abp/datatables.net@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-5.3.0.tgz#dd27ae451df9551f5b815e10c87a8a89c6a38293" - integrity sha512-d4lQ09G7HY2gEN1lRAteCZzY0Fv3gPuUM+icgWm+UkmDZV9lhvovTQ58Xkwayw8vf+NPlit1eGMMQedn6MbeAQ== +"@abp/datatables.net@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-6.0.0-rc.3.tgz#d036defe6ad7fc989dffa020ae579362ee3150d1" + integrity sha512-4cUU8/Tn0Vz9bx7jjMOD/0Viyr29fcwoQAAkxaaYZp6qiQbENgz46/xpQf2oBCoudk8CLdzpmNa7jWte7PcJJw== dependencies: - "@abp/jquery" "~5.3.0" + "@abp/jquery" "~6.0.0-rc.3" datatables.net "^1.11.4" -"@abp/font-awesome@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-5.3.0.tgz#ce1d5bb59bd597cc9717885917d4dd2eae1f8b9c" - integrity sha512-JX62EVfZSJ7pv75Gd3ya/3c3He0hXF7KmpTizUNd/EbeHuNJoCND5wwq5OAFV9Ld3vdcGJChNTydNa5RsBzrpg== +"@abp/font-awesome@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-6.0.0-rc.3.tgz#803569d1a7e25f8a1c2be018312449c23fb78217" + integrity sha512-lYdh38UCTSkzzw0B/mpPEo7iFXzSKHCNbBOIHe6dd6O/Qli7wYukTtUOFn5Sh+yoydLY1as92HtiGL1ckSdu1g== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" "@fortawesome/fontawesome-free" "^5.15.4" -"@abp/jquery-form@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-5.3.0.tgz#5ae9906f0cffaf3e043681a5dd80a014b4860f6b" - integrity sha512-ZTpXCImHirJDZjfnJRtSEHLIbWMTYkqtTv7Z3GMRKnI4fllpmuco9EWLAKjAfYPyc/QpTx+MYnUg5SsXORhJyQ== +"@abp/jquery-form@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-6.0.0-rc.3.tgz#4ec503c07e2194148c3a7e7cf7ddef2871679e6a" + integrity sha512-Q3uEpflntqrSkYakcdsBnnYYfxJWXD/CDjMiwjbb6gIc8s4qkbIYxVxvYvlEezoIDYQkMSXOn7BS4clWsesiJg== dependencies: - "@abp/jquery" "~5.3.0" + "@abp/jquery" "~6.0.0-rc.3" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-5.3.0.tgz#ccf90a7840398e69e0a91ed6c32b80fa2eb82d14" - integrity sha512-6B3ywnpvPxpnxkrcXzjTjMWgKRImbzNPOZvv5ant/kQv3zXedV1GXSIILy+imX39FuDPslOmEfx8plwrNvIteA== +"@abp/jquery-validation-unobtrusive@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-6.0.0-rc.3.tgz#01da2a59663d373ff1c69022f4c9c66ad0b29403" + integrity sha512-ij1ML2D9rYF3pJthWO6mGQajsJhbDCtOoBvnh9yCZccuwOYkXP22PqfUxjjxtqL4HqFI31KRpFg0ANMGSzEEBg== dependencies: - "@abp/jquery-validation" "~5.3.0" + "@abp/jquery-validation" "~6.0.0-rc.3" jquery-validation-unobtrusive "^3.2.12" -"@abp/jquery-validation@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-5.3.0.tgz#a21696e7d5d54ef8bcdc0e8bd2debb1da1f7f5cc" - integrity sha512-4z2I9iORf+z5SlN9crC/Gx3X5GAOVePD+WN8SaHSYr4VWYNe8TV8LvCZPilN56sIPt3jYvy0N+bI1tAuZPu/NQ== +"@abp/jquery-validation@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-6.0.0-rc.3.tgz#724aea9572dcb2faccf8c6355332b0b2a4df9260" + integrity sha512-rTK5oHaMtycvWxunNwzbE/MbsXXIr6qDnOY3rVUmjTHjqUOHYz591t/XeQfjnSXPp4k/SZUjG6viTC3J2jzC1A== dependencies: - "@abp/jquery" "~5.3.0" + "@abp/jquery" "~6.0.0-rc.3" jquery-validation "^1.19.3" -"@abp/jquery@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-5.3.0.tgz#0279ee501ed774a788072c2ec8b003e348fec22c" - integrity sha512-rqYbU3LpsT7XT8ygn+TFVmjev5NlgEcDhGwQ8PraY1dEjlDbteeQ50N4adS8fdRfOM1UjGL19ueN3F8E5qNUSg== +"@abp/jquery@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-6.0.0-rc.3.tgz#ba19cc8b802c46490277939e6c674811127d8016" + integrity sha512-MbD38iInyag7/j5k42cvMT4jLZMtXH4lUK0rjvqUDVaxKEks46Ix/90uczQ9XajYONgx0CJKFj2urgM830+CCA== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" jquery "~3.6.0" -"@abp/lodash@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-5.3.0.tgz#45f1dba7bb65b6599b4973d7e0c617dfd2c46c49" - integrity sha512-vQVMv58QuYttWBfLjJzIsw92JunGbWYsqk6pp6/JuoBls5UJtdP1F7vM4JgQxsscGYHFRZB3F4a3h1cxZ+dblQ== +"@abp/lodash@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-6.0.0-rc.3.tgz#8a5bab02353e5cab4ca06ab82f6dbe6285faa95a" + integrity sha512-c8yhcapzPsXyeiFjeOC+2a4bn5wFjW5gUoN+p/p+tE+FIcH37yEgyw/tAr6aZPCmR770MqQXct4t7S4Czbbk+A== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" lodash "^4.17.21" -"@abp/luxon@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-5.3.0.tgz#8a6277046f6e38c3affbf79c06f8ac00d1ca8098" - integrity sha512-6tETR03i1NPJuDqSQWtpkOykdq/84awifQUqRyh+b8340wV7P54NqUMDXDit9sjITFDhq99V/R+Rj3PVjvJD3A== +"@abp/luxon@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-6.0.0-rc.3.tgz#ba515e122c61918d481467d5be39f08a363822f6" + integrity sha512-2lRSSC0DYShlnKdbJ/Pmha/azjt09ZRPx57NQ01dc7ungChPry5EJL6pC3kXWnJrCkrPCF0V5+A3+taut9+l3A== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" luxon "^2.3.0" -"@abp/malihu-custom-scrollbar-plugin@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-5.3.0.tgz#e6e12162aa50d3c3d98629378cec2f6fd5964338" - integrity sha512-GVwgAZQurH/tr4Hgmuby2dun//v1dT+wLGV4ZvjCJzBRs4FgrB+25pj4qKm20j6/NKRKc4V5re/b1y6njCubFQ== +"@abp/malihu-custom-scrollbar-plugin@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-6.0.0-rc.3.tgz#0798e37ec6a852748118692a5fbd30c99d9745db" + integrity sha512-FlyShmRxG3wGk1OJCjHIZAdi2/Y2FJPkVxaE72CVIceQSmg0nebGTv3a7bhd4QzKkDsSA3+t6gHjnuKlTlDFLA== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/owl.carousel@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/owl.carousel/-/owl.carousel-5.3.0.tgz#65f4459fa25f3aadf7bbd11e7202dfc4bc50c943" - integrity sha512-ku7a6Yq46lXU3RMnYDPBb5fCYr2Il1U/iGv+rFLueJ2Y06gvLBOEYF+5VAK+nv6Q6nvUdtubOC5SX9Hn2VHtjQ== +"@abp/owl.carousel@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/owl.carousel/-/owl.carousel-6.0.0-rc.3.tgz#5d5884a622e6423cc73175a2cd376c892325be20" + integrity sha512-4KGPzfGUEeN2CN+EtYYKuhJU1nb1OIQd1Fxi6DmkFYeN/9KdgS8dwGZjMvFxYde+BfhDZP1zrfS6ZbpJKkzsPQ== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" owl.carousel "^2.3.4" -"@abp/prismjs@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-5.3.0.tgz#658a371023d9a3de9ecfff1f10bae7a83064fac7" - integrity sha512-NPsYJ9oj/57vG+eVGpDkJcdPAx4WlXTVEUZWWxmaXuM9sHY1/2av975Qk8R5HG6fC74w3DrVCP8YQvU6jlaF1w== +"@abp/prismjs@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-6.0.0-rc.3.tgz#e4faf595e29db81c5a66030e59b0e09f09759bfd" + integrity sha512-zzd3iw/Im0M9FUmTviwkTCr4slkoZJExtK+qB1FmLxRY59+hyU9wxd6hwzic/QwhXxFQoYILJ3S3FNxsPIm76A== dependencies: - "@abp/clipboard" "~5.3.0" - "@abp/core" "~5.3.0" + "@abp/clipboard" "~6.0.0-rc.3" + "@abp/core" "~6.0.0-rc.3" prismjs "^1.26.0" -"@abp/select2@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-5.3.0.tgz#aae202b87dc23dfc7c8fd933413a8dbeb2f5b683" - integrity sha512-0aIxdtzgONkrYnUN5ACkIIIhsC9e61QLRq3K+/98fjf7NkHOjG3Sptr8EKu5U3IQ2hNHgqBjPGYjkztGuxZ9kw== +"@abp/select2@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-6.0.0-rc.3.tgz#deb8332bfce2102a562004893321a48d5194bf53" + integrity sha512-rb0qElmmhiP09xX8ZbjzNLF6ygFBwErysGWt6Bbgzz5waX2sGe575Cgoz53FaMQ4JaRBg1N0/nCejKyDtiINRA== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" select2 "^4.0.13" -"@abp/sweetalert2@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-5.3.0.tgz#67379cfa4cb8884cb66b58f4cafa79960cf8426a" - integrity sha512-EBr8J7MDsYmSvOYxTbqsSmw6c2yLokHZe8A+EW2vsY9VYFXkoOJLVpCkCK4fhvHUv8/+Y5QnHW7bs1I6SKYXOw== +"@abp/sweetalert2@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-6.0.0-rc.3.tgz#e61fc6c1bed1316c1d44ca5c92f590e422db24d4" + integrity sha512-+SNpBb4XrQlWzRQK9lfdJqA9IfJrlgoqmHwPDgf3Q+P922MzO33TgDlZWbeE7MzVj2y2WmNsPuCKwhjSjSL2rw== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" sweetalert2 "^11.3.6" -"@abp/timeago@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-5.3.0.tgz#3aaef3edca333224ba6b3e81c8ad1ebaae51a2f4" - integrity sha512-FxtoPYxyk2CHeoloC6kaeCj5YtXH0rebhOEaCjrfyg9/Ec6LEkvpfC7RWlcsHaEUAtFXZegJDfOk066EPH7RHQ== +"@abp/timeago@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-6.0.0-rc.3.tgz#0ef8c4801bfd4623e6895b1d047b1437063bda53" + integrity sha512-P3YRDVKjR5/Fz+cXiPg3IiUr7XGbNh7mgmJ1ywRXmKVmVMJmhQ2RsKmmtkGJn4TfVHu/l5iJXe4rqgL21/yX/g== dependencies: - "@abp/jquery" "~5.3.0" + "@abp/jquery" "~6.0.0-rc.3" timeago "^1.6.7" -"@abp/toastr@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-5.3.0.tgz#8a002c19ea25ac6b042a25c0f9d289d03c93c2fb" - integrity sha512-gjb2O/XrYkX8IeCERIqlOYPh15WlF9LxGR6t9jeVF/p6BTX/yaWabYCFfB9SkU2pQ6xrGl7WmSTAC06JOAtPTA== +"@abp/toastr@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-6.0.0-rc.3.tgz#6010d4247937531ebf7c8659d6254cd3db6c4855" + integrity sha512-sC9eCzYVgDrLSFIhJGe9hshzfwA1BkZNah4NQhyq+V6HQ8YF7goMS79N+/XmSoLQ9zzRhusqnPFnb+4FHjr7iA== dependencies: - "@abp/jquery" "~5.3.0" + "@abp/jquery" "~6.0.0-rc.3" toastr "^2.1.4" -"@abp/tui-editor@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/tui-editor/-/tui-editor-5.3.0.tgz#99969b636687a6ca4fc651129d12b8a19499c32c" - integrity sha512-FldoVDpVnbBd7jirGnsVDho9hV6Qg2lU4YB5iUgkuMjAEVO/QOb25FK4Fei1jwioE6fjbyF9cwG7WDnG/YEc3g== +"@abp/tui-editor@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/tui-editor/-/tui-editor-6.0.0-rc.3.tgz#7e913a80139af381d881f2b0205d4938ec6f6ca3" + integrity sha512-FC+gyHMn/FecAb8sVNFwf9FcJ035Lqm+LwiIXckS2VaSTbuKna0K/ADlOoSr1Ntwe5GWptZ93STIgSt1QJPdEw== dependencies: - "@abp/jquery" "~5.3.0" - "@abp/prismjs" "~5.3.0" + "@abp/jquery" "~6.0.0-rc.3" + "@abp/prismjs" "~6.0.0-rc.3" -"@abp/utils@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-5.3.0.tgz#e93739074a3cd445a5a221209506b7e663050ca0" - integrity sha512-Nm+h+3PL10+rBFSh8UUuenmGM+OBlEoNQeGzHRmhOc6hJ3oqCogPzY+zkq0e4pksrwhjxAu/cgCEGLAoEXXycw== +"@abp/utils@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-6.0.0-rc.3.tgz#6d3515694314175218606e9518618ce335b4b360" + integrity sha512-K2geJ9P1ztk4Ehzb9YG3CqqLOi+z8/4iBLUzooNZLQqS+KdlUhCmqfuCoI/A5Aq9DGbTYesalp+Fwoh3S2Dl8A== dependencies: just-compare "^1.3.0" diff --git a/modules/blogging/src/Volo.Blogging.Admin.Application.Contracts/Volo.Blogging.Admin.Application.Contracts.abppkg.analyze.json b/modules/blogging/src/Volo.Blogging.Admin.Application.Contracts/Volo.Blogging.Admin.Application.Contracts.abppkg.analyze.json index 66f7032ccd..6f168249f9 100644 --- a/modules/blogging/src/Volo.Blogging.Admin.Application.Contracts/Volo.Blogging.Admin.Application.Contracts.abppkg.analyze.json +++ b/modules/blogging/src/Volo.Blogging.Admin.Application.Contracts/Volo.Blogging.Admin.Application.Contracts.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.Blogging.Admin.Application.Contracts", - "hash": "bc5b2c34e2c42cadb2a10a82348aa2b7", + "hash": "be484343bc0b862114e22ee45c9027e3", "contents": [ { "namespace": "Volo.Blogging.Admin", diff --git a/modules/blogging/src/Volo.Blogging.Admin.Application/Volo.Blogging.Admin.Application.abppkg.analyze.json b/modules/blogging/src/Volo.Blogging.Admin.Application/Volo.Blogging.Admin.Application.abppkg.analyze.json index c64f53ac74..7cee7ce2a5 100644 --- a/modules/blogging/src/Volo.Blogging.Admin.Application/Volo.Blogging.Admin.Application.abppkg.analyze.json +++ b/modules/blogging/src/Volo.Blogging.Admin.Application/Volo.Blogging.Admin.Application.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.Blogging.Admin.Application", - "hash": "7b36c95fbcf2605d9ea2614cba9ed2b6", + "hash": "da2cac72c4199b60197f4b57b5e7c9e6", "contents": [ { "namespace": "Volo.Blogging.Admin", diff --git a/modules/blogging/src/Volo.Blogging.Admin.HttpApi.Client/Volo.Blogging.Admin.HttpApi.Client.abppkg.analyze.json b/modules/blogging/src/Volo.Blogging.Admin.HttpApi.Client/Volo.Blogging.Admin.HttpApi.Client.abppkg.analyze.json new file mode 100644 index 0000000000..d4444f3ee3 --- /dev/null +++ b/modules/blogging/src/Volo.Blogging.Admin.HttpApi.Client/Volo.Blogging.Admin.HttpApi.Client.abppkg.analyze.json @@ -0,0 +1,11 @@ +{ + "name": "Volo.Blogging.Admin.HttpApi.Client", + "hash": "a721bcce141abe86ecb9c0d1c29350c1", + "contents": [ + { + "namespace": "Volo.Blogging.Admin", + "contentType": "abpModule", + "name": "BloggingAdminHttpApiClientModule" + } + ] +} \ No newline at end of file diff --git a/modules/blogging/src/Volo.Blogging.Admin.HttpApi/Volo.Blogging.Admin.HttpApi.abppkg.analyze.json b/modules/blogging/src/Volo.Blogging.Admin.HttpApi/Volo.Blogging.Admin.HttpApi.abppkg.analyze.json index fd6e127271..db823941d1 100644 --- a/modules/blogging/src/Volo.Blogging.Admin.HttpApi/Volo.Blogging.Admin.HttpApi.abppkg.analyze.json +++ b/modules/blogging/src/Volo.Blogging.Admin.HttpApi/Volo.Blogging.Admin.HttpApi.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.Blogging.Admin.HttpApi", - "hash": "4397a28b60e20715a0d7559a882c7070", + "hash": "5a7f1b44c7977fc9ae74a04688a1f012", "contents": [ { "namespace": "Volo.Blogging.Admin", diff --git a/modules/blogging/src/Volo.Blogging.Admin.Web/Volo.Blogging.Admin.Web.abppkg.analyze.json b/modules/blogging/src/Volo.Blogging.Admin.Web/Volo.Blogging.Admin.Web.abppkg.analyze.json index fb891d09d2..b823ec813c 100644 --- a/modules/blogging/src/Volo.Blogging.Admin.Web/Volo.Blogging.Admin.Web.abppkg.analyze.json +++ b/modules/blogging/src/Volo.Blogging.Admin.Web/Volo.Blogging.Admin.Web.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.Blogging.Admin.Web", - "hash": "faf036383d0b2be635023b8f9627038d", + "hash": "038f0c3d57f5f4bc8e0e773b1f0c3b3a", "contents": [ { "namespace": "Volo.Blogging.Admin", diff --git a/modules/blogging/src/Volo.Blogging.Application.Contracts/Volo.Blogging.Application.Contracts.abppkg.analyze.json b/modules/blogging/src/Volo.Blogging.Application.Contracts/Volo.Blogging.Application.Contracts.abppkg.analyze.json index f587083699..a4e06785ee 100644 --- a/modules/blogging/src/Volo.Blogging.Application.Contracts/Volo.Blogging.Application.Contracts.abppkg.analyze.json +++ b/modules/blogging/src/Volo.Blogging.Application.Contracts/Volo.Blogging.Application.Contracts.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.Blogging.Application.Contracts", - "hash": "2f9db4cac9c4fdbbbacb91565e42a287", + "hash": "f2feafeeb5d85cc3f76512948097381d", "contents": [ { "namespace": "Volo.Blogging", diff --git a/modules/blogging/src/Volo.Blogging.Application/Volo.Blogging.Application.abppkg.analyze.json b/modules/blogging/src/Volo.Blogging.Application/Volo.Blogging.Application.abppkg.analyze.json index dee8571533..50a144921c 100644 --- a/modules/blogging/src/Volo.Blogging.Application/Volo.Blogging.Application.abppkg.analyze.json +++ b/modules/blogging/src/Volo.Blogging.Application/Volo.Blogging.Application.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.Blogging.Application", - "hash": "cb199201deb38a1dbd87df36e993c999", + "hash": "47a4bc61ba0c33ebe3b888158ee679f6", "contents": [ { "namespace": "Volo.Blogging", diff --git a/modules/blogging/src/Volo.Blogging.Domain.Shared/Volo.Blogging.Domain.Shared.abppkg.analyze.json b/modules/blogging/src/Volo.Blogging.Domain.Shared/Volo.Blogging.Domain.Shared.abppkg.analyze.json index cc8cc96766..9a3ce4eaca 100644 --- a/modules/blogging/src/Volo.Blogging.Domain.Shared/Volo.Blogging.Domain.Shared.abppkg.analyze.json +++ b/modules/blogging/src/Volo.Blogging.Domain.Shared/Volo.Blogging.Domain.Shared.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.Blogging.Domain.Shared", - "hash": "071426a5a0990afe3cd051a9f1c1513c", + "hash": "5c72d38b48fd549c1e4d37eb5f4a5f8e", "contents": [ { "namespace": "Volo.Blogging", diff --git a/modules/blogging/src/Volo.Blogging.Domain.Shared/Volo/Blogging/Localization/Resources/en.json b/modules/blogging/src/Volo.Blogging.Domain.Shared/Volo/Blogging/Localization/Resources/en.json index 9823d30f73..40c44e55c0 100644 --- a/modules/blogging/src/Volo.Blogging.Domain.Shared/Volo/Blogging/Localization/Resources/en.json +++ b/modules/blogging/src/Volo.Blogging.Domain.Shared/Volo/Blogging/Localization/Resources/en.json @@ -56,6 +56,8 @@ "ShareOn": "Share on", "TitleLengthWarning": "Keep your title size under 60 characters to be SEO friendly!", "ClearCache": "Clear cache", - "ClearCacheConfirmationMessage": "Are you sure you want to clear the cache?" + "ClearCacheConfirmationMessage": "Are you sure you want to clear the cache?", + "MarkdownSupported": "Markdown is supported", + "FileUploadInfo": "Drag, drop, or paste a copied image." } } \ No newline at end of file diff --git a/modules/blogging/src/Volo.Blogging.Domain.Shared/Volo/Blogging/Localization/Resources/pt-BR.json b/modules/blogging/src/Volo.Blogging.Domain.Shared/Volo/Blogging/Localization/Resources/pt-BR.json index f26b339d71..bb19760972 100644 --- a/modules/blogging/src/Volo.Blogging.Domain.Shared/Volo/Blogging/Localization/Resources/pt-BR.json +++ b/modules/blogging/src/Volo.Blogging.Domain.Shared/Volo/Blogging/Localization/Resources/pt-BR.json @@ -37,7 +37,7 @@ "Edit": "Editar", "BLOG": "BLOG", "CommentDeletionWarningMessage": "O comentário será excluído.", - "PostDeletionWarningMessage": "O post será excluído.", + "PostDeletionWarningMessage": "A postagem será excluída.", "BlogDeletionWarningMessage": "O Blog será excluído.", "AreYouSure": "Você tem certeza?", "CommentWithCount": "{0} comentários", @@ -54,8 +54,10 @@ "Blogs": "Blogs", "Tags": "Etiquetas", "ShareOn": "Compartilhar no", - "TitleLengthWarning": "Mantenha o tamanho do título abaixo de 60 caracteres para ser SEO amigável!", + "TitleLengthWarning": "Mantenha o tamanho do título abaixo de 60 caracteres para ser amigável ao SEO!", "ClearCache": "Limpar cache", - "ClearCacheConfirmationMessage": "Tem certeza de que deseja limpar o cache?" + "ClearCacheConfirmationMessage": "Tem certeza de que deseja limpar o cache?", + "MarkdownSupported": "Markdown é suportado", + "FileUploadInfo": "Arrastar, soltar, ou colar uma imagem copiada." } } \ No newline at end of file diff --git a/modules/blogging/src/Volo.Blogging.Domain/Volo.Blogging.Domain.abppkg.analyze.json b/modules/blogging/src/Volo.Blogging.Domain/Volo.Blogging.Domain.abppkg.analyze.json index b67fae070e..4b3197d109 100644 --- a/modules/blogging/src/Volo.Blogging.Domain/Volo.Blogging.Domain.abppkg.analyze.json +++ b/modules/blogging/src/Volo.Blogging.Domain/Volo.Blogging.Domain.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.Blogging.Domain", - "hash": "a04c90c3913af092e8990a27cb72e208", + "hash": "bf1806736d7d435af015acb0aac2eab2", "contents": [ { "namespace": "Volo.Blogging", @@ -57,7 +57,7 @@ { "namespace": "Volo.Blogging.Users", "summary": null, - "entityModel": { + "entityAnalyzeModel": { "namespace": "Volo.Blogging.Users", "primaryKeyType": "Guid", "summary": null, @@ -72,7 +72,7 @@ { "namespace": "Volo.Blogging.Tagging", "summary": null, - "entityModel": { + "entityAnalyzeModel": { "namespace": "Volo.Blogging.Tagging", "primaryKeyType": "Guid", "summary": null, @@ -87,7 +87,7 @@ { "namespace": "Volo.Blogging.Posts", "summary": null, - "entityModel": { + "entityAnalyzeModel": { "namespace": "Volo.Blogging.Posts", "primaryKeyType": "Guid", "summary": null, @@ -104,7 +104,7 @@ { "namespace": "Volo.Blogging.Comments", "summary": null, - "entityModel": { + "entityAnalyzeModel": { "namespace": "Volo.Blogging.Comments", "primaryKeyType": "Guid", "summary": null, @@ -119,7 +119,7 @@ { "namespace": "Volo.Blogging.Blogs", "summary": null, - "entityModel": { + "entityAnalyzeModel": { "namespace": "Volo.Blogging.Blogs", "primaryKeyType": "Guid", "summary": null, diff --git a/modules/blogging/src/Volo.Blogging.Domain/Volo/Blogging/BloggingDbProperties.cs b/modules/blogging/src/Volo.Blogging.Domain/Volo/Blogging/AbpBloggingDbProperties.cs similarity index 90% rename from modules/blogging/src/Volo.Blogging.Domain/Volo/Blogging/BloggingDbProperties.cs rename to modules/blogging/src/Volo.Blogging.Domain/Volo/Blogging/AbpBloggingDbProperties.cs index 6f57d5f404..464ea2c348 100644 --- a/modules/blogging/src/Volo.Blogging.Domain/Volo/Blogging/BloggingDbProperties.cs +++ b/modules/blogging/src/Volo.Blogging.Domain/Volo/Blogging/AbpBloggingDbProperties.cs @@ -1,6 +1,6 @@ namespace Volo.Blogging { - public static class BloggingDbProperties + public static class AbpBloggingDbProperties { /// /// Default value: "Blg". diff --git a/modules/blogging/src/Volo.Blogging.EntityFrameworkCore/Volo.Blogging.EntityFrameworkCore.abppkg.analyze.json b/modules/blogging/src/Volo.Blogging.EntityFrameworkCore/Volo.Blogging.EntityFrameworkCore.abppkg.analyze.json index 865476c365..33f0e4e4e2 100644 --- a/modules/blogging/src/Volo.Blogging.EntityFrameworkCore/Volo.Blogging.EntityFrameworkCore.abppkg.analyze.json +++ b/modules/blogging/src/Volo.Blogging.EntityFrameworkCore/Volo.Blogging.EntityFrameworkCore.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.Blogging.EntityFrameworkCore", - "hash": "2e7dd0b9baf54f79d100f8b439b43449", + "hash": "28d4b0828f47b8b4e6cef70a5879915f", "contents": [ { "namespace": "Volo.Blogging.EntityFrameworkCore", diff --git a/modules/blogging/src/Volo.Blogging.EntityFrameworkCore/Volo/Blogging/EntityFrameworkCore/BloggingDbContext.cs b/modules/blogging/src/Volo.Blogging.EntityFrameworkCore/Volo/Blogging/EntityFrameworkCore/BloggingDbContext.cs index 85c34aa996..9ccbe3aa3b 100644 --- a/modules/blogging/src/Volo.Blogging.EntityFrameworkCore/Volo/Blogging/EntityFrameworkCore/BloggingDbContext.cs +++ b/modules/blogging/src/Volo.Blogging.EntityFrameworkCore/Volo/Blogging/EntityFrameworkCore/BloggingDbContext.cs @@ -11,7 +11,7 @@ using Volo.Blogging.Users; namespace Volo.Blogging.EntityFrameworkCore { [IgnoreMultiTenancy] - [ConnectionStringName(BloggingDbProperties.ConnectionStringName)] + [ConnectionStringName(AbpBloggingDbProperties.ConnectionStringName)] public class BloggingDbContext : AbpDbContext, IBloggingDbContext { public DbSet Users { get; set; } diff --git a/modules/blogging/src/Volo.Blogging.EntityFrameworkCore/Volo/Blogging/EntityFrameworkCore/BloggingDbContextModelBuilderExtensions.cs b/modules/blogging/src/Volo.Blogging.EntityFrameworkCore/Volo/Blogging/EntityFrameworkCore/BloggingDbContextModelBuilderExtensions.cs index 3386da25a5..abf96ebcef 100644 --- a/modules/blogging/src/Volo.Blogging.EntityFrameworkCore/Volo/Blogging/EntityFrameworkCore/BloggingDbContextModelBuilderExtensions.cs +++ b/modules/blogging/src/Volo.Blogging.EntityFrameworkCore/Volo/Blogging/EntityFrameworkCore/BloggingDbContextModelBuilderExtensions.cs @@ -25,7 +25,7 @@ namespace Volo.Blogging.EntityFrameworkCore builder.Entity(b => { - b.ToTable(BloggingDbProperties.DbTablePrefix + "Users", BloggingDbProperties.DbSchema); + b.ToTable(AbpBloggingDbProperties.DbTablePrefix + "Users", AbpBloggingDbProperties.DbSchema); b.ConfigureByConvention(); b.ConfigureAbpUser(); @@ -35,7 +35,7 @@ namespace Volo.Blogging.EntityFrameworkCore builder.Entity(b => { - b.ToTable(BloggingDbProperties.DbTablePrefix + "Blogs", BloggingDbProperties.DbSchema); + b.ToTable(AbpBloggingDbProperties.DbTablePrefix + "Blogs", AbpBloggingDbProperties.DbSchema); b.ConfigureByConvention(); @@ -48,7 +48,7 @@ namespace Volo.Blogging.EntityFrameworkCore builder.Entity(b => { - b.ToTable(BloggingDbProperties.DbTablePrefix + "Posts", BloggingDbProperties.DbSchema); + b.ToTable(AbpBloggingDbProperties.DbTablePrefix + "Posts", AbpBloggingDbProperties.DbSchema); b.ConfigureByConvention(); @@ -68,7 +68,7 @@ namespace Volo.Blogging.EntityFrameworkCore builder.Entity(b => { - b.ToTable(BloggingDbProperties.DbTablePrefix + "Comments", BloggingDbProperties.DbSchema); + b.ToTable(AbpBloggingDbProperties.DbTablePrefix + "Comments", AbpBloggingDbProperties.DbSchema); b.ConfigureByConvention(); @@ -84,7 +84,7 @@ namespace Volo.Blogging.EntityFrameworkCore builder.Entity(b => { - b.ToTable(BloggingDbProperties.DbTablePrefix + "Tags", BloggingDbProperties.DbSchema); + b.ToTable(AbpBloggingDbProperties.DbTablePrefix + "Tags", AbpBloggingDbProperties.DbSchema); b.ConfigureByConvention(); @@ -99,7 +99,7 @@ namespace Volo.Blogging.EntityFrameworkCore builder.Entity(b => { - b.ToTable(BloggingDbProperties.DbTablePrefix + "PostTags", BloggingDbProperties.DbSchema); + b.ToTable(AbpBloggingDbProperties.DbTablePrefix + "PostTags", AbpBloggingDbProperties.DbSchema); b.ConfigureByConvention(); diff --git a/modules/blogging/src/Volo.Blogging.EntityFrameworkCore/Volo/Blogging/EntityFrameworkCore/IBloggingDbContext.cs b/modules/blogging/src/Volo.Blogging.EntityFrameworkCore/Volo/Blogging/EntityFrameworkCore/IBloggingDbContext.cs index 4eb8f35c03..ce63597029 100644 --- a/modules/blogging/src/Volo.Blogging.EntityFrameworkCore/Volo/Blogging/EntityFrameworkCore/IBloggingDbContext.cs +++ b/modules/blogging/src/Volo.Blogging.EntityFrameworkCore/Volo/Blogging/EntityFrameworkCore/IBloggingDbContext.cs @@ -11,7 +11,7 @@ using Volo.Blogging.Users; namespace Volo.Blogging.EntityFrameworkCore { [IgnoreMultiTenancy] - [ConnectionStringName(BloggingDbProperties.ConnectionStringName)] + [ConnectionStringName(AbpBloggingDbProperties.ConnectionStringName)] public interface IBloggingDbContext : IEfCoreDbContext { DbSet Users { get; } diff --git a/modules/blogging/src/Volo.Blogging.HttpApi.Client/Volo.Blogging.HttpApi.Client.abppkg.analyze.json b/modules/blogging/src/Volo.Blogging.HttpApi.Client/Volo.Blogging.HttpApi.Client.abppkg.analyze.json new file mode 100644 index 0000000000..28ff008598 --- /dev/null +++ b/modules/blogging/src/Volo.Blogging.HttpApi.Client/Volo.Blogging.HttpApi.Client.abppkg.analyze.json @@ -0,0 +1,11 @@ +{ + "name": "Volo.Blogging.HttpApi.Client", + "hash": "81cf265f097ded223f74972a77367635", + "contents": [ + { + "namespace": "Volo.Blogging", + "contentType": "abpModule", + "name": "BloggingHttpApiClientModule" + } + ] +} \ No newline at end of file diff --git a/modules/blogging/src/Volo.Blogging.HttpApi/Volo.Blogging.HttpApi.abppkg.analyze.json b/modules/blogging/src/Volo.Blogging.HttpApi/Volo.Blogging.HttpApi.abppkg.analyze.json index 8d67d96d83..97d416b25b 100644 --- a/modules/blogging/src/Volo.Blogging.HttpApi/Volo.Blogging.HttpApi.abppkg.analyze.json +++ b/modules/blogging/src/Volo.Blogging.HttpApi/Volo.Blogging.HttpApi.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.Blogging.HttpApi", - "hash": "7e01f3bdcf88041ab5d7632be87716a5", + "hash": "185146640ff70ee3bc3e49c2ae9cbe23", "contents": [ { "namespace": "Volo.Blogging", diff --git a/studio/source-codes/Volo.Abp.Account.SourceCode/FodyWeavers.xml b/modules/blogging/src/Volo.Blogging.Installer/FodyWeavers.xml similarity index 100% rename from studio/source-codes/Volo.Abp.Account.SourceCode/FodyWeavers.xml rename to modules/blogging/src/Volo.Blogging.Installer/FodyWeavers.xml diff --git a/studio/source-codes/Volo.Abp.Identity.SourceCode/FodyWeavers.xsd b/modules/blogging/src/Volo.Blogging.Installer/FodyWeavers.xsd similarity index 100% rename from studio/source-codes/Volo.Abp.Identity.SourceCode/FodyWeavers.xsd rename to modules/blogging/src/Volo.Blogging.Installer/FodyWeavers.xsd diff --git a/modules/blogging/src/Volo.Blogging.Installer/Volo.Blogging.Installer.csproj b/modules/blogging/src/Volo.Blogging.Installer/Volo.Blogging.Installer.csproj new file mode 100644 index 0000000000..7a465c40e7 --- /dev/null +++ b/modules/blogging/src/Volo.Blogging.Installer/Volo.Blogging.Installer.csproj @@ -0,0 +1,24 @@ + + + + + + + net6.0 + true + + + + + + + + + + + + + + + + diff --git a/modules/blogging/src/Volo.Blogging.Installer/Volo/Blogging/BloggingInstallerModule.cs b/modules/blogging/src/Volo.Blogging.Installer/Volo/Blogging/BloggingInstallerModule.cs new file mode 100644 index 0000000000..1820fba2b8 --- /dev/null +++ b/modules/blogging/src/Volo.Blogging.Installer/Volo/Blogging/BloggingInstallerModule.cs @@ -0,0 +1,20 @@ +using Volo.Abp.Modularity; +using Volo.Abp.Studio; +using Volo.Abp.VirtualFileSystem; + +namespace Volo.Blogging; + +[DependsOn( + typeof(AbpStudioModuleInstallerModule), + typeof(AbpVirtualFileSystemModule) + )] +public class BloggingInstallerModule : AbpModule +{ + public override void ConfigureServices(ServiceConfigurationContext context) + { + Configure(options => + { + options.FileSets.AddEmbedded(); + }); + } +} diff --git a/modules/blogging/src/Volo.Blogging.Installer/Volo/Blogging/BloggingInstallerPipelineBuilder.cs b/modules/blogging/src/Volo.Blogging.Installer/Volo/Blogging/BloggingInstallerPipelineBuilder.cs new file mode 100644 index 0000000000..638bd4a5e3 --- /dev/null +++ b/modules/blogging/src/Volo.Blogging.Installer/Volo/Blogging/BloggingInstallerPipelineBuilder.cs @@ -0,0 +1,17 @@ +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Studio.ModuleInstalling; + +namespace Volo.Blogging; + +[Dependency(ServiceLifetime.Transient, ReplaceServices = true)] +[ExposeServices(typeof(IModuleInstallingPipelineBuilder))] +public class BloggingInstallerPipelineBuilder : ModuleInstallingPipelineBuilderBase, IModuleInstallingPipelineBuilder, ITransientDependency +{ + public async Task BuildAsync(ModuleInstallingContext context) + { + + return GetBasePipeline(context); + } +} diff --git a/modules/blogging/src/Volo.Blogging.MongoDB/Volo.Blogging.MongoDB.abppkg.analyze.json b/modules/blogging/src/Volo.Blogging.MongoDB/Volo.Blogging.MongoDB.abppkg.analyze.json new file mode 100644 index 0000000000..64d1d40627 --- /dev/null +++ b/modules/blogging/src/Volo.Blogging.MongoDB/Volo.Blogging.MongoDB.abppkg.analyze.json @@ -0,0 +1,44 @@ +{ + "name": "Volo.Blogging.MongoDB", + "hash": "6837c014507cf952197f4b5ae3cafb97", + "contents": [ + { + "namespace": "Volo.Blogging.MongoDB", + "contentType": "abpModule", + "name": "BloggingMongoDbModule" + }, + { + "namespace": "Volo.Blogging.MongoDB", + "connectionStringName": "Blogging", + "databaseCollections": [ + { + "entityFullName": "Volo.Blogging.Comments.Comment", + "contentType": "databaseCollection", + "name": "BlgComments" + }, + { + "entityFullName": "Volo.Blogging.Posts.Post", + "contentType": "databaseCollection", + "name": "BlgPosts" + }, + { + "entityFullName": "Volo.Blogging.Blogs.Blog", + "contentType": "databaseCollection", + "name": "BlgBlogs" + }, + { + "entityFullName": "Volo.Blogging.Tagging.Tag", + "contentType": "databaseCollection", + "name": "BlgTags" + }, + { + "entityFullName": "Volo.Blogging.Users.BlogUser", + "contentType": "databaseCollection", + "name": "BlgUsers" + } + ], + "contentType": "mongoDbContext", + "name": "BloggingMongoDbContext" + } + ] +} \ No newline at end of file diff --git a/modules/blogging/src/Volo.Blogging.MongoDB/Volo/Blogging/MongoDB/BloggingMongoDbContext.cs b/modules/blogging/src/Volo.Blogging.MongoDB/Volo/Blogging/MongoDB/BloggingMongoDbContext.cs index 1f20ff1744..d782f0fb1b 100644 --- a/modules/blogging/src/Volo.Blogging.MongoDB/Volo/Blogging/MongoDB/BloggingMongoDbContext.cs +++ b/modules/blogging/src/Volo.Blogging.MongoDB/Volo/Blogging/MongoDB/BloggingMongoDbContext.cs @@ -10,7 +10,7 @@ using Volo.Blogging.Users; namespace Volo.Blogging.MongoDB { [IgnoreMultiTenancy] - [ConnectionStringName(BloggingDbProperties.ConnectionStringName)] + [ConnectionStringName(AbpBloggingDbProperties.ConnectionStringName)] public class BloggingMongoDbContext : AbpMongoDbContext, IBloggingMongoDbContext { public IMongoCollection Users => Collection(); diff --git a/modules/blogging/src/Volo.Blogging.MongoDB/Volo/Blogging/MongoDB/BloggingMongoDbContextExtensions.cs b/modules/blogging/src/Volo.Blogging.MongoDB/Volo/Blogging/MongoDB/BloggingMongoDbContextExtensions.cs index b04f0a74fc..1083169761 100644 --- a/modules/blogging/src/Volo.Blogging.MongoDB/Volo/Blogging/MongoDB/BloggingMongoDbContextExtensions.cs +++ b/modules/blogging/src/Volo.Blogging.MongoDB/Volo/Blogging/MongoDB/BloggingMongoDbContextExtensions.cs @@ -16,27 +16,27 @@ namespace Volo.Blogging.MongoDB builder.Entity(b => { - b.CollectionName = BloggingDbProperties.DbTablePrefix + "Users"; + b.CollectionName = AbpBloggingDbProperties.DbTablePrefix + "Users"; }); builder.Entity(b => { - b.CollectionName = BloggingDbProperties.DbTablePrefix + "Blogs"; + b.CollectionName = AbpBloggingDbProperties.DbTablePrefix + "Blogs"; }); builder.Entity(b => { - b.CollectionName = BloggingDbProperties.DbTablePrefix + "Posts"; + b.CollectionName = AbpBloggingDbProperties.DbTablePrefix + "Posts"; }); builder.Entity(b => { - b.CollectionName = BloggingDbProperties.DbTablePrefix + "Tags"; + b.CollectionName = AbpBloggingDbProperties.DbTablePrefix + "Tags"; }); builder.Entity(b => { - b.CollectionName = BloggingDbProperties.DbTablePrefix + "Comments"; + b.CollectionName = AbpBloggingDbProperties.DbTablePrefix + "Comments"; }); } } diff --git a/modules/blogging/src/Volo.Blogging.MongoDB/Volo/Blogging/MongoDB/IBloggingMongoDbContext.cs b/modules/blogging/src/Volo.Blogging.MongoDB/Volo/Blogging/MongoDB/IBloggingMongoDbContext.cs index 1dbf5eee92..d3c898a14d 100644 --- a/modules/blogging/src/Volo.Blogging.MongoDB/Volo/Blogging/MongoDB/IBloggingMongoDbContext.cs +++ b/modules/blogging/src/Volo.Blogging.MongoDB/Volo/Blogging/MongoDB/IBloggingMongoDbContext.cs @@ -10,7 +10,7 @@ using Volo.Blogging.Users; namespace Volo.Blogging.MongoDB { [IgnoreMultiTenancy] - [ConnectionStringName(BloggingDbProperties.ConnectionStringName)] + [ConnectionStringName(AbpBloggingDbProperties.ConnectionStringName)] public interface IBloggingMongoDbContext : IAbpMongoDbContext { IMongoCollection Users { get; } diff --git a/modules/blogging/src/Volo.Blogging.Web/Volo.Blogging.Web.abppkg.analyze.json b/modules/blogging/src/Volo.Blogging.Web/Volo.Blogging.Web.abppkg.analyze.json index e8e2e45560..06a9cd0aee 100644 --- a/modules/blogging/src/Volo.Blogging.Web/Volo.Blogging.Web.abppkg.analyze.json +++ b/modules/blogging/src/Volo.Blogging.Web/Volo.Blogging.Web.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.Blogging.Web", - "hash": "daa60f34c9198bebe6d9f659595dbbea", + "hash": "1e34d5e0718fb581ffbca20cbf71f4f6", "contents": [ { "namespace": "Volo.Blogging", diff --git a/modules/client-simulation/demo/Volo.ClientSimulation.Demo/package.json b/modules/client-simulation/demo/Volo.ClientSimulation.Demo/package.json index fda2f11795..03f627410b 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": "^5.3.0" + "@abp/aspnetcore.mvc.ui.theme.basic": "^6.0.0-rc.3" } } diff --git a/modules/client-simulation/demo/Volo.ClientSimulation.Demo/wwwroot/libs/abp/core/abp.js b/modules/client-simulation/demo/Volo.ClientSimulation.Demo/wwwroot/libs/abp/core/abp.js index 9445e4e7f4..d8b7531660 100644 --- a/modules/client-simulation/demo/Volo.ClientSimulation.Demo/wwwroot/libs/abp/core/abp.js +++ b/modules/client-simulation/demo/Volo.ClientSimulation.Demo/wwwroot/libs/abp/core/abp.js @@ -372,7 +372,9 @@ var abp = abp || {}; setTimeout(function () { if (element) { element.classList.remove('abp-block-area-disappearing'); - element.parentElement.removeChild(element); + if (element.parentElement) { + element.parentElement.removeChild(element); + } } }, 250); } diff --git a/modules/client-simulation/demo/Volo.ClientSimulation.Demo/yarn.lock b/modules/client-simulation/demo/Volo.ClientSimulation.Demo/yarn.lock index 6404fcd773..13a328d062 100644 --- a/modules/client-simulation/demo/Volo.ClientSimulation.Demo/yarn.lock +++ b/modules/client-simulation/demo/Volo.ClientSimulation.Demo/yarn.lock @@ -2,37 +2,37 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-5.3.0.tgz#dcdd73d8582c4d14438f70d765170398d5d582fb" - integrity sha512-H6UrafHRI1DHfIoi47gZWHKSanlyAkghtGgUO6GTmPqTubBXjl7Ky3owVUAXvFd49+72gwdCLA/DB0Khjc3Ayw== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~5.3.0" - -"@abp/aspnetcore.mvc.ui.theme.shared@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-5.3.0.tgz#84e94845a247815ce981cda2d195944a350530b9" - integrity sha512-RwXxlncjidvh8Hgw91Hz1f5rnfG9hlNROr5bD/kxTUB47vIh/TIBd06UYrYw2/lqFLw5d6wd8q7VLuDjGUQbpg== - dependencies: - "@abp/aspnetcore.mvc.ui" "~5.3.0" - "@abp/bootstrap" "~5.3.0" - "@abp/bootstrap-datepicker" "~5.3.0" - "@abp/datatables.net-bs5" "~5.3.0" - "@abp/font-awesome" "~5.3.0" - "@abp/jquery-form" "~5.3.0" - "@abp/jquery-validation-unobtrusive" "~5.3.0" - "@abp/lodash" "~5.3.0" - "@abp/luxon" "~5.3.0" - "@abp/malihu-custom-scrollbar-plugin" "~5.3.0" - "@abp/select2" "~5.3.0" - "@abp/sweetalert2" "~5.3.0" - "@abp/timeago" "~5.3.0" - "@abp/toastr" "~5.3.0" - -"@abp/aspnetcore.mvc.ui@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-5.3.0.tgz#e947fd1aecbd2aabc5db4c6a64b78f2690fcf0d4" - integrity sha512-en2YDb/hRG1MKkbli1PYcoeU9OLU0YPSahkIBSfOmMLntAe8y0c2+Xe09chXP4r+GoZu0zd9FM3qqCRZojrlug== +"@abp/aspnetcore.mvc.ui.theme.basic@^6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-6.0.0-rc.3.tgz#b95266387e562c635de795442f90470f8e9e6318" + integrity sha512-vVkEpotDST455E3rynvRQpBKPcNNJ2m1wLkz/B9dQNdUjvm8L4F6s0ls0XFlKUNvQfCVfedkRtGayuvNje/Oxg== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~6.0.0-rc.3" + +"@abp/aspnetcore.mvc.ui.theme.shared@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-6.0.0-rc.3.tgz#664ca2ee712b7d9e66103c00beb41eb9648a6075" + integrity sha512-KxCsGuoUWKaDo7Oo9aKp51pli2m0DZ2tG8m+zK+m4M9U7g96uC+DOFy3gc7MdPlszvrw32Wwm7I0AughstByNA== + dependencies: + "@abp/aspnetcore.mvc.ui" "~6.0.0-rc.3" + "@abp/bootstrap" "~6.0.0-rc.3" + "@abp/bootstrap-datepicker" "~6.0.0-rc.3" + "@abp/datatables.net-bs5" "~6.0.0-rc.3" + "@abp/font-awesome" "~6.0.0-rc.3" + "@abp/jquery-form" "~6.0.0-rc.3" + "@abp/jquery-validation-unobtrusive" "~6.0.0-rc.3" + "@abp/lodash" "~6.0.0-rc.3" + "@abp/luxon" "~6.0.0-rc.3" + "@abp/malihu-custom-scrollbar-plugin" "~6.0.0-rc.3" + "@abp/select2" "~6.0.0-rc.3" + "@abp/sweetalert2" "~6.0.0-rc.3" + "@abp/timeago" "~6.0.0-rc.3" + "@abp/toastr" "~6.0.0-rc.3" + +"@abp/aspnetcore.mvc.ui@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-6.0.0-rc.3.tgz#47c23b57ed3908bd78a232230e53d1f3cba2de41" + integrity sha512-7eJZy2JUGQP94Tz3JJWXRHRmDfTcPZ/lS1/VNbU8B4qvgl5ChIXklVEJLR1fwrBhKXZV8fGVmqT1XlGTGFvFJA== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -41,144 +41,144 @@ merge-stream "^2.0.0" micromatch "^4.0.2" -"@abp/bootstrap-datepicker@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-5.3.0.tgz#09c44954774d8f52ca8ff6699ad4dbb7cc0308c2" - integrity sha512-AQ26I0jgoCioW1/4XmQIyn1c1+CLv8KTb4Vd4ZbtdYGBkkkUe+JEAWpJSeXlJRr/XrOs0BKWp/fa7Nnwx8srLg== +"@abp/bootstrap-datepicker@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-6.0.0-rc.3.tgz#89198b863dbfccf5f07ac3c4b20ce6199adcb17a" + integrity sha512-NLoUjcR66mqwSWuVftu2yFH4/j6QP+FiElRfZQ9OYmO8DQx2Ue5UZzjrFTrZ1DBBCfzhr2Bffj80dirGvGDyvg== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-5.3.0.tgz#42dac2d2d6374f39d068a638687039c5c74df123" - integrity sha512-rg9mLcvT4JQRc1rIAhGYK1P2eMRJ1+GArQXV5l7k3FrVU+bRLKdoE6PNpuwXHpdlom4/dOgekfuWH/SAuY5kyw== +"@abp/bootstrap@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-6.0.0-rc.3.tgz#4574bf574cc3484869e8ff8bc592f6212d20a969" + integrity sha512-Q5v7WRkGhGcjRg267HXtqs1oU7ts9UXPyCXmg5y2y5qMOyioD+m4MKV4iv67DgoQjabudp8X2egTKxkej6Lzkw== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" bootstrap "^5.1.3" -"@abp/core@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-5.3.0.tgz#032724dd0c0b850204896ce0275c7f9c8f516740" - integrity sha512-Uk9h98jiEF1dItWrvWnYB6s/UNZZapvFSyJ4+piAsZmXOSAbrObV+s19n5xfUagQQTWn4+aU5+aChEcfWpYv9A== +"@abp/core@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-6.0.0-rc.3.tgz#5662ce813d449d97d9fb7ea2552b2774c8df7825" + integrity sha512-X/VRdk5SGNYc5gQzPcBEPAvwcuD9WXsI4YIdrqjnes0s8u2/XmfrTixojh8Y5EYUoOblEE3Soj5hBhY1cVwcbQ== dependencies: - "@abp/utils" "~5.3.0" + "@abp/utils" "~6.0.0-rc.3" -"@abp/datatables.net-bs5@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-5.3.0.tgz#84771ce4eb7229bed347a5904c891b08e3230422" - integrity sha512-FpKrgrjaBKVgFAnbBsrvDIJJOy8gbWCEHm5Jy2vFWXmx25fITMw/2ckBDH87yrZtCNVTSUbMIdHYOIHMPfSavQ== +"@abp/datatables.net-bs5@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-6.0.0-rc.3.tgz#22865c7e621de720b71af6265b3193f6c78695bd" + integrity sha512-T+mhLc6uSzWmxDQogVwnJ6VxI4845gmF68/i9TmVKNlCtpa3EEfyuF/hgWT1hYfCb4XOsvd/CWrunbkC3fsmtg== dependencies: - "@abp/datatables.net" "~5.3.0" + "@abp/datatables.net" "~6.0.0-rc.3" datatables.net-bs5 "^1.11.4" -"@abp/datatables.net@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-5.3.0.tgz#dd27ae451df9551f5b815e10c87a8a89c6a38293" - integrity sha512-d4lQ09G7HY2gEN1lRAteCZzY0Fv3gPuUM+icgWm+UkmDZV9lhvovTQ58Xkwayw8vf+NPlit1eGMMQedn6MbeAQ== +"@abp/datatables.net@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-6.0.0-rc.3.tgz#d036defe6ad7fc989dffa020ae579362ee3150d1" + integrity sha512-4cUU8/Tn0Vz9bx7jjMOD/0Viyr29fcwoQAAkxaaYZp6qiQbENgz46/xpQf2oBCoudk8CLdzpmNa7jWte7PcJJw== dependencies: - "@abp/jquery" "~5.3.0" + "@abp/jquery" "~6.0.0-rc.3" datatables.net "^1.11.4" -"@abp/font-awesome@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-5.3.0.tgz#ce1d5bb59bd597cc9717885917d4dd2eae1f8b9c" - integrity sha512-JX62EVfZSJ7pv75Gd3ya/3c3He0hXF7KmpTizUNd/EbeHuNJoCND5wwq5OAFV9Ld3vdcGJChNTydNa5RsBzrpg== +"@abp/font-awesome@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-6.0.0-rc.3.tgz#803569d1a7e25f8a1c2be018312449c23fb78217" + integrity sha512-lYdh38UCTSkzzw0B/mpPEo7iFXzSKHCNbBOIHe6dd6O/Qli7wYukTtUOFn5Sh+yoydLY1as92HtiGL1ckSdu1g== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" "@fortawesome/fontawesome-free" "^5.15.4" -"@abp/jquery-form@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-5.3.0.tgz#5ae9906f0cffaf3e043681a5dd80a014b4860f6b" - integrity sha512-ZTpXCImHirJDZjfnJRtSEHLIbWMTYkqtTv7Z3GMRKnI4fllpmuco9EWLAKjAfYPyc/QpTx+MYnUg5SsXORhJyQ== +"@abp/jquery-form@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-6.0.0-rc.3.tgz#4ec503c07e2194148c3a7e7cf7ddef2871679e6a" + integrity sha512-Q3uEpflntqrSkYakcdsBnnYYfxJWXD/CDjMiwjbb6gIc8s4qkbIYxVxvYvlEezoIDYQkMSXOn7BS4clWsesiJg== dependencies: - "@abp/jquery" "~5.3.0" + "@abp/jquery" "~6.0.0-rc.3" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-5.3.0.tgz#ccf90a7840398e69e0a91ed6c32b80fa2eb82d14" - integrity sha512-6B3ywnpvPxpnxkrcXzjTjMWgKRImbzNPOZvv5ant/kQv3zXedV1GXSIILy+imX39FuDPslOmEfx8plwrNvIteA== +"@abp/jquery-validation-unobtrusive@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-6.0.0-rc.3.tgz#01da2a59663d373ff1c69022f4c9c66ad0b29403" + integrity sha512-ij1ML2D9rYF3pJthWO6mGQajsJhbDCtOoBvnh9yCZccuwOYkXP22PqfUxjjxtqL4HqFI31KRpFg0ANMGSzEEBg== dependencies: - "@abp/jquery-validation" "~5.3.0" + "@abp/jquery-validation" "~6.0.0-rc.3" jquery-validation-unobtrusive "^3.2.12" -"@abp/jquery-validation@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-5.3.0.tgz#a21696e7d5d54ef8bcdc0e8bd2debb1da1f7f5cc" - integrity sha512-4z2I9iORf+z5SlN9crC/Gx3X5GAOVePD+WN8SaHSYr4VWYNe8TV8LvCZPilN56sIPt3jYvy0N+bI1tAuZPu/NQ== +"@abp/jquery-validation@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-6.0.0-rc.3.tgz#724aea9572dcb2faccf8c6355332b0b2a4df9260" + integrity sha512-rTK5oHaMtycvWxunNwzbE/MbsXXIr6qDnOY3rVUmjTHjqUOHYz591t/XeQfjnSXPp4k/SZUjG6viTC3J2jzC1A== dependencies: - "@abp/jquery" "~5.3.0" + "@abp/jquery" "~6.0.0-rc.3" jquery-validation "^1.19.3" -"@abp/jquery@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-5.3.0.tgz#0279ee501ed774a788072c2ec8b003e348fec22c" - integrity sha512-rqYbU3LpsT7XT8ygn+TFVmjev5NlgEcDhGwQ8PraY1dEjlDbteeQ50N4adS8fdRfOM1UjGL19ueN3F8E5qNUSg== +"@abp/jquery@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-6.0.0-rc.3.tgz#ba19cc8b802c46490277939e6c674811127d8016" + integrity sha512-MbD38iInyag7/j5k42cvMT4jLZMtXH4lUK0rjvqUDVaxKEks46Ix/90uczQ9XajYONgx0CJKFj2urgM830+CCA== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" jquery "~3.6.0" -"@abp/lodash@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-5.3.0.tgz#45f1dba7bb65b6599b4973d7e0c617dfd2c46c49" - integrity sha512-vQVMv58QuYttWBfLjJzIsw92JunGbWYsqk6pp6/JuoBls5UJtdP1F7vM4JgQxsscGYHFRZB3F4a3h1cxZ+dblQ== +"@abp/lodash@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-6.0.0-rc.3.tgz#8a5bab02353e5cab4ca06ab82f6dbe6285faa95a" + integrity sha512-c8yhcapzPsXyeiFjeOC+2a4bn5wFjW5gUoN+p/p+tE+FIcH37yEgyw/tAr6aZPCmR770MqQXct4t7S4Czbbk+A== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" lodash "^4.17.21" -"@abp/luxon@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-5.3.0.tgz#8a6277046f6e38c3affbf79c06f8ac00d1ca8098" - integrity sha512-6tETR03i1NPJuDqSQWtpkOykdq/84awifQUqRyh+b8340wV7P54NqUMDXDit9sjITFDhq99V/R+Rj3PVjvJD3A== +"@abp/luxon@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-6.0.0-rc.3.tgz#ba515e122c61918d481467d5be39f08a363822f6" + integrity sha512-2lRSSC0DYShlnKdbJ/Pmha/azjt09ZRPx57NQ01dc7ungChPry5EJL6pC3kXWnJrCkrPCF0V5+A3+taut9+l3A== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" luxon "^2.3.0" -"@abp/malihu-custom-scrollbar-plugin@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-5.3.0.tgz#e6e12162aa50d3c3d98629378cec2f6fd5964338" - integrity sha512-GVwgAZQurH/tr4Hgmuby2dun//v1dT+wLGV4ZvjCJzBRs4FgrB+25pj4qKm20j6/NKRKc4V5re/b1y6njCubFQ== +"@abp/malihu-custom-scrollbar-plugin@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-6.0.0-rc.3.tgz#0798e37ec6a852748118692a5fbd30c99d9745db" + integrity sha512-FlyShmRxG3wGk1OJCjHIZAdi2/Y2FJPkVxaE72CVIceQSmg0nebGTv3a7bhd4QzKkDsSA3+t6gHjnuKlTlDFLA== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/select2@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-5.3.0.tgz#aae202b87dc23dfc7c8fd933413a8dbeb2f5b683" - integrity sha512-0aIxdtzgONkrYnUN5ACkIIIhsC9e61QLRq3K+/98fjf7NkHOjG3Sptr8EKu5U3IQ2hNHgqBjPGYjkztGuxZ9kw== +"@abp/select2@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-6.0.0-rc.3.tgz#deb8332bfce2102a562004893321a48d5194bf53" + integrity sha512-rb0qElmmhiP09xX8ZbjzNLF6ygFBwErysGWt6Bbgzz5waX2sGe575Cgoz53FaMQ4JaRBg1N0/nCejKyDtiINRA== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" select2 "^4.0.13" -"@abp/sweetalert2@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-5.3.0.tgz#67379cfa4cb8884cb66b58f4cafa79960cf8426a" - integrity sha512-EBr8J7MDsYmSvOYxTbqsSmw6c2yLokHZe8A+EW2vsY9VYFXkoOJLVpCkCK4fhvHUv8/+Y5QnHW7bs1I6SKYXOw== +"@abp/sweetalert2@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-6.0.0-rc.3.tgz#e61fc6c1bed1316c1d44ca5c92f590e422db24d4" + integrity sha512-+SNpBb4XrQlWzRQK9lfdJqA9IfJrlgoqmHwPDgf3Q+P922MzO33TgDlZWbeE7MzVj2y2WmNsPuCKwhjSjSL2rw== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" sweetalert2 "^11.3.6" -"@abp/timeago@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-5.3.0.tgz#3aaef3edca333224ba6b3e81c8ad1ebaae51a2f4" - integrity sha512-FxtoPYxyk2CHeoloC6kaeCj5YtXH0rebhOEaCjrfyg9/Ec6LEkvpfC7RWlcsHaEUAtFXZegJDfOk066EPH7RHQ== +"@abp/timeago@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-6.0.0-rc.3.tgz#0ef8c4801bfd4623e6895b1d047b1437063bda53" + integrity sha512-P3YRDVKjR5/Fz+cXiPg3IiUr7XGbNh7mgmJ1ywRXmKVmVMJmhQ2RsKmmtkGJn4TfVHu/l5iJXe4rqgL21/yX/g== dependencies: - "@abp/jquery" "~5.3.0" + "@abp/jquery" "~6.0.0-rc.3" timeago "^1.6.7" -"@abp/toastr@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-5.3.0.tgz#8a002c19ea25ac6b042a25c0f9d289d03c93c2fb" - integrity sha512-gjb2O/XrYkX8IeCERIqlOYPh15WlF9LxGR6t9jeVF/p6BTX/yaWabYCFfB9SkU2pQ6xrGl7WmSTAC06JOAtPTA== +"@abp/toastr@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-6.0.0-rc.3.tgz#6010d4247937531ebf7c8659d6254cd3db6c4855" + integrity sha512-sC9eCzYVgDrLSFIhJGe9hshzfwA1BkZNah4NQhyq+V6HQ8YF7goMS79N+/XmSoLQ9zzRhusqnPFnb+4FHjr7iA== dependencies: - "@abp/jquery" "~5.3.0" + "@abp/jquery" "~6.0.0-rc.3" toastr "^2.1.4" -"@abp/utils@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-5.3.0.tgz#e93739074a3cd445a5a221209506b7e663050ca0" - integrity sha512-Nm+h+3PL10+rBFSh8UUuenmGM+OBlEoNQeGzHRmhOc6hJ3oqCogPzY+zkq0e4pksrwhjxAu/cgCEGLAoEXXycw== +"@abp/utils@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-6.0.0-rc.3.tgz#6d3515694314175218606e9518618ce335b4b360" + integrity sha512-K2geJ9P1ztk4Ehzb9YG3CqqLOi+z8/4iBLUzooNZLQqS+KdlUhCmqfuCoI/A5Aq9DGbTYesalp+Fwoh3S2Dl8A== dependencies: just-compare "^1.3.0" diff --git a/modules/cms-kit/Volo.CmsKit.abpmdl.json b/modules/cms-kit/Volo.CmsKit.abpmdl.json index 06e86b66bb..5e0bfb9317 100644 --- a/modules/cms-kit/Volo.CmsKit.abpmdl.json +++ b/modules/cms-kit/Volo.CmsKit.abpmdl.json @@ -146,10 +146,6 @@ "Volo.CmsKit.Common.HttpApi.Client": { "path": "src/Volo.CmsKit.Common.HttpApi.Client/Volo.CmsKit.Common.HttpApi.Client.abppkg.json", "folder": "src" - }, - "Volo.CmsKit.Installer": { - "path": "src/Volo.CmsKit.Installer/Volo.CmsKit.Installer.abppkg.json", - "folder": "src" } } } \ No newline at end of file diff --git a/modules/cms-kit/Volo.CmsKit.sln b/modules/cms-kit/Volo.CmsKit.sln index 080ccbcf7f..e35e143c92 100644 --- a/modules/cms-kit/Volo.CmsKit.sln +++ b/modules/cms-kit/Volo.CmsKit.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.29001.49 +# Visual Studio Version 17 +VisualStudioVersion = 17.2.32616.157 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.CmsKit.Domain.Shared", "src\Volo.CmsKit.Domain.Shared\Volo.CmsKit.Domain.Shared.csproj", "{D64C1577-4929-4B60-939E-96DE1534891A}" EndProject @@ -57,37 +57,37 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "public", "public", "{3C74B8 EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "admin", "admin", "{E737206B-FA99-4460-861D-82902ECE93DB}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.CmsKit.Admin.Application", "src\Volo.CmsKit.Admin.Application\Volo.CmsKit.Admin.Application.csproj", "{A5363215-BF61-467F-80D0-40D93590F509}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.CmsKit.Admin.Application", "src\Volo.CmsKit.Admin.Application\Volo.CmsKit.Admin.Application.csproj", "{A5363215-BF61-467F-80D0-40D93590F509}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.CmsKit.Admin.Application.Contracts", "src\Volo.CmsKit.Admin.Application.Contracts\Volo.CmsKit.Admin.Application.Contracts.csproj", "{AE000591-86E3-4AD4-AA86-C47FED4A3ACB}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.CmsKit.Admin.Application.Contracts", "src\Volo.CmsKit.Admin.Application.Contracts\Volo.CmsKit.Admin.Application.Contracts.csproj", "{AE000591-86E3-4AD4-AA86-C47FED4A3ACB}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.CmsKit.Admin.HttpApi", "src\Volo.CmsKit.Admin.HttpApi\Volo.CmsKit.Admin.HttpApi.csproj", "{A402371A-B714-4BBC-AC22-9C0BD7679F25}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.CmsKit.Admin.HttpApi", "src\Volo.CmsKit.Admin.HttpApi\Volo.CmsKit.Admin.HttpApi.csproj", "{A402371A-B714-4BBC-AC22-9C0BD7679F25}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.CmsKit.Admin.HttpApi.Client", "src\Volo.CmsKit.Admin.HttpApi.Client\Volo.CmsKit.Admin.HttpApi.Client.csproj", "{97D7BB7A-1D45-4E54-B327-3718F62E8A86}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.CmsKit.Admin.HttpApi.Client", "src\Volo.CmsKit.Admin.HttpApi.Client\Volo.CmsKit.Admin.HttpApi.Client.csproj", "{97D7BB7A-1D45-4E54-B327-3718F62E8A86}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.CmsKit.Admin.Web", "src\Volo.CmsKit.Admin.Web\Volo.CmsKit.Admin.Web.csproj", "{CA6A7FAF-0EF9-42D9-B7A3-5CA690687045}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.CmsKit.Admin.Web", "src\Volo.CmsKit.Admin.Web\Volo.CmsKit.Admin.Web.csproj", "{CA6A7FAF-0EF9-42D9-B7A3-5CA690687045}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.CmsKit.Public.Application", "src\Volo.CmsKit.Public.Application\Volo.CmsKit.Public.Application.csproj", "{E3963E05-9645-4AFD-AC99-C5E9F9153B61}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.CmsKit.Public.Application", "src\Volo.CmsKit.Public.Application\Volo.CmsKit.Public.Application.csproj", "{E3963E05-9645-4AFD-AC99-C5E9F9153B61}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.CmsKit.Public.Application.Contracts", "src\Volo.CmsKit.Public.Application.Contracts\Volo.CmsKit.Public.Application.Contracts.csproj", "{50147423-F37D-46D3-A25D-C51CD48A7DA7}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.CmsKit.Public.Application.Contracts", "src\Volo.CmsKit.Public.Application.Contracts\Volo.CmsKit.Public.Application.Contracts.csproj", "{50147423-F37D-46D3-A25D-C51CD48A7DA7}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.CmsKit.Public.HttpApi", "src\Volo.CmsKit.Public.HttpApi\Volo.CmsKit.Public.HttpApi.csproj", "{37C03B72-5FD8-4B67-8090-8A20CD8095A6}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.CmsKit.Public.HttpApi", "src\Volo.CmsKit.Public.HttpApi\Volo.CmsKit.Public.HttpApi.csproj", "{37C03B72-5FD8-4B67-8090-8A20CD8095A6}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.CmsKit.Public.HttpApi.Client", "src\Volo.CmsKit.Public.HttpApi.Client\Volo.CmsKit.Public.HttpApi.Client.csproj", "{E790C2C6-39AC-4068-AA7D-309DC9AA1437}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.CmsKit.Public.HttpApi.Client", "src\Volo.CmsKit.Public.HttpApi.Client\Volo.CmsKit.Public.HttpApi.Client.csproj", "{E790C2C6-39AC-4068-AA7D-309DC9AA1437}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.CmsKit.Public.Web", "src\Volo.CmsKit.Public.Web\Volo.CmsKit.Public.Web.csproj", "{BE2572ED-F505-435D-9A90-30DBC6C2DC1D}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.CmsKit.Public.Web", "src\Volo.CmsKit.Public.Web\Volo.CmsKit.Public.Web.csproj", "{BE2572ED-F505-435D-9A90-30DBC6C2DC1D}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.CmsKit.Common.Web", "src\Volo.CmsKit.Common.Web\Volo.CmsKit.Common.Web.csproj", "{4B2C2431-7351-41F0-B5E1-F8A9859FA838}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.CmsKit.Common.Web", "src\Volo.CmsKit.Common.Web\Volo.CmsKit.Common.Web.csproj", "{4B2C2431-7351-41F0-B5E1-F8A9859FA838}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.CmsKit.Common.Application.Contracts", "src\Volo.CmsKit.Common.Application.Contracts\Volo.CmsKit.Common.Application.Contracts.csproj", "{A0D38C5B-047F-49C1-9A6D-B41E4FB9B323}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.CmsKit.Common.Application.Contracts", "src\Volo.CmsKit.Common.Application.Contracts\Volo.CmsKit.Common.Application.Contracts.csproj", "{A0D38C5B-047F-49C1-9A6D-B41E4FB9B323}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.CmsKit.Common.Application", "src\Volo.CmsKit.Common.Application\Volo.CmsKit.Common.Application.csproj", "{5D9BD65D-353E-4618-BE49-E1DF4CFF2393}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.CmsKit.Common.Application", "src\Volo.CmsKit.Common.Application\Volo.CmsKit.Common.Application.csproj", "{5D9BD65D-353E-4618-BE49-E1DF4CFF2393}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.CmsKit.Common.HttpApi", "src\Volo.CmsKit.Common.HttpApi\Volo.CmsKit.Common.HttpApi.csproj", "{E8CC280A-D049-4564-9C71-2F5657C17937}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.CmsKit.Common.HttpApi", "src\Volo.CmsKit.Common.HttpApi\Volo.CmsKit.Common.HttpApi.csproj", "{E8CC280A-D049-4564-9C71-2F5657C17937}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.CmsKit.Common.HttpApi.Client", "src\Volo.CmsKit.Common.HttpApi.Client\Volo.CmsKit.Common.HttpApi.Client.csproj", "{EC98F006-2002-4CE2-AA62-5EBB589ACD79}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.CmsKit.Common.HttpApi.Client", "src\Volo.CmsKit.Common.HttpApi.Client\Volo.CmsKit.Common.HttpApi.Client.csproj", "{EC98F006-2002-4CE2-AA62-5EBB589ACD79}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.CmsKit.Installer", "src\Volo.CmsKit.Installer\Volo.CmsKit.Installer.csproj", "{908C157E-2352-4373-BF5D-E5DA19913390}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.CmsKit.Installer", "src\Volo.CmsKit.Installer\Volo.CmsKit.Installer.csproj", "{908C157E-2352-4373-BF5D-E5DA19913390}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -244,28 +244,28 @@ Global HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution + {D64C1577-4929-4B60-939E-96DE1534891A} = {DDE20914-DD1B-4C7B-86FF-F21E6B5DF1D1} + {F2840BC7-0188-4606-9126-DADD0F5ABF7A} = {DDE20914-DD1B-4C7B-86FF-F21E6B5DF1D1} + {BD65D04F-08D5-40C1-8C24-77CA0BACB877} = {963FBC0A-1FBA-47DA-8A61-8F57D3EC8D49} + {78040F9E-3501-4A40-82DF-00A597710F35} = {963FBC0A-1FBA-47DA-8A61-8F57D3EC8D49} + {0CE86223-D31D-4315-A1F5-87BA3EE1B844} = {DDE20914-DD1B-4C7B-86FF-F21E6B5DF1D1} + {F1C58097-4C08-4D88-8976-6B3389391481} = {DDE20914-DD1B-4C7B-86FF-F21E6B5DF1D1} + {077AA5F8-8B61-420C-A6B5-0150A66FDB34} = {963FBC0A-1FBA-47DA-8A61-8F57D3EC8D49} + {36E2735F-CEAB-44C8-A6D1-2CDAFF399751} = {963FBC0A-1FBA-47DA-8A61-8F57D3EC8D49} {C5BB573D-3030-4BCB-88B7-F6A85C32766C} = {CCD2960C-23CC-4AB4-B84D-60C7AAA52F4D} {527F645C-C1FC-406E-8479-81386C8ECF13} = {CCD2960C-23CC-4AB4-B84D-60C7AAA52F4D} {D0AD9179-125C-40B2-A8EE-CD4C1EE24BB6} = {CCD2960C-23CC-4AB4-B84D-60C7AAA52F4D} {E60895E5-79C4-447D-88B7-85CB5BA336A4} = {CCD2960C-23CC-4AB4-B84D-60C7AAA52F4D} {90CB5DC4-C040-45C7-8900-9688B26405BC} = {CCD2960C-23CC-4AB4-B84D-60C7AAA52F4D} {37B135B0-DAFE-4616-B25C-1BDF32FC44A2} = {E400416D-2895-4512-9D17-90681EEC7E0A} + {3B7B6317-1B85-4164-8E11-75574F80AE17} = {963FBC0A-1FBA-47DA-8A61-8F57D3EC8D49} {1EDCD6D4-DF3A-4E3B-ABB6-C0D0B373EAB8} = {CCD2960C-23CC-4AB4-B84D-60C7AAA52F4D} {73513786-B6C6-4A21-89C5-0FBDD0A46107} = {E400416D-2895-4512-9D17-90681EEC7E0A} {690203F4-3CD5-4569-88D9-EE831EEA5F5F} = {E400416D-2895-4512-9D17-90681EEC7E0A} {F6AC8D4A-EDD7-4514-8E8A-5BCB019864DB} = {E400416D-2895-4512-9D17-90681EEC7E0A} {3D872C41-E226-45C8-89C1-9D3DBD7C73F2} = {E400416D-2895-4512-9D17-90681EEC7E0A} {DDE20914-DD1B-4C7B-86FF-F21E6B5DF1D1} = {649A3FFA-182F-4E56-9717-E6A9A2BEC545} - {F2840BC7-0188-4606-9126-DADD0F5ABF7A} = {DDE20914-DD1B-4C7B-86FF-F21E6B5DF1D1} - {D64C1577-4929-4B60-939E-96DE1534891A} = {DDE20914-DD1B-4C7B-86FF-F21E6B5DF1D1} - {F1C58097-4C08-4D88-8976-6B3389391481} = {DDE20914-DD1B-4C7B-86FF-F21E6B5DF1D1} - {0CE86223-D31D-4315-A1F5-87BA3EE1B844} = {DDE20914-DD1B-4C7B-86FF-F21E6B5DF1D1} {963FBC0A-1FBA-47DA-8A61-8F57D3EC8D49} = {649A3FFA-182F-4E56-9717-E6A9A2BEC545} - {78040F9E-3501-4A40-82DF-00A597710F35} = {963FBC0A-1FBA-47DA-8A61-8F57D3EC8D49} - {BD65D04F-08D5-40C1-8C24-77CA0BACB877} = {963FBC0A-1FBA-47DA-8A61-8F57D3EC8D49} - {077AA5F8-8B61-420C-A6B5-0150A66FDB34} = {963FBC0A-1FBA-47DA-8A61-8F57D3EC8D49} - {36E2735F-CEAB-44C8-A6D1-2CDAFF399751} = {963FBC0A-1FBA-47DA-8A61-8F57D3EC8D49} - {3B7B6317-1B85-4164-8E11-75574F80AE17} = {963FBC0A-1FBA-47DA-8A61-8F57D3EC8D49} {3C74B8E8-CB34-49C8-B02A-05E959601FEE} = {649A3FFA-182F-4E56-9717-E6A9A2BEC545} {E737206B-FA99-4460-861D-82902ECE93DB} = {649A3FFA-182F-4E56-9717-E6A9A2BEC545} {A5363215-BF61-467F-80D0-40D93590F509} = {E737206B-FA99-4460-861D-82902ECE93DB} diff --git a/modules/cms-kit/angular/package.json b/modules/cms-kit/angular/package.json index 698f72979b..54f5f486ed 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": "~5.3.0", - "@abp/ng.identity": "~5.3.0", - "@abp/ng.setting-management": "~5.3.0", - "@abp/ng.tenant-management": "~5.3.0", - "@abp/ng.theme.basic": "~5.3.0", + "@abp/ng.account": "~6.0.0-rc.3", + "@abp/ng.identity": "~6.0.0-rc.3", + "@abp/ng.setting-management": "~6.0.0-rc.3", + "@abp/ng.tenant-management": "~6.0.0-rc.3", + "@abp/ng.theme.basic": "~6.0.0-rc.3", "@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 21c65e4430..aebab1daa7 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": ">=5.3.0", - "@abp/ng.theme.shared": ">=5.3.0" + "@abp/ng.core": ">=6.0.0-rc.3", + "@abp/ng.theme.shared": ">=6.0.0-rc.3" }, "dependencies": { "tslib": "^2.0.0" diff --git a/modules/cms-kit/host/Volo.CmsKit.HttpApi.Host/Volo.CmsKit.HttpApi.Host.abppkg.analyze.json b/modules/cms-kit/host/Volo.CmsKit.HttpApi.Host/Volo.CmsKit.HttpApi.Host.abppkg.analyze.json index 1f221b30a5..d700158eff 100644 --- a/modules/cms-kit/host/Volo.CmsKit.HttpApi.Host/Volo.CmsKit.HttpApi.Host.abppkg.analyze.json +++ b/modules/cms-kit/host/Volo.CmsKit.HttpApi.Host/Volo.CmsKit.HttpApi.Host.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.CmsKit.HttpApi.Host", - "hash": "a94f87ec06a48733eb72887f12c6a3e2", + "hash": "da40e46c3889c8e7a250a070a7366fac", "contents": [ { "namespace": "Volo.CmsKit", diff --git a/modules/cms-kit/host/Volo.CmsKit.IdentityServer/package.json b/modules/cms-kit/host/Volo.CmsKit.IdentityServer/package.json index 47538f5c37..c920638942 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": "^5.3.0" + "@abp/aspnetcore.mvc.ui.theme.basic": "^6.0.0-rc.3" } } diff --git a/modules/cms-kit/host/Volo.CmsKit.IdentityServer/wwwroot/libs/abp/core/abp.js b/modules/cms-kit/host/Volo.CmsKit.IdentityServer/wwwroot/libs/abp/core/abp.js index 9445e4e7f4..d8b7531660 100644 --- a/modules/cms-kit/host/Volo.CmsKit.IdentityServer/wwwroot/libs/abp/core/abp.js +++ b/modules/cms-kit/host/Volo.CmsKit.IdentityServer/wwwroot/libs/abp/core/abp.js @@ -372,7 +372,9 @@ var abp = abp || {}; setTimeout(function () { if (element) { element.classList.remove('abp-block-area-disappearing'); - element.parentElement.removeChild(element); + if (element.parentElement) { + element.parentElement.removeChild(element); + } } }, 250); } diff --git a/modules/cms-kit/host/Volo.CmsKit.IdentityServer/yarn.lock b/modules/cms-kit/host/Volo.CmsKit.IdentityServer/yarn.lock index 1106f769b6..43759f8de6 100644 --- a/modules/cms-kit/host/Volo.CmsKit.IdentityServer/yarn.lock +++ b/modules/cms-kit/host/Volo.CmsKit.IdentityServer/yarn.lock @@ -2,37 +2,37 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-5.3.0.tgz#dcdd73d8582c4d14438f70d765170398d5d582fb" - integrity sha512-H6UrafHRI1DHfIoi47gZWHKSanlyAkghtGgUO6GTmPqTubBXjl7Ky3owVUAXvFd49+72gwdCLA/DB0Khjc3Ayw== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~5.3.0" - -"@abp/aspnetcore.mvc.ui.theme.shared@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-5.3.0.tgz#84e94845a247815ce981cda2d195944a350530b9" - integrity sha512-RwXxlncjidvh8Hgw91Hz1f5rnfG9hlNROr5bD/kxTUB47vIh/TIBd06UYrYw2/lqFLw5d6wd8q7VLuDjGUQbpg== - dependencies: - "@abp/aspnetcore.mvc.ui" "~5.3.0" - "@abp/bootstrap" "~5.3.0" - "@abp/bootstrap-datepicker" "~5.3.0" - "@abp/datatables.net-bs5" "~5.3.0" - "@abp/font-awesome" "~5.3.0" - "@abp/jquery-form" "~5.3.0" - "@abp/jquery-validation-unobtrusive" "~5.3.0" - "@abp/lodash" "~5.3.0" - "@abp/luxon" "~5.3.0" - "@abp/malihu-custom-scrollbar-plugin" "~5.3.0" - "@abp/select2" "~5.3.0" - "@abp/sweetalert2" "~5.3.0" - "@abp/timeago" "~5.3.0" - "@abp/toastr" "~5.3.0" - -"@abp/aspnetcore.mvc.ui@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-5.3.0.tgz#e947fd1aecbd2aabc5db4c6a64b78f2690fcf0d4" - integrity sha512-en2YDb/hRG1MKkbli1PYcoeU9OLU0YPSahkIBSfOmMLntAe8y0c2+Xe09chXP4r+GoZu0zd9FM3qqCRZojrlug== +"@abp/aspnetcore.mvc.ui.theme.basic@^6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-6.0.0-rc.3.tgz#b95266387e562c635de795442f90470f8e9e6318" + integrity sha512-vVkEpotDST455E3rynvRQpBKPcNNJ2m1wLkz/B9dQNdUjvm8L4F6s0ls0XFlKUNvQfCVfedkRtGayuvNje/Oxg== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~6.0.0-rc.3" + +"@abp/aspnetcore.mvc.ui.theme.shared@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-6.0.0-rc.3.tgz#664ca2ee712b7d9e66103c00beb41eb9648a6075" + integrity sha512-KxCsGuoUWKaDo7Oo9aKp51pli2m0DZ2tG8m+zK+m4M9U7g96uC+DOFy3gc7MdPlszvrw32Wwm7I0AughstByNA== + dependencies: + "@abp/aspnetcore.mvc.ui" "~6.0.0-rc.3" + "@abp/bootstrap" "~6.0.0-rc.3" + "@abp/bootstrap-datepicker" "~6.0.0-rc.3" + "@abp/datatables.net-bs5" "~6.0.0-rc.3" + "@abp/font-awesome" "~6.0.0-rc.3" + "@abp/jquery-form" "~6.0.0-rc.3" + "@abp/jquery-validation-unobtrusive" "~6.0.0-rc.3" + "@abp/lodash" "~6.0.0-rc.3" + "@abp/luxon" "~6.0.0-rc.3" + "@abp/malihu-custom-scrollbar-plugin" "~6.0.0-rc.3" + "@abp/select2" "~6.0.0-rc.3" + "@abp/sweetalert2" "~6.0.0-rc.3" + "@abp/timeago" "~6.0.0-rc.3" + "@abp/toastr" "~6.0.0-rc.3" + +"@abp/aspnetcore.mvc.ui@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-6.0.0-rc.3.tgz#47c23b57ed3908bd78a232230e53d1f3cba2de41" + integrity sha512-7eJZy2JUGQP94Tz3JJWXRHRmDfTcPZ/lS1/VNbU8B4qvgl5ChIXklVEJLR1fwrBhKXZV8fGVmqT1XlGTGFvFJA== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -41,144 +41,144 @@ merge-stream "^2.0.0" micromatch "^4.0.2" -"@abp/bootstrap-datepicker@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-5.3.0.tgz#09c44954774d8f52ca8ff6699ad4dbb7cc0308c2" - integrity sha512-AQ26I0jgoCioW1/4XmQIyn1c1+CLv8KTb4Vd4ZbtdYGBkkkUe+JEAWpJSeXlJRr/XrOs0BKWp/fa7Nnwx8srLg== +"@abp/bootstrap-datepicker@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-6.0.0-rc.3.tgz#89198b863dbfccf5f07ac3c4b20ce6199adcb17a" + integrity sha512-NLoUjcR66mqwSWuVftu2yFH4/j6QP+FiElRfZQ9OYmO8DQx2Ue5UZzjrFTrZ1DBBCfzhr2Bffj80dirGvGDyvg== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-5.3.0.tgz#42dac2d2d6374f39d068a638687039c5c74df123" - integrity sha512-rg9mLcvT4JQRc1rIAhGYK1P2eMRJ1+GArQXV5l7k3FrVU+bRLKdoE6PNpuwXHpdlom4/dOgekfuWH/SAuY5kyw== +"@abp/bootstrap@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-6.0.0-rc.3.tgz#4574bf574cc3484869e8ff8bc592f6212d20a969" + integrity sha512-Q5v7WRkGhGcjRg267HXtqs1oU7ts9UXPyCXmg5y2y5qMOyioD+m4MKV4iv67DgoQjabudp8X2egTKxkej6Lzkw== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" bootstrap "^5.1.3" -"@abp/core@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-5.3.0.tgz#032724dd0c0b850204896ce0275c7f9c8f516740" - integrity sha512-Uk9h98jiEF1dItWrvWnYB6s/UNZZapvFSyJ4+piAsZmXOSAbrObV+s19n5xfUagQQTWn4+aU5+aChEcfWpYv9A== +"@abp/core@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-6.0.0-rc.3.tgz#5662ce813d449d97d9fb7ea2552b2774c8df7825" + integrity sha512-X/VRdk5SGNYc5gQzPcBEPAvwcuD9WXsI4YIdrqjnes0s8u2/XmfrTixojh8Y5EYUoOblEE3Soj5hBhY1cVwcbQ== dependencies: - "@abp/utils" "~5.3.0" + "@abp/utils" "~6.0.0-rc.3" -"@abp/datatables.net-bs5@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-5.3.0.tgz#84771ce4eb7229bed347a5904c891b08e3230422" - integrity sha512-FpKrgrjaBKVgFAnbBsrvDIJJOy8gbWCEHm5Jy2vFWXmx25fITMw/2ckBDH87yrZtCNVTSUbMIdHYOIHMPfSavQ== +"@abp/datatables.net-bs5@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-6.0.0-rc.3.tgz#22865c7e621de720b71af6265b3193f6c78695bd" + integrity sha512-T+mhLc6uSzWmxDQogVwnJ6VxI4845gmF68/i9TmVKNlCtpa3EEfyuF/hgWT1hYfCb4XOsvd/CWrunbkC3fsmtg== dependencies: - "@abp/datatables.net" "~5.3.0" + "@abp/datatables.net" "~6.0.0-rc.3" datatables.net-bs5 "^1.11.4" -"@abp/datatables.net@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-5.3.0.tgz#dd27ae451df9551f5b815e10c87a8a89c6a38293" - integrity sha512-d4lQ09G7HY2gEN1lRAteCZzY0Fv3gPuUM+icgWm+UkmDZV9lhvovTQ58Xkwayw8vf+NPlit1eGMMQedn6MbeAQ== +"@abp/datatables.net@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-6.0.0-rc.3.tgz#d036defe6ad7fc989dffa020ae579362ee3150d1" + integrity sha512-4cUU8/Tn0Vz9bx7jjMOD/0Viyr29fcwoQAAkxaaYZp6qiQbENgz46/xpQf2oBCoudk8CLdzpmNa7jWte7PcJJw== dependencies: - "@abp/jquery" "~5.3.0" + "@abp/jquery" "~6.0.0-rc.3" datatables.net "^1.11.4" -"@abp/font-awesome@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-5.3.0.tgz#ce1d5bb59bd597cc9717885917d4dd2eae1f8b9c" - integrity sha512-JX62EVfZSJ7pv75Gd3ya/3c3He0hXF7KmpTizUNd/EbeHuNJoCND5wwq5OAFV9Ld3vdcGJChNTydNa5RsBzrpg== +"@abp/font-awesome@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-6.0.0-rc.3.tgz#803569d1a7e25f8a1c2be018312449c23fb78217" + integrity sha512-lYdh38UCTSkzzw0B/mpPEo7iFXzSKHCNbBOIHe6dd6O/Qli7wYukTtUOFn5Sh+yoydLY1as92HtiGL1ckSdu1g== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" "@fortawesome/fontawesome-free" "^5.15.4" -"@abp/jquery-form@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-5.3.0.tgz#5ae9906f0cffaf3e043681a5dd80a014b4860f6b" - integrity sha512-ZTpXCImHirJDZjfnJRtSEHLIbWMTYkqtTv7Z3GMRKnI4fllpmuco9EWLAKjAfYPyc/QpTx+MYnUg5SsXORhJyQ== +"@abp/jquery-form@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-6.0.0-rc.3.tgz#4ec503c07e2194148c3a7e7cf7ddef2871679e6a" + integrity sha512-Q3uEpflntqrSkYakcdsBnnYYfxJWXD/CDjMiwjbb6gIc8s4qkbIYxVxvYvlEezoIDYQkMSXOn7BS4clWsesiJg== dependencies: - "@abp/jquery" "~5.3.0" + "@abp/jquery" "~6.0.0-rc.3" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-5.3.0.tgz#ccf90a7840398e69e0a91ed6c32b80fa2eb82d14" - integrity sha512-6B3ywnpvPxpnxkrcXzjTjMWgKRImbzNPOZvv5ant/kQv3zXedV1GXSIILy+imX39FuDPslOmEfx8plwrNvIteA== +"@abp/jquery-validation-unobtrusive@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-6.0.0-rc.3.tgz#01da2a59663d373ff1c69022f4c9c66ad0b29403" + integrity sha512-ij1ML2D9rYF3pJthWO6mGQajsJhbDCtOoBvnh9yCZccuwOYkXP22PqfUxjjxtqL4HqFI31KRpFg0ANMGSzEEBg== dependencies: - "@abp/jquery-validation" "~5.3.0" + "@abp/jquery-validation" "~6.0.0-rc.3" jquery-validation-unobtrusive "^3.2.12" -"@abp/jquery-validation@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-5.3.0.tgz#a21696e7d5d54ef8bcdc0e8bd2debb1da1f7f5cc" - integrity sha512-4z2I9iORf+z5SlN9crC/Gx3X5GAOVePD+WN8SaHSYr4VWYNe8TV8LvCZPilN56sIPt3jYvy0N+bI1tAuZPu/NQ== +"@abp/jquery-validation@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-6.0.0-rc.3.tgz#724aea9572dcb2faccf8c6355332b0b2a4df9260" + integrity sha512-rTK5oHaMtycvWxunNwzbE/MbsXXIr6qDnOY3rVUmjTHjqUOHYz591t/XeQfjnSXPp4k/SZUjG6viTC3J2jzC1A== dependencies: - "@abp/jquery" "~5.3.0" + "@abp/jquery" "~6.0.0-rc.3" jquery-validation "^1.19.3" -"@abp/jquery@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-5.3.0.tgz#0279ee501ed774a788072c2ec8b003e348fec22c" - integrity sha512-rqYbU3LpsT7XT8ygn+TFVmjev5NlgEcDhGwQ8PraY1dEjlDbteeQ50N4adS8fdRfOM1UjGL19ueN3F8E5qNUSg== +"@abp/jquery@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-6.0.0-rc.3.tgz#ba19cc8b802c46490277939e6c674811127d8016" + integrity sha512-MbD38iInyag7/j5k42cvMT4jLZMtXH4lUK0rjvqUDVaxKEks46Ix/90uczQ9XajYONgx0CJKFj2urgM830+CCA== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" jquery "~3.6.0" -"@abp/lodash@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-5.3.0.tgz#45f1dba7bb65b6599b4973d7e0c617dfd2c46c49" - integrity sha512-vQVMv58QuYttWBfLjJzIsw92JunGbWYsqk6pp6/JuoBls5UJtdP1F7vM4JgQxsscGYHFRZB3F4a3h1cxZ+dblQ== +"@abp/lodash@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-6.0.0-rc.3.tgz#8a5bab02353e5cab4ca06ab82f6dbe6285faa95a" + integrity sha512-c8yhcapzPsXyeiFjeOC+2a4bn5wFjW5gUoN+p/p+tE+FIcH37yEgyw/tAr6aZPCmR770MqQXct4t7S4Czbbk+A== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" lodash "^4.17.21" -"@abp/luxon@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-5.3.0.tgz#8a6277046f6e38c3affbf79c06f8ac00d1ca8098" - integrity sha512-6tETR03i1NPJuDqSQWtpkOykdq/84awifQUqRyh+b8340wV7P54NqUMDXDit9sjITFDhq99V/R+Rj3PVjvJD3A== +"@abp/luxon@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-6.0.0-rc.3.tgz#ba515e122c61918d481467d5be39f08a363822f6" + integrity sha512-2lRSSC0DYShlnKdbJ/Pmha/azjt09ZRPx57NQ01dc7ungChPry5EJL6pC3kXWnJrCkrPCF0V5+A3+taut9+l3A== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" luxon "^2.3.0" -"@abp/malihu-custom-scrollbar-plugin@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-5.3.0.tgz#e6e12162aa50d3c3d98629378cec2f6fd5964338" - integrity sha512-GVwgAZQurH/tr4Hgmuby2dun//v1dT+wLGV4ZvjCJzBRs4FgrB+25pj4qKm20j6/NKRKc4V5re/b1y6njCubFQ== +"@abp/malihu-custom-scrollbar-plugin@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-6.0.0-rc.3.tgz#0798e37ec6a852748118692a5fbd30c99d9745db" + integrity sha512-FlyShmRxG3wGk1OJCjHIZAdi2/Y2FJPkVxaE72CVIceQSmg0nebGTv3a7bhd4QzKkDsSA3+t6gHjnuKlTlDFLA== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/select2@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-5.3.0.tgz#aae202b87dc23dfc7c8fd933413a8dbeb2f5b683" - integrity sha512-0aIxdtzgONkrYnUN5ACkIIIhsC9e61QLRq3K+/98fjf7NkHOjG3Sptr8EKu5U3IQ2hNHgqBjPGYjkztGuxZ9kw== +"@abp/select2@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-6.0.0-rc.3.tgz#deb8332bfce2102a562004893321a48d5194bf53" + integrity sha512-rb0qElmmhiP09xX8ZbjzNLF6ygFBwErysGWt6Bbgzz5waX2sGe575Cgoz53FaMQ4JaRBg1N0/nCejKyDtiINRA== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" select2 "^4.0.13" -"@abp/sweetalert2@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-5.3.0.tgz#67379cfa4cb8884cb66b58f4cafa79960cf8426a" - integrity sha512-EBr8J7MDsYmSvOYxTbqsSmw6c2yLokHZe8A+EW2vsY9VYFXkoOJLVpCkCK4fhvHUv8/+Y5QnHW7bs1I6SKYXOw== +"@abp/sweetalert2@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-6.0.0-rc.3.tgz#e61fc6c1bed1316c1d44ca5c92f590e422db24d4" + integrity sha512-+SNpBb4XrQlWzRQK9lfdJqA9IfJrlgoqmHwPDgf3Q+P922MzO33TgDlZWbeE7MzVj2y2WmNsPuCKwhjSjSL2rw== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" sweetalert2 "^11.3.6" -"@abp/timeago@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-5.3.0.tgz#3aaef3edca333224ba6b3e81c8ad1ebaae51a2f4" - integrity sha512-FxtoPYxyk2CHeoloC6kaeCj5YtXH0rebhOEaCjrfyg9/Ec6LEkvpfC7RWlcsHaEUAtFXZegJDfOk066EPH7RHQ== +"@abp/timeago@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-6.0.0-rc.3.tgz#0ef8c4801bfd4623e6895b1d047b1437063bda53" + integrity sha512-P3YRDVKjR5/Fz+cXiPg3IiUr7XGbNh7mgmJ1ywRXmKVmVMJmhQ2RsKmmtkGJn4TfVHu/l5iJXe4rqgL21/yX/g== dependencies: - "@abp/jquery" "~5.3.0" + "@abp/jquery" "~6.0.0-rc.3" timeago "^1.6.7" -"@abp/toastr@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-5.3.0.tgz#8a002c19ea25ac6b042a25c0f9d289d03c93c2fb" - integrity sha512-gjb2O/XrYkX8IeCERIqlOYPh15WlF9LxGR6t9jeVF/p6BTX/yaWabYCFfB9SkU2pQ6xrGl7WmSTAC06JOAtPTA== +"@abp/toastr@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-6.0.0-rc.3.tgz#6010d4247937531ebf7c8659d6254cd3db6c4855" + integrity sha512-sC9eCzYVgDrLSFIhJGe9hshzfwA1BkZNah4NQhyq+V6HQ8YF7goMS79N+/XmSoLQ9zzRhusqnPFnb+4FHjr7iA== dependencies: - "@abp/jquery" "~5.3.0" + "@abp/jquery" "~6.0.0-rc.3" toastr "^2.1.4" -"@abp/utils@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-5.3.0.tgz#e93739074a3cd445a5a221209506b7e663050ca0" - integrity sha512-Nm+h+3PL10+rBFSh8UUuenmGM+OBlEoNQeGzHRmhOc6hJ3oqCogPzY+zkq0e4pksrwhjxAu/cgCEGLAoEXXycw== +"@abp/utils@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-6.0.0-rc.3.tgz#6d3515694314175218606e9518618ce335b4b360" + integrity sha512-K2geJ9P1ztk4Ehzb9YG3CqqLOi+z8/4iBLUzooNZLQqS+KdlUhCmqfuCoI/A5Aq9DGbTYesalp+Fwoh3S2Dl8A== dependencies: just-compare "^1.3.0" diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Host/Volo.CmsKit.Web.Host.abppkg.analyze.json b/modules/cms-kit/host/Volo.CmsKit.Web.Host/Volo.CmsKit.Web.Host.abppkg.analyze.json index 1b928a9d2a..8fe6adf6d6 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Host/Volo.CmsKit.Web.Host.abppkg.analyze.json +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Host/Volo.CmsKit.Web.Host.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.CmsKit.Web.Host", - "hash": "cc4d27ed5d3b15d46c68449fc409a9ea", + "hash": "b8c7f8a05e4ae2f56af72d7c331242d7", "contents": [ { "namespace": "Volo.CmsKit", 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 cc93b1db85..34dba93009 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": "^5.3.0" + "@abp/aspnetcore.mvc.ui.theme.basic": "^6.0.0-rc.3" } } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Host/wwwroot/libs/abp/core/abp.js b/modules/cms-kit/host/Volo.CmsKit.Web.Host/wwwroot/libs/abp/core/abp.js index 9445e4e7f4..d8b7531660 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Host/wwwroot/libs/abp/core/abp.js +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Host/wwwroot/libs/abp/core/abp.js @@ -372,7 +372,9 @@ var abp = abp || {}; setTimeout(function () { if (element) { element.classList.remove('abp-block-area-disappearing'); - element.parentElement.removeChild(element); + if (element.parentElement) { + element.parentElement.removeChild(element); + } } }, 250); } 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 7b87df9c6c..d501d9343d 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Host/yarn.lock +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Host/yarn.lock @@ -2,37 +2,37 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-5.3.0.tgz#dcdd73d8582c4d14438f70d765170398d5d582fb" - integrity sha512-H6UrafHRI1DHfIoi47gZWHKSanlyAkghtGgUO6GTmPqTubBXjl7Ky3owVUAXvFd49+72gwdCLA/DB0Khjc3Ayw== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~5.3.0" - -"@abp/aspnetcore.mvc.ui.theme.shared@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-5.3.0.tgz#84e94845a247815ce981cda2d195944a350530b9" - integrity sha512-RwXxlncjidvh8Hgw91Hz1f5rnfG9hlNROr5bD/kxTUB47vIh/TIBd06UYrYw2/lqFLw5d6wd8q7VLuDjGUQbpg== - dependencies: - "@abp/aspnetcore.mvc.ui" "~5.3.0" - "@abp/bootstrap" "~5.3.0" - "@abp/bootstrap-datepicker" "~5.3.0" - "@abp/datatables.net-bs5" "~5.3.0" - "@abp/font-awesome" "~5.3.0" - "@abp/jquery-form" "~5.3.0" - "@abp/jquery-validation-unobtrusive" "~5.3.0" - "@abp/lodash" "~5.3.0" - "@abp/luxon" "~5.3.0" - "@abp/malihu-custom-scrollbar-plugin" "~5.3.0" - "@abp/select2" "~5.3.0" - "@abp/sweetalert2" "~5.3.0" - "@abp/timeago" "~5.3.0" - "@abp/toastr" "~5.3.0" - -"@abp/aspnetcore.mvc.ui@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-5.3.0.tgz#e947fd1aecbd2aabc5db4c6a64b78f2690fcf0d4" - integrity sha512-en2YDb/hRG1MKkbli1PYcoeU9OLU0YPSahkIBSfOmMLntAe8y0c2+Xe09chXP4r+GoZu0zd9FM3qqCRZojrlug== +"@abp/aspnetcore.mvc.ui.theme.basic@^6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-6.0.0-rc.3.tgz#b95266387e562c635de795442f90470f8e9e6318" + integrity sha512-vVkEpotDST455E3rynvRQpBKPcNNJ2m1wLkz/B9dQNdUjvm8L4F6s0ls0XFlKUNvQfCVfedkRtGayuvNje/Oxg== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~6.0.0-rc.3" + +"@abp/aspnetcore.mvc.ui.theme.shared@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-6.0.0-rc.3.tgz#664ca2ee712b7d9e66103c00beb41eb9648a6075" + integrity sha512-KxCsGuoUWKaDo7Oo9aKp51pli2m0DZ2tG8m+zK+m4M9U7g96uC+DOFy3gc7MdPlszvrw32Wwm7I0AughstByNA== + dependencies: + "@abp/aspnetcore.mvc.ui" "~6.0.0-rc.3" + "@abp/bootstrap" "~6.0.0-rc.3" + "@abp/bootstrap-datepicker" "~6.0.0-rc.3" + "@abp/datatables.net-bs5" "~6.0.0-rc.3" + "@abp/font-awesome" "~6.0.0-rc.3" + "@abp/jquery-form" "~6.0.0-rc.3" + "@abp/jquery-validation-unobtrusive" "~6.0.0-rc.3" + "@abp/lodash" "~6.0.0-rc.3" + "@abp/luxon" "~6.0.0-rc.3" + "@abp/malihu-custom-scrollbar-plugin" "~6.0.0-rc.3" + "@abp/select2" "~6.0.0-rc.3" + "@abp/sweetalert2" "~6.0.0-rc.3" + "@abp/timeago" "~6.0.0-rc.3" + "@abp/toastr" "~6.0.0-rc.3" + +"@abp/aspnetcore.mvc.ui@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-6.0.0-rc.3.tgz#47c23b57ed3908bd78a232230e53d1f3cba2de41" + integrity sha512-7eJZy2JUGQP94Tz3JJWXRHRmDfTcPZ/lS1/VNbU8B4qvgl5ChIXklVEJLR1fwrBhKXZV8fGVmqT1XlGTGFvFJA== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -41,144 +41,144 @@ merge-stream "^2.0.0" micromatch "^4.0.2" -"@abp/bootstrap-datepicker@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-5.3.0.tgz#09c44954774d8f52ca8ff6699ad4dbb7cc0308c2" - integrity sha512-AQ26I0jgoCioW1/4XmQIyn1c1+CLv8KTb4Vd4ZbtdYGBkkkUe+JEAWpJSeXlJRr/XrOs0BKWp/fa7Nnwx8srLg== +"@abp/bootstrap-datepicker@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-6.0.0-rc.3.tgz#89198b863dbfccf5f07ac3c4b20ce6199adcb17a" + integrity sha512-NLoUjcR66mqwSWuVftu2yFH4/j6QP+FiElRfZQ9OYmO8DQx2Ue5UZzjrFTrZ1DBBCfzhr2Bffj80dirGvGDyvg== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-5.3.0.tgz#42dac2d2d6374f39d068a638687039c5c74df123" - integrity sha512-rg9mLcvT4JQRc1rIAhGYK1P2eMRJ1+GArQXV5l7k3FrVU+bRLKdoE6PNpuwXHpdlom4/dOgekfuWH/SAuY5kyw== +"@abp/bootstrap@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-6.0.0-rc.3.tgz#4574bf574cc3484869e8ff8bc592f6212d20a969" + integrity sha512-Q5v7WRkGhGcjRg267HXtqs1oU7ts9UXPyCXmg5y2y5qMOyioD+m4MKV4iv67DgoQjabudp8X2egTKxkej6Lzkw== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" bootstrap "^5.1.3" -"@abp/core@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-5.3.0.tgz#032724dd0c0b850204896ce0275c7f9c8f516740" - integrity sha512-Uk9h98jiEF1dItWrvWnYB6s/UNZZapvFSyJ4+piAsZmXOSAbrObV+s19n5xfUagQQTWn4+aU5+aChEcfWpYv9A== +"@abp/core@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-6.0.0-rc.3.tgz#5662ce813d449d97d9fb7ea2552b2774c8df7825" + integrity sha512-X/VRdk5SGNYc5gQzPcBEPAvwcuD9WXsI4YIdrqjnes0s8u2/XmfrTixojh8Y5EYUoOblEE3Soj5hBhY1cVwcbQ== dependencies: - "@abp/utils" "~5.3.0" + "@abp/utils" "~6.0.0-rc.3" -"@abp/datatables.net-bs5@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-5.3.0.tgz#84771ce4eb7229bed347a5904c891b08e3230422" - integrity sha512-FpKrgrjaBKVgFAnbBsrvDIJJOy8gbWCEHm5Jy2vFWXmx25fITMw/2ckBDH87yrZtCNVTSUbMIdHYOIHMPfSavQ== +"@abp/datatables.net-bs5@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-6.0.0-rc.3.tgz#22865c7e621de720b71af6265b3193f6c78695bd" + integrity sha512-T+mhLc6uSzWmxDQogVwnJ6VxI4845gmF68/i9TmVKNlCtpa3EEfyuF/hgWT1hYfCb4XOsvd/CWrunbkC3fsmtg== dependencies: - "@abp/datatables.net" "~5.3.0" + "@abp/datatables.net" "~6.0.0-rc.3" datatables.net-bs5 "^1.11.4" -"@abp/datatables.net@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-5.3.0.tgz#dd27ae451df9551f5b815e10c87a8a89c6a38293" - integrity sha512-d4lQ09G7HY2gEN1lRAteCZzY0Fv3gPuUM+icgWm+UkmDZV9lhvovTQ58Xkwayw8vf+NPlit1eGMMQedn6MbeAQ== +"@abp/datatables.net@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-6.0.0-rc.3.tgz#d036defe6ad7fc989dffa020ae579362ee3150d1" + integrity sha512-4cUU8/Tn0Vz9bx7jjMOD/0Viyr29fcwoQAAkxaaYZp6qiQbENgz46/xpQf2oBCoudk8CLdzpmNa7jWte7PcJJw== dependencies: - "@abp/jquery" "~5.3.0" + "@abp/jquery" "~6.0.0-rc.3" datatables.net "^1.11.4" -"@abp/font-awesome@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-5.3.0.tgz#ce1d5bb59bd597cc9717885917d4dd2eae1f8b9c" - integrity sha512-JX62EVfZSJ7pv75Gd3ya/3c3He0hXF7KmpTizUNd/EbeHuNJoCND5wwq5OAFV9Ld3vdcGJChNTydNa5RsBzrpg== +"@abp/font-awesome@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-6.0.0-rc.3.tgz#803569d1a7e25f8a1c2be018312449c23fb78217" + integrity sha512-lYdh38UCTSkzzw0B/mpPEo7iFXzSKHCNbBOIHe6dd6O/Qli7wYukTtUOFn5Sh+yoydLY1as92HtiGL1ckSdu1g== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" "@fortawesome/fontawesome-free" "^5.15.4" -"@abp/jquery-form@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-5.3.0.tgz#5ae9906f0cffaf3e043681a5dd80a014b4860f6b" - integrity sha512-ZTpXCImHirJDZjfnJRtSEHLIbWMTYkqtTv7Z3GMRKnI4fllpmuco9EWLAKjAfYPyc/QpTx+MYnUg5SsXORhJyQ== +"@abp/jquery-form@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-6.0.0-rc.3.tgz#4ec503c07e2194148c3a7e7cf7ddef2871679e6a" + integrity sha512-Q3uEpflntqrSkYakcdsBnnYYfxJWXD/CDjMiwjbb6gIc8s4qkbIYxVxvYvlEezoIDYQkMSXOn7BS4clWsesiJg== dependencies: - "@abp/jquery" "~5.3.0" + "@abp/jquery" "~6.0.0-rc.3" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-5.3.0.tgz#ccf90a7840398e69e0a91ed6c32b80fa2eb82d14" - integrity sha512-6B3ywnpvPxpnxkrcXzjTjMWgKRImbzNPOZvv5ant/kQv3zXedV1GXSIILy+imX39FuDPslOmEfx8plwrNvIteA== +"@abp/jquery-validation-unobtrusive@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-6.0.0-rc.3.tgz#01da2a59663d373ff1c69022f4c9c66ad0b29403" + integrity sha512-ij1ML2D9rYF3pJthWO6mGQajsJhbDCtOoBvnh9yCZccuwOYkXP22PqfUxjjxtqL4HqFI31KRpFg0ANMGSzEEBg== dependencies: - "@abp/jquery-validation" "~5.3.0" + "@abp/jquery-validation" "~6.0.0-rc.3" jquery-validation-unobtrusive "^3.2.12" -"@abp/jquery-validation@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-5.3.0.tgz#a21696e7d5d54ef8bcdc0e8bd2debb1da1f7f5cc" - integrity sha512-4z2I9iORf+z5SlN9crC/Gx3X5GAOVePD+WN8SaHSYr4VWYNe8TV8LvCZPilN56sIPt3jYvy0N+bI1tAuZPu/NQ== +"@abp/jquery-validation@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-6.0.0-rc.3.tgz#724aea9572dcb2faccf8c6355332b0b2a4df9260" + integrity sha512-rTK5oHaMtycvWxunNwzbE/MbsXXIr6qDnOY3rVUmjTHjqUOHYz591t/XeQfjnSXPp4k/SZUjG6viTC3J2jzC1A== dependencies: - "@abp/jquery" "~5.3.0" + "@abp/jquery" "~6.0.0-rc.3" jquery-validation "^1.19.3" -"@abp/jquery@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-5.3.0.tgz#0279ee501ed774a788072c2ec8b003e348fec22c" - integrity sha512-rqYbU3LpsT7XT8ygn+TFVmjev5NlgEcDhGwQ8PraY1dEjlDbteeQ50N4adS8fdRfOM1UjGL19ueN3F8E5qNUSg== +"@abp/jquery@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-6.0.0-rc.3.tgz#ba19cc8b802c46490277939e6c674811127d8016" + integrity sha512-MbD38iInyag7/j5k42cvMT4jLZMtXH4lUK0rjvqUDVaxKEks46Ix/90uczQ9XajYONgx0CJKFj2urgM830+CCA== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" jquery "~3.6.0" -"@abp/lodash@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-5.3.0.tgz#45f1dba7bb65b6599b4973d7e0c617dfd2c46c49" - integrity sha512-vQVMv58QuYttWBfLjJzIsw92JunGbWYsqk6pp6/JuoBls5UJtdP1F7vM4JgQxsscGYHFRZB3F4a3h1cxZ+dblQ== +"@abp/lodash@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-6.0.0-rc.3.tgz#8a5bab02353e5cab4ca06ab82f6dbe6285faa95a" + integrity sha512-c8yhcapzPsXyeiFjeOC+2a4bn5wFjW5gUoN+p/p+tE+FIcH37yEgyw/tAr6aZPCmR770MqQXct4t7S4Czbbk+A== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" lodash "^4.17.21" -"@abp/luxon@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-5.3.0.tgz#8a6277046f6e38c3affbf79c06f8ac00d1ca8098" - integrity sha512-6tETR03i1NPJuDqSQWtpkOykdq/84awifQUqRyh+b8340wV7P54NqUMDXDit9sjITFDhq99V/R+Rj3PVjvJD3A== +"@abp/luxon@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-6.0.0-rc.3.tgz#ba515e122c61918d481467d5be39f08a363822f6" + integrity sha512-2lRSSC0DYShlnKdbJ/Pmha/azjt09ZRPx57NQ01dc7ungChPry5EJL6pC3kXWnJrCkrPCF0V5+A3+taut9+l3A== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" luxon "^2.3.0" -"@abp/malihu-custom-scrollbar-plugin@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-5.3.0.tgz#e6e12162aa50d3c3d98629378cec2f6fd5964338" - integrity sha512-GVwgAZQurH/tr4Hgmuby2dun//v1dT+wLGV4ZvjCJzBRs4FgrB+25pj4qKm20j6/NKRKc4V5re/b1y6njCubFQ== +"@abp/malihu-custom-scrollbar-plugin@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-6.0.0-rc.3.tgz#0798e37ec6a852748118692a5fbd30c99d9745db" + integrity sha512-FlyShmRxG3wGk1OJCjHIZAdi2/Y2FJPkVxaE72CVIceQSmg0nebGTv3a7bhd4QzKkDsSA3+t6gHjnuKlTlDFLA== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/select2@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-5.3.0.tgz#aae202b87dc23dfc7c8fd933413a8dbeb2f5b683" - integrity sha512-0aIxdtzgONkrYnUN5ACkIIIhsC9e61QLRq3K+/98fjf7NkHOjG3Sptr8EKu5U3IQ2hNHgqBjPGYjkztGuxZ9kw== +"@abp/select2@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-6.0.0-rc.3.tgz#deb8332bfce2102a562004893321a48d5194bf53" + integrity sha512-rb0qElmmhiP09xX8ZbjzNLF6ygFBwErysGWt6Bbgzz5waX2sGe575Cgoz53FaMQ4JaRBg1N0/nCejKyDtiINRA== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" select2 "^4.0.13" -"@abp/sweetalert2@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-5.3.0.tgz#67379cfa4cb8884cb66b58f4cafa79960cf8426a" - integrity sha512-EBr8J7MDsYmSvOYxTbqsSmw6c2yLokHZe8A+EW2vsY9VYFXkoOJLVpCkCK4fhvHUv8/+Y5QnHW7bs1I6SKYXOw== +"@abp/sweetalert2@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-6.0.0-rc.3.tgz#e61fc6c1bed1316c1d44ca5c92f590e422db24d4" + integrity sha512-+SNpBb4XrQlWzRQK9lfdJqA9IfJrlgoqmHwPDgf3Q+P922MzO33TgDlZWbeE7MzVj2y2WmNsPuCKwhjSjSL2rw== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" sweetalert2 "^11.3.6" -"@abp/timeago@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-5.3.0.tgz#3aaef3edca333224ba6b3e81c8ad1ebaae51a2f4" - integrity sha512-FxtoPYxyk2CHeoloC6kaeCj5YtXH0rebhOEaCjrfyg9/Ec6LEkvpfC7RWlcsHaEUAtFXZegJDfOk066EPH7RHQ== +"@abp/timeago@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-6.0.0-rc.3.tgz#0ef8c4801bfd4623e6895b1d047b1437063bda53" + integrity sha512-P3YRDVKjR5/Fz+cXiPg3IiUr7XGbNh7mgmJ1ywRXmKVmVMJmhQ2RsKmmtkGJn4TfVHu/l5iJXe4rqgL21/yX/g== dependencies: - "@abp/jquery" "~5.3.0" + "@abp/jquery" "~6.0.0-rc.3" timeago "^1.6.7" -"@abp/toastr@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-5.3.0.tgz#8a002c19ea25ac6b042a25c0f9d289d03c93c2fb" - integrity sha512-gjb2O/XrYkX8IeCERIqlOYPh15WlF9LxGR6t9jeVF/p6BTX/yaWabYCFfB9SkU2pQ6xrGl7WmSTAC06JOAtPTA== +"@abp/toastr@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-6.0.0-rc.3.tgz#6010d4247937531ebf7c8659d6254cd3db6c4855" + integrity sha512-sC9eCzYVgDrLSFIhJGe9hshzfwA1BkZNah4NQhyq+V6HQ8YF7goMS79N+/XmSoLQ9zzRhusqnPFnb+4FHjr7iA== dependencies: - "@abp/jquery" "~5.3.0" + "@abp/jquery" "~6.0.0-rc.3" toastr "^2.1.4" -"@abp/utils@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-5.3.0.tgz#e93739074a3cd445a5a221209506b7e663050ca0" - integrity sha512-Nm+h+3PL10+rBFSh8UUuenmGM+OBlEoNQeGzHRmhOc6hJ3oqCogPzY+zkq0e4pksrwhjxAu/cgCEGLAoEXXycw== +"@abp/utils@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-6.0.0-rc.3.tgz#6d3515694314175218606e9518618ce335b4b360" + integrity sha512-K2geJ9P1ztk4Ehzb9YG3CqqLOi+z8/4iBLUzooNZLQqS+KdlUhCmqfuCoI/A5Aq9DGbTYesalp+Fwoh3S2Dl8A== dependencies: just-compare "^1.3.0" diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/CmsKitWebUnifiedModule.cs b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/CmsKitWebUnifiedModule.cs index 9a6be48e5f..0343a3bc58 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/CmsKitWebUnifiedModule.cs +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/CmsKitWebUnifiedModule.cs @@ -1,11 +1,7 @@ using System.IO; -using System.Linq; using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; -using Volo.CmsKit.EntityFrameworkCore; -using Volo.CmsKit.MultiTenancy; -using Volo.CmsKit.Web; using Microsoft.OpenApi.Models; using Volo.Abp; using Volo.Abp.Account; @@ -19,8 +15,8 @@ using Volo.Abp.BlobStoring.Database.EntityFrameworkCore; using Volo.Abp.Data; using Volo.Abp.EntityFrameworkCore; using Volo.Abp.EntityFrameworkCore.SqlServer; -using Volo.Abp.FeatureManagement.EntityFrameworkCore; using Volo.Abp.FeatureManagement; +using Volo.Abp.FeatureManagement.EntityFrameworkCore; using Volo.Abp.Identity; using Volo.Abp.Identity.EntityFrameworkCore; using Volo.Abp.Identity.Web; @@ -29,6 +25,7 @@ using Volo.Abp.Modularity; using Volo.Abp.MultiTenancy; using Volo.Abp.PermissionManagement; using Volo.Abp.PermissionManagement.EntityFrameworkCore; +using Volo.Abp.PermissionManagement.HttpApi; using Volo.Abp.PermissionManagement.Identity; using Volo.Abp.SettingManagement.EntityFrameworkCore; using Volo.Abp.Swashbuckle; @@ -38,14 +35,16 @@ using Volo.Abp.TenantManagement.Web; using Volo.Abp.Threading; using Volo.Abp.VirtualFileSystem; using Volo.CmsKit.Admin.Web; -using Volo.CmsKit.Public.Web; -using System; -using Volo.Abp.PermissionManagement.HttpApi; -using Volo.CmsKit.Tags; using Volo.CmsKit.Comments; +using Volo.CmsKit.EntityFrameworkCore; using Volo.CmsKit.MediaDescriptors; -using Volo.CmsKit.Reactions; +using Volo.CmsKit.MultiTenancy; +using Volo.CmsKit.Public.Web; using Volo.CmsKit.Ratings; +using Volo.CmsKit.Reactions; +using Volo.CmsKit.Tags; +using Volo.CmsKit.Web; +using Volo.CmsKit.Web.Contents; namespace Volo.CmsKit; @@ -92,9 +91,8 @@ public class CmsKitWebUnifiedModule : AbpModule public override void ConfigureServices(ServiceConfigurationContext context) { var hostingEnvironment = context.Services.GetHostingEnvironment(); - var configuration = context.Services.GetConfiguration(); - ConfigureCmsKit(context); + ConfigureCmsKit(); Configure(options => { @@ -152,9 +150,14 @@ public class CmsKitWebUnifiedModule : AbpModule { options.IsEnabled = MultiTenancyConsts.IsEnabled; }); + + Configure(options => + { + options.AddWidget("Today", "CmsToday", "Format"); + }); } - private void ConfigureCmsKit(ServiceConfigurationContext context) + private void ConfigureCmsKit() { Configure(options => { diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/ViewComponents/Format.cshtml b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/ViewComponents/Format.cshtml new file mode 100644 index 0000000000..de58a49679 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/ViewComponents/Format.cshtml @@ -0,0 +1,6 @@ +@using Volo.CmsKit.ViewComponents +@model FormatViewModel + +
+ +
diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/ViewComponents/FormatViewComponent.cs b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/ViewComponents/FormatViewComponent.cs new file mode 100644 index 0000000000..af53a3e8f1 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/ViewComponents/FormatViewComponent.cs @@ -0,0 +1,30 @@ +using System.ComponentModel; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using Volo.Abp.AspNetCore.Mvc; +using Volo.Abp.AspNetCore.Mvc.UI.Widgets; + +namespace Volo.CmsKit.ViewComponents; + +[Widget( + AutoInitialize = true +)] + +[ViewComponent(Name = "Format")] +public class FormatViewComponent : AbpViewComponent +{ + public FormatViewComponent() + { + } + + public virtual async Task InvokeAsync() + { + return View("~/ViewComponents/Format.cshtml", new FormatViewModel()); + } +} + +public class FormatViewModel +{ + [DisplayName("Format your date in the component")] + public string Format { get; set; } +} diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/ViewComponents/Today.cshtml b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/ViewComponents/Today.cshtml new file mode 100644 index 0000000000..a63170e67f --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/ViewComponents/Today.cshtml @@ -0,0 +1,5 @@ +@model Volo.CmsKit.ViewComponents.TodayViewComponent + +

Welcome Today Component

+ +

@DateTime.Now.ToString(Model.Format)

diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/ViewComponents/TodayViewComponent.cs b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/ViewComponents/TodayViewComponent.cs new file mode 100644 index 0000000000..f0be3ad33c --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/ViewComponents/TodayViewComponent.cs @@ -0,0 +1,25 @@ +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using Volo.Abp.AspNetCore.Mvc; +using Volo.Abp.AspNetCore.Mvc.UI.Widgets; + +namespace Volo.CmsKit.ViewComponents; + +[Widget( + AutoInitialize = true +)] + +[ViewComponent(Name = "CmsToday")] +public class TodayViewComponent : AbpViewComponent +{ + public string Format { get; set; } + + public TodayViewComponent() + { + } + + public virtual async Task InvokeAsync(string format) + { + return View("~/ViewComponents/Today.cshtml", new TodayViewComponent() { Format = format }); + } +} diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Pages/_ViewImports.cshtml b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/_ViewImports.cshtml similarity index 100% rename from modules/cms-kit/host/Volo.CmsKit.Web.Unified/Pages/_ViewImports.cshtml rename to modules/cms-kit/host/Volo.CmsKit.Web.Unified/_ViewImports.cshtml 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 933390e8f8..38f9f7fac3 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": "^5.3.0", - "@abp/cms-kit": "5.3.0" + "@abp/aspnetcore.mvc.ui.theme.basic": "^6.0.0-rc.3", + "@abp/cms-kit": "6.0.0-rc.3" } } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/abp/core/abp.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/abp/core/abp.js index 9445e4e7f4..d8b7531660 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/abp/core/abp.js +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/abp/core/abp.js @@ -372,7 +372,9 @@ var abp = abp || {}; setTimeout(function () { if (element) { element.classList.remove('abp-block-area-disappearing'); - element.parentElement.removeChild(element); + if (element.parentElement) { + element.parentElement.removeChild(element); + } } }, 250); } 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 6b13c7cede..16b4938438 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/yarn.lock +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/yarn.lock @@ -2,37 +2,37 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-5.3.0.tgz#dcdd73d8582c4d14438f70d765170398d5d582fb" - integrity sha512-H6UrafHRI1DHfIoi47gZWHKSanlyAkghtGgUO6GTmPqTubBXjl7Ky3owVUAXvFd49+72gwdCLA/DB0Khjc3Ayw== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~5.3.0" - -"@abp/aspnetcore.mvc.ui.theme.shared@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-5.3.0.tgz#84e94845a247815ce981cda2d195944a350530b9" - integrity sha512-RwXxlncjidvh8Hgw91Hz1f5rnfG9hlNROr5bD/kxTUB47vIh/TIBd06UYrYw2/lqFLw5d6wd8q7VLuDjGUQbpg== - dependencies: - "@abp/aspnetcore.mvc.ui" "~5.3.0" - "@abp/bootstrap" "~5.3.0" - "@abp/bootstrap-datepicker" "~5.3.0" - "@abp/datatables.net-bs5" "~5.3.0" - "@abp/font-awesome" "~5.3.0" - "@abp/jquery-form" "~5.3.0" - "@abp/jquery-validation-unobtrusive" "~5.3.0" - "@abp/lodash" "~5.3.0" - "@abp/luxon" "~5.3.0" - "@abp/malihu-custom-scrollbar-plugin" "~5.3.0" - "@abp/select2" "~5.3.0" - "@abp/sweetalert2" "~5.3.0" - "@abp/timeago" "~5.3.0" - "@abp/toastr" "~5.3.0" - -"@abp/aspnetcore.mvc.ui@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-5.3.0.tgz#e947fd1aecbd2aabc5db4c6a64b78f2690fcf0d4" - integrity sha512-en2YDb/hRG1MKkbli1PYcoeU9OLU0YPSahkIBSfOmMLntAe8y0c2+Xe09chXP4r+GoZu0zd9FM3qqCRZojrlug== +"@abp/aspnetcore.mvc.ui.theme.basic@^6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-6.0.0-rc.3.tgz#b95266387e562c635de795442f90470f8e9e6318" + integrity sha512-vVkEpotDST455E3rynvRQpBKPcNNJ2m1wLkz/B9dQNdUjvm8L4F6s0ls0XFlKUNvQfCVfedkRtGayuvNje/Oxg== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~6.0.0-rc.3" + +"@abp/aspnetcore.mvc.ui.theme.shared@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-6.0.0-rc.3.tgz#664ca2ee712b7d9e66103c00beb41eb9648a6075" + integrity sha512-KxCsGuoUWKaDo7Oo9aKp51pli2m0DZ2tG8m+zK+m4M9U7g96uC+DOFy3gc7MdPlszvrw32Wwm7I0AughstByNA== + dependencies: + "@abp/aspnetcore.mvc.ui" "~6.0.0-rc.3" + "@abp/bootstrap" "~6.0.0-rc.3" + "@abp/bootstrap-datepicker" "~6.0.0-rc.3" + "@abp/datatables.net-bs5" "~6.0.0-rc.3" + "@abp/font-awesome" "~6.0.0-rc.3" + "@abp/jquery-form" "~6.0.0-rc.3" + "@abp/jquery-validation-unobtrusive" "~6.0.0-rc.3" + "@abp/lodash" "~6.0.0-rc.3" + "@abp/luxon" "~6.0.0-rc.3" + "@abp/malihu-custom-scrollbar-plugin" "~6.0.0-rc.3" + "@abp/select2" "~6.0.0-rc.3" + "@abp/sweetalert2" "~6.0.0-rc.3" + "@abp/timeago" "~6.0.0-rc.3" + "@abp/toastr" "~6.0.0-rc.3" + +"@abp/aspnetcore.mvc.ui@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-6.0.0-rc.3.tgz#47c23b57ed3908bd78a232230e53d1f3cba2de41" + integrity sha512-7eJZy2JUGQP94Tz3JJWXRHRmDfTcPZ/lS1/VNbU8B4qvgl5ChIXklVEJLR1fwrBhKXZV8fGVmqT1XlGTGFvFJA== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -41,243 +41,243 @@ merge-stream "^2.0.0" micromatch "^4.0.2" -"@abp/bootstrap-datepicker@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-5.3.0.tgz#09c44954774d8f52ca8ff6699ad4dbb7cc0308c2" - integrity sha512-AQ26I0jgoCioW1/4XmQIyn1c1+CLv8KTb4Vd4ZbtdYGBkkkUe+JEAWpJSeXlJRr/XrOs0BKWp/fa7Nnwx8srLg== +"@abp/bootstrap-datepicker@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-6.0.0-rc.3.tgz#89198b863dbfccf5f07ac3c4b20ce6199adcb17a" + integrity sha512-NLoUjcR66mqwSWuVftu2yFH4/j6QP+FiElRfZQ9OYmO8DQx2Ue5UZzjrFTrZ1DBBCfzhr2Bffj80dirGvGDyvg== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-5.3.0.tgz#42dac2d2d6374f39d068a638687039c5c74df123" - integrity sha512-rg9mLcvT4JQRc1rIAhGYK1P2eMRJ1+GArQXV5l7k3FrVU+bRLKdoE6PNpuwXHpdlom4/dOgekfuWH/SAuY5kyw== +"@abp/bootstrap@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-6.0.0-rc.3.tgz#4574bf574cc3484869e8ff8bc592f6212d20a969" + integrity sha512-Q5v7WRkGhGcjRg267HXtqs1oU7ts9UXPyCXmg5y2y5qMOyioD+m4MKV4iv67DgoQjabudp8X2egTKxkej6Lzkw== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" bootstrap "^5.1.3" -"@abp/clipboard@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-5.3.0.tgz#579bbc786d32c4e07c969073872b936575df7a9c" - integrity sha512-J55jQnzPOOAwo70GK9hAB3JxG7rz75tex+17QSFjW7/dXVWt1bPIDRHh/a1wiLEgYc6btsSGhptLtkYAfWpq6w== +"@abp/clipboard@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-6.0.0-rc.3.tgz#ee3a586b491d89442eefff08aaebbf9d38cb46d4" + integrity sha512-01svpp3mR29z1FTM+2Qe+MUNLPbl95bWlOXY5zz2hvNSbdD45lGud+BiOHfeZwlDk5jjr3FqLel+hxx2ByBvOA== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" clipboard "^2.0.8" -"@abp/cms-kit.admin@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/cms-kit.admin/-/cms-kit.admin-5.3.0.tgz#5cdb2df086887009a6cf96743586df513a1741ce" - integrity sha512-dO68zu1q5iE8xVY5YUFyl8OLeHcqIRc8/JmGDalhPF+714aQEWEB1OtLBPjyadLzaYZkoIbppePW1E0zGtwtog== +"@abp/cms-kit.admin@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/cms-kit.admin/-/cms-kit.admin-6.0.0-rc.3.tgz#2e1b05e88846971e73977736635b4fd1c235a092" + integrity sha512-ClVNcpKpOrZSUf0TuEx175ucK3IIxgH7GdqJpGkirqjCxVKyeGWhwyWB1JRCkXfHdE5XUxNJaYitrhQoNuZklw== dependencies: - "@abp/codemirror" "~5.3.0" - "@abp/jstree" "~5.3.0" - "@abp/slugify" "~5.3.0" - "@abp/tui-editor" "~5.3.0" - "@abp/uppy" "~5.3.0" + "@abp/codemirror" "~6.0.0-rc.3" + "@abp/jstree" "~6.0.0-rc.3" + "@abp/slugify" "~6.0.0-rc.3" + "@abp/tui-editor" "~6.0.0-rc.3" + "@abp/uppy" "~6.0.0-rc.3" -"@abp/cms-kit.public@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/cms-kit.public/-/cms-kit.public-5.3.0.tgz#c545edbb4d2ee0c4d4d99cb597353635a336f607" - integrity sha512-hY+1j3ZqgU2D86/677yGEbbbMntqEy+drbqcj/DkG+YT/pXndJG3XwKZQ/fMpyD4+f9uvTnM1SBdQzvyFSRtMw== +"@abp/cms-kit.public@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/cms-kit.public/-/cms-kit.public-6.0.0-rc.3.tgz#18c3e18d094a0c5d6fafb7865f27bfba49bdc420" + integrity sha512-6Pg1Y2UGwsBLLHe37MMerxSg0n8Qa3CLJoyGJndPmRpxfX14Vu465efSPjxENJrhnoU1FEe9xaNssJ9Lb+JdjA== dependencies: - "@abp/highlight.js" "~5.3.0" - "@abp/star-rating-svg" "~5.3.0" + "@abp/highlight.js" "~6.0.0-rc.3" + "@abp/star-rating-svg" "~6.0.0-rc.3" -"@abp/cms-kit@5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/cms-kit/-/cms-kit-5.3.0.tgz#5bc0635bcb79615578bf7c86f2b3ee1113e6d5c5" - integrity sha512-1LMeGa/dCaVmrMBdFsYV7DwlAtK4wktrb6SAHYTVDEdbvR306hjvYZBa99w20oXNlmvWDTs/EW5ZPbSyjF+ILw== +"@abp/cms-kit@6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/cms-kit/-/cms-kit-6.0.0-rc.3.tgz#3e8883553b57f6daf025cb6fa595984a2f6d0be0" + integrity sha512-WiZrpuNhmh/ei8e6HFneBIH99rFdIE2cCGhFBY9WY+Ne3SzcUGYUjJ8DN4x63OS5P2AtxVDhckIznYZWpAw+kQ== dependencies: - "@abp/cms-kit.admin" "~5.3.0" - "@abp/cms-kit.public" "~5.3.0" + "@abp/cms-kit.admin" "~6.0.0-rc.3" + "@abp/cms-kit.public" "~6.0.0-rc.3" -"@abp/codemirror@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/codemirror/-/codemirror-5.3.0.tgz#16fc4b0158b32d1505d3c3c5adaa4eddbc9f225c" - integrity sha512-xw802zydI4OHk9P2rI4vKgT8wKDAK/JQlEEPIZvPFXNvmfIkV2CDJr0AZkrhYw0AB07EzAQkndPFia8TyW82Pw== +"@abp/codemirror@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/codemirror/-/codemirror-6.0.0-rc.3.tgz#3624229745308b14fc95b19cf99a7771945d458e" + integrity sha512-FqqYAKFzLCtcRri33YhMcVNuM2zHpV2Qvcu1DTWPL+kdeiw5tPi/Nm9qB0D0aRfefJNkcVLDvP64pnLnVLLWMA== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" codemirror "^5.65.1" -"@abp/core@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-5.3.0.tgz#032724dd0c0b850204896ce0275c7f9c8f516740" - integrity sha512-Uk9h98jiEF1dItWrvWnYB6s/UNZZapvFSyJ4+piAsZmXOSAbrObV+s19n5xfUagQQTWn4+aU5+aChEcfWpYv9A== +"@abp/core@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-6.0.0-rc.3.tgz#5662ce813d449d97d9fb7ea2552b2774c8df7825" + integrity sha512-X/VRdk5SGNYc5gQzPcBEPAvwcuD9WXsI4YIdrqjnes0s8u2/XmfrTixojh8Y5EYUoOblEE3Soj5hBhY1cVwcbQ== dependencies: - "@abp/utils" "~5.3.0" + "@abp/utils" "~6.0.0-rc.3" -"@abp/datatables.net-bs5@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-5.3.0.tgz#84771ce4eb7229bed347a5904c891b08e3230422" - integrity sha512-FpKrgrjaBKVgFAnbBsrvDIJJOy8gbWCEHm5Jy2vFWXmx25fITMw/2ckBDH87yrZtCNVTSUbMIdHYOIHMPfSavQ== +"@abp/datatables.net-bs5@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-6.0.0-rc.3.tgz#22865c7e621de720b71af6265b3193f6c78695bd" + integrity sha512-T+mhLc6uSzWmxDQogVwnJ6VxI4845gmF68/i9TmVKNlCtpa3EEfyuF/hgWT1hYfCb4XOsvd/CWrunbkC3fsmtg== dependencies: - "@abp/datatables.net" "~5.3.0" + "@abp/datatables.net" "~6.0.0-rc.3" datatables.net-bs5 "^1.11.4" -"@abp/datatables.net@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-5.3.0.tgz#dd27ae451df9551f5b815e10c87a8a89c6a38293" - integrity sha512-d4lQ09G7HY2gEN1lRAteCZzY0Fv3gPuUM+icgWm+UkmDZV9lhvovTQ58Xkwayw8vf+NPlit1eGMMQedn6MbeAQ== +"@abp/datatables.net@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-6.0.0-rc.3.tgz#d036defe6ad7fc989dffa020ae579362ee3150d1" + integrity sha512-4cUU8/Tn0Vz9bx7jjMOD/0Viyr29fcwoQAAkxaaYZp6qiQbENgz46/xpQf2oBCoudk8CLdzpmNa7jWte7PcJJw== dependencies: - "@abp/jquery" "~5.3.0" + "@abp/jquery" "~6.0.0-rc.3" datatables.net "^1.11.4" -"@abp/font-awesome@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-5.3.0.tgz#ce1d5bb59bd597cc9717885917d4dd2eae1f8b9c" - integrity sha512-JX62EVfZSJ7pv75Gd3ya/3c3He0hXF7KmpTizUNd/EbeHuNJoCND5wwq5OAFV9Ld3vdcGJChNTydNa5RsBzrpg== +"@abp/font-awesome@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-6.0.0-rc.3.tgz#803569d1a7e25f8a1c2be018312449c23fb78217" + integrity sha512-lYdh38UCTSkzzw0B/mpPEo7iFXzSKHCNbBOIHe6dd6O/Qli7wYukTtUOFn5Sh+yoydLY1as92HtiGL1ckSdu1g== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" "@fortawesome/fontawesome-free" "^5.15.4" -"@abp/highlight.js@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/highlight.js/-/highlight.js-5.3.0.tgz#651817b146b9305ea07938ecceef160ff83413bd" - integrity sha512-bcbz67DzyE5pN+/FsyKEX860j7KUDwL3qot1IH995bGT538Fso6xwwA5r4TpR/A/nEx2frmgljU0erX/9MgKew== +"@abp/highlight.js@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/highlight.js/-/highlight.js-6.0.0-rc.3.tgz#e7aa8388afb57a1574f2645a7f786000b553562d" + integrity sha512-q0WhsovYfYrlNvIJyyXShXSTaY9cXNMEJbwJmmlQMVSyHUUPMfOf3w4ofBEC92U0mgzeIi7TMx9vJlm9qjSVJA== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" "@highlightjs/cdn-assets" "~11.4.0" -"@abp/jquery-form@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-5.3.0.tgz#5ae9906f0cffaf3e043681a5dd80a014b4860f6b" - integrity sha512-ZTpXCImHirJDZjfnJRtSEHLIbWMTYkqtTv7Z3GMRKnI4fllpmuco9EWLAKjAfYPyc/QpTx+MYnUg5SsXORhJyQ== +"@abp/jquery-form@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-6.0.0-rc.3.tgz#4ec503c07e2194148c3a7e7cf7ddef2871679e6a" + integrity sha512-Q3uEpflntqrSkYakcdsBnnYYfxJWXD/CDjMiwjbb6gIc8s4qkbIYxVxvYvlEezoIDYQkMSXOn7BS4clWsesiJg== dependencies: - "@abp/jquery" "~5.3.0" + "@abp/jquery" "~6.0.0-rc.3" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-5.3.0.tgz#ccf90a7840398e69e0a91ed6c32b80fa2eb82d14" - integrity sha512-6B3ywnpvPxpnxkrcXzjTjMWgKRImbzNPOZvv5ant/kQv3zXedV1GXSIILy+imX39FuDPslOmEfx8plwrNvIteA== +"@abp/jquery-validation-unobtrusive@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-6.0.0-rc.3.tgz#01da2a59663d373ff1c69022f4c9c66ad0b29403" + integrity sha512-ij1ML2D9rYF3pJthWO6mGQajsJhbDCtOoBvnh9yCZccuwOYkXP22PqfUxjjxtqL4HqFI31KRpFg0ANMGSzEEBg== dependencies: - "@abp/jquery-validation" "~5.3.0" + "@abp/jquery-validation" "~6.0.0-rc.3" jquery-validation-unobtrusive "^3.2.12" -"@abp/jquery-validation@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-5.3.0.tgz#a21696e7d5d54ef8bcdc0e8bd2debb1da1f7f5cc" - integrity sha512-4z2I9iORf+z5SlN9crC/Gx3X5GAOVePD+WN8SaHSYr4VWYNe8TV8LvCZPilN56sIPt3jYvy0N+bI1tAuZPu/NQ== +"@abp/jquery-validation@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-6.0.0-rc.3.tgz#724aea9572dcb2faccf8c6355332b0b2a4df9260" + integrity sha512-rTK5oHaMtycvWxunNwzbE/MbsXXIr6qDnOY3rVUmjTHjqUOHYz591t/XeQfjnSXPp4k/SZUjG6viTC3J2jzC1A== dependencies: - "@abp/jquery" "~5.3.0" + "@abp/jquery" "~6.0.0-rc.3" jquery-validation "^1.19.3" -"@abp/jquery@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-5.3.0.tgz#0279ee501ed774a788072c2ec8b003e348fec22c" - integrity sha512-rqYbU3LpsT7XT8ygn+TFVmjev5NlgEcDhGwQ8PraY1dEjlDbteeQ50N4adS8fdRfOM1UjGL19ueN3F8E5qNUSg== +"@abp/jquery@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-6.0.0-rc.3.tgz#ba19cc8b802c46490277939e6c674811127d8016" + integrity sha512-MbD38iInyag7/j5k42cvMT4jLZMtXH4lUK0rjvqUDVaxKEks46Ix/90uczQ9XajYONgx0CJKFj2urgM830+CCA== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" jquery "~3.6.0" -"@abp/jstree@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/jstree/-/jstree-5.3.0.tgz#20127f006dec2589c76deaf39227af95253952c6" - integrity sha512-ipiXKUAJjqiph4V7qtSfDr9/nU0UViu+zG+GeKdqxgVxFKR92hsisDOKrPJF+XmprLu7o9T7bxsFgS/B6ko4Og== +"@abp/jstree@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jstree/-/jstree-6.0.0-rc.3.tgz#b43b83d0b4904daf3f16df6465b26ce38348a62b" + integrity sha512-0N+U/pBWyTg634h2Hfq44ECKvGB2Sryp/JNJAbqbAsIagiaA67xcC2Gj5C/NbNKkPCTTjhC6nh4wNvZX7A+x1Q== dependencies: - "@abp/jquery" "~5.3.0" + "@abp/jquery" "~6.0.0-rc.3" jstree "^3.3.12" -"@abp/lodash@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-5.3.0.tgz#45f1dba7bb65b6599b4973d7e0c617dfd2c46c49" - integrity sha512-vQVMv58QuYttWBfLjJzIsw92JunGbWYsqk6pp6/JuoBls5UJtdP1F7vM4JgQxsscGYHFRZB3F4a3h1cxZ+dblQ== +"@abp/lodash@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-6.0.0-rc.3.tgz#8a5bab02353e5cab4ca06ab82f6dbe6285faa95a" + integrity sha512-c8yhcapzPsXyeiFjeOC+2a4bn5wFjW5gUoN+p/p+tE+FIcH37yEgyw/tAr6aZPCmR770MqQXct4t7S4Czbbk+A== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" lodash "^4.17.21" -"@abp/luxon@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-5.3.0.tgz#8a6277046f6e38c3affbf79c06f8ac00d1ca8098" - integrity sha512-6tETR03i1NPJuDqSQWtpkOykdq/84awifQUqRyh+b8340wV7P54NqUMDXDit9sjITFDhq99V/R+Rj3PVjvJD3A== +"@abp/luxon@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-6.0.0-rc.3.tgz#ba515e122c61918d481467d5be39f08a363822f6" + integrity sha512-2lRSSC0DYShlnKdbJ/Pmha/azjt09ZRPx57NQ01dc7ungChPry5EJL6pC3kXWnJrCkrPCF0V5+A3+taut9+l3A== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" luxon "^2.3.0" -"@abp/malihu-custom-scrollbar-plugin@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-5.3.0.tgz#e6e12162aa50d3c3d98629378cec2f6fd5964338" - integrity sha512-GVwgAZQurH/tr4Hgmuby2dun//v1dT+wLGV4ZvjCJzBRs4FgrB+25pj4qKm20j6/NKRKc4V5re/b1y6njCubFQ== +"@abp/malihu-custom-scrollbar-plugin@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-6.0.0-rc.3.tgz#0798e37ec6a852748118692a5fbd30c99d9745db" + integrity sha512-FlyShmRxG3wGk1OJCjHIZAdi2/Y2FJPkVxaE72CVIceQSmg0nebGTv3a7bhd4QzKkDsSA3+t6gHjnuKlTlDFLA== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/prismjs@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-5.3.0.tgz#658a371023d9a3de9ecfff1f10bae7a83064fac7" - integrity sha512-NPsYJ9oj/57vG+eVGpDkJcdPAx4WlXTVEUZWWxmaXuM9sHY1/2av975Qk8R5HG6fC74w3DrVCP8YQvU6jlaF1w== +"@abp/prismjs@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-6.0.0-rc.3.tgz#e4faf595e29db81c5a66030e59b0e09f09759bfd" + integrity sha512-zzd3iw/Im0M9FUmTviwkTCr4slkoZJExtK+qB1FmLxRY59+hyU9wxd6hwzic/QwhXxFQoYILJ3S3FNxsPIm76A== dependencies: - "@abp/clipboard" "~5.3.0" - "@abp/core" "~5.3.0" + "@abp/clipboard" "~6.0.0-rc.3" + "@abp/core" "~6.0.0-rc.3" prismjs "^1.26.0" -"@abp/select2@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-5.3.0.tgz#aae202b87dc23dfc7c8fd933413a8dbeb2f5b683" - integrity sha512-0aIxdtzgONkrYnUN5ACkIIIhsC9e61QLRq3K+/98fjf7NkHOjG3Sptr8EKu5U3IQ2hNHgqBjPGYjkztGuxZ9kw== +"@abp/select2@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-6.0.0-rc.3.tgz#deb8332bfce2102a562004893321a48d5194bf53" + integrity sha512-rb0qElmmhiP09xX8ZbjzNLF6ygFBwErysGWt6Bbgzz5waX2sGe575Cgoz53FaMQ4JaRBg1N0/nCejKyDtiINRA== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" select2 "^4.0.13" -"@abp/slugify@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/slugify/-/slugify-5.3.0.tgz#b805f0c2965382607ce031b949b01ac82dfaa68c" - integrity sha512-N2SUiYDMAyDrs+a35yTsSknFfGDmWtq1IUcOnb6D0WdGyhOTdeBzn5zAQPXYBH6buAjsQQT5mR1tWS0phICVdg== +"@abp/slugify@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/slugify/-/slugify-6.0.0-rc.3.tgz#9ab27f563a6f89ba254240f4f0fe7c6a162bf0e8" + integrity sha512-V/lAX81CYe5DDGCv+xFiHuleOW/H/2ntXBByNDOqAFpK74vbEsxLTeCRpJ902intRDlnZFJb2G4khJNPQgb91w== dependencies: slugify "^1.6.5" -"@abp/star-rating-svg@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/star-rating-svg/-/star-rating-svg-5.3.0.tgz#9a5544b3a62df467d04f8c5b73fb6f056cafc8ad" - integrity sha512-DbzCtZE41ELMf22XOXAHbe8zzRuA/BW6s4PxDgk8JEJHAx/BaPOHxauEkd3dpmxBSZGUVaX3RedofnJgIBREEg== +"@abp/star-rating-svg@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/star-rating-svg/-/star-rating-svg-6.0.0-rc.3.tgz#81c6bdcf5161ca269de5b7162c4178d2bac2d877" + integrity sha512-o3ciRL2wID/TZflcAZybGMaXLs76Ed7a4LHmDuvPcN/VP92uUWB/baKcl2bVbYLq+xokyko+Ei2YtkqoysG7/A== dependencies: - "@abp/jquery" "~5.3.0" + "@abp/jquery" "~6.0.0-rc.3" star-rating-svg "^3.5.0" -"@abp/sweetalert2@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-5.3.0.tgz#67379cfa4cb8884cb66b58f4cafa79960cf8426a" - integrity sha512-EBr8J7MDsYmSvOYxTbqsSmw6c2yLokHZe8A+EW2vsY9VYFXkoOJLVpCkCK4fhvHUv8/+Y5QnHW7bs1I6SKYXOw== +"@abp/sweetalert2@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-6.0.0-rc.3.tgz#e61fc6c1bed1316c1d44ca5c92f590e422db24d4" + integrity sha512-+SNpBb4XrQlWzRQK9lfdJqA9IfJrlgoqmHwPDgf3Q+P922MzO33TgDlZWbeE7MzVj2y2WmNsPuCKwhjSjSL2rw== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" sweetalert2 "^11.3.6" -"@abp/timeago@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-5.3.0.tgz#3aaef3edca333224ba6b3e81c8ad1ebaae51a2f4" - integrity sha512-FxtoPYxyk2CHeoloC6kaeCj5YtXH0rebhOEaCjrfyg9/Ec6LEkvpfC7RWlcsHaEUAtFXZegJDfOk066EPH7RHQ== +"@abp/timeago@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-6.0.0-rc.3.tgz#0ef8c4801bfd4623e6895b1d047b1437063bda53" + integrity sha512-P3YRDVKjR5/Fz+cXiPg3IiUr7XGbNh7mgmJ1ywRXmKVmVMJmhQ2RsKmmtkGJn4TfVHu/l5iJXe4rqgL21/yX/g== dependencies: - "@abp/jquery" "~5.3.0" + "@abp/jquery" "~6.0.0-rc.3" timeago "^1.6.7" -"@abp/toastr@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-5.3.0.tgz#8a002c19ea25ac6b042a25c0f9d289d03c93c2fb" - integrity sha512-gjb2O/XrYkX8IeCERIqlOYPh15WlF9LxGR6t9jeVF/p6BTX/yaWabYCFfB9SkU2pQ6xrGl7WmSTAC06JOAtPTA== +"@abp/toastr@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-6.0.0-rc.3.tgz#6010d4247937531ebf7c8659d6254cd3db6c4855" + integrity sha512-sC9eCzYVgDrLSFIhJGe9hshzfwA1BkZNah4NQhyq+V6HQ8YF7goMS79N+/XmSoLQ9zzRhusqnPFnb+4FHjr7iA== dependencies: - "@abp/jquery" "~5.3.0" + "@abp/jquery" "~6.0.0-rc.3" toastr "^2.1.4" -"@abp/tui-editor@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/tui-editor/-/tui-editor-5.3.0.tgz#99969b636687a6ca4fc651129d12b8a19499c32c" - integrity sha512-FldoVDpVnbBd7jirGnsVDho9hV6Qg2lU4YB5iUgkuMjAEVO/QOb25FK4Fei1jwioE6fjbyF9cwG7WDnG/YEc3g== +"@abp/tui-editor@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/tui-editor/-/tui-editor-6.0.0-rc.3.tgz#7e913a80139af381d881f2b0205d4938ec6f6ca3" + integrity sha512-FC+gyHMn/FecAb8sVNFwf9FcJ035Lqm+LwiIXckS2VaSTbuKna0K/ADlOoSr1Ntwe5GWptZ93STIgSt1QJPdEw== dependencies: - "@abp/jquery" "~5.3.0" - "@abp/prismjs" "~5.3.0" + "@abp/jquery" "~6.0.0-rc.3" + "@abp/prismjs" "~6.0.0-rc.3" -"@abp/uppy@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/uppy/-/uppy-5.3.0.tgz#af4174021849538fe54a46be9325bb6419618ac8" - integrity sha512-5fP/Warb1SWk+ChkMOLa400uv6S5UTC0ujvDUtkPmR6Q7TY4gtg8Eg9VNQJMLBtcC9t3431OjOfP6J+MdUt8CQ== +"@abp/uppy@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/uppy/-/uppy-6.0.0-rc.3.tgz#9b978aa86ef4721a4e7b534e92d717c6f594873d" + integrity sha512-RDj30BLUJIQYWUMsJOC6Px0Ez4qqMYBsodmp6SpnayI8V+PRLYBkHvRQGE4cgul9lpMMcAO87fohpL9w0oRm8w== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" uppy "^1.16.1" -"@abp/utils@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-5.3.0.tgz#e93739074a3cd445a5a221209506b7e663050ca0" - integrity sha512-Nm+h+3PL10+rBFSh8UUuenmGM+OBlEoNQeGzHRmhOc6hJ3oqCogPzY+zkq0e4pksrwhjxAu/cgCEGLAoEXXycw== +"@abp/utils@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-6.0.0-rc.3.tgz#6d3515694314175218606e9518618ce335b4b360" + integrity sha512-K2geJ9P1ztk4Ehzb9YG3CqqLOi+z8/4iBLUzooNZLQqS+KdlUhCmqfuCoI/A5Aq9DGbTYesalp+Fwoh3S2Dl8A== dependencies: just-compare "^1.3.0" diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Contents/ContentWidgetDto.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Contents/ContentWidgetDto.cs new file mode 100644 index 0000000000..dd6a54722e --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Contents/ContentWidgetDto.cs @@ -0,0 +1,12 @@ +using System; +using Volo.CmsKit.Contents; + +namespace Volo.CmsKit.Admin.Contents; + +[Serializable] +public class ContentWidgetDto +{ + public string Key { get; set; } + + public WidgetDetailDto Details { get; set; } +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Tags/EntityTagSetDto.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Tags/EntityTagSetDto.cs index 245526cfc2..11466463f8 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Tags/EntityTagSetDto.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Tags/EntityTagSetDto.cs @@ -1,15 +1,40 @@ using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using System.ComponentModel.DataAnnotations; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Localization; +using Volo.Abp.Validation.Localization; +using Volo.CmsKit.Localization; +using Volo.CmsKit.Tags; namespace Volo.CmsKit.Admin.Tags; [Serializable] -public class EntityTagSetDto +public class EntityTagSetDto : IValidatableObject { public string EntityId { get; set; } + public string EntityType { get; set; } + + [Required] public List Tags { get; set; } + + public IEnumerable Validate(ValidationContext validationContext) + { + var l = validationContext.GetRequiredService>(); + + foreach (var tag in Tags) + { + if (tag.Length > TagConsts.MaxNameLength) + { + yield return new ValidationResult( + l[ + "ThisFieldMustBeAStringWithAMaximumLengthOf{0}", + TagConsts.MaxNameLength + ], + new[] { nameof(Tags) } + ); + } + } + } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo.CmsKit.Admin.Application.abppkg.analyze.json b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo.CmsKit.Admin.Application.abppkg.analyze.json index a24b8b89cb..7a3207da51 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo.CmsKit.Admin.Application.abppkg.analyze.json +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo.CmsKit.Admin.Application.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.CmsKit.Admin.Application", - "hash": "26aaaf7203b92c171ba27f811f10b409", + "hash": "d397763f02ef471e9dd35eb1f819db29", "contents": [ { "namespace": "Volo.CmsKit.Admin", @@ -21,12 +21,12 @@ "summary": null, "implementingInterfaces": [ "Volo.CmsKit.Admin.Tags.ITagAdminAppService", - "Volo.Abp.Application.Services.ICrudAppService`5[[Volo.CmsKit.Tags.TagDto, Volo.CmsKit.Common.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null],[System.Guid, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[Volo.CmsKit.Admin.Tags.TagGetListInput, Volo.CmsKit.Admin.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null],[Volo.CmsKit.Admin.Tags.TagCreateDto, Volo.CmsKit.Admin.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null],[Volo.CmsKit.Admin.Tags.TagUpdateDto, Volo.CmsKit.Admin.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null]]", - "Volo.Abp.Application.Services.ICrudAppService`6[[Volo.CmsKit.Tags.TagDto, Volo.CmsKit.Common.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null],[Volo.CmsKit.Tags.TagDto, Volo.CmsKit.Common.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null],[System.Guid, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[Volo.CmsKit.Admin.Tags.TagGetListInput, Volo.CmsKit.Admin.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null],[Volo.CmsKit.Admin.Tags.TagCreateDto, Volo.CmsKit.Admin.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null],[Volo.CmsKit.Admin.Tags.TagUpdateDto, Volo.CmsKit.Admin.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null]]", - "Volo.Abp.Application.Services.IReadOnlyAppService`4[[Volo.CmsKit.Tags.TagDto, Volo.CmsKit.Common.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null],[Volo.CmsKit.Tags.TagDto, Volo.CmsKit.Common.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null],[System.Guid, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[Volo.CmsKit.Admin.Tags.TagGetListInput, Volo.CmsKit.Admin.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null]]", - "Volo.Abp.Application.Services.ICreateUpdateAppService`4[[Volo.CmsKit.Tags.TagDto, Volo.CmsKit.Common.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null],[System.Guid, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[Volo.CmsKit.Admin.Tags.TagCreateDto, Volo.CmsKit.Admin.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null],[Volo.CmsKit.Admin.Tags.TagUpdateDto, Volo.CmsKit.Admin.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null]]", - "Volo.Abp.Application.Services.ICreateAppService`2[[Volo.CmsKit.Tags.TagDto, Volo.CmsKit.Common.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null],[Volo.CmsKit.Admin.Tags.TagCreateDto, Volo.CmsKit.Admin.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null]]", - "Volo.Abp.Application.Services.IUpdateAppService`3[[Volo.CmsKit.Tags.TagDto, Volo.CmsKit.Common.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null],[System.Guid, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[Volo.CmsKit.Admin.Tags.TagUpdateDto, Volo.CmsKit.Admin.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null]]", + "Volo.Abp.Application.Services.ICrudAppService`5[[Volo.CmsKit.Tags.TagDto, Volo.CmsKit.Common.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null],[System.Guid, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[Volo.CmsKit.Admin.Tags.TagGetListInput, Volo.CmsKit.Admin.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null],[Volo.CmsKit.Admin.Tags.TagCreateDto, Volo.CmsKit.Admin.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null],[Volo.CmsKit.Admin.Tags.TagUpdateDto, Volo.CmsKit.Admin.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null]]", + "Volo.Abp.Application.Services.ICrudAppService`6[[Volo.CmsKit.Tags.TagDto, Volo.CmsKit.Common.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null],[Volo.CmsKit.Tags.TagDto, Volo.CmsKit.Common.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null],[System.Guid, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[Volo.CmsKit.Admin.Tags.TagGetListInput, Volo.CmsKit.Admin.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null],[Volo.CmsKit.Admin.Tags.TagCreateDto, Volo.CmsKit.Admin.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null],[Volo.CmsKit.Admin.Tags.TagUpdateDto, Volo.CmsKit.Admin.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null]]", + "Volo.Abp.Application.Services.IReadOnlyAppService`4[[Volo.CmsKit.Tags.TagDto, Volo.CmsKit.Common.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null],[Volo.CmsKit.Tags.TagDto, Volo.CmsKit.Common.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null],[System.Guid, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[Volo.CmsKit.Admin.Tags.TagGetListInput, Volo.CmsKit.Admin.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null]]", + "Volo.Abp.Application.Services.ICreateUpdateAppService`4[[Volo.CmsKit.Tags.TagDto, Volo.CmsKit.Common.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null],[System.Guid, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[Volo.CmsKit.Admin.Tags.TagCreateDto, Volo.CmsKit.Admin.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null],[Volo.CmsKit.Admin.Tags.TagUpdateDto, Volo.CmsKit.Admin.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null]]", + "Volo.Abp.Application.Services.ICreateAppService`2[[Volo.CmsKit.Tags.TagDto, Volo.CmsKit.Common.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null],[Volo.CmsKit.Admin.Tags.TagCreateDto, Volo.CmsKit.Admin.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null]]", + "Volo.Abp.Application.Services.IUpdateAppService`3[[Volo.CmsKit.Tags.TagDto, Volo.CmsKit.Common.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null],[System.Guid, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[Volo.CmsKit.Admin.Tags.TagUpdateDto, Volo.CmsKit.Admin.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null]]", "Volo.Abp.Application.Services.IDeleteAppService`1[[System.Guid, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]]" ], "contentType": "applicationService", @@ -37,11 +37,11 @@ "summary": null, "implementingInterfaces": [ "Volo.CmsKit.Admin.Pages.IPageAdminAppService", - "Volo.Abp.Application.Services.ICrudAppService`6[[Volo.CmsKit.Admin.Pages.PageDto, Volo.CmsKit.Admin.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null],[Volo.CmsKit.Admin.Pages.PageDto, Volo.CmsKit.Admin.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null],[System.Guid, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[Volo.CmsKit.Admin.Pages.GetPagesInputDto, Volo.CmsKit.Admin.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null],[Volo.CmsKit.Admin.Pages.CreatePageInputDto, Volo.CmsKit.Admin.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null],[Volo.CmsKit.Admin.Pages.UpdatePageInputDto, Volo.CmsKit.Admin.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null]]", - "Volo.Abp.Application.Services.IReadOnlyAppService`4[[Volo.CmsKit.Admin.Pages.PageDto, Volo.CmsKit.Admin.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null],[Volo.CmsKit.Admin.Pages.PageDto, Volo.CmsKit.Admin.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null],[System.Guid, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[Volo.CmsKit.Admin.Pages.GetPagesInputDto, Volo.CmsKit.Admin.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null]]", - "Volo.Abp.Application.Services.ICreateUpdateAppService`4[[Volo.CmsKit.Admin.Pages.PageDto, Volo.CmsKit.Admin.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null],[System.Guid, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[Volo.CmsKit.Admin.Pages.CreatePageInputDto, Volo.CmsKit.Admin.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null],[Volo.CmsKit.Admin.Pages.UpdatePageInputDto, Volo.CmsKit.Admin.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null]]", - "Volo.Abp.Application.Services.ICreateAppService`2[[Volo.CmsKit.Admin.Pages.PageDto, Volo.CmsKit.Admin.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null],[Volo.CmsKit.Admin.Pages.CreatePageInputDto, Volo.CmsKit.Admin.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null]]", - "Volo.Abp.Application.Services.IUpdateAppService`3[[Volo.CmsKit.Admin.Pages.PageDto, Volo.CmsKit.Admin.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null],[System.Guid, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[Volo.CmsKit.Admin.Pages.UpdatePageInputDto, Volo.CmsKit.Admin.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null]]", + "Volo.Abp.Application.Services.ICrudAppService`6[[Volo.CmsKit.Admin.Pages.PageDto, Volo.CmsKit.Admin.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null],[Volo.CmsKit.Admin.Pages.PageDto, Volo.CmsKit.Admin.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null],[System.Guid, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[Volo.CmsKit.Admin.Pages.GetPagesInputDto, Volo.CmsKit.Admin.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null],[Volo.CmsKit.Admin.Pages.CreatePageInputDto, Volo.CmsKit.Admin.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null],[Volo.CmsKit.Admin.Pages.UpdatePageInputDto, Volo.CmsKit.Admin.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null]]", + "Volo.Abp.Application.Services.IReadOnlyAppService`4[[Volo.CmsKit.Admin.Pages.PageDto, Volo.CmsKit.Admin.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null],[Volo.CmsKit.Admin.Pages.PageDto, Volo.CmsKit.Admin.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null],[System.Guid, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[Volo.CmsKit.Admin.Pages.GetPagesInputDto, Volo.CmsKit.Admin.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null]]", + "Volo.Abp.Application.Services.ICreateUpdateAppService`4[[Volo.CmsKit.Admin.Pages.PageDto, Volo.CmsKit.Admin.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null],[System.Guid, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[Volo.CmsKit.Admin.Pages.CreatePageInputDto, Volo.CmsKit.Admin.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null],[Volo.CmsKit.Admin.Pages.UpdatePageInputDto, Volo.CmsKit.Admin.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null]]", + "Volo.Abp.Application.Services.ICreateAppService`2[[Volo.CmsKit.Admin.Pages.PageDto, Volo.CmsKit.Admin.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null],[Volo.CmsKit.Admin.Pages.CreatePageInputDto, Volo.CmsKit.Admin.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null]]", + "Volo.Abp.Application.Services.IUpdateAppService`3[[Volo.CmsKit.Admin.Pages.PageDto, Volo.CmsKit.Admin.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null],[System.Guid, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[Volo.CmsKit.Admin.Pages.UpdatePageInputDto, Volo.CmsKit.Admin.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null]]", "Volo.Abp.Application.Services.IDeleteAppService`1[[System.Guid, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]]" ], "contentType": "applicationService", @@ -65,6 +65,15 @@ "contentType": "applicationService", "name": "MediaDescriptorAdminAppService" }, + { + "namespace": "Volo.CmsKit.Admin.GlobalResources", + "summary": null, + "implementingInterfaces": [ + "Volo.CmsKit.Admin.GlobalResources.IGlobalResourceAdminAppService" + ], + "contentType": "applicationService", + "name": "GlobalResourceAdminAppService" + }, { "namespace": "Volo.CmsKit.Admin.Comments", "summary": null, @@ -79,12 +88,12 @@ "summary": null, "implementingInterfaces": [ "Volo.CmsKit.Admin.Blogs.IBlogAdminAppService", - "Volo.Abp.Application.Services.ICrudAppService`5[[Volo.CmsKit.Admin.Blogs.BlogDto, Volo.CmsKit.Admin.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null],[System.Guid, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[Volo.CmsKit.Admin.Blogs.BlogGetListInput, Volo.CmsKit.Admin.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null],[Volo.CmsKit.Admin.Blogs.CreateBlogDto, Volo.CmsKit.Admin.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null],[Volo.CmsKit.Admin.Blogs.UpdateBlogDto, Volo.CmsKit.Admin.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null]]", - "Volo.Abp.Application.Services.ICrudAppService`6[[Volo.CmsKit.Admin.Blogs.BlogDto, Volo.CmsKit.Admin.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null],[Volo.CmsKit.Admin.Blogs.BlogDto, Volo.CmsKit.Admin.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null],[System.Guid, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[Volo.CmsKit.Admin.Blogs.BlogGetListInput, Volo.CmsKit.Admin.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null],[Volo.CmsKit.Admin.Blogs.CreateBlogDto, Volo.CmsKit.Admin.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null],[Volo.CmsKit.Admin.Blogs.UpdateBlogDto, Volo.CmsKit.Admin.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null]]", - "Volo.Abp.Application.Services.IReadOnlyAppService`4[[Volo.CmsKit.Admin.Blogs.BlogDto, Volo.CmsKit.Admin.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null],[Volo.CmsKit.Admin.Blogs.BlogDto, Volo.CmsKit.Admin.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null],[System.Guid, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[Volo.CmsKit.Admin.Blogs.BlogGetListInput, Volo.CmsKit.Admin.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null]]", - "Volo.Abp.Application.Services.ICreateUpdateAppService`4[[Volo.CmsKit.Admin.Blogs.BlogDto, Volo.CmsKit.Admin.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null],[System.Guid, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[Volo.CmsKit.Admin.Blogs.CreateBlogDto, Volo.CmsKit.Admin.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null],[Volo.CmsKit.Admin.Blogs.UpdateBlogDto, Volo.CmsKit.Admin.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null]]", - "Volo.Abp.Application.Services.ICreateAppService`2[[Volo.CmsKit.Admin.Blogs.BlogDto, Volo.CmsKit.Admin.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null],[Volo.CmsKit.Admin.Blogs.CreateBlogDto, Volo.CmsKit.Admin.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null]]", - "Volo.Abp.Application.Services.IUpdateAppService`3[[Volo.CmsKit.Admin.Blogs.BlogDto, Volo.CmsKit.Admin.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null],[System.Guid, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[Volo.CmsKit.Admin.Blogs.UpdateBlogDto, Volo.CmsKit.Admin.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null]]", + "Volo.Abp.Application.Services.ICrudAppService`5[[Volo.CmsKit.Admin.Blogs.BlogDto, Volo.CmsKit.Admin.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null],[System.Guid, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[Volo.CmsKit.Admin.Blogs.BlogGetListInput, Volo.CmsKit.Admin.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null],[Volo.CmsKit.Admin.Blogs.CreateBlogDto, Volo.CmsKit.Admin.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null],[Volo.CmsKit.Admin.Blogs.UpdateBlogDto, Volo.CmsKit.Admin.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null]]", + "Volo.Abp.Application.Services.ICrudAppService`6[[Volo.CmsKit.Admin.Blogs.BlogDto, Volo.CmsKit.Admin.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null],[Volo.CmsKit.Admin.Blogs.BlogDto, Volo.CmsKit.Admin.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null],[System.Guid, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[Volo.CmsKit.Admin.Blogs.BlogGetListInput, Volo.CmsKit.Admin.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null],[Volo.CmsKit.Admin.Blogs.CreateBlogDto, Volo.CmsKit.Admin.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null],[Volo.CmsKit.Admin.Blogs.UpdateBlogDto, Volo.CmsKit.Admin.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null]]", + "Volo.Abp.Application.Services.IReadOnlyAppService`4[[Volo.CmsKit.Admin.Blogs.BlogDto, Volo.CmsKit.Admin.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null],[Volo.CmsKit.Admin.Blogs.BlogDto, Volo.CmsKit.Admin.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null],[System.Guid, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[Volo.CmsKit.Admin.Blogs.BlogGetListInput, Volo.CmsKit.Admin.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null]]", + "Volo.Abp.Application.Services.ICreateUpdateAppService`4[[Volo.CmsKit.Admin.Blogs.BlogDto, Volo.CmsKit.Admin.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null],[System.Guid, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[Volo.CmsKit.Admin.Blogs.CreateBlogDto, Volo.CmsKit.Admin.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null],[Volo.CmsKit.Admin.Blogs.UpdateBlogDto, Volo.CmsKit.Admin.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null]]", + "Volo.Abp.Application.Services.ICreateAppService`2[[Volo.CmsKit.Admin.Blogs.BlogDto, Volo.CmsKit.Admin.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null],[Volo.CmsKit.Admin.Blogs.CreateBlogDto, Volo.CmsKit.Admin.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null]]", + "Volo.Abp.Application.Services.IUpdateAppService`3[[Volo.CmsKit.Admin.Blogs.BlogDto, Volo.CmsKit.Admin.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null],[System.Guid, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[Volo.CmsKit.Admin.Blogs.UpdateBlogDto, Volo.CmsKit.Admin.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null]]", "Volo.Abp.Application.Services.IDeleteAppService`1[[System.Guid, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]]" ], "contentType": "applicationService", @@ -104,11 +113,11 @@ "summary": null, "implementingInterfaces": [ "Volo.CmsKit.Admin.Blogs.IBlogPostAdminAppService", - "Volo.Abp.Application.Services.ICrudAppService`6[[Volo.CmsKit.Admin.Blogs.BlogPostDto, Volo.CmsKit.Admin.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null],[Volo.CmsKit.Admin.Blogs.BlogPostListDto, Volo.CmsKit.Admin.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null],[System.Guid, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[Volo.CmsKit.Admin.Blogs.BlogPostGetListInput, Volo.CmsKit.Admin.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null],[Volo.CmsKit.Admin.Blogs.CreateBlogPostDto, Volo.CmsKit.Admin.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null],[Volo.CmsKit.Admin.Blogs.UpdateBlogPostDto, Volo.CmsKit.Admin.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null]]", - "Volo.Abp.Application.Services.IReadOnlyAppService`4[[Volo.CmsKit.Admin.Blogs.BlogPostDto, Volo.CmsKit.Admin.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null],[Volo.CmsKit.Admin.Blogs.BlogPostListDto, Volo.CmsKit.Admin.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null],[System.Guid, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[Volo.CmsKit.Admin.Blogs.BlogPostGetListInput, Volo.CmsKit.Admin.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null]]", - "Volo.Abp.Application.Services.ICreateUpdateAppService`4[[Volo.CmsKit.Admin.Blogs.BlogPostDto, Volo.CmsKit.Admin.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null],[System.Guid, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[Volo.CmsKit.Admin.Blogs.CreateBlogPostDto, Volo.CmsKit.Admin.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null],[Volo.CmsKit.Admin.Blogs.UpdateBlogPostDto, Volo.CmsKit.Admin.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null]]", - "Volo.Abp.Application.Services.ICreateAppService`2[[Volo.CmsKit.Admin.Blogs.BlogPostDto, Volo.CmsKit.Admin.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null],[Volo.CmsKit.Admin.Blogs.CreateBlogPostDto, Volo.CmsKit.Admin.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null]]", - "Volo.Abp.Application.Services.IUpdateAppService`3[[Volo.CmsKit.Admin.Blogs.BlogPostDto, Volo.CmsKit.Admin.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null],[System.Guid, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[Volo.CmsKit.Admin.Blogs.UpdateBlogPostDto, Volo.CmsKit.Admin.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null]]", + "Volo.Abp.Application.Services.ICrudAppService`6[[Volo.CmsKit.Admin.Blogs.BlogPostDto, Volo.CmsKit.Admin.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null],[Volo.CmsKit.Admin.Blogs.BlogPostListDto, Volo.CmsKit.Admin.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null],[System.Guid, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[Volo.CmsKit.Admin.Blogs.BlogPostGetListInput, Volo.CmsKit.Admin.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null],[Volo.CmsKit.Admin.Blogs.CreateBlogPostDto, Volo.CmsKit.Admin.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null],[Volo.CmsKit.Admin.Blogs.UpdateBlogPostDto, Volo.CmsKit.Admin.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null]]", + "Volo.Abp.Application.Services.IReadOnlyAppService`4[[Volo.CmsKit.Admin.Blogs.BlogPostDto, Volo.CmsKit.Admin.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null],[Volo.CmsKit.Admin.Blogs.BlogPostListDto, Volo.CmsKit.Admin.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null],[System.Guid, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[Volo.CmsKit.Admin.Blogs.BlogPostGetListInput, Volo.CmsKit.Admin.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null]]", + "Volo.Abp.Application.Services.ICreateUpdateAppService`4[[Volo.CmsKit.Admin.Blogs.BlogPostDto, Volo.CmsKit.Admin.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null],[System.Guid, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[Volo.CmsKit.Admin.Blogs.CreateBlogPostDto, Volo.CmsKit.Admin.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null],[Volo.CmsKit.Admin.Blogs.UpdateBlogPostDto, Volo.CmsKit.Admin.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null]]", + "Volo.Abp.Application.Services.ICreateAppService`2[[Volo.CmsKit.Admin.Blogs.BlogPostDto, Volo.CmsKit.Admin.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null],[Volo.CmsKit.Admin.Blogs.CreateBlogPostDto, Volo.CmsKit.Admin.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null]]", + "Volo.Abp.Application.Services.IUpdateAppService`3[[Volo.CmsKit.Admin.Blogs.BlogPostDto, Volo.CmsKit.Admin.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null],[System.Guid, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[Volo.CmsKit.Admin.Blogs.UpdateBlogPostDto, Volo.CmsKit.Admin.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null]]", "Volo.Abp.Application.Services.IDeleteAppService`1[[System.Guid, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]]" ], "contentType": "applicationService", diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo.CmsKit.Admin.Application.csproj b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo.CmsKit.Admin.Application.csproj index 684446b1f0..09faad6247 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo.CmsKit.Admin.Application.csproj +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo.CmsKit.Admin.Application.csproj @@ -13,4 +13,8 @@ + + + + diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogAdminAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogAdminAppService.cs index 7cd17b7696..5736048076 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogAdminAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogAdminAppService.cs @@ -1,16 +1,19 @@ -using Microsoft.AspNetCore.Authorization; -using System; +using System; using System.Collections.Generic; using System.Threading.Tasks; +using Microsoft.AspNetCore.Authorization; using Volo.Abp.Application.Dtos; using Volo.Abp.Data; +using Volo.Abp.Features; using Volo.Abp.GlobalFeatures; using Volo.CmsKit.Blogs; +using Volo.CmsKit.Features; using Volo.CmsKit.GlobalFeatures; using Volo.CmsKit.Permissions; namespace Volo.CmsKit.Admin.Blogs; +[RequiresFeature(CmsKitFeatures.BlogEnable)] [RequiresGlobalFeature(typeof(BlogsFeature))] [Authorize(CmsKitAdminPermissions.Blogs.Default)] public class BlogAdminAppService : CmsKitAdminAppServiceBase, IBlogAdminAppService diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogFeatureAdminAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogFeatureAdminAppService.cs index 823f569bed..774f28634d 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogFeatureAdminAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogFeatureAdminAppService.cs @@ -1,15 +1,18 @@ -using Microsoft.AspNetCore.Authorization; -using System; +using System; using System.Collections.Generic; using System.Threading.Tasks; +using Microsoft.AspNetCore.Authorization; using Volo.Abp.EventBus.Distributed; +using Volo.Abp.Features; using Volo.Abp.GlobalFeatures; using Volo.CmsKit.Blogs; +using Volo.CmsKit.Features; using Volo.CmsKit.GlobalFeatures; using Volo.CmsKit.Permissions; namespace Volo.CmsKit.Admin.Blogs; +[RequiresFeature(CmsKitFeatures.BlogEnable)] [RequiresGlobalFeature(typeof(BlogsFeature))] [Authorize(CmsKitAdminPermissions.Blogs.Features)] public class BlogFeatureAdminAppService : CmsKitAdminAppServiceBase, IBlogFeatureAdminAppService diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs index 9d8fcfd917..297e70344f 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs @@ -1,19 +1,22 @@ -using Microsoft.AspNetCore.Authorization; -using System; +using System; using System.Linq; using System.Threading.Tasks; +using Microsoft.AspNetCore.Authorization; using Volo.Abp.Application.Dtos; using Volo.Abp.Data; +using Volo.Abp.Features; using Volo.Abp.GlobalFeatures; using Volo.Abp.Users; using Volo.CmsKit.Admin.MediaDescriptors; using Volo.CmsKit.Blogs; +using Volo.CmsKit.Features; using Volo.CmsKit.GlobalFeatures; using Volo.CmsKit.Permissions; using Volo.CmsKit.Users; namespace Volo.CmsKit.Admin.Blogs; +[RequiresFeature(CmsKitFeatures.BlogEnable)] [RequiresGlobalFeature(typeof(BlogsFeature))] [Authorize(CmsKitAdminPermissions.BlogPosts.Default)] public class BlogPostAdminAppService : CmsKitAppServiceBase, IBlogPostAdminAppService @@ -66,18 +69,18 @@ public class BlogPostAdminAppService : CmsKitAppServiceBase, IBlogPostAdminAppSe public virtual async Task UpdateAsync(Guid id, UpdateBlogPostDto input) { var blogPost = await BlogPostRepository.GetAsync(id); - + blogPost.SetTitle(input.Title); blogPost.SetShortDescription(input.ShortDescription); blogPost.SetContent(input.Content); blogPost.SetConcurrencyStampIfNotNull(input.ConcurrencyStamp); - + if (blogPost.CoverImageMediaId != null && input.CoverImageMediaId == null) { await MediaDescriptorAdminAppService.DeleteAsync(blogPost.CoverImageMediaId.Value); } blogPost.CoverImageMediaId = input.CoverImageMediaId; - + if (blogPost.Slug != input.Slug) { await BlogPostManager.SetSlugUrlAsync(blogPost, input.Slug); @@ -146,12 +149,12 @@ public class BlogPostAdminAppService : CmsKitAppServiceBase, IBlogPostAdminAppSe { var blogPost = await CreateAsync(input); await CurrentUnitOfWork.SaveChangesAsync(); - + await PublishAsync(blogPost.Id); blogPost.Status = BlogPostStatus.Published; return blogPost; } - + [Authorize(CmsKitAdminPermissions.BlogPosts.Create)] public virtual async Task SendToReviewAsync(Guid id) { @@ -159,13 +162,13 @@ public class BlogPostAdminAppService : CmsKitAppServiceBase, IBlogPostAdminAppSe blogPost.SetWaitingForReview(); await BlogPostRepository.UpdateAsync(blogPost); } - + [Authorize(CmsKitAdminPermissions.BlogPosts.Create)] public virtual async Task CreateAndSendToReviewAsync(CreateBlogPostDto input) { var blogPost = await CreateAsync(input); await CurrentUnitOfWork.SaveChangesAsync(); - + await SendToReviewAsync(blogPost.Id); blogPost.Status = BlogPostStatus.WaitingForReview; return blogPost; diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Comments/CommentAdminAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Comments/CommentAdminAppService.cs index 5295557860..973a74b58e 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Comments/CommentAdminAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Comments/CommentAdminAppService.cs @@ -3,14 +3,17 @@ using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Authorization; using Volo.Abp.Application.Dtos; +using Volo.Abp.Features; using Volo.Abp.GlobalFeatures; using Volo.CmsKit.Comments; +using Volo.CmsKit.Features; using Volo.CmsKit.GlobalFeatures; using Volo.CmsKit.Permissions; using Volo.CmsKit.Users; namespace Volo.CmsKit.Admin.Comments; +[RequiresFeature(CmsKitFeatures.CommentEnable)] [RequiresGlobalFeature(typeof(CommentsFeature))] [Authorize(CmsKitAdminPermissions.Comments.Default)] public class CommentAdminAppService : CmsKitAdminAppServiceBase, ICommentAdminAppService diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/GlobalResources/GlobalResourceAdminAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/GlobalResources/GlobalResourceAdminAppService.cs index a78a21de41..c5b63db6c3 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/GlobalResources/GlobalResourceAdminAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/GlobalResources/GlobalResourceAdminAppService.cs @@ -1,13 +1,16 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Authorization; using Volo.Abp.Application.Services; +using Volo.Abp.Features; using Volo.Abp.GlobalFeatures; +using Volo.CmsKit.Features; using Volo.CmsKit.GlobalFeatures; using Volo.CmsKit.GlobalResources; using Volo.CmsKit.Permissions; namespace Volo.CmsKit.Admin.GlobalResources; +[RequiresFeature(CmsKitFeatures.GlobalResourceEnable)] [RequiresGlobalFeature(typeof(GlobalResourcesFeature))] [Authorize(CmsKitAdminPermissions.GlobalResources.Default)] public class GlobalResourceAdminAppService : ApplicationService, IGlobalResourceAdminAppService @@ -18,10 +21,11 @@ public class GlobalResourceAdminAppService : ApplicationService, IGlobalResource { GlobalResourceManager = globalResourceManager; } - + public async Task GetAsync() { - return new GlobalResourcesDto { + return new GlobalResourcesDto + { StyleContent = (await GlobalResourceManager.GetGlobalStyleAsync()).Value, ScriptContent = (await GlobalResourceManager.GetGlobalScriptAsync()).Value }; diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/MediaDescriptors/MediaDescriptorAdminAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/MediaDescriptors/MediaDescriptorAdminAppService.cs index cc785adac0..af347bcc55 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/MediaDescriptors/MediaDescriptorAdminAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/MediaDescriptors/MediaDescriptorAdminAppService.cs @@ -1,12 +1,15 @@ using System; using System.Threading.Tasks; using Volo.Abp.BlobStoring; +using Volo.Abp.Features; using Volo.Abp.GlobalFeatures; +using Volo.CmsKit.Features; using Volo.CmsKit.GlobalFeatures; using Volo.CmsKit.MediaDescriptors; namespace Volo.CmsKit.Admin.MediaDescriptors; +[RequiresFeature(CmsKitFeatures.MediaEnable)] [RequiresGlobalFeature(typeof(MediaFeature))] public class MediaDescriptorAdminAppService : CmsKitAdminAppServiceBase, IMediaDescriptorAdminAppService { diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Menus/MenuItemAdminAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Menus/MenuItemAdminAppService.cs index 8ef6ce0346..3ba2a4b5b9 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Menus/MenuItemAdminAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Menus/MenuItemAdminAppService.cs @@ -1,12 +1,12 @@ -using Microsoft.AspNetCore.Authorization; -using System; +using System; using System.Collections.Generic; -using System.Linq; -using System.Text; using System.Threading.Tasks; +using Microsoft.AspNetCore.Authorization; using Volo.Abp.Application.Dtos; using Volo.Abp.Data; +using Volo.Abp.Features; using Volo.Abp.GlobalFeatures; +using Volo.CmsKit.Features; using Volo.CmsKit.GlobalFeatures; using Volo.CmsKit.Menus; using Volo.CmsKit.Pages; @@ -14,6 +14,7 @@ using Volo.CmsKit.Permissions; namespace Volo.CmsKit.Admin.Menus; +[RequiresFeature(CmsKitFeatures.MenuEnable)] [RequiresGlobalFeature(typeof(MenuFeature))] [Authorize(CmsKitAdminPermissions.Menus.Default)] public class MenuItemAdminAppService : CmsKitAdminAppServiceBase, IMenuItemAdminAppService diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Pages/PageAdminAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Pages/PageAdminAppService.cs index 68f0690555..647568e561 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Pages/PageAdminAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Pages/PageAdminAppService.cs @@ -1,18 +1,19 @@ using System; using System.Collections.Generic; using System.Threading.Tasks; -using AutoMapper; using Microsoft.AspNetCore.Authorization; using Volo.Abp.Application.Dtos; using Volo.Abp.Data; +using Volo.Abp.Features; using Volo.Abp.GlobalFeatures; -using Volo.CmsKit.Admin.Menus; +using Volo.CmsKit.Features; using Volo.CmsKit.GlobalFeatures; using Volo.CmsKit.Pages; using Volo.CmsKit.Permissions; namespace Volo.CmsKit.Admin.Pages; +[RequiresFeature(CmsKitFeatures.PageEnable)] [RequiresGlobalFeature(typeof(PagesFeature))] [Authorize(CmsKitAdminPermissions.Pages.Default)] public class PageAdminAppService : CmsKitAdminAppServiceBase, IPageAdminAppService diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Tags/EntityTagAdminAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Tags/EntityTagAdminAppService.cs index 8d106b70e0..3cdc4dc093 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Tags/EntityTagAdminAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Tags/EntityTagAdminAppService.cs @@ -1,10 +1,13 @@ using System.Threading.Tasks; +using Volo.Abp.Features; using Volo.Abp.GlobalFeatures; +using Volo.CmsKit.Features; using Volo.CmsKit.GlobalFeatures; using Volo.CmsKit.Tags; namespace Volo.CmsKit.Admin.Tags; +[RequiresFeature(CmsKitFeatures.TagEnable)] [RequiresGlobalFeature(typeof(TagsFeature))] public class EntityTagAdminAppService : CmsKitAdminAppServiceBase, IEntityTagAdminAppService { diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Tags/TagAdminAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Tags/TagAdminAppService.cs index f6de1ac5b9..46324937cc 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Tags/TagAdminAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Tags/TagAdminAppService.cs @@ -1,18 +1,21 @@ -using Microsoft.AspNetCore.Authorization; -using Microsoft.Extensions.Localization; -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using Microsoft.AspNetCore.Authorization; +using Microsoft.Extensions.Localization; using Volo.Abp.Application.Dtos; using Volo.Abp.Data; +using Volo.Abp.Features; using Volo.Abp.GlobalFeatures; +using Volo.CmsKit.Features; using Volo.CmsKit.GlobalFeatures; using Volo.CmsKit.Permissions; using Volo.CmsKit.Tags; namespace Volo.CmsKit.Admin.Tags; +[RequiresFeature(CmsKitFeatures.TagEnable)] [Authorize(CmsKitAdminPermissions.Tags.Default)] [RequiresGlobalFeature(typeof(TagsFeature))] public class TagAdminAppService : CmsKitAppServiceBase, ITagAdminAppService diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/cms-kit-admin-generate-proxy.json b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/cms-kit-admin-generate-proxy.json index 0e93081b39..8a9e38e4f9 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/cms-kit-admin-generate-proxy.json +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/cms-kit-admin-generate-proxy.json @@ -1953,6 +1953,18 @@ "bindingSourceId": "ModelBinding", "descriptorName": "input" }, + { + "nameOnMethod": "input", + "name": "TagId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "input" + }, { "nameOnMethod": "input", "name": "Status", diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/Volo.CmsKit.Admin.HttpApi.Client.abppkg.analyze.json b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/Volo.CmsKit.Admin.HttpApi.Client.abppkg.analyze.json index baab75054d..67ed3e0f3b 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/Volo.CmsKit.Admin.HttpApi.Client.abppkg.analyze.json +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/Volo.CmsKit.Admin.HttpApi.Client.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.CmsKit.Admin.HttpApi.Client", - "hash": "d3e74606dde1a5099e9f02c0384b9057", + "hash": "e9b74f85924bb2ea21d651612c337c8d", "contents": [ { "namespace": "Volo.CmsKit.Admin", diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo.CmsKit.Admin.HttpApi.abppkg.analyze.json b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo.CmsKit.Admin.HttpApi.abppkg.analyze.json index 824c9d950a..8dcbb1dadd 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo.CmsKit.Admin.HttpApi.abppkg.analyze.json +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo.CmsKit.Admin.HttpApi.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.CmsKit.Admin.HttpApi", - "hash": "2db77730b823b6adecfe095f7a8a4449", + "hash": "613b16275c5d464aa927a53ca452f7ab", "contents": [ { "namespace": "Volo.CmsKit.Admin", diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Blogs/BlogAdminController.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Blogs/BlogAdminController.cs index 094c1b1b5a..e7d59ddbcd 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Blogs/BlogAdminController.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Blogs/BlogAdminController.cs @@ -1,15 +1,18 @@ -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; -using System; +using System; using System.Threading.Tasks; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; using Volo.Abp; using Volo.Abp.Application.Dtos; +using Volo.Abp.Features; using Volo.Abp.GlobalFeatures; +using Volo.CmsKit.Features; using Volo.CmsKit.GlobalFeatures; using Volo.CmsKit.Permissions; namespace Volo.CmsKit.Admin.Blogs; +[RequiresFeature(CmsKitFeatures.BlogEnable)] [RequiresGlobalFeature(typeof(BlogsFeature))] [RemoteService(Name = CmsKitAdminRemoteServiceConsts.RemoteServiceName)] [Area(CmsKitAdminRemoteServiceConsts.ModuleName)] diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Blogs/BlogFeatureAdminController.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Blogs/BlogFeatureAdminController.cs index e3cc3c5e73..93bdced888 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Blogs/BlogFeatureAdminController.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Blogs/BlogFeatureAdminController.cs @@ -1,16 +1,19 @@ -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; -using System; +using System; using System.Collections.Generic; using System.Threading.Tasks; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; using Volo.Abp; +using Volo.Abp.Features; using Volo.Abp.GlobalFeatures; using Volo.CmsKit.Blogs; +using Volo.CmsKit.Features; using Volo.CmsKit.GlobalFeatures; using Volo.CmsKit.Permissions; namespace Volo.CmsKit.Admin.Blogs; +[RequiresFeature(CmsKitFeatures.BlogEnable)] [RequiresGlobalFeature(typeof(BlogsFeature))] [RemoteService(Name = CmsKitAdminRemoteServiceConsts.RemoteServiceName)] [Area(CmsKitAdminRemoteServiceConsts.ModuleName)] diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Blogs/BlogPostAdminController.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Blogs/BlogPostAdminController.cs index 563d90c254..923f9a4036 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Blogs/BlogPostAdminController.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Blogs/BlogPostAdminController.cs @@ -1,15 +1,18 @@ -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; -using System; +using System; using System.Threading.Tasks; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; using Volo.Abp; using Volo.Abp.Application.Dtos; +using Volo.Abp.Features; using Volo.Abp.GlobalFeatures; +using Volo.CmsKit.Features; using Volo.CmsKit.GlobalFeatures; using Volo.CmsKit.Permissions; namespace Volo.CmsKit.Admin.Blogs; +[RequiresFeature(CmsKitFeatures.BlogEnable)] [RequiresGlobalFeature(typeof(BlogsFeature))] [RemoteService(Name = CmsKitAdminRemoteServiceConsts.RemoteServiceName)] [Area(CmsKitAdminRemoteServiceConsts.ModuleName)] @@ -61,7 +64,7 @@ public class BlogPostAdminController : CmsKitAdminController, IBlogPostAdminAppS { return BlogPostAdminAppService.UpdateAsync(id, input); } - + [HttpPost] [Route("{id}/publish")] [Authorize(CmsKitAdminPermissions.BlogPosts.Publish)] @@ -69,7 +72,7 @@ public class BlogPostAdminController : CmsKitAdminController, IBlogPostAdminAppS { return BlogPostAdminAppService.PublishAsync(id); } - + [HttpPost] [Route("{id}/draft")] [Authorize(CmsKitAdminPermissions.BlogPosts.Update)] @@ -86,7 +89,7 @@ public class BlogPostAdminController : CmsKitAdminController, IBlogPostAdminAppS { return BlogPostAdminAppService.CreateAndPublishAsync(input); } - + [HttpPost] [Route("{id}/send-to-review")] [Authorize(CmsKitAdminPermissions.BlogPosts.Create)] @@ -94,7 +97,7 @@ public class BlogPostAdminController : CmsKitAdminController, IBlogPostAdminAppS { return BlogPostAdminAppService.SendToReviewAsync(id); } - + [HttpPost] [Route("create-and-send-to-review")] [Authorize(CmsKitAdminPermissions.BlogPosts.Create)] @@ -102,7 +105,7 @@ public class BlogPostAdminController : CmsKitAdminController, IBlogPostAdminAppS { return BlogPostAdminAppService.CreateAndSendToReviewAsync(input); } - + [HttpGet] [Route("has-blogpost-waiting-for-review")] [Authorize(CmsKitAdminPermissions.BlogPosts.Publish)] diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Comments/CommentAdminController.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Comments/CommentAdminController.cs index 6082ad3794..f4813f61ad 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Comments/CommentAdminController.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Comments/CommentAdminController.cs @@ -4,12 +4,15 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Volo.Abp; using Volo.Abp.Application.Dtos; +using Volo.Abp.Features; using Volo.Abp.GlobalFeatures; +using Volo.CmsKit.Features; using Volo.CmsKit.GlobalFeatures; using Volo.CmsKit.Permissions; namespace Volo.CmsKit.Admin.Comments; +[RequiresFeature(CmsKitFeatures.CommentEnable)] [Authorize(CmsKitAdminPermissions.Comments.Default)] [RequiresGlobalFeature(typeof(CommentsFeature))] [RemoteService(Name = CmsKitAdminRemoteServiceConsts.RemoteServiceName)] diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/GlobalResources/GlobalResourceAdminController.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/GlobalResources/GlobalResourceAdminController.cs index 3bfe51a600..b1ae9b3f2e 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/GlobalResources/GlobalResourceAdminController.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/GlobalResources/GlobalResourceAdminController.cs @@ -2,18 +2,21 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Volo.Abp; +using Volo.Abp.Features; using Volo.Abp.GlobalFeatures; +using Volo.CmsKit.Features; using Volo.CmsKit.GlobalFeatures; using Volo.CmsKit.Permissions; namespace Volo.CmsKit.Admin.GlobalResources; +[RequiresFeature(CmsKitFeatures.GlobalResourceEnable)] [RequiresGlobalFeature(typeof(GlobalResourcesFeature))] [RemoteService(Name = CmsKitAdminRemoteServiceConsts.RemoteServiceName)] [Area(CmsKitAdminRemoteServiceConsts.ModuleName)] [Authorize(CmsKitAdminPermissions.Menus.Default)] [Route("api/cms-kit-admin/global-resources")] -public class GlobalResourceAdminController: CmsKitAdminController, IGlobalResourceAdminAppService +public class GlobalResourceAdminController : CmsKitAdminController, IGlobalResourceAdminAppService { private readonly IGlobalResourceAdminAppService _globalResourceAdminAppService; @@ -21,7 +24,7 @@ public class GlobalResourceAdminController: CmsKitAdminController, IGlobalResour { _globalResourceAdminAppService = globalResourceAdminAppService; } - + [HttpGet] public Task GetAsync() { diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/MediaDescriptors/MediaDescriptorAdminController.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/MediaDescriptors/MediaDescriptorAdminController.cs index f95d2a86b2..c304c5c684 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/MediaDescriptors/MediaDescriptorAdminController.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/MediaDescriptors/MediaDescriptorAdminController.cs @@ -1,16 +1,15 @@ using System; -using System.Net; using System.Threading.Tasks; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Volo.Abp; +using Volo.Abp.Features; using Volo.Abp.GlobalFeatures; +using Volo.CmsKit.Features; using Volo.CmsKit.GlobalFeatures; -using Volo.CmsKit.Permissions; namespace Volo.CmsKit.Admin.MediaDescriptors; +[RequiresFeature(CmsKitFeatures.MediaEnable)] [RequiresGlobalFeature(typeof(MediaFeature))] [RemoteService(Name = CmsKitAdminRemoteServiceConsts.RemoteServiceName)] [Area(CmsKitAdminRemoteServiceConsts.ModuleName)] diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Menus/MenuItemAdminController.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Menus/MenuItemAdminController.cs index de36883ff7..a0325f4f27 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Menus/MenuItemAdminController.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Menus/MenuItemAdminController.cs @@ -1,16 +1,19 @@ -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; -using System; +using System; using System.Threading.Tasks; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; using Volo.Abp; using Volo.Abp.Application.Dtos; +using Volo.Abp.Features; using Volo.Abp.GlobalFeatures; +using Volo.CmsKit.Features; using Volo.CmsKit.GlobalFeatures; using Volo.CmsKit.Menus; using Volo.CmsKit.Permissions; namespace Volo.CmsKit.Admin.Menus; +[RequiresFeature(CmsKitFeatures.MenuEnable)] [RequiresGlobalFeature(typeof(MenuFeature))] [RemoteService(Name = CmsKitAdminRemoteServiceConsts.RemoteServiceName)] [Area(CmsKitAdminRemoteServiceConsts.ModuleName)] diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Pages/PageAdminController.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Pages/PageAdminController.cs index 7936b206e6..5acccb07aa 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Pages/PageAdminController.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Pages/PageAdminController.cs @@ -4,13 +4,15 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Volo.Abp; using Volo.Abp.Application.Dtos; +using Volo.Abp.Features; using Volo.Abp.GlobalFeatures; -using Volo.CmsKit.Admin.Menus; +using Volo.CmsKit.Features; using Volo.CmsKit.GlobalFeatures; using Volo.CmsKit.Permissions; namespace Volo.CmsKit.Admin.Pages; +[RequiresFeature(CmsKitFeatures.PageEnable)] [RequiresGlobalFeature(typeof(PagesFeature))] [RemoteService(Name = CmsKitAdminRemoteServiceConsts.RemoteServiceName)] [Area(CmsKitAdminRemoteServiceConsts.ModuleName)] diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Tags/EntityTagAdminController.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Tags/EntityTagAdminController.cs index 9df9394fdd..c57e7bb0a7 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Tags/EntityTagAdminController.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Tags/EntityTagAdminController.cs @@ -1,13 +1,14 @@ -using Microsoft.AspNetCore.Authorization; +using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; -using System.Threading.Tasks; using Volo.Abp; +using Volo.Abp.Features; using Volo.Abp.GlobalFeatures; +using Volo.CmsKit.Features; using Volo.CmsKit.GlobalFeatures; -using Volo.CmsKit.Permissions; namespace Volo.CmsKit.Admin.Tags; +[RequiresFeature(CmsKitFeatures.TagEnable)] [RequiresGlobalFeature(typeof(TagsFeature))] [RemoteService(Name = CmsKitAdminRemoteServiceConsts.RemoteServiceName)] [Area(CmsKitAdminRemoteServiceConsts.ModuleName)] diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Tags/TagAdminController.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Tags/TagAdminController.cs index c34107b742..db0131ba2f 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Tags/TagAdminController.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Tags/TagAdminController.cs @@ -1,18 +1,20 @@ -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; -using System; +using System; using System.Collections.Generic; using System.Threading.Tasks; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; using Volo.Abp; using Volo.Abp.Application.Dtos; +using Volo.Abp.Features; using Volo.Abp.GlobalFeatures; -using Volo.CmsKit.Admin.Tags; +using Volo.CmsKit.Features; using Volo.CmsKit.GlobalFeatures; using Volo.CmsKit.Permissions; using Volo.CmsKit.Tags; namespace Volo.CmsKit.Admin.Tags; +[RequiresFeature(CmsKitFeatures.TagEnable)] [RequiresGlobalFeature(typeof(TagsFeature))] [RemoteService(Name = CmsKitAdminRemoteServiceConsts.RemoteServiceName)] [Area(CmsKitAdminRemoteServiceConsts.ModuleName)] diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Menus/CmsKitAdminMenuContributor.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Menus/CmsKitAdminMenuContributor.cs index bc9bbfb310..9cc76c080c 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Menus/CmsKitAdminMenuContributor.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Menus/CmsKitAdminMenuContributor.cs @@ -2,8 +2,10 @@ using System.Linq; using System.Threading.Tasks; using Volo.Abp.Authorization.Permissions; +using Volo.Abp.Features; using Volo.Abp.GlobalFeatures; using Volo.Abp.UI.Navigation; +using Volo.CmsKit.Features; using Volo.CmsKit.GlobalFeatures; using Volo.CmsKit.Localization; using Volo.CmsKit.Permissions; @@ -36,6 +38,7 @@ public class CmsKitAdminMenuContributor : IMenuContributor l["Pages"].Value, "/Cms/Pages", "fa fa-file-alt") + .RequireFeatures(CmsKitFeatures.PageEnable) .RequireGlobalFeatures(typeof(PagesFeature)) .RequirePermissions(CmsKitAdminPermissions.Pages.Default)); @@ -44,6 +47,7 @@ public class CmsKitAdminMenuContributor : IMenuContributor l["Blogs"], "/Cms/Blogs", "fa fa-blog") + .RequireFeatures(CmsKitFeatures.BlogEnable) .RequireGlobalFeatures(typeof(BlogsFeature)) .RequirePermissions(CmsKitAdminPermissions.Blogs.Default)); @@ -52,6 +56,7 @@ public class CmsKitAdminMenuContributor : IMenuContributor l["BlogPosts"], "/Cms/BlogPosts", "fa fa-file-signature") + .RequireFeatures(CmsKitFeatures.BlogEnable) .RequireGlobalFeatures(typeof(BlogsFeature)) .RequirePermissions(CmsKitAdminPermissions.BlogPosts.Default)); @@ -60,6 +65,7 @@ public class CmsKitAdminMenuContributor : IMenuContributor l["Tags"].Value, "/Cms/Tags", "fa fa-tags") + .RequireFeatures(CmsKitFeatures.TagEnable) .RequireGlobalFeatures(typeof(TagsFeature)) .RequirePermissions(CmsKitAdminPermissions.Tags.Default)); @@ -68,6 +74,7 @@ public class CmsKitAdminMenuContributor : IMenuContributor l["Comments"].Value, "/Cms/Comments", "fa fa-comments") + .RequireFeatures(CmsKitFeatures.CommentEnable) .RequireGlobalFeatures(typeof(CommentsFeature)) .RequirePermissions(CmsKitAdminPermissions.Comments.Default)); @@ -76,6 +83,7 @@ public class CmsKitAdminMenuContributor : IMenuContributor l["Menus"], "/Cms/Menus/Items", "fa fa-stream") + .RequireFeatures(CmsKitFeatures.MenuEnable) .RequireGlobalFeatures(typeof(MenuFeature)) .RequirePermissions(CmsKitAdminPermissions.Menus.Default)); @@ -84,6 +92,7 @@ public class CmsKitAdminMenuContributor : IMenuContributor l["GlobalResources"], "/Cms/GlobalResources", "fa fa-newspaper") + .RequireFeatures(CmsKitFeatures.GlobalResourceEnable) .RequireGlobalFeatures(typeof(GlobalResourcesFeature)) .RequirePermissions(CmsKitAdminPermissions.GlobalResources.Default)); diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/Create.cshtml b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/Create.cshtml index eefc59e849..27a5be8083 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/Create.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/Create.cshtml @@ -31,6 +31,7 @@ + } @@ -97,3 +98,4 @@ } + \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/Update.cshtml b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/Update.cshtml index f48f5e7bd0..fc7987cc5b 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/Update.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/Update.cshtml @@ -29,6 +29,7 @@ + } @@ -94,3 +95,4 @@ + \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/create.js b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/create.js index ab46438fbb..a101635d73 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/create.js +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/create.js @@ -7,7 +7,7 @@ $(function () { Published: 1, SendToReview: 2 }; - + var $selectBlog = $('#BlogSelectionSelect'); var $formCreate = $('#form-blog-post-create'); var $title = $('#ViewModel_Title'); @@ -22,6 +22,7 @@ $(function () { var $tagsInput = $('.tag-editor-form input[name=tags]'); var $fileInput = $('#BlogPostCoverImage'); var $tagsWrapper = $('#blog-post-tags-wrapper'); + var widgetModal = new abp.ModalManager({ viewUrl: abp.appPath + "CmsKit/Contents/AddWidgetModal", modalClass: "addWidgetModal" }); var UPPY_FILE_ID = "uppy-upload-file"; @@ -249,21 +250,17 @@ $(function () { var fileUploadUri = "/api/cms-kit-admin/media/blogpost"; var fileUriPrefix = "/api/cms-kit/media/"; - initAllEditors(); + initEditor(); - function initAllEditors() { - $('.content-editor').each(function (i, item) { - initEditor(item); - }); - } + var editor; - function initEditor(element) { - var $editorContainer = $(element); + function initEditor() { + var $editorContainer = $("#ContentEditor"); var inputName = $editorContainer.data('input-id'); var $editorInput = $('#' + inputName); var initialValue = $editorInput.val(); - var editor = new toastui.Editor({ + editor = new toastui.Editor({ el: $editorContainer[0], usageStatistics: false, useCommandShortcut: true, @@ -274,6 +271,19 @@ $(function () { minHeight: "25em", initialEditType: 'markdown', language: $editorContainer.data("language"), + toolbarItems: [ + ['heading', 'bold', 'italic', 'strike'], + ['hr', 'quote'], + ['ul', 'ol', 'task', 'indent', 'outdent'], + ['table', 'image', 'link'], + ['code', 'codeblock'], + // Using Option: Customize the last button + [{ + el: createAddWidgetButton(), + command: 'bold', + tooltip: 'Add Widget' + }] + ], hooks: { addImageBlobHook: uploadFile, }, @@ -318,4 +328,43 @@ $(function () { } }); } + + $('#GeneratedWidgetText').on('change', function () { + var txt = $('#GeneratedWidgetText').val(); + editor.insertText(txt); + }); + + $('.tab-item').on('click', function () { + if ($(this).attr("aria-label") == 'Preview' && editor.isMarkdownMode()) { + + let content = editor.getMarkdown(); + localStorage.setItem('content', content); + + $.post("/CmsKitCommonWidgets/ContentPreview", { content: content }, function (result) { + editor.setHTML(result); + + var highllightedText = $('#ContentEditor').find('.toastui-editor-md-preview-highlight'); + highllightedText.removeClass('toastui-editor-md-preview-highlight'); + }); + } + else if ($(this).attr("aria-label") == 'Write') { + var retrievedObject = localStorage.getItem('content'); + editor.setMarkdown(retrievedObject); + } + }); + + function createAddWidgetButton() { + const button = document.createElement('button'); + + button.className = 'toastui-editor-toolbar-icons last dropdown'; + button.style.backgroundImage = 'none'; + button.style.margin = '0'; + button.innerHTML = `W`; + button.addEventListener('click', (event) => { + event.preventDefault(); + widgetModal.open(); + }); + + return button; + } }); diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/update.js b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/update.js index 732578f3fb..d14194ecb5 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/update.js +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/update.js @@ -11,6 +11,7 @@ $(function () { var $tagsInput = $('.tag-editor-form input[name=tags]'); var $fileInput = $('#BlogPostCoverImage'); var $buttonRemoveCoverImage = $('#button-remove-cover-image'); + var widgetModal = new abp.ModalManager({ viewUrl: abp.appPath + "CmsKit/Contents/AddWidgetModal", modalClass: "addWidgetModal" }); var UPPY_FILE_ID = "uppy-upload-file"; @@ -160,21 +161,16 @@ $(function () { var fileUploadUri = "/api/cms-kit-admin/media/blogpost"; var fileUriPrefix = "/api/cms-kit/media/"; - initAllEditors(); + initEditor(); - function initAllEditors() { - $('.content-editor').each(function (i, item) { - initEditor(item); - }); - } - - function initEditor(element) { - var $editorContainer = $(element); + var editor; + function initEditor() { + var $editorContainer = $("#ContentEditor"); var inputName = $editorContainer.data('input-id'); var $editorInput = $('#' + inputName); var initialValue = $editorInput.val(); - var editor = new toastui.Editor({ + editor = new toastui.Editor({ el: $editorContainer[0], usageStatistics: false, useCommandShortcut: true, @@ -185,6 +181,19 @@ $(function () { minHeight: "25em", initialEditType: 'markdown', language: $editorContainer.data("language"), + toolbarItems: [ + ['heading', 'bold', 'italic', 'strike'], + ['hr', 'quote'], + ['ul', 'ol', 'task', 'indent', 'outdent'], + ['table', 'image', 'link'], + ['code', 'codeblock'], + // Using Option: Customize the last button + [{ + el: createAddWidgetButton(), + command: 'bold', + tooltip: 'Add Widget' + }] + ], hooks: { addImageBlobHook: uploadFile, }, @@ -240,4 +249,43 @@ $(function () { } ); }); + + $('#GeneratedWidgetText').on('change', function () { + var txt = $('#GeneratedWidgetText').val(); + editor.insertText(txt); + }); + + $('.tab-item').on('click', function () { + if ($(this).attr("aria-label") == 'Preview' && editor.isMarkdownMode()) { + + let content = editor.getMarkdown(); + localStorage.setItem('content', content); + + $.post("/CmsKitCommonWidgets/ContentPreview", { content: content }, function (result) { + editor.setHTML(result); + + var highllightedText = $('#ContentEditor').find('.toastui-editor-md-preview-highlight'); + highllightedText.removeClass('toastui-editor-md-preview-highlight'); + }); + } + else if ($(this).attr("aria-label") == 'Write') { + var retrievedObject = localStorage.getItem('content'); + editor.setMarkdown(retrievedObject); + } + }); + + function createAddWidgetButton() { + const button = document.createElement('button'); + + button.className = 'toastui-editor-toolbar-icons last dropdown'; + button.style.backgroundImage = 'none'; + button.style.margin = '0'; + button.innerHTML = `W`; + button.addEventListener('click', (event) => { + event.preventDefault(); + widgetModal.open(); + }); + + return button; + } }); diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Comments/Index.cshtml b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Comments/Index.cshtml index a3a99969ff..958621ea9c 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Comments/Index.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Comments/Index.cshtml @@ -37,7 +37,7 @@
- + @@ -58,11 +58,9 @@ -
- - - -
+ + +
diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Contents/AddWidgetModal.cshtml b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Contents/AddWidgetModal.cshtml new file mode 100644 index 0000000000..6af4cb0a90 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Contents/AddWidgetModal.cshtml @@ -0,0 +1,52 @@ +@page +@using Microsoft.AspNetCore.Mvc.Localization +@using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Modal +@using Volo.CmsKit.Admin.Web.Pages +@using Volo.CmsKit.Localization +@using Volo.CmsKit.Admin.Web.Pages.CmsKit.Contents; +@inject IHtmlLocalizer L + +@model AddWidgetModal; +@{ + Layout = null; +} + +@section scripts { + +} +@{ + bool isDefinedWidget = Model.Widgets.Count() > 1; +} + + + +
+ @if (isDefinedWidget) + { + + + foreach (var item in Model.ViewModel.Details) + { + if (item.EditorComponentName is not null) + { + + } + } + } + else + { +

@L["PleaseConfigureWidgets"].Value

+ } +
+
+ + @if (isDefinedWidget) + { + + } + +
diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Contents/AddWidgetModal.cshtml.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Contents/AddWidgetModal.cshtml.cs new file mode 100644 index 0000000000..135e9d9257 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Contents/AddWidgetModal.cshtml.cs @@ -0,0 +1,59 @@ +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.Rendering; +using Microsoft.Extensions.Options; +using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form; +using Volo.Abp.AspNetCore.Mvc.UI.RazorPages; +using Volo.CmsKit.Admin.Contents; +using Volo.CmsKit.Contents; +using Volo.CmsKit.Web.Contents; + +namespace Volo.CmsKit.Admin.Web.Pages.CmsKit.Contents; + +public class AddWidgetModal : AbpPageModel +{ + + [BindProperty] + public ContentViewModel ViewModel { get; set; } + + public List Widgets { get; set; } = new(); + + private readonly CmsKitContentWidgetOptions _options; + + public AddWidgetModal(IOptions options) + { + _options = options.Value; + } + + public async Task OnGetAsync() + { + var widgets = _options.WidgetConfigs + .Select(n => + new ContentWidgetDto + { + Key = n.Key, + Details = new WidgetDetailDto() { EditorComponentName = n.Value.EditorComponentName, Name = n.Value.Name }, + + }).ToList(); + + ViewModel = new ContentViewModel() + { + Details = widgets.Select(p => p.Details).ToList() + }; + + Widgets = new List() { new(string.Empty, string.Empty) }; + Widgets.AddRange(widgets + .Select(w => new SelectListItem(w.Key, w.Details.Name)) + .ToList()); + } + + public class ContentViewModel + { + [SelectItems(nameof(Widgets))] + public string Widget { get; set; } + + public List Details { get; set; } + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Contents/addWidgetModal.js b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Contents/addWidgetModal.js new file mode 100644 index 0000000000..2f625fe2fa --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Contents/addWidgetModal.js @@ -0,0 +1,46 @@ +var abp = abp || {}; +$(function () { + abp.modals.addWidgetModal = function () { + + var initModal = function () { + var activeEditor; + var activeForm; + + let widgetName, widgetType; + $("#ViewModel_Widget").change(function () { + widgetName = $("#ViewModel_Widget").val(); + widgetType = $("#ViewModel_Widget").find(":selected").text(); + + $('.widget-detail').attr('hidden', 'true'); + + activeEditor = $('#editor-' + widgetName); + activeEditor.removeAttr('hidden'); + + activeForm = $('#editor-' + widgetName + ' form'); + }); + + $(".save-changes").click(function () { + + let properties = activeForm.serializeFormToObject(); + + let widgetText = "[Widget Type=\"" + widgetType + "\" "; + + for (var propertyName in properties) { + if (!propertyName.includes(']') && !propertyName.includes('[')) { + widgetText += propertyName + "=\"" + properties[propertyName] + "\" "; + } + } + + widgetText = widgetText.trim() + "]"; + + $('#GeneratedWidgetText').val(widgetText); + $("#GeneratedWidgetText").trigger("change"); + $('#addWidgetModal').modal('hide'); + }); + }; + + return { + initModal: initModal + }; + }; +}); \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/Create.cshtml b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/Create.cshtml index 4671cb2ca2..da3226420f 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/Create.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/Create.cshtml @@ -29,6 +29,7 @@ + } @@ -75,3 +76,4 @@ + \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/Update.cshtml b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/Update.cshtml index 499ad1b633..d24ad8bc06 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/Update.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/Update.cshtml @@ -30,6 +30,7 @@ + } @@ -82,3 +83,4 @@ + \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/create.js b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/create.js index 1de6021a7d..ee6c7b7f9f 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/create.js +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/create.js @@ -1,11 +1,13 @@ $(function () { var l = abp.localization.getResource("CmsKit"); - + var $createForm = $('#form-page-create'); var $title = $('#ViewModel_Title'); var $slug = $('#ViewModel_Slug'); var $buttonSubmit = $('#button-page-create'); + var widgetModal = new abp.ModalManager({ viewUrl: abp.appPath + "CmsKit/Contents/AddWidgetModal", modalClass: "addWidgetModal" }); + var scriptEditor = CodeMirror.fromTextArea(document.getElementById("ViewModel_Script"), { mode: "javascript", lineNumbers: true @@ -25,7 +27,7 @@ $(function () { $createForm.on('submit', function (e) { e.preventDefault(); - + if ($createForm.valid()) { abp.ui.setBusy(); @@ -87,21 +89,16 @@ $(function () { var fileUploadUri = "/api/cms-kit-admin/media/page"; var fileUriPrefix = "/api/cms-kit/media/"; - initAllEditors(); - - function initAllEditors() { - $('.content-editor').each(function (i, item) { - initEditor(item); - }); - } + initEditor(); - function initEditor(element) { - var $editorContainer = $(element); + var editor; + function initEditor() { + var $editorContainer = $("#ContentEditor"); var inputName = $editorContainer.data('input-id'); var $editorInput = $('#' + inputName); var initialValue = $editorInput.val(); - var editor = new toastui.Editor({ + editor = new toastui.Editor({ el: $editorContainer[0], usageStatistics: false, useCommandShortcut: true, @@ -112,6 +109,19 @@ $(function () { minHeight: "25em", initialEditType: 'markdown', language: $editorContainer.data("language"), + toolbarItems: [ + ['heading', 'bold', 'italic', 'strike'], + ['hr', 'quote'], + ['ul', 'ol', 'task', 'indent', 'outdent'], + ['table', 'image', 'link'], + ['code', 'codeblock'], + // Using Option: Customize the last button + [{ + el: createAddWidgetButton(), + command: 'bold', + tooltip: 'Add Widget' + }] + ], hooks: { addImageBlobHook: uploadFile, }, @@ -155,4 +165,50 @@ $(function () { } }); } + + $('#GeneratedWidgetText').on('change', function () { + var txt = $('#GeneratedWidgetText').val(); + editor.insertText(txt); + }); + + $('.tab-item').on('click', function () { + if ($(this).attr("aria-label") == 'Preview' && editor.isMarkdownMode()) { + + let content = editor.getMarkdown(); + localStorage.setItem('content', content); + + $.post("/CmsKitCommonWidgets/ContentPreview", { content: content }, function (result) { + + let style = styleEditor.getValue(); + + $('#editor-preview-style').remove(); + + $('head').append(''); + + editor.setHTML(result); + + var highllightedText = $('#ContentEditor').find('.toastui-editor-md-preview-highlight'); + highllightedText.removeClass('toastui-editor-md-preview-highlight'); + }); + } + else if ($(this).attr("aria-label") == 'Write'){ + var retrievedObject = localStorage.getItem('content'); + editor.setMarkdown(retrievedObject); + } + }); + + function createAddWidgetButton() { + const button = document.createElement('button'); + + button.className = 'toastui-editor-toolbar-icons last dropdown'; + button.style.backgroundImage = 'none'; + button.style.margin = '0'; + button.innerHTML = `W`; + button.addEventListener('click', (event) => { + event.preventDefault(); + widgetModal.open(); + }); + + return button; + } }); diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/update.js b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/update.js index 6bd90dd934..c46f1c274c 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/update.js +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/update.js @@ -4,6 +4,7 @@ $(function () { var $formUpdate = $('#form-page-update'); var $buttonSubmit = $('#button-page-update'); + var widgetModal = new abp.ModalManager({ viewUrl: abp.appPath + "CmsKit/Contents/AddWidgetModal", modalClass: "addWidgetModal" }); $formUpdate.data('validator').settings.ignore = ":hidden, [contenteditable='true']:not([name]), .tui-popup-wrapper"; @@ -58,21 +59,16 @@ $(function () { var fileUploadUri = "/api/cms-kit-admin/media/page"; var fileUriPrefix = "/api/cms-kit/media/"; - initAllEditors(); + initEditor(); - function initAllEditors() { - $('.content-editor').each(function (i, item) { - initEditor(item); - }); - } - - function initEditor(element) { - var $editorContainer = $(element); + var editor; + function initEditor() { + var $editorContainer = $("#ContentEditor"); var inputName = $editorContainer.data('input-id'); var $editorInput = $('#' + inputName); var initialValue = $editorInput.val(); - var editor = new toastui.Editor({ + editor = new toastui.Editor({ el: $editorContainer[0], usageStatistics: false, useCommandShortcut: true, @@ -83,6 +79,19 @@ $(function () { minHeight: "25em", initialEditType: 'markdown', language: $editorContainer.data("language"), + toolbarItems: [ + ['heading', 'bold', 'italic', 'strike'], + ['hr', 'quote'], + ['ul', 'ol', 'task', 'indent', 'outdent'], + ['table', 'image', 'link'], + ['code', 'codeblock'], + // Using Option: Customize the last button + [{ + el: createAddWidgetButton(), + command: 'bold', + tooltip: 'Add Widget' + }] + ], hooks: { addImageBlobHook: uploadFile, }, @@ -126,4 +135,50 @@ $(function () { } }); } + + $('#GeneratedWidgetText').on('change', function () { + var txt = $('#GeneratedWidgetText').val(); + editor.insertText(txt); + }); + + $('.tab-item').on('click', function () { + if ($(this).attr("aria-label") == 'Preview' && editor.isMarkdownMode()) { + + let content = editor.getMarkdown(); + localStorage.setItem('content', content); + + $.post("/CmsKitCommonWidgets/ContentPreview", { content: content }, function (result) { + + let style = styleEditor.getValue(); + + $('#editor-preview-style').remove(); + + $('head').append(''); + + editor.setHTML(result); + + var highllightedText = $('#ContentEditor').find('.toastui-editor-md-preview-highlight'); + highllightedText.removeClass('toastui-editor-md-preview-highlight'); + }); + } + else if ($(this).attr("aria-label") == 'Write') { + var retrievedObject = localStorage.getItem('content'); + editor.setMarkdown(retrievedObject); + } + }); + + function createAddWidgetButton() { + const button = document.createElement('button'); + + button.className = 'toastui-editor-toolbar-icons last dropdown'; + button.style.backgroundImage = 'none'; + button.style.margin = '0'; + button.innerHTML = `W`; + button.addEventListener('click', (event) => { + event.preventDefault(); + widgetModal.open(); + }); + + return button; + } }); diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Volo.CmsKit.Admin.Web.abppkg.analyze.json b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Volo.CmsKit.Admin.Web.abppkg.analyze.json index 5e9e23d74e..6fc1fc080f 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Volo.CmsKit.Admin.Web.abppkg.analyze.json +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Volo.CmsKit.Admin.Web.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.CmsKit.Admin.Web", - "hash": "3f95d9795d85d7afbd3311ce13806594", + "hash": "5f85ca165f250e4965434f76a73f0d24", "contents": [ { "namespace": "Volo.CmsKit.Admin.Web", diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js index 228ffb907b..3a61ef6a78 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js @@ -378,7 +378,7 @@ volo.cmsKit.admin.blogs.blogPostAdmin.getList = function(input, ajaxParams) { return abp.ajax($.extend(true, { - url: abp.appPath + 'api/cms-kit-admin/blogs/blog-posts' + abp.utils.buildQueryString([{ name: 'filter', value: input.filter }, { name: 'blogId', value: input.blogId }, { name: 'authorId', value: input.authorId }, { name: 'status', value: input.status }, { name: 'sorting', value: input.sorting }, { name: 'skipCount', value: input.skipCount }, { name: 'maxResultCount', value: input.maxResultCount }]) + '', + url: abp.appPath + 'api/cms-kit-admin/blogs/blog-posts' + abp.utils.buildQueryString([{ name: 'filter', value: input.filter }, { name: 'blogId', value: input.blogId }, { name: 'authorId', value: input.authorId }, { name: 'tagId', value: input.tagId }, { name: 'status', value: input.status }, { name: 'sorting', value: input.sorting }, { name: 'skipCount', value: input.skipCount }, { name: 'maxResultCount', value: input.maxResultCount }]) + '', type: 'GET' }, ajaxParams)); }; diff --git a/modules/cms-kit/src/Volo.CmsKit.Application.Contracts/Volo.CmsKit.Application.Contracts.abppkg.analyze.json b/modules/cms-kit/src/Volo.CmsKit.Application.Contracts/Volo.CmsKit.Application.Contracts.abppkg.analyze.json index c84529efdf..0ce0a4102e 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Application.Contracts/Volo.CmsKit.Application.Contracts.abppkg.analyze.json +++ b/modules/cms-kit/src/Volo.CmsKit.Application.Contracts/Volo.CmsKit.Application.Contracts.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.CmsKit.Application.Contracts", - "hash": "a30e3d8764aeafd628434d7773d25dc2", + "hash": "66221b0ded80b705e67d327260d7d58e", "contents": [ { "namespace": "Volo.CmsKit", diff --git a/modules/cms-kit/src/Volo.CmsKit.Application/Volo.CmsKit.Application.abppkg.analyze.json b/modules/cms-kit/src/Volo.CmsKit.Application/Volo.CmsKit.Application.abppkg.analyze.json index 91370f95df..5cfde7838f 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Application/Volo.CmsKit.Application.abppkg.analyze.json +++ b/modules/cms-kit/src/Volo.CmsKit.Application/Volo.CmsKit.Application.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.CmsKit.Application", - "hash": "a8ce451337675e03f5fb68c1965a3ded", + "hash": "d248c6d5c1b031c459ad8814fd734a18", "contents": [ { "namespace": "Volo.CmsKit", diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/Contents/BlogPostCommonDto.cs b/modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/Contents/BlogPostCommonDto.cs new file mode 100644 index 0000000000..a7bc27d713 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/Contents/BlogPostCommonDto.cs @@ -0,0 +1,23 @@ +using System; +using Volo.Abp.Application.Dtos; +using Volo.CmsKit.Users; + +namespace Volo.CmsKit.Contents; + +[Serializable] +public class BlogPostCommonDto : AuditedEntityDto +{ + public Guid BlogId { get; set; } + + public string Title { get; set; } + + public string Slug { get; set; } + + public string ShortDescription { get; set; } + + public string Content { get; set; } + + public Guid? CoverImageMediaId { get; set; } + + public CmsUserDto Author { get; set; } +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/Contents/DefaultContentDto.cs b/modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/Contents/DefaultContentDto.cs new file mode 100644 index 0000000000..731e346df4 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/Contents/DefaultContentDto.cs @@ -0,0 +1,8 @@ +using System.Collections.Generic; + +namespace Volo.CmsKit.Contents; + +public class DefaultContentDto : IContent +{ + public List ContentFragments { get; set; } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/Contents/IContent.cs b/modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/Contents/IContent.cs new file mode 100644 index 0000000000..2a393e0a14 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/Contents/IContent.cs @@ -0,0 +1,7 @@ +using System.Collections.Generic; + +namespace Volo.CmsKit.Contents; +public interface IContent +{ + public List ContentFragments { get; set; } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Pages/PageDto.cs b/modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/Contents/PageDto.cs similarity index 60% rename from modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Pages/PageDto.cs rename to modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/Contents/PageDto.cs index a336844289..d495c5de20 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Pages/PageDto.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/Contents/PageDto.cs @@ -1,9 +1,8 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; +using System; using Volo.Abp.Application.Dtos; -using Volo.CmsKit.Contents; -namespace Volo.CmsKit.Public.Pages; +namespace Volo.CmsKit.Contents; [Serializable] public class PageDto : EntityDto @@ -13,10 +12,8 @@ public class PageDto : EntityDto public string Slug { get; set; } public string Content { get; set; } - - public List ContentFragments { get; set; } public string Script { get; set; } public string Style { get; set; } -} +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/Contents/WidgetDetailDto.cs b/modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/Contents/WidgetDetailDto.cs new file mode 100644 index 0000000000..d9e00712ff --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/Contents/WidgetDetailDto.cs @@ -0,0 +1,10 @@ +using System; + +namespace Volo.CmsKit.Contents; + +[Serializable] +public class WidgetDetailDto +{ + public string Name { get; set; } + public string EditorComponentName { get; set; } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Application/Volo.CmsKit.Common.Application.abppkg.analyze.json b/modules/cms-kit/src/Volo.CmsKit.Common.Application/Volo.CmsKit.Common.Application.abppkg.analyze.json index 9741f09173..d93eced25a 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Common.Application/Volo.CmsKit.Common.Application.abppkg.analyze.json +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Application/Volo.CmsKit.Common.Application.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.CmsKit.Common.Application", - "hash": "8c5b6af4aae1a9199e8ed2a8481cf201", + "hash": "07abca3b46e8b2c5233c0d9b1a803f02", "contents": [ { "namespace": "Volo.CmsKit", diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Application/Volo/CmsKit/Contents/CmsKitContentWidgetOptions.cs b/modules/cms-kit/src/Volo.CmsKit.Common.Application/Volo/CmsKit/Contents/CmsKitContentWidgetOptions.cs deleted file mode 100644 index 1f9dae60ab..0000000000 --- a/modules/cms-kit/src/Volo.CmsKit.Common.Application/Volo/CmsKit/Contents/CmsKitContentWidgetOptions.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System.Collections.Generic; - -namespace Volo.CmsKit.Contents; - -public class CmsKitContentWidgetOptions -{ - public Dictionary WidgetConfigs { get; } - - public CmsKitContentWidgetOptions() - { - WidgetConfigs = new(); - } - - public void AddWidget(string widgetName, string widgetKey) - { - WidgetConfigs.Add(widgetName, new ContentWidgetConfig(widgetKey)); - } -} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Application/Volo/CmsKit/Contents/ContentWidgetConfig.cs b/modules/cms-kit/src/Volo.CmsKit.Common.Application/Volo/CmsKit/Contents/ContentWidgetConfig.cs deleted file mode 100644 index a5eab5930a..0000000000 --- a/modules/cms-kit/src/Volo.CmsKit.Common.Application/Volo/CmsKit/Contents/ContentWidgetConfig.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace Volo.CmsKit.Contents; - -public class ContentWidgetConfig -{ - public string Name { get; } - - public ContentWidgetConfig(string widgetName) - { - Name = widgetName; - } -} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.HttpApi.Client/Volo.CmsKit.Common.HttpApi.Client.abppkg.analyze.json b/modules/cms-kit/src/Volo.CmsKit.Common.HttpApi.Client/Volo.CmsKit.Common.HttpApi.Client.abppkg.analyze.json index cb6e64c996..ae90aece20 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Common.HttpApi.Client/Volo.CmsKit.Common.HttpApi.Client.abppkg.analyze.json +++ b/modules/cms-kit/src/Volo.CmsKit.Common.HttpApi.Client/Volo.CmsKit.Common.HttpApi.Client.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.CmsKit.Common.HttpApi.Client", - "hash": "4563bb2a82a6f3c4c49fbbac9e12a622", + "hash": "047466e6fe6a292e3cf8d1f334303f42", "contents": [ { "namespace": "Volo.CmsKit", diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.HttpApi/Volo.CmsKit.Common.HttpApi.abppkg.analyze.json b/modules/cms-kit/src/Volo.CmsKit.Common.HttpApi/Volo.CmsKit.Common.HttpApi.abppkg.analyze.json index 9fc9293fcd..342a3b3c38 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Common.HttpApi/Volo.CmsKit.Common.HttpApi.abppkg.analyze.json +++ b/modules/cms-kit/src/Volo.CmsKit.Common.HttpApi/Volo.CmsKit.Common.HttpApi.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.CmsKit.Common.HttpApi", - "hash": "a14749de61debbd45eac761d91707413", + "hash": "9120a59e9639dcaec305df9314b55b02", "contents": [ { "namespace": "Volo.CmsKit", diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Web/Controllers/CmsKitCommonWidgetsController.cs b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Controllers/CmsKitCommonWidgetsController.cs new file mode 100644 index 0000000000..8e226a31f2 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Controllers/CmsKitCommonWidgetsController.cs @@ -0,0 +1,14 @@ +using Microsoft.AspNetCore.Mvc; +using Volo.Abp.AspNetCore.Mvc; +using Volo.CmsKit.Web.Pages.CmsKit.Components.ContentPreview; + +namespace Volo.CmsKit.Web.Controllers; + +public class CmsKitCommonWidgetsController : AbpController +{ + [HttpPost] + public IActionResult ContentPreview(ContentPreviewDto dto) + { + return ViewComponent(typeof(ContentPreviewViewComponent), new { content = dto.Content }); + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Web/Pages/CmsKit/Components/ContentPreview/ContentPreviewDto.cs b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Pages/CmsKit/Components/ContentPreview/ContentPreviewDto.cs new file mode 100644 index 0000000000..9c01a325bf --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Pages/CmsKit/Components/ContentPreview/ContentPreviewDto.cs @@ -0,0 +1,9 @@ +using System; + +namespace Volo.CmsKit.Web.Pages.CmsKit.Components.ContentPreview; + +[Serializable] +public class ContentPreviewDto +{ + public string Content { get; set; } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Web/Pages/CmsKit/Components/ContentPreview/ContentPreviewViewComponent.cs b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Pages/CmsKit/Components/ContentPreview/ContentPreviewViewComponent.cs new file mode 100644 index 0000000000..2251f6d0cd --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Pages/CmsKit/Components/ContentPreview/ContentPreviewViewComponent.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using Volo.Abp.AspNetCore.Mvc; +using Volo.CmsKit.Contents; +using Volo.CmsKit.Web.Contents; + +namespace Volo.CmsKit.Web.Pages.CmsKit.Components.ContentPreview; + +public class ContentPreviewViewComponent : AbpViewComponent +{ + protected ContentParser ContentParser { get; } + + public ContentPreviewViewComponent(ContentParser contentParser) + { + ContentParser = contentParser; + } + + public virtual async Task InvokeAsync(string content) + { + var fragments = await ContentParser.ParseAsync(content); + + return View("~/Pages/CmsKit/Components/ContentPreview/Default.cshtml", new DefaultContentDto + { + ContentFragments = fragments + }); + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Web/Pages/CmsKit/Components/ContentPreview/Default.cshtml b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Pages/CmsKit/Components/ContentPreview/Default.cshtml new file mode 100644 index 0000000000..6baf41716e --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Pages/CmsKit/Components/ContentPreview/Default.cshtml @@ -0,0 +1,10 @@ +@using Volo.CmsKit.Contents +@using Volo.CmsKit.Web.Pages.CmsKit.Components.Contents + +@model DefaultContentDto + +
+ + @await Component.InvokeAsync(typeof(ContentFragmentViewComponent), Model) + +
\ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Web/Pages/CmsKit/Components/Contents/CmsKitContentWidgetOptions.cs b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Pages/CmsKit/Components/Contents/CmsKitContentWidgetOptions.cs new file mode 100644 index 0000000000..ad643f7770 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Pages/CmsKit/Components/Contents/CmsKitContentWidgetOptions.cs @@ -0,0 +1,19 @@ +using System.Collections.Generic; + +namespace Volo.CmsKit.Web.Contents; + +public class CmsKitContentWidgetOptions +{ + public Dictionary WidgetConfigs { get; } + + public CmsKitContentWidgetOptions() + { + WidgetConfigs = new(); + } + + public void AddWidget(string widgetType, string widgetName, string parameterWidgetName = null) + { + var config = new ContentWidgetConfig(widgetName, parameterWidgetName); + WidgetConfigs.Add(widgetType, config); + } +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Web/Pages/CmsKit/Components/Contents/ContentFragment.cshtml b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Pages/CmsKit/Components/Contents/ContentFragment.cshtml new file mode 100644 index 0000000000..0fa7d59064 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Pages/CmsKit/Components/Contents/ContentFragment.cshtml @@ -0,0 +1,20 @@ +@using System.Dynamic +@using Volo.Abp.Data +@using Volo.CmsKit.Web.Renderers; +@using Volo.CmsKit.Web.Pages.CmsKit.Components.Contents; + +@model ContentFragmentViewComponent + +@inject IMarkdownToHtmlRenderer MarkdownRenderer + +@foreach (var contentFragment in Model.ContentDto.ContentFragments) +{ + if (contentFragment.Type == "Markdown") + { + @Html.Raw(await MarkdownRenderer.RenderAsync(contentFragment.GetProperty("Content"))) + } + else if (contentFragment.Type == "Widget") + { + @await Component.InvokeAsync(contentFragment.GetProperty("Type"), contentFragment.ExtraProperties.ConvertToDynamicObject()) + } +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Web/Pages/CmsKit/Components/Contents/ContentFragmentViewComponent.cs b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Pages/CmsKit/Components/Contents/ContentFragmentViewComponent.cs new file mode 100644 index 0000000000..d276165982 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Pages/CmsKit/Components/Contents/ContentFragmentViewComponent.cs @@ -0,0 +1,21 @@ +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using Volo.Abp.AspNetCore.Mvc; +using Volo.Abp.AspNetCore.Mvc.UI.Widgets; +using Volo.CmsKit.Contents; + +namespace Volo.CmsKit.Web.Pages.CmsKit.Components.Contents; + +[ViewComponent(Name = "ContentFragment")] +[Widget( + AutoInitialize = true +)] +public class ContentFragmentViewComponent : AbpViewComponent +{ + public IContent ContentDto { get; set; } + + public virtual async Task InvokeAsync(IContent contentDto) + { + return View("~/Pages/CmsKit/Components/Contents/ContentFragment.cshtml", new ContentFragmentViewComponent() { ContentDto = contentDto }); + } +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Application/Volo/CmsKit/Contents/ContentParser.cs b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Pages/CmsKit/Components/Contents/ContentParser.cs similarity index 94% rename from modules/cms-kit/src/Volo.CmsKit.Common.Application/Volo/CmsKit/Contents/ContentParser.cs rename to modules/cms-kit/src/Volo.CmsKit.Common.Web/Pages/CmsKit/Components/Contents/ContentParser.cs index 7fe9fe5b60..290222a376 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Common.Application/Volo/CmsKit/Contents/ContentParser.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Pages/CmsKit/Components/Contents/ContentParser.cs @@ -5,9 +5,10 @@ using System.Threading.Tasks; using Microsoft.Extensions.Options; using Volo.Abp.Data; using Volo.Abp.DependencyInjection; +using Volo.CmsKit.Contents; using static Volo.CmsKit.Contents.ContentConsts; -namespace Volo.CmsKit.Contents; +namespace Volo.CmsKit.Web.Contents; public class ContentParser : ITransientDependency { @@ -20,18 +21,18 @@ public class ContentParser : ITransientDependency public Task> ParseAsync(string content) { - if (!_options.WidgetConfigs.Any()) + if (!_options.WidgetConfigs.Any() || content is null) { return Task.FromResult(new List { - new ContentFragment { Type = Markdown }.SetProperty(Content, content), + new ContentFragment { Type = Markdown }.SetProperty(Content, content ?? string.Empty), }); } - var parsedList = new List(); + List parsedList = new(); ParseContent(content, parsedList); - var contentFragments = new List(); + List contentFragments = new(); FillContentFragment(content, parsedList, contentFragments); return Task.FromResult(contentFragments); diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Web/Pages/CmsKit/Components/Contents/ContentWidgetConfig.cs b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Pages/CmsKit/Components/Contents/ContentWidgetConfig.cs new file mode 100644 index 0000000000..69be0703fa --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Pages/CmsKit/Components/Contents/ContentWidgetConfig.cs @@ -0,0 +1,14 @@ +namespace Volo.CmsKit.Web.Contents; + +public class ContentWidgetConfig +{ + public string Name { get; } + public string EditorComponentName { get; } + + public ContentWidgetConfig(string widgetName, string editorComponentName) + { + Name = widgetName; + EditorComponentName = editorComponentName; + } + +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Web/Contents/IContentRenderer.cs b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Pages/CmsKit/Components/Contents/IContentRenderer.cs similarity index 66% rename from modules/cms-kit/src/Volo.CmsKit.Common.Web/Contents/IContentRenderer.cs rename to modules/cms-kit/src/Volo.CmsKit.Common.Web/Pages/CmsKit/Components/Contents/IContentRenderer.cs index 879b27cda7..b33c044392 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Common.Web/Contents/IContentRenderer.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Pages/CmsKit/Components/Contents/IContentRenderer.cs @@ -1,6 +1,6 @@ using System.Threading.Tasks; -namespace Volo.CmsKit.Web.Contents; +namespace Volo.CmsKit.Web.Pages.CmsKit.Components.Contents; public interface IContentRenderer { diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Web/Contents/PlainTextContentRenderer.cs b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Pages/CmsKit/Components/Contents/PlainTextContentRenderer.cs similarity index 80% rename from modules/cms-kit/src/Volo.CmsKit.Common.Web/Contents/PlainTextContentRenderer.cs rename to modules/cms-kit/src/Volo.CmsKit.Common.Web/Pages/CmsKit/Components/Contents/PlainTextContentRenderer.cs index cf68e25e15..3fcc78f658 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Common.Web/Contents/PlainTextContentRenderer.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Pages/CmsKit/Components/Contents/PlainTextContentRenderer.cs @@ -1,7 +1,7 @@ using System.Threading.Tasks; using Volo.Abp.DependencyInjection; -namespace Volo.CmsKit.Web.Contents; +namespace Volo.CmsKit.Web.Pages.CmsKit.Components.Contents; public class PlainTextContentRenderer : IContentRenderer, ITransientDependency { diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Web/Renderers/IMarkdownToHtmlRenderer.cs b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Renderers/IMarkdownToHtmlRenderer.cs new file mode 100644 index 0000000000..565437af7e --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Renderers/IMarkdownToHtmlRenderer.cs @@ -0,0 +1,8 @@ +using System.Threading.Tasks; + +namespace Volo.CmsKit.Web.Renderers; + +public interface IMarkdownToHtmlRenderer +{ + Task RenderAsync(string rawMarkdown, bool allowHtmlTags = true, bool preventXSS = true); +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Renderers/MarkdownToHtmlRenderer.cs b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Renderers/MarkdownToHtmlRenderer.cs similarity index 94% rename from modules/cms-kit/src/Volo.CmsKit.Public.Web/Renderers/MarkdownToHtmlRenderer.cs rename to modules/cms-kit/src/Volo.CmsKit.Common.Web/Renderers/MarkdownToHtmlRenderer.cs index b6fab3c008..83317c2111 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Renderers/MarkdownToHtmlRenderer.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Renderers/MarkdownToHtmlRenderer.cs @@ -1,13 +1,13 @@ using System.Collections.Generic; using System.Linq; using System.Text.RegularExpressions; -using Markdig; using System.Threading.Tasks; using System.Web; -using Volo.Abp.DependencyInjection; using Ganss.XSS; +using Markdig; +using Volo.Abp.DependencyInjection; -namespace Volo.CmsKit.Public.Web.Renderers; +namespace Volo.CmsKit.Web.Renderers; public class MarkdownToHtmlRenderer : IMarkdownToHtmlRenderer, ITransientDependency { @@ -20,9 +20,9 @@ public class MarkdownToHtmlRenderer : IMarkdownToHtmlRenderer, ITransientDepende _htmlSanitizer = new HtmlSanitizer(); } - public async Task RenderAsync(string rawMarkdown, bool preventXSS = false) + public Task RenderAsync(string rawMarkdown, bool allowHtmlTags = true, bool preventXSS = true) { - if (preventXSS) + if (!allowHtmlTags) { rawMarkdown = EncodeHtmlTags(rawMarkdown, true); } @@ -34,7 +34,7 @@ public class MarkdownToHtmlRenderer : IMarkdownToHtmlRenderer, ITransientDepende html = _htmlSanitizer.Sanitize(html); } - return html; + return Task.FromResult(html); } diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Web/Volo.CmsKit.Common.Web.abppkg.analyze.json b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Volo.CmsKit.Common.Web.abppkg.analyze.json index 442b81dc19..c56f4ae15d 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Common.Web/Volo.CmsKit.Common.Web.abppkg.analyze.json +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Volo.CmsKit.Common.Web.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.CmsKit.Common.Web", - "hash": "3c0628c43dbbcfb430af79992fd6fd3f", + "hash": "2540b0ef97a790d3999d72c87961397e", "contents": [ { "namespace": "Volo.CmsKit.Web", diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Web/Volo.CmsKit.Common.Web.csproj b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Volo.CmsKit.Common.Web.csproj index 1ca9a78b27..e717f49be5 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Common.Web/Volo.CmsKit.Common.Web.csproj +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Volo.CmsKit.Common.Web.csproj @@ -1,38 +1,40 @@ - - + + - - net6.0 - $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; - true - Library - Volo.CmsKit.Web - true - + + net6.0 + $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; + true + Library + Volo.CmsKit.Web + true + - - - - - + + + + + - - - + + + + + - - - - - - - - - - - - + + + + + + + + + + + + diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo.CmsKit.Domain.Shared.abppkg.analyze.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo.CmsKit.Domain.Shared.abppkg.analyze.json index d3d3cb08a1..1af4d1a735 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo.CmsKit.Domain.Shared.abppkg.analyze.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo.CmsKit.Domain.Shared.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.CmsKit.Domain.Shared", - "hash": "515d3328db0b4ded3a5076a582f00053", + "hash": "dd817fe9197c1b28242920e4238da6ee", "contents": [ { "namespace": "Volo.CmsKit", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo.CmsKit.Domain.Shared.csproj b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo.CmsKit.Domain.Shared.csproj index 22160272fd..550a704a75 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo.CmsKit.Domain.Shared.csproj +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo.CmsKit.Domain.Shared.csproj @@ -12,6 +12,7 @@ + diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Features/CmsKitFeatureDefinitionProvider.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Features/CmsKitFeatureDefinitionProvider.cs new file mode 100644 index 0000000000..597e5240e8 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Features/CmsKitFeatureDefinitionProvider.cs @@ -0,0 +1,73 @@ +using Volo.Abp.Features; +using Volo.Abp.Localization; +using Volo.Abp.Validation.StringValues; +using Volo.CmsKit.Localization; + +namespace Volo.CmsKit.Features; +public class CmsKitFeatureDefinitionProvider : FeatureDefinitionProvider +{ + public override void Define(IFeatureDefinitionContext context) + { + var group = context.AddGroup(CmsKitFeatures.GroupName, + L("Feature:CmsKitGroup")); + + group.AddFeature(CmsKitFeatures.BlogEnable, + "true", + L("Feature:BlogEnable"), + L("Feature:BlogEnableDescription"), + new ToggleStringValueType()); + + group.AddFeature(CmsKitFeatures.CommentEnable, + "true", + L("Feature:CommentEnable"), + L("Feature:CommentEnableDescription"), + new ToggleStringValueType()); + + group.AddFeature(CmsKitFeatures.GlobalResourceEnable, + "true", + L("Feature:GlobalResourceEnable"), + L("Feature:GlobalResourceEnableDescription"), + new ToggleStringValueType()); + + group.AddFeature(CmsKitFeatures.MediaEnable, + "true", + L("Feature:MediaEnable"), + L("Feature:MediaEnableDescription"), + new ToggleStringValueType()); + + group.AddFeature(CmsKitFeatures.MenuEnable, + "true", + L("Feature:MenuEnable"), + L("Feature:MenuEnableDescription"), + new ToggleStringValueType()); + + group.AddFeature(CmsKitFeatures.PageEnable, + "true", + L("Feature:PageEnable"), + L("Feature:PageEnableDescription"), + new ToggleStringValueType()); + + group.AddFeature(CmsKitFeatures.RatingEnable, + "true", + L("Feature:RatingEnable"), + L("Feature:RatingEnableDescription"), + new ToggleStringValueType()); + + group.AddFeature(CmsKitFeatures.ReactionEnable, + "true", + L("Feature:ReactionEnable"), + L("Feature:ReactionEnableDescription"), + new ToggleStringValueType()); + + group.AddFeature(CmsKitFeatures.TagEnable, + "true", + L("Feature:TagEnable"), + L("Feature:TagEnableDescription"), + new ToggleStringValueType()); + } + + private static LocalizableString L(string name) + { + return LocalizableString.Create(name); + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Features/CmsKitFeatures.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Features/CmsKitFeatures.cs new file mode 100644 index 0000000000..1dbf642755 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Features/CmsKitFeatures.cs @@ -0,0 +1,15 @@ +namespace Volo.CmsKit.Features; +public static class CmsKitFeatures +{ + public const string GroupName = "CmsKit"; + + public const string BlogEnable = GroupName + ".BlogEnable"; + public const string CommentEnable = GroupName + ".CommentEnable"; + public const string GlobalResourceEnable = GroupName + ".GlobalResourceEnable"; + public const string MediaEnable = GroupName + ".MediaEnable"; + public const string MenuEnable = GroupName + ".MenuEnable"; + public const string PageEnable = GroupName + ".PageEnable"; + public const string RatingEnable = GroupName + ".RatingEnable"; + public const string ReactionEnable = GroupName + ".ReactionEnable"; + public const string TagEnable = GroupName + ".TagEnable"; +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/ContentsFeature.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/ContentsFeature.cs new file mode 100644 index 0000000000..ac752a68c4 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/ContentsFeature.cs @@ -0,0 +1,28 @@ +using JetBrains.Annotations; +using Volo.Abp.GlobalFeatures; + +namespace Volo.CmsKit.GlobalFeatures; + +[GlobalFeatureName(Name)] +public class ContentsFeature : GlobalFeature +{ + public const string Name = "CmsKit.Contents"; + + internal ContentsFeature( + [NotNull] GlobalCmsKitFeatures cmsKit + ) : base(cmsKit) + { + + } + + public override void Enable() + { + var userFeature = FeatureManager.Modules.CmsKit().User; + if (!userFeature.IsEnabled) + { + userFeature.Enable(); + } + + base.Enable(); + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalResources/GlobalResourceConsts.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalResources/GlobalResourceConsts.cs index 47f20e1d72..7787d0c69d 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalResources/GlobalResourceConsts.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalResources/GlobalResourceConsts.cs @@ -1,6 +1,6 @@ namespace Volo.CmsKit.GlobalResources; -public class GlobalResourceConsts +public static class GlobalResourceConsts { public const string GlobalStyleName = "GlobalStyle"; diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/ar.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/ar.json index 922059463f..3119bf618c 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/ar.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/ar.json @@ -75,7 +75,7 @@ "PageDeletionConfirmationMessage": "هل أنت متأكد من حذف هذه الصفحة؟", "PageId": "صفحة", "Pages": "الصفحات", - "PageSlugInformation": "سبيكة تستخدم على url. سيكون عنوان url الخاص بك هو \"/pages/{{slug}}\".", + "PageSlugInformation": "سبيكة تستخدم على url. سيكون عنوان url الخاص بك هو \"/{slug}}\".", "Permission:BlogManagement": "إدارة المدونة", "Permission:BlogManagement.Create": "إنشاء", "Permission:BlogManagement.Delete": "حذف", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/cs.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/cs.json index 9192b48abe..8ae9479b06 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/cs.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/cs.json @@ -75,7 +75,7 @@ "PageDeletionConfirmationMessage": "Opravdu chcete smazat tuto stránku?", "PageId": "Strana", "Pages": "stránky", - "PageSlugInformation": "Na adrese URL je použit Slug. Vaše adresa URL bude '/pages/{{slug}}'.", + "PageSlugInformation": "Na adrese URL je použit Slug. Vaše adresa URL bude '/{{slug}}'.", "Permission:BlogManagement": "Správa blogu", "Permission:BlogManagement.Create": "Vytvořit", "Permission:BlogManagement.Delete": "Vymazat", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/de-DE.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/de-DE.json index 903a7e3d0a..857f7f1e1a 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/de-DE.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/de-DE.json @@ -75,7 +75,7 @@ "PageDeletionConfirmationMessage": "Möchten Sie diese Seite wirklich löschen?", "PageId": "Buchseite", "Pages": "Seiten", - "PageSlugInformation": "Slug wird auf URL verwendet. Ihre URL lautet '/pages/{{slug}}'.", + "PageSlugInformation": "Slug wird auf URL verwendet. Ihre URL lautet '/{{slug}}'.", "Permission:BlogManagement": "Blog-Verwaltung", "Permission:BlogManagement.Create": "Schaffen", "Permission:BlogManagement.Delete": "Löschen", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/el.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/el.json index 222cbe0fbd..7a838b120a 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/el.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/el.json @@ -75,7 +75,7 @@ "PageDeletionConfirmationMessage": "Είστε βέβαιοι ότι θα διαγράψετε αυτήν τη σελίδα;", "PageId": "Σελίδα", "Pages": "Σελίδες", - "PageSlugInformation": "Το Slug χρησιμοποιείται στο url. Το url σας θα είναι '/pages/{{slug}}'.", + "PageSlugInformation": "Το Slug χρησιμοποιείται στο url. Το url σας θα είναι '/{{slug}}'.", "Permission:BlogManagement": "Διαχείριση ιστολογίου", "Permission:BlogManagement.Create": "Δημιουργώ", "Permission:BlogManagement.Delete": "Διαγράφω", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json index 6926fdb771..0faaf04e81 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json @@ -75,7 +75,7 @@ "PageDeletionConfirmationMessage": "Are you sure to delete this page?", "PageId": "Page", "Pages": "Pages", - "PageSlugInformation": "Slug is used on url. Your url will be '/pages/{{slug}}'.", + "PageSlugInformation": "Slug is used on url. Your url will be '/{{slug}}'.", "Permission:BlogManagement": "Blog Management", "Permission:BlogManagement.Create": "Create", "Permission:BlogManagement.Delete": "Delete", @@ -181,6 +181,31 @@ "HasBlogPostWaitingForReviewMessage": "You have a blog post waiting for review. Click to list.", "SelectAStatus": "Select a status", "Status": "Status", - "CmsKit.BlogPost.ScrollIndex": "Quick navigation bar in blog posts" + "CmsKit.BlogPost.ScrollIndex": "Quick navigation bar in blog posts", + "Add": "Add", + "AddWidget": "Add Widget", + "PleaseConfigureWidgets": "Please configure widgets", + "SelectAnAuthor": "Select an Author", + "InThisDocument": "In This Document", + "GoToTop": "Go To Top", + "Feature:CmsKitGroup": "Cms Kit", + "Feature:BlogEnable": "Enabled blog page", + "Feature:BlogEnableDescription": "Enable blog page in the application.", + "Feature:CommentEnable": "Enabled commenting", + "Feature:CommentEnableDescription": "Enable comment in the application.", + "Feature:GlobalResourceEnable": "Enabled global resourcing", + "Feature:GlobalResourceEnableDescription": "Enable global resource in the application.", + "Feature:MediaEnable": "Enabled media", + "Feature:MediaEnableDescription": "Enable media in the application.", + "Feature:MenuEnable": "Enabled menu", + "Feature:MenuEnableDescription": "Enable menu in the application.", + "Feature:PageEnable": "Enabled paging page", + "Feature:PageEnableDescription": "Enable paging page in the application.", + "Feature:RatingEnable": "Enabled rating", + "Feature:RatingEnableDescription": "Enable rating in the application.", + "Feature:ReactionEnable": "Enabled reaction", + "Feature:ReactionEnableDescription": "Enable reaction in the application.", + "Feature:TagEnable": "Enabled taging", + "Feature:TagEnableDescription": "Enable taging in the application." } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/es.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/es.json index 19df2c45a2..8e8750e530 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/es.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/es.json @@ -75,7 +75,7 @@ "PageDeletionConfirmationMessage": "¿Está seguro de eliminar esta página?", "PageId": "Página", "Pages": "Paginas", - "PageSlugInformation": "Slug se usa en la URL. Su URL será '/pages/{{slug}}'.", + "PageSlugInformation": "Slug se usa en la URL. Su URL será '/{{slug}}'.", "Permission:BlogManagement": "Gestión de blogs", "Permission:BlogManagement.Create": "Crear", "Permission:BlogManagement.Delete": "Borrar", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/fa.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/fa.json index 3ac961feef..855b6d091d 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/fa.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/fa.json @@ -75,7 +75,7 @@ "PageDeletionConfirmationMessage": "آیا مطمئن هستید که این صفحه را حذف می کنید؟", "PageId": "صفحه", "Pages": "صفحات", - "PageSlugInformation": "Slug در url استفاده می شود. آدرس اینترنتی شما '/pages/{{slug}}' خواهد بود.", + "PageSlugInformation": "Slug در url استفاده می شود. آدرس اینترنتی شما '/{{slug}}' خواهد بود.", "Permission:BlogManagement": "مدیریت وبلاگ", "Permission:BlogManagement.Create": "ایجاد", "Permission:BlogManagement.Delete": "حذف", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/fi.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/fi.json index 30a56fa9c0..438818cdfb 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/fi.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/fi.json @@ -75,7 +75,7 @@ "PageDeletionConfirmationMessage": "Haluatko varmasti poistaa tämän sivun?", "PageId": "Sivu", "Pages": "Sivut", - "PageSlugInformation": "Etanaa käytetään URL-osoitteessa. URL-osoitteesi on '/pages/{{slug}}'.", + "PageSlugInformation": "Etanaa käytetään URL-osoitteessa. URL-osoitteesi on '/{{slug}}'.", "Permission:BlogManagement": "Blogin hallinta", "Permission:BlogManagement.Create": "Luoda", "Permission:BlogManagement.Delete": "Poistaa", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/fr.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/fr.json index 6d4e8f4cf5..5c789e996e 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/fr.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/fr.json @@ -75,7 +75,7 @@ "PageDeletionConfirmationMessage": "Êtes-vous sûr de vouloir supprimer cette page?", "PageId": "Page", "Pages": "Pages", - "PageSlugInformation": "Slug est utilisé sur l'url. Votre URL sera '/pages/{{slug}}'.", + "PageSlugInformation": "Slug est utilisé sur l'url. Votre URL sera '/{{slug}}'.", "Permission:BlogManagement": "Gestion de blog", "Permission:BlogManagement.Create": "Créer", "Permission:BlogManagement.Delete": "Effacer", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/hi.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/hi.json index 732ca3d2de..8f69f2e25f 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/hi.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/hi.json @@ -75,7 +75,7 @@ "PageDeletionConfirmationMessage": "क्या आप इस पृष्ठ को हटाना सुनिश्चित कर रहे हैं?", "PageId": "पृष्ठ", "Pages": "पृष्ठों", - "PageSlugInformation": "स्लग का उपयोग url पर किया जाता है। आपका url '/pages/{{slug}}' होगा।", + "PageSlugInformation": "स्लग का उपयोग url पर किया जाता है। आपका url '/{{slug}}' होगा।", "Permission:BlogManagement": "ब्लॉग प्रबंधन", "Permission:BlogManagement.Create": "सृजन करना", "Permission:BlogManagement.Delete": "हटाएं", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/hu.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/hu.json index fa10711248..05b0366cd4 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/hu.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/hu.json @@ -75,7 +75,7 @@ "PageDeletionConfirmationMessage": "Biztosan törlöd ezt az oldalt?", "PageId": "oldal", "Pages": "Oldalak", - "PageSlugInformation": "A Slug az url-en használatos. Az Ön URL-je a következő lesz: „/pages/{{slug}}”.", + "PageSlugInformation": "A Slug az url-en használatos. Az Ön URL-je a következő lesz: „/{{slug}}”.", "Permission:BlogManagement": "Blogkezelés", "Permission:BlogManagement.Create": "Teremt", "Permission:BlogManagement.Delete": "Töröl", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/it.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/it.json index f5bb342dc6..60c8d13744 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/it.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/it.json @@ -75,7 +75,7 @@ "PageDeletionConfirmationMessage": "Sei sicuro di cancellare questa pagina?", "PageId": "Pagina", "Pages": "Pagine", - "PageSlugInformation": "Lo slug viene utilizzato sull'URL. Il tuo URL sarà '/pages/{{slug}}'.", + "PageSlugInformation": "Lo slug viene utilizzato sull'URL. Il tuo URL sarà '/{{slug}}'.", "Permission:BlogManagement": "Gestione del blog", "Permission:BlogManagement.Create": "Crea", "Permission:BlogManagement.Delete": "Elimina", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/nl.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/nl.json index b8adbbd5bb..39779d1d57 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/nl.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/nl.json @@ -75,7 +75,7 @@ "PageDeletionConfirmationMessage": "Weet u zeker dat u deze pagina wilt verwijderen?", "PageId": "Bladzijde", "Pages": "Pagina's", - "PageSlugInformation": "Slug wordt gebruikt voor de url. Uw url wordt '/pages/{{slug}}'.", + "PageSlugInformation": "Slug wordt gebruikt voor de url. Uw url wordt '/{{slug}}'.", "Permission:BlogManagement": "Blogbeheer", "Permission:BlogManagement.Create": "Toevoegen", "Permission:BlogManagement.Delete": "Verwijderen", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/pl-PL.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/pl-PL.json index 6c5e77a7d3..5a2ed06a5d 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/pl-PL.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/pl-PL.json @@ -75,7 +75,7 @@ "PageDeletionConfirmationMessage": "Czy na pewno chcesz usunąć tę stronę?", "PageId": "Strona", "Pages": "Strony", - "PageSlugInformation": "Slug jest używany na adresie URL. Twój adres URL to „/pages/{{slug}}”.", + "PageSlugInformation": "Slug jest używany na adresie URL. Twój adres URL to „/{{slug}}”.", "Permission:BlogManagement": "Zarządzanie blogiem", "Permission:BlogManagement.Create": "Tworzyć", "Permission:BlogManagement.Delete": "Kasować", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/pt-BR.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/pt-BR.json index 5ec2a64799..fff05fefdd 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/pt-BR.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/pt-BR.json @@ -75,7 +75,7 @@ "PageDeletionConfirmationMessage": "Tem certeza que deseja deletar esta página?", "PageId": "Página", "Pages": "Páginas", - "PageSlugInformation": "Slug é usado na url. Sua url será '/pages/{{slug}}'.", + "PageSlugInformation": "Slug é usado na url. Sua url será '/{{slug}}'.", "Permission:BlogManagement": "Gerenciamento de blogs", "Permission:BlogManagement.Create": "Criar", "Permission:BlogManagement.Delete": "Excluir", @@ -181,6 +181,31 @@ "HasBlogPostWaitingForReviewMessage": "Você tem uma postagem para revisão. Clique para listar.", "SelectAStatus": "Selecione um status", "Status": "Status", - "CmsKit.BlogPost.ScrollIndex": "Barra de navegação rápida em postagens" + "CmsKit.BlogPost.ScrollIndex": "Barra de navegação rápida em postagens", + "Add": "Adicionar", + "AddWidget": "Adicionar Widget", + "PleaseConfigureWidgets": "Por favor, configure os widgets", + "SelectAnAuthor": "Selecione um Autor", + "InThisDocument": "Neste Documento", + "GoToTop": "Ir para o Topo", + "Feature:CmsKitGroup": "Cms Kit", + "Feature:BlogEnable": "Habilitar página de blog", + "Feature:BlogEnableDescription": "Habilitar página de blog no aplicativo.", + "Feature:CommentEnable": "Habilitar comentários", + "Feature:CommentEnableDescription": "Habilitar comentários no aplicativo.", + "Feature:GlobalResourceEnable": "Recursos globais ativados", + "Feature:GlobalResourceEnableDescription": "Habilitar recurso global no aplicativo.", + "Feature:MediaEnable": "Mídia ativada", + "Feature:MediaEnableDescription": "Mídia ativada no aplicativo.", + "Feature:MenuEnable": "Menu habilitado", + "Feature:MenuEnableDescription": "Menu habilitado no aplicativo.", + "Feature:PageEnable": "Página de paginação ativada", + "Feature:PageEnableDescription": "Página de paginação ativada no aplicativo.", + "Feature:RatingEnable": "Classificação ativada", + "Feature:RatingEnableDescription": "Classificação ativada no aplicativo.", + "Feature:ReactionEnable": "Reações habilitadas", + "Feature:ReactionEnableDescription": "Reações habilitadas no aplicativo.", + "Feature:TagEnable": "Habilitar tag", + "Feature:TagEnableDescription": "Habilitar tag no aplicativo." } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/ro-RO.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/ro-RO.json index 3e7e1caaa9..9cd519bb53 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/ro-RO.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/ro-RO.json @@ -75,7 +75,7 @@ "PageDeletionConfirmationMessage": "Sunteţi sigur(ă) că vreţi să ştergeţi această pagină?", "PageId": "Pagina", "Pages": "Pagini", - "PageSlugInformation": "Slug este folosit pe url. Url-ul dumneavoastră va fi '/pages/{{slug}}'.", + "PageSlugInformation": "Slug este folosit pe url. Url-ul dumneavoastră va fi '/{{slug}}'.", "Permission:BlogManagement": "Administrare Blog", "Permission:BlogManagement.Create": "Creează", "Permission:BlogManagement.Delete": "Şterge", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/ru.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/ru.json index 289b952e1b..f95ee910e4 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/ru.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/ru.json @@ -75,7 +75,7 @@ "PageDeletionConfirmationMessage": "Вы уверены, что хотите удалить эту страницу?", "PageId": "Страница", "Pages": "Страницы", - "PageSlugInformation": "Слаг используется для URL. Ваш URL-адрес будет '/pages/{{slug}}'.", + "PageSlugInformation": "Слаг используется для URL. Ваш URL-адрес будет '/{{slug}}'.", "Permission:BlogManagement": "Управление блогом", "Permission:BlogManagement.Create": "Создавать", "Permission:BlogManagement.Delete": "Удалить", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/sk.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/sk.json index d5873f42e1..2cf9410ca9 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/sk.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/sk.json @@ -75,7 +75,7 @@ "PageDeletionConfirmationMessage": "Určite chcete túto stránku vymazať?", "PageId": "Stránka", "Pages": "Stránky", - "PageSlugInformation": "Slug sa používa v URL. Vaša URL bude '/pages/{{slug}}'.", + "PageSlugInformation": "Slug sa používa v URL. Vaša URL bude '/{{slug}}'.", "Permission:BlogManagement": "Správa blogov", "Permission:BlogManagement.Create": "Vytvoriť", "Permission:BlogManagement.Delete": "Zmazať", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/sl.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/sl.json index 0a79428aac..22f252ea51 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/sl.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/sl.json @@ -75,7 +75,7 @@ "PageDeletionConfirmationMessage": "Ali ste prepričani, da želite izbrisati to stran?", "PageId": "stran", "Pages": "strani", - "PageSlugInformation": "Slug se uporablja na url-ju. Vaš url bo '/pages/{{slug}}'.", + "PageSlugInformation": "Slug se uporablja na url-ju. Vaš url bo '/{{slug}}'.", "Permission:BlogManagement": "Upravljanje blogov", "Permission:BlogManagement.Create": "Ustvari", "Permission:BlogManagement.Delete": "Izbriši", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json index b49f1f8326..78fb34087b 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json @@ -75,7 +75,7 @@ "PageDeletionConfirmationMessage": "Bu sayfayı silmek istediğinize emin misiniz?", "PageId": "Sayfa", "Pages": "Sayfalar", - "PageSlugInformation": "Etiket URL'de kullanılır. Url şöyle görünür: '/pages/{{slug}}'.", + "PageSlugInformation": "Etiket URL'de kullanılır. Url şöyle görünür: '/{{slug}}'.", "Permission:BlogManagement": "Blog Yönetimi", "Permission:BlogManagement.Create": "Oluşturma", "Permission:BlogManagement.Delete": "Silme", @@ -187,6 +187,28 @@ "InThisDocument": "Bu belgede", "RemoveCoverImageConfirmationMessage": "Kapak resmini kaldırmak istediğinize emin misiniz?", "RemoveCoverImage": "Kapak resmini kaldır", - "CmsKit.BlogPost.ScrollIndex": "Blog yazılarında hızlı gezinme çubuğu" + "CmsKit.BlogPost.ScrollIndex": "Blog yazılarında hızlı gezinme çubuğu", + "Add": "Ekle", + "AddWidget": "Widget Ekle", + "PleaseConfigureWidgets": "Lütfen widget'leri yapılandırın", + "Feature:CmsKitGroup": "Cms Kit", + "Feature:BlogEnable": "Blog sayfasını etkinleştirin", + "Feature:BlogEnableDescription": "Uygulamınızdaki blog sayfasını etkinleştirir.", + "Feature:CommentEnable": "Yorum özelliğini etkinleştirin", + "Feature:CommentEnableDescription": "Uygulamınızdaki yorum özelliğini etkinleştirir.", + "Feature:GlobalResourceEnable": "Blog global kaynakları etkinleştirin", + "Feature:GlobalResourceEnableDescription": "Uygulamınızdaki global kaynakları etkinleştirir.", + "Feature:MediaEnable": "Medyayı etkinleştirin", + "Feature:MediaEnableDescription": "Uygulamınızdaki medyayı etkinleştirir.", + "Feature:MenuEnable": "Menüyü etkinleştirin", + "Feature:MenuEnableDescription": "Uygulamınızdaki menüyü etkinleştirir.", + "Feature:PageEnable": "Sayfa özelliğini etkinleştirin", + "Feature:PageEnableDescription": "Uygulamınızdaki sayfa özelliğini etkinleştirir.", + "Feature:RatingEnable": "Oylamayı etkinleştirin", + "Feature:RatingEnableDescription": "Uygulamınızdaki oylamayı etkinleştirir.", + "Feature:ReactionEnable": "Reaksiyonları etkinleştirin", + "Feature:ReactionEnableDescription": "Uygulamınızdaki reaksiyonları etkinleştirir.", + "Feature:TagEnable": "Etkiketleri etkinleştirin", + "Feature:TagEnableDescription": "Uygulamınızdaki etiketleri etkinleştirir." } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/vi.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/vi.json index b0ed51a5d6..a581da6362 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/vi.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/vi.json @@ -75,7 +75,7 @@ "PageDeletionConfirmationMessage": "Bạn có chắc chắn xóa trang này không?", "PageId": "Trang", "Pages": "Các trang", - "PageSlugInformation": "Slug được sử dụng trên url. Url của bạn sẽ là '/pages/{{slug}}'.", + "PageSlugInformation": "Slug được sử dụng trên url. Url của bạn sẽ là '/{{slug}}'.", "Permission:BlogManagement": "Quản lý blog", "Permission:BlogManagement.Create": "Tạo ra", "Permission:BlogManagement.Delete": "Xóa bỏ", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/zh-Hans.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/zh-Hans.json index b312349ef4..bba6fff938 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/zh-Hans.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/zh-Hans.json @@ -75,7 +75,7 @@ "PageDeletionConfirmationMessage": "你确定删除这个页面吗?", "PageId": "页", "Pages": "页面", - "PageSlugInformation": "Slug用于url. 你的url将是 '/pages/{{slug}}'.", + "PageSlugInformation": "Slug用于url. 你的url将是 '/{{slug}}'.", "Permission:BlogManagement": "博客管理", "Permission:BlogManagement.Create": "创建", "Permission:BlogManagement.Delete": "删除", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/zh-Hant.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/zh-Hant.json index 49584e5af0..91a742deba 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/zh-Hant.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/zh-Hant.json @@ -75,7 +75,7 @@ "PageDeletionConfirmationMessage": "你確定刪除這個頁面嗎?", "PageId": "頁", "Pages": "頁面", - "PageSlugInformation": "Slug用於網址. 你的網址將是 '/pages/{{slug}}'.", + "PageSlugInformation": "Slug用於網址. 你的網址將是 '/{{slug}}'.", "Permission:BlogManagement": "部落格管理", "Permission:BlogManagement.Create": "創建", "Permission:BlogManagement.Delete": "刪除", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Pages/PageConsts.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Pages/PageConsts.cs index 9f03dc809f..ff07df87a1 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Pages/PageConsts.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Pages/PageConsts.cs @@ -2,7 +2,7 @@ namespace Volo.CmsKit.Pages; -public class PageConsts +public static class PageConsts { public const string EntityType = "Page"; @@ -16,7 +16,7 @@ public class PageConsts public static int MaxStyleLength { get; set; } = int.MaxValue; - private static string _urlPrefix = "/pages/"; + private static string _urlPrefix = "/"; public static string UrlPrefix { get => _urlPrefix; set => _urlPrefix = value.EnsureEndsWith('/').EnsureStartsWith('/'); diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo.CmsKit.Domain.abppkg.analyze.json b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo.CmsKit.Domain.abppkg.analyze.json index afd65daf19..20d1bbb536 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo.CmsKit.Domain.abppkg.analyze.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo.CmsKit.Domain.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.CmsKit.Domain", - "hash": "6e431ab37f61b3f7bb7ca8517a1543d6", + "hash": "1e318a63acb08c17193414845709b752", "contents": [ { "namespace": "Volo.CmsKit", @@ -70,6 +70,15 @@ "contentType": "aggregateRoot", "name": "MediaDescriptor" }, + { + "namespace": "Volo.CmsKit.GlobalResources", + "primaryKeyType": "Guid", + "summary": null, + "collectionProperties": [], + "navigationProperties": [], + "contentType": "aggregateRoot", + "name": "GlobalResource" + }, { "namespace": "Volo.CmsKit.Comments", "primaryKeyType": "Guid", @@ -150,6 +159,12 @@ "contentType": "domainService", "name": "MediaDescriptorManager" }, + { + "namespace": "Volo.CmsKit.GlobalResources", + "summary": null, + "contentType": "domainService", + "name": "GlobalResourceManager" + }, { "namespace": "Volo.CmsKit.Comments", "summary": null, @@ -177,7 +192,7 @@ { "namespace": "Volo.CmsKit.Users", "summary": null, - "entityModel": { + "entityAnalyzeModel": { "namespace": "Volo.CmsKit.Users", "primaryKeyType": "Guid", "summary": null, @@ -192,7 +207,7 @@ { "namespace": "Volo.CmsKit.Tags", "summary": null, - "entityModel": { + "entityAnalyzeModel": { "namespace": "Volo.CmsKit.Tags", "primaryKeyType": null, "summary": null, @@ -207,7 +222,7 @@ { "namespace": "Volo.CmsKit.Tags", "summary": null, - "entityModel": { + "entityAnalyzeModel": { "namespace": "Volo.CmsKit.Tags", "primaryKeyType": "Guid", "summary": null, @@ -222,7 +237,7 @@ { "namespace": "Volo.CmsKit.Reactions", "summary": null, - "entityModel": { + "entityAnalyzeModel": { "namespace": "Volo.CmsKit.Reactions", "primaryKeyType": "Guid", "summary": null, @@ -237,7 +252,7 @@ { "namespace": "Volo.CmsKit.Ratings", "summary": null, - "entityModel": { + "entityAnalyzeModel": { "namespace": "Volo.CmsKit.Ratings", "primaryKeyType": "Guid", "summary": null, @@ -252,7 +267,7 @@ { "namespace": "Volo.CmsKit.Pages", "summary": null, - "entityModel": { + "entityAnalyzeModel": { "namespace": "Volo.CmsKit.Pages", "primaryKeyType": "Guid", "summary": null, @@ -267,7 +282,7 @@ { "namespace": "Volo.CmsKit.Menus", "summary": null, - "entityModel": { + "entityAnalyzeModel": { "namespace": "Volo.CmsKit.Menus", "primaryKeyType": "Guid", "summary": null, @@ -282,7 +297,7 @@ { "namespace": "Volo.CmsKit.MediaDescriptors", "summary": null, - "entityModel": { + "entityAnalyzeModel": { "namespace": "Volo.CmsKit.MediaDescriptors", "primaryKeyType": "Guid", "summary": null, @@ -294,10 +309,25 @@ "contentType": "repositoryInterface", "name": "IMediaDescriptorRepository" }, + { + "namespace": "Volo.CmsKit.GlobalResources", + "summary": null, + "entityAnalyzeModel": { + "namespace": "Volo.CmsKit.GlobalResources", + "primaryKeyType": "Guid", + "summary": null, + "collectionProperties": [], + "navigationProperties": [], + "contentType": "entity", + "name": "GlobalResource" + }, + "contentType": "repositoryInterface", + "name": "IGlobalResourceRepository" + }, { "namespace": "Volo.CmsKit.Comments", "summary": null, - "entityModel": { + "entityAnalyzeModel": { "namespace": "Volo.CmsKit.Comments", "primaryKeyType": "Guid", "summary": null, @@ -312,7 +342,7 @@ { "namespace": "Volo.CmsKit.Blogs", "summary": null, - "entityModel": { + "entityAnalyzeModel": { "namespace": "Volo.CmsKit.Blogs", "primaryKeyType": "Guid", "summary": null, @@ -327,7 +357,7 @@ { "namespace": "Volo.CmsKit.Blogs", "summary": null, - "entityModel": { + "entityAnalyzeModel": { "namespace": "Volo.CmsKit.Blogs", "primaryKeyType": "Guid", "summary": null, @@ -344,7 +374,7 @@ { "namespace": "Volo.CmsKit.Blogs", "summary": null, - "entityModel": { + "entityAnalyzeModel": { "namespace": "Volo.CmsKit.Blogs", "primaryKeyType": "Guid", "summary": null, diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/CmsKitDbProperties.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/AbpCmsKitDbProperties.cs similarity index 83% rename from modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/CmsKitDbProperties.cs rename to modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/AbpCmsKitDbProperties.cs index 6a29834233..1ce1fd8413 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/CmsKitDbProperties.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/AbpCmsKitDbProperties.cs @@ -1,6 +1,6 @@ namespace Volo.CmsKit; -public static class CmsKitDbProperties +public static class AbpCmsKitDbProperties { public static string DbTablePrefix { get; set; } = "Cms"; diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Tags/EntityTagManager.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Tags/EntityTagManager.cs index b33d337a06..98a401af17 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Tags/EntityTagManager.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Tags/EntityTagManager.cs @@ -1,9 +1,9 @@ -using JetBrains.Annotations; -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; +using JetBrains.Annotations; using Volo.Abp.Domain.Services; namespace Volo.CmsKit.Tags; @@ -62,7 +62,7 @@ public class EntityTagManager : DomainService var deletedTags = existingTags.Where(x => !tags.Contains(x.Name)).ToList(); var addedTags = tags.Where(x => !existingTags.Any(a => a.Name == x)); - await EntityTagRepository.DeleteManyAsync(deletedTags.Select(s => s.Id).ToArray()); + await EntityTagRepository.DeleteManyAsync(deletedTags.Select(s => s.Id).ToArray(), entityId); foreach (var addedTag in addedTags) { @@ -79,4 +79,12 @@ public class EntityTagManager : DomainService { return await EntityTagRepository.GetEntityIdsFilteredByTagAsync(tagId, tenantId, cancellationToken); } + public async Task> GetEntityIdsFilteredByTagNameAsync( + [NotNull] string tagName, + [NotNull] string entityType, + [CanBeNull] Guid? tenantId, + CancellationToken cancellationToken = default) + { + return await EntityTagRepository.GetEntityIdsFilteredByTagNameAsync(tagName, entityType, tenantId, cancellationToken); + } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Tags/IEntityTagRepository.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Tags/IEntityTagRepository.cs index a96402267d..098ac8e46c 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Tags/IEntityTagRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Tags/IEntityTagRepository.cs @@ -1,8 +1,8 @@ -using JetBrains.Annotations; -using System; +using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; +using JetBrains.Annotations; using Volo.Abp.Domain.Repositories; namespace Volo.CmsKit.Tags; @@ -15,10 +15,16 @@ public interface IEntityTagRepository : IBasicRepository [CanBeNull] Guid? tenantId, CancellationToken cancellationToken = default); - Task DeleteManyAsync(Guid[] tagIds, CancellationToken cancellationToken = default); + Task DeleteManyAsync(Guid[] tagIds, string entityId, CancellationToken cancellationToken = default); Task> GetEntityIdsFilteredByTagAsync( [NotNull] Guid tagId, [CanBeNull] Guid? tenantId, CancellationToken cancellationToken = default); + + Task> GetEntityIdsFilteredByTagNameAsync( + [NotNull] string tagName, + [NotNull] string entityType, + [CanBeNull] Guid? tenantId = null, + CancellationToken cancellationToken = default); } diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo.CmsKit.EntityFrameworkCore.abppkg.analyze.json b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo.CmsKit.EntityFrameworkCore.abppkg.analyze.json index 35e555ec1a..fa9d342f83 100644 --- a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo.CmsKit.EntityFrameworkCore.abppkg.analyze.json +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo.CmsKit.EntityFrameworkCore.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.CmsKit.EntityFrameworkCore", - "hash": "f0cfc503a962ac59adb8d27be83a20a1", + "hash": "b7aab122bf55ecff3063a1b65efe0642", "contents": [ { "namespace": "Volo.CmsKit.EntityFrameworkCore", diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContext.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContext.cs index 8f501f4c98..265495f5bf 100644 --- a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContext.cs +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContext.cs @@ -14,7 +14,7 @@ using Volo.CmsKit.Users; namespace Volo.CmsKit.EntityFrameworkCore; -[ConnectionStringName(CmsKitDbProperties.ConnectionStringName)] +[ConnectionStringName(AbpCmsKitDbProperties.ConnectionStringName)] public class CmsKitDbContext : AbpDbContext, ICmsKitDbContext { public DbSet Comments { get; set; } diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs index 9ab103fefc..9a42f6c4b0 100644 --- a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs @@ -28,7 +28,7 @@ public static class CmsKitDbContextModelCreatingExtensions { builder.Entity(b => { - b.ToTable(CmsKitDbProperties.DbTablePrefix + "Users", CmsKitDbProperties.DbSchema); + b.ToTable(AbpCmsKitDbProperties.DbTablePrefix + "Users", AbpCmsKitDbProperties.DbSchema); b.ConfigureByConvention(); b.ConfigureAbpUser(); @@ -48,7 +48,7 @@ public static class CmsKitDbContextModelCreatingExtensions { builder.Entity(b => { - b.ToTable(CmsKitDbProperties.DbTablePrefix + "UserReactions", CmsKitDbProperties.DbSchema); + b.ToTable(AbpCmsKitDbProperties.DbTablePrefix + "UserReactions", AbpCmsKitDbProperties.DbSchema); b.ConfigureByConvention(); @@ -71,7 +71,7 @@ public static class CmsKitDbContextModelCreatingExtensions { builder.Entity(b => { - b.ToTable(CmsKitDbProperties.DbTablePrefix + "Comments", CmsKitDbProperties.DbSchema); + b.ToTable(AbpCmsKitDbProperties.DbTablePrefix + "Comments", AbpCmsKitDbProperties.DbSchema); b.ConfigureByConvention(); @@ -95,7 +95,7 @@ public static class CmsKitDbContextModelCreatingExtensions { builder.Entity(r => { - r.ToTable(CmsKitDbProperties.DbTablePrefix + "Ratings", CmsKitDbProperties.DbSchema); + r.ToTable(AbpCmsKitDbProperties.DbTablePrefix + "Ratings", AbpCmsKitDbProperties.DbSchema); r.ConfigureByConvention(); @@ -117,7 +117,7 @@ public static class CmsKitDbContextModelCreatingExtensions { builder.Entity(b => { - b.ToTable(CmsKitDbProperties.DbTablePrefix + "Tags", CmsKitDbProperties.DbSchema); + b.ToTable(AbpCmsKitDbProperties.DbTablePrefix + "Tags", AbpCmsKitDbProperties.DbSchema); b.ConfigureByConvention(); @@ -134,7 +134,7 @@ public static class CmsKitDbContextModelCreatingExtensions builder.Entity(b => { - b.ToTable(CmsKitDbProperties.DbTablePrefix + "EntityTags", CmsKitDbProperties.DbSchema); + b.ToTable(AbpCmsKitDbProperties.DbTablePrefix + "EntityTags", AbpCmsKitDbProperties.DbSchema); b.ConfigureByConvention(); @@ -158,7 +158,7 @@ public static class CmsKitDbContextModelCreatingExtensions { builder.Entity(b => { - b.ToTable(CmsKitDbProperties.DbTablePrefix + "Pages", CmsKitDbProperties.DbSchema); + b.ToTable(AbpCmsKitDbProperties.DbTablePrefix + "Pages", AbpCmsKitDbProperties.DbSchema); b.ConfigureByConvention(); @@ -180,7 +180,7 @@ public static class CmsKitDbContextModelCreatingExtensions { builder.Entity(b => { - b.ToTable(CmsKitDbProperties.DbTablePrefix + "Blogs", CmsKitDbProperties.DbSchema); + b.ToTable(AbpCmsKitDbProperties.DbTablePrefix + "Blogs", AbpCmsKitDbProperties.DbSchema); b.ConfigureByConvention(); @@ -193,7 +193,7 @@ public static class CmsKitDbContextModelCreatingExtensions builder.Entity(b => { - b.ToTable(CmsKitDbProperties.DbTablePrefix + "BlogPosts", CmsKitDbProperties.DbSchema); + b.ToTable(AbpCmsKitDbProperties.DbTablePrefix + "BlogPosts", AbpCmsKitDbProperties.DbSchema); b.ConfigureByConvention(); @@ -210,7 +210,7 @@ public static class CmsKitDbContextModelCreatingExtensions builder.Entity(b => { - b.ToTable(CmsKitDbProperties.DbTablePrefix + "BlogFeatures", CmsKitDbProperties.DbSchema); + b.ToTable(AbpCmsKitDbProperties.DbTablePrefix + "BlogFeatures", AbpCmsKitDbProperties.DbSchema); b.ConfigureByConvention(); @@ -230,7 +230,7 @@ public static class CmsKitDbContextModelCreatingExtensions { builder.Entity(b => { - b.ToTable(CmsKitDbProperties.DbTablePrefix + "MediaDescriptors", CmsKitDbProperties.DbSchema); + b.ToTable(AbpCmsKitDbProperties.DbTablePrefix + "MediaDescriptors", AbpCmsKitDbProperties.DbSchema); b.ConfigureByConvention(); @@ -251,7 +251,7 @@ public static class CmsKitDbContextModelCreatingExtensions { builder.Entity(b => { - b.ToTable(CmsKitDbProperties.DbTablePrefix + "MenuItems", CmsKitDbProperties.DbSchema); + b.ToTable(AbpCmsKitDbProperties.DbTablePrefix + "MenuItems", AbpCmsKitDbProperties.DbSchema); b.ConfigureByConvention(); @@ -269,7 +269,7 @@ public static class CmsKitDbContextModelCreatingExtensions { builder.Entity(b => { - b.ToTable(CmsKitDbProperties.DbTablePrefix + "GlobalResources", CmsKitDbProperties.DbSchema); + b.ToTable(AbpCmsKitDbProperties.DbTablePrefix + "GlobalResources", AbpCmsKitDbProperties.DbSchema); b.ConfigureByConvention(); diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/ICmsKitDbContext.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/ICmsKitDbContext.cs index fca31f2d73..8b6edc1cbe 100644 --- a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/ICmsKitDbContext.cs +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/ICmsKitDbContext.cs @@ -14,7 +14,7 @@ using Volo.CmsKit.Users; namespace Volo.CmsKit.EntityFrameworkCore; -[ConnectionStringName(CmsKitDbProperties.ConnectionStringName)] +[ConnectionStringName(AbpCmsKitDbProperties.ConnectionStringName)] public interface ICmsKitDbContext : IEfCoreDbContext { DbSet Comments { get; } diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Pages/EfCorePageRepository.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Pages/EfCorePageRepository.cs index 248c42282a..125c1a97ff 100644 --- a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Pages/EfCorePageRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Pages/EfCorePageRepository.cs @@ -25,7 +25,7 @@ public class EfCorePageRepository : EfCoreRepository - x.Title.Contains(filter) + x.Title.ToLower().Contains(filter.ToLower()) || x.Slug.Contains(filter) ).CountAsync(GetCancellationToken(cancellationToken)); } @@ -39,7 +39,7 @@ public class EfCorePageRepository : EfCoreRepository - x.Title.Contains(filter)) + x.Title.ToLower().Contains(filter.ToLower()) || x.Slug.Contains(filter)) .OrderBy(sorting.IsNullOrEmpty() ? nameof(Page.Title) : sorting) .PageBy(skipCount, maxResultCount) .ToListAsync(GetCancellationToken(cancellationToken)); diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Tags/EfCoreEntityTagRepository.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Tags/EfCoreEntityTagRepository.cs index fe7e622841..8dfeacfc36 100644 --- a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Tags/EfCoreEntityTagRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Tags/EfCoreEntityTagRepository.cs @@ -1,9 +1,9 @@ -using JetBrains.Annotations; -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; +using JetBrains.Annotations; using Microsoft.EntityFrameworkCore; using Volo.Abp; using Volo.Abp.Domain.Repositories.EntityFrameworkCore; @@ -19,11 +19,11 @@ public class EfCoreEntityTagRepository : EfCoreRepository(); - dbSet.RemoveRange(dbSet.Where(x => tagIds.Contains(x.TagId))); + dbSet.RemoveRange(dbSet.Where(x => tagIds.Contains(x.TagId) && x.EntityId == entityId)); await dbContext.SaveChangesAsync(GetCancellationToken(cancellationToken)); } @@ -52,4 +52,22 @@ public class EfCoreEntityTagRepository : EfCoreRepository q.EntityId) .ToListAsync(cancellationToken: GetCancellationToken(cancellationToken)); } + + public async Task> GetEntityIdsFilteredByTagNameAsync( + [NotNull] string tagName, + [NotNull] string entityType, + [CanBeNull] Guid? tenantId = null, + CancellationToken cancellationToken = default) + { + var dbContext = await GetDbContextAsync(); + var result = from et in dbContext.Set() + join t in dbContext.Set() on et.TagId equals t.Id + where t.Name == tagName + && t.EntityType == entityType + && et.TenantId == tenantId + && t.TenantId == tenantId + && !t.IsDeleted + select et.EntityId; + return await result.ToListAsync(cancellationToken: GetCancellationToken(cancellationToken)); + } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.HttpApi.Client/Volo.CmsKit.HttpApi.Client.abppkg.analyze.json b/modules/cms-kit/src/Volo.CmsKit.HttpApi.Client/Volo.CmsKit.HttpApi.Client.abppkg.analyze.json index cd62bcacf9..ee45a8e783 100644 --- a/modules/cms-kit/src/Volo.CmsKit.HttpApi.Client/Volo.CmsKit.HttpApi.Client.abppkg.analyze.json +++ b/modules/cms-kit/src/Volo.CmsKit.HttpApi.Client/Volo.CmsKit.HttpApi.Client.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.CmsKit.HttpApi.Client", - "hash": "6471d04d18e68f42e54afa8e98035ca5", + "hash": "dac3747019bc31633a80784616bdbe61", "contents": [ { "namespace": "Volo.CmsKit", diff --git a/modules/cms-kit/src/Volo.CmsKit.HttpApi/Volo.CmsKit.HttpApi.abppkg.analyze.json b/modules/cms-kit/src/Volo.CmsKit.HttpApi/Volo.CmsKit.HttpApi.abppkg.analyze.json index c1ffb79749..2adf100593 100644 --- a/modules/cms-kit/src/Volo.CmsKit.HttpApi/Volo.CmsKit.HttpApi.abppkg.analyze.json +++ b/modules/cms-kit/src/Volo.CmsKit.HttpApi/Volo.CmsKit.HttpApi.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.CmsKit.HttpApi", - "hash": "396cfcff38fbee04def6feee7d1cfec8", + "hash": "35d6b578e63adb4e4fe8876bfdba83c8", "contents": [ { "namespace": "Volo.CmsKit", diff --git a/modules/cms-kit/src/Volo.CmsKit.Installer/Volo.CmsKit.Installer.csproj b/modules/cms-kit/src/Volo.CmsKit.Installer/Volo.CmsKit.Installer.csproj index 4ed4ae03fa..3dbb813339 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Installer/Volo.CmsKit.Installer.csproj +++ b/modules/cms-kit/src/Volo.CmsKit.Installer/Volo.CmsKit.Installer.csproj @@ -4,19 +4,21 @@ - net5.0 + net6.0 true - + + + diff --git a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo.CmsKit.MongoDB.abppkg.analyze.json b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo.CmsKit.MongoDB.abppkg.analyze.json index e74164abd4..f9e9fde584 100644 --- a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo.CmsKit.MongoDB.abppkg.analyze.json +++ b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo.CmsKit.MongoDB.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.CmsKit.MongoDB", - "hash": "8c2fac3aaa67ccfc101938cf7e0e6ba3", + "hash": "6ab237cd16e1bd42d96b93f76b992622", "contents": [ { "namespace": "Volo.CmsKit.MongoDB", @@ -12,24 +12,34 @@ "connectionStringName": "CmsKit", "databaseCollections": [ { - "entityFullName": "Volo.CmsKit.Comments.Comment", + "entityFullName": "Volo.CmsKit.Users.CmsUser", "contentType": "databaseCollection", - "name": "CmsComments" + "name": "CmsUsers" }, { - "entityFullName": "Volo.CmsKit.Tags.Tag", + "entityFullName": "Volo.CmsKit.Reactions.UserReaction", "contentType": "databaseCollection", - "name": "CmsTags" + "name": "CmsUserReactions" }, { - "entityFullName": "Volo.CmsKit.Reactions.UserReaction", + "entityFullName": "Volo.CmsKit.Blogs.BlogPost", "contentType": "databaseCollection", - "name": "CmsUserReactions" + "name": "CmsBlogPosts" }, { - "entityFullName": "Volo.CmsKit.Tags.EntityTag", + "entityFullName": "Volo.CmsKit.MediaDescriptors.MediaDescriptor", "contentType": "databaseCollection", - "name": "CmsEntityTags" + "name": "CmsMediaDescriptors" + }, + { + "entityFullName": "Volo.CmsKit.Pages.Page", + "contentType": "databaseCollection", + "name": "CmsPages" + }, + { + "entityFullName": "Volo.CmsKit.Tags.Tag", + "contentType": "databaseCollection", + "name": "CmsTags" }, { "entityFullName": "Volo.CmsKit.Blogs.BlogFeature", @@ -37,19 +47,19 @@ "name": "CmsBlogFeatures" }, { - "entityFullName": "Volo.CmsKit.Menus.MenuItem", + "entityFullName": "Volo.CmsKit.Blogs.Blog", "contentType": "databaseCollection", - "name": "CmsMenuItems" + "name": "CmsBlogs" }, { - "entityFullName": "Volo.CmsKit.MediaDescriptors.MediaDescriptor", + "entityFullName": "Volo.CmsKit.Comments.Comment", "contentType": "databaseCollection", - "name": "CmsMediaDescriptors" + "name": "CmsComments" }, { - "entityFullName": "Volo.CmsKit.Pages.Page", + "entityFullName": "Volo.CmsKit.GlobalResources.GlobalResource", "contentType": "databaseCollection", - "name": "CmsPages" + "name": "CmsGlobalResources" }, { "entityFullName": "Volo.CmsKit.Ratings.Rating", @@ -57,19 +67,14 @@ "name": "CmsRatings" }, { - "entityFullName": "Volo.CmsKit.Blogs.BlogPost", - "contentType": "databaseCollection", - "name": "CmsBlogPosts" - }, - { - "entityFullName": "Volo.CmsKit.Blogs.Blog", + "entityFullName": "Volo.CmsKit.Menus.MenuItem", "contentType": "databaseCollection", - "name": "CmsBlogs" + "name": "CmsMenuItems" }, { - "entityFullName": "Volo.CmsKit.Users.CmsUser", + "entityFullName": "Volo.CmsKit.Tags.EntityTag", "contentType": "databaseCollection", - "name": "CmsUsers" + "name": "CmsEntityTags" } ], "contentType": "mongoDbContext", diff --git a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/CmsKitMongoDbContext.cs b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/CmsKitMongoDbContext.cs index 36c9cf882c..c6a97dfbef 100644 --- a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/CmsKitMongoDbContext.cs +++ b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/CmsKitMongoDbContext.cs @@ -15,7 +15,7 @@ using Tag = Volo.CmsKit.Tags.Tag; namespace Volo.CmsKit.MongoDB; -[ConnectionStringName(CmsKitDbProperties.ConnectionStringName)] +[ConnectionStringName(AbpCmsKitDbProperties.ConnectionStringName)] public class CmsKitMongoDbContext : AbpMongoDbContext, ICmsKitMongoDbContext { public IMongoCollection Comments => Collection(); diff --git a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/CmsKitMongoDbContextExtensions.cs b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/CmsKitMongoDbContextExtensions.cs index 7b7edcce0d..b6127ab125 100644 --- a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/CmsKitMongoDbContextExtensions.cs +++ b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/CmsKitMongoDbContextExtensions.cs @@ -22,67 +22,67 @@ public static class CmsKitMongoDbContextExtensions builder.Entity(x => { - x.CollectionName = CmsKitDbProperties.DbTablePrefix + "Users"; + x.CollectionName = AbpCmsKitDbProperties.DbTablePrefix + "Users"; }); builder.Entity(x => { - x.CollectionName = CmsKitDbProperties.DbTablePrefix + "UserReactions"; + x.CollectionName = AbpCmsKitDbProperties.DbTablePrefix + "UserReactions"; }); builder.Entity(x => { - x.CollectionName = CmsKitDbProperties.DbTablePrefix + "Comments"; + x.CollectionName = AbpCmsKitDbProperties.DbTablePrefix + "Comments"; }); builder.Entity(x => { - x.CollectionName = CmsKitDbProperties.DbTablePrefix + "Ratings"; + x.CollectionName = AbpCmsKitDbProperties.DbTablePrefix + "Ratings"; }); builder.Entity(x => { - x.CollectionName = CmsKitDbProperties.DbTablePrefix + "Tags"; + x.CollectionName = AbpCmsKitDbProperties.DbTablePrefix + "Tags"; }); builder.Entity(x => { - x.CollectionName = CmsKitDbProperties.DbTablePrefix + "EntityTags"; + x.CollectionName = AbpCmsKitDbProperties.DbTablePrefix + "EntityTags"; }); builder.Entity(x => { - x.CollectionName = CmsKitDbProperties.DbTablePrefix + "Pages"; + x.CollectionName = AbpCmsKitDbProperties.DbTablePrefix + "Pages"; }); builder.Entity(x => { - x.CollectionName = CmsKitDbProperties.DbTablePrefix + "Blogs"; + x.CollectionName = AbpCmsKitDbProperties.DbTablePrefix + "Blogs"; }); builder.Entity(x => { - x.CollectionName = CmsKitDbProperties.DbTablePrefix + "BlogPosts"; + x.CollectionName = AbpCmsKitDbProperties.DbTablePrefix + "BlogPosts"; }); builder.Entity(x => { - x.CollectionName = CmsKitDbProperties.DbTablePrefix + "BlogFeatures"; + x.CollectionName = AbpCmsKitDbProperties.DbTablePrefix + "BlogFeatures"; }); builder.Entity(x => { - x.CollectionName = CmsKitDbProperties.DbTablePrefix + "MediaDescriptors"; + x.CollectionName = AbpCmsKitDbProperties.DbTablePrefix + "MediaDescriptors"; }); builder.Entity(x => { - x.CollectionName = CmsKitDbProperties.DbTablePrefix + "MenuItems"; + x.CollectionName = AbpCmsKitDbProperties.DbTablePrefix + "MenuItems"; }); builder.Entity(x => { - x.CollectionName = CmsKitDbProperties.DbTablePrefix + "GlobalResources"; + x.CollectionName = AbpCmsKitDbProperties.DbTablePrefix + "GlobalResources"; }); } } diff --git a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/ICmsKitMongoDbContext.cs b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/ICmsKitMongoDbContext.cs index a2dff419e2..e220aff46e 100644 --- a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/ICmsKitMongoDbContext.cs +++ b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/ICmsKitMongoDbContext.cs @@ -15,7 +15,7 @@ using Tag = Volo.CmsKit.Tags.Tag; namespace Volo.CmsKit.MongoDB; -[ConnectionStringName(CmsKitDbProperties.ConnectionStringName)] +[ConnectionStringName(AbpCmsKitDbProperties.ConnectionStringName)] public interface ICmsKitMongoDbContext : IAbpMongoDbContext { IMongoCollection UserReactions { get; } diff --git a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Pages/MongoPageRepository.cs b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Pages/MongoPageRepository.cs index 85b596ff1b..74c5d8cc3c 100644 --- a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Pages/MongoPageRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Pages/MongoPageRepository.cs @@ -1,13 +1,13 @@ using System; +using System.Collections.Generic; using System.Linq; using System.Linq.Dynamic.Core; -using JetBrains.Annotations; -using MongoDB.Driver; -using Volo.Abp; -using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; +using JetBrains.Annotations; +using MongoDB.Driver; using MongoDB.Driver.Linq; +using Volo.Abp; using Volo.Abp.Domain.Repositories.MongoDB; using Volo.Abp.MongoDB; using Volo.CmsKit.Pages; @@ -30,7 +30,7 @@ public class MongoPageRepository : MongoDbRepository>( !filter.IsNullOrWhiteSpace(), u => - u.Title.Contains(filter) + u.Title.ToLower().Contains(filter) || u.Slug.Contains(filter) ).CountAsync(cancellation); } @@ -46,9 +46,7 @@ public class MongoPageRepository : MongoDbRepository>( !filter.IsNullOrWhiteSpace(), - u => - u.Title.Contains(filter) - ) + u => u.Title.ToLower().Contains(filter) || u.Slug.Contains(filter)) .OrderBy(sorting.IsNullOrEmpty() ? nameof(Page.Title) : sorting) .As>() .PageBy>(skipCount, maxResultCount) diff --git a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Tags/MongoEntityTagRepository.cs b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Tags/MongoEntityTagRepository.cs index 82952c9bf5..b270255900 100644 --- a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Tags/MongoEntityTagRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Tags/MongoEntityTagRepository.cs @@ -1,10 +1,10 @@ -using JetBrains.Annotations; -using MongoDB.Driver; -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; +using JetBrains.Annotations; +using MongoDB.Driver; using Volo.Abp; using Volo.Abp.Domain.Repositories.MongoDB; using Volo.Abp.MongoDB; @@ -19,12 +19,19 @@ public class MongoEntityTagRepository : MongoDbRepository.Filter.In(x => x.TagId, tagIds), token); + + var builder = Builders.Filter; + var filter = builder.And( + builder.In(x => x.TagId, tagIds), + builder.Eq(x => x.EntityId, entityId) + ); + + await collection.DeleteManyAsync(filter, token); } public virtual Task FindAsync( @@ -52,4 +59,30 @@ public class MongoEntityTagRepository : MongoDbRepository> GetEntityIdsFilteredByTagNameAsync( + [NotNull] string tagName, + [NotNull] string entityType, + [CanBeNull] Guid? tenantId = null, + CancellationToken cancellationToken = default) + { + var dbContext = await GetDbContextAsync(); + var entityTagQueryable = await GetMongoQueryableAsync(GetCancellationToken(cancellationToken)); + var tagQueryable = dbContext.Tags.AsQueryable(); + + var resultQueryable = entityTagQueryable + .Join( + tagQueryable, + o => o.TagId, + i => i.Id, + (entityTag, tag) => new { entityTag, tag }) + .Where(x => x.tag.EntityType == entityType + && x.entityTag.TenantId == tenantId + && x.tag.TenantId == tenantId + && x.tag.IsDeleted == false + ) + .Select(s => s.entityTag.EntityId); + + return await AsyncExecuter.ToListAsync(resultQueryable, GetCancellationToken(cancellationToken)); + } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo.CmsKit.Public.Application.Contracts.abppkg.analyze.json b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo.CmsKit.Public.Application.Contracts.abppkg.analyze.json index fda8fcbaa2..929233d3d3 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo.CmsKit.Public.Application.Contracts.abppkg.analyze.json +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo.CmsKit.Public.Application.Contracts.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.CmsKit.Public.Application.Contracts", - "hash": "308c90693f153360adbe46dcecaab560", + "hash": "dadad9e526e7b82b280e75a06e1456fc", "contents": [ { "namespace": "Volo.CmsKit.Public", diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/IBlogPostPublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/IBlogPostPublicAppService.cs index 42161f884c..a6462d937c 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/IBlogPostPublicAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/IBlogPostPublicAppService.cs @@ -1,18 +1,18 @@ -using System.Collections.Generic; -using JetBrains.Annotations; +using System; using System.Threading.Tasks; +using JetBrains.Annotations; using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Services; +using Volo.CmsKit.Contents; using Volo.CmsKit.Users; -using System; namespace Volo.CmsKit.Public.Blogs; public interface IBlogPostPublicAppService : IApplicationService { - Task> GetListAsync([NotNull] string blogSlug, BlogPostGetListInput input); + Task> GetListAsync([NotNull] string blogSlug, BlogPostGetListInput input); - Task GetAsync([NotNull] string blogSlug, [NotNull] string blogPostSlug); + Task GetAsync([NotNull] string blogSlug, [NotNull] string blogPostSlug); Task> GetAuthorsHasBlogPostsAsync(BlogPostFilteredPagedAndSortedResultRequestDto input); diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/GlobalResources/GlobalResourceDto.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/GlobalResources/GlobalResourceDto.cs index 16e0575288..5d1ba87fe0 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/GlobalResources/GlobalResourceDto.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/GlobalResources/GlobalResourceDto.cs @@ -1,8 +1,12 @@ -namespace Volo.CmsKit.Public.GlobalResources; +using System; +using Volo.Abp.Application.Dtos; -public class GlobalResourceDto +namespace Volo.CmsKit.Public.GlobalResources; + +[Serializable] +public class GlobalResourceDto : AuditedEntityDto { public string Name { get; set; } - + public string Value { get; set; } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Pages/IPagePublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Pages/IPagePublicAppService.cs index 0b33a91236..230b8ded97 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Pages/IPagePublicAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Pages/IPagePublicAppService.cs @@ -1,6 +1,7 @@ using JetBrains.Annotations; using System.Threading.Tasks; using Volo.Abp.Application.Services; +using Volo.CmsKit.Contents; namespace Volo.CmsKit.Public.Pages; diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo.CmsKit.Public.Application.abppkg.analyze.json b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo.CmsKit.Public.Application.abppkg.analyze.json index af31e0e774..93891adcf9 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo.CmsKit.Public.Application.abppkg.analyze.json +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo.CmsKit.Public.Application.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.CmsKit.Public.Application", - "hash": "9b54d4165467908818b3fa241e9f273e", + "hash": "35fc84bf4ee895c703bdf1cf037afb14", "contents": [ { "namespace": "Volo.CmsKit.Public", @@ -43,6 +43,15 @@ "contentType": "applicationService", "name": "MenuItemPublicAppService" }, + { + "namespace": "Volo.CmsKit.Public.GlobalResources", + "summary": null, + "implementingInterfaces": [ + "Volo.CmsKit.Public.GlobalResources.IGlobalResourcePublicAppService" + ], + "contentType": "applicationService", + "name": "GlobalResourcePublicAppService" + }, { "namespace": "Volo.CmsKit.Public.Comments", "summary": null, diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Blogs/BlogPostPublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Blogs/BlogPostPublicAppService.cs index ebdda3d293..5041406bd0 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Blogs/BlogPostPublicAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Blogs/BlogPostPublicAppService.cs @@ -1,48 +1,46 @@ -using JetBrains.Annotations; -using System; +using System; using System.Collections.Generic; using System.Threading.Tasks; +using JetBrains.Annotations; using Volo.Abp.Application.Dtos; +using Volo.Abp.Features; using Volo.Abp.GlobalFeatures; using Volo.CmsKit.Blogs; + using Volo.CmsKit.Contents; +using Volo.CmsKit.Features; using Volo.CmsKit.GlobalFeatures; using Volo.CmsKit.Users; namespace Volo.CmsKit.Public.Blogs; +[RequiresFeature(CmsKitFeatures.BlogEnable)] [RequiresGlobalFeature(typeof(BlogsFeature))] public class BlogPostPublicAppService : CmsKitPublicAppServiceBase, IBlogPostPublicAppService { protected IBlogRepository BlogRepository { get; } protected IBlogPostRepository BlogPostRepository { get; } - protected ContentParser ContentParser { get; } public BlogPostPublicAppService( IBlogRepository blogRepository, - IBlogPostRepository blogPostRepository, - ContentParser contentParser) + IBlogPostRepository blogPostRepository) { BlogRepository = blogRepository; BlogPostRepository = blogPostRepository; - ContentParser = contentParser; } - public virtual async Task GetAsync( + public virtual async Task GetAsync( [NotNull] string blogSlug, [NotNull] string blogPostSlug) { var blog = await BlogRepository.GetBySlugAsync(blogSlug); var blogPost = await BlogPostRepository.GetBySlugAsync(blog.Id, blogPostSlug); - var blogPostDto = ObjectMapper.Map(blogPost); - blogPostDto.ContentFragments = await ContentParser.ParseAsync(blogPost.Content); - - return blogPostDto; + return ObjectMapper.Map(blogPost); } - public virtual async Task> GetListAsync([NotNull] string blogSlug, BlogPostGetListInput input) + public virtual async Task> GetListAsync([NotNull] string blogSlug, BlogPostGetListInput input) { var blog = await BlogRepository.GetBySlugAsync(blogSlug); @@ -50,10 +48,10 @@ public class BlogPostPublicAppService : CmsKitPublicAppServiceBase, IBlogPostPub BlogPostStatus.Published, input.MaxResultCount, input.SkipCount, input.Sorting); - return new PagedResultDto( + return new PagedResultDto( await BlogPostRepository.GetCountAsync(blogId: blog.Id, tagId: input.TagId, statusFilter: BlogPostStatus.Published, authorId: input.AuthorId), - ObjectMapper.Map, List>(blogPosts)); + ObjectMapper.Map, List>(blogPosts)); } public virtual async Task> GetAuthorsHasBlogPostsAsync(BlogPostFilteredPagedAndSortedResultRequestDto input) diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Comments/CommentPublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Comments/CommentPublicAppService.cs index b1fae564d2..ef7e6be9fd 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Comments/CommentPublicAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Comments/CommentPublicAppService.cs @@ -1,20 +1,23 @@ -using Microsoft.AspNetCore.Authorization; -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using Microsoft.AspNetCore.Authorization; using Volo.Abp.Application.Dtos; using Volo.Abp.Authorization; using Volo.Abp.Data; using Volo.Abp.EventBus.Distributed; +using Volo.Abp.Features; using Volo.Abp.GlobalFeatures; using Volo.Abp.Users; using Volo.CmsKit.Comments; +using Volo.CmsKit.Features; using Volo.CmsKit.GlobalFeatures; using Volo.CmsKit.Users; namespace Volo.CmsKit.Public.Comments; +[RequiresFeature(CmsKitFeatures.CommentEnable)] [RequiresGlobalFeature(typeof(CommentsFeature))] public class CommentPublicAppService : CmsKitPublicAppServiceBase, ICommentPublicAppService { diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/GlobalResources/GlobalResourcePublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/GlobalResources/GlobalResourcePublicAppService.cs index 2debf10ed5..af0d1fbf39 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/GlobalResources/GlobalResourcePublicAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/GlobalResources/GlobalResourcePublicAppService.cs @@ -1,11 +1,14 @@ using System.Threading.Tasks; using Volo.Abp.Application.Services; +using Volo.Abp.Features; using Volo.Abp.GlobalFeatures; +using Volo.CmsKit.Features; using Volo.CmsKit.GlobalFeatures; using Volo.CmsKit.GlobalResources; namespace Volo.CmsKit.Public.GlobalResources; +[RequiresFeature(CmsKitFeatures.GlobalResourceEnable)] [RequiresGlobalFeature(typeof(GlobalResourcesFeature))] public class GlobalResourcePublicAppService : ApplicationService, IGlobalResourcePublicAppService { @@ -15,18 +18,18 @@ public class GlobalResourcePublicAppService : ApplicationService, IGlobalResourc { GlobalResourceManager = globalResourceManager; } - + public async Task GetGlobalScriptAsync() { var globalScript = await GlobalResourceManager.GetGlobalScriptAsync(); - + return ObjectMapper.Map(globalScript); } - + public async Task GetGlobalStyleAsync() { var globalStyle = await GlobalResourceManager.GetGlobalStyleAsync(); - + return ObjectMapper.Map(globalStyle); } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/GlobalResources/Handlers/GlobalResourceEventHandler.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/GlobalResources/Handlers/GlobalResourceEventHandler.cs index 1e9503006c..d16e271e4e 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/GlobalResources/Handlers/GlobalResourceEventHandler.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/GlobalResources/Handlers/GlobalResourceEventHandler.cs @@ -5,11 +5,10 @@ using Volo.Abp.Domain.Entities.Events; using Volo.Abp.EventBus; using Volo.Abp.ObjectMapping; using Volo.CmsKit.GlobalResources; -using Volo.CmsKit.Public.GlobalResources; namespace Volo.CmsKit.Public.GlobalResources.Handlers; -public class GlobalResourceEventHandler: +public class GlobalResourceEventHandler : ILocalEventHandler>, ITransientDependency { @@ -23,11 +22,11 @@ public class GlobalResourceEventHandler: ObjectMapper = objectMapper; _resourceCache = resourceCache; } - + public async Task HandleEventAsync(EntityUpdatedEventData eventData) { await _resourceCache.SetAsync( - eventData.Entity.Name, + eventData.Entity.Name, ObjectMapper.Map(eventData.Entity)); } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Menus/MenuItemPublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Menus/MenuItemPublicAppService.cs index 11a58d5935..0e9062d9af 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Menus/MenuItemPublicAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Menus/MenuItemPublicAppService.cs @@ -1,12 +1,15 @@ using System.Collections.Generic; using System.Threading.Tasks; using Volo.Abp.Caching; +using Volo.Abp.Features; using Volo.Abp.GlobalFeatures; +using Volo.CmsKit.Features; using Volo.CmsKit.GlobalFeatures; using Volo.CmsKit.Menus; namespace Volo.CmsKit.Public.Menus; +[RequiresFeature(CmsKitFeatures.MenuEnable)] [RequiresGlobalFeature(typeof(MenuFeature))] public class MenuItemPublicAppService : CmsKitPublicAppServiceBase, IMenuItemPublicAppService { diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Pages/PagePublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Pages/PagePublicAppService.cs index 2bae7c350f..c93adcd5a7 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Pages/PagePublicAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Pages/PagePublicAppService.cs @@ -1,21 +1,22 @@ using System.Threading.Tasks; +using Volo.Abp.Features; using Volo.Abp.GlobalFeatures; using Volo.CmsKit.Contents; +using Volo.CmsKit.Features; using Volo.CmsKit.GlobalFeatures; using Volo.CmsKit.Pages; namespace Volo.CmsKit.Public.Pages; +[RequiresFeature(CmsKitFeatures.PageEnable)] [RequiresGlobalFeature(typeof(PagesFeature))] public class PagePublicAppService : CmsKitPublicAppServiceBase, IPagePublicAppService { protected IPageRepository PageRepository { get; } - protected ContentParser ContentParser { get; } - public PagePublicAppService(IPageRepository pageRepository, ContentParser contentParser) + public PagePublicAppService(IPageRepository pageRepository) { PageRepository = pageRepository; - ContentParser = contentParser; } public virtual async Task FindBySlugAsync(string slug) @@ -27,8 +28,6 @@ public class PagePublicAppService : CmsKitPublicAppServiceBase, IPagePublicAppSe return null; } - var pageDto = ObjectMapper.Map(page); - pageDto.ContentFragments = await ContentParser.ParseAsync(page.Content); - return pageDto; + return ObjectMapper.Map(page); } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/PublicApplicationAutoMapperProfile.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/PublicApplicationAutoMapperProfile.cs index 704a03778c..92620743ff 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/PublicApplicationAutoMapperProfile.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/PublicApplicationAutoMapperProfile.cs @@ -2,13 +2,13 @@ using Volo.Abp.AutoMapper; using Volo.CmsKit.Blogs; using Volo.CmsKit.Comments; +using Volo.CmsKit.Contents; using Volo.CmsKit.GlobalResources; using Volo.CmsKit.Menus; using Volo.CmsKit.Pages; using Volo.CmsKit.Public.Blogs; using Volo.CmsKit.Public.Comments; using Volo.CmsKit.Public.GlobalResources; -using Volo.CmsKit.Public.Pages; using Volo.CmsKit.Public.Ratings; using Volo.CmsKit.Ratings; using Volo.CmsKit.Users; @@ -30,11 +30,9 @@ public class PublicApplicationAutoMapperProfile : Profile CreateMap(); - CreateMap() - .Ignore(x => x.ContentFragments); - - CreateMap() - .Ignore(x => x.ContentFragments); + CreateMap(); + + CreateMap(); CreateMap(); diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Ratings/RatingPublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Ratings/RatingPublicAppService.cs index 87ea0531db..f3b46c518b 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Ratings/RatingPublicAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Ratings/RatingPublicAppService.cs @@ -1,15 +1,18 @@ -using Microsoft.AspNetCore.Authorization; -using System.Collections.Generic; +using System.Collections.Generic; using System.Threading.Tasks; +using Microsoft.AspNetCore.Authorization; using Volo.Abp.Authorization; +using Volo.Abp.Features; using Volo.Abp.GlobalFeatures; using Volo.Abp.Users; +using Volo.CmsKit.Features; using Volo.CmsKit.GlobalFeatures; using Volo.CmsKit.Ratings; using Volo.CmsKit.Users; namespace Volo.CmsKit.Public.Ratings; +[RequiresFeature(CmsKitFeatures.RatingEnable)] [RequiresGlobalFeature(typeof(RatingsFeature))] public class RatingPublicAppService : CmsKitPublicAppServiceBase, IRatingPublicAppService { diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Reactions/ReactionPublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Reactions/ReactionPublicAppService.cs index b12f659d23..1151578d57 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Reactions/ReactionPublicAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Reactions/ReactionPublicAppService.cs @@ -1,17 +1,19 @@ -using Microsoft.AspNetCore.Authorization; -using System.Collections.Generic; +using System.Collections.Generic; using System.Linq; using System.Linq.Dynamic.Core; -using System.Security.Cryptography.X509Certificates; using System.Threading.Tasks; +using Microsoft.AspNetCore.Authorization; using Volo.Abp.Application.Dtos; +using Volo.Abp.Features; using Volo.Abp.GlobalFeatures; using Volo.Abp.Users; +using Volo.CmsKit.Features; using Volo.CmsKit.GlobalFeatures; using Volo.CmsKit.Reactions; namespace Volo.CmsKit.Public.Reactions; +[RequiresFeature(CmsKitFeatures.ReactionEnable)] [RequiresGlobalFeature(typeof(ReactionsFeature))] public class ReactionPublicAppService : CmsKitPublicAppServiceBase, IReactionPublicAppService { diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/BlogPostPublicClientProxy.Generated.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/BlogPostPublicClientProxy.Generated.cs index b1bbf6be07..f26816e88d 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/BlogPostPublicClientProxy.Generated.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/BlogPostPublicClientProxy.Generated.cs @@ -2,11 +2,9 @@ using System; using System.Threading.Tasks; using Volo.Abp.Application.Dtos; -using Volo.Abp.Http.Client; -using Volo.Abp.Http.Modeling; using Volo.Abp.DependencyInjection; using Volo.Abp.Http.Client.ClientProxying; -using Volo.CmsKit.Public.Blogs; +using Volo.CmsKit.Contents; using Volo.CmsKit.Users; // ReSharper disable once CheckNamespace @@ -16,18 +14,18 @@ namespace Volo.CmsKit.Public.Blogs.ClientProxies; [ExposeServices(typeof(IBlogPostPublicAppService), typeof(BlogPostPublicClientProxy))] public partial class BlogPostPublicClientProxy : ClientProxyBase, IBlogPostPublicAppService { - public virtual async Task GetAsync(string blogSlug, string blogPostSlug) + public virtual async Task GetAsync(string blogSlug, string blogPostSlug) { - return await RequestAsync(nameof(GetAsync), new ClientProxyRequestTypeValue + return await RequestAsync(nameof(GetAsync), new ClientProxyRequestTypeValue { { typeof(string), blogSlug }, { typeof(string), blogPostSlug } }); } - public virtual async Task> GetListAsync(string blogSlug, BlogPostGetListInput input) + public virtual async Task> GetListAsync(string blogSlug, BlogPostGetListInput input) { - return await RequestAsync>(nameof(GetListAsync), new ClientProxyRequestTypeValue + return await RequestAsync>(nameof(GetListAsync), new ClientProxyRequestTypeValue { { typeof(string), blogSlug }, { typeof(BlogPostGetListInput), input } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/PagesPublicClientProxy.Generated.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/PagesPublicClientProxy.Generated.cs index 9ecf6cb387..f992bb3dbf 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/PagesPublicClientProxy.Generated.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/PagesPublicClientProxy.Generated.cs @@ -1,12 +1,8 @@ // This file is automatically generated by ABP framework to use MVC Controllers from CSharp -using System; using System.Threading.Tasks; -using Volo.Abp.Application.Dtos; -using Volo.Abp.Http.Client; -using Volo.Abp.Http.Modeling; using Volo.Abp.DependencyInjection; using Volo.Abp.Http.Client.ClientProxying; -using Volo.CmsKit.Public.Pages; +using Volo.CmsKit.Contents; // ReSharper disable once CheckNamespace namespace Volo.CmsKit.Public.Pages.ClientProxies; diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/cms-kit-generate-proxy.json b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/cms-kit-generate-proxy.json index 626dce7ff2..e3b3802ee9 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/cms-kit-generate-proxy.json +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/cms-kit-generate-proxy.json @@ -505,57 +505,6 @@ } } }, - "Volo.CmsKit.Public.Polls.PollViewComponentController": { - "controllerName": "PollViewComponent", - "controllerGroupName": "PollViewComponent", - "isRemoteService": true, - "apiVersion": null, - "type": "Volo.CmsKit.Public.Polls.PollViewComponentController", - "interfaces": [ - { - "type": "Volo.CmsKit.Public.Polls.IPollViewComponentAppService" - } - ], - "actions": { - "ParseAsyncByContent": { - "uniqueName": "ParseAsyncByContent", - "name": "ParseAsync", - "httpMethod": "GET", - "url": "api/cms-kit-public/polls/{content}", - "supportedVersions": [], - "parametersOnMethod": [ - { - "name": "content", - "typeAsString": "System.String, System.Private.CoreLib", - "type": "System.String", - "typeSimple": "string", - "isOptional": false, - "defaultValue": null - } - ], - "parameters": [ - { - "nameOnMethod": "content", - "name": "content", - "jsonName": null, - "type": "System.String", - "typeSimple": "string", - "isOptional": false, - "defaultValue": null, - "constraintTypes": [], - "bindingSourceId": "Path", - "descriptorName": "" - } - ], - "returnValue": { - "type": "System.Collections.Generic.List", - "typeSimple": "[Volo.CmsKit.Polls.ContentFragment]" - }, - "allowAnonymous": null, - "implementFrom": "Volo.CmsKit.Public.Polls.IPollViewComponentAppService" - } - } - }, "Volo.CmsKit.Public.Pages.PagesPublicController": { "controllerName": "PagesPublic", "controllerGroupName": "PagesPublic", @@ -599,8 +548,8 @@ } ], "returnValue": { - "type": "Volo.CmsKit.Public.Pages.PageDto", - "typeSimple": "Volo.CmsKit.Public.Pages.PageDto" + "type": "Volo.CmsKit.Contents.PageDto", + "typeSimple": "Volo.CmsKit.Contents.PageDto" }, "allowAnonymous": null, "implementFrom": "Volo.CmsKit.Public.Pages.IPagePublicAppService" @@ -985,8 +934,8 @@ } ], "returnValue": { - "type": "Volo.CmsKit.Public.Blogs.BlogPostPublicDto", - "typeSimple": "Volo.CmsKit.Public.Blogs.BlogPostPublicDto" + "type": "Volo.CmsKit.Contents.BlogPostCommonDto", + "typeSimple": "Volo.CmsKit.Contents.BlogPostCommonDto" }, "allowAnonymous": null, "implementFrom": "Volo.CmsKit.Public.Blogs.IBlogPostPublicAppService" @@ -1090,8 +1039,8 @@ } ], "returnValue": { - "type": "Volo.Abp.Application.Dtos.PagedResultDto", - "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto" + "type": "Volo.Abp.Application.Dtos.PagedResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto" }, "allowAnonymous": null, "implementFrom": "Volo.CmsKit.Public.Blogs.IBlogPostPublicAppService" diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/Volo.CmsKit.Public.HttpApi.Client.abppkg.analyze.json b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/Volo.CmsKit.Public.HttpApi.Client.abppkg.analyze.json index 3171e78892..71cd18093e 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/Volo.CmsKit.Public.HttpApi.Client.abppkg.analyze.json +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/Volo.CmsKit.Public.HttpApi.Client.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.CmsKit.Public.HttpApi.Client", - "hash": "2b8ae9a9344c5cd824c182a36d9298a1", + "hash": "60549438786408497e188a1626a25bfb", "contents": [ { "namespace": "Volo.CmsKit.Public", diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo.CmsKit.Public.HttpApi.abppkg.analyze.json b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo.CmsKit.Public.HttpApi.abppkg.analyze.json index 2e4a56e7bb..2a6f62215a 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo.CmsKit.Public.HttpApi.abppkg.analyze.json +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo.CmsKit.Public.HttpApi.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.CmsKit.Public.HttpApi", - "hash": "08fec37c43e420f19636d8c301dc80f9", + "hash": "8ec175d273c21b4de197b0085c3cddb2", "contents": [ { "namespace": "Volo.CmsKit.Public", diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Blogs/BlogPostPublicController.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Blogs/BlogPostPublicController.cs index 9f43d65766..e5d2570e21 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Blogs/BlogPostPublicController.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Blogs/BlogPostPublicController.cs @@ -1,16 +1,18 @@ -using Microsoft.AspNetCore.Mvc; -using System; -using System.Collections.Generic; +using System; using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; using Volo.Abp; using Volo.Abp.Application.Dtos; -using Volo.Abp.Content; +using Volo.Abp.Features; using Volo.Abp.GlobalFeatures; +using Volo.CmsKit.Contents; +using Volo.CmsKit.Features; using Volo.CmsKit.GlobalFeatures; using Volo.CmsKit.Users; namespace Volo.CmsKit.Public.Blogs; +[RequiresFeature(CmsKitFeatures.BlogEnable)] [RequiresGlobalFeature(typeof(BlogsFeature))] [RemoteService(Name = CmsKitPublicRemoteServiceConsts.RemoteServiceName)] [Area(CmsKitPublicRemoteServiceConsts.ModuleName)] @@ -26,14 +28,14 @@ public class BlogPostPublicController : CmsKitPublicControllerBase, IBlogPostPub [HttpGet] [Route("{blogSlug}/{blogPostSlug}")] - public virtual Task GetAsync(string blogSlug, string blogPostSlug) + public virtual Task GetAsync(string blogSlug, string blogPostSlug) { return BlogPostPublicAppService.GetAsync(blogSlug, blogPostSlug); } [HttpGet] [Route("{blogSlug}")] - public virtual Task> GetListAsync(string blogSlug, BlogPostGetListInput input) + public virtual Task> GetListAsync(string blogSlug, BlogPostGetListInput input) { return BlogPostPublicAppService.GetListAsync(blogSlug, input); } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Comments/CommentPublicController.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Comments/CommentPublicController.cs index afbf11e843..f77444431e 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Comments/CommentPublicController.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Comments/CommentPublicController.cs @@ -3,11 +3,14 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Volo.Abp; using Volo.Abp.Application.Dtos; +using Volo.Abp.Features; using Volo.Abp.GlobalFeatures; +using Volo.CmsKit.Features; using Volo.CmsKit.GlobalFeatures; namespace Volo.CmsKit.Public.Comments; +[RequiresFeature(CmsKitFeatures.CommentEnable)] [RequiresGlobalFeature(typeof(CommentsFeature))] [RemoteService(Name = CmsKitPublicRemoteServiceConsts.RemoteServiceName)] [Area(CmsKitPublicRemoteServiceConsts.ModuleName)] diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/GlobalResources/GlobalResourcePublicController.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/GlobalResources/GlobalResourcePublicController.cs index 8b58a00f9a..635e228e0b 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/GlobalResources/GlobalResourcePublicController.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/GlobalResources/GlobalResourcePublicController.cs @@ -1,16 +1,19 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Volo.Abp; +using Volo.Abp.Features; using Volo.Abp.GlobalFeatures; +using Volo.CmsKit.Features; using Volo.CmsKit.GlobalFeatures; namespace Volo.CmsKit.Public.GlobalResources; +[RequiresFeature(CmsKitFeatures.GlobalResourceEnable)] [RequiresGlobalFeature(typeof(GlobalResourcesFeature))] [RemoteService(Name = CmsKitPublicRemoteServiceConsts.RemoteServiceName)] [Area(CmsKitPublicRemoteServiceConsts.ModuleName)] [Route("api/cms-kit-public/global-resources")] -public class GlobalResourcePublicController: CmsKitPublicControllerBase, IGlobalResourcePublicAppService +public class GlobalResourcePublicController : CmsKitPublicControllerBase, IGlobalResourcePublicAppService { private readonly IGlobalResourcePublicAppService _globalResourcePublicAppService; @@ -18,14 +21,14 @@ public class GlobalResourcePublicController: CmsKitPublicControllerBase, IGlobal { _globalResourcePublicAppService = globalResourcePublicAppService; } - + [HttpGet] [Route("script")] public Task GetGlobalScriptAsync() { return _globalResourcePublicAppService.GetGlobalScriptAsync(); } - + [HttpGet] [Route("style")] public Task GetGlobalStyleAsync() diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Menus/MenuItemPublicController.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Menus/MenuItemPublicController.cs index fc8820c1b2..3eb00439fb 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Menus/MenuItemPublicController.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Menus/MenuItemPublicController.cs @@ -2,13 +2,16 @@ using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Volo.Abp; +using Volo.Abp.Features; using Volo.Abp.GlobalFeatures; +using Volo.CmsKit.Features; using Volo.CmsKit.GlobalFeatures; using Volo.CmsKit.Menus; namespace Volo.CmsKit.Public.Menus; -[RequiresGlobalFeature(typeof(BlogsFeature))] +[RequiresFeature(CmsKitFeatures.MenuEnable)] +[RequiresGlobalFeature(typeof(MenuFeature))] [RemoteService(Name = CmsKitPublicRemoteServiceConsts.RemoteServiceName)] [Area(CmsKitPublicRemoteServiceConsts.ModuleName)] [Route("api/cms-kit-public/menu-items")] diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Pages/PagesPublicController.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Pages/PagesPublicController.cs index 763fe7522d..22f2bd75bd 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Pages/PagesPublicController.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Pages/PagesPublicController.cs @@ -1,11 +1,15 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Volo.Abp; +using Volo.Abp.Features; using Volo.Abp.GlobalFeatures; +using Volo.CmsKit.Contents; +using Volo.CmsKit.Features; using Volo.CmsKit.GlobalFeatures; namespace Volo.CmsKit.Public.Pages; +[RequiresFeature(CmsKitFeatures.PageEnable)] [RequiresGlobalFeature(typeof(PagesFeature))] [RemoteService(Name = CmsKitPublicRemoteServiceConsts.RemoteServiceName)] [Area(CmsKitPublicRemoteServiceConsts.ModuleName)] diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Ratings/RatingPublicController.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Ratings/RatingPublicController.cs index 11e8d22a69..f793aaefc4 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Ratings/RatingPublicController.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Ratings/RatingPublicController.cs @@ -2,11 +2,14 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Volo.Abp; +using Volo.Abp.Features; using Volo.Abp.GlobalFeatures; +using Volo.CmsKit.Features; using Volo.CmsKit.GlobalFeatures; namespace Volo.CmsKit.Public.Ratings; +[RequiresFeature(CmsKitFeatures.RatingEnable)] [RequiresGlobalFeature(typeof(RatingsFeature))] [RemoteService(Name = CmsKitPublicRemoteServiceConsts.RemoteServiceName)] [Area(CmsKitPublicRemoteServiceConsts.ModuleName)] diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Reactions/ReactionPublicController.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Reactions/ReactionPublicController.cs index 4a9df74df7..6242e253a2 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Reactions/ReactionPublicController.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Reactions/ReactionPublicController.cs @@ -2,11 +2,14 @@ using Microsoft.AspNetCore.Mvc; using Volo.Abp; using Volo.Abp.Application.Dtos; +using Volo.Abp.Features; using Volo.Abp.GlobalFeatures; +using Volo.CmsKit.Features; using Volo.CmsKit.GlobalFeatures; namespace Volo.CmsKit.Public.Reactions; +[RequiresFeature(CmsKitFeatures.ReactionEnable)] [RequiresGlobalFeature(typeof(ReactionsFeature))] [RemoteService(Name = CmsKitPublicRemoteServiceConsts.RemoteServiceName)] [Area(CmsKitPublicRemoteServiceConsts.ModuleName)] diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Tags/TagPublicController.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Tags/TagPublicController.cs index ec45901118..1620f136da 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Tags/TagPublicController.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Tags/TagPublicController.cs @@ -1,13 +1,16 @@ -using Microsoft.AspNetCore.Mvc; -using System.Collections.Generic; +using System.Collections.Generic; using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; using Volo.Abp; +using Volo.Abp.Features; using Volo.Abp.GlobalFeatures; +using Volo.CmsKit.Features; using Volo.CmsKit.GlobalFeatures; using Volo.CmsKit.Tags; namespace Volo.CmsKit.Public.Tags; +[RequiresFeature(CmsKitFeatures.TagEnable)] [RequiresGlobalFeature(typeof(TagsFeature))] [RemoteService(Name = CmsKitPublicRemoteServiceConsts.RemoteServiceName)] [Area(CmsKitPublicRemoteServiceConsts.ModuleName)] diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/CmsKitPublicWebModule.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/CmsKitPublicWebModule.cs index 88b01c8ae9..3ce96f1a86 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/CmsKitPublicWebModule.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/CmsKitPublicWebModule.cs @@ -2,7 +2,7 @@ using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.Extensions.DependencyInjection; using Volo.Abp.AspNetCore.Mvc.Localization; -using Volo.Abp.AspNetCore.Mvc.UI.Components.LayoutHook; +using Volo.Abp.Ui.LayoutHooks; using Volo.Abp.AutoMapper; using Volo.Abp.GlobalFeatures; using Volo.Abp.Http.ProxyScripting.Generators.JQuery; diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Commenting/CommentingViewComponent.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Commenting/CommentingViewComponent.cs index 0a608740e9..81fd94406d 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Commenting/CommentingViewComponent.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Commenting/CommentingViewComponent.cs @@ -8,7 +8,7 @@ using Volo.Abp.AspNetCore.Mvc; using Volo.Abp.AspNetCore.Mvc.UI; using Volo.Abp.AspNetCore.Mvc.UI.Widgets; using Volo.CmsKit.Public.Comments; -using Volo.CmsKit.Public.Web.Renderers; +using Volo.CmsKit.Web.Renderers; namespace Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.Commenting; @@ -65,12 +65,12 @@ public class CommentingViewComponent : AbpViewComponent foreach (var comment in viewModel.Comments) { viewModel.RawCommentTexts.Add(comment.Id, comment.Text); - comment.Text = await MarkdownToHtmlRenderer.RenderAsync(comment.Text, true); + comment.Text = await MarkdownToHtmlRenderer.RenderAsync(comment.Text, allowHtmlTags: false, preventXSS: true); foreach (var reply in comment.Replies) { viewModel.RawCommentTexts.Add(reply.Id, reply.Text); - reply.Text = await MarkdownToHtmlRenderer.RenderAsync(reply.Text, true); + reply.Text = await MarkdownToHtmlRenderer.RenderAsync(reply.Text, allowHtmlTags: false, preventXSS: true); } } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/GlobalResources/Style/Default.cshtml b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/GlobalResources/Style/Default.cshtml index 11929dec03..fdcfb382bb 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/GlobalResources/Style/Default.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/GlobalResources/Style/Default.cshtml @@ -1 +1,3 @@ - +@model Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.GlobalResources.Style.GlobalStyleModel + + \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/GlobalResources/Style/GlobalStyleModel.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/GlobalResources/Style/GlobalStyleModel.cs new file mode 100644 index 0000000000..869f768987 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/GlobalResources/Style/GlobalStyleModel.cs @@ -0,0 +1,6 @@ +namespace Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.GlobalResources.Style; + +public class GlobalStyleModel +{ + public long LastModificationTimeTimestamp { get; set; } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/GlobalResources/Style/GlobalStyleViewComponent.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/GlobalResources/Style/GlobalStyleViewComponent.cs index 3d9bc010c4..49062bdb06 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/GlobalResources/Style/GlobalStyleViewComponent.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/GlobalResources/Style/GlobalStyleViewComponent.cs @@ -1,13 +1,33 @@ -using System.Threading.Tasks; +using System; +using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Volo.Abp.AspNetCore.Mvc; +using Volo.CmsKit.Public.GlobalResources; namespace Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.GlobalResources.Style; public class GlobalStyleViewComponent : AbpViewComponent { + protected IGlobalResourcePublicAppService GlobalResourcePublicAppService { get; } + + public GlobalStyleViewComponent(IGlobalResourcePublicAppService globalResourcePublicAppService) + { + GlobalResourcePublicAppService = globalResourcePublicAppService; + } + + [BindProperty(SupportsGet = true)] + public DateTime? LastModificationTime { get; set; } + public async Task InvokeAsync() { - return View("~/Pages/CmsKit/Shared/Components/GlobalResources/Style/Default.cshtml"); + var lastModificationTime = (await GlobalResourcePublicAppService.GetGlobalStyleAsync())?.LastModificationTime; + var lastModificationTimeTimestamp = (long)(lastModificationTime.HasValue ? lastModificationTime.Value.Subtract(DateTime.UnixEpoch).TotalSeconds : 0); + + return View("~/Pages/CmsKit/Shared/Components/GlobalResources/Style/Default.cshtml", + new GlobalStyleModel() + { + LastModificationTimeTimestamp = lastModificationTimeTimestamp + }); } + } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/Default.cshtml b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/Default.cshtml index 6f1f7a542d..9b7f6e24f7 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/Default.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/Default.cshtml @@ -12,13 +12,13 @@ { @if (Model.CurrentRating != null) { - + @L["Undo"] } if (Model.Ratings != null) { - + diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/ReactionSelection/default.js b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/ReactionSelection/default.js index c55ba4c8bf..5e35296428 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/ReactionSelection/default.js +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/ReactionSelection/default.js @@ -22,8 +22,20 @@ $(document).ready(function () { }; } + function isDoubleClicked(element) { + if (element.data("isclicked")) return true; + + element.data("isclicked", true); + setTimeout(function () { + element.removeData("isclicked"); + }, 500); + } + function registerClickOfReactionIcons($container) { $container.find('.cms-reaction-icon').each(function () { + + if (isDoubleClicked($(this))) return; + var $icon = $(this); var reactionName = $icon.attr('data-reaction-name'); if ($icon.attr('data-click-action') === 'false') { diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPost.cshtml b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPost.cshtml index 2cff5c9072..d5dc5a0be8 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPost.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPost.cshtml @@ -9,7 +9,7 @@ @using Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.ReactionSelection @using Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.Rating @using Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.Tags -@using Volo.CmsKit.Public.Web.Renderers +@using Volo.CmsKit.Web.Renderers @using Volo.Abp.AspNetCore.Mvc.UI.Packages.HighlightJs @using Volo.CmsKit.Contents @@ -21,7 +21,7 @@ @{ - string dummyImageSource = "https://dummyimage.com/1280x720/a3a3a3/fff.png?text=" + Model.BlogPost.Title; + string dummyImageSource = "https://dummyimage.com/1280x720/a3a3a3/fff.png?text=" + Model.ViewModel.Title; var isScrollIndexEnabled = GlobalFeatureManager.Instance.IsEnabled() && Model.BlogPostScrollIndexFeature?.IsEnabled == true; } @@ -57,22 +57,22 @@
- +
-

@Model.BlogPost.Title

+

@Model.ViewModel.Title

- - @@@Model.BlogPost.Author?.UserName + + @@@Model.ViewModel.Author?.UserName - @Model.BlogPost.CreationTime + @Model.ViewModel.CreationTime

- @foreach (var contentFragment in Model.BlogPost.ContentFragments) + @foreach (var contentFragment in Model.ViewModel.ContentFragments) { if (contentFragment.Type == ContentConsts.Markdown) { - @Html.Raw(await MarkdownRenderer.RenderAsync(contentFragment.GetProperty("Content"))) + @Html.Raw(await MarkdownRenderer.RenderAsync(contentFragment.GetProperty("Content"), allowHtmlTags: true, preventXSS: true)) } else if (contentFragment.Type == ContentConsts.Widget) { @@ -80,9 +80,9 @@ } }

- @if (Model.BlogPost.LastModificationTime != null) + @if (Model.ViewModel.LastModificationTime != null) { - @L["LastModification"].Value : @Model.BlogPost.LastModificationTime + @L["LastModification"].Value : @Model.ViewModel.LastModificationTime }


@@ -92,13 +92,13 @@ if (Model.TagsFeature?.IsEnabled == true) { @await Component.InvokeAsync(typeof(TagViewComponent), new - { - entityType = Volo.CmsKit.Blogs.BlogPostConsts.EntityType, - entityId = Model.BlogPost.Id.ToString(), - urlFormat = $"/blogs/{Model.BlogSlug}?tagId={{TagId}}" - }) + { + entityType = Volo.CmsKit.Blogs.BlogPostConsts.EntityType, + entityId = Model.ViewModel.Id.ToString(), + urlFormat = $"/blogs/{Model.BlogSlug}?tagId={{TagId}}" + }) + } } - }
@@ -111,7 +111,7 @@ @await Component.InvokeAsync(typeof(ReactionSelectionViewComponent), new { entityType = Volo.CmsKit.Blogs.BlogPostConsts.EntityType, - entityId = Model.BlogPost.Id.ToString() + entityId = Model.ViewModel.Id.ToString() }) } } @@ -124,7 +124,7 @@ @await Component.InvokeAsync(typeof(RatingViewComponent), new { entityType = Volo.CmsKit.Blogs.BlogPostConsts.EntityType, - entityId = Model.BlogPost.Id.ToString() + entityId = Model.ViewModel.Id.ToString() }) } } @@ -161,7 +161,7 @@ @await Component.InvokeAsync(typeof(DefaultBlogPostCommentViewComponent), new { entityType = Volo.CmsKit.Blogs.BlogPostConsts.EntityType, - entityId = Model.BlogPost.Id.ToString() + entityId = Model.ViewModel.Id.ToString() }) } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPost.cshtml.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPost.cshtml.cs index 6227190ab8..87630f9bd0 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPost.cshtml.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPost.cshtml.cs @@ -1,9 +1,12 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Volo.Abp.GlobalFeatures; +using Volo.Abp.ObjectMapping; using Volo.CmsKit.Blogs; +using Volo.CmsKit.Contents; using Volo.CmsKit.GlobalFeatures; using Volo.CmsKit.Public.Blogs; +using Volo.CmsKit.Web.Contents; namespace Volo.CmsKit.Public.Web.Pages.Public.CmsKit.Blogs; @@ -15,7 +18,7 @@ public class BlogPostModel : CmsKitPublicPageModelBase [BindProperty(SupportsGet = true)] public string BlogPostSlug { get; set; } - public BlogPostPublicDto BlogPost { get; private set; } + public BlogPostViewModel ViewModel { get; private set; } public BlogFeatureDto CommentsFeature { get; private set; } @@ -24,48 +27,61 @@ public class BlogPostModel : CmsKitPublicPageModelBase public BlogFeatureDto RatingsFeature { get; private set; } public BlogFeatureDto TagsFeature { get; private set; } - + public BlogFeatureDto BlogPostScrollIndexFeature { get; private set; } protected IBlogPostPublicAppService BlogPostPublicAppService { get; } protected IBlogFeatureAppService BlogFeatureAppService { get; } + protected ContentParser ContentParser { get; } + public BlogPostModel( IBlogPostPublicAppService blogPostPublicAppService, - IBlogFeatureAppService blogFeaturePublicAppService) + IBlogFeatureAppService blogFeaturePublicAppService, + ContentParser contentParser) { BlogPostPublicAppService = blogPostPublicAppService; BlogFeatureAppService = blogFeaturePublicAppService; + ContentParser = contentParser; } - public virtual async Task OnGetAsync() + public virtual async Task OnGetAsync() { - BlogPost = await BlogPostPublicAppService.GetAsync(BlogSlug, BlogPostSlug); + var blogPostPublicDto = await BlogPostPublicAppService.GetAsync(BlogSlug, BlogPostSlug); + ViewModel = ObjectMapper.Map(blogPostPublicDto); + if (ViewModel == null) + { + return NotFound(); + } + + ViewModel.ContentFragments = await ContentParser.ParseAsync(blogPostPublicDto.Content); if (GlobalFeatureManager.Instance.IsEnabled()) { - CommentsFeature = await BlogFeatureAppService.GetOrDefaultAsync(BlogPost.BlogId, GlobalFeatures.CommentsFeature.Name); + CommentsFeature = await BlogFeatureAppService.GetOrDefaultAsync(ViewModel.BlogId, GlobalFeatures.CommentsFeature.Name); } if (GlobalFeatureManager.Instance.IsEnabled()) { - ReactionsFeature = await BlogFeatureAppService.GetOrDefaultAsync(BlogPost.BlogId, GlobalFeatures.ReactionsFeature.Name); + ReactionsFeature = await BlogFeatureAppService.GetOrDefaultAsync(ViewModel.BlogId, GlobalFeatures.ReactionsFeature.Name); } if (GlobalFeatureManager.Instance.IsEnabled()) { - RatingsFeature = await BlogFeatureAppService.GetOrDefaultAsync(BlogPost.BlogId, GlobalFeatures.RatingsFeature.Name); + RatingsFeature = await BlogFeatureAppService.GetOrDefaultAsync(ViewModel.BlogId, GlobalFeatures.RatingsFeature.Name); } if (GlobalFeatureManager.Instance.IsEnabled()) { - TagsFeature = await BlogFeatureAppService.GetOrDefaultAsync(BlogPost.BlogId, GlobalFeatures.TagsFeature.Name); + TagsFeature = await BlogFeatureAppService.GetOrDefaultAsync(ViewModel.BlogId, GlobalFeatures.TagsFeature.Name); } if (GlobalFeatureManager.Instance.IsEnabled()) { - BlogPostScrollIndexFeature = await BlogFeatureAppService.GetOrDefaultAsync(BlogPost.BlogId, GlobalFeatures.BlogPostScrollIndexFeature.Name); + BlogPostScrollIndexFeature = await BlogFeatureAppService.GetOrDefaultAsync(ViewModel.BlogId, GlobalFeatures.BlogPostScrollIndexFeature.Name); } + + return Page(); } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/BlogPostPublicDto.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPostViewModel.cs similarity index 72% rename from modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/BlogPostPublicDto.cs rename to modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPostViewModel.cs index 695f50836e..789d2687fc 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/BlogPostPublicDto.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPostViewModel.cs @@ -1,13 +1,14 @@ using System; using System.Collections.Generic; +using AutoMapper; using Volo.Abp.Application.Dtos; using Volo.CmsKit.Contents; using Volo.CmsKit.Users; -namespace Volo.CmsKit.Public.Blogs; +namespace Volo.CmsKit.Public.Web.Pages.Public.CmsKit.Blogs; -[Serializable] -public class BlogPostPublicDto : AuditedEntityDto +[AutoMap(typeof(BlogPostCommonDto), ReverseMap = true)] +public class BlogPostViewModel : AuditedEntityDto { public Guid BlogId { get; set; } @@ -17,10 +18,10 @@ public class BlogPostPublicDto : AuditedEntityDto public string ShortDescription { get; set; } - public List ContentFragments { get; set; } - public string Content { get; set; } + public List ContentFragments { get; set; } + public Guid? CoverImageMediaId { get; set; } public CmsUserDto Author { get; set; } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml.cs index f5f2cc2f7a..736fba5e9e 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml.cs @@ -1,11 +1,9 @@ -using Microsoft.AspNetCore.Mvc; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; +using System; using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; using Volo.Abp.Application.Dtos; using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Pagination; +using Volo.CmsKit.Contents; using Volo.CmsKit.Public.Blogs; using Volo.CmsKit.Users; @@ -27,7 +25,7 @@ public class IndexModel : CmsKitPublicPageModelBase [BindProperty(SupportsGet = true)] public Guid? TagId { get; set; } - public PagedResultDto Blogs { get; private set; } + public PagedResultDto Blogs { get; private set; } public PagerModel PagerModel => new PagerModel(Blogs.TotalCount, Blogs.Items.Count, CurrentPage, PageSize, Request.Path.ToString()); diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Pages/Index.cshtml b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Pages/Index.cshtml index 5a92ae2b04..e14733695a 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Pages/Index.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Pages/Index.cshtml @@ -2,39 +2,36 @@ @addTagHelper *, Volo.Abp.AspNetCore.Mvc.UI.Bootstrap @using Volo.CmsKit.Contents @using System.Dynamic -@using Volo.CmsKit.Public.Web.Renderers @using Volo.Abp.Data @using Volo.Abp.AspNetCore.Mvc.UI.Packages.HighlightJs; @using Volo.Abp.AspNetCore.Mvc.UI.Widgets; - -@inject IMarkdownToHtmlRenderer MarkdownRenderer - - +@using Volo.CmsKit.Web.Renderers @model Volo.CmsKit.Public.Web.Pages.Public.CmsKit.Pages.IndexModel +@inject IMarkdownToHtmlRenderer MarkdownRenderer @section styles{ } @section scripts{ } - @foreach (ContentFragment contentFragment in Model.PageDto.ContentFragments) + @foreach (ContentFragment contentFragment in Model.ViewModel.ContentFragments) { if (contentFragment.Type == ContentConsts.Markdown) { - @Html.Raw(await MarkdownRenderer.RenderAsync(contentFragment.GetProperty("Content"))) + @Html.Raw(await MarkdownRenderer.RenderAsync(contentFragment.GetProperty("Content"), allowHtmlTags: true, preventXSS: true)) } else if (contentFragment.Type == ContentConsts.Widget) { diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Pages/Index.cshtml.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Pages/Index.cshtml.cs index 1434eccb4b..18eb184742 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Pages/Index.cshtml.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Pages/Index.cshtml.cs @@ -1,6 +1,8 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; +using Volo.CmsKit.Contents; using Volo.CmsKit.Public.Pages; +using Volo.CmsKit.Web.Contents; using Volo.CmsKit.Web.Pages; namespace Volo.CmsKit.Public.Web.Pages.Public.CmsKit.Pages; @@ -12,21 +14,26 @@ public class IndexModel : CommonPageModel protected IPagePublicAppService PagePublicAppService { get; } - public PageDto PageDto{ get; private set; } + protected ContentParser ContentParser { get; } -public IndexModel(IPagePublicAppService pagePublicAppService) + public PageViewModel ViewModel { get; private set; } + + public IndexModel(IPagePublicAppService pagePublicAppService, ContentParser contentParser) { PagePublicAppService = pagePublicAppService; + ContentParser = contentParser; } - public async Task OnGetAsync() + public virtual async Task OnGetAsync() { - PageDto = await PagePublicAppService.FindBySlugAsync(Slug); - - if (PageDto == null) + var pageDto = await PagePublicAppService.FindBySlugAsync(Slug); + ViewModel = ObjectMapper.Map(pageDto); + if (ViewModel == null) { return NotFound(); } + + ViewModel.ContentFragments = await ContentParser.ParseAsync(pageDto.Content); return Page(); } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Pages/PageViewModel.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Pages/PageViewModel.cs index 5e5df3e917..3195826093 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Pages/PageViewModel.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Pages/PageViewModel.cs @@ -1,9 +1,12 @@ using System; using System.Collections.Generic; +using AutoMapper; using Volo.CmsKit.Contents; +using Volo.CmsKit.Public.Pages; namespace Volo.CmsKit.Public.Web.Pages.Public.CmsKit.Pages; +[AutoMap(typeof(PageDto), ReverseMap = true)] public class PageViewModel { public Guid Id { get; set; } @@ -11,4 +14,8 @@ public class PageViewModel public string Title { get; set; } public List ContentFragments { get; set; } + + public string Script { get; set; } + + public string Style { get; set; } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Renderers/IMarkdownToHtmlRenderer.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Renderers/IMarkdownToHtmlRenderer.cs deleted file mode 100644 index d11e76f6dd..0000000000 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Renderers/IMarkdownToHtmlRenderer.cs +++ /dev/null @@ -1,8 +0,0 @@ -using System.Threading.Tasks; - -namespace Volo.CmsKit.Public.Web.Renderers; - -public interface IMarkdownToHtmlRenderer -{ - Task RenderAsync(string rawMarkdown, bool preventXSS = true); -} diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Volo.CmsKit.Public.Web.abppkg.analyze.json b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Volo.CmsKit.Public.Web.abppkg.analyze.json index 1941b5618d..25a0536d5d 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Volo.CmsKit.Public.Web.abppkg.analyze.json +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Volo.CmsKit.Public.Web.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.CmsKit.Public.Web", - "hash": "4b477e78e2267c3b43a3677d5dbbdddb", + "hash": "c7feb0964cd3dafb92e2f73ac8f944b4", "contents": [ { "namespace": "Volo.CmsKit.Public.Web", diff --git a/modules/cms-kit/src/Volo.CmsKit.Web/Volo.CmsKit.Web.abppkg.analyze.json b/modules/cms-kit/src/Volo.CmsKit.Web/Volo.CmsKit.Web.abppkg.analyze.json index af881d5fb9..e10f650a63 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Web/Volo.CmsKit.Web.abppkg.analyze.json +++ b/modules/cms-kit/src/Volo.CmsKit.Web/Volo.CmsKit.Web.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.CmsKit.Web", - "hash": "49826349c7aaabed8c65d9a3e568423c", + "hash": "b852b82969c272b32a42d6666a7ce9f0", "contents": [ { "namespace": "Volo.CmsKit.Web", diff --git a/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Contents/ContentParser_Test.cs b/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Contents/ContentParser_Test.cs deleted file mode 100644 index 108d883a70..0000000000 --- a/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Contents/ContentParser_Test.cs +++ /dev/null @@ -1,138 +0,0 @@ -using System.Collections.Generic; -using System.Threading.Tasks; -using Microsoft.Extensions.Options; -using Shouldly; -using Xunit; - -namespace Volo.CmsKit.Contents; -public class ContentParser_Test : CmsKitDomainTestBase -{ - private readonly CmsKitTestData testData; - private readonly IOptions _options; - private ContentParser contentParser; - - public ContentParser_Test() - { - testData = GetRequiredService(); - _options = GetRequiredService>(); - } - - [Fact] - public async Task ParseAsync_ShouldWorkWithDifferentWidgetTypes() - { - _options.Value.AddWidget(testData.PollName, testData.WidgetName); - _options.Value.AddWidget("ImageGallery", "ImageGallery"); - contentParser = new ContentParser(_options); - - var content = @"**ABP Framework** is completely open source and developed in a community-driven manner. - [Widget Type=""Poll"" Code=""poll-name""] - Thanks _for_ *your * feedback. - [Widget GalleryName=""Xyz"" Type=""ImageGallery"" Source=""GoogleDrive""]"; - - var widgets = await contentParser.ParseAsync(content); - - widgets.ShouldNotBeNull(); - widgets.Count.ShouldBe(4); - widgets[1].ExtraProperties.Count.ShouldBe(2); - widgets[3].ExtraProperties.Count.ShouldBe(3); - } - - [Fact] - public async Task ParseAsync_ShouldWorkWithoutConfigOptions() - { - var content = @"**ABP Framework** is completely open source and developed in a community-driven manner. - [Widget Type= ""Poll"" Code =""poll-name""] - Thanks _for_ *your * feedback."; - - contentParser = new ContentParser(_options); - var widgets = await contentParser.ParseAsync(content); - - widgets.ShouldNotBeNull(); - widgets.Count.ShouldBe(1);//Ignored Widget - } - - [Fact] - public async Task ParseAsync_ShouldWorkWithWrongConfigOptions() - { - _options.Value.AddWidget(testData.WidgetName, testData.PollName); - contentParser = new ContentParser(_options); - - var content = @"**ABP Framework** is completely open source and developed in a community-driven manner. - [Widget Type= ""Poll"" Code =""poll-name""] - Thanks _for_ *your * feedback."; - - var widgets = await contentParser.ParseAsync(content); - - widgets.ShouldNotBeNull(); - widgets.Count.ShouldBe(2); - } - - [Fact] - public async Task ParseAsync_ShouldWorkWithWrongWidgetType() - { - _options.Value.AddWidget(testData.PollName, testData.WidgetName); - contentParser = new ContentParser(_options); - - var content = @"**ABP Framework** is completely open source and developed in a community-driven manner. - [Widget Wrong Type= ""Poll"" Code =""poll-name""] - Thanks _for_ *your * feedback."; - - var widgets = await contentParser.ParseAsync(content); - - widgets.ShouldNotBeNull(); - widgets.Count.ShouldBe(2); - } - - [Fact] - public async Task ParseAsync_ShouldWorkWithWrongPollName() - { - _options.Value.AddWidget(testData.PollName, testData.WidgetName); - contentParser = new ContentParser(_options); - - var content = @"**ABP Framework** is completely open source and developed in a community-driven manner. - [Widget Type= ""Poll"" PollWrongName =""poll-name""] - Thanks _for_ *your * feedback."; - - var widgets = await contentParser.ParseAsync(content); - - widgets.ShouldNotBeNull(); - widgets.Count.ShouldBe(3); - } - - [Theory] - [MemberData(nameof(ExampleData))] - public async Task ParseAsync_ShouldWorkProperlyWithCorrectInputs(string content, int expectedLine) - { - _options.Value.AddWidget(testData.PollName, testData.WidgetName); - contentParser = new ContentParser(_options); - - var widgets = await contentParser.ParseAsync(content); - - widgets.ShouldNotBeNull(); - widgets.Count.ShouldBe(expectedLine); - } - - public static IEnumerable ExampleData => - new List - { - new object[] { @"**ABP Framework** is completely open source and developed in a community-driven manner. - [Widget Type=""Poll"" Code=""poll-name""] - Thanks _for_ *your * feedback.", 3}, - - new object[] { @"**ABP Framework** is completely open source and developed in a community-driven manner. - [Widget Type=""Poll"" Code=""poll-name""] - Thanks _for_ *your * feedback. - [Widget Type=""Poll"" Code=""poll-name1""]", 4 }, - - new object[] { @"**ABP Framework** is completely open source and developed in a community-driven manner. - Thanks _for_ *your * feedback. - [Widget Type=""Poll"" Code=""poll-name""]", 2 }, - - new object[] { @"[Widget Type=""Poll"" Code=""poll-name""] gg [Widget Type=""Poll"" Code=""poll-name1""]**ABP Framework** is completely open source and developed in a community-driven manner. - Thanks _for_ *your * feedback. - Thanks _for_ *your * feedback.", 4}, - - new object[] { @"Thanks _for_ *your * feedback. - Thanks _for_ *your * feedback.", 1} - }; -} diff --git a/modules/cms-kit/test/Volo.CmsKit.TestBase/Tags/EntityTagRepository_Test.cs b/modules/cms-kit/test/Volo.CmsKit.TestBase/Tags/EntityTagRepository_Test.cs index 9da9dd7710..a895f4a949 100644 --- a/modules/cms-kit/test/Volo.CmsKit.TestBase/Tags/EntityTagRepository_Test.cs +++ b/modules/cms-kit/test/Volo.CmsKit.TestBase/Tags/EntityTagRepository_Test.cs @@ -1,9 +1,6 @@ -using Shouldly; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; +using System.Linq; using System.Threading.Tasks; +using Shouldly; using Volo.Abp.Modularity; using Xunit; @@ -12,11 +9,11 @@ namespace Volo.CmsKit.Tags; public abstract class EntityTagRepository_Test : CmsKitTestBase where TStartupModule : IAbpModule { - private CmsKitTestData _cmsKitTestData; - private IEntityTagRepository _entityTagRepository; - private ITagRepository _tagRepository; + private readonly CmsKitTestData _cmsKitTestData; + private readonly IEntityTagRepository _entityTagRepository; + private readonly ITagRepository _tagRepository; - public EntityTagRepository_Test() + protected EntityTagRepository_Test() { _cmsKitTestData = GetRequiredService(); _entityTagRepository = GetRequiredService(); @@ -28,10 +25,21 @@ public abstract class EntityTagRepository_Test : CmsKitTestBase< { var relatedTags = await _tagRepository.GetAllRelatedTagsAsync(_cmsKitTestData.Content_1_EntityType, _cmsKitTestData.Content_1_EntityId); - await _entityTagRepository.DeleteManyAsync(relatedTags.Select(s => s.Id).ToArray()); + await _entityTagRepository.DeleteManyAsync(relatedTags.Select(s => s.Id).ToArray(), _cmsKitTestData.Content_1_EntityId); relatedTags = await _tagRepository.GetAllRelatedTagsAsync(_cmsKitTestData.Content_1_EntityType, _cmsKitTestData.Content_1_EntityId); relatedTags.ShouldBeEmpty(); } + + [Fact] + public async Task GetEntityIdsFilteredByTagNameAsync_ShouldWorkProperly() + { + var entityIds = await _entityTagRepository.GetEntityIdsFilteredByTagNameAsync(_cmsKitTestData.TagName_1, _cmsKitTestData.EntityType1); + + entityIds.ShouldNotBeNull(); + entityIds.ShouldNotBeEmpty(); + + entityIds.Count.ShouldBe(1); + } } diff --git a/modules/docs/Volo.Docs.sln b/modules/docs/Volo.Docs.sln index 1c32767baa..6bb8d84d0a 100644 --- a/modules/docs/Volo.Docs.sln +++ b/modules/docs/Volo.Docs.sln @@ -61,6 +61,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Docs.MongoDB", "src\Vo EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Docs.MongoDB.Tests", "test\Volo.Docs.MongoDB.Tests\Volo.Docs.MongoDB.Tests.csproj", "{C5E2A2A3-D54D-4C2E-97BA-EA50A49ED7AD}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Docs.Installer", "src\Volo.Docs.Installer\Volo.Docs.Installer.csproj", "{50B9AC1D-C03E-47AA-9ED8-E7986BCFABA1}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -159,6 +161,10 @@ Global {C5E2A2A3-D54D-4C2E-97BA-EA50A49ED7AD}.Debug|Any CPU.Build.0 = Debug|Any CPU {C5E2A2A3-D54D-4C2E-97BA-EA50A49ED7AD}.Release|Any CPU.ActiveCfg = Release|Any CPU {C5E2A2A3-D54D-4C2E-97BA-EA50A49ED7AD}.Release|Any CPU.Build.0 = Release|Any CPU + {50B9AC1D-C03E-47AA-9ED8-E7986BCFABA1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {50B9AC1D-C03E-47AA-9ED8-E7986BCFABA1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {50B9AC1D-C03E-47AA-9ED8-E7986BCFABA1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {50B9AC1D-C03E-47AA-9ED8-E7986BCFABA1}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -190,6 +196,7 @@ Global {8A5E5001-C017-44A8-ADDA-DC66C102556E} = {555508AD-F593-43E3-9354-9FA51512F181} {DBE846CD-1BED-4F2C-ABF2-94F6240BCB9B} = {A982A58E-1E92-4764-9F56-39E7AABB8556} {C5E2A2A3-D54D-4C2E-97BA-EA50A49ED7AD} = {59D430A9-AC61-4457-8338-5DA0705ABB5D} + {50B9AC1D-C03E-47AA-9ED8-E7986BCFABA1} = {A982A58E-1E92-4764-9F56-39E7AABB8556} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {13691265-2547-4FFF-B757-E8FACB05679D} diff --git a/modules/docs/app/VoloDocs.EntityFrameworkCore/VoloDocs.EntityFrameworkCore.abppkg.analyze.json b/modules/docs/app/VoloDocs.EntityFrameworkCore/VoloDocs.EntityFrameworkCore.abppkg.analyze.json new file mode 100644 index 0000000000..f57a795bed --- /dev/null +++ b/modules/docs/app/VoloDocs.EntityFrameworkCore/VoloDocs.EntityFrameworkCore.abppkg.analyze.json @@ -0,0 +1,18 @@ +{ + "name": "VoloDocs.EntityFrameworkCore", + "hash": "8ac808bc478d207d2d1ed672d5f16244", + "contents": [ + { + "namespace": "VoloDocs.EntityFrameworkCore", + "contentType": "abpModule", + "name": "VoloDocsEntityFrameworkCoreModule" + }, + { + "namespace": "VoloDocs.EntityFrameworkCore", + "connectionStringName": null, + "databaseTables": [], + "contentType": "efCoreDbContext", + "name": "VoloDocsDbContext" + } + ] +} \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/package.json b/modules/docs/app/VoloDocs.Web/package.json index ea4be778d9..8666f1e0fc 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": "^5.3.0", - "@abp/docs": "^5.3.0" + "@abp/aspnetcore.mvc.ui.theme.basic": "^6.0.0-rc.3", + "@abp/docs": "^6.0.0-rc.3" } } diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/libs/abp/core/abp.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/abp/core/abp.js index 9445e4e7f4..d8b7531660 100644 --- a/modules/docs/app/VoloDocs.Web/wwwroot/libs/abp/core/abp.js +++ b/modules/docs/app/VoloDocs.Web/wwwroot/libs/abp/core/abp.js @@ -372,7 +372,9 @@ var abp = abp || {}; setTimeout(function () { if (element) { element.classList.remove('abp-block-area-disappearing'); - element.parentElement.removeChild(element); + if (element.parentElement) { + element.parentElement.removeChild(element); + } } }, 250); } diff --git a/modules/docs/app/VoloDocs.Web/yarn.lock b/modules/docs/app/VoloDocs.Web/yarn.lock index dc26bd6af4..6bcbfd7051 100644 --- a/modules/docs/app/VoloDocs.Web/yarn.lock +++ b/modules/docs/app/VoloDocs.Web/yarn.lock @@ -2,45 +2,45 @@ # yarn lockfile v1 -"@abp/anchor-js@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/anchor-js/-/anchor-js-5.3.0.tgz#a6786ffc7c646179cdabd6ad05e8801ab9520d1c" - integrity sha512-4mBV86YzkhHbSyMSUGQLmZ2TYGzTQJjO+2TI86BGTwcrEyuuLo0Hbdi6bvSpdctQeQnuQaIREE0nEpPPMwjsDQ== +"@abp/anchor-js@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/anchor-js/-/anchor-js-6.0.0-rc.3.tgz#1f350b7cb1b73f5c5d07b7a64b5a184b11a62d25" + integrity sha512-1eQZPnANlQgrBqYCUKDXzytUw1MPKBakJnyRFIWknW7IBTMbRTZZFjdqscRV4JaXil3wfrYJJKaa2WWyD4nxbg== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" anchor-js "^4.3.1" -"@abp/aspnetcore.mvc.ui.theme.basic@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-5.3.0.tgz#dcdd73d8582c4d14438f70d765170398d5d582fb" - integrity sha512-H6UrafHRI1DHfIoi47gZWHKSanlyAkghtGgUO6GTmPqTubBXjl7Ky3owVUAXvFd49+72gwdCLA/DB0Khjc3Ayw== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~5.3.0" - -"@abp/aspnetcore.mvc.ui.theme.shared@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-5.3.0.tgz#84e94845a247815ce981cda2d195944a350530b9" - integrity sha512-RwXxlncjidvh8Hgw91Hz1f5rnfG9hlNROr5bD/kxTUB47vIh/TIBd06UYrYw2/lqFLw5d6wd8q7VLuDjGUQbpg== - dependencies: - "@abp/aspnetcore.mvc.ui" "~5.3.0" - "@abp/bootstrap" "~5.3.0" - "@abp/bootstrap-datepicker" "~5.3.0" - "@abp/datatables.net-bs5" "~5.3.0" - "@abp/font-awesome" "~5.3.0" - "@abp/jquery-form" "~5.3.0" - "@abp/jquery-validation-unobtrusive" "~5.3.0" - "@abp/lodash" "~5.3.0" - "@abp/luxon" "~5.3.0" - "@abp/malihu-custom-scrollbar-plugin" "~5.3.0" - "@abp/select2" "~5.3.0" - "@abp/sweetalert2" "~5.3.0" - "@abp/timeago" "~5.3.0" - "@abp/toastr" "~5.3.0" - -"@abp/aspnetcore.mvc.ui@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-5.3.0.tgz#e947fd1aecbd2aabc5db4c6a64b78f2690fcf0d4" - integrity sha512-en2YDb/hRG1MKkbli1PYcoeU9OLU0YPSahkIBSfOmMLntAe8y0c2+Xe09chXP4r+GoZu0zd9FM3qqCRZojrlug== +"@abp/aspnetcore.mvc.ui.theme.basic@^6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-6.0.0-rc.3.tgz#b95266387e562c635de795442f90470f8e9e6318" + integrity sha512-vVkEpotDST455E3rynvRQpBKPcNNJ2m1wLkz/B9dQNdUjvm8L4F6s0ls0XFlKUNvQfCVfedkRtGayuvNje/Oxg== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~6.0.0-rc.3" + +"@abp/aspnetcore.mvc.ui.theme.shared@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-6.0.0-rc.3.tgz#664ca2ee712b7d9e66103c00beb41eb9648a6075" + integrity sha512-KxCsGuoUWKaDo7Oo9aKp51pli2m0DZ2tG8m+zK+m4M9U7g96uC+DOFy3gc7MdPlszvrw32Wwm7I0AughstByNA== + dependencies: + "@abp/aspnetcore.mvc.ui" "~6.0.0-rc.3" + "@abp/bootstrap" "~6.0.0-rc.3" + "@abp/bootstrap-datepicker" "~6.0.0-rc.3" + "@abp/datatables.net-bs5" "~6.0.0-rc.3" + "@abp/font-awesome" "~6.0.0-rc.3" + "@abp/jquery-form" "~6.0.0-rc.3" + "@abp/jquery-validation-unobtrusive" "~6.0.0-rc.3" + "@abp/lodash" "~6.0.0-rc.3" + "@abp/luxon" "~6.0.0-rc.3" + "@abp/malihu-custom-scrollbar-plugin" "~6.0.0-rc.3" + "@abp/select2" "~6.0.0-rc.3" + "@abp/sweetalert2" "~6.0.0-rc.3" + "@abp/timeago" "~6.0.0-rc.3" + "@abp/toastr" "~6.0.0-rc.3" + +"@abp/aspnetcore.mvc.ui@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-6.0.0-rc.3.tgz#47c23b57ed3908bd78a232230e53d1f3cba2de41" + integrity sha512-7eJZy2JUGQP94Tz3JJWXRHRmDfTcPZ/lS1/VNbU8B4qvgl5ChIXklVEJLR1fwrBhKXZV8fGVmqT1XlGTGFvFJA== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -49,180 +49,180 @@ merge-stream "^2.0.0" micromatch "^4.0.2" -"@abp/bootstrap-datepicker@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-5.3.0.tgz#09c44954774d8f52ca8ff6699ad4dbb7cc0308c2" - integrity sha512-AQ26I0jgoCioW1/4XmQIyn1c1+CLv8KTb4Vd4ZbtdYGBkkkUe+JEAWpJSeXlJRr/XrOs0BKWp/fa7Nnwx8srLg== +"@abp/bootstrap-datepicker@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-6.0.0-rc.3.tgz#89198b863dbfccf5f07ac3c4b20ce6199adcb17a" + integrity sha512-NLoUjcR66mqwSWuVftu2yFH4/j6QP+FiElRfZQ9OYmO8DQx2Ue5UZzjrFTrZ1DBBCfzhr2Bffj80dirGvGDyvg== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-5.3.0.tgz#42dac2d2d6374f39d068a638687039c5c74df123" - integrity sha512-rg9mLcvT4JQRc1rIAhGYK1P2eMRJ1+GArQXV5l7k3FrVU+bRLKdoE6PNpuwXHpdlom4/dOgekfuWH/SAuY5kyw== +"@abp/bootstrap@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-6.0.0-rc.3.tgz#4574bf574cc3484869e8ff8bc592f6212d20a969" + integrity sha512-Q5v7WRkGhGcjRg267HXtqs1oU7ts9UXPyCXmg5y2y5qMOyioD+m4MKV4iv67DgoQjabudp8X2egTKxkej6Lzkw== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" bootstrap "^5.1.3" -"@abp/clipboard@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-5.3.0.tgz#579bbc786d32c4e07c969073872b936575df7a9c" - integrity sha512-J55jQnzPOOAwo70GK9hAB3JxG7rz75tex+17QSFjW7/dXVWt1bPIDRHh/a1wiLEgYc6btsSGhptLtkYAfWpq6w== +"@abp/clipboard@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-6.0.0-rc.3.tgz#ee3a586b491d89442eefff08aaebbf9d38cb46d4" + integrity sha512-01svpp3mR29z1FTM+2Qe+MUNLPbl95bWlOXY5zz2hvNSbdD45lGud+BiOHfeZwlDk5jjr3FqLel+hxx2ByBvOA== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" clipboard "^2.0.8" -"@abp/core@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-5.3.0.tgz#032724dd0c0b850204896ce0275c7f9c8f516740" - integrity sha512-Uk9h98jiEF1dItWrvWnYB6s/UNZZapvFSyJ4+piAsZmXOSAbrObV+s19n5xfUagQQTWn4+aU5+aChEcfWpYv9A== +"@abp/core@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-6.0.0-rc.3.tgz#5662ce813d449d97d9fb7ea2552b2774c8df7825" + integrity sha512-X/VRdk5SGNYc5gQzPcBEPAvwcuD9WXsI4YIdrqjnes0s8u2/XmfrTixojh8Y5EYUoOblEE3Soj5hBhY1cVwcbQ== dependencies: - "@abp/utils" "~5.3.0" + "@abp/utils" "~6.0.0-rc.3" -"@abp/datatables.net-bs5@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-5.3.0.tgz#84771ce4eb7229bed347a5904c891b08e3230422" - integrity sha512-FpKrgrjaBKVgFAnbBsrvDIJJOy8gbWCEHm5Jy2vFWXmx25fITMw/2ckBDH87yrZtCNVTSUbMIdHYOIHMPfSavQ== +"@abp/datatables.net-bs5@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-6.0.0-rc.3.tgz#22865c7e621de720b71af6265b3193f6c78695bd" + integrity sha512-T+mhLc6uSzWmxDQogVwnJ6VxI4845gmF68/i9TmVKNlCtpa3EEfyuF/hgWT1hYfCb4XOsvd/CWrunbkC3fsmtg== dependencies: - "@abp/datatables.net" "~5.3.0" + "@abp/datatables.net" "~6.0.0-rc.3" datatables.net-bs5 "^1.11.4" -"@abp/datatables.net@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-5.3.0.tgz#dd27ae451df9551f5b815e10c87a8a89c6a38293" - integrity sha512-d4lQ09G7HY2gEN1lRAteCZzY0Fv3gPuUM+icgWm+UkmDZV9lhvovTQ58Xkwayw8vf+NPlit1eGMMQedn6MbeAQ== +"@abp/datatables.net@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-6.0.0-rc.3.tgz#d036defe6ad7fc989dffa020ae579362ee3150d1" + integrity sha512-4cUU8/Tn0Vz9bx7jjMOD/0Viyr29fcwoQAAkxaaYZp6qiQbENgz46/xpQf2oBCoudk8CLdzpmNa7jWte7PcJJw== dependencies: - "@abp/jquery" "~5.3.0" + "@abp/jquery" "~6.0.0-rc.3" datatables.net "^1.11.4" -"@abp/docs@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/docs/-/docs-5.3.0.tgz#6d579324861e19fe04026557b078924482832cd3" - integrity sha512-MJNFP6qRdIoZHiBmydniHb8fXVdn1TwCvHL3nTH8efOeRXfj985LXLDwIhem3sOUdJ/bnpRDS8camObScdYWRQ== +"@abp/docs@^6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/docs/-/docs-6.0.0-rc.3.tgz#3300578c2bdface9e7672e9093c2a387c11f482f" + integrity sha512-ymLh1jR6qGTB+4G5uttYvbiYWZ853GYLRkRbQ6VtcyBDnX+IpexsxPCtL9Ralp8YGDbxYIHnnRAC5TAvSHn16Q== dependencies: - "@abp/anchor-js" "~5.3.0" - "@abp/clipboard" "~5.3.0" - "@abp/malihu-custom-scrollbar-plugin" "~5.3.0" - "@abp/popper.js" "~5.3.0" - "@abp/prismjs" "~5.3.0" + "@abp/anchor-js" "~6.0.0-rc.3" + "@abp/clipboard" "~6.0.0-rc.3" + "@abp/malihu-custom-scrollbar-plugin" "~6.0.0-rc.3" + "@abp/popper.js" "~6.0.0-rc.3" + "@abp/prismjs" "~6.0.0-rc.3" -"@abp/font-awesome@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-5.3.0.tgz#ce1d5bb59bd597cc9717885917d4dd2eae1f8b9c" - integrity sha512-JX62EVfZSJ7pv75Gd3ya/3c3He0hXF7KmpTizUNd/EbeHuNJoCND5wwq5OAFV9Ld3vdcGJChNTydNa5RsBzrpg== +"@abp/font-awesome@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-6.0.0-rc.3.tgz#803569d1a7e25f8a1c2be018312449c23fb78217" + integrity sha512-lYdh38UCTSkzzw0B/mpPEo7iFXzSKHCNbBOIHe6dd6O/Qli7wYukTtUOFn5Sh+yoydLY1as92HtiGL1ckSdu1g== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" "@fortawesome/fontawesome-free" "^5.15.4" -"@abp/jquery-form@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-5.3.0.tgz#5ae9906f0cffaf3e043681a5dd80a014b4860f6b" - integrity sha512-ZTpXCImHirJDZjfnJRtSEHLIbWMTYkqtTv7Z3GMRKnI4fllpmuco9EWLAKjAfYPyc/QpTx+MYnUg5SsXORhJyQ== +"@abp/jquery-form@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-6.0.0-rc.3.tgz#4ec503c07e2194148c3a7e7cf7ddef2871679e6a" + integrity sha512-Q3uEpflntqrSkYakcdsBnnYYfxJWXD/CDjMiwjbb6gIc8s4qkbIYxVxvYvlEezoIDYQkMSXOn7BS4clWsesiJg== dependencies: - "@abp/jquery" "~5.3.0" + "@abp/jquery" "~6.0.0-rc.3" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-5.3.0.tgz#ccf90a7840398e69e0a91ed6c32b80fa2eb82d14" - integrity sha512-6B3ywnpvPxpnxkrcXzjTjMWgKRImbzNPOZvv5ant/kQv3zXedV1GXSIILy+imX39FuDPslOmEfx8plwrNvIteA== +"@abp/jquery-validation-unobtrusive@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-6.0.0-rc.3.tgz#01da2a59663d373ff1c69022f4c9c66ad0b29403" + integrity sha512-ij1ML2D9rYF3pJthWO6mGQajsJhbDCtOoBvnh9yCZccuwOYkXP22PqfUxjjxtqL4HqFI31KRpFg0ANMGSzEEBg== dependencies: - "@abp/jquery-validation" "~5.3.0" + "@abp/jquery-validation" "~6.0.0-rc.3" jquery-validation-unobtrusive "^3.2.12" -"@abp/jquery-validation@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-5.3.0.tgz#a21696e7d5d54ef8bcdc0e8bd2debb1da1f7f5cc" - integrity sha512-4z2I9iORf+z5SlN9crC/Gx3X5GAOVePD+WN8SaHSYr4VWYNe8TV8LvCZPilN56sIPt3jYvy0N+bI1tAuZPu/NQ== +"@abp/jquery-validation@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-6.0.0-rc.3.tgz#724aea9572dcb2faccf8c6355332b0b2a4df9260" + integrity sha512-rTK5oHaMtycvWxunNwzbE/MbsXXIr6qDnOY3rVUmjTHjqUOHYz591t/XeQfjnSXPp4k/SZUjG6viTC3J2jzC1A== dependencies: - "@abp/jquery" "~5.3.0" + "@abp/jquery" "~6.0.0-rc.3" jquery-validation "^1.19.3" -"@abp/jquery@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-5.3.0.tgz#0279ee501ed774a788072c2ec8b003e348fec22c" - integrity sha512-rqYbU3LpsT7XT8ygn+TFVmjev5NlgEcDhGwQ8PraY1dEjlDbteeQ50N4adS8fdRfOM1UjGL19ueN3F8E5qNUSg== +"@abp/jquery@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-6.0.0-rc.3.tgz#ba19cc8b802c46490277939e6c674811127d8016" + integrity sha512-MbD38iInyag7/j5k42cvMT4jLZMtXH4lUK0rjvqUDVaxKEks46Ix/90uczQ9XajYONgx0CJKFj2urgM830+CCA== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" jquery "~3.6.0" -"@abp/lodash@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-5.3.0.tgz#45f1dba7bb65b6599b4973d7e0c617dfd2c46c49" - integrity sha512-vQVMv58QuYttWBfLjJzIsw92JunGbWYsqk6pp6/JuoBls5UJtdP1F7vM4JgQxsscGYHFRZB3F4a3h1cxZ+dblQ== +"@abp/lodash@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-6.0.0-rc.3.tgz#8a5bab02353e5cab4ca06ab82f6dbe6285faa95a" + integrity sha512-c8yhcapzPsXyeiFjeOC+2a4bn5wFjW5gUoN+p/p+tE+FIcH37yEgyw/tAr6aZPCmR770MqQXct4t7S4Czbbk+A== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" lodash "^4.17.21" -"@abp/luxon@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-5.3.0.tgz#8a6277046f6e38c3affbf79c06f8ac00d1ca8098" - integrity sha512-6tETR03i1NPJuDqSQWtpkOykdq/84awifQUqRyh+b8340wV7P54NqUMDXDit9sjITFDhq99V/R+Rj3PVjvJD3A== +"@abp/luxon@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-6.0.0-rc.3.tgz#ba515e122c61918d481467d5be39f08a363822f6" + integrity sha512-2lRSSC0DYShlnKdbJ/Pmha/azjt09ZRPx57NQ01dc7ungChPry5EJL6pC3kXWnJrCkrPCF0V5+A3+taut9+l3A== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" luxon "^2.3.0" -"@abp/malihu-custom-scrollbar-plugin@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-5.3.0.tgz#e6e12162aa50d3c3d98629378cec2f6fd5964338" - integrity sha512-GVwgAZQurH/tr4Hgmuby2dun//v1dT+wLGV4ZvjCJzBRs4FgrB+25pj4qKm20j6/NKRKc4V5re/b1y6njCubFQ== +"@abp/malihu-custom-scrollbar-plugin@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-6.0.0-rc.3.tgz#0798e37ec6a852748118692a5fbd30c99d9745db" + integrity sha512-FlyShmRxG3wGk1OJCjHIZAdi2/Y2FJPkVxaE72CVIceQSmg0nebGTv3a7bhd4QzKkDsSA3+t6gHjnuKlTlDFLA== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/popper.js@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/popper.js/-/popper.js-5.3.0.tgz#7042fc857ccc7a43f5c4d4411910e9e1b2e57384" - integrity sha512-+LQWbZGNCfxOGWHnP40R0SpG4O4ft0JPla9JCaKw0rFPyel0ih3M2gpUlKO1a6fKApDxTFQIvJYYRD1tLkMkvw== +"@abp/popper.js@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/popper.js/-/popper.js-6.0.0-rc.3.tgz#de55a85186f720e16607a3d2445885accb8c1527" + integrity sha512-YggzPKVWaERf5esSzAsa9Qi6+BCSfNPULkwXAPa3qoP/OtXuI6e+U12CzhTWrcFLp4Xv6Wq8Y+iNNSkVhj/n2w== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" "@popperjs/core" "^2.11.2" -"@abp/prismjs@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-5.3.0.tgz#658a371023d9a3de9ecfff1f10bae7a83064fac7" - integrity sha512-NPsYJ9oj/57vG+eVGpDkJcdPAx4WlXTVEUZWWxmaXuM9sHY1/2av975Qk8R5HG6fC74w3DrVCP8YQvU6jlaF1w== +"@abp/prismjs@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-6.0.0-rc.3.tgz#e4faf595e29db81c5a66030e59b0e09f09759bfd" + integrity sha512-zzd3iw/Im0M9FUmTviwkTCr4slkoZJExtK+qB1FmLxRY59+hyU9wxd6hwzic/QwhXxFQoYILJ3S3FNxsPIm76A== dependencies: - "@abp/clipboard" "~5.3.0" - "@abp/core" "~5.3.0" + "@abp/clipboard" "~6.0.0-rc.3" + "@abp/core" "~6.0.0-rc.3" prismjs "^1.26.0" -"@abp/select2@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-5.3.0.tgz#aae202b87dc23dfc7c8fd933413a8dbeb2f5b683" - integrity sha512-0aIxdtzgONkrYnUN5ACkIIIhsC9e61QLRq3K+/98fjf7NkHOjG3Sptr8EKu5U3IQ2hNHgqBjPGYjkztGuxZ9kw== +"@abp/select2@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-6.0.0-rc.3.tgz#deb8332bfce2102a562004893321a48d5194bf53" + integrity sha512-rb0qElmmhiP09xX8ZbjzNLF6ygFBwErysGWt6Bbgzz5waX2sGe575Cgoz53FaMQ4JaRBg1N0/nCejKyDtiINRA== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" select2 "^4.0.13" -"@abp/sweetalert2@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-5.3.0.tgz#67379cfa4cb8884cb66b58f4cafa79960cf8426a" - integrity sha512-EBr8J7MDsYmSvOYxTbqsSmw6c2yLokHZe8A+EW2vsY9VYFXkoOJLVpCkCK4fhvHUv8/+Y5QnHW7bs1I6SKYXOw== +"@abp/sweetalert2@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-6.0.0-rc.3.tgz#e61fc6c1bed1316c1d44ca5c92f590e422db24d4" + integrity sha512-+SNpBb4XrQlWzRQK9lfdJqA9IfJrlgoqmHwPDgf3Q+P922MzO33TgDlZWbeE7MzVj2y2WmNsPuCKwhjSjSL2rw== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" sweetalert2 "^11.3.6" -"@abp/timeago@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-5.3.0.tgz#3aaef3edca333224ba6b3e81c8ad1ebaae51a2f4" - integrity sha512-FxtoPYxyk2CHeoloC6kaeCj5YtXH0rebhOEaCjrfyg9/Ec6LEkvpfC7RWlcsHaEUAtFXZegJDfOk066EPH7RHQ== +"@abp/timeago@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-6.0.0-rc.3.tgz#0ef8c4801bfd4623e6895b1d047b1437063bda53" + integrity sha512-P3YRDVKjR5/Fz+cXiPg3IiUr7XGbNh7mgmJ1ywRXmKVmVMJmhQ2RsKmmtkGJn4TfVHu/l5iJXe4rqgL21/yX/g== dependencies: - "@abp/jquery" "~5.3.0" + "@abp/jquery" "~6.0.0-rc.3" timeago "^1.6.7" -"@abp/toastr@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-5.3.0.tgz#8a002c19ea25ac6b042a25c0f9d289d03c93c2fb" - integrity sha512-gjb2O/XrYkX8IeCERIqlOYPh15WlF9LxGR6t9jeVF/p6BTX/yaWabYCFfB9SkU2pQ6xrGl7WmSTAC06JOAtPTA== +"@abp/toastr@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-6.0.0-rc.3.tgz#6010d4247937531ebf7c8659d6254cd3db6c4855" + integrity sha512-sC9eCzYVgDrLSFIhJGe9hshzfwA1BkZNah4NQhyq+V6HQ8YF7goMS79N+/XmSoLQ9zzRhusqnPFnb+4FHjr7iA== dependencies: - "@abp/jquery" "~5.3.0" + "@abp/jquery" "~6.0.0-rc.3" toastr "^2.1.4" -"@abp/utils@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-5.3.0.tgz#e93739074a3cd445a5a221209506b7e663050ca0" - integrity sha512-Nm+h+3PL10+rBFSh8UUuenmGM+OBlEoNQeGzHRmhOc6hJ3oqCogPzY+zkq0e4pksrwhjxAu/cgCEGLAoEXXycw== +"@abp/utils@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-6.0.0-rc.3.tgz#6d3515694314175218606e9518618ce335b4b360" + integrity sha512-K2geJ9P1ztk4Ehzb9YG3CqqLOi+z8/4iBLUzooNZLQqS+KdlUhCmqfuCoI/A5Aq9DGbTYesalp+Fwoh3S2Dl8A== dependencies: just-compare "^1.3.0" diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Documents/DocumentDto.cs b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Documents/DocumentDto.cs index c415efa860..b574870fd8 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Documents/DocumentDto.cs +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Documents/DocumentDto.cs @@ -8,6 +8,8 @@ namespace Volo.Docs.Admin.Documents public class DocumentDto : EntityDto { public virtual Guid ProjectId { get; set; } + + public virtual string ProjectName { get; set; } public virtual string Name { get; set; } diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Documents/DocumentInfoDto.cs b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Documents/DocumentInfoDto.cs new file mode 100644 index 0000000000..545e665869 --- /dev/null +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Documents/DocumentInfoDto.cs @@ -0,0 +1,11 @@ +using System; + +namespace Volo.Docs.Admin.Documents; + +public class DocumentInfoDto +{ + public string Version { get; set; } + public string Format { get; set; } + public string LanguageCode { get; set; } + public Guid ProjectId { get; set; } +} \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Documents/IDocumentAdminAppService.cs b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Documents/IDocumentAdminAppService.cs index 0770ec5d72..12bdbc87be 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Documents/IDocumentAdminAppService.cs +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Documents/IDocumentAdminAppService.cs @@ -19,5 +19,7 @@ namespace Volo.Docs.Admin.Documents Task RemoveFromCacheAsync(Guid documentId); Task ReindexAsync(Guid documentId); + + Task> GetFilterItemsAsync(); } } 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 4849da66e5..ada739b4d7 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 @@ -54,6 +54,7 @@ "Version": "إصدار", "LanguageCode": "رمز اللغة", "FileName": "اسم الملف", - "LastCachedTime": "وقت ذاكرة التخزين" + "LastCachedTime": "وقت ذاكرة التخزين", + "Project": "مشروع " } } 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 57dd3c75d5..c593147804 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 @@ -54,6 +54,7 @@ "Version": "Verze", "LanguageCode": "Kód jazyka", "FileName": "Název souboru", - "LastCachedTime": "Čas uložení v mezipaměti" + "LastCachedTime": "Čas uložení v mezipaměti", + "Project": "Projekt" } } 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 28d5f53f47..4d92840132 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 @@ -54,6 +54,7 @@ "Version": "Version", "LanguageCode": "Sprachcode", "FileName": "Dateiname", - "LastCachedTime": "Cache-Zeit" + "LastCachedTime": "Cache-Zeit", + "Project": "Projekt" } } \ 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 2eccecb715..7939e4a8f1 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 @@ -32,6 +32,7 @@ "DisplayName:GitHubUserAgent": "GitHub-Benutzer-Agent", "DisplayName:All": "Pull all", "DisplayName:LanguageCode": "Sprachcode", - "DisplayName:Version": "Version" + "DisplayName:Version": "Version", + "Project": "Projekt" } } \ 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 d44ba001db..bacdfd56de 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 @@ -54,6 +54,7 @@ "Version": "Εκδοχή", "LanguageCode": "Κωδικός γλώσσας", "FileName": "Όνομα αρχείου", - "LastCachedTime": "Χρόνος προσωρινής αποθήκευσης" + "LastCachedTime": "Χρόνος προσωρινής αποθήκευσης", + "Project": "Εργο" } } \ 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 1e3339963a..d72c523ef5 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 @@ -54,6 +54,8 @@ "Version": "Version", "LanguageCode": "Language code", "FileName": "File name", - "LastCachedTime": "Cache time" + "LastCachedTime": "Cache time", + "Project": "Project", + "AdvancedFilters": "Advanced Filters" } } \ 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 d19bef7adf..86142ceb44 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 @@ -54,6 +54,8 @@ "Version": "Version", "LanguageCode": "Language code", "FileName": "File name", - "LastCachedTime": "Cache time" + "LastCachedTime": "Cache time", + "Project": "Project", + "AdvancedFilters": "Advanced Filters" } } \ 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 f09eb5386b..9858f9d94a 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 @@ -54,6 +54,7 @@ "Version": "Versión", "LanguageCode": "Código de idioma", "FileName": "Nombre de fichero", - "LastCachedTime": "Última actualización de caché" + "LastCachedTime": "Última actualización de caché", + "Project": "Proyecto" } } \ 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 0d0f7de507..58befd658c 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 @@ -54,6 +54,7 @@ "Version": "Versio", "LanguageCode": "Kielikoodi", "FileName": "Tiedoston nimi", - "LastCachedTime": "Välimuistin aika" + "LastCachedTime": "Välimuistin aika", + "Project": "Projekti" } } \ 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 f00ce0a5c9..7a6d6a89cf 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 @@ -54,6 +54,7 @@ "Version": "Version", "LanguageCode": "Code de langue", "FileName": "Nom de fichier", - "LastCachedTime": "Temps de cache" + "LastCachedTime": "Temps de cache", + "Project": "Projet" } } \ 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 d2a0e11876..a7d357e83e 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 @@ -54,6 +54,7 @@ "Version": "संस्करण", "LanguageCode": "भाषा कोड", "FileName": "फ़ाइल का नाम", - "LastCachedTime": "कैश समय" + "LastCachedTime": "कैश समय", + "Project": "परियोजना" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/hu.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/hu.json index 10d1611838..b10e721550 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/hu.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/hu.json @@ -1,61 +1,61 @@ { - "culture": "hu", - "texts": { - "Permission:DocumentManagement": "Dokumentum kezelés", - "Permission:Projects": "Projektek", - "Permission:Edit": "Szerkesztés", - "Permission:Delete": "Törlés", - "Permission:Create": "Létrehozás", - "Permission:Documents": "Dokumentumok", - "Menu:Documents": "Dokumentumok", - "Menu:DocumentManagement": "Dokumentumok", - "Menu:ProjectManagement": "Projektek", - "CreateANewProject": "Új projekt létrehozása", - "Edit": "Szerkesztés", - "Create": "Létrehozás", - "Pull": "Pull", - "Projects": "Projektek", - "Name": "Név", - "ShortName": "Rövid név", - "DocumentStoreType": "Dokumentumtároló típus", - "Format": "Formátum", - "ShortNameInfoText": "Használjon egyedi URL-t.", - "DisplayName:Name": "Név", - "DisplayName:ShortName": "Rövid név", - "DisplayName:Format": "Formátum", - "DisplayName:DefaultDocumentName": "Alapértlemezett dokumentum név", - "DisplayName:NavigationDocumentName": "Navigációs dokumentum neve", - "DisplayName:MinimumVersion": "Minimális verzió", - "DisplayName:MainWebsiteUrl": "A fő webhely URL-je", - "DisplayName:LatestVersionBranchName": "Az utolsó verzió branch neve", - "DisplayName:GitHubRootUrl": "GitHub root URL", - "DisplayName:GitHubAccessToken": "GitHub access token", - "DisplayName:GitHubUserAgent": "GitHub user agent", - "DisplayName:GithubVersionProviderSource": "GitHub version provider source", - "DisplayName:VersionBranchPrefix": "Version branch prefix", - "DisplayName:All": "Pull all", - "DisplayName:LanguageCode": "Nyelv kódja", - "DisplayName:Version": "Verzió", - "Documents": "Dokumentumok", - "RemoveFromCache": "Távolítsa el a gyorsítótárból", - "Reindex": "Újraindexálás", - "ReindexCompleted": "Újraindexálás teljes.", - "RemovedFromCache": "Távolítsa el a gyorsítótárból", - "RemoveFromCacheConfirmation": "Biztosan eltávolítja ezt az elemet a gyorsítótárból?", - "ReIndexDocumentConfirmation": "Biztosan újraindexeli ezt az elemet?", - "DeleteDocumentFromDbConfirmation": "Biztosan törli ezt az elemet az adatbázisból?", - "DeleteFromDatabase": "Törlés az adatbázisból", - "Deleted": "Törölt", - "Search": "Keresés", - "StartDate": "Indulási dátum", - "EndDate": "Befejezés dátuma", - "CreationTime": "Létrehozás ideje", - "LastUpdateTime": "Utolsó módosítás ideje", - "LastSignificantUpdateTime": "Utolsó jelentős frissítés", - "Version": "Verzió", - "LanguageCode": "Nyelv kódja", - "FileName": "Filenév", - "LastCachedTime": "Cache idő" - } + "culture": "hu", + "texts": { + "Permission:DocumentManagement": "Dokumentum kezelés", + "Permission:Projects": "Projektek", + "Permission:Edit": "Szerkesztés", + "Permission:Delete": "Törlés", + "Permission:Create": "Létrehozás", + "Permission:Documents": "Dokumentumok", + "Menu:Documents": "Dokumentumok", + "Menu:DocumentManagement": "Dokumentumok", + "Menu:ProjectManagement": "Projektek", + "CreateANewProject": "Új projekt létrehozása", + "Edit": "Szerkesztés", + "Create": "Létrehozás", + "Pull": "Pull", + "Projects": "Projektek", + "Name": "Név", + "ShortName": "Rövid név", + "DocumentStoreType": "Dokumentumtároló típus", + "Format": "Formátum", + "ShortNameInfoText": "Használjon egyedi URL-t.", + "DisplayName:Name": "Név", + "DisplayName:ShortName": "Rövid név", + "DisplayName:Format": "Formátum", + "DisplayName:DefaultDocumentName": "Alapértlemezett dokumentum név", + "DisplayName:NavigationDocumentName": "Navigációs dokumentum neve", + "DisplayName:MinimumVersion": "Minimális verzió", + "DisplayName:MainWebsiteUrl": "A fő webhely URL-je", + "DisplayName:LatestVersionBranchName": "Az utolsó verzió branch neve", + "DisplayName:GitHubRootUrl": "GitHub root URL", + "DisplayName:GitHubAccessToken": "GitHub access token", + "DisplayName:GitHubUserAgent": "GitHub user agent", + "DisplayName:GithubVersionProviderSource": "GitHub version provider source", + "DisplayName:VersionBranchPrefix": "Version branch prefix", + "DisplayName:All": "Pull all", + "DisplayName:LanguageCode": "Nyelv kódja", + "DisplayName:Version": "Verzió", + "Documents": "Dokumentumok", + "RemoveFromCache": "Távolítsa el a gyorsítótárból", + "Reindex": "Újraindexálás", + "ReindexCompleted": "Újraindexálás teljes.", + "RemovedFromCache": "Távolítsa el a gyorsítótárból", + "RemoveFromCacheConfirmation": "Biztosan eltávolítja ezt az elemet a gyorsítótárból?", + "ReIndexDocumentConfirmation": "Biztosan újraindexeli ezt az elemet?", + "DeleteDocumentFromDbConfirmation": "Biztosan törli ezt az elemet az adatbázisból?", + "DeleteFromDatabase": "Törlés az adatbázisból", + "Deleted": "Törölt", + "Search": "Keresés", + "StartDate": "Indulási dátum", + "EndDate": "Befejezés dátuma", + "CreationTime": "Létrehozás ideje", + "LastUpdateTime": "Utolsó módosítás ideje", + "LastSignificantUpdateTime": "Utolsó jelentős frissítés", + "Version": "Verzió", + "LanguageCode": "Nyelv kódja", + "FileName": "File név", + "LastCachedTime": "Cache idő", + "Project": "Projekt" } - \ No newline at end of file +} 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 101aab8182..c7d13791d0 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 @@ -54,6 +54,7 @@ "Version": "Útgáfa", "LanguageCode": "Túngumála kóði", "FileName": "Skráar nafn", - "LastCachedTime": "Tími geymt í skyndiminni" + "LastCachedTime": "Tími geymt í skyndiminni", + "Project": "Verkefni" } } \ 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 1a4d8e3f4c..b6c95e5b58 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 @@ -54,6 +54,7 @@ "Version": "Versione", "LanguageCode": "Codice della lingua", "FileName": "Nome del file", - "LastCachedTime": "Tempo di cache" + "LastCachedTime": "Tempo di cache", + "Project": "Progetto" } } \ 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 6451eed41e..e8cd5d730a 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 @@ -54,6 +54,7 @@ "Version": "Versie", "LanguageCode": "Taalcode", "FileName": "Bestandsnaam", - "LastCachedTime": "Cache tijd" + "LastCachedTime": "Cache tijd", + "Project": "Project" } } \ 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 26e4b8bc7f..5f1025a9a6 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 @@ -54,6 +54,7 @@ "Version": "Wersja", "LanguageCode": "Kod języka", "FileName": "Nazwa pliku", - "LastCachedTime": "Czas w pamięci podręcznej" + "LastCachedTime": "Czas w pamięci podręcznej", + "Project": "Projekt" } } \ 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 7daa4964b3..d926dfada9 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 @@ -32,7 +32,7 @@ "DisplayName:GitHubAccessToken": "Token de acesso do GitHub", "DisplayName:GitHubUserAgent": "Usuário agente do GitHub", "DisplayName:GithubVersionProviderSource": "Fonte do provedor de versão do GitHub", - "DisplayName:VersionBranchPrefix": "Prefixo da ramificação da versão", + "DisplayName:VersionBranchPrefix": "Prefixo da Branch da versão", "DisplayName:All": "Puxe tudo", "DisplayName:LanguageCode": "Código de idioma", "DisplayName:Version": "Versão", @@ -54,6 +54,8 @@ "Version": "Versão", "LanguageCode": "Código de idioma", "FileName": "Nome do arquivo", - "LastCachedTime": "Tempo de cache" + "LastCachedTime": "Tempo de cache", + "Project": "Projeto", + "AdvancedFilters": "Filtros Avançados" } } \ 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 02198cb96c..b236915665 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 @@ -54,6 +54,7 @@ "Version": "Versiune", "LanguageCode": "Codul limbii", "FileName": "Nume fişier", - "LastCachedTime": "Durată cache" + "LastCachedTime": "Durată cache", + "Project": "Proiect" } } \ 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 1b7082d189..16102717c2 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 @@ -54,6 +54,7 @@ "Version": "Версия", "LanguageCode": "Код языка", "FileName": "Имя файла", - "LastCachedTime": "Время кеширования" + "LastCachedTime": "Время кеширования", + "Project": "Проект" } } \ 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 ab0bc3e008..8041e796f0 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 @@ -54,6 +54,7 @@ "Version": "Verzia", "LanguageCode": "Kód jazyka", "FileName": "Názov súboru", - "LastCachedTime": "Čas vyrovnávacej pamäte" + "LastCachedTime": "Čas vyrovnávacej pamäte", + "Project": "Projekt" } } \ 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 f2061a9fd5..a3445dc87b 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 @@ -54,6 +54,7 @@ "Version": "Različica", "LanguageCode": "Jezikovna koda", "FileName": "Ime datoteke", - "LastCachedTime": "Čas predpomnilnika" + "LastCachedTime": "Čas pred pomnilnika", + "Project": "Projekt" } } \ 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 57c72b6db5..dade32b970 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 @@ -48,12 +48,14 @@ "Search": "Arama", "StartDate": "Başlangıç tarihi", "EndDate": "Bitiş tarihi", - "CreationTime": "oluşturma zamanı", + "CreationTime": "Oluşturma Zamanı", "LastUpdateTime": "Son Güncelleme", "LastSignificantUpdateTime": "Son önemli güncelleme", - "Version": "sürüm", + "Version": "Sürüm", "LanguageCode": "Dil kodu", "FileName": "Dosya adı", - "LastCachedTime": "Önbellek süresi" + "LastCachedTime": "Önbellek süresi", + "Project": "Proje", + "AdvancedFilters": "Gelişmiş Filtre" } } \ 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 350d995cfe..c44d2feb8f 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 @@ -54,6 +54,7 @@ "Version": "Phiên bản", "LanguageCode": "Mật ngữ", "FileName": "Tên tệp", - "LastCachedTime": "Thời gian lưu vào bộ nhớ đệm" + "LastCachedTime": "Thời gian lưu vào bộ nhớ đệm", + "Project": "Dự án" } } \ 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 c0985f956a..f81333d38e 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 @@ -54,6 +54,7 @@ "Version": "版本", "LanguageCode": "语言代码", "FileName": "文件名称", - "LastCachedTime": "缓存项" + "LastCachedTime": "缓存项", + "Project": "项目" } } \ 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 cc76f54510..54d86eca33 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 @@ -54,6 +54,7 @@ "Version": "版本", "LanguageCode": "語言代碼", "FileName": "文檔名稱", - "LastCachedTime": "緩存時間" + "LastCachedTime": "緩存時間", + "Project": "项目" } } \ 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 9b832165d1..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 @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Threading.Tasks; using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Services; @@ -20,5 +21,6 @@ namespace Volo.Docs.Admin.Projects Task ReindexAsync(ReindexInput input); Task ReindexAllAsync(); + Task> GetListWithoutDetailsAsync(); } } diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Projects/ProjectWithoutDetailsDto.cs b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Projects/ProjectWithoutDetailsDto.cs new file mode 100644 index 0000000000..b6e6a301cb --- /dev/null +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Projects/ProjectWithoutDetailsDto.cs @@ -0,0 +1,9 @@ +using System; + +namespace Volo.Docs.Admin.Projects; + +public class ProjectWithoutDetailsDto +{ + public Guid Id { get; set; } + public string Name { get; set; } +} \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application/Volo.Docs.Admin.Application.abppkg.analyze.json b/modules/docs/src/Volo.Docs.Admin.Application/Volo.Docs.Admin.Application.abppkg.analyze.json index f366cff867..6ff12518c7 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application/Volo.Docs.Admin.Application.abppkg.analyze.json +++ b/modules/docs/src/Volo.Docs.Admin.Application/Volo.Docs.Admin.Application.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.Docs.Admin.Application", - "hash": "a4fd7ea711b7f38af3235eabde130328", + "hash": "1ebc44195de6a5460ff52b8b04113eda", "contents": [ { "namespace": "Volo.Docs.Admin", diff --git a/modules/docs/src/Volo.Docs.Admin.Application/Volo/Docs/Admin/DocsAdminApplicationAutoMapperProfile.cs b/modules/docs/src/Volo.Docs.Admin.Application/Volo/Docs/Admin/DocsAdminApplicationAutoMapperProfile.cs index 86e6d46e0c..01a7250ce5 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application/Volo/Docs/Admin/DocsAdminApplicationAutoMapperProfile.cs +++ b/modules/docs/src/Volo.Docs.Admin.Application/Volo/Docs/Admin/DocsAdminApplicationAutoMapperProfile.cs @@ -1,4 +1,5 @@ using AutoMapper; +using Volo.Abp.AutoMapper; using Volo.Docs.Admin.Documents; using Volo.Docs.Admin.Projects; using Volo.Docs.Documents; @@ -11,8 +12,10 @@ namespace Volo.Docs.Admin public DocsAdminApplicationAutoMapperProfile() { CreateMap(); - CreateMap(); + CreateMap().Ignore(x => x.ProjectName); CreateMap(); + CreateMap(); + CreateMap(); } } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application/Volo/Docs/Admin/Documents/DocumentAdminAppService.cs b/modules/docs/src/Volo.Docs.Admin.Application/Volo/Docs/Admin/Documents/DocumentAdminAppService.cs index af515b4be7..7d68681b1d 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application/Volo/Docs/Admin/Documents/DocumentAdminAppService.cs +++ b/modules/docs/src/Volo.Docs.Admin.Application/Volo/Docs/Admin/Documents/DocumentAdminAppService.cs @@ -5,7 +5,6 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Authorization; using Microsoft.Extensions.Logging; using Volo.Abp; -using Volo.Abp.Uow; using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Services; using Volo.Abp.Caching; @@ -217,6 +216,13 @@ namespace Volo.Docs.Admin.Documents await _elasticSearchService.AddOrUpdateAsync(document); } + public async Task> GetFilterItemsAsync() + { + var documents = await _documentRepository.GetUniqueListDocumentInfoAsync(); + return ObjectMapper.Map, List>(documents); + } + + private async Task UpdateDocumentUpdateInfoCache(Document document) { var cacheKey = $"DocumentUpdateInfo{document.ProjectId}#{document.Name}#{document.LanguageCode}#{document.Version}"; 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 14833cd3e4..540ecfe275 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 @@ -156,5 +156,11 @@ namespace Volo.Docs.Admin.Projects await ReindexProjectAsync(project.Id); } } + + public async Task> GetListWithoutDetailsAsync() + { + var projects = await _projectRepository.GetListWithoutDetailsAsync(); + return ObjectMapper.Map, List>(projects); + } } } diff --git a/modules/docs/src/Volo.Docs.Admin.HttpApi.Client/ClientProxies/DocumentsAdminClientProxy.Generated.cs b/modules/docs/src/Volo.Docs.Admin.HttpApi.Client/ClientProxies/DocumentsAdminClientProxy.Generated.cs index 7bb1ef0e87..e2b9fa2783 100644 --- a/modules/docs/src/Volo.Docs.Admin.HttpApi.Client/ClientProxies/DocumentsAdminClientProxy.Generated.cs +++ b/modules/docs/src/Volo.Docs.Admin.HttpApi.Client/ClientProxies/DocumentsAdminClientProxy.Generated.cs @@ -7,6 +7,7 @@ using Volo.Abp.Http.Modeling; using Volo.Abp.DependencyInjection; using Volo.Abp.Http.Client.ClientProxying; using Volo.Docs.Admin.Documents; +using System.Collections.Generic; // ReSharper disable once CheckNamespace namespace Volo.Docs.Admin.ClientProxies; @@ -62,4 +63,9 @@ public partial class DocumentsAdminClientProxy : ClientProxyBase> GetFilterItemsAsync() + { + return await RequestAsync>(nameof(GetFilterItemsAsync)); + } } diff --git a/modules/docs/src/Volo.Docs.Admin.HttpApi.Client/ClientProxies/ProjectsAdminClientProxy.Generated.cs b/modules/docs/src/Volo.Docs.Admin.HttpApi.Client/ClientProxies/ProjectsAdminClientProxy.Generated.cs index cb8d5c3947..072106df0e 100644 --- a/modules/docs/src/Volo.Docs.Admin.HttpApi.Client/ClientProxies/ProjectsAdminClientProxy.Generated.cs +++ b/modules/docs/src/Volo.Docs.Admin.HttpApi.Client/ClientProxies/ProjectsAdminClientProxy.Generated.cs @@ -7,6 +7,7 @@ using Volo.Abp.Http.Modeling; using Volo.Abp.DependencyInjection; using Volo.Abp.Http.Client.ClientProxying; using Volo.Docs.Admin.Projects; +using System.Collections.Generic; // ReSharper disable once CheckNamespace namespace Volo.Docs.Admin.ClientProxies; @@ -61,6 +62,11 @@ public partial class ProjectsAdminClientProxy : ClientProxyBase> GetListWithoutDetailsAsync() + { + return await RequestAsync>(nameof(GetListWithoutDetailsAsync)); + } + 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/docs-admin-generate-proxy.json b/modules/docs/src/Volo.Docs.Admin.HttpApi.Client/ClientProxies/docs-admin-generate-proxy.json index e85e6fbb43..c6cf885b09 100644 --- 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 @@ -7,6 +7,8 @@ "Volo.Docs.Admin.DocumentsAdminController": { "controllerName": "DocumentsAdmin", "controllerGroupName": "DocumentsAdmin", + "isRemoteService": true, + "apiVersion": null, "type": "Volo.Docs.Admin.DocumentsAdminController", "interfaces": [ { @@ -427,12 +429,29 @@ }, "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" } } }, "Volo.Docs.Admin.ProjectsAdminController": { "controllerName": "ProjectsAdmin", "controllerGroupName": "ProjectsAdmin", + "isRemoteService": true, + "apiVersion": null, "type": "Volo.Docs.Admin.ProjectsAdminController", "interfaces": [ { @@ -684,6 +703,21 @@ "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" + }, "ReindexAsyncByInput": { "uniqueName": "ReindexAsyncByInput", "name": "ReindexAsync", diff --git a/modules/docs/src/Volo.Docs.Admin.HttpApi.Client/Volo.Docs.Admin.HttpApi.Client.abppkg.analyze.json b/modules/docs/src/Volo.Docs.Admin.HttpApi.Client/Volo.Docs.Admin.HttpApi.Client.abppkg.analyze.json new file mode 100644 index 0000000000..a316aaf8ac --- /dev/null +++ b/modules/docs/src/Volo.Docs.Admin.HttpApi.Client/Volo.Docs.Admin.HttpApi.Client.abppkg.analyze.json @@ -0,0 +1,11 @@ +{ + "name": "Volo.Docs.Admin.HttpApi.Client", + "hash": "b89a21854479861a94321c9b9b14c1ef", + "contents": [ + { + "namespace": "Volo.Docs.Admin", + "contentType": "abpModule", + "name": "DocsAdminHttpApiClientModule" + } + ] +} \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.HttpApi/Volo.Docs.Admin.HttpApi.abppkg.analyze.json b/modules/docs/src/Volo.Docs.Admin.HttpApi/Volo.Docs.Admin.HttpApi.abppkg.analyze.json index fbaed474fc..99183af528 100644 --- a/modules/docs/src/Volo.Docs.Admin.HttpApi/Volo.Docs.Admin.HttpApi.abppkg.analyze.json +++ b/modules/docs/src/Volo.Docs.Admin.HttpApi/Volo.Docs.Admin.HttpApi.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.Docs.Admin.HttpApi", - "hash": "55c63d7060a78c41b6731fc57bac2791", + "hash": "2ce1eb9b94903de99e5e94c61fecd09d", "contents": [ { "namespace": "Volo.Docs.Admin", diff --git a/modules/docs/src/Volo.Docs.Admin.HttpApi/Volo/Docs/Admin/DocumentsAdminController.cs b/modules/docs/src/Volo.Docs.Admin.HttpApi/Volo/Docs/Admin/DocumentsAdminController.cs index 9404ac0bde..c0586ed699 100644 --- a/modules/docs/src/Volo.Docs.Admin.HttpApi/Volo/Docs/Admin/DocumentsAdminController.cs +++ b/modules/docs/src/Volo.Docs.Admin.HttpApi/Volo/Docs/Admin/DocumentsAdminController.cs @@ -63,5 +63,12 @@ namespace Volo.Docs.Admin { await _documentAdminAppService.ReindexAsync(documentId); } + + [HttpGet] + [Route("GetFilterItems")] + public async Task> GetFilterItemsAsync() + { + return await _documentAdminAppService.GetFilterItemsAsync(); + } } } 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 1696229bf8..ea0c7f1afd 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 @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Volo.Abp; @@ -61,6 +62,13 @@ namespace Volo.Docs.Admin return _projectAppService.ReindexAllAsync(); } + [HttpGet] + [Route("GetListProjectWithoutDetailsAsync")] + public Task> GetListWithoutDetailsAsync() + { + return _projectAppService.GetListWithoutDetailsAsync(); + } + [HttpPost] [Route("Reindex")] public Task ReindexAsync(ReindexInput input) diff --git a/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Documents/Index.cshtml b/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Documents/Index.cshtml index 5873afc279..9e846f24a9 100644 --- a/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Documents/Index.cshtml +++ b/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Documents/Index.cshtml @@ -32,147 +32,156 @@
-
-
-
-
@L["Name"].Value
- - -
-
+ -
+
-
@L["Version"].Value
- - +
@L["Project"].Value
+ +
-
+ -
+
-
@L["LanguageCode"].Value
+
@L["Version"].Value
- +
-
- - -
+ + +
-
@L["FileName"].Value
+
@L["Name"].Value
+ id="Name" + name="Name" + class="form-control">
-
+ -
+
-
@L["Format"].Value
+
@L["LanguageCode"].Value
- +
-
- - -
-
-
@L["CreationTime"].Value
- - - + + + + + + @L["AdvancedFilters"] + + +
+
+ -
-
-
@L["LastUpdateTime"].Value
- - +
+
@L["LastUpdateTime"].Value
+ - - - - -
-
- -
-
-
@L["LastSignificantUpdateTime"].Value
- - - - - - - -
-
+
+ -
-
-
@L["LastCachedTime"].Value
+ +
+
@L["LastCachedTime"].Value
- - - - - - -
-
- -
- -
-
+
+ + + +
+
@L["Format"].Value
+ + +
+
+ + + + + +
+
@L["LastSignificantUpdateTime"].Value
+ + + + +
+
+ + +
@@ -180,13 +189,14 @@ @L["Actions"] + @L["ProjectName"] @L["Name"] @L["Version"] @L["LanguageCode"] @L["FileName"] @L["Format"] @L["CreationTime"] - @L["LastUpdatedTime"] + @L["LastUpdateTime"] @L["LastSignificantUpdateTime"] @L["LastCachedTime"] diff --git a/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Documents/Index.cshtml.cs b/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Documents/Index.cshtml.cs index 559eaab5eb..194ad6780f 100644 --- a/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Documents/Index.cshtml.cs +++ b/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Documents/Index.cshtml.cs @@ -1,18 +1,24 @@ -using System; -using System.ComponentModel.DataAnnotations; +using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; -using Volo.Docs.Documents; +using Volo.Docs.Admin.Projects; -namespace Volo.Docs.Admin.Pages.Docs.Admin.Documents +namespace Volo.Docs.Admin.Pages.Docs.Admin.Documents; + +[Authorize(DocsAdminPermissions.Projects.Default)] +public class IndexModel : DocsAdminPageModel { - [Authorize(DocsAdminPermissions.Projects.Default)] - public class IndexModel : DocsAdminPageModel + private readonly IProjectAdminAppService _projectAdminAppService; + public List Projects { get; set; } + + public IndexModel(IProjectAdminAppService projectAdminAppService) + { + _projectAdminAppService = projectAdminAppService; + } + public virtual async Task OnGet() { - public virtual Task OnGet() - { - return Task.FromResult(Page()); - } + Projects = await _projectAdminAppService.GetListWithoutDetailsAsync(); + return Page(); } -} \ No newline at end of file +} diff --git a/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Documents/index.js b/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Documents/index.js index 928990e160..85c1ebc7be 100644 --- a/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Documents/index.js +++ b/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Documents/index.js @@ -6,13 +6,112 @@ $(function () { return $datePicker.data().datepicker.getFormattedDate('yyyy-mm-dd'); }; + var comboboxItems = []; + + service.getFilterItems() + .then(function (result) { + comboboxItems = result; + fillOptions(); + }).catch(function (error) { + abp.message.error(error); + }); + + + var $projectId = $('#ProjectId'); + + $projectId.on('change', function () { + fillOptions(); + }); + + var comboboxs = { + version: $('#Version'), + languageCode: $('#LanguageCode'), + format: $('#Format') + }; + + for (var key in comboboxs) { + comboboxs[key].on('change', function () { + fillOptions(); + }); + } + + + var selectedItem = getSelectedItem(); + + function emptyComboboxs() { + for (var key in comboboxs) { + comboboxs[key].empty(); + } + } + + function getSelectedItem() { + var item = {}; + for (var key in comboboxs) { + item[key] = comboboxs[key].val(); + } + return item; + } + + function SetComboboxsValues(item) { + for (var key in comboboxs) { + comboboxs[key].val(item[key]); + } + } + + function addComboboxsEmptyItem() { + for (var key in comboboxs) { + comboboxs[key].append($('
public bool AddDeveloperSigningCredential { get; set; } = true; + + /// + /// Adds the default cookie handlers and corresponding configuration + /// Default: true, Set false to suppress AddCookieAuthentication() call on the IIdentityServerBuilder. + /// + public bool AddIdentityServerCookieAuthentication { get; set; } = true; } diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpIdentityServerDomainModule.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpIdentityServerDomainModule.cs index 96ab4abd89..9b9dde5c96 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpIdentityServerDomainModule.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpIdentityServerDomainModule.cs @@ -1,4 +1,5 @@ using System.Threading.Tasks; +using IdentityServer4.Configuration; using IdentityServer4.Services; using IdentityServer4.Stores; using Microsoft.Extensions.DependencyInjection; @@ -71,13 +72,7 @@ public class AbpIdentityServerDomainModule : AbpModule var configuration = services.GetConfiguration(); var builderOptions = services.ExecutePreConfiguredActions(); - var identityServerBuilder = services.AddIdentityServer(options => - { - options.Events.RaiseErrorEvents = true; - options.Events.RaiseInformationEvents = true; - options.Events.RaiseFailureEvents = true; - options.Events.RaiseSuccessEvents = true; - }); + var identityServerBuilder = AddIdentityServer(services, builderOptions); if (builderOptions.AddDeveloperSigningCredential) { @@ -110,6 +105,37 @@ public class AbpIdentityServerDomainModule : AbpModule } } + private static IIdentityServerBuilder AddIdentityServer(IServiceCollection services, AbpIdentityServerBuilderOptions abpIdentityServerBuilderOptions) + { + services.Configure(options => + { + options.Events.RaiseErrorEvents = true; + options.Events.RaiseInformationEvents = true; + options.Events.RaiseFailureEvents = true; + options.Events.RaiseSuccessEvents = true; + }); + + var identityServerBuilder = services.AddIdentityServerBuilder() + .AddRequiredPlatformServices() + .AddCoreServices() + .AddDefaultEndpoints() + .AddPluggableServices() + .AddValidators() + .AddResponseGenerators() + .AddDefaultSecretParsers() + .AddDefaultSecretValidators(); + + if (abpIdentityServerBuilderOptions.AddIdentityServerCookieAuthentication) + { + identityServerBuilder.AddCookieAuthentication(); + } + + // provide default in-memory implementation, not suitable for most production scenarios + identityServerBuilder.AddInMemoryPersistedGrants(); + + return identityServerBuilder; + } + public override void PostConfigureServices(ServiceConfigurationContext context) { OneTimeRunner.Run(() => diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpWildcardSubdomainCorsPolicyService.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpWildcardSubdomainCorsPolicyService.cs index 82658ceccd..32d2d1eb73 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpWildcardSubdomainCorsPolicyService.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpWildcardSubdomainCorsPolicyService.cs @@ -3,6 +3,7 @@ using System.Linq; using System.Threading.Tasks; using IdentityServer4.Configuration; using Microsoft.Extensions.Options; +using Microsoft.Extensions.DependencyInjection; using Volo.Abp.Caching; using Volo.Abp.DependencyInjection; using Volo.Abp.Text.Formatting; @@ -13,7 +14,7 @@ public class AbpWildcardSubdomainCorsPolicyService : AbpCorsPolicyService { public AbpWildcardSubdomainCorsPolicyService( IDistributedCache cache, - IHybridServiceScopeFactory hybridServiceScopeFactory, + IServiceScopeFactory hybridServiceScopeFactory, IOptions options) : base(cache, hybridServiceScopeFactory, options) { diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AspNetIdentity/AbpResourceOwnerPasswordValidator.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AspNetIdentity/AbpResourceOwnerPasswordValidator.cs index 77181a8b8b..cf69fda91a 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AspNetIdentity/AbpResourceOwnerPasswordValidator.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AspNetIdentity/AbpResourceOwnerPasswordValidator.cs @@ -32,7 +32,7 @@ public class AbpResourceOwnerPasswordValidator : IResourceOwnerPasswordValidator protected IdentitySecurityLogManager IdentitySecurityLogManager { get; } protected ILogger> Logger { get; } protected IStringLocalizer Localizer { get; } - protected IHybridServiceScopeFactory ServiceScopeFactory { get; } + protected IServiceScopeFactory ServiceScopeFactory { get; } protected AbpIdentityOptions AbpIdentityOptions { get; } protected IOptions IdentityOptions { get; } @@ -43,7 +43,7 @@ public class AbpResourceOwnerPasswordValidator : IResourceOwnerPasswordValidator ILogger> logger, IStringLocalizer localizer, IOptions abpIdentityOptions, - IHybridServiceScopeFactory serviceScopeFactory, + IServiceScopeFactory serviceScopeFactory, IOptions identityOptions) { UserManager = userManager; diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ResourceStore.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ResourceStore.cs index d24d7e31c9..51862d7597 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ResourceStore.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ResourceStore.cs @@ -61,14 +61,14 @@ public class ResourceStore : IResourceStore ///
public virtual async Task> FindIdentityResourcesByScopeNameAsync(IEnumerable scopeNames) { - return await GetCacheItemsAsync( + return (await GetCacheItemsAsync( IdentityResourceCache, scopeNames, async keys => await IdentityResourceRepository.GetListByScopeNameAsync(keys, includeDetails: true), (models, cacheKeyPrefix) => new List>> { models.Select(x => new KeyValuePair(AddCachePrefix(x.Name, cacheKeyPrefix), x)) - }); + })).DistinctBy(x => x.Name); } /// @@ -76,14 +76,14 @@ public class ResourceStore : IResourceStore /// public virtual async Task> FindApiScopesByNameAsync(IEnumerable scopeNames) { - return await GetCacheItemsAsync( + return (await GetCacheItemsAsync( ApiScopeCache, scopeNames, async keys => await ApiScopeRepository.GetListByNameAsync(keys, includeDetails: true), (models, cacheKeyPrefix) => new List>> { models.Select(x => new KeyValuePair(AddCachePrefix(x.Name, cacheKeyPrefix), x)) - }); + })).DistinctBy(x => x.Name); } /// @@ -91,7 +91,7 @@ public class ResourceStore : IResourceStore /// public virtual async Task> FindApiResourcesByScopeNameAsync(IEnumerable scopeNames) { - return await GetCacheItemsAsync( + return (await GetCacheItemsAsync( ApiResourceCache, scopeNames, async keys => await ApiResourceRepository.GetListByScopesAsync(keys, includeDetails: true), @@ -100,7 +100,7 @@ public class ResourceStore : IResourceStore return models .Select(model => model.Scopes.Select(scope => new KeyValuePair(AddCachePrefix(scope, cacheKeyPrefix), model)).ToList()) .Where(scopes => scopes.Any()).Cast>>().ToList(); - }, ApiResourceScopeNameCacheKeyPrefix); + }, ApiResourceScopeNameCacheKeyPrefix)).DistinctBy(x => x.Name); } /// @@ -108,14 +108,14 @@ public class ResourceStore : IResourceStore /// public virtual async Task> FindApiResourcesByNameAsync(IEnumerable apiResourceNames) { - return await GetCacheItemsAsync( + return (await GetCacheItemsAsync( ApiResourceCache, apiResourceNames, async keys => await ApiResourceRepository.FindByNameAsync(keys, includeDetails: true), (models, cacheKeyPrefix) => new List>> { models.Select(x => new KeyValuePair(AddCachePrefix(x.Name, cacheKeyPrefix), x)) - }, ApiResourceNameCacheKeyPrefix); + }, ApiResourceNameCacheKeyPrefix)).DistinctBy(x => x.Name); } /// diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Installer/Volo.Abp.IdentityServer.Installer.abppkg.json b/modules/identityserver/src/Volo.Abp.IdentityServer.Installer/Volo.Abp.IdentityServer.Installer.abppkg.json deleted file mode 100644 index 9e26dfeeb6..0000000000 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Installer/Volo.Abp.IdentityServer.Installer.abppkg.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Installer/Volo.Abp.IdentityServer.Installer.csproj b/modules/identityserver/src/Volo.Abp.IdentityServer.Installer/Volo.Abp.IdentityServer.Installer.csproj index ca7d96ac5d..372b51398b 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Installer/Volo.Abp.IdentityServer.Installer.csproj +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Installer/Volo.Abp.IdentityServer.Installer.csproj @@ -4,13 +4,13 @@ - net5.0 + net6.0 true - + diff --git a/modules/identityserver/test/Volo.Abp.IdentityServer.Domain.Tests/Volo/Abp/IdentityServer/Clients/IdentityResourceStore_Tests.cs b/modules/identityserver/test/Volo.Abp.IdentityServer.Domain.Tests/Volo/Abp/IdentityServer/Clients/IdentityResourceStore_Tests.cs index 7d946b012c..c54c99e88d 100644 --- a/modules/identityserver/test/Volo.Abp.IdentityServer.Domain.Tests/Volo/Abp/IdentityServer/Clients/IdentityResourceStore_Tests.cs +++ b/modules/identityserver/test/Volo.Abp.IdentityServer.Domain.Tests/Volo/Abp/IdentityServer/Clients/IdentityResourceStore_Tests.cs @@ -53,7 +53,7 @@ public class IdentityResourceStore_Tests : AbpIdentityServerTestBase //Assert apiResources.ShouldNotBe(null); - apiResources[0].Scopes.Count.ShouldBe(3); + apiResources[0].Scopes.Count.ShouldBe(4); } [Fact] diff --git a/modules/identityserver/test/Volo.Abp.IdentityServer.Domain.Tests/Volo/Abp/IdentityServer/ResourceStore_Cache_Tests.cs b/modules/identityserver/test/Volo.Abp.IdentityServer.Domain.Tests/Volo/Abp/IdentityServer/ResourceStore_Cache_Tests.cs index dbc77425af..b33b8aa580 100644 --- a/modules/identityserver/test/Volo.Abp.IdentityServer.Domain.Tests/Volo/Abp/IdentityServer/ResourceStore_Cache_Tests.cs +++ b/modules/identityserver/test/Volo.Abp.IdentityServer.Domain.Tests/Volo/Abp/IdentityServer/ResourceStore_Cache_Tests.cs @@ -54,7 +54,7 @@ public class ResourceStore_Cache_Tests : AbpIdentityServerDomainTestBase apiResources1.Count.ShouldBe(1); apiResources1.First().Name.ShouldBe("Test-ApiResource-Name-1"); - var apiResources2 = (await _resourceStore.FindApiResourcesByScopeNameAsync(new[] { "Test-ApiResource-ApiScope-Name-1", nameof(ApiResourceScope.Scope) })).ToList(); + var apiResources2 = (await _resourceStore.FindApiResourcesByScopeNameAsync(new[] { "Test-ApiResource-ApiScope-Name-1", "Test-ApiResource-ApiScope-Name-2", nameof(ApiResourceScope.Scope) })).ToList(); apiResources2.ShouldNotBeEmpty(); apiResources2.Count.ShouldBe(2); apiResources2.ShouldContain(x => x.Name == "Test-ApiResource-Name-1"); diff --git a/modules/identityserver/test/Volo.Abp.IdentityServer.TestBase/Volo/Abp/IdentityServer/AbpIdentityServerTestDataBuilder.cs b/modules/identityserver/test/Volo.Abp.IdentityServer.TestBase/Volo/Abp/IdentityServer/AbpIdentityServerTestDataBuilder.cs index 64c6f09209..eaf8aabf58 100644 --- a/modules/identityserver/test/Volo.Abp.IdentityServer.TestBase/Volo/Abp/IdentityServer/AbpIdentityServerTestDataBuilder.cs +++ b/modules/identityserver/test/Volo.Abp.IdentityServer.TestBase/Volo/Abp/IdentityServer/AbpIdentityServerTestDataBuilder.cs @@ -103,6 +103,7 @@ public class AbpIdentityServerTestDataBuilder : ITransientDependency apiResource2.AddSecret("secret".Sha256()); apiResource2.AddScope("Test-ApiResource-ApiScope-Name-1"); + apiResource2.AddScope("Test-ApiResource-ApiScope-Name-2"); apiResource2.AddScope("Test-ApiResource-ApiScope-DisplayName-1"); apiResource2.AddUserClaim("Test-ApiResource-Claim-Type-1"); diff --git a/modules/openiddict/Volo.Abp.OpenIddict.abpmdl.json b/modules/openiddict/Volo.Abp.OpenIddict.abpmdl.json new file mode 100644 index 0000000000..7cb30216ab --- /dev/null +++ b/modules/openiddict/Volo.Abp.OpenIddict.abpmdl.json @@ -0,0 +1,71 @@ +{ + "folders": { + "items": { + "src": {}, + "test": {}, + "app": {} + } + }, + "packages": { + "Volo.Abp.OpenIddict.Domain.Shared": { + "path": "src/Volo.Abp.OpenIddict.Domain.Shared/Volo.Abp.OpenIddict.Domain.Shared.abppkg.json", + "folder": "src" + }, + "Volo.Abp.OpenIddict.Domain": { + "path": "src/Volo.Abp.OpenIddict.Domain/Volo.Abp.OpenIddict.Domain.abppkg.json", + "folder": "src" + }, + "Volo.Abp.OpenIddict.EntityFrameworkCore": { + "path": "src/Volo.Abp.OpenIddict.EntityFrameworkCore/Volo.Abp.OpenIddict.EntityFrameworkCore.abppkg.json", + "folder": "src" + }, + "Volo.Abp.OpenIddict.MongoDB": { + "path": "src/Volo.Abp.OpenIddict.MongoDB/Volo.Abp.OpenIddict.MongoDB.abppkg.json", + "folder": "src" + }, + "Volo.Abp.OpenIddict.TestBase": { + "path": "test/Volo.Abp.OpenIddict.TestBase/Volo.Abp.OpenIddict.TestBase.abppkg.json", + "folder": "test" + }, + "Volo.Abp.OpenIddict.EntityFrameworkCore.Tests": { + "path": "test/Volo.Abp.OpenIddict.EntityFrameworkCore.Tests/Volo.Abp.OpenIddict.EntityFrameworkCore.Tests.abppkg.json", + "folder": "test" + }, + "Volo.Abp.OpenIddict.MongoDB.Tests": { + "path": "test/Volo.Abp.OpenIddict.MongoDB.Tests/Volo.Abp.OpenIddict.MongoDB.Tests.abppkg.json", + "folder": "test" + }, + "Volo.Abp.OpenIddict.Domain.Tests": { + "path": "test/Volo.Abp.OpenIddict.Domain.Tests/Volo.Abp.OpenIddict.Domain.Tests.abppkg.json", + "folder": "test" + }, + "OpenIddict.Demo.Server": { + "path": "app/OpenIddict.Demo.Server/OpenIddict.Demo.Server.abppkg.json", + "folder": "app" + }, + "OpenIddict.Demo.Client.Mvc": { + "path": "app/OpenIddict.Demo.Client.Mvc/OpenIddict.Demo.Client.Mvc.abppkg.json", + "folder": "app" + }, + "Volo.Abp.OpenIddict.AspNetCore": { + "path": "src/Volo.Abp.OpenIddict.AspNetCore/Volo.Abp.OpenIddict.AspNetCore.abppkg.json", + "folder": "src" + }, + "OpenIddict.Demo.Client.Console": { + "path": "app/OpenIddict.Demo.Client.Console/OpenIddict.Demo.Client.Console.abppkg.json", + "folder": "app" + }, + "OpenIddict.Demo.API": { + "path": "app/OpenIddict.Demo.API/OpenIddict.Demo.API.abppkg.json", + "folder": "app" + }, + "OpenIddict.Demo.Client.BlazorWASM": { + "path": "app/OpenIddict.Demo.Client.BlazorWASM/OpenIddict.Demo.Client.BlazorWASM.abppkg.json", + "folder": "app" + }, + "Volo.Abp.PermissionManagement.Domain.OpenIddict": { + "path": "src/Volo.Abp.PermissionManagement.Domain.OpenIddict/Volo.Abp.PermissionManagement.Domain.OpenIddict.abppkg.json", + "folder": "src" + } + } +} \ No newline at end of file diff --git a/modules/openiddict/Volo.Abp.OpenIddict.abpsln.json b/modules/openiddict/Volo.Abp.OpenIddict.abpsln.json new file mode 100644 index 0000000000..3e59583a9a --- /dev/null +++ b/modules/openiddict/Volo.Abp.OpenIddict.abpsln.json @@ -0,0 +1,8 @@ +{ + "template": "empty", + "modules": { + "Volo.Abp.OpenIddict": { + "path": "Volo.Abp.OpenIddict.abpmdl.json" + } + } +} \ No newline at end of file diff --git a/modules/openiddict/Volo.Abp.OpenIddict.sln b/modules/openiddict/Volo.Abp.OpenIddict.sln index c95dc5f251..8161e82a2a 100644 --- a/modules/openiddict/Volo.Abp.OpenIddict.sln +++ b/modules/openiddict/Volo.Abp.OpenIddict.sln @@ -39,6 +39,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenIddict.Demo.Client.Blaz EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.PermissionManagement.Domain.OpenIddict", "src\Volo.Abp.PermissionManagement.Domain.OpenIddict\Volo.Abp.PermissionManagement.Domain.OpenIddict.csproj", "{674D0A62-4F7B-436C-83A9-AA8FE03F3A11}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.OpenIddict.Installer", "src\Volo.Abp.OpenIddict.Installer\Volo.Abp.OpenIddict.Installer.csproj", "{B748241A-E782-493D-8905-0C27033AB519}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -105,6 +107,10 @@ Global {674D0A62-4F7B-436C-83A9-AA8FE03F3A11}.Debug|Any CPU.Build.0 = Debug|Any CPU {674D0A62-4F7B-436C-83A9-AA8FE03F3A11}.Release|Any CPU.ActiveCfg = Release|Any CPU {674D0A62-4F7B-436C-83A9-AA8FE03F3A11}.Release|Any CPU.Build.0 = Release|Any CPU + {B748241A-E782-493D-8905-0C27033AB519}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B748241A-E782-493D-8905-0C27033AB519}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B748241A-E782-493D-8905-0C27033AB519}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B748241A-E782-493D-8905-0C27033AB519}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -125,6 +131,7 @@ Global {70FD6E90-BBE8-4DA1-AE07-55064803225B} = {2B5CD179-FF7B-428F-98F6-2ADBB9538D18} {F3853F2B-72D4-496C-B59C-87E2759AD79B} = {2B5CD179-FF7B-428F-98F6-2ADBB9538D18} {674D0A62-4F7B-436C-83A9-AA8FE03F3A11} = {649A3FFA-182F-4E56-9717-E6A9A2BEC545} + {B748241A-E782-493D-8905-0C27033AB519} = {649A3FFA-182F-4E56-9717-E6A9A2BEC545} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {C09128AF-C73F-ED7D-33F5-69BF7D934D50} diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Installer/Volo.Abp.AuditLogging.Installer.abppkg.json b/modules/openiddict/app/OpenIddict.Demo.API/OpenIddict.Demo.API.abppkg.json similarity index 100% rename from modules/audit-logging/src/Volo.Abp.AuditLogging.Installer/Volo.Abp.AuditLogging.Installer.abppkg.json rename to modules/openiddict/app/OpenIddict.Demo.API/OpenIddict.Demo.API.abppkg.json diff --git a/modules/openiddict/app/OpenIddict.Demo.API/OpenIddict.Demo.API.csproj b/modules/openiddict/app/OpenIddict.Demo.API/OpenIddict.Demo.API.csproj index ea620272cb..fc8ba192d3 100644 --- a/modules/openiddict/app/OpenIddict.Demo.API/OpenIddict.Demo.API.csproj +++ b/modules/openiddict/app/OpenIddict.Demo.API/OpenIddict.Demo.API.csproj @@ -8,7 +8,7 @@ - + diff --git a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.Installer/Volo.Abp.BackgroundJobs.Installer.abppkg.json b/modules/openiddict/app/OpenIddict.Demo.Client.BlazorWASM/OpenIddict.Demo.Client.BlazorWASM.abppkg.json similarity index 100% rename from modules/background-jobs/src/Volo.Abp.BackgroundJobs.Installer/Volo.Abp.BackgroundJobs.Installer.abppkg.json rename to modules/openiddict/app/OpenIddict.Demo.Client.BlazorWASM/OpenIddict.Demo.Client.BlazorWASM.abppkg.json diff --git a/modules/openiddict/app/OpenIddict.Demo.Client.BlazorWASM/OpenIddict.Demo.Client.BlazorWASM.csproj b/modules/openiddict/app/OpenIddict.Demo.Client.BlazorWASM/OpenIddict.Demo.Client.BlazorWASM.csproj index b24c51c57a..8291ec7157 100644 --- a/modules/openiddict/app/OpenIddict.Demo.Client.BlazorWASM/OpenIddict.Demo.Client.BlazorWASM.csproj +++ b/modules/openiddict/app/OpenIddict.Demo.Client.BlazorWASM/OpenIddict.Demo.Client.BlazorWASM.csproj @@ -8,9 +8,9 @@ - - - + + + diff --git a/modules/basic-theme/src/Volo.Abp.BasicTheme.Installer/Volo.Abp.BasicTheme.Installer.abppkg.json b/modules/openiddict/app/OpenIddict.Demo.Client.Console/OpenIddict.Demo.Client.Console.abppkg.json similarity index 100% rename from modules/basic-theme/src/Volo.Abp.BasicTheme.Installer/Volo.Abp.BasicTheme.Installer.abppkg.json rename to modules/openiddict/app/OpenIddict.Demo.Client.Console/OpenIddict.Demo.Client.Console.abppkg.json diff --git a/modules/openiddict/app/OpenIddict.Demo.Client.Mvc/OpenIddict.Demo.Client.Mvc.abppkg.analyze.json b/modules/openiddict/app/OpenIddict.Demo.Client.Mvc/OpenIddict.Demo.Client.Mvc.abppkg.analyze.json new file mode 100644 index 0000000000..81b2b19298 --- /dev/null +++ b/modules/openiddict/app/OpenIddict.Demo.Client.Mvc/OpenIddict.Demo.Client.Mvc.abppkg.analyze.json @@ -0,0 +1,5 @@ +{ + "name": "OpenIddict.Demo.Client.Mvc", + "hash": "2132c41341e3f1486a7036fbdd82d4f9", + "contents": [] +} \ No newline at end of file diff --git a/modules/openiddict/app/OpenIddict.Demo.Client.Mvc/OpenIddict.Demo.Client.Mvc.abppkg.json b/modules/openiddict/app/OpenIddict.Demo.Client.Mvc/OpenIddict.Demo.Client.Mvc.abppkg.json new file mode 100644 index 0000000000..48875c29cf --- /dev/null +++ b/modules/openiddict/app/OpenIddict.Demo.Client.Mvc/OpenIddict.Demo.Client.Mvc.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "host.mvc" +} \ No newline at end of file diff --git a/modules/openiddict/app/OpenIddict.Demo.Client.Mvc/OpenIddict.Demo.Client.Mvc.csproj b/modules/openiddict/app/OpenIddict.Demo.Client.Mvc/OpenIddict.Demo.Client.Mvc.csproj index 6cd8c919ff..f1fc938e17 100644 --- a/modules/openiddict/app/OpenIddict.Demo.Client.Mvc/OpenIddict.Demo.Client.Mvc.csproj +++ b/modules/openiddict/app/OpenIddict.Demo.Client.Mvc/OpenIddict.Demo.Client.Mvc.csproj @@ -8,7 +8,7 @@ - + diff --git a/modules/openiddict/app/OpenIddict.Demo.Client.Mvc/Program.cs b/modules/openiddict/app/OpenIddict.Demo.Client.Mvc/Program.cs index 6e18cde936..d08b46893c 100644 --- a/modules/openiddict/app/OpenIddict.Demo.Client.Mvc/Program.cs +++ b/modules/openiddict/app/OpenIddict.Demo.Client.Mvc/Program.cs @@ -19,19 +19,15 @@ builder.Services.AddAuthentication(options => .AddOpenIdConnect("oidc", options => { options.Authority = "https://localhost:44301/"; + options.RequireHttpsMetadata = true; + options.ResponseType = OidcConstants.ResponseTypes.Code; options.ClientId = "AbpApp"; options.ClientSecret = "1q2w3e*"; - options.RequireHttpsMetadata = true; - options.GetClaimsFromUserInfoEndpoint = true; - options.SaveTokens = true; - options.UsePkce = true; - - options.ResponseType = OidcConstants.ResponseTypes.Code; - - options.SignOutScheme = "Cookies"; + options.SaveTokens = true; + options.GetClaimsFromUserInfoEndpoint = true; options.Scope.Add("email"); options.Scope.Add("roles"); diff --git a/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Installer/Volo.Abp.BlobStoring.Database.Installer.abppkg.json b/modules/openiddict/app/OpenIddict.Demo.Server/OpenIddict.Demo.Server.abppkg.json similarity index 100% rename from modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Installer/Volo.Abp.BlobStoring.Database.Installer.abppkg.json rename to modules/openiddict/app/OpenIddict.Demo.Server/OpenIddict.Demo.Server.abppkg.json diff --git a/modules/openiddict/app/OpenIddict.Demo.Server/OpenIddict.Demo.Server.csproj b/modules/openiddict/app/OpenIddict.Demo.Server/OpenIddict.Demo.Server.csproj index 227a4bfd7b..3bf02ee182 100644 --- a/modules/openiddict/app/OpenIddict.Demo.Server/OpenIddict.Demo.Server.csproj +++ b/modules/openiddict/app/OpenIddict.Demo.Server/OpenIddict.Demo.Server.csproj @@ -40,10 +40,10 @@ - - - - + + + + @@ -65,8 +65,8 @@ - - + + runtime; build; native; contentfiles; analyzers compile; contentFiles; build; buildMultitargeting; buildTransitive; analyzers; native diff --git a/modules/openiddict/app/OpenIddict.Demo.Server/package.json b/modules/openiddict/app/OpenIddict.Demo.Server/package.json index 55344897d5..fa1f07511a 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": "~5.2.0-rc.2" + "@abp/aspnetcore.mvc.ui.theme.basic": "~6.0.0-rc.3" } } diff --git a/modules/openiddict/app/angular/package.json b/modules/openiddict/app/angular/package.json index 1fa0dfc73c..85a9a5bd21 100644 --- a/modules/openiddict/app/angular/package.json +++ b/modules/openiddict/app/angular/package.json @@ -12,14 +12,14 @@ }, "private": true, "dependencies": { - "@abp/ng.account": "~5.2.0-rc.2", - "@abp/ng.components": "~5.2.0-rc.2", - "@abp/ng.core": "~5.2.0-rc.2", - "@abp/ng.identity": "~5.2.0-rc.2", - "@abp/ng.setting-management": "~5.2.0-rc.2", - "@abp/ng.tenant-management": "~5.2.0-rc.2", - "@abp/ng.theme.basic": "~5.2.0-rc.2", - "@abp/ng.theme.shared": "~5.2.0-rc.2", + "@abp/ng.account": "~6.0.0-rc.3", + "@abp/ng.components": "~6.0.0-rc.3", + "@abp/ng.core": "~6.0.0-rc.3", + "@abp/ng.identity": "~6.0.0-rc.3", + "@abp/ng.setting-management": "~6.0.0-rc.3", + "@abp/ng.tenant-management": "~6.0.0-rc.3", + "@abp/ng.theme.basic": "~6.0.0-rc.3", + "@abp/ng.theme.shared": "~6.0.0-rc.3", "@angular/animations": "~13.1.1", "@angular/common": "~13.1.1", "@angular/compiler": "~13.1.1", @@ -34,7 +34,7 @@ "zone.js": "~0.11.4" }, "devDependencies": { - "@abp/ng.schematics": "~5.2.0-rc.2", + "@abp/ng.schematics": "~6.0.0-rc.3", "@angular-devkit/build-angular": "~13.1.2", "@angular-eslint/builder": "~13.0.1", "@angular-eslint/eslint-plugin": "~13.0.1", diff --git a/modules/openiddict/app/angular/src/environments/environment.prod.ts b/modules/openiddict/app/angular/src/environments/environment.prod.ts index ae8f02f96b..c0fcaf39a2 100644 --- a/modules/openiddict/app/angular/src/environments/environment.prod.ts +++ b/modules/openiddict/app/angular/src/environments/environment.prod.ts @@ -10,16 +10,17 @@ export const environment = { logoUrl: '', }, oAuthConfig: { - issuer: 'https://localhost:44333', + issuer: 'https://localhost:44301/', redirectUri: baseUrl, - clientId: 'Angular_App', + clientId: 'AbpApp', + dummyClientSecret: '1q2w3e*', responseType: 'code', - scope: 'offline_access Angular', + scope: 'offline_access AbpAPI', requireHttps: true }, apis: { default: { - url: 'https://localhost:44333', + url: 'https://localhost:44301', rootNamespace: 'OpenIddict.Demo.Client.Angular', }, }, diff --git a/modules/cms-kit/src/Volo.CmsKit.Installer/Volo.CmsKit.Installer.abppkg.json b/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo.Abp.OpenIddict.AspNetCore.abppkg.json similarity index 100% rename from modules/cms-kit/src/Volo.CmsKit.Installer/Volo.CmsKit.Installer.abppkg.json rename to modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo.Abp.OpenIddict.AspNetCore.abppkg.json diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo.Abp.OpenIddict.AspNetCore.csproj b/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo.Abp.OpenIddict.AspNetCore.csproj index b704e64cf7..fabcb8116b 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo.Abp.OpenIddict.AspNetCore.csproj +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo.Abp.OpenIddict.AspNetCore.csproj @@ -6,6 +6,7 @@ net6.0 Library + true diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/Controllers/AbpOpenIdDictControllerBase.cs b/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/Controllers/AbpOpenIdDictControllerBase.cs index ff7edb3e52..d1321ad9e1 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/Controllers/AbpOpenIdDictControllerBase.cs +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/Controllers/AbpOpenIdDictControllerBase.cs @@ -73,4 +73,24 @@ public abstract class AbpOpenIdDictControllerBase : AbpController return false; } + + protected virtual async Task PreSignInCheckAsync(IdentityUser user) + { + if (!user.IsActive) + { + return false; + } + + if (!await SignInManager.CanSignInAsync(user)) + { + return false; + } + + if (await UserManager.IsLockedOutAsync(user)) + { + return false; + } + + return true; + } } diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/Controllers/TokenController.AuthorizationCode.cs b/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/Controllers/TokenController.AuthorizationCode.cs index 26018f5423..89a00f1a8a 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/Controllers/TokenController.AuthorizationCode.cs +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/Controllers/TokenController.AuthorizationCode.cs @@ -33,7 +33,7 @@ public partial class TokenController } // Ensure the user is still allowed to sign in. - if (!await SignInManager.CanSignInAsync(user)) + if (!await PreSignInCheckAsync(user)) { return Forbid( authenticationSchemes: OpenIddictServerAspNetCoreDefaults.AuthenticationScheme, diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/Controllers/TokenController.DeviceCode.cs b/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/Controllers/TokenController.DeviceCode.cs index c46ee5eef0..cbe021854c 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/Controllers/TokenController.DeviceCode.cs +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/Controllers/TokenController.DeviceCode.cs @@ -33,7 +33,7 @@ public partial class TokenController } // Ensure the user is still allowed to sign in. - if (!await SignInManager.CanSignInAsync(user)) + if (!await PreSignInCheckAsync(user)) { return Forbid( authenticationSchemes: OpenIddictServerAspNetCoreDefaults.AuthenticationScheme, diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/Controllers/TokenController.Password.cs b/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/Controllers/TokenController.Password.cs index 49d415c927..1484ea4b52 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/Controllers/TokenController.Password.cs +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/Controllers/TokenController.Password.cs @@ -22,7 +22,7 @@ namespace Volo.Abp.OpenIddict.Controllers; public partial class TokenController { - protected IHybridServiceScopeFactory ServiceScopeFactory => LazyServiceProvider.LazyGetRequiredService(); + protected IServiceScopeFactory ServiceScopeFactory => LazyServiceProvider.LazyGetRequiredService(); protected ITenantConfigurationProvider TenantConfigurationProvider=> LazyServiceProvider.LazyGetRequiredService(); protected IOptions AbpIdentityOptions => LazyServiceProvider.LazyGetRequiredService>(); protected IOptions IdentityOptions => LazyServiceProvider.LazyGetRequiredService>(); diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/Controllers/TokenController.RefreshToken.cs b/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/Controllers/TokenController.RefreshToken.cs index 05bf247ca5..c234ddd62e 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/Controllers/TokenController.RefreshToken.cs +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/Controllers/TokenController.RefreshToken.cs @@ -33,7 +33,7 @@ public partial class TokenController } // Ensure the user is still allowed to sign in. - if (!await SignInManager.CanSignInAsync(user)) + if (!await PreSignInCheckAsync(user)) { return Forbid( authenticationSchemes: OpenIddictServerAspNetCoreDefaults.AuthenticationScheme, diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/Controllers/TokenController.cs b/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/Controllers/TokenController.cs index 8c5ab98872..e3b3d10c39 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/Controllers/TokenController.cs +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/Controllers/TokenController.cs @@ -1,5 +1,4 @@ -using System.Linq; -using System.Threading.Tasks; +using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; @@ -9,6 +8,7 @@ using Volo.Abp.OpenIddict.ExtensionGrantTypes; namespace Volo.Abp.OpenIddict.Controllers; [Route("connect/token")] +[IgnoreAntiforgeryToken] [ApiExplorerSettings(IgnoreApi = true)] public partial class TokenController : AbpOpenIdDictControllerBase { diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/Controllers/UserInfoController.cs b/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/Controllers/UserInfoController.cs index 62103c1b2b..74fc01c89f 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/Controllers/UserInfoController.cs +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/Controllers/UserInfoController.cs @@ -11,6 +11,7 @@ using Volo.Abp.Security.Claims; namespace Volo.Abp.OpenIddict.Controllers; [Route("connect/userinfo")] +[IgnoreAntiforgeryToken] [Authorize(AuthenticationSchemes = OpenIddictServerAspNetCoreDefaults.AuthenticationScheme)] [ApiExplorerSettings(IgnoreApi = true)] public class UserInfoController : AbpOpenIdDictControllerBase @@ -18,7 +19,7 @@ public class UserInfoController : AbpOpenIdDictControllerBase [HttpGet] [HttpPost] [Produces("application/json")] - public async Task Userinfo() + public virtual async Task Userinfo() { var user = await UserManager.GetUserAsync(User); if (user == null) diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo.Abp.OpenIddict.Domain.Shared.abppkg.analyze.json b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo.Abp.OpenIddict.Domain.Shared.abppkg.analyze.json new file mode 100644 index 0000000000..deea8cbf36 --- /dev/null +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo.Abp.OpenIddict.Domain.Shared.abppkg.analyze.json @@ -0,0 +1,11 @@ +{ + "name": "Volo.Abp.OpenIddict.Domain.Shared", + "hash": "bc60e65998f3b40d6651cf0a0a08a84c", + "contents": [ + { + "namespace": "Volo.Abp.OpenIddict", + "contentType": "abpModule", + "name": "AbpOpenIddictDomainSharedModule" + } + ] +} \ No newline at end of file diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo.Abp.OpenIddict.Domain.Shared.abppkg.json b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo.Abp.OpenIddict.Domain.Shared.abppkg.json new file mode 100644 index 0000000000..8b3de05f76 --- /dev/null +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo.Abp.OpenIddict.Domain.Shared.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.domain-shared" +} \ No newline at end of file diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/pt-BR.json b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/pt-BR.json index 2952a0352c..6962ebcc4c 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/pt-BR.json +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/pt-BR.json @@ -4,10 +4,10 @@ "TheOpenIDConnectRequestCannotBeRetrieved": "Não foi possivel recuperar a requisição do OpenID Connect.", "TheUserDetailsCannotBbeRetrieved": "Não foi possivel recuperar os detalhes do usuário.", "TheApplicationDetailsCannotBeFound": "Os detalhes da aplicação não foram encontrados.", - "DetailsConcerningTheCallingClientApplicationCannotBeFound": "Os detalhes relativos ao aplicativo cliente requisitante não firam encontrados.", + "DetailsConcerningTheCallingClientApplicationCannotBeFound": "Os detalhes relativos ao aplicativo cliente requisitante não foram encontrados.", "TheSpecifiedGrantTypeIsNotImplemented.": "O tipo de permissão {0} não está implementando.", "Authorization": "Autorização", - "DoYouWantToGrantAccessToYourData": "Deseja permitir {0} acesse seus dados?", + "DoYouWantToGrantAccessToYourData": "Deseja permitir {0} acessar seus dados?", "ScopesRequested": "Escopo solicitado", "Accept": "Aceitar", "Deny": "Negar" diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo.Abp.OpenIddict.Domain.abppkg.analyze.json b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo.Abp.OpenIddict.Domain.abppkg.analyze.json new file mode 100644 index 0000000000..7b671211bd --- /dev/null +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo.Abp.OpenIddict.Domain.abppkg.analyze.json @@ -0,0 +1,107 @@ +{ + "name": "Volo.Abp.OpenIddict.Domain", + "hash": "8822f98b8a1deca68b33f69126bbc669", + "contents": [ + { + "namespace": "Volo.Abp.OpenIddict", + "contentType": "abpModule", + "name": "AbpOpenIddictDomainModule" + }, + { + "namespace": "Volo.Abp.OpenIddict.Tokens", + "primaryKeyType": "Guid", + "summary": null, + "collectionProperties": [], + "navigationProperties": [], + "contentType": "aggregateRoot", + "name": "OpenIddictToken" + }, + { + "namespace": "Volo.Abp.OpenIddict.Scopes", + "primaryKeyType": "Guid", + "summary": null, + "collectionProperties": [], + "navigationProperties": [], + "contentType": "aggregateRoot", + "name": "OpenIddictScope" + }, + { + "namespace": "Volo.Abp.OpenIddict.Authorizations", + "primaryKeyType": "Guid", + "summary": null, + "collectionProperties": [], + "navigationProperties": [], + "contentType": "aggregateRoot", + "name": "OpenIddictAuthorization" + }, + { + "namespace": "Volo.Abp.OpenIddict.Applications", + "primaryKeyType": "Guid", + "summary": null, + "collectionProperties": [], + "navigationProperties": [], + "contentType": "aggregateRoot", + "name": "OpenIddictApplication" + }, + { + "namespace": "Volo.Abp.OpenIddict.Tokens", + "summary": null, + "entityAnalyzeModel": { + "namespace": "Volo.Abp.OpenIddict.Tokens", + "primaryKeyType": "Guid", + "summary": null, + "collectionProperties": [], + "navigationProperties": [], + "contentType": "entity", + "name": "OpenIddictToken" + }, + "contentType": "repositoryInterface", + "name": "IOpenIddictTokenRepository" + }, + { + "namespace": "Volo.Abp.OpenIddict.Scopes", + "summary": null, + "entityAnalyzeModel": { + "namespace": "Volo.Abp.OpenIddict.Scopes", + "primaryKeyType": "Guid", + "summary": null, + "collectionProperties": [], + "navigationProperties": [], + "contentType": "entity", + "name": "OpenIddictScope" + }, + "contentType": "repositoryInterface", + "name": "IOpenIddictScopeRepository" + }, + { + "namespace": "Volo.Abp.OpenIddict.Authorizations", + "summary": null, + "entityAnalyzeModel": { + "namespace": "Volo.Abp.OpenIddict.Authorizations", + "primaryKeyType": "Guid", + "summary": null, + "collectionProperties": [], + "navigationProperties": [], + "contentType": "entity", + "name": "OpenIddictAuthorization" + }, + "contentType": "repositoryInterface", + "name": "IOpenIddictAuthorizationRepository" + }, + { + "namespace": "Volo.Abp.OpenIddict.Applications", + "summary": null, + "entityAnalyzeModel": { + "namespace": "Volo.Abp.OpenIddict.Applications", + "primaryKeyType": "Guid", + "summary": null, + "collectionProperties": [], + "navigationProperties": [], + "contentType": "entity", + "name": "OpenIddictApplication" + }, + "contentType": "repositoryInterface", + "name": "IOpenIddictApplicationRepository" + } + ] +} \ No newline at end of file diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo.Abp.OpenIddict.Domain.abppkg.json b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo.Abp.OpenIddict.Domain.abppkg.json new file mode 100644 index 0000000000..1d574efe45 --- /dev/null +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo.Abp.OpenIddict.Domain.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.domain" +} \ No newline at end of file diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/AbpOpenIddictDbProperties.cs b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/AbpOpenIddictDbProperties.cs index 935fba20a5..795391630a 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/AbpOpenIddictDbProperties.cs +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/AbpOpenIddictDbProperties.cs @@ -6,5 +6,5 @@ public static class AbpOpenIddictDbProperties public static string DbSchema { get; set; } = null; - public const string ConnectionStringName = "OpenIddict"; + public const string ConnectionStringName = "AbpOpenIddict"; } diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/Scopes/AbpOpenIddictScopeCache.cs b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/Scopes/AbpOpenIddictScopeCache.cs index af5999fcc5..267fb175e2 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/Scopes/AbpOpenIddictScopeCache.cs +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/Scopes/AbpOpenIddictScopeCache.cs @@ -9,11 +9,11 @@ using Volo.Abp.DependencyInjection; namespace Volo.Abp.OpenIddict.Scopes; -public class AbpOpenIddictScopeCacheAbpOpenIddictAuthorizationCache : AbpOpenIddictCacheBase>, +public class AbpOpenIddictScopeCache : AbpOpenIddictCacheBase>, IOpenIddictScopeCache, ITransientDependency { - public AbpOpenIddictScopeCacheAbpOpenIddictAuthorizationCache( + public AbpOpenIddictScopeCache( IDistributedCache cache, IDistributedCache arrayCache, IOpenIddictScopeStore store) diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.EntityFrameworkCore/Volo.Abp.OpenIddict.EntityFrameworkCore.abppkg.analyze.json b/modules/openiddict/src/Volo.Abp.OpenIddict.EntityFrameworkCore/Volo.Abp.OpenIddict.EntityFrameworkCore.abppkg.analyze.json new file mode 100644 index 0000000000..a769a2edd2 --- /dev/null +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.EntityFrameworkCore/Volo.Abp.OpenIddict.EntityFrameworkCore.abppkg.analyze.json @@ -0,0 +1,39 @@ +{ + "name": "Volo.Abp.OpenIddict.EntityFrameworkCore", + "hash": "437e716bcba4d2364e711dac86cda9f6", + "contents": [ + { + "namespace": "Volo.Abp.OpenIddict.EntityFrameworkCore", + "contentType": "abpModule", + "name": "AbpOpenIddictEntityFrameworkCoreModule" + }, + { + "namespace": "Volo.Abp.OpenIddict.EntityFrameworkCore", + "connectionStringName": "AbpOpenIddict", + "databaseTables": [ + { + "entityFullName": "Volo.Abp.OpenIddict.Applications.OpenIddictApplication", + "contentType": "databaseTable", + "name": "OpenIddictApplications" + }, + { + "entityFullName": "Volo.Abp.OpenIddict.Authorizations.OpenIddictAuthorization", + "contentType": "databaseTable", + "name": "OpenIddictAuthorizations" + }, + { + "entityFullName": "Volo.Abp.OpenIddict.Scopes.OpenIddictScope", + "contentType": "databaseTable", + "name": "OpenIddictScopes" + }, + { + "entityFullName": "Volo.Abp.OpenIddict.Tokens.OpenIddictToken", + "contentType": "databaseTable", + "name": "OpenIddictTokens" + } + ], + "contentType": "efCoreDbContext", + "name": "OpenIddictDbContext" + } + ] +} \ No newline at end of file diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.EntityFrameworkCore/Volo.Abp.OpenIddict.EntityFrameworkCore.abppkg.json b/modules/openiddict/src/Volo.Abp.OpenIddict.EntityFrameworkCore/Volo.Abp.OpenIddict.EntityFrameworkCore.abppkg.json new file mode 100644 index 0000000000..e1c64f0175 --- /dev/null +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.EntityFrameworkCore/Volo.Abp.OpenIddict.EntityFrameworkCore.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.ef" +} \ No newline at end of file diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.EntityFrameworkCore/Volo/Abp/OpenIddict/Scopes/EfCoreOpenIddictScopeRepository.cs b/modules/openiddict/src/Volo.Abp.OpenIddict.EntityFrameworkCore/Volo/Abp/OpenIddict/Scopes/EfCoreOpenIddictScopeRepository.cs index bad2b0f595..7f5481decb 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.EntityFrameworkCore/Volo/Abp/OpenIddict/Scopes/EfCoreOpenIddictScopeRepository.cs +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.EntityFrameworkCore/Volo/Abp/OpenIddict/Scopes/EfCoreOpenIddictScopeRepository.cs @@ -23,9 +23,10 @@ public class EfCoreOpenIddictScopeRepository : EfCoreRepository x.Name.Contains(filter)) - .WhereIf(!filter.IsNullOrWhiteSpace(), x => x.DisplayName.Contains(filter)) - .WhereIf(!filter.IsNullOrWhiteSpace(), x => x.Description.Contains(filter)) + .WhereIf(!filter.IsNullOrWhiteSpace(), x => + x.Name.Contains(filter) || + x.DisplayName.Contains(filter) || + x.Description.Contains(filter)) .OrderBy(sorting.IsNullOrWhiteSpace() ? nameof(OpenIddictScope.Name) : sorting) .PageBy(skipCount, maxResultCount) .ToListAsync(GetCancellationToken(cancellationToken)); @@ -34,9 +35,10 @@ public class EfCoreOpenIddictScopeRepository : EfCoreRepository GetCountAsync(string filter = null, CancellationToken cancellationToken = default) { return await (await GetDbSetAsync()) - .WhereIf(!filter.IsNullOrWhiteSpace(), x => x.Name.Contains(filter)) - .WhereIf(!filter.IsNullOrWhiteSpace(), x => x.DisplayName.Contains(filter)) - .WhereIf(!filter.IsNullOrWhiteSpace(), x => x.Description.Contains(filter)) + .WhereIf(!filter.IsNullOrWhiteSpace(), x => + x.Name.Contains(filter) || + x.DisplayName.Contains(filter) || + x.Description.Contains(filter)) .LongCountAsync(GetCancellationToken(cancellationToken)); } diff --git a/studio/source-codes/Volo.Abp.BackgroundJobs.SourceCode/FodyWeavers.xml b/modules/openiddict/src/Volo.Abp.OpenIddict.Installer/FodyWeavers.xml similarity index 100% rename from studio/source-codes/Volo.Abp.BackgroundJobs.SourceCode/FodyWeavers.xml rename to modules/openiddict/src/Volo.Abp.OpenIddict.Installer/FodyWeavers.xml diff --git a/studio/source-codes/Volo.Abp.PermissionManagement.SourceCode/FodyWeavers.xsd b/modules/openiddict/src/Volo.Abp.OpenIddict.Installer/FodyWeavers.xsd similarity index 100% rename from studio/source-codes/Volo.Abp.PermissionManagement.SourceCode/FodyWeavers.xsd rename to modules/openiddict/src/Volo.Abp.OpenIddict.Installer/FodyWeavers.xsd diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.Installer/Volo.Abp.OpenIddict.Installer.csproj b/modules/openiddict/src/Volo.Abp.OpenIddict.Installer/Volo.Abp.OpenIddict.Installer.csproj new file mode 100644 index 0000000000..07c8c2ed10 --- /dev/null +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.Installer/Volo.Abp.OpenIddict.Installer.csproj @@ -0,0 +1,24 @@ + + + + + + + net6.0 + true + + + + + + + + + + + + + + + + diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.Installer/Volo/Abp/OpenIddict/AbpOpenIddictInstallerModule.cs b/modules/openiddict/src/Volo.Abp.OpenIddict.Installer/Volo/Abp/OpenIddict/AbpOpenIddictInstallerModule.cs new file mode 100644 index 0000000000..fd24b25610 --- /dev/null +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.Installer/Volo/Abp/OpenIddict/AbpOpenIddictInstallerModule.cs @@ -0,0 +1,20 @@ +using Volo.Abp.Modularity; +using Volo.Abp.Studio; +using Volo.Abp.VirtualFileSystem; + +namespace Volo.Abp.OpenIddict; + +[DependsOn( + typeof(AbpStudioModuleInstallerModule), + typeof(AbpVirtualFileSystemModule) +)] +public class AbpOpenIddictInstallerModule : AbpModule +{ + public override void ConfigureServices(ServiceConfigurationContext context) + { + Configure(options => + { + options.FileSets.AddEmbedded(); + }); + } +} diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.Installer/Volo/Abp/OpenIddict/OpenIddictInstallerPipelineBuilder.cs b/modules/openiddict/src/Volo.Abp.OpenIddict.Installer/Volo/Abp/OpenIddict/OpenIddictInstallerPipelineBuilder.cs new file mode 100644 index 0000000000..67668bbae1 --- /dev/null +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.Installer/Volo/Abp/OpenIddict/OpenIddictInstallerPipelineBuilder.cs @@ -0,0 +1,16 @@ +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Studio.ModuleInstalling; + +namespace Volo.Abp.OpenIddict; + +[Dependency(ServiceLifetime.Transient, ReplaceServices = true)] +[ExposeServices(typeof(IModuleInstallingPipelineBuilder))] +public class OpenIddictInstallerPipelineBuilder : ModuleInstallingPipelineBuilderBase, IModuleInstallingPipelineBuilder, ITransientDependency +{ + public async Task BuildAsync(ModuleInstallingContext context) + { + return GetBasePipeline(context); + } +} diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.MongoDB/Volo.Abp.OpenIddict.MongoDB.abppkg.analyze.json b/modules/openiddict/src/Volo.Abp.OpenIddict.MongoDB/Volo.Abp.OpenIddict.MongoDB.abppkg.analyze.json new file mode 100644 index 0000000000..f88d27215e --- /dev/null +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.MongoDB/Volo.Abp.OpenIddict.MongoDB.abppkg.analyze.json @@ -0,0 +1,39 @@ +{ + "name": "Volo.Abp.OpenIddict.MongoDB", + "hash": "9306b0570c535c0a4124afc3181e8313", + "contents": [ + { + "namespace": "Volo.Abp.OpenIddict.MongoDB", + "contentType": "abpModule", + "name": "AbpOpenIddictMongoDbModule" + }, + { + "namespace": "Volo.Abp.OpenIddict.MongoDB", + "connectionStringName": "AbpOpenIddict", + "databaseCollections": [ + { + "entityFullName": "Volo.Abp.OpenIddict.Authorizations.OpenIddictAuthorization", + "contentType": "databaseCollection", + "name": "OpenIddictAuthorizations" + }, + { + "entityFullName": "Volo.Abp.OpenIddict.Applications.OpenIddictApplication", + "contentType": "databaseCollection", + "name": "OpenIddictApplications" + }, + { + "entityFullName": "Volo.Abp.OpenIddict.Tokens.OpenIddictToken", + "contentType": "databaseCollection", + "name": "OpenIddictTokens" + }, + { + "entityFullName": "Volo.Abp.OpenIddict.Scopes.OpenIddictScope", + "contentType": "databaseCollection", + "name": "OpenIddictScopes" + } + ], + "contentType": "mongoDbContext", + "name": "OpenIddictMongoDbContext" + } + ] +} \ No newline at end of file diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.MongoDB/Volo.Abp.OpenIddict.MongoDB.abppkg.json b/modules/openiddict/src/Volo.Abp.OpenIddict.MongoDB/Volo.Abp.OpenIddict.MongoDB.abppkg.json new file mode 100644 index 0000000000..8b23fd1e69 --- /dev/null +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.MongoDB/Volo.Abp.OpenIddict.MongoDB.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.mongodb" +} \ No newline at end of file diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.MongoDB/Volo/Abp/OpenIddict/Authorizations/MongoOpenIddictAuthorizationRepository.cs b/modules/openiddict/src/Volo.Abp.OpenIddict.MongoDB/Volo/Abp/OpenIddict/Authorizations/MongoOpenIddictAuthorizationRepository.cs index 21317b3683..fe0042e54c 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.MongoDB/Volo/Abp/OpenIddict/Authorizations/MongoOpenIddictAuthorizationRepository.cs +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.MongoDB/Volo/Abp/OpenIddict/Authorizations/MongoOpenIddictAuthorizationRepository.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Linq.Dynamic.Core; using System.Threading; using System.Threading.Tasks; using MongoDB.Driver; @@ -67,12 +68,15 @@ public class MongoOpenIddictAuthorizationRepository : MongoDbRepository> GetPruneListAsync(DateTime date, int count, CancellationToken cancellationToken = default) { var tokenQueryable = await GetMongoQueryableAsync(GetCancellationToken(cancellationToken)); - return await (await GetMongoQueryableAsync(GetCancellationToken(cancellationToken))) + + var authorizations = await (await GetMongoQueryableAsync(GetCancellationToken(cancellationToken))) .Where(x => x.CreationDate < date) .Where(x => x.Status != OpenIddictConstants.Statuses.Valid || - (x.Type == OpenIddictConstants.AuthorizationTypes.AdHoc && tokenQueryable.Any(t => t.AuthorizationId == x.Id))) + (x.Type == OpenIddictConstants.AuthorizationTypes.AdHoc)) .OrderBy(x => x.Id) .Take(count) .ToListAsync(GetCancellationToken(cancellationToken)); + + return authorizations.Where(x => tokenQueryable.Any(t => t.AuthorizationId == x.Id)).ToList(); } } diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.MongoDB/Volo/Abp/OpenIddict/Scopes/MongoOpenIddictScopeRepository.cs b/modules/openiddict/src/Volo.Abp.OpenIddict.MongoDB/Volo/Abp/OpenIddict/Scopes/MongoOpenIddictScopeRepository.cs index 2d35445abc..3411f520e9 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.MongoDB/Volo/Abp/OpenIddict/Scopes/MongoOpenIddictScopeRepository.cs +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.MongoDB/Volo/Abp/OpenIddict/Scopes/MongoOpenIddictScopeRepository.cs @@ -22,9 +22,10 @@ public class MongoOpenIddictScopeRepository : MongoDbRepository x.Name.Contains(filter)) - .WhereIf(!filter.IsNullOrWhiteSpace(), x => x.DisplayName.Contains(filter)) - .WhereIf(!filter.IsNullOrWhiteSpace(), x => x.Description.Contains(filter)) + .WhereIf(!filter.IsNullOrWhiteSpace(), x => + x.Name.Contains(filter) || + x.DisplayName.Contains(filter) || + x.Description.Contains(filter)) .OrderBy(sorting.IsNullOrWhiteSpace() ? nameof(OpenIddictScope.Name) : sorting) .PageBy(skipCount, maxResultCount) .As>() @@ -34,9 +35,10 @@ public class MongoOpenIddictScopeRepository : MongoDbRepository GetCountAsync(string filter = null, CancellationToken cancellationToken = default) { return await (await GetMongoQueryableAsync(cancellationToken)) - .WhereIf(!filter.IsNullOrWhiteSpace(), x => x.Name.Contains(filter)) - .WhereIf(!filter.IsNullOrWhiteSpace(), x => x.DisplayName.Contains(filter)) - .WhereIf(!filter.IsNullOrWhiteSpace(), x => x.Description.Contains(filter)) + .WhereIf(!filter.IsNullOrWhiteSpace(), x => + x.Name.Contains(filter) || + x.DisplayName.Contains(filter) || + x.Description.Contains(filter)) .As>() .LongCountAsync(GetCancellationToken(cancellationToken)); } diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.MongoDB/Volo/Abp/OpenIddict/Tokens/MongoOpenIddictTokenRepository.cs b/modules/openiddict/src/Volo.Abp.OpenIddict.MongoDB/Volo/Abp/OpenIddict/Tokens/MongoOpenIddictTokenRepository.cs index b58b11e75a..18d43a155e 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.MongoDB/Volo/Abp/OpenIddict/Tokens/MongoOpenIddictTokenRepository.cs +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.MongoDB/Volo/Abp/OpenIddict/Tokens/MongoOpenIddictTokenRepository.cs @@ -33,7 +33,7 @@ public class MongoOpenIddictTokenRepository : MongoDbRepository x.ApplicationId == authorizationId) + .Where(x => x.AuthorizationId == authorizationId) .ToListAsync(GetCancellationToken(cancellationToken)); await DeleteManyAsync(tokens, autoSave, GetCancellationToken(cancellationToken)); @@ -102,16 +102,18 @@ public class MongoOpenIddictTokenRepository : MongoDbRepository> GetPruneListAsync(DateTime date, int count, CancellationToken cancellationToken = default) { - return await (from token in await GetMongoQueryableAsync(GetCancellationToken(cancellationToken)) - join authorization in (await GetMongoQueryableAsync(cancellationToken)) - on token.AuthorizationId equals authorization.Id into ta - from a in ta - where token.CreationDate < date - where (token.Status != OpenIddictConstants.Statuses.Inactive && - token.Status != OpenIddictConstants.Statuses.Valid) || - (a != null && a.Status != OpenIddictConstants.Statuses.Valid) || - token.ExpirationDate < DateTime.UtcNow - orderby token.Id - select token).Take(count).ToListAsync(GetCancellationToken(cancellationToken)); + var authorizationIds = await (await GetMongoQueryableAsync(cancellationToken)) + .Where(x => x.Status != OpenIddictConstants.Statuses.Valid) + .Select(x => x.Id) + .ToListAsync(GetCancellationToken(cancellationToken)); + + return await (await GetMongoQueryableAsync(GetCancellationToken(cancellationToken))) + .Where(x => x.CreationDate < date) + .Where(x => (x.Status != OpenIddictConstants.Statuses.Inactive && + x.Status != OpenIddictConstants.Statuses.Valid) || + authorizationIds.Contains(x.Id) || + x.ExpirationDate < DateTime.UtcNow) + .OrderBy(x => x.Id) + .Take(count).ToListAsync(GetCancellationToken(cancellationToken)); } } diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Installer/Volo.Abp.FeatureManagement.Installer.abppkg.json b/modules/openiddict/src/Volo.Abp.PermissionManagement.Domain.OpenIddict/Volo.Abp.PermissionManagement.Domain.OpenIddict.abppkg.json similarity index 100% rename from modules/feature-management/src/Volo.Abp.FeatureManagement.Installer/Volo.Abp.FeatureManagement.Installer.abppkg.json rename to modules/openiddict/src/Volo.Abp.PermissionManagement.Domain.OpenIddict/Volo.Abp.PermissionManagement.Domain.OpenIddict.abppkg.json diff --git a/modules/openiddict/test/Volo.Abp.OpenIddict.Domain.Tests/Volo.Abp.OpenIddict.Domain.Tests.abppkg.json b/modules/openiddict/test/Volo.Abp.OpenIddict.Domain.Tests/Volo.Abp.OpenIddict.Domain.Tests.abppkg.json new file mode 100644 index 0000000000..a686451fbc --- /dev/null +++ b/modules/openiddict/test/Volo.Abp.OpenIddict.Domain.Tests/Volo.Abp.OpenIddict.Domain.Tests.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.test" +} \ No newline at end of file diff --git a/modules/openiddict/test/Volo.Abp.OpenIddict.Domain.Tests/Volo.Abp.OpenIddict.Domain.Tests.csproj b/modules/openiddict/test/Volo.Abp.OpenIddict.Domain.Tests/Volo.Abp.OpenIddict.Domain.Tests.csproj index ba5c9024bf..bc0107236b 100644 --- a/modules/openiddict/test/Volo.Abp.OpenIddict.Domain.Tests/Volo.Abp.OpenIddict.Domain.Tests.csproj +++ b/modules/openiddict/test/Volo.Abp.OpenIddict.Domain.Tests/Volo.Abp.OpenIddict.Domain.Tests.csproj @@ -8,7 +8,10 @@ - + + + + diff --git a/modules/openiddict/test/Volo.Abp.OpenIddict.Domain.Tests/Volo/Abp/OpenIddict/Applications/AbpOpenIddictApplicationStore_Tests.cs b/modules/openiddict/test/Volo.Abp.OpenIddict.Domain.Tests/Volo/Abp/OpenIddict/Applications/AbpOpenIddictApplicationStore_Tests.cs index 9cd7361efb..81dafe33c3 100644 --- a/modules/openiddict/test/Volo.Abp.OpenIddict.Domain.Tests/Volo/Abp/OpenIddict/Applications/AbpOpenIddictApplicationStore_Tests.cs +++ b/modules/openiddict/test/Volo.Abp.OpenIddict.Domain.Tests/Volo/Abp/OpenIddict/Applications/AbpOpenIddictApplicationStore_Tests.cs @@ -15,10 +15,12 @@ namespace Volo.Abp.OpenIddict.Applications; public class AbpOpenIddictApplicationStore_Tests : OpenIddictDomainTestBase { private readonly IOpenIddictApplicationStore _applicationStore; + private readonly AbpOpenIddictTestData _testData; public AbpOpenIddictApplicationStore_Tests() { _applicationStore = ServiceProvider.GetRequiredService>(); + _testData = ServiceProvider.GetRequiredService(); } [Fact] @@ -32,10 +34,10 @@ public class AbpOpenIddictApplicationStore_Tests : OpenIddictDomainTestBase [Fact] public async Task FindByIdAsync_Should_Return_Application_If_Found() { - var application = await _applicationStore.FindByIdAsync(AbpOpenIddictTestData.App1Id.ToString(), CancellationToken.None); + var application = await _applicationStore.FindByIdAsync(_testData.App1Id.ToString(), CancellationToken.None); application.ShouldNotBeNull(); - application.ClientId.ShouldBe(AbpOpenIddictTestData.App1ClientId); + application.ClientId.ShouldBe(_testData.App1ClientId); application.ConsentType.ShouldBe(OpenIddictConstants.ConsentTypes.Explicit); application.DisplayName.ShouldBe("Test Application"); } @@ -51,10 +53,10 @@ public class AbpOpenIddictApplicationStore_Tests : OpenIddictDomainTestBase [Fact] public async Task FindByClientIdAsync_Should_Return_Application_If_Found() { - var application = await _applicationStore.FindByClientIdAsync(AbpOpenIddictTestData.App1ClientId, CancellationToken.None); + var application = await _applicationStore.FindByClientIdAsync(_testData.App1ClientId, CancellationToken.None); application.ShouldNotBeNull(); - application.ClientId.ShouldBe(AbpOpenIddictTestData.App1ClientId); + application.ClientId.ShouldBe(_testData.App1ClientId); application.ConsentType.ShouldBe(OpenIddictConstants.ConsentTypes.Explicit); application.DisplayName.ShouldBe("Test Application"); } @@ -91,12 +93,12 @@ public class AbpOpenIddictApplicationStore_Tests : OpenIddictDomainTestBase [Fact] public async Task DeleteAsync() { - var application = await _applicationStore.FindByIdAsync(AbpOpenIddictTestData.App1Id.ToString(), CancellationToken.None); + var application = await _applicationStore.FindByIdAsync(_testData.App1Id.ToString(), CancellationToken.None); application.ShouldNotBeNull(); await _applicationStore.DeleteAsync(application, CancellationToken.None); - application = await _applicationStore.FindByIdAsync(AbpOpenIddictTestData.App1Id.ToString(), CancellationToken.None); + application = await _applicationStore.FindByIdAsync(_testData.App1Id.ToString(), CancellationToken.None); application.ShouldBeNull(); } @@ -131,16 +133,16 @@ public class AbpOpenIddictApplicationStore_Tests : OpenIddictDomainTestBase [Fact] public async Task GetClientIdAsync() { - var application = await _applicationStore.FindByIdAsync(AbpOpenIddictTestData.App1Id.ToString(), CancellationToken.None); + var application = await _applicationStore.FindByIdAsync(_testData.App1Id.ToString(), CancellationToken.None); var clientId = await _applicationStore.GetClientIdAsync(application, CancellationToken.None); - clientId.ShouldBe(AbpOpenIddictTestData.App1ClientId); + clientId.ShouldBe(_testData.App1ClientId); } [Fact] public async Task GetClientSecretAsync() { - var application = await _applicationStore.FindByIdAsync(AbpOpenIddictTestData.App1Id.ToString(), CancellationToken.None); + var application = await _applicationStore.FindByIdAsync(_testData.App1Id.ToString(), CancellationToken.None); var secret = await _applicationStore.GetClientIdAsync(application, CancellationToken.None); secret.ShouldBe("Client1"); @@ -149,7 +151,7 @@ public class AbpOpenIddictApplicationStore_Tests : OpenIddictDomainTestBase [Fact] public async Task GetClientTypeAsync() { - var application = await _applicationStore.FindByIdAsync(AbpOpenIddictTestData.App1Id.ToString(), CancellationToken.None); + var application = await _applicationStore.FindByIdAsync(_testData.App1Id.ToString(), CancellationToken.None); var clientType = await _applicationStore.GetClientTypeAsync(application, CancellationToken.None); clientType.ShouldBe(OpenIddictConstants.ClientTypes.Public); @@ -158,7 +160,7 @@ public class AbpOpenIddictApplicationStore_Tests : OpenIddictDomainTestBase [Fact] public async Task GetConsentTypeAsync() { - var application = await _applicationStore.FindByIdAsync(AbpOpenIddictTestData.App1Id.ToString(), CancellationToken.None); + var application = await _applicationStore.FindByIdAsync(_testData.App1Id.ToString(), CancellationToken.None); var consentType = await _applicationStore.GetConsentTypeAsync(application, CancellationToken.None); consentType.ShouldBe(OpenIddictConstants.ConsentTypes.Explicit); @@ -167,7 +169,7 @@ public class AbpOpenIddictApplicationStore_Tests : OpenIddictDomainTestBase [Fact] public async Task GetDisplayNameAsync() { - var application = await _applicationStore.FindByIdAsync(AbpOpenIddictTestData.App1Id.ToString(), CancellationToken.None); + var application = await _applicationStore.FindByIdAsync(_testData.App1Id.ToString(), CancellationToken.None); var displayName = await _applicationStore.GetDisplayNameAsync(application, CancellationToken.None); displayName.ShouldBe("Test Application"); @@ -176,16 +178,16 @@ public class AbpOpenIddictApplicationStore_Tests : OpenIddictDomainTestBase [Fact] public async Task GetIdAsync() { - var application = await _applicationStore.FindByIdAsync(AbpOpenIddictTestData.App1Id.ToString(), CancellationToken.None); + var application = await _applicationStore.FindByIdAsync(_testData.App1Id.ToString(), CancellationToken.None); var id = await _applicationStore.GetIdAsync(application, CancellationToken.None); - id.ShouldBe(AbpOpenIddictTestData.App1Id.ToString()); + id.ShouldBe(_testData.App1Id.ToString()); } [Fact] public async Task GetPermissionsAsync() { - var application = await _applicationStore.FindByIdAsync(AbpOpenIddictTestData.App1Id.ToString(), CancellationToken.None); + var application = await _applicationStore.FindByIdAsync(_testData.App1Id.ToString(), CancellationToken.None); var permissions = await _applicationStore.GetPermissionsAsync(application, CancellationToken.None); permissions.Length.ShouldBeGreaterThan(0); @@ -194,7 +196,7 @@ public class AbpOpenIddictApplicationStore_Tests : OpenIddictDomainTestBase [Fact] public async Task GetPostLogoutRedirectUrisAsync() { - var application = await _applicationStore.FindByIdAsync(AbpOpenIddictTestData.App1Id.ToString(), CancellationToken.None); + var application = await _applicationStore.FindByIdAsync(_testData.App1Id.ToString(), CancellationToken.None); var postLogoutRedirectUris = await _applicationStore.GetPostLogoutRedirectUrisAsync(application, CancellationToken.None); postLogoutRedirectUris.Length.ShouldBe(1); @@ -204,7 +206,7 @@ public class AbpOpenIddictApplicationStore_Tests : OpenIddictDomainTestBase [Fact] public async Task GetRedirectUrisAsync() { - var application = await _applicationStore.FindByIdAsync(AbpOpenIddictTestData.App1Id.ToString(), CancellationToken.None); + var application = await _applicationStore.FindByIdAsync(_testData.App1Id.ToString(), CancellationToken.None); var redirectUris = await _applicationStore.GetRedirectUrisAsync(application, CancellationToken.None); redirectUris.Length.ShouldBe(1); @@ -214,7 +216,7 @@ public class AbpOpenIddictApplicationStore_Tests : OpenIddictDomainTestBase [Fact] public async Task GetPropertiesAsync() { - var application = await _applicationStore.FindByIdAsync(AbpOpenIddictTestData.App1Id.ToString(), CancellationToken.None); + var application = await _applicationStore.FindByIdAsync(_testData.App1Id.ToString(), CancellationToken.None); var properties = await _applicationStore.GetPropertiesAsync(application, CancellationToken.None); properties.Count.ShouldBe(0); @@ -223,7 +225,7 @@ public class AbpOpenIddictApplicationStore_Tests : OpenIddictDomainTestBase [Fact] public async Task GetRequirementsAsync() { - var application = await _applicationStore.FindByIdAsync(AbpOpenIddictTestData.App1Id.ToString(), CancellationToken.None); + var application = await _applicationStore.FindByIdAsync(_testData.App1Id.ToString(), CancellationToken.None); var requirements = await _applicationStore.GetRequirementsAsync(application, CancellationToken.None); requirements.Length.ShouldBe(0); @@ -254,7 +256,7 @@ public class AbpOpenIddictApplicationStore_Tests : OpenIddictDomainTestBase public async Task SetClientIdAsync() { var clientId = Guid.NewGuid().ToString(); - var application = await _applicationStore.FindByIdAsync(AbpOpenIddictTestData.App1Id.ToString(), CancellationToken.None); + var application = await _applicationStore.FindByIdAsync(_testData.App1Id.ToString(), CancellationToken.None); await _applicationStore.SetClientIdAsync(application, clientId, CancellationToken.None); application.ClientId.ShouldBe(clientId); @@ -264,7 +266,7 @@ public class AbpOpenIddictApplicationStore_Tests : OpenIddictDomainTestBase public async Task SetClientSecretAsync() { var clientSecret = Guid.NewGuid().ToString(); - var application = await _applicationStore.FindByIdAsync(AbpOpenIddictTestData.App1Id.ToString(), CancellationToken.None); + var application = await _applicationStore.FindByIdAsync(_testData.App1Id.ToString(), CancellationToken.None); await _applicationStore.SetClientSecretAsync(application, clientSecret, CancellationToken.None); application.ClientSecret.ShouldBe(clientSecret); @@ -273,7 +275,7 @@ public class AbpOpenIddictApplicationStore_Tests : OpenIddictDomainTestBase [Fact] public async Task SetClientTypeAsync() { - var application = await _applicationStore.FindByIdAsync(AbpOpenIddictTestData.App1Id.ToString(), CancellationToken.None); + var application = await _applicationStore.FindByIdAsync(_testData.App1Id.ToString(), CancellationToken.None); await _applicationStore.SetClientTypeAsync(application, OpenIddictConstants.ClientTypes.Confidential, CancellationToken.None); application.Type.ShouldBe(OpenIddictConstants.ClientTypes.Confidential); @@ -282,7 +284,7 @@ public class AbpOpenIddictApplicationStore_Tests : OpenIddictDomainTestBase [Fact] public async Task SetConsentTypeAsync() { - var application = await _applicationStore.FindByIdAsync(AbpOpenIddictTestData.App1Id.ToString(), CancellationToken.None); + var application = await _applicationStore.FindByIdAsync(_testData.App1Id.ToString(), CancellationToken.None); await _applicationStore.SetConsentTypeAsync(application, OpenIddictConstants.ConsentTypes.Systematic, CancellationToken.None); application.ConsentType.ShouldBe(OpenIddictConstants.ConsentTypes.Systematic); @@ -292,7 +294,7 @@ public class AbpOpenIddictApplicationStore_Tests : OpenIddictDomainTestBase public async Task SetDisplayNameAsync() { var displayName = Guid.NewGuid().ToString(); - var application = await _applicationStore.FindByIdAsync(AbpOpenIddictTestData.App1Id.ToString(), CancellationToken.None); + var application = await _applicationStore.FindByIdAsync(_testData.App1Id.ToString(), CancellationToken.None); await _applicationStore.SetDisplayNameAsync(application, displayName, CancellationToken.None); application.DisplayName.ShouldBe(displayName); @@ -305,7 +307,7 @@ public class AbpOpenIddictApplicationStore_Tests : OpenIddictDomainTestBase displayNames = displayNames.Add(CultureInfo.GetCultureInfo("en"), "Test Application"); displayNames = displayNames.Add(CultureInfo.GetCultureInfo("zh-Hans"), "测试应用程序"); - var application = await _applicationStore.FindByIdAsync(AbpOpenIddictTestData.App1Id.ToString(), CancellationToken.None); + var application = await _applicationStore.FindByIdAsync(_testData.App1Id.ToString(), CancellationToken.None); await _applicationStore.SetDisplayNamesAsync(application, displayNames, CancellationToken.None); application.DisplayNames.ShouldContain("Test Application"); @@ -315,7 +317,7 @@ public class AbpOpenIddictApplicationStore_Tests : OpenIddictDomainTestBase [Fact] public async Task SetPermissionsAsync() { - var application = await _applicationStore.FindByIdAsync(AbpOpenIddictTestData.App1Id.ToString(), CancellationToken.None); + var application = await _applicationStore.FindByIdAsync(_testData.App1Id.ToString(), CancellationToken.None); await _applicationStore.SetPermissionsAsync(application, ImmutableArray.Create(OpenIddictConstants.Permissions.Endpoints.Authorization), CancellationToken.None); application.Permissions.ShouldBe("[\""+OpenIddictConstants.Permissions.Endpoints.Authorization+"\"]"); @@ -324,7 +326,7 @@ public class AbpOpenIddictApplicationStore_Tests : OpenIddictDomainTestBase [Fact] public async Task SetPostLogoutRedirectUrisAsync() { - var application = await _applicationStore.FindByIdAsync(AbpOpenIddictTestData.App1Id.ToString(), CancellationToken.None); + var application = await _applicationStore.FindByIdAsync(_testData.App1Id.ToString(), CancellationToken.None); await _applicationStore.SetPostLogoutRedirectUrisAsync(application, ImmutableArray.Create("https://abp.io"), CancellationToken.None); application.PostLogoutRedirectUris.ShouldBe("[\"https://abp.io\"]"); @@ -333,7 +335,7 @@ public class AbpOpenIddictApplicationStore_Tests : OpenIddictDomainTestBase [Fact] public async Task SetPropertiesAsync() { - var application = await _applicationStore.FindByIdAsync(AbpOpenIddictTestData.App1Id.ToString(), CancellationToken.None); + var application = await _applicationStore.FindByIdAsync(_testData.App1Id.ToString(), CancellationToken.None); await _applicationStore.SetPropertiesAsync(application, ImmutableDictionary.Create(), CancellationToken.None); application.Properties.ShouldBeNull(); @@ -342,7 +344,7 @@ public class AbpOpenIddictApplicationStore_Tests : OpenIddictDomainTestBase [Fact] public async Task SetRedirectUrisAsync() { - var application = await _applicationStore.FindByIdAsync(AbpOpenIddictTestData.App1Id.ToString(), CancellationToken.None); + var application = await _applicationStore.FindByIdAsync(_testData.App1Id.ToString(), CancellationToken.None); await _applicationStore.SetRedirectUrisAsync(application, ImmutableArray.Create("https://abp.io"), CancellationToken.None); application.RedirectUris.ShouldBe("[\"https://abp.io\"]"); @@ -351,7 +353,7 @@ public class AbpOpenIddictApplicationStore_Tests : OpenIddictDomainTestBase [Fact] public async Task SetRequirementsAsync() { - var application = await _applicationStore.FindByIdAsync(AbpOpenIddictTestData.App1Id.ToString(), CancellationToken.None); + var application = await _applicationStore.FindByIdAsync(_testData.App1Id.ToString(), CancellationToken.None); await _applicationStore.SetRequirementsAsync(application, ImmutableArray.Create(OpenIddictConstants.Requirements.Features.ProofKeyForCodeExchange), CancellationToken.None); application.Requirements.ShouldBe("[\""+OpenIddictConstants.Requirements.Features.ProofKeyForCodeExchange+"\"]"); @@ -360,7 +362,7 @@ public class AbpOpenIddictApplicationStore_Tests : OpenIddictDomainTestBase [Fact] public async Task UpdateAsync() { - var application = await _applicationStore.FindByIdAsync(AbpOpenIddictTestData.App1Id.ToString(), CancellationToken.None); + var application = await _applicationStore.FindByIdAsync(_testData.App1Id.ToString(), CancellationToken.None); application.ClientId = "new_client_id"; application.Type = OpenIddictConstants.ClientTypes.Public; application.RedirectUris = "https://new_logout_uri"; @@ -368,7 +370,7 @@ public class AbpOpenIddictApplicationStore_Tests : OpenIddictDomainTestBase application.DisplayName = "new_display_name"; await _applicationStore.UpdateAsync(application, CancellationToken.None); - application = await _applicationStore.FindByIdAsync(AbpOpenIddictTestData.App1Id.ToString(), CancellationToken.None); + application = await _applicationStore.FindByIdAsync(_testData.App1Id.ToString(), CancellationToken.None); application.ShouldNotBeNull(); application.ClientId.ShouldBe("new_client_id"); diff --git a/modules/openiddict/test/Volo.Abp.OpenIddict.Domain.Tests/Volo/Abp/OpenIddict/Authorizations/AbpOpenIddictAuthorizationStore_Tests.cs b/modules/openiddict/test/Volo.Abp.OpenIddict.Domain.Tests/Volo/Abp/OpenIddict/Authorizations/AbpOpenIddictAuthorizationStore_Tests.cs new file mode 100644 index 0000000000..a392d1f89c --- /dev/null +++ b/modules/openiddict/test/Volo.Abp.OpenIddict.Domain.Tests/Volo/Abp/OpenIddict/Authorizations/AbpOpenIddictAuthorizationStore_Tests.cs @@ -0,0 +1,128 @@ +using System; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using OpenIddict.Abstractions; +using Shouldly; +using Xunit; + +namespace Volo.Abp.OpenIddict.Authorizations; + +public class AbpOpenIddictAuthorizationStore_Tests : OpenIddictDomainTestBase +{ + private readonly IOpenIddictAuthorizationStore _authorizationStore; + private readonly AbpOpenIddictTestData _testData; + + public AbpOpenIddictAuthorizationStore_Tests() + { + _authorizationStore = ServiceProvider.GetRequiredService>(); + _testData = ServiceProvider.GetRequiredService(); + } + + [Fact] + public async Task CountAsync() + { + var count = await _authorizationStore.CountAsync(CancellationToken.None); + count.ShouldBe(2); + } + + [Fact] + public async Task CreateAsync() + { + var id = Guid.NewGuid(); + await _authorizationStore.CreateAsync(new OpenIddictAuthorizationModel { + Id = id, + ApplicationId = _testData.App1Id, + Status = "TestStatus3", + Subject = "TestSubject3", + Type = OpenIddictConstants.AuthorizationTypes.Permanent + }, CancellationToken.None); + + var authorization = await _authorizationStore.FindByIdAsync(id.ToString(), CancellationToken.None); + + authorization.ShouldNotBeNull(); + authorization.Status.ShouldBe("TestStatus3"); + authorization.Subject.ShouldBe("TestSubject3"); + authorization.Type.ShouldBe(OpenIddictConstants.AuthorizationTypes.Permanent); + } + + [Fact] + public async Task DeleteAsync() + { + var authorization = await _authorizationStore.FindByIdAsync(_testData.Authorization1Id.ToString(), CancellationToken.None); + await _authorizationStore.DeleteAsync(authorization, CancellationToken.None); + + authorization = await _authorizationStore.FindByIdAsync(_testData.Authorization1Id.ToString(), CancellationToken.None); + authorization.ShouldBeNull(); + } + + [Fact] + public async Task FindByIdAsync_Should_Return_Null_If_Not_Found() + { + var authorization = await _authorizationStore.FindByIdAsync(new Guid().ToString(), CancellationToken.None); + authorization.ShouldBeNull(); + } + + [Fact] + public async Task FindByIdAsync_Should_Return_Authorization_If_Not_Found() + { + var authorization = await _authorizationStore.FindByIdAsync(_testData.Authorization1Id.ToString(), CancellationToken.None); + authorization.ShouldNotBeNull(); + authorization.Status.ShouldBe("TestStatus1"); + authorization.Subject.ShouldBe("TestSubject1"); + authorization.Type.ShouldBe(OpenIddictConstants.AuthorizationTypes.Permanent); + } + + [Fact] + public async Task FindByApplicationIdAsync_Should_Return_Empty_If_Not_Found() + { + var authorizations = await _authorizationStore.FindByApplicationIdAsync(new Guid().ToString(), CancellationToken.None).ToListAsync(); + + authorizations.Count.ShouldBe(0); + } + + [Fact] + public async Task FindByApplicationIdAsync_Should_Return_Authorizations_If_Found() + { + var authorizations = await _authorizationStore.FindByApplicationIdAsync(_testData.App1Id.ToString(), CancellationToken.None).ToListAsync(); + + authorizations.Count.ShouldBe(1); + } + + [Fact] + public async Task FindBySubjectAsync_Should_Return_Empty_If_Not_Found() + { + var authorizations = await _authorizationStore.FindBySubjectAsync(new Guid().ToString(), CancellationToken.None).ToListAsync(); + + authorizations.Count.ShouldBe(0); + } + + [Fact] + public async Task FindBySubjectAsync_Should_Return_Authorizations_If_Found() + { + var authorizations = await _authorizationStore.FindBySubjectAsync("TestSubject1", CancellationToken.None).ToListAsync(); + + authorizations.Count.ShouldBe(1); + } + + [Fact] + public async Task UpdateAsync() + { + var authorization = await _authorizationStore.FindByIdAsync(_testData.Authorization1Id.ToString(), CancellationToken.None); + + authorization.Status = "New status"; + authorization.Subject = "New subject"; + authorization.Type = OpenIddictConstants.AuthorizationTypes.AdHoc; + authorization.ApplicationId = _testData.App2Id; + + await _authorizationStore.UpdateAsync(authorization, CancellationToken.None); + + authorization = await _authorizationStore.FindByIdAsync(_testData.Authorization1Id.ToString(), CancellationToken.None); + + authorization.Status.ShouldBe("New status"); + authorization.Subject.ShouldBe("New subject"); + authorization.Type.ShouldBe(OpenIddictConstants.AuthorizationTypes.AdHoc); + authorization.ApplicationId.ShouldBe(_testData.App2Id); + } +} \ No newline at end of file diff --git a/modules/openiddict/test/Volo.Abp.OpenIddict.Domain.Tests/Volo/Abp/OpenIddict/OpenIddictDomainTestModule.cs b/modules/openiddict/test/Volo.Abp.OpenIddict.Domain.Tests/Volo/Abp/OpenIddict/OpenIddictDomainTestModule.cs index ae3a7fd880..b061e36c69 100644 --- a/modules/openiddict/test/Volo.Abp.OpenIddict.Domain.Tests/Volo/Abp/OpenIddict/OpenIddictDomainTestModule.cs +++ b/modules/openiddict/test/Volo.Abp.OpenIddict.Domain.Tests/Volo/Abp/OpenIddict/OpenIddictDomainTestModule.cs @@ -12,5 +12,5 @@ namespace Volo.Abp.OpenIddict; )] public class OpenIddictDomainTestModule : AbpModule { - + } diff --git a/modules/openiddict/test/Volo.Abp.OpenIddict.Domain.Tests/Volo/Abp/OpenIddict/Scopes/AbpOpenIddictScopeStore_Tests.cs b/modules/openiddict/test/Volo.Abp.OpenIddict.Domain.Tests/Volo/Abp/OpenIddict/Scopes/AbpOpenIddictScopeStore_Tests.cs new file mode 100644 index 0000000000..1c6701c848 --- /dev/null +++ b/modules/openiddict/test/Volo.Abp.OpenIddict.Domain.Tests/Volo/Abp/OpenIddict/Scopes/AbpOpenIddictScopeStore_Tests.cs @@ -0,0 +1,324 @@ +using System; +using System.Collections.Immutable; +using System.Globalization; +using System.Linq; +using System.Text.Json; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using OpenIddict.Abstractions; +using Shouldly; +using Xunit; + +namespace Volo.Abp.OpenIddict.Scopes; + +public class AbpOpenIddictScopeStore_Tests : OpenIddictDomainTestBase +{ + private readonly IOpenIddictScopeStore _scopeStore; + private readonly AbpOpenIddictTestData _testData; + + public AbpOpenIddictScopeStore_Tests() + { + _scopeStore = ServiceProvider.GetRequiredService>(); + _testData = ServiceProvider.GetRequiredService(); + } + + [Fact] + public async Task CountAsync() + { + var count = await _scopeStore.CountAsync(CancellationToken.None); + count.ShouldBe(2); + } + + [Fact] + public async Task CreateAsync() + { + await _scopeStore.CreateAsync( + new OpenIddictScopeModel { + Name = "scope3", Description = "scope3 description", DisplayName = "scope3 display name" + }, CancellationToken.None); + + var scope = await _scopeStore.FindByNameAsync("scope3", CancellationToken.None); + + scope.ShouldNotBeNull(); + scope.Name.ShouldBe("scope3"); + scope.Description.ShouldBe("scope3 description"); + scope.DisplayName.ShouldBe("scope3 display name"); + scope.Descriptions.ShouldBeNull(); + scope.DisplayNames.ShouldBeNull(); + scope.Resources.ShouldBeNull(); + } + + [Fact] + public async Task DeleteAsync() + { + var scope = await _scopeStore.FindByIdAsync(_testData.Scope1Id.ToString(), CancellationToken.None); + await _scopeStore.DeleteAsync(scope, CancellationToken.None); + + scope = await _scopeStore.FindByIdAsync(_testData.Scope1Id.ToString(), CancellationToken.None); + scope.ShouldBeNull(); + } + + [Fact] + public async Task FindByIdAsync_Should_Return_Null_If_Not_Found() + { + var nonExistingId = Guid.NewGuid().ToString(); + var scope = await _scopeStore.FindByIdAsync(nonExistingId, CancellationToken.None); + scope.ShouldBeNull(); + } + + [Fact] + public async Task FindByIdAsync_Should_Return_Scope_If_Found() + { + var scope = await _scopeStore.FindByIdAsync(_testData.Scope1Id.ToString(), CancellationToken.None); + + scope.ShouldNotBeNull(); + scope.Name.ShouldBe(_testData.Scope1Name); + scope.DisplayName.ShouldBe("Test Scope 1"); + scope.Description.ShouldBe("Test Scope 1"); + scope.DisplayNames.ShouldContain("测试范围1"); + scope.DisplayNames.ShouldContain("Test Kapsamı 1"); + scope.Resources.ShouldBe("[\"TestScope1Resource\"]"); + } + + [Fact] + public async Task FindByNameAsync_Should_Return_Null_If_Not_Found() + { + var nonExistingName = Guid.NewGuid().ToString(); + var scope = await _scopeStore.FindByNameAsync(nonExistingName, CancellationToken.None); + scope.ShouldBeNull(); + } + + [Fact] + public async Task FindByNameAsync_Should_Return_Application_If_Found() + { + var scope = await _scopeStore.FindByNameAsync(_testData.Scope1Name, CancellationToken.None); + + scope.ShouldNotBeNull(); + scope.Name.ShouldBe(_testData.Scope1Name); + scope.DisplayName.ShouldBe("Test Scope 1"); + scope.Description.ShouldBe("Test Scope 1"); + scope.DisplayNames.ShouldContain("测试范围1"); + scope.DisplayNames.ShouldContain("Test Kapsamı 1"); + scope.Resources.ShouldBe("[\"TestScope1Resource\"]"); + } + + [Fact] + public async Task FindByNamesAsync_Should_Return_Empty_If_Not_Found() + { + var scopes = await _scopeStore + .FindByNamesAsync(ImmutableArray.Create("non-existing-name"), CancellationToken.None).ToListAsync(); + scopes.Count.ShouldBe(0); + } + + [Fact] + public async Task FindByNamesAsync_Should_Return_Scopes_If_Found() + { + var scopes = await _scopeStore + .FindByNamesAsync(ImmutableArray.Create("Scope1", "Scope2", "Scope3"), CancellationToken.None) + .ToListAsync(); + scopes.Count.ShouldBe(2); + } + + [Fact] + public async Task FindByResourceAsync_Should_Return_Empty_If_Not_Found() + { + var scopes = await _scopeStore.FindByResourceAsync("non-existing-resource", CancellationToken.None) + .ToListAsync(); + scopes.Count.ShouldBe(0); + } + + [Fact] + public async Task FindByResourceAsync_Should_Return_Scopes_If_Found() + { + var scopes = await _scopeStore.FindByResourceAsync("TestScope1Resource", CancellationToken.None).ToListAsync(); + scopes.Count.ShouldBe(1); + } + + [Fact] + public async Task GetDescriptionAsync() + { + var scope = await _scopeStore.FindByIdAsync(_testData.Scope1Id.ToString(), CancellationToken.None); + var description = await _scopeStore.GetDescriptionAsync(scope, CancellationToken.None); + description.ShouldBe("Test Scope 1"); + } + + [Fact] + public async Task GetDescriptionsAsync() + { + var scope = await _scopeStore.FindByIdAsync(_testData.Scope1Id.ToString(), CancellationToken.None); + var descriptions = await _scopeStore.GetDescriptionsAsync(scope, CancellationToken.None); + descriptions.Count.ShouldBe(0); + } + + [Fact] + public async Task GetDisplayNameAsync() + { + var scope = await _scopeStore.FindByIdAsync(_testData.Scope1Id.ToString(), CancellationToken.None); + var displayName = await _scopeStore.GetDisplayNameAsync(scope, CancellationToken.None); + displayName.ShouldBe("Test Scope 1"); + } + + [Fact] + public async Task GetDisplayNamesAsync() + { + var scope = await _scopeStore.FindByIdAsync(_testData.Scope1Id.ToString(), CancellationToken.None); + var displayNames = await _scopeStore.GetDisplayNamesAsync(scope, CancellationToken.None); + displayNames.Count.ShouldBe(2); + } + + [Fact] + public async Task GetIdAsync() + { + var scope = await _scopeStore.FindByIdAsync(_testData.Scope1Id.ToString(), CancellationToken.None); + var id = await _scopeStore.GetIdAsync(scope, CancellationToken.None); + id.ShouldBe(_testData.Scope1Id.ToString()); + } + + [Fact] + public async Task GetNameAsync() + { + var scope = await _scopeStore.FindByIdAsync(_testData.Scope1Id.ToString(), CancellationToken.None); + var name = await _scopeStore.GetNameAsync(scope, CancellationToken.None); + name.ShouldBe("Scope1"); + } + + [Fact] + public async Task GetPropertiesAsync() + { + var scope = await _scopeStore.FindByIdAsync(_testData.Scope1Id.ToString(), CancellationToken.None); + var properties = await _scopeStore.GetPropertiesAsync(scope, CancellationToken.None); + properties.Count.ShouldBe(0); + } + + [Fact] + public async Task GetResourcesAsync() + { + var scope = await _scopeStore.FindByIdAsync(_testData.Scope1Id.ToString(), CancellationToken.None); + var resources = await _scopeStore.GetResourcesAsync(scope, CancellationToken.None); + resources.Length.ShouldBe(1); + resources.First().ShouldBe("TestScope1Resource"); + } + + [Fact] + public async Task InstantiateAsync() + { + var scope = await _scopeStore.InstantiateAsync(CancellationToken.None); + scope.ShouldNotBeNull(); + } + + [Fact] + public async Task ListAsync_Should_Return_Empty_If_Not_Found() + { + var scopes = await _scopeStore.ListAsync(2, 2, CancellationToken.None).ToListAsync(); + scopes.Count.ShouldBe(0); + } + + [Fact] + public async Task ListAsync_Should_Return_Applications_If_Found() + { + var scopes = await _scopeStore.ListAsync(2, 0, CancellationToken.None).ToListAsync(); + + scopes.Count.ShouldBe(2); + } + + [Fact] + public async Task SetDescriptionAsync() + { + var scope = await _scopeStore.FindByIdAsync(_testData.Scope1Id.ToString(), CancellationToken.None); + await _scopeStore.SetDescriptionAsync(scope, "New Test Scope 1 Description", CancellationToken.None); + + scope.Description.ShouldBe("New Test Scope 1 Description"); + } + + [Fact] + public async Task SetDescriptionsAsync() + { + var descriptions = ImmutableDictionary.Create(); + descriptions = descriptions.Add(CultureInfo.GetCultureInfo("en"), "Test Scope"); + descriptions = descriptions.Add(CultureInfo.GetCultureInfo("zh-Hans"), "测试范围"); + + var scope = await _scopeStore.FindByIdAsync(_testData.Scope1Id.ToString(), CancellationToken.None); + await _scopeStore.SetDescriptionsAsync(scope, descriptions, CancellationToken.None); + + scope.Descriptions.ShouldContain("Test Scope"); + scope.Descriptions.ShouldContain("测试范围"); + } + + [Fact] + public async Task SetDisplayNameAsync() + { + var scope = await _scopeStore.FindByIdAsync(_testData.Scope1Id.ToString(), CancellationToken.None); + await _scopeStore.SetDisplayNameAsync(scope, "New Test Scope 1 Display Name", CancellationToken.None); + + scope.DisplayName.ShouldBe("New Test Scope 1 Display Name"); + } + + [Fact] + public async Task SetDisplayNamesAsync() + { + var displayNames = ImmutableDictionary.Create(); + displayNames = displayNames.Add(CultureInfo.GetCultureInfo("en"), "Test Scope"); + displayNames = displayNames.Add(CultureInfo.GetCultureInfo("zh-Hans"), "测试范围"); + + var scope = await _scopeStore.FindByIdAsync(_testData.Scope1Id.ToString(), CancellationToken.None); + await _scopeStore.SetDisplayNamesAsync(scope, displayNames, CancellationToken.None); + + scope.DisplayNames.ShouldContain("Test Scope"); + scope.DisplayNames.ShouldContain("测试范围"); + } + + [Fact] + public async Task SetNameAsync() + { + var scope = await _scopeStore.FindByIdAsync(_testData.Scope1Id.ToString(), CancellationToken.None); + await _scopeStore.SetNameAsync(scope, "New Test Scope 1 Name", CancellationToken.None); + + scope.Name.ShouldBe("New Test Scope 1 Name"); + } + + [Fact] + public async Task SetPropertiesAsync() + { + var scope = await _scopeStore.FindByIdAsync(_testData.Scope1Id.ToString(), CancellationToken.None); + await _scopeStore.SetPropertiesAsync(scope, ImmutableDictionary.Create(), + CancellationToken.None); + + scope.Properties.ShouldBeNull(); + } + + [Fact] + public async Task SetResourcesAsync() + { + var scope = await _scopeStore.FindByIdAsync(_testData.Scope1Id.ToString(), CancellationToken.None); + await _scopeStore.SetResourcesAsync(scope, ImmutableArray.Create("TestScope1Resource", "TestScope1Resource2"), + CancellationToken.None); + + scope.Resources.ShouldContain("TestScope1Resource"); + scope.Resources.ShouldContain("TestScope1Resource2"); + } + + [Fact] + public async Task UpdateAsync() + { + var scope = await _scopeStore.FindByIdAsync(_testData.Scope1Id.ToString(), CancellationToken.None); + scope.Name = "New Test Scope 1 Name"; + scope.DisplayName = "New Test Scope 1 Display Name"; + scope.Resources = "New Test Scope 1 Resource"; + scope.Properties = "New Test Scope 1 Properties"; + scope.Description = "New Test Scope 1 Description"; + scope.Descriptions = "New Test Scope 1 Descriptions"; + scope.DisplayNames = "New Test Scope 1 Display Names"; + + await _scopeStore.UpdateAsync(scope, CancellationToken.None); + + scope = await _scopeStore.FindByIdAsync(_testData.Scope1Id.ToString(), CancellationToken.None); + scope.Name.ShouldBe("New Test Scope 1 Name"); + scope.DisplayName.ShouldBe("New Test Scope 1 Display Name"); + scope.Resources.ShouldBe("New Test Scope 1 Resource"); + scope.Properties.ShouldBe("New Test Scope 1 Properties"); + scope.Description.ShouldBe("New Test Scope 1 Description"); + scope.Descriptions.ShouldBe("New Test Scope 1 Descriptions"); + scope.DisplayNames.ShouldBe("New Test Scope 1 Display Names"); + } +} \ No newline at end of file diff --git a/modules/openiddict/test/Volo.Abp.OpenIddict.Domain.Tests/Volo/Abp/OpenIddict/Tokens/AbpOpenIddictTokenStore_Tests.cs b/modules/openiddict/test/Volo.Abp.OpenIddict.Domain.Tests/Volo/Abp/OpenIddict/Tokens/AbpOpenIddictTokenStore_Tests.cs new file mode 100644 index 0000000000..94e5d5710d --- /dev/null +++ b/modules/openiddict/test/Volo.Abp.OpenIddict.Domain.Tests/Volo/Abp/OpenIddict/Tokens/AbpOpenIddictTokenStore_Tests.cs @@ -0,0 +1,156 @@ +using System; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using OpenIddict.Abstractions; +using Shouldly; +using Xunit; + +namespace Volo.Abp.OpenIddict.Tokens; + +public class AbpOpenIddictTokenStore_Tests : OpenIddictDomainTestBase +{ + private readonly IOpenIddictTokenStore _tokenStore; + private readonly AbpOpenIddictTestData _testData; + + public AbpOpenIddictTokenStore_Tests() + { + _tokenStore = ServiceProvider.GetRequiredService>(); + _testData = ServiceProvider.GetRequiredService(); + } + + [Fact] + public async Task CountAsync() + { + var count = await _tokenStore.CountAsync(CancellationToken.None); + count.ShouldBe(2); + } + + [Fact] + public async Task CreateAsync() + { + await _tokenStore.CreateAsync(new OpenIddictTokenModel + { + ApplicationId = _testData.App1Id, + Payload = "TestPayload3", + Subject = "TestSubject3", + Type = "TestType3", + Status = OpenIddictConstants.Statuses.Inactive, + + }, CancellationToken.None); + + var tokens = await _tokenStore.FindBySubjectAsync("TestSubject3", CancellationToken.None).ToListAsync(); + + tokens.Count.ShouldBe(1); + var token = tokens.First(); + token.ApplicationId.ShouldBe(_testData.App1Id); + token.Payload.ShouldBe("TestPayload3"); + token.Subject.ShouldBe("TestSubject3"); + token.Type.ShouldBe("TestType3"); + token.Status.ShouldBe(OpenIddictConstants.Statuses.Inactive); + } + + [Fact] + public async Task DeleteAsync() + { + var token = await _tokenStore.FindByIdAsync(_testData.Token1Id.ToString(), CancellationToken.None); + await _tokenStore.DeleteAsync(token, CancellationToken.None); + + token = await _tokenStore.FindByIdAsync(_testData.Token1Id.ToString(), CancellationToken.None); + token.ShouldBeNull(); + } + + [Fact] + public async Task FindAsync_Should_Return_Empty_If_Not_Found() + { + var tokens = await _tokenStore.FindAsync("non_existing_subject", _testData.App1Id.ToString(), "non_existing_status", "non_existing_type", CancellationToken.None).ToListAsync(); + + tokens.Count.ShouldBe(0); + } + + [Fact] + public async Task FindAsync_Should_Return_Tokens_If_Found() + { + var tokens = await _tokenStore.FindAsync("TestSubject1", _testData.App1Id.ToString(),OpenIddictConstants.Statuses.Redeemed, "TestType1", CancellationToken.None).ToListAsync(); + + tokens.Count.ShouldBe(1); + } + + [Fact] + public async Task FindByApplicationIdAsync_Should_Return_Empty_If_Not_Found() + { + var tokens = await _tokenStore.FindByApplicationIdAsync(Guid.NewGuid().ToString(), CancellationToken.None).ToListAsync(); + + tokens.Count.ShouldBe(0); + } + + [Fact] + public async Task FindByApplicationIdAsync_Should_Return_Tokens_If_Found() + { + var tokens = await _tokenStore.FindByApplicationIdAsync(_testData.App1Id.ToString(), CancellationToken.None).ToListAsync(); + + tokens.Count.ShouldBe(1); + } + + [Fact] + public async Task FindByIdAsync_Should_Return_Null_If_Not_Found() + { + var nonExistingId = Guid.NewGuid().ToString(); + var token = await _tokenStore.FindByIdAsync(nonExistingId, CancellationToken.None); + token.ShouldBeNull(); + } + + [Fact] + public async Task FindByIdAsync_Should_Return_Token_If_Found() + { + var token = await _tokenStore.FindByIdAsync(_testData.Token1Id.ToString(), CancellationToken.None); + + token.ShouldNotBeNull(); + token.ApplicationId.ShouldBe(_testData.App1Id); + token.Payload.ShouldBe("TestPayload1"); + token.Subject.ShouldBe("TestSubject1"); + token.Type.ShouldBe("TestType1"); + token.Status.ShouldBe(OpenIddictConstants.Statuses.Redeemed); + token.ExpirationDate.ShouldNotBeNull(); + } + + [Fact] + public async Task FindByReferenceIdAsync_Should_Return_Null_If_Not_Found() + { + var token = await _tokenStore.FindByReferenceIdAsync(Guid.NewGuid().ToString(), CancellationToken.None); + token.ShouldBeNull(); + } + + [Fact] + public async Task FindByReferenceIdAsync_Should_Return_Token_If_Found() + { + var token = await _tokenStore.FindByIdAsync(_testData.Token1Id.ToString(), CancellationToken.None); + token = await _tokenStore.FindByReferenceIdAsync(token.ReferenceId, CancellationToken.None); + token.ShouldNotBeNull(); + } + + [Fact] + public async Task UpdateAsync() + { + var token = await _tokenStore.FindByIdAsync(_testData.Token1Id.ToString(), CancellationToken.None); + + var now = DateTime.Now; + token.ApplicationId = _testData.App2Id; + token.Payload = "New payload"; + token.Status = OpenIddictConstants.Statuses.Revoked; + token.Subject = "New subject"; + token.Type = "New type"; + token.ExpirationDate = now; + + await _tokenStore.UpdateAsync(token, CancellationToken.None); + token = await _tokenStore.FindByIdAsync(_testData.Token1Id.ToString(), CancellationToken.None); + + token.ApplicationId.ShouldBe(_testData.App2Id); + token.Payload.ShouldBe("New payload"); + token.Subject.ShouldBe("New subject"); + token.Type.ShouldBe("New type"); + token.Status.ShouldBe(OpenIddictConstants.Statuses.Revoked); + token.ExpirationDate.ShouldBe(now); + } +} \ No newline at end of file diff --git a/modules/openiddict/test/Volo.Abp.OpenIddict.Domain.Tests/Volo/Abp/OpenIddict/Tokens/TokenCleanupService_Tests.cs b/modules/openiddict/test/Volo.Abp.OpenIddict.Domain.Tests/Volo/Abp/OpenIddict/Tokens/TokenCleanupService_Tests.cs new file mode 100644 index 0000000000..64a1e3f013 --- /dev/null +++ b/modules/openiddict/test/Volo.Abp.OpenIddict.Domain.Tests/Volo/Abp/OpenIddict/Tokens/TokenCleanupService_Tests.cs @@ -0,0 +1,35 @@ +using System.Threading.Tasks; +using OpenIddict.Abstractions; +using Shouldly; +using Xunit; + +namespace Volo.Abp.OpenIddict.Tokens; + +public class TokenCleanupService_Tests : OpenIddictDomainTestBase +{ + private readonly IOpenIddictTokenManager _tokenManager; + private readonly IOpenIddictAuthorizationManager _authorizationManager; + private readonly TokenCleanupService _tokenCleanupService; + + public TokenCleanupService_Tests() + { + _tokenManager = GetRequiredService(); + _authorizationManager = GetRequiredService(); + _tokenCleanupService = GetRequiredService(); + } + + [Fact] + public async Task Should_Clear_Expired_Tokens() + { + var tokensCount = await _tokenManager.CountAsync(); + var authorizationsCount = await _authorizationManager.CountAsync(); + + await _tokenCleanupService.CleanAsync(); + + (await _tokenManager.CountAsync()) + .ShouldBe(tokensCount - 1); + + (await _authorizationManager.CountAsync()) + .ShouldBe(authorizationsCount - 1); + } +} \ No newline at end of file diff --git a/modules/openiddict/test/Volo.Abp.OpenIddict.EntityFrameworkCore.Tests/Volo.Abp.OpenIddict.EntityFrameworkCore.Tests.abppkg.json b/modules/openiddict/test/Volo.Abp.OpenIddict.EntityFrameworkCore.Tests/Volo.Abp.OpenIddict.EntityFrameworkCore.Tests.abppkg.json new file mode 100644 index 0000000000..a686451fbc --- /dev/null +++ b/modules/openiddict/test/Volo.Abp.OpenIddict.EntityFrameworkCore.Tests/Volo.Abp.OpenIddict.EntityFrameworkCore.Tests.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.test" +} \ No newline at end of file diff --git a/modules/openiddict/test/Volo.Abp.OpenIddict.EntityFrameworkCore.Tests/Volo.Abp.OpenIddict.EntityFrameworkCore.Tests.csproj b/modules/openiddict/test/Volo.Abp.OpenIddict.EntityFrameworkCore.Tests/Volo.Abp.OpenIddict.EntityFrameworkCore.Tests.csproj index f3b8602433..959bdcbfef 100644 --- a/modules/openiddict/test/Volo.Abp.OpenIddict.EntityFrameworkCore.Tests/Volo.Abp.OpenIddict.EntityFrameworkCore.Tests.csproj +++ b/modules/openiddict/test/Volo.Abp.OpenIddict.EntityFrameworkCore.Tests/Volo.Abp.OpenIddict.EntityFrameworkCore.Tests.csproj @@ -8,7 +8,10 @@ - + + + + diff --git a/modules/openiddict/test/Volo.Abp.OpenIddict.EntityFrameworkCore.Tests/Volo/Abp/OpenIddict/EntityFrameworkCore/OpenIddictApplicationRepository_Tests.cs b/modules/openiddict/test/Volo.Abp.OpenIddict.EntityFrameworkCore.Tests/Volo/Abp/OpenIddict/EntityFrameworkCore/OpenIddictApplicationRepository_Tests.cs new file mode 100644 index 0000000000..0501e03c4c --- /dev/null +++ b/modules/openiddict/test/Volo.Abp.OpenIddict.EntityFrameworkCore.Tests/Volo/Abp/OpenIddict/EntityFrameworkCore/OpenIddictApplicationRepository_Tests.cs @@ -0,0 +1,6 @@ +namespace Volo.Abp.OpenIddict.EntityFrameworkCore; + +public class OpenIddictApplicationRepository_Tests : OpenIddictApplicationRepository_Tests +{ + +} \ No newline at end of file diff --git a/modules/openiddict/test/Volo.Abp.OpenIddict.EntityFrameworkCore.Tests/Volo/Abp/OpenIddict/EntityFrameworkCore/OpenIddictAuthorizationRepository_Tests.cs b/modules/openiddict/test/Volo.Abp.OpenIddict.EntityFrameworkCore.Tests/Volo/Abp/OpenIddict/EntityFrameworkCore/OpenIddictAuthorizationRepository_Tests.cs new file mode 100644 index 0000000000..402189b27f --- /dev/null +++ b/modules/openiddict/test/Volo.Abp.OpenIddict.EntityFrameworkCore.Tests/Volo/Abp/OpenIddict/EntityFrameworkCore/OpenIddictAuthorizationRepository_Tests.cs @@ -0,0 +1,6 @@ +namespace Volo.Abp.OpenIddict.EntityFrameworkCore; + +public class OpenIddictAuthorizationRepository_Tests : OpenIddictAuthorizationRepository_Tests +{ + +} \ No newline at end of file diff --git a/modules/openiddict/test/Volo.Abp.OpenIddict.EntityFrameworkCore.Tests/EntityFrameworkCore/OpenIddictEntityFrameworkCoreTestBase.cs b/modules/openiddict/test/Volo.Abp.OpenIddict.EntityFrameworkCore.Tests/Volo/Abp/OpenIddict/EntityFrameworkCore/OpenIddictEntityFrameworkCoreTestBase.cs similarity index 100% rename from modules/openiddict/test/Volo.Abp.OpenIddict.EntityFrameworkCore.Tests/EntityFrameworkCore/OpenIddictEntityFrameworkCoreTestBase.cs rename to modules/openiddict/test/Volo.Abp.OpenIddict.EntityFrameworkCore.Tests/Volo/Abp/OpenIddict/EntityFrameworkCore/OpenIddictEntityFrameworkCoreTestBase.cs diff --git a/modules/openiddict/test/Volo.Abp.OpenIddict.EntityFrameworkCore.Tests/EntityFrameworkCore/OpenIddictEntityFrameworkCoreTestModule.cs b/modules/openiddict/test/Volo.Abp.OpenIddict.EntityFrameworkCore.Tests/Volo/Abp/OpenIddict/EntityFrameworkCore/OpenIddictEntityFrameworkCoreTestModule.cs similarity index 100% rename from modules/openiddict/test/Volo.Abp.OpenIddict.EntityFrameworkCore.Tests/EntityFrameworkCore/OpenIddictEntityFrameworkCoreTestModule.cs rename to modules/openiddict/test/Volo.Abp.OpenIddict.EntityFrameworkCore.Tests/Volo/Abp/OpenIddict/EntityFrameworkCore/OpenIddictEntityFrameworkCoreTestModule.cs diff --git a/modules/openiddict/test/Volo.Abp.OpenIddict.EntityFrameworkCore.Tests/Volo/Abp/OpenIddict/EntityFrameworkCore/OpenIddictScopeRepository_Tests.cs b/modules/openiddict/test/Volo.Abp.OpenIddict.EntityFrameworkCore.Tests/Volo/Abp/OpenIddict/EntityFrameworkCore/OpenIddictScopeRepository_Tests.cs new file mode 100644 index 0000000000..233949aca5 --- /dev/null +++ b/modules/openiddict/test/Volo.Abp.OpenIddict.EntityFrameworkCore.Tests/Volo/Abp/OpenIddict/EntityFrameworkCore/OpenIddictScopeRepository_Tests.cs @@ -0,0 +1,6 @@ +namespace Volo.Abp.OpenIddict.EntityFrameworkCore; + +public class OpenIddictScopeRepository_Tests : OpenIddictScopeRepository_Tests +{ + +} \ No newline at end of file diff --git a/modules/openiddict/test/Volo.Abp.OpenIddict.EntityFrameworkCore.Tests/Volo/Abp/OpenIddict/EntityFrameworkCore/OpenIddictTokenRepository_Tests.cs b/modules/openiddict/test/Volo.Abp.OpenIddict.EntityFrameworkCore.Tests/Volo/Abp/OpenIddict/EntityFrameworkCore/OpenIddictTokenRepository_Tests.cs new file mode 100644 index 0000000000..4cc70280a2 --- /dev/null +++ b/modules/openiddict/test/Volo.Abp.OpenIddict.EntityFrameworkCore.Tests/Volo/Abp/OpenIddict/EntityFrameworkCore/OpenIddictTokenRepository_Tests.cs @@ -0,0 +1,6 @@ +namespace Volo.Abp.OpenIddict.EntityFrameworkCore; + +public class OpenIddictTokenRepository_Tests : OpenIddictTokenRepository_Tests +{ + +} \ No newline at end of file diff --git a/modules/openiddict/test/Volo.Abp.OpenIddict.MongoDB.Tests/MongoDB/OpenIddictMongoDbTestModule.cs b/modules/openiddict/test/Volo.Abp.OpenIddict.MongoDB.Tests/MongoDB/OpenIddictMongoDbTestModule.cs deleted file mode 100644 index bdd4bdfa57..0000000000 --- a/modules/openiddict/test/Volo.Abp.OpenIddict.MongoDB.Tests/MongoDB/OpenIddictMongoDbTestModule.cs +++ /dev/null @@ -1,27 +0,0 @@ -using System; -using Volo.Abp.Data; -using Volo.Abp.Modularity; -using Volo.Abp.Identity.MongoDB; - -namespace Volo.Abp.OpenIddict.MongoDB; - -[DependsOn( - typeof(OpenIddictTestBaseModule), - typeof(AbpIdentityMongoDbModule), - typeof(AbpOpenIddictMongoDbModule) - )] -public class OpenIddictMongoDbTestModule : AbpModule -{ - public override void ConfigureServices(ServiceConfigurationContext context) - { - var stringArray = MongoDbFixture.ConnectionString.Split('?'); - var connectionString = stringArray[0].EnsureEndsWith('/') + - "Db_" + - Guid.NewGuid().ToString("N") + "/?" + stringArray[1]; - - Configure(options => - { - options.ConnectionStrings.Default = connectionString; - }); - } -} diff --git a/modules/openiddict/test/Volo.Abp.OpenIddict.MongoDB.Tests/Volo.Abp.OpenIddict.MongoDB.Tests.abppkg.json b/modules/openiddict/test/Volo.Abp.OpenIddict.MongoDB.Tests/Volo.Abp.OpenIddict.MongoDB.Tests.abppkg.json new file mode 100644 index 0000000000..a686451fbc --- /dev/null +++ b/modules/openiddict/test/Volo.Abp.OpenIddict.MongoDB.Tests/Volo.Abp.OpenIddict.MongoDB.Tests.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.test" +} \ No newline at end of file diff --git a/modules/openiddict/test/Volo.Abp.OpenIddict.MongoDB.Tests/Volo.Abp.OpenIddict.MongoDB.Tests.csproj b/modules/openiddict/test/Volo.Abp.OpenIddict.MongoDB.Tests/Volo.Abp.OpenIddict.MongoDB.Tests.csproj index 8eeb4386de..12cb1cfddd 100644 --- a/modules/openiddict/test/Volo.Abp.OpenIddict.MongoDB.Tests/Volo.Abp.OpenIddict.MongoDB.Tests.csproj +++ b/modules/openiddict/test/Volo.Abp.OpenIddict.MongoDB.Tests/Volo.Abp.OpenIddict.MongoDB.Tests.csproj @@ -8,8 +8,11 @@ - - + + + + + diff --git a/modules/openiddict/test/Volo.Abp.OpenIddict.MongoDB.Tests/MongoDB/MongoDbFixture.cs b/modules/openiddict/test/Volo.Abp.OpenIddict.MongoDB.Tests/Volo/Abp/OpenIddict/MongoDB/MongoDbFixture.cs similarity index 100% rename from modules/openiddict/test/Volo.Abp.OpenIddict.MongoDB.Tests/MongoDB/MongoDbFixture.cs rename to modules/openiddict/test/Volo.Abp.OpenIddict.MongoDB.Tests/Volo/Abp/OpenIddict/MongoDB/MongoDbFixture.cs diff --git a/modules/openiddict/test/Volo.Abp.OpenIddict.MongoDB.Tests/MongoDB/MongoTestCollection.cs b/modules/openiddict/test/Volo.Abp.OpenIddict.MongoDB.Tests/Volo/Abp/OpenIddict/MongoDB/MongoTestCollection.cs similarity index 100% rename from modules/openiddict/test/Volo.Abp.OpenIddict.MongoDB.Tests/MongoDB/MongoTestCollection.cs rename to modules/openiddict/test/Volo.Abp.OpenIddict.MongoDB.Tests/Volo/Abp/OpenIddict/MongoDB/MongoTestCollection.cs diff --git a/modules/openiddict/test/Volo.Abp.OpenIddict.MongoDB.Tests/Volo/Abp/OpenIddict/MongoDB/OpenIddictApplicationRepository_Tests.cs b/modules/openiddict/test/Volo.Abp.OpenIddict.MongoDB.Tests/Volo/Abp/OpenIddict/MongoDB/OpenIddictApplicationRepository_Tests.cs new file mode 100644 index 0000000000..09a9c709b7 --- /dev/null +++ b/modules/openiddict/test/Volo.Abp.OpenIddict.MongoDB.Tests/Volo/Abp/OpenIddict/MongoDB/OpenIddictApplicationRepository_Tests.cs @@ -0,0 +1,9 @@ +using Xunit; + +namespace Volo.Abp.OpenIddict.MongoDB; + +[Collection(MongoTestCollection.Name)] +public class OpenIddictApplicationRepository_Tests : OpenIddictApplicationRepository_Tests +{ + +} \ No newline at end of file diff --git a/modules/openiddict/test/Volo.Abp.OpenIddict.MongoDB.Tests/Volo/Abp/OpenIddict/MongoDB/OpenIddictAuthorizationRepository_Tests.cs b/modules/openiddict/test/Volo.Abp.OpenIddict.MongoDB.Tests/Volo/Abp/OpenIddict/MongoDB/OpenIddictAuthorizationRepository_Tests.cs new file mode 100644 index 0000000000..1e71f74b6b --- /dev/null +++ b/modules/openiddict/test/Volo.Abp.OpenIddict.MongoDB.Tests/Volo/Abp/OpenIddict/MongoDB/OpenIddictAuthorizationRepository_Tests.cs @@ -0,0 +1,9 @@ +using Xunit; + +namespace Volo.Abp.OpenIddict.MongoDB; + +[Collection(MongoTestCollection.Name)] +public class OpenIddictAuthorizationRepository_Tests : OpenIddictAuthorizationRepository_Tests +{ + +} \ No newline at end of file diff --git a/modules/openiddict/test/Volo.Abp.OpenIddict.MongoDB.Tests/MongoDB/OpenIddictMongoDbTestBase.cs b/modules/openiddict/test/Volo.Abp.OpenIddict.MongoDB.Tests/Volo/Abp/OpenIddict/MongoDB/OpenIddictMongoDbTestBase.cs similarity index 100% rename from modules/openiddict/test/Volo.Abp.OpenIddict.MongoDB.Tests/MongoDB/OpenIddictMongoDbTestBase.cs rename to modules/openiddict/test/Volo.Abp.OpenIddict.MongoDB.Tests/Volo/Abp/OpenIddict/MongoDB/OpenIddictMongoDbTestBase.cs diff --git a/modules/openiddict/test/Volo.Abp.OpenIddict.MongoDB.Tests/Volo/Abp/OpenIddict/MongoDB/OpenIddictMongoDbTestModule.cs b/modules/openiddict/test/Volo.Abp.OpenIddict.MongoDB.Tests/Volo/Abp/OpenIddict/MongoDB/OpenIddictMongoDbTestModule.cs new file mode 100644 index 0000000000..60017fc99b --- /dev/null +++ b/modules/openiddict/test/Volo.Abp.OpenIddict.MongoDB.Tests/Volo/Abp/OpenIddict/MongoDB/OpenIddictMongoDbTestModule.cs @@ -0,0 +1,57 @@ +using System; +using Microsoft.Extensions.DependencyInjection; +using MongoDB.Driver; +using Volo.Abp.Data; +using Volo.Abp.Modularity; +using Volo.Abp.Identity.MongoDB; +using Volo.Abp.MongoDB; +using Volo.Abp.Uow; + +namespace Volo.Abp.OpenIddict.MongoDB; + +[DependsOn( + typeof(OpenIddictTestBaseModule), + typeof(AbpIdentityMongoDbModule), + typeof(AbpOpenIddictMongoDbModule) + )] +public class OpenIddictMongoDbTestModule : AbpModule +{ + private static string _connectionString; + + public override void ConfigureServices(ServiceConfigurationContext context) + { + var stringArray = MongoDbFixture.ConnectionString.Split('?'); + _connectionString = stringArray[0].EnsureEndsWith('/') + + "Db_" + + Guid.NewGuid().ToString("N") + "/?" + stringArray[1]; + + Configure(options => + { + options.ConnectionStrings.Default = _connectionString; + }); + } + + public override void OnPreApplicationInitialization(ApplicationInitializationContext context) + { + Migrate(context); + } + + private static void Migrate(ApplicationInitializationContext context) + { + var dbContexts = context.ServiceProvider.GetServices(); + + foreach (var dbContext in dbContexts) + { + var mongoUrl = new MongoUrl(_connectionString); + var databaseName = mongoUrl.DatabaseName; + var client = new MongoClient(mongoUrl); + + if (databaseName.IsNullOrWhiteSpace()) + { + databaseName = ConnectionStringNameAttribute.GetConnStringName(dbContext.GetType()); + } + + (dbContext as AbpMongoDbContext)?.InitializeCollections(client.GetDatabase(databaseName)); + } + } +} diff --git a/modules/openiddict/test/Volo.Abp.OpenIddict.MongoDB.Tests/Volo/Abp/OpenIddict/MongoDB/OpenIddictScopeRepository_Tests.cs b/modules/openiddict/test/Volo.Abp.OpenIddict.MongoDB.Tests/Volo/Abp/OpenIddict/MongoDB/OpenIddictScopeRepository_Tests.cs new file mode 100644 index 0000000000..58e2332df3 --- /dev/null +++ b/modules/openiddict/test/Volo.Abp.OpenIddict.MongoDB.Tests/Volo/Abp/OpenIddict/MongoDB/OpenIddictScopeRepository_Tests.cs @@ -0,0 +1,9 @@ +using Xunit; + +namespace Volo.Abp.OpenIddict.MongoDB; + +[Collection(MongoTestCollection.Name)] +public class OpenIddictScopeRepository_Tests : OpenIddictScopeRepository_Tests +{ + +} \ No newline at end of file diff --git a/modules/openiddict/test/Volo.Abp.OpenIddict.MongoDB.Tests/Volo/Abp/OpenIddict/MongoDB/OpenIddictTokenRepository_Tests.cs b/modules/openiddict/test/Volo.Abp.OpenIddict.MongoDB.Tests/Volo/Abp/OpenIddict/MongoDB/OpenIddictTokenRepository_Tests.cs new file mode 100644 index 0000000000..bbd88ba8f8 --- /dev/null +++ b/modules/openiddict/test/Volo.Abp.OpenIddict.MongoDB.Tests/Volo/Abp/OpenIddict/MongoDB/OpenIddictTokenRepository_Tests.cs @@ -0,0 +1,9 @@ +using Xunit; + +namespace Volo.Abp.OpenIddict.MongoDB; + +[Collection(MongoTestCollection.Name)] +public class OpenIddictTokenRepository_Tests : OpenIddictTokenRepository_Tests +{ + +} \ No newline at end of file diff --git a/modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/AbpOpenIddictTestData.cs b/modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/AbpOpenIddictTestData.cs deleted file mode 100644 index fdaf2d03a3..0000000000 --- a/modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/AbpOpenIddictTestData.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; - -namespace Volo.Abp.OpenIddict; - -public static class AbpOpenIddictTestData -{ - public static Guid App1Id { get; set; } = Guid.NewGuid(); - public static string App1ClientId { get; set; } = "Client1"; - public static Guid App2Id { get; set; } = Guid.NewGuid(); - public static string App2ClientId { get; set; } = "Client2"; - - public static Guid Scope1Id { get; set; } = Guid.NewGuid(); - public static string Scope1Name { get; set; } = "Scope1"; - public static Guid Scope2Id { get; set; } = Guid.NewGuid(); - public static string Scope2Name { get; set; } = "Scope2"; -} diff --git a/modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/Volo.Abp.OpenIddict.TestBase.abppkg.json b/modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/Volo.Abp.OpenIddict.TestBase.abppkg.json new file mode 100644 index 0000000000..a686451fbc --- /dev/null +++ b/modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/Volo.Abp.OpenIddict.TestBase.abppkg.json @@ -0,0 +1,3 @@ +{ + "role": "lib.test" +} \ No newline at end of file diff --git a/modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/Volo.Abp.OpenIddict.TestBase.csproj b/modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/Volo.Abp.OpenIddict.TestBase.csproj index f1ad7a1757..08d40ade84 100644 --- a/modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/Volo.Abp.OpenIddict.TestBase.csproj +++ b/modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/Volo.Abp.OpenIddict.TestBase.csproj @@ -8,13 +8,16 @@ - - - - - - + + + + + + + + + diff --git a/modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/Volo/Abp/OpenIddict/AbpOpenIddictTestData.cs b/modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/Volo/Abp/OpenIddict/AbpOpenIddictTestData.cs new file mode 100644 index 0000000000..f31208ed2f --- /dev/null +++ b/modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/Volo/Abp/OpenIddict/AbpOpenIddictTestData.cs @@ -0,0 +1,25 @@ +using System; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.OpenIddict; + +public class AbpOpenIddictTestData : ISingletonDependency +{ + public Guid App1Id { get; set; } = Guid.NewGuid(); + public string App1ClientId { get; set; } = "Client1"; + public Guid App2Id { get; set; } = Guid.NewGuid(); + public string App2ClientId { get; set; } = "Client2"; + + public Guid Scope1Id { get; set; } = Guid.NewGuid(); + public string Scope1Name { get; set; } = "Scope1"; + public Guid Scope2Id { get; set; } = Guid.NewGuid(); + public string Scope2Name { get; set; } = "Scope2"; + + public Guid Token1Id { get; set; } = Guid.NewGuid(); + + public Guid Token2Id { get; set; } = Guid.NewGuid(); + + public Guid Authorization1Id { get; set; } = Guid.NewGuid(); + + public Guid Authorization2Id { get; set; } = Guid.NewGuid(); +} \ No newline at end of file diff --git a/modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/Volo/Abp/OpenIddict/OpenIddictApplicationRepository_Tests.cs b/modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/Volo/Abp/OpenIddict/OpenIddictApplicationRepository_Tests.cs new file mode 100644 index 0000000000..b29c90f248 --- /dev/null +++ b/modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/Volo/Abp/OpenIddict/OpenIddictApplicationRepository_Tests.cs @@ -0,0 +1,65 @@ +using System.Threading.Tasks; +using Shouldly; +using Volo.Abp.Modularity; +using Volo.Abp.OpenIddict.Applications; +using Xunit; + +namespace Volo.Abp.OpenIddict; + +public abstract class OpenIddictApplicationRepository_Tests : OpenIddictTestBase + where TStartupModule : IAbpModule +{ + private readonly IOpenIddictApplicationRepository _applicationRepository; + private readonly AbpOpenIddictTestData _testData; + + protected OpenIddictApplicationRepository_Tests() + { + _applicationRepository = GetRequiredService(); + _testData = GetRequiredService(); + } + + [Fact] + public async Task GetListAsync() + { + (await _applicationRepository.GetListAsync()).Count.ShouldBe(2); + (await _applicationRepository.GetListAsync("id", 1, int.MaxValue)).Count.ShouldBe(1); + (await _applicationRepository.GetListAsync("id", 0, int.MaxValue, filter: _testData.App1ClientId)).Count.ShouldBe(1); + } + + [Fact] + public async Task GetCountAsync() + { + (await _applicationRepository.GetCountAsync()).ShouldBe(2); + (await _applicationRepository.GetCountAsync(filter: _testData.App1ClientId)).ShouldBe(1); + } + + [Fact] + public async Task FindByClientIdAsync() + { + var application = await _applicationRepository.FindByClientIdAsync(_testData.App1ClientId); + + application.ShouldNotBeNull(); + application.ClientId.ShouldBe(_testData.App1ClientId); + } + + [Fact] + public async Task FindByPostLogoutRedirectUriAsync() + { + var applications = await _applicationRepository.FindByPostLogoutRedirectUriAsync("https://abp.io"); + applications.Count.ShouldBe(2); + } + + [Fact] + public async Task FindByRedirectUriAsync() + { + var applications = await _applicationRepository.FindByRedirectUriAsync("https://abp.io"); + applications.Count.ShouldBe(2); + } + + [Fact] + public async Task ListAsync() + { + (await _applicationRepository.ListAsync(int.MaxValue , 0)).Count.ShouldBe(2); + (await _applicationRepository.ListAsync(int.MaxValue , 2)).Count.ShouldBe(0); + } +} \ No newline at end of file diff --git a/modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/Volo/Abp/OpenIddict/OpenIddictAuthorizationRepository_Tests.cs b/modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/Volo/Abp/OpenIddict/OpenIddictAuthorizationRepository_Tests.cs new file mode 100644 index 0000000000..72e82d6ebe --- /dev/null +++ b/modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/Volo/Abp/OpenIddict/OpenIddictAuthorizationRepository_Tests.cs @@ -0,0 +1,72 @@ +using System; +using System.Linq; +using System.Threading.Tasks; +using OpenIddict.Abstractions; +using Shouldly; +using Volo.Abp.Modularity; +using Volo.Abp.OpenIddict.Authorizations; +using Xunit; + +namespace Volo.Abp.OpenIddict; + +public abstract class OpenIddictAuthorizationRepository_Tests : OpenIddictTestBase + where TStartupModule : IAbpModule +{ + private readonly IOpenIddictAuthorizationRepository _authorizationRepository; + private readonly AbpOpenIddictTestData _testData; + + public OpenIddictAuthorizationRepository_Tests() + { + _authorizationRepository = GetRequiredService(); + _testData = GetRequiredService(); + } + + [Fact] + public async Task FindAsync() + { + (await _authorizationRepository.FindAsync(subject:"TestSubject1", client: new Guid())).Count.ShouldBe(0); + (await _authorizationRepository.FindAsync(subject:"TestSubject1", client: _testData.App1Id)).Count.ShouldBe(1); + (await _authorizationRepository.FindAsync(subject:"TestSubject1", client: _testData.App1Id, status: "NonExistsStatus")).Count.ShouldBe(0); + (await _authorizationRepository.FindAsync(subject:"TestSubject1", client: _testData.App1Id, status: "TestStatus1")).Count.ShouldBe(1); + (await _authorizationRepository.FindAsync(subject:"TestSubject1", client: _testData.App1Id, status: "TestStatus1" ,type: "NonExistsType")).Count.ShouldBe(0); + (await _authorizationRepository.FindAsync(subject:"TestSubject1", client: _testData.App1Id, status: "TestStatus1" ,type: OpenIddictConstants.AuthorizationTypes.Permanent)).Count.ShouldBe(1); + } + + [Fact] + public async Task FindByApplicationIdAsync() + { + var authorizations = await _authorizationRepository.FindByApplicationIdAsync(_testData.App1Id); + + authorizations.Count.ShouldBe(1); + authorizations.First().ApplicationId.ShouldBe(_testData.App1Id); + } + + [Fact] + public async Task FindByIdAsync() + { + var authorization = await _authorizationRepository.FindByIdAsync(_testData.Authorization1Id); + + authorization.ShouldNotBeNull(); + authorization.Id.ShouldBe(_testData.Authorization1Id); + } + + [Fact] + public async Task FindBySubjectAsync() + { + (await _authorizationRepository.FindBySubjectAsync(subject:"TestSubject1")).Count.ShouldBe(1); + } + + [Fact] + public async Task ListAsync() + { + (await _authorizationRepository.ListAsync(int.MaxValue, 0)).Count.ShouldBe(2); + (await _authorizationRepository.ListAsync(int.MaxValue, 2)).Count.ShouldBe(0); + } + + [Fact] + public async Task GetPruneListAsync() + { + var threshold = DateTime.UtcNow - TimeSpan.FromDays(14); + (await _authorizationRepository.GetPruneListAsync(threshold, int.MaxValue)).Count.ShouldBe(1); + } +} \ No newline at end of file diff --git a/modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/OpenIddictDataSeedContributor.cs b/modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/Volo/Abp/OpenIddict/OpenIddictDataSeedContributor.cs similarity index 54% rename from modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/OpenIddictDataSeedContributor.cs rename to modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/Volo/Abp/OpenIddict/OpenIddictDataSeedContributor.cs index cc045b3004..1b9dbed4ca 100644 --- a/modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/OpenIddictDataSeedContributor.cs +++ b/modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/Volo/Abp/OpenIddict/OpenIddictDataSeedContributor.cs @@ -2,43 +2,59 @@ using System.Globalization; using System.Threading.Tasks; using OpenIddict.Abstractions; +using OpenIddict.Core; using Volo.Abp.Data; using Volo.Abp.DependencyInjection; using Volo.Abp.Guids; using Volo.Abp.MultiTenancy; using Volo.Abp.OpenIddict.Applications; +using Volo.Abp.OpenIddict.Authorizations; using Volo.Abp.OpenIddict.Scopes; +using Volo.Abp.OpenIddict.Tokens; +using Volo.Abp.Timing; namespace Volo.Abp.OpenIddict; public class OpenIddictDataSeedContributor : IDataSeedContributor, ITransientDependency { - private readonly IGuidGenerator _guidGenerator; - private readonly ICurrentTenant _currentTenant; private readonly IOpenIddictApplicationManager _applicationManager; private readonly IOpenIddictScopeManager _scopeManager; + private readonly IOpenIddictTokenManager _tokenManager; + private readonly IOpenIddictAuthorizationManager _authorizationManager; + private readonly AbpOpenIddictTestData _testData; + private readonly IClock _clock; public OpenIddictDataSeedContributor( - IGuidGenerator guidGenerator, ICurrentTenant currentTenant, IOpenIddictApplicationManager applicationManager, IOpenIddictScopeManager scopeManager) + IOpenIddictApplicationManager applicationManager, + IOpenIddictScopeManager scopeManager, + IOpenIddictTokenManager tokenManager, + IOpenIddictAuthorizationManager authorizationManager, + IClock clock, + AbpOpenIddictTestData testData) { - _guidGenerator = guidGenerator; - _currentTenant = currentTenant; _applicationManager = applicationManager; _scopeManager = scopeManager; + _tokenManager = tokenManager; + _authorizationManager = authorizationManager; + _clock = clock; + _testData = testData; } public async Task SeedAsync(DataSeedContext context) { await CreateScopesAsync(); await CreateApplicationsAsync(); + await CreateAuthorizationsAsync(); + await CreateTokensAsync(); } private async Task CreateScopesAsync() { - var scope1 = (OpenIddictScopeModel)await _scopeManager.CreateAsync(new OpenIddictScopeDescriptor() + await _scopeManager.CreateAsync(await GetOpenIddictScopeModelAsync(_testData.Scope1Id, new OpenIddictScopeDescriptor { - Name = AbpOpenIddictTestData.Scope1Name, + Name = _testData.Scope1Name, DisplayName = "Test Scope 1", + Description = "Test Scope 1", DisplayNames = { [CultureInfo.GetCultureInfo("zh-Hans")] = "测试范围1", @@ -48,13 +64,13 @@ public class OpenIddictDataSeedContributor : IDataSeedContributor, ITransientDep { "TestScope1Resource" } - }); - AbpOpenIddictTestData.Scope1Id = scope1.Id; - - var scope2 = (OpenIddictScopeModel)await _scopeManager.CreateAsync(new OpenIddictScopeDescriptor() + })); + + await _scopeManager.CreateAsync(await GetOpenIddictScopeModelAsync(_testData.Scope2Id, new OpenIddictScopeDescriptor() { - Name = AbpOpenIddictTestData.Scope2Name, + Name = _testData.Scope2Name, DisplayName = "Test Scope 2", + Description = "Test Scope 2", DisplayNames = { [CultureInfo.GetCultureInfo("zh-Hans")] = "测试范围2", @@ -64,16 +80,21 @@ public class OpenIddictDataSeedContributor : IDataSeedContributor, ITransientDep { "TestScopeResource2" } - }); - AbpOpenIddictTestData.Scope2Id = scope2.Id; + })); } - + private async Task GetOpenIddictScopeModelAsync(Guid id, OpenIddictScopeDescriptor scopeDescriptor) + { + var scope = new OpenIddictScopeModel{Id = id}; + await _scopeManager.PopulateAsync(scope, scopeDescriptor); + return scope; + } + private async Task CreateApplicationsAsync() { - var app1 = (OpenIddictApplicationModel)await _applicationManager.CreateAsync(new OpenIddictApplicationDescriptor + await _applicationManager.CreateAsync(await GetOpenIddictApplicationModelAsync(_testData.App1Id, new OpenIddictApplicationDescriptor { - ClientId = AbpOpenIddictTestData.App1ClientId, + ClientId = _testData.App1ClientId, ConsentType = OpenIddictConstants.ConsentTypes.Explicit, DisplayName = "Test Application", RedirectUris = @@ -115,14 +136,13 @@ public class OpenIddictDataSeedContributor : IDataSeedContributor, ITransientDep OpenIddictConstants.Permissions.Scopes.Address, OpenIddictConstants.Permissions.Scopes.Phone, - OpenIddictConstants.Permissions.Prefixes.Scope + AbpOpenIddictTestData.Scope1Name + OpenIddictConstants.Permissions.Prefixes.Scope + _testData.Scope1Name } - }); - AbpOpenIddictTestData.App1Id = app1.Id; - - var app2 = (OpenIddictApplicationModel)await _applicationManager.CreateAsync(new OpenIddictApplicationDescriptor + })); + + await _applicationManager.CreateAsync(await GetOpenIddictApplicationModelAsync(_testData.App2Id, new OpenIddictApplicationDescriptor { - ClientId = AbpOpenIddictTestData.App2ClientId, + ClientId = _testData.App2ClientId, ConsentType = OpenIddictConstants.ConsentTypes.Explicit, DisplayName = "Test Application", RedirectUris = @@ -164,10 +184,79 @@ public class OpenIddictDataSeedContributor : IDataSeedContributor, ITransientDep OpenIddictConstants.Permissions.Scopes.Address, OpenIddictConstants.Permissions.Scopes.Phone, - OpenIddictConstants.Permissions.Prefixes.Scope + AbpOpenIddictTestData.Scope1Name, - OpenIddictConstants.Permissions.Prefixes.Scope + AbpOpenIddictTestData.Scope2Name, + OpenIddictConstants.Permissions.Prefixes.Scope + _testData.Scope1Name, + OpenIddictConstants.Permissions.Prefixes.Scope + _testData.Scope2Name, } - }); - AbpOpenIddictTestData.App2Id = app2.Id; + })); + } + + private async Task GetOpenIddictApplicationModelAsync(Guid id, OpenIddictApplicationDescriptor applicationDescriptor) + { + var application = new OpenIddictApplicationModel{Id = id}; + await _applicationManager.PopulateAsync(application, applicationDescriptor); + return application; + } + + private async Task CreateTokensAsync() + { + await _tokenManager.CreateAsync(await GetOpenIddictTokenModelAsync(_testData.Token1Id, new OpenIddictTokenDescriptor + { + ApplicationId = _testData.App1Id.ToString(), + AuthorizationId = _testData.Authorization1Id.ToString(), + Subject = "TestSubject1", + Type = "TestType1", + Status = OpenIddictConstants.Statuses.Redeemed, + Payload = "TestPayload1", + ReferenceId = "TestReferenceId1", + ExpirationDate = _clock.Now.AddDays(-30), + CreationDate = _clock.Now.AddDays(-30) + })); + + await _tokenManager.CreateAsync(await GetOpenIddictTokenModelAsync(_testData.Token2Id, new OpenIddictTokenDescriptor + { + ApplicationId = _testData.App2Id.ToString(), + AuthorizationId = _testData.Authorization2Id.ToString(), + Subject = "TestSubject2", + Type = "TestType2", + Status = OpenIddictConstants.Statuses.Valid, + Payload = "TestPayload2", + ReferenceId = "TestReferenceId2", + })); + } + + private async Task GetOpenIddictTokenModelAsync(Guid id, OpenIddictTokenDescriptor tokenDescriptor) + { + var token = new OpenIddictTokenModel{Id = id}; + await _tokenManager.PopulateAsync(token, tokenDescriptor); + return token; + } + + private async Task CreateAuthorizationsAsync() + { + await _authorizationManager.CreateAsync(await GetOpenIddictAuthorizationModelAsync(_testData.Authorization1Id, new OpenIddictAuthorizationDescriptor + { + ApplicationId = _testData.App1Id.ToString(), + Status = "TestStatus1", + Subject = "TestSubject1", + Type = OpenIddictConstants.AuthorizationTypes.Permanent, + CreationDate = _clock.Now.AddDays(-30) + + })); + + await _authorizationManager.CreateAsync(await GetOpenIddictAuthorizationModelAsync(_testData.Authorization2Id, new OpenIddictAuthorizationDescriptor + { + ApplicationId = _testData.App2Id.ToString(), + Status = "TestStatus2", + Subject = "TestSubject2", + Type = OpenIddictConstants.AuthorizationTypes.AdHoc, + CreationDate = _clock.Now + })); + } + + private async Task GetOpenIddictAuthorizationModelAsync(Guid id, OpenIddictAuthorizationDescriptor authorizationDescriptor) + { + var authorization = new OpenIddictAuthorizationModel{Id = id}; + await _authorizationManager.PopulateAsync(authorization, authorizationDescriptor); + return authorization; } } diff --git a/modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/Volo/Abp/OpenIddict/OpenIddictScopeRepository_Tests.cs b/modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/Volo/Abp/OpenIddict/OpenIddictScopeRepository_Tests.cs new file mode 100644 index 0000000000..1fcb0c31da --- /dev/null +++ b/modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/Volo/Abp/OpenIddict/OpenIddictScopeRepository_Tests.cs @@ -0,0 +1,71 @@ +using System.Threading.Tasks; +using Shouldly; +using Volo.Abp.Modularity; +using Volo.Abp.OpenIddict.Scopes; +using Xunit; + +namespace Volo.Abp.OpenIddict; + +public abstract class OpenIddictScopeRepository_Tests : OpenIddictTestBase + where TStartupModule : IAbpModule +{ + private readonly IOpenIddictScopeRepository _scopeRepository; + private readonly AbpOpenIddictTestData _testData; + + public OpenIddictScopeRepository_Tests() + { + _scopeRepository = GetRequiredService(); + _testData = GetRequiredService(); + } + + [Fact] + public async Task GetListAsync() + { + (await _scopeRepository.GetListAsync("id", 0, int.MaxValue)).Count.ShouldBe(2); + (await _scopeRepository.GetListAsync("id", 0, int.MaxValue, filter: _testData.Scope1Name)).Count.ShouldBe(1); + } + + [Fact] + public async Task GetCountAsync() + { + (await _scopeRepository.GetCountAsync()).ShouldBe(2); + (await _scopeRepository.GetCountAsync(filter: _testData.Scope1Name)).ShouldBe(1); + } + + [Fact] + public async Task FindByIdAsync() + { + var scope = await _scopeRepository.FindByIdAsync(_testData.Scope1Id); + + scope.ShouldNotBeNull(); + scope.Id.ShouldBe(_testData.Scope1Id); + } + + [Fact] + public async Task FindByNameAsync() + { + var scope = await _scopeRepository.FindByNameAsync(_testData.Scope1Name); + + scope.ShouldNotBeNull(); + scope.Name.ShouldBe(_testData.Scope1Name); + } + + [Fact] + public async Task FindByNamesAsync() + { + (await _scopeRepository.FindByNamesAsync(new []{_testData.Scope1Name, _testData.Scope2Name})).Count.ShouldBe(2); + } + + [Fact] + public async Task FindByResourceAsync() + { + (await _scopeRepository.FindByResourceAsync("TestScope1Resource")).Count.ShouldBe(1); + } + + [Fact] + public async Task ListAsync() + { + (await _scopeRepository.ListAsync(int.MaxValue, 0)).Count.ShouldBe(2); + (await _scopeRepository.ListAsync(int.MaxValue, 2)).Count.ShouldBe(0); + } +} \ No newline at end of file diff --git a/modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/OpenIddictTestBase.cs b/modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/Volo/Abp/OpenIddict/OpenIddictTestBase.cs similarity index 100% rename from modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/OpenIddictTestBase.cs rename to modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/Volo/Abp/OpenIddict/OpenIddictTestBase.cs diff --git a/modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/OpenIddictTestBaseModule.cs b/modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/Volo/Abp/OpenIddict/OpenIddictTestBaseModule.cs similarity index 100% rename from modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/OpenIddictTestBaseModule.cs rename to modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/Volo/Abp/OpenIddict/OpenIddictTestBaseModule.cs diff --git a/modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/Volo/Abp/OpenIddict/OpenIddictTokenRepository_Tests.cs b/modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/Volo/Abp/OpenIddict/OpenIddictTokenRepository_Tests.cs new file mode 100644 index 0000000000..4ed651eee6 --- /dev/null +++ b/modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/Volo/Abp/OpenIddict/OpenIddictTokenRepository_Tests.cs @@ -0,0 +1,104 @@ +using System; +using System.Threading.Tasks; +using OpenIddict.Abstractions; +using Shouldly; +using Volo.Abp.Modularity; +using Volo.Abp.OpenIddict.Tokens; +using Xunit; + +namespace Volo.Abp.OpenIddict; + +public abstract class OpenIddictTokenRepository_Tests : OpenIddictTestBase + where TStartupModule : IAbpModule +{ + private readonly IOpenIddictTokenRepository _tokenRepository; + private readonly AbpOpenIddictTestData _testData; + + public OpenIddictTokenRepository_Tests() + { + _tokenRepository = GetRequiredService(); + _testData = GetRequiredService(); + } + + [Fact] + public async Task DeleteManyByApplicationIdAsync() + { + await _tokenRepository.DeleteManyByApplicationIdAsync(new Guid()); + (await _tokenRepository.GetCountAsync()).ShouldBe(2); + + await _tokenRepository.DeleteManyByApplicationIdAsync(_testData.App1Id); + (await _tokenRepository.GetCountAsync()).ShouldBe(1); + } + + [Fact] + public async Task DeleteManyByAuthorizationIdAsync() + { + await _tokenRepository.DeleteManyByAuthorizationIdAsync(new Guid()); + (await _tokenRepository.GetCountAsync()).ShouldBe(2); + + await _tokenRepository.DeleteManyByAuthorizationIdAsync(_testData.Authorization1Id); + (await _tokenRepository.GetCountAsync()).ShouldBe(1); + } + + [Fact] + public async Task FindAsync() + { + (await _tokenRepository.FindAsync("TestSubject1", new Guid())).Count.ShouldBe(0); + (await _tokenRepository.FindAsync("TestSubject1", _testData.App1Id)).Count.ShouldBe(1); + (await _tokenRepository.FindAsync("TestSubject1", _testData.App1Id, "NonExistsStatus")).Count.ShouldBe(0); + (await _tokenRepository.FindAsync("TestSubject1", _testData.App1Id, OpenIddictConstants.Statuses.Redeemed)).Count.ShouldBe(1); + (await _tokenRepository.FindAsync("TestSubject1", _testData.App1Id, OpenIddictConstants.Statuses.Redeemed, "NonExistsType")).Count.ShouldBe(0); + (await _tokenRepository.FindAsync("TestSubject1", _testData.App1Id, OpenIddictConstants.Statuses.Redeemed, "TestType1")).Count.ShouldBe(1); + } + + [Fact] + public async Task FindByApplicationIdAsync() + { + (await _tokenRepository.FindByApplicationIdAsync(_testData.App1Id)).Count.ShouldBe(1); + } + + [Fact] + public async Task FindByAuthorizationIdAsync() + { + (await _tokenRepository.FindByAuthorizationIdAsync(_testData.Authorization1Id)).Count.ShouldBe(1); + } + + [Fact] + public async Task FindByIdAsync() + { + var token = await _tokenRepository.FindByIdAsync(_testData.Token1Id); + + token.ShouldNotBeNull(); + token.Id.ShouldBe(_testData.Token1Id); + } + + [Fact] + public async Task FindByReferenceIdAsync() + { + var token = await _tokenRepository.FindByIdAsync(_testData.Token1Id); + token = await _tokenRepository.FindByReferenceIdAsync(token.ReferenceId); + + token.ShouldNotBeNull(); + token.ReferenceId.ShouldBe(token.ReferenceId); + } + + [Fact] + public async Task FindBySubjectAsync() + { + (await _tokenRepository.FindBySubjectAsync("TestSubject1")).Count.ShouldBe(1); + } + + [Fact] + public async Task ListAsync() + { + (await _tokenRepository.ListAsync(int.MaxValue, 0)).Count.ShouldBe(2); + (await _tokenRepository.ListAsync(int.MaxValue, 2)).Count.ShouldBe(0); + } + + [Fact] + public async Task GetPruneListAsync() + { + var threshold = DateTime.UtcNow - TimeSpan.FromDays(14); + (await _tokenRepository.GetPruneListAsync(threshold, int.MaxValue)).Count.ShouldBe(1); + } +} \ No newline at end of file diff --git a/modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/Security/FakeCurrentPrincipalAccessor.cs b/modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/Volo/Abp/Security/FakeCurrentPrincipalAccessor.cs similarity index 100% rename from modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/Security/FakeCurrentPrincipalAccessor.cs rename to modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/Volo/Abp/Security/FakeCurrentPrincipalAccessor.cs diff --git a/modules/permission-management/Volo.Abp.PermissionManagement.abpmdl.json b/modules/permission-management/Volo.Abp.PermissionManagement.abpmdl.json index f40c2e27de..82dc87dade 100644 --- a/modules/permission-management/Volo.Abp.PermissionManagement.abpmdl.json +++ b/modules/permission-management/Volo.Abp.PermissionManagement.abpmdl.json @@ -73,10 +73,6 @@ "Volo.Abp.PermissionManagement.Blazor.WebAssembly": { "path": "src/Volo.Abp.PermissionManagement.Blazor.WebAssembly/Volo.Abp.PermissionManagement.Blazor.WebAssembly.abppkg.json", "folder": "src" - }, - "Volo.Abp.PermissionManagement.Installer": { - "path": "src/Volo.Abp.PermissionManagement.Installer/Volo.Abp.PermissionManagement.Installer.abppkg.json", - "folder": "src" } } } \ No newline at end of file diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Application.Contracts/Volo.Abp.PermissionManagement.Application.Contracts.abppkg.analyze.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Application.Contracts/Volo.Abp.PermissionManagement.Application.Contracts.abppkg.analyze.json index 290e84f392..1d93fdf421 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Application.Contracts/Volo.Abp.PermissionManagement.Application.Contracts.abppkg.analyze.json +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Application.Contracts/Volo.Abp.PermissionManagement.Application.Contracts.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.Abp.PermissionManagement.Application.Contracts", - "hash": "c71030d581b91d275b3dd93009c2185f", + "hash": "761a407cfc112e2c648d5c5cf50064e4", "contents": [ { "namespace": "Volo.Abp.PermissionManagement", diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Application.Contracts/Volo/Abp/PermissionManagement/PermissionGrantInfoDto.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Application.Contracts/Volo/Abp/PermissionManagement/PermissionGrantInfoDto.cs index b608a69b54..12e4010f99 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Application.Contracts/Volo/Abp/PermissionManagement/PermissionGrantInfoDto.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Application.Contracts/Volo/Abp/PermissionManagement/PermissionGrantInfoDto.cs @@ -7,6 +7,10 @@ public class PermissionGrantInfoDto public string Name { get; set; } public string DisplayName { get; set; } + + public string DisplayNameKey { get; set; } + + public string DisplayNameResource { get; set; } public string ParentName { get; set; } diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Application.Contracts/Volo/Abp/PermissionManagement/PermissionGroupDto.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Application.Contracts/Volo/Abp/PermissionManagement/PermissionGroupDto.cs index a138cd0451..b9cc6d5f90 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Application.Contracts/Volo/Abp/PermissionManagement/PermissionGroupDto.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Application.Contracts/Volo/Abp/PermissionManagement/PermissionGroupDto.cs @@ -7,6 +7,10 @@ public class PermissionGroupDto public string Name { get; set; } public string DisplayName { get; set; } + + public string DisplayNameKey { get; set; } + + public string DisplayNameResource { get; set; } public List Permissions { get; set; } } diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Application/Volo.Abp.PermissionManagement.Application.abppkg.analyze.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Application/Volo.Abp.PermissionManagement.Application.abppkg.analyze.json index 8e54490907..bb0296b33c 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Application/Volo.Abp.PermissionManagement.Application.abppkg.analyze.json +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Application/Volo.Abp.PermissionManagement.Application.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.Abp.PermissionManagement.Application", - "hash": "111aa17278856d07dcb113e05766b739", + "hash": "f51dd864d1a9bdb42aef9b7a4220b63a", "contents": [ { "namespace": "Volo.Abp.PermissionManagement", 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 d7d7f28820..fd0ccf0246 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 @@ -6,6 +6,7 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.Extensions.Options; using Volo.Abp.Application.Services; using Volo.Abp.Authorization.Permissions; +using Volo.Abp.Localization; using Volo.Abp.MultiTenancy; using Volo.Abp.SimpleStateChecking; @@ -43,14 +44,9 @@ public class PermissionAppService : ApplicationService, IPermissionAppService var multiTenancySide = CurrentTenant.GetMultiTenancySide(); - foreach (var group in PermissionDefinitionManager.GetGroups()) + foreach (var group in await PermissionDefinitionManager.GetGroupsAsync()) { - var groupDto = new PermissionGroupDto - { - Name = group.Name, - DisplayName = group.DisplayName.Localize(StringLocalizerFactory), - Permissions = new List() - }; + var groupDto = CreatePermissionGroupDto(group); var neededCheckPermissions = new List(); @@ -70,14 +66,9 @@ public class PermissionAppService : ApplicationService, IPermissionAppService continue; } - var grantInfoDtos = neededCheckPermissions.Select(x => new PermissionGrantInfoDto - { - Name = x.Name, - DisplayName = x.DisplayName.Localize(StringLocalizerFactory), - ParentName = x.Parent?.Name, - AllowedProviders = x.Providers, - GrantedProviders = new List() - }).ToList(); + var grantInfoDtos = neededCheckPermissions + .Select(CreatePermissionGrantInfoDto) + .ToList(); var multipleGrantInfo = await PermissionManager.GetAsync(neededCheckPermissions.Select(x => x.Name).ToArray(), providerName, providerKey); @@ -108,6 +99,39 @@ public class PermissionAppService : ApplicationService, IPermissionAppService return result; } + private PermissionGrantInfoDto CreatePermissionGrantInfoDto(PermissionDefinition permission) + { + var localizableDisplayName = permission.DisplayName as LocalizableString; + + return new PermissionGrantInfoDto { + Name = permission.Name, + DisplayName = permission.DisplayName.Localize(StringLocalizerFactory), + DisplayNameKey = localizableDisplayName?.Name, + DisplayNameResource = localizableDisplayName?.ResourceType != null + ? LocalizationResourceNameAttribute.GetName(localizableDisplayName.ResourceType) + : null, + ParentName = permission.Parent?.Name, + AllowedProviders = permission.Providers, + GrantedProviders = new List() + }; + } + + private PermissionGroupDto CreatePermissionGroupDto(PermissionGroupDefinition group) + { + var localizableDisplayName = group.DisplayName as LocalizableString; + + return new PermissionGroupDto + { + Name = group.Name, + DisplayName = group.DisplayName.Localize(StringLocalizerFactory), + DisplayNameKey = localizableDisplayName?.Name, + DisplayNameResource = localizableDisplayName?.ResourceType != null + ? LocalizationResourceNameAttribute.GetName(localizableDisplayName.ResourceType) + : null, + Permissions = new List() + }; + } + public virtual async Task UpdateAsync(string providerName, string providerKey, UpdatePermissionsDto input) { await CheckProviderPolicy(providerName); diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor/Components/PermissionManagementModal.razor.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor/Components/PermissionManagementModal.razor.cs index b477de008d..36358c1b95 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor/Components/PermissionManagementModal.razor.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor/Components/PermissionManagementModal.razor.cs @@ -4,7 +4,9 @@ using System.Linq; using System.Threading.Tasks; using Blazorise; using Microsoft.AspNetCore.Components; +using Microsoft.Extensions.Options; using Volo.Abp.AspNetCore.Components.Web.Configuration; +using Volo.Abp.Localization; using Volo.Abp.PermissionManagement.Localization; namespace Volo.Abp.PermissionManagement.Blazor.Components; @@ -14,6 +16,8 @@ public partial class PermissionManagementModal [Inject] protected IPermissionAppService PermissionAppService { get; set; } [Inject] protected ICurrentApplicationConfigurationCacheResetService CurrentApplicationConfigurationCacheResetService { get; set; } + [Inject] protected IOptions LocalizationOptions { get; set; } + protected Modal _modal; protected string _providerName; @@ -80,6 +84,8 @@ public partial class PermissionManagementModal var result = await PermissionAppService.GetAsync(_providerName, _providerKey); + UpdateLocalizations(result); + _entityDisplayName = entityDisplayName ?? result.EntityDisplayName; _groups = result.Groups; @@ -246,4 +252,47 @@ public partial class PermissionManagementModal eventArgs.Cancel = eventArgs.CloseReason == CloseReason.FocusLostClosing; return Task.CompletedTask; } + + protected virtual void UpdateLocalizations(GetPermissionListResultDto result) + { + foreach (var group in result.Groups) + { + group.DisplayName = Localize( + group.DisplayNameKey, + group.DisplayNameResource, + group.DisplayName + ); + + foreach (var permission in group.Permissions) + { + permission.DisplayName = Localize( + permission.DisplayNameKey, + permission.DisplayNameResource, + permission.DisplayName + ); + } + } + } + + protected virtual string Localize(string key, string resourceName, string fallbackValue) + { + if (key.IsNullOrEmpty() || resourceName.IsNullOrEmpty()) + { + return fallbackValue; + } + + var resource = LocalizationOptions.Value.Resources.GetOrNull(resourceName); + if (resource == null) + { + return fallbackValue; + } + + var result = new LocalizableString(resource.ResourceType, key).Localize(StringLocalizerFactory); + if (result.ResourceNotFound) + { + return fallbackValue; + } + + return result.Value; + } } diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo.Abp.PermissionManagement.Domain.Shared.abppkg.analyze.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo.Abp.PermissionManagement.Domain.Shared.abppkg.analyze.json index 273ebd4974..f0ad0cedd4 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo.Abp.PermissionManagement.Domain.Shared.abppkg.analyze.json +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo.Abp.PermissionManagement.Domain.Shared.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.Abp.PermissionManagement.Domain.Shared", - "hash": "94944d94fded88942ce31c2f803b9577", + "hash": "ef0b0405da04433da55a8a4bb09bcfc6", "contents": [ { "namespace": "Volo.Abp.PermissionManagement", diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/PermissionDefinitionRecordConsts.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/PermissionDefinitionRecordConsts.cs new file mode 100644 index 0000000000..93b1b465c6 --- /dev/null +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/PermissionDefinitionRecordConsts.cs @@ -0,0 +1,15 @@ +namespace Volo.Abp.PermissionManagement; + +public class PermissionDefinitionRecordConsts +{ + /// + /// Default value: 128 + /// + public static int MaxNameLength { get; set; } = 128; + + public static int MaxDisplayNameLength { get; set; } = 256; + + public static int MaxProvidersLength { get; set; } = 128; + + public static int MaxStateCheckersLength { get; set; } = 256; +} \ No newline at end of file diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/PermissionGrantConsts.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/PermissionGrantConsts.cs index 38a17340c5..630f5dc72e 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/PermissionGrantConsts.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/PermissionGrantConsts.cs @@ -2,11 +2,6 @@ public static class PermissionGrantConsts { - /// - /// Default value: 128 - /// - public static int MaxNameLength { get; set; } = 128; - /// /// Default value: 64 /// diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/PermissionGroupDefinitionRecordConsts.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/PermissionGroupDefinitionRecordConsts.cs new file mode 100644 index 0000000000..fb26c075b8 --- /dev/null +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/PermissionGroupDefinitionRecordConsts.cs @@ -0,0 +1,11 @@ +namespace Volo.Abp.PermissionManagement; + +public class PermissionGroupDefinitionRecordConsts +{ + /// + /// Default value: 128 + /// + public static int MaxNameLength { get; set; } = 128; + + public static int MaxDisplayNameLength { get; set; } = 256; +} \ No newline at end of file diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo.Abp.PermissionManagement.Domain.abppkg.analyze.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo.Abp.PermissionManagement.Domain.abppkg.analyze.json index dd22c93d75..297803927a 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo.Abp.PermissionManagement.Domain.abppkg.analyze.json +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo.Abp.PermissionManagement.Domain.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.Abp.PermissionManagement.Domain", - "hash": "6aed5a285610c53b3714ba717d73d675", + "hash": "db626b114b15f02f09d50652c81d3bb8", "contents": [ { "namespace": "Volo.Abp.PermissionManagement", @@ -10,7 +10,7 @@ { "namespace": "Volo.Abp.PermissionManagement", "summary": null, - "entityModel": { + "entityAnalyzeModel": { "namespace": "Volo.Abp.PermissionManagement", "primaryKeyType": "Guid", "summary": null, diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo.Abp.PermissionManagement.Domain.csproj b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo.Abp.PermissionManagement.Domain.csproj index d9cc5a058f..f9eb16d965 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo.Abp.PermissionManagement.Domain.csproj +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo.Abp.PermissionManagement.Domain.csproj @@ -23,4 +23,8 @@ + + + + diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/AbpPermissionManagementDomainModule.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/AbpPermissionManagementDomainModule.cs index 6dff7bf663..1e05590176 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/AbpPermissionManagementDomainModule.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/AbpPermissionManagementDomainModule.cs @@ -1,11 +1,19 @@ -using System.Collections.Generic; +using System; +using System.Threading; +using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; +using Polly; using Volo.Abp.Authorization; +using Volo.Abp.Authorization.Permissions; using Volo.Abp.Caching; +using Volo.Abp.DependencyInjection; using Volo.Abp.Domain; using Volo.Abp.Json; using Volo.Abp.Modularity; +using Volo.Abp.Threading; namespace Volo.Abp.PermissionManagement; @@ -16,5 +24,124 @@ namespace Volo.Abp.PermissionManagement; [DependsOn(typeof(AbpJsonModule))] public class AbpPermissionManagementDomainModule : AbpModule { + private readonly CancellationTokenSource _cancellationTokenSource = new(); + + public override Task OnApplicationInitializationAsync(ApplicationInitializationContext context) + { + InitializeDynamicPermissions(context); + return Task.CompletedTask; + } -} + public override Task OnApplicationShutdownAsync(ApplicationShutdownContext context) + { + _cancellationTokenSource.Cancel(); + return Task.CompletedTask; + } + + private void InitializeDynamicPermissions(ApplicationInitializationContext context) + { + var options = context + .ServiceProvider + .GetRequiredService>() + .Value; + + if (!options.SaveStaticPermissionsToDatabase && !options.IsDynamicPermissionStoreEnabled) + { + return; + } + + var rootServiceProvider = context.ServiceProvider.GetRequiredService(); + + Task.Run(async () => + { + using var scope = rootServiceProvider.CreateScope(); + var applicationLifetime = scope.ServiceProvider.GetService(); + var cancellationTokenProvider = scope.ServiceProvider.GetRequiredService(); + var cancellationToken = applicationLifetime?.ApplicationStopping ?? _cancellationTokenSource.Token; + + try + { + using (cancellationTokenProvider.Use(cancellationToken)) + { + if (cancellationTokenProvider.Token.IsCancellationRequested) + { + return; + } + + await SaveStaticPermissionsToDatabaseAsync(options, scope, cancellationTokenProvider); + + if (cancellationTokenProvider.Token.IsCancellationRequested) + { + return; + } + + await PreCacheDynamicPermissionsAsync(options, scope); + } + } + // ReSharper disable once EmptyGeneralCatchClause (No need to log since it is logged above) + catch { } + }); + } + + private async static Task SaveStaticPermissionsToDatabaseAsync( + PermissionManagementOptions options, + IServiceScope scope, + ICancellationTokenProvider cancellationTokenProvider) + { + if (!options.SaveStaticPermissionsToDatabase) + { + return; + } + + await Policy + .Handle() + .WaitAndRetryAsync(8, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt) * 10)) + .ExecuteAsync(async _ => + { + try + { + // ReSharper disable once AccessToDisposedClosure + await scope + .ServiceProvider + .GetRequiredService() + .SaveAsync(); + } + catch (Exception ex) + { + // ReSharper disable once AccessToDisposedClosure + scope.ServiceProvider + .GetService>()? + .LogException(ex); + + throw; // Polly will catch it + } + }, cancellationTokenProvider.Token); + } + + private async static Task PreCacheDynamicPermissionsAsync(PermissionManagementOptions options, IServiceScope scope) + { + if (!options.IsDynamicPermissionStoreEnabled) + { + return; + } + + try + { + // Pre-cache permissions, so first request doesn't wait + await scope + .ServiceProvider + .GetRequiredService() + .GetGroupsAsync(); + } + catch (Exception ex) + { + // ReSharper disable once AccessToDisposedClosure + scope + .ServiceProvider + .GetService>()? + .LogException(ex); + + throw; // It will be cached in InitializeDynamicPermissions + } + } +} \ No newline at end of file diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/DynamicPermissionDefinitionStore.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/DynamicPermissionDefinitionStore.cs new file mode 100644 index 0000000000..f2e73cefc0 --- /dev/null +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/DynamicPermissionDefinitionStore.cs @@ -0,0 +1,171 @@ +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading.Tasks; +using Microsoft.Extensions.Caching.Distributed; +using Microsoft.Extensions.Options; +using Volo.Abp.Authorization.Permissions; +using Volo.Abp.Caching; +using Volo.Abp.DependencyInjection; +using Volo.Abp.DistributedLocking; +using Volo.Abp.Threading; + +namespace Volo.Abp.PermissionManagement; + +[Dependency(ReplaceServices = true)] +public class DynamicPermissionDefinitionStore : IDynamicPermissionDefinitionStore, ITransientDependency +{ + protected IPermissionGroupDefinitionRecordRepository PermissionGroupRepository { get; } + protected IPermissionDefinitionRecordRepository PermissionRepository { get; } + protected IPermissionDefinitionSerializer PermissionDefinitionSerializer { get; } + protected IDynamicPermissionDefinitionStoreInMemoryCache StoreCache { get; } + protected IDistributedCache DistributedCache { get; } + protected IAbpDistributedLock DistributedLock { get; } + public PermissionManagementOptions PermissionManagementOptions { get; } + protected AbpDistributedCacheOptions CacheOptions { get; } + + public DynamicPermissionDefinitionStore( + IPermissionGroupDefinitionRecordRepository permissionGroupRepository, + IPermissionDefinitionRecordRepository permissionRepository, + IPermissionDefinitionSerializer permissionDefinitionSerializer, + IDynamicPermissionDefinitionStoreInMemoryCache storeCache, + IDistributedCache distributedCache, + IOptions cacheOptions, + IOptions permissionManagementOptions, + IAbpDistributedLock distributedLock) + { + PermissionGroupRepository = permissionGroupRepository; + PermissionRepository = permissionRepository; + PermissionDefinitionSerializer = permissionDefinitionSerializer; + StoreCache = storeCache; + DistributedCache = distributedCache; + DistributedLock = distributedLock; + PermissionManagementOptions = permissionManagementOptions.Value; + CacheOptions = cacheOptions.Value; + } + + public virtual async Task GetOrNullAsync(string name) + { + if (!PermissionManagementOptions.IsDynamicPermissionStoreEnabled) + { + return null; + } + + using (await StoreCache.SyncSemaphore.LockAsync()) + { + await EnsureCacheIsUptoDateAsync(); + return StoreCache.GetPermissionOrNull(name); + } + } + + public virtual async Task> GetPermissionsAsync() + { + if (!PermissionManagementOptions.IsDynamicPermissionStoreEnabled) + { + return Array.Empty(); + } + + using (await StoreCache.SyncSemaphore.LockAsync()) + { + await EnsureCacheIsUptoDateAsync(); + return StoreCache.GetPermissions().ToImmutableList(); + } + } + + public virtual async Task> GetGroupsAsync() + { + if (!PermissionManagementOptions.IsDynamicPermissionStoreEnabled) + { + return Array.Empty(); + } + + using (await StoreCache.SyncSemaphore.LockAsync()) + { + await EnsureCacheIsUptoDateAsync(); + return StoreCache.GetGroups().ToImmutableList(); + } + } + + protected virtual async Task EnsureCacheIsUptoDateAsync() + { + if (StoreCache.LastCheckTime.HasValue && + DateTime.Now.Subtract(StoreCache.LastCheckTime.Value).TotalSeconds < 30) + { + /* We get the latest permission with a small delay for optimization */ + return; + } + + var stampInDistributedCache = await GetOrSetStampInDistributedCache(); + + if (stampInDistributedCache == StoreCache.CacheStamp) + { + StoreCache.LastCheckTime = DateTime.Now; + return; + } + + await UpdateInMemoryStoreCache(); + + StoreCache.CacheStamp = stampInDistributedCache; + StoreCache.LastCheckTime = DateTime.Now; + } + + protected virtual async Task UpdateInMemoryStoreCache() + { + var permissionGroupRecords = await PermissionGroupRepository.GetListAsync(); + var permissionRecords = await PermissionRepository.GetListAsync(); + + await StoreCache.FillAsync(permissionGroupRecords, permissionRecords); + } + + protected virtual async Task GetOrSetStampInDistributedCache() + { + var cacheKey = GetCommonStampCacheKey(); + + var stampInDistributedCache = await DistributedCache.GetStringAsync(cacheKey); + if (stampInDistributedCache != null) + { + return stampInDistributedCache; + } + + await using (var commonLockHandle = await DistributedLock + .TryAcquireAsync(GetCommonDistributedLockKey(), TimeSpan.FromMinutes(2))) + { + if (commonLockHandle == null) + { + /* This request will fail */ + throw new AbpException( + "Could not acquire distributed lock for permission definition common stamp check!" + ); + } + + stampInDistributedCache = await DistributedCache.GetStringAsync(cacheKey); + if (stampInDistributedCache != null) + { + return stampInDistributedCache; + } + + stampInDistributedCache = Guid.NewGuid().ToString(); + + await DistributedCache.SetStringAsync( + cacheKey, + stampInDistributedCache, + new DistributedCacheEntryOptions + { + SlidingExpiration = TimeSpan.FromDays(30) //TODO: Make it configurable? + } + ); + } + + return stampInDistributedCache; + } + + protected virtual string GetCommonStampCacheKey() + { + return $"{CacheOptions.KeyPrefix}_AbpInMemoryPermissionCacheStamp"; + } + + protected virtual string GetCommonDistributedLockKey() + { + return $"{CacheOptions.KeyPrefix}_Common_AbpPermissionUpdateLock"; + } +} \ No newline at end of file diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/DynamicPermissionDefinitionStoreInMemoryCache.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/DynamicPermissionDefinitionStoreInMemoryCache.cs new file mode 100644 index 0000000000..3b09c922dc --- /dev/null +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/DynamicPermissionDefinitionStoreInMemoryCache.cs @@ -0,0 +1,127 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Volo.Abp.Authorization.Permissions; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Localization; +using Volo.Abp.SimpleStateChecking; + +namespace Volo.Abp.PermissionManagement; + +public class DynamicPermissionDefinitionStoreInMemoryCache : + IDynamicPermissionDefinitionStoreInMemoryCache, + ISingletonDependency +{ + public string CacheStamp { get; set; } + + protected IDictionary PermissionGroupDefinitions { get; } + protected IDictionary PermissionDefinitions { get; } + protected ISimpleStateCheckerSerializer StateCheckerSerializer { get; } + protected ILocalizableStringSerializer LocalizableStringSerializer { get; } + + public SemaphoreSlim SyncSemaphore { get; } = new(1, 1); + + public DateTime? LastCheckTime { get; set; } + + public DynamicPermissionDefinitionStoreInMemoryCache( + ISimpleStateCheckerSerializer stateCheckerSerializer, + ILocalizableStringSerializer localizableStringSerializer) + { + StateCheckerSerializer = stateCheckerSerializer; + LocalizableStringSerializer = localizableStringSerializer; + + PermissionGroupDefinitions = new Dictionary(); + PermissionDefinitions = new Dictionary(); + } + + public Task FillAsync( + List permissionGroupRecords, + List permissionRecords) + { + PermissionGroupDefinitions.Clear(); + PermissionDefinitions.Clear(); + + var context = new PermissionDefinitionContext(null); + + foreach (var permissionGroupRecord in permissionGroupRecords) + { + var permissionGroup = context.AddGroup( + permissionGroupRecord.Name, + LocalizableStringSerializer.Deserialize(permissionGroupRecord.DisplayName) + ); + + PermissionGroupDefinitions[permissionGroup.Name] = permissionGroup; + + foreach (var property in permissionGroupRecord.ExtraProperties) + { + permissionGroup[property.Key] = property.Value; + } + + var permissionRecordsInThisGroup = permissionRecords + .Where(p => p.GroupName == permissionGroup.Name); + + foreach (var permissionRecord in permissionRecordsInThisGroup.Where(x => x.ParentName == null)) + { + AddPermissionRecursively(permissionGroup, permissionRecord, permissionRecords); + } + } + + return Task.CompletedTask; + } + + public PermissionDefinition GetPermissionOrNull(string name) + { + return PermissionDefinitions.GetOrDefault(name); + } + + public IReadOnlyList GetPermissions() + { + return PermissionDefinitions.Values.ToList(); + } + + public IReadOnlyList GetGroups() + { + return PermissionGroupDefinitions.Values.ToList(); + } + + private void AddPermissionRecursively(ICanAddChildPermission permissionContainer, + PermissionDefinitionRecord permissionRecord, + List allPermissionRecords) + { + var permission = permissionContainer.AddPermission( + permissionRecord.Name, + LocalizableStringSerializer.Deserialize(permissionRecord.DisplayName), + permissionRecord.MultiTenancySide, + permissionRecord.IsEnabled + ); + + PermissionDefinitions[permission.Name] = permission; + + if (!permissionRecord.Providers.IsNullOrWhiteSpace()) + { + permission.Providers.AddRange(permissionRecord.Providers.Split(',')); + } + + if (!permissionRecord.StateCheckers.IsNullOrWhiteSpace()) + { + var checkers = StateCheckerSerializer + .DeserializeArray( + permissionRecord.StateCheckers, + permission + ); + permission.StateCheckers.AddRange(checkers); + } + + foreach (var property in permissionRecord.ExtraProperties) + { + permission[property.Key] = property.Value; + } + + foreach (var subPermission in allPermissionRecords.Where(p => p.ParentName == permissionRecord.Name)) + { + AddPermissionRecursively(permission, subPermission, allPermissionRecords); + } + } +} \ No newline at end of file diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/IDynamicPermissionDefinitionStoreInMemoryCache.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/IDynamicPermissionDefinitionStoreInMemoryCache.cs new file mode 100644 index 0000000000..2dab588ebd --- /dev/null +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/IDynamicPermissionDefinitionStoreInMemoryCache.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using Volo.Abp.Authorization.Permissions; + +namespace Volo.Abp.PermissionManagement; + +public interface IDynamicPermissionDefinitionStoreInMemoryCache +{ + string CacheStamp { get; set; } + + SemaphoreSlim SyncSemaphore { get; } + + DateTime? LastCheckTime { get; set; } + + Task FillAsync( + List permissionGroupRecords, + List permissionRecords); + + PermissionDefinition GetPermissionOrNull(string name); + + IReadOnlyList GetPermissions(); + + IReadOnlyList GetGroups(); +} \ No newline at end of file diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/IPermissionDefinitionRecordRepository.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/IPermissionDefinitionRecordRepository.cs new file mode 100644 index 0000000000..e332d8483d --- /dev/null +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/IPermissionDefinitionRecordRepository.cs @@ -0,0 +1,13 @@ +using System; +using System.Threading; +using System.Threading.Tasks; +using Volo.Abp.Domain.Repositories; + +namespace Volo.Abp.PermissionManagement; + +public interface IPermissionDefinitionRecordRepository : IBasicRepository +{ + Task FindByNameAsync( + string name, + CancellationToken cancellationToken = default); +} \ No newline at end of file diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/IPermissionDefinitionSerializer.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/IPermissionDefinitionSerializer.cs new file mode 100644 index 0000000000..8ed09a4380 --- /dev/null +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/IPermissionDefinitionSerializer.cs @@ -0,0 +1,19 @@ +using System.Collections.Generic; +using System.Threading.Tasks; +using JetBrains.Annotations; +using Volo.Abp.Authorization.Permissions; + +namespace Volo.Abp.PermissionManagement; + +public interface IPermissionDefinitionSerializer +{ + Task<(PermissionGroupDefinitionRecord[], PermissionDefinitionRecord[])> + SerializeAsync(IEnumerable permissionGroups); + + Task SerializeAsync( + PermissionGroupDefinition permissionGroup); + + Task SerializeAsync( + PermissionDefinition permission, + [CanBeNull] PermissionGroupDefinition permissionGroup); +} \ No newline at end of file diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/IPermissionGroupDefinitionRecordRepository.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/IPermissionGroupDefinitionRecordRepository.cs new file mode 100644 index 0000000000..984adbe72d --- /dev/null +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/IPermissionGroupDefinitionRecordRepository.cs @@ -0,0 +1,9 @@ +using System; +using Volo.Abp.Domain.Repositories; + +namespace Volo.Abp.PermissionManagement; + +public interface IPermissionGroupDefinitionRecordRepository : IBasicRepository +{ + +} \ No newline at end of file diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/IStaticPermissionSaver.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/IStaticPermissionSaver.cs new file mode 100644 index 0000000000..5c91636c3d --- /dev/null +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/IStaticPermissionSaver.cs @@ -0,0 +1,8 @@ +using System.Threading.Tasks; + +namespace Volo.Abp.PermissionManagement; + +public interface IStaticPermissionSaver +{ + Task SaveAsync(); +} \ No newline at end of file diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionDataSeedContributor.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionDataSeedContributor.cs index d0a98eb593..71570aafce 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionDataSeedContributor.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionDataSeedContributor.cs @@ -23,17 +23,16 @@ public class PermissionDataSeedContributor : IDataSeedContributor, ITransientDep CurrentTenant = currentTenant; } - public virtual Task SeedAsync(DataSeedContext context) + public virtual async Task SeedAsync(DataSeedContext context) { var multiTenancySide = CurrentTenant.GetMultiTenancySide(); - var permissionNames = PermissionDefinitionManager - .GetPermissions() + var permissionNames = (await PermissionDefinitionManager.GetPermissionsAsync()) .Where(p => p.MultiTenancySide.HasFlag(multiTenancySide)) .Where(p => !p.Providers.Any() || p.Providers.Contains(RolePermissionValueProvider.ProviderName)) .Select(p => p.Name) .ToArray(); - return PermissionDataSeeder.SeedAsync( + await PermissionDataSeeder.SeedAsync( RolePermissionValueProvider.ProviderName, "admin", permissionNames, diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionDefinitionRecord.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionDefinitionRecord.cs new file mode 100644 index 0000000000..2ba9ffa26a --- /dev/null +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionDefinitionRecord.cs @@ -0,0 +1,175 @@ +using System; +using System.Text.Json.Serialization; +using Volo.Abp.Data; +using Volo.Abp.Domain.Entities; +using Volo.Abp.MultiTenancy; + +namespace Volo.Abp.PermissionManagement; + +public class PermissionDefinitionRecord : BasicAggregateRoot, IHasExtraProperties +{ + /* Ignoring Id because it is different whenever we create an instance of + * this class, and we are using Json Serialize, than Hash to understand + * if permission definitions have changed (in StaticPermissionSaver.CalculateHash()). + */ + [JsonIgnore] + public override Guid Id { get; protected set; } + + public string GroupName { get; set; } + + public string Name { get; set; } + + public string ParentName { get; set; } + + public string DisplayName { get; set; } + + public bool IsEnabled { get; set; } + + public MultiTenancySides MultiTenancySide { get; set; } + + /// + /// Comma separated list of provider names. + /// + public string Providers { get; set; } + + /// + /// Serialized string to store info about the state checkers. + /// + public string StateCheckers { get; set; } + + public ExtraPropertyDictionary ExtraProperties { get; protected set; } + + public PermissionDefinitionRecord() + { + ExtraProperties = new ExtraPropertyDictionary(); + this.SetDefaultsForExtraProperties(); + } + + public PermissionDefinitionRecord( + Guid id, + string groupName, + string name, + string parentName, + string displayName, + bool isEnabled = true, + MultiTenancySides multiTenancySide = MultiTenancySides.Both, + string providers = null, + string stateCheckers = null) + : base(id) + { + GroupName = Check.NotNullOrWhiteSpace(groupName, nameof(groupName), PermissionGroupDefinitionRecordConsts.MaxNameLength); + Name = Check.NotNullOrWhiteSpace(name, nameof(name), PermissionDefinitionRecordConsts.MaxNameLength); + ParentName = Check.Length(parentName, nameof(parentName), PermissionDefinitionRecordConsts.MaxNameLength); + DisplayName = Check.NotNullOrWhiteSpace(displayName, nameof(displayName), PermissionDefinitionRecordConsts.MaxDisplayNameLength); + IsEnabled = isEnabled; + MultiTenancySide = multiTenancySide; + Providers = providers; + StateCheckers = stateCheckers; + + ExtraProperties = new ExtraPropertyDictionary(); + this.SetDefaultsForExtraProperties(); + } + + public bool HasSameData(PermissionDefinitionRecord otherRecord) + { + if (Name != otherRecord.Name) + { + return false; + } + + if (GroupName != otherRecord.GroupName) + { + return false; + } + + if (ParentName != otherRecord.ParentName) + { + return false; + } + + if (DisplayName != otherRecord.DisplayName) + { + return false; + } + + if (IsEnabled != otherRecord.IsEnabled) + { + return false; + } + + if (MultiTenancySide != otherRecord.MultiTenancySide) + { + return false; + } + + if (Providers != otherRecord.Providers) + { + return false; + } + + if (StateCheckers != otherRecord.StateCheckers) + { + return false; + } + + if (!this.HasSameExtraProperties(otherRecord)) + { + return false; + } + + return true; + } + + public void Patch(PermissionDefinitionRecord otherRecord) + { + if (Name != otherRecord.Name) + { + Name = otherRecord.Name; + } + + if (GroupName != otherRecord.GroupName) + { + GroupName = otherRecord.GroupName; + } + + if (ParentName != otherRecord.ParentName) + { + ParentName = otherRecord.ParentName; + } + + if (DisplayName != otherRecord.DisplayName) + { + DisplayName = otherRecord.DisplayName; + } + + if (IsEnabled != otherRecord.IsEnabled) + { + IsEnabled = otherRecord.IsEnabled; + } + + if (MultiTenancySide != otherRecord.MultiTenancySide) + { + MultiTenancySide = otherRecord.MultiTenancySide; + } + + if (Providers != otherRecord.Providers) + { + Providers = otherRecord.Providers; + } + + if (StateCheckers != otherRecord.StateCheckers) + { + StateCheckers = otherRecord.StateCheckers; + } + + if (!this.HasSameExtraProperties(otherRecord)) + { + this.ExtraProperties.Clear(); + + foreach (var property in otherRecord.ExtraProperties) + { + this.ExtraProperties.Add(property.Key, property.Value); + } + } + } +} \ No newline at end of file diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionDefinitionSerializer.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionDefinitionSerializer.cs new file mode 100644 index 0000000000..8e63342502 --- /dev/null +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionDefinitionSerializer.cs @@ -0,0 +1,106 @@ +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Threading.Tasks; +using Volo.Abp.Authorization.Permissions; +using Volo.Abp.Data; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Guids; +using Volo.Abp.Localization; +using Volo.Abp.SimpleStateChecking; + +namespace Volo.Abp.PermissionManagement; + +public class PermissionDefinitionSerializer : IPermissionDefinitionSerializer, ITransientDependency +{ + protected ISimpleStateCheckerSerializer StateCheckerSerializer { get; } + protected IGuidGenerator GuidGenerator { get; } + protected ILocalizableStringSerializer LocalizableStringSerializer { get; } + + public PermissionDefinitionSerializer( + IGuidGenerator guidGenerator, + ISimpleStateCheckerSerializer stateCheckerSerializer, + ILocalizableStringSerializer localizableStringSerializer) + { + StateCheckerSerializer = stateCheckerSerializer; + LocalizableStringSerializer = localizableStringSerializer; + GuidGenerator = guidGenerator; + } + + public async Task<(PermissionGroupDefinitionRecord[], PermissionDefinitionRecord[])> + SerializeAsync(IEnumerable permissionGroups) + { + var permissionGroupRecords = new List(); + var permissionRecords = new List(); + + foreach (var permissionGroup in permissionGroups) + { + permissionGroupRecords.Add(await SerializeAsync(permissionGroup)); + + foreach (var permission in permissionGroup.GetPermissionsWithChildren()) + { + permissionRecords.Add(await SerializeAsync(permission, permissionGroup)); + } + } + + return (permissionGroupRecords.ToArray(), permissionRecords.ToArray()); + } + + public Task SerializeAsync(PermissionGroupDefinition permissionGroup) + { + using (CultureHelper.Use(CultureInfo.InvariantCulture)) + { + var permissionGroupRecord = new PermissionGroupDefinitionRecord( + GuidGenerator.Create(), + permissionGroup.Name, + LocalizableStringSerializer.Serialize(permissionGroup.DisplayName) + ); + + foreach (var property in permissionGroup.Properties) + { + permissionGroupRecord.SetProperty(property.Key, property.Value); + } + + return Task.FromResult(permissionGroupRecord); + } + } + + public Task SerializeAsync( + PermissionDefinition permission, + PermissionGroupDefinition permissionGroup) + { + using (CultureHelper.Use(CultureInfo.InvariantCulture)) + { + var permissionRecord = new PermissionDefinitionRecord( + GuidGenerator.Create(), + permissionGroup?.Name, + permission.Name, + permission.Parent?.Name, + LocalizableStringSerializer.Serialize(permission.DisplayName), + permission.IsEnabled, + permission.MultiTenancySide, + SerializeProviders(permission.Providers), + SerializeStateCheckers(permission.StateCheckers) + ); + + foreach (var property in permission.Properties) + { + permissionRecord.SetProperty(property.Key, property.Value); + } + + return Task.FromResult(permissionRecord); + } + } + + protected virtual string SerializeProviders(ICollection providers) + { + return providers.Any() + ? providers.JoinAsString(",") + : null; + } + + protected virtual string SerializeStateCheckers(List> stateCheckers) + { + return StateCheckerSerializer.Serialize(stateCheckers); + } +} \ No newline at end of file diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionGroupDefinitionRecord.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionGroupDefinitionRecord.cs new file mode 100644 index 0000000000..f93bf57e21 --- /dev/null +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionGroupDefinitionRecord.cs @@ -0,0 +1,84 @@ +using System; +using System.Text.Json.Serialization; +using Volo.Abp.Data; +using Volo.Abp.Domain.Entities; + +namespace Volo.Abp.PermissionManagement; + +public class PermissionGroupDefinitionRecord : BasicAggregateRoot, IHasExtraProperties +{ + /* Ignoring Id because it is different whenever we create an instance of + * this class, and we are using Json Serialize, than Hash to understand + * if permission definitions have changed (in StaticPermissionSaver.CalculateHash()). + */ + [JsonIgnore] + public override Guid Id { get; protected set; } + + public string Name { get; set; } + + public string DisplayName { get; set; } + + public ExtraPropertyDictionary ExtraProperties { get; protected set; } + + public PermissionGroupDefinitionRecord() + { + ExtraProperties = new ExtraPropertyDictionary(); + this.SetDefaultsForExtraProperties(); + } + + public PermissionGroupDefinitionRecord( + Guid id, + string name, + string displayName) + : base(id) + { + Name = Check.NotNullOrWhiteSpace(name, nameof(name), PermissionGroupDefinitionRecordConsts.MaxNameLength); + DisplayName = Check.NotNullOrWhiteSpace(displayName, nameof(displayName), PermissionGroupDefinitionRecordConsts.MaxDisplayNameLength);; + + ExtraProperties = new ExtraPropertyDictionary(); + this.SetDefaultsForExtraProperties(); + } + + public bool HasSameData(PermissionGroupDefinitionRecord otherRecord) + { + if (Name != otherRecord.Name) + { + return false; + } + + if (DisplayName != otherRecord.DisplayName) + { + return false; + } + + if (!this.HasSameExtraProperties(otherRecord)) + { + return false; + } + + return true; + } + + public void Patch(PermissionGroupDefinitionRecord otherRecord) + { + if (Name != otherRecord.Name) + { + Name = otherRecord.Name; + } + + if (DisplayName != otherRecord.DisplayName) + { + DisplayName = otherRecord.DisplayName; + } + + if (!this.HasSameExtraProperties(otherRecord)) + { + this.ExtraProperties.Clear(); + + foreach (var property in otherRecord.ExtraProperties) + { + this.ExtraProperties.Add(property.Key, property.Value); + } + } + } +} \ No newline at end of file diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionManagementOptions.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionManagementOptions.cs index 15da755a33..2109941a27 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionManagementOptions.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionManagementOptions.cs @@ -8,10 +8,27 @@ public class PermissionManagementOptions public ITypeList ManagementProviders { get; } public Dictionary ProviderPolicies { get; } + + public HashSet DeletedPermissions { get; } + + public HashSet DeletedPermissionGroups { get; } + + /// + /// Default: true. + /// + public bool SaveStaticPermissionsToDatabase { get; set; } = true; + + /// + /// Default: false. + /// + public bool IsDynamicPermissionStoreEnabled { get; set; } public PermissionManagementOptions() { ManagementProviders = new TypeList(); ProviderPolicies = new Dictionary(); + + DeletedPermissions = new HashSet(); + DeletedPermissionGroups = new HashSet(); } } diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionManager.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionManager.cs index 2e709c49c2..b664e5c92d 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionManager.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionManager.cs @@ -62,18 +62,62 @@ public class PermissionManager : IPermissionManager, ISingletonDependency public virtual async Task GetAsync(string permissionName, string providerName, string providerKey) { - return await GetInternalAsync(PermissionDefinitionManager.Get(permissionName), providerName, providerKey); + var permission = await PermissionDefinitionManager.GetOrNullAsync(permissionName); + if (permission == null) + { + return new PermissionWithGrantedProviders(permissionName, false); + } + + return await GetInternalAsync( + permission, + providerName, + providerKey + ); } - public virtual async Task GetAsync(string[] permissionNames, string providerName, string providerKey) + public virtual async Task GetAsync( + string[] permissionNames, + string providerName, + string providerKey) { - var permissionDefinitions = permissionNames.Select(x => PermissionDefinitionManager.Get(x)).ToArray(); - return await GetInternalAsync(permissionDefinitions, providerName, providerKey); + var permissions = new List(); + var undefinedPermissions = new List(); + + foreach (var permissionName in permissionNames) + { + var permission = await PermissionDefinitionManager.GetOrNullAsync(permissionName); + if (permission != null) + { + permissions.Add(permission); + } + else + { + undefinedPermissions.Add(permissionName); + } + } + + if (!permissions.Any()) + { + return new MultiplePermissionWithGrantedProviders(undefinedPermissions.ToArray()); + } + + var result = await GetInternalAsync( + permissions.ToArray(), + providerName, + providerKey + ); + + foreach (var undefinedPermission in undefinedPermissions) + { + result.Result.Add(new PermissionWithGrantedProviders(undefinedPermission, false)); + } + + return result; } public virtual async Task> GetAllAsync(string providerName, string providerKey) { - var permissionDefinitions = PermissionDefinitionManager.GetPermissions().ToArray(); + var permissionDefinitions = (await PermissionDefinitionManager.GetPermissionsAsync()).ToArray(); var multiplePermissionWithGrantedProviders = await GetInternalAsync(permissionDefinitions, providerName, providerKey); @@ -83,7 +127,13 @@ public class PermissionManager : IPermissionManager, ISingletonDependency public virtual async Task SetAsync(string permissionName, string providerName, string providerKey, bool isGranted) { - var permission = PermissionDefinitionManager.Get(permissionName); + var permission = await PermissionDefinitionManager.GetOrNullAsync(permissionName); + if (permission == null) + { + /* Silently ignore undefined permissions, + maybe they were removed from dynamic permission definition store */ + return; + } if (!permission.IsEnabled || !await SimpleStateCheckerManager.IsEnabledAsync(permission)) { @@ -146,14 +196,24 @@ public class PermissionManager : IPermissionManager, ISingletonDependency } } - protected virtual async Task GetInternalAsync(PermissionDefinition permission, string providerName, string providerKey) + protected virtual async Task GetInternalAsync( + PermissionDefinition permission, + string providerName, + string providerKey) { - var multiplePermissionWithGrantedProviders = await GetInternalAsync(new PermissionDefinition[] { permission }, providerName, providerKey); + var multiplePermissionWithGrantedProviders = await GetInternalAsync( + new[] { permission }, + providerName, + providerKey + ); return multiplePermissionWithGrantedProviders.Result.First(); } - protected virtual async Task GetInternalAsync(PermissionDefinition[] permissions, string providerName, string providerKey) + protected virtual async Task GetInternalAsync( + PermissionDefinition[] permissions, + string providerName, + string providerKey) { var permissionNames = permissions.Select(x => x.Name).ToArray(); var multiplePermissionWithGrantedProviders = new MultiplePermissionWithGrantedProviders(permissionNames); diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionStore.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionStore.cs index 5dd4e14ed0..6eed394a31 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionStore.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionStore.cs @@ -67,7 +67,7 @@ public class PermissionStore : IPermissionStore, ITransientDependency string currentName, PermissionGrantCacheItem currentCacheItem) { - var permissions = PermissionDefinitionManager.GetPermissions(); + var permissions = await PermissionDefinitionManager.GetPermissionsAsync(); Logger.LogDebug($"Getting all granted permissions from the repository for this provider name,key: {providerName},{providerKey}"); @@ -169,7 +169,8 @@ public class PermissionStore : IPermissionStore, ITransientDependency string providerKey, List notCacheKeys) { - var permissions = PermissionDefinitionManager.GetPermissions().Where(x => notCacheKeys.Any(k => GetPermissionNameFormCacheKeyOrNull(k) == x.Name)).ToList(); + var permissions = (await PermissionDefinitionManager.GetPermissionsAsync()) + .Where(x => notCacheKeys.Any(k => GetPermissionNameFormCacheKeyOrNull(k) == x.Name)).ToList(); Logger.LogDebug($"Getting not cache granted permissions from the repository for this provider name,key: {providerName},{providerKey}"); diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/StaticPermissionSaver.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/StaticPermissionSaver.cs new file mode 100644 index 0000000000..5754031509 --- /dev/null +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/StaticPermissionSaver.cs @@ -0,0 +1,294 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.Json; +using System.Threading.Tasks; +using Microsoft.Extensions.Caching.Distributed; +using Microsoft.Extensions.Options; +using Volo.Abp.Authorization.Permissions; +using Volo.Abp.Caching; +using Volo.Abp.DependencyInjection; +using Volo.Abp.DistributedLocking; +using Volo.Abp.Threading; +using Volo.Abp.Uow; + +namespace Volo.Abp.PermissionManagement; + +public class StaticPermissionSaver : IStaticPermissionSaver, ITransientDependency +{ + protected IStaticPermissionDefinitionStore StaticStore { get; } + protected IPermissionGroupDefinitionRecordRepository PermissionGroupRepository { get; } + protected IPermissionDefinitionRecordRepository PermissionRepository { get; } + protected IPermissionDefinitionSerializer PermissionSerializer { get; } + protected IDistributedCache Cache { get; } + protected IApplicationNameAccessor ApplicationNameAccessor { get; } + protected IAbpDistributedLock DistributedLock { get; } + protected PermissionManagementOptions PermissionManagementOptions { get; } + protected ICancellationTokenProvider CancellationTokenProvider { get; } + protected AbpDistributedCacheOptions CacheOptions { get; } + + public StaticPermissionSaver( + IStaticPermissionDefinitionStore staticStore, + IPermissionGroupDefinitionRecordRepository permissionGroupRepository, + IPermissionDefinitionRecordRepository permissionRepository, + IPermissionDefinitionSerializer permissionSerializer, + IDistributedCache cache, + IOptions cacheOptions, + IApplicationNameAccessor applicationNameAccessor, + IAbpDistributedLock distributedLock, + IOptions permissionManagementOptions, + ICancellationTokenProvider cancellationTokenProvider) + { + StaticStore = staticStore; + PermissionGroupRepository = permissionGroupRepository; + PermissionRepository = permissionRepository; + PermissionSerializer = permissionSerializer; + Cache = cache; + ApplicationNameAccessor = applicationNameAccessor; + DistributedLock = distributedLock; + CancellationTokenProvider = cancellationTokenProvider; + PermissionManagementOptions = permissionManagementOptions.Value; + CacheOptions = cacheOptions.Value; + } + + [UnitOfWork] + public virtual async Task SaveAsync() + { + await using var applicationLockHandle = await DistributedLock.TryAcquireAsync( + GetApplicationDistributedLockKey() + ); + + if (applicationLockHandle == null) + { + /* Another application instance is already doing it */ + return; + } + + /* NOTE: This can be further optimized by using 4 cache values for: + * Groups, permissions, deleted groups and deleted permissions. + * But the code would be more complex. This is enough for now. + */ + + var cacheKey = GetApplicationHashCacheKey(); + var cachedHash = await Cache.GetStringAsync(cacheKey, CancellationTokenProvider.Token); + + var (permissionGroupRecords, permissionRecords) = await PermissionSerializer.SerializeAsync( + await StaticStore.GetGroupsAsync() + ); + + var currentHash = CalculateHash( + permissionGroupRecords, + permissionRecords, + PermissionManagementOptions.DeletedPermissionGroups, + PermissionManagementOptions.DeletedPermissions + ); + + if (cachedHash == currentHash) + { + return; + } + + await using (var commonLockHandle = await DistributedLock.TryAcquireAsync( + GetCommonDistributedLockKey(), + TimeSpan.FromMinutes(5))) + { + if (commonLockHandle == null) + { + /* It will re-try */ + throw new AbpException("Could not acquire distributed lock for saving static permissions!"); + } + + var hasChangesInGroups = await UpdateChangedPermissionGroupsAsync(permissionGroupRecords); + var hasChangesInPermissions = await UpdateChangedPermissionsAsync(permissionRecords); + + if (hasChangesInGroups ||hasChangesInPermissions) + { + await Cache.SetStringAsync( + GetCommonStampCacheKey(), + Guid.NewGuid().ToString(), + new DistributedCacheEntryOptions { + SlidingExpiration = TimeSpan.FromDays(30) //TODO: Make it configurable? + }, + CancellationTokenProvider.Token + ); + } + } + + await Cache.SetStringAsync( + cacheKey, + currentHash, + new DistributedCacheEntryOptions { + SlidingExpiration = TimeSpan.FromDays(30) //TODO: Make it configurable? + }, + CancellationTokenProvider.Token + ); + } + + private async Task UpdateChangedPermissionGroupsAsync( + IEnumerable permissionGroupRecords) + { + var newRecords = new List(); + var changedRecords = new List(); + + var permissionGroupRecordsInDatabase = (await PermissionGroupRepository.GetListAsync()) + .ToDictionary(x => x.Name); + + foreach (var permissionGroupRecord in permissionGroupRecords) + { + var permissionGroupRecordInDatabase = permissionGroupRecordsInDatabase.GetOrDefault(permissionGroupRecord.Name); + if (permissionGroupRecordInDatabase == null) + { + /* New group */ + newRecords.Add(permissionGroupRecord); + continue; + } + + if (permissionGroupRecord.HasSameData(permissionGroupRecordInDatabase)) + { + /* Not changed */ + continue; + } + + /* Changed */ + permissionGroupRecordInDatabase.Patch(permissionGroupRecord); + changedRecords.Add(permissionGroupRecordInDatabase); + } + + /* Deleted */ + var deletedRecords = PermissionManagementOptions.DeletedPermissionGroups.Any() + ? permissionGroupRecordsInDatabase.Values + .Where(x => PermissionManagementOptions.DeletedPermissionGroups.Contains(x.Name)) + .ToArray() + : Array.Empty(); + + if (newRecords.Any()) + { + await PermissionGroupRepository.InsertManyAsync(newRecords); + } + + if (changedRecords.Any()) + { + await PermissionGroupRepository.UpdateManyAsync(changedRecords); + } + + if (deletedRecords.Any()) + { + await PermissionGroupRepository.DeleteManyAsync(deletedRecords); + } + + return newRecords.Any() || changedRecords.Any() || deletedRecords.Any(); + } + + private async Task UpdateChangedPermissionsAsync( + IEnumerable permissionRecords) + { + var newRecords = new List(); + var changedRecords = new List(); + + var permissionRecordsInDatabase = (await PermissionRepository.GetListAsync()) + .ToDictionary(x => x.Name); + + foreach (var permissionRecord in permissionRecords) + { + var permissionRecordInDatabase = permissionRecordsInDatabase.GetOrDefault(permissionRecord.Name); + if (permissionRecordInDatabase == null) + { + /* New group */ + newRecords.Add(permissionRecord); + continue; + } + + if (permissionRecord.HasSameData(permissionRecordInDatabase)) + { + /* Not changed */ + continue; + } + + /* Changed */ + permissionRecordInDatabase.Patch(permissionRecord); + changedRecords.Add(permissionRecordInDatabase); + } + + /* Deleted */ + var deletedRecords = new List(); + + if (PermissionManagementOptions.DeletedPermissions.Any()) + { + deletedRecords.AddRange( + permissionRecordsInDatabase.Values + .Where(x => PermissionManagementOptions.DeletedPermissions.Contains(x.Name)) + ); + } + + if (PermissionManagementOptions.DeletedPermissionGroups.Any()) + { + deletedRecords.AddIfNotContains( + permissionRecordsInDatabase.Values + .Where(x => PermissionManagementOptions.DeletedPermissionGroups.Contains(x.GroupName)) + ); + } + + if (newRecords.Any()) + { + await PermissionRepository.InsertManyAsync(newRecords); + } + + if (changedRecords.Any()) + { + await PermissionRepository.UpdateManyAsync(changedRecords); + } + + if (deletedRecords.Any()) + { + await PermissionRepository.DeleteManyAsync(deletedRecords); + } + + return newRecords.Any() || changedRecords.Any() || deletedRecords.Any(); + } + + private string GetApplicationDistributedLockKey() + { + return $"{CacheOptions.KeyPrefix}_{ApplicationNameAccessor.ApplicationName}_AbpPermissionUpdateLock"; + } + + private string GetCommonDistributedLockKey() + { + return $"{CacheOptions.KeyPrefix}_Common_AbpPermissionUpdateLock"; + } + + private string GetApplicationHashCacheKey() + { + return $"{CacheOptions.KeyPrefix}_{ApplicationNameAccessor.ApplicationName}_AbpPermissionsHash"; + } + + private string GetCommonStampCacheKey() + { + return $"{CacheOptions.KeyPrefix}_AbpInMemoryPermissionCacheStamp"; + } + + private static string CalculateHash( + PermissionGroupDefinitionRecord[] permissionGroupRecords, + PermissionDefinitionRecord[] permissionRecords, + IEnumerable deletedPermissionGroups, + IEnumerable deletedPermissions) + { + var stringBuilder = new StringBuilder(); + + stringBuilder.Append("PermissionGroupRecords:"); + stringBuilder.AppendLine(JsonSerializer.Serialize(permissionGroupRecords)); + + stringBuilder.Append("PermissionRecords:"); + stringBuilder.AppendLine(JsonSerializer.Serialize(permissionRecords)); + + stringBuilder.Append("DeletedPermissionGroups:"); + stringBuilder.AppendLine(deletedPermissionGroups.JoinAsString(",")); + + stringBuilder.Append("DeletedPermission:"); + stringBuilder.Append(deletedPermissions.JoinAsString(",")); + + return stringBuilder + .ToString() + .ToMd5(); + } +} \ No newline at end of file diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.EntityFrameworkCore/Volo.Abp.PermissionManagement.EntityFrameworkCore.abppkg.analyze.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.EntityFrameworkCore/Volo.Abp.PermissionManagement.EntityFrameworkCore.abppkg.analyze.json index d23a7ad2aa..caf446b3f3 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.EntityFrameworkCore/Volo.Abp.PermissionManagement.EntityFrameworkCore.abppkg.analyze.json +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.EntityFrameworkCore/Volo.Abp.PermissionManagement.EntityFrameworkCore.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.Abp.PermissionManagement.EntityFrameworkCore", - "hash": "f8289209c0d9289ce4320a5a163ce631", + "hash": "9135b32df96ebabe2b2ab7710c087a20", "contents": [ { "namespace": "Volo.Abp.PermissionManagement.EntityFrameworkCore", diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.EntityFrameworkCore/Volo/Abp/PermissionManagement/EntityFrameworkCore/AbpPermissionManagementDbContextModelBuilderExtensions.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.EntityFrameworkCore/Volo/Abp/PermissionManagement/EntityFrameworkCore/AbpPermissionManagementDbContextModelBuilderExtensions.cs index bf9aa570a7..c901cbeb7f 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.EntityFrameworkCore/Volo/Abp/PermissionManagement/EntityFrameworkCore/AbpPermissionManagementDbContextModelBuilderExtensions.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.EntityFrameworkCore/Volo/Abp/PermissionManagement/EntityFrameworkCore/AbpPermissionManagementDbContextModelBuilderExtensions.cs @@ -1,5 +1,6 @@ using JetBrains.Annotations; using Microsoft.EntityFrameworkCore; +using Volo.Abp.Authorization.Permissions; using Volo.Abp.EntityFrameworkCore.Modeling; namespace Volo.Abp.PermissionManagement.EntityFrameworkCore; @@ -17,11 +18,44 @@ public static class AbpPermissionManagementDbContextModelBuilderExtensions b.ConfigureByConvention(); - b.Property(x => x.Name).HasMaxLength(PermissionGrantConsts.MaxNameLength).IsRequired(); + b.Property(x => x.Name).HasMaxLength(PermissionDefinitionRecordConsts.MaxNameLength).IsRequired(); b.Property(x => x.ProviderName).HasMaxLength(PermissionGrantConsts.MaxProviderNameLength).IsRequired(); b.Property(x => x.ProviderKey).HasMaxLength(PermissionGrantConsts.MaxProviderKeyLength).IsRequired(); - b.HasIndex(x => new { x.TenantId, x.Name, x.ProviderName, x.ProviderKey }).IsUnique(true); + b.HasIndex(x => new { x.TenantId, x.Name, x.ProviderName, x.ProviderKey }).IsUnique(); + + b.ApplyObjectExtensionMappings(); + }); + + builder.Entity(b => + { + b.ToTable(AbpPermissionManagementDbProperties.DbTablePrefix + "PermissionGroups", AbpPermissionManagementDbProperties.DbSchema); + + b.ConfigureByConvention(); + + b.Property(x => x.Name).HasMaxLength(PermissionGroupDefinitionRecordConsts.MaxNameLength).IsRequired(); + b.Property(x => x.DisplayName).HasMaxLength(PermissionGroupDefinitionRecordConsts.MaxDisplayNameLength).IsRequired(); + + b.HasIndex(x => new { x.Name }).IsUnique(); + + b.ApplyObjectExtensionMappings(); + }); + + builder.Entity(b => + { + b.ToTable(AbpPermissionManagementDbProperties.DbTablePrefix + "Permissions", AbpPermissionManagementDbProperties.DbSchema); + + b.ConfigureByConvention(); + + b.Property(x => x.GroupName).HasMaxLength(PermissionGroupDefinitionRecordConsts.MaxNameLength).IsRequired(); + b.Property(x => x.Name).HasMaxLength(PermissionDefinitionRecordConsts.MaxNameLength).IsRequired(); + b.Property(x => x.ParentName).HasMaxLength(PermissionDefinitionRecordConsts.MaxNameLength); + b.Property(x => x.DisplayName).HasMaxLength(PermissionDefinitionRecordConsts.MaxDisplayNameLength).IsRequired(); + b.Property(x => x.Providers).HasMaxLength(PermissionDefinitionRecordConsts.MaxProvidersLength); + b.Property(x => x.StateCheckers).HasMaxLength(PermissionDefinitionRecordConsts.MaxStateCheckersLength); + + b.HasIndex(x => new { x.Name }).IsUnique(); + b.HasIndex(x => new { x.GroupName }); b.ApplyObjectExtensionMappings(); }); diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.EntityFrameworkCore/Volo/Abp/PermissionManagement/EntityFrameworkCore/AbpPermissionManagementEntityFrameworkCoreModule.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.EntityFrameworkCore/Volo/Abp/PermissionManagement/EntityFrameworkCore/AbpPermissionManagementEntityFrameworkCoreModule.cs index 6d7451c5e9..ebcc8527c1 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.EntityFrameworkCore/Volo/Abp/PermissionManagement/EntityFrameworkCore/AbpPermissionManagementEntityFrameworkCoreModule.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.EntityFrameworkCore/Volo/Abp/PermissionManagement/EntityFrameworkCore/AbpPermissionManagementEntityFrameworkCoreModule.cs @@ -14,6 +14,8 @@ public class AbpPermissionManagementEntityFrameworkCoreModule : AbpModule { options.AddDefaultRepositories(); + options.AddRepository(); + options.AddRepository(); options.AddRepository(); }); } diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.EntityFrameworkCore/Volo/Abp/PermissionManagement/EntityFrameworkCore/EfCorePermissionDefinitionRecordRepository.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.EntityFrameworkCore/Volo/Abp/PermissionManagement/EntityFrameworkCore/EfCorePermissionDefinitionRecordRepository.cs new file mode 100644 index 0000000000..09cf408f7d --- /dev/null +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.EntityFrameworkCore/Volo/Abp/PermissionManagement/EntityFrameworkCore/EfCorePermissionDefinitionRecordRepository.cs @@ -0,0 +1,29 @@ +using System; +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.PermissionManagement.EntityFrameworkCore; + +public class EfCorePermissionDefinitionRecordRepository : + EfCoreRepository, + IPermissionDefinitionRecordRepository +{ + public EfCorePermissionDefinitionRecordRepository( + IDbContextProvider dbContextProvider) + : base(dbContextProvider) + { + } + + public async Task FindByNameAsync( + string name, + CancellationToken cancellationToken = default) + { + return await (await GetDbSetAsync()) + .OrderBy(x => x.Id) + .FirstOrDefaultAsync(r => r.Name == name, cancellationToken); + } +} \ No newline at end of file diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.EntityFrameworkCore/Volo/Abp/PermissionManagement/EntityFrameworkCore/EfCorePermissionGrantRepository.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.EntityFrameworkCore/Volo/Abp/PermissionManagement/EntityFrameworkCore/EfCorePermissionGrantRepository.cs index 6345f69735..a080d39d87 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.EntityFrameworkCore/Volo/Abp/PermissionManagement/EntityFrameworkCore/EfCorePermissionGrantRepository.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.EntityFrameworkCore/Volo/Abp/PermissionManagement/EntityFrameworkCore/EfCorePermissionGrantRepository.cs @@ -9,7 +9,8 @@ using Volo.Abp.EntityFrameworkCore; namespace Volo.Abp.PermissionManagement.EntityFrameworkCore; -public class EfCorePermissionGrantRepository : EfCoreRepository, +public class EfCorePermissionGrantRepository : + EfCoreRepository, IPermissionGrantRepository { public EfCorePermissionGrantRepository(IDbContextProvider dbContextProvider) diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.EntityFrameworkCore/Volo/Abp/PermissionManagement/EntityFrameworkCore/EfCorePermissionGroupDefinitionRecordRepository.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.EntityFrameworkCore/Volo/Abp/PermissionManagement/EntityFrameworkCore/EfCorePermissionGroupDefinitionRecordRepository.cs new file mode 100644 index 0000000000..923d238761 --- /dev/null +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.EntityFrameworkCore/Volo/Abp/PermissionManagement/EntityFrameworkCore/EfCorePermissionGroupDefinitionRecordRepository.cs @@ -0,0 +1,16 @@ +using System; +using Volo.Abp.Domain.Repositories.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore; + +namespace Volo.Abp.PermissionManagement.EntityFrameworkCore; + +public class EfCorePermissionGroupDefinitionRecordRepository : + EfCoreRepository, + IPermissionGroupDefinitionRecordRepository +{ + public EfCorePermissionGroupDefinitionRecordRepository( + IDbContextProvider dbContextProvider) + : base(dbContextProvider) + { + } +} \ No newline at end of file diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.EntityFrameworkCore/Volo/Abp/PermissionManagement/EntityFrameworkCore/IPermissionManagementDbContext.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.EntityFrameworkCore/Volo/Abp/PermissionManagement/EntityFrameworkCore/IPermissionManagementDbContext.cs index 174ba1762a..c294c1b248 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.EntityFrameworkCore/Volo/Abp/PermissionManagement/EntityFrameworkCore/IPermissionManagementDbContext.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.EntityFrameworkCore/Volo/Abp/PermissionManagement/EntityFrameworkCore/IPermissionManagementDbContext.cs @@ -7,5 +7,9 @@ namespace Volo.Abp.PermissionManagement.EntityFrameworkCore; [ConnectionStringName(AbpPermissionManagementDbProperties.ConnectionStringName)] public interface IPermissionManagementDbContext : IEfCoreDbContext { + DbSet PermissionGroups { get; } + + DbSet Permissions { get; } + DbSet PermissionGrants { get; } } diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.EntityFrameworkCore/Volo/Abp/PermissionManagement/EntityFrameworkCore/PermissionManagementDbContext.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.EntityFrameworkCore/Volo/Abp/PermissionManagement/EntityFrameworkCore/PermissionManagementDbContext.cs index f1183eec16..fe143fa8ae 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.EntityFrameworkCore/Volo/Abp/PermissionManagement/EntityFrameworkCore/PermissionManagementDbContext.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.EntityFrameworkCore/Volo/Abp/PermissionManagement/EntityFrameworkCore/PermissionManagementDbContext.cs @@ -7,6 +7,8 @@ namespace Volo.Abp.PermissionManagement.EntityFrameworkCore; [ConnectionStringName(AbpPermissionManagementDbProperties.ConnectionStringName)] public class PermissionManagementDbContext : AbpDbContext, IPermissionManagementDbContext { + public DbSet PermissionGroups { get; set; } + public DbSet Permissions { get; set; } public DbSet PermissionGrants { get; set; } public PermissionManagementDbContext(DbContextOptions options) diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.HttpApi.Client/Volo.Abp.PermissionManagement.HttpApi.Client.abppkg.analyze.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.HttpApi.Client/Volo.Abp.PermissionManagement.HttpApi.Client.abppkg.analyze.json index d4fd903ed2..38e0e9e284 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.HttpApi.Client/Volo.Abp.PermissionManagement.HttpApi.Client.abppkg.analyze.json +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.HttpApi.Client/Volo.Abp.PermissionManagement.HttpApi.Client.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.Abp.PermissionManagement.HttpApi.Client", - "hash": "7000b975c242b79c82d95da010220d50", + "hash": "1b9f52d21ca5d9c7e6f7662ccc27b7c3", "contents": [ { "namespace": "Volo.Abp.PermissionManagement", diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.HttpApi/Volo.Abp.PermissionManagement.HttpApi.abppkg.analyze.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.HttpApi/Volo.Abp.PermissionManagement.HttpApi.abppkg.analyze.json index eb48bb597b..083e081b61 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.HttpApi/Volo.Abp.PermissionManagement.HttpApi.abppkg.analyze.json +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.HttpApi/Volo.Abp.PermissionManagement.HttpApi.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.Abp.PermissionManagement.HttpApi", - "hash": "378c3d034d1c15192395da445181ef87", + "hash": "2eac8fbb963e8043e3a860f91b2299d9", "contents": [ { "namespace": "Volo.Abp.PermissionManagement.HttpApi", diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Installer/Volo.Abp.PermissionManagement.Installer.abppkg.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Installer/Volo.Abp.PermissionManagement.Installer.abppkg.json deleted file mode 100644 index 9e26dfeeb6..0000000000 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Installer/Volo.Abp.PermissionManagement.Installer.abppkg.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Installer/Volo.Abp.PermissionManagement.Installer.csproj b/modules/permission-management/src/Volo.Abp.PermissionManagement.Installer/Volo.Abp.PermissionManagement.Installer.csproj index c1fa844501..7667987ab3 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Installer/Volo.Abp.PermissionManagement.Installer.csproj +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Installer/Volo.Abp.PermissionManagement.Installer.csproj @@ -4,19 +4,21 @@ - net5.0 + net6.0 true - + + + diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.MongoDB/Volo.Abp.PermissionManagement.MongoDB.abppkg.analyze.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.MongoDB/Volo.Abp.PermissionManagement.MongoDB.abppkg.analyze.json index ec315eb7f1..716bb1da98 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.MongoDB/Volo.Abp.PermissionManagement.MongoDB.abppkg.analyze.json +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.MongoDB/Volo.Abp.PermissionManagement.MongoDB.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.Abp.PermissionManagement.MongoDB", - "hash": "56f2712fd206ad7dee9f2a2116935af1", + "hash": "7baac61b4f919f381459d4d7e606c7b9", "contents": [ { "namespace": "Volo.Abp.PermissionManagement.MongoDB", diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.MongoDB/Volo/Abp/PermissionManagement/MongoDb/AbpPermissionManagementMongoDbContextExtensions.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.MongoDB/Volo/Abp/PermissionManagement/MongoDb/AbpPermissionManagementMongoDbContextExtensions.cs index a3d1461e58..9c7c90af58 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.MongoDB/Volo/Abp/PermissionManagement/MongoDb/AbpPermissionManagementMongoDbContextExtensions.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.MongoDB/Volo/Abp/PermissionManagement/MongoDb/AbpPermissionManagementMongoDbContextExtensions.cs @@ -9,6 +9,16 @@ public static class AbpPermissionManagementMongoDbContextExtensions { Check.NotNull(builder, nameof(builder)); + builder.Entity(b => + { + b.CollectionName = AbpPermissionManagementDbProperties.DbTablePrefix + "PermissionGroups"; + }); + + builder.Entity(b => + { + b.CollectionName = AbpPermissionManagementDbProperties.DbTablePrefix + "Permissions"; + }); + builder.Entity(b => { b.CollectionName = AbpPermissionManagementDbProperties.DbTablePrefix + "PermissionGrants"; diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.MongoDB/Volo/Abp/PermissionManagement/MongoDb/AbpPermissionManagementMongoDbModule.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.MongoDB/Volo/Abp/PermissionManagement/MongoDb/AbpPermissionManagementMongoDbModule.cs index b62d651bf1..80831660f8 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.MongoDB/Volo/Abp/PermissionManagement/MongoDb/AbpPermissionManagementMongoDbModule.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.MongoDB/Volo/Abp/PermissionManagement/MongoDb/AbpPermissionManagementMongoDbModule.cs @@ -16,6 +16,8 @@ public class AbpPermissionManagementMongoDbModule : AbpModule { options.AddDefaultRepositories(); + options.AddRepository(); + options.AddRepository(); options.AddRepository(); }); } diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.MongoDB/Volo/Abp/PermissionManagement/MongoDb/IPermissionManagementMongoDbContext.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.MongoDB/Volo/Abp/PermissionManagement/MongoDb/IPermissionManagementMongoDbContext.cs index 0826003628..98015484fb 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.MongoDB/Volo/Abp/PermissionManagement/MongoDb/IPermissionManagementMongoDbContext.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.MongoDB/Volo/Abp/PermissionManagement/MongoDb/IPermissionManagementMongoDbContext.cs @@ -7,5 +7,9 @@ namespace Volo.Abp.PermissionManagement.MongoDB; [ConnectionStringName(AbpPermissionManagementDbProperties.ConnectionStringName)] public interface IPermissionManagementMongoDbContext : IAbpMongoDbContext { + IMongoCollection PermissionGroups { get; } + + IMongoCollection Permissions { get; } + IMongoCollection PermissionGrants { get; } } diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.MongoDB/Volo/Abp/PermissionManagement/MongoDb/MongoPermissionDefinitionRecordRepository.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.MongoDB/Volo/Abp/PermissionManagement/MongoDb/MongoPermissionDefinitionRecordRepository.cs new file mode 100644 index 0000000000..e4894a1442 --- /dev/null +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.MongoDB/Volo/Abp/PermissionManagement/MongoDb/MongoPermissionDefinitionRecordRepository.cs @@ -0,0 +1,32 @@ +using System; +using System.Threading; +using System.Threading.Tasks; +using MongoDB.Driver.Linq; +using Volo.Abp.Domain.Repositories.MongoDB; +using Volo.Abp.MongoDB; + +namespace Volo.Abp.PermissionManagement.MongoDB; + +public class MongoPermissionDefinitionRecordRepository : + MongoDbRepository, + IPermissionDefinitionRecordRepository +{ + public MongoPermissionDefinitionRecordRepository( + IMongoDbContextProvider dbContextProvider) + : base(dbContextProvider) + { + } + + public async Task FindByNameAsync( + string name, + CancellationToken cancellationToken = default) + { + cancellationToken = GetCancellationToken(cancellationToken); + return await (await GetMongoQueryableAsync(cancellationToken)) + .OrderBy(x => x.Id) + .FirstOrDefaultAsync( + s => s.Name == name, + cancellationToken + ); + } +} \ No newline at end of file diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.MongoDB/Volo/Abp/PermissionManagement/MongoDb/MongoPermissionGrantRepository.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.MongoDB/Volo/Abp/PermissionManagement/MongoDb/MongoPermissionGrantRepository.cs index 908f258a47..aa7694b7d5 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.MongoDB/Volo/Abp/PermissionManagement/MongoDb/MongoPermissionGrantRepository.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.MongoDB/Volo/Abp/PermissionManagement/MongoDb/MongoPermissionGrantRepository.cs @@ -10,7 +10,9 @@ using Volo.Abp.MongoDB; namespace Volo.Abp.PermissionManagement.MongoDB; -public class MongoPermissionGrantRepository : MongoDbRepository, IPermissionGrantRepository +public class MongoPermissionGrantRepository : + MongoDbRepository, + IPermissionGrantRepository { public MongoPermissionGrantRepository(IMongoDbContextProvider dbContextProvider) : base(dbContextProvider) diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.MongoDB/Volo/Abp/PermissionManagement/MongoDb/MongoPermissionGroupDefinitionRecordRepository.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.MongoDB/Volo/Abp/PermissionManagement/MongoDb/MongoPermissionGroupDefinitionRecordRepository.cs new file mode 100644 index 0000000000..0b6b5550b9 --- /dev/null +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.MongoDB/Volo/Abp/PermissionManagement/MongoDb/MongoPermissionGroupDefinitionRecordRepository.cs @@ -0,0 +1,16 @@ +using System; +using Volo.Abp.Domain.Repositories.MongoDB; +using Volo.Abp.MongoDB; + +namespace Volo.Abp.PermissionManagement.MongoDB; + +public class MongoPermissionGroupDefinitionRecordRepository : + MongoDbRepository, + IPermissionGroupDefinitionRecordRepository +{ + public MongoPermissionGroupDefinitionRecordRepository( + IMongoDbContextProvider dbContextProvider) + : base(dbContextProvider) + { + } +} \ No newline at end of file diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.MongoDB/Volo/Abp/PermissionManagement/MongoDb/PermissionManagementMongoDbContext.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.MongoDB/Volo/Abp/PermissionManagement/MongoDb/PermissionManagementMongoDbContext.cs index e8ef18f162..c62db52c11 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.MongoDB/Volo/Abp/PermissionManagement/MongoDb/PermissionManagementMongoDbContext.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.MongoDB/Volo/Abp/PermissionManagement/MongoDb/PermissionManagementMongoDbContext.cs @@ -7,6 +7,8 @@ namespace Volo.Abp.PermissionManagement.MongoDB; [ConnectionStringName(AbpPermissionManagementDbProperties.ConnectionStringName)] public class PermissionManagementMongoDbContext : AbpMongoDbContext, IPermissionManagementMongoDbContext { + public IMongoCollection PermissionGroups => Collection(); + public IMongoCollection Permissions => Collection(); public IMongoCollection PermissionGrants => Collection(); protected override void CreateModel(IMongoModelBuilder modelBuilder) diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Pages/AbpPermissionManagement/PermissionManagementModal.cshtml.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Pages/AbpPermissionManagement/PermissionManagementModal.cshtml.cs index 5f1ca18fc0..30057eea82 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Pages/AbpPermissionManagement/PermissionManagementModal.cshtml.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Pages/AbpPermissionManagement/PermissionManagementModal.cshtml.cs @@ -1,11 +1,14 @@ +using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Options; using Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations; using Volo.Abp.AspNetCore.Mvc.UI.RazorPages; using Volo.Abp.EventBus.Local; +using Volo.Abp.Localization; using Volo.Abp.PermissionManagement.Web.Utils; namespace Volo.Abp.PermissionManagement.Web.Pages.AbpPermissionManagement; @@ -37,15 +40,18 @@ public class PermissionManagementModal : AbpPageModel protected IPermissionAppService PermissionAppService { get; } protected ILocalEventBus LocalEventBus { get; } + public AbpLocalizationOptions LocalizationOptions { get; } public PermissionManagementModal( - IPermissionAppService permissionAppService, - ILocalEventBus localEventBus) + IPermissionAppService permissionAppService, + ILocalEventBus localEventBus, + IOptions localizationOptions) { ObjectMapperContext = typeof(AbpPermissionManagementWebModule); PermissionAppService = permissionAppService; LocalEventBus = localEventBus; + LocalizationOptions = localizationOptions.Value; } public virtual async Task OnGetAsync() @@ -54,6 +60,8 @@ public class PermissionManagementModal : AbpPageModel var result = await PermissionAppService.GetAsync(ProviderName, ProviderKey); + UpdateLocalizations(result); + EntityDisplayName = !string.IsNullOrWhiteSpace(ProviderKeyDisplayName) ? ProviderKeyDisplayName : result.EntityDisplayName; @@ -78,6 +86,49 @@ public class PermissionManagementModal : AbpPageModel return Page(); } + private void UpdateLocalizations(GetPermissionListResultDto result) + { + foreach (var group in result.Groups) + { + group.DisplayName = Localize( + group.DisplayNameKey, + group.DisplayNameResource, + group.DisplayName + ); + + foreach (var permission in group.Permissions) + { + permission.DisplayName = Localize( + permission.DisplayNameKey, + permission.DisplayNameResource, + permission.DisplayName + ); + } + } + } + + private string Localize(string key, string resourceName, string fallbackValue) + { + if (key.IsNullOrEmpty() || resourceName.IsNullOrEmpty()) + { + return fallbackValue; + } + + var resource = LocalizationOptions.Resources.GetOrNull(resourceName); + if (resource == null) + { + return fallbackValue; + } + + var result = new LocalizableString(resource.ResourceType, key).Localize(StringLocalizerFactory); + if (result.ResourceNotFound) + { + return fallbackValue; + } + + return result.Value; + } + public virtual async Task OnPostAsync() { ValidateModel(); diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Volo.Abp.PermissionManagement.Web.abppkg.analyze.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Volo.Abp.PermissionManagement.Web.abppkg.analyze.json index 571f627742..964e43381c 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Volo.Abp.PermissionManagement.Web.abppkg.analyze.json +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Volo.Abp.PermissionManagement.Web.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.Abp.PermissionManagement.Web", - "hash": "d92eb24e5e657f77bec981e6bb49b22c", + "hash": "ba550bdb16d700b630bdc042b35b084d", "contents": [ { "namespace": "Volo.Abp.PermissionManagement.Web", diff --git a/modules/permission-management/test/Volo.Abp.PermissionManagement.Domain.Tests/Volo.Abp.PermissionManagement.Domain.Tests.csproj b/modules/permission-management/test/Volo.Abp.PermissionManagement.Domain.Tests/Volo.Abp.PermissionManagement.Domain.Tests.csproj index 9b0cd2f1c0..8e77b2d56c 100644 --- a/modules/permission-management/test/Volo.Abp.PermissionManagement.Domain.Tests/Volo.Abp.PermissionManagement.Domain.Tests.csproj +++ b/modules/permission-management/test/Volo.Abp.PermissionManagement.Domain.Tests/Volo.Abp.PermissionManagement.Domain.Tests.csproj @@ -12,6 +12,8 @@ + + diff --git a/modules/permission-management/test/Volo.Abp.PermissionManagement.Domain.Tests/Volo/Abp/PermissionManagement/AbpPermissionManagementTestModule.cs b/modules/permission-management/test/Volo.Abp.PermissionManagement.Domain.Tests/Volo/Abp/PermissionManagement/AbpPermissionManagementTestModule.cs index 24945f83b0..bf32af126d 100644 --- a/modules/permission-management/test/Volo.Abp.PermissionManagement.Domain.Tests/Volo/Abp/PermissionManagement/AbpPermissionManagementTestModule.cs +++ b/modules/permission-management/test/Volo.Abp.PermissionManagement.Domain.Tests/Volo/Abp/PermissionManagement/AbpPermissionManagementTestModule.cs @@ -2,6 +2,8 @@ using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using Volo.Abp.EntityFrameworkCore; +using Volo.Abp.Features; +using Volo.Abp.GlobalFeatures; using Volo.Abp.Modularity; using Volo.Abp.PermissionManagement.EntityFrameworkCore; using Volo.Abp.Uow; @@ -10,7 +12,10 @@ namespace Volo.Abp.PermissionManagement; [DependsOn( typeof(AbpPermissionManagementEntityFrameworkCoreModule), - typeof(AbpPermissionManagementTestBaseModule))] + typeof(AbpPermissionManagementTestBaseModule), + typeof(AbpFeaturesModule), + typeof(AbpGlobalFeaturesModule) + )] public class AbpPermissionManagementTestModule : AbpModule { public override void ConfigureServices(ServiceConfigurationContext context) diff --git a/modules/permission-management/test/Volo.Abp.PermissionManagement.Domain.Tests/Volo/Abp/PermissionManagement/PermissionChecker_Basic_Tests.cs b/modules/permission-management/test/Volo.Abp.PermissionManagement.Domain.Tests/Volo/Abp/PermissionManagement/PermissionChecker_Basic_Tests.cs index aa9e7ecca9..78ab5d0af9 100644 --- a/modules/permission-management/test/Volo.Abp.PermissionManagement.Domain.Tests/Volo/Abp/PermissionManagement/PermissionChecker_Basic_Tests.cs +++ b/modules/permission-management/test/Volo.Abp.PermissionManagement.Domain.Tests/Volo/Abp/PermissionManagement/PermissionChecker_Basic_Tests.cs @@ -15,11 +15,9 @@ public class PermissionChecker_Basic_Tests : PermissionTestBase } [Fact] - public async Task Should_Throw_Exception_If_Permission_Is_Not_Defined() + public async Task Should_Return_Prohibited_If_Permission_Is_Not_Defined() { - await Assert.ThrowsAsync(async () => - await _permissionChecker.IsGrantedAsync("UndefinedPermissionName") - ); + (await _permissionChecker.IsGrantedAsync("UndefinedPermissionName")).ShouldBeFalse(); } [Fact] diff --git a/modules/permission-management/test/Volo.Abp.PermissionManagement.Domain.Tests/Volo/Abp/PermissionManagement/PermissionDefinitionSerializer_Tests.cs b/modules/permission-management/test/Volo.Abp.PermissionManagement.Domain.Tests/Volo/Abp/PermissionManagement/PermissionDefinitionSerializer_Tests.cs new file mode 100644 index 0000000000..1e7c04580c --- /dev/null +++ b/modules/permission-management/test/Volo.Abp.PermissionManagement.Domain.Tests/Volo/Abp/PermissionManagement/PermissionDefinitionSerializer_Tests.cs @@ -0,0 +1,93 @@ +using System; +using System.Linq; +using System.Threading.Tasks; +using Shouldly; +using Volo.Abp.Authorization.Permissions; +using Volo.Abp.Data; +using Volo.Abp.Features; +using Volo.Abp.GlobalFeatures; +using Volo.Abp.Localization; +using Volo.Abp.MultiTenancy; +using Volo.Abp.PermissionManagement.Localization; +using Xunit; + +namespace Volo.Abp.PermissionManagement; + +public class PermissionDefinitionSerializer_Tests : PermissionTestBase +{ + private readonly IPermissionDefinitionSerializer _serializer; + + public PermissionDefinitionSerializer_Tests() + { + _serializer = GetRequiredService(); + } + + [Fact] + public async Task Serialize_Permission_Group_Definition() + { + // Arrange + + var context = new PermissionDefinitionContext(null); + var group1 = CreatePermissionGroup1(context); + + // Act + + var permissionGroupRecord = await _serializer.SerializeAsync(group1); + + //Assert + + permissionGroupRecord.Name.ShouldBe("Group1"); + permissionGroupRecord.DisplayName.ShouldBe("F:Group one"); + permissionGroupRecord.GetProperty("CustomProperty1").ShouldBe("CustomValue1"); + } + + [Fact] + public async Task Serialize_Complex_Permission_Definition() + { + // Arrange + + var context = new PermissionDefinitionContext(null); + var group1 = CreatePermissionGroup1(context); + var permission1 = group1.AddPermission( + "Permission1", + new LocalizableString(typeof(AbpPermissionManagementResource), "Permission1"), + MultiTenancySides.Tenant + ) + .WithProviders("ProviderA", "ProviderB") + .WithProperty("CustomProperty2", "CustomValue2") + .RequireAuthenticated() //For for testing, not so meaningful + .RequireGlobalFeatures("GlobalFeature1", "GlobalFeature2") + .RequireFeatures("Feature1", "Feature2") + .RequirePermissions(requiresAll: false, batchCheck: false,"Permission2", "Permission3"); + + // Act + + var permissionRecord = await _serializer.SerializeAsync( + permission1, + group1 + ); + + //Assert + + permissionRecord.Name.ShouldBe("Permission1"); + permissionRecord.GroupName.ShouldBe("Group1"); + permissionRecord.DisplayName.ShouldBe("L:AbpPermissionManagement,Permission1"); + permissionRecord.GetProperty("CustomProperty2").ShouldBe("CustomValue2"); + permissionRecord.Providers.ShouldBe("ProviderA,ProviderB"); + permissionRecord.MultiTenancySide.ShouldBe(MultiTenancySides.Tenant); + permissionRecord.StateCheckers.ShouldBe("[{\"T\":\"A\"},{\"T\":\"G\",\"A\":true,\"N\":[\"GlobalFeature1\",\"GlobalFeature2\"]},{\"T\":\"F\",\"A\":true,\"N\":[\"Feature1\",\"Feature2\"]},{\"T\":\"P\",\"A\":false,\"N\":[\"Permission2\",\"Permission3\"]}]"); + } + + private static PermissionGroupDefinition CreatePermissionGroup1( + IPermissionDefinitionContext context) + { + var group = context.AddGroup( + "Group1", + displayName: new FixedLocalizableString("Group one") + ); + + group["CustomProperty1"] = "CustomValue1"; + + return group; + } +} \ No newline at end of file diff --git a/modules/permission-management/test/Volo.Abp.PermissionManagement.Domain.Tests/Volo/Abp/PermissionManagement/PermissionManager_Tests.cs b/modules/permission-management/test/Volo.Abp.PermissionManagement.Domain.Tests/Volo/Abp/PermissionManagement/PermissionManager_Tests.cs index 06e245046c..1f771bdb3b 100644 --- a/modules/permission-management/test/Volo.Abp.PermissionManagement.Domain.Tests/Volo/Abp/PermissionManagement/PermissionManager_Tests.cs +++ b/modules/permission-management/test/Volo.Abp.PermissionManagement.Domain.Tests/Volo/Abp/PermissionManagement/PermissionManager_Tests.cs @@ -72,12 +72,12 @@ public class PermissionManager_Tests : PermissionTestBase } [Fact] - public async Task Get_Should_Exception_When_Permission_Undefined() + public async Task Get_Should_Return_Not_Granted_When_Permission_Undefined() { - await Assert.ThrowsAsync(async () => await _permissionManager.GetAsync( - "MyPermission1NotExist", - "Test", - "Test")); + var result = await _permissionManager.GetAsync("MyPermission1NotExist", "Test", "Test"); + result.Name.ShouldBe("MyPermission1NotExist"); + result.Providers.ShouldBeEmpty(); + result.IsGranted.ShouldBeFalse(); } [Fact] @@ -126,13 +126,13 @@ public class PermissionManager_Tests : PermissionTestBase } [Fact] - public async Task Set_Should_Exception_When_Permission_Undefined() + public async Task Set_Should_Silently_Ignore_When_Permission_Undefined() { - await Assert.ThrowsAsync(async () => await _permissionManager.SetAsync( + await _permissionManager.SetAsync( "MyPermission1NotExist", "Test", "Test", - true)); + true); } [Fact] diff --git a/modules/setting-management/Volo.Abp.SettingManagement.abpmdl.json b/modules/setting-management/Volo.Abp.SettingManagement.abpmdl.json index ba8523c1ac..899d1a00ed 100644 --- a/modules/setting-management/Volo.Abp.SettingManagement.abpmdl.json +++ b/modules/setting-management/Volo.Abp.SettingManagement.abpmdl.json @@ -74,10 +74,6 @@ "Volo.Abp.SettingManagement.Blazor.WebAssembly": { "path": "src/Volo.Abp.SettingManagement.Blazor.WebAssembly/Volo.Abp.SettingManagement.Blazor.WebAssembly.abppkg.json", "folder": "src" - }, - "Volo.Abp.SettingManagement.Installer": { - "path": "src/Volo.Abp.SettingManagement.Installer/Volo.Abp.SettingManagement.Installer.abppkg.json", - "folder": "src" } } } \ No newline at end of file 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 39cd70cc25..1a827c57d9 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": "^5.3.0" + "@abp/aspnetcore.mvc.ui.theme.basic": "^6.0.0-rc.3" } } diff --git a/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/wwwroot/libs/abp/core/abp.js b/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/wwwroot/libs/abp/core/abp.js index 9445e4e7f4..d8b7531660 100644 --- a/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/wwwroot/libs/abp/core/abp.js +++ b/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/wwwroot/libs/abp/core/abp.js @@ -372,7 +372,9 @@ var abp = abp || {}; setTimeout(function () { if (element) { element.classList.remove('abp-block-area-disappearing'); - element.parentElement.removeChild(element); + if (element.parentElement) { + element.parentElement.removeChild(element); + } } }, 250); } 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 3fd190f37e..054a811ce7 100644 --- a/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/yarn.lock +++ b/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/yarn.lock @@ -2,37 +2,37 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-5.3.0.tgz#dcdd73d8582c4d14438f70d765170398d5d582fb" - integrity sha512-H6UrafHRI1DHfIoi47gZWHKSanlyAkghtGgUO6GTmPqTubBXjl7Ky3owVUAXvFd49+72gwdCLA/DB0Khjc3Ayw== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~5.3.0" - -"@abp/aspnetcore.mvc.ui.theme.shared@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-5.3.0.tgz#84e94845a247815ce981cda2d195944a350530b9" - integrity sha512-RwXxlncjidvh8Hgw91Hz1f5rnfG9hlNROr5bD/kxTUB47vIh/TIBd06UYrYw2/lqFLw5d6wd8q7VLuDjGUQbpg== - dependencies: - "@abp/aspnetcore.mvc.ui" "~5.3.0" - "@abp/bootstrap" "~5.3.0" - "@abp/bootstrap-datepicker" "~5.3.0" - "@abp/datatables.net-bs5" "~5.3.0" - "@abp/font-awesome" "~5.3.0" - "@abp/jquery-form" "~5.3.0" - "@abp/jquery-validation-unobtrusive" "~5.3.0" - "@abp/lodash" "~5.3.0" - "@abp/luxon" "~5.3.0" - "@abp/malihu-custom-scrollbar-plugin" "~5.3.0" - "@abp/select2" "~5.3.0" - "@abp/sweetalert2" "~5.3.0" - "@abp/timeago" "~5.3.0" - "@abp/toastr" "~5.3.0" - -"@abp/aspnetcore.mvc.ui@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-5.3.0.tgz#e947fd1aecbd2aabc5db4c6a64b78f2690fcf0d4" - integrity sha512-en2YDb/hRG1MKkbli1PYcoeU9OLU0YPSahkIBSfOmMLntAe8y0c2+Xe09chXP4r+GoZu0zd9FM3qqCRZojrlug== +"@abp/aspnetcore.mvc.ui.theme.basic@^6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-6.0.0-rc.3.tgz#b95266387e562c635de795442f90470f8e9e6318" + integrity sha512-vVkEpotDST455E3rynvRQpBKPcNNJ2m1wLkz/B9dQNdUjvm8L4F6s0ls0XFlKUNvQfCVfedkRtGayuvNje/Oxg== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~6.0.0-rc.3" + +"@abp/aspnetcore.mvc.ui.theme.shared@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-6.0.0-rc.3.tgz#664ca2ee712b7d9e66103c00beb41eb9648a6075" + integrity sha512-KxCsGuoUWKaDo7Oo9aKp51pli2m0DZ2tG8m+zK+m4M9U7g96uC+DOFy3gc7MdPlszvrw32Wwm7I0AughstByNA== + dependencies: + "@abp/aspnetcore.mvc.ui" "~6.0.0-rc.3" + "@abp/bootstrap" "~6.0.0-rc.3" + "@abp/bootstrap-datepicker" "~6.0.0-rc.3" + "@abp/datatables.net-bs5" "~6.0.0-rc.3" + "@abp/font-awesome" "~6.0.0-rc.3" + "@abp/jquery-form" "~6.0.0-rc.3" + "@abp/jquery-validation-unobtrusive" "~6.0.0-rc.3" + "@abp/lodash" "~6.0.0-rc.3" + "@abp/luxon" "~6.0.0-rc.3" + "@abp/malihu-custom-scrollbar-plugin" "~6.0.0-rc.3" + "@abp/select2" "~6.0.0-rc.3" + "@abp/sweetalert2" "~6.0.0-rc.3" + "@abp/timeago" "~6.0.0-rc.3" + "@abp/toastr" "~6.0.0-rc.3" + +"@abp/aspnetcore.mvc.ui@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-6.0.0-rc.3.tgz#47c23b57ed3908bd78a232230e53d1f3cba2de41" + integrity sha512-7eJZy2JUGQP94Tz3JJWXRHRmDfTcPZ/lS1/VNbU8B4qvgl5ChIXklVEJLR1fwrBhKXZV8fGVmqT1XlGTGFvFJA== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -41,144 +41,144 @@ merge-stream "^2.0.0" micromatch "^4.0.2" -"@abp/bootstrap-datepicker@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-5.3.0.tgz#09c44954774d8f52ca8ff6699ad4dbb7cc0308c2" - integrity sha512-AQ26I0jgoCioW1/4XmQIyn1c1+CLv8KTb4Vd4ZbtdYGBkkkUe+JEAWpJSeXlJRr/XrOs0BKWp/fa7Nnwx8srLg== +"@abp/bootstrap-datepicker@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-6.0.0-rc.3.tgz#89198b863dbfccf5f07ac3c4b20ce6199adcb17a" + integrity sha512-NLoUjcR66mqwSWuVftu2yFH4/j6QP+FiElRfZQ9OYmO8DQx2Ue5UZzjrFTrZ1DBBCfzhr2Bffj80dirGvGDyvg== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-5.3.0.tgz#42dac2d2d6374f39d068a638687039c5c74df123" - integrity sha512-rg9mLcvT4JQRc1rIAhGYK1P2eMRJ1+GArQXV5l7k3FrVU+bRLKdoE6PNpuwXHpdlom4/dOgekfuWH/SAuY5kyw== +"@abp/bootstrap@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-6.0.0-rc.3.tgz#4574bf574cc3484869e8ff8bc592f6212d20a969" + integrity sha512-Q5v7WRkGhGcjRg267HXtqs1oU7ts9UXPyCXmg5y2y5qMOyioD+m4MKV4iv67DgoQjabudp8X2egTKxkej6Lzkw== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" bootstrap "^5.1.3" -"@abp/core@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-5.3.0.tgz#032724dd0c0b850204896ce0275c7f9c8f516740" - integrity sha512-Uk9h98jiEF1dItWrvWnYB6s/UNZZapvFSyJ4+piAsZmXOSAbrObV+s19n5xfUagQQTWn4+aU5+aChEcfWpYv9A== +"@abp/core@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-6.0.0-rc.3.tgz#5662ce813d449d97d9fb7ea2552b2774c8df7825" + integrity sha512-X/VRdk5SGNYc5gQzPcBEPAvwcuD9WXsI4YIdrqjnes0s8u2/XmfrTixojh8Y5EYUoOblEE3Soj5hBhY1cVwcbQ== dependencies: - "@abp/utils" "~5.3.0" + "@abp/utils" "~6.0.0-rc.3" -"@abp/datatables.net-bs5@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-5.3.0.tgz#84771ce4eb7229bed347a5904c891b08e3230422" - integrity sha512-FpKrgrjaBKVgFAnbBsrvDIJJOy8gbWCEHm5Jy2vFWXmx25fITMw/2ckBDH87yrZtCNVTSUbMIdHYOIHMPfSavQ== +"@abp/datatables.net-bs5@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-6.0.0-rc.3.tgz#22865c7e621de720b71af6265b3193f6c78695bd" + integrity sha512-T+mhLc6uSzWmxDQogVwnJ6VxI4845gmF68/i9TmVKNlCtpa3EEfyuF/hgWT1hYfCb4XOsvd/CWrunbkC3fsmtg== dependencies: - "@abp/datatables.net" "~5.3.0" + "@abp/datatables.net" "~6.0.0-rc.3" datatables.net-bs5 "^1.11.4" -"@abp/datatables.net@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-5.3.0.tgz#dd27ae451df9551f5b815e10c87a8a89c6a38293" - integrity sha512-d4lQ09G7HY2gEN1lRAteCZzY0Fv3gPuUM+icgWm+UkmDZV9lhvovTQ58Xkwayw8vf+NPlit1eGMMQedn6MbeAQ== +"@abp/datatables.net@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-6.0.0-rc.3.tgz#d036defe6ad7fc989dffa020ae579362ee3150d1" + integrity sha512-4cUU8/Tn0Vz9bx7jjMOD/0Viyr29fcwoQAAkxaaYZp6qiQbENgz46/xpQf2oBCoudk8CLdzpmNa7jWte7PcJJw== dependencies: - "@abp/jquery" "~5.3.0" + "@abp/jquery" "~6.0.0-rc.3" datatables.net "^1.11.4" -"@abp/font-awesome@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-5.3.0.tgz#ce1d5bb59bd597cc9717885917d4dd2eae1f8b9c" - integrity sha512-JX62EVfZSJ7pv75Gd3ya/3c3He0hXF7KmpTizUNd/EbeHuNJoCND5wwq5OAFV9Ld3vdcGJChNTydNa5RsBzrpg== +"@abp/font-awesome@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-6.0.0-rc.3.tgz#803569d1a7e25f8a1c2be018312449c23fb78217" + integrity sha512-lYdh38UCTSkzzw0B/mpPEo7iFXzSKHCNbBOIHe6dd6O/Qli7wYukTtUOFn5Sh+yoydLY1as92HtiGL1ckSdu1g== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" "@fortawesome/fontawesome-free" "^5.15.4" -"@abp/jquery-form@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-5.3.0.tgz#5ae9906f0cffaf3e043681a5dd80a014b4860f6b" - integrity sha512-ZTpXCImHirJDZjfnJRtSEHLIbWMTYkqtTv7Z3GMRKnI4fllpmuco9EWLAKjAfYPyc/QpTx+MYnUg5SsXORhJyQ== +"@abp/jquery-form@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-6.0.0-rc.3.tgz#4ec503c07e2194148c3a7e7cf7ddef2871679e6a" + integrity sha512-Q3uEpflntqrSkYakcdsBnnYYfxJWXD/CDjMiwjbb6gIc8s4qkbIYxVxvYvlEezoIDYQkMSXOn7BS4clWsesiJg== dependencies: - "@abp/jquery" "~5.3.0" + "@abp/jquery" "~6.0.0-rc.3" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-5.3.0.tgz#ccf90a7840398e69e0a91ed6c32b80fa2eb82d14" - integrity sha512-6B3ywnpvPxpnxkrcXzjTjMWgKRImbzNPOZvv5ant/kQv3zXedV1GXSIILy+imX39FuDPslOmEfx8plwrNvIteA== +"@abp/jquery-validation-unobtrusive@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-6.0.0-rc.3.tgz#01da2a59663d373ff1c69022f4c9c66ad0b29403" + integrity sha512-ij1ML2D9rYF3pJthWO6mGQajsJhbDCtOoBvnh9yCZccuwOYkXP22PqfUxjjxtqL4HqFI31KRpFg0ANMGSzEEBg== dependencies: - "@abp/jquery-validation" "~5.3.0" + "@abp/jquery-validation" "~6.0.0-rc.3" jquery-validation-unobtrusive "^3.2.12" -"@abp/jquery-validation@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-5.3.0.tgz#a21696e7d5d54ef8bcdc0e8bd2debb1da1f7f5cc" - integrity sha512-4z2I9iORf+z5SlN9crC/Gx3X5GAOVePD+WN8SaHSYr4VWYNe8TV8LvCZPilN56sIPt3jYvy0N+bI1tAuZPu/NQ== +"@abp/jquery-validation@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-6.0.0-rc.3.tgz#724aea9572dcb2faccf8c6355332b0b2a4df9260" + integrity sha512-rTK5oHaMtycvWxunNwzbE/MbsXXIr6qDnOY3rVUmjTHjqUOHYz591t/XeQfjnSXPp4k/SZUjG6viTC3J2jzC1A== dependencies: - "@abp/jquery" "~5.3.0" + "@abp/jquery" "~6.0.0-rc.3" jquery-validation "^1.19.3" -"@abp/jquery@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-5.3.0.tgz#0279ee501ed774a788072c2ec8b003e348fec22c" - integrity sha512-rqYbU3LpsT7XT8ygn+TFVmjev5NlgEcDhGwQ8PraY1dEjlDbteeQ50N4adS8fdRfOM1UjGL19ueN3F8E5qNUSg== +"@abp/jquery@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-6.0.0-rc.3.tgz#ba19cc8b802c46490277939e6c674811127d8016" + integrity sha512-MbD38iInyag7/j5k42cvMT4jLZMtXH4lUK0rjvqUDVaxKEks46Ix/90uczQ9XajYONgx0CJKFj2urgM830+CCA== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" jquery "~3.6.0" -"@abp/lodash@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-5.3.0.tgz#45f1dba7bb65b6599b4973d7e0c617dfd2c46c49" - integrity sha512-vQVMv58QuYttWBfLjJzIsw92JunGbWYsqk6pp6/JuoBls5UJtdP1F7vM4JgQxsscGYHFRZB3F4a3h1cxZ+dblQ== +"@abp/lodash@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-6.0.0-rc.3.tgz#8a5bab02353e5cab4ca06ab82f6dbe6285faa95a" + integrity sha512-c8yhcapzPsXyeiFjeOC+2a4bn5wFjW5gUoN+p/p+tE+FIcH37yEgyw/tAr6aZPCmR770MqQXct4t7S4Czbbk+A== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" lodash "^4.17.21" -"@abp/luxon@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-5.3.0.tgz#8a6277046f6e38c3affbf79c06f8ac00d1ca8098" - integrity sha512-6tETR03i1NPJuDqSQWtpkOykdq/84awifQUqRyh+b8340wV7P54NqUMDXDit9sjITFDhq99V/R+Rj3PVjvJD3A== +"@abp/luxon@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-6.0.0-rc.3.tgz#ba515e122c61918d481467d5be39f08a363822f6" + integrity sha512-2lRSSC0DYShlnKdbJ/Pmha/azjt09ZRPx57NQ01dc7ungChPry5EJL6pC3kXWnJrCkrPCF0V5+A3+taut9+l3A== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" luxon "^2.3.0" -"@abp/malihu-custom-scrollbar-plugin@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-5.3.0.tgz#e6e12162aa50d3c3d98629378cec2f6fd5964338" - integrity sha512-GVwgAZQurH/tr4Hgmuby2dun//v1dT+wLGV4ZvjCJzBRs4FgrB+25pj4qKm20j6/NKRKc4V5re/b1y6njCubFQ== +"@abp/malihu-custom-scrollbar-plugin@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-6.0.0-rc.3.tgz#0798e37ec6a852748118692a5fbd30c99d9745db" + integrity sha512-FlyShmRxG3wGk1OJCjHIZAdi2/Y2FJPkVxaE72CVIceQSmg0nebGTv3a7bhd4QzKkDsSA3+t6gHjnuKlTlDFLA== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/select2@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-5.3.0.tgz#aae202b87dc23dfc7c8fd933413a8dbeb2f5b683" - integrity sha512-0aIxdtzgONkrYnUN5ACkIIIhsC9e61QLRq3K+/98fjf7NkHOjG3Sptr8EKu5U3IQ2hNHgqBjPGYjkztGuxZ9kw== +"@abp/select2@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-6.0.0-rc.3.tgz#deb8332bfce2102a562004893321a48d5194bf53" + integrity sha512-rb0qElmmhiP09xX8ZbjzNLF6ygFBwErysGWt6Bbgzz5waX2sGe575Cgoz53FaMQ4JaRBg1N0/nCejKyDtiINRA== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" select2 "^4.0.13" -"@abp/sweetalert2@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-5.3.0.tgz#67379cfa4cb8884cb66b58f4cafa79960cf8426a" - integrity sha512-EBr8J7MDsYmSvOYxTbqsSmw6c2yLokHZe8A+EW2vsY9VYFXkoOJLVpCkCK4fhvHUv8/+Y5QnHW7bs1I6SKYXOw== +"@abp/sweetalert2@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-6.0.0-rc.3.tgz#e61fc6c1bed1316c1d44ca5c92f590e422db24d4" + integrity sha512-+SNpBb4XrQlWzRQK9lfdJqA9IfJrlgoqmHwPDgf3Q+P922MzO33TgDlZWbeE7MzVj2y2WmNsPuCKwhjSjSL2rw== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" sweetalert2 "^11.3.6" -"@abp/timeago@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-5.3.0.tgz#3aaef3edca333224ba6b3e81c8ad1ebaae51a2f4" - integrity sha512-FxtoPYxyk2CHeoloC6kaeCj5YtXH0rebhOEaCjrfyg9/Ec6LEkvpfC7RWlcsHaEUAtFXZegJDfOk066EPH7RHQ== +"@abp/timeago@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-6.0.0-rc.3.tgz#0ef8c4801bfd4623e6895b1d047b1437063bda53" + integrity sha512-P3YRDVKjR5/Fz+cXiPg3IiUr7XGbNh7mgmJ1ywRXmKVmVMJmhQ2RsKmmtkGJn4TfVHu/l5iJXe4rqgL21/yX/g== dependencies: - "@abp/jquery" "~5.3.0" + "@abp/jquery" "~6.0.0-rc.3" timeago "^1.6.7" -"@abp/toastr@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-5.3.0.tgz#8a002c19ea25ac6b042a25c0f9d289d03c93c2fb" - integrity sha512-gjb2O/XrYkX8IeCERIqlOYPh15WlF9LxGR6t9jeVF/p6BTX/yaWabYCFfB9SkU2pQ6xrGl7WmSTAC06JOAtPTA== +"@abp/toastr@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-6.0.0-rc.3.tgz#6010d4247937531ebf7c8659d6254cd3db6c4855" + integrity sha512-sC9eCzYVgDrLSFIhJGe9hshzfwA1BkZNah4NQhyq+V6HQ8YF7goMS79N+/XmSoLQ9zzRhusqnPFnb+4FHjr7iA== dependencies: - "@abp/jquery" "~5.3.0" + "@abp/jquery" "~6.0.0-rc.3" toastr "^2.1.4" -"@abp/utils@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-5.3.0.tgz#e93739074a3cd445a5a221209506b7e663050ca0" - integrity sha512-Nm+h+3PL10+rBFSh8UUuenmGM+OBlEoNQeGzHRmhOc6hJ3oqCogPzY+zkq0e4pksrwhjxAu/cgCEGLAoEXXycw== +"@abp/utils@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-6.0.0-rc.3.tgz#6d3515694314175218606e9518618ce335b4b360" + integrity sha512-K2geJ9P1ztk4Ehzb9YG3CqqLOi+z8/4iBLUzooNZLQqS+KdlUhCmqfuCoI/A5Aq9DGbTYesalp+Fwoh3S2Dl8A== dependencies: just-compare "^1.3.0" diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Application.Contracts/Volo/Abp/SettingManagement/AllowTenantsToChangeEmailSettingsFeatureSimpleStateChecker.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Application.Contracts/Volo/Abp/SettingManagement/AllowChangingEmailSettingsFeatureSimpleStateChecker.cs similarity index 80% rename from modules/setting-management/src/Volo.Abp.SettingManagement.Application.Contracts/Volo/Abp/SettingManagement/AllowTenantsToChangeEmailSettingsFeatureSimpleStateChecker.cs rename to modules/setting-management/src/Volo.Abp.SettingManagement.Application.Contracts/Volo/Abp/SettingManagement/AllowChangingEmailSettingsFeatureSimpleStateChecker.cs index 5633b2491e..58144ec4d1 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Application.Contracts/Volo/Abp/SettingManagement/AllowTenantsToChangeEmailSettingsFeatureSimpleStateChecker.cs +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Application.Contracts/Volo/Abp/SettingManagement/AllowChangingEmailSettingsFeatureSimpleStateChecker.cs @@ -7,7 +7,7 @@ using Volo.Abp.SimpleStateChecking; namespace Volo.Abp.SettingManagement; -public class AllowTenantsToChangeEmailSettingsFeatureSimpleStateChecker : ISimpleStateChecker +public class AllowChangingEmailSettingsFeatureSimpleStateChecker : ISimpleStateChecker { public async Task IsEnabledAsync(SimpleStateCheckerContext context) { @@ -19,6 +19,6 @@ public class AllowTenantsToChangeEmailSettingsFeatureSimpleStateChecker : ISimpl } var featureChecker = context.ServiceProvider.GetRequiredService(); - return await featureChecker.IsEnabledAsync(SettingManagementFeatures.AllowTenantsToChangeEmailSettings); + return await featureChecker.IsEnabledAsync(SettingManagementFeatures.AllowChangingEmailSettings); } } diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Application.Contracts/Volo/Abp/SettingManagement/SettingManagementPermissionDefinitionProvider.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Application.Contracts/Volo/Abp/SettingManagement/SettingManagementPermissionDefinitionProvider.cs index 81e58503e7..db0b8dd907 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Application.Contracts/Volo/Abp/SettingManagement/SettingManagementPermissionDefinitionProvider.cs +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Application.Contracts/Volo/Abp/SettingManagement/SettingManagementPermissionDefinitionProvider.cs @@ -12,8 +12,8 @@ public class SettingManagementPermissionDefinitionProvider : PermissionDefinitio var emailPermission = moduleGroup .AddPermission(SettingManagementPermissions.Emailing, L("Permission:Emailing")); - emailPermission.StateCheckers.Add(new AllowTenantsToChangeEmailSettingsFeatureSimpleStateChecker()); - + emailPermission.StateCheckers.Add(new AllowChangingEmailSettingsFeatureSimpleStateChecker()); + emailPermission.AddChild(SettingManagementPermissions.EmailingTest, L("Permission:EmailingTest")); } diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Application/Volo.Abp.SettingManagement.Application.abppkg.analyze.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Application/Volo.Abp.SettingManagement.Application.abppkg.analyze.json index 37dd6381d0..059e069ce5 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Application/Volo.Abp.SettingManagement.Application.abppkg.analyze.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Application/Volo.Abp.SettingManagement.Application.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.Abp.SettingManagement.Application", - "hash": "90ab6555763837d82c6afbfb2ffff2b4", + "hash": "856b1289bcadda8c3e707216f30eb28d", "contents": [ { "namespace": "Volo.Abp.SettingManagement", diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Application/Volo/Abp/SettingManagement/EmailSettingsAppService.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Application/Volo/Abp/SettingManagement/EmailSettingsAppService.cs index fe67975517..2d15cb09fb 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Application/Volo/Abp/SettingManagement/EmailSettingsAppService.cs +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Application/Volo/Abp/SettingManagement/EmailSettingsAppService.cs @@ -76,7 +76,7 @@ public class EmailSettingsAppService : SettingManagementAppServiceBase, IEmailSe await FeatureChecker.CheckEnabledAsync(SettingManagementFeatures.Enable); if (CurrentTenant.IsAvailable) { - await FeatureChecker.CheckEnabledAsync(SettingManagementFeatures.AllowTenantsToChangeEmailSettings); + await FeatureChecker.CheckEnabledAsync(SettingManagementFeatures.AllowChangingEmailSettings); } } } diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Pages/SettingManagement/SettingManagement.razor.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Pages/SettingManagement/SettingManagement.razor.cs index fcde862fbd..1422d67873 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Pages/SettingManagement/SettingManagement.razor.cs +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Pages/SettingManagement/SettingManagement.razor.cs @@ -31,6 +31,8 @@ public partial class SettingManagement protected async override Task OnInitializedAsync() { + BreadcrumbItems.Add(new BreadcrumbItem(@L["Settings"])); + SettingComponentCreationContext = new SettingComponentCreationContext(ServiceProvider); foreach (var contributor in Options.Contributors) diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Settings/EmailingPageContributor.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Settings/EmailingPageContributor.cs index c21a5a7467..aec58c8ca8 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Settings/EmailingPageContributor.cs +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Settings/EmailingPageContributor.cs @@ -56,7 +56,7 @@ public class EmailingPageContributor : ISettingComponentContributor var featureCheck = context.ServiceProvider.GetRequiredService(); - return await featureCheck.IsEnabledAsync(SettingManagementFeatures.AllowTenantsToChangeEmailSettings); + return await featureCheck.IsEnabledAsync(SettingManagementFeatures.AllowChangingEmailSettings); } } diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo.Abp.SettingManagement.Domain.Shared.abppkg.analyze.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo.Abp.SettingManagement.Domain.Shared.abppkg.analyze.json index 268983d702..cd87f53194 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo.Abp.SettingManagement.Domain.Shared.abppkg.analyze.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo.Abp.SettingManagement.Domain.Shared.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.Abp.SettingManagement.Domain.Shared", - "hash": "53d686ce13a1571ce5f87cbc6b6ac477", + "hash": "02864f881f165fef01949fce1324f4ea", "contents": [ { "namespace": "Volo.Abp.SettingManagement", @@ -20,12 +20,12 @@ { "valueType": "ToggleStringValueType", "defaultValue": "false", - "displayName": "Allow tenants to change email settings.", - "description": "AllowTenantsToChangeEmailSettingsDescription", + "displayName": "Allow changing email settings.", + "description": null, "isAvailableToHost": false, "isVisibleToClients": true, "contentType": "feature", - "name": "SettingManagement.AllowTenantsToChangeEmailSettings" + "name": "SettingManagement.AllowChangingEmailSettings" } ] } \ No newline at end of file diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/ar.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/ar.json index 5dc7c60779..59a074e147 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/ar.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/ar.json @@ -18,7 +18,7 @@ "Feature:SettingManagementGroup": "إدارة الإعداد", "Feature:SettingManagementEnable": "تمكين إدارة الإعداد", "Feature:SettingManagementEnableDescription": "تفعيل إعداد نظام الإدارة في التطبيق.", - "Feature:AllowTenantsToChangeEmailSettings": "السماح للمستأجرين بتغيير إعدادات البريد الإلكتروني.", - "Feature:AllowTenantsToChangeEmailSettingsDescription": "السماح للمستأجرين بتغيير إعدادات البريد الإلكتروني." + "Feature:AllowChangingEmailSettings": "السماح لتغيير إعدادات البريد الإلكتروني.", + "Feature:AllowChangingEmailSettingsDescription": "السماح لتغيير إعدادات البريد الإلكتروني." } -} \ No newline at end of file +} diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/cs.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/cs.json index 9ba822b712..f029bff08c 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/cs.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/cs.json @@ -18,7 +18,7 @@ "Feature:SettingManagementGroup": "Správa nastavení", "Feature:SettingManagementEnable": "Povolit správu nastavení", "Feature:SettingManagementEnableDescription": "Povolit systém správy nastavení v aplikaci.", - "Feature:AllowTenantsToChangeEmailSettings": "Povolit nájemcům měnit nastavení e-mailu.", - "Feature:AllowTenantsToChangeEmailSettingsDescription": "Povolit nájemcům měnit nastavení e-mailu." + "Feature:AllowChangingEmailSettings": "Povolit změnu nastavení e-mailu.", + "Feature:AllowChangingEmailSettingsDescription": "Povolit změnu nastavení e-mailu." } -} \ No newline at end of file +} diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/de-DE.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/de-DE.json index a4716e8218..5aac7a3ba2 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/de-DE.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/de-DE.json @@ -18,7 +18,7 @@ "Feature:SettingManagementGroup": "Einstellungsverwaltung", "Feature:SettingManagementEnable": "Einstellungsverwaltung aktivieren", "Feature:SettingManagementEnableDescription": "Aktivieren Sie das Einstellungsverwaltungssystem in der Anwendung.", - "Feature:AllowTenantsToChangeEmailSettings": "Erlauben Sie Mietern, E-Mail-Einstellungen zu ändern.", - "Feature:AllowTenantsToChangeEmailSettingsDescription": "Erlauben Sie Mietern, E-Mail-Einstellungen zu ändern." + "Feature:AllowChangingEmailSettings": "Änderung der E-Mail-Einstellungen zulassen.", + "Feature:AllowChangingEmailSettingsDescription": "Änderung der E-Mail-Einstellungen zulassen." } -} \ No newline at end of file +} diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/el.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/el.json index a8f44b4bbb..03846bbea2 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/el.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/el.json @@ -10,7 +10,7 @@ "SenderEmailAddress": "Διεύθυνση email αποστολέα", "TargetEmailAddress": "Διεύθυνση email παραλήπτη", "Subject": "Θέμα", - "Body": "Κείμενο", + "Body": "Κείμενο", "TestEmailSubject": "Δοκιμαστικό email {0}", "TestEmailBody": "Δοκιμαστικό κείμενο email εδώ", "SuccessfullySent": "Στάλθηκε με επιτυχία", @@ -28,7 +28,7 @@ "Feature:SettingManagementGroup": "Διαχείριση ρυθμίσεων", "Feature:SettingManagementEnable": "Ενεργοποίηση διαχείρισης ρυθμίσεων", "Feature:SettingManagementEnableDescription": "Ενεργοποίηση συστήματος διαχείρισης ρυθμίσεων στην εφαρμογή.", - "Feature:AllowTenantsToChangeEmailSettings": "Επιτρέψτε στους μισθωτές να αλλάξουν τις ρυθμίσεις email.", - "Feature:AllowTenantsToChangeEmailSettingsDescription": "Επιτρέψτε στους μισθωτές να αλλάξουν τις ρυθμίσεις email." + "Feature:AllowChangingEmailSettings": "Επιτρέψτε την αλλαγή των ρυθμίσεων email.", + "Feature:AllowChangingEmailSettingsDescription": "Επιτρέψτε την αλλαγή των ρυθμίσεων email." } -} \ No newline at end of file +} diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/en.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/en.json index d947142885..b6de38e979 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/en.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/en.json @@ -28,7 +28,7 @@ "Feature:SettingManagementGroup": "Setting Management", "Feature:SettingManagementEnable": "Enable setting management", "Feature:SettingManagementEnableDescription": "Enable setting management system in the application.", - "Feature:AllowTenantsToChangeEmailSettings": "Allow tenants to change email settings.", - "Feature:AllowTenantsToChangeEmailSettingsDescription": "Allow tenants to change email settings." + "Feature:AllowChangingEmailSettings": "Allow changing email settings.", + "Feature:AllowChangingEmailSettingsDescription": "Allow changing email settings." } } diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/es.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/es.json index 45781c674a..60f8ce712f 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/es.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/es.json @@ -18,7 +18,7 @@ "Feature:SettingManagementGroup": "Gestión de la configuración", "Feature:SettingManagementEnable": "Habilitar la gestión de la configuración", "Feature:SettingManagementEnableDescription": "Habilite el sistema de gestión de la configuración en la aplicación.", - "Feature:AllowTenantsToChangeEmailSettings": "Permitir que los inquilinos cambien la configuración del correo electrónico.", - "Feature:AllowTenantsToChangeEmailSettingsDescription": "Permitir que los inquilinos cambien la configuración del correo electrónico." + "Feature:AllowChangingEmailSettings": "Permitir cambiar la configuración de correo electrónico.", + "Feature:AllowChangingEmailSettingsDescription": "Permitir cambiar la configuración de correo electrónico." } -} \ No newline at end of file +} diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/fi.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/fi.json index 90caad467a..70eef69695 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/fi.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/fi.json @@ -18,7 +18,7 @@ "Feature:SettingManagementGroup": "Asetusten hallinta", "Feature:SettingManagementEnable": "Ota asetusten hallinta käyttöön", "Feature:SettingManagementEnableDescription": "Ota asetustenhallintajärjestelmä käyttöön sovelluksessa.", - "Feature:AllowTenantsToChangeEmailSettings": "Salli vuokralaisten muuttaa sähköpostiasetuksia.", - "Feature:AllowTenantsToChangeEmailSettingsDescription": "Salli vuokralaisten muuttaa sähköpostiasetuksia." + "Feature:AllowChangingEmailSettings": "Salli sähköpostiasetusten muuttaminen.", + "Feature:AllowChangingEmailSettingsDescription": "Salli sähköpostiasetusten muuttaminen." } -} \ No newline at end of file +} diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/fr.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/fr.json index c1df790587..0aa479b4f9 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/fr.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/fr.json @@ -18,7 +18,7 @@ "Feature:SettingManagementGroup": "Gestion des paramètres", "Feature:SettingManagementEnable": "Activer la gestion des paramètres", "Feature:SettingManagementEnableDescription": "Activer le système de gestion des paramètres dans l'application.", - "Feature:AllowTenantsToChangeEmailSettings": "Autoriser les locataires à modifier les paramètres de messagerie.", - "Feature:AllowTenantsToChangeEmailSettingsDescription": "Autoriser les locataires à modifier les paramètres de messagerie." + "Feature:AllowChangingEmailSettings": "Autoriser la modification des paramètres de messagerie.", + "Feature:AllowChangingEmailSettingsDescription": "Autoriser la modification des paramètres de messagerie." } -} \ No newline at end of file +} diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/hi.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/hi.json index c862f785d3..efca2681f1 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/hi.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/hi.json @@ -18,7 +18,7 @@ "Feature:SettingManagementGroup": "सेटिंग प्रबंधन", "Feature:SettingManagementEnable": "सेटिंग प्रबंधन सक्षम करें", "Feature:SettingManagementEnableDescription": "एप्लिकेशन में सेटिंग प्रबंधन प्रणाली सक्षम करें।", - "Feature:AllowTenantsToChangeEmailSettings": "किरायेदारों को ईमेल सेटिंग बदलने की अनुमति दें।", - "Feature:AllowTenantsToChangeEmailSettingsDescription": "किरायेदारों को ईमेल सेटिंग बदलने की अनुमति दें।" + "Feature:AllowChangingEmailSettings": "ईमेल सेटिंग्स बदलने की अनुमति दें।", + "Feature:AllowChangingEmailSettingsDescription": "ईमेल सेटिंग्स बदलने की अनुमति दें।" } -} \ No newline at end of file +} diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/hu.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/hu.json index 37675167be..a3955aebb1 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/hu.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/hu.json @@ -28,7 +28,7 @@ "Feature:SettingManagementGroup": "Beállításkezelés", "Feature:SettingManagementEnable": "Beállításkezelés engedélyezése", "Feature:SettingManagementEnableDescription": "A beállításkezelő rendszer engedélyezése az alkalmazásban.", - "Feature:AllowTenantsToChangeEmailSettings": "Engedélyezze a bérlőknek az e-mail beállítások módosítását.", - "Feature:AllowTenantsToChangeEmailSettingsDescription": "Engedélyezze a bérlőknek az e-mail beállítások módosítását." + "Feature:AllowChangingEmailSettings": "Az e-mail beállítások módosításának engedélyezése.", + "Feature:AllowChangingEmailSettingsDescription": "Az e-mail beállítások módosításának engedélyezése." } -} \ No newline at end of file +} diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/is.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/is.json index 8910c4d438..1de09db58f 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/is.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/is.json @@ -18,7 +18,7 @@ "Feature:SettingManagementGroup": "Stillingar", "Feature:SettingManagementEnable": "Virkja stillingar", "Feature:SettingManagementEnableDescription": "Virkja stillingar í forritinu.", - "Feature:AllowTenantsToChangeEmailSettings": "Leyfa tenentum að breyta tölvupóststillingum.", - "Feature:AllowTenantsToChangeEmailSettingsDescription": "Leyfa tenentum að breyta tölvupóststillingum." + "Feature:AllowChangingEmailSettings": "Leyfa að breyta stillingum tölvupósts.", + "Feature:AllowChangingEmailSettingsDescription": "Leyfa að breyta stillingum tölvupósts." } -} \ No newline at end of file +} diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/it.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/it.json index 23ed55207c..09fc3e8f45 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/it.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/it.json @@ -18,7 +18,7 @@ "Feature:SettingManagementGroup": "Gestione Impostazioni", "Feature:SettingManagementEnable": "Abilita gestione impostazioni", "Feature:SettingManagementEnableDescription": "Abilita sistema gestione impostazioni nell'applicazione", - "Feature:AllowTenantsToChangeEmailSettings": "Consenti agli inquilini di modificare le impostazioni della posta elettronica.", - "Feature:AllowTenantsToChangeEmailSettingsDescription": "Consenti agli inquilini di modificare le impostazioni della posta elettronica." + "Feature:AllowChangingEmailSettings": "Consenti di modificare le loro impostazioni e-mail.", + "Feature:AllowChangingEmailSettingsDescription": "Consenti di modificare le loro impostazioni e-mail." } -} \ No newline at end of file +} diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/nl.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/nl.json index 59dbc4ebb5..e89b43c6b8 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/nl.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/nl.json @@ -18,7 +18,7 @@ "Feature:SettingManagementGroup": "Instellingsbeheer", "Feature:SettingManagementEnable": "Instellingenbeheer inschakelen", "Feature:SettingManagementEnableDescription": "Schakel het instellingsbeheersysteem in de toepassing in.", - "Feature:AllowTenantsToChangeEmailSettings": "Sta huurders toe om e-mailinstellingen te wijzigen.", - "Feature:AllowTenantsToChangeEmailSettingsDescription": "Sta huurders toe om e-mailinstellingen te wijzigen." + "Feature:AllowChangingEmailSettings": "Toestaan om e-mailinstellingen te wijzigen.", + "Feature:AllowChangingEmailSettingsDescription": "Toestaan om e-mailinstellingen te wijzigen." } -} \ No newline at end of file +} diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/pl-PL.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/pl-PL.json index e57242ae2e..90ebf15d24 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/pl-PL.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/pl-PL.json @@ -18,7 +18,7 @@ "Feature:SettingManagementGroup": "Zarządzanie ustawieniami", "Feature:SettingManagementEnable": "Włącz zarządzanie ustawieniami", "Feature:SettingManagementEnableDescription": "Włącz system zarządzania ustawieniami w aplikacji.", - "Feature:AllowTenantsToChangeEmailSettings": "Zezwalaj najemcom na zmianę ustawień poczty e-mail.", - "Feature:AllowTenantsToChangeEmailSettingsDescription": "Zezwalaj najemcom na zmianę ustawień poczty e-mail." + "Feature:AllowChangingEmailSettings": "Zezwól na zmianę ustawień poczty e-mail.", + "Feature:AllowChangingEmailSettingsDescription": "Zezwól na zmianę ustawień poczty e-mail." } -} \ No newline at end of file +} diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/pt-BR.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/pt-BR.json index 4237afe6ea..b609a6e762 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/pt-BR.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/pt-BR.json @@ -28,7 +28,7 @@ "Feature:SettingManagementGroup": "Gestão de Cenários", "Feature:SettingManagementEnable": "Habilitar gerenciamento de configuração", "Feature:SettingManagementEnableDescription": "Habilite o sistema de gerenciamento de configuração no aplicativo.", - "Feature:AllowTenantsToChangeEmailSettings": "Permitir que os inquilinos alterem as configurações de e-mail.", - "Feature:AllowTenantsToChangeEmailSettingsDescription": "Permitir que os inquilinos alterem as configurações de e-mail." + "Feature:AllowChangingEmailSettings": "Permitir alterar as configurações de e-mail.", + "Feature:AllowChangingEmailSettingsDescription": "Permitir alterar as configurações de e-mail." } -} \ No newline at end of file +} diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/ro-RO.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/ro-RO.json index da6f81ec56..edbc533607 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/ro-RO.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/ro-RO.json @@ -18,7 +18,7 @@ "Feature:SettingManagementGroup": "Administrarea setărilor", "Feature:SettingManagementEnable": "Activează administrarea setărilor", "Feature:SettingManagementEnableDescription": "Activează sistemul de administrare a setărilor în aplicaţie.", - "Feature:AllowTenantsToChangeEmailSettings": "Permiteți chiriașilor să modifice setările de e-mail.", - "Feature:AllowTenantsToChangeEmailSettingsDescription": "Permiteți chiriașilor să modifice setările de e-mail." + "Feature:AllowChangingEmailSettings": "Permiteți modificarea setărilor de e-mail.", + "Feature:AllowChangingEmailSettingsDescription": "Permiteți modificarea setărilor de e-mail." } -} \ No newline at end of file +} diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/ru.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/ru.json index d7e9c15976..c51a42f6f9 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/ru.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/ru.json @@ -18,7 +18,7 @@ "Feature:SettingManagementGroup": "Управление настройками", "Feature:SettingManagementEnable": "Включить управление настройками", "Feature:SettingManagementEnableDescription": "Включите систему управления настройками в приложении.", - "Feature:AllowTenantsToChangeEmailSettings": "Разрешить арендаторам изменять настройки электронной почты.", - "Feature:AllowTenantsToChangeEmailSettingsDescription": "Разрешить арендаторам изменять настройки электронной почты." + "Feature:AllowChangingEmailSettings": "Разрешить изменение настроек электронной почты.", + "Feature:AllowChangingEmailSettingsDescription": "Разрешить изменение настроек электронной почты." } -} \ No newline at end of file +} diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/sk.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/sk.json index 3caf40676e..11a750558e 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/sk.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/sk.json @@ -18,7 +18,7 @@ "Feature:SettingManagementGroup": "Správa nastavení", "Feature:SettingManagementEnable": "Povoliť správu nastavení", "Feature:SettingManagementEnableDescription": "Povoliť systém správy nastavení v aplikácii.", - "Feature:AllowTenantsToChangeEmailSettings": "Povoliť nájomníkom zmeniť nastavenia e-mailu.", - "Feature:AllowTenantsToChangeEmailSettingsDescription": "Povoliť nájomníkom zmeniť nastavenia e-mailu." + "Feature:AllowChangingEmailSettings": "Povoliť zmenu nastavení e-mailu.", + "Feature:AllowChangingEmailSettingsDescription": "Povoliť zmenu nastavení e-mailu." } -} \ No newline at end of file +} diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/sl.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/sl.json index dfa2d30dd2..e860f2dfba 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/sl.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/sl.json @@ -18,7 +18,7 @@ "Feature:SettingManagementGroup": "Upravljanje nastavitev", "Feature:SettingManagementEnable": "Omogoči upravljanje nastavitev", "Feature:SettingManagementEnableDescription": "Omogočite nastavitev sistema upravljanja v aplikaciji.", - "Feature:AllowTenantsToChangeEmailSettings": "Dovoli najemnikom, da spremenijo nastavitve e-pošte.", - "Feature:AllowTenantsToChangeEmailSettingsDescription": "Dovoli najemnikom, da spremenijo nastavitve e-pošte." + "Feature:AllowChangingEmailSettings": "Dovoli spreminjanje e-poštnih nastavitev.", + "Feature:AllowChangingEmailSettingsDescription": "Dovoli spreminjanje e-poštnih nastavitev." } -} \ No newline at end of file +} diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/tr.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/tr.json index 57397659f1..f050801fe5 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/tr.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/tr.json @@ -23,12 +23,12 @@ "SmtpDomain": "Domain", "SmtpEnableSsl": "Ssl'i aktif et", "SmtpUseDefaultCredentials": "Varsayılan yetkilendirmeleri kullan", - "DefaultFromAddress": "Varsayılan gönderici görünen isim", - "DefaultFromDisplayName": "Varsayılan gönderici email adresi", + "DefaultFromAddress": "Varsayılan gönderici email adresi", + "DefaultFromDisplayName": "Varsayılan gönderici görünen isim", "Feature:SettingManagementGroup": "Ayar yönetimi", "Feature:SettingManagementEnable": "Ayar yönetimini etkinleştir", "Feature:SettingManagementEnableDescription": "Uygulamada ayar yönetim sistemini etkinleştirin.", - "Feature:AllowTenantsToChangeEmailSettings": "Kiracıların e-posta ayarlarını değiştirmesine izin verin.", - "Feature:AllowTenantsToChangeEmailSettingsDescription": "Kiracıların e-posta ayarlarını değiştirmesine izin verin." + "Feature:AllowChangingEmailSettings": "E-posta ayarlarını değiştirmeye izin verin.", + "Feature:AllowChangingEmailSettingsDescription": "E-posta ayarlarını değiştirmeye izin verin." } -} \ No newline at end of file +} diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/vi.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/vi.json index f0880309de..744620abc6 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/vi.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/vi.json @@ -18,7 +18,7 @@ "Feature:SettingManagementGroup": "Cài đặt quản lý", "Feature:SettingManagementEnable": "Bật quản lý cài đặt", "Feature:SettingManagementEnableDescription": "Bật cài đặt hệ thống quản lý trong ứng dụng.", - "Feature:AllowTenantsToChangeEmailSettings": "Cho phép người thuê thay đổi cài đặt email.", - "Feature:AllowTenantsToChangeEmailSettingsDescription": "Cho phép người thuê thay đổi cài đặt email." + "Feature:AllowChangingEmailSettings": "Cho phép thay đổi cài đặt email.", + "Feature:AllowChangingEmailSettingsDescription": "Cho phép thay đổi cài đặt email." } -} \ No newline at end of file +} diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/zh-Hans.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/zh-Hans.json index 34ab12a79c..4399439eed 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/zh-Hans.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/zh-Hans.json @@ -28,7 +28,7 @@ "Feature:SettingManagementGroup": "设置管理", "Feature:SettingManagementEnable": "启用设置管理", "Feature:SettingManagementEnableDescription": "在应用程序中启用设置管理系统.", - "Feature:AllowTenantsToChangeEmailSettings": "允许租户更改邮件设置.", - "Feature:AllowTenantsToChangeEmailSettingsDescription": "允许租户更改邮件设置." + "Feature:AllowChangingEmailSettings": "允许更改邮件设置.", + "Feature:AllowChangingEmailSettingsDescription": "允许更改邮件设置." } } diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/zh-Hant.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/zh-Hant.json index 9cd5350bc9..d4fc96239a 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/zh-Hant.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/zh-Hant.json @@ -28,7 +28,7 @@ "Feature:SettingManagementGroup": "設定管理", "Feature:SettingManagementEnable": "啟用設定管理", "Feature:SettingManagementEnableDescription": "在應用程序中啟用設定管理系統.", - "Feature:AllowTenantsToChangeEmailSettings": "允許租戶更改電子郵件設置。", - "Feature:AllowTenantsToChangeEmailSettingsDescription": "允許租戶更改電子郵件設置。" + "Feature:AllowChangingEmailSettings": "允許更改電子郵件設置。", + "Feature:AllowChangingEmailSettingsDescription": "允許更改電子郵件設置。" } -} \ No newline at end of file +} diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/SettingManagementFeatureDefinitionProvider.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/SettingManagementFeatureDefinitionProvider.cs index 3c7b3cd4a7..6b763a1472 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/SettingManagementFeatureDefinitionProvider.cs +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/SettingManagementFeatureDefinitionProvider.cs @@ -20,9 +20,9 @@ public class SettingManagementFeatureDefinitionProvider : FeatureDefinitionProvi new ToggleStringValueType()); settingEnableFeature.CreateChild( - SettingManagementFeatures.AllowTenantsToChangeEmailSettings, + SettingManagementFeatures.AllowChangingEmailSettings, "false", - L("Feature:AllowTenantsToChangeEmailSettings"), + L("Feature:AllowChangingEmailSettings"), null, new ToggleStringValueType(), isAvailableToHost: false); diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/SettingManagementFeatures.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/SettingManagementFeatures.cs index e0c91d6435..3769852bed 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/SettingManagementFeatures.cs +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/SettingManagementFeatures.cs @@ -6,5 +6,5 @@ public class SettingManagementFeatures public const string Enable = GroupName + ".Enable"; - public const string AllowTenantsToChangeEmailSettings = GroupName + ".AllowTenantsToChangeEmailSettings"; + public const string AllowChangingEmailSettings = GroupName + ".AllowChangingEmailSettings"; } diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo.Abp.SettingManagement.Domain.abppkg.analyze.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo.Abp.SettingManagement.Domain.abppkg.analyze.json index 476a33fd6d..26a1d8a77c 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo.Abp.SettingManagement.Domain.abppkg.analyze.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo.Abp.SettingManagement.Domain.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.Abp.SettingManagement.Domain", - "hash": "ab6abd0e7049113520283a287695c165", + "hash": "37b9125f574cfb3109d423800162a2c1", "contents": [ { "namespace": "Volo.Abp.SettingManagement", @@ -19,7 +19,7 @@ { "namespace": "Volo.Abp.SettingManagement", "summary": null, - "entityModel": { + "entityAnalyzeModel": { "namespace": "Volo.Abp.SettingManagement", "primaryKeyType": "Guid", "summary": null, diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/SettingManager.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/SettingManager.cs index 14629b988e..570c99925b 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/SettingManager.cs +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/SettingManager.cs @@ -27,7 +27,7 @@ public class SettingManager : ISettingManager, ISingletonDependency SettingEncryptionService = settingEncryptionService; Options = options.Value; - //TODO: Instead, use IHybridServiceScopeFactory and create a scope..? + //TODO: Instead, use IServiceScopeFactory and create a scope..? _lazyProviders = new Lazy>( () => Options diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.EntityFrameworkCore/Volo.Abp.SettingManagement.EntityFrameworkCore.abppkg.analyze.json b/modules/setting-management/src/Volo.Abp.SettingManagement.EntityFrameworkCore/Volo.Abp.SettingManagement.EntityFrameworkCore.abppkg.analyze.json index 75ede070e6..e119700c43 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.EntityFrameworkCore/Volo.Abp.SettingManagement.EntityFrameworkCore.abppkg.analyze.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.EntityFrameworkCore/Volo.Abp.SettingManagement.EntityFrameworkCore.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.Abp.SettingManagement.EntityFrameworkCore", - "hash": "5e5a522b88d7e38c08d7b2d24177c044", + "hash": "281c5814d423133456b6d0dc1b0b15f6", "contents": [ { "namespace": "Volo.Abp.SettingManagement.EntityFrameworkCore", diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.HttpApi.Client/Volo.Abp.SettingManagement.HttpApi.Client.abppkg.analyze.json b/modules/setting-management/src/Volo.Abp.SettingManagement.HttpApi.Client/Volo.Abp.SettingManagement.HttpApi.Client.abppkg.analyze.json index 8e2dd17e17..685d83a4e2 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.HttpApi.Client/Volo.Abp.SettingManagement.HttpApi.Client.abppkg.analyze.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.HttpApi.Client/Volo.Abp.SettingManagement.HttpApi.Client.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.Abp.SettingManagement.HttpApi.Client", - "hash": "ca14518fa6993b7549f98795d0814d4d", + "hash": "f10d64544023c35d3226a2306af07da9", "contents": [ { "namespace": "Volo.Abp.SettingManagement", diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.HttpApi/Volo.Abp.SettingManagement.HttpApi.abppkg.analyze.json b/modules/setting-management/src/Volo.Abp.SettingManagement.HttpApi/Volo.Abp.SettingManagement.HttpApi.abppkg.analyze.json index d20310027c..83d896dbf5 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.HttpApi/Volo.Abp.SettingManagement.HttpApi.abppkg.analyze.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.HttpApi/Volo.Abp.SettingManagement.HttpApi.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.Abp.SettingManagement.HttpApi", - "hash": "044618bbf045094718f03b1e0c259d2b", + "hash": "59743dcbb13f1d2f74de5cd7b8c7a201", "contents": [ { "namespace": "Volo.Abp.SettingManagement", diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Installer/Volo.Abp.SettingManagement.Installer.abppkg.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Installer/Volo.Abp.SettingManagement.Installer.abppkg.json deleted file mode 100644 index 9e26dfeeb6..0000000000 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Installer/Volo.Abp.SettingManagement.Installer.abppkg.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Installer/Volo.Abp.SettingManagement.Installer.csproj b/modules/setting-management/src/Volo.Abp.SettingManagement.Installer/Volo.Abp.SettingManagement.Installer.csproj index dd3daf7500..025fb08a62 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Installer/Volo.Abp.SettingManagement.Installer.csproj +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Installer/Volo.Abp.SettingManagement.Installer.csproj @@ -4,19 +4,21 @@ - net5.0 + net6.0 true - + + + diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.MongoDB/Volo.Abp.SettingManagement.MongoDB.abppkg.analyze.json b/modules/setting-management/src/Volo.Abp.SettingManagement.MongoDB/Volo.Abp.SettingManagement.MongoDB.abppkg.analyze.json index dae06ad7b7..f39b527779 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.MongoDB/Volo.Abp.SettingManagement.MongoDB.abppkg.analyze.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.MongoDB/Volo.Abp.SettingManagement.MongoDB.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.Abp.SettingManagement.MongoDB", - "hash": "3a6a752156846daef4c4439fd353a66d", + "hash": "3076173a94ee80efbd13cc883cc6a156", "contents": [ { "namespace": "Volo.Abp.SettingManagement.MongoDB", diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/AbpSettingManagementWebModule.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/AbpSettingManagementWebModule.cs index 61874c0b6b..b544d4a7bf 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/AbpSettingManagementWebModule.cs +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/AbpSettingManagementWebModule.cs @@ -1,7 +1,5 @@ -using Microsoft.AspNetCore.Mvc.RazorPages; -using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection; using Volo.Abp.AspNetCore.Mvc.Localization; -using Volo.Abp.AspNetCore.Mvc.UI.Bundling; using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared; using Volo.Abp.AutoMapper; using Volo.Abp.Http.ProxyScripting.Generators.JQuery; @@ -29,7 +27,7 @@ public class AbpSettingManagementWebModule : AbpModule { options.AddAssemblyResource(typeof(AbpSettingManagementResource), typeof(AbpSettingManagementWebModule).Assembly); }); - + PreConfigure(mvcBuilder => { mvcBuilder.AddApplicationPartIfNotExists(typeof(AbpSettingManagementWebModule).Assembly); @@ -54,21 +52,11 @@ public class AbpSettingManagementWebModule : AbpModule options.FileSets.AddEmbedded(); }); - Configure(options => - { - options.ScriptBundles - .Configure(typeof(IndexModel).FullName, - configuration => - { - configuration.AddFiles("/Pages/SettingManagement/Components/EmailSettingGroup/Default.js"); - }); - }); - Configure(options => { options.DisableModule(SettingManagementRemoteServiceConsts.ModuleName); }); - + context.Services.AddAutoMapperObjectMapper(); Configure(options => { diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Navigation/SettingManagementMainMenuContributor.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Navigation/SettingManagementMainMenuContributor.cs index 97eb89b6c6..a5775a8a42 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Navigation/SettingManagementMainMenuContributor.cs +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Navigation/SettingManagementMainMenuContributor.cs @@ -1,5 +1,4 @@ using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Options; using System.Linq; using System.Threading.Tasks; using Volo.Abp.Features; @@ -25,10 +24,8 @@ public class SettingManagementMainMenuContributor : IMenuContributor return; } - var settingManagementPageOptions = context.ServiceProvider.GetRequiredService>().Value; - var settingPageCreationContext = new SettingPageCreationContext(context.ServiceProvider); - if (!settingManagementPageOptions.Contributors.Any() || - !(await CheckAnyOfPagePermissionsGranted(settingManagementPageOptions, settingPageCreationContext))) + var settingPageContributorManager = context.ServiceProvider.GetRequiredService(); + if (!(await settingPageContributorManager.GetAvailableContributors()).Any()) { return; } @@ -46,18 +43,4 @@ public class SettingManagementMainMenuContributor : IMenuContributor ).RequireFeatures(SettingManagementFeatures.Enable) ); } - - protected virtual async Task CheckAnyOfPagePermissionsGranted( - SettingManagementPageOptions settingManagementPageOptions, - SettingPageCreationContext settingPageCreationContext) - { - foreach (var contributor in settingManagementPageOptions.Contributors) - { - if (await contributor.CheckPermissionsAsync(settingPageCreationContext)) - { - return true; - } - } - return false; - } } diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Components/EmailSettingGroup/Default.cshtml b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Components/EmailSettingGroup/Default.cshtml index caca43c1e1..a5e0275535 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Components/EmailSettingGroup/Default.cshtml +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Components/EmailSettingGroup/Default.cshtml @@ -6,6 +6,8 @@ @inject IPermissionChecker PermissionChecker @model Volo.Abp.SettingManagement.Web.Pages.SettingManagement.Components.EmailSettingGroup.EmailSettingGroupViewComponent.UpdateEmailSettingsViewModel + +
@@ -36,4 +38,4 @@ -
\ No newline at end of file + diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/ISettingPageContributor.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/ISettingPageContributor.cs index 4128e9cd05..7bf0653380 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/ISettingPageContributor.cs +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/ISettingPageContributor.cs @@ -1,4 +1,5 @@ -using System.Threading.Tasks; +using System; +using System.Threading.Tasks; namespace Volo.Abp.SettingManagement.Web.Pages.SettingManagement; @@ -6,5 +7,6 @@ public interface ISettingPageContributor { Task ConfigureAsync(SettingPageCreationContext context); + [Obsolete("Use SettingPageContributorBase as base class and call `RequiredPermissions` or `RequiredFeatures` for better performance.")] Task CheckPermissionsAsync(SettingPageCreationContext context); } diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Index.cshtml b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Index.cshtml index 6ee1d62299..0ff8e7d0ac 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Index.cshtml +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Index.cshtml @@ -21,19 +21,24 @@
- - @foreach (var group in Model.SettingPageCreationContext.Groups) - { - -

@group.DisplayName

-
- @await Component.InvokeAsync(group.ComponentType, new +
+
+ +
+
+
+
+
+
diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Index.cshtml.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Index.cshtml.cs index bf0b3e0d6b..de1bb4a4b4 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Index.cshtml.cs +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Index.cshtml.cs @@ -1,5 +1,7 @@ +using System.Linq; using System.Threading.Tasks; using Microsoft.Extensions.Options; +using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations; using Volo.Abp.AspNetCore.Mvc.UI.RazorPages; @@ -8,30 +10,25 @@ using Volo.Abp.Features; namespace Volo.Abp.SettingManagement.Web.Pages.SettingManagement; +[Authorize] [RequiresFeature(SettingManagementFeatures.Enable)] public class IndexModel : AbpPageModel { public SettingPageCreationContext SettingPageCreationContext { get; private set; } + protected SettingPageContributorManager SettingPageContributorManager { get; } + protected ILocalEventBus LocalEventBus { get; } - protected SettingManagementPageOptions Options { get; } - public IndexModel( - IOptions options, - ILocalEventBus localEventBus) + public IndexModel(ILocalEventBus localEventBus, SettingPageContributorManager settingPageContributorManager) { LocalEventBus = localEventBus; - Options = options.Value; + SettingPageContributorManager = settingPageContributorManager; } public virtual async Task OnGetAsync() { - SettingPageCreationContext = new SettingPageCreationContext(ServiceProvider); - - foreach (var contributor in Options.Contributors) - { - await contributor.ConfigureAsync(SettingPageCreationContext); - } + SettingPageCreationContext = await SettingPageContributorManager.ConfigureAsync(); return Page(); } @@ -41,6 +38,19 @@ public class IndexModel : AbpPageModel return Task.FromResult(Page()); } + public virtual async Task OnPostRenderViewAsync(string id) + { + var context = await SettingPageContributorManager.ConfigureAsync(); + + var view = context.Groups.FirstOrDefault(x => x.Id == id); + if (view != null) + { + return ViewComponent(view.ComponentType, view.Parameter); + } + + return NoContent(); + } + public virtual async Task OnPostRefreshConfigurationAsync() { await LocalEventBus.PublishAsync( diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Index.js b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Index.js index 8af1bb6715..07b40c2c38 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Index.js +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Index.js @@ -1,6 +1,30 @@ (function ($) { var l = abp.localization.getResource('AbpSettingManagement'); + $('#tabs-nav .nav-item .nav-link').click(function () { + var _this = $(this); + if(_this.attr('data-bs-target') !== undefined) { + return; + } + + var id = _this.data("id") + abp.ui.block({ + elm: '#tab-content', + busy: true, + promise: abp.ajax({ + type: 'POST', + url: 'SettingManagement?handler=RenderView&id=' + id, + dataType: "html", + contentType: false, + processData: false + }).done(function (response) { + $('#tab-content').children('.tab-pane').removeClass('show').removeClass('active'); + _this.attr('data-bs-target', '#' + $.escapeSelector($.escapeSelector(id))); + $('#tab-content').append('
' + response + '
'); + }) + }); + }).first().click(); + $(document).on('AbpSettingSaved', function () { abp.notify.success(l('SuccessfullySaved')); diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/SettingPageContributorBase.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/SettingPageContributorBase.cs new file mode 100644 index 0000000000..b79c452df9 --- /dev/null +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/SettingPageContributorBase.cs @@ -0,0 +1,59 @@ +using System.Collections.Generic; +using System.Threading.Tasks; +using Volo.Abp.MultiTenancy; + +namespace Volo.Abp.SettingManagement.Web.Pages.SettingManagement; + +public abstract class SettingPageContributorBase : ISettingPageContributor +{ + private readonly HashSet _requiredPermissions; + private readonly HashSet _requiredFeatures; + private readonly HashSet _requiredTenantSideFeatures; + + protected SettingPageContributorBase() + { + _requiredPermissions = new HashSet(); + _requiredFeatures = new HashSet(); + _requiredTenantSideFeatures = new HashSet(); + } + + protected virtual SettingPageContributorBase RequiredPermissions(params string[] permissions) + { + Check.NotNullOrEmpty(permissions, nameof(permissions)); + _requiredPermissions.AddIfNotContains(permissions); + return this; + } + + public virtual IReadOnlySet GetRequiredPermissions() + { + return _requiredPermissions; + } + + protected virtual SettingPageContributorBase RequiredFeatures(params string[] features) + { + Check.NotNullOrEmpty(features, nameof(features)); + _requiredFeatures.AddIfNotContains(features); + return this; + } + + protected virtual SettingPageContributorBase RequiredTenantSideFeatures(params string[] features) + { + Check.NotNullOrEmpty(features, nameof(features)); + _requiredTenantSideFeatures.AddIfNotContains(features); + return this; + } + + public virtual IReadOnlySet GetRequiredFeatures(MultiTenancySides? multiTenancySides = null) + { + return multiTenancySides == null || multiTenancySides != MultiTenancySides.Tenant + ? _requiredFeatures + : _requiredTenantSideFeatures; + } + + public abstract Task ConfigureAsync(SettingPageCreationContext context); + + public virtual Task CheckPermissionsAsync(SettingPageCreationContext context) + { + return Task.FromResult(true); + } +} diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/SettingPageContributorManager.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/SettingPageContributorManager.cs new file mode 100644 index 0000000000..9b08236cae --- /dev/null +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/SettingPageContributorManager.cs @@ -0,0 +1,101 @@ +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; +using Volo.Abp.Authorization.Permissions; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Features; +using Volo.Abp.MultiTenancy; + +namespace Volo.Abp.SettingManagement.Web.Pages.SettingManagement; + +public class SettingPageContributorManager : IScopedDependency +{ + protected IServiceProvider ServiceProvider { get; } + + protected ConcurrentDictionary> CachedAvailableContributors { get; set; } + + public SettingPageContributorManager(IServiceProvider serviceProvider) + { + ServiceProvider = serviceProvider; + CachedAvailableContributors = new ConcurrentDictionary>(); + } + + public virtual async Task> GetAvailableContributors() + { + return CachedAvailableContributors.GetOrAdd(nameof(SettingPageContributorManager), await GetAvailableContributorsInternalAsync()); + } + + public virtual async Task ConfigureAsync() + { + var contributors = CachedAvailableContributors.GetOrAdd(nameof(SettingPageContributorManager), await GetAvailableContributorsInternalAsync()); + var context = new SettingPageCreationContext(ServiceProvider); + foreach (var contributor in contributors) + { + await contributor.ConfigureAsync(context); + } + return context; + } + + protected virtual async Task> GetAvailableContributorsInternalAsync() + { + var contributors = ServiceProvider.GetRequiredService>().Value.Contributors; + var contributorBases = contributors.Where(x => x is SettingPageContributorBase).Cast().ToList(); + + var permissions = new HashSet(); + permissions.AddIfNotContains(contributorBases.SelectMany(x => x.GetRequiredPermissions())); + + var featureChecker = ServiceProvider.GetRequiredService(); + var permissionChecker = ServiceProvider.GetRequiredService(); + var grantResult = await permissionChecker.IsGrantedAsync(permissions.ToArray()); + + var availableContributors = new List(); + foreach (var contributor in contributorBases) + { + var available = true; + + var requiredFeatures = contributor.GetRequiredFeatures(); + if (requiredFeatures.Any() && !await featureChecker.IsEnabledAsync(true, requiredFeatures.ToArray())) + { + available = false; + } + + if (available) + { + var requiredTenantSideFeatures = contributor.GetRequiredFeatures(MultiTenancySides.Tenant); + if (requiredTenantSideFeatures.Any() && + ServiceProvider.GetRequiredService().IsAvailable && + !await featureChecker.IsEnabledAsync(true, requiredTenantSideFeatures.ToArray())) + { + available = false; + } + } + + if (available) + { + available = contributor.GetRequiredPermissions().All(x => grantResult.Result.ContainsKey(x) && grantResult.Result[x] == PermissionGrantResult.Granted); + } + + if (available) + { + availableContributors.Add(contributor); + } + } + + var context = new SettingPageCreationContext(ServiceProvider); + foreach (var contributor in contributors.Where(x => x is not SettingPageContributorBase)) + { +#pragma warning disable CS0618 + if (await contributor.CheckPermissionsAsync(context)) +#pragma warning restore CS0618 + { + availableContributors.Add(contributor); + } + } + + return availableContributors; + } +} diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Settings/EmailingPageContributor.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Settings/EmailingPageContributor.cs index 35e6714b9f..c166ad873e 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Settings/EmailingPageContributor.cs +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Settings/EmailingPageContributor.cs @@ -1,24 +1,22 @@ using System.Threading.Tasks; -using Microsoft.AspNetCore.Authorization; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Localization; -using Volo.Abp.Features; -using Volo.Abp.MultiTenancy; using Volo.Abp.SettingManagement.Localization; using Volo.Abp.SettingManagement.Web.Pages.SettingManagement; using Volo.Abp.SettingManagement.Web.Pages.SettingManagement.Components.EmailSettingGroup; namespace Volo.Abp.SettingManagement.Web.Settings; -public class EmailingPageContributor : ISettingPageContributor +public class EmailingPageContributor : SettingPageContributorBase { - public async Task ConfigureAsync(SettingPageCreationContext context) + public EmailingPageContributor() + { + RequiredFeatures(SettingManagementFeatures.Enable); + RequiredTenantSideFeatures(SettingManagementFeatures.AllowChangingEmailSettings); + RequiredPermissions(SettingManagementPermissions.Emailing); + } + public override Task ConfigureAsync(SettingPageCreationContext context) { - if (!await CheckPermissionsInternalAsync(context)) - { - return; - } - var l = context.ServiceProvider.GetRequiredService>(); context.Groups.Add( new SettingPageGroup( @@ -27,38 +25,6 @@ public class EmailingPageContributor : ISettingPageContributor typeof(EmailSettingGroupViewComponent) ) ); - } - - public async Task CheckPermissionsAsync(SettingPageCreationContext context) - { - return await CheckPermissionsInternalAsync(context); - } - - private async Task CheckPermissionsInternalAsync(SettingPageCreationContext context) - { - if (!await CheckFeatureAsync(context)) - { - return false; - } - - var authorizationService = context.ServiceProvider.GetRequiredService(); - - return await authorizationService.IsGrantedAsync(SettingManagementPermissions.Emailing); - } - - private async Task CheckFeatureAsync(SettingPageCreationContext context) - { - var featureCheck = context.ServiceProvider.GetRequiredService(); - if (!await featureCheck.IsEnabledAsync(SettingManagementFeatures.Enable)) - { - return false; - } - - if (context.ServiceProvider.GetRequiredService().IsAvailable) - { - return await featureCheck.IsEnabledAsync(SettingManagementFeatures.AllowTenantsToChangeEmailSettings); - } - - return true; + return Task.CompletedTask; } } diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Volo.Abp.SettingManagement.Web.abppkg.analyze.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Volo.Abp.SettingManagement.Web.abppkg.analyze.json index d762d873e6..ed7adadfb8 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Volo.Abp.SettingManagement.Web.abppkg.analyze.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Volo.Abp.SettingManagement.Web.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.Abp.SettingManagement.Web", - "hash": "d15735d7c144ce17f981b8ec57f4c12c", + "hash": "b9a83b6936769cdbfb1b0fed8653d0d2", "contents": [ { "namespace": "Volo.Abp.SettingManagement.Web", diff --git a/modules/tenant-management/Volo.Abp.TenantManagement.abpmdl.json b/modules/tenant-management/Volo.Abp.TenantManagement.abpmdl.json index 59d9142d58..f9094439d8 100644 --- a/modules/tenant-management/Volo.Abp.TenantManagement.abpmdl.json +++ b/modules/tenant-management/Volo.Abp.TenantManagement.abpmdl.json @@ -73,10 +73,6 @@ "Volo.Abp.TenantManagement.Blazor.Server": { "path": "src/Volo.Abp.TenantManagement.Blazor.Server/Volo.Abp.TenantManagement.Blazor.Server.abppkg.json", "folder": "src" - }, - "Volo.Abp.TenantManagement.Installer": { - "path": "src/Volo.Abp.TenantManagement.Installer/Volo.Abp.TenantManagement.Installer.abppkg.json", - "folder": "src" } } } \ No newline at end of file diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Application/Volo.Abp.TenantManagement.Application.abppkg.analyze.json b/modules/tenant-management/src/Volo.Abp.TenantManagement.Application/Volo.Abp.TenantManagement.Application.abppkg.analyze.json index aafa40ff93..dbd0c8310e 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Application/Volo.Abp.TenantManagement.Application.abppkg.analyze.json +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Application/Volo.Abp.TenantManagement.Application.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.Abp.TenantManagement.Application", - "hash": "f22443bf5a086ca029a9ed79168d496b", + "hash": "e3fb4eb7a1c4736363c87e8d2a4ae3ad", "contents": [ { "namespace": "Volo.Abp.TenantManagement", @@ -12,12 +12,12 @@ "summary": null, "implementingInterfaces": [ "Volo.Abp.TenantManagement.ITenantAppService", - "Volo.Abp.Application.Services.ICrudAppService`5[[Volo.Abp.TenantManagement.TenantDto, Volo.Abp.TenantManagement.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null],[System.Guid, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[Volo.Abp.TenantManagement.GetTenantsInput, Volo.Abp.TenantManagement.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null],[Volo.Abp.TenantManagement.TenantCreateDto, Volo.Abp.TenantManagement.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null],[Volo.Abp.TenantManagement.TenantUpdateDto, Volo.Abp.TenantManagement.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null]]", - "Volo.Abp.Application.Services.ICrudAppService`6[[Volo.Abp.TenantManagement.TenantDto, Volo.Abp.TenantManagement.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null],[Volo.Abp.TenantManagement.TenantDto, Volo.Abp.TenantManagement.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null],[System.Guid, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[Volo.Abp.TenantManagement.GetTenantsInput, Volo.Abp.TenantManagement.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null],[Volo.Abp.TenantManagement.TenantCreateDto, Volo.Abp.TenantManagement.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null],[Volo.Abp.TenantManagement.TenantUpdateDto, Volo.Abp.TenantManagement.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null]]", - "Volo.Abp.Application.Services.IReadOnlyAppService`4[[Volo.Abp.TenantManagement.TenantDto, Volo.Abp.TenantManagement.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null],[Volo.Abp.TenantManagement.TenantDto, Volo.Abp.TenantManagement.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null],[System.Guid, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[Volo.Abp.TenantManagement.GetTenantsInput, Volo.Abp.TenantManagement.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null]]", - "Volo.Abp.Application.Services.ICreateUpdateAppService`4[[Volo.Abp.TenantManagement.TenantDto, Volo.Abp.TenantManagement.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null],[System.Guid, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[Volo.Abp.TenantManagement.TenantCreateDto, Volo.Abp.TenantManagement.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null],[Volo.Abp.TenantManagement.TenantUpdateDto, Volo.Abp.TenantManagement.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null]]", - "Volo.Abp.Application.Services.ICreateAppService`2[[Volo.Abp.TenantManagement.TenantDto, Volo.Abp.TenantManagement.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null],[Volo.Abp.TenantManagement.TenantCreateDto, Volo.Abp.TenantManagement.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null]]", - "Volo.Abp.Application.Services.IUpdateAppService`3[[Volo.Abp.TenantManagement.TenantDto, Volo.Abp.TenantManagement.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null],[System.Guid, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[Volo.Abp.TenantManagement.TenantUpdateDto, Volo.Abp.TenantManagement.Application.Contracts, Version=5.1.0.0, Culture=neutral, PublicKeyToken=null]]", + "Volo.Abp.Application.Services.ICrudAppService`5[[Volo.Abp.TenantManagement.TenantDto, Volo.Abp.TenantManagement.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null],[System.Guid, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[Volo.Abp.TenantManagement.GetTenantsInput, Volo.Abp.TenantManagement.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null],[Volo.Abp.TenantManagement.TenantCreateDto, Volo.Abp.TenantManagement.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null],[Volo.Abp.TenantManagement.TenantUpdateDto, Volo.Abp.TenantManagement.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null]]", + "Volo.Abp.Application.Services.ICrudAppService`6[[Volo.Abp.TenantManagement.TenantDto, Volo.Abp.TenantManagement.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null],[Volo.Abp.TenantManagement.TenantDto, Volo.Abp.TenantManagement.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null],[System.Guid, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[Volo.Abp.TenantManagement.GetTenantsInput, Volo.Abp.TenantManagement.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null],[Volo.Abp.TenantManagement.TenantCreateDto, Volo.Abp.TenantManagement.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null],[Volo.Abp.TenantManagement.TenantUpdateDto, Volo.Abp.TenantManagement.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null]]", + "Volo.Abp.Application.Services.IReadOnlyAppService`4[[Volo.Abp.TenantManagement.TenantDto, Volo.Abp.TenantManagement.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null],[Volo.Abp.TenantManagement.TenantDto, Volo.Abp.TenantManagement.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null],[System.Guid, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[Volo.Abp.TenantManagement.GetTenantsInput, Volo.Abp.TenantManagement.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null]]", + "Volo.Abp.Application.Services.ICreateUpdateAppService`4[[Volo.Abp.TenantManagement.TenantDto, Volo.Abp.TenantManagement.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null],[System.Guid, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[Volo.Abp.TenantManagement.TenantCreateDto, Volo.Abp.TenantManagement.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null],[Volo.Abp.TenantManagement.TenantUpdateDto, Volo.Abp.TenantManagement.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null]]", + "Volo.Abp.Application.Services.ICreateAppService`2[[Volo.Abp.TenantManagement.TenantDto, Volo.Abp.TenantManagement.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null],[Volo.Abp.TenantManagement.TenantCreateDto, Volo.Abp.TenantManagement.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null]]", + "Volo.Abp.Application.Services.IUpdateAppService`3[[Volo.Abp.TenantManagement.TenantDto, Volo.Abp.TenantManagement.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null],[System.Guid, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[Volo.Abp.TenantManagement.TenantUpdateDto, Volo.Abp.TenantManagement.Application.Contracts, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null]]", "Volo.Abp.Application.Services.IDeleteAppService`1[[System.Guid, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]]" ], "contentType": "applicationService", diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Blazor/Pages/TenantManagement/TenantManagement.razor.cs b/modules/tenant-management/src/Volo.Abp.TenantManagement.Blazor/Pages/TenantManagement/TenantManagement.razor.cs index 0f0e689f2f..5969237a21 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Blazor/Pages/TenantManagement/TenantManagement.razor.cs +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Blazor/Pages/TenantManagement/TenantManagement.razor.cs @@ -40,6 +40,13 @@ public partial class TenantManagement ManageFeaturesPolicyName = TenantManagementPermissions.Tenants.ManageFeatures; } + protected override ValueTask SetBreadcrumbItemsAsync() + { + BreadcrumbItems.Add(new BlazoriseUI.BreadcrumbItem(L["Menu:TenantManagement"])); + BreadcrumbItems.Add(new BlazoriseUI.BreadcrumbItem(L["Tenants"])); + return base.SetBreadcrumbItemsAsync(); + } + protected override async Task SetPermissionsAsync() { await base.SetPermissionsAsync(); @@ -54,11 +61,6 @@ public partial class TenantManagement protected override ValueTask SetToolbarItemsAsync() { - Toolbar.AddButton(L["ManageHostFeatures"], - async () => await FeatureManagementModal.OpenAsync(FeatureProviderName), - "fa fa-cog", - requiredPolicyName: FeatureManagementPermissions.ManageHostFeatures); - Toolbar.AddButton(L["NewTenant"], OpenCreateModalAsync, IconName.Add, diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo.Abp.TenantManagement.Domain.Shared.abppkg.analyze.json b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo.Abp.TenantManagement.Domain.Shared.abppkg.analyze.json index 00d40e3ca1..90d191d05b 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo.Abp.TenantManagement.Domain.Shared.abppkg.analyze.json +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo.Abp.TenantManagement.Domain.Shared.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.Abp.TenantManagement.Domain.Shared", - "hash": "e1a3dc97dda872a01da2654848372f27", + "hash": "321266e827d59b7f3da4d631cc7f1b35", "contents": [ { "namespace": "Volo.Abp.TenantManagement", diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/AbpTenantManagementDomainSharedModule.cs b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/AbpTenantManagementDomainSharedModule.cs index e0ce655235..5b388d9078 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/AbpTenantManagementDomainSharedModule.cs +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/AbpTenantManagementDomainSharedModule.cs @@ -1,6 +1,7 @@ using Volo.Abp.Localization; using Volo.Abp.Modularity; using Volo.Abp.TenantManagement.Localization; +using Volo.Abp.Localization.ExceptionHandling; using Volo.Abp.Validation; using Volo.Abp.Validation.Localization; using Volo.Abp.VirtualFileSystem; @@ -25,5 +26,10 @@ public class AbpTenantManagementDomainSharedModule : AbpModule typeof(AbpValidationResource) ).AddVirtualJson("/Volo/Abp/TenantManagement/Localization/Resources"); }); + + Configure(options => + { + options.MapCodeNamespace("Volo.Abp.TenantManagement", typeof(AbpTenantManagementResource)); + }); } } diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/ar.json b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/ar.json index 134da8c601..8146974400 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/ar.json +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/ar.json @@ -1,6 +1,7 @@ { "culture": "ar", "texts": { + "Volo.Abp.TenantManagement:DuplicateTenantName": "اسم المستأجر موجود بالفعل: {Name}", "Menu:TenantManagement": "إدارة الجهات", "Tenants": "الجهات", "NewTenant": "جهة جديدة", @@ -10,7 +11,6 @@ "ConnectionStrings": "Connection Strings", "DisplayName:DefaultConnectionString": "Default Connection String", "DisplayName:UseSharedDatabase": "استخدام قاعدة البيانات المشتركة", - "ManageHostFeatures": "إدارة ميزات المضيف", "Permission:TenantManagement": "إدارة المستأجر", "Permission:Create": "إنشاء", "Permission:Edit": "تحرير", diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/cs.json b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/cs.json index 754b66d081..001d5d71fb 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/cs.json +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/cs.json @@ -10,7 +10,6 @@ "ConnectionStrings": "Connection stringy", "DisplayName:DefaultConnectionString": "Výchozí connection string", "DisplayName:UseSharedDatabase": "Použít sdílenou databázi", - "ManageHostFeatures": "Správa funkcí hostitele", "Permission:TenantManagement": "Správa tenantů", "Permission:Create": "Vytvořit", "Permission:Edit": "Upravit", diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/de-DE.json b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/de-DE.json index 16644b17aa..58d71c9252 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/de-DE.json +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/de-DE.json @@ -1,6 +1,7 @@ { "culture": "de-DE", "texts": { + "Volo.Abp.TenantManagement:DuplicateTenantName": "Der Name des Mandanten ist bereits vorhanden: {Name}", "Menu:TenantManagement": "Mandantenverwaltung", "Tenants": "Mandanten", "NewTenant": "Neuer Mandant", @@ -10,7 +11,6 @@ "ConnectionStrings": "Connection Strings", "DisplayName:DefaultConnectionString": "Standard-Connection String", "DisplayName:UseSharedDatabase": "Verwenden Sie die freigegebene Datenbank", - "ManageHostFeatures": "Host-Features verwalten", "Permission:TenantManagement": "Mandantenverwaltung", "Permission:Create": "Erstellen", "Permission:Edit": "Bearbeiten", diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/el.json b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/el.json index 026bcb0b76..bc75c34e03 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/el.json +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/el.json @@ -10,7 +10,6 @@ "ConnectionStrings": "Συμβολοσειρές σύνδεσης", "DisplayName:DefaultConnectionString": "Προεπιλεγμένη συμβολοσειρά σύνδεσης", "DisplayName:UseSharedDatabase": "Χρησιμοποιήστε την Κοινόχρηστη βάση δεδομένων", - "ManageHostFeatures": "Διαχείριση δυνατοτήτων του Οικοδεσπότη", "Permission:TenantManagement": "Διαχείριση ενοικιαστών", "Permission:Create": "Δημιουργία", "Permission:Edit": "Επεξεργασία", diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/en-GB.json b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/en-GB.json index 4d6075ff74..8b4e4c185b 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/en-GB.json +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/en-GB.json @@ -10,7 +10,6 @@ "ConnectionStrings": "Connection Strings", "DisplayName:DefaultConnectionString": "Default Connection String", "DisplayName:UseSharedDatabase": "Use the Shared Database", - "ManageHostFeatures": "Manage Host features", "Permission:TenantManagement": "Tenant management", "Permission:Create": "Create", "Permission:Edit": "Edit", diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/en.json b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/en.json index ba4109c392..e639feb5f3 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/en.json +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/en.json @@ -1,6 +1,7 @@ { "culture": "en", "texts": { + "Volo.Abp.TenantManagement:DuplicateTenantName": "Tenant name already exist: {Name}", "Menu:TenantManagement": "Tenant management", "Tenants": "Tenants", "NewTenant": "New tenant", @@ -10,7 +11,6 @@ "ConnectionStrings": "Connection Strings", "DisplayName:DefaultConnectionString": "Default Connection String", "DisplayName:UseSharedDatabase": "Use the Shared Database", - "ManageHostFeatures": "Manage Host features", "Permission:TenantManagement": "Tenant management", "Permission:Create": "Create", "Permission:Edit": "Edit", diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/es.json b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/es.json index cd18e3c33b..bcbfc98852 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/es.json +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/es.json @@ -1,6 +1,7 @@ { "culture": "es", "texts": { + "Volo.Abp.TenantManagement:DuplicateTenantName": "El nombre del inquilino ya existe: {Name}", "Menu:TenantManagement": "Gestión de tenants", "Tenants": "Inquilinos", "NewTenant": "Nuevo inquilino", @@ -10,7 +11,6 @@ "ConnectionStrings": "Connection Strings", "DisplayName:DefaultConnectionString": "Connection String predeterminado", "DisplayName:UseSharedDatabase": "Usar la base de datos compartida", - "ManageHostFeatures": "Administrar funciones de host", "Permission:TenantManagement": "Gestión de tenants", "Permission:Create": "Crear", "Permission:Edit": "Editar", diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/fa.json b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/fa.json index f0a804c073..c67a9c070b 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/fa.json +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/fa.json @@ -10,7 +10,6 @@ "ConnectionStrings": "کانکشن استرینگها", "DisplayName:DefaultConnectionString": "کانکشن استرینگ پیش فرض", "DisplayName:UseSharedDatabase": "استفاده از پایگاه داده مشترک", - "ManageHostFeatures": "مدیریت ویژگی های میزبان", "Permission:TenantManagement": "مدیریت تننت", "Permission:Create": "ایجاد", "Permission:Edit": "ویرایش", diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/fi.json b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/fi.json index cae6bf6cac..179ec3c1d6 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/fi.json +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/fi.json @@ -1,6 +1,7 @@ { "culture": "fi", "texts": { + "Volo.Abp.TenantManagement:DuplicateTenantName": "Vuokralaisen nimi on jo olemassa: {Name}", "Menu:TenantManagement": "Vuokralaisten hallinta", "Tenants": "Vuokralaiset", "NewTenant": "Uusi vuokralainen", @@ -10,7 +11,6 @@ "ConnectionStrings": "Yhteysjonot", "DisplayName:DefaultConnectionString": "Oletusyhteysmerkkijono", "DisplayName:UseSharedDatabase": "Käytä jaettua tietokantaa", - "ManageHostFeatures": "Hallinnoi isäntäominaisuuksia", "Permission:TenantManagement": "Vuokralaisten hallinta", "Permission:Create": "Luoda", "Permission:Edit": "Muokata", diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/fr.json b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/fr.json index 4aac3eebab..3537ca8ca6 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/fr.json +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/fr.json @@ -1,6 +1,7 @@ { "culture": "fr", "texts": { + "Volo.Abp.TenantManagement:DuplicateTenantName": "Le nom du locataire existe déjà: {Name}", "Menu:TenantManagement": "Gestion des locataires", "Tenants": "Locataires", "NewTenant": "Nouveau locataire", @@ -10,7 +11,6 @@ "ConnectionStrings": "Chaînes de connexion", "DisplayName:DefaultConnectionString": "Chaîne de connexion par défaut", "DisplayName:UseSharedDatabase": "Utiliser la base de données partagée", - "ManageHostFeatures": "Gérer les fonctionnalités de l’hôte", "Permission:TenantManagement": "Gestion des locataires", "Permission:Create": "Créer", "Permission:Edit": "Modifier", diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/hi.json b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/hi.json index 1094744a16..70367305a9 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/hi.json +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/hi.json @@ -1,6 +1,7 @@ { "culture": "hi", "texts": { + "Volo.Abp.TenantManagement:DuplicateTenantName": "किरायेदार नाम पहले से मौजूद है: {Name}", "Menu:TenantManagement": "किरायेदार प्रबंधन", "Tenants": "किरायेदारों", "NewTenant": "नया किरायेदार", @@ -10,7 +11,6 @@ "ConnectionStrings": "कनेक्शन स्ट्रिंग्स", "DisplayName:DefaultConnectionString": "डिफ़ॉल्ट कनेक्शन स्ट्रिंग", "DisplayName:UseSharedDatabase": "साझा डेटाबेस का उपयोग करें", - "ManageHostFeatures": "होस्ट सुविधाएँ प्रबंधित करें", "Permission:TenantManagement": "किरायेदार प्रबंधन", "Permission:Create": "सृजन करना", "Permission:Edit": "संपादित करें", diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/hu.json b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/hu.json index 60c61c15cf..f4ccb64b0a 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/hu.json +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/hu.json @@ -10,7 +10,6 @@ "ConnectionStrings": "Kapcsolat beállítás", "DisplayName:DefaultConnectionString": "Alapértelmezettt kapcsolati beállítás", "DisplayName:UseSharedDatabase": "Használjon megosztott adatbázist", - "ManageHostFeatures": "Host funkciók kezelése", "Permission:TenantManagement": "Bérlő menedzsment", "Permission:Create": "Létrehozás", "Permission:Edit": "Szerkesztés", diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/is.json b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/is.json index 25c6a86ca3..ca2a8cb7a9 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/is.json +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/is.json @@ -10,7 +10,6 @@ "ConnectionStrings": "Tengi strengir", "DisplayName:DefaultConnectionString": "Sjálfgefin tengistrengur", "DisplayName:UseSharedDatabase": "Notaðu samnýttan gagnagrunn", - "ManageHostFeatures": "Stjórna Gestgjafa Eiginleikum", "Permission:TenantManagement": "Tenant umsjá", "Permission:Create": "Búa til", "Permission:Edit": "Breyta", diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/it.json b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/it.json index c80b7974ab..5d95e2039c 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/it.json +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/it.json @@ -1,6 +1,7 @@ { "culture": "it", "texts": { + "Volo.Abp.TenantManagement:DuplicateTenantName": "Il nome del tenant esiste già: {Name}", "Menu:TenantManagement": "Gestione tenants", "Tenants": "Tenants", "NewTenant": "Nuovo Tenant", @@ -10,7 +11,6 @@ "ConnectionStrings": "Stringhe di connessione", "DisplayName:DefaultConnectionString": "Stringa di connessione predefinita", "DisplayName:UseSharedDatabase": "Usa il database condiviso", - "ManageHostFeatures": "Gestisci le funzionalità dell'host", "Permission:TenantManagement": "Gestione Tenant", "Permission:Create": "Crea", "Permission:Edit": "Modifica", diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/nl.json b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/nl.json index d4c45b8aad..1aeb208560 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/nl.json +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/nl.json @@ -10,7 +10,6 @@ "ConnectionStrings": "Connection Strings", "DisplayName:DefaultConnectionString": "Standaard Connection String", "DisplayName:UseSharedDatabase": "Gebruik de gedeelde database", - "ManageHostFeatures": "Beheer host functies", "Permission:TenantManagement": "Klanten beheer", "Permission:Create": "Maak aan", "Permission:Edit": "Bewerk", diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/pl-PL.json b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/pl-PL.json index c62c67123e..6ec40c7310 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/pl-PL.json +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/pl-PL.json @@ -10,7 +10,6 @@ "ConnectionStrings": "Connection Strings", "DisplayName:DefaultConnectionString": "Domyślny Connection String", "DisplayName:UseSharedDatabase": "Użyj współdzielonej bazy danych", - "ManageHostFeatures": "Zarządzaj funkcjami hosta", "Permission:TenantManagement": "Zarządzanie tenantami", "Permission:Create": "Utwórz", "Permission:Edit": "Edytuj", diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/pt-BR.json b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/pt-BR.json index 6f43740161..d9f6b14a69 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/pt-BR.json +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/pt-BR.json @@ -1,6 +1,7 @@ { "culture": "pt-BR", "texts": { + "Volo.Abp.TenantManagement:DuplicateTenantName": "O nome do ambiente já existe: {Name}", "Menu:TenantManagement": "Gerencimento de Inquilinos", "Tenants": "Inquilinos", "NewTenant": "Novo Inquilino", @@ -10,7 +11,6 @@ "ConnectionStrings": "Cadeia de Conexão", "DisplayName:DefaultConnectionString": "Cadeia de Conexão Padrão", "DisplayName:UseSharedDatabase": "Use o banco de dados compartilhado", - "ManageHostFeatures": "Gerenciar recursos do Host", "Permission:TenantManagement": "Inquilinos", "Permission:Create": "Criar", "Permission:Edit": "Editar", diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/ro-RO.json b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/ro-RO.json index 70147d9921..18bf9fb74e 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/ro-RO.json +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/ro-RO.json @@ -10,7 +10,6 @@ "ConnectionStrings": "Connection Strings", "DisplayName:DefaultConnectionString": "Connection String implicit", "DisplayName:UseSharedDatabase": "Folosiţi baza de date partajată", - "ManageHostFeatures": "Administraţi caracteristicile de host", "Permission:TenantManagement": "Administrarea clienţilor", "Permission:Create": "Creează", "Permission:Edit": "Editează", diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/ru.json b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/ru.json index 9e5732bbd7..2204cf35cf 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/ru.json +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/ru.json @@ -1,6 +1,7 @@ { "culture": "ru", "texts": { + "Volo.Abp.TenantManagement:DuplicateTenantName": "Имя арендатора уже существует: {Name}", "Menu:TenantManagement": "Управление арендаторами", "Tenants": "Арендаторы", "NewTenant": "Новый арендатор", @@ -10,7 +11,6 @@ "ConnectionStrings": "Строки подключения", "DisplayName:DefaultConnectionString": "Строка подключения по умолчанию", "DisplayName:UseSharedDatabase": "Использование общей базы данных", - "ManageHostFeatures": "Управление функциями хоста", "Permission:TenantManagement": "Управление арендаторами", "Permission:Create": "Создать", "Permission:Edit": "Редактировать", diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/sk.json b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/sk.json index df3cd3dd13..1aff65e71c 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/sk.json +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/sk.json @@ -1,6 +1,7 @@ { "culture": "sk", "texts": { + "Volo.Abp.TenantManagement:DuplicateTenantName": "Názov tenanta už existuje: {Name}", "Menu:TenantManagement": "Správa tenantov", "Tenants": "Tentanti", "NewTenant": "Nový tenant", @@ -10,7 +11,6 @@ "ConnectionStrings": "Connection stringy", "DisplayName:DefaultConnectionString": "Predvolený connection string", "DisplayName:UseSharedDatabase": "Použiť zdieľanú databázu", - "ManageHostFeatures": "Spravovať funkcie poskytovateľa", "Permission:TenantManagement": "Správa tenantov", "Permission:Create": "Vytvoriť", "Permission:Edit": "Upraviť", diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/sl.json b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/sl.json index b9df388d7c..a21cfa702a 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/sl.json +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/sl.json @@ -1,6 +1,7 @@ { "culture": "sl", "texts": { + "Volo.Abp.TenantManagement:DuplicateTenantName": "Ime najemnika že obstaja: {Name}", "Menu:TenantManagement": "Upravljanje najemnikov", "Tenants": "Najemniki", "NewTenant": "Nov najemnik", @@ -10,7 +11,6 @@ "ConnectionStrings": "Connection Strings", "DisplayName:DefaultConnectionString": "Privzeti Connection String", "DisplayName:UseSharedDatabase": "Uporabi skupno bazo", - "ManageHostFeatures": "Upravljajte funkcije gostitelja", "Permission:TenantManagement": "Upravljanje najemnikov", "Permission:Create": "Ustvarjanje", "Permission:Edit": "Urejanje", diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/tr.json b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/tr.json index 25ca3f2407..409aa40795 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/tr.json +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/tr.json @@ -1,6 +1,7 @@ { "culture": "tr", "texts": { + "Volo.Abp.TenantManagement:DuplicateTenantName": "Müşteri ismi zaten mevcut: {Name}", "Menu:TenantManagement": "Müşteri yönetimi", "Tenants": "Müşteriler", "NewTenant": "Yeni müşteri", @@ -10,7 +11,6 @@ "ConnectionStrings": "Bağlantı cümlesi", "DisplayName:DefaultConnectionString": "Varsayılan bağlantı cümlesi", "DisplayName:UseSharedDatabase": "Paylaşılan veritabanını kullan", - "ManageHostFeatures": "Host özelliklerini yönetin", "Permission:TenantManagement": "Müşteri yönetimi", "Permission:Create": "Oluşturma", "Permission:Edit": "Düzenleme", diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/vi.json b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/vi.json index 025ec04eb6..4fafa9cc72 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/vi.json +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/vi.json @@ -10,7 +10,6 @@ "ConnectionStrings": "Chuỗi kết nối", "DisplayName:DefaultConnectionString": "Chuỗi kết nối mặc định", "DisplayName:UseSharedDatabase": "Sử dụng cơ sở dữ liệu dùng chung", - "ManageHostFeatures": "Quản lý các tính năng của Máy chủ lưu trữ", "Permission:TenantManagement": "Quản lý khách thuê", "Permission:Create": "Tạo", "Permission:Edit": "Sửa", diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/zh-Hans.json b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/zh-Hans.json index 034d4bac81..0367489a5a 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/zh-Hans.json +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/zh-Hans.json @@ -1,6 +1,7 @@ { "culture": "zh-Hans", "texts": { + "Volo.Abp.TenantManagement:DuplicateTenantName": "租户名称已存在: {Name}", "Menu:TenantManagement": "租户管理", "Tenants": "租户", "NewTenant": "新租户", @@ -10,7 +11,6 @@ "ConnectionStrings": "连接字符串", "DisplayName:DefaultConnectionString": "默认连接字符串", "DisplayName:UseSharedDatabase": "使用共享数据库", - "ManageHostFeatures": "管理Host特性", "Permission:TenantManagement": "租户管理", "Permission:Create": "创建", "Permission:Edit": "编辑", diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/zh-Hant.json b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/zh-Hant.json index 6950a1ca00..59519aff67 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/zh-Hant.json +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/zh-Hant.json @@ -1,6 +1,7 @@ { "culture": "zh-Hant", "texts": { + "Volo.Abp.TenantManagement:DuplicateTenantName": "租戶名稱已存在: {Name}", "Menu:TenantManagement": "租戶管理", "Tenants": "租戶", "NewTenant": "新租戶", @@ -10,7 +11,6 @@ "ConnectionStrings": "資料庫連線字串", "DisplayName:DefaultConnectionString": "預設資料庫連線字串", "DisplayName:UseSharedDatabase": "使用共用資料庫", - "ManageHostFeatures": "管理Host功能", "Permission:TenantManagement": "租戶管理", "Permission:Create": "新增", "Permission:Edit": "編輯", diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo.Abp.TenantManagement.Domain.abppkg.analyze.json b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo.Abp.TenantManagement.Domain.abppkg.analyze.json index edfcf848b4..015339fb54 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo.Abp.TenantManagement.Domain.abppkg.analyze.json +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo.Abp.TenantManagement.Domain.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.Abp.TenantManagement.Domain", - "hash": "d955af240e89637de32065b2e7512ba6", + "hash": "544cd2646fa5aefb1b053044cb6f05ac", "contents": [ { "namespace": "Volo.Abp.TenantManagement", @@ -27,7 +27,7 @@ { "namespace": "Volo.Abp.TenantManagement", "summary": null, - "entityModel": { + "entityAnalyzeModel": { "namespace": "Volo.Abp.TenantManagement", "primaryKeyType": "Guid", "summary": null, diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo/Abp/TenantManagement/TenantManager.cs b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo/Abp/TenantManagement/TenantManager.cs index 8fc75d2ecb..fa388426d9 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo/Abp/TenantManagement/TenantManager.cs +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo/Abp/TenantManagement/TenantManager.cs @@ -36,7 +36,7 @@ public class TenantManager : DomainService, ITenantManager var tenant = await TenantRepository.FindByNameAsync(name); if (tenant != null && tenant.Id != expectedId) { - throw new UserFriendlyException("Duplicate tenancy name: " + name); //TODO: A domain exception would be better..? + throw new BusinessException("Volo.Abp.TenantManagement:DuplicateTenantName").WithData("Name", name); } } } diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.EntityFrameworkCore/Volo.Abp.TenantManagement.EntityFrameworkCore.abppkg.analyze.json b/modules/tenant-management/src/Volo.Abp.TenantManagement.EntityFrameworkCore/Volo.Abp.TenantManagement.EntityFrameworkCore.abppkg.analyze.json index bdc0849d32..9dcd2ceb40 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.EntityFrameworkCore/Volo.Abp.TenantManagement.EntityFrameworkCore.abppkg.analyze.json +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.EntityFrameworkCore/Volo.Abp.TenantManagement.EntityFrameworkCore.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.Abp.TenantManagement.EntityFrameworkCore", - "hash": "fc2ab48e90129aee164949aa4a911c12", + "hash": "cc176b58ce26ec8ca281d7db5f8b55df", "contents": [ { "namespace": "Volo.Abp.TenantManagement.EntityFrameworkCore", diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.HttpApi.Client/Volo.Abp.TenantManagement.HttpApi.Client.abppkg.analyze.json b/modules/tenant-management/src/Volo.Abp.TenantManagement.HttpApi.Client/Volo.Abp.TenantManagement.HttpApi.Client.abppkg.analyze.json index c46bb08a84..d0b1726536 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.HttpApi.Client/Volo.Abp.TenantManagement.HttpApi.Client.abppkg.analyze.json +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.HttpApi.Client/Volo.Abp.TenantManagement.HttpApi.Client.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.Abp.TenantManagement.HttpApi.Client", - "hash": "623748194a73757a698843974e2631dd", + "hash": "2fb37e3d0c9d07bcced213c49fd19560", "contents": [ { "namespace": "Volo.Abp.TenantManagement", diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.HttpApi/Volo.Abp.TenantManagement.HttpApi.abppkg.analyze.json b/modules/tenant-management/src/Volo.Abp.TenantManagement.HttpApi/Volo.Abp.TenantManagement.HttpApi.abppkg.analyze.json index c09e5df449..3ad61aca51 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.HttpApi/Volo.Abp.TenantManagement.HttpApi.abppkg.analyze.json +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.HttpApi/Volo.Abp.TenantManagement.HttpApi.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.Abp.TenantManagement.HttpApi", - "hash": "0c2fe9349a905f12458f6fea6d44a5fc", + "hash": "c34255a325178f08298699fad7f58a4a", "contents": [ { "namespace": "Volo.Abp.TenantManagement", diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Installer/Volo.Abp.TenantManagement.Installer.abppkg.json b/modules/tenant-management/src/Volo.Abp.TenantManagement.Installer/Volo.Abp.TenantManagement.Installer.abppkg.json deleted file mode 100644 index 9e26dfeeb6..0000000000 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Installer/Volo.Abp.TenantManagement.Installer.abppkg.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Installer/Volo.Abp.TenantManagement.Installer.csproj b/modules/tenant-management/src/Volo.Abp.TenantManagement.Installer/Volo.Abp.TenantManagement.Installer.csproj index 13fa3e195f..5c6b70856d 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Installer/Volo.Abp.TenantManagement.Installer.csproj +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Installer/Volo.Abp.TenantManagement.Installer.csproj @@ -4,19 +4,21 @@ - net5.0 + net6.0 true - + + + diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.MongoDB/Volo.Abp.TenantManagement.MongoDB.abppkg.analyze.json b/modules/tenant-management/src/Volo.Abp.TenantManagement.MongoDB/Volo.Abp.TenantManagement.MongoDB.abppkg.analyze.json index 64353bbb7f..0a6d272621 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.MongoDB/Volo.Abp.TenantManagement.MongoDB.abppkg.analyze.json +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.MongoDB/Volo.Abp.TenantManagement.MongoDB.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.Abp.TenantManagement.MongoDB", - "hash": "d6e949817650dd34e2adbf7504c0817a", + "hash": "3f9b80d90eb20c165b93c0d785a4430f", "contents": [ { "namespace": "Volo.Abp.TenantManagement.MongoDB", diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/AbpTenantManagementWebModule.cs b/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/AbpTenantManagementWebModule.cs index 1ac62db5e2..b3a63fb8ae 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/AbpTenantManagementWebModule.cs +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/AbpTenantManagementWebModule.cs @@ -69,13 +69,6 @@ public class AbpTenantManagementWebModule : AbpModule options.Configure( toolbar => { - toolbar.AddButton( - LocalizableString.Create("ManageHostFeatures"), - icon: "cog", - name: "ManageHostFeatures", - requiredPolicyName: FeatureManagementPermissions.ManageHostFeatures - ); - toolbar.AddButton( LocalizableString.Create("NewTenant"), icon: "plus", diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Pages/TenantManagement/Tenants/Index.js b/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Pages/TenantManagement/Tenants/Index.js index e990b8fc37..a9cf094c6c 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Pages/TenantManagement/Tenants/Index.js +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Pages/TenantManagement/Tenants/Index.js @@ -113,12 +113,5 @@ e.preventDefault(); _createModal.open(); }); - - _$wrapper.find('button[name=ManageHostFeatures]').click(function (e) { - e.preventDefault(); - _featuresModal.open({ - providerName: 'T' - }); - }); }); })(); diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Volo.Abp.TenantManagement.Web.abppkg.analyze.json b/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Volo.Abp.TenantManagement.Web.abppkg.analyze.json index 1ba20f8a2f..ec7ac9a62a 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Volo.Abp.TenantManagement.Web.abppkg.analyze.json +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Volo.Abp.TenantManagement.Web.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.Abp.TenantManagement.Web", - "hash": "20bd21bec310cf2c54ecddc579017ce8", + "hash": "18a4ed544c2a6b718b3aa7c14c83bc43", "contents": [ { "namespace": "Volo.Abp.TenantManagement.Web", diff --git a/modules/tenant-management/test/Volo.Abp.TenantManagement.Application.Tests/Volo/Abp/TenantManagement/TenantAppService_Tests.cs b/modules/tenant-management/test/Volo.Abp.TenantManagement.Application.Tests/Volo/Abp/TenantManagement/TenantAppService_Tests.cs index 6b86c8503c..b797e05566 100644 --- a/modules/tenant-management/test/Volo.Abp.TenantManagement.Application.Tests/Volo/Abp/TenantManagement/TenantAppService_Tests.cs +++ b/modules/tenant-management/test/Volo.Abp.TenantManagement.Application.Tests/Volo/Abp/TenantManagement/TenantAppService_Tests.cs @@ -66,7 +66,7 @@ public class TenantAppService_Tests : AbpTenantManagementApplicationTestBase [Fact] public async Task CreateAsync_Should_Not_Allow_Duplicate_Names() { - await Assert.ThrowsAsync(async () => + await Assert.ThrowsAsync(async () => { await _tenantAppService.CreateAsync(new TenantCreateDto { Name = "acme", AdminEmailAddress = "admin@admin.com", AdminPassword = "123456" }); }); @@ -90,7 +90,7 @@ public class TenantAppService_Tests : AbpTenantManagementApplicationTestBase { var acme = UsingDbContext(dbContext => dbContext.Tenants.Single(t => t.Name == "acme")); - await Assert.ThrowsAsync(async () => + await Assert.ThrowsAsync(async () => { await _tenantAppService.UpdateAsync(acme.Id, new TenantUpdateDto { Name = "volosoft" }); }); diff --git a/modules/tenant-management/test/Volo.Abp.TenantManagement.Domain.Tests/Volo/Abp/TenantManagement/TenantManager_Tests.cs b/modules/tenant-management/test/Volo.Abp.TenantManagement.Domain.Tests/Volo/Abp/TenantManagement/TenantManager_Tests.cs index fcacb22e37..161882e412 100644 --- a/modules/tenant-management/test/Volo.Abp.TenantManagement.Domain.Tests/Volo/Abp/TenantManagement/TenantManager_Tests.cs +++ b/modules/tenant-management/test/Volo.Abp.TenantManagement.Domain.Tests/Volo/Abp/TenantManagement/TenantManager_Tests.cs @@ -26,7 +26,7 @@ public class TenantManager_Tests : AbpTenantManagementDomainTestBase [Fact] public async Task Create_Tenant_Name_Can_Not_Duplicate() { - await Assert.ThrowsAsync(async () => await _tenantManager.CreateAsync("volosoft")); + await Assert.ThrowsAsync(async () => await _tenantManager.CreateAsync("volosoft")); } [Fact] @@ -46,6 +46,6 @@ public class TenantManager_Tests : AbpTenantManagementDomainTestBase var tenant = await _tenantRepository.FindByNameAsync("acme"); tenant.ShouldNotBeNull(); - await Assert.ThrowsAsync(async () => await _tenantManager.ChangeNameAsync(tenant, "volosoft")); + await Assert.ThrowsAsync(async () => await _tenantManager.ChangeNameAsync(tenant, "volosoft")); } } diff --git a/modules/users/Volo.Abp.Users.abpmdl.json b/modules/users/Volo.Abp.Users.abpmdl.json index b268bc96b5..f2b03eef4f 100644 --- a/modules/users/Volo.Abp.Users.abpmdl.json +++ b/modules/users/Volo.Abp.Users.abpmdl.json @@ -24,10 +24,6 @@ "Volo.Abp.Users.MongoDB": { "path": "src/Volo.Abp.Users.MongoDB/Volo.Abp.Users.MongoDB.abppkg.json", "folder": "src" - }, - "Volo.Abp.Users.Installer": { - "path": "src/Volo.Abp.Users.Installer/Volo.Abp.Users.Installer.abppkg.json", - "folder": "src" } } } \ No newline at end of file diff --git a/modules/users/src/Volo.Abp.Users.Domain.Shared/Volo.Abp.Users.Domain.Shared.abppkg.analyze.json b/modules/users/src/Volo.Abp.Users.Domain.Shared/Volo.Abp.Users.Domain.Shared.abppkg.analyze.json index 30990c83bf..a2bca85a49 100644 --- a/modules/users/src/Volo.Abp.Users.Domain.Shared/Volo.Abp.Users.Domain.Shared.abppkg.analyze.json +++ b/modules/users/src/Volo.Abp.Users.Domain.Shared/Volo.Abp.Users.Domain.Shared.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.Abp.Users.Domain.Shared", - "hash": "598479cfdcd34503a37627c3757211ce", + "hash": "68c5010aeda2e991d673468d958ef31b", "contents": [ { "namespace": "Volo.Abp.Users", diff --git a/modules/users/src/Volo.Abp.Users.Domain/Volo.Abp.Users.Domain.abppkg.analyze.json b/modules/users/src/Volo.Abp.Users.Domain/Volo.Abp.Users.Domain.abppkg.analyze.json index 2cfb2d0c1e..1c71e9536a 100644 --- a/modules/users/src/Volo.Abp.Users.Domain/Volo.Abp.Users.Domain.abppkg.analyze.json +++ b/modules/users/src/Volo.Abp.Users.Domain/Volo.Abp.Users.Domain.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.Abp.Users.Domain", - "hash": "97a2a74c722bc59336bb9c6f75049e99", + "hash": "0feb223ab7c2b06a1a66bbc81a3153c0", "contents": [ { "namespace": "Volo.Abp.Users", diff --git a/modules/users/src/Volo.Abp.Users.EntityFrameworkCore/Volo.Abp.Users.EntityFrameworkCore.abppkg.analyze.json b/modules/users/src/Volo.Abp.Users.EntityFrameworkCore/Volo.Abp.Users.EntityFrameworkCore.abppkg.analyze.json index 1e0ccb67b5..a8207b3b16 100644 --- a/modules/users/src/Volo.Abp.Users.EntityFrameworkCore/Volo.Abp.Users.EntityFrameworkCore.abppkg.analyze.json +++ b/modules/users/src/Volo.Abp.Users.EntityFrameworkCore/Volo.Abp.Users.EntityFrameworkCore.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.Abp.Users.EntityFrameworkCore", - "hash": "edd7cc214a1b8f121f773be7b88957ff", + "hash": "70a6a4e034d1b9632e7be15cb72e627b", "contents": [ { "namespace": "Volo.Abp.Users.EntityFrameworkCore", diff --git a/modules/users/src/Volo.Abp.Users.Installer/Volo.Abp.Users.Installer.abppkg.json b/modules/users/src/Volo.Abp.Users.Installer/Volo.Abp.Users.Installer.abppkg.json deleted file mode 100644 index 9e26dfeeb6..0000000000 --- a/modules/users/src/Volo.Abp.Users.Installer/Volo.Abp.Users.Installer.abppkg.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/modules/users/src/Volo.Abp.Users.Installer/Volo.Abp.Users.Installer.csproj b/modules/users/src/Volo.Abp.Users.Installer/Volo.Abp.Users.Installer.csproj index e39f1e5b6e..3e18ed33b5 100644 --- a/modules/users/src/Volo.Abp.Users.Installer/Volo.Abp.Users.Installer.csproj +++ b/modules/users/src/Volo.Abp.Users.Installer/Volo.Abp.Users.Installer.csproj @@ -4,19 +4,21 @@ - net5.0 + net6.0 true - + + + diff --git a/modules/users/src/Volo.Abp.Users.MongoDB/Volo.Abp.Users.MongoDB.abppkg.analyze.json b/modules/users/src/Volo.Abp.Users.MongoDB/Volo.Abp.Users.MongoDB.abppkg.analyze.json index e7ed443321..3b269e2be6 100644 --- a/modules/users/src/Volo.Abp.Users.MongoDB/Volo.Abp.Users.MongoDB.abppkg.analyze.json +++ b/modules/users/src/Volo.Abp.Users.MongoDB/Volo.Abp.Users.MongoDB.abppkg.analyze.json @@ -1,6 +1,6 @@ { "name": "Volo.Abp.Users.MongoDB", - "hash": "827e73e5cc91bc0e666d7fc131009cb9", + "hash": "6a1684883b9a06ea9ebb22412c76f108", "contents": [ { "namespace": "Volo.Abp.Users.MongoDB", diff --git a/modules/virtual-file-explorer/Volo.Abp.VirtualFileExplorer.abpmdl.json b/modules/virtual-file-explorer/Volo.Abp.VirtualFileExplorer.abpmdl.json index 26c00ec557..dbb8cc5c4e 100644 --- a/modules/virtual-file-explorer/Volo.Abp.VirtualFileExplorer.abpmdl.json +++ b/modules/virtual-file-explorer/Volo.Abp.VirtualFileExplorer.abpmdl.json @@ -13,10 +13,6 @@ "Volo.Abp.VirtualFileExplorer.DemoApp": { "path": "app/Volo.Abp.VirtualFileExplorer.DemoApp/Volo.Abp.VirtualFileExplorer.DemoApp.abppkg.json", "folder": "app" - }, - "Volo.Abp.VirtualFileExplorer.Installer": { - "path": "src/Volo.Abp.VirtualFileExplorer.Installer/Volo.Abp.VirtualFileExplorer.Installer.abppkg.json", - "folder": "src" } } } \ No newline at end of file diff --git a/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/package.json b/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/package.json index 63b2dfd644..700507c0ba 100644 --- a/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/package.json +++ b/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/package.json @@ -3,7 +3,7 @@ "version": "1.0.0", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "^5.3.0", - "@abp/virtual-file-explorer": "^5.3.0" + "@abp/aspnetcore.mvc.ui.theme.basic": "^6.0.0-rc.3", + "@abp/virtual-file-explorer": "^6.0.0-rc.3" } } diff --git a/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/wwwroot/libs/abp/core/abp.js b/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/wwwroot/libs/abp/core/abp.js index 9445e4e7f4..d8b7531660 100644 --- a/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/wwwroot/libs/abp/core/abp.js +++ b/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/wwwroot/libs/abp/core/abp.js @@ -372,7 +372,9 @@ var abp = abp || {}; setTimeout(function () { if (element) { element.classList.remove('abp-block-area-disappearing'); - element.parentElement.removeChild(element); + if (element.parentElement) { + element.parentElement.removeChild(element); + } } }, 250); } diff --git a/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/yarn.lock b/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/yarn.lock index 5fb94c335b..c34f1850f9 100644 --- a/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/yarn.lock +++ b/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/yarn.lock @@ -2,37 +2,37 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-5.3.0.tgz#dcdd73d8582c4d14438f70d765170398d5d582fb" - integrity sha512-H6UrafHRI1DHfIoi47gZWHKSanlyAkghtGgUO6GTmPqTubBXjl7Ky3owVUAXvFd49+72gwdCLA/DB0Khjc3Ayw== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~5.3.0" - -"@abp/aspnetcore.mvc.ui.theme.shared@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-5.3.0.tgz#84e94845a247815ce981cda2d195944a350530b9" - integrity sha512-RwXxlncjidvh8Hgw91Hz1f5rnfG9hlNROr5bD/kxTUB47vIh/TIBd06UYrYw2/lqFLw5d6wd8q7VLuDjGUQbpg== - dependencies: - "@abp/aspnetcore.mvc.ui" "~5.3.0" - "@abp/bootstrap" "~5.3.0" - "@abp/bootstrap-datepicker" "~5.3.0" - "@abp/datatables.net-bs5" "~5.3.0" - "@abp/font-awesome" "~5.3.0" - "@abp/jquery-form" "~5.3.0" - "@abp/jquery-validation-unobtrusive" "~5.3.0" - "@abp/lodash" "~5.3.0" - "@abp/luxon" "~5.3.0" - "@abp/malihu-custom-scrollbar-plugin" "~5.3.0" - "@abp/select2" "~5.3.0" - "@abp/sweetalert2" "~5.3.0" - "@abp/timeago" "~5.3.0" - "@abp/toastr" "~5.3.0" - -"@abp/aspnetcore.mvc.ui@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-5.3.0.tgz#e947fd1aecbd2aabc5db4c6a64b78f2690fcf0d4" - integrity sha512-en2YDb/hRG1MKkbli1PYcoeU9OLU0YPSahkIBSfOmMLntAe8y0c2+Xe09chXP4r+GoZu0zd9FM3qqCRZojrlug== +"@abp/aspnetcore.mvc.ui.theme.basic@^6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-6.0.0-rc.3.tgz#b95266387e562c635de795442f90470f8e9e6318" + integrity sha512-vVkEpotDST455E3rynvRQpBKPcNNJ2m1wLkz/B9dQNdUjvm8L4F6s0ls0XFlKUNvQfCVfedkRtGayuvNje/Oxg== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~6.0.0-rc.3" + +"@abp/aspnetcore.mvc.ui.theme.shared@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-6.0.0-rc.3.tgz#664ca2ee712b7d9e66103c00beb41eb9648a6075" + integrity sha512-KxCsGuoUWKaDo7Oo9aKp51pli2m0DZ2tG8m+zK+m4M9U7g96uC+DOFy3gc7MdPlszvrw32Wwm7I0AughstByNA== + dependencies: + "@abp/aspnetcore.mvc.ui" "~6.0.0-rc.3" + "@abp/bootstrap" "~6.0.0-rc.3" + "@abp/bootstrap-datepicker" "~6.0.0-rc.3" + "@abp/datatables.net-bs5" "~6.0.0-rc.3" + "@abp/font-awesome" "~6.0.0-rc.3" + "@abp/jquery-form" "~6.0.0-rc.3" + "@abp/jquery-validation-unobtrusive" "~6.0.0-rc.3" + "@abp/lodash" "~6.0.0-rc.3" + "@abp/luxon" "~6.0.0-rc.3" + "@abp/malihu-custom-scrollbar-plugin" "~6.0.0-rc.3" + "@abp/select2" "~6.0.0-rc.3" + "@abp/sweetalert2" "~6.0.0-rc.3" + "@abp/timeago" "~6.0.0-rc.3" + "@abp/toastr" "~6.0.0-rc.3" + +"@abp/aspnetcore.mvc.ui@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-6.0.0-rc.3.tgz#47c23b57ed3908bd78a232230e53d1f3cba2de41" + integrity sha512-7eJZy2JUGQP94Tz3JJWXRHRmDfTcPZ/lS1/VNbU8B4qvgl5ChIXklVEJLR1fwrBhKXZV8fGVmqT1XlGTGFvFJA== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -41,171 +41,171 @@ merge-stream "^2.0.0" micromatch "^4.0.2" -"@abp/bootstrap-datepicker@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-5.3.0.tgz#09c44954774d8f52ca8ff6699ad4dbb7cc0308c2" - integrity sha512-AQ26I0jgoCioW1/4XmQIyn1c1+CLv8KTb4Vd4ZbtdYGBkkkUe+JEAWpJSeXlJRr/XrOs0BKWp/fa7Nnwx8srLg== +"@abp/bootstrap-datepicker@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-6.0.0-rc.3.tgz#89198b863dbfccf5f07ac3c4b20ce6199adcb17a" + integrity sha512-NLoUjcR66mqwSWuVftu2yFH4/j6QP+FiElRfZQ9OYmO8DQx2Ue5UZzjrFTrZ1DBBCfzhr2Bffj80dirGvGDyvg== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-5.3.0.tgz#42dac2d2d6374f39d068a638687039c5c74df123" - integrity sha512-rg9mLcvT4JQRc1rIAhGYK1P2eMRJ1+GArQXV5l7k3FrVU+bRLKdoE6PNpuwXHpdlom4/dOgekfuWH/SAuY5kyw== +"@abp/bootstrap@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-6.0.0-rc.3.tgz#4574bf574cc3484869e8ff8bc592f6212d20a969" + integrity sha512-Q5v7WRkGhGcjRg267HXtqs1oU7ts9UXPyCXmg5y2y5qMOyioD+m4MKV4iv67DgoQjabudp8X2egTKxkej6Lzkw== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" bootstrap "^5.1.3" -"@abp/clipboard@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-5.3.0.tgz#579bbc786d32c4e07c969073872b936575df7a9c" - integrity sha512-J55jQnzPOOAwo70GK9hAB3JxG7rz75tex+17QSFjW7/dXVWt1bPIDRHh/a1wiLEgYc6btsSGhptLtkYAfWpq6w== +"@abp/clipboard@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-6.0.0-rc.3.tgz#ee3a586b491d89442eefff08aaebbf9d38cb46d4" + integrity sha512-01svpp3mR29z1FTM+2Qe+MUNLPbl95bWlOXY5zz2hvNSbdD45lGud+BiOHfeZwlDk5jjr3FqLel+hxx2ByBvOA== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" clipboard "^2.0.8" -"@abp/core@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-5.3.0.tgz#032724dd0c0b850204896ce0275c7f9c8f516740" - integrity sha512-Uk9h98jiEF1dItWrvWnYB6s/UNZZapvFSyJ4+piAsZmXOSAbrObV+s19n5xfUagQQTWn4+aU5+aChEcfWpYv9A== +"@abp/core@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-6.0.0-rc.3.tgz#5662ce813d449d97d9fb7ea2552b2774c8df7825" + integrity sha512-X/VRdk5SGNYc5gQzPcBEPAvwcuD9WXsI4YIdrqjnes0s8u2/XmfrTixojh8Y5EYUoOblEE3Soj5hBhY1cVwcbQ== dependencies: - "@abp/utils" "~5.3.0" + "@abp/utils" "~6.0.0-rc.3" -"@abp/datatables.net-bs5@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-5.3.0.tgz#84771ce4eb7229bed347a5904c891b08e3230422" - integrity sha512-FpKrgrjaBKVgFAnbBsrvDIJJOy8gbWCEHm5Jy2vFWXmx25fITMw/2ckBDH87yrZtCNVTSUbMIdHYOIHMPfSavQ== +"@abp/datatables.net-bs5@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-6.0.0-rc.3.tgz#22865c7e621de720b71af6265b3193f6c78695bd" + integrity sha512-T+mhLc6uSzWmxDQogVwnJ6VxI4845gmF68/i9TmVKNlCtpa3EEfyuF/hgWT1hYfCb4XOsvd/CWrunbkC3fsmtg== dependencies: - "@abp/datatables.net" "~5.3.0" + "@abp/datatables.net" "~6.0.0-rc.3" datatables.net-bs5 "^1.11.4" -"@abp/datatables.net@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-5.3.0.tgz#dd27ae451df9551f5b815e10c87a8a89c6a38293" - integrity sha512-d4lQ09G7HY2gEN1lRAteCZzY0Fv3gPuUM+icgWm+UkmDZV9lhvovTQ58Xkwayw8vf+NPlit1eGMMQedn6MbeAQ== +"@abp/datatables.net@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-6.0.0-rc.3.tgz#d036defe6ad7fc989dffa020ae579362ee3150d1" + integrity sha512-4cUU8/Tn0Vz9bx7jjMOD/0Viyr29fcwoQAAkxaaYZp6qiQbENgz46/xpQf2oBCoudk8CLdzpmNa7jWte7PcJJw== dependencies: - "@abp/jquery" "~5.3.0" + "@abp/jquery" "~6.0.0-rc.3" datatables.net "^1.11.4" -"@abp/font-awesome@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-5.3.0.tgz#ce1d5bb59bd597cc9717885917d4dd2eae1f8b9c" - integrity sha512-JX62EVfZSJ7pv75Gd3ya/3c3He0hXF7KmpTizUNd/EbeHuNJoCND5wwq5OAFV9Ld3vdcGJChNTydNa5RsBzrpg== +"@abp/font-awesome@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-6.0.0-rc.3.tgz#803569d1a7e25f8a1c2be018312449c23fb78217" + integrity sha512-lYdh38UCTSkzzw0B/mpPEo7iFXzSKHCNbBOIHe6dd6O/Qli7wYukTtUOFn5Sh+yoydLY1as92HtiGL1ckSdu1g== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" "@fortawesome/fontawesome-free" "^5.15.4" -"@abp/jquery-form@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-5.3.0.tgz#5ae9906f0cffaf3e043681a5dd80a014b4860f6b" - integrity sha512-ZTpXCImHirJDZjfnJRtSEHLIbWMTYkqtTv7Z3GMRKnI4fllpmuco9EWLAKjAfYPyc/QpTx+MYnUg5SsXORhJyQ== +"@abp/jquery-form@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-6.0.0-rc.3.tgz#4ec503c07e2194148c3a7e7cf7ddef2871679e6a" + integrity sha512-Q3uEpflntqrSkYakcdsBnnYYfxJWXD/CDjMiwjbb6gIc8s4qkbIYxVxvYvlEezoIDYQkMSXOn7BS4clWsesiJg== dependencies: - "@abp/jquery" "~5.3.0" + "@abp/jquery" "~6.0.0-rc.3" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-5.3.0.tgz#ccf90a7840398e69e0a91ed6c32b80fa2eb82d14" - integrity sha512-6B3ywnpvPxpnxkrcXzjTjMWgKRImbzNPOZvv5ant/kQv3zXedV1GXSIILy+imX39FuDPslOmEfx8plwrNvIteA== +"@abp/jquery-validation-unobtrusive@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-6.0.0-rc.3.tgz#01da2a59663d373ff1c69022f4c9c66ad0b29403" + integrity sha512-ij1ML2D9rYF3pJthWO6mGQajsJhbDCtOoBvnh9yCZccuwOYkXP22PqfUxjjxtqL4HqFI31KRpFg0ANMGSzEEBg== dependencies: - "@abp/jquery-validation" "~5.3.0" + "@abp/jquery-validation" "~6.0.0-rc.3" jquery-validation-unobtrusive "^3.2.12" -"@abp/jquery-validation@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-5.3.0.tgz#a21696e7d5d54ef8bcdc0e8bd2debb1da1f7f5cc" - integrity sha512-4z2I9iORf+z5SlN9crC/Gx3X5GAOVePD+WN8SaHSYr4VWYNe8TV8LvCZPilN56sIPt3jYvy0N+bI1tAuZPu/NQ== +"@abp/jquery-validation@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-6.0.0-rc.3.tgz#724aea9572dcb2faccf8c6355332b0b2a4df9260" + integrity sha512-rTK5oHaMtycvWxunNwzbE/MbsXXIr6qDnOY3rVUmjTHjqUOHYz591t/XeQfjnSXPp4k/SZUjG6viTC3J2jzC1A== dependencies: - "@abp/jquery" "~5.3.0" + "@abp/jquery" "~6.0.0-rc.3" jquery-validation "^1.19.3" -"@abp/jquery@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-5.3.0.tgz#0279ee501ed774a788072c2ec8b003e348fec22c" - integrity sha512-rqYbU3LpsT7XT8ygn+TFVmjev5NlgEcDhGwQ8PraY1dEjlDbteeQ50N4adS8fdRfOM1UjGL19ueN3F8E5qNUSg== +"@abp/jquery@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-6.0.0-rc.3.tgz#ba19cc8b802c46490277939e6c674811127d8016" + integrity sha512-MbD38iInyag7/j5k42cvMT4jLZMtXH4lUK0rjvqUDVaxKEks46Ix/90uczQ9XajYONgx0CJKFj2urgM830+CCA== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" jquery "~3.6.0" -"@abp/lodash@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-5.3.0.tgz#45f1dba7bb65b6599b4973d7e0c617dfd2c46c49" - integrity sha512-vQVMv58QuYttWBfLjJzIsw92JunGbWYsqk6pp6/JuoBls5UJtdP1F7vM4JgQxsscGYHFRZB3F4a3h1cxZ+dblQ== +"@abp/lodash@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-6.0.0-rc.3.tgz#8a5bab02353e5cab4ca06ab82f6dbe6285faa95a" + integrity sha512-c8yhcapzPsXyeiFjeOC+2a4bn5wFjW5gUoN+p/p+tE+FIcH37yEgyw/tAr6aZPCmR770MqQXct4t7S4Czbbk+A== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" lodash "^4.17.21" -"@abp/luxon@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-5.3.0.tgz#8a6277046f6e38c3affbf79c06f8ac00d1ca8098" - integrity sha512-6tETR03i1NPJuDqSQWtpkOykdq/84awifQUqRyh+b8340wV7P54NqUMDXDit9sjITFDhq99V/R+Rj3PVjvJD3A== +"@abp/luxon@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-6.0.0-rc.3.tgz#ba515e122c61918d481467d5be39f08a363822f6" + integrity sha512-2lRSSC0DYShlnKdbJ/Pmha/azjt09ZRPx57NQ01dc7ungChPry5EJL6pC3kXWnJrCkrPCF0V5+A3+taut9+l3A== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" luxon "^2.3.0" -"@abp/malihu-custom-scrollbar-plugin@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-5.3.0.tgz#e6e12162aa50d3c3d98629378cec2f6fd5964338" - integrity sha512-GVwgAZQurH/tr4Hgmuby2dun//v1dT+wLGV4ZvjCJzBRs4FgrB+25pj4qKm20j6/NKRKc4V5re/b1y6njCubFQ== +"@abp/malihu-custom-scrollbar-plugin@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-6.0.0-rc.3.tgz#0798e37ec6a852748118692a5fbd30c99d9745db" + integrity sha512-FlyShmRxG3wGk1OJCjHIZAdi2/Y2FJPkVxaE72CVIceQSmg0nebGTv3a7bhd4QzKkDsSA3+t6gHjnuKlTlDFLA== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/prismjs@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-5.3.0.tgz#658a371023d9a3de9ecfff1f10bae7a83064fac7" - integrity sha512-NPsYJ9oj/57vG+eVGpDkJcdPAx4WlXTVEUZWWxmaXuM9sHY1/2av975Qk8R5HG6fC74w3DrVCP8YQvU6jlaF1w== +"@abp/prismjs@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-6.0.0-rc.3.tgz#e4faf595e29db81c5a66030e59b0e09f09759bfd" + integrity sha512-zzd3iw/Im0M9FUmTviwkTCr4slkoZJExtK+qB1FmLxRY59+hyU9wxd6hwzic/QwhXxFQoYILJ3S3FNxsPIm76A== dependencies: - "@abp/clipboard" "~5.3.0" - "@abp/core" "~5.3.0" + "@abp/clipboard" "~6.0.0-rc.3" + "@abp/core" "~6.0.0-rc.3" prismjs "^1.26.0" -"@abp/select2@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-5.3.0.tgz#aae202b87dc23dfc7c8fd933413a8dbeb2f5b683" - integrity sha512-0aIxdtzgONkrYnUN5ACkIIIhsC9e61QLRq3K+/98fjf7NkHOjG3Sptr8EKu5U3IQ2hNHgqBjPGYjkztGuxZ9kw== +"@abp/select2@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-6.0.0-rc.3.tgz#deb8332bfce2102a562004893321a48d5194bf53" + integrity sha512-rb0qElmmhiP09xX8ZbjzNLF6ygFBwErysGWt6Bbgzz5waX2sGe575Cgoz53FaMQ4JaRBg1N0/nCejKyDtiINRA== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" select2 "^4.0.13" -"@abp/sweetalert2@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-5.3.0.tgz#67379cfa4cb8884cb66b58f4cafa79960cf8426a" - integrity sha512-EBr8J7MDsYmSvOYxTbqsSmw6c2yLokHZe8A+EW2vsY9VYFXkoOJLVpCkCK4fhvHUv8/+Y5QnHW7bs1I6SKYXOw== +"@abp/sweetalert2@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-6.0.0-rc.3.tgz#e61fc6c1bed1316c1d44ca5c92f590e422db24d4" + integrity sha512-+SNpBb4XrQlWzRQK9lfdJqA9IfJrlgoqmHwPDgf3Q+P922MzO33TgDlZWbeE7MzVj2y2WmNsPuCKwhjSjSL2rw== dependencies: - "@abp/core" "~5.3.0" + "@abp/core" "~6.0.0-rc.3" sweetalert2 "^11.3.6" -"@abp/timeago@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-5.3.0.tgz#3aaef3edca333224ba6b3e81c8ad1ebaae51a2f4" - integrity sha512-FxtoPYxyk2CHeoloC6kaeCj5YtXH0rebhOEaCjrfyg9/Ec6LEkvpfC7RWlcsHaEUAtFXZegJDfOk066EPH7RHQ== +"@abp/timeago@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-6.0.0-rc.3.tgz#0ef8c4801bfd4623e6895b1d047b1437063bda53" + integrity sha512-P3YRDVKjR5/Fz+cXiPg3IiUr7XGbNh7mgmJ1ywRXmKVmVMJmhQ2RsKmmtkGJn4TfVHu/l5iJXe4rqgL21/yX/g== dependencies: - "@abp/jquery" "~5.3.0" + "@abp/jquery" "~6.0.0-rc.3" timeago "^1.6.7" -"@abp/toastr@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-5.3.0.tgz#8a002c19ea25ac6b042a25c0f9d289d03c93c2fb" - integrity sha512-gjb2O/XrYkX8IeCERIqlOYPh15WlF9LxGR6t9jeVF/p6BTX/yaWabYCFfB9SkU2pQ6xrGl7WmSTAC06JOAtPTA== +"@abp/toastr@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-6.0.0-rc.3.tgz#6010d4247937531ebf7c8659d6254cd3db6c4855" + integrity sha512-sC9eCzYVgDrLSFIhJGe9hshzfwA1BkZNah4NQhyq+V6HQ8YF7goMS79N+/XmSoLQ9zzRhusqnPFnb+4FHjr7iA== dependencies: - "@abp/jquery" "~5.3.0" + "@abp/jquery" "~6.0.0-rc.3" toastr "^2.1.4" -"@abp/utils@~5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-5.3.0.tgz#e93739074a3cd445a5a221209506b7e663050ca0" - integrity sha512-Nm+h+3PL10+rBFSh8UUuenmGM+OBlEoNQeGzHRmhOc6hJ3oqCogPzY+zkq0e4pksrwhjxAu/cgCEGLAoEXXycw== +"@abp/utils@~6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-6.0.0-rc.3.tgz#6d3515694314175218606e9518618ce335b4b360" + integrity sha512-K2geJ9P1ztk4Ehzb9YG3CqqLOi+z8/4iBLUzooNZLQqS+KdlUhCmqfuCoI/A5Aq9DGbTYesalp+Fwoh3S2Dl8A== dependencies: just-compare "^1.3.0" -"@abp/virtual-file-explorer@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@abp/virtual-file-explorer/-/virtual-file-explorer-5.3.0.tgz#ae7b39a9c0f43a56072cbad01765636c30f626f4" - integrity sha512-jfzQTS8uHAwmC2jKZHvk1CnTV4eiCRt847LDSmzGAcnxg5vho8/6HzkdcZgCOHDVjxwoEjzKgfjJMLRa2kjjcA== +"@abp/virtual-file-explorer@^6.0.0-rc.3": + version "6.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@abp/virtual-file-explorer/-/virtual-file-explorer-6.0.0-rc.3.tgz#92de34df581cf85d23282484b1686306cbb880b6" + integrity sha512-PrZw+CH7Uwc/SPkhDdU3P9ixhUAX35k1ucXy6/AaMdms9cppKYw5C7O3nkj3UIN+PliLy+etc2nox1Y2WafSzQ== dependencies: - "@abp/clipboard" "~5.3.0" - "@abp/prismjs" "~5.3.0" + "@abp/clipboard" "~6.0.0-rc.3" + "@abp/prismjs" "~6.0.0-rc.3" "@fortawesome/fontawesome-free@^5.15.4": version "5.15.4" diff --git a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Installer/Volo.Abp.VirtualFileExplorer.Installer.abppkg.json b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Installer/Volo.Abp.VirtualFileExplorer.Installer.abppkg.json deleted file mode 100644 index 9e26dfeeb6..0000000000 --- a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Installer/Volo.Abp.VirtualFileExplorer.Installer.abppkg.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Installer/Volo.Abp.VirtualFileExplorer.Installer.csproj b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Installer/Volo.Abp.VirtualFileExplorer.Installer.csproj index 6a82e34326..eb9383d4d9 100644 --- a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Installer/Volo.Abp.VirtualFileExplorer.Installer.csproj +++ b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Installer/Volo.Abp.VirtualFileExplorer.Installer.csproj @@ -4,19 +4,21 @@ - net5.0 + net6.0 true - + + + diff --git a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/pt-BR.json b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/pt-BR.json index d6fb96ed4e..f4b0675210 100644 --- a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/pt-BR.json +++ b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/pt-BR.json @@ -8,7 +8,7 @@ "VirtualFileName": "Nome do arquivo virtual", "FileContent": "Conteúdo do arquivo", "Size": "Tamanho", - "BackToRoot": "De volta à raiz", + "BackToRoot": "Voltar à raiz", "EmptyFileInfoList": "Não há arquivos virtuais" } } \ No newline at end of file diff --git a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Volo.Abp.VirtualFileExplorer.Web.abppkg.analyze.json b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Volo.Abp.VirtualFileExplorer.Web.abppkg.analyze.json new file mode 100644 index 0000000000..a6340b74ff --- /dev/null +++ b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Volo.Abp.VirtualFileExplorer.Web.abppkg.analyze.json @@ -0,0 +1,11 @@ +{ + "name": "Volo.Abp.VirtualFileExplorer.Web", + "hash": "f553dc666ba87cc5e2fdc5c22546b095", + "contents": [ + { + "namespace": "Volo.Abp.VirtualFileExplorer.Web", + "contentType": "abpModule", + "name": "AbpVirtualFileExplorerWebModule" + } + ] +} \ No newline at end of file diff --git a/npm/lerna.json b/npm/lerna.json index dfe3d14a47..5ec9d9121f 100644 --- a/npm/lerna.json +++ b/npm/lerna.json @@ -1,5 +1,5 @@ { - "version": "5.3.0", + "version": "6.0.0-rc.3", "packages": [ "packs/*" ], diff --git a/npm/ng-packs/.gitignore b/npm/ng-packs/.gitignore index 326e29324e..b542c2b12d 100644 --- a/npm/ng-packs/.gitignore +++ b/npm/ng-packs/.gitignore @@ -54,3 +54,5 @@ Thumbs.db !**/[Pp]ackages/* *.internal.* + +.angular diff --git a/npm/ng-packs/apps/dev-app/src/environments/environment.prod.ts b/npm/ng-packs/apps/dev-app/src/environments/environment.prod.ts index 9e6d6f63d7..bf9e904522 100644 --- a/npm/ng-packs/apps/dev-app/src/environments/environment.prod.ts +++ b/npm/ng-packs/apps/dev-app/src/environments/environment.prod.ts @@ -11,7 +11,7 @@ export const environment = { logoUrl: '', }, oAuthConfig: { - issuer: 'https://localhost:44305', + issuer: 'https://localhost:44305/', redirectUri: baseUrl, clientId: 'MyProjectName_App', responseType: 'code', diff --git a/npm/ng-packs/apps/dev-app/src/environments/environment.ts b/npm/ng-packs/apps/dev-app/src/environments/environment.ts index d92bd9747a..1e014dcaa7 100644 --- a/npm/ng-packs/apps/dev-app/src/environments/environment.ts +++ b/npm/ng-packs/apps/dev-app/src/environments/environment.ts @@ -11,9 +11,8 @@ export const environment = { logoUrl: '', }, oAuthConfig: { - issuer: 'https://localhost:44305', + issuer: 'https://localhost:44305/', clientId: 'MyProjectName_App', - dummyClientSecret: '1q2w3e*', scope: 'offline_access MyProjectName', responseType: 'code', redirectUri: baseUrl, @@ -38,7 +37,7 @@ export const environment = { AbpIdentity: { rootNamespace: 'Volo.Abp', }, - AbpSettingManagement: { + SettingManagement: { rootNamespace: 'Volo.Abp.SettingManagement', }, }, diff --git a/npm/ng-packs/lerna.version.json b/npm/ng-packs/lerna.version.json index ab9656b953..fdf16d3f37 100644 --- a/npm/ng-packs/lerna.version.json +++ b/npm/ng-packs/lerna.version.json @@ -1,5 +1,5 @@ { - "version": "5.3.0", + "version": "6.0.0-rc.3", "packages": [ "packages/*" ], diff --git a/npm/ng-packs/package.json b/npm/ng-packs/package.json index 4b54af0085..41314f13c3 100644 --- a/npm/ng-packs/package.json +++ b/npm/ng-packs/package.json @@ -34,11 +34,13 @@ "dev:schematics": "tsc -p packages/schematics/tsconfig.json -w", "ci": "yarn affected:lint && yarn affected:build && yarn affected:test", "lerna": "lerna", - "migrate-nx": "yarn nx migrate --run-migrations" + "migrate-nx": "yarn nx migrate --run-migrations", + "mock:schematics": "cd scripts/mock-schematic && yarn && yarn start", + "debug:schematics": "./node_modules/.bin/ng g ./packages/schematics/src/collection.json:proxy-add --module __default --apiName __default --source __default --target __default --url http://localhost:4300" }, "private": true, "devDependencies": { - "@abp/utils": "~5.3.0", + "@abp/utils": "~6.0.0-rc.3", "@angular-devkit/build-angular": "13.3.5", "@angular-devkit/build-ng-packagr": "^0.1002.0", "@angular-devkit/schematics-cli": "~12.2.0", @@ -57,17 +59,17 @@ "@angular/platform-browser": "13.3.6", "@angular/platform-browser-dynamic": "13.3.6", "@angular/router": "13.3.6", - "@abp/ng.account": "~5.3.0", - "@abp/ng.account.core": "~5.3.0", - "@abp/ng.core": "~5.3.0", - "@abp/ng.feature-management": "~5.3.0", - "@abp/ng.identity": "~5.3.0", - "@abp/ng.permission-management": "~5.3.0", - "@abp/ng.schematics": "~5.3.0", - "@abp/ng.setting-management": "~5.3.0", - "@abp/ng.tenant-management": "~5.3.0", - "@abp/ng.theme.basic": "~5.3.0", - "@abp/ng.theme.shared": "~5.3.0", + "@abp/ng.account": "~6.0.0-rc.3", + "@abp/ng.account.core": "~6.0.0-rc.3", + "@abp/ng.core": "~6.0.0-rc.3", + "@abp/ng.feature-management": "~6.0.0-rc.3", + "@abp/ng.identity": "~6.0.0-rc.3", + "@abp/ng.permission-management": "~6.0.0-rc.3", + "@abp/ng.schematics": "~6.0.0-rc.3", + "@abp/ng.setting-management": "~6.0.0-rc.3", + "@abp/ng.tenant-management": "~6.0.0-rc.3", + "@abp/ng.theme.basic": "~6.0.0-rc.3", + "@abp/ng.theme.shared": "~6.0.0-rc.3", "@fortawesome/fontawesome-free": "^5.15.4", "@ng-bootstrap/ng-bootstrap": "~12.0.0-beta.4", "@ngneat/spectator": "^10.0.0", @@ -80,7 +82,7 @@ "@nrwl/linter": "13.10.3", "@nrwl/workspace": "13.10.3", "@schematics/angular": "~12.2.0", - "@swimlane/ngx-datatable": "^19.0.0", + "@swimlane/ngx-datatable": "^20.0.0", "@types/jest": "27.0.2", "@types/node": "14.14.33", "@typescript-eslint/eslint-plugin": "5.18.0", diff --git a/npm/ng-packs/packages/account-core/package.json b/npm/ng-packs/packages/account-core/package.json index 09e56e7fc3..8ea2bb186b 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": "5.3.0", + "version": "6.0.0-rc.3", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "peerDependencies": { - "@abp/ng.core": "~5.3.0", - "@abp/ng.theme.shared": "~5.3.0", + "@abp/ng.core": "~6.0.0-rc.3", + "@abp/ng.theme.shared": "~6.0.0-rc.3", "@angular/common": ">=12.0.0", "@angular/core": ">=12.0.0" }, diff --git a/npm/ng-packs/packages/account/package.json b/npm/ng-packs/packages/account/package.json index 41ba99dc88..7f6c87ac3f 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": "5.3.0", + "version": "6.0.0-rc.3", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.account.core": "~5.3.0", - "@abp/ng.theme.shared": "~5.3.0", + "@abp/ng.account.core": "~6.0.0-rc.3", + "@abp/ng.theme.shared": "~6.0.0-rc.3", "tslib": "^2.0.0" }, "publishConfig": { diff --git a/npm/ng-packs/packages/account/src/lib/account-routing.module.ts b/npm/ng-packs/packages/account/src/lib/account-routing.module.ts index c09dede3cb..e4b18a717b 100644 --- a/npm/ng-packs/packages/account/src/lib/account-routing.module.ts +++ b/npm/ng-packs/packages/account/src/lib/account-routing.module.ts @@ -13,6 +13,8 @@ import { RegisterComponent } from './components/register/register.component'; import { ResetPasswordComponent } from './components/reset-password/reset-password.component'; import { eAccountComponents } from './enums/components'; import { AuthenticationFlowGuard } from './guards/authentication-flow.guard'; +import { AccountExtensionsGuard } from './guards'; + const routes: Routes = [ { path: '', pathMatch: 'full', redirectTo: 'login' }, @@ -68,7 +70,7 @@ const routes: Routes = [ { path: 'manage', component: ReplaceableRouteContainerComponent, - canActivate: [AuthGuard], + canActivate: [AuthGuard, AccountExtensionsGuard], data: { replaceableComponent: { key: eAccountComponents.ManageProfile, diff --git a/npm/ng-packs/packages/account/src/lib/account.module.ts b/npm/ng-packs/packages/account/src/lib/account.module.ts index bfa37d4bfa..bdf3c39792 100644 --- a/npm/ng-packs/packages/account/src/lib/account.module.ts +++ b/npm/ng-packs/packages/account/src/lib/account.module.ts @@ -15,6 +15,10 @@ import { accountConfigOptionsFactory } from './utils/factory-utils'; import { AuthenticationFlowGuard } from './guards/authentication-flow.guard'; import { ForgotPasswordComponent } from './components/forgot-password/forgot-password.component'; import { ResetPasswordComponent } from './components/reset-password/reset-password.component'; +import { UiExtensionsModule } from '@abp/ng.theme.shared/extensions'; +import { ACCOUNT_EDIT_FORM_PROP_CONTRIBUTORS } from './tokens/extensions.token'; +import { AccountExtensionsGuard } from './guards/extensions.guard'; +import { PersonalSettingsHalfRowComponent } from './components/personal-settings/personal-settings-half-row.component'; const declarations = [ LoginComponent, @@ -24,6 +28,7 @@ const declarations = [ PersonalSettingsComponent, ForgotPasswordComponent, ResetPasswordComponent, + PersonalSettingsHalfRowComponent, ]; @NgModule({ @@ -34,6 +39,7 @@ const declarations = [ ThemeSharedModule, NgbDropdownModule, NgxValidateCoreModule, + UiExtensionsModule, ], exports: [...declarations], }) @@ -49,6 +55,11 @@ export class AccountModule { useFactory: accountConfigOptionsFactory, deps: [ACCOUNT_CONFIG_OPTIONS], }, + { + provide: ACCOUNT_EDIT_FORM_PROP_CONTRIBUTORS, + useValue: options.editFormPropContributors, + }, + AccountExtensionsGuard, ], }; } diff --git a/npm/ng-packs/packages/account/src/lib/components/index.ts b/npm/ng-packs/packages/account/src/lib/components/index.ts index 098ee8a202..d74263b052 100644 --- a/npm/ng-packs/packages/account/src/lib/components/index.ts +++ b/npm/ng-packs/packages/account/src/lib/components/index.ts @@ -4,4 +4,5 @@ export * from './login/login.component'; export * from './manage-profile/manage-profile.component'; export * from './register/register.component'; export * from './personal-settings/personal-settings.component'; +export * from './personal-settings/personal-settings-half-row.component'; export * from './reset-password/reset-password.component'; diff --git a/npm/ng-packs/packages/account/src/lib/components/personal-settings/personal-settings-half-row.component.ts b/npm/ng-packs/packages/account/src/lib/components/personal-settings/personal-settings-half-row.component.ts new file mode 100644 index 0000000000..a000e353d6 --- /dev/null +++ b/npm/ng-packs/packages/account/src/lib/components/personal-settings/personal-settings-half-row.component.ts @@ -0,0 +1,37 @@ +import { Component, Inject } from '@angular/core'; +import { + EXTENSIONS_FORM_PROP, + FormProp, + EXTENSIBLE_FORM_VIEW_PROVIDER, +} from '@abp/ng.theme.shared/extensions'; +import { FormGroup } from '@angular/forms'; + +@Component({ + selector: 'abp-personal-settings-half-row', + template: `
+
+ + +
+
`, + styles: [], + viewProviders: [EXTENSIBLE_FORM_VIEW_PROVIDER], +}) +export class PersonalSettingsHalfRowComponent { + public displayName: string; + public name: string; + public id: string; + public formGroup: FormGroup; + + constructor(@Inject(EXTENSIONS_FORM_PROP) private propData: FormProp) { + this.displayName = propData.displayName; + this.name = propData.name; + this.id = propData.id; + } +} diff --git a/npm/ng-packs/packages/account/src/lib/components/personal-settings/personal-settings.component.html b/npm/ng-packs/packages/account/src/lib/components/personal-settings/personal-settings.component.html index 0b70ad41e8..e166a49545 100644 --- a/npm/ng-packs/packages/account/src/lib/components/personal-settings/personal-settings.component.html +++ b/npm/ng-packs/packages/account/src/lib/components/personal-settings/personal-settings.component.html @@ -1,55 +1,11 @@ -
-
- * -
-
-
-
- -
-
-
-
- -
-
-
-
- * -
-
- -
+ + + {{ 'AbpIdentity::Save' | abpLocalization }} diff --git a/npm/ng-packs/packages/account/src/lib/components/personal-settings/personal-settings.component.ts b/npm/ng-packs/packages/account/src/lib/components/personal-settings/personal-settings.component.ts index d15df99878..1688ef5741 100644 --- a/npm/ng-packs/packages/account/src/lib/components/personal-settings/personal-settings.component.ts +++ b/npm/ng-packs/packages/account/src/lib/components/personal-settings/personal-settings.component.ts @@ -1,17 +1,27 @@ -import { ProfileService } from '@abp/ng.account.core/proxy'; +import { ProfileDto, ProfileService } from '@abp/ng.account.core/proxy'; import { ToasterService } from '@abp/ng.theme.shared'; -import { Component, OnInit } from '@angular/core'; -import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { Component, Injector, OnInit, ViewEncapsulation } from '@angular/core'; +import { FormBuilder, FormGroup } from '@angular/forms'; import { finalize } from 'rxjs/operators'; import { Account } from '../../models/account'; import { ManageProfileStateService } from '../../services/manage-profile.state.service'; - -const { maxLength, required, email } = Validators; +import { + EXTENSIONS_IDENTIFIER, + FormPropData, + generateFormFromProps, +} from '@abp/ng.theme.shared/extensions'; +import { eAccountComponents } from '../../enums'; @Component({ selector: 'abp-personal-settings-form', templateUrl: './personal-settings.component.html', exportAs: 'abpPersonalSettingsForm', + providers: [ + { + provide: EXTENSIONS_IDENTIFIER, + useValue: eAccountComponents.PersonalSettings, + }, + ], }) export class PersonalSettingsComponent implements @@ -19,6 +29,8 @@ export class PersonalSettingsComponent Account.PersonalSettingsComponentInputs, Account.PersonalSettingsComponentOutputs { + selected: ProfileDto; + form: FormGroup; inProgress: boolean; @@ -28,21 +40,20 @@ export class PersonalSettingsComponent private toasterService: ToasterService, private profileService: ProfileService, private manageProfileState: ManageProfileStateService, + protected injector: Injector, ) {} - ngOnInit() { - this.buildForm(); + buildForm() { + this.selected = this.manageProfileState.getProfile(); + if (!this.selected) { + return; + } + const data = new FormPropData(this.injector, this.selected); + this.form = generateFormFromProps(data); } - buildForm() { - const profile = this.manageProfileState.getProfile(); - this.form = this.fb.group({ - userName: [profile.userName, [required, maxLength(256)]], - email: [profile.email, [required, email, maxLength(256)]], - name: [profile.name || '', [maxLength(64)]], - surname: [profile.surname || '', [maxLength(64)]], - phoneNumber: [profile.phoneNumber || '', [maxLength(16)]], - }); + ngOnInit(): void { + this.buildForm(); } submit() { diff --git a/npm/ng-packs/packages/account/src/lib/defaults/default-personal-settings-form-props.ts b/npm/ng-packs/packages/account/src/lib/defaults/default-personal-settings-form-props.ts new file mode 100644 index 0000000000..59c196f2bd --- /dev/null +++ b/npm/ng-packs/packages/account/src/lib/defaults/default-personal-settings-form-props.ts @@ -0,0 +1,47 @@ +import { ePropType, FormProp } from '@abp/ng.theme.shared/extensions'; +import { UpdateProfileDto } from '@abp/ng.account.core/proxy'; +import { Validators } from '@angular/forms'; +import { PersonalSettingsHalfRowComponent } from '../components/personal-settings/personal-settings-half-row.component'; + +const { maxLength, required, email } = Validators; +export const DEFAULT_PERSONAL_SETTINGS_UPDATE_FORM_PROPS = FormProp.createMany([ + { + type: ePropType.String, + name: 'userName', + displayName: 'AbpIdentity::DisplayName:UserName', + id: 'username', + validators: () => [required, maxLength(256)], + }, + { + type: ePropType.String, + name: 'name', + displayName: 'AbpIdentity::DisplayName:Name', + id: 'name', + validators: () => [maxLength(64)], + template: PersonalSettingsHalfRowComponent, + className: 'd-inline-block w-50', + }, + { + type: ePropType.String, + name: 'surname', + displayName: 'AbpIdentity::DisplayName:Surname', + id: 'surname', + validators: () => [maxLength(64)], + className: 'd-inline-block w-50 ps-4', + template: PersonalSettingsHalfRowComponent, + }, + { + type: ePropType.String, + name: 'email', + displayName: 'AbpIdentity::DisplayName:Email', + id: 'email-address', + validators: () => [required, email, maxLength(256)], + }, + { + type: ePropType.String, + name: 'phoneNumber', + displayName: 'AbpIdentity::DisplayName:PhoneNumber', + id: 'phone-number', + validators: () => [maxLength(16)], + }, +]); diff --git a/npm/ng-packs/packages/account/src/lib/guards/extensions.guard.ts b/npm/ng-packs/packages/account/src/lib/guards/extensions.guard.ts new file mode 100644 index 0000000000..7c50eadf5e --- /dev/null +++ b/npm/ng-packs/packages/account/src/lib/guards/extensions.guard.ts @@ -0,0 +1,46 @@ +import { Injectable, Injector } from '@angular/core'; +import { CanActivate } from '@angular/router'; +import { Observable } from 'rxjs'; +import { + ExtensionsService, + getObjectExtensionEntitiesFromStore, + mapEntitiesToContributors, + mergeWithDefaultProps, +} from '@abp/ng.theme.shared/extensions'; +import { ConfigStateService } from '@abp/ng.core'; +import { tap, map, mapTo } from 'rxjs/operators'; +import { + ACCOUNT_EDIT_FORM_PROP_CONTRIBUTORS, + DEFAULT_ACCOUNT_FORM_PROPS, +} from '../tokens/extensions.token'; +import { AccountEditFormPropContributors } from '../models/config-options'; +import { eAccountComponents } from '../enums/components'; + +@Injectable() +export class AccountExtensionsGuard implements CanActivate { + constructor(private injector: Injector) {} + + canActivate(): Observable { + const extensions: ExtensionsService = this.injector.get(ExtensionsService); + + const editFormContributors: AccountEditFormPropContributors = + this.injector.get(ACCOUNT_EDIT_FORM_PROP_CONTRIBUTORS, null) || {}; + + const configState = this.injector.get(ConfigStateService); + return getObjectExtensionEntitiesFromStore(configState, 'Identity').pipe( + map(entities => ({ + [eAccountComponents.PersonalSettings]: entities.User, + })), + mapEntitiesToContributors(configState, 'AbpIdentity'), + tap(objectExtensionContributors => { + mergeWithDefaultProps( + extensions.editFormProps, + DEFAULT_ACCOUNT_FORM_PROPS, + objectExtensionContributors.editForm, + editFormContributors, + ); + }), + mapTo(true), + ); + } +} diff --git a/npm/ng-packs/packages/account/src/lib/guards/index.ts b/npm/ng-packs/packages/account/src/lib/guards/index.ts index 382170b2b1..275cd2f8e8 100644 --- a/npm/ng-packs/packages/account/src/lib/guards/index.ts +++ b/npm/ng-packs/packages/account/src/lib/guards/index.ts @@ -1 +1,2 @@ export * from './authentication-flow.guard'; +export * from './extensions.guard'; diff --git a/npm/ng-packs/packages/account/src/lib/models/config-options.ts b/npm/ng-packs/packages/account/src/lib/models/config-options.ts index 898021b04e..f3af14a71e 100644 --- a/npm/ng-packs/packages/account/src/lib/models/config-options.ts +++ b/npm/ng-packs/packages/account/src/lib/models/config-options.ts @@ -1,3 +1,11 @@ +import { eAccountComponents } from '../enums'; +import { EditFormPropContributorCallback } from '@abp/ng.theme.shared/extensions'; +import { UpdateProfileDto } from '@abp/ng.account.core/proxy'; + export interface AccountConfigOptions { redirectUrl?: string; + editFormPropContributors?: AccountEditFormPropContributors; } +export type AccountEditFormPropContributors = Partial<{ + [eAccountComponents.PersonalSettings]: EditFormPropContributorCallback[]; +}>; \ No newline at end of file diff --git a/npm/ng-packs/packages/account/src/lib/tokens/extensions.token.ts b/npm/ng-packs/packages/account/src/lib/tokens/extensions.token.ts new file mode 100644 index 0000000000..78acb7feaa --- /dev/null +++ b/npm/ng-packs/packages/account/src/lib/tokens/extensions.token.ts @@ -0,0 +1,17 @@ +import { eAccountComponents } from '../enums'; +import { DEFAULT_PERSONAL_SETTINGS_UPDATE_FORM_PROPS } from '../defaults/default-personal-settings-form-props'; +import { InjectionToken } from '@angular/core'; +import { EditFormPropContributorCallback } from '@abp/ng.theme.shared/extensions'; +import { UpdateProfileDto } from '@abp/ng.account.core/proxy'; + +export const DEFAULT_ACCOUNT_FORM_PROPS = { + [eAccountComponents.PersonalSettings]: DEFAULT_PERSONAL_SETTINGS_UPDATE_FORM_PROPS, +}; + +export const ACCOUNT_EDIT_FORM_PROP_CONTRIBUTORS = new InjectionToken( + 'ACCOUNT_EDIT_FORM_PROP_CONTRIBUTORS', +); + +type EditFormPropContributors = Partial<{ + [eAccountComponents.PersonalSettings]: EditFormPropContributorCallback[]; +}>; diff --git a/npm/ng-packs/packages/account/src/lib/tokens/index.ts b/npm/ng-packs/packages/account/src/lib/tokens/index.ts index 0a88318130..4381d1bc77 100644 --- a/npm/ng-packs/packages/account/src/lib/tokens/index.ts +++ b/npm/ng-packs/packages/account/src/lib/tokens/index.ts @@ -1 +1,2 @@ export * from './config-options.token'; +export * from './extensions.token'; diff --git a/npm/ng-packs/packages/components/package.json b/npm/ng-packs/packages/components/package.json index f436d4f2e2..479f9b3785 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": "5.3.0", + "version": "6.0.0-rc.3", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "peerDependencies": { - "@abp/ng.core": ">=5.3.0", - "@abp/ng.theme.shared": ">=5.3.0", + "@abp/ng.core": ">=6.0.0-rc.3", + "@abp/ng.theme.shared": ">=6.0.0-rc.3", "@ng-bootstrap/ng-bootstrap": ">=10.0.0" }, "dependencies": { diff --git a/npm/ng-packs/packages/core/package.json b/npm/ng-packs/packages/core/package.json index 6b3f1b2555..d0e36c50c6 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": "5.3.0", + "version": "6.0.0-rc.3", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/utils": "~5.3.0", + "@abp/utils": "~6.0.0-rc.3", "angular-oauth2-oidc": "^13.0.1", "just-clone": "^3.2.1", "just-compare": "^1.4.0", diff --git a/npm/ng-packs/packages/core/src/lib/core.module.ts b/npm/ng-packs/packages/core/src/lib/core.module.ts index 58c128ac32..bcc071185f 100644 --- a/npm/ng-packs/packages/core/src/lib/core.module.ts +++ b/npm/ng-packs/packages/core/src/lib/core.module.ts @@ -136,6 +136,7 @@ export class CoreModule { return { ngModule: RootCoreModule, providers: [ + OAuthModule.forRoot().providers, LocaleProvider, CookieLanguageProvider, { @@ -190,7 +191,6 @@ export class CoreModule { useValue: localizationContributor(options.localizations), deps: [LocalizationService], }, - OAuthModule.forRoot().providers, ], }; } diff --git a/npm/ng-packs/packages/core/src/lib/directives/form-submit.directive.ts b/npm/ng-packs/packages/core/src/lib/directives/form-submit.directive.ts index 3efbf3ca2d..6c5d291c37 100644 --- a/npm/ng-packs/packages/core/src/lib/directives/form-submit.directive.ts +++ b/npm/ng-packs/packages/core/src/lib/directives/form-submit.directive.ts @@ -14,7 +14,9 @@ import { debounceTime, filter } from 'rxjs/operators'; import { SubscriptionService } from '../services/subscription.service'; type Controls = { [key: string]: FormControl } | FormGroup[]; - +/** + * @deprecated FormSubmitDirective will be removed in V7.0.0. Use `ngSubmit` instead. + */ @Directive({ // eslint-disable-next-line @angular-eslint/directive-selector selector: 'form[ngSubmit][formGroup]', @@ -43,6 +45,7 @@ export class FormSubmitDirective implements OnInit { ngOnInit() { this.subscription.addOne(this.formGroupDirective.ngSubmit, () => { + if (this.markAsDirtyWhenSubmit) { this.markAsDirty(); } diff --git a/npm/ng-packs/packages/core/src/lib/directives/permission.directive.ts b/npm/ng-packs/packages/core/src/lib/directives/permission.directive.ts index 2054a0d529..a103b11a46 100644 --- a/npm/ng-packs/packages/core/src/lib/directives/permission.directive.ts +++ b/npm/ng-packs/packages/core/src/lib/directives/permission.directive.ts @@ -1,4 +1,5 @@ import { + AfterViewInit, ChangeDetectorRef, Directive, Input, @@ -8,18 +9,24 @@ import { TemplateRef, ViewContainerRef, } from '@angular/core'; -import { Subscription } from 'rxjs'; -import { distinctUntilChanged } from 'rxjs/operators'; +import { ReplaySubject, Subscription } from 'rxjs'; +import { distinctUntilChanged, take } from 'rxjs/operators'; import { PermissionService } from '../services/permission.service'; @Directive({ selector: '[abpPermission]', }) -export class PermissionDirective implements OnDestroy, OnChanges { +export class PermissionDirective implements OnDestroy, OnChanges, AfterViewInit { @Input('abpPermission') condition: string | undefined; + @Input('abpPermissionRunChangeDetection') runChangeDetection = true; + subscription!: Subscription; + cdrSubject = new ReplaySubject(); + + rendered = false; + constructor( @Optional() private templateRef: TemplateRef, private vcRef: ViewContainerRef, @@ -38,7 +45,15 @@ export class PermissionDirective implements OnDestroy, OnChanges { .subscribe(isGranted => { this.vcRef.clear(); if (isGranted) this.vcRef.createEmbeddedView(this.templateRef); - this.cdRef.detectChanges(); + if (this.runChangeDetection) { + if (!this.rendered) { + this.cdrSubject.next(); + } else { + this.cdRef.detectChanges(); + } + } else { + this.cdRef.markForCheck(); + } }); } @@ -49,4 +64,9 @@ export class PermissionDirective implements OnDestroy, OnChanges { ngOnChanges() { this.check(); } + + ngAfterViewInit() { + this.cdrSubject.pipe(take(1)).subscribe(() => this.cdRef.detectChanges()); + this.rendered = true; + } } diff --git a/npm/ng-packs/packages/core/src/lib/interceptors/api.interceptor.ts b/npm/ng-packs/packages/core/src/lib/interceptors/api.interceptor.ts index da73b1ba55..d3dbe19ec0 100644 --- a/npm/ng-packs/packages/core/src/lib/interceptors/api.interceptor.ts +++ b/npm/ng-packs/packages/core/src/lib/interceptors/api.interceptor.ts @@ -1,5 +1,5 @@ import { HttpHandler, HttpHeaders, HttpInterceptor, HttpRequest } from '@angular/common/http'; -import { Injectable, Inject } from '@angular/core'; +import { Inject, Injectable } from '@angular/core'; import { OAuthService } from 'angular-oauth2-oidc'; import { finalize } from 'rxjs/operators'; import { SessionStateService } from '../services/session-state.service'; @@ -46,6 +46,8 @@ export class ApiInterceptor implements HttpInterceptor { headers[this.tenantKey] = tenant.id; } + headers['X-Requested-With'] = 'XMLHttpRequest'; + return headers; } } diff --git a/npm/ng-packs/packages/core/src/lib/services/environment.service.ts b/npm/ng-packs/packages/core/src/lib/services/environment.service.ts index 9fd1e280a3..a4e74cf16a 100644 --- a/npm/ng-packs/packages/core/src/lib/services/environment.service.ts +++ b/npm/ng-packs/packages/core/src/lib/services/environment.service.ts @@ -7,6 +7,13 @@ import { InternalStore } from '../utils/internal-store-utils'; const mapToApiUrl = (key: string) => (apis: Apis) => (apis[key] || apis.default).url || apis.default.url; +const mapToIssuer = (issuer: string) => { + if (!issuer) { + return issuer; + } + return issuer.endsWith('/') ? issuer : issuer + '/'; +}; + @Injectable({ providedIn: 'root' }) export class EnvironmentService { private readonly store = new InternalStore({} as Environment); @@ -34,4 +41,13 @@ export class EnvironmentService { setState(environment: Environment) { this.store.set(environment); } + + getIssuer() { + const issuer = this.store.state.oAuthConfig.issuer; + return mapToIssuer(issuer); + } + + getIssuer$() { + return this.store.sliceState(state => state.oAuthConfig.issuer).pipe(map(mapToIssuer)); + } } diff --git a/npm/ng-packs/packages/core/src/lib/services/rest.service.ts b/npm/ng-packs/packages/core/src/lib/services/rest.service.ts index 846d7a44ce..82e2c12707 100644 --- a/npm/ng-packs/packages/core/src/lib/services/rest.service.ts +++ b/npm/ng-packs/packages/core/src/lib/services/rest.service.ts @@ -38,9 +38,9 @@ export class RestService { api = api || this.getApiFromStore(config.apiName); const { method, params, ...options } = request; const { observe = Rest.Observe.Body, skipHandleError } = config; - + const url = this.removeDuplicateSlashes(api + request.url); return this.http - .request(method, api + request.url, { + .request(method, url, { observe, ...(params && { params: this.getParams(params, config.httpParamEncoder), @@ -62,4 +62,8 @@ export class RestService { ? new HttpParams({ encoder, fromObject: filteredParams }) : new HttpParams({ fromObject: filteredParams }); } + + private removeDuplicateSlashes(url: string): string { + return url.replace(/([^:]\/)\/+/g, '$1'); + } } diff --git a/npm/ng-packs/packages/core/src/lib/tests/permission.directive.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/permission.directive.spec.ts index d465a60fa3..4e64e61da8 100644 --- a/npm/ng-packs/packages/core/src/lib/tests/permission.directive.spec.ts +++ b/npm/ng-packs/packages/core/src/lib/tests/permission.directive.spec.ts @@ -2,10 +2,12 @@ import { createDirectiveFactory, SpectatorDirective } from '@ngneat/spectator/je import { Subject } from 'rxjs'; import { PermissionDirective } from '../directives/permission.directive'; import { PermissionService } from '../services'; +import { ChangeDetectorRef } from '@angular/core'; describe('PermissionDirective', () => { let spectator: SpectatorDirective; let directive: PermissionDirective; + let cdr: ChangeDetectorRef; const grantedPolicy$ = new Subject(); const createDirective = createDirectiveFactory({ directive: PermissionDirective, @@ -30,7 +32,7 @@ describe('PermissionDirective', () => { grantedPolicy$.next(true); expect(spectator.query('#test-element')).toBeTruthy(); grantedPolicy$.next(false); - // expect(spectator.query('#test-element')).toBeFalsy(); // TODO: change detection problem should be fixed + expect(spectator.query('#test-element')).toBeFalsy(); }); }); @@ -41,6 +43,7 @@ describe('PermissionDirective', () => { { hostProps: { condition: '' } }, ); directive = spectator.directive; + cdr = (directive as any).cdRef as ChangeDetectorRef; }); it('should be created', () => { @@ -55,8 +58,36 @@ describe('PermissionDirective', () => { grantedPolicy$.next(false); expect(spectator.query('#test-element')).toBeFalsy(); grantedPolicy$.next(true); + expect(spectator.queryAll('#test-element')).toHaveLength(1); + }); + + it('should call detect changes method', () => { + const detectChanges = jest.spyOn(cdr, 'detectChanges'); + expect(spectator.query('#test-element')).toBeFalsy(); + spectator.setHostInput({ condition: 'test' }); + grantedPolicy$.next(true); + expect(spectator.query('#test-element')).toBeTruthy(); + expect(detectChanges).toHaveBeenCalled(); + grantedPolicy$.next(false); + expect(spectator.query('#test-element')).toBeFalsy(); + expect(detectChanges).toHaveBeenCalled(); grantedPolicy$.next(true); expect(spectator.queryAll('#test-element')).toHaveLength(1); + expect(detectChanges).toHaveBeenCalled(); + }); + + it('should not call change detection before ngAfterViewInit', () => { + // hook before ngAfterViewInit + + const detectChanges = jest.spyOn(cdr, 'detectChanges'); + spectator.setHostInput({ condition: 'test' }); + grantedPolicy$.next(true); + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + directive.onInit = () => { + expect(detectChanges).not.toHaveBeenCalled(); + }; + expect(detectChanges).toHaveBeenCalled(); }); describe('#subscription', () => { @@ -70,4 +101,35 @@ describe('PermissionDirective', () => { }); }); }); + describe('with runChangeDetection Input', () => { + beforeEach(() => { + spectator = createDirective( + '
Testing Permission Directive
', + { hostProps: { condition: '' } }, + ); + directive = spectator.directive; + cdr = (directive as any).cdRef as ChangeDetectorRef; + }); + it('should not call detectChanges method', () => { + const detectChanges = jest.spyOn(cdr, 'detectChanges'); + const markForCheck = jest.spyOn(cdr, 'markForCheck'); + expect(spectator.query('#test-element')).toBeFalsy(); + spectator.setHostInput({ condition: 'test' }); + + grantedPolicy$.next(true); + expect(spectator.query('#test-element')).toBeTruthy(); + expect(detectChanges).not.toHaveBeenCalled(); + expect(markForCheck).toHaveBeenCalled(); + + grantedPolicy$.next(false); + expect(spectator.query('#test-element')).toBeFalsy(); + expect(detectChanges).not.toHaveBeenCalled(); + expect(markForCheck).toHaveBeenCalled(); + + grantedPolicy$.next(true); + expect(spectator.queryAll('#test-element')).toHaveLength(1); + expect(detectChanges).not.toHaveBeenCalled(); + expect(markForCheck).toHaveBeenCalled(); + }); + }); }); diff --git a/npm/ng-packs/packages/core/src/lib/tests/rest.service.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/rest.service.spec.ts index 1a3672df3d..49d561ada0 100644 --- a/npm/ng-packs/packages/core/src/lib/tests/rest.service.spec.ts +++ b/npm/ng-packs/packages/core/src/lib/tests/rest.service.spec.ts @@ -120,4 +120,17 @@ describe('HttpClient testing', () => { const req = spectator.expectOne(api + '/test', HttpMethod.GET); spectator.flushAll([req], [throwError('Testing error')]); }); + + test('should remove the duplicate slashes', () => { + spectator.service + .request({ method: HttpMethod.GET, url: '//test', params: { id: 1 } }) + .subscribe(); + spectator.expectOne(api + '/test?id=1', HttpMethod.GET); + }); + test('should remove the duplicate slashes multiple', () => { + spectator.service + .request({ method: HttpMethod.GET, url: '//test//my//endpoint', params: { id: 1 } }) + .subscribe(); + spectator.expectOne(api + '/test/my/endpoint?id=1', HttpMethod.GET); + }); }); diff --git a/npm/ng-packs/packages/core/src/lib/utils/common-utils.ts b/npm/ng-packs/packages/core/src/lib/utils/common-utils.ts index 31a1970fdc..b373b6c04a 100644 --- a/npm/ng-packs/packages/core/src/lib/utils/common-utils.ts +++ b/npm/ng-packs/packages/core/src/lib/utils/common-utils.ts @@ -11,6 +11,10 @@ export function isNullOrUndefined(obj) { return obj === null || obj === undefined; } +export function isNullOrEmpty(obj){ + return obj === null || obj === undefined || obj === ''; +} + export function exists(obj) { return !isNullOrUndefined(obj); } diff --git a/npm/ng-packs/packages/core/src/lib/validators/index.ts b/npm/ng-packs/packages/core/src/lib/validators/index.ts index fb06e7f1d8..69880dbf84 100644 --- a/npm/ng-packs/packages/core/src/lib/validators/index.ts +++ b/npm/ng-packs/packages/core/src/lib/validators/index.ts @@ -5,6 +5,7 @@ import { validateRange } from './range.validator'; import { validateRequired } from './required.validator'; import { validateStringLength } from './string-length.validator'; import { validateUrl } from './url.validator'; +import { validateUsername } from './username.validator'; export * from './age.validator'; export * from './credit-card.validator'; export * from './range.validator'; @@ -20,4 +21,5 @@ export const AbpValidators = { required: validateRequired, stringLength: validateStringLength, url: validateUrl, + username: validateUsername, }; diff --git a/npm/ng-packs/packages/core/src/lib/validators/required.validator.ts b/npm/ng-packs/packages/core/src/lib/validators/required.validator.ts index bf2a4b47ee..4e2b1931db 100644 --- a/npm/ng-packs/packages/core/src/lib/validators/required.validator.ts +++ b/npm/ng-packs/packages/core/src/lib/validators/required.validator.ts @@ -9,9 +9,11 @@ export interface RequiredOptions { } export function validateRequired({ allowEmptyStrings }: RequiredOptions = {}): ValidatorFn { - return (control: AbstractControl): RequiredError | null => { + // note: please do not remove name of the function, it is used in function compare with type 'RequiredError' + const required = (control: AbstractControl): RequiredError | null => { return isValidRequired(control.value, allowEmptyStrings) ? null : { required: true }; }; + return required; } function isValidRequired(value: any, allowEmptyStrings: boolean): boolean { diff --git a/npm/ng-packs/packages/core/src/lib/validators/url.validator.ts b/npm/ng-packs/packages/core/src/lib/validators/url.validator.ts index 705d07e17a..da941aee6f 100644 --- a/npm/ng-packs/packages/core/src/lib/validators/url.validator.ts +++ b/npm/ng-packs/packages/core/src/lib/validators/url.validator.ts @@ -1,4 +1,5 @@ import { AbstractControl, ValidatorFn } from '@angular/forms'; +import { isNullOrUndefined } from '../utils'; export interface UrlError { url: true; @@ -6,11 +7,11 @@ export interface UrlError { export function validateUrl(): ValidatorFn { return (control: AbstractControl): UrlError | null => { - if (['', null, undefined].indexOf(control.value) > -1) return null; + if (isNullOrUndefined(control.value)) return null; return isValidUrl(control.value) ? null : { url: true }; }; -} +} function isValidUrl(value: string): boolean { if (/^http(s)?:\/\/[^/]/.test(value) || /^ftp:\/\/[^/]/.test(value)) { diff --git a/npm/ng-packs/packages/core/src/lib/validators/username.validator.ts b/npm/ng-packs/packages/core/src/lib/validators/username.validator.ts new file mode 100644 index 0000000000..4e943769d2 --- /dev/null +++ b/npm/ng-packs/packages/core/src/lib/validators/username.validator.ts @@ -0,0 +1,29 @@ +import { AbstractControl, ValidatorFn } from '@angular/forms'; +import { isNullOrEmpty } from '../utils'; + +export interface UsernamePatternError { + usernamePattern: { + actualValue: string; + }; +} + +export interface UsernameOptions { + pattern?: RegExp; +} + +const onlyLetterAndNumberRegex = /^[a-zA-Z0-9]+$/; + +export function validateUsername( + { pattern }: UsernameOptions = { pattern: onlyLetterAndNumberRegex }, +): ValidatorFn { + return (control: AbstractControl): UsernamePatternError | null => { + const isValid = isValidUserName(control.value, pattern); + return isValid ? null : { usernamePattern: { actualValue: control.value } }; + }; +} + +function isValidUserName(value: any, pattern: RegExp): boolean { + if (isNullOrEmpty(value)) return true; + + return pattern.test(value); +} diff --git a/npm/ng-packs/packages/feature-management/package.json b/npm/ng-packs/packages/feature-management/package.json index 6378d4975f..a115426e23 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": "5.3.0", + "version": "6.0.0-rc.3", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.theme.shared": "~5.3.0", + "@abp/ng.theme.shared": "~6.0.0-rc.3", "tslib": "^2.0.0" }, "publishConfig": { diff --git a/npm/ng-packs/packages/identity/package.json b/npm/ng-packs/packages/identity/package.json index fe59ac25ef..f8baa00c38 100644 --- a/npm/ng-packs/packages/identity/package.json +++ b/npm/ng-packs/packages/identity/package.json @@ -1,14 +1,14 @@ { "name": "@abp/ng.identity", - "version": "5.3.0", + "version": "6.0.0-rc.3", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.permission-management": "~5.3.0", - "@abp/ng.theme.shared": "~5.3.0", + "@abp/ng.permission-management": "~6.0.0-rc.3", + "@abp/ng.theme.shared": "~6.0.0-rc.3", "tslib": "^2.0.0" }, "publishConfig": { diff --git a/npm/ng-packs/packages/identity/src/lib/defaults/default-users-entity-actions.ts b/npm/ng-packs/packages/identity/src/lib/defaults/default-users-entity-actions.ts index 0bd21c571b..8f6e3ebcc7 100644 --- a/npm/ng-packs/packages/identity/src/lib/defaults/default-users-entity-actions.ts +++ b/npm/ng-packs/packages/identity/src/lib/defaults/default-users-entity-actions.ts @@ -1,6 +1,7 @@ -import { IdentityUserDto } from '@abp/ng.identity/proxy'; +import {IdentityUserDto} from '@abp/ng.identity/proxy'; import { EntityAction } from '@abp/ng.theme.shared/extensions'; import { UsersComponent } from '../components/users/users.component'; +import {ConfigStateService, CurrentUserDto} from "@abp/ng.core"; export const DEFAULT_USERS_ENTITY_ACTIONS = EntityAction.createMany([ { @@ -18,13 +19,18 @@ export const DEFAULT_USERS_ENTITY_ACTIONS = EntityAction.createMany { const component = data.getInjected(UsersComponent); component.delete(data.record.id, data.record.name || data.record.userName); }, + visible: data => { + const userName = data.record.userName; + const configStateService = data.getInjected(ConfigStateService) + const currentUser = configStateService.getOne("currentUser") as CurrentUserDto; + return userName !== currentUser.userName; + }, permission: 'AbpIdentity.Users.Delete', }, ]); diff --git a/npm/ng-packs/packages/identity/src/lib/defaults/default-users-form-props.ts b/npm/ng-packs/packages/identity/src/lib/defaults/default-users-form-props.ts index d4e1012ae9..28c73b4320 100644 --- a/npm/ng-packs/packages/identity/src/lib/defaults/default-users-form-props.ts +++ b/npm/ng-packs/packages/identity/src/lib/defaults/default-users-form-props.ts @@ -1,7 +1,9 @@ import { IdentityUserDto } from '@abp/ng.identity/proxy'; import { getPasswordValidators } from '@abp/ng.theme.shared'; import { ePropType, FormProp } from '@abp/ng.theme.shared/extensions'; -import { Validators } from '@angular/forms'; +import { Validators } from '@angular/forms' +import { AbpValidators } from '@abp/ng.core'; + export const DEFAULT_USERS_CREATE_FORM_PROPS = FormProp.createMany([ { @@ -9,7 +11,7 @@ export const DEFAULT_USERS_CREATE_FORM_PROPS = FormProp.createMany [Validators.required, Validators.maxLength(256)], + validators: () => [Validators.required, Validators.maxLength(256), AbpValidators.username()], }, { type: ePropType.Password, @@ -63,6 +65,12 @@ export const DEFAULT_USERS_CREATE_FORM_PROPS = FormProp.createMany prop.name !== 'password', -); +export const DEFAULT_USERS_EDIT_FORM_PROPS = DEFAULT_USERS_CREATE_FORM_PROPS.map(prop => { + if (prop.name === 'password') { + return { + ...prop, + validators: data => [...getPasswordValidators({ get: data.getInjected })], + }; + } + return prop; +}); diff --git a/npm/ng-packs/packages/permission-management/package.json b/npm/ng-packs/packages/permission-management/package.json index 901170d545..40cd9d9444 100644 --- a/npm/ng-packs/packages/permission-management/package.json +++ b/npm/ng-packs/packages/permission-management/package.json @@ -1,13 +1,13 @@ { "name": "@abp/ng.permission-management", - "version": "5.3.0", + "version": "6.0.0-rc.3", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.theme.shared": "~5.3.0", + "@abp/ng.theme.shared": "~6.0.0-rc.3", "tslib": "^2.0.0" }, "publishConfig": { diff --git a/npm/ng-packs/packages/schematics/package.json b/npm/ng-packs/packages/schematics/package.json index 31ec87551d..0ea70ed553 100644 --- a/npm/ng-packs/packages/schematics/package.json +++ b/npm/ng-packs/packages/schematics/package.json @@ -1,6 +1,6 @@ { "name": "@abp/ng.schematics", - "version": "5.3.0", + "version": "6.0.0-rc.3", "description": "Schematics that works with ABP Backend", "keywords": [ "schematics" diff --git a/npm/ng-packs/packages/schematics/src/commands/api/files-service/proxy/__namespace@dir__/__name@kebab__.service.ts.template b/npm/ng-packs/packages/schematics/src/commands/api/files-service/proxy/__namespace@dir__/__name@kebab__.service.ts.template index 78fb27c33d..1e1cc4564a 100644 --- a/npm/ng-packs/packages/schematics/src/commands/api/files-service/proxy/__namespace@dir__/__name@kebab__.service.ts.template +++ b/npm/ng-packs/packages/schematics/src/commands/api/files-service/proxy/__namespace@dir__/__name@kebab__.service.ts.template @@ -7,12 +7,18 @@ export class <%= name %>Service { apiName = '<%= apiName %>';<% for (let {body, signature} of methods) { %> + <% + const isBlob = body.isBlobMethod() ; + const responseType = isBlob ? "Blob":body.responseType; + %> <%= camel(signature.name) %> = (<%= serializeParameters(signature.parameters) %>) => - this.restService.request<<%= body.requestType %>, <%= body.responseType %>>({ - method: '<%= body.method %>',<% + this.restService.request<<%= body.requestType %>, <%= responseType %>>({ + method: '<%= body.method %>',<% if (body.responseType === 'string') { %> - responseType: 'text',<% } %> + responseType: 'text',<% } %><% + if (isBlob) { %> + responseType: 'blob',<% } %> url: <%= body.url %>,<% if (body.params.length) { %> params: { <%= body.params.join(', ') %> },<% } diff --git a/npm/ng-packs/packages/schematics/src/constants/volo.ts b/npm/ng-packs/packages/schematics/src/constants/volo.ts index 00fde72c79..d45a4b9e72 100644 --- a/npm/ng-packs/packages/schematics/src/constants/volo.ts +++ b/npm/ng-packs/packages/schematics/src/constants/volo.ts @@ -1 +1,2 @@ export const VOLO_REGEX = /^Volo\.Abp\.(Application\.Dtos|ObjectExtending)/; +export const VOLO_REMOTE_STREAM_CONTENT = 'Volo.Abp.Content.IRemoteStreamContent' diff --git a/npm/ng-packs/packages/schematics/src/models/index.ts b/npm/ng-packs/packages/schematics/src/models/index.ts index 176c9c6617..c6d04f521e 100644 --- a/npm/ng-packs/packages/schematics/src/models/index.ts +++ b/npm/ng-packs/packages/schematics/src/models/index.ts @@ -5,6 +5,7 @@ export * from './method'; export * from './model'; export * from './project'; export * from './proxy-config'; +export * from './rule'; export * from './service'; export * from './tree'; export * from './util'; diff --git a/npm/ng-packs/packages/schematics/src/models/method.ts b/npm/ng-packs/packages/schematics/src/models/method.ts index d8f56e383e..d54d4303b9 100644 --- a/npm/ng-packs/packages/schematics/src/models/method.ts +++ b/npm/ng-packs/packages/schematics/src/models/method.ts @@ -4,6 +4,7 @@ import { getParamName } from '../utils/methods'; import { ParameterInBody } from './api-definition'; import { Property } from './model'; import { Omissible } from './util'; +import {VOLO_REMOTE_STREAM_CONTENT} from "../constants"; // eslint-disable-next-line @typescript-eslint/no-var-requires const shouldQuote = require('should-quote'); @@ -39,6 +40,7 @@ export class Body { body?: string; method: string; params: string[] = []; + responseTypeWithNamespace: string; requestType = 'any'; responseType: string; url: string; @@ -77,6 +79,10 @@ export class Body { this.setUrlQuotes(); } + isBlobMethod(){ + return this.responseTypeWithNamespace === VOLO_REMOTE_STREAM_CONTENT + } + private setUrlQuotes() { this.url = /{/.test(this.url) ? `\`/${this.url}\`` : `'/${this.url}'`; } @@ -84,5 +90,5 @@ export class Body { export type BodyOptions = Omissible< Omit, - 'params' | 'requestType' + 'params' | 'requestType' | 'isBlobMethod' >; diff --git a/npm/ng-packs/packages/schematics/src/models/rule.ts b/npm/ng-packs/packages/schematics/src/models/rule.ts new file mode 100644 index 0000000000..9c4f9b43ea --- /dev/null +++ b/npm/ng-packs/packages/schematics/src/models/rule.ts @@ -0,0 +1,3 @@ +import { Rule } from '@angular-devkit/schematics'; + +export type RuleReturn = ReturnType; diff --git a/npm/ng-packs/packages/schematics/src/utils/rule.ts b/npm/ng-packs/packages/schematics/src/utils/rule.ts index bd6acdd646..c68347531f 100644 --- a/npm/ng-packs/packages/schematics/src/utils/rule.ts +++ b/npm/ng-packs/packages/schematics/src/utils/rule.ts @@ -9,11 +9,15 @@ import { Source, Tree, } from '@angular-devkit/schematics'; +import { RuleReturn } from '../models/rule'; export function applyWithOverwrite(source: Source, rules: Rule[]): Rule { return (tree: Tree, _context: SchematicContext) => { - const rule = mergeWith(apply(source, [...rules, overwriteFileIfExists(tree)])); - + const mapped = rules.map(r => { + return ((_tree: Tree, _ctx: SchematicContext) => + new Promise(res => res(r(_tree, _ctx)))) as Rule; + }); + const rule = mergeWith(apply(source, [...mapped, overwriteFileIfExists(tree)])); return rule(tree, _context); }; } diff --git a/npm/ng-packs/packages/schematics/src/utils/service.ts b/npm/ng-packs/packages/schematics/src/utils/service.ts index 4e2fdc7c02..28ce82e3f7 100644 --- a/npm/ng-packs/packages/schematics/src/utils/service.ts +++ b/npm/ng-packs/packages/schematics/src/utils/service.ts @@ -22,6 +22,7 @@ import { } from './type'; import { eBindingSourceId } from '../enums'; import { camelizeHyphen } from './text'; +import {VOLO_REMOTE_STREAM_CONTENT} from "../constants"; export function serializeParameters(parameters: Property[]) { return parameters.map(p => p.name + p.optional + ': ' + p.type + p.default, '').join(', '); @@ -38,7 +39,8 @@ export function createControllerToServiceMapper({ const name = controller.controllerName; const namespace = parseNamespace(solution, controller.type); const actions = Object.values(controller.actions); - const imports = actions.reduce(createActionToImportsReducer(solution, types, namespace), []); + const typeWithoutIRemoteStreamContent = getTypesWithoutIRemoteStreamContent(types) + const imports = actions.reduce(createActionToImportsReducer(solution, typeWithoutIRemoteStreamContent, namespace), []); imports.push(new Import({ path: '@abp/ng.core', specifiers: ['RestService'] })); imports.push(new Import({ path: '@angular/core', specifiers: ['Injectable'] })); sortImports(imports); @@ -48,6 +50,11 @@ export function createControllerToServiceMapper({ }; } +function getTypesWithoutIRemoteStreamContent(types: Record) { + const newType = {...types} + delete newType[VOLO_REMOTE_STREAM_CONTENT] + return newType +} function sortMethods(methods: Method[]) { methods.sort((a, b) => (a.signature.name > b.signature.name ? 1 : -1)); } @@ -68,7 +75,8 @@ export function createActionToBodyMapper() { return ({ httpMethod, parameters, returnValue, url }: Action) => { const responseType = adaptType(returnValue.typeSimple); - const body = new Body({ method: httpMethod, responseType, url }); + const responseTypeWithNamespace = returnValue.typeSimple; + const body = new Body({ method: httpMethod, responseType, url ,responseTypeWithNamespace}); parameters.forEach(body.registerActionParameter); diff --git a/npm/ng-packs/packages/setting-management/config/src/components/email-setting-group/email-setting-group.component.html b/npm/ng-packs/packages/setting-management/config/src/lib/components/email-setting-group/email-setting-group.component.html similarity index 52% rename from npm/ng-packs/packages/setting-management/config/src/components/email-setting-group/email-setting-group.component.html rename to npm/ng-packs/packages/setting-management/config/src/lib/components/email-setting-group/email-setting-group.component.html index 8d23d2779d..21d3ee1dee 100644 --- a/npm/ng-packs/packages/setting-management/config/src/components/email-setting-group/email-setting-group.component.html +++ b/npm/ng-packs/packages/setting-management/config/src/lib/components/email-setting-group/email-setting-group.component.html @@ -6,13 +6,13 @@
+ }}
+ }}
@@ -25,34 +25,23 @@
- + + }}
- + + }}
-
+ }">
@@ -74,4 +63,51 @@ + + + + +

{{"SendTestEmail" | abpLocalization}}

+
+ + +
+ +
+ + +
+ +
+ + +
+ + +
+ + +
+ + +
+ + +
+
+
+ + + + + {{ 'AbpTenantManagement::Send' | abpLocalization }} + + + + +
\ No newline at end of file diff --git a/npm/ng-packs/packages/setting-management/config/src/components/email-setting-group/email-setting-group.component.ts b/npm/ng-packs/packages/setting-management/config/src/lib/components/email-setting-group/email-setting-group.component.ts similarity index 65% rename from npm/ng-packs/packages/setting-management/config/src/components/email-setting-group/email-setting-group.component.ts rename to npm/ng-packs/packages/setting-management/config/src/lib/components/email-setting-group/email-setting-group.component.ts index a695d71ca8..e8bdea2ea7 100644 --- a/npm/ng-packs/packages/setting-management/config/src/components/email-setting-group/email-setting-group.component.ts +++ b/npm/ng-packs/packages/setting-management/config/src/lib/components/email-setting-group/email-setting-group.component.ts @@ -1,7 +1,9 @@ +import { NgbModalOptions } from '@ng-bootstrap/ng-bootstrap'; import { collapse, ToasterService } from '@abp/ng.theme.shared'; import { Component, OnInit } from '@angular/core'; import { FormBuilder, FormGroup, Validators } from '@angular/forms'; import { finalize } from 'rxjs/operators'; +import { SettingManagementPolicyNames } from '../../enums/policy-names'; import { EmailSettingsService } from '../../proxy/email-settings.service'; import { EmailSettingsDto } from '../../proxy/models'; @@ -12,8 +14,11 @@ import { EmailSettingsDto } from '../../proxy/models'; }) export class EmailSettingGroupComponent implements OnInit { form!: FormGroup; - + emailTestForm: FormGroup; saving = false; + emailingPolicy = SettingManagementPolicyNames.Emailing; + isEmailTestModalOpen = false; + modalSize:NgbModalOptions= { size:"lg"} constructor( private emailSettingsService: EmailSettingsService, @@ -57,4 +62,30 @@ export class EmailSettingGroupComponent implements OnInit { this.getData(); }); } + openSendEmailModal() { + this.buildEmailTestForm(); + this.isEmailTestModalOpen = true; + } + + buildEmailTestForm() { + this.emailTestForm = this.fb.group({ + senderEmailAddress: ['', [Validators.required, Validators.email]], + targetEmailAddress: ['', [Validators.required, Validators.email]], + subject: ['', [Validators.required]], + body: [''], + }); + } + + emailTestFormSubmit() { + + if(this.emailTestForm.invalid){ + return; + } + this.emailSettingsService.sendTestEmail(this.emailTestForm.value).subscribe(res => { + this.toasterService.success('AbpSettingManagement::SuccessfullySent'); + this.isEmailTestModalOpen = false; + }) + + } + } diff --git a/npm/ng-packs/packages/setting-management/config/src/enums/index.ts b/npm/ng-packs/packages/setting-management/config/src/lib/enums/index.ts similarity index 68% rename from npm/ng-packs/packages/setting-management/config/src/enums/index.ts rename to npm/ng-packs/packages/setting-management/config/src/lib/enums/index.ts index 34fd5f8eb8..6015b15b03 100644 --- a/npm/ng-packs/packages/setting-management/config/src/enums/index.ts +++ b/npm/ng-packs/packages/setting-management/config/src/lib/enums/index.ts @@ -1,2 +1,3 @@ export * from './route-names'; export * from './setting-tab-names'; +export * from './policy-names'; diff --git a/npm/ng-packs/packages/setting-management/config/src/lib/enums/policy-names.ts b/npm/ng-packs/packages/setting-management/config/src/lib/enums/policy-names.ts new file mode 100644 index 0000000000..d6df2d0e10 --- /dev/null +++ b/npm/ng-packs/packages/setting-management/config/src/lib/enums/policy-names.ts @@ -0,0 +1,4 @@ +export const enum SettingManagementPolicyNames { + Emailing = 'SettingManagement.Emailing', + } + diff --git a/npm/ng-packs/packages/setting-management/config/src/enums/route-names.ts b/npm/ng-packs/packages/setting-management/config/src/lib/enums/route-names.ts similarity index 100% rename from npm/ng-packs/packages/setting-management/config/src/enums/route-names.ts rename to npm/ng-packs/packages/setting-management/config/src/lib/enums/route-names.ts diff --git a/npm/ng-packs/packages/setting-management/config/src/enums/setting-tab-names.ts b/npm/ng-packs/packages/setting-management/config/src/lib/enums/setting-tab-names.ts similarity index 100% rename from npm/ng-packs/packages/setting-management/config/src/enums/setting-tab-names.ts rename to npm/ng-packs/packages/setting-management/config/src/lib/enums/setting-tab-names.ts diff --git a/npm/ng-packs/packages/setting-management/config/src/providers/features.token.ts b/npm/ng-packs/packages/setting-management/config/src/lib/providers/features.token.ts similarity index 100% rename from npm/ng-packs/packages/setting-management/config/src/providers/features.token.ts rename to npm/ng-packs/packages/setting-management/config/src/lib/providers/features.token.ts diff --git a/npm/ng-packs/packages/setting-management/config/src/providers/index.ts b/npm/ng-packs/packages/setting-management/config/src/lib/providers/index.ts similarity index 100% rename from npm/ng-packs/packages/setting-management/config/src/providers/index.ts rename to npm/ng-packs/packages/setting-management/config/src/lib/providers/index.ts diff --git a/npm/ng-packs/packages/setting-management/config/src/providers/route.provider.ts b/npm/ng-packs/packages/setting-management/config/src/lib/providers/route.provider.ts similarity index 100% rename from npm/ng-packs/packages/setting-management/config/src/providers/route.provider.ts rename to npm/ng-packs/packages/setting-management/config/src/lib/providers/route.provider.ts diff --git a/npm/ng-packs/packages/setting-management/config/src/providers/setting-tab.provider.ts b/npm/ng-packs/packages/setting-management/config/src/lib/providers/setting-tab.provider.ts similarity index 100% rename from npm/ng-packs/packages/setting-management/config/src/providers/setting-tab.provider.ts rename to npm/ng-packs/packages/setting-management/config/src/lib/providers/setting-tab.provider.ts diff --git a/npm/ng-packs/packages/setting-management/config/src/providers/visible.provider.ts b/npm/ng-packs/packages/setting-management/config/src/lib/providers/visible.provider.ts similarity index 100% rename from npm/ng-packs/packages/setting-management/config/src/providers/visible.provider.ts rename to npm/ng-packs/packages/setting-management/config/src/lib/providers/visible.provider.ts diff --git a/npm/ng-packs/packages/setting-management/config/src/proxy/README.md b/npm/ng-packs/packages/setting-management/config/src/lib/proxy/README.md similarity index 100% rename from npm/ng-packs/packages/setting-management/config/src/proxy/README.md rename to npm/ng-packs/packages/setting-management/config/src/lib/proxy/README.md diff --git a/npm/ng-packs/packages/setting-management/config/src/lib/proxy/email-settings.service.ts b/npm/ng-packs/packages/setting-management/config/src/lib/proxy/email-settings.service.ts new file mode 100644 index 0000000000..f9091a97d0 --- /dev/null +++ b/npm/ng-packs/packages/setting-management/config/src/lib/proxy/email-settings.service.ts @@ -0,0 +1,35 @@ +import type { EmailSettingsDto, SendTestEmailInput, UpdateEmailSettingsDto } from './models'; +import { RestService } from '@abp/ng.core'; +import { Injectable } from '@angular/core'; + +@Injectable({ + providedIn: 'root', +}) +export class EmailSettingsService { + apiName = 'SettingManagement'; + + get = () => + this.restService.request({ + method: 'GET', + url: '/api/setting-management/emailing', + }, + { apiName: this.apiName }); + + sendTestEmail = (input: SendTestEmailInput) => + this.restService.request({ + method: 'POST', + url: '/api/setting-management/emailing/send-test-email', + body: input, + }, + { apiName: this.apiName }); + + update = (input: UpdateEmailSettingsDto) => + this.restService.request({ + method: 'POST', + url: '/api/setting-management/emailing', + body: input, + }, + { apiName: this.apiName }); + + constructor(private restService: RestService) {} +} diff --git a/npm/ng-packs/packages/setting-management/config/src/proxy/generate-proxy.json b/npm/ng-packs/packages/setting-management/config/src/lib/proxy/generate-proxy.json similarity index 63% rename from npm/ng-packs/packages/setting-management/config/src/proxy/generate-proxy.json rename to npm/ng-packs/packages/setting-management/config/src/lib/proxy/generate-proxy.json index f5a18bee75..229e4e4bbe 100644 --- a/npm/ng-packs/packages/setting-management/config/src/proxy/generate-proxy.json +++ b/npm/ng-packs/packages/setting-management/config/src/lib/proxy/generate-proxy.json @@ -3,16 +3,19 @@ "settingManagement" ], "modules": { - "featureManagement": { - "rootPath": "featureManagement", - "remoteServiceName": "AbpFeatureManagement", + "permissionManagement": { + "rootPath": "permissionManagement", + "remoteServiceName": "AbpPermissionManagement", "controllers": { - "Volo.Abp.FeatureManagement.FeaturesController": { - "controllerName": "Features", - "type": "Volo.Abp.FeatureManagement.FeaturesController", + "Volo.Abp.PermissionManagement.PermissionsController": { + "controllerName": "Permissions", + "controllerGroupName": "Permissions", + "isRemoteService": true, + "apiVersion": null, + "type": "Volo.Abp.PermissionManagement.PermissionsController", "interfaces": [ { - "type": "Volo.Abp.FeatureManagement.IFeatureAppService" + "type": "Volo.Abp.PermissionManagement.IPermissionAppService" } ], "actions": { @@ -20,7 +23,7 @@ "uniqueName": "GetAsyncByProviderNameAndProviderKey", "name": "GetAsync", "httpMethod": "GET", - "url": "api/feature-management/features", + "url": "api/permission-management/permissions", "supportedVersions": [], "parametersOnMethod": [ { @@ -44,6 +47,7 @@ { "nameOnMethod": "providerName", "name": "providerName", + "jsonName": null, "type": "System.String", "typeSimple": "string", "isOptional": false, @@ -55,6 +59,7 @@ { "nameOnMethod": "providerKey", "name": "providerKey", + "jsonName": null, "type": "System.String", "typeSimple": "string", "isOptional": false, @@ -65,15 +70,17 @@ } ], "returnValue": { - "type": "Volo.Abp.FeatureManagement.GetFeatureListResultDto", - "typeSimple": "Volo.Abp.FeatureManagement.GetFeatureListResultDto" - } + "type": "Volo.Abp.PermissionManagement.GetPermissionListResultDto", + "typeSimple": "Volo.Abp.PermissionManagement.GetPermissionListResultDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.PermissionManagement.IPermissionAppService" }, "UpdateAsyncByProviderNameAndProviderKeyAndInput": { "uniqueName": "UpdateAsyncByProviderNameAndProviderKeyAndInput", "name": "UpdateAsync", "httpMethod": "PUT", - "url": "api/feature-management/features", + "url": "api/permission-management/permissions", "supportedVersions": [], "parametersOnMethod": [ { @@ -94,9 +101,9 @@ }, { "name": "input", - "typeAsString": "Volo.Abp.FeatureManagement.UpdateFeaturesDto, Volo.Abp.FeatureManagement.Application.Contracts", - "type": "Volo.Abp.FeatureManagement.UpdateFeaturesDto", - "typeSimple": "Volo.Abp.FeatureManagement.UpdateFeaturesDto", + "typeAsString": "Volo.Abp.PermissionManagement.UpdatePermissionsDto, Volo.Abp.PermissionManagement.Application.Contracts", + "type": "Volo.Abp.PermissionManagement.UpdatePermissionsDto", + "typeSimple": "Volo.Abp.PermissionManagement.UpdatePermissionsDto", "isOptional": false, "defaultValue": null } @@ -105,6 +112,7 @@ { "nameOnMethod": "providerName", "name": "providerName", + "jsonName": null, "type": "System.String", "typeSimple": "string", "isOptional": false, @@ -116,6 +124,7 @@ { "nameOnMethod": "providerKey", "name": "providerKey", + "jsonName": null, "type": "System.String", "typeSimple": "string", "isOptional": false, @@ -127,8 +136,9 @@ { "nameOnMethod": "input", "name": "input", - "type": "Volo.Abp.FeatureManagement.UpdateFeaturesDto", - "typeSimple": "Volo.Abp.FeatureManagement.UpdateFeaturesDto", + "jsonName": null, + "type": "Volo.Abp.PermissionManagement.UpdatePermissionsDto", + "typeSimple": "Volo.Abp.PermissionManagement.UpdatePermissionsDto", "isOptional": false, "defaultValue": null, "constraintTypes": null, @@ -139,7 +149,179 @@ "returnValue": { "type": "System.Void", "typeSimple": "System.Void" - } + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.PermissionManagement.IPermissionAppService" + } + } + } + } + }, + "abp": { + "rootPath": "abp", + "remoteServiceName": "abp", + "controllers": { + "Pages.Abp.MultiTenancy.AbpTenantController": { + "controllerName": "AbpTenant", + "controllerGroupName": "AbpTenant", + "isRemoteService": true, + "apiVersion": null, + "type": "Pages.Abp.MultiTenancy.AbpTenantController", + "interfaces": [ + { + "type": "Volo.Abp.AspNetCore.Mvc.MultiTenancy.IAbpTenantAppService" + } + ], + "actions": { + "FindTenantByNameAsyncByName": { + "uniqueName": "FindTenantByNameAsyncByName", + "name": "FindTenantByNameAsync", + "httpMethod": "GET", + "url": "api/abp/multi-tenancy/tenants/by-name/{name}", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "name", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "name", + "name": "name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + } + ], + "returnValue": { + "type": "Volo.Abp.AspNetCore.Mvc.MultiTenancy.FindTenantResultDto", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.MultiTenancy.FindTenantResultDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.AspNetCore.Mvc.MultiTenancy.IAbpTenantAppService" + }, + "FindTenantByIdAsyncById": { + "uniqueName": "FindTenantByIdAsyncById", + "name": "FindTenantByIdAsync", + "httpMethod": "GET", + "url": "api/abp/multi-tenancy/tenants/by-id/{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.Abp.AspNetCore.Mvc.MultiTenancy.FindTenantResultDto", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.MultiTenancy.FindTenantResultDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.AspNetCore.Mvc.MultiTenancy.IAbpTenantAppService" + } + } + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationController": { + "controllerName": "AbpApplicationConfiguration", + "controllerGroupName": "AbpApplicationConfiguration", + "isRemoteService": true, + "apiVersion": null, + "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationController", + "interfaces": [ + { + "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.IAbpApplicationConfigurationAppService" + } + ], + "actions": { + "GetAsync": { + "uniqueName": "GetAsync", + "name": "GetAsync", + "httpMethod": "GET", + "url": "api/abp/application-configuration", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationConfigurationDto", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationConfigurationDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.IAbpApplicationConfigurationAppService" + } + } + }, + "Volo.Abp.AspNetCore.Mvc.ApiExploring.AbpApiDefinitionController": { + "controllerName": "AbpApiDefinition", + "controllerGroupName": "AbpApiDefinition", + "isRemoteService": true, + "apiVersion": null, + "type": "Volo.Abp.AspNetCore.Mvc.ApiExploring.AbpApiDefinitionController", + "interfaces": [], + "actions": { + "GetByModel": { + "uniqueName": "GetByModel", + "name": "Get", + "httpMethod": "GET", + "url": "api/abp/api-definition", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "model", + "typeAsString": "Volo.Abp.Http.Modeling.ApplicationApiDescriptionModelRequestDto, Volo.Abp.Http", + "type": "Volo.Abp.Http.Modeling.ApplicationApiDescriptionModelRequestDto", + "typeSimple": "Volo.Abp.Http.Modeling.ApplicationApiDescriptionModelRequestDto", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "model", + "name": "IncludeTypes", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "model" + } + ], + "returnValue": { + "type": "Volo.Abp.Http.Modeling.ApplicationApiDescriptionModel", + "typeSimple": "Volo.Abp.Http.Modeling.ApplicationApiDescriptionModel" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.AspNetCore.Mvc.ApiExploring.AbpApiDefinitionController" } } } @@ -151,6 +333,9 @@ "controllers": { "Volo.Abp.TenantManagement.TenantController": { "controllerName": "Tenant", + "controllerGroupName": "Tenant", + "isRemoteService": true, + "apiVersion": null, "type": "Volo.Abp.TenantManagement.TenantController", "interfaces": [ { @@ -178,6 +363,7 @@ { "nameOnMethod": "id", "name": "id", + "jsonName": null, "type": "System.Guid", "typeSimple": "string", "isOptional": false, @@ -190,7 +376,9 @@ "returnValue": { "type": "Volo.Abp.TenantManagement.TenantDto", "typeSimple": "Volo.Abp.TenantManagement.TenantDto" - } + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Application.Services.IReadOnlyAppService" }, "GetListAsyncByInput": { "uniqueName": "GetListAsyncByInput", @@ -212,6 +400,7 @@ { "nameOnMethod": "input", "name": "Filter", + "jsonName": null, "type": "System.String", "typeSimple": "string", "isOptional": false, @@ -223,6 +412,7 @@ { "nameOnMethod": "input", "name": "Sorting", + "jsonName": null, "type": "System.String", "typeSimple": "string", "isOptional": false, @@ -234,6 +424,7 @@ { "nameOnMethod": "input", "name": "SkipCount", + "jsonName": null, "type": "System.Int32", "typeSimple": "number", "isOptional": false, @@ -245,6 +436,7 @@ { "nameOnMethod": "input", "name": "MaxResultCount", + "jsonName": null, "type": "System.Int32", "typeSimple": "number", "isOptional": false, @@ -257,7 +449,9 @@ "returnValue": { "type": "Volo.Abp.Application.Dtos.PagedResultDto", "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto" - } + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Application.Services.IReadOnlyAppService" }, "CreateAsyncByInput": { "uniqueName": "CreateAsyncByInput", @@ -279,6 +473,7 @@ { "nameOnMethod": "input", "name": "input", + "jsonName": null, "type": "Volo.Abp.TenantManagement.TenantCreateDto", "typeSimple": "Volo.Abp.TenantManagement.TenantCreateDto", "isOptional": false, @@ -291,7 +486,9 @@ "returnValue": { "type": "Volo.Abp.TenantManagement.TenantDto", "typeSimple": "Volo.Abp.TenantManagement.TenantDto" - } + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Application.Services.ICreateAppService" }, "UpdateAsyncByIdAndInput": { "uniqueName": "UpdateAsyncByIdAndInput", @@ -321,6 +518,7 @@ { "nameOnMethod": "id", "name": "id", + "jsonName": null, "type": "System.Guid", "typeSimple": "string", "isOptional": false, @@ -332,6 +530,7 @@ { "nameOnMethod": "input", "name": "input", + "jsonName": null, "type": "Volo.Abp.TenantManagement.TenantUpdateDto", "typeSimple": "Volo.Abp.TenantManagement.TenantUpdateDto", "isOptional": false, @@ -344,7 +543,9 @@ "returnValue": { "type": "Volo.Abp.TenantManagement.TenantDto", "typeSimple": "Volo.Abp.TenantManagement.TenantDto" - } + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Application.Services.IUpdateAppService" }, "DeleteAsyncById": { "uniqueName": "DeleteAsyncById", @@ -366,6 +567,7 @@ { "nameOnMethod": "id", "name": "id", + "jsonName": null, "type": "System.Guid", "typeSimple": "string", "isOptional": false, @@ -378,7 +580,9 @@ "returnValue": { "type": "System.Void", "typeSimple": "System.Void" - } + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Application.Services.IDeleteAppService" }, "GetDefaultConnectionStringAsyncById": { "uniqueName": "GetDefaultConnectionStringAsyncById", @@ -400,6 +604,7 @@ { "nameOnMethod": "id", "name": "id", + "jsonName": null, "type": "System.Guid", "typeSimple": "string", "isOptional": false, @@ -412,7 +617,9 @@ "returnValue": { "type": "System.String", "typeSimple": "string" - } + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.TenantManagement.ITenantAppService" }, "UpdateDefaultConnectionStringAsyncByIdAndDefaultConnectionString": { "uniqueName": "UpdateDefaultConnectionStringAsyncByIdAndDefaultConnectionString", @@ -442,6 +649,7 @@ { "nameOnMethod": "id", "name": "id", + "jsonName": null, "type": "System.Guid", "typeSimple": "string", "isOptional": false, @@ -453,6 +661,7 @@ { "nameOnMethod": "defaultConnectionString", "name": "defaultConnectionString", + "jsonName": null, "type": "System.String", "typeSimple": "string", "isOptional": false, @@ -465,7 +674,9 @@ "returnValue": { "type": "System.Void", "typeSimple": "System.Void" - } + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.TenantManagement.ITenantAppService" }, "DeleteDefaultConnectionStringAsyncById": { "uniqueName": "DeleteDefaultConnectionStringAsyncById", @@ -487,6 +698,7 @@ { "nameOnMethod": "id", "name": "id", + "jsonName": null, "type": "System.Guid", "typeSimple": "string", "isOptional": false, @@ -499,50 +711,79 @@ "returnValue": { "type": "System.Void", "typeSimple": "System.Void" - } + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.TenantManagement.ITenantAppService" } } } } }, - "settingManagement": { - "rootPath": "settingManagement", - "remoteServiceName": "SettingManagement", + "account": { + "rootPath": "account", + "remoteServiceName": "AbpAccount", "controllers": { - "Volo.Abp.SettingManagement.EmailSettingsController": { - "controllerName": "EmailSettings", - "type": "Volo.Abp.SettingManagement.EmailSettingsController", + "Volo.Abp.Account.AccountController": { + "controllerName": "Account", + "controllerGroupName": "Account", + "isRemoteService": true, + "apiVersion": null, + "type": "Volo.Abp.Account.AccountController", "interfaces": [ { - "type": "Volo.Abp.SettingManagement.IEmailSettingsAppService" + "type": "Volo.Abp.Account.IAccountAppService" } ], "actions": { - "GetAsync": { - "uniqueName": "GetAsync", - "name": "GetAsync", - "httpMethod": "GET", - "url": "api/setting-management/emailing", + "RegisterAsyncByInput": { + "uniqueName": "RegisterAsyncByInput", + "name": "RegisterAsync", + "httpMethod": "POST", + "url": "api/account/register", "supportedVersions": [], - "parametersOnMethod": [], - "parameters": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.Account.RegisterDto, Volo.Abp.Account.Application.Contracts", + "type": "Volo.Abp.Account.RegisterDto", + "typeSimple": "Volo.Abp.Account.RegisterDto", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.Abp.Account.RegisterDto", + "typeSimple": "Volo.Abp.Account.RegisterDto", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], "returnValue": { - "type": "Volo.Abp.SettingManagement.EmailSettingsDto", - "typeSimple": "Volo.Abp.SettingManagement.EmailSettingsDto" - } + "type": "Volo.Abp.Identity.IdentityUserDto", + "typeSimple": "Volo.Abp.Identity.IdentityUserDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.IAccountAppService" }, - "UpdateAsyncByInput": { - "uniqueName": "UpdateAsyncByInput", - "name": "UpdateAsync", + "SendPasswordResetCodeAsyncByInput": { + "uniqueName": "SendPasswordResetCodeAsyncByInput", + "name": "SendPasswordResetCodeAsync", "httpMethod": "POST", - "url": "api/setting-management/emailing", + "url": "api/account/send-password-reset-code", "supportedVersions": [], "parametersOnMethod": [ { "name": "input", - "typeAsString": "Volo.Abp.SettingManagement.UpdateEmailSettingsDto, Volo.Abp.SettingManagement.Application.Contracts", - "type": "Volo.Abp.SettingManagement.UpdateEmailSettingsDto", - "typeSimple": "Volo.Abp.SettingManagement.UpdateEmailSettingsDto", + "typeAsString": "Volo.Abp.Account.SendPasswordResetCodeDto, Volo.Abp.Account.Application.Contracts", + "type": "Volo.Abp.Account.SendPasswordResetCodeDto", + "typeSimple": "Volo.Abp.Account.SendPasswordResetCodeDto", "isOptional": false, "defaultValue": null } @@ -551,8 +792,9 @@ { "nameOnMethod": "input", "name": "input", - "type": "Volo.Abp.SettingManagement.UpdateEmailSettingsDto", - "typeSimple": "Volo.Abp.SettingManagement.UpdateEmailSettingsDto", + "jsonName": null, + "type": "Volo.Abp.Account.SendPasswordResetCodeDto", + "typeSimple": "Volo.Abp.Account.SendPasswordResetCodeDto", "isOptional": false, "defaultValue": null, "constraintTypes": null, @@ -563,138 +805,33 @@ "returnValue": { "type": "System.Void", "typeSimple": "System.Void" - } - } - } - } - } - }, - "permissionManagement": { - "rootPath": "permissionManagement", - "remoteServiceName": "AbpPermissionManagement", - "controllers": { - "Volo.Abp.PermissionManagement.PermissionsController": { - "controllerName": "Permissions", - "type": "Volo.Abp.PermissionManagement.PermissionsController", - "interfaces": [ - { - "type": "Volo.Abp.PermissionManagement.IPermissionAppService" - } - ], - "actions": { - "GetAsyncByProviderNameAndProviderKey": { - "uniqueName": "GetAsyncByProviderNameAndProviderKey", - "name": "GetAsync", - "httpMethod": "GET", - "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 - } - ], - "parameters": [ - { - "nameOnMethod": "providerName", - "name": "providerName", - "type": "System.String", - "typeSimple": "string", - "isOptional": false, - "defaultValue": null, - "constraintTypes": null, - "bindingSourceId": "ModelBinding", - "descriptorName": "" - }, - { - "nameOnMethod": "providerKey", - "name": "providerKey", - "type": "System.String", - "typeSimple": "string", - "isOptional": false, - "defaultValue": null, - "constraintTypes": null, - "bindingSourceId": "ModelBinding", - "descriptorName": "" - } - ], - "returnValue": { - "type": "Volo.Abp.PermissionManagement.GetPermissionListResultDto", - "typeSimple": "Volo.Abp.PermissionManagement.GetPermissionListResultDto" - } + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.IAccountAppService" }, - "UpdateAsyncByProviderNameAndProviderKeyAndInput": { - "uniqueName": "UpdateAsyncByProviderNameAndProviderKeyAndInput", - "name": "UpdateAsync", - "httpMethod": "PUT", - "url": "api/permission-management/permissions", + "ResetPasswordAsyncByInput": { + "uniqueName": "ResetPasswordAsyncByInput", + "name": "ResetPasswordAsync", + "httpMethod": "POST", + "url": "api/account/reset-password", "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": "Volo.Abp.PermissionManagement.UpdatePermissionsDto, Volo.Abp.PermissionManagement.Application.Contracts", - "type": "Volo.Abp.PermissionManagement.UpdatePermissionsDto", - "typeSimple": "Volo.Abp.PermissionManagement.UpdatePermissionsDto", + "typeAsString": "Volo.Abp.Account.ResetPasswordDto, Volo.Abp.Account.Application.Contracts", + "type": "Volo.Abp.Account.ResetPasswordDto", + "typeSimple": "Volo.Abp.Account.ResetPasswordDto", "isOptional": false, "defaultValue": null } ], "parameters": [ - { - "nameOnMethod": "providerName", - "name": "providerName", - "type": "System.String", - "typeSimple": "string", - "isOptional": false, - "defaultValue": null, - "constraintTypes": null, - "bindingSourceId": "ModelBinding", - "descriptorName": "" - }, - { - "nameOnMethod": "providerKey", - "name": "providerKey", - "type": "System.String", - "typeSimple": "string", - "isOptional": false, - "defaultValue": null, - "constraintTypes": null, - "bindingSourceId": "ModelBinding", - "descriptorName": "" - }, { "nameOnMethod": "input", "name": "input", - "type": "Volo.Abp.PermissionManagement.UpdatePermissionsDto", - "typeSimple": "Volo.Abp.PermissionManagement.UpdatePermissionsDto", + "jsonName": null, + "type": "Volo.Abp.Account.ResetPasswordDto", + "typeSimple": "Volo.Abp.Account.ResetPasswordDto", "isOptional": false, "defaultValue": null, "constraintTypes": null, @@ -705,18 +842,17 @@ "returnValue": { "type": "System.Void", "typeSimple": "System.Void" - } + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.IAccountAppService" } } - } - } - }, - "account": { - "rootPath": "account", - "remoteServiceName": "AbpAccount", - "controllers": { + }, "Volo.Abp.Account.Web.Areas.Account.Controllers.AccountController": { "controllerName": "Account", + "controllerGroupName": "Login", + "isRemoteService": true, + "apiVersion": null, "type": "Volo.Abp.Account.Web.Areas.Account.Controllers.AccountController", "interfaces": [], "actions": { @@ -740,6 +876,7 @@ { "nameOnMethod": "login", "name": "login", + "jsonName": null, "type": "Volo.Abp.Account.Web.Areas.Account.Controllers.Models.UserLoginInfo", "typeSimple": "Volo.Abp.Account.Web.Areas.Account.Controllers.Models.UserLoginInfo", "isOptional": false, @@ -752,7 +889,9 @@ "returnValue": { "type": "Volo.Abp.Account.Web.Areas.Account.Controllers.Models.AbpLoginResult", "typeSimple": "Volo.Abp.Account.Web.Areas.Account.Controllers.Models.AbpLoginResult" - } + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.Web.Areas.Account.Controllers.AccountController" }, "Logout": { "uniqueName": "Logout", @@ -765,7 +904,9 @@ "returnValue": { "type": "System.Void", "typeSimple": "System.Void" - } + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.Web.Areas.Account.Controllers.AccountController" }, "CheckPasswordByLogin": { "uniqueName": "CheckPasswordByLogin", @@ -787,6 +928,7 @@ { "nameOnMethod": "login", "name": "login", + "jsonName": null, "type": "Volo.Abp.Account.Web.Areas.Account.Controllers.Models.UserLoginInfo", "typeSimple": "Volo.Abp.Account.Web.Areas.Account.Controllers.Models.UserLoginInfo", "isOptional": false, @@ -799,65 +941,51 @@ "returnValue": { "type": "Volo.Abp.Account.Web.Areas.Account.Controllers.Models.AbpLoginResult", "typeSimple": "Volo.Abp.Account.Web.Areas.Account.Controllers.Models.AbpLoginResult" - } + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.Web.Areas.Account.Controllers.AccountController" } } }, - "Volo.Abp.Account.AccountController": { - "controllerName": "Account", - "type": "Volo.Abp.Account.AccountController", + "Volo.Abp.Account.ProfileController": { + "controllerName": "Profile", + "controllerGroupName": "Profile", + "isRemoteService": true, + "apiVersion": null, + "type": "Volo.Abp.Account.ProfileController", "interfaces": [ { - "type": "Volo.Abp.Account.IAccountAppService" + "type": "Volo.Abp.Account.IProfileAppService" } ], "actions": { - "RegisterAsyncByInput": { - "uniqueName": "RegisterAsyncByInput", - "name": "RegisterAsync", - "httpMethod": "POST", - "url": "api/account/register", + "GetAsync": { + "uniqueName": "GetAsync", + "name": "GetAsync", + "httpMethod": "GET", + "url": "api/account/my-profile", "supportedVersions": [], - "parametersOnMethod": [ - { - "name": "input", - "typeAsString": "Volo.Abp.Account.RegisterDto, Volo.Abp.Account.Application.Contracts", - "type": "Volo.Abp.Account.RegisterDto", - "typeSimple": "Volo.Abp.Account.RegisterDto", - "isOptional": false, - "defaultValue": null - } - ], - "parameters": [ - { - "nameOnMethod": "input", - "name": "input", - "type": "Volo.Abp.Account.RegisterDto", - "typeSimple": "Volo.Abp.Account.RegisterDto", - "isOptional": false, - "defaultValue": null, - "constraintTypes": null, - "bindingSourceId": "Body", - "descriptorName": "" - } - ], + "parametersOnMethod": [], + "parameters": [], "returnValue": { - "type": "Volo.Abp.Identity.IdentityUserDto", - "typeSimple": "Volo.Abp.Identity.IdentityUserDto" - } + "type": "Volo.Abp.Account.ProfileDto", + "typeSimple": "Volo.Abp.Account.ProfileDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.IProfileAppService" }, - "SendPasswordResetCodeAsyncByInput": { - "uniqueName": "SendPasswordResetCodeAsyncByInput", - "name": "SendPasswordResetCodeAsync", - "httpMethod": "POST", - "url": "api/account/send-password-reset-code", + "UpdateAsyncByInput": { + "uniqueName": "UpdateAsyncByInput", + "name": "UpdateAsync", + "httpMethod": "PUT", + "url": "api/account/my-profile", "supportedVersions": [], "parametersOnMethod": [ { "name": "input", - "typeAsString": "Volo.Abp.Account.SendPasswordResetCodeDto, Volo.Abp.Account.Application.Contracts", - "type": "Volo.Abp.Account.SendPasswordResetCodeDto", - "typeSimple": "Volo.Abp.Account.SendPasswordResetCodeDto", + "typeAsString": "Volo.Abp.Account.UpdateProfileDto, Volo.Abp.Account.Application.Contracts", + "type": "Volo.Abp.Account.UpdateProfileDto", + "typeSimple": "Volo.Abp.Account.UpdateProfileDto", "isOptional": false, "defaultValue": null } @@ -866,8 +994,9 @@ { "nameOnMethod": "input", "name": "input", - "type": "Volo.Abp.Account.SendPasswordResetCodeDto", - "typeSimple": "Volo.Abp.Account.SendPasswordResetCodeDto", + "jsonName": null, + "type": "Volo.Abp.Account.UpdateProfileDto", + "typeSimple": "Volo.Abp.Account.UpdateProfileDto", "isOptional": false, "defaultValue": null, "constraintTypes": null, @@ -876,22 +1005,24 @@ } ], "returnValue": { - "type": "System.Void", - "typeSimple": "System.Void" - } + "type": "Volo.Abp.Account.ProfileDto", + "typeSimple": "Volo.Abp.Account.ProfileDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.IProfileAppService" }, - "ResetPasswordAsyncByInput": { - "uniqueName": "ResetPasswordAsyncByInput", - "name": "ResetPasswordAsync", + "ChangePasswordAsyncByInput": { + "uniqueName": "ChangePasswordAsyncByInput", + "name": "ChangePasswordAsync", "httpMethod": "POST", - "url": "api/account/reset-password", + "url": "api/account/my-profile/change-password", "supportedVersions": [], "parametersOnMethod": [ { "name": "input", - "typeAsString": "Volo.Abp.Account.ResetPasswordDto, Volo.Abp.Account.Application.Contracts", - "type": "Volo.Abp.Account.ResetPasswordDto", - "typeSimple": "Volo.Abp.Account.ResetPasswordDto", + "typeAsString": "Volo.Abp.Account.ChangePasswordInput, Volo.Abp.Account.Application.Contracts", + "type": "Volo.Abp.Account.ChangePasswordInput", + "typeSimple": "Volo.Abp.Account.ChangePasswordInput", "isOptional": false, "defaultValue": null } @@ -900,8 +1031,9 @@ { "nameOnMethod": "input", "name": "input", - "type": "Volo.Abp.Account.ResetPasswordDto", - "typeSimple": "Volo.Abp.Account.ResetPasswordDto", + "jsonName": null, + "type": "Volo.Abp.Account.ChangePasswordInput", + "typeSimple": "Volo.Abp.Account.ChangePasswordInput", "isOptional": false, "defaultValue": null, "constraintTypes": null, @@ -912,34 +1044,47 @@ "returnValue": { "type": "System.Void", "typeSimple": "System.Void" - } + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Account.IProfileAppService" } } } } }, - "abp": { - "rootPath": "abp", - "remoteServiceName": "abp", + "featureManagement": { + "rootPath": "featureManagement", + "remoteServiceName": "AbpFeatureManagement", "controllers": { - "Pages.Abp.MultiTenancy.AbpTenantController": { - "controllerName": "AbpTenant", - "type": "Pages.Abp.MultiTenancy.AbpTenantController", + "Volo.Abp.FeatureManagement.FeaturesController": { + "controllerName": "Features", + "controllerGroupName": "Features", + "isRemoteService": true, + "apiVersion": null, + "type": "Volo.Abp.FeatureManagement.FeaturesController", "interfaces": [ { - "type": "Volo.Abp.AspNetCore.Mvc.MultiTenancy.IAbpTenantAppService" + "type": "Volo.Abp.FeatureManagement.IFeatureAppService" } ], "actions": { - "FindTenantByNameAsyncByName": { - "uniqueName": "FindTenantByNameAsyncByName", - "name": "FindTenantByNameAsync", + "GetAsyncByProviderNameAndProviderKey": { + "uniqueName": "GetAsyncByProviderNameAndProviderKey", + "name": "GetAsync", "httpMethod": "GET", - "url": "api/abp/multi-tenancy/tenants/by-name/{name}", + "url": "api/feature-management/features", "supportedVersions": [], "parametersOnMethod": [ { - "name": "name", + "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", @@ -949,64 +1094,131 @@ ], "parameters": [ { - "nameOnMethod": "name", - "name": "name", + "nameOnMethod": "providerName", + "name": "providerName", + "jsonName": null, "type": "System.String", "typeSimple": "string", "isOptional": false, "defaultValue": null, - "constraintTypes": [], - "bindingSourceId": "Path", + "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": "" } ], "returnValue": { - "type": "Volo.Abp.AspNetCore.Mvc.MultiTenancy.FindTenantResultDto", - "typeSimple": "Volo.Abp.AspNetCore.Mvc.MultiTenancy.FindTenantResultDto" - } + "type": "Volo.Abp.FeatureManagement.GetFeatureListResultDto", + "typeSimple": "Volo.Abp.FeatureManagement.GetFeatureListResultDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.FeatureManagement.IFeatureAppService" }, - "FindTenantByIdAsyncById": { - "uniqueName": "FindTenantByIdAsyncById", - "name": "FindTenantByIdAsync", - "httpMethod": "GET", - "url": "api/abp/multi-tenancy/tenants/by-id/{id}", + "UpdateAsyncByProviderNameAndProviderKeyAndInput": { + "uniqueName": "UpdateAsyncByProviderNameAndProviderKeyAndInput", + "name": "UpdateAsync", + "httpMethod": "PUT", + "url": "api/feature-management/features", "supportedVersions": [], "parametersOnMethod": [ { - "name": "id", - "typeAsString": "System.Guid, System.Private.CoreLib", - "type": "System.Guid", + "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": "Volo.Abp.FeatureManagement.UpdateFeaturesDto, Volo.Abp.FeatureManagement.Application.Contracts", + "type": "Volo.Abp.FeatureManagement.UpdateFeaturesDto", + "typeSimple": "Volo.Abp.FeatureManagement.UpdateFeaturesDto", + "isOptional": false, + "defaultValue": null } ], "parameters": [ { - "nameOnMethod": "id", - "name": "id", - "type": "System.Guid", + "nameOnMethod": "providerName", + "name": "providerName", + "jsonName": null, + "type": "System.String", "typeSimple": "string", "isOptional": false, "defaultValue": null, - "constraintTypes": [], - "bindingSourceId": "Path", + "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": "Volo.Abp.FeatureManagement.UpdateFeaturesDto", + "typeSimple": "Volo.Abp.FeatureManagement.UpdateFeaturesDto", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", "descriptorName": "" } ], "returnValue": { - "type": "Volo.Abp.AspNetCore.Mvc.MultiTenancy.FindTenantResultDto", - "typeSimple": "Volo.Abp.AspNetCore.Mvc.MultiTenancy.FindTenantResultDto" - } + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.FeatureManagement.IFeatureAppService" } } - }, - "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationController": { - "controllerName": "AbpApplicationConfiguration", - "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationController", + } + } + }, + "settingManagement": { + "rootPath": "settingManagement", + "remoteServiceName": "SettingManagement", + "controllers": { + "Volo.Abp.SettingManagement.EmailSettingsController": { + "controllerName": "EmailSettings", + "controllerGroupName": "EmailSettings", + "isRemoteService": true, + "apiVersion": null, + "type": "Volo.Abp.SettingManagement.EmailSettingsController", "interfaces": [ { - "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.IAbpApplicationConfigurationAppService" + "type": "Volo.Abp.SettingManagement.IEmailSettingsAppService" } ], "actions": { @@ -1014,55 +1226,90 @@ "uniqueName": "GetAsync", "name": "GetAsync", "httpMethod": "GET", - "url": "api/abp/application-configuration", + "url": "api/setting-management/emailing", "supportedVersions": [], "parametersOnMethod": [], "parameters": [], "returnValue": { - "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationConfigurationDto", - "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationConfigurationDto" - } - } - } - }, - "Volo.Abp.AspNetCore.Mvc.ApiExploring.AbpApiDefinitionController": { - "controllerName": "AbpApiDefinition", - "type": "Volo.Abp.AspNetCore.Mvc.ApiExploring.AbpApiDefinitionController", - "interfaces": [], - "actions": { - "GetByModel": { - "uniqueName": "GetByModel", - "name": "Get", - "httpMethod": "GET", - "url": "api/abp/api-definition", + "type": "Volo.Abp.SettingManagement.EmailSettingsDto", + "typeSimple": "Volo.Abp.SettingManagement.EmailSettingsDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.SettingManagement.IEmailSettingsAppService" + }, + "UpdateAsyncByInput": { + "uniqueName": "UpdateAsyncByInput", + "name": "UpdateAsync", + "httpMethod": "POST", + "url": "api/setting-management/emailing", "supportedVersions": [], "parametersOnMethod": [ { - "name": "model", - "typeAsString": "Volo.Abp.Http.Modeling.ApplicationApiDescriptionModelRequestDto, Volo.Abp.Http", - "type": "Volo.Abp.Http.Modeling.ApplicationApiDescriptionModelRequestDto", - "typeSimple": "Volo.Abp.Http.Modeling.ApplicationApiDescriptionModelRequestDto", + "name": "input", + "typeAsString": "Volo.Abp.SettingManagement.UpdateEmailSettingsDto, Volo.Abp.SettingManagement.Application.Contracts", + "type": "Volo.Abp.SettingManagement.UpdateEmailSettingsDto", + "typeSimple": "Volo.Abp.SettingManagement.UpdateEmailSettingsDto", "isOptional": false, "defaultValue": null } ], "parameters": [ { - "nameOnMethod": "model", - "name": "IncludeTypes", - "type": "System.Boolean", - "typeSimple": "boolean", + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.Abp.SettingManagement.UpdateEmailSettingsDto", + "typeSimple": "Volo.Abp.SettingManagement.UpdateEmailSettingsDto", "isOptional": false, "defaultValue": null, "constraintTypes": null, - "bindingSourceId": "ModelBinding", - "descriptorName": "model" + "bindingSourceId": "Body", + "descriptorName": "" } ], "returnValue": { - "type": "Volo.Abp.Http.Modeling.ApplicationApiDescriptionModel", - "typeSimple": "Volo.Abp.Http.Modeling.ApplicationApiDescriptionModel" - } + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.SettingManagement.IEmailSettingsAppService" + }, + "SendTestEmailAsyncByInput": { + "uniqueName": "SendTestEmailAsyncByInput", + "name": "SendTestEmailAsync", + "httpMethod": "POST", + "url": "api/setting-management/emailing/send-test-email", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "input", + "typeAsString": "Volo.Abp.SettingManagement.SendTestEmailInput, Volo.Abp.SettingManagement.Application.Contracts", + "type": "Volo.Abp.SettingManagement.SendTestEmailInput", + "typeSimple": "Volo.Abp.SettingManagement.SendTestEmailInput", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "input", + "name": "input", + "jsonName": null, + "type": "Volo.Abp.SettingManagement.SendTestEmailInput", + "typeSimple": "Volo.Abp.SettingManagement.SendTestEmailInput", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "Body", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.SettingManagement.IEmailSettingsAppService" } } } @@ -1074,6 +1321,9 @@ "controllers": { "Volo.Abp.Identity.IdentityRoleController": { "controllerName": "IdentityRole", + "controllerGroupName": "Role", + "isRemoteService": true, + "apiVersion": null, "type": "Volo.Abp.Identity.IdentityRoleController", "interfaces": [ { @@ -1092,7 +1342,9 @@ "returnValue": { "type": "Volo.Abp.Application.Dtos.ListResultDto", "typeSimple": "Volo.Abp.Application.Dtos.ListResultDto" - } + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Identity.IIdentityRoleAppService" }, "GetListAsyncByInput": { "uniqueName": "GetListAsyncByInput", @@ -1114,6 +1366,7 @@ { "nameOnMethod": "input", "name": "Filter", + "jsonName": null, "type": "System.String", "typeSimple": "string", "isOptional": false, @@ -1125,6 +1378,7 @@ { "nameOnMethod": "input", "name": "Sorting", + "jsonName": null, "type": "System.String", "typeSimple": "string", "isOptional": false, @@ -1136,6 +1390,7 @@ { "nameOnMethod": "input", "name": "SkipCount", + "jsonName": null, "type": "System.Int32", "typeSimple": "number", "isOptional": false, @@ -1147,6 +1402,7 @@ { "nameOnMethod": "input", "name": "MaxResultCount", + "jsonName": null, "type": "System.Int32", "typeSimple": "number", "isOptional": false, @@ -1159,7 +1415,9 @@ "returnValue": { "type": "Volo.Abp.Application.Dtos.PagedResultDto", "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto" - } + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Application.Services.IReadOnlyAppService" }, "GetAsyncById": { "uniqueName": "GetAsyncById", @@ -1181,6 +1439,7 @@ { "nameOnMethod": "id", "name": "id", + "jsonName": null, "type": "System.Guid", "typeSimple": "string", "isOptional": false, @@ -1193,7 +1452,9 @@ "returnValue": { "type": "Volo.Abp.Identity.IdentityRoleDto", "typeSimple": "Volo.Abp.Identity.IdentityRoleDto" - } + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Application.Services.IReadOnlyAppService" }, "CreateAsyncByInput": { "uniqueName": "CreateAsyncByInput", @@ -1215,6 +1476,7 @@ { "nameOnMethod": "input", "name": "input", + "jsonName": null, "type": "Volo.Abp.Identity.IdentityRoleCreateDto", "typeSimple": "Volo.Abp.Identity.IdentityRoleCreateDto", "isOptional": false, @@ -1227,7 +1489,9 @@ "returnValue": { "type": "Volo.Abp.Identity.IdentityRoleDto", "typeSimple": "Volo.Abp.Identity.IdentityRoleDto" - } + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Application.Services.ICreateAppService" }, "UpdateAsyncByIdAndInput": { "uniqueName": "UpdateAsyncByIdAndInput", @@ -1257,6 +1521,7 @@ { "nameOnMethod": "id", "name": "id", + "jsonName": null, "type": "System.Guid", "typeSimple": "string", "isOptional": false, @@ -1268,6 +1533,7 @@ { "nameOnMethod": "input", "name": "input", + "jsonName": null, "type": "Volo.Abp.Identity.IdentityRoleUpdateDto", "typeSimple": "Volo.Abp.Identity.IdentityRoleUpdateDto", "isOptional": false, @@ -1280,7 +1546,9 @@ "returnValue": { "type": "Volo.Abp.Identity.IdentityRoleDto", "typeSimple": "Volo.Abp.Identity.IdentityRoleDto" - } + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Application.Services.IUpdateAppService" }, "DeleteAsyncById": { "uniqueName": "DeleteAsyncById", @@ -1302,6 +1570,7 @@ { "nameOnMethod": "id", "name": "id", + "jsonName": null, "type": "System.Guid", "typeSimple": "string", "isOptional": false, @@ -1314,12 +1583,17 @@ "returnValue": { "type": "System.Void", "typeSimple": "System.Void" - } + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Application.Services.IDeleteAppService" } } }, "Volo.Abp.Identity.IdentityUserController": { "controllerName": "IdentityUser", + "controllerGroupName": "User", + "isRemoteService": true, + "apiVersion": null, "type": "Volo.Abp.Identity.IdentityUserController", "interfaces": [ { @@ -1347,6 +1621,7 @@ { "nameOnMethod": "id", "name": "id", + "jsonName": null, "type": "System.Guid", "typeSimple": "string", "isOptional": false, @@ -1359,7 +1634,9 @@ "returnValue": { "type": "Volo.Abp.Identity.IdentityUserDto", "typeSimple": "Volo.Abp.Identity.IdentityUserDto" - } + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Application.Services.IReadOnlyAppService" }, "GetListAsyncByInput": { "uniqueName": "GetListAsyncByInput", @@ -1381,6 +1658,7 @@ { "nameOnMethod": "input", "name": "Filter", + "jsonName": null, "type": "System.String", "typeSimple": "string", "isOptional": false, @@ -1392,6 +1670,7 @@ { "nameOnMethod": "input", "name": "Sorting", + "jsonName": null, "type": "System.String", "typeSimple": "string", "isOptional": false, @@ -1403,6 +1682,7 @@ { "nameOnMethod": "input", "name": "SkipCount", + "jsonName": null, "type": "System.Int32", "typeSimple": "number", "isOptional": false, @@ -1414,6 +1694,7 @@ { "nameOnMethod": "input", "name": "MaxResultCount", + "jsonName": null, "type": "System.Int32", "typeSimple": "number", "isOptional": false, @@ -1426,7 +1707,9 @@ "returnValue": { "type": "Volo.Abp.Application.Dtos.PagedResultDto", "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto" - } + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Application.Services.IReadOnlyAppService" }, "CreateAsyncByInput": { "uniqueName": "CreateAsyncByInput", @@ -1448,6 +1731,7 @@ { "nameOnMethod": "input", "name": "input", + "jsonName": null, "type": "Volo.Abp.Identity.IdentityUserCreateDto", "typeSimple": "Volo.Abp.Identity.IdentityUserCreateDto", "isOptional": false, @@ -1460,7 +1744,9 @@ "returnValue": { "type": "Volo.Abp.Identity.IdentityUserDto", "typeSimple": "Volo.Abp.Identity.IdentityUserDto" - } + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Application.Services.ICreateAppService" }, "UpdateAsyncByIdAndInput": { "uniqueName": "UpdateAsyncByIdAndInput", @@ -1490,6 +1776,7 @@ { "nameOnMethod": "id", "name": "id", + "jsonName": null, "type": "System.Guid", "typeSimple": "string", "isOptional": false, @@ -1501,6 +1788,7 @@ { "nameOnMethod": "input", "name": "input", + "jsonName": null, "type": "Volo.Abp.Identity.IdentityUserUpdateDto", "typeSimple": "Volo.Abp.Identity.IdentityUserUpdateDto", "isOptional": false, @@ -1513,7 +1801,9 @@ "returnValue": { "type": "Volo.Abp.Identity.IdentityUserDto", "typeSimple": "Volo.Abp.Identity.IdentityUserDto" - } + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Application.Services.IUpdateAppService" }, "DeleteAsyncById": { "uniqueName": "DeleteAsyncById", @@ -1535,6 +1825,7 @@ { "nameOnMethod": "id", "name": "id", + "jsonName": null, "type": "System.Guid", "typeSimple": "string", "isOptional": false, @@ -1547,7 +1838,9 @@ "returnValue": { "type": "System.Void", "typeSimple": "System.Void" - } + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Application.Services.IDeleteAppService" }, "GetRolesAsyncById": { "uniqueName": "GetRolesAsyncById", @@ -1569,6 +1862,7 @@ { "nameOnMethod": "id", "name": "id", + "jsonName": null, "type": "System.Guid", "typeSimple": "string", "isOptional": false, @@ -1581,7 +1875,9 @@ "returnValue": { "type": "Volo.Abp.Application.Dtos.ListResultDto", "typeSimple": "Volo.Abp.Application.Dtos.ListResultDto" - } + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Identity.IIdentityUserAppService" }, "GetAssignableRolesAsync": { "uniqueName": "GetAssignableRolesAsync", @@ -1594,7 +1890,9 @@ "returnValue": { "type": "Volo.Abp.Application.Dtos.ListResultDto", "typeSimple": "Volo.Abp.Application.Dtos.ListResultDto" - } + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Identity.IIdentityUserAppService" }, "UpdateRolesAsyncByIdAndInput": { "uniqueName": "UpdateRolesAsyncByIdAndInput", @@ -1624,6 +1922,7 @@ { "nameOnMethod": "id", "name": "id", + "jsonName": null, "type": "System.Guid", "typeSimple": "string", "isOptional": false, @@ -1635,6 +1934,7 @@ { "nameOnMethod": "input", "name": "input", + "jsonName": null, "type": "Volo.Abp.Identity.IdentityUserUpdateRolesDto", "typeSimple": "Volo.Abp.Identity.IdentityUserUpdateRolesDto", "isOptional": false, @@ -1647,7 +1947,9 @@ "returnValue": { "type": "System.Void", "typeSimple": "System.Void" - } + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Identity.IIdentityUserAppService" }, "FindByUsernameAsyncByUserName": { "uniqueName": "FindByUsernameAsyncByUserName", @@ -1669,6 +1971,7 @@ { "nameOnMethod": "userName", "name": "userName", + "jsonName": null, "type": "System.String", "typeSimple": "string", "isOptional": false, @@ -1681,7 +1984,9 @@ "returnValue": { "type": "Volo.Abp.Identity.IdentityUserDto", "typeSimple": "Volo.Abp.Identity.IdentityUserDto" - } + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Identity.IIdentityUserAppService" }, "FindByEmailAsyncByEmail": { "uniqueName": "FindByEmailAsyncByEmail", @@ -1703,6 +2008,7 @@ { "nameOnMethod": "email", "name": "email", + "jsonName": null, "type": "System.String", "typeSimple": "string", "isOptional": false, @@ -1715,12 +2021,17 @@ "returnValue": { "type": "Volo.Abp.Identity.IdentityUserDto", "typeSimple": "Volo.Abp.Identity.IdentityUserDto" - } + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Identity.IIdentityUserAppService" } } }, "Volo.Abp.Identity.IdentityUserLookupController": { "controllerName": "IdentityUserLookup", + "controllerGroupName": "UserLookup", + "isRemoteService": true, + "apiVersion": null, "type": "Volo.Abp.Identity.IdentityUserLookupController", "interfaces": [ { @@ -1748,6 +2059,7 @@ { "nameOnMethod": "id", "name": "id", + "jsonName": null, "type": "System.Guid", "typeSimple": "string", "isOptional": false, @@ -1760,7 +2072,9 @@ "returnValue": { "type": "Volo.Abp.Users.UserData", "typeSimple": "Volo.Abp.Users.UserData" - } + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Identity.IIdentityUserLookupAppService" }, "FindByUserNameAsyncByUserName": { "uniqueName": "FindByUserNameAsyncByUserName", @@ -1782,6 +2096,7 @@ { "nameOnMethod": "userName", "name": "userName", + "jsonName": null, "type": "System.String", "typeSimple": "string", "isOptional": false, @@ -1794,7 +2109,9 @@ "returnValue": { "type": "Volo.Abp.Users.UserData", "typeSimple": "Volo.Abp.Users.UserData" - } + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Identity.IIdentityUserLookupAppService" }, "SearchAsyncByInput": { "uniqueName": "SearchAsyncByInput", @@ -1816,6 +2133,7 @@ { "nameOnMethod": "input", "name": "Filter", + "jsonName": null, "type": "System.String", "typeSimple": "string", "isOptional": false, @@ -1827,6 +2145,7 @@ { "nameOnMethod": "input", "name": "Sorting", + "jsonName": null, "type": "System.String", "typeSimple": "string", "isOptional": false, @@ -1838,6 +2157,7 @@ { "nameOnMethod": "input", "name": "SkipCount", + "jsonName": null, "type": "System.Int32", "typeSimple": "number", "isOptional": false, @@ -1848,125 +2168,36 @@ }, { "nameOnMethod": "input", - "name": "MaxResultCount", - "type": "System.Int32", - "typeSimple": "number", - "isOptional": false, - "defaultValue": null, - "constraintTypes": null, - "bindingSourceId": "ModelBinding", - "descriptorName": "input" - } - ], - "returnValue": { - "type": "Volo.Abp.Application.Dtos.ListResultDto", - "typeSimple": "Volo.Abp.Application.Dtos.ListResultDto" - } - }, - "GetCountAsyncByInput": { - "uniqueName": "GetCountAsyncByInput", - "name": "GetCountAsync", - "httpMethod": "GET", - "url": "api/identity/users/lookup/count", - "supportedVersions": [], - "parametersOnMethod": [ - { - "name": "input", - "typeAsString": "Volo.Abp.Identity.UserLookupCountInputDto, Volo.Abp.Identity.Application.Contracts", - "type": "Volo.Abp.Identity.UserLookupCountInputDto", - "typeSimple": "Volo.Abp.Identity.UserLookupCountInputDto", - "isOptional": false, - "defaultValue": null - } - ], - "parameters": [ - { - "nameOnMethod": "input", - "name": "Filter", - "type": "System.String", - "typeSimple": "string", - "isOptional": false, - "defaultValue": null, - "constraintTypes": null, - "bindingSourceId": "ModelBinding", - "descriptorName": "input" - } - ], - "returnValue": { - "type": "System.Int64", - "typeSimple": "number" - } - } - } - }, - "Volo.Abp.Identity.ProfileController": { - "controllerName": "Profile", - "type": "Volo.Abp.Identity.ProfileController", - "interfaces": [ - { - "type": "Volo.Abp.Identity.IProfileAppService" - } - ], - "actions": { - "GetAsync": { - "uniqueName": "GetAsync", - "name": "GetAsync", - "httpMethod": "GET", - "url": "api/identity/my-profile", - "supportedVersions": [], - "parametersOnMethod": [], - "parameters": [], - "returnValue": { - "type": "Volo.Abp.Identity.ProfileDto", - "typeSimple": "Volo.Abp.Identity.ProfileDto" - } - }, - "UpdateAsyncByInput": { - "uniqueName": "UpdateAsyncByInput", - "name": "UpdateAsync", - "httpMethod": "PUT", - "url": "api/identity/my-profile", - "supportedVersions": [], - "parametersOnMethod": [ - { - "name": "input", - "typeAsString": "Volo.Abp.Identity.UpdateProfileDto, Volo.Abp.Identity.Application.Contracts", - "type": "Volo.Abp.Identity.UpdateProfileDto", - "typeSimple": "Volo.Abp.Identity.UpdateProfileDto", - "isOptional": false, - "defaultValue": null - } - ], - "parameters": [ - { - "nameOnMethod": "input", - "name": "input", - "type": "Volo.Abp.Identity.UpdateProfileDto", - "typeSimple": "Volo.Abp.Identity.UpdateProfileDto", + "name": "MaxResultCount", + "jsonName": null, + "type": "System.Int32", + "typeSimple": "number", "isOptional": false, "defaultValue": null, "constraintTypes": null, - "bindingSourceId": "Body", - "descriptorName": "" + "bindingSourceId": "ModelBinding", + "descriptorName": "input" } ], "returnValue": { - "type": "Volo.Abp.Identity.ProfileDto", - "typeSimple": "Volo.Abp.Identity.ProfileDto" - } + "type": "Volo.Abp.Application.Dtos.ListResultDto", + "typeSimple": "Volo.Abp.Application.Dtos.ListResultDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Identity.IIdentityUserLookupAppService" }, - "ChangePasswordAsyncByInput": { - "uniqueName": "ChangePasswordAsyncByInput", - "name": "ChangePasswordAsync", - "httpMethod": "POST", - "url": "api/identity/my-profile/change-password", + "GetCountAsyncByInput": { + "uniqueName": "GetCountAsyncByInput", + "name": "GetCountAsync", + "httpMethod": "GET", + "url": "api/identity/users/lookup/count", "supportedVersions": [], "parametersOnMethod": [ { "name": "input", - "typeAsString": "Volo.Abp.Identity.ChangePasswordInput, Volo.Abp.Identity.Application.Contracts", - "type": "Volo.Abp.Identity.ChangePasswordInput", - "typeSimple": "Volo.Abp.Identity.ChangePasswordInput", + "typeAsString": "Volo.Abp.Identity.UserLookupCountInputDto, Volo.Abp.Identity.Application.Contracts", + "type": "Volo.Abp.Identity.UserLookupCountInputDto", + "typeSimple": "Volo.Abp.Identity.UserLookupCountInputDto", "isOptional": false, "defaultValue": null } @@ -1974,20 +2205,23 @@ "parameters": [ { "nameOnMethod": "input", - "name": "input", - "type": "Volo.Abp.Identity.ChangePasswordInput", - "typeSimple": "Volo.Abp.Identity.ChangePasswordInput", + "name": "Filter", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", "isOptional": false, "defaultValue": null, "constraintTypes": null, - "bindingSourceId": "Body", - "descriptorName": "" + "bindingSourceId": "ModelBinding", + "descriptorName": "input" } ], "returnValue": { - "type": "System.Void", - "typeSimple": "System.Void" - } + "type": "System.Int64", + "typeSimple": "number" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.Identity.IIdentityUserLookupAppService" } } } @@ -1995,74 +2229,6 @@ } }, "types": { - "Volo.Abp.Account.Web.Areas.Account.Controllers.Models.UserLoginInfo": { - "baseType": null, - "isEnum": false, - "enumNames": null, - "enumValues": null, - "genericArguments": null, - "properties": [ - { - "name": "UserNameOrEmailAddress", - "type": "System.String", - "typeSimple": "string", - "isRequired": true - }, - { - "name": "Password", - "type": "System.String", - "typeSimple": "string", - "isRequired": true - }, - { - "name": "RememberMe", - "type": "System.Boolean", - "typeSimple": "boolean", - "isRequired": false - } - ] - }, - "Volo.Abp.Account.Web.Areas.Account.Controllers.Models.AbpLoginResult": { - "baseType": null, - "isEnum": false, - "enumNames": null, - "enumValues": null, - "genericArguments": null, - "properties": [ - { - "name": "Result", - "type": "Volo.Abp.Account.Web.Areas.Account.Controllers.Models.LoginResultType", - "typeSimple": "Volo.Abp.Account.Web.Areas.Account.Controllers.Models.LoginResultType", - "isRequired": false - }, - { - "name": "Description", - "type": "System.String", - "typeSimple": "string", - "isRequired": false - } - ] - }, - "Volo.Abp.Account.Web.Areas.Account.Controllers.Models.LoginResultType": { - "baseType": "System.Enum", - "isEnum": true, - "enumNames": [ - "Success", - "InvalidUserNameOrPassword", - "NotAllowed", - "LockedOut", - "RequiresTwoFactor" - ], - "enumValues": [ - 1, - 2, - 3, - 4, - 5 - ], - "genericArguments": null, - "properties": null - }, "Volo.Abp.Account.RegisterDto": { "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", "isEnum": false, @@ -2072,27 +2238,51 @@ "properties": [ { "name": "UserName", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": true + "isRequired": true, + "minLength": 0, + "maxLength": 256, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "EmailAddress", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": true + "isRequired": true, + "minLength": 0, + "maxLength": 256, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "Password", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": true + "isRequired": true, + "minLength": 0, + "maxLength": 128, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "AppName", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": true + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -2105,9 +2295,15 @@ "properties": [ { "name": "ExtraProperties", + "jsonName": null, "type": "{System.String:System.Object}", "typeSimple": "{string:object}", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -2120,69 +2316,147 @@ "properties": [ { "name": "TenantId", + "jsonName": null, "type": "System.Guid?", "typeSimple": "string?", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "UserName", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "Name", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "Surname", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "Email", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "EmailConfirmed", + "jsonName": null, "type": "System.Boolean", "typeSimple": "boolean", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "PhoneNumber", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "PhoneNumberConfirmed", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsActive", + "jsonName": null, "type": "System.Boolean", "typeSimple": "boolean", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "LockoutEnabled", + "jsonName": null, "type": "System.Boolean", "typeSimple": "boolean", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "LockoutEnd", + "jsonName": null, "type": "System.DateTimeOffset?", "typeSimple": "string?", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "ConcurrencyStamp", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -2197,21 +2471,39 @@ "properties": [ { "name": "IsDeleted", + "jsonName": null, "type": "System.Boolean", "typeSimple": "boolean", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "DeleterId", + "jsonName": null, "type": "System.Guid?", "typeSimple": "string?", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "DeletionTime", + "jsonName": null, "type": "System.DateTime?", "typeSimple": "string?", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -2226,15 +2518,27 @@ "properties": [ { "name": "LastModificationTime", + "jsonName": null, "type": "System.DateTime?", "typeSimple": "string?", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "LastModifierId", + "jsonName": null, "type": "System.Guid?", "typeSimple": "string?", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -2249,15 +2553,27 @@ "properties": [ { "name": "CreationTime", + "jsonName": null, "type": "System.DateTime", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "CreatorId", + "jsonName": null, "type": "System.Guid?", "typeSimple": "string?", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -2271,47 +2587,406 @@ ], "properties": [ { - "name": "Id", - "type": "TKey", - "typeSimple": "TKey", - "isRequired": false + "name": "Id", + "jsonName": null, + "type": "TKey", + "typeSimple": "TKey", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Account.SendPasswordResetCodeDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Email", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": 0, + "maxLength": 256, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "AppName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ReturnUrl", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ReturnUrlHash", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Account.ResetPasswordDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "UserId", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ResetToken", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Password", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Account.Web.Areas.Account.Controllers.Models.UserLoginInfo": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "UserNameOrEmailAddress", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": 0, + "maxLength": 255, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Password", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": 0, + "maxLength": 32, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "RememberMe", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Account.Web.Areas.Account.Controllers.Models.AbpLoginResult": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "Result", + "jsonName": null, + "type": "Volo.Abp.Account.Web.Areas.Account.Controllers.Models.LoginResultType", + "typeSimple": "Volo.Abp.Account.Web.Areas.Account.Controllers.Models.LoginResultType", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Description", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.Account.Web.Areas.Account.Controllers.Models.LoginResultType": { + "baseType": "System.Enum", + "isEnum": true, + "enumNames": [ + "Success", + "InvalidUserNameOrPassword", + "NotAllowed", + "LockedOut", + "RequiresTwoFactor" + ], + "enumValues": [ + 1, + 2, + 3, + 4, + 5 + ], + "genericArguments": null, + "properties": null + }, + "Volo.Abp.Account.ProfileDto": { + "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "UserName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Email", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Surname", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "PhoneNumber", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsExternal", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "HasPassword", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ConcurrencyStamp", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, - "Volo.Abp.Account.SendPasswordResetCodeDto": { - "baseType": null, + "Volo.Abp.Account.UpdateProfileDto": { + "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", "isEnum": false, "enumNames": null, "enumValues": null, "genericArguments": null, "properties": [ + { + "name": "UserName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": 0, + "maxLength": 256, + "minimum": null, + "maximum": null, + "regex": null + }, { "name": "Email", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": true + "isRequired": false, + "minLength": 0, + "maxLength": 256, + "minimum": null, + "maximum": null, + "regex": null }, { - "name": "AppName", + "name": "Name", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": true + "isRequired": false, + "minLength": 0, + "maxLength": 64, + "minimum": null, + "maximum": null, + "regex": null }, { - "name": "ReturnUrl", + "name": "Surname", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": 0, + "maxLength": 64, + "minimum": null, + "maximum": null, + "regex": null }, { - "name": "ReturnUrlHash", + "name": "PhoneNumber", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": 0, + "maxLength": 16, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ConcurrencyStamp", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, - "Volo.Abp.Account.ResetPasswordDto": { + "Volo.Abp.Account.ChangePasswordInput": { "baseType": null, "isEnum": false, "enumNames": null, @@ -2319,22 +2994,28 @@ "genericArguments": null, "properties": [ { - "name": "UserId", - "type": "System.Guid", - "typeSimple": "string", - "isRequired": false - }, - { - "name": "ResetToken", + "name": "CurrentPassword", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": true + "isRequired": false, + "minLength": 0, + "maxLength": 128, + "minimum": null, + "maximum": null, + "regex": null }, { - "name": "Password", + "name": "NewPassword", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": true + "isRequired": true, + "minLength": 0, + "maxLength": 128, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -2347,21 +3028,51 @@ "properties": [ { "name": "Success", + "jsonName": null, "type": "System.Boolean", "typeSimple": "boolean", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "TenantId", + "jsonName": null, "type": "System.Guid?", "typeSimple": "string?", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "Name", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsActive", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -2376,9 +3087,15 @@ "properties": [ { "name": "Items", + "jsonName": null, "type": "[T]", "typeSimple": "[T]", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -2391,33 +3108,63 @@ "properties": [ { "name": "Name", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "IsDefault", + "jsonName": null, "type": "System.Boolean", "typeSimple": "boolean", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "IsStatic", + "jsonName": null, "type": "System.Boolean", "typeSimple": "boolean", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "IsPublic", + "jsonName": null, "type": "System.Boolean", "typeSimple": "boolean", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "ConcurrencyStamp", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -2430,9 +3177,15 @@ "properties": [ { "name": "Filter", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -2445,9 +3198,15 @@ "properties": [ { "name": "Sorting", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -2460,9 +3219,15 @@ "properties": [ { "name": "SkipCount", + "jsonName": null, "type": "System.Int32", "typeSimple": "number", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": "0", + "maximum": "2147483647", + "regex": null } ] }, @@ -2475,21 +3240,39 @@ "properties": [ { "name": "DefaultMaxResultCount", + "jsonName": null, "type": "System.Int32", "typeSimple": "number", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "MaxMaxResultCount", + "jsonName": null, "type": "System.Int32", "typeSimple": "number", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "MaxResultCount", + "jsonName": null, "type": "System.Int32", "typeSimple": "number", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": "1", + "maximum": "2147483647", + "regex": null } ] }, @@ -2504,9 +3287,15 @@ "properties": [ { "name": "TotalCount", + "jsonName": null, "type": "System.Int64", "typeSimple": "number", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -2527,21 +3316,39 @@ "properties": [ { "name": "Name", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": true + "isRequired": true, + "minLength": 0, + "maxLength": 256, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "IsDefault", + "jsonName": null, "type": "System.Boolean", "typeSimple": "boolean", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "IsPublic", + "jsonName": null, "type": "System.Boolean", "typeSimple": "boolean", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -2554,9 +3361,15 @@ "properties": [ { "name": "ConcurrencyStamp", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -2569,9 +3382,15 @@ "properties": [ { "name": "Filter", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -2584,9 +3403,15 @@ "properties": [ { "name": "Password", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": true + "isRequired": true, + "minLength": 0, + "maxLength": 128, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -2599,45 +3424,99 @@ "properties": [ { "name": "UserName", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": true + "isRequired": true, + "minLength": 0, + "maxLength": 256, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "Name", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": 0, + "maxLength": 64, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "Surname", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": 0, + "maxLength": 64, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "Email", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": true + "isRequired": true, + "minLength": 0, + "maxLength": 256, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "PhoneNumber", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": 0, + "maxLength": 16, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsActive", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "LockoutEnabled", + "jsonName": null, "type": "System.Boolean", "typeSimple": "boolean", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "RoleNames", + "jsonName": null, "type": "[System.String]", "typeSimple": "[string]", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -2650,15 +3529,27 @@ "properties": [ { "name": "Password", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": 0, + "maxLength": 128, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "ConcurrencyStamp", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -2671,9 +3562,15 @@ "properties": [ { "name": "RoleNames", + "jsonName": null, "type": "[System.String]", "typeSimple": "[string]", - "isRequired": true + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -2686,57 +3583,123 @@ "properties": [ { "name": "Id", + "jsonName": null, "type": "System.Guid", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "TenantId", + "jsonName": null, "type": "System.Guid?", "typeSimple": "string?", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "UserName", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "Name", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "Surname", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsActive", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "Email", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "EmailConfirmed", + "jsonName": null, "type": "System.Boolean", "typeSimple": "boolean", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "PhoneNumber", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "PhoneNumberConfirmed", + "jsonName": null, "type": "System.Boolean", "typeSimple": "boolean", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -2749,9 +3712,15 @@ "properties": [ { "name": "Filter", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -2764,120 +3733,15 @@ "properties": [ { "name": "Filter", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false - } - ] - }, - "Volo.Abp.Identity.ProfileDto": { - "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", - "isEnum": false, - "enumNames": null, - "enumValues": null, - "genericArguments": null, - "properties": [ - { - "name": "UserName", - "type": "System.String", - "typeSimple": "string", - "isRequired": false - }, - { - "name": "Email", - "type": "System.String", - "typeSimple": "string", - "isRequired": false - }, - { - "name": "Name", - "type": "System.String", - "typeSimple": "string", - "isRequired": false - }, - { - "name": "Surname", - "type": "System.String", - "typeSimple": "string", - "isRequired": false - }, - { - "name": "PhoneNumber", - "type": "System.String", - "typeSimple": "string", - "isRequired": false - }, - { - "name": "IsExternal", - "type": "System.Boolean", - "typeSimple": "boolean", - "isRequired": false - }, - { - "name": "HasPassword", - "type": "System.Boolean", - "typeSimple": "boolean", - "isRequired": false - } - ] - }, - "Volo.Abp.Identity.UpdateProfileDto": { - "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject", - "isEnum": false, - "enumNames": null, - "enumValues": null, - "genericArguments": null, - "properties": [ - { - "name": "UserName", - "type": "System.String", - "typeSimple": "string", - "isRequired": false - }, - { - "name": "Email", - "type": "System.String", - "typeSimple": "string", - "isRequired": false - }, - { - "name": "Name", - "type": "System.String", - "typeSimple": "string", - "isRequired": false - }, - { - "name": "Surname", - "type": "System.String", - "typeSimple": "string", - "isRequired": false - }, - { - "name": "PhoneNumber", - "type": "System.String", - "typeSimple": "string", - "isRequired": false - } - ] - }, - "Volo.Abp.Identity.ChangePasswordInput": { - "baseType": null, - "isEnum": false, - "enumNames": null, - "enumValues": null, - "genericArguments": null, - "properties": [ - { - "name": "CurrentPassword", - "type": "System.String", - "typeSimple": "string", - "isRequired": false - }, - { - "name": "NewPassword", - "type": "System.String", - "typeSimple": "string", - "isRequired": true + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -2890,15 +3754,27 @@ "properties": [ { "name": "EntityDisplayName", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "Groups", + "jsonName": null, "type": "[Volo.Abp.PermissionManagement.PermissionGroupDto]", "typeSimple": "[Volo.Abp.PermissionManagement.PermissionGroupDto]", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -2911,21 +3787,39 @@ "properties": [ { "name": "Name", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "DisplayName", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "Permissions", + "jsonName": null, "type": "[Volo.Abp.PermissionManagement.PermissionGrantInfoDto]", "typeSimple": "[Volo.Abp.PermissionManagement.PermissionGrantInfoDto]", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -2938,39 +3832,75 @@ "properties": [ { "name": "Name", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "DisplayName", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "ParentName", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "IsGranted", + "jsonName": null, "type": "System.Boolean", "typeSimple": "boolean", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "AllowedProviders", + "jsonName": null, "type": "[System.String]", "typeSimple": "[string]", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "GrantedProviders", + "jsonName": null, "type": "[Volo.Abp.PermissionManagement.ProviderInfoDto]", "typeSimple": "[Volo.Abp.PermissionManagement.ProviderInfoDto]", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -2983,15 +3913,27 @@ "properties": [ { "name": "ProviderName", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "ProviderKey", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -3004,9 +3946,15 @@ "properties": [ { "name": "Permissions", + "jsonName": null, "type": "[Volo.Abp.PermissionManagement.UpdatePermissionDto]", "typeSimple": "[Volo.Abp.PermissionManagement.UpdatePermissionDto]", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -3019,15 +3967,27 @@ "properties": [ { "name": "Name", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "IsGranted", + "jsonName": null, "type": "System.Boolean", "typeSimple": "boolean", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -3040,57 +4000,111 @@ "properties": [ { "name": "SmtpHost", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "SmtpPort", + "jsonName": null, "type": "System.Int32", "typeSimple": "number", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "SmtpUserName", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "SmtpPassword", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "SmtpDomain", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "SmtpEnableSsl", + "jsonName": null, "type": "System.Boolean", "typeSimple": "boolean", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "SmtpUseDefaultCredentials", + "jsonName": null, "type": "System.Boolean", "typeSimple": "boolean", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "DefaultFromAddress", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "DefaultFromDisplayName", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -3103,57 +4117,168 @@ "properties": [ { "name": "SmtpHost", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": 256, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "SmtpPort", + "jsonName": null, "type": "System.Int32", "typeSimple": "number", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": "1", + "maximum": "65535", + "regex": null }, { "name": "SmtpUserName", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": 1024, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "SmtpPassword", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": 1024, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "SmtpDomain", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": 1024, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "SmtpEnableSsl", + "jsonName": null, "type": "System.Boolean", "typeSimple": "boolean", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "SmtpUseDefaultCredentials", + "jsonName": null, "type": "System.Boolean", "typeSimple": "boolean", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "DefaultFromAddress", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": true + "isRequired": true, + "minLength": null, + "maxLength": 1024, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "DefaultFromDisplayName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": 1024, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.SettingManagement.SendTestEmailInput": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "SenderEmailAddress", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "TargetEmailAddress", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Subject", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": true, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Body", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": true + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -3166,9 +4291,27 @@ "properties": [ { "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ConcurrencyStamp", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -3181,9 +4324,15 @@ "properties": [ { "name": "Filter", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -3196,15 +4345,27 @@ "properties": [ { "name": "AdminEmailAddress", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": true + "isRequired": true, + "minLength": null, + "maxLength": 256, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "AdminPassword", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": true + "isRequired": true, + "minLength": null, + "maxLength": 128, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -3217,9 +4378,15 @@ "properties": [ { "name": "Name", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": true + "isRequired": true, + "minLength": 0, + "maxLength": 64, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -3229,7 +4396,20 @@ "enumNames": null, "enumValues": null, "genericArguments": null, - "properties": [] + "properties": [ + { + "name": "ConcurrencyStamp", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] }, "Volo.Abp.FeatureManagement.GetFeatureListResultDto": { "baseType": null, @@ -3240,9 +4420,15 @@ "properties": [ { "name": "Groups", + "jsonName": null, "type": "[Volo.Abp.FeatureManagement.FeatureGroupDto]", "typeSimple": "[Volo.Abp.FeatureManagement.FeatureGroupDto]", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -3255,21 +4441,39 @@ "properties": [ { "name": "Name", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "DisplayName", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "Features", + "jsonName": null, "type": "[Volo.Abp.FeatureManagement.FeatureDto]", "typeSimple": "[Volo.Abp.FeatureManagement.FeatureDto]", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -3282,51 +4486,99 @@ "properties": [ { "name": "Name", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "DisplayName", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "Value", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "Provider", + "jsonName": null, "type": "Volo.Abp.FeatureManagement.FeatureProviderDto", "typeSimple": "Volo.Abp.FeatureManagement.FeatureProviderDto", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "Description", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "ValueType", + "jsonName": null, "type": "Volo.Abp.Validation.StringValues.IStringValueType", "typeSimple": "Volo.Abp.Validation.StringValues.IStringValueType", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "Depth", + "jsonName": null, "type": "System.Int32", "typeSimple": "number", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "ParentName", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -3339,15 +4591,27 @@ "properties": [ { "name": "Name", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "Key", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -3360,27 +4624,51 @@ "properties": [ { "name": "Name", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "Item", + "jsonName": null, "type": "System.Object", "typeSimple": "object", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "Properties", + "jsonName": null, "type": "{System.String:System.Object}", "typeSimple": "{string:object}", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "Validator", + "jsonName": null, "type": "Volo.Abp.Validation.StringValues.IValueValidator", "typeSimple": "Volo.Abp.Validation.StringValues.IValueValidator", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -3393,21 +4681,39 @@ "properties": [ { "name": "Name", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "Item", + "jsonName": null, "type": "System.Object", "typeSimple": "object", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "Properties", + "jsonName": null, "type": "{System.String:System.Object}", "typeSimple": "{string:object}", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -3420,9 +4726,15 @@ "properties": [ { "name": "Features", + "jsonName": null, "type": "[Volo.Abp.FeatureManagement.UpdateFeatureDto]", "typeSimple": "[Volo.Abp.FeatureManagement.UpdateFeatureDto]", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -3435,15 +4747,27 @@ "properties": [ { "name": "Name", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "Value", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -3456,63 +4780,147 @@ "properties": [ { "name": "Localization", + "jsonName": null, "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationLocalizationConfigurationDto", "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationLocalizationConfigurationDto", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "Auth", + "jsonName": null, "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationAuthConfigurationDto", "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationAuthConfigurationDto", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "Setting", + "jsonName": null, "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationSettingConfigurationDto", "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationSettingConfigurationDto", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "CurrentUser", + "jsonName": null, "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.CurrentUserDto", "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.CurrentUserDto", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "Features", + "jsonName": null, "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationFeatureConfigurationDto", "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationFeatureConfigurationDto", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "GlobalFeatures", + "jsonName": null, + "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationGlobalFeatureConfigurationDto", + "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationGlobalFeatureConfigurationDto", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "MultiTenancy", + "jsonName": null, "type": "Volo.Abp.AspNetCore.Mvc.MultiTenancy.MultiTenancyInfoDto", "typeSimple": "Volo.Abp.AspNetCore.Mvc.MultiTenancy.MultiTenancyInfoDto", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "CurrentTenant", + "jsonName": null, "type": "Volo.Abp.AspNetCore.Mvc.MultiTenancy.CurrentTenantDto", "typeSimple": "Volo.Abp.AspNetCore.Mvc.MultiTenancy.CurrentTenantDto", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "Timing", + "jsonName": null, "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.TimingDto", "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.TimingDto", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "Clock", + "jsonName": null, "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ClockDto", "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ClockDto", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "ObjectExtensions", + "jsonName": null, "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ObjectExtensionsDto", "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ObjectExtensionsDto", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ExtraProperties", + "jsonName": null, + "type": "{System.String:System.Object}", + "typeSimple": "{string:object}", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -3525,39 +4933,75 @@ "properties": [ { "name": "Values", + "jsonName": null, "type": "{System.String:System.Collections.Generic.Dictionary}", "typeSimple": "{string:System.Collections.Generic.Dictionary}", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "Languages", + "jsonName": null, "type": "[Volo.Abp.Localization.LanguageInfo]", "typeSimple": "[Volo.Abp.Localization.LanguageInfo]", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "CurrentCulture", + "jsonName": null, "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.CurrentCultureDto", "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.CurrentCultureDto", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "DefaultResourceName", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "LanguagesMap", + "jsonName": null, "type": "{System.String:[Volo.Abp.NameValue]}", "typeSimple": "{string:[Volo.Abp.NameValue]}", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "LanguageFilesMap", + "jsonName": null, "type": "{System.String:[Volo.Abp.NameValue]}", "typeSimple": "{string:[Volo.Abp.NameValue]}", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -3570,27 +5014,51 @@ "properties": [ { "name": "CultureName", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "UiCultureName", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "DisplayName", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "FlagIcon", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -3603,57 +5071,111 @@ "properties": [ { "name": "DisplayName", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "EnglishName", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "ThreeLetterIsoLanguageName", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "TwoLetterIsoLanguageName", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "IsRightToLeft", + "jsonName": null, "type": "System.Boolean", "typeSimple": "boolean", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "CultureName", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "Name", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "NativeName", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "DateTimeFormat", + "jsonName": null, "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.DateTimeFormatDto", "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.DateTimeFormatDto", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -3666,45 +5188,87 @@ "properties": [ { "name": "CalendarAlgorithmType", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "DateTimeFormatLong", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "ShortDatePattern", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "FullDateTimePattern", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "DateSeparator", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "ShortTimePattern", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "LongTimePattern", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -3727,15 +5291,27 @@ "properties": [ { "name": "Name", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "Value", + "jsonName": null, "type": "T", "typeSimple": "T", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -3748,15 +5324,27 @@ "properties": [ { "name": "Policies", + "jsonName": null, "type": "{System.String:System.Boolean}", "typeSimple": "{string:boolean}", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "GrantedPolicies", + "jsonName": null, "type": "{System.String:System.Boolean}", "typeSimple": "{string:boolean}", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -3769,9 +5357,15 @@ "properties": [ { "name": "Values", + "jsonName": null, "type": "{System.String:System.String}", "typeSimple": "{string:string}", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -3784,69 +5378,183 @@ "properties": [ { "name": "IsAuthenticated", + "jsonName": null, "type": "System.Boolean", "typeSimple": "boolean", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "Id", + "jsonName": null, "type": "System.Guid?", "typeSimple": "string?", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "TenantId", + "jsonName": null, "type": "System.Guid?", "typeSimple": "string?", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ImpersonatorUserId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ImpersonatorTenantId", + "jsonName": null, + "type": "System.Guid?", + "typeSimple": "string?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ImpersonatorUserName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ImpersonatorTenantName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "UserName", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "Name", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "SurName", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "Email", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "EmailVerified", + "jsonName": null, "type": "System.Boolean", "typeSimple": "boolean", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "PhoneNumber", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "PhoneNumberVerified", + "jsonName": null, "type": "System.Boolean", "typeSimple": "boolean", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "Roles", + "jsonName": null, "type": "[System.String]", "typeSimple": "[string]", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -3859,9 +5567,36 @@ "properties": [ { "name": "Values", + "jsonName": null, "type": "{System.String:System.String}", "typeSimple": "{string:string}", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + } + ] + }, + "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationGlobalFeatureConfigurationDto": { + "baseType": null, + "isEnum": false, + "enumNames": null, + "enumValues": null, + "genericArguments": null, + "properties": [ + { + "name": "EnabledFeatures", + "jsonName": null, + "type": "[System.String]", + "typeSimple": "[string]", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -3874,9 +5609,15 @@ "properties": [ { "name": "IsEnabled", + "jsonName": null, "type": "System.Boolean", "typeSimple": "boolean", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -3889,21 +5630,39 @@ "properties": [ { "name": "Id", + "jsonName": null, "type": "System.Guid?", "typeSimple": "string?", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "Name", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "IsAvailable", + "jsonName": null, "type": "System.Boolean", "typeSimple": "boolean", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -3916,9 +5675,15 @@ "properties": [ { "name": "TimeZone", + "jsonName": null, "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.TimeZone", "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.TimeZone", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -3931,15 +5696,27 @@ "properties": [ { "name": "Iana", + "jsonName": null, "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.IanaTimeZone", "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.IanaTimeZone", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "Windows", + "jsonName": null, "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.WindowsTimeZone", "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.WindowsTimeZone", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -3952,9 +5729,15 @@ "properties": [ { "name": "TimeZoneName", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -3967,9 +5750,15 @@ "properties": [ { "name": "TimeZoneId", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -3982,9 +5771,15 @@ "properties": [ { "name": "Kind", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -3997,15 +5792,27 @@ "properties": [ { "name": "Modules", + "jsonName": null, "type": "{System.String:Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ModuleExtensionDto}", "typeSimple": "{string:Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ModuleExtensionDto}", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "Enums", + "jsonName": null, "type": "{System.String:Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionEnumDto}", "typeSimple": "{string:Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionEnumDto}", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -4018,15 +5825,27 @@ "properties": [ { "name": "Entities", + "jsonName": null, "type": "{System.String:Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.EntityExtensionDto}", "typeSimple": "{string:Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.EntityExtensionDto}", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "Configuration", + "jsonName": null, "type": "{System.String:System.Object}", "typeSimple": "{string:object}", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -4039,15 +5858,27 @@ "properties": [ { "name": "Properties", + "jsonName": null, "type": "{System.String:Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyDto}", "typeSimple": "{string:Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyDto}", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "Configuration", + "jsonName": null, "type": "{System.String:System.Object}", "typeSimple": "{string:object}", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -4060,51 +5891,99 @@ "properties": [ { "name": "Type", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "TypeSimple", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "DisplayName", + "jsonName": null, "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.LocalizableStringDto", "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.LocalizableStringDto", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "Api", + "jsonName": null, "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyApiDto", "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyApiDto", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "Ui", + "jsonName": null, "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyUiDto", "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyUiDto", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "Attributes", + "jsonName": null, "type": "[Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyAttributeDto]", "typeSimple": "[Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyAttributeDto]", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "Configuration", + "jsonName": null, "type": "{System.String:System.Object}", "typeSimple": "{string:object}", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "DefaultValue", + "jsonName": null, "type": "System.Object", "typeSimple": "object", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -4117,15 +5996,27 @@ "properties": [ { "name": "Name", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "Resource", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -4138,21 +6029,39 @@ "properties": [ { "name": "OnGet", + "jsonName": null, "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyApiGetDto", "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyApiGetDto", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "OnCreate", + "jsonName": null, "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyApiCreateDto", "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyApiCreateDto", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "OnUpdate", + "jsonName": null, "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyApiUpdateDto", "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyApiUpdateDto", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -4165,9 +6074,15 @@ "properties": [ { "name": "IsAvailable", + "jsonName": null, "type": "System.Boolean", "typeSimple": "boolean", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -4180,9 +6095,15 @@ "properties": [ { "name": "IsAvailable", + "jsonName": null, "type": "System.Boolean", "typeSimple": "boolean", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -4195,9 +6116,15 @@ "properties": [ { "name": "IsAvailable", + "jsonName": null, "type": "System.Boolean", "typeSimple": "boolean", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -4210,27 +6137,51 @@ "properties": [ { "name": "OnTable", + "jsonName": null, "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyUiTableDto", "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyUiTableDto", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "OnCreateForm", + "jsonName": null, "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyUiFormDto", "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyUiFormDto", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "OnEditForm", + "jsonName": null, "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyUiFormDto", "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyUiFormDto", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "Lookup", + "jsonName": null, "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyUiLookupDto", "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyUiLookupDto", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -4243,9 +6194,15 @@ "properties": [ { "name": "IsVisible", + "jsonName": null, "type": "System.Boolean", "typeSimple": "boolean", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -4258,9 +6215,15 @@ "properties": [ { "name": "IsVisible", + "jsonName": null, "type": "System.Boolean", "typeSimple": "boolean", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -4273,33 +6236,63 @@ "properties": [ { "name": "Url", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "ResultListPropertyName", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "DisplayPropertyName", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "ValuePropertyName", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "FilterParamName", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -4312,15 +6305,27 @@ "properties": [ { "name": "TypeSimple", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "Config", + "jsonName": null, "type": "{System.String:System.Object}", "typeSimple": "{string:object}", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -4333,15 +6338,27 @@ "properties": [ { "name": "Fields", + "jsonName": null, "type": "[Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionEnumFieldDto]", "typeSimple": "[Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionEnumFieldDto]", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "LocalizationResource", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -4354,15 +6371,27 @@ "properties": [ { "name": "Name", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "Value", + "jsonName": null, "type": "System.Object", "typeSimple": "object", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -4375,9 +6404,15 @@ "properties": [ { "name": "IncludeTypes", + "jsonName": null, "type": "System.Boolean", "typeSimple": "boolean", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -4390,15 +6425,27 @@ "properties": [ { "name": "Modules", + "jsonName": null, "type": "{System.String:Volo.Abp.Http.Modeling.ModuleApiDescriptionModel}", "typeSimple": "{string:Volo.Abp.Http.Modeling.ModuleApiDescriptionModel}", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "Types", + "jsonName": null, "type": "{System.String:Volo.Abp.Http.Modeling.TypeApiDescriptionModel}", "typeSimple": "{string:Volo.Abp.Http.Modeling.TypeApiDescriptionModel}", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -4411,21 +6458,39 @@ "properties": [ { "name": "RootPath", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "RemoteServiceName", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "Controllers", + "jsonName": null, "type": "{System.String:Volo.Abp.Http.Modeling.ControllerApiDescriptionModel}", "typeSimple": "{string:Volo.Abp.Http.Modeling.ControllerApiDescriptionModel}", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -4438,27 +6503,87 @@ "properties": [ { "name": "ControllerName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ControllerGroupName", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "IsRemoteService", + "jsonName": null, + "type": "System.Boolean", + "typeSimple": "boolean", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ApiVersion", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "Type", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "Interfaces", + "jsonName": null, "type": "[Volo.Abp.Http.Modeling.ControllerInterfaceApiDescriptionModel]", "typeSimple": "[Volo.Abp.Http.Modeling.ControllerInterfaceApiDescriptionModel]", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "Actions", + "jsonName": null, "type": "{System.String:Volo.Abp.Http.Modeling.ActionApiDescriptionModel}", "typeSimple": "{string:Volo.Abp.Http.Modeling.ActionApiDescriptionModel}", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -4471,9 +6596,15 @@ "properties": [ { "name": "Type", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -4486,51 +6617,123 @@ "properties": [ { "name": "UniqueName", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "Name", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "HttpMethod", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "Url", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "SupportedVersions", + "jsonName": null, "type": "[System.String]", "typeSimple": "[string]", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "ParametersOnMethod", + "jsonName": null, "type": "[Volo.Abp.Http.Modeling.MethodParameterApiDescriptionModel]", "typeSimple": "[Volo.Abp.Http.Modeling.MethodParameterApiDescriptionModel]", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "Parameters", + "jsonName": null, "type": "[Volo.Abp.Http.Modeling.ParameterApiDescriptionModel]", "typeSimple": "[Volo.Abp.Http.Modeling.ParameterApiDescriptionModel]", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "ReturnValue", + "jsonName": null, "type": "Volo.Abp.Http.Modeling.ReturnValueApiDescriptionModel", "typeSimple": "Volo.Abp.Http.Modeling.ReturnValueApiDescriptionModel", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "AllowAnonymous", + "jsonName": null, + "type": "System.Boolean?", + "typeSimple": "boolean?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "ImplementFrom", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -4543,39 +6746,75 @@ "properties": [ { "name": "Name", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "TypeAsString", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "Type", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "TypeSimple", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "IsOptional", + "jsonName": null, "type": "System.Boolean", "typeSimple": "boolean", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "DefaultValue", + "jsonName": null, "type": "System.Object", "typeSimple": "object", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -4588,57 +6827,123 @@ "properties": [ { "name": "NameOnMethod", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "Name", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "JsonName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "Type", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "TypeSimple", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "IsOptional", + "jsonName": null, "type": "System.Boolean", "typeSimple": "boolean", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "DefaultValue", + "jsonName": null, "type": "System.Object", "typeSimple": "object", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "ConstraintTypes", + "jsonName": null, "type": "[System.String]", "typeSimple": "[string]", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "BindingSourceId", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "DescriptorName", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -4651,15 +6956,27 @@ "properties": [ { "name": "Type", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "TypeSimple", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -4672,39 +6989,75 @@ "properties": [ { "name": "BaseType", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "IsEnum", + "jsonName": null, "type": "System.Boolean", "typeSimple": "boolean", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "EnumNames", + "jsonName": null, "type": "[System.String]", "typeSimple": "[string]", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "EnumValues", + "jsonName": null, "type": "[System.Object]", "typeSimple": "[object]", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "GenericArguments", + "jsonName": null, "type": "[System.String]", "typeSimple": "[string]", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "Properties", + "jsonName": null, "type": "[Volo.Abp.Http.Modeling.PropertyApiDescriptionModel]", "typeSimple": "[Volo.Abp.Http.Modeling.PropertyApiDescriptionModel]", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] }, @@ -4717,27 +7070,123 @@ "properties": [ { "name": "Name", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "JsonName", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "Type", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "TypeSimple", + "jsonName": null, "type": "System.String", "typeSimple": "string", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null }, { "name": "IsRequired", + "jsonName": null, "type": "System.Boolean", "typeSimple": "boolean", - "isRequired": false + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "MinLength", + "jsonName": null, + "type": "System.Int32?", + "typeSimple": "number?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "MaxLength", + "jsonName": null, + "type": "System.Int32?", + "typeSimple": "number?", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Minimum", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Maximum", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null + }, + { + "name": "Regex", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isRequired": false, + "minLength": null, + "maxLength": null, + "minimum": null, + "maximum": null, + "regex": null } ] } diff --git a/npm/ng-packs/packages/setting-management/config/src/proxy/index.ts b/npm/ng-packs/packages/setting-management/config/src/lib/proxy/index.ts similarity index 100% rename from npm/ng-packs/packages/setting-management/config/src/proxy/index.ts rename to npm/ng-packs/packages/setting-management/config/src/lib/proxy/index.ts diff --git a/npm/ng-packs/packages/setting-management/config/src/proxy/models.ts b/npm/ng-packs/packages/setting-management/config/src/lib/proxy/models.ts similarity index 80% rename from npm/ng-packs/packages/setting-management/config/src/proxy/models.ts rename to npm/ng-packs/packages/setting-management/config/src/lib/proxy/models.ts index 9a87f0d345..5ab6d00799 100644 --- a/npm/ng-packs/packages/setting-management/config/src/proxy/models.ts +++ b/npm/ng-packs/packages/setting-management/config/src/lib/proxy/models.ts @@ -1,3 +1,4 @@ + export interface EmailSettingsDto { smtpHost?: string; smtpPort: number; @@ -10,6 +11,13 @@ export interface EmailSettingsDto { defaultFromDisplayName?: string; } +export interface SendTestEmailInput { + senderEmailAddress: string; + targetEmailAddress: string; + subject: string; + body?: string; +} + export interface UpdateEmailSettingsDto { smtpHost?: string; smtpPort: number; diff --git a/npm/ng-packs/packages/setting-management/config/src/services/index.ts b/npm/ng-packs/packages/setting-management/config/src/lib/services/index.ts similarity index 100% rename from npm/ng-packs/packages/setting-management/config/src/services/index.ts rename to npm/ng-packs/packages/setting-management/config/src/lib/services/index.ts diff --git a/npm/ng-packs/packages/setting-management/config/src/services/settings-tabs.service.ts b/npm/ng-packs/packages/setting-management/config/src/lib/services/settings-tabs.service.ts similarity index 100% rename from npm/ng-packs/packages/setting-management/config/src/services/settings-tabs.service.ts rename to npm/ng-packs/packages/setting-management/config/src/lib/services/settings-tabs.service.ts diff --git a/npm/ng-packs/packages/setting-management/config/src/setting-management-config.module.ts b/npm/ng-packs/packages/setting-management/config/src/lib/setting-management-config.module.ts similarity index 90% rename from npm/ng-packs/packages/setting-management/config/src/setting-management-config.module.ts rename to npm/ng-packs/packages/setting-management/config/src/lib/setting-management-config.module.ts index 4821dad145..60f567c31a 100644 --- a/npm/ng-packs/packages/setting-management/config/src/setting-management-config.module.ts +++ b/npm/ng-packs/packages/setting-management/config/src/lib/setting-management-config.module.ts @@ -1,3 +1,4 @@ +import { ThemeSharedModule } from '@abp/ng.theme.shared'; import { ModuleWithProviders, NgModule } from '@angular/core'; import { CoreModule } from '@abp/ng.core'; import { NgxValidateCoreModule } from '@ngx-validate/core'; @@ -8,7 +9,7 @@ import { SETTING_MANAGEMENT_SETTING_TAB_PROVIDERS } from './providers/setting-ta import { EmailSettingGroupComponent } from './components/email-setting-group/email-setting-group.component'; @NgModule({ - imports: [CoreModule, NgxValidateCoreModule], + imports: [CoreModule,ThemeSharedModule,NgxValidateCoreModule], declarations: [EmailSettingGroupComponent], exports: [EmailSettingGroupComponent], }) diff --git a/npm/ng-packs/packages/setting-management/config/src/proxy/email-settings.service.ts b/npm/ng-packs/packages/setting-management/config/src/proxy/email-settings.service.ts deleted file mode 100644 index a681a32c8d..0000000000 --- a/npm/ng-packs/packages/setting-management/config/src/proxy/email-settings.service.ts +++ /dev/null @@ -1,31 +0,0 @@ -import type { EmailSettingsDto, UpdateEmailSettingsDto } from './models'; -import { RestService } from '@abp/ng.core'; -import { Injectable } from '@angular/core'; - -@Injectable({ - providedIn: 'root', -}) -export class EmailSettingsService { - apiName = 'SettingManagement'; - - get = () => - this.restService.request( - { - method: 'GET', - url: '/api/setting-management/emailing', - }, - { apiName: this.apiName }, - ); - - update = (input: UpdateEmailSettingsDto) => - this.restService.request( - { - method: 'POST', - url: '/api/setting-management/emailing', - body: input, - }, - { apiName: this.apiName }, - ); - - constructor(private restService: RestService) {} -} diff --git a/npm/ng-packs/packages/setting-management/config/src/public-api.ts b/npm/ng-packs/packages/setting-management/config/src/public-api.ts index 83eb57e505..cd96bad911 100644 --- a/npm/ng-packs/packages/setting-management/config/src/public-api.ts +++ b/npm/ng-packs/packages/setting-management/config/src/public-api.ts @@ -1,6 +1,6 @@ -export * from './components/email-setting-group/email-setting-group.component'; -export * from './enums'; -export * from './providers'; -export * from './proxy'; -export * from './services'; -export * from './setting-management-config.module'; +export * from './lib/components/email-setting-group/email-setting-group.component'; +export * from './lib/enums'; +export * from './lib/providers'; +export * from './lib/proxy'; +export * from './lib/services'; +export * from './lib/setting-management-config.module'; diff --git a/npm/ng-packs/packages/setting-management/package.json b/npm/ng-packs/packages/setting-management/package.json index 488c355b2f..bd8dd9a7fd 100644 --- a/npm/ng-packs/packages/setting-management/package.json +++ b/npm/ng-packs/packages/setting-management/package.json @@ -1,14 +1,14 @@ { "name": "@abp/ng.setting-management", - "version": "5.3.0", + "version": "6.0.0-rc.3", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.components": "~5.3.0", - "@abp/ng.theme.shared": "~5.3.0", + "@abp/ng.components": "~6.0.0-rc.3", + "@abp/ng.theme.shared": "~6.0.0-rc.3", "tslib": "^2.0.0" }, "publishConfig": { diff --git a/npm/ng-packs/packages/tenant-management/package.json b/npm/ng-packs/packages/tenant-management/package.json index 5cd7770df6..963b1f766f 100644 --- a/npm/ng-packs/packages/tenant-management/package.json +++ b/npm/ng-packs/packages/tenant-management/package.json @@ -1,14 +1,14 @@ { "name": "@abp/ng.tenant-management", - "version": "5.3.0", + "version": "6.0.0-rc.3", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.feature-management": "~5.3.0", - "@abp/ng.theme.shared": "~5.3.0", + "@abp/ng.feature-management": "~6.0.0-rc.3", + "@abp/ng.theme.shared": "~6.0.0-rc.3", "tslib": "^2.0.0" }, "publishConfig": { diff --git a/npm/ng-packs/packages/theme-basic/package.json b/npm/ng-packs/packages/theme-basic/package.json index 29baf31d16..2bb2b470d0 100644 --- a/npm/ng-packs/packages/theme-basic/package.json +++ b/npm/ng-packs/packages/theme-basic/package.json @@ -1,14 +1,14 @@ { "name": "@abp/ng.theme.basic", - "version": "5.3.0", + "version": "6.0.0-rc.3", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.account.core": "~5.3.0", - "@abp/ng.theme.shared": "~5.3.0", + "@abp/ng.account.core": "~6.0.0-rc.3", + "@abp/ng.theme.shared": "~6.0.0-rc.3", "tslib": "^2.0.0" }, "publishConfig": { diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/extensible-form/extensible-form-prop.component.html b/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/extensible-form/extensible-form-prop.component.html index 24fd4e0f54..a5eeffa31c 100644 --- a/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/extensible-form/extensible-form-prop.component.html +++ b/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/extensible-form/extensible-form-prop.component.html @@ -1,138 +1,152 @@ -
- - - - + - - + + + - -
+
+ + + - -
- + - - - - + + + + + +
+ + +
+
- - - - {{ option.key }} - - - + + + - - -
- + + + + + + +
+ + +
+
+ + + + - -
-
+ - - - - + + + + - - - - + + + + - - - - + + + + +
- - - - -
+ - {{ prop.displayName | abpLocalization }} {{ asterisk }} diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/extensible-form/extensible-form-prop.component.ts b/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/extensible-form/extensible-form-prop.component.ts index fa679d3dbd..9cb65f1b5e 100644 --- a/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/extensible-form/extensible-form-prop.component.ts +++ b/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/extensible-form/extensible-form-prop.component.ts @@ -1,3 +1,4 @@ +import { EXTENSIONS_FORM_PROP_DATA, EXTENSIONS_FORM_PROP } from './../../tokens/extensions.token'; import { ABP, AbpValidators, ConfigStateService, TrackByService } from '@abp/ng.core'; import { AfterViewInit, @@ -5,6 +6,7 @@ import { ChangeDetectorRef, Component, ElementRef, + Injector, Input, OnChanges, Optional, @@ -54,6 +56,8 @@ export class ExtensibleFormPropComponent implements OnChanges, AfterViewInit { @ViewChild('field') private fieldRef!: ElementRef; + public injectorForCustomComponent: Injector; + asterisk = ''; options$: Observable[]> = of([]); @@ -62,15 +66,15 @@ export class ExtensibleFormPropComponent implements OnChanges, AfterViewInit { readonly!: boolean; - disabledFn = (data:PropData) => false; - - get disabled() { - return this.disabledFn(this.data) - } + typeaheadModel: any; private readonly form: FormGroup; - typeaheadModel: any; + disabledFn = (data: PropData) => false; + + get disabled() { + return this.disabledFn(this.data); + } setTypeaheadValue(selectedOption: ABP.Option) { this.typeaheadModel = selectedOption || { key: null, value: null }; @@ -108,6 +112,7 @@ export class ExtensibleFormPropComponent implements OnChanges, AfterViewInit { public readonly track: TrackByService, protected configState: ConfigStateService, groupDirective: FormGroupDirective, + private injector: Injector, ) { this.form = groupDirective.form; } @@ -133,6 +138,9 @@ export class ExtensibleFormPropComponent implements OnChanges, AfterViewInit { } getComponent(prop: FormProp): string { + if (prop.template) { + return 'template'; + } switch (prop.type) { case ePropType.Boolean: return 'checkbox'; @@ -173,13 +181,29 @@ export class ExtensibleFormPropComponent implements OnChanges, AfterViewInit { } } - ngOnChanges({ prop }: SimpleChanges) { - const currentProp = prop?.currentValue; - const { options, readonly, disabled, validators } = currentProp || {}; + ngOnChanges({ prop, data }: SimpleChanges) { + const currentProp = prop?.currentValue as FormProp; + const { options, readonly, disabled, validators, template } = currentProp || {}; + if (template) { + this.injectorForCustomComponent = Injector.create({ + providers: [ + { + provide: EXTENSIONS_FORM_PROP, + useValue: currentProp, + }, + { + provide: EXTENSIONS_FORM_PROP_DATA, + useValue: (data?.currentValue as PropData)?.record, + }, + { provide: ControlContainer, useExisting: FormGroupDirective }, + ], + parent: this.injector, + }); + } if (options) this.options$ = options(this.data); if (readonly) this.readonly = readonly(this.data); - + if (disabled) { this.disabledFn = disabled; } @@ -195,5 +219,9 @@ export class ExtensibleFormPropComponent implements OnChanges, AfterViewInit { } function isRequired(validator: ValidatorFn) { - return validator === Validators.required || validator === AbpValidators.required; + return ( + validator === Validators.required || + validator === AbpValidators.required || + validator.name === 'required' + ); } diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/extensible-form/extensible-form.component.html b/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/extensible-form/extensible-form.component.html index 259538820b..69ad86da5c 100644 --- a/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/extensible-form/extensible-form.component.html +++ b/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/extensible-form/extensible-form.component.html @@ -6,11 +6,11 @@ [formGroupName]="extraPropertiesKey" *ngIf="extraProperties.controls[prop.name]; else tempDefault" > - + - - +
implements OnChanges { value, }; if (prop.value.component) { - const injector = Injector.create( - [ + + const injector = Injector.create({ + providers: [ { provide: PROP_DATA_STREAM, useValue: value, }, ], - this.injector, - ); + parent: this.injector, + }); record[propKey].injector = injector; record[propKey].component = prop.value.component; } diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/grid-actions/grid-actions.component.html b/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/grid-actions/grid-actions.component.html index e3a17f0cc1..49cca7d326 100644 --- a/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/grid-actions/grid-actions.component.html +++ b/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/grid-actions/grid-actions.component.html @@ -27,7 +27,7 @@ diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/models/form-props.ts b/npm/ng-packs/packages/theme-shared/extensions/src/lib/models/form-props.ts index 44b309d0c2..bfc9f46dba 100644 --- a/npm/ng-packs/packages/theme-shared/extensions/src/lib/models/form-props.ts +++ b/npm/ng-packs/packages/theme-shared/extensions/src/lib/models/form-props.ts @@ -38,6 +38,8 @@ export class FormProp extends Prop { readonly defaultValue: boolean | number | string | Date; readonly options: PropCallback[]>> | undefined; readonly id: string | undefined; + readonly template?: Type; + readonly className?: string; constructor(options: FormPropOptions) { super( @@ -47,6 +49,8 @@ export class FormProp extends Prop { options.permission, options.visible, options.isExtra, + options.template, + options.className, ); this.asyncValidators = options.asyncValidators || (_ => []); diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/models/props.ts b/npm/ng-packs/packages/theme-shared/extensions/src/lib/models/props.ts index 66fc4f2c67..3799c419a7 100644 --- a/npm/ng-packs/packages/theme-shared/extensions/src/lib/models/props.ts +++ b/npm/ng-packs/packages/theme-shared/extensions/src/lib/models/props.ts @@ -33,6 +33,8 @@ export abstract class Prop { public readonly permission: string, public readonly visible: PropPredicate = _ => true, public readonly isExtra = false, + public readonly template?: Type, + public readonly className?: string, ) { this.displayName = this.displayName || this.name; } diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/tokens/extensible-form-view-provider.token.ts b/npm/ng-packs/packages/theme-shared/extensions/src/lib/tokens/extensible-form-view-provider.token.ts new file mode 100644 index 0000000000..9db2949731 --- /dev/null +++ b/npm/ng-packs/packages/theme-shared/extensions/src/lib/tokens/extensible-form-view-provider.token.ts @@ -0,0 +1,3 @@ +import { ControlContainer, FormGroupDirective } from "@angular/forms"; + +export const EXTENSIBLE_FORM_VIEW_PROVIDER = { provide: ControlContainer, useExisting: FormGroupDirective } diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/tokens/extensions.token.ts b/npm/ng-packs/packages/theme-shared/extensions/src/lib/tokens/extensions.token.ts index d2cbbe87bd..0a2df45a00 100644 --- a/npm/ng-packs/packages/theme-shared/extensions/src/lib/tokens/extensions.token.ts +++ b/npm/ng-packs/packages/theme-shared/extensions/src/lib/tokens/extensions.token.ts @@ -3,6 +3,7 @@ import { ActionCallback, ReadonlyActionData as ActionData } from '../models/acti import { ExtensionsService } from '../services/extensions.service'; import { Observable } from 'rxjs'; import { ePropType } from '../enums/props.enum'; +import { FormProp } from '../models/form-props'; export const EXTENSIONS_IDENTIFIER = new InjectionToken('EXTENSIONS_IDENTIFIER'); export type ActionKeys = Extract<'entityActions' | 'toolbarActions', keyof ExtensionsService>; @@ -24,3 +25,6 @@ export const ENTITY_PROP_TYPE_CLASSES = new InjectionToken( factory: () => ({} as EntityPropTypeClass), }, ); + +export const EXTENSIONS_FORM_PROP = new InjectionToken('EXTENSIONS_FORM_PROP'); +export const EXTENSIONS_FORM_PROP_DATA = new InjectionToken('EXTENSIONS_FORM_PROP_DATA'); diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/public-api.ts b/npm/ng-packs/packages/theme-shared/extensions/src/public-api.ts index b19f8eb0d9..f786eb4ac8 100644 --- a/npm/ng-packs/packages/theme-shared/extensions/src/public-api.ts +++ b/npm/ng-packs/packages/theme-shared/extensions/src/public-api.ts @@ -64,6 +64,7 @@ export { export * from './lib/pipes/create-injector.pipe'; export * from './lib/services/extensions.service'; export * from './lib/tokens/extensions.token'; +export * from './lib/tokens/extensible-form-view-provider.token'; export * from './lib/ui-extensions.module'; export * from './lib/utils/actions.util'; export * from './lib/utils/form-props.util'; diff --git a/npm/ng-packs/packages/theme-shared/package.json b/npm/ng-packs/packages/theme-shared/package.json index 05fd52a9d3..58d16d0e96 100644 --- a/npm/ng-packs/packages/theme-shared/package.json +++ b/npm/ng-packs/packages/theme-shared/package.json @@ -1,18 +1,18 @@ { "name": "@abp/ng.theme.shared", - "version": "5.3.0", + "version": "6.0.0-rc.3", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.core": "~5.3.0", + "@abp/ng.core": "~6.0.0-rc.3", "@fortawesome/fontawesome-free": "^5.15.4", "@ng-bootstrap/ng-bootstrap": "~12.0.0-beta.4", "@ngx-validate/core": "^0.1.2", "@popperjs/core": "~2.11.2", - "@swimlane/ngx-datatable": "^19.0.0", + "@swimlane/ngx-datatable": "^20.0.0", "bootstrap": "^5.1.1", "tslib": "^2.0.0" }, diff --git a/npm/ng-packs/packages/theme-shared/src/lib/constants/validation.ts b/npm/ng-packs/packages/theme-shared/src/lib/constants/validation.ts index 463a7b01dc..7822c10e36 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/constants/validation.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/constants/validation.ts @@ -2,10 +2,10 @@ export const DEFAULT_VALIDATION_BLUEPRINTS = { creditCard: 'AbpValidation::ThisFieldIsNotAValidCreditCardNumber.', email: 'AbpValidation::ThisFieldIsNotAValidEmailAddress.', invalid: 'AbpValidation::ThisFieldIsNotValid.', - max: 'AbpValidation::ThisFieldMustBeBetween{0}And{1}[{{ min }},{{ max }}]', + max: 'AbpValidation::ThisFieldMustBeLessOrEqual{0}[{{ max }}]', maxlength: 'AbpValidation::ThisFieldMustBeAStringOrArrayTypeWithAMaximumLengthOf{0}[{{ requiredLength }}]', - min: 'AbpValidation::ThisFieldMustBeBetween{0}And{1}[{{ min }},{{ max }}]', + min: 'AbpValidation::ThisFieldMustBeGreaterThanOrEqual{0}[{{ min }}]', minlength: 'AbpValidation::ThisFieldMustBeAStringOrArrayTypeWithAMinimumLengthOf{0}[{{ requiredLength }}]', ngbDate: 'AbpValidation::ThisFieldIsNotValid.', @@ -13,4 +13,9 @@ export const DEFAULT_VALIDATION_BLUEPRINTS = { range: 'AbpValidation::ThisFieldMustBeBetween{0}And{1}[{{ min }},{{ max }}]', required: 'AbpValidation::ThisFieldIsRequired.', url: 'AbpValidation::ThisFieldIsNotAValidFullyQualifiedHttpHttpsOrFtpUrl', + passwordRequiresLower: 'AbpIdentity::Volo.Abp.Identity:PasswordRequiresLower', + passwordRequiresUpper: 'AbpIdentity::Volo.Abp.Identity:PasswordRequiresUpper', + passwordRequiresDigit: 'AbpIdentity::Volo.Abp.Identity:PasswordRequiresDigit', + passwordRequiresNonAlphanumeric: 'AbpIdentity::Volo.Abp.Identity:PasswordRequiresNonAlphanumeric', + usernamePattern: 'AbpIdentity::Volo.Abp.Identity:InvalidUserName[{{ actualValue }}]', }; diff --git a/npm/ng-packs/packages/theme-shared/src/lib/models/index.ts b/npm/ng-packs/packages/theme-shared/src/lib/models/index.ts index ca6aa74124..4cb240e9ab 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/models/index.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/models/index.ts @@ -4,3 +4,4 @@ export * from './nav-item'; export * from './statistics'; export * from './toaster'; export * from './user-menu'; +export * from './validation'; diff --git a/npm/ng-packs/packages/theme-shared/src/lib/models/validation.ts b/npm/ng-packs/packages/theme-shared/src/lib/models/validation.ts new file mode 100644 index 0000000000..bcc53a34e7 --- /dev/null +++ b/npm/ng-packs/packages/theme-shared/src/lib/models/validation.ts @@ -0,0 +1 @@ +export type PasswordRule = 'small' | 'capital' | 'number' | 'special'; diff --git a/npm/ng-packs/packages/theme-shared/src/lib/tests/validation-utils.spec.ts b/npm/ng-packs/packages/theme-shared/src/lib/tests/validation-utils.spec.ts index fe7577477c..435afb76e6 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/tests/validation-utils.spec.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/tests/validation-utils.spec.ts @@ -4,10 +4,11 @@ import { HttpClient } from '@angular/common/http'; import { Component, Injector } from '@angular/core'; import { Validators } from '@angular/forms'; import { createComponentFactory, Spectator } from '@ngneat/spectator/jest'; -import { validatePassword } from '@ngx-validate/core'; import { OAuthService } from 'angular-oauth2-oidc'; import { of } from 'rxjs'; -import { getPasswordValidators } from '../utils'; +import { getPasswordValidators, validatePassword } from '../utils'; +import { PasswordRule } from '../models/validation'; + @Component({ template: '', selector: 'abp-dummy' }) class DummyComponent {} @@ -47,8 +48,11 @@ describe('ValidationUtils', () => { configState.refreshAppState(); const validators = getPasswordValidators(spectator.inject(Injector)); + const passwordValidators = ['number', 'small', 'capital', 'special'].map( + (rule: PasswordRule) => validatePassword(rule), + ); const expectedValidators = [ - validatePassword(['number', 'small', 'capital', 'special']), + ...passwordValidators, Validators.minLength(6), Validators.maxLength(128), ]; diff --git a/npm/ng-packs/packages/theme-shared/src/lib/utils/validation-utils.ts b/npm/ng-packs/packages/theme-shared/src/lib/utils/validation-utils.ts index a9ec1d4270..cb201d224f 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/utils/validation-utils.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/utils/validation-utils.ts @@ -1,7 +1,8 @@ import { ABP, ConfigStateService } from '@abp/ng.core'; import { Injector } from '@angular/core'; -import { ValidatorFn, Validators } from '@angular/forms'; -import { PasswordRules, validatePassword } from '@ngx-validate/core'; +import { AbstractControl, ValidatorFn, Validators } from '@angular/forms'; +import { normalizeDiacritics, PasswordRules } from '@ngx-validate/core'; +import { PasswordRule } from "../models/validation"; const { minLength, maxLength } = Validators; @@ -31,7 +32,8 @@ export function getPasswordValidators(injector: Injector): ValidatorFn[] { requiredLength = +getRule('RequiredLength'); } - return [validatePassword(passwordRulesArr), minLength(requiredLength), maxLength(128)]; + const passwordValidators = passwordRulesArr.map(rule => validatePassword(rule)); + return [...passwordValidators, minLength(requiredLength), maxLength(128)]; } function getRuleFn(injector: Injector) { @@ -43,3 +45,39 @@ function getRuleFn(injector: Injector) { return (passwordRules[`Abp.Identity.Password.${key}`] || '').toLowerCase(); }; } +const errorMessageMap = { + small: 'passwordRequiresLower', + capital: 'passwordRequiresUpper', + number: 'passwordRequiresDigit', + special: 'passwordRequiresNonAlphanumeric', +}; + +export function validatePassword( + shouldContain: PasswordRule +): ValidatorFn { + return (control: AbstractControl) => { + if (!control.value) return null; + + const value = normalizeDiacritics(control.value); + + const regexMap = { + small: /.*[a-z].*/, + capital: /.*[A-Z].*/, + number: /.*[0-9].*/, + special: /.*[^0-9a-zA-Z].*/, + }; + const regex = regexMap[shouldContain]; + + const isValid = regex.test(value); + + if (isValid) { + return null; + } + + const error = errorMessageMap[shouldContain]; + + return { + [error]: true, + }; + }; +} diff --git a/npm/ng-packs/scripts/copy-packages-to-templates.ts b/npm/ng-packs/scripts/copy-packages-to-templates.ts new file mode 100644 index 0000000000..42aa7e5eff --- /dev/null +++ b/npm/ng-packs/scripts/copy-packages-to-templates.ts @@ -0,0 +1,88 @@ +import execa from 'execa'; +import fse from 'fs-extra'; +import fs from 'fs'; +import program from 'commander'; + +const defaultTemplates = ['app', 'app-nolayers', 'module']; +const defaultTemplatePath = '../../../templates'; +const packageMap = { + account: 'ng.account', + 'account-core': 'ng.account.core', + components: 'ng.components', + core: 'ng.core', + 'feature-management': 'ng.feature-management', + identity: 'ng.identity', + 'permission-management': 'ng.permission-management', + 'setting-management': 'ng.setting-management', + 'tenant-management': 'ng.tenant-management', + 'theme-basic': 'ng.theme.basic', + 'theme-shared': 'ng.theme.shared', +}; +program.option('-t, --templates ', 'template dirs', false); +program.option('-p, --template-path ', 'root template path', false); +program.parse(process.argv); +const templates = program.templates ? program.templates.split(',') : defaultTemplates; +const templateRootPath = program.templatePath ? program.templatePath : defaultTemplatePath; +(async () => { + await execa('yarn', ['build'], { + stdout: 'inherit', + }); + + await installPackages(); + + await removeAbpPackages(); + + await copyBuildedPackagesFromDistFolder(); +})(); + +async function runEachTemplate( + handler: (template: string, templatePath?: string) => void | Promise, +) { + for (var template of templates) { + const templatePath = `${templateRootPath}/${template}/angular`; + const result = handler(template, templatePath); + result instanceof Promise ? await result : result; + } +} + +async function installPackages() { + await runEachTemplate(async (template, templatePath) => { + if (fse.existsSync(`${templatePath}/yarn.lock`)) { + fse.removeSync(`${templatePath}/yarn.lock`); + } + await execa('yarn', ['install', '--ignore-scripts'], { + stdout: 'inherit', + cwd: templatePath, + }); + }); +} + +async function removeAbpPackages() { + await runEachTemplate(async (template, templatePath) => { + Object.values(packageMap).forEach(value => { + const path = `${templatePath}/node_modules/@abp/${value}`; + if (fs.existsSync(path)) { + fse.removeSync(path); + } + }); + if (fs.existsSync(`${templatePath}/.angular`)) { + fse.removeSync(`${templatePath}/.angular`); + } + }); +} +function createFolderIfNotExists(destination: string) { + destination.split('/').reduce((acc, dir) => { + if (!fs.existsSync(acc)) { + fs.mkdirSync(acc); + } + return `${acc}/${dir}`; + }); +} +async function copyBuildedPackagesFromDistFolder() { + await runEachTemplate(async (template, templatePath) => { + Object.entries(packageMap).forEach(([key, value]) => { + createFolderIfNotExists(`${templatePath}/node_modules/@abp/${value}`); + fse.copySync(`../dist/packages/${key}/`, `${templatePath}/node_modules/@abp/${value}`); + }); + }); +} diff --git a/npm/ng-packs/packages/schematics/src/mocks/api-definition.json b/npm/ng-packs/scripts/mock-schematic/api-definition.json similarity index 100% rename from npm/ng-packs/packages/schematics/src/mocks/api-definition.json rename to npm/ng-packs/scripts/mock-schematic/api-definition.json diff --git a/npm/ng-packs/scripts/mock-schematic/mock-schematic-json.ts b/npm/ng-packs/scripts/mock-schematic/mock-schematic-json.ts new file mode 100644 index 0000000000..a4eb4f11d0 --- /dev/null +++ b/npm/ng-packs/scripts/mock-schematic/mock-schematic-json.ts @@ -0,0 +1,13 @@ +import express, { Request, Response } from 'express'; +import fs from 'fs'; + +const port = 4300; +const app = express(); + +app.get('/api/abp/api-definition', async (req: Request, res: Response) => { + const file = fs.readFileSync('./api-definition.json'); + res.contentType('application/json'); + res.send(file); +}); + +app.listen(port, () => console.log(`Server listening on http://localhost:${port}`)); diff --git a/npm/ng-packs/scripts/mock-schematic/package.json b/npm/ng-packs/scripts/mock-schematic/package.json new file mode 100644 index 0000000000..72bdd34635 --- /dev/null +++ b/npm/ng-packs/scripts/mock-schematic/package.json @@ -0,0 +1,22 @@ +{ + "name": "mocks-schematics", + "version": "0.0.1", + "description": "ABP Mock Proxy Generation App", + "scripts": { + "start": "nodemon mock-schematic-json.ts" + }, + "author": "", + "dependencies": { + "babel-preset-node6": "^11.0.0", + "express": "^4.18.1" + }, + "devDependencies": { + "@types/node": "^13.1.2", + "esm": "^3.2.25", + "ts-node": "^8.5.4", + "tsconfig-paths": "^3.9.0", + "typescript": "^3.7.4", + "nodemon": "^2.0.19", + "@types/express": "^4.17.13" + } +} diff --git a/npm/ng-packs/scripts/mock-schematic/tsconfig.json b/npm/ng-packs/scripts/mock-schematic/tsconfig.json new file mode 100644 index 0000000000..0e05b4f7ed --- /dev/null +++ b/npm/ng-packs/scripts/mock-schematic/tsconfig.json @@ -0,0 +1,12 @@ +{ +"compilerOptions": { + "target": "es5", + "module": "commonjs", + "outDir": "./dist", + "rootDir": "./src", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true + } +} diff --git a/npm/ng-packs/scripts/package.json b/npm/ng-packs/scripts/package.json index b0961239bb..8f82f88cc9 100644 --- a/npm/ng-packs/scripts/package.json +++ b/npm/ng-packs/scripts/package.json @@ -8,7 +8,8 @@ "build:prod": "ts-node -r tsconfig-paths/register prod-build.ts", "build:schematics": "ts-node -r tsconfig-paths/register build-schematics.ts", "publish-packages": "ts-node -r tsconfig-paths/register publish.ts", - "replace-with-tilde": "ts-node -r tsconfig-paths/register replace-with-tilde.ts" + "replace-with-tilde": "ts-node -r tsconfig-paths/register replace-with-tilde.ts", + "copy-to-templates": "ts-node -r tsconfig-paths/register copy-packages-to-templates.ts" }, "author": "", "dependencies": { diff --git a/npm/packs/anchor-js/package.json b/npm/packs/anchor-js/package.json index 0ad689a590..440d74ee74 100644 --- a/npm/packs/anchor-js/package.json +++ b/npm/packs/anchor-js/package.json @@ -1,11 +1,11 @@ { - "version": "5.3.0", + "version": "6.0.0-rc.3", "name": "@abp/anchor-js", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~5.3.0", + "@abp/core": "~6.0.0-rc.3", "anchor-js": "^4.3.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/aspnetcore.components.server.basictheme/package.json b/npm/packs/aspnetcore.components.server.basictheme/package.json index 8bd48c5e79..caae7605d6 100644 --- a/npm/packs/aspnetcore.components.server.basictheme/package.json +++ b/npm/packs/aspnetcore.components.server.basictheme/package.json @@ -1,11 +1,11 @@ { - "version": "5.3.0", + "version": "6.0.0-rc.3", "name": "@abp/aspnetcore.components.server.basictheme", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/aspnetcore.components.server.theming": "~5.3.0" + "@abp/aspnetcore.components.server.theming": "~6.0.0-rc.3" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/aspnetcore.components.server.theming/package.json b/npm/packs/aspnetcore.components.server.theming/package.json index d2780c6a3e..320194a7b1 100644 --- a/npm/packs/aspnetcore.components.server.theming/package.json +++ b/npm/packs/aspnetcore.components.server.theming/package.json @@ -1,12 +1,12 @@ { - "version": "5.3.0", + "version": "6.0.0-rc.3", "name": "@abp/aspnetcore.components.server.theming", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/bootstrap": "~5.3.0", - "@abp/font-awesome": "~5.3.0" + "@abp/bootstrap": "~6.0.0-rc.3", + "@abp/font-awesome": "~6.0.0-rc.3" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/aspnetcore.mvc.ui.theme.basic/package.json b/npm/packs/aspnetcore.mvc.ui.theme.basic/package.json index cebc908052..ad45cc98a3 100644 --- a/npm/packs/aspnetcore.mvc.ui.theme.basic/package.json +++ b/npm/packs/aspnetcore.mvc.ui.theme.basic/package.json @@ -1,5 +1,5 @@ { - "version": "5.3.0", + "version": "6.0.0-rc.3", "name": "@abp/aspnetcore.mvc.ui.theme.basic", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.shared": "~5.3.0" + "@abp/aspnetcore.mvc.ui.theme.shared": "~6.0.0-rc.3" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/aspnetcore.mvc.ui.theme.shared/package.json b/npm/packs/aspnetcore.mvc.ui.theme.shared/package.json index 1f6ff1df6b..958a45a444 100644 --- a/npm/packs/aspnetcore.mvc.ui.theme.shared/package.json +++ b/npm/packs/aspnetcore.mvc.ui.theme.shared/package.json @@ -1,5 +1,5 @@ { - "version": "5.3.0", + "version": "6.0.0-rc.3", "name": "@abp/aspnetcore.mvc.ui.theme.shared", "repository": { "type": "git", @@ -10,20 +10,20 @@ "access": "public" }, "dependencies": { - "@abp/aspnetcore.mvc.ui": "~5.3.0", - "@abp/bootstrap": "~5.3.0", - "@abp/bootstrap-datepicker": "~5.3.0", - "@abp/datatables.net-bs5": "~5.3.0", - "@abp/font-awesome": "~5.3.0", - "@abp/jquery-form": "~5.3.0", - "@abp/jquery-validation-unobtrusive": "~5.3.0", - "@abp/lodash": "~5.3.0", - "@abp/luxon": "~5.3.0", - "@abp/malihu-custom-scrollbar-plugin": "~5.3.0", - "@abp/select2": "~5.3.0", - "@abp/sweetalert2": "~5.3.0", - "@abp/timeago": "~5.3.0", - "@abp/toastr": "~5.3.0" + "@abp/aspnetcore.mvc.ui": "~6.0.0-rc.3", + "@abp/bootstrap": "~6.0.0-rc.3", + "@abp/bootstrap-datepicker": "~6.0.0-rc.3", + "@abp/datatables.net-bs5": "~6.0.0-rc.3", + "@abp/font-awesome": "~6.0.0-rc.3", + "@abp/jquery-form": "~6.0.0-rc.3", + "@abp/jquery-validation-unobtrusive": "~6.0.0-rc.3", + "@abp/lodash": "~6.0.0-rc.3", + "@abp/luxon": "~6.0.0-rc.3", + "@abp/malihu-custom-scrollbar-plugin": "~6.0.0-rc.3", + "@abp/select2": "~6.0.0-rc.3", + "@abp/sweetalert2": "~6.0.0-rc.3", + "@abp/timeago": "~6.0.0-rc.3", + "@abp/toastr": "~6.0.0-rc.3" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/aspnetcore.mvc.ui/package-lock.json b/npm/packs/aspnetcore.mvc.ui/package-lock.json index ca2dc16c3a..ba22038ad4 100644 --- a/npm/packs/aspnetcore.mvc.ui/package-lock.json +++ b/npm/packs/aspnetcore.mvc.ui/package-lock.json @@ -1,6 +1,6 @@ { "name": "@abp/aspnetcore.mvc.ui", - "version": "5.3.0", + "version": "6.0.0-rc.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/npm/packs/aspnetcore.mvc.ui/package.json b/npm/packs/aspnetcore.mvc.ui/package.json index 6b9a58957d..a42f3d28e0 100644 --- a/npm/packs/aspnetcore.mvc.ui/package.json +++ b/npm/packs/aspnetcore.mvc.ui/package.json @@ -1,5 +1,5 @@ { - "version": "5.3.0", + "version": "6.0.0-rc.3", "name": "@abp/aspnetcore.mvc.ui", "repository": { "type": "git", diff --git a/npm/packs/blogging/package.json b/npm/packs/blogging/package.json index fba8d57049..d8c9758ff1 100644 --- a/npm/packs/blogging/package.json +++ b/npm/packs/blogging/package.json @@ -1,14 +1,14 @@ { - "version": "5.3.0", + "version": "6.0.0-rc.3", "name": "@abp/blogging", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.shared": "~5.3.0", - "@abp/owl.carousel": "~5.3.0", - "@abp/prismjs": "~5.3.0", - "@abp/tui-editor": "~5.3.0" + "@abp/aspnetcore.mvc.ui.theme.shared": "~6.0.0-rc.3", + "@abp/owl.carousel": "~6.0.0-rc.3", + "@abp/prismjs": "~6.0.0-rc.3", + "@abp/tui-editor": "~6.0.0-rc.3" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/bootstrap-datepicker/package.json b/npm/packs/bootstrap-datepicker/package.json index 3b7b5f6f8c..e934908461 100644 --- a/npm/packs/bootstrap-datepicker/package.json +++ b/npm/packs/bootstrap-datepicker/package.json @@ -1,5 +1,5 @@ { - "version": "5.3.0", + "version": "6.0.0-rc.3", "name": "@abp/bootstrap-datepicker", "repository": { "type": "git", diff --git a/npm/packs/bootstrap/package.json b/npm/packs/bootstrap/package.json index bc0efafa12..07e53beba0 100644 --- a/npm/packs/bootstrap/package.json +++ b/npm/packs/bootstrap/package.json @@ -1,5 +1,5 @@ { - "version": "5.3.0", + "version": "6.0.0-rc.3", "name": "@abp/bootstrap", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/core": "~5.3.0", + "@abp/core": "~6.0.0-rc.3", "bootstrap": "^5.1.3" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/chart.js/package.json b/npm/packs/chart.js/package.json index 7a7b44325c..4cef265e8e 100644 --- a/npm/packs/chart.js/package.json +++ b/npm/packs/chart.js/package.json @@ -1,5 +1,5 @@ { - "version": "5.3.0", + "version": "6.0.0-rc.3", "name": "@abp/chart.js", "publishConfig": { "access": "public" diff --git a/npm/packs/clipboard/package.json b/npm/packs/clipboard/package.json index 9e8757e702..1ada6b2df9 100644 --- a/npm/packs/clipboard/package.json +++ b/npm/packs/clipboard/package.json @@ -1,11 +1,11 @@ { - "version": "5.3.0", + "version": "6.0.0-rc.3", "name": "@abp/clipboard", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~5.3.0", + "@abp/core": "~6.0.0-rc.3", "clipboard": "^2.0.8" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/cms-kit.admin/package.json b/npm/packs/cms-kit.admin/package.json index 00734ad9fd..9d9105c509 100644 --- a/npm/packs/cms-kit.admin/package.json +++ b/npm/packs/cms-kit.admin/package.json @@ -1,15 +1,15 @@ { - "version": "5.3.0", + "version": "6.0.0-rc.3", "name": "@abp/cms-kit.admin", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/codemirror": "~5.3.0", - "@abp/jstree": "~5.3.0", - "@abp/slugify": "~5.3.0", - "@abp/tui-editor": "~5.3.0", - "@abp/uppy": "~5.3.0" + "@abp/codemirror": "~6.0.0-rc.3", + "@abp/jstree": "~6.0.0-rc.3", + "@abp/slugify": "~6.0.0-rc.3", + "@abp/tui-editor": "~6.0.0-rc.3", + "@abp/uppy": "~6.0.0-rc.3" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/cms-kit.public/package.json b/npm/packs/cms-kit.public/package.json index 69b733d615..4169c66d28 100644 --- a/npm/packs/cms-kit.public/package.json +++ b/npm/packs/cms-kit.public/package.json @@ -1,12 +1,12 @@ { - "version": "5.3.0", + "version": "6.0.0-rc.3", "name": "@abp/cms-kit.public", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/highlight.js": "~5.3.0", - "@abp/star-rating-svg": "~5.3.0" + "@abp/highlight.js": "~6.0.0-rc.3", + "@abp/star-rating-svg": "~6.0.0-rc.3" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/cms-kit/package.json b/npm/packs/cms-kit/package.json index e20485355e..9a35ff844f 100644 --- a/npm/packs/cms-kit/package.json +++ b/npm/packs/cms-kit/package.json @@ -1,12 +1,12 @@ { - "version": "5.3.0", + "version": "6.0.0-rc.3", "name": "@abp/cms-kit", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/cms-kit.admin": "~5.3.0", - "@abp/cms-kit.public": "~5.3.0" + "@abp/cms-kit.admin": "~6.0.0-rc.3", + "@abp/cms-kit.public": "~6.0.0-rc.3" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/codemirror/package.json b/npm/packs/codemirror/package.json index 11bcd5c0fe..35b0fbcd12 100644 --- a/npm/packs/codemirror/package.json +++ b/npm/packs/codemirror/package.json @@ -1,11 +1,11 @@ { - "version": "5.3.0", + "version": "6.0.0-rc.3", "name": "@abp/codemirror", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~5.3.0", + "@abp/core": "~6.0.0-rc.3", "codemirror": "^5.65.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/core/package.json b/npm/packs/core/package.json index 0c2787afef..2f7f4fd784 100644 --- a/npm/packs/core/package.json +++ b/npm/packs/core/package.json @@ -1,5 +1,5 @@ { - "version": "5.3.0", + "version": "6.0.0-rc.3", "name": "@abp/core", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/utils": "~5.3.0" + "@abp/utils": "~6.0.0-rc.3" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/core/src/abp.js b/npm/packs/core/src/abp.js index b028c013d6..0348069bec 100644 --- a/npm/packs/core/src/abp.js +++ b/npm/packs/core/src/abp.js @@ -372,7 +372,9 @@ var abp = abp || {}; setTimeout(function () { if (element) { element.classList.remove('abp-block-area-disappearing'); - element.parentElement.removeChild(element); + if (element.parentElement) { + element.parentElement.removeChild(element); + } } }, 250); } diff --git a/npm/packs/cropperjs/package.json b/npm/packs/cropperjs/package.json index d4eb26e508..9c635dedd1 100644 --- a/npm/packs/cropperjs/package.json +++ b/npm/packs/cropperjs/package.json @@ -1,11 +1,11 @@ { - "version": "5.3.0", + "version": "6.0.0-rc.3", "name": "@abp/cropperjs", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~5.3.0", + "@abp/core": "~6.0.0-rc.3", "cropperjs": "^1.5.12" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/datatables.net-bs4/package.json b/npm/packs/datatables.net-bs4/package.json index 93a9405147..b75e295453 100644 --- a/npm/packs/datatables.net-bs4/package.json +++ b/npm/packs/datatables.net-bs4/package.json @@ -1,5 +1,5 @@ { - "version": "5.3.0", + "version": "6.0.0-rc.3", "name": "@abp/datatables.net-bs4", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/datatables.net": "~5.3.0", + "@abp/datatables.net": "~6.0.0-rc.3", "datatables.net-bs4": "^1.11.4" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/datatables.net-bs5/package.json b/npm/packs/datatables.net-bs5/package.json index 5b1b8c2231..694f9a914f 100644 --- a/npm/packs/datatables.net-bs5/package.json +++ b/npm/packs/datatables.net-bs5/package.json @@ -1,11 +1,11 @@ { - "version": "5.3.0", + "version": "6.0.0-rc.3", "name": "@abp/datatables.net-bs5", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/datatables.net": "~5.3.0", + "@abp/datatables.net": "~6.0.0-rc.3", "datatables.net-bs5": "^1.11.4" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/datatables.net/package.json b/npm/packs/datatables.net/package.json index 988c161aad..1ff12ca4d0 100644 --- a/npm/packs/datatables.net/package.json +++ b/npm/packs/datatables.net/package.json @@ -1,5 +1,5 @@ { - "version": "5.3.0", + "version": "6.0.0-rc.3", "name": "@abp/datatables.net", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/jquery": "~5.3.0", + "@abp/jquery": "~6.0.0-rc.3", "datatables.net": "^1.11.4" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/docs/package.json b/npm/packs/docs/package.json index 45f9d003df..1349b2bd93 100644 --- a/npm/packs/docs/package.json +++ b/npm/packs/docs/package.json @@ -1,15 +1,15 @@ { - "version": "5.3.0", + "version": "6.0.0-rc.3", "name": "@abp/docs", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/anchor-js": "~5.3.0", - "@abp/clipboard": "~5.3.0", - "@abp/malihu-custom-scrollbar-plugin": "~5.3.0", - "@abp/popper.js": "~5.3.0", - "@abp/prismjs": "~5.3.0" + "@abp/anchor-js": "~6.0.0-rc.3", + "@abp/clipboard": "~6.0.0-rc.3", + "@abp/malihu-custom-scrollbar-plugin": "~6.0.0-rc.3", + "@abp/popper.js": "~6.0.0-rc.3", + "@abp/prismjs": "~6.0.0-rc.3" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/flag-icon-css/package.json b/npm/packs/flag-icon-css/package.json index 6192a23df9..52e5185adc 100644 --- a/npm/packs/flag-icon-css/package.json +++ b/npm/packs/flag-icon-css/package.json @@ -1,5 +1,5 @@ { - "version": "5.3.0", + "version": "6.0.0-rc.3", "name": "@abp/flag-icon-css", "publishConfig": { "access": "public" diff --git a/npm/packs/font-awesome/package.json b/npm/packs/font-awesome/package.json index ea1a9d8f64..496c918dd7 100644 --- a/npm/packs/font-awesome/package.json +++ b/npm/packs/font-awesome/package.json @@ -1,5 +1,5 @@ { - "version": "5.3.0", + "version": "6.0.0-rc.3", "name": "@abp/font-awesome", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/core": "~5.3.0", + "@abp/core": "~6.0.0-rc.3", "@fortawesome/fontawesome-free": "^5.15.4" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/highlight.js/package.json b/npm/packs/highlight.js/package.json index e50445e5c0..7391e28c8e 100644 --- a/npm/packs/highlight.js/package.json +++ b/npm/packs/highlight.js/package.json @@ -1,11 +1,11 @@ { - "version": "5.3.0", + "version": "6.0.0-rc.3", "name": "@abp/highlight.js", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~5.3.0", + "@abp/core": "~6.0.0-rc.3", "@highlightjs/cdn-assets": "~11.4.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/jquery-form/package.json b/npm/packs/jquery-form/package.json index 9d74b86f95..f5edb4cc3f 100644 --- a/npm/packs/jquery-form/package.json +++ b/npm/packs/jquery-form/package.json @@ -1,5 +1,5 @@ { - "version": "5.3.0", + "version": "6.0.0-rc.3", "name": "@abp/jquery-form", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/jquery": "~5.3.0", + "@abp/jquery": "~6.0.0-rc.3", "jquery-form": "^4.3.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/jquery-validation-unobtrusive/package.json b/npm/packs/jquery-validation-unobtrusive/package.json index 7420e004d9..0872c5dedc 100644 --- a/npm/packs/jquery-validation-unobtrusive/package.json +++ b/npm/packs/jquery-validation-unobtrusive/package.json @@ -1,5 +1,5 @@ { - "version": "5.3.0", + "version": "6.0.0-rc.3", "name": "@abp/jquery-validation-unobtrusive", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/jquery-validation": "~5.3.0", + "@abp/jquery-validation": "~6.0.0-rc.3", "jquery-validation-unobtrusive": "^3.2.12" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/jquery-validation/package.json b/npm/packs/jquery-validation/package.json index 7209aa37b7..7b0cb65f2b 100644 --- a/npm/packs/jquery-validation/package.json +++ b/npm/packs/jquery-validation/package.json @@ -1,5 +1,5 @@ { - "version": "5.3.0", + "version": "6.0.0-rc.3", "name": "@abp/jquery-validation", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/jquery": "~5.3.0", + "@abp/jquery": "~6.0.0-rc.3", "jquery-validation": "^1.19.3" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/jquery/package.json b/npm/packs/jquery/package.json index 1ccfbe4be4..299970b966 100644 --- a/npm/packs/jquery/package.json +++ b/npm/packs/jquery/package.json @@ -1,5 +1,5 @@ { - "version": "5.3.0", + "version": "6.0.0-rc.3", "name": "@abp/jquery", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/core": "~5.3.0", + "@abp/core": "~6.0.0-rc.3", "jquery": "~3.6.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/jstree/package.json b/npm/packs/jstree/package.json index 710a02a5b3..5af8b78068 100644 --- a/npm/packs/jstree/package.json +++ b/npm/packs/jstree/package.json @@ -1,11 +1,11 @@ { - "version": "5.3.0", + "version": "6.0.0-rc.3", "name": "@abp/jstree", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/jquery": "~5.3.0", + "@abp/jquery": "~6.0.0-rc.3", "jstree": "^3.3.12" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/lodash/package.json b/npm/packs/lodash/package.json index f25726b966..b6b57bfebb 100644 --- a/npm/packs/lodash/package.json +++ b/npm/packs/lodash/package.json @@ -1,5 +1,5 @@ { - "version": "5.3.0", + "version": "6.0.0-rc.3", "name": "@abp/lodash", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/core": "~5.3.0", + "@abp/core": "~6.0.0-rc.3", "lodash": "^4.17.21" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/luxon/package.json b/npm/packs/luxon/package.json index 708b429dd3..03cbdc6ef9 100644 --- a/npm/packs/luxon/package.json +++ b/npm/packs/luxon/package.json @@ -1,5 +1,5 @@ { - "version": "5.3.0", + "version": "6.0.0-rc.3", "name": "@abp/luxon", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/core": "~5.3.0", + "@abp/core": "~6.0.0-rc.3", "luxon": "^2.3.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/malihu-custom-scrollbar-plugin/package.json b/npm/packs/malihu-custom-scrollbar-plugin/package.json index d053291381..8b3cdb1aed 100644 --- a/npm/packs/malihu-custom-scrollbar-plugin/package.json +++ b/npm/packs/malihu-custom-scrollbar-plugin/package.json @@ -1,5 +1,5 @@ { - "version": "5.3.0", + "version": "6.0.0-rc.3", "name": "@abp/malihu-custom-scrollbar-plugin", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/core": "~5.3.0", + "@abp/core": "~6.0.0-rc.3", "malihu-custom-scrollbar-plugin": "^3.1.5" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/markdown-it/package.json b/npm/packs/markdown-it/package.json index 472d897107..c4740a5a10 100644 --- a/npm/packs/markdown-it/package.json +++ b/npm/packs/markdown-it/package.json @@ -1,11 +1,11 @@ { - "version": "5.3.0", + "version": "6.0.0-rc.3", "name": "@abp/markdown-it", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~5.3.0", + "@abp/core": "~6.0.0-rc.3", "markdown-it": "^12.3.2" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/owl.carousel/package.json b/npm/packs/owl.carousel/package.json index 358ccf8a52..b4adc00918 100644 --- a/npm/packs/owl.carousel/package.json +++ b/npm/packs/owl.carousel/package.json @@ -1,11 +1,11 @@ { - "version": "5.3.0", + "version": "6.0.0-rc.3", "name": "@abp/owl.carousel", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~5.3.0", + "@abp/core": "~6.0.0-rc.3", "owl.carousel": "^2.3.4" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/popper.js/package.json b/npm/packs/popper.js/package.json index ca9e46e8d0..f96e4d7e53 100644 --- a/npm/packs/popper.js/package.json +++ b/npm/packs/popper.js/package.json @@ -1,11 +1,11 @@ { - "version": "5.3.0", + "version": "6.0.0-rc.3", "name": "@abp/popper.js", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~5.3.0", + "@abp/core": "~6.0.0-rc.3", "@popperjs/core": "^2.11.2" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/prismjs/package.json b/npm/packs/prismjs/package.json index e1b71b09b5..574ee16a93 100644 --- a/npm/packs/prismjs/package.json +++ b/npm/packs/prismjs/package.json @@ -1,12 +1,12 @@ { - "version": "5.3.0", + "version": "6.0.0-rc.3", "name": "@abp/prismjs", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/clipboard": "~5.3.0", - "@abp/core": "~5.3.0", + "@abp/clipboard": "~6.0.0-rc.3", + "@abp/core": "~6.0.0-rc.3", "prismjs": "^1.26.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/select2/package.json b/npm/packs/select2/package.json index 9e5954fb6a..99e063dc67 100644 --- a/npm/packs/select2/package.json +++ b/npm/packs/select2/package.json @@ -1,5 +1,5 @@ { - "version": "5.3.0", + "version": "6.0.0-rc.3", "name": "@abp/select2", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/core": "~5.3.0", + "@abp/core": "~6.0.0-rc.3", "select2": "^4.0.13" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/signalr/package.json b/npm/packs/signalr/package.json index 33c0fcb4be..8e989801f1 100644 --- a/npm/packs/signalr/package.json +++ b/npm/packs/signalr/package.json @@ -1,11 +1,11 @@ { - "version": "5.3.0", + "version": "6.0.0-rc.3", "name": "@abp/signalr", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~5.3.0", + "@abp/core": "~6.0.0-rc.3", "@microsoft/signalr": "~6.0.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/slugify/package.json b/npm/packs/slugify/package.json index 65fca8e7a1..93fe30049c 100644 --- a/npm/packs/slugify/package.json +++ b/npm/packs/slugify/package.json @@ -1,5 +1,5 @@ { - "version": "5.3.0", + "version": "6.0.0-rc.3", "name": "@abp/slugify", "publishConfig": { "access": "public" diff --git a/npm/packs/star-rating-svg/package.json b/npm/packs/star-rating-svg/package.json index 3250cd0539..2f82582031 100644 --- a/npm/packs/star-rating-svg/package.json +++ b/npm/packs/star-rating-svg/package.json @@ -1,11 +1,11 @@ { - "version": "5.3.0", + "version": "6.0.0-rc.3", "name": "@abp/star-rating-svg", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/jquery": "~5.3.0", + "@abp/jquery": "~6.0.0-rc.3", "star-rating-svg": "^3.5.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/sweetalert2/package.json b/npm/packs/sweetalert2/package.json index 6d946a53b8..9148b8f9a4 100644 --- a/npm/packs/sweetalert2/package.json +++ b/npm/packs/sweetalert2/package.json @@ -1,5 +1,5 @@ { - "version": "5.3.0", + "version": "6.0.0-rc.3", "name": "@abp/sweetalert2", "publishConfig": { "access": "public" @@ -10,7 +10,7 @@ "directory": "npm/packs/sweetalert2" }, "dependencies": { - "@abp/core": "~5.3.0", + "@abp/core": "~6.0.0-rc.3", "sweetalert2": "^11.3.6" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/timeago/package.json b/npm/packs/timeago/package.json index 6d8f19f982..1d03e5385b 100644 --- a/npm/packs/timeago/package.json +++ b/npm/packs/timeago/package.json @@ -1,5 +1,5 @@ { - "version": "5.3.0", + "version": "6.0.0-rc.3", "name": "@abp/timeago", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/jquery": "~5.3.0", + "@abp/jquery": "~6.0.0-rc.3", "timeago": "^1.6.7" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/toastr/package.json b/npm/packs/toastr/package.json index bf9a07c0ca..46cddb8d4c 100644 --- a/npm/packs/toastr/package.json +++ b/npm/packs/toastr/package.json @@ -1,5 +1,5 @@ { - "version": "5.3.0", + "version": "6.0.0-rc.3", "name": "@abp/toastr", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/jquery": "~5.3.0", + "@abp/jquery": "~6.0.0-rc.3", "toastr": "^2.1.4" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/tui-editor/package.json b/npm/packs/tui-editor/package.json index 4c9cfeb833..c05636516e 100644 --- a/npm/packs/tui-editor/package.json +++ b/npm/packs/tui-editor/package.json @@ -1,12 +1,12 @@ { - "version": "5.3.0", + "version": "6.0.0-rc.3", "name": "@abp/tui-editor", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/jquery": "~5.3.0", - "@abp/prismjs": "~5.3.0" + "@abp/jquery": "~6.0.0-rc.3", + "@abp/prismjs": "~6.0.0-rc.3" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/uppy/package.json b/npm/packs/uppy/package.json index cba488d4bb..c7fceab18b 100644 --- a/npm/packs/uppy/package.json +++ b/npm/packs/uppy/package.json @@ -1,11 +1,11 @@ { - "version": "5.3.0", + "version": "6.0.0-rc.3", "name": "@abp/uppy", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~5.3.0", + "@abp/core": "~6.0.0-rc.3", "uppy": "^1.16.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/utils/package.json b/npm/packs/utils/package.json index 1252b15308..b0f54bfaa3 100644 --- a/npm/packs/utils/package.json +++ b/npm/packs/utils/package.json @@ -1,6 +1,6 @@ { "name": "@abp/utils", - "version": "5.3.0", + "version": "6.0.0-rc.3", "scripts": { "prepublishOnly": "yarn install --ignore-scripts && node prepublish.js", "ng": "ng", diff --git a/npm/packs/vee-validate/package.json b/npm/packs/vee-validate/package.json index e545dc9b81..30061decd0 100644 --- a/npm/packs/vee-validate/package.json +++ b/npm/packs/vee-validate/package.json @@ -1,11 +1,11 @@ { - "version": "5.3.0", + "version": "6.0.0-rc.3", "name": "@abp/vee-validate", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/vue": "~5.3.0", + "@abp/vue": "~6.0.0-rc.3", "vee-validate": "~3.4.4" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/virtual-file-explorer/package.json b/npm/packs/virtual-file-explorer/package.json index 4c6c3c8ad2..23a136a60e 100644 --- a/npm/packs/virtual-file-explorer/package.json +++ b/npm/packs/virtual-file-explorer/package.json @@ -1,12 +1,12 @@ { - "version": "5.3.0", + "version": "6.0.0-rc.3", "name": "@abp/virtual-file-explorer", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/clipboard": "~5.3.0", - "@abp/prismjs": "~5.3.0" + "@abp/clipboard": "~6.0.0-rc.3", + "@abp/prismjs": "~6.0.0-rc.3" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/vue/package.json b/npm/packs/vue/package.json index 6443b61942..57faf054e5 100644 --- a/npm/packs/vue/package.json +++ b/npm/packs/vue/package.json @@ -1,5 +1,5 @@ { - "version": "5.3.0", + "version": "6.0.0-rc.3", "name": "@abp/vue", "publishConfig": { "access": "public" diff --git a/npm/scripts/yarn.lock b/npm/scripts/yarn.lock index bae2201646..2feefc9b8a 100644 --- a/npm/scripts/yarn.lock +++ b/npm/scripts/yarn.lock @@ -1144,9 +1144,9 @@ locate-path@^6.0.0: p-locate "^5.0.0" lodash@^4.17.20: - version "4.17.20" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" - integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: version "1.0.1" diff --git a/nupkg/0 b/nupkg/0 new file mode 100644 index 0000000000..cf175e3b0b Binary files /dev/null and b/nupkg/0 differ diff --git a/nupkg/common.ps1 b/nupkg/common.ps1 index d0dc8e9359..002df803bd 100644 --- a/nupkg/common.ps1 +++ b/nupkg/common.ps1 @@ -69,6 +69,7 @@ function Read-File { # List of solutions $solutions = ( "framework", + "../abp-studio", "modules/account", "modules/audit-logging", "modules/background-jobs", @@ -79,14 +80,14 @@ $solutions = ( "modules/feature-management", "modules/identity", "modules/identityserver", + "modules/openiddict", "modules/permission-management", "modules/setting-management", "modules/tenant-management", "modules/users", "modules/virtual-file-explorer", "modules/blob-storing-database", - "modules/cms-kit", - "studio" + "modules/cms-kit" ) # List of projects @@ -98,6 +99,8 @@ $projects = ( "framework/src/Volo.Abp.AspNetCore.Authentication.OAuth", "framework/src/Volo.Abp.AspNetCore.Authentication.OpenIdConnect", "framework/src/Volo.Abp.AspNetCore", + "framework/src/Volo.Abp.AspNetCore.Mvc.Dapr", + "framework/src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus", "framework/src/Volo.Abp.AspNetCore.Components", "framework/src/Volo.Abp.AspNetCore.Components.Server", "framework/src/Volo.Abp.AspNetCore.Components.Web", @@ -154,12 +157,14 @@ $projects = ( "framework/src/Volo.Abp.Core", "framework/src/Volo.Abp", "framework/src/Volo.Abp.Dapper", + "framework/src/Volo.Abp.Dapr", "framework/src/Volo.Abp.Data", "framework/src/Volo.Abp.Ddd.Application", "framework/src/Volo.Abp.Ddd.Application.Contracts", "framework/src/Volo.Abp.Ddd.Domain", "framework/src/Volo.Abp.DistributedLocking.Abstractions", "framework/src/Volo.Abp.DistributedLocking", + "framework/src/Volo.Abp.DistributedLocking.Dapr", "framework/src/Volo.Abp.Emailing", "framework/src/Volo.Abp.EntityFrameworkCore", "framework/src/Volo.Abp.EntityFrameworkCore.MySQL", @@ -174,6 +179,7 @@ $projects = ( "framework/src/Volo.Abp.EventBus.Kafka", "framework/src/Volo.Abp.EventBus.Rebus", "framework/src/Volo.Abp.EventBus.Azure", + "framework/src/Volo.Abp.EventBus.Dapr", "framework/src/Volo.Abp.ExceptionHandling", "framework/src/Volo.Abp.Features", "framework/src/Volo.Abp.FluentValidation", @@ -183,7 +189,8 @@ $projects = ( "framework/src/Volo.Abp.HangFire", "framework/src/Volo.Abp.Http.Abstractions", "framework/src/Volo.Abp.Http.Client", - "framework/src/Volo.Abp.Http.Client.Web", + "framework/src/Volo.Abp.Http.Client.Dapr", + "framework/src/Volo.Abp.Http.Client.Web", "framework/src/Volo.Abp.Http.Client.IdentityModel", "framework/src/Volo.Abp.Http.Client.IdentityModel.Web", "framework/src/Volo.Abp.Http.Client.IdentityModel.WebAssembly", @@ -225,6 +232,13 @@ $projects = ( "framework/src/Volo.Abp.Kafka", "framework/src/Volo.Abp.Swashbuckle", + # studio + "../abp-studio/src/Volo.Abp.Studio.Domain.Shared", + "../abp-studio/src/Volo.Abp.Studio.Domain.CommonServices", + "../abp-studio/src/Volo.Abp.Studio.ModuleInstaller.Abstractions", + "../abp-studio/src/Volo.Abp.Studio.ModuleInstaller", + "../abp-studio/src/Volo.Abp.Studio.Analyzing.Abstractions", + # modules/account "modules/account/src/Volo.Abp.Account.Application.Contracts", "modules/account/src/Volo.Abp.Account.Application", @@ -242,8 +256,8 @@ $projects = ( "modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared", "modules/audit-logging/src/Volo.Abp.AuditLogging.EntityFrameworkCore", "modules/audit-logging/src/Volo.Abp.AuditLogging.MongoDB", - "modules/audit-logging/src/Volo.Abp.AuditLogging.Installer", - "studio/source-codes/Volo.Abp.AuditLogging.SourceCode", + # "modules/audit-logging/src/Volo.Abp.AuditLogging.Installer", + # "studio/source-codes/Volo.Abp.AuditLogging.SourceCode", # modules/background-jobs "modules/background-jobs/src/Volo.Abp.BackgroundJobs.Domain", @@ -277,6 +291,7 @@ $projects = ( "modules/blogging/src/Volo.Blogging.Admin.HttpApi", "modules/blogging/src/Volo.Blogging.Admin.HttpApi.Client", "modules/blogging/src/Volo.Blogging.Admin.Web", + "modules/blogging/src/Volo.Blogging.Installer", "studio/source-codes/Volo.Blogging.SourceCode", # modules/client-simulation @@ -298,6 +313,7 @@ $projects = ( "modules/docs/src/Volo.Docs.HttpApi", "modules/docs/src/Volo.Docs.MongoDB", "modules/docs/src/Volo.Docs.Web", + "modules/docs/src/Volo.Docs.Installer", "studio/source-codes/Volo.Docs.SourceCode", # modules/feature-management @@ -350,6 +366,8 @@ $projects = ( "modules/openiddict/src/Volo.Abp.OpenIddict.EntityFrameworkCore", "modules/openiddict/src/Volo.Abp.OpenIddict.MongoDB", "modules/openiddict/src/Volo.Abp.PermissionManagement.Domain.OpenIddict", + "modules/openiddict/src/Volo.Abp.OpenIddict.Installer", + "studio/source-codes/Volo.Abp.OpenIddict.SourceCode", # modules/permission-management "modules/permission-management/src/Volo.Abp.PermissionManagement.Application.Contracts", @@ -447,12 +465,5 @@ $projects = ( "modules/cms-kit/src/Volo.CmsKit.Public.Web", "modules/cms-kit/src/Volo.CmsKit.Web", "modules/cms-kit/src/Volo.CmsKit.Installer", - "studio/source-codes/Volo.CmsKit.SourceCode", - - # abp/studio - "studio/src/Volo.Abp.Studio.Analyzing.Abstractions", - "studio/src/Volo.Abp.Studio.Domain.CommonServices", - "studio/src/Volo.Abp.Studio.Domain.Shared", - "studio/src/Volo.Abp.Studio.ModuleInstaller.Abstractions", - "studio/src/Volo.Abp.Studio.ModuleInstaller" + "studio/source-codes/Volo.CmsKit.SourceCode" ) diff --git a/studio/source-codes/Volo.Abp.Account.SourceCode/Volo.Abp.Account.SourceCode.zip b/studio/source-codes/Volo.Abp.Account.SourceCode/Volo.Abp.Account.SourceCode.zip index cf30aa9ec3..54a837fe33 100644 Binary files a/studio/source-codes/Volo.Abp.Account.SourceCode/Volo.Abp.Account.SourceCode.zip and b/studio/source-codes/Volo.Abp.Account.SourceCode/Volo.Abp.Account.SourceCode.zip differ diff --git a/studio/source-codes/Volo.Abp.AuditLogging.SourceCode/Volo.Abp.AuditLogging.SourceCode.zip b/studio/source-codes/Volo.Abp.AuditLogging.SourceCode/Volo.Abp.AuditLogging.SourceCode.zip index f82562f960..0b1dbf3956 100644 Binary files a/studio/source-codes/Volo.Abp.AuditLogging.SourceCode/Volo.Abp.AuditLogging.SourceCode.zip and b/studio/source-codes/Volo.Abp.AuditLogging.SourceCode/Volo.Abp.AuditLogging.SourceCode.zip differ diff --git a/studio/source-codes/Volo.Abp.BackgroundJobs.SourceCode/Volo.Abp.BackgroundJobs.SourceCode.zip b/studio/source-codes/Volo.Abp.BackgroundJobs.SourceCode/Volo.Abp.BackgroundJobs.SourceCode.zip index 9294e0a1c8..eb51cfbccd 100644 Binary files a/studio/source-codes/Volo.Abp.BackgroundJobs.SourceCode/Volo.Abp.BackgroundJobs.SourceCode.zip and b/studio/source-codes/Volo.Abp.BackgroundJobs.SourceCode/Volo.Abp.BackgroundJobs.SourceCode.zip differ diff --git a/studio/source-codes/Volo.Abp.BasicTheme.SourceCode/Volo.Abp.BasicTheme.SourceCode.zip b/studio/source-codes/Volo.Abp.BasicTheme.SourceCode/Volo.Abp.BasicTheme.SourceCode.zip index e038297de0..910f1d354c 100644 Binary files a/studio/source-codes/Volo.Abp.BasicTheme.SourceCode/Volo.Abp.BasicTheme.SourceCode.zip and b/studio/source-codes/Volo.Abp.BasicTheme.SourceCode/Volo.Abp.BasicTheme.SourceCode.zip differ diff --git a/studio/source-codes/Volo.Abp.BlobStoring.Database.SourceCode/FodyWeavers.xml b/studio/source-codes/Volo.Abp.BlobStoring.Database.SourceCode/FodyWeavers.xml deleted file mode 100644 index 00e1d9a1c1..0000000000 --- a/studio/source-codes/Volo.Abp.BlobStoring.Database.SourceCode/FodyWeavers.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/studio/source-codes/Volo.Abp.BlobStoring.Database.SourceCode/Volo.Abp.BlobStoring.Database.SourceCode.zip b/studio/source-codes/Volo.Abp.BlobStoring.Database.SourceCode/Volo.Abp.BlobStoring.Database.SourceCode.zip index 4b2654023d..415a243736 100644 Binary files a/studio/source-codes/Volo.Abp.BlobStoring.Database.SourceCode/Volo.Abp.BlobStoring.Database.SourceCode.zip and b/studio/source-codes/Volo.Abp.BlobStoring.Database.SourceCode/Volo.Abp.BlobStoring.Database.SourceCode.zip differ diff --git a/studio/source-codes/Volo.Abp.FeatureManagement.SourceCode/FodyWeavers.xml b/studio/source-codes/Volo.Abp.FeatureManagement.SourceCode/FodyWeavers.xml deleted file mode 100644 index 00e1d9a1c1..0000000000 --- a/studio/source-codes/Volo.Abp.FeatureManagement.SourceCode/FodyWeavers.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/studio/source-codes/Volo.Abp.FeatureManagement.SourceCode/Volo.Abp.FeatureManagement.SourceCode.zip b/studio/source-codes/Volo.Abp.FeatureManagement.SourceCode/Volo.Abp.FeatureManagement.SourceCode.zip index 327a5df956..74b652b4a2 100644 Binary files a/studio/source-codes/Volo.Abp.FeatureManagement.SourceCode/Volo.Abp.FeatureManagement.SourceCode.zip and b/studio/source-codes/Volo.Abp.FeatureManagement.SourceCode/Volo.Abp.FeatureManagement.SourceCode.zip differ diff --git a/studio/source-codes/Volo.Abp.Identity.SourceCode/FodyWeavers.xml b/studio/source-codes/Volo.Abp.Identity.SourceCode/FodyWeavers.xml deleted file mode 100644 index 00e1d9a1c1..0000000000 --- a/studio/source-codes/Volo.Abp.Identity.SourceCode/FodyWeavers.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/studio/source-codes/Volo.Abp.Identity.SourceCode/Volo.Abp.Identity.SourceCode.zip b/studio/source-codes/Volo.Abp.Identity.SourceCode/Volo.Abp.Identity.SourceCode.zip index ae71114583..a8f48f46dc 100644 Binary files a/studio/source-codes/Volo.Abp.Identity.SourceCode/Volo.Abp.Identity.SourceCode.zip and b/studio/source-codes/Volo.Abp.Identity.SourceCode/Volo.Abp.Identity.SourceCode.zip differ diff --git a/studio/source-codes/Volo.Abp.IdentityServer.SourceCode/FodyWeavers.xml b/studio/source-codes/Volo.Abp.IdentityServer.SourceCode/FodyWeavers.xml deleted file mode 100644 index 00e1d9a1c1..0000000000 --- a/studio/source-codes/Volo.Abp.IdentityServer.SourceCode/FodyWeavers.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/studio/source-codes/Volo.Abp.IdentityServer.SourceCode/Volo.Abp.IdentityServer.SourceCode.zip b/studio/source-codes/Volo.Abp.IdentityServer.SourceCode/Volo.Abp.IdentityServer.SourceCode.zip index d5121cc50f..b58c48d1c3 100644 Binary files a/studio/source-codes/Volo.Abp.IdentityServer.SourceCode/Volo.Abp.IdentityServer.SourceCode.zip and b/studio/source-codes/Volo.Abp.IdentityServer.SourceCode/Volo.Abp.IdentityServer.SourceCode.zip differ diff --git a/studio/source-codes/Volo.Abp.Studio.Open.SourceCode/Volo.Abp.Studio.Open.SourceCode.csproj b/studio/source-codes/Volo.Abp.OpenIddict.SourceCode/Volo.Abp.OpenIddict.SourceCode.csproj similarity index 74% rename from studio/source-codes/Volo.Abp.Studio.Open.SourceCode/Volo.Abp.Studio.Open.SourceCode.csproj rename to studio/source-codes/Volo.Abp.OpenIddict.SourceCode/Volo.Abp.OpenIddict.SourceCode.csproj index e9363c3d48..e44edc4033 100644 --- a/studio/source-codes/Volo.Abp.Studio.Open.SourceCode/Volo.Abp.Studio.Open.SourceCode.csproj +++ b/studio/source-codes/Volo.Abp.OpenIddict.SourceCode/Volo.Abp.OpenIddict.SourceCode.csproj @@ -8,8 +8,8 @@ - - + + true content\ diff --git a/studio/source-codes/Volo.Abp.OpenIddict.SourceCode/Volo.Abp.OpenIddict.SourceCode.zip b/studio/source-codes/Volo.Abp.OpenIddict.SourceCode/Volo.Abp.OpenIddict.SourceCode.zip new file mode 100644 index 0000000000..04b6ab1201 Binary files /dev/null and b/studio/source-codes/Volo.Abp.OpenIddict.SourceCode/Volo.Abp.OpenIddict.SourceCode.zip differ diff --git a/studio/source-codes/Volo.Abp.PermissionManagement.SourceCode/FodyWeavers.xml b/studio/source-codes/Volo.Abp.PermissionManagement.SourceCode/FodyWeavers.xml deleted file mode 100644 index 00e1d9a1c1..0000000000 --- a/studio/source-codes/Volo.Abp.PermissionManagement.SourceCode/FodyWeavers.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/studio/source-codes/Volo.Abp.PermissionManagement.SourceCode/Volo.Abp.PermissionManagement.SourceCode.zip b/studio/source-codes/Volo.Abp.PermissionManagement.SourceCode/Volo.Abp.PermissionManagement.SourceCode.zip index bdac13ec56..b9df9cf686 100644 Binary files a/studio/source-codes/Volo.Abp.PermissionManagement.SourceCode/Volo.Abp.PermissionManagement.SourceCode.zip and b/studio/source-codes/Volo.Abp.PermissionManagement.SourceCode/Volo.Abp.PermissionManagement.SourceCode.zip differ diff --git a/studio/source-codes/Volo.Abp.SettingManagement.SourceCode/FodyWeavers.xml b/studio/source-codes/Volo.Abp.SettingManagement.SourceCode/FodyWeavers.xml deleted file mode 100644 index 00e1d9a1c1..0000000000 --- a/studio/source-codes/Volo.Abp.SettingManagement.SourceCode/FodyWeavers.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/studio/source-codes/Volo.Abp.SettingManagement.SourceCode/FodyWeavers.xsd b/studio/source-codes/Volo.Abp.SettingManagement.SourceCode/FodyWeavers.xsd deleted file mode 100644 index 3f3946e282..0000000000 --- a/studio/source-codes/Volo.Abp.SettingManagement.SourceCode/FodyWeavers.xsd +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. - - - - - A comma-separated list of error codes that can be safely ignored in assembly verification. - - - - - 'false' to turn off automatic generation of the XML Schema file. - - - - - \ No newline at end of file diff --git a/studio/source-codes/Volo.Abp.SettingManagement.SourceCode/Volo.Abp.SettingManagement.SourceCode.zip b/studio/source-codes/Volo.Abp.SettingManagement.SourceCode/Volo.Abp.SettingManagement.SourceCode.zip index 1dd4c00df8..e8d67697af 100644 Binary files a/studio/source-codes/Volo.Abp.SettingManagement.SourceCode/Volo.Abp.SettingManagement.SourceCode.zip and b/studio/source-codes/Volo.Abp.SettingManagement.SourceCode/Volo.Abp.SettingManagement.SourceCode.zip differ diff --git a/studio/source-codes/Volo.Abp.Studio.Open.SourceCode/Volo.Abp.Studio.Open.SourceCode.zip b/studio/source-codes/Volo.Abp.Studio.Open.SourceCode/Volo.Abp.Studio.Open.SourceCode.zip deleted file mode 100644 index a7c058d457..0000000000 Binary files a/studio/source-codes/Volo.Abp.Studio.Open.SourceCode/Volo.Abp.Studio.Open.SourceCode.zip and /dev/null differ diff --git a/studio/source-codes/Volo.Abp.TenantManagement.SourceCode/FodyWeavers.xml b/studio/source-codes/Volo.Abp.TenantManagement.SourceCode/FodyWeavers.xml deleted file mode 100644 index 00e1d9a1c1..0000000000 --- a/studio/source-codes/Volo.Abp.TenantManagement.SourceCode/FodyWeavers.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/studio/source-codes/Volo.Abp.TenantManagement.SourceCode/FodyWeavers.xsd b/studio/source-codes/Volo.Abp.TenantManagement.SourceCode/FodyWeavers.xsd deleted file mode 100644 index 3f3946e282..0000000000 --- a/studio/source-codes/Volo.Abp.TenantManagement.SourceCode/FodyWeavers.xsd +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. - - - - - A comma-separated list of error codes that can be safely ignored in assembly verification. - - - - - 'false' to turn off automatic generation of the XML Schema file. - - - - - \ No newline at end of file diff --git a/studio/source-codes/Volo.Abp.TenantManagement.SourceCode/Volo.Abp.TenantManagement.SourceCode.zip b/studio/source-codes/Volo.Abp.TenantManagement.SourceCode/Volo.Abp.TenantManagement.SourceCode.zip index 995615e60a..c49b3572b0 100644 Binary files a/studio/source-codes/Volo.Abp.TenantManagement.SourceCode/Volo.Abp.TenantManagement.SourceCode.zip and b/studio/source-codes/Volo.Abp.TenantManagement.SourceCode/Volo.Abp.TenantManagement.SourceCode.zip differ diff --git a/studio/source-codes/Volo.Abp.Users.SourceCode/FodyWeavers.xml b/studio/source-codes/Volo.Abp.Users.SourceCode/FodyWeavers.xml deleted file mode 100644 index 00e1d9a1c1..0000000000 --- a/studio/source-codes/Volo.Abp.Users.SourceCode/FodyWeavers.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/studio/source-codes/Volo.Abp.Users.SourceCode/FodyWeavers.xsd b/studio/source-codes/Volo.Abp.Users.SourceCode/FodyWeavers.xsd deleted file mode 100644 index 3f3946e282..0000000000 --- a/studio/source-codes/Volo.Abp.Users.SourceCode/FodyWeavers.xsd +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. - - - - - A comma-separated list of error codes that can be safely ignored in assembly verification. - - - - - 'false' to turn off automatic generation of the XML Schema file. - - - - - \ No newline at end of file diff --git a/studio/source-codes/Volo.Abp.Users.SourceCode/Volo.Abp.Users.SourceCode.zip b/studio/source-codes/Volo.Abp.Users.SourceCode/Volo.Abp.Users.SourceCode.zip index 4051bd0f17..f7272c0adf 100644 Binary files a/studio/source-codes/Volo.Abp.Users.SourceCode/Volo.Abp.Users.SourceCode.zip and b/studio/source-codes/Volo.Abp.Users.SourceCode/Volo.Abp.Users.SourceCode.zip differ diff --git a/studio/source-codes/Volo.Abp.VirtualFileExplorer.SourceCode/FodyWeavers.xml b/studio/source-codes/Volo.Abp.VirtualFileExplorer.SourceCode/FodyWeavers.xml deleted file mode 100644 index 00e1d9a1c1..0000000000 --- a/studio/source-codes/Volo.Abp.VirtualFileExplorer.SourceCode/FodyWeavers.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/studio/source-codes/Volo.Abp.VirtualFileExplorer.SourceCode/FodyWeavers.xsd b/studio/source-codes/Volo.Abp.VirtualFileExplorer.SourceCode/FodyWeavers.xsd deleted file mode 100644 index 3f3946e282..0000000000 --- a/studio/source-codes/Volo.Abp.VirtualFileExplorer.SourceCode/FodyWeavers.xsd +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. - - - - - A comma-separated list of error codes that can be safely ignored in assembly verification. - - - - - 'false' to turn off automatic generation of the XML Schema file. - - - - - \ No newline at end of file diff --git a/studio/source-codes/Volo.Abp.VirtualFileExplorer.SourceCode/Volo.Abp.VirtualFileExplorer.SourceCode.zip b/studio/source-codes/Volo.Abp.VirtualFileExplorer.SourceCode/Volo.Abp.VirtualFileExplorer.SourceCode.zip index 96d43881d5..bd5500a0a4 100644 Binary files a/studio/source-codes/Volo.Abp.VirtualFileExplorer.SourceCode/Volo.Abp.VirtualFileExplorer.SourceCode.zip and b/studio/source-codes/Volo.Abp.VirtualFileExplorer.SourceCode/Volo.Abp.VirtualFileExplorer.SourceCode.zip differ diff --git a/studio/source-codes/Volo.Blogging.SourceCode/FodyWeavers.xml b/studio/source-codes/Volo.Blogging.SourceCode/FodyWeavers.xml deleted file mode 100644 index 00e1d9a1c1..0000000000 --- a/studio/source-codes/Volo.Blogging.SourceCode/FodyWeavers.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/studio/source-codes/Volo.Blogging.SourceCode/FodyWeavers.xsd b/studio/source-codes/Volo.Blogging.SourceCode/FodyWeavers.xsd deleted file mode 100644 index 3f3946e282..0000000000 --- a/studio/source-codes/Volo.Blogging.SourceCode/FodyWeavers.xsd +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. - - - - - A comma-separated list of error codes that can be safely ignored in assembly verification. - - - - - 'false' to turn off automatic generation of the XML Schema file. - - - - - \ No newline at end of file diff --git a/studio/source-codes/Volo.Blogging.SourceCode/Volo.Blogging.SourceCode.zip b/studio/source-codes/Volo.Blogging.SourceCode/Volo.Blogging.SourceCode.zip index 81871bcbb4..0ac2de98d8 100644 Binary files a/studio/source-codes/Volo.Blogging.SourceCode/Volo.Blogging.SourceCode.zip and b/studio/source-codes/Volo.Blogging.SourceCode/Volo.Blogging.SourceCode.zip differ diff --git a/studio/source-codes/Volo.ClientSimulation.SourceCode/Volo.ClientSimulation.SourceCode.csproj b/studio/source-codes/Volo.ClientSimulation.SourceCode/Volo.ClientSimulation.SourceCode.csproj deleted file mode 100644 index 1a687aea73..0000000000 --- a/studio/source-codes/Volo.ClientSimulation.SourceCode/Volo.ClientSimulation.SourceCode.csproj +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - net6.0 - - - - - - true - content\ - - - diff --git a/studio/source-codes/Volo.ClientSimulation.SourceCode/Volo.ClientSimulation.SourceCode.zip b/studio/source-codes/Volo.ClientSimulation.SourceCode/Volo.ClientSimulation.SourceCode.zip deleted file mode 100644 index 51b3f65082..0000000000 Binary files a/studio/source-codes/Volo.ClientSimulation.SourceCode/Volo.ClientSimulation.SourceCode.zip and /dev/null differ diff --git a/studio/source-codes/Volo.CmsKit.SourceCode/FodyWeavers.xml b/studio/source-codes/Volo.CmsKit.SourceCode/FodyWeavers.xml deleted file mode 100644 index 00e1d9a1c1..0000000000 --- a/studio/source-codes/Volo.CmsKit.SourceCode/FodyWeavers.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/studio/source-codes/Volo.CmsKit.SourceCode/FodyWeavers.xsd b/studio/source-codes/Volo.CmsKit.SourceCode/FodyWeavers.xsd deleted file mode 100644 index 3f3946e282..0000000000 --- a/studio/source-codes/Volo.CmsKit.SourceCode/FodyWeavers.xsd +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. - - - - - A comma-separated list of error codes that can be safely ignored in assembly verification. - - - - - 'false' to turn off automatic generation of the XML Schema file. - - - - - \ No newline at end of file diff --git a/studio/source-codes/Volo.CmsKit.SourceCode/Volo.CmsKit.SourceCode.zip b/studio/source-codes/Volo.CmsKit.SourceCode/Volo.CmsKit.SourceCode.zip index b144e0f18b..32e05d1f98 100644 Binary files a/studio/source-codes/Volo.CmsKit.SourceCode/Volo.CmsKit.SourceCode.zip and b/studio/source-codes/Volo.CmsKit.SourceCode/Volo.CmsKit.SourceCode.zip differ diff --git a/studio/source-codes/Volo.Docs.SourceCode/FodyWeavers.xml b/studio/source-codes/Volo.Docs.SourceCode/FodyWeavers.xml deleted file mode 100644 index 00e1d9a1c1..0000000000 --- a/studio/source-codes/Volo.Docs.SourceCode/FodyWeavers.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/studio/source-codes/Volo.Docs.SourceCode/FodyWeavers.xsd b/studio/source-codes/Volo.Docs.SourceCode/FodyWeavers.xsd deleted file mode 100644 index 3f3946e282..0000000000 --- a/studio/source-codes/Volo.Docs.SourceCode/FodyWeavers.xsd +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. - - - - - A comma-separated list of error codes that can be safely ignored in assembly verification. - - - - - 'false' to turn off automatic generation of the XML Schema file. - - - - - \ No newline at end of file diff --git a/studio/source-codes/Volo.Docs.SourceCode/Volo.Docs.SourceCode.zip b/studio/source-codes/Volo.Docs.SourceCode/Volo.Docs.SourceCode.zip index b05c56881f..4e49d8185a 100644 Binary files a/studio/source-codes/Volo.Docs.SourceCode/Volo.Docs.SourceCode.zip and b/studio/source-codes/Volo.Docs.SourceCode/Volo.Docs.SourceCode.zip differ diff --git a/studio/src/Volo.Abp.Studio.ModuleInstaller/Volo.Abp.Studio.ModuleInstaller.csproj b/studio/src/Volo.Abp.Studio.ModuleInstaller/Volo.Abp.Studio.ModuleInstaller.csproj index 2d3577e20f..e0ef26d462 100644 --- a/studio/src/Volo.Abp.Studio.ModuleInstaller/Volo.Abp.Studio.ModuleInstaller.csproj +++ b/studio/src/Volo.Abp.Studio.ModuleInstaller/Volo.Abp.Studio.ModuleInstaller.csproj @@ -3,7 +3,7 @@ - net5.0 + net6.0 true diff --git a/templates/app-nolayers/angular/package.json b/templates/app-nolayers/angular/package.json index 1b19989395..0623734b12 100644 --- a/templates/app-nolayers/angular/package.json +++ b/templates/app-nolayers/angular/package.json @@ -12,14 +12,14 @@ }, "private": true, "dependencies": { - "@abp/ng.account": "~5.3.0", - "@abp/ng.components": "~5.3.0", - "@abp/ng.core": "~5.3.0", - "@abp/ng.identity": "~5.3.0", - "@abp/ng.setting-management": "~5.3.0", - "@abp/ng.tenant-management": "~5.3.0", - "@abp/ng.theme.shared": "~5.3.0", - "@abp/ng.theme.lepton-x": "~1.0.0-beta.2", + "@abp/ng.account": "~6.0.0-rc.3", + "@abp/ng.components": "~6.0.0-rc.3", + "@abp/ng.core": "~6.0.0-rc.3", + "@abp/ng.identity": "~6.0.0-rc.3", + "@abp/ng.setting-management": "~6.0.0-rc.3", + "@abp/ng.tenant-management": "~6.0.0-rc.3", + "@abp/ng.theme.shared": "~6.0.0-rc.3", + "@abp/ng.theme.lepton-x": "~1.0.0-rc.3", "@angular/animations": "~13.1.1", "@angular/common": "~13.1.1", "@angular/compiler": "~13.1.1", @@ -35,7 +35,7 @@ "zone.js": "~0.11.4" }, "devDependencies": { - "@abp/ng.schematics": "~5.3.0", + "@abp/ng.schematics": "~6.0.0-rc.3", "@angular-devkit/build-angular": "~13.1.2", "@angular-eslint/builder": "~13.0.1", "@angular-eslint/eslint-plugin": "~13.0.1", diff --git a/templates/app-nolayers/angular/src/styles.scss b/templates/app-nolayers/angular/src/styles.scss index dbc4332587..efe57bd8c3 100644 --- a/templates/app-nolayers/angular/src/styles.scss +++ b/templates/app-nolayers/angular/src/styles.scss @@ -24,9 +24,3 @@ transform: translate(-50%, -50%); } } - -:root { - --lpx-logo: url('/assets/images/logo.png'); - --lpx-logo-icon: url('/assets/images/logo-icon.png'); - --lpx-brand: #edae53; -} \ No newline at end of file diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/Localization/MyProjectName/ar.json b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/Localization/MyProjectName/ar.json index 1ee94530fb..153f571276 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/Localization/MyProjectName/ar.json +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/Localization/MyProjectName/ar.json @@ -3,6 +3,6 @@ "texts": { "Welcome_Title": "مرحبا", "Welcome_Text": "هذا هو قالب بدء تشغيل تطبيق ذو طبقة واحدة مبسط لإطار عمل ABP.", - "Menu:Home": "الرئيسية" + "Menu:Home": "الصفحة الرئيسية" } } diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyCompanyName.MyProjectName.Blazor.Server.Mongo.csproj b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyCompanyName.MyProjectName.Blazor.Server.Mongo.csproj index 41ca3c0a32..b96ca830b6 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyCompanyName.MyProjectName.Blazor.Server.Mongo.csproj +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyCompanyName.MyProjectName.Blazor.Server.Mongo.csproj @@ -12,10 +12,17 @@ - + - - + + + + + + + + + @@ -56,10 +63,10 @@ - - - - + + + + diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyProjectNameModule.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyProjectNameModule.cs index 8edcb2b6c6..f234a8b833 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyProjectNameModule.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyProjectNameModule.cs @@ -1,10 +1,12 @@ using Blazorise.Bootstrap5; using Blazorise.Icons.FontAwesome; +using Microsoft.AspNetCore.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.OpenApi.Models; using MyCompanyName.MyProjectName.Data; using MyCompanyName.MyProjectName.Localization; using MyCompanyName.MyProjectName.Menus; +using OpenIddict.Validation.AspNetCore; using Volo.Abp; using Volo.Abp.Account; using Volo.Abp.Account.Web; @@ -137,7 +139,8 @@ public class MyProjectNameModule : AbpModule { context.Services.Replace(ServiceDescriptor.Singleton()); } - + + ConfigureAuthentication(context); ConfigureUrls(configuration); ConfigureBundles(); ConfigureAutoMapper(context); @@ -151,6 +154,11 @@ public class MyProjectNameModule : AbpModule ConfigureMongoDB(context); } + private void ConfigureAuthentication(ServiceConfigurationContext context) + { + context.Services.ForwardIdentityAuthenticationForBearer(OpenIddictValidationAspNetCoreDefaults.AuthenticationScheme); + } + private void ConfigureUrls(IConfiguration configuration) { Configure(options => diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/package.json b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/package.json index 21d924ec29..f5ca0ac67a 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/package.json +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/package.json @@ -3,7 +3,6 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "^1.0.0", - "@abp/aspnetcore.components.server.leptonxlitetheme": "^1.0.0" + "@abp/aspnetcore.components.server.leptonxlitetheme": "~1.0.0-rc.3" } } diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Localization/MyProjectName/ar.json b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Localization/MyProjectName/ar.json index 1ee94530fb..153f571276 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Localization/MyProjectName/ar.json +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Localization/MyProjectName/ar.json @@ -3,6 +3,6 @@ "texts": { "Welcome_Title": "مرحبا", "Welcome_Text": "هذا هو قالب بدء تشغيل تطبيق ذو طبقة واحدة مبسط لإطار عمل ABP.", - "Menu:Home": "الرئيسية" + "Menu:Home": "الصفحة الرئيسية" } } diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20220617083820_Initial.Designer.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20220825012458_Initial.Designer.cs similarity index 95% rename from templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20220617083820_Initial.Designer.cs rename to templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20220825012458_Initial.Designer.cs index 9e1a8f9cd8..5347dc149d 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20220617083820_Initial.Designer.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20220825012458_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Blazor.Server.Migrations { [DbContext(typeof(MyProjectNameDbContext))] - [Migration("20220617083820_Initial")] + [Migration("20220825012458_Initial")] partial class Initial { protected override void BuildTargetModel(ModelBuilder modelBuilder) @@ -1273,6 +1273,59 @@ namespace MyCompanyName.MyProjectName.Blazor.Server.Migrations b.ToTable("OpenIddictTokens", (string)null); }); + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("GroupName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("IsEnabled") + .HasColumnType("bit"); + + b.Property("MultiTenancySide") + .HasColumnType("tinyint"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ParentName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Providers") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("StateCheckers") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("GroupName"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpPermissions", (string)null); + }); + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGrant", b => { b.Property("Id") @@ -1307,6 +1360,34 @@ namespace MyCompanyName.MyProjectName.Blazor.Server.Migrations b.ToTable("AbpPermissionGrants", (string)null); }); + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGroupDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpPermissionGroups", (string)null); + }); + modelBuilder.Entity("Volo.Abp.SettingManagement.Setting", b => { b.Property("Id") diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20220617083820_Initial.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20220825012458_Initial.cs similarity index 94% rename from templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20220617083820_Initial.cs rename to templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20220825012458_Initial.cs index 85d36d8b57..13ecbb5be7 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20220617083820_Initial.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20220825012458_Initial.cs @@ -137,6 +137,40 @@ namespace MyCompanyName.MyProjectName.Blazor.Server.Migrations table.PrimaryKey("PK_AbpPermissionGrants", x => x.Id); }); + migrationBuilder.CreateTable( + name: "AbpPermissionGroups", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + DisplayName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpPermissionGroups", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpPermissions", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + GroupName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + ParentName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), + DisplayName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + IsEnabled = table.Column(type: "bit", nullable: false), + MultiTenancySide = table.Column(type: "tinyint", nullable: false), + Providers = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), + StateCheckers = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpPermissions", x => x.Id); + }); + migrationBuilder.CreateTable( name: "AbpRoles", columns: table => new @@ -714,6 +748,23 @@ namespace MyCompanyName.MyProjectName.Blazor.Server.Migrations unique: true, filter: "[TenantId] IS NOT NULL"); + migrationBuilder.CreateIndex( + name: "IX_AbpPermissionGroups_Name", + table: "AbpPermissionGroups", + column: "Name", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_AbpPermissions_GroupName", + table: "AbpPermissions", + column: "GroupName"); + + migrationBuilder.CreateIndex( + name: "IX_AbpPermissions_Name", + table: "AbpPermissions", + column: "Name", + unique: true); + migrationBuilder.CreateIndex( name: "IX_AbpRoleClaims_RoleId", table: "AbpRoleClaims", @@ -850,6 +901,12 @@ namespace MyCompanyName.MyProjectName.Blazor.Server.Migrations migrationBuilder.DropTable( name: "AbpPermissionGrants"); + migrationBuilder.DropTable( + name: "AbpPermissionGroups"); + + migrationBuilder.DropTable( + name: "AbpPermissions"); + migrationBuilder.DropTable( name: "AbpRoleClaims"); diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/MyProjectNameDbContextModelSnapshot.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/MyProjectNameDbContextModelSnapshot.cs index 0a32c8664e..d6c92decad 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/MyProjectNameDbContextModelSnapshot.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/MyProjectNameDbContextModelSnapshot.cs @@ -1271,6 +1271,59 @@ namespace MyCompanyName.MyProjectName.Blazor.Server.Migrations b.ToTable("OpenIddictTokens", (string)null); }); + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("GroupName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("IsEnabled") + .HasColumnType("bit"); + + b.Property("MultiTenancySide") + .HasColumnType("tinyint"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ParentName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Providers") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("StateCheckers") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("GroupName"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpPermissions", (string)null); + }); + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGrant", b => { b.Property("Id") @@ -1305,6 +1358,34 @@ namespace MyCompanyName.MyProjectName.Blazor.Server.Migrations b.ToTable("AbpPermissionGrants", (string)null); }); + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGroupDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpPermissionGroups", (string)null); + }); + modelBuilder.Entity("Volo.Abp.SettingManagement.Setting", b => { b.Property("Id") diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj index f132ca1ca3..b915262a65 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj @@ -12,10 +12,17 @@ - + - - + + + + + + + + + @@ -57,10 +64,10 @@ - - - - + + + + diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/MyProjectNameModule.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/MyProjectNameModule.cs index 72203cef02..6defe2cc2c 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/MyProjectNameModule.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/MyProjectNameModule.cs @@ -1,11 +1,14 @@ using Blazorise.Bootstrap5; using Blazorise.Icons.FontAwesome; +using Microsoft.AspNetCore.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.OpenApi.Models; using MyCompanyName.MyProjectName.Data; using MyCompanyName.MyProjectName.Localization; using MyCompanyName.MyProjectName.Menus; +using OpenIddict.Validation.AspNetCore; using Volo.Abp; +using Volo.Abp.Uow; using Volo.Abp.Account; using Volo.Abp.Account.Web; using Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite; @@ -62,7 +65,7 @@ namespace MyCompanyName.MyProjectName; typeof(AbpAspNetCoreSerilogModule), typeof(AbpAspNetCoreMvcUiLeptonXLiteThemeModule), typeof(AbpAspNetCoreComponentsServerLeptonXLiteThemeModule), - + // Account module packages typeof(AbpAccountApplicationModule), typeof(AbpAccountHttpApiModule), @@ -133,12 +136,13 @@ public class MyProjectNameModule : AbpModule { var hostingEnvironment = context.Services.GetHostingEnvironment(); var configuration = context.Services.GetConfiguration(); - + if (hostingEnvironment.IsDevelopment()) { context.Services.Replace(ServiceDescriptor.Singleton()); } + ConfigureAuthentication(context); ConfigureUrls(configuration); ConfigureBundles(); ConfigureAutoMapper(context); @@ -152,6 +156,11 @@ public class MyProjectNameModule : AbpModule ConfigureEfCore(context); } + private void ConfigureAuthentication(ServiceConfigurationContext context) + { + context.Services.ForwardIdentityAuthenticationForBearer(OpenIddictValidationAspNetCoreDefaults.AuthenticationScheme); + } + private void ConfigureUrls(IConfiguration configuration) { Configure(options => @@ -309,6 +318,13 @@ public class MyProjectNameModule : AbpModule configurationContext.UseSqlServer(); }); }); + + // + Configure(options => + { + options.TransactionBehavior = UnitOfWorkTransactionBehavior.Disabled; + }); + // } public override void OnApplicationInitialization(ApplicationInitializationContext context) diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/package.json b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/package.json index 21d924ec29..3b1f8217d6 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/package.json +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/package.json @@ -3,7 +3,7 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "^1.0.0", - "@abp/aspnetcore.components.server.leptonxlitetheme": "^1.0.0" + "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~1.0.0-rc.3", + "@abp/aspnetcore.components.server.leptonxlitetheme": "~1.0.0-rc.3" } } diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/Data/OpenIddictDataSeedContributor.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/Data/OpenIddictDataSeedContributor.cs index 23317f8aaf..429a83d562 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/Data/OpenIddictDataSeedContributor.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/Data/OpenIddictDataSeedContributor.cs @@ -198,6 +198,7 @@ public class OpenIddictDataSeedContributor : IDataSeedContributor, ITransientDep { application.Permissions.Add(OpenIddictConstants.Permissions.Endpoints.Token); application.Permissions.Add(OpenIddictConstants.Permissions.Endpoints.Revocation); + application.Permissions.Add(OpenIddictConstants.Permissions.Endpoints.Introspection); } if (grantType == OpenIddictConstants.GrantTypes.ClientCredentials) @@ -220,6 +221,12 @@ public class OpenIddictDataSeedContributor : IDataSeedContributor, ITransientDep application.Permissions.Add(OpenIddictConstants.Permissions.GrantTypes.RefreshToken); } + if (grantType == OpenIddictConstants.GrantTypes.DeviceCode) + { + application.Permissions.Add(OpenIddictConstants.Permissions.GrantTypes.DeviceCode); + application.Permissions.Add(OpenIddictConstants.Permissions.Endpoints.Device); + } + if (grantType == OpenIddictConstants.GrantTypes.Implicit) { application.Permissions.Add(OpenIddictConstants.Permissions.ResponseTypes.IdToken); diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/Localization/MyProjectName/ar.json b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/Localization/MyProjectName/ar.json index 1ee94530fb..153f571276 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/Localization/MyProjectName/ar.json +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/Localization/MyProjectName/ar.json @@ -3,6 +3,6 @@ "texts": { "Welcome_Title": "مرحبا", "Welcome_Text": "هذا هو قالب بدء تشغيل تطبيق ذو طبقة واحدة مبسط لإطار عمل ABP.", - "Menu:Home": "الرئيسية" + "Menu:Home": "الصفحة الرئيسية" } } diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/MyCompanyName.MyProjectName.Host.Mongo.csproj b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/MyCompanyName.MyProjectName.Host.Mongo.csproj index 2fa6956c31..6d700763c7 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/MyCompanyName.MyProjectName.Host.Mongo.csproj +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/MyCompanyName.MyProjectName.Host.Mongo.csproj @@ -48,9 +48,9 @@ - - - + + + @@ -64,7 +64,12 @@ - + + + + + + diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/MyProjectNameModule.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/MyProjectNameModule.cs index 62c14d681a..45e5006b8a 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/MyProjectNameModule.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/MyProjectNameModule.cs @@ -1,9 +1,11 @@ using Microsoft.AspNetCore.Cors; using Microsoft.AspNetCore.DataProtection; +using Microsoft.AspNetCore.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.OpenApi.Models; using MyCompanyName.MyProjectName.Data; using MyCompanyName.MyProjectName.Localization; +using OpenIddict.Validation.AspNetCore; using Volo.Abp; using Volo.Abp.Account; using Volo.Abp.Account.Web; @@ -120,12 +122,13 @@ public class MyProjectNameModule : AbpModule { var hostingEnvironment = context.Services.GetHostingEnvironment(); var configuration = context.Services.GetConfiguration(); - + if (hostingEnvironment.IsDevelopment()) { context.Services.Replace(ServiceDescriptor.Singleton()); } + ConfigureAuthentication(context); ConfigureBundles(); ConfigureMultiTenancy(); ConfigureUrls(configuration); @@ -139,6 +142,11 @@ public class MyProjectNameModule : AbpModule ConfigureMongoDB(context); } + private void ConfigureAuthentication(ServiceConfigurationContext context) + { + context.Services.ForwardIdentityAuthenticationForBearer(OpenIddictValidationAspNetCoreDefaults.AuthenticationScheme); + } + private void ConfigureBundles() { Configure(options => diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/package.json b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/package.json index 2ed9d9973a..5d61662903 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/package.json +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/package.json @@ -3,6 +3,6 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~1.0.0" + "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~1.0.0-rc.3" } } diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Data/OpenIddictDataSeedContributor.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Data/OpenIddictDataSeedContributor.cs index 23317f8aaf..429a83d562 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Data/OpenIddictDataSeedContributor.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Data/OpenIddictDataSeedContributor.cs @@ -198,6 +198,7 @@ public class OpenIddictDataSeedContributor : IDataSeedContributor, ITransientDep { application.Permissions.Add(OpenIddictConstants.Permissions.Endpoints.Token); application.Permissions.Add(OpenIddictConstants.Permissions.Endpoints.Revocation); + application.Permissions.Add(OpenIddictConstants.Permissions.Endpoints.Introspection); } if (grantType == OpenIddictConstants.GrantTypes.ClientCredentials) @@ -220,6 +221,12 @@ public class OpenIddictDataSeedContributor : IDataSeedContributor, ITransientDep application.Permissions.Add(OpenIddictConstants.Permissions.GrantTypes.RefreshToken); } + if (grantType == OpenIddictConstants.GrantTypes.DeviceCode) + { + application.Permissions.Add(OpenIddictConstants.Permissions.GrantTypes.DeviceCode); + application.Permissions.Add(OpenIddictConstants.Permissions.Endpoints.Device); + } + if (grantType == OpenIddictConstants.GrantTypes.Implicit) { application.Permissions.Add(OpenIddictConstants.Permissions.ResponseTypes.IdToken); diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Localization/MyProjectName/ar.json b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Localization/MyProjectName/ar.json index 1ee94530fb..153f571276 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Localization/MyProjectName/ar.json +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Localization/MyProjectName/ar.json @@ -3,6 +3,6 @@ "texts": { "Welcome_Title": "مرحبا", "Welcome_Text": "هذا هو قالب بدء تشغيل تطبيق ذو طبقة واحدة مبسط لإطار عمل ABP.", - "Menu:Home": "الرئيسية" + "Menu:Home": "الصفحة الرئيسية" } } diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20220617083539_Initial.Designer.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20220825012635_Initial.Designer.cs similarity index 95% rename from templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20220617083539_Initial.Designer.cs rename to templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20220825012635_Initial.Designer.cs index 5b55ca75a9..0c525e8471 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20220617083539_Initial.Designer.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20220825012635_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Host.Migrations { [DbContext(typeof(MyProjectNameDbContext))] - [Migration("20220617083539_Initial")] + [Migration("20220825012635_Initial")] partial class Initial { protected override void BuildTargetModel(ModelBuilder modelBuilder) @@ -1273,6 +1273,59 @@ namespace MyCompanyName.MyProjectName.Host.Migrations b.ToTable("OpenIddictTokens", (string)null); }); + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("GroupName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("IsEnabled") + .HasColumnType("bit"); + + b.Property("MultiTenancySide") + .HasColumnType("tinyint"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ParentName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Providers") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("StateCheckers") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("GroupName"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpPermissions", (string)null); + }); + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGrant", b => { b.Property("Id") @@ -1307,6 +1360,34 @@ namespace MyCompanyName.MyProjectName.Host.Migrations b.ToTable("AbpPermissionGrants", (string)null); }); + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGroupDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpPermissionGroups", (string)null); + }); + modelBuilder.Entity("Volo.Abp.SettingManagement.Setting", b => { b.Property("Id") diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20220617083539_Initial.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20220825012635_Initial.cs similarity index 94% rename from templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20220617083539_Initial.cs rename to templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20220825012635_Initial.cs index 29cc53b046..8342507d18 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20220617083539_Initial.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20220825012635_Initial.cs @@ -137,6 +137,40 @@ namespace MyCompanyName.MyProjectName.Host.Migrations table.PrimaryKey("PK_AbpPermissionGrants", x => x.Id); }); + migrationBuilder.CreateTable( + name: "AbpPermissionGroups", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + DisplayName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpPermissionGroups", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpPermissions", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + GroupName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + ParentName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), + DisplayName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + IsEnabled = table.Column(type: "bit", nullable: false), + MultiTenancySide = table.Column(type: "tinyint", nullable: false), + Providers = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), + StateCheckers = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpPermissions", x => x.Id); + }); + migrationBuilder.CreateTable( name: "AbpRoles", columns: table => new @@ -714,6 +748,23 @@ namespace MyCompanyName.MyProjectName.Host.Migrations unique: true, filter: "[TenantId] IS NOT NULL"); + migrationBuilder.CreateIndex( + name: "IX_AbpPermissionGroups_Name", + table: "AbpPermissionGroups", + column: "Name", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_AbpPermissions_GroupName", + table: "AbpPermissions", + column: "GroupName"); + + migrationBuilder.CreateIndex( + name: "IX_AbpPermissions_Name", + table: "AbpPermissions", + column: "Name", + unique: true); + migrationBuilder.CreateIndex( name: "IX_AbpRoleClaims_RoleId", table: "AbpRoleClaims", @@ -850,6 +901,12 @@ namespace MyCompanyName.MyProjectName.Host.Migrations migrationBuilder.DropTable( name: "AbpPermissionGrants"); + migrationBuilder.DropTable( + name: "AbpPermissionGroups"); + + migrationBuilder.DropTable( + name: "AbpPermissions"); + migrationBuilder.DropTable( name: "AbpRoleClaims"); diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/MyProjectNameDbContextModelSnapshot.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/MyProjectNameDbContextModelSnapshot.cs index 2597920679..7360423342 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/MyProjectNameDbContextModelSnapshot.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/MyProjectNameDbContextModelSnapshot.cs @@ -1271,6 +1271,59 @@ namespace MyCompanyName.MyProjectName.Host.Migrations b.ToTable("OpenIddictTokens", (string)null); }); + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("GroupName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("IsEnabled") + .HasColumnType("bit"); + + b.Property("MultiTenancySide") + .HasColumnType("tinyint"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ParentName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Providers") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("StateCheckers") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("GroupName"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpPermissions", (string)null); + }); + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGrant", b => { b.Property("Id") @@ -1305,6 +1358,34 @@ namespace MyCompanyName.MyProjectName.Host.Migrations b.ToTable("AbpPermissionGrants", (string)null); }); + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGroupDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpPermissionGroups", (string)null); + }); + modelBuilder.Entity("Volo.Abp.SettingManagement.Setting", b => { b.Property("Id") diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/MyCompanyName.MyProjectName.Host.csproj b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/MyCompanyName.MyProjectName.Host.csproj index 86b9f762ec..782a0b7afb 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/MyCompanyName.MyProjectName.Host.csproj +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/MyCompanyName.MyProjectName.Host.csproj @@ -49,9 +49,9 @@ - - - + + + @@ -65,7 +65,12 @@ - + + + + + + diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/MyProjectNameModule.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/MyProjectNameModule.cs index 4db85902c2..16ef3cf47b 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/MyProjectNameModule.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/MyProjectNameModule.cs @@ -1,10 +1,13 @@ using Microsoft.AspNetCore.Cors; using Microsoft.AspNetCore.DataProtection; +using Microsoft.AspNetCore.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.OpenApi.Models; using MyCompanyName.MyProjectName.Data; using MyCompanyName.MyProjectName.Localization; +using OpenIddict.Validation.AspNetCore; using Volo.Abp; +using Volo.Abp.Uow; using Volo.Abp.Account; using Volo.Abp.Account.Web; using Volo.Abp.AspNetCore.MultiTenancy; @@ -122,12 +125,13 @@ public class MyProjectNameModule : AbpModule { var hostingEnvironment = context.Services.GetHostingEnvironment(); var configuration = context.Services.GetConfiguration(); - + if (hostingEnvironment.IsDevelopment()) { context.Services.Replace(ServiceDescriptor.Singleton()); } + ConfigureAuthentication(context); ConfigureBundles(); ConfigureMultiTenancy(); ConfigureUrls(configuration); @@ -141,6 +145,11 @@ public class MyProjectNameModule : AbpModule ConfigureEfCore(context); } + private void ConfigureAuthentication(ServiceConfigurationContext context) + { + context.Services.ForwardIdentityAuthenticationForBearer(OpenIddictValidationAspNetCoreDefaults.AuthenticationScheme); + } + private void ConfigureBundles() { Configure(options => @@ -306,6 +315,13 @@ public class MyProjectNameModule : AbpModule configurationContext.UseSqlServer(); }); }); + + // + Configure(options => + { + options.TransactionBehavior = UnitOfWorkTransactionBehavior.Disabled; + }); + // } public override void OnApplicationInitialization(ApplicationInitializationContext context) diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/package.json b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/package.json index 2ed9d9973a..5d61662903 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/package.json +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/package.json @@ -3,6 +3,6 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~1.0.0" + "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~1.0.0-rc.3" } } diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/Localization/MyProjectName/ar.json b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/Localization/MyProjectName/ar.json index 1ee94530fb..153f571276 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/Localization/MyProjectName/ar.json +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/Localization/MyProjectName/ar.json @@ -3,6 +3,6 @@ "texts": { "Welcome_Title": "مرحبا", "Welcome_Text": "هذا هو قالب بدء تشغيل تطبيق ذو طبقة واحدة مبسط لإطار عمل ABP.", - "Menu:Home": "الرئيسية" + "Menu:Home": "الصفحة الرئيسية" } } diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/MyCompanyName.MyProjectName.Mvc.Mongo.csproj b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/MyCompanyName.MyProjectName.Mvc.Mongo.csproj index 7593435403..694178b55b 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/MyCompanyName.MyProjectName.Mvc.Mongo.csproj +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/MyCompanyName.MyProjectName.Mvc.Mongo.csproj @@ -10,9 +10,14 @@ - + - + + + + + + @@ -53,10 +58,10 @@ - - - - + + + + diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/MyProjectNameModule.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/MyProjectNameModule.cs index 389597c523..f097d8d434 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/MyProjectNameModule.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/MyProjectNameModule.cs @@ -1,8 +1,10 @@ -using Microsoft.Extensions.DependencyInjection.Extensions; +using Microsoft.AspNetCore.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.OpenApi.Models; using MyCompanyName.MyProjectName.Data; using MyCompanyName.MyProjectName.Localization; using MyCompanyName.MyProjectName.Menus; +using OpenIddict.Validation.AspNetCore; using Volo.Abp; using Volo.Abp.Account; using Volo.Abp.Account.Web; @@ -56,7 +58,7 @@ namespace MyCompanyName.MyProjectName; typeof(AbpSwashbuckleModule), typeof(AbpAspNetCoreSerilogModule), typeof(AbpAspNetCoreMvcUiLeptonXLiteThemeModule), - + // Account module packages typeof(AbpAccountApplicationModule), typeof(AbpAccountHttpApiModule), @@ -126,12 +128,13 @@ public class MyProjectNameModule : AbpModule { var hostingEnvironment = context.Services.GetHostingEnvironment(); var configuration = context.Services.GetConfiguration(); - + if (hostingEnvironment.IsDevelopment()) { context.Services.Replace(ServiceDescriptor.Singleton()); } + ConfigureAuthentication(context); ConfigureMultiTenancy(); ConfigureUrls(configuration); ConfigureBundles(); @@ -144,6 +147,11 @@ public class MyProjectNameModule : AbpModule ConfigureMongoDB(context); } + private void ConfigureAuthentication(ServiceConfigurationContext context) + { + context.Services.ForwardIdentityAuthenticationForBearer(OpenIddictValidationAspNetCoreDefaults.AuthenticationScheme); + } + private void ConfigureMultiTenancy() { Configure(options => diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/package.json b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/package.json index 2ed9d9973a..5d61662903 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/package.json +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/package.json @@ -3,6 +3,6 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~1.0.0" + "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~1.0.0-rc.3" } } diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Localization/MyProjectName/ar.json b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Localization/MyProjectName/ar.json index 1ee94530fb..153f571276 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Localization/MyProjectName/ar.json +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Localization/MyProjectName/ar.json @@ -3,6 +3,6 @@ "texts": { "Welcome_Title": "مرحبا", "Welcome_Text": "هذا هو قالب بدء تشغيل تطبيق ذو طبقة واحدة مبسط لإطار عمل ABP.", - "Menu:Home": "الرئيسية" + "Menu:Home": "الصفحة الرئيسية" } } diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20220617083649_Initial.Designer.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20220825012450_Initial.Designer.cs similarity index 95% rename from templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20220617083649_Initial.Designer.cs rename to templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20220825012450_Initial.Designer.cs index 213ce02572..94f77b9938 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20220617083649_Initial.Designer.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20220825012450_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Mvc.Migrations { [DbContext(typeof(MyProjectNameDbContext))] - [Migration("20220617083649_Initial")] + [Migration("20220825012450_Initial")] partial class Initial { protected override void BuildTargetModel(ModelBuilder modelBuilder) @@ -1273,6 +1273,59 @@ namespace MyCompanyName.MyProjectName.Mvc.Migrations b.ToTable("OpenIddictTokens", (string)null); }); + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("GroupName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("IsEnabled") + .HasColumnType("bit"); + + b.Property("MultiTenancySide") + .HasColumnType("tinyint"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ParentName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Providers") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("StateCheckers") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("GroupName"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpPermissions", (string)null); + }); + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGrant", b => { b.Property("Id") @@ -1307,6 +1360,34 @@ namespace MyCompanyName.MyProjectName.Mvc.Migrations b.ToTable("AbpPermissionGrants", (string)null); }); + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGroupDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpPermissionGroups", (string)null); + }); + modelBuilder.Entity("Volo.Abp.SettingManagement.Setting", b => { b.Property("Id") diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20220617083649_Initial.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20220825012450_Initial.cs similarity index 94% rename from templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20220617083649_Initial.cs rename to templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20220825012450_Initial.cs index 2a30fba759..df71202963 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20220617083649_Initial.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20220825012450_Initial.cs @@ -137,6 +137,40 @@ namespace MyCompanyName.MyProjectName.Mvc.Migrations table.PrimaryKey("PK_AbpPermissionGrants", x => x.Id); }); + migrationBuilder.CreateTable( + name: "AbpPermissionGroups", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + DisplayName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpPermissionGroups", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpPermissions", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + GroupName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + ParentName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), + DisplayName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + IsEnabled = table.Column(type: "bit", nullable: false), + MultiTenancySide = table.Column(type: "tinyint", nullable: false), + Providers = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), + StateCheckers = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpPermissions", x => x.Id); + }); + migrationBuilder.CreateTable( name: "AbpRoles", columns: table => new @@ -714,6 +748,23 @@ namespace MyCompanyName.MyProjectName.Mvc.Migrations unique: true, filter: "[TenantId] IS NOT NULL"); + migrationBuilder.CreateIndex( + name: "IX_AbpPermissionGroups_Name", + table: "AbpPermissionGroups", + column: "Name", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_AbpPermissions_GroupName", + table: "AbpPermissions", + column: "GroupName"); + + migrationBuilder.CreateIndex( + name: "IX_AbpPermissions_Name", + table: "AbpPermissions", + column: "Name", + unique: true); + migrationBuilder.CreateIndex( name: "IX_AbpRoleClaims_RoleId", table: "AbpRoleClaims", @@ -850,6 +901,12 @@ namespace MyCompanyName.MyProjectName.Mvc.Migrations migrationBuilder.DropTable( name: "AbpPermissionGrants"); + migrationBuilder.DropTable( + name: "AbpPermissionGroups"); + + migrationBuilder.DropTable( + name: "AbpPermissions"); + migrationBuilder.DropTable( name: "AbpRoleClaims"); diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/MyProjectNameDbContextModelSnapshot.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/MyProjectNameDbContextModelSnapshot.cs index 350f086968..80d24ed8d2 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/MyProjectNameDbContextModelSnapshot.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/MyProjectNameDbContextModelSnapshot.cs @@ -1271,6 +1271,59 @@ namespace MyCompanyName.MyProjectName.Mvc.Migrations b.ToTable("OpenIddictTokens", (string)null); }); + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("GroupName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("IsEnabled") + .HasColumnType("bit"); + + b.Property("MultiTenancySide") + .HasColumnType("tinyint"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ParentName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Providers") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("StateCheckers") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("GroupName"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpPermissions", (string)null); + }); + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGrant", b => { b.Property("Id") @@ -1305,6 +1358,34 @@ namespace MyCompanyName.MyProjectName.Mvc.Migrations b.ToTable("AbpPermissionGrants", (string)null); }); + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGroupDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpPermissionGroups", (string)null); + }); + modelBuilder.Entity("Volo.Abp.SettingManagement.Setting", b => { b.Property("Id") diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/MyCompanyName.MyProjectName.Mvc.csproj b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/MyCompanyName.MyProjectName.Mvc.csproj index 1bf1cf825a..d942bd74a0 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/MyCompanyName.MyProjectName.Mvc.csproj +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/MyCompanyName.MyProjectName.Mvc.csproj @@ -10,9 +10,14 @@ - + - + + + + + + @@ -54,10 +59,10 @@ - - - - + + + + diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/MyProjectNameModule.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/MyProjectNameModule.cs index 976f91bf46..8b661a5d76 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/MyProjectNameModule.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/MyProjectNameModule.cs @@ -1,9 +1,12 @@ -using Microsoft.Extensions.DependencyInjection.Extensions; +using Microsoft.AspNetCore.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.OpenApi.Models; using MyCompanyName.MyProjectName.Data; using MyCompanyName.MyProjectName.Localization; using MyCompanyName.MyProjectName.Menus; +using OpenIddict.Validation.AspNetCore; using Volo.Abp; +using Volo.Abp.Uow; using Volo.Abp.Account; using Volo.Abp.Account.Web; using Volo.Abp.AspNetCore.Mvc; @@ -127,12 +130,13 @@ public class MyProjectNameModule : AbpModule { var hostingEnvironment = context.Services.GetHostingEnvironment(); var configuration = context.Services.GetConfiguration(); - + if (hostingEnvironment.IsDevelopment()) { context.Services.Replace(ServiceDescriptor.Singleton()); } + ConfigureAuthentication(context); ConfigureMultiTenancy(); ConfigureUrls(configuration); ConfigureBundles(); @@ -145,6 +149,11 @@ public class MyProjectNameModule : AbpModule ConfigureEfCore(context); } + private void ConfigureAuthentication(ServiceConfigurationContext context) + { + context.Services.ForwardIdentityAuthenticationForBearer(OpenIddictValidationAspNetCoreDefaults.AuthenticationScheme); + } + private void ConfigureMultiTenancy() { Configure(options => @@ -287,6 +296,13 @@ public class MyProjectNameModule : AbpModule configurationContext.UseSqlServer(); }); }); + + // + Configure(options => + { + options.TransactionBehavior = UnitOfWorkTransactionBehavior.Disabled; + }); + // } public override void OnApplicationInitialization(ApplicationInitializationContext context) diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/package.json b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/package.json index 2ed9d9973a..5d61662903 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/package.json +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/package.json @@ -3,6 +3,6 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~1.0.0" + "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~1.0.0-rc.3" } } diff --git a/templates/app/angular/package.json b/templates/app/angular/package.json index 12f3575a0f..fbd8cfde72 100644 --- a/templates/app/angular/package.json +++ b/templates/app/angular/package.json @@ -12,14 +12,14 @@ }, "private": true, "dependencies": { - "@abp/ng.account": "~5.3.0", - "@abp/ng.components": "~5.3.0", - "@abp/ng.core": "~5.3.0", - "@abp/ng.identity": "~5.3.0", - "@abp/ng.setting-management": "~5.3.0", - "@abp/ng.tenant-management": "~5.3.0", - "@abp/ng.theme.shared": "~5.3.0", - "@abp/ng.theme.lepton-x": "~1.0.0-beta.2", + "@abp/ng.account": "~6.0.0-rc.3", + "@abp/ng.components": "~6.0.0-rc.3", + "@abp/ng.core": "~6.0.0-rc.3", + "@abp/ng.identity": "~6.0.0-rc.3", + "@abp/ng.setting-management": "~6.0.0-rc.3", + "@abp/ng.tenant-management": "~6.0.0-rc.3", + "@abp/ng.theme.shared": "~6.0.0-rc.3", + "@abp/ng.theme.lepton-x": "~1.0.0-rc.3", "@angular/animations": "~13.3.3", "@angular/common": "~13.3.3", "@angular/compiler": "~13.3.3", @@ -35,7 +35,7 @@ "zone.js": "~0.11.4" }, "devDependencies": { - "@abp/ng.schematics": "~5.3.0", + "@abp/ng.schematics": "~6.0.0-rc.3", "@angular-devkit/build-angular": "~13.3.3", "@angular-eslint/builder": "~13.2.1", "@angular-eslint/eslint-plugin": "~13.2.1", diff --git a/templates/app/angular/src/styles.scss b/templates/app/angular/src/styles.scss index 14d29fc69b..efe57bd8c3 100644 --- a/templates/app/angular/src/styles.scss +++ b/templates/app/angular/src/styles.scss @@ -24,9 +24,3 @@ transform: translate(-50%, -50%); } } - -:root { - --lpx-logo: url('/assets/images/logo.png'); - --lpx-logo-icon: url('/assets/images/logo-icon.png'); - --lpx-brand: #edae53; -} \ No newline at end of file diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/MyCompanyName.MyProjectName.AuthServer.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/MyCompanyName.MyProjectName.AuthServer.csproj index 9d012f8de6..47e3d8abfc 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/MyCompanyName.MyProjectName.AuthServer.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/MyCompanyName.MyProjectName.AuthServer.csproj @@ -34,15 +34,22 @@ + - + - + + + + + + + diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/MyProjectNameAuthServerModule.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/MyProjectNameAuthServerModule.cs index 9a6e49e32a..d072fee3d5 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/MyProjectNameAuthServerModule.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/MyProjectNameAuthServerModule.cs @@ -2,6 +2,8 @@ using System; using System.IO; using System.Linq; using Localization.Resources.AbpUi; +using Medallion.Threading; +using Medallion.Threading.Redis; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Cors; using Microsoft.AspNetCore.DataProtection; @@ -26,6 +28,7 @@ using Volo.Abp.Autofac; using Volo.Abp.BackgroundJobs; using Volo.Abp.Caching; using Volo.Abp.Caching.StackExchangeRedis; +using Volo.Abp.DistributedLocking; using Volo.Abp.Localization; using Volo.Abp.Modularity; using Volo.Abp.UI.Navigation.Urls; @@ -37,6 +40,7 @@ namespace MyCompanyName.MyProjectName; [DependsOn( typeof(AbpAutofacModule), typeof(AbpCachingStackExchangeRedisModule), + typeof(AbpDistributedLockingModule), typeof(AbpAccountWebOpenIddictModule), typeof(AbpAccountApplicationModule), typeof(AbpAccountHttpApiModule), @@ -153,6 +157,13 @@ public class MyProjectNameAuthServerModule : AbpModule var redis = ConnectionMultiplexer.Connect(configuration["Redis:Configuration"]); dataProtectionBuilder.PersistKeysToStackExchangeRedis(redis, "MyProjectName-Protection-Keys"); } + + context.Services.AddSingleton(sp => + { + var connection = ConnectionMultiplexer + .Connect(configuration["Redis:Configuration"]); + return new RedisDistributedSynchronizationProvider(connection.GetDatabase()); + }); context.Services.AddCors(options => { @@ -196,7 +207,8 @@ public class MyProjectNameAuthServerModule : AbpModule app.UseRouting(); app.UseCors(); app.UseAuthentication(); - + app.UseAbpOpenIddictValidation(); + if (MultiTenancyConsts.IsEnabled) { app.UseMultiTenancy(); diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/Pages/Index.cshtml.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/Pages/Index.cshtml.cs index 8e31fb91f1..f5fef94c78 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/Pages/Index.cshtml.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/Pages/Index.cshtml.cs @@ -1,6 +1,5 @@ using System.Collections.Generic; using System.Globalization; -using System.Threading; using System.Threading.Tasks; using Volo.Abp.AspNetCore.Mvc.UI.RazorPages; using Volo.Abp.Localization; diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/package.json b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/package.json index d356b498f3..6ced480563 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/package.json +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/package.json @@ -3,6 +3,6 @@ "name": "my-app-authserver", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "^1.0.0" + "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~1.0.0-rc.3" } } diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/yarn.lock b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/yarn.lock index f531fff53b..5b61c2ef9d 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/yarn.lock +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/yarn.lock @@ -2,37 +2,37 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@^5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-5.3.0-rc.1.tgz#dc27eb79ba7353eb6b16e4a2f50d17c3cfc9157d" - integrity sha512-TEbz/ISsGhfTec66XSeivQjCOCpTidufdpZmj8JRyrbQvhXOYohJs3ImrGJOIxUwo6nuzagGpotqXryjIF+jrg== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~5.3.0-rc.1" - -"@abp/aspnetcore.mvc.ui.theme.shared@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-5.3.0-rc.1.tgz#ed993befe99682baee55ea8771f983980ba8f93f" - integrity sha512-kL4CXe0YoZ4wJ4XvutqLPkv4fMuFeRJFzdix6lx4dPAArnPu69n3P4qFhokPkcoGpB2KTRqyn9fHQs8g2FCGQw== - dependencies: - "@abp/aspnetcore.mvc.ui" "~5.3.0-rc.1" - "@abp/bootstrap" "~5.3.0-rc.1" - "@abp/bootstrap-datepicker" "~5.3.0-rc.1" - "@abp/datatables.net-bs5" "~5.3.0-rc.1" - "@abp/font-awesome" "~5.3.0-rc.1" - "@abp/jquery-form" "~5.3.0-rc.1" - "@abp/jquery-validation-unobtrusive" "~5.3.0-rc.1" - "@abp/lodash" "~5.3.0-rc.1" - "@abp/luxon" "~5.3.0-rc.1" - "@abp/malihu-custom-scrollbar-plugin" "~5.3.0-rc.1" - "@abp/select2" "~5.3.0-rc.1" - "@abp/sweetalert2" "~5.3.0-rc.1" - "@abp/timeago" "~5.3.0-rc.1" - "@abp/toastr" "~5.3.0-rc.1" - -"@abp/aspnetcore.mvc.ui@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-5.3.0-rc.1.tgz#5205d3a5ea500ff3b8d525dcc11a2ce4cfccdfd3" - integrity sha512-mIefq3QSVtP7heNl0ocHiSKLU+DwN5/TDvvPj2L3IZkCzuOrDxoBUIBIciea4k10HIQzqo6gmm1YOw0CEfzNHg== +"@abp/aspnetcore.mvc.ui.theme.leptonxlite@~1.0.0-rc.3": + version "1.0.0-rc.3" + resolved "https://www.myget.org/F/abp-nightly/npm/@abp/aspnetcore.mvc.ui.theme.leptonxlite/-/@abp/aspnetcore.mvc.ui.theme.leptonxlite-1.0.0-rc.3.tgz#15a0f2106284964c91af7f78be28427a430d9bd4" + integrity sha1-FaDyEGKElkyRr394vihCekMNm9Q= + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~6.0.0-rc.1" + +"@abp/aspnetcore.mvc.ui.theme.shared@~6.0.0-rc.1": + version "6.0.0-rc.1" + resolved "https://www.myget.org/F/abp-nightly/npm/@abp/aspnetcore.mvc.ui.theme.shared/-/@abp/aspnetcore.mvc.ui.theme.shared-6.0.0-rc.1.tgz#5b0afe34c485f8e11ef21b0bce86e231602d8c1b" + integrity sha1-Wwr+NMSF+OEe8hsLzobiMWAtjBs= + dependencies: + "@abp/aspnetcore.mvc.ui" "~6.0.0-rc.1" + "@abp/bootstrap" "~6.0.0-rc.1" + "@abp/bootstrap-datepicker" "~6.0.0-rc.1" + "@abp/datatables.net-bs5" "~6.0.0-rc.1" + "@abp/font-awesome" "~6.0.0-rc.1" + "@abp/jquery-form" "~6.0.0-rc.1" + "@abp/jquery-validation-unobtrusive" "~6.0.0-rc.1" + "@abp/lodash" "~6.0.0-rc.1" + "@abp/luxon" "~6.0.0-rc.1" + "@abp/malihu-custom-scrollbar-plugin" "~6.0.0-rc.1" + "@abp/select2" "~6.0.0-rc.1" + "@abp/sweetalert2" "~6.0.0-rc.1" + "@abp/timeago" "~6.0.0-rc.1" + "@abp/toastr" "~6.0.0-rc.1" + +"@abp/aspnetcore.mvc.ui@~6.0.0-rc.1": + version "6.0.0-rc.1" + resolved "https://www.myget.org/F/abp-nightly/npm/@abp/aspnetcore.mvc.ui/-/@abp/aspnetcore.mvc.ui-6.0.0-rc.1.tgz#cec27a35b336ef8319308ac24995def0f26e00be" + integrity sha1-zsJ6NbM274MZMIrCSZXe8PJuAL4= dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -41,144 +41,144 @@ merge-stream "^2.0.0" micromatch "^4.0.2" -"@abp/bootstrap-datepicker@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-5.3.0-rc.1.tgz#1a5a29d7f9904e8d99c7085bc4545ad2665195cb" - integrity sha512-Y5QLLNd2UpbzbWSh+5nKdpAdz2i3V8+feTHTpAxnPgYRabPGqAFiOrty8KZ1MJEgjQFWC1ypGHYII7GWVyIS6Q== +"@abp/bootstrap-datepicker@~6.0.0-rc.1": + version "6.0.0-rc.1" + resolved "https://www.myget.org/F/abp-nightly/npm/@abp/bootstrap-datepicker/-/@abp/bootstrap-datepicker-6.0.0-rc.1.tgz#33bd5d9e1d6b351eb1e7a278ccd9a79db119e461" + integrity sha1-M71dnh1rNR6x56J4zNmnnbEZ5GE= dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-5.3.0-rc.1.tgz#977d579f59e18b1eb2c9b43612d525a859a575a4" - integrity sha512-dpY0bPHdhUI5yL23+EsR6w/KjoPyehaEgHLLKQDERdubX1Zk/SDWrhrYXnXxtJ0fvxG2aRVOEBMULmHD3m/PoA== +"@abp/bootstrap@~6.0.0-rc.1": + version "6.0.0-rc.1" + resolved "https://www.myget.org/F/abp-nightly/npm/@abp/bootstrap/-/@abp/bootstrap-6.0.0-rc.1.tgz#c6f64f1f34870b75da623ed9cee7b3b1159611fc" + integrity sha1-xvZPHzSHC3XaYj7ZzuezsRWWEfw= dependencies: - "@abp/core" "~5.3.0-rc.1" + "@abp/core" "~6.0.0-rc.1" bootstrap "^5.1.3" -"@abp/core@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-5.3.0-rc.1.tgz#4ede309ccfab440deb66fecb091273027483676a" - integrity sha512-cTw9xaWMkRDQjXRtkB5zx4Za0CPx7yvCRnTngIJs7xO86lRMVnuiwVGjP66vYTmiiu2ulGFgCeuw1AaK5t+g4Q== +"@abp/core@~6.0.0-rc.1": + version "6.0.0-rc.1" + resolved "https://www.myget.org/F/abp-nightly/npm/@abp/core/-/@abp/core-6.0.0-rc.1.tgz#ec88b3339d854c91e93c342206984daf01b745df" + integrity sha1-7IizM52FTJHpPDQiBphNrwG3Rd8= dependencies: - "@abp/utils" "~5.3.0-rc.1" + "@abp/utils" "~6.0.0-rc.1" -"@abp/datatables.net-bs5@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-5.3.0-rc.1.tgz#ca624d788acdcc547d0bdf1f76ba3ffc105dfd52" - integrity sha512-uyFBkD9rM3wGve0ZKrr7bEbC0Z/ywi8S/EYL6GwLzGNtogSsVj5HGtSvifKjCBn7KmAvo54skKoVgVEn77dlWQ== +"@abp/datatables.net-bs5@~6.0.0-rc.1": + version "6.0.0-rc.1" + resolved "https://www.myget.org/F/abp-nightly/npm/@abp/datatables.net-bs5/-/@abp/datatables.net-bs5-6.0.0-rc.1.tgz#111c8c04e7d31f1b417602c7dde87d5a49104890" + integrity sha1-ERyMBOfTHxtBdgLH3eh9WkkQSJA= dependencies: - "@abp/datatables.net" "~5.3.0-rc.1" + "@abp/datatables.net" "~6.0.0-rc.1" datatables.net-bs5 "^1.11.4" -"@abp/datatables.net@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-5.3.0-rc.1.tgz#38c0f6323f7e6305a50f7de9885b8a3f440cdf15" - integrity sha512-lecJ9Yelgey/nfSscsUHET0gyB6pZgkhnJXu3u8d9XhV2M5sc/WSnnCO3bgVBqMDImprR4GFPFw2cUlWkb8QBg== +"@abp/datatables.net@~6.0.0-rc.1": + version "6.0.0-rc.1" + resolved "https://www.myget.org/F/abp-nightly/npm/@abp/datatables.net/-/@abp/datatables.net-6.0.0-rc.1.tgz#278762acd0df9c7fd50ef0caef9a9e6c32665e6f" + integrity sha1-J4dirNDfnH/VDvDK75qebDJmXm8= dependencies: - "@abp/jquery" "~5.3.0-rc.1" + "@abp/jquery" "~6.0.0-rc.1" datatables.net "^1.11.4" -"@abp/font-awesome@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-5.3.0-rc.1.tgz#de14dca2b33fdc098d2325c5047e030a3927bfa9" - integrity sha512-tIuDwo+L5CuLpQ+ARsaTYmxuqpSJLqcaXuoFfk6JAC20bw881t7y8w4xWy1PUs0+SEQwTT7diZjQrcA/xxlMUQ== +"@abp/font-awesome@~6.0.0-rc.1": + version "6.0.0-rc.1" + resolved "https://www.myget.org/F/abp-nightly/npm/@abp/font-awesome/-/@abp/font-awesome-6.0.0-rc.1.tgz#87b89f8923b262a8531cf4702cf318d9fab155b6" + integrity sha1-h7ifiSOyYqhTHPRwLPMY2fqxVbY= dependencies: - "@abp/core" "~5.3.0-rc.1" + "@abp/core" "~6.0.0-rc.1" "@fortawesome/fontawesome-free" "^5.15.4" -"@abp/jquery-form@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-5.3.0-rc.1.tgz#0a363d8e4814651e0c46e2109d19dcc84fc884b0" - integrity sha512-IWazO6BW5rHJ+ODk4haEqWzfzHvbxtW2+T1o534Lr7d+LI9yabNiQmRZ24yzNDb6SmRvDUVsumZ+lxPn2WBhIw== +"@abp/jquery-form@~6.0.0-rc.1": + version "6.0.0-rc.1" + resolved "https://www.myget.org/F/abp-nightly/npm/@abp/jquery-form/-/@abp/jquery-form-6.0.0-rc.1.tgz#5bb68fbb2ce0c3b9a59a52ab20c4ea971258c3b1" + integrity sha1-W7aPuyzgw7mlmlKrIMTqlxJYw7E= dependencies: - "@abp/jquery" "~5.3.0-rc.1" + "@abp/jquery" "~6.0.0-rc.1" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-5.3.0-rc.1.tgz#0aa2a5535acd79b5288ef04a0dc1b83a7a57b4b9" - integrity sha512-Qv/+nrd+ZeUs/2mCMahpQFqEguMOcmHrLg7hcw0LgcHr+MmEcG4WDcijTY6suFyekaf0DZD6vsFZjdvZmhsVYQ== +"@abp/jquery-validation-unobtrusive@~6.0.0-rc.1": + version "6.0.0-rc.1" + resolved "https://www.myget.org/F/abp-nightly/npm/@abp/jquery-validation-unobtrusive/-/@abp/jquery-validation-unobtrusive-6.0.0-rc.1.tgz#d082de2aa6c2d8bc2a0808b4159d0f5d281afdd2" + integrity sha1-0ILeKqbC2LwqCAi0FZ0PXSga/dI= dependencies: - "@abp/jquery-validation" "~5.3.0-rc.1" + "@abp/jquery-validation" "~6.0.0-rc.1" jquery-validation-unobtrusive "^3.2.12" -"@abp/jquery-validation@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-5.3.0-rc.1.tgz#d05afbe0209c0815afe3a7cb0cf811256e9905fc" - integrity sha512-3DoRX6c8duRx1/g7MFuPAO/qesJCFqbVbw+x0+QnKmCkVZmz5VFAqdO9yFMxDFRbBAtyp7faaarc0lOtAcBsoA== +"@abp/jquery-validation@~6.0.0-rc.1": + version "6.0.0-rc.1" + resolved "https://www.myget.org/F/abp-nightly/npm/@abp/jquery-validation/-/@abp/jquery-validation-6.0.0-rc.1.tgz#e30227075f6d7eabe6224faf2e033622ce0fe3b1" + integrity sha1-4wInB19tfqvmIk+vLgM2Is4P47E= dependencies: - "@abp/jquery" "~5.3.0-rc.1" + "@abp/jquery" "~6.0.0-rc.1" jquery-validation "^1.19.3" -"@abp/jquery@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-5.3.0-rc.1.tgz#26e5d5761f2629d02b2534ad964080221d536308" - integrity sha512-//bqInarV6XOs8+I5GW1q/c05sjnCq/Z0vuzFW1i1NDrQ2Q5kqF5leMV9hhGEZmfR+yG1T0MsbVvueieRkV/cA== +"@abp/jquery@~6.0.0-rc.1": + version "6.0.0-rc.1" + resolved "https://www.myget.org/F/abp-nightly/npm/@abp/jquery/-/@abp/jquery-6.0.0-rc.1.tgz#6f486cfc16dd915ccd4fe4a3029fa6359fea49c0" + integrity sha1-b0hs/BbdkVzNT+SjAp+mNZ/qScA= dependencies: - "@abp/core" "~5.3.0-rc.1" + "@abp/core" "~6.0.0-rc.1" jquery "~3.6.0" -"@abp/lodash@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-5.3.0-rc.1.tgz#c53304fbd9b1c885a9a812c681c3698dd8ecea47" - integrity sha512-yBvUB05z/SSEEbZ79nFfb0cKwWVFbrt9OtUkQHy9ER7ip0R9escG2n1djFtAA33yZr/NLzSUh+vVBYsEhk8MOA== +"@abp/lodash@~6.0.0-rc.1": + version "6.0.0-rc.1" + resolved "https://www.myget.org/F/abp-nightly/npm/@abp/lodash/-/@abp/lodash-6.0.0-rc.1.tgz#5e143be48e1d266356bd726764a89f520c55e8a5" + integrity sha1-XhQ75I4dJmNWvXJnZKifUgxV6KU= dependencies: - "@abp/core" "~5.3.0-rc.1" + "@abp/core" "~6.0.0-rc.1" lodash "^4.17.21" -"@abp/luxon@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-5.3.0-rc.1.tgz#bcb4de01b20a8e4da8db186e88fdebfcde47fb8f" - integrity sha512-SLozcDvCL/2jyvG2ZU+DHjzbfHYdmwiRjWu7gWyNjaY2e6D3NraHHjpMQ7ubObXZRlhhvfcp0i6eeKKoZNJtEQ== +"@abp/luxon@~6.0.0-rc.1": + version "6.0.0-rc.1" + resolved "https://www.myget.org/F/abp-nightly/npm/@abp/luxon/-/@abp/luxon-6.0.0-rc.1.tgz#a4242d862576b4151912d48fbf81d89862b6a91e" + integrity sha1-pCQthiV2tBUZEtSPv4HYmGK2qR4= dependencies: - "@abp/core" "~5.3.0-rc.1" + "@abp/core" "~6.0.0-rc.1" luxon "^2.3.0" -"@abp/malihu-custom-scrollbar-plugin@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-5.3.0-rc.1.tgz#398181c7c6cc1805544e7a1ccd0423ed96005e0b" - integrity sha512-KZar881wtotKc+1bqDlBWo2vLUEeeqEpMBg8+BiXsGofp5ovudifVPM6mHZ9Gi29U9LAMyI0VEGwLJctgB/UoA== +"@abp/malihu-custom-scrollbar-plugin@~6.0.0-rc.1": + version "6.0.0-rc.1" + resolved "https://www.myget.org/F/abp-nightly/npm/@abp/malihu-custom-scrollbar-plugin/-/@abp/malihu-custom-scrollbar-plugin-6.0.0-rc.1.tgz#738efa17783450971c6f47608cfafc0ef87d8ec6" + integrity sha1-c476F3g0UJccb0dgjPr8Dvh9jsY= dependencies: - "@abp/core" "~5.3.0-rc.1" + "@abp/core" "~6.0.0-rc.1" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/select2@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-5.3.0-rc.1.tgz#b2ce00b6545674d6bccc10fdfe4626a4598a0cdc" - integrity sha512-frE5jia7bBdZinW4LqD5JR+wknWu2ARX3L3pPiQ080ulB+P58gRj07ZPd1BWgRcvutnuANYyP9rZtDA18Ls+9Q== +"@abp/select2@~6.0.0-rc.1": + version "6.0.0-rc.1" + resolved "https://www.myget.org/F/abp-nightly/npm/@abp/select2/-/@abp/select2-6.0.0-rc.1.tgz#d4ba6e71536c56ef2c98c1b3342f15fc286d3c1b" + integrity sha1-1LpucVNsVu8smMGzNC8V/ChtPBs= dependencies: - "@abp/core" "~5.3.0-rc.1" + "@abp/core" "~6.0.0-rc.1" select2 "^4.0.13" -"@abp/sweetalert2@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-5.3.0-rc.1.tgz#6eb10b257e7f256da64ff6fe248a370671a26920" - integrity sha512-g9nddGcDGaG6EmjX7qpRcLzy3F38BTtFc0RBWApH7Da1o/LMYFYa6xGfS7ouIynZBM9j/BRP12CVTR+Y9qqbGg== +"@abp/sweetalert2@~6.0.0-rc.1": + version "6.0.0-rc.1" + resolved "https://www.myget.org/F/abp-nightly/npm/@abp/sweetalert2/-/@abp/sweetalert2-6.0.0-rc.1.tgz#2633ed54227a703dbd81e2db0923d6f402561232" + integrity sha1-JjPtVCJ6cD29geLbCSPW9AJWEjI= dependencies: - "@abp/core" "~5.3.0-rc.1" + "@abp/core" "~6.0.0-rc.1" sweetalert2 "^11.3.6" -"@abp/timeago@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-5.3.0-rc.1.tgz#2702a0f22db52dbf4c0717e4abcd317c56d10563" - integrity sha512-XRc4D98FIZR0YTXIoV0+OxVJTdixtNDiwatZRffopHT4Kpptmpj6O9KMcB4SngCH99/TrUFdEUnA2CgszxiEOA== +"@abp/timeago@~6.0.0-rc.1": + version "6.0.0-rc.1" + resolved "https://www.myget.org/F/abp-nightly/npm/@abp/timeago/-/@abp/timeago-6.0.0-rc.1.tgz#78903b3d523da6985a83a306d6a31d223b244d8b" + integrity sha1-eJA7PVI9pphag6MG1qMdIjskTYs= dependencies: - "@abp/jquery" "~5.3.0-rc.1" + "@abp/jquery" "~6.0.0-rc.1" timeago "^1.6.7" -"@abp/toastr@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-5.3.0-rc.1.tgz#ec3a3d302ac91d5393c3caeb8b4884ad811b6edb" - integrity sha512-InZweYuBkrNZNBQKp6A+6gxGdO/lB0XsrXaa+CIVe55p8aNJPzE0mnvSfKWhN5G273wR08AD9RjR22kYS+bgFA== +"@abp/toastr@~6.0.0-rc.1": + version "6.0.0-rc.1" + resolved "https://www.myget.org/F/abp-nightly/npm/@abp/toastr/-/@abp/toastr-6.0.0-rc.1.tgz#2cb0898d48bad1cb8cb5e994b55e51d60e5a6b90" + integrity sha1-LLCJjUi60cuMtemUtV5R1g5aa5A= dependencies: - "@abp/jquery" "~5.3.0-rc.1" + "@abp/jquery" "~6.0.0-rc.1" toastr "^2.1.4" -"@abp/utils@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-5.3.0-rc.1.tgz#3fa758944e7325e7b3f528141e03bb71f8e04d24" - integrity sha512-/8BTYZomNMdy+RpYXWLp5dg0lRhmfiguciZEVWo4qRw1lCXm/JR+0842XT1XYE1dQ4orNNJ3/H86eRX8Ab6Yfg== +"@abp/utils@~6.0.0-rc.1": + version "6.0.0-rc.1" + resolved "https://www.myget.org/F/abp-nightly/npm/@abp/utils/-/@abp/utils-6.0.0-rc.1.tgz#f25b383d6d7ba28c1220399397247cdef9704daf" + integrity sha1-8ls4PW17oowSIDmTlyR83vlwTa8= dependencies: just-compare "^1.3.0" diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/MyCompanyName.MyProjectName.Blazor.Server.Tiered.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/MyCompanyName.MyProjectName.Blazor.Server.Tiered.csproj index a007569a70..91dab1bff0 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/MyCompanyName.MyProjectName.Blazor.Server.Tiered.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/MyCompanyName.MyProjectName.Blazor.Server.Tiered.csproj @@ -18,16 +18,25 @@ + - + - - + + + + + + + + + + diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/MyProjectNameBlazorModule.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/MyProjectNameBlazorModule.cs index f3a2e1da9f..65391264c0 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/MyProjectNameBlazorModule.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/MyProjectNameBlazorModule.cs @@ -1,8 +1,9 @@ using System; using System.IO; -using System.Net.Http; using Blazorise.Bootstrap5; using Blazorise.Icons.FontAwesome; +using Medallion.Threading; +using Medallion.Threading.Redis; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.DataProtection; using Microsoft.AspNetCore.Hosting; @@ -35,6 +36,7 @@ using Volo.Abp.Autofac; using Volo.Abp.AutoMapper; using Volo.Abp.Caching; using Volo.Abp.Caching.StackExchangeRedis; +using Volo.Abp.DistributedLocking; using Volo.Abp.Http.Client.IdentityModel.Web; using Volo.Abp.Identity.Blazor.Server; using Volo.Abp.Localization; @@ -53,6 +55,7 @@ namespace MyCompanyName.MyProjectName.Blazor.Server.Tiered; [DependsOn( typeof(MyProjectNameHttpApiClientModule), typeof(AbpCachingStackExchangeRedisModule), + typeof(AbpDistributedLockingModule), typeof(AbpAspNetCoreMvcClientModule), typeof(AbpAspNetCoreAuthenticationOpenIdConnectModule), typeof(AbpHttpClientIdentityModelWebModule), @@ -97,6 +100,7 @@ public class MyProjectNameBlazorModule : AbpModule ConfigureRouter(context); ConfigureMenu(configuration); ConfigureDataProtection(context, configuration, hostingEnvironment); + ConfigureDistributedLocking(context, configuration); ConfigureSwaggerServices(context.Services); } @@ -291,6 +295,18 @@ public class MyProjectNameBlazorModule : AbpModule dataProtectionBuilder.PersistKeysToStackExchangeRedis(redis, "MyProjectName-Protection-Keys"); } } + + private void ConfigureDistributedLocking( + ServiceConfigurationContext context, + IConfiguration configuration) + { + context.Services.AddSingleton(sp => + { + var connection = ConnectionMultiplexer + .Connect(configuration["Redis:Configuration"]); + return new RedisDistributedSynchronizationProvider(connection.GetDatabase()); + }); + } public override void OnApplicationInitialization(ApplicationInitializationContext context) { diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/package.json b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/package.json index 21d924ec29..3b1f8217d6 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/package.json +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/package.json @@ -3,7 +3,7 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "^1.0.0", - "@abp/aspnetcore.components.server.leptonxlitetheme": "^1.0.0" + "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~1.0.0-rc.3", + "@abp/aspnetcore.components.server.leptonxlitetheme": "~1.0.0-rc.3" } } diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/yarn.lock b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/yarn.lock index 64fd8e6b93..b837f844b4 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/yarn.lock +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/yarn.lock @@ -2,52 +2,52 @@ # yarn lockfile v1 -"@abp/aspnetcore.components.server.basictheme@^5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.components.server.basictheme/-/aspnetcore.components.server.basictheme-5.3.0-rc.1.tgz#8fa1db4fbe2a9ac58db3fefd25e1b60cdb9fa0d5" - integrity sha512-92kD2PPtvyaeNEvSQRAVRj/BEetitRwbuYqM9PHdaLXeNdnGo/C6JGej9sc488KKxdRq2uaVrMY2xlDUEYc9vw== - dependencies: - "@abp/aspnetcore.components.server.theming" "~5.3.0-rc.1" - -"@abp/aspnetcore.components.server.theming@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.components.server.theming/-/aspnetcore.components.server.theming-5.3.0-rc.1.tgz#654dc4f4ba7f37b12e900fbeaf5c8ac57cb192ec" - integrity sha512-csXYJGwcwLv6/75euEi5g6HUxAG/Q47ZtQfema5HL7TV/zz+8T1Z4uuUy+NTyuK7MQpRaO0QBTvn4n4FVnmE0w== - dependencies: - "@abp/bootstrap" "~5.3.0-rc.1" - "@abp/font-awesome" "~5.3.0-rc.1" - -"@abp/aspnetcore.mvc.ui.theme.basic@^5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-5.3.0-rc.1.tgz#dc27eb79ba7353eb6b16e4a2f50d17c3cfc9157d" - integrity sha512-TEbz/ISsGhfTec66XSeivQjCOCpTidufdpZmj8JRyrbQvhXOYohJs3ImrGJOIxUwo6nuzagGpotqXryjIF+jrg== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~5.3.0-rc.1" - -"@abp/aspnetcore.mvc.ui.theme.shared@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-5.3.0-rc.1.tgz#ed993befe99682baee55ea8771f983980ba8f93f" - integrity sha512-kL4CXe0YoZ4wJ4XvutqLPkv4fMuFeRJFzdix6lx4dPAArnPu69n3P4qFhokPkcoGpB2KTRqyn9fHQs8g2FCGQw== - dependencies: - "@abp/aspnetcore.mvc.ui" "~5.3.0-rc.1" - "@abp/bootstrap" "~5.3.0-rc.1" - "@abp/bootstrap-datepicker" "~5.3.0-rc.1" - "@abp/datatables.net-bs5" "~5.3.0-rc.1" - "@abp/font-awesome" "~5.3.0-rc.1" - "@abp/jquery-form" "~5.3.0-rc.1" - "@abp/jquery-validation-unobtrusive" "~5.3.0-rc.1" - "@abp/lodash" "~5.3.0-rc.1" - "@abp/luxon" "~5.3.0-rc.1" - "@abp/malihu-custom-scrollbar-plugin" "~5.3.0-rc.1" - "@abp/select2" "~5.3.0-rc.1" - "@abp/sweetalert2" "~5.3.0-rc.1" - "@abp/timeago" "~5.3.0-rc.1" - "@abp/toastr" "~5.3.0-rc.1" - -"@abp/aspnetcore.mvc.ui@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-5.3.0-rc.1.tgz#5205d3a5ea500ff3b8d525dcc11a2ce4cfccdfd3" - integrity sha512-mIefq3QSVtP7heNl0ocHiSKLU+DwN5/TDvvPj2L3IZkCzuOrDxoBUIBIciea4k10HIQzqo6gmm1YOw0CEfzNHg== +"@abp/aspnetcore.components.server.leptonxlitetheme@~1.0.0-rc.3": + version "1.0.0-rc.3" + resolved "https://www.myget.org/F/abp-nightly/npm/@abp/aspnetcore.components.server.leptonxlitetheme/-/@abp/aspnetcore.components.server.leptonxlitetheme-1.0.0-rc.3.tgz#55659cb42d0942e6342e8412454bfb138c4a25fe" + integrity sha1-VWWctC0JQuY0LoQSRUv7E4xKJf4= + dependencies: + "@abp/aspnetcore.components.server.theming" "~6.0.0-rc.1" + +"@abp/aspnetcore.components.server.theming@~6.0.0-rc.1": + version "6.0.0-rc.1" + resolved "https://www.myget.org/F/abp-nightly/npm/@abp/aspnetcore.components.server.theming/-/@abp/aspnetcore.components.server.theming-6.0.0-rc.1.tgz#144d7779c6ace386cf4d376c94959963501a3415" + integrity sha1-FE13ecas44bPTTdslJWZY1AaNBU= + dependencies: + "@abp/bootstrap" "~6.0.0-rc.1" + "@abp/font-awesome" "~6.0.0-rc.1" + +"@abp/aspnetcore.mvc.ui.theme.leptonxlite@~1.0.0-rc.3": + version "1.0.0-rc.3" + resolved "https://www.myget.org/F/abp-nightly/npm/@abp/aspnetcore.mvc.ui.theme.leptonxlite/-/@abp/aspnetcore.mvc.ui.theme.leptonxlite-1.0.0-rc.3.tgz#15a0f2106284964c91af7f78be28427a430d9bd4" + integrity sha1-FaDyEGKElkyRr394vihCekMNm9Q= + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~6.0.0-rc.1" + +"@abp/aspnetcore.mvc.ui.theme.shared@~6.0.0-rc.1": + version "6.0.0-rc.1" + resolved "https://www.myget.org/F/abp-nightly/npm/@abp/aspnetcore.mvc.ui.theme.shared/-/@abp/aspnetcore.mvc.ui.theme.shared-6.0.0-rc.1.tgz#5b0afe34c485f8e11ef21b0bce86e231602d8c1b" + integrity sha1-Wwr+NMSF+OEe8hsLzobiMWAtjBs= + dependencies: + "@abp/aspnetcore.mvc.ui" "~6.0.0-rc.1" + "@abp/bootstrap" "~6.0.0-rc.1" + "@abp/bootstrap-datepicker" "~6.0.0-rc.1" + "@abp/datatables.net-bs5" "~6.0.0-rc.1" + "@abp/font-awesome" "~6.0.0-rc.1" + "@abp/jquery-form" "~6.0.0-rc.1" + "@abp/jquery-validation-unobtrusive" "~6.0.0-rc.1" + "@abp/lodash" "~6.0.0-rc.1" + "@abp/luxon" "~6.0.0-rc.1" + "@abp/malihu-custom-scrollbar-plugin" "~6.0.0-rc.1" + "@abp/select2" "~6.0.0-rc.1" + "@abp/sweetalert2" "~6.0.0-rc.1" + "@abp/timeago" "~6.0.0-rc.1" + "@abp/toastr" "~6.0.0-rc.1" + +"@abp/aspnetcore.mvc.ui@~6.0.0-rc.1": + version "6.0.0-rc.1" + resolved "https://www.myget.org/F/abp-nightly/npm/@abp/aspnetcore.mvc.ui/-/@abp/aspnetcore.mvc.ui-6.0.0-rc.1.tgz#cec27a35b336ef8319308ac24995def0f26e00be" + integrity sha1-zsJ6NbM274MZMIrCSZXe8PJuAL4= dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -56,144 +56,144 @@ merge-stream "^2.0.0" micromatch "^4.0.2" -"@abp/bootstrap-datepicker@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-5.3.0-rc.1.tgz#1a5a29d7f9904e8d99c7085bc4545ad2665195cb" - integrity sha512-Y5QLLNd2UpbzbWSh+5nKdpAdz2i3V8+feTHTpAxnPgYRabPGqAFiOrty8KZ1MJEgjQFWC1ypGHYII7GWVyIS6Q== +"@abp/bootstrap-datepicker@~6.0.0-rc.1": + version "6.0.0-rc.1" + resolved "https://www.myget.org/F/abp-nightly/npm/@abp/bootstrap-datepicker/-/@abp/bootstrap-datepicker-6.0.0-rc.1.tgz#33bd5d9e1d6b351eb1e7a278ccd9a79db119e461" + integrity sha1-M71dnh1rNR6x56J4zNmnnbEZ5GE= dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-5.3.0-rc.1.tgz#977d579f59e18b1eb2c9b43612d525a859a575a4" - integrity sha512-dpY0bPHdhUI5yL23+EsR6w/KjoPyehaEgHLLKQDERdubX1Zk/SDWrhrYXnXxtJ0fvxG2aRVOEBMULmHD3m/PoA== +"@abp/bootstrap@~6.0.0-rc.1": + version "6.0.0-rc.1" + resolved "https://www.myget.org/F/abp-nightly/npm/@abp/bootstrap/-/@abp/bootstrap-6.0.0-rc.1.tgz#c6f64f1f34870b75da623ed9cee7b3b1159611fc" + integrity sha1-xvZPHzSHC3XaYj7ZzuezsRWWEfw= dependencies: - "@abp/core" "~5.3.0-rc.1" + "@abp/core" "~6.0.0-rc.1" bootstrap "^5.1.3" -"@abp/core@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-5.3.0-rc.1.tgz#4ede309ccfab440deb66fecb091273027483676a" - integrity sha512-cTw9xaWMkRDQjXRtkB5zx4Za0CPx7yvCRnTngIJs7xO86lRMVnuiwVGjP66vYTmiiu2ulGFgCeuw1AaK5t+g4Q== +"@abp/core@~6.0.0-rc.1": + version "6.0.0-rc.1" + resolved "https://www.myget.org/F/abp-nightly/npm/@abp/core/-/@abp/core-6.0.0-rc.1.tgz#ec88b3339d854c91e93c342206984daf01b745df" + integrity sha1-7IizM52FTJHpPDQiBphNrwG3Rd8= dependencies: - "@abp/utils" "~5.3.0-rc.1" + "@abp/utils" "~6.0.0-rc.1" -"@abp/datatables.net-bs5@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-5.3.0-rc.1.tgz#ca624d788acdcc547d0bdf1f76ba3ffc105dfd52" - integrity sha512-uyFBkD9rM3wGve0ZKrr7bEbC0Z/ywi8S/EYL6GwLzGNtogSsVj5HGtSvifKjCBn7KmAvo54skKoVgVEn77dlWQ== +"@abp/datatables.net-bs5@~6.0.0-rc.1": + version "6.0.0-rc.1" + resolved "https://www.myget.org/F/abp-nightly/npm/@abp/datatables.net-bs5/-/@abp/datatables.net-bs5-6.0.0-rc.1.tgz#111c8c04e7d31f1b417602c7dde87d5a49104890" + integrity sha1-ERyMBOfTHxtBdgLH3eh9WkkQSJA= dependencies: - "@abp/datatables.net" "~5.3.0-rc.1" + "@abp/datatables.net" "~6.0.0-rc.1" datatables.net-bs5 "^1.11.4" -"@abp/datatables.net@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-5.3.0-rc.1.tgz#38c0f6323f7e6305a50f7de9885b8a3f440cdf15" - integrity sha512-lecJ9Yelgey/nfSscsUHET0gyB6pZgkhnJXu3u8d9XhV2M5sc/WSnnCO3bgVBqMDImprR4GFPFw2cUlWkb8QBg== +"@abp/datatables.net@~6.0.0-rc.1": + version "6.0.0-rc.1" + resolved "https://www.myget.org/F/abp-nightly/npm/@abp/datatables.net/-/@abp/datatables.net-6.0.0-rc.1.tgz#278762acd0df9c7fd50ef0caef9a9e6c32665e6f" + integrity sha1-J4dirNDfnH/VDvDK75qebDJmXm8= dependencies: - "@abp/jquery" "~5.3.0-rc.1" + "@abp/jquery" "~6.0.0-rc.1" datatables.net "^1.11.4" -"@abp/font-awesome@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-5.3.0-rc.1.tgz#de14dca2b33fdc098d2325c5047e030a3927bfa9" - integrity sha512-tIuDwo+L5CuLpQ+ARsaTYmxuqpSJLqcaXuoFfk6JAC20bw881t7y8w4xWy1PUs0+SEQwTT7diZjQrcA/xxlMUQ== +"@abp/font-awesome@~6.0.0-rc.1": + version "6.0.0-rc.1" + resolved "https://www.myget.org/F/abp-nightly/npm/@abp/font-awesome/-/@abp/font-awesome-6.0.0-rc.1.tgz#87b89f8923b262a8531cf4702cf318d9fab155b6" + integrity sha1-h7ifiSOyYqhTHPRwLPMY2fqxVbY= dependencies: - "@abp/core" "~5.3.0-rc.1" + "@abp/core" "~6.0.0-rc.1" "@fortawesome/fontawesome-free" "^5.15.4" -"@abp/jquery-form@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-5.3.0-rc.1.tgz#0a363d8e4814651e0c46e2109d19dcc84fc884b0" - integrity sha512-IWazO6BW5rHJ+ODk4haEqWzfzHvbxtW2+T1o534Lr7d+LI9yabNiQmRZ24yzNDb6SmRvDUVsumZ+lxPn2WBhIw== +"@abp/jquery-form@~6.0.0-rc.1": + version "6.0.0-rc.1" + resolved "https://www.myget.org/F/abp-nightly/npm/@abp/jquery-form/-/@abp/jquery-form-6.0.0-rc.1.tgz#5bb68fbb2ce0c3b9a59a52ab20c4ea971258c3b1" + integrity sha1-W7aPuyzgw7mlmlKrIMTqlxJYw7E= dependencies: - "@abp/jquery" "~5.3.0-rc.1" + "@abp/jquery" "~6.0.0-rc.1" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-5.3.0-rc.1.tgz#0aa2a5535acd79b5288ef04a0dc1b83a7a57b4b9" - integrity sha512-Qv/+nrd+ZeUs/2mCMahpQFqEguMOcmHrLg7hcw0LgcHr+MmEcG4WDcijTY6suFyekaf0DZD6vsFZjdvZmhsVYQ== +"@abp/jquery-validation-unobtrusive@~6.0.0-rc.1": + version "6.0.0-rc.1" + resolved "https://www.myget.org/F/abp-nightly/npm/@abp/jquery-validation-unobtrusive/-/@abp/jquery-validation-unobtrusive-6.0.0-rc.1.tgz#d082de2aa6c2d8bc2a0808b4159d0f5d281afdd2" + integrity sha1-0ILeKqbC2LwqCAi0FZ0PXSga/dI= dependencies: - "@abp/jquery-validation" "~5.3.0-rc.1" + "@abp/jquery-validation" "~6.0.0-rc.1" jquery-validation-unobtrusive "^3.2.12" -"@abp/jquery-validation@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-5.3.0-rc.1.tgz#d05afbe0209c0815afe3a7cb0cf811256e9905fc" - integrity sha512-3DoRX6c8duRx1/g7MFuPAO/qesJCFqbVbw+x0+QnKmCkVZmz5VFAqdO9yFMxDFRbBAtyp7faaarc0lOtAcBsoA== +"@abp/jquery-validation@~6.0.0-rc.1": + version "6.0.0-rc.1" + resolved "https://www.myget.org/F/abp-nightly/npm/@abp/jquery-validation/-/@abp/jquery-validation-6.0.0-rc.1.tgz#e30227075f6d7eabe6224faf2e033622ce0fe3b1" + integrity sha1-4wInB19tfqvmIk+vLgM2Is4P47E= dependencies: - "@abp/jquery" "~5.3.0-rc.1" + "@abp/jquery" "~6.0.0-rc.1" jquery-validation "^1.19.3" -"@abp/jquery@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-5.3.0-rc.1.tgz#26e5d5761f2629d02b2534ad964080221d536308" - integrity sha512-//bqInarV6XOs8+I5GW1q/c05sjnCq/Z0vuzFW1i1NDrQ2Q5kqF5leMV9hhGEZmfR+yG1T0MsbVvueieRkV/cA== +"@abp/jquery@~6.0.0-rc.1": + version "6.0.0-rc.1" + resolved "https://www.myget.org/F/abp-nightly/npm/@abp/jquery/-/@abp/jquery-6.0.0-rc.1.tgz#6f486cfc16dd915ccd4fe4a3029fa6359fea49c0" + integrity sha1-b0hs/BbdkVzNT+SjAp+mNZ/qScA= dependencies: - "@abp/core" "~5.3.0-rc.1" + "@abp/core" "~6.0.0-rc.1" jquery "~3.6.0" -"@abp/lodash@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-5.3.0-rc.1.tgz#c53304fbd9b1c885a9a812c681c3698dd8ecea47" - integrity sha512-yBvUB05z/SSEEbZ79nFfb0cKwWVFbrt9OtUkQHy9ER7ip0R9escG2n1djFtAA33yZr/NLzSUh+vVBYsEhk8MOA== +"@abp/lodash@~6.0.0-rc.1": + version "6.0.0-rc.1" + resolved "https://www.myget.org/F/abp-nightly/npm/@abp/lodash/-/@abp/lodash-6.0.0-rc.1.tgz#5e143be48e1d266356bd726764a89f520c55e8a5" + integrity sha1-XhQ75I4dJmNWvXJnZKifUgxV6KU= dependencies: - "@abp/core" "~5.3.0-rc.1" + "@abp/core" "~6.0.0-rc.1" lodash "^4.17.21" -"@abp/luxon@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-5.3.0-rc.1.tgz#bcb4de01b20a8e4da8db186e88fdebfcde47fb8f" - integrity sha512-SLozcDvCL/2jyvG2ZU+DHjzbfHYdmwiRjWu7gWyNjaY2e6D3NraHHjpMQ7ubObXZRlhhvfcp0i6eeKKoZNJtEQ== +"@abp/luxon@~6.0.0-rc.1": + version "6.0.0-rc.1" + resolved "https://www.myget.org/F/abp-nightly/npm/@abp/luxon/-/@abp/luxon-6.0.0-rc.1.tgz#a4242d862576b4151912d48fbf81d89862b6a91e" + integrity sha1-pCQthiV2tBUZEtSPv4HYmGK2qR4= dependencies: - "@abp/core" "~5.3.0-rc.1" + "@abp/core" "~6.0.0-rc.1" luxon "^2.3.0" -"@abp/malihu-custom-scrollbar-plugin@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-5.3.0-rc.1.tgz#398181c7c6cc1805544e7a1ccd0423ed96005e0b" - integrity sha512-KZar881wtotKc+1bqDlBWo2vLUEeeqEpMBg8+BiXsGofp5ovudifVPM6mHZ9Gi29U9LAMyI0VEGwLJctgB/UoA== +"@abp/malihu-custom-scrollbar-plugin@~6.0.0-rc.1": + version "6.0.0-rc.1" + resolved "https://www.myget.org/F/abp-nightly/npm/@abp/malihu-custom-scrollbar-plugin/-/@abp/malihu-custom-scrollbar-plugin-6.0.0-rc.1.tgz#738efa17783450971c6f47608cfafc0ef87d8ec6" + integrity sha1-c476F3g0UJccb0dgjPr8Dvh9jsY= dependencies: - "@abp/core" "~5.3.0-rc.1" + "@abp/core" "~6.0.0-rc.1" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/select2@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-5.3.0-rc.1.tgz#b2ce00b6545674d6bccc10fdfe4626a4598a0cdc" - integrity sha512-frE5jia7bBdZinW4LqD5JR+wknWu2ARX3L3pPiQ080ulB+P58gRj07ZPd1BWgRcvutnuANYyP9rZtDA18Ls+9Q== +"@abp/select2@~6.0.0-rc.1": + version "6.0.0-rc.1" + resolved "https://www.myget.org/F/abp-nightly/npm/@abp/select2/-/@abp/select2-6.0.0-rc.1.tgz#d4ba6e71536c56ef2c98c1b3342f15fc286d3c1b" + integrity sha1-1LpucVNsVu8smMGzNC8V/ChtPBs= dependencies: - "@abp/core" "~5.3.0-rc.1" + "@abp/core" "~6.0.0-rc.1" select2 "^4.0.13" -"@abp/sweetalert2@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-5.3.0-rc.1.tgz#6eb10b257e7f256da64ff6fe248a370671a26920" - integrity sha512-g9nddGcDGaG6EmjX7qpRcLzy3F38BTtFc0RBWApH7Da1o/LMYFYa6xGfS7ouIynZBM9j/BRP12CVTR+Y9qqbGg== +"@abp/sweetalert2@~6.0.0-rc.1": + version "6.0.0-rc.1" + resolved "https://www.myget.org/F/abp-nightly/npm/@abp/sweetalert2/-/@abp/sweetalert2-6.0.0-rc.1.tgz#2633ed54227a703dbd81e2db0923d6f402561232" + integrity sha1-JjPtVCJ6cD29geLbCSPW9AJWEjI= dependencies: - "@abp/core" "~5.3.0-rc.1" + "@abp/core" "~6.0.0-rc.1" sweetalert2 "^11.3.6" -"@abp/timeago@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-5.3.0-rc.1.tgz#2702a0f22db52dbf4c0717e4abcd317c56d10563" - integrity sha512-XRc4D98FIZR0YTXIoV0+OxVJTdixtNDiwatZRffopHT4Kpptmpj6O9KMcB4SngCH99/TrUFdEUnA2CgszxiEOA== +"@abp/timeago@~6.0.0-rc.1": + version "6.0.0-rc.1" + resolved "https://www.myget.org/F/abp-nightly/npm/@abp/timeago/-/@abp/timeago-6.0.0-rc.1.tgz#78903b3d523da6985a83a306d6a31d223b244d8b" + integrity sha1-eJA7PVI9pphag6MG1qMdIjskTYs= dependencies: - "@abp/jquery" "~5.3.0-rc.1" + "@abp/jquery" "~6.0.0-rc.1" timeago "^1.6.7" -"@abp/toastr@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-5.3.0-rc.1.tgz#ec3a3d302ac91d5393c3caeb8b4884ad811b6edb" - integrity sha512-InZweYuBkrNZNBQKp6A+6gxGdO/lB0XsrXaa+CIVe55p8aNJPzE0mnvSfKWhN5G273wR08AD9RjR22kYS+bgFA== +"@abp/toastr@~6.0.0-rc.1": + version "6.0.0-rc.1" + resolved "https://www.myget.org/F/abp-nightly/npm/@abp/toastr/-/@abp/toastr-6.0.0-rc.1.tgz#2cb0898d48bad1cb8cb5e994b55e51d60e5a6b90" + integrity sha1-LLCJjUi60cuMtemUtV5R1g5aa5A= dependencies: - "@abp/jquery" "~5.3.0-rc.1" + "@abp/jquery" "~6.0.0-rc.1" toastr "^2.1.4" -"@abp/utils@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-5.3.0-rc.1.tgz#3fa758944e7325e7b3f528141e03bb71f8e04d24" - integrity sha512-/8BTYZomNMdy+RpYXWLp5dg0lRhmfiguciZEVWo4qRw1lCXm/JR+0842XT1XYE1dQ4orNNJ3/H86eRX8Ab6Yfg== +"@abp/utils@~6.0.0-rc.1": + version "6.0.0-rc.1" + resolved "https://www.myget.org/F/abp-nightly/npm/@abp/utils/-/@abp/utils-6.0.0-rc.1.tgz#f25b383d6d7ba28c1220399397247cdef9704daf" + integrity sha1-8ls4PW17oowSIDmTlyR83vlwTa8= dependencies: just-compare "^1.3.0" diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj index b4e11ed8fc..de7bc577a6 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj @@ -18,10 +18,17 @@ - + - - + + + + + + + + + diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/MyProjectNameBlazorModule.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/MyProjectNameBlazorModule.cs index a3d2cf8057..e919342fe9 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/MyProjectNameBlazorModule.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/MyProjectNameBlazorModule.cs @@ -2,6 +2,7 @@ using System.IO; using Blazorise.Bootstrap5; using Blazorise.Icons.FontAwesome; using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Extensions.DependencyInjection; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; @@ -11,6 +12,7 @@ using MyCompanyName.MyProjectName.Blazor.Server.Menus; using MyCompanyName.MyProjectName.EntityFrameworkCore; using MyCompanyName.MyProjectName.Localization; using MyCompanyName.MyProjectName.MultiTenancy; +using OpenIddict.Validation.AspNetCore; using Volo.Abp; using Volo.Abp.Account.Web; using Volo.Abp.AspNetCore.Components.Server.LeptonXLiteTheme; @@ -87,6 +89,7 @@ public class MyProjectNameBlazorModule : AbpModule var hostingEnvironment = context.Services.GetHostingEnvironment(); var configuration = context.Services.GetConfiguration(); + ConfigureAuthentication(context); ConfigureUrls(configuration); ConfigureBundles(); ConfigureAutoMapper(); @@ -99,6 +102,11 @@ public class MyProjectNameBlazorModule : AbpModule ConfigureMenu(context); } + private void ConfigureAuthentication(ServiceConfigurationContext context) + { + context.Services.ForwardIdentityAuthenticationForBearer(OpenIddictValidationAspNetCoreDefaults.AuthenticationScheme); + } + private void ConfigureUrls(IConfiguration configuration) { Configure(options => diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/package.json b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/package.json index 21d924ec29..3b1f8217d6 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/package.json +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/package.json @@ -3,7 +3,7 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "^1.0.0", - "@abp/aspnetcore.components.server.leptonxlitetheme": "^1.0.0" + "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~1.0.0-rc.3", + "@abp/aspnetcore.components.server.leptonxlitetheme": "~1.0.0-rc.3" } } diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/yarn.lock b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/yarn.lock index 64fd8e6b93..b837f844b4 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/yarn.lock +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/yarn.lock @@ -2,52 +2,52 @@ # yarn lockfile v1 -"@abp/aspnetcore.components.server.basictheme@^5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.components.server.basictheme/-/aspnetcore.components.server.basictheme-5.3.0-rc.1.tgz#8fa1db4fbe2a9ac58db3fefd25e1b60cdb9fa0d5" - integrity sha512-92kD2PPtvyaeNEvSQRAVRj/BEetitRwbuYqM9PHdaLXeNdnGo/C6JGej9sc488KKxdRq2uaVrMY2xlDUEYc9vw== - dependencies: - "@abp/aspnetcore.components.server.theming" "~5.3.0-rc.1" - -"@abp/aspnetcore.components.server.theming@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.components.server.theming/-/aspnetcore.components.server.theming-5.3.0-rc.1.tgz#654dc4f4ba7f37b12e900fbeaf5c8ac57cb192ec" - integrity sha512-csXYJGwcwLv6/75euEi5g6HUxAG/Q47ZtQfema5HL7TV/zz+8T1Z4uuUy+NTyuK7MQpRaO0QBTvn4n4FVnmE0w== - dependencies: - "@abp/bootstrap" "~5.3.0-rc.1" - "@abp/font-awesome" "~5.3.0-rc.1" - -"@abp/aspnetcore.mvc.ui.theme.basic@^5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-5.3.0-rc.1.tgz#dc27eb79ba7353eb6b16e4a2f50d17c3cfc9157d" - integrity sha512-TEbz/ISsGhfTec66XSeivQjCOCpTidufdpZmj8JRyrbQvhXOYohJs3ImrGJOIxUwo6nuzagGpotqXryjIF+jrg== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~5.3.0-rc.1" - -"@abp/aspnetcore.mvc.ui.theme.shared@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-5.3.0-rc.1.tgz#ed993befe99682baee55ea8771f983980ba8f93f" - integrity sha512-kL4CXe0YoZ4wJ4XvutqLPkv4fMuFeRJFzdix6lx4dPAArnPu69n3P4qFhokPkcoGpB2KTRqyn9fHQs8g2FCGQw== - dependencies: - "@abp/aspnetcore.mvc.ui" "~5.3.0-rc.1" - "@abp/bootstrap" "~5.3.0-rc.1" - "@abp/bootstrap-datepicker" "~5.3.0-rc.1" - "@abp/datatables.net-bs5" "~5.3.0-rc.1" - "@abp/font-awesome" "~5.3.0-rc.1" - "@abp/jquery-form" "~5.3.0-rc.1" - "@abp/jquery-validation-unobtrusive" "~5.3.0-rc.1" - "@abp/lodash" "~5.3.0-rc.1" - "@abp/luxon" "~5.3.0-rc.1" - "@abp/malihu-custom-scrollbar-plugin" "~5.3.0-rc.1" - "@abp/select2" "~5.3.0-rc.1" - "@abp/sweetalert2" "~5.3.0-rc.1" - "@abp/timeago" "~5.3.0-rc.1" - "@abp/toastr" "~5.3.0-rc.1" - -"@abp/aspnetcore.mvc.ui@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-5.3.0-rc.1.tgz#5205d3a5ea500ff3b8d525dcc11a2ce4cfccdfd3" - integrity sha512-mIefq3QSVtP7heNl0ocHiSKLU+DwN5/TDvvPj2L3IZkCzuOrDxoBUIBIciea4k10HIQzqo6gmm1YOw0CEfzNHg== +"@abp/aspnetcore.components.server.leptonxlitetheme@~1.0.0-rc.3": + version "1.0.0-rc.3" + resolved "https://www.myget.org/F/abp-nightly/npm/@abp/aspnetcore.components.server.leptonxlitetheme/-/@abp/aspnetcore.components.server.leptonxlitetheme-1.0.0-rc.3.tgz#55659cb42d0942e6342e8412454bfb138c4a25fe" + integrity sha1-VWWctC0JQuY0LoQSRUv7E4xKJf4= + dependencies: + "@abp/aspnetcore.components.server.theming" "~6.0.0-rc.1" + +"@abp/aspnetcore.components.server.theming@~6.0.0-rc.1": + version "6.0.0-rc.1" + resolved "https://www.myget.org/F/abp-nightly/npm/@abp/aspnetcore.components.server.theming/-/@abp/aspnetcore.components.server.theming-6.0.0-rc.1.tgz#144d7779c6ace386cf4d376c94959963501a3415" + integrity sha1-FE13ecas44bPTTdslJWZY1AaNBU= + dependencies: + "@abp/bootstrap" "~6.0.0-rc.1" + "@abp/font-awesome" "~6.0.0-rc.1" + +"@abp/aspnetcore.mvc.ui.theme.leptonxlite@~1.0.0-rc.3": + version "1.0.0-rc.3" + resolved "https://www.myget.org/F/abp-nightly/npm/@abp/aspnetcore.mvc.ui.theme.leptonxlite/-/@abp/aspnetcore.mvc.ui.theme.leptonxlite-1.0.0-rc.3.tgz#15a0f2106284964c91af7f78be28427a430d9bd4" + integrity sha1-FaDyEGKElkyRr394vihCekMNm9Q= + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~6.0.0-rc.1" + +"@abp/aspnetcore.mvc.ui.theme.shared@~6.0.0-rc.1": + version "6.0.0-rc.1" + resolved "https://www.myget.org/F/abp-nightly/npm/@abp/aspnetcore.mvc.ui.theme.shared/-/@abp/aspnetcore.mvc.ui.theme.shared-6.0.0-rc.1.tgz#5b0afe34c485f8e11ef21b0bce86e231602d8c1b" + integrity sha1-Wwr+NMSF+OEe8hsLzobiMWAtjBs= + dependencies: + "@abp/aspnetcore.mvc.ui" "~6.0.0-rc.1" + "@abp/bootstrap" "~6.0.0-rc.1" + "@abp/bootstrap-datepicker" "~6.0.0-rc.1" + "@abp/datatables.net-bs5" "~6.0.0-rc.1" + "@abp/font-awesome" "~6.0.0-rc.1" + "@abp/jquery-form" "~6.0.0-rc.1" + "@abp/jquery-validation-unobtrusive" "~6.0.0-rc.1" + "@abp/lodash" "~6.0.0-rc.1" + "@abp/luxon" "~6.0.0-rc.1" + "@abp/malihu-custom-scrollbar-plugin" "~6.0.0-rc.1" + "@abp/select2" "~6.0.0-rc.1" + "@abp/sweetalert2" "~6.0.0-rc.1" + "@abp/timeago" "~6.0.0-rc.1" + "@abp/toastr" "~6.0.0-rc.1" + +"@abp/aspnetcore.mvc.ui@~6.0.0-rc.1": + version "6.0.0-rc.1" + resolved "https://www.myget.org/F/abp-nightly/npm/@abp/aspnetcore.mvc.ui/-/@abp/aspnetcore.mvc.ui-6.0.0-rc.1.tgz#cec27a35b336ef8319308ac24995def0f26e00be" + integrity sha1-zsJ6NbM274MZMIrCSZXe8PJuAL4= dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -56,144 +56,144 @@ merge-stream "^2.0.0" micromatch "^4.0.2" -"@abp/bootstrap-datepicker@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-5.3.0-rc.1.tgz#1a5a29d7f9904e8d99c7085bc4545ad2665195cb" - integrity sha512-Y5QLLNd2UpbzbWSh+5nKdpAdz2i3V8+feTHTpAxnPgYRabPGqAFiOrty8KZ1MJEgjQFWC1ypGHYII7GWVyIS6Q== +"@abp/bootstrap-datepicker@~6.0.0-rc.1": + version "6.0.0-rc.1" + resolved "https://www.myget.org/F/abp-nightly/npm/@abp/bootstrap-datepicker/-/@abp/bootstrap-datepicker-6.0.0-rc.1.tgz#33bd5d9e1d6b351eb1e7a278ccd9a79db119e461" + integrity sha1-M71dnh1rNR6x56J4zNmnnbEZ5GE= dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-5.3.0-rc.1.tgz#977d579f59e18b1eb2c9b43612d525a859a575a4" - integrity sha512-dpY0bPHdhUI5yL23+EsR6w/KjoPyehaEgHLLKQDERdubX1Zk/SDWrhrYXnXxtJ0fvxG2aRVOEBMULmHD3m/PoA== +"@abp/bootstrap@~6.0.0-rc.1": + version "6.0.0-rc.1" + resolved "https://www.myget.org/F/abp-nightly/npm/@abp/bootstrap/-/@abp/bootstrap-6.0.0-rc.1.tgz#c6f64f1f34870b75da623ed9cee7b3b1159611fc" + integrity sha1-xvZPHzSHC3XaYj7ZzuezsRWWEfw= dependencies: - "@abp/core" "~5.3.0-rc.1" + "@abp/core" "~6.0.0-rc.1" bootstrap "^5.1.3" -"@abp/core@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-5.3.0-rc.1.tgz#4ede309ccfab440deb66fecb091273027483676a" - integrity sha512-cTw9xaWMkRDQjXRtkB5zx4Za0CPx7yvCRnTngIJs7xO86lRMVnuiwVGjP66vYTmiiu2ulGFgCeuw1AaK5t+g4Q== +"@abp/core@~6.0.0-rc.1": + version "6.0.0-rc.1" + resolved "https://www.myget.org/F/abp-nightly/npm/@abp/core/-/@abp/core-6.0.0-rc.1.tgz#ec88b3339d854c91e93c342206984daf01b745df" + integrity sha1-7IizM52FTJHpPDQiBphNrwG3Rd8= dependencies: - "@abp/utils" "~5.3.0-rc.1" + "@abp/utils" "~6.0.0-rc.1" -"@abp/datatables.net-bs5@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-5.3.0-rc.1.tgz#ca624d788acdcc547d0bdf1f76ba3ffc105dfd52" - integrity sha512-uyFBkD9rM3wGve0ZKrr7bEbC0Z/ywi8S/EYL6GwLzGNtogSsVj5HGtSvifKjCBn7KmAvo54skKoVgVEn77dlWQ== +"@abp/datatables.net-bs5@~6.0.0-rc.1": + version "6.0.0-rc.1" + resolved "https://www.myget.org/F/abp-nightly/npm/@abp/datatables.net-bs5/-/@abp/datatables.net-bs5-6.0.0-rc.1.tgz#111c8c04e7d31f1b417602c7dde87d5a49104890" + integrity sha1-ERyMBOfTHxtBdgLH3eh9WkkQSJA= dependencies: - "@abp/datatables.net" "~5.3.0-rc.1" + "@abp/datatables.net" "~6.0.0-rc.1" datatables.net-bs5 "^1.11.4" -"@abp/datatables.net@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-5.3.0-rc.1.tgz#38c0f6323f7e6305a50f7de9885b8a3f440cdf15" - integrity sha512-lecJ9Yelgey/nfSscsUHET0gyB6pZgkhnJXu3u8d9XhV2M5sc/WSnnCO3bgVBqMDImprR4GFPFw2cUlWkb8QBg== +"@abp/datatables.net@~6.0.0-rc.1": + version "6.0.0-rc.1" + resolved "https://www.myget.org/F/abp-nightly/npm/@abp/datatables.net/-/@abp/datatables.net-6.0.0-rc.1.tgz#278762acd0df9c7fd50ef0caef9a9e6c32665e6f" + integrity sha1-J4dirNDfnH/VDvDK75qebDJmXm8= dependencies: - "@abp/jquery" "~5.3.0-rc.1" + "@abp/jquery" "~6.0.0-rc.1" datatables.net "^1.11.4" -"@abp/font-awesome@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-5.3.0-rc.1.tgz#de14dca2b33fdc098d2325c5047e030a3927bfa9" - integrity sha512-tIuDwo+L5CuLpQ+ARsaTYmxuqpSJLqcaXuoFfk6JAC20bw881t7y8w4xWy1PUs0+SEQwTT7diZjQrcA/xxlMUQ== +"@abp/font-awesome@~6.0.0-rc.1": + version "6.0.0-rc.1" + resolved "https://www.myget.org/F/abp-nightly/npm/@abp/font-awesome/-/@abp/font-awesome-6.0.0-rc.1.tgz#87b89f8923b262a8531cf4702cf318d9fab155b6" + integrity sha1-h7ifiSOyYqhTHPRwLPMY2fqxVbY= dependencies: - "@abp/core" "~5.3.0-rc.1" + "@abp/core" "~6.0.0-rc.1" "@fortawesome/fontawesome-free" "^5.15.4" -"@abp/jquery-form@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-5.3.0-rc.1.tgz#0a363d8e4814651e0c46e2109d19dcc84fc884b0" - integrity sha512-IWazO6BW5rHJ+ODk4haEqWzfzHvbxtW2+T1o534Lr7d+LI9yabNiQmRZ24yzNDb6SmRvDUVsumZ+lxPn2WBhIw== +"@abp/jquery-form@~6.0.0-rc.1": + version "6.0.0-rc.1" + resolved "https://www.myget.org/F/abp-nightly/npm/@abp/jquery-form/-/@abp/jquery-form-6.0.0-rc.1.tgz#5bb68fbb2ce0c3b9a59a52ab20c4ea971258c3b1" + integrity sha1-W7aPuyzgw7mlmlKrIMTqlxJYw7E= dependencies: - "@abp/jquery" "~5.3.0-rc.1" + "@abp/jquery" "~6.0.0-rc.1" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-5.3.0-rc.1.tgz#0aa2a5535acd79b5288ef04a0dc1b83a7a57b4b9" - integrity sha512-Qv/+nrd+ZeUs/2mCMahpQFqEguMOcmHrLg7hcw0LgcHr+MmEcG4WDcijTY6suFyekaf0DZD6vsFZjdvZmhsVYQ== +"@abp/jquery-validation-unobtrusive@~6.0.0-rc.1": + version "6.0.0-rc.1" + resolved "https://www.myget.org/F/abp-nightly/npm/@abp/jquery-validation-unobtrusive/-/@abp/jquery-validation-unobtrusive-6.0.0-rc.1.tgz#d082de2aa6c2d8bc2a0808b4159d0f5d281afdd2" + integrity sha1-0ILeKqbC2LwqCAi0FZ0PXSga/dI= dependencies: - "@abp/jquery-validation" "~5.3.0-rc.1" + "@abp/jquery-validation" "~6.0.0-rc.1" jquery-validation-unobtrusive "^3.2.12" -"@abp/jquery-validation@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-5.3.0-rc.1.tgz#d05afbe0209c0815afe3a7cb0cf811256e9905fc" - integrity sha512-3DoRX6c8duRx1/g7MFuPAO/qesJCFqbVbw+x0+QnKmCkVZmz5VFAqdO9yFMxDFRbBAtyp7faaarc0lOtAcBsoA== +"@abp/jquery-validation@~6.0.0-rc.1": + version "6.0.0-rc.1" + resolved "https://www.myget.org/F/abp-nightly/npm/@abp/jquery-validation/-/@abp/jquery-validation-6.0.0-rc.1.tgz#e30227075f6d7eabe6224faf2e033622ce0fe3b1" + integrity sha1-4wInB19tfqvmIk+vLgM2Is4P47E= dependencies: - "@abp/jquery" "~5.3.0-rc.1" + "@abp/jquery" "~6.0.0-rc.1" jquery-validation "^1.19.3" -"@abp/jquery@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-5.3.0-rc.1.tgz#26e5d5761f2629d02b2534ad964080221d536308" - integrity sha512-//bqInarV6XOs8+I5GW1q/c05sjnCq/Z0vuzFW1i1NDrQ2Q5kqF5leMV9hhGEZmfR+yG1T0MsbVvueieRkV/cA== +"@abp/jquery@~6.0.0-rc.1": + version "6.0.0-rc.1" + resolved "https://www.myget.org/F/abp-nightly/npm/@abp/jquery/-/@abp/jquery-6.0.0-rc.1.tgz#6f486cfc16dd915ccd4fe4a3029fa6359fea49c0" + integrity sha1-b0hs/BbdkVzNT+SjAp+mNZ/qScA= dependencies: - "@abp/core" "~5.3.0-rc.1" + "@abp/core" "~6.0.0-rc.1" jquery "~3.6.0" -"@abp/lodash@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-5.3.0-rc.1.tgz#c53304fbd9b1c885a9a812c681c3698dd8ecea47" - integrity sha512-yBvUB05z/SSEEbZ79nFfb0cKwWVFbrt9OtUkQHy9ER7ip0R9escG2n1djFtAA33yZr/NLzSUh+vVBYsEhk8MOA== +"@abp/lodash@~6.0.0-rc.1": + version "6.0.0-rc.1" + resolved "https://www.myget.org/F/abp-nightly/npm/@abp/lodash/-/@abp/lodash-6.0.0-rc.1.tgz#5e143be48e1d266356bd726764a89f520c55e8a5" + integrity sha1-XhQ75I4dJmNWvXJnZKifUgxV6KU= dependencies: - "@abp/core" "~5.3.0-rc.1" + "@abp/core" "~6.0.0-rc.1" lodash "^4.17.21" -"@abp/luxon@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-5.3.0-rc.1.tgz#bcb4de01b20a8e4da8db186e88fdebfcde47fb8f" - integrity sha512-SLozcDvCL/2jyvG2ZU+DHjzbfHYdmwiRjWu7gWyNjaY2e6D3NraHHjpMQ7ubObXZRlhhvfcp0i6eeKKoZNJtEQ== +"@abp/luxon@~6.0.0-rc.1": + version "6.0.0-rc.1" + resolved "https://www.myget.org/F/abp-nightly/npm/@abp/luxon/-/@abp/luxon-6.0.0-rc.1.tgz#a4242d862576b4151912d48fbf81d89862b6a91e" + integrity sha1-pCQthiV2tBUZEtSPv4HYmGK2qR4= dependencies: - "@abp/core" "~5.3.0-rc.1" + "@abp/core" "~6.0.0-rc.1" luxon "^2.3.0" -"@abp/malihu-custom-scrollbar-plugin@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-5.3.0-rc.1.tgz#398181c7c6cc1805544e7a1ccd0423ed96005e0b" - integrity sha512-KZar881wtotKc+1bqDlBWo2vLUEeeqEpMBg8+BiXsGofp5ovudifVPM6mHZ9Gi29U9LAMyI0VEGwLJctgB/UoA== +"@abp/malihu-custom-scrollbar-plugin@~6.0.0-rc.1": + version "6.0.0-rc.1" + resolved "https://www.myget.org/F/abp-nightly/npm/@abp/malihu-custom-scrollbar-plugin/-/@abp/malihu-custom-scrollbar-plugin-6.0.0-rc.1.tgz#738efa17783450971c6f47608cfafc0ef87d8ec6" + integrity sha1-c476F3g0UJccb0dgjPr8Dvh9jsY= dependencies: - "@abp/core" "~5.3.0-rc.1" + "@abp/core" "~6.0.0-rc.1" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/select2@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-5.3.0-rc.1.tgz#b2ce00b6545674d6bccc10fdfe4626a4598a0cdc" - integrity sha512-frE5jia7bBdZinW4LqD5JR+wknWu2ARX3L3pPiQ080ulB+P58gRj07ZPd1BWgRcvutnuANYyP9rZtDA18Ls+9Q== +"@abp/select2@~6.0.0-rc.1": + version "6.0.0-rc.1" + resolved "https://www.myget.org/F/abp-nightly/npm/@abp/select2/-/@abp/select2-6.0.0-rc.1.tgz#d4ba6e71536c56ef2c98c1b3342f15fc286d3c1b" + integrity sha1-1LpucVNsVu8smMGzNC8V/ChtPBs= dependencies: - "@abp/core" "~5.3.0-rc.1" + "@abp/core" "~6.0.0-rc.1" select2 "^4.0.13" -"@abp/sweetalert2@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-5.3.0-rc.1.tgz#6eb10b257e7f256da64ff6fe248a370671a26920" - integrity sha512-g9nddGcDGaG6EmjX7qpRcLzy3F38BTtFc0RBWApH7Da1o/LMYFYa6xGfS7ouIynZBM9j/BRP12CVTR+Y9qqbGg== +"@abp/sweetalert2@~6.0.0-rc.1": + version "6.0.0-rc.1" + resolved "https://www.myget.org/F/abp-nightly/npm/@abp/sweetalert2/-/@abp/sweetalert2-6.0.0-rc.1.tgz#2633ed54227a703dbd81e2db0923d6f402561232" + integrity sha1-JjPtVCJ6cD29geLbCSPW9AJWEjI= dependencies: - "@abp/core" "~5.3.0-rc.1" + "@abp/core" "~6.0.0-rc.1" sweetalert2 "^11.3.6" -"@abp/timeago@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-5.3.0-rc.1.tgz#2702a0f22db52dbf4c0717e4abcd317c56d10563" - integrity sha512-XRc4D98FIZR0YTXIoV0+OxVJTdixtNDiwatZRffopHT4Kpptmpj6O9KMcB4SngCH99/TrUFdEUnA2CgszxiEOA== +"@abp/timeago@~6.0.0-rc.1": + version "6.0.0-rc.1" + resolved "https://www.myget.org/F/abp-nightly/npm/@abp/timeago/-/@abp/timeago-6.0.0-rc.1.tgz#78903b3d523da6985a83a306d6a31d223b244d8b" + integrity sha1-eJA7PVI9pphag6MG1qMdIjskTYs= dependencies: - "@abp/jquery" "~5.3.0-rc.1" + "@abp/jquery" "~6.0.0-rc.1" timeago "^1.6.7" -"@abp/toastr@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-5.3.0-rc.1.tgz#ec3a3d302ac91d5393c3caeb8b4884ad811b6edb" - integrity sha512-InZweYuBkrNZNBQKp6A+6gxGdO/lB0XsrXaa+CIVe55p8aNJPzE0mnvSfKWhN5G273wR08AD9RjR22kYS+bgFA== +"@abp/toastr@~6.0.0-rc.1": + version "6.0.0-rc.1" + resolved "https://www.myget.org/F/abp-nightly/npm/@abp/toastr/-/@abp/toastr-6.0.0-rc.1.tgz#2cb0898d48bad1cb8cb5e994b55e51d60e5a6b90" + integrity sha1-LLCJjUi60cuMtemUtV5R1g5aa5A= dependencies: - "@abp/jquery" "~5.3.0-rc.1" + "@abp/jquery" "~6.0.0-rc.1" toastr "^2.1.4" -"@abp/utils@~5.3.0-rc.1": - version "5.3.0-rc.1" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-5.3.0-rc.1.tgz#3fa758944e7325e7b3f528141e03bb71f8e04d24" - integrity sha512-/8BTYZomNMdy+RpYXWLp5dg0lRhmfiguciZEVWo4qRw1lCXm/JR+0842XT1XYE1dQ4orNNJ3/H86eRX8Ab6Yfg== +"@abp/utils@~6.0.0-rc.1": + version "6.0.0-rc.1" + resolved "https://www.myget.org/F/abp-nightly/npm/@abp/utils/-/@abp/utils-6.0.0-rc.1.tgz#f25b383d6d7ba28c1220399397247cdef9704daf" + integrity sha1-8ls4PW17oowSIDmTlyR83vlwTa8= dependencies: just-compare "^1.3.0" diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj index 9715a1ebbd..8cd4c0d3c8 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj @@ -16,9 +16,14 @@ - + - + + + + + + diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyProjectNameBlazorModule.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyProjectNameBlazorModule.cs index 338ae879b8..84abc220c8 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyProjectNameBlazorModule.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyProjectNameBlazorModule.cs @@ -2,7 +2,6 @@ using System.Net.Http; using Blazorise.Bootstrap5; using Blazorise.Icons.FontAwesome; -using IdentityModel; using Microsoft.AspNetCore.Components.WebAssembly.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; @@ -16,7 +15,6 @@ using Volo.Abp.AutoMapper; using Volo.Abp.Modularity; using Volo.Abp.UI.Navigation; using Volo.Abp.Identity.Blazor.WebAssembly; -using Volo.Abp.Security.Claims; using Volo.Abp.SettingManagement.Blazor.WebAssembly; using Volo.Abp.TenantManagement.Blazor.WebAssembly; diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/wwwroot/global.css b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/wwwroot/global.css index c43ac39dc2..4784673730 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/wwwroot/global.css +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/wwwroot/global.css @@ -5063,7 +5063,7 @@ select.form-select option:checked[selected], select.form-select option:focus[sel } .card .card-title { font-size: 1.25em; - font-weight: 600; + font-weight: 500; color: #161616; } .card.text-white .card-title, .card.text-white .card-text { @@ -5515,102 +5515,219 @@ select.form-select option:checked[selected], select.form-select option:focus[sel } .alert-brand { - color: #686b6e; background: rgba(247, 37, 133, 0.2); + -webkit-backdrop-filter: saturate(100%) blur(10px); + backdrop-filter: saturate(100%) blur(10px); + position: relative; +} +.alert-brand:before { + content: ""; + background: rgba(245, 245, 247, 0.1); + position: absolute; + z-index: -1; + top: 0; + left: 0; + bottom: 0; + right: 0; + border-radius: 0.5rem; } -.alert-brand a, +.alert-brand a, .alert-brand .bi, .alert-brand .fa, .alert-brand .icon, .alert-brand .highlight, .alert-brand .alert-link { - color: #686b6e; + color: unset; } .alert-primary { - color: #686b6e; background: rgba(53, 93, 255, 0.2); + -webkit-backdrop-filter: saturate(100%) blur(10px); + backdrop-filter: saturate(100%) blur(10px); + position: relative; } -.alert-primary a, +.alert-primary:before { + content: ""; + background: rgba(245, 245, 247, 0.1); + position: absolute; + z-index: -1; + top: 0; + left: 0; + bottom: 0; + right: 0; + border-radius: 0.5rem; +} +.alert-primary a, .alert-primary .bi, .alert-primary .fa, .alert-primary .icon, .alert-primary .highlight, .alert-primary .alert-link { - color: #686b6e; + color: unset; } .alert-secondary { - color: #686b6e; background: rgba(108, 93, 211, 0.2); + -webkit-backdrop-filter: saturate(100%) blur(10px); + backdrop-filter: saturate(100%) blur(10px); + position: relative; +} +.alert-secondary:before { + content: ""; + background: rgba(245, 245, 247, 0.1); + position: absolute; + z-index: -1; + top: 0; + left: 0; + bottom: 0; + right: 0; + border-radius: 0.5rem; } -.alert-secondary a, +.alert-secondary a, .alert-secondary .bi, .alert-secondary .fa, .alert-secondary .icon, .alert-secondary .highlight, .alert-secondary .alert-link { - color: #686b6e; + color: unset; } .alert-success { - color: #686b6e; background: rgba(79, 191, 103, 0.2); + -webkit-backdrop-filter: saturate(100%) blur(10px); + backdrop-filter: saturate(100%) blur(10px); + position: relative; +} +.alert-success:before { + content: ""; + background: rgba(245, 245, 247, 0.1); + position: absolute; + z-index: -1; + top: 0; + left: 0; + bottom: 0; + right: 0; + border-radius: 0.5rem; } -.alert-success a, +.alert-success a, .alert-success .bi, .alert-success .fa, .alert-success .icon, .alert-success .highlight, .alert-success .alert-link { - color: #686b6e; + color: unset; } .alert-info { - color: #686b6e; background: rgba(67, 138, 167, 0.2); + -webkit-backdrop-filter: saturate(100%) blur(10px); + backdrop-filter: saturate(100%) blur(10px); + position: relative; +} +.alert-info:before { + content: ""; + background: rgba(245, 245, 247, 0.1); + position: absolute; + z-index: -1; + top: 0; + left: 0; + bottom: 0; + right: 0; + border-radius: 0.5rem; } -.alert-info a, +.alert-info a, .alert-info .bi, .alert-info .fa, .alert-info .icon, .alert-info .highlight, .alert-info .alert-link { - color: #686b6e; + color: unset; } .alert-warning { - color: #686b6e; background: rgba(255, 159, 56, 0.2); + -webkit-backdrop-filter: saturate(100%) blur(10px); + backdrop-filter: saturate(100%) blur(10px); + position: relative; } -.alert-warning a, +.alert-warning:before { + content: ""; + background: rgba(245, 245, 247, 0.1); + position: absolute; + z-index: -1; + top: 0; + left: 0; + bottom: 0; + right: 0; + border-radius: 0.5rem; +} +.alert-warning a, .alert-warning .bi, .alert-warning .fa, .alert-warning .icon, .alert-warning .highlight, .alert-warning .alert-link { - color: #686b6e; + color: unset; } .alert-danger { - color: #686b6e; background: rgba(192, 13, 73, 0.2); + -webkit-backdrop-filter: saturate(100%) blur(10px); + backdrop-filter: saturate(100%) blur(10px); + position: relative; +} +.alert-danger:before { + content: ""; + background: rgba(245, 245, 247, 0.1); + position: absolute; + z-index: -1; + top: 0; + left: 0; + bottom: 0; + right: 0; + border-radius: 0.5rem; } -.alert-danger a, +.alert-danger a, .alert-danger .bi, .alert-danger .fa, .alert-danger .icon, .alert-danger .highlight, .alert-danger .alert-link { - color: #686b6e; + color: unset; } .alert-light { - color: #686b6e; background: rgba(245, 245, 247, 0.2); + -webkit-backdrop-filter: saturate(100%) blur(10px); + backdrop-filter: saturate(100%) blur(10px); + position: relative; +} +.alert-light:before { + content: ""; + background: rgba(245, 245, 247, 0.1); + position: absolute; + z-index: -1; + top: 0; + left: 0; + bottom: 0; + right: 0; + border-radius: 0.5rem; } -.alert-light a, +.alert-light a, .alert-light .bi, .alert-light .fa, .alert-light .icon, .alert-light .highlight, .alert-light .alert-link { - color: #686b6e; + color: unset; } .alert-dark { - color: #686b6e; background: rgba(22, 22, 22, 0.2); + -webkit-backdrop-filter: saturate(100%) blur(10px); + backdrop-filter: saturate(100%) blur(10px); + position: relative; +} +.alert-dark:before { + content: ""; + background: rgba(245, 245, 247, 0.1); + position: absolute; + z-index: -1; + top: 0; + left: 0; + bottom: 0; + right: 0; + border-radius: 0.5rem; } -.alert-dark a, +.alert-dark a, .alert-dark .bi, .alert-dark .fa, .alert-dark .icon, .alert-dark .highlight, .alert-dark .alert-link { - color: #686b6e; + color: unset; } @keyframes progress-bar-stripes { @@ -11891,7 +12008,7 @@ body { background-color: #161616; } -li { +.lpx-breadcrumb li, .lpx-nav-menu li { list-style-type: none; } @@ -11922,7 +12039,7 @@ li { } } .lpx-content-container .lpx-content { - padding: 2em; + padding: 1.25em 2em 3em; max-width: 1280px; margin: 0 auto; } @@ -11948,16 +12065,16 @@ li { } .lpx-main-title { - font-size: 1.5em !important; - font-weight: 600; + font-size: 1.25rem !important; + font-weight: 500; color: #161616; - margin-bottom: 1em; - margin-top: 0.3333333333em; + margin-bottom: 0.875rem; + margin-top: 0.875rem; } .lpx-sidebar { background-color: #161616; - color: #777d87; + color: #9198a5; display: flex; flex-direction: column; align-items: center; @@ -12071,6 +12188,44 @@ li { } } +.lpx-content { + min-height: calc(100vh - 64px); +} + +.lpx-nav { + padding-top: 72px; +} + +.lpx-topbar-content { + display: flex; + align-items: center; + margin-right: 0.4rem; + gap: 0.7rem; + font-size: 0.875em; +} +.lpx-topbar-content .lpx-avatar .lpx-avatar-img, +.lpx-topbar-content .lpx-avatar .lpx-avatar-icon { + height: 24px; + width: 24px; +} + +@media only screen and (min-width: 1200px) { + .lpx-footbar-container { + left: 280px; + } +} +@media only screen and (min-width: 768px) and (max-width: 1199px) { + .lpx-footbar-container { + left: 72px; + } +} + +@media only screen and (min-width: 1200px) { + #lpx-wrapper.hover-trigger .lpx-footbar-container { + left: 72px; + } +} + .lpx-avatar { justify-content: center; align-items: center; @@ -12092,33 +12247,50 @@ li { align-items: center; display: flex; font-size: 20px; - color: #777d87; + color: #9198a5; background-color: #f5f5f7; } .lpx-avatar .lpx-avatar-icon .lpx-icon { display: flex; } +.lpx-avatar-img-md { + height: 72px; + width: 72px; + border-radius: 72px; +} + +.lpx-avatar-img-lg { + height: 144px; + width: 144px; + border-radius: 144px; +} + +.lpx-breadcrumb-wrapper { + width: 100%; + justify-content: space-between; + margin: 0 auto; +} + .lpx-breadcrumb-container { - height: 40px; + height: 30px; } .lpx-breadcrumb { display: flex; padding: 0; margin: 0; - border-radius: 16px 16px 0 0; + border-radius: 0.5rem; } .lpx-breadcrumb-item { cursor: pointer; position: relative; - font-size: 0.875em; - padding: 0 16px; + font-size: 0.725rem; + padding: 0 10px; margin: 0; - color: rgba(104, 107, 110, 0.65); transition: background-color 0.3s ease; - line-height: 40px; + line-height: 30px; } .lpx-breadcrumb-item a { color: unset; @@ -12192,10 +12364,10 @@ li { .lpx-breadcrumb-separator { font-weight: bold; - line-height: 40px; + line-height: 30px; width: 1px; overflow: hidden; - background: rgba(104, 107, 110, 0.08); + background: rgba(104, 107, 110, 0.075); } .lpx-breadcrumb-separator:last-child { display: none; @@ -12275,31 +12447,96 @@ li { } .lpx-topbar-container { - top: 0; + flex-wrap: wrap; position: sticky; + top: 0; padding: 0; background-color: #161616; z-index: 101; - flex-wrap: wrap; - -webkit-backdrop-filter: saturate(180%) blur(20px); - backdrop-filter: saturate(180%) blur(20px); + box-shadow: 0 0 20px 0 rgba(76, 87, 125, 0.02); } - -.lpx-topbar { +.lpx-topbar-container .lpx-topbar { display: flex; justify-content: space-between; + margin: 0 auto; background-color: #f5f5f7; - border-radius: 16px 16px 0 0; + border-radius: 1em 1em 0 0; padding: 0; - border-bottom: 1px solid rgba(104, 107, 110, 0.08); + border: 1px solid rgba(104, 107, 110, 0.075); } -.lpx-topbar-content { - justify-content: center; - align-items: center; +.lpx-content-wrapper { + border: 1px solid rgba(104, 107, 110, 0.075); + border-top: 0; +} + +.lpx-footbar-container { + flex-wrap: wrap; + padding: 0; + background-color: #161616; + z-index: 101; + position: fixed; + bottom: 0; + top: inherit; + right: 72px; + left: 280px; + box-shadow: 0 0 20px 0 rgba(76, 87, 125, 0.02); +} +@media only screen and (max-width: 767px) { + .lpx-footbar-container { + top: auto; + right: 0; + left: 0; + bottom: 72px; + } +} +.lpx-footbar-container .lpx-footbar { display: flex; - margin-right: 10px; - gap: 0.5rem; + justify-content: space-between; + margin: 0 auto; + background-color: #f5f5f7; + border-radius: 0 0 1em 1em; + border: 1px solid rgba(104, 107, 110, 0.075); + font-size: 0.725rem; +} +.lpx-footbar-container .lpx-footbar .lpx-footbar-solo-links { + display: flex; +} +.lpx-footbar-container .lpx-footbar .lpx-footbar-solo-links a { + border-left: 1px solid rgba(104, 107, 110, 0.075); + line-height: 30px; + color: #686b6e; + text-decoration: none; + padding: 0 1rem; + transition: color 0.2s ease; +} +.lpx-footbar-container .lpx-footbar .lpx-footbar-solo-links a:hover { + color: var(--lpx-brand); +} +.lpx-footbar-container .lpx-footbar .lpx-footbar-copyright { + color: #686b6e; + line-height: 30px; + padding-left: 1rem; + padding-right: 1rem; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +.lpx-footbar-container .lpx-footbar .lpx-footbar-copyright span { + opacity: 0.5; +} +.lpx-footbar-container .lpx-footbar .lpx-footbar-copyright a { + color: #686b6e; + text-decoration: none; + transition: color 0.2s ease; +} +.lpx-footbar-container .lpx-footbar .lpx-footbar-copyright a:hover { + color: var(--lpx-brand); +} + +#lpx-wrapper.boxed .lpx-footbar-container { + position: sticky; + bottom: 0; } .lpx-menu-item { @@ -12307,8 +12544,7 @@ li { } .lpx-nav { - color: #777d87; - padding-top: 72px; + color: #9198a5; } .lpx-nav .lpx-nav-menu { padding: 0 0 15px 0; @@ -12329,7 +12565,7 @@ li { display: flex; width: 100%; cursor: pointer; - color: #777d87; + color: #9198a5; height: 48px; line-height: 48px; transition: color 0.25s ease, background-color 0.3s ease; @@ -12358,12 +12594,10 @@ li { opacity: 1; } .lpx-nav-menu .lpx-menu-item-link .lpx-menu-item-icon .lpx-icon { - line-height: 1; text-align: center; display: inline-block; position: relative; width: 48px; - height: 48px; transition: all 0.25s ease; font-size: 16px; opacity: 0.86; @@ -12409,6 +12643,47 @@ li { padding-left: 84px; } +.lpx-menu-item { + cursor: pointer; + color: #9198a5; + height: 48px; + line-height: 48px; + transition: color 0.25s ease, background-color 0.3s ease; +} +.lpx-menu-item:hover { + color: #fff; +} +.lpx-menu-item:hover .lpx-menu-item-icon { + color: var(--lpx-brand); + opacity: 1; +} +.lpx-menu-item:hover .dd-icon { + color: #fff; + opacity: 1; +} +.lpx-menu-item.selected { + color: #fff; + background-color: #222; +} +.lpx-menu-item.selected .lpx-menu-item-icon, +.lpx-menu-item.selected .dd-icon { + color: var(--lpx-brand); + opacity: 1; +} +.lpx-menu-item .dd-icon { + position: absolute; + text-align: center; + opacity: 0.5; + right: 24px; + width: 24px; +} +.lpx-inner-menu-item .lpx-menu-item-link { + transition: background-color 0.5s ease, color 0.25s ease; +} +.lpx-inner-menu-item .lpx-menu-item-link.selected, .lpx-inner-menu-item .lpx-menu-item-link:hover { + background-color: #222; +} + .lpx-favorite { display: flex; align-items: center; @@ -12416,6 +12691,20 @@ li { cursor: pointer; } +.lpx-footer { + border-top: 1px solid rgba(104, 107, 110, 0.075); + font-size: 0.725rem; + color: rgba(104, 107, 110, 0.75); +} +.lpx-footer a { + padding: 0 10px; + margin: 0; + color: rgba(104, 107, 110, 0.75); + transition: background-color 0.3s ease; + line-height: 30px; + text-decoration: none; +} + .lpx-user-profile { justify-content: center; align-items: center; @@ -12456,7 +12745,7 @@ li { } .lpx-mobile-navbar .user-menu .lpx-icon { font-size: 36px; - color: #777d87; + color: #9198a5; } .lpx-mobile-navbar .lpx-logo-container { flex: 1 1 auto; @@ -12508,14 +12797,14 @@ li { color: #fff; } .user-menu-groups .action { - color: #777d87; + color: #9198a5; display: block; } .user-menu-groups .divider { height: 0; margin: 0.5rem 0; overflow: hidden; - border-top: 1px solid rgba(119, 125, 135, 0.3); + border-top: 1px solid rgba(145, 152, 165, 0.3); } .user-menu-groups .action-group-menu { padding: 12px 0; diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/wwwroot/global.js b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/wwwroot/global.js index ed4491e7a5..89e38005bc 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/wwwroot/global.js +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/wwwroot/global.js @@ -12,7 +12,7 @@ var abp=abp||{};(function(){abp.utils=abp.utils||{};abp.utils.updateHTMLDirAndLa */ (function(n,t){typeof exports=="object"&&typeof module!="undefined"?module.exports=t():typeof define=="function"&&define.amd?define(t):(n=typeof globalThis!="undefined"?globalThis:n||self,n.bootstrap=t())})(this,function(){"use strict";function oe(n,t){return t&&`${t}::${fe++}`||n.uidEvent||fe++}function se(n){const t=oe(n);return n.uidEvent=t,su[t]=su[t]||{},su[t]}function yl(t,i){return function r(u){return u.delegateTarget=t,r.oneOff&&n.off(t,u.type,i),i.apply(t,[u])}}function pl(t,i,r){return function u(f){const e=t.querySelectorAll(i);for(let{target:o}=f;o&&o!==this;o=o.parentNode)for(let s=e.length;s--;)if(e[s]===o)return f.delegateTarget=o,u.oneOff&&n.off(t,f.type,i,r),r.apply(o,[f]);return null}}function he(n,t,i=null){const r=Object.keys(n);for(let u=0,f=r.length;ufunction(t){if(!t.relatedTarget||t.relatedTarget!==t.delegateTarget&&!t.delegateTarget.contains(t.relatedTarget))return n.call(this,t)};r?r=n(r):i=n(i)}const[e,o,s]=ce(t,i,r),c=se(n),l=c[s]||(c[s]={}),h=he(l,o,e?i:null);if(h){h.oneOff=h.oneOff&&u;return}const a=oe(o,t.replace(hl,"")),f=e?pl(n,i,r):yl(n,i);f.delegationSelector=e?i:null;f.originalHandler=o;f.oneOff=u;f.uidEvent=a;l[a]=f;n.addEventListener(s,f,e)}}function hu(n,t,i,r,u){const f=he(t[i],r,u);f&&(n.removeEventListener(i,f,Boolean(u)),delete t[i][f.uidEvent])}function wl(n,t,i,r){const u=t[i]||{};Object.keys(u).forEach(f=>{if(f.includes(r)){const r=u[f];hu(n,t,i,r.originalHandler,r.delegationSelector)}})}function ae(n){return n=n.replace(cl,""),al[n]||n}function pe(n){return n==="true"?!0:n==="false"?!1:n===Number(n).toString()?Number(n):n===""||n==="null"?null:n}function cu(n){return n.replace(/[A-Z]/g,n=>`-${n.toLowerCase()}`)}function w(n){return n?(n.nodeName||"").toLowerCase():null}function y(n){if(n==null)return window;if(n.toString()!=="[object Window]"){var t=n.ownerDocument;return t?t.defaultView||window:window}return n}function yi(n){var t=y(n).Element;return n instanceof t||n instanceof Element}function c(n){var t=y(n).HTMLElement;return n instanceof t||n instanceof HTMLElement}function wo(n){if(typeof ShadowRoot=="undefined")return!1;var t=y(n).ShadowRoot;return n instanceof t||n instanceof ShadowRoot}function oy(n){var t=n.state;Object.keys(t.elements).forEach(function(n){var u=t.styles[n]||{},r=t.attributes[n]||{},i=t.elements[n];c(i)&&w(i)&&(Object.assign(i.style,u),Object.keys(r).forEach(function(n){var t=r[n];t===!1?i.removeAttribute(n):i.setAttribute(n,t===!0?"":t)}))})}function sy(n){var t=n.state,i={popper:{position:t.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(t.elements.popper.style,i.popper),t.styles=i,t.elements.arrow&&Object.assign(t.elements.arrow.style,i.arrow),function(){Object.keys(t.elements).forEach(function(n){var r=t.elements[n],u=t.attributes[n]||{},f=Object.keys(t.styles.hasOwnProperty(n)?t.styles[n]:i[n]),e=f.reduce(function(n,t){return n[t]="",n},{});c(r)&&w(r)&&(Object.assign(r.style,e),Object.keys(u).forEach(function(n){r.removeAttribute(n)}))})}}function b(n){return n.split("-")[0]}function ri(n){var t=n.getBoundingClientRect(),i=1,r=1;return{width:t.width/i,height:t.height/r,top:t.top/r,right:t.right/i,bottom:t.bottom/r,left:t.left/i,x:t.left/i,y:t.top/r}}function bu(n){var t=ri(n),i=n.offsetWidth,r=n.offsetHeight;return Math.abs(t.width-i)<=1&&(i=t.width),Math.abs(t.height-r)<=1&&(r=t.height),{x:n.offsetLeft,y:n.offsetTop,width:i,height:r}}function bo(n,t){var r=t.getRootNode&&t.getRootNode(),i;if(n.contains(t))return!0;if(r&&wo(r)){i=t;do{if(i&&n.isSameNode(i))return!0;i=i.parentNode||i.host}while(i)}return!1}function nt(n){return y(n).getComputedStyle(n)}function hy(n){return["table","td","th"].indexOf(w(n))>=0}function ut(n){return((yi(n)?n.ownerDocument:n.document)||window.document).documentElement}function ar(n){return w(n)==="html"?n:n.assignedSlot||n.parentNode||(wo(n)?n.host:null)||ut(n)}function ko(n){return!c(n)||nt(n).position==="fixed"?null:n.offsetParent}function cy(n){var r=navigator.userAgent.toLowerCase().indexOf("firefox")!==-1,f=navigator.userAgent.indexOf("Trident")!==-1,u,i,t;if(f&&c(n)&&(u=nt(n),u.position==="fixed"))return null;for(i=ar(n);c(i)&&["html","body"].indexOf(w(i))<0;){if(t=nt(i),t.transform!=="none"||t.perspective!=="none"||t.contain==="paint"||["transform","perspective"].indexOf(t.willChange)!==-1||r&&t.willChange==="filter"||r&&t.filter&&t.filter!=="none")return i;i=i.parentNode}return null}function pi(n){for(var i=y(n),t=ko(n);t&&hy(t)&&nt(t).position==="static";)t=ko(t);return t&&(w(t)==="html"||w(t)==="body"&&nt(t).position==="static")?i:t||cy(n)||i}function ku(n){return["top","bottom"].indexOf(n)>=0?"x":"y"}function yr(n,t,i){return ft(n,wi(t,i))}function go(){return{top:0,right:0,bottom:0,left:0}}function ns(n){return Object.assign({},go(),n)}function ts(n,t){return t.reduce(function(t,i){return t[i]=n,t},{})}function ly(n){var r,t=n.state,d=n.name,g=n.options,h=t.elements.arrow,c=t.modifiersData.popperOffsets,a=b(t.placement),i=ku(a),nt=[f,s].indexOf(a)>=0,e=nt?"height":"width";if(h&&c){var v=is(g.padding,t),y=bu(h),tt=i==="y"?u:f,it=i==="y"?o:s,rt=t.rects.reference[e]+t.rects.reference[i]-c[i]-t.rects.popper[e],ut=c[i]-t.rects.reference[i],l=pi(h),p=l?i==="y"?l.clientHeight||0:l.clientWidth||0:0,ft=rt/2-ut/2,et=v[tt],ot=p-y[e]-v[it],w=p/2-y[e]/2+ft,k=yr(et,w,ot),st=i;t.modifiersData[d]=(r={},r[st]=k,r.centerOffset=k-w,r)}}function ay(n){var i=n.state,u=n.options,r=u.element,t=r===void 0?"[data-popper-arrow]":r;t!=null&&(typeof t!="string"||(t=i.elements.popper.querySelector(t),t))&&bo(i.elements.popper,t)&&(i.elements.arrow=t)}function ui(n){return n.split("-")[1]}function vy(n){var i=n.x,r=n.y,u=window,t=u.devicePixelRatio||1;return{x:vr(vr(i*t)/t)||0,y:vr(vr(r*t)/t)||0}}function fs(n){var r,a=n.popper,d=n.popperRect,i=n.placement,g=n.variation,e=n.offsets,tt=n.position,v=n.gpuAcceleration,it=n.adaptive,p=n.roundOffsets,rt=p===!0?vy(e):typeof p=="function"?p(e):e,ft=rt.x,h=ft===void 0?0:ft,et=rt.y,c=et===void 0?0:et,ot=e.hasOwnProperty("x"),st=e.hasOwnProperty("y"),w=f,b=u,lt=window,k,l;if(it){var t=pi(a),ht="clientHeight",ct="clientWidth";t===y(a)&&(t=ut(a),nt(t).position!=="static"&&tt==="absolute"&&(ht="scrollHeight",ct="scrollWidth"));t=t;(i===u||(i===f||i===s)&&g===ti)&&(b=o,c-=t[ht]-d.height,c*=v?1:-1);(i===f||(i===u||i===o)&&g===ti)&&(w=s,h-=t[ct]-d.width,h*=v?1:-1)}return(k=Object.assign({position:tt},it&&us),v)?Object.assign({},k,(l={},l[b]=st?"0":"",l[w]=ot?"0":"",l.transform=(lt.devicePixelRatio||1)<=1?"translate("+h+"px, "+c+"px)":"translate3d("+h+"px, "+c+"px, 0)",l)):Object.assign({},k,(r={},r[b]=st?c+"px":"",r[w]=ot?h+"px":"",r.transform="",r))}function yy(n){var t=n.state,i=n.options,r=i.gpuAcceleration,s=r===void 0?!0:r,u=i.adaptive,h=u===void 0?!0:u,f=i.roundOffsets,e=f===void 0?!0:f,o={placement:b(t.placement),variation:ui(t.placement),popper:t.elements.popper,popperRect:t.rects.popper,gpuAcceleration:s};t.modifiersData.popperOffsets!=null&&(t.styles.popper=Object.assign({},t.styles.popper,fs(Object.assign({},o,{offsets:t.modifiersData.popperOffsets,position:t.options.strategy,adaptive:h,roundOffsets:e}))));t.modifiersData.arrow!=null&&(t.styles.arrow=Object.assign({},t.styles.arrow,fs(Object.assign({},o,{offsets:t.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:e}))));t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-placement":t.placement})}function py(n){var i=n.state,t=n.instance,r=n.options,u=r.scroll,f=u===void 0?!0:u,e=r.resize,o=e===void 0?!0:e,s=y(i.elements.popper),h=[].concat(i.scrollParents.reference,i.scrollParents.popper);return f&&h.forEach(function(n){n.addEventListener("scroll",t.update,bi)}),o&&s.addEventListener("resize",t.update,bi),function(){f&&h.forEach(function(n){n.removeEventListener("scroll",t.update,bi)});o&&s.removeEventListener("resize",t.update,bi)}}function pr(n){return n.replace(/left|right|bottom|top/g,function(n){return es[n]})}function ss(n){return n.replace(/start|end/g,function(n){return os[n]})}function nf(n){var t=y(n),i=t.pageXOffset,r=t.pageYOffset;return{scrollLeft:i,scrollTop:r}}function tf(n){return ri(ut(n)).left+nf(n).scrollLeft}function wy(n){var o=y(n),i=ut(n),t=o.visualViewport,r=i.clientWidth,u=i.clientHeight,f=0,e=0;return t&&(r=t.width,u=t.height,/^((?!chrome|android).)*safari/i.test(navigator.userAgent)||(f=t.offsetLeft,e=t.offsetTop)),{width:r,height:u,x:f+tf(n),y:e}}function by(n){var r,i=ut(n),u=nf(n),t=(r=n.ownerDocument)==null?void 0:r.body,f=ft(i.scrollWidth,i.clientWidth,t?t.scrollWidth:0,t?t.clientWidth:0),o=ft(i.scrollHeight,i.clientHeight,t?t.scrollHeight:0,t?t.clientHeight:0),e=-u.scrollLeft+tf(n),s=-u.scrollTop;return nt(t||i).direction==="rtl"&&(e+=ft(i.clientWidth,t?t.clientWidth:0)-f),{width:f,height:o,x:e,y:s}}function rf(n){var t=nt(n),i=t.overflow,r=t.overflowX,u=t.overflowY;return/auto|scroll|overlay|hidden/.test(i+u+r)}function hs(n){return["html","body","#document"].indexOf(w(n))>=0?n.ownerDocument.body:c(n)&&rf(n)?n:hs(ar(n))}function ki(n,t){var r;t===void 0&&(t=[]);var i=hs(n),u=i===((r=n.ownerDocument)==null?void 0:r.body),f=y(i),e=u?[f].concat(f.visualViewport||[],rf(i)?i:[]):i,o=t.concat(e);return u?o:o.concat(ki(ar(e)))}function uf(n){return Object.assign({},n,{left:n.x,top:n.y,right:n.x+n.width,bottom:n.y+n.height})}function ky(n){var t=ri(n);return t.top=t.top+n.clientTop,t.left=t.left+n.clientLeft,t.bottom=t.top+n.clientHeight,t.right=t.left+n.clientWidth,t.width=n.clientWidth,t.height=n.clientHeight,t.x=t.left,t.y=t.top,t}function cs(n,t){return t===vu?uf(wy(n)):c(t)?ky(t):uf(by(ut(n)))}function dy(n){var i=ki(ar(n)),r=["absolute","fixed"].indexOf(nt(n).position)>=0,t=r&&c(n)?pi(n):n;return yi(t)?i.filter(function(n){return yi(n)&&bo(n,t)&&w(n)!=="body"}):[]}function gy(n,t,i){var f=t==="clippingParents"?dy(n):[].concat(t),u=[].concat(f,[i]),e=u[0],r=u.reduce(function(t,i){var r=cs(n,i);return t.top=ft(r.top,t.top),t.right=wi(r.right,t.right),t.bottom=wi(r.bottom,t.bottom),t.left=ft(r.left,t.left),t},cs(n,e));return r.width=r.right-r.left,r.height=r.bottom-r.top,r.x=r.left,r.y=r.top,r}function ls(n){var t=n.reference,e=n.element,c=n.placement,l=c?b(c):null,y=c?ui(c):null,a=t.x+t.width/2-e.width/2,v=t.y+t.height/2-e.height/2,i,r,h;switch(l){case u:i={x:a,y:t.y-e.height};break;case o:i={x:a,y:t.y+t.height};break;case s:i={x:t.x+t.width,y:v};break;case f:i={x:t.x-e.width,y:v};break;default:i={x:t.x,y:t.y}}if(r=l?ku(l):null,r!=null){h=r==="y"?"height":"width";switch(y){case yt:i[r]=i[r]-(t[h]/2-e[h]/2);break;case ti:i[r]=i[r]+(t[h]/2-e[h]/2)}}return i}function fi(n,t){var it;t===void 0&&(t={});var i=t,v=i.placement,y=v===void 0?n.placement:v,p=i.boundary,rt=p===void 0?uo:p,w=i.rootBoundary,ft=w===void 0?vu:w,b=i.elementContext,r=b===void 0?ii:b,k=i.altBoundary,et=k===void 0?!1:k,d=i.padding,c=d===void 0?0:d,f=ns(typeof c!="number"?c:ts(c,ni)),ot=r===ii?fo:ii,g=n.rects.popper,l=n.elements[et?ot:r],e=gy(yi(l)?l:l.contextElement||ut(n.elements.popper),rt,ft),nt=ri(n.elements.reference),st=ls({reference:nt,element:g,strategy:"absolute",placement:y}),ht=uf(Object.assign({},g,st)),h=r===ii?ht:nt,a={top:e.top-h.top+f.top,bottom:h.bottom-e.bottom+f.bottom,left:e.left-h.left+f.left,right:h.right-e.right+f.right},tt=n.modifiersData.offset;return r===ii&&tt&&(it=tt[y],Object.keys(a).forEach(function(n){var t=[s,o].indexOf(n)>=0?1:-1,i=[u,o].indexOf(n)>=0?"y":"x";a[n]+=it[i]*t})),a}function np(n,t){var r;t===void 0&&(t={});var i=t,s=i.placement,h=i.boundary,c=i.rootBoundary,l=i.padding,a=i.flipVariations,f=i.allowedAutoPlacements,v=f===void 0?pu:f,e=ui(s),o=e?a?yu:yu.filter(function(n){return ui(n)===e}):ni,u=o.filter(function(n){return v.indexOf(n)>=0});return u.length===0&&(u=o),r=u.reduce(function(t,i){return t[i]=fi(n,{placement:i,boundary:h,rootBoundary:c,padding:l})[b(i)],t},{}),Object.keys(r).sort(function(n,t){return r[n]-r[t]})}function tp(n){if(b(n)===lr)return[];var t=pr(n);return[ss(n),t,ss(t)]}function ip(n){var t=n.state,i=n.options,k=n.name,a,ct,h,lt,at,y,vt;if(!t.modifiersData[k]._skip){var d=i.mainAxis,pt=d===void 0?!0:d,g=i.altAxis,wt=g===void 0?!0:g,bt=i.fallbackPlacements,nt=i.padding,tt=i.boundary,it=i.rootBoundary,kt=i.altBoundary,rt=i.flipVariations,p=rt===void 0?!0:rt,dt=i.allowedAutoPlacements,r=t.options.placement,gt=b(r),ni=gt===r,ti=bt||(ni||!p?[pr(r)]:tp(r)),c=[r].concat(ti).reduce(function(n,i){return n.concat(b(i)===lr?np(t,{placement:i,boundary:tt,rootBoundary:it,padding:nt,flipVariations:p,allowedAutoPlacements:dt}):i)},[]),ii=t.rects.reference,ri=t.rects.popper,ut=new Map,ft=!0,l=c[0];for(a=0;a=0,ht=st?"width":"height",w=fi(t,{placement:e,boundary:tt,rootBoundary:it,altBoundary:kt,padding:nt}),v=st?ot?s:f:ot?o:u;if(ii[ht]>ri[ht]&&(v=pr(v)),ct=pr(v),h=[],pt&&h.push(w[et]<=0),wt&&h.push(w[v]<=0,w[ct]<=0),h.every(function(n){return n})){l=e;ft=!1;break}ut.set(e,h)}if(ft)for(lt=p?3:1,at=function(n){var t=c.find(function(t){var i=ut.get(t);if(i)return i.slice(0,n).every(function(n){return n})});if(t)return l=t,"break"},y=lt;y>0;y--)if(vt=at(y),vt==="break")break;t.placement!==l&&(t.modifiersData[k]._skip=!0,t.placement=l,t.reset=!0)}}function vs(n,t,i){return i===void 0&&(i={x:0,y:0}),{top:n.top-t.height-i.y,right:n.right-t.width+i.x,bottom:n.bottom-t.height+i.y,left:n.left-t.width-i.x}}function ys(n){return[u,s,o,f].some(function(t){return n[t]>=0})}function rp(n){var t=n.state,e=n.name,o=t.rects.reference,s=t.rects.popper,h=t.modifiersData.preventOverflow,c=fi(t,{elementContext:"reference"}),l=fi(t,{altBoundary:!0}),i=vs(c,o),r=vs(l,s,h),u=ys(i),f=ys(r);t.modifiersData[e]={referenceClippingOffsets:i,popperEscapeOffsets:r,isReferenceHidden:u,hasPopperEscaped:f};t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-reference-hidden":u,"data-popper-escaped":f})}function up(n,t,i){var o=b(n),c=[f,u].indexOf(o)>=0?-1:1,h=typeof i=="function"?i(Object.assign({},t,{placement:n})):i,r=h[0],e=h[1];return r=r||0,e=(e||0)*c,[f,s].indexOf(o)>=0?{x:e,y:r}:{x:r,y:e}}function fp(n){var t=n.state,f=n.options,e=n.name,i=f.offset,o=i===void 0?[0,0]:i,r=pu.reduce(function(n,i){return n[i]=up(i,t.rects,o),n},{}),u=r[t.placement],s=u.x,h=u.y;t.modifiersData.popperOffsets!=null&&(t.modifiersData.popperOffsets.x+=s,t.modifiersData.popperOffsets.y+=h);t.modifiersData[e]=r}function ep(n){var t=n.state,i=n.name;t.modifiersData[i]=ls({reference:t.rects.reference,element:t.rects.popper,strategy:"absolute",placement:t.placement})}function op(n){return n==="x"?"y":"x"}function sp(n){var t=n.state,h=n.options,hi=n.name,rt=h.mainAxis,ut=rt===void 0?!0:rt,et=h.altAxis,ot=et===void 0?!1:et,ci=h.boundary,li=h.rootBoundary,ai=h.altBoundary,vi=h.padding,st=h.tether,c=st===void 0?!0:st,ht=h.tetherOffset,w=ht===void 0?0:ht,a=fi(t,{boundary:ci,rootBoundary:li,padding:vi,altBoundary:ai}),yi=b(t.placement),k=ui(t.placement),ct=!k,i=ku(yi),d=op(i),r=t.modifiersData.popperOffsets,l=t.rects.reference,g=t.rects.popper,v=typeof w=="function"?w(Object.assign({},t.rects,{placement:t.placement})):w,nt={x:0,y:0},it;if(r){if(ut||ot){var lt=i==="y"?u:f,at=i==="y"?o:s,e=i==="y"?"height":"width",vt=r[i],pt=r[i]+a[lt],wt=r[i]-a[at],bt=c?-g[e]/2:0,bi=k===yt?l[e]:g[e],ki=k===yt?-g[e]:-l[e],kt=t.elements.arrow,di=c&&kt?bu(kt):{width:0,height:0},dt=t.modifiersData["arrow#persistent"]?t.modifiersData["arrow#persistent"].padding:go(),gt=dt[lt],ni=dt[at],y=yr(0,l[e],di[e]),gi=ct?l[e]/2-bt-y-gt-v:bi-y-gt-v,nr=ct?-l[e]/2+bt+y+ni+v:ki+y+ni+v,tt=t.elements.arrow&&pi(t.elements.arrow),tr=tt?i==="y"?tt.clientTop||0:tt.clientLeft||0:0,ti=t.modifiersData.offset?t.modifiersData.offset[t.placement][i]:0,ii=r[i]+gi-ti-tr,ri=r[i]+nr-ti;if(ut&&(it=yr(c?wi(pt,ii):pt,vt,c?ft(wt,ri):wt),r[i]=it,nt[i]=it-vt),ot){var ir=i==="x"?u:f,rr=i==="x"?o:s,p=r[d],ei=p+a[ir],oi=p-a[rr],si=yr(c?wi(ei,ii):ei,p,c?ft(oi,ri):oi);r[d]=si;nt[d]=si-p}}t.modifiersData[hi]=nt}}function hp(n){return{scrollLeft:n.scrollLeft,scrollTop:n.scrollTop}}function cp(n){return n!==y(n)&&c(n)?hp(n):nf(n)}function lp(n){var t=n.getBoundingClientRect(),i=t.width/n.offsetWidth||1,r=t.height/n.offsetHeight||1;return i!==1||r!==1}function ap(n,t,i){var f;i===void 0&&(i=!1);f=c(t);c(t)&&lp(t);var e=ut(t),u=ri(n),o={scrollLeft:0,scrollTop:0},r={x:0,y:0};return!f&&(f||i)||((w(t)!=="body"||rf(e))&&(o=cp(t)),c(t)?(r=ri(t),r.x+=t.clientLeft,r.y+=t.clientTop):e&&(r.x=tf(e))),{x:u.left+o.scrollLeft-r.x,y:u.top+o.scrollTop-r.y,width:u.width,height:u.height}}function vp(n){function u(n){t.add(n.name);var f=[].concat(n.requires||[],n.requiresIfExists||[]);f.forEach(function(n){if(!t.has(n)){var r=i.get(n);r&&u(r)}});r.push(n)}var i=new Map,t=new Set,r=[];return n.forEach(function(n){i.set(n.name,n)}),n.forEach(function(n){t.has(n.name)||u(n)}),r}function yp(n){var t=vp(n);return po.reduce(function(n,i){return n.concat(t.filter(function(n){return n.phase===i}))},[])}function pp(n){var t;return function(){return t||(t=new Promise(function(i){Promise.resolve().then(function(){t=undefined;i(n())})})),t}}function wp(n){var t=n.reduce(function(n,t){var i=n[t.name];return n[t.name]=i?Object.assign({},i,t,{options:Object.assign({},i.options,t.options),data:Object.assign({},i.data,t.data)}):t,n},{});return Object.keys(t).map(function(n){return t[n]})}function ks(){for(var t=arguments.length,i=new Array(t),n=0;n{lk(n,e)||i.removeAttribute(n.nodeName)})}return r.body.innerHTML}var is,us,bi,es,os,ef;const rl=1e6,ul=1e3,fu="transitionend",fl=n=>n===null||n===undefined?`${n}`:{}.toString.call(n).match(/\s([a-z]+)/i)[1].toLowerCase(),el=n=>{do n+=Math.floor(Math.random()*rl);while(document.getElementById(n));return n},gf=n=>{let t=n.getAttribute("data-bs-target");if(!t||t==="#"){let i=n.getAttribute("href");if(!i||!i.includes("#")&&!i.startsWith("."))return null;i.includes("#")&&!i.startsWith("#")&&(i=`#${i.split("#")[1]}`);t=i&&i!=="#"?i.trim():null}return t},eu=n=>{const t=gf(n);return t?document.querySelector(t)?t:null:null},tt=n=>{const t=gf(n);return t?document.querySelector(t):null},ol=n=>{if(!n)return 0;let{transitionDuration:t,transitionDelay:i}=window.getComputedStyle(n);const r=Number.parseFloat(t),u=Number.parseFloat(i);return!r&&!u?0:(t=t.split(",")[0],i=i.split(",")[0],(Number.parseFloat(t)+Number.parseFloat(i))*ul)},ne=n=>{n.dispatchEvent(new Event(fu))},ot=n=>!n||typeof n!="object"?!1:(typeof n.jquery!="undefined"&&(n=n[0]),typeof n.nodeType!="undefined"),it=n=>ot(n)?n.jquery?n[0]:n:typeof n=="string"&&n.length>0?document.querySelector(n):null,p=(n,t,i)=>{Object.keys(i).forEach(r=>{const f=i[r],u=t[r],e=u&&ot(u)?"element":fl(u);if(!new RegExp(f).test(e))throw new TypeError(`${n.toUpperCase()}: Option "${r}" provided type "${e}" but expected type "${f}".`);})},ci=n=>!ot(n)||n.getClientRects().length===0?!1:getComputedStyle(n).getPropertyValue("visibility")==="visible",st=n=>!n||n.nodeType!==Node.ELEMENT_NODE?!0:n.classList.contains("disabled")?!0:typeof n.disabled!="undefined"?n.disabled:n.hasAttribute("disabled")&&n.getAttribute("disabled")!=="false",te=n=>{if(!document.documentElement.attachShadow)return null;if(typeof n.getRootNode=="function"){const t=n.getRootNode();return t instanceof ShadowRoot?t:null}return n instanceof ShadowRoot?n:n.parentNode?te(n.parentNode):null},fr=()=>{},kt=n=>{n.offsetHeight},ie=()=>{const{jQuery:n}=window;return n&&!document.body.hasAttribute("data-bs-no-jquery")?n:null},ou=[],sl=n=>{document.readyState==="loading"?(ou.length||document.addEventListener("DOMContentLoaded",()=>{ou.forEach(n=>n())}),ou.push(n)):n()},r=()=>document.documentElement.dir==="rtl",h=n=>{sl(()=>{const t=ie();if(t){const i=n.NAME,r=t.fn[i];t.fn[i]=n.jQueryInterface;t.fn[i].Constructor=n;t.fn[i].noConflict=()=>(t.fn[i]=r,n.jQueryInterface)}})},ht=n=>{typeof n=="function"&&n()},re=(n,t,i=true)=>{if(!i){ht(n);return}const f=ol(t)+5;let r=!1;const u=({target:i})=>{i===t&&(r=!0,t.removeEventListener(fu,u),ht(n))};t.addEventListener(fu,u);setTimeout(()=>{r||ne(t)},f)},ue=(n,t,i,r)=>{let u=n.indexOf(t);if(u===-1)return n[!i&&r?n.length-1:0];const f=n.length;return u+=i?1:-1,r&&(u=(u+f)%f),n[Math.max(0,Math.min(u,f-1))]},hl=/[^.]*(?=\..*)\.|.*/,cl=/\..*/,ll=/::\d+$/,su={};let fe=1;const al={mouseenter:"mouseover",mouseleave:"mouseout"},vl=/^(mouseenter|mouseleave)/i,ee=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);const n={on(n,t,i,r){le(n,t,i,r,!1)},one(n,t,i,r){le(n,t,i,r,!0)},off(n,t,i,r){if(typeof t=="string"&&n){const[s,e,f]=ce(t,i,r),h=f!==t,u=se(n),c=t.startsWith(".");if(typeof e!="undefined"){if(!u||!u[f])return;hu(n,u,f,e,s?i:null);return}c&&Object.keys(u).forEach(i=>{wl(n,u,i,t.slice(1))});const o=u[f]||{};Object.keys(o).forEach(i=>{const r=i.replace(ll,"");if(!h||t.includes(r)){const t=o[i];hu(n,u,f,t.originalHandler,t.delegationSelector)}})}},trigger(n,t,i){if(typeof t!="string"||!n)return null;const f=ie(),e=ae(t),c=t!==e,l=ee.has(e);let u,o=!0,s=!0,h=!1,r=null;return c&&f&&(u=f.Event(t,i),f(n).trigger(u),o=!u.isPropagationStopped(),s=!u.isImmediatePropagationStopped(),h=u.isDefaultPrevented()),l?(r=document.createEvent("HTMLEvents"),r.initEvent(e,o,!0)):r=new CustomEvent(t,{bubbles:o,cancelable:!0}),typeof i!="undefined"&&Object.keys(i).forEach(n=>{Object.defineProperty(r,n,{get(){return i[n]}})}),h&&r.preventDefault(),s&&n.dispatchEvent(r),r.defaultPrevented&&typeof u!="undefined"&&u.preventDefault(),r}},rt=new Map,li={set(n,t,i){rt.has(n)||rt.set(n,new Map);const r=rt.get(n);if(!r.has(t)&&r.size!==0){console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(r.keys())[0]}.`);return}r.set(t,i)},get(n,t){return rt.has(n)?rt.get(n).get(t)||null:null},remove(n,t){if(rt.has(n)){const i=rt.get(n);i.delete(t);i.size===0&&rt.delete(n)}}},bl="5.1.3";class v{constructor(n){(n=it(n),n)&&(this._element=n,li.set(this._element,this.constructor.DATA_KEY,this))}dispose(){li.remove(this._element,this.constructor.DATA_KEY);n.off(this._element,this.constructor.EVENT_KEY);Object.getOwnPropertyNames(this).forEach(n=>{this[n]=null})}_queueCallback(n,t,i=true){re(n,t,i)}static getInstance(n){return li.get(it(n),this.DATA_KEY)}static getOrCreateInstance(n,t={}){return this.getInstance(n)||new this(n,typeof t=="object"?t:null)}static get VERSION(){return bl}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!');}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}}const er=(t,i="hide")=>{const u=`click.dismiss${t.EVENT_KEY}`,r=t.NAME;n.on(document,u,`[data-bs-dismiss="${r}"]`,function(n){if(["A","AREA"].includes(this.tagName)&&n.preventDefault(),!st(this)){const u=tt(this)||this.closest(`.${r}`),f=t.getOrCreateInstance(u);f[i]()}})},kl="alert",ve=`.${"bs.alert"}`,dl=`close${ve}`,gl=`closed${ve}`,na="fade",ta="show";class or extends v{static get NAME(){return kl}close(){const t=n.trigger(this._element,dl);if(!t.defaultPrevented){this._element.classList.remove(ta);const i=this._element.classList.contains(na);this._queueCallback(()=>this._destroyElement(),this._element,i)}}_destroyElement(){this._element.remove();n.trigger(this._element,gl);this.dispose()}static jQueryInterface(n){return this.each(function(){const t=or.getOrCreateInstance(this);if(typeof n=="string"){if(t[n]===undefined||n.startsWith("_")||n==="constructor")throw new TypeError(`No method named "${n}"`);t[n](this)}})}}er(or,"close");h(or);const ia="button",ra=`.${"bs.button"}`,ua="active",ye='[data-bs-toggle="button"]',fa=`click${ra}${".data-api"}`;class sr extends v{static get NAME(){return ia}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle(ua))}static jQueryInterface(n){return this.each(function(){const t=sr.getOrCreateInstance(this);n==="toggle"&&t[n]()})}}n.on(document,fa,ye,n=>{n.preventDefault();const t=n.target.closest(ye),i=sr.getOrCreateInstance(t);i.toggle()});h(sr);const i={setDataAttribute(n,t,i){n.setAttribute(`data-bs-${cu(t)}`,i)},removeDataAttribute(n,t){n.removeAttribute(`data-bs-${cu(t)}`)},getDataAttributes(n){if(!n)return{};const t={};return Object.keys(n.dataset).filter(n=>n.startsWith("bs")).forEach(i=>{let r=i.replace(/^bs/,"");r=r.charAt(0).toLowerCase()+r.slice(1,r.length);t[r]=pe(n.dataset[i])}),t},getDataAttribute(n,t){return pe(n.getAttribute(`data-bs-${cu(t)}`))},offset(n){const t=n.getBoundingClientRect();return{top:t.top+window.pageYOffset,left:t.left+window.pageXOffset}},position(n){return{top:n.offsetTop,left:n.offsetLeft}}},ea=3,t={find(n,t=document.documentElement){return[].concat(...Element.prototype.querySelectorAll.call(t,n))},findOne(n,t=document.documentElement){return Element.prototype.querySelector.call(t,n)},children(n,t){return[].concat(...n.children).filter(n=>n.matches(t))},parents(n,t){const r=[];let i=n.parentNode;while(i&&i.nodeType===Node.ELEMENT_NODE&&i.nodeType!==ea)i.matches(t)&&r.push(i),i=i.parentNode;return r},prev(n,t){let i=n.previousElementSibling;while(i){if(i.matches(t))return[i];i=i.previousElementSibling}return[]},next(n,t){let i=n.nextElementSibling;while(i){if(i.matches(t))return[i];i=i.nextElementSibling}return[]},focusableChildren(n){const t=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map(n=>`${n}:not([tabindex^="-"])`).join(", ");return this.find(t,n).filter(n=>!st(n)&&ci(n))}},we="carousel",e=`.${"bs.carousel"}`,be=".data-api",oa=500,sa=40,ke={interval:5e3,keyboard:!0,slide:!1,pause:"hover",wrap:!0,touch:!0},ha={interval:"(number|boolean)",keyboard:"boolean",slide:"(boolean|string)",pause:"(string|boolean)",wrap:"boolean",touch:"boolean"},ct="next",lt="prev",at="left",ai="right",ca={["ArrowLeft"]:ai,["ArrowRight"]:at},la=`slide${e}`,de=`slid${e}`,aa=`keydown${e}`,va=`mouseenter${e}`,ya=`mouseleave${e}`,pa=`touchstart${e}`,wa=`touchmove${e}`,ba=`touchend${e}`,ka=`pointerdown${e}`,da=`pointerup${e}`,ga=`dragstart${e}`,nv=`load${e}${be}`,tv=`click${e}${be}`,iv="carousel",vt="active",rv="slide",uv="carousel-item-end",fv="carousel-item-start",ev="carousel-item-next",ov="carousel-item-prev",sv="pointer-event",hv=".active",hr=".active.carousel-item",cv=".carousel-item",lv=".carousel-item img",av=".carousel-item-next, .carousel-item-prev",vv=".carousel-indicators",yv="[data-bs-target]",pv='[data-bs-ride="carousel"]',wv="touch",bv="pen";class g extends v{constructor(n,i){super(n);this._items=null;this._interval=null;this._activeElement=null;this._isPaused=!1;this._isSliding=!1;this.touchTimeout=null;this.touchStartX=0;this.touchDeltaX=0;this._config=this._getConfig(i);this._indicatorsElement=t.findOne(vv,this._element);this._touchSupported="ontouchstart"in document.documentElement||navigator.maxTouchPoints>0;this._pointerEvent=Boolean(window.PointerEvent);this._addEventListeners()}static get Default(){return ke}static get NAME(){return we}next(){this._slide(ct)}nextWhenVisible(){!document.hidden&&ci(this._element)&&this.next()}prev(){this._slide(lt)}pause(n){n||(this._isPaused=!0);t.findOne(av,this._element)&&(ne(this._element),this.cycle(!0));clearInterval(this._interval);this._interval=null}cycle(n){n||(this._isPaused=!1);this._interval&&(clearInterval(this._interval),this._interval=null);this._config&&this._config.interval&&!this._isPaused&&(this._updateInterval(),this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))}to(i){this._activeElement=t.findOne(hr,this._element);const r=this._getItemIndex(this._activeElement);if(!(i>this._items.length-1)&&!(i<0)){if(this._isSliding){n.one(this._element,de,()=>this.to(i));return}if(r===i){this.pause();this.cycle();return}const u=i>r?ct:lt;this._slide(u,this._items[i])}}_getConfig(n){return n={...ke,...i.getDataAttributes(this._element),...(typeof n=="object"?n:{})},p(we,n,ha),n}_handleSwipe(){const n=Math.abs(this.touchDeltaX);if(!(n<=sa)){const t=n/this.touchDeltaX;(this.touchDeltaX=0,t)&&this._slide(t>0?ai:at)}}_addEventListeners(){if(this._config.keyboard)n.on(this._element,aa,n=>this._keydown(n));if(this._config.pause==="hover"){n.on(this._element,va,n=>this.pause(n));n.on(this._element,ya,n=>this.cycle(n))}this._config.touch&&this._touchSupported&&this._addTouchEventListeners()}_addTouchEventListeners(){const i=n=>this._pointerEvent&&(n.pointerType===bv||n.pointerType===wv),r=n=>{i(n)?this.touchStartX=n.clientX:this._pointerEvent||(this.touchStartX=n.touches[0].clientX)},f=n=>{this.touchDeltaX=n.touches&&n.touches.length>1?0:n.touches[0].clientX-this.touchStartX},u=n=>{i(n)&&(this.touchDeltaX=n.clientX-this.touchStartX),this._handleSwipe(),this._config.pause==="hover"&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout(n=>this.cycle(n),oa+this._config.interval))};if(t.find(lv,this._element).forEach(t=>{n.on(t,ga,n=>n.preventDefault())}),this._pointerEvent){n.on(this._element,ka,n=>r(n));n.on(this._element,da,n=>u(n));this._element.classList.add(sv)}else{n.on(this._element,pa,n=>r(n));n.on(this._element,wa,n=>f(n));n.on(this._element,ba,n=>u(n))}}_keydown(n){if(!/input|textarea/i.test(n.target.tagName)){const t=ca[n.key];t&&(n.preventDefault(),this._slide(t))}}_getItemIndex(n){return this._items=n&&n.parentNode?t.find(cv,n.parentNode):[],this._items.indexOf(n)}_getItemByOrder(n,t){const i=n===ct;return ue(this._items,t,i,this._config.wrap)}_triggerSlideEvent(i,r){const u=this._getItemIndex(i),f=this._getItemIndex(t.findOne(hr,this._element));return n.trigger(this._element,la,{relatedTarget:i,direction:r,from:f,to:u})}_setActiveIndicatorElement(n){if(this._indicatorsElement){const r=t.findOne(hv,this._indicatorsElement);r.classList.remove(vt);r.removeAttribute("aria-current");const i=t.find(yv,this._indicatorsElement);for(let t=0;t{n.trigger(this._element,de,{relatedTarget:u,direction:l,from:v,to:y})};if(this._element.classList.contains(rv)){u.classList.add(s);kt(u);f.classList.add(e);u.classList.add(e);const n=()=>{u.classList.remove(e,s),u.classList.add(vt),f.classList.remove(vt,s,e),this._isSliding=!1,setTimeout(a,0)};this._queueCallback(n,f,!0)}else f.classList.remove(vt),u.classList.add(vt),this._isSliding=!1,a();h&&this.cycle()}}}_directionToOrder(n){return[ai,at].includes(n)?r()?n===at?lt:ct:n===at?ct:lt:n}_orderToDirection(n){return[ct,lt].includes(n)?r()?n===lt?at:ai:n===lt?ai:at:n}static carouselInterface(n,t){const i=g.getOrCreateInstance(n,t);let{_config:r}=i;typeof t=="object"&&(r={...r,...t});const u=typeof t=="string"?t:r.slide;if(typeof t=="number")i.to(t);else if(typeof u=="string"){if(typeof i[u]=="undefined")throw new TypeError(`No method named "${u}"`);i[u]()}else r.interval&&r.ride&&(i.pause(),i.cycle())}static jQueryInterface(n){return this.each(function(){g.carouselInterface(this,n)})}static dataApiClickHandler(n){const t=tt(this);if(t&&t.classList.contains(iv)){const u={...i.getDataAttributes(t),...i.getDataAttributes(this)},r=this.getAttribute("data-bs-slide-to");r&&(u.interval=!1);g.carouselInterface(t,u);r&&g.getInstance(t).to(r);n.preventDefault()}}}n.on(document,tv,"[data-bs-slide], [data-bs-slide-to]",g.dataApiClickHandler);n.on(window,nv,()=>{const n=t.find(pv);for(let t=0,i=n.length;tn===this._element);i!==null&&f.length&&(this._selector=i,this._triggerArray.push(u))}this._initializeChildren();this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown());this._config.toggle&&this.toggle()}static get Default(){return to}static get NAME(){return ge}toggle(){this._isShown()?this.hide():this.show()}show(){if(!this._isTransitioning&&!this._isShown()){let r=[],u;if(this._config.parent){const n=t.find(ro,this._config.parent);r=t.find(ey,this._config.parent).filter(t=>!n.includes(t))}const f=t.findOne(this._selector);if(r.length){const n=r.find(n=>f!==n);if(u=n?gt.getInstance(n):null,u&&u._isTransitioning)return}const e=n.trigger(this._element,dv);if(!e.defaultPrevented){r.forEach(n=>{f!==n&>.getOrCreateInstance(n,{toggle:!1}).hide(),u||li.set(n,no,null)});const i=this._getDimension();this._element.classList.remove(dt);this._element.classList.add(cr);this._element.style[i]=0;this._addAriaAndCollapsedClass(this._triggerArray,!0);this._isTransitioning=!0;const o=()=>{this._isTransitioning=!1,this._element.classList.remove(cr),this._element.classList.add(dt,lu),this._element.style[i]="",n.trigger(this._element,gv)},s=i[0].toUpperCase()+i.slice(1),h=`scroll${s}`;this._queueCallback(o,this._element,!0);this._element.style[i]=`${this._element[h]}px`}}}hide(){if(!this._isTransitioning&&this._isShown()){const i=n.trigger(this._element,ny);if(!i.defaultPrevented){const t=this._getDimension();this._element.style[t]=`${this._element.getBoundingClientRect()[t]}px`;kt(this._element);this._element.classList.add(cr);this._element.classList.remove(dt,lu);const r=this._triggerArray.length;for(let n=0;n{this._isTransitioning=!1,this._element.classList.remove(cr),this._element.classList.add(dt),n.trigger(this._element,ty)};this._element.style[t]="";this._queueCallback(u,this._element,!0)}}}_isShown(n=this._element){return n.classList.contains(lu)}_getConfig(n){return n={...to,...i.getDataAttributes(this._element),...n},n.toggle=Boolean(n.toggle),n.parent=it(n.parent),p(ge,n,kv),n}_getDimension(){return this._element.classList.contains(ry)?uy:fy}_initializeChildren(){if(this._config.parent){const n=t.find(ro,this._config.parent);t.find(au,this._config.parent).filter(t=>!n.includes(t)).forEach(n=>{const t=tt(n);t&&this._addAriaAndCollapsedClass([n],this._isShown(t))})}}_addAriaAndCollapsedClass(n,t){n.length&&n.forEach(n=>{t?n.classList.remove(io):n.classList.add(io),n.setAttribute("aria-expanded",t)})}static jQueryInterface(n){return this.each(function(){const t={};typeof n=="string"&&/show|hide/.test(n)&&(t.toggle=!1);const i=gt.getOrCreateInstance(this,t);if(typeof n=="string"){if(typeof i[n]=="undefined")throw new TypeError(`No method named "${n}"`);i[n]()}})}}n.on(document,iy,au,function(n){(n.target.tagName==="A"||n.delegateTarget&&n.delegateTarget.tagName==="A")&&n.preventDefault();const i=eu(this),r=t.find(i);r.forEach(n=>{gt.getOrCreateInstance(n,{toggle:!1}).toggle()})});h(gt);var u="top",o="bottom",s="right",f="left",lr="auto",ni=[u,o,s,f],yt="start",ti="end",uo="clippingParents",vu="viewport",ii="popper",fo="reference",yu=ni.reduce(function(n,t){return n.concat([t+"-"+yt,t+"-"+ti])},[]),pu=[].concat(ni,[lr]).reduce(function(n,t){return n.concat([t,t+"-"+yt,t+"-"+ti])},[]),eo="beforeRead",oo="read",so="afterRead",ho="beforeMain",co="main",lo="afterMain",ao="beforeWrite",vo="write",yo="afterWrite",po=[eo,oo,so,ho,co,lo,ao,vo,yo];const wu={name:"applyStyles",enabled:!0,phase:"write",fn:oy,effect:sy,requires:["computeStyles"]};var ft=Math.max,wi=Math.min,vr=Math.round;is=function(n,t){return n=typeof n=="function"?n(Object.assign({},t.rects,{placement:t.placement})):n,ns(typeof n!="number"?n:ts(n,ni))};const rs={name:"arrow",enabled:!0,phase:"main",fn:ly,effect:ay,requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};us={top:"auto",right:"auto",bottom:"auto",left:"auto"};const du={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:yy,data:{}};bi={passive:!0};const gu={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:py,data:{}};es={left:"right",right:"left",bottom:"top",top:"bottom"};os={start:"end",end:"start"};const as={name:"flip",enabled:!0,phase:"main",fn:ip,requiresIfExists:["offset"],data:{_skip:!1}};const ps={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:rp};const ws={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:fp};const ff={name:"popperOffsets",enabled:!0,phase:"read",fn:ep,data:{}};const bs={name:"preventOverflow",enabled:!0,phase:"main",fn:sp,requiresIfExists:["offset"]};ef={placement:"bottom",modifiers:[],strategy:"absolute"};var bp=wr(),kp=[gu,ff,du,wu],dp=wr({defaultModifiers:kp}),gp=[gu,ff,du,wu,ws,as,bs,rs,ps],sf=wr({defaultModifiers:gp});const ds=Object.freeze({__proto__:null,popperGenerator:wr,detectOverflow:fi,createPopperBase:bp,createPopper:sf,createPopperLite:dp,top:u,bottom:o,right:s,left:f,auto:lr,basePlacements:ni,start:yt,end:ti,clippingParents:uo,viewport:vu,popper:ii,reference:fo,variationPlacements:yu,placements:pu,beforeRead:eo,read:oo,afterRead:so,beforeMain:ho,main:co,afterMain:lo,beforeWrite:ao,write:vo,afterWrite:yo,modifierPhases:po,applyStyles:wu,arrow:rs,computeStyles:du,eventListeners:gu,flip:as,hide:ps,offset:ws,popperOffsets:ff,preventOverflow:bs}),hf="dropdown",pt=`.${"bs.dropdown"}`,cf=".data-api",br="Escape",gs="Space",nh="Tab",lf="ArrowUp",kr="ArrowDown",nw=2,tw=new RegExp(`${lf}|${kr}|${br}`),iw=`hide${pt}`,rw=`hidden${pt}`,uw=`show${pt}`,fw=`shown${pt}`,th=`click${pt}${cf}`,ih=`keydown${pt}${cf}`,ew=`keyup${pt}${cf}`,ei="show",ow="dropup",sw="dropend",hw="dropstart",cw="navbar",di='[data-bs-toggle="dropdown"]',af=".dropdown-menu",lw=".navbar-nav",aw=".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",vw=r()?"top-end":"top-start",yw=r()?"top-start":"top-end",pw=r()?"bottom-end":"bottom-start",ww=r()?"bottom-start":"bottom-end",bw=r()?"left-start":"right-start",kw=r()?"right-start":"left-start",dw={offset:[0,2],boundary:"clippingParents",reference:"toggle",display:"dynamic",popperConfig:null,autoClose:!0},gw={offset:"(array|string|function)",boundary:"(string|element)",reference:"(string|element|object)",display:"string",popperConfig:"(null|object|function)",autoClose:"(boolean|string)"};class l extends v{constructor(n,t){super(n);this._popper=null;this._config=this._getConfig(t);this._menu=this._getMenuElement();this._inNavbar=this._detectNavbar()}static get Default(){return dw}static get DefaultType(){return gw}static get NAME(){return hf}toggle(){return this._isShown()?this.hide():this.show()}show(){if(!st(this._element)&&!this._isShown(this._menu)){const t={relatedTarget:this._element},u=n.trigger(this._element,uw,t);if(!u.defaultPrevented){const r=l.getParentFromElement(this._element);this._inNavbar?i.setDataAttribute(this._menu,"popper","none"):this._createPopper(r);"ontouchstart"in document.documentElement&&!r.closest(lw)&&[].concat(...document.body.children).forEach(t=>n.on(t,"mouseover",fr));this._element.focus();this._element.setAttribute("aria-expanded",!0);this._menu.classList.add(ei);this._element.classList.add(ei);n.trigger(this._element,fw,t)}}}hide(){if(!st(this._element)&&this._isShown(this._menu)){const n={relatedTarget:this._element};this._completeHide(n)}}dispose(){this._popper&&this._popper.destroy();super.dispose()}update(){this._inNavbar=this._detectNavbar();this._popper&&this._popper.update()}_completeHide(t){const r=n.trigger(this._element,iw,t);r.defaultPrevented||("ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach(t=>n.off(t,"mouseover",fr)),this._popper&&this._popper.destroy(),this._menu.classList.remove(ei),this._element.classList.remove(ei),this._element.setAttribute("aria-expanded","false"),i.removeDataAttribute(this._menu,"popper"),n.trigger(this._element,rw,t))}_getConfig(n){if(n={...this.constructor.Default,...i.getDataAttributes(this._element),...n},p(hf,n,this.constructor.DefaultType),typeof n.reference=="object"&&!ot(n.reference)&&typeof n.reference.getBoundingClientRect!="function")throw new TypeError(`${hf.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);return n}_createPopper(n){if(typeof ds=="undefined")throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)");let t=this._element;this._config.reference==="parent"?t=n:ot(this._config.reference)?t=it(this._config.reference):typeof this._config.reference=="object"&&(t=this._config.reference);const r=this._getPopperConfig(),u=r.modifiers.find(n=>n.name==="applyStyles"&&n.enabled===!1);this._popper=sf(t,this._menu,r);u&&i.setDataAttribute(this._menu,"popper","static")}_isShown(n=this._element){return n.classList.contains(ei)}_getMenuElement(){return t.next(this._element,af)[0]}_getPlacement(){const n=this._element.parentNode;if(n.classList.contains(sw))return bw;if(n.classList.contains(hw))return kw;const t=getComputedStyle(this._menu).getPropertyValue("--bs-position").trim()==="end";return n.classList.contains(ow)?t?yw:vw:t?ww:pw}_detectNavbar(){return this._element.closest(`.${cw}`)!==null}_getOffset(){const{offset:n}=this._config;return typeof n=="string"?n.split(",").map(n=>Number.parseInt(n,10)):typeof n=="function"?t=>n(t,this._element):n}_getPopperConfig(){const n={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return this._config.display==="static"&&(n.modifiers=[{name:"applyStyles",enabled:!1}]),{...n,...(typeof this._config.popperConfig=="function"?this._config.popperConfig(n):this._config.popperConfig)}}_selectMenuItem({key:n,target:i}){const r=t.find(aw,this._menu).filter(ci);r.length&&ue(r,i,n===kr,!r.includes(i)).focus()}static jQueryInterface(n){return this.each(function(){const t=l.getOrCreateInstance(this,n);if(typeof n=="string"){if(typeof t[n]=="undefined")throw new TypeError(`No method named "${n}"`);t[n]()}})}static clearMenus(n){if(!n||n.button!==nw&&(n.type!=="keyup"||n.key===nh)){const i=t.find(di);for(let t=0,r=i.length;tt+n);this._setElementAttributes(rh,"paddingRight",t=>t+n);this._setElementAttributes(uh,"marginRight",t=>t-n)}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow");this._element.style.overflow="hidden"}_setElementAttributes(n,t,i){const r=this.getWidth(),u=n=>{if(n===this._element||!(window.innerWidth>n.clientWidth+r)){this._saveInitialAttribute(n,t);const u=window.getComputedStyle(n)[t];n.style[t]=`${i(Number.parseFloat(u))}px`}};this._applyManipulationCallback(n,u)}reset(){this._resetElementAttributes(this._element,"overflow");this._resetElementAttributes(this._element,"paddingRight");this._resetElementAttributes(rh,"paddingRight");this._resetElementAttributes(uh,"marginRight")}_saveInitialAttribute(n,t){const r=n.style[t];r&&i.setDataAttribute(n,t,r)}_resetElementAttributes(n,t){const r=n=>{const r=i.getDataAttribute(n,t);typeof r=="undefined"?n.style.removeProperty(t):(i.removeDataAttribute(n,t),n.style[t]=r)};this._applyManipulationCallback(n,r)}_applyManipulationCallback(n,i){ot(n)?i(n):t.find(n,this._element).forEach(i)}isOverflowing(){return this.getWidth()>0}}const nb={className:"modal-backdrop",isVisible:!0,isAnimated:!1,rootElement:"body",clickCallback:null},tb={className:"string",isVisible:"boolean",isAnimated:"boolean",rootElement:"(element|string)",clickCallback:"(function|null)"},fh="backdrop",ib="fade",eh="show",oh=`mousedown.bs.${fh}`;class sh{constructor(n){this._config=this._getConfig(n);this._isAppended=!1;this._element=null}show(n){if(!this._config.isVisible){ht(n);return}this._append();this._config.isAnimated&&kt(this._getElement());this._getElement().classList.add(eh);this._emulateAnimation(()=>{ht(n)})}hide(n){if(!this._config.isVisible){ht(n);return}this._getElement().classList.remove(eh);this._emulateAnimation(()=>{this.dispose(),ht(n)})}_getElement(){if(!this._element){const n=document.createElement("div");n.className=this._config.className;this._config.isAnimated&&n.classList.add(ib);this._element=n}return this._element}_getConfig(n){return n={...nb,...(typeof n=="object"?n:{})},n.rootElement=it(n.rootElement),p(fh,n,tb),n}_append(){if(!this._isAppended){this._config.rootElement.append(this._getElement());n.on(this._getElement(),oh,()=>{ht(this._config.clickCallback)});this._isAppended=!0}}dispose(){this._isAppended&&(n.off(this._element,oh),this._element.remove(),this._isAppended=!1)}_emulateAnimation(n){re(n,this._getElement(),this._config.isAnimated)}}const rb={trapElement:null,autofocus:!0},ub={trapElement:"element",autofocus:"boolean"},fb="focustrap",dr=`.${"bs.focustrap"}`,eb=`focusin${dr}`,ob=`keydown.tab${dr}`,sb="Tab",hb="forward",hh="backward";class ch{constructor(n){this._config=this._getConfig(n);this._isActive=!1;this._lastTabNavDirection=null}activate(){const{trapElement:t,autofocus:i}=this._config;if(!this._isActive){i&&t.focus();n.off(document,dr);n.on(document,eb,n=>this._handleFocusin(n));n.on(document,ob,n=>this._handleKeydown(n));this._isActive=!0}}deactivate(){this._isActive&&(this._isActive=!1,n.off(document,dr))}_handleFocusin(n){const{target:u}=n,{trapElement:i}=this._config;if(u!==document&&u!==i&&!i.contains(u)){const r=t.focusableChildren(i);r.length===0?i.focus():this._lastTabNavDirection===hh?r[r.length-1].focus():r[0].focus()}}_handleKeydown(n){n.key===sb&&(this._lastTabNavDirection=n.shiftKey?hh:hb)}_getConfig(n){return n={...rb,...(typeof n=="object"?n:{})},p(fb,n,ub),n}}const lh="modal",a=`.${"bs.modal"}`,ah="Escape",vh={backdrop:!0,keyboard:!0,focus:!0},cb={backdrop:"(boolean|string)",keyboard:"boolean",focus:"boolean"},lb=`hide${a}`,ab=`hidePrevented${a}`,yh=`hidden${a}`,ph=`show${a}`,vb=`shown${a}`,wh=`resize${a}`,bh=`click.dismiss${a}`,kh=`keydown.dismiss${a}`,yb=`mouseup.dismiss${a}`,dh=`mousedown.dismiss${a}`,pb=`click${a}${".data-api"}`,gh="modal-open",wb="fade",nc="show",yf="modal-static",bb=".modal.show",kb=".modal-dialog",db=".modal-body";class oi extends v{constructor(n,i){super(n);this._config=this._getConfig(i);this._dialog=t.findOne(kb,this._element);this._backdrop=this._initializeBackDrop();this._focustrap=this._initializeFocusTrap();this._isShown=!1;this._ignoreBackdropClick=!1;this._isTransitioning=!1;this._scrollBar=new vf}static get Default(){return vh}static get NAME(){return lh}toggle(n){return this._isShown?this.hide():this.show(n)}show(t){if(!this._isShown&&!this._isTransitioning){const i=n.trigger(this._element,ph,{relatedTarget:t});if(!i.defaultPrevented){this._isShown=!0;this._isAnimated()&&(this._isTransitioning=!0);this._scrollBar.hide();document.body.classList.add(gh);this._adjustDialog();this._setEscapeEvent();this._setResizeEvent();n.on(this._dialog,dh,()=>{n.one(this._element,yb,n=>{n.target===this._element&&(this._ignoreBackdropClick=!0)})});this._showBackdrop(()=>this._showElement(t))}}}hide(){if(this._isShown&&!this._isTransitioning){const i=n.trigger(this._element,lb);if(!i.defaultPrevented){this._isShown=!1;const t=this._isAnimated();t&&(this._isTransitioning=!0);this._setEscapeEvent();this._setResizeEvent();this._focustrap.deactivate();this._element.classList.remove(nc);n.off(this._element,bh);n.off(this._dialog,dh);this._queueCallback(()=>this._hideModal(),this._element,t)}}}dispose(){[window,this._dialog].forEach(t=>n.off(t,a));this._backdrop.dispose();this._focustrap.deactivate();super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new sh({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new ch({trapElement:this._element})}_getConfig(n){return n={...vh,...i.getDataAttributes(this._element),...(typeof n=="object"?n:{})},p(lh,n,cb),n}_showElement(i){const r=this._isAnimated(),u=t.findOne(db,this._dialog);this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE||document.body.append(this._element);this._element.style.display="block";this._element.removeAttribute("aria-hidden");this._element.setAttribute("aria-modal",!0);this._element.setAttribute("role","dialog");this._element.scrollTop=0;u&&(u.scrollTop=0);r&&kt(this._element);this._element.classList.add(nc);const f=()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,n.trigger(this._element,vb,{relatedTarget:i})};this._queueCallback(f,this._dialog,r)}_setEscapeEvent(){if(this._isShown)n.on(this._element,kh,n=>{this._config.keyboard&&n.key===ah?(n.preventDefault(),this.hide()):this._config.keyboard||n.key!==ah||this._triggerBackdropTransition()});else n.off(this._element,kh)}_setResizeEvent(){if(this._isShown)n.on(window,wh,()=>this._adjustDialog());else n.off(window,wh)}_hideModal(){this._element.style.display="none";this._element.setAttribute("aria-hidden",!0);this._element.removeAttribute("aria-modal");this._element.removeAttribute("role");this._isTransitioning=!1;this._backdrop.hide(()=>{document.body.classList.remove(gh),this._resetAdjustments(),this._scrollBar.reset(),n.trigger(this._element,yh)})}_showBackdrop(t){n.on(this._element,bh,n=>{if(this._ignoreBackdropClick){this._ignoreBackdropClick=!1;return}n.target===n.currentTarget&&(this._config.backdrop===!0?this.hide():this._config.backdrop==="static"&&this._triggerBackdropTransition())});this._backdrop.show(t)}_isAnimated(){return this._element.classList.contains(wb)}_triggerBackdropTransition(){const u=n.trigger(this._element,ab);if(!u.defaultPrevented){const{classList:t,scrollHeight:f,style:i}=this._element,r=f>document.documentElement.clientHeight;(r||i.overflowY!=="hidden")&&!t.contains(yf)&&(r||(i.overflowY="hidden"),t.add(yf),this._queueCallback(()=>{t.remove(yf),r||this._queueCallback(()=>{i.overflowY=""},this._dialog)},this._dialog),this._element.focus())}}_adjustDialog(){const n=this._element.scrollHeight>document.documentElement.clientHeight,i=this._scrollBar.getWidth(),t=i>0;(!t&&n&&!r()||t&&!n&&r())&&(this._element.style.paddingLeft=`${i}px`);(t&&!n&&!r()||!t&&n&&r())&&(this._element.style.paddingRight=`${i}px`)}_resetAdjustments(){this._element.style.paddingLeft="";this._element.style.paddingRight=""}static jQueryInterface(n,t){return this.each(function(){const i=oi.getOrCreateInstance(this,n);if(typeof n=="string"){if(typeof i[n]=="undefined")throw new TypeError(`No method named "${n}"`);i[n](t)}})}}n.on(document,pb,'[data-bs-toggle="modal"]',function(i){const r=tt(this);["A","AREA"].includes(this.tagName)&&i.preventDefault();n.one(r,ph,t=>{if(!t.defaultPrevented)n.one(r,yh,()=>{ci(this)&&this.focus()})});const u=t.findOne(bb);u&&oi.getInstance(u).hide();const f=oi.getOrCreateInstance(r);f.toggle(this)});er(oi);h(oi);const tc="offcanvas",wt=`.${"bs.offcanvas"}`,ic=".data-api",gb=`load${wt}${ic}`,nk="Escape",rc={backdrop:!0,keyboard:!0,scroll:!1},tk={backdrop:"boolean",keyboard:"boolean",scroll:"boolean"},uc="show",ik="offcanvas-backdrop",fc=".offcanvas.show",rk=`show${wt}`,uk=`shown${wt}`,fk=`hide${wt}`,ec=`hidden${wt}`,ek=`click${wt}${ic}`,ok=`keydown.dismiss${wt}`;class bt extends v{constructor(n,t){super(n);this._config=this._getConfig(t);this._isShown=!1;this._backdrop=this._initializeBackDrop();this._focustrap=this._initializeFocusTrap();this._addEventListeners()}static get NAME(){return tc}static get Default(){return rc}toggle(n){return this._isShown?this.hide():this.show(n)}show(t){if(!this._isShown){const i=n.trigger(this._element,rk,{relatedTarget:t});if(!i.defaultPrevented){this._isShown=!0;this._element.style.visibility="visible";this._backdrop.show();this._config.scroll||(new vf).hide();this._element.removeAttribute("aria-hidden");this._element.setAttribute("aria-modal",!0);this._element.setAttribute("role","dialog");this._element.classList.add(uc);const r=()=>{this._config.scroll||this._focustrap.activate(),n.trigger(this._element,uk,{relatedTarget:t})};this._queueCallback(r,this._element,!0)}}}hide(){if(this._isShown){const t=n.trigger(this._element,fk);if(!t.defaultPrevented){this._focustrap.deactivate();this._element.blur();this._isShown=!1;this._element.classList.remove(uc);this._backdrop.hide();const i=()=>{this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._element.style.visibility="hidden",this._config.scroll||(new vf).reset(),n.trigger(this._element,ec)};this._queueCallback(i,this._element,!0)}}}dispose(){this._backdrop.dispose();this._focustrap.deactivate();super.dispose()}_getConfig(n){return n={...rc,...i.getDataAttributes(this._element),...(typeof n=="object"?n:{})},p(tc,n,tk),n}_initializeBackDrop(){return new sh({className:ik,isVisible:this._config.backdrop,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:()=>this.hide()})}_initializeFocusTrap(){return new ch({trapElement:this._element})}_addEventListeners(){n.on(this._element,ok,n=>{this._config.keyboard&&n.key===nk&&this.hide()})}static jQueryInterface(n){return this.each(function(){const t=bt.getOrCreateInstance(this,n);if(typeof n=="string"){if(t[n]===undefined||n.startsWith("_")||n==="constructor")throw new TypeError(`No method named "${n}"`);t[n](this)}})}}n.on(document,ek,'[data-bs-toggle="offcanvas"]',function(i){const r=tt(this);if(["A","AREA"].includes(this.tagName)&&i.preventDefault(),!st(this)){n.one(r,ec,()=>{ci(this)&&this.focus()});const u=t.findOne(fc);u&&u!==r&&bt.getInstance(u).hide();const f=bt.getOrCreateInstance(r);f.toggle(this)}});n.on(window,gb,()=>t.find(fc).forEach(n=>bt.getOrCreateInstance(n).show()));er(bt);h(bt);const sk=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),hk=/^(?:(?:https?|mailto|ftp|tel|file|sms):|[^#&/:?]*(?:[#/?]|$))/i,ck=/^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i,lk=(n,t)=>{const i=n.nodeName.toLowerCase();if(t.includes(i))return sk.has(i)?Boolean(hk.test(n.nodeValue)||ck.test(n.nodeValue)):!0;const r=t.filter(n=>n instanceof RegExp);for(let n=0,t=r.length;n
<\/div>
<\/div><\/div>',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:[0,0],container:!1,fallbackPlacements:["top","right","bottom","left"],boundary:"clippingParents",customClass:"",sanitize:!0,sanitizeFn:null,allowList:{"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},popperConfig:null},bk={HIDE:`hide${k}`,HIDDEN:`hidden${k}`,SHOW:`show${k}`,SHOWN:`shown${k}`,INSERTED:`inserted${k}`,CLICK:`click${k}`,FOCUSIN:`focusin${k}`,FOCUSOUT:`focusout${k}`,MOUSEENTER:`mouseenter${k}`,MOUSELEAVE:`mouseleave${k}`},gr="fade",gi="show",nr="show",pf="out",hc=".tooltip-inner",cc=`.${"modal"}`,lc="hide.bs.modal",tr="hover",wf="focus",kk="click",dk="manual";class si extends v{constructor(n,t){if(typeof ds=="undefined")throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(n);this._isEnabled=!0;this._timeout=0;this._hoverState="";this._activeTrigger={};this._popper=null;this._config=this._getConfig(t);this.tip=null;this._setListeners()}static get Default(){return wk}static get NAME(){return sc}static get Event(){return bk}static get DefaultType(){return yk}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(n){if(this._isEnabled)if(n){const t=this._initializeOnDelegatedTarget(n);t._activeTrigger.click=!t._activeTrigger.click;t._isWithActiveTrigger()?t._enter(null,t):t._leave(null,t)}else{if(this.getTipElement().classList.contains(gi)){this._leave(null,this);return}this._enter(null,this)}}dispose(){clearTimeout(this._timeout);n.off(this._element.closest(cc),lc,this._hideModalHandler);this.tip&&this.tip.remove();this._disposePopper();super.dispose()}show(){if(this._element.style.display==="none")throw new Error("Please use show on visible elements");if(this.isWithContent()&&this._isEnabled){const e=n.trigger(this._element,this.constructor.Event.SHOW),i=te(this._element),o=i===null?this._element.ownerDocument.documentElement.contains(this._element):i.contains(this._element);if(!e.defaultPrevented&&o){this.constructor.NAME==="tooltip"&&this.tip&&this.getTitle()!==this.tip.querySelector(hc).innerHTML&&(this._disposePopper(),this.tip.remove(),this.tip=null);const t=this.getTipElement(),r=el(this.constructor.NAME);t.setAttribute("id",r);this._element.setAttribute("aria-describedby",r);this._config.animation&&t.classList.add(gr);const s=typeof this._config.placement=="function"?this._config.placement.call(this,t,this._element):this._config.placement,u=this._getAttachment(s);this._addAttachmentClass(u);const{container:h}=this._config;li.set(t,this.constructor.DATA_KEY,this);this._element.ownerDocument.documentElement.contains(this.tip)||(h.append(t),n.trigger(this._element,this.constructor.Event.INSERTED));this._popper?this._popper.update():this._popper=sf(this._element,t,this._getPopperConfig(u));t.classList.add(gi);const f=this._resolvePossibleFunction(this._config.customClass);f&&t.classList.add(...f.split(" "));"ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach(t=>{n.on(t,"mouseover",fr)});const c=()=>{const t=this._hoverState;this._hoverState=null;n.trigger(this._element,this.constructor.Event.SHOWN);t===pf&&this._leave(null,this)},l=this.tip.classList.contains(gr);this._queueCallback(c,this.tip,l)}}}hide(){if(this._popper){const t=this.getTipElement(),i=()=>{this._isWithActiveTrigger()||(this._hoverState!==nr&&t.remove(),this._cleanTipClass(),this._element.removeAttribute("aria-describedby"),n.trigger(this._element,this.constructor.Event.HIDDEN),this._disposePopper())},r=n.trigger(this._element,this.constructor.Event.HIDE);if(!r.defaultPrevented){t.classList.remove(gi);"ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach(t=>n.off(t,"mouseover",fr));this._activeTrigger[kk]=!1;this._activeTrigger[wf]=!1;this._activeTrigger[tr]=!1;const u=this.tip.classList.contains(gr);this._queueCallback(i,this.tip,u);this._hoverState=""}}}update(){this._popper!==null&&this._popper.update()}isWithContent(){return Boolean(this.getTitle())}getTipElement(){if(this.tip)return this.tip;const t=document.createElement("div");t.innerHTML=this._config.template;const n=t.children[0];return this.setContent(n),n.classList.remove(gr,gi),this.tip=n,this.tip}setContent(n){this._sanitizeAndSetContent(n,this.getTitle(),hc)}_sanitizeAndSetContent(n,i,r){const u=t.findOne(r,n);if(!i&&u){u.remove();return}this.setElementContent(u,i)}setElementContent(n,t){if(n!==null){if(ot(t)){t=it(t);this._config.html?t.parentNode!==n&&(n.innerHTML="",n.append(t)):n.textContent=t.textContent;return}this._config.html?(this._config.sanitize&&(t=oc(t,this._config.allowList,this._config.sanitizeFn)),n.innerHTML=t):n.textContent=t}}getTitle(){const n=this._element.getAttribute("data-bs-original-title")||this._config.title;return this._resolvePossibleFunction(n)}updateAttachment(n){return n==="right"?"end":n==="left"?"start":n}_initializeOnDelegatedTarget(n,t){return t||this.constructor.getOrCreateInstance(n.delegateTarget,this._getDelegateConfig())}_getOffset(){const{offset:n}=this._config;return typeof n=="string"?n.split(",").map(n=>Number.parseInt(n,10)):typeof n=="function"?t=>n(t,this._element):n}_resolvePossibleFunction(n){return typeof n=="function"?n.call(this._element):n}_getPopperConfig(n){const t={placement:n,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"onChange",enabled:!0,phase:"afterWrite",fn:n=>this._handlePopperPlacementChange(n)}],onFirstUpdate:n=>{n.options.placement!==n.placement&&this._handlePopperPlacementChange(n)}};return{...t,...(typeof this._config.popperConfig=="function"?this._config.popperConfig(t):this._config.popperConfig)}}_addAttachmentClass(n){this.getTipElement().classList.add(`${this._getBasicClassPrefix()}-${this.updateAttachment(n)}`)}_getAttachment(n){return pk[n.toUpperCase()]}_setListeners(){const t=this._config.trigger.split(" ");t.forEach(t=>{if(t==="click")n.on(this._element,this.constructor.Event.CLICK,this._config.selector,n=>this.toggle(n));else if(t!==dk){const i=t===tr?this.constructor.Event.MOUSEENTER:this.constructor.Event.FOCUSIN,r=t===tr?this.constructor.Event.MOUSELEAVE:this.constructor.Event.FOCUSOUT;n.on(this._element,i,this._config.selector,n=>this._enter(n));n.on(this._element,r,this._config.selector,n=>this._leave(n))}});this._hideModalHandler=()=>{this._element&&this.hide()};n.on(this._element.closest(cc),lc,this._hideModalHandler);this._config.selector?this._config={...this._config,trigger:"manual",selector:""}:this._fixTitle()}_fixTitle(){const n=this._element.getAttribute("title"),t=typeof this._element.getAttribute("data-bs-original-title");(n||t!=="string")&&(this._element.setAttribute("data-bs-original-title",n||""),!n||this._element.getAttribute("aria-label")||this._element.textContent||this._element.setAttribute("aria-label",n),this._element.setAttribute("title",""))}_enter(n,t){if(t=this._initializeOnDelegatedTarget(n,t),n&&(t._activeTrigger[n.type==="focusin"?wf:tr]=!0),t.getTipElement().classList.contains(gi)||t._hoverState===nr){t._hoverState=nr;return}if(clearTimeout(t._timeout),t._hoverState=nr,!t._config.delay||!t._config.delay.show){t.show();return}t._timeout=setTimeout(()=>{t._hoverState===nr&&t.show()},t._config.delay.show)}_leave(n,t){if(t=this._initializeOnDelegatedTarget(n,t),n&&(t._activeTrigger[n.type==="focusout"?wf:tr]=t._element.contains(n.relatedTarget)),!t._isWithActiveTrigger()){if(clearTimeout(t._timeout),t._hoverState=pf,!t._config.delay||!t._config.delay.hide){t.hide();return}t._timeout=setTimeout(()=>{t._hoverState===pf&&t.hide()},t._config.delay.hide)}}_isWithActiveTrigger(){for(const n in this._activeTrigger)if(this._activeTrigger[n])return!0;return!1}_getConfig(n){const t=i.getDataAttributes(this._element);return Object.keys(t).forEach(n=>{vk.has(n)&&delete t[n]}),n={...this.constructor.Default,...t,...(typeof n=="object"&&n?n:{})},n.container=n.container===!1?document.body:it(n.container),typeof n.delay=="number"&&(n.delay={show:n.delay,hide:n.delay}),typeof n.title=="number"&&(n.title=n.title.toString()),typeof n.content=="number"&&(n.content=n.content.toString()),p(sc,n,this.constructor.DefaultType),n.sanitize&&(n.template=oc(n.template,n.allowList,n.sanitizeFn)),n}_getDelegateConfig(){const n={};for(const t in this._config)this.constructor.Default[t]!==this._config[t]&&(n[t]=this._config[t]);return n}_cleanTipClass(){const t=this.getTipElement(),i=new RegExp(`(^|\\s)${this._getBasicClassPrefix()}\\S+`,"g"),n=t.getAttribute("class").match(i);n!==null&&n.length>0&&n.map(n=>n.trim()).forEach(n=>t.classList.remove(n))}_getBasicClassPrefix(){return ak}_handlePopperPlacementChange(n){const{state:t}=n;t&&(this.tip=t.elements.popper,this._cleanTipClass(),this._addAttachmentClass(this._getAttachment(t.placement)))}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null)}static jQueryInterface(n){return this.each(function(){const t=si.getOrCreateInstance(this,n);if(typeof n=="string"){if(typeof t[n]=="undefined")throw new TypeError(`No method named "${n}"`);t[n]()}})}}h(si);const gk="popover",d=`.${"bs.popover"}`,nd="bs-popover",td={...si.Default,placement:"right",offset:[0,8],trigger:"click",content:"",template:'