From 04253ead0d25dd0728ff875f68ca86b2542511d0 Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Fri, 29 Jul 2022 13:14:16 +0300 Subject: [PATCH 01/55] Make empty module creation faster resolves https://github.com/volosoft/volo/issues/11276 --- docs/en/CLI.md | 1 + .../Volo/Abp/Cli/Commands/NewCommand.cs | 11 +++++++++-- .../Abp/Cli/Commands/ProjectCreationCommandBase.cs | 6 ++++++ .../Cli/ProjectModification/SolutionModuleAdder.cs | 1 + 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/docs/en/CLI.md b/docs/en/CLI.md index 87522e2923..87e8ea0468 100644 --- a/docs/en/CLI.md +++ b/docs/en/CLI.md @@ -133,6 +133,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. 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 526ae77363..8db9d8c462 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 @@ -79,9 +79,15 @@ public class NewCommand : ProjectCreationCommandBase, IConsoleCommand, ITransien Logger.LogInformation($"'{projectName}' has been successfully created to '{projectArgs.OutputFolder}'"); RunGraphBuildForMicroserviceServiceTemplate(projectArgs); - await RunInstallLibsForWebTemplateAsync(projectArgs); - ConfigurePwaSupportForAngular(projectArgs); + var skipInstallLibs = commandLineArgs.Options.ContainsKey(Options.SkipInstallingLibs.Long) || commandLineArgs.Options.ContainsKey(Options.SkipInstallingLibs.Short); + if (!skipInstallLibs) + { + await RunInstallLibsForWebTemplateAsync(projectArgs); + } + + ConfigurePwaSupportForAngular(projectArgs); + OpenRelatedWebPage(projectArgs, template, isTiered, commandLineArgs); } @@ -111,6 +117,7 @@ public class NewCommand : ProjectCreationCommandBase, IConsoleCommand, ITransien sb.AppendLine("--no-ui (if supported by the template)"); sb.AppendLine("--no-random-port (Use template's default ports)"); sb.AppendLine("--separate-identity-server (if supported by the template)"); + sb.AppendLine("-sib|--skip-installing-libs (skip installing client side packages)"); sb.AppendLine("--local-framework-ref --abp-path (keeps local references to projects instead of replacing with NuGet package references)"); sb.AppendLine(""); sb.AppendLine("Examples:"); 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 e672c763ae..7ca3b0b8d2 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 @@ -518,6 +518,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"; 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 f418d8b490..fb353fc4ee 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 @@ -489,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); } From 89aa2cc6b269802b8006b66d4e0f97e70d754536 Mon Sep 17 00:00:00 2001 From: Mahmut Gundogdu Date: Fri, 5 Aug 2022 15:33:29 +0300 Subject: [PATCH 02/55] Add Password property on User Edit modal. --- .../identity/src/lib/defaults/default-users-form-props.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) 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..370cb4c7ab 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 @@ -63,6 +63,4 @@ export const DEFAULT_USERS_CREATE_FORM_PROPS = FormProp.createMany prop.name !== 'password', -); +export const DEFAULT_USERS_EDIT_FORM_PROPS = DEFAULT_USERS_CREATE_FORM_PROPS From 99fab3f6214feb9606d8d24dc15d95532929f032 Mon Sep 17 00:00:00 2001 From: muhammedaltug Date: Fri, 5 Aug 2022 17:42:34 +0300 Subject: [PATCH 03/55] resolves #13504 promisfy rule functions --- npm/ng-packs/.gitignore | 2 ++ npm/ng-packs/package.json | 4 +++- .../packages/schematics/src/models/index.ts | 1 + .../packages/schematics/src/models/rule.ts | 3 +++ .../packages/schematics/src/utils/rule.ts | 8 +++++-- .../mock-schematic}/api-definition.json | 0 .../mock-schematic/mock-schematic-json.ts | 13 +++++++++++ .../scripts/mock-schematic/package.json | 22 +++++++++++++++++++ .../scripts/mock-schematic/tsconfig.json | 12 ++++++++++ 9 files changed, 62 insertions(+), 3 deletions(-) create mode 100644 npm/ng-packs/packages/schematics/src/models/rule.ts rename npm/ng-packs/{packages/schematics/src/mocks => scripts/mock-schematic}/api-definition.json (100%) create mode 100644 npm/ng-packs/scripts/mock-schematic/mock-schematic-json.ts create mode 100644 npm/ng-packs/scripts/mock-schematic/package.json create mode 100644 npm/ng-packs/scripts/mock-schematic/tsconfig.json 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/package.json b/npm/ng-packs/package.json index 1798f45594..a669d3b970 100644 --- a/npm/ng-packs/package.json +++ b/npm/ng-packs/package.json @@ -34,7 +34,9 @@ "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": { 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/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/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 + } +} From 09170382fdf906e4a7ba527a3ccf1ab69ec88119 Mon Sep 17 00:00:00 2001 From: maliming Date: Thu, 11 Aug 2022 09:33:48 +0800 Subject: [PATCH 04/55] Update OpenIddict.md Resolve #13625 --- docs/en/Modules/OpenIddict.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/docs/en/Modules/OpenIddict.md b/docs/en/Modules/OpenIddict.md index 9e603f76a8..85ece92ffc 100644 --- a/docs/en/Modules/OpenIddict.md +++ b/docs/en/Modules/OpenIddict.md @@ -4,6 +4,14 @@ 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. +## How to Install + +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 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 with [MIT](https://choosealicense.com/licenses/mit/), so you can freely use and customize it. + ## 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). @@ -206,6 +214,10 @@ 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 +## Migrating Guide + +[Migrating from IdentityServer to OpenIddict Step by Step Guide ](Migration-Guides/OpenIddict-Step-by-Step.md) + ## Sponsor Please consider sponsoring this project: https://github.com/sponsors/kevinchalet From 02dc2de4919a73b09603c600801946d25a93cb23 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Thu, 11 Aug 2022 12:31:21 +0800 Subject: [PATCH 05/55] Update setting-management document --- docs/en/Modules/Setting-Management.md | 11 ++++++++--- docs/en/images/setting-management-email-ui.png | Bin 0 -> 49013 bytes docs/zh-Hans/Modules/Setting-Management.md | 8 +++++++- .../images/setting-management-email-ui.png | Bin 0 -> 49013 bytes 4 files changed, 15 insertions(+), 4 deletions(-) create mode 100644 docs/en/images/setting-management-email-ui.png create mode 100644 docs/zh-Hans/images/setting-management-email-ui.png 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/images/setting-management-email-ui.png b/docs/en/images/setting-management-email-ui.png new file mode 100644 index 0000000000000000000000000000000000000000..f8f1270c15c6a5aea07e08113f5a3d17519b45da GIT binary patch literal 49013 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 literal 0 HcmV?d00001 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/images/setting-management-email-ui.png b/docs/zh-Hans/images/setting-management-email-ui.png new file mode 100644 index 0000000000000000000000000000000000000000..f8f1270c15c6a5aea07e08113f5a3d17519b45da GIT binary patch literal 49013 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 literal 0 HcmV?d00001 From 66e0724c17e4faf326f32f8bff751ac47fa1a053 Mon Sep 17 00:00:00 2001 From: muhammedaltug Date: Thu, 11 Aug 2022 11:15:06 +0300 Subject: [PATCH 06/55] disable workflows for draft prs --- .github/workflows/angular.yml | 6 ++ .github/workflows/build-and-test.yml | 6 ++ .github/workflows/codeql-analysis.yml | 94 +++++++++++++------------ .github/workflows/image-compression.yml | 47 +++++++------ 4 files changed, 88 insertions(+), 65 deletions(-) diff --git a/.github/workflows/angular.yml b/.github/workflows/angular.yml index 0c0f8d5b6c..fa078e4682 100644 --- a/.github/workflows/angular.yml +++ b/.github/workflows/angular.yml @@ -10,8 +10,14 @@ on: branches: - 'rel-*' - 'dev' + types: + - opened + - synchronize + - reopened + - ready_for_review jobs: build-test-lint: + if: ${{ !github.event.pull_request.draft }} runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index 0210efcec9..ca8b54d092 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -31,9 +31,15 @@ on: - 'templates/**/*.cshtml' - 'templates/**/*.csproj' - 'templates/**/*.razor' + types: + - opened + - synchronize + - reopened + - ready_for_review 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/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 7aaad739e9..ce4cef9dfe 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -9,23 +9,29 @@ 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 jobs: analyze: + if: ${{ !github.event.pull_request.draft }} name: Analyze runs-on: ubuntu-latest @@ -34,48 +40,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 }} From 98bde28942c69202beb0762a1cfc3bb58883cfe2 Mon Sep 17 00:00:00 2001 From: muhammedaltug Date: Thu, 11 Aug 2022 11:16:38 +0300 Subject: [PATCH 07/55] test commit --- .../Volo/Abp/Account/AbpAccountApplicationModule.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/account/src/Volo.Abp.Account.Application/Volo/Abp/Account/AbpAccountApplicationModule.cs b/modules/account/src/Volo.Abp.Account.Application/Volo/Abp/Account/AbpAccountApplicationModule.cs index 283e06a934..5b54adc53e 100644 --- a/modules/account/src/Volo.Abp.Account.Application/Volo/Abp/Account/AbpAccountApplicationModule.cs +++ b/modules/account/src/Volo.Abp.Account.Application/Volo/Abp/Account/AbpAccountApplicationModule.cs @@ -21,6 +21,7 @@ public class AbpAccountApplicationModule : AbpModule Configure(options => { options.FileSets.AddEmbedded(); + // test }); Configure(options => From 1a31850d2e91a74e0aab6e9797e359a1dc38f747 Mon Sep 17 00:00:00 2001 From: muhammedaltug Date: Thu, 11 Aug 2022 11:17:36 +0300 Subject: [PATCH 08/55] test commit --- npm/ng-packs/packages/account/src/lib/account.module.ts | 1 + 1 file changed, 1 insertion(+) 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..68973cef2a 100644 --- a/npm/ng-packs/packages/account/src/lib/account.module.ts +++ b/npm/ng-packs/packages/account/src/lib/account.module.ts @@ -57,3 +57,4 @@ export class AccountModule { return new LazyModuleFactory(AccountModule.forChild(options)); } } +//test From 2848875598b19fc7ff5330a74e92aaeaa9b96d02 Mon Sep 17 00:00:00 2001 From: muhammedaltug Date: Thu, 11 Aug 2022 11:18:49 +0300 Subject: [PATCH 09/55] remove test commits --- .../Volo/Abp/Account/AbpAccountApplicationModule.cs | 1 - npm/ng-packs/packages/account/src/lib/account.module.ts | 1 - 2 files changed, 2 deletions(-) diff --git a/modules/account/src/Volo.Abp.Account.Application/Volo/Abp/Account/AbpAccountApplicationModule.cs b/modules/account/src/Volo.Abp.Account.Application/Volo/Abp/Account/AbpAccountApplicationModule.cs index 5b54adc53e..283e06a934 100644 --- a/modules/account/src/Volo.Abp.Account.Application/Volo/Abp/Account/AbpAccountApplicationModule.cs +++ b/modules/account/src/Volo.Abp.Account.Application/Volo/Abp/Account/AbpAccountApplicationModule.cs @@ -21,7 +21,6 @@ public class AbpAccountApplicationModule : AbpModule Configure(options => { options.FileSets.AddEmbedded(); - // test }); Configure(options => 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 68973cef2a..bfa37d4bfa 100644 --- a/npm/ng-packs/packages/account/src/lib/account.module.ts +++ b/npm/ng-packs/packages/account/src/lib/account.module.ts @@ -57,4 +57,3 @@ export class AccountModule { return new LazyModuleFactory(AccountModule.forChild(options)); } } -//test From 8b34705c16e414ff7b3a4f8a4cdaab9d28fa5835 Mon Sep 17 00:00:00 2001 From: maliming Date: Thu, 11 Aug 2022 17:08:39 +0800 Subject: [PATCH 10/55] Localize `Duplicate tenancy name` . Close #13640 --- .../AbpTenantManagementDomainSharedModule.cs | 6 ++++++ .../Abp/TenantManagement/Localization/Resources/ar.json | 1 + .../Abp/TenantManagement/Localization/Resources/de-DE.json | 1 + .../Abp/TenantManagement/Localization/Resources/en.json | 1 + .../Abp/TenantManagement/Localization/Resources/es.json | 1 + .../Abp/TenantManagement/Localization/Resources/fi.json | 1 + .../Abp/TenantManagement/Localization/Resources/fr.json | 1 + .../Abp/TenantManagement/Localization/Resources/hi.json | 1 + .../Abp/TenantManagement/Localization/Resources/it.json | 1 + .../Abp/TenantManagement/Localization/Resources/pt-BR.json | 1 + .../Abp/TenantManagement/Localization/Resources/ru.json | 1 + .../Abp/TenantManagement/Localization/Resources/sk.json | 1 + .../Abp/TenantManagement/Localization/Resources/sl.json | 1 + .../Abp/TenantManagement/Localization/Resources/tr.json | 1 + .../TenantManagement/Localization/Resources/zh-Hans.json | 1 + .../TenantManagement/Localization/Resources/zh-Hant.json | 1 + .../Volo/Abp/TenantManagement/TenantManager.cs | 2 +- 17 files changed, 22 insertions(+), 1 deletion(-) 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..829a326d24 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": "جهة جديدة", 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..2033fdf1ed 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", 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..1a10c5b77a 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", 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..774201178b 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", 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..b24d67135e 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", 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..4d6ccd76b0 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", 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..93f4a1a1ad 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": "नया किरायेदार", 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..6deff1bd54 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", 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 672d2c49ad..877f777f25 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", 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..b3585c20a4 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": "Новый арендатор", 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..e37d605d16 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", 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..9e5d1c215a 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", 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..ffbab818f2 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", 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..94ef8abba1 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": "新租户", 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..1403cb79d5 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": "新租戶", 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); } } } From 0de7420d6b86126e4fe1ffc19b9f681a27dcfe3c Mon Sep 17 00:00:00 2001 From: maliming Date: Thu, 11 Aug 2022 17:43:25 +0800 Subject: [PATCH 11/55] Update unit tests. --- .../Volo/Abp/TenantManagement/TenantAppService_Tests.cs | 4 ++-- .../Volo/Abp/TenantManagement/TenantManager_Tests.cs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) 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")); } } From 2ece5809ac38f7be910456c8989c8436aaa51033 Mon Sep 17 00:00:00 2001 From: Salih Date: Thu, 11 Aug 2022 13:14:53 +0300 Subject: [PATCH 12/55] Added en and zh-Hans localization --- .../AbpIoLocalization/Base/Localization/Resources/en.json | 1 + .../AbpIoLocalization/Base/Localization/Resources/zh-Hans.json | 1 + 2 files changed, 2 insertions(+) diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json index 6583ae731f..64c6de316c 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json @@ -98,6 +98,7 @@ "Logout": "Logout", "Home": "Home", "Posts": "Posts", + "Videos": "Videos", "JoinTheABPCommunity": "Join the ABP Community", "SubmitYourPost": "Submit Your Post", "Modules": "Modules", 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 c4aa5f4926..27ca5964ae 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/zh-Hans.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/zh-Hans.json @@ -98,6 +98,7 @@ "Logout": "登出", "Home": "主页", "Posts": "帖子", + "Videos": "视频", "JoinTheABPCommunity": "加入 ABP 社区", "SubmitYourPost": "提交您的帖子", "Modules": "模块", From dc999ed7f11d87a0c522d8ca821f4f278d18d661 Mon Sep 17 00:00:00 2001 From: Salih Date: Thu, 11 Aug 2022 13:30:11 +0300 Subject: [PATCH 13/55] Added section headers localization --- .../AbpIoLocalization/Base/Localization/Resources/en.json | 1 + .../AbpIoLocalization/Base/Localization/Resources/zh-Hans.json | 1 + 2 files changed, 2 insertions(+) diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json index 64c6de316c..e90d5b3897 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", 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 27ca5964ae..0711a49836 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/zh-Hans.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/zh-Hans.json @@ -73,6 +73,7 @@ "DeveloperFocused": "以开发者为中心", "ShareYourExperiences": "分享您使用 ABP 框架的经验", "LatestPosts": "最新的帖子", + "LatestVideos": "最新的视频", "Views": "意见", "LearnLatestNewsAboutABPFramework": "获取有关 ABP 的最新相关信息,例如新版本、免费资源、帖子等。", "DeveloperTools": "开发者工具", From 3e84eb6da070345a2d6a38852e8a9a602343f81d Mon Sep 17 00:00:00 2001 From: Mahmut Gundogdu Date: Thu, 11 Aug 2022 14:25:08 +0300 Subject: [PATCH 14/55] Add userName validatior on Identit/user.component --- .../identity/src/lib/components/users/users.component.html | 2 +- .../identity/src/lib/components/users/users.component.ts | 3 +++ .../identity/src/lib/defaults/default-users-form-props.ts | 4 +++- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/npm/ng-packs/packages/identity/src/lib/components/users/users.component.html b/npm/ng-packs/packages/identity/src/lib/components/users/users.component.html index 7873adf6ea..99d435c891 100644 --- a/npm/ng-packs/packages/identity/src/lib/components/users/users.component.html +++ b/npm/ng-packs/packages/identity/src/lib/components/users/users.component.html @@ -39,7 +39,7 @@ >
-
+