Browse Source

Merge remote-tracking branch 'remotes/upstream/dev' into aprite/add-blobstoring-aliyun-from-dev

pull/4735/head
shaoxiaoxu 6 years ago
parent
commit
29f014b70a
  1. 5
      docs/en/Background-Jobs-Hangfire.md
  2. 11
      docs/en/Getting-Started.md
  3. 6
      docs/en/SignalR-Integration.md
  4. 38
      docs/en/UI/Angular/Component-Replacement.md
  5. 2
      docs/en/UI/Angular/Migration-Guide-v3.md
  6. 5
      docs/zh-Hans/Background-Jobs-Hangfire.md
  7. 36
      docs/zh-Hans/UI/Angular/Component-Replacement.md
  8. 1
      docs/zh-Hans/UI/AspNetCore/Tag-Helpers/Form-elements.md
  9. 27
      framework/src/Volo.Abp.AspNetCore.Authentication.OAuth/Properties/launchSettings.json
  10. 27
      framework/src/Volo.Abp.AspNetCore.MultiTenancy/Properties/launchSettings.json
  11. 27
      framework/src/Volo.Abp.AspNetCore.Mvc.Client/Properties/launchSettings.json
  12. 2
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/nl.json
  13. 31
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/wwwroot/themes/basic/layout.css
  14. 27
      framework/src/Volo.Abp.AspNetCore.Serilog/Properties/launchSettings.json
  15. 27
      framework/src/Volo.Abp.AspNetCore.SignalR/Properties/launchSettings.json
  16. 27
      framework/src/Volo.Abp.AspNetCore.TestBase/Properties/launchSettings.json
  17. 27
      framework/src/Volo.Abp.AspNetCore/Properties/launchSettings.json
  18. 2
      framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Localization/Resources/AbpDdd/de.json
  19. 12
      framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Localization/de.json
  20. 27
      framework/src/Volo.Abp.Http.Client.IdentityModel.Web/Properties/launchSettings.json
  21. 38
      framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/de.json
  22. 46
      framework/src/Volo.Abp.Validation/Volo/Abp/Validation/Localization/de.json
  23. 2
      framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Localization/Resource/de.json
  24. 5
      framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/AbpLocalization_Tests.cs
  25. 2
      framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/Base/CountryNames/nl.json
  26. 2
      framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/Base/Validation/nl.json
  27. 2
      framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/Source/nl.json
  28. 2
      framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/SourceExt/nl.json
  29. 5
      modules/account/.prettierrc
  30. 26
      modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/de.json
  31. 12
      modules/account/src/Volo.Abp.Account.Web/Pages/Account/LoggedOut.js
  32. 39
      modules/account/src/Volo.Abp.Account.Web/Pages/Account/Manage.js
  33. 5
      modules/audit-logging/.prettierrc
  34. 5
      modules/background-jobs/.prettierrc
  35. 5
      modules/blob-storing-database/.prettierrc
  36. 5
      modules/blogging/.prettierrc
  37. 8
      modules/blogging/src/Volo.Blogging.Admin.Web/Pages/Blogging/Admin/Blogs/create.js
  38. 8
      modules/blogging/src/Volo.Blogging.Admin.Web/Pages/Blogging/Admin/Blogs/edit.js
  39. 116
      modules/blogging/src/Volo.Blogging.Admin.Web/Pages/Blogging/Admin/Blogs/index.js
  40. 14
      modules/blogging/src/Volo.Blogging.Domain.Shared/Volo/Blogging/Localization/Resources/de.json
  41. 89
      modules/blogging/src/Volo.Blogging.Web/Pages/Blogs/Posts/detail.js
  42. 89
      modules/blogging/src/Volo.Blogging.Web/Pages/Blogs/Posts/edit.js
  43. 85
      modules/blogging/src/Volo.Blogging.Web/Pages/Blogs/Posts/new.js
  44. 22
      modules/blogging/src/Volo.Blogging.Web/Pages/Blogs/Shared/Scripts/blog.js
  45. 5
      modules/client-simulation/.prettierrc
  46. 2
      modules/client-simulation/src/Volo.ClientSimulation.Web/Pages/ClientSimulation/Index.js
  47. 8
      modules/client-simulation/src/Volo.ClientSimulation.Web/Pages/ClientSimulation/SimulationArea.js
  48. 5
      modules/cms-kit/.prettierrc
  49. 5
      modules/docs/.prettierrc
  50. 2
      modules/docs/app/VoloDocs.Web/Localization/Resources/VoloDocs/Web/nl.json
  51. 2
      modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/nl.json
  52. 17
      modules/docs/src/Volo.Docs.Admin.Application/Volo/Docs/Admin/Documents/DocumentAdminAppService.cs
  53. 264
      modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Documents/index.js
  54. 12
      modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Projects/Pull.js
  55. 8
      modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Projects/create.js
  56. 8
      modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Projects/edit.js
  57. 183
      modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Projects/index.js
  58. 4
      modules/docs/src/Volo.Docs.Application/Volo/Docs/Documents/DocumentAppService.cs
  59. 9
      modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/FullSearch/Elastic/ElasticDocumentFullSearch.cs
  60. 2
      modules/docs/src/Volo.Docs.Domain/Volo/Docs/Localization/Domain/nl.json
  61. 23
      modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/bootstrap-toc.js
  62. 212
      modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/index.js
  63. 25
      modules/docs/src/Volo.Docs.Web/Pages/Documents/Search.cshtml.cs
  64. 10
      modules/docs/src/Volo.Docs.Web/Pages/Documents/Shared/ErrorComponent/error.js
  65. 113
      modules/docs/src/Volo.Docs.Web/Pages/Documents/Shared/Scripts/vs.js
  66. 5
      modules/feature-management/.prettierrc
  67. 2
      modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/de.json
  68. 11
      modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/feature-management-modal.js
  69. 5
      modules/identity/.prettierrc
  70. 82
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/de.json
  71. 120
      modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Roles/index.js
  72. 101
      modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Users/index.js
  73. 5
      modules/identityserver/.prettierrc
  74. 2
      modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/nl.json
  75. 5
      modules/permission-management/.prettierrc
  76. 2
      modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/de.json
  77. 149
      modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Pages/AbpPermissionManagement/permission-management-modal.js
  78. 5
      modules/setting-management/.prettierrc
  79. 6
      modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Index.js
  80. 5
      modules/tenant-management/.prettierrc
  81. 4
      modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/de.json
  82. 4
      modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/nl.json
  83. 18
      modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Pages/TenantManagement/Tenants/ConnectionStringsModal.js
  84. 110
      modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Pages/TenantManagement/Tenants/Index.js
  85. 5
      modules/users/.prettierrc
  86. 5
      modules/virtual-file-explorer/.prettierrc
  87. 6
      modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Pages/VirtualFileExplorer/index.js
  88. 5
      npm/ng-packs/packages/core/src/lib/actions/replaceable-components.actions.ts
  89. 15
      npm/ng-packs/packages/core/src/lib/components/dynamic-layout.component.ts
  90. 17
      npm/ng-packs/packages/core/src/lib/guards/permission.guard.ts
  91. 30
      npm/ng-packs/packages/core/src/lib/states/replaceable-components.state.ts
  92. 74
      npm/ng-packs/packages/core/src/lib/tests/permission.guard.spec.ts
  93. 24
      npm/ng-packs/packages/core/src/lib/tests/replaceable-components.state.spec.ts
  94. 2
      npm/ng-packs/packages/core/src/lib/tests/rest.service.spec.ts
  95. 5
      npm/ng-packs/scripts/publish.ts
  96. 19
      npm/ng-packs/scripts/replace-with-preview.ts
  97. 6
      npm/preview-publish.ps1
  98. 12
      npm/publish.ps1
  99. 5
      templates/app/aspnet-core/.prettierrc
  100. 2
      templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/Pages/Index.css

5
docs/en/Background-Jobs-Hangfire.md

@ -66,9 +66,7 @@ After you have installed these NuGet packages, you need to configure your projec
} }
```` ````
2. We need to add `UseHangfireServer` call in the `OnApplicationInitialization` method in `Module` class 2. If you want to use hangfire's dashboard, you can add `UseHangfireDashboard` call in the `OnApplicationInitialization` method in `Module` class
If you want to use hangfire's dashboard, you can add it, too: by `UseHangfireDashboard`
````csharp ````csharp
public override void OnApplicationInitialization(ApplicationInitializationContext context) public override void OnApplicationInitialization(ApplicationInitializationContext context)
@ -77,7 +75,6 @@ If you want to use hangfire's dashboard, you can add it, too: by `UseHangfireDas
// ... others // ... others
app.UseHangfireServer();
app.UseHangfireDashboard(); app.UseHangfireDashboard();
} }

11
docs/en/Getting-Started.md

@ -20,19 +20,20 @@ First things first! Let's setup your development environment before creating the
The following tools should be installed on your development machine: The following tools should be installed on your development machine:
* [Visual Studio 2019 (v16.4+)](https://visualstudio.microsoft.com/vs/) for Windows / [Visual Studio for Mac](https://visualstudio.microsoft.com/vs/mac/).* * [Visual Studio 2019 (v16.4+)](https://visualstudio.microsoft.com/vs/) for Windows / [Visual Studio for Mac](https://visualstudio.microsoft.com/vs/mac/). <sup id="a-editor">[1](#f-editor)</sup>
* [.NET Core 3.1+](https://www.microsoft.com/net/download/dotnet-core/) * [.NET Core 3.1+](https://www.microsoft.com/net/download/dotnet-core/)
* [Node v12+](https://nodejs.org) * [Node v12 or v14](https://nodejs.org/en/)
* [Yarn v1.19+](https://classic.yarnpkg.com/) * [Yarn v1.20+ (not v2)](https://classic.yarnpkg.com/en/docs/install) <sup id="a-yarn">[2](#f-yarn)</sup> or npm v6+ (installed with Node)
{{ if Tiered == "Yes" }} {{ if Tiered == "Yes" }}
* [Redis](https://redis.io/) (the startup solution uses the Redis as the [distributed cache](Caching.md)). * [Redis](https://redis.io/) (the startup solution uses the Redis as the [distributed cache](Caching.md)).
{{ end }} {{ end }}
<sup id="f-editor"><b>1</b></sup> _You can use another editor instead of Visual Studio as long as it supports .NET Core and ASP.NET Core._ <sup>[↩](#a-editor)</sup>
> *You can use another editor instead of Visual Studio as long as it supports .NET Core and ASP.NET Core. <sup id="f-yarn"><b>2</b></sup> _Yarn v2 works differently and is not supported._ <sup>[↩](#a-yarn)</sup>
### Install the ABP CLI ### Install the ABP CLI
@ -348,4 +349,4 @@ See the "[Getting Started with the React Native](Getting-Started-React-Native.md
## Next ## Next
* [Web Application Development Tutorial](Tutorials/Part-1.md) * [Web Application Development Tutorial](Tutorials/Part-1.md)

6
docs/en/SignalR-Integration.md

@ -115,7 +115,7 @@ public class MessagingHub : Hub
} }
```` ````
The hub route will be `/signalr-hubs/messasing` for the `MessasingHub`: The hub route will be `/signalr-hubs/messaging` for the `MessagingHub`:
* Adding a standard `/signalr-hubs/` prefix * Adding a standard `/signalr-hubs/` prefix
* Continue with the **camel case** hub name, without the `Hub` suffix. * Continue with the **camel case** hub name, without the `Hub` suffix.
@ -123,7 +123,7 @@ The hub route will be `/signalr-hubs/messasing` for the `MessasingHub`:
If you want to specify the route, you can use the `HubRoute` attribute: If you want to specify the route, you can use the `HubRoute` attribute:
````csharp ````csharp
[HubRoute("/my-messasing-hub")] [HubRoute("/my-messaging-hub")]
public class MessagingHub : Hub public class MessagingHub : Hub
{ {
//... //...
@ -132,7 +132,7 @@ public class MessagingHub : Hub
### AbpHub Base Classes ### AbpHub Base Classes
Instead of the standard `Hub` and `Hub<T>` classes, you can inherit from the `AbpHub` or `AbpHub<T>` which hve useful base properties like `CurrentUser`. Instead of the standard `Hub` and `Hub<T>` classes, you can inherit from the `AbpHub` or `AbpHub<T>` which have useful base properties like `CurrentUser`.
Example: Example:

38
docs/en/UI/Angular/Component-Replacement.md

@ -11,25 +11,24 @@ Create a new component that you want to use instead of an ABP component. Add tha
Then, open the `app.component.ts` and dispatch the `AddReplaceableComponent` action to replace your component with an ABP component as shown below: Then, open the `app.component.ts` and dispatch the `AddReplaceableComponent` action to replace your component with an ABP component as shown below:
```js ```js
import { ..., AddReplaceableComponent } from '@abp/ng.core'; // imported AddReplaceableComponent action import { AddReplaceableComponent } from '@abp/ng.core'; // imported AddReplaceableComponent action
import { eIdentityComponents } from '@abp/ng.identity'; // imported eIdentityComponents enum import { eIdentityComponents } from '@abp/ng.identity'; // imported eIdentityComponents enum
import { Store } from '@ngxs/store'; // imported Store import { Store } from '@ngxs/store'; // imported Store
//... //...
@Component(/* component metadata */) @Component(/* component metadata */)
export class AppComponent implements OnInit { export class AppComponent {
constructor(..., private store: Store) {} // injected Store constructor(
private store: Store // injected Store
ngOnInit() { )
// added dispatch {
// dispatched the AddReplaceableComponent action
this.store.dispatch( this.store.dispatch(
new AddReplaceableComponent({ new AddReplaceableComponent({
component: YourNewRoleComponent, component: YourNewRoleComponent,
key: eIdentityComponents.Roles, key: eIdentityComponents.Roles,
}), }),
); );
//...
} }
} }
``` ```
@ -48,9 +47,7 @@ The example below describes how to replace the `ApplicationLayoutComponent`:
Run the following command to generate a layout in `angular` folder: Run the following command to generate a layout in `angular` folder:
```bash ```bash
yarn ng generate component shared/my-application-layout --export --entryComponent yarn ng generate component my-application-layout
# You don't need the --entryComponent option in Angular 9
``` ```
Add the following code in your layout template (`my-layout.component.html`) where you want the page to be loaded. Add the following code in your layout template (`my-layout.component.html`) where you want the page to be loaded.
@ -62,30 +59,29 @@ Add the following code in your layout template (`my-layout.component.html`) wher
Open `app.component.ts` in `src/app` folder and modify it as shown below: Open `app.component.ts` in `src/app` folder and modify it as shown below:
```js ```js
import { ..., AddReplaceableComponent } from '@abp/ng.core'; // imported AddReplaceableComponent import { AddReplaceableComponent } from '@abp/ng.core'; // imported AddReplaceableComponent
import { eThemeBasicComponents } from '@abp/ng.theme.basic'; // imported eThemeBasicComponents enum for component keys import { eThemeBasicComponents } from '@abp/ng.theme.basic'; // imported eThemeBasicComponents enum for component keys
import { MyApplicationLayoutComponent } from './shared/my-application-layout/my-application-layout.component'; // imported MyApplicationLayoutComponent
import { Store } from '@ngxs/store'; // imported Store import { Store } from '@ngxs/store'; // imported Store
//... import { MyApplicationLayoutComponent } from './my-application-layout/my-application-layout.component'; // imported MyApplicationLayoutComponent
@Component(/* component metadata */) @Component(/* component metadata */)
export class AppComponent implements OnInit { export class AppComponent {
constructor(..., private store: Store) {} // injected Store constructor(
private store: Store, // injected Store
ngOnInit() { ) {
// added dispatch // dispatched the AddReplaceableComponent action
this.store.dispatch( this.store.dispatch(
new AddReplaceableComponent({ new AddReplaceableComponent({
component: MyApplicationLayoutComponent, component: MyApplicationLayoutComponent,
key: eThemeBasicComponents.ApplicationLayout, key: eThemeBasicComponents.ApplicationLayout,
}), }),
); );
//...
} }
} }
``` ```
> If you like to replace a layout component at runtime (e.g: changing the layout by pressing a button), pass the second parameter of the AddReplaceableComponent action as true. DynamicLayoutComponent loads content using a router-outlet. When the second parameter of AddReplaceableComponent is true, the route will be refreshed, so use it with caution. Your component state will be gone and any initiation logic (including HTTP requests) will be repeated.
### Layout Components ### Layout Components
![Layout Components](./images/layout-components.png) ![Layout Components](./images/layout-components.png)

2
docs/en/UI/Angular/Migration-Guide-v3.md

@ -18,7 +18,7 @@ This will make the following modifications:
- Update your package.json and install new packages - Update your package.json and install new packages
- Revise tsconfig.json files to create a "Solution Style" configuration - Revise tsconfig.json files to create a "Solution Style" configuration
- Rename `browserlist` as `.browserlistrc` - Rename `browserslist` as `.browserslistrc`
On the other hand, it would be better if you check which packages to update first with `yarn ng update` command alone. Angular will give you a list of packages to update. On the other hand, it would be better if you check which packages to update first with `yarn ng update` command alone. Angular will give you a list of packages to update.

5
docs/zh-Hans/Background-Jobs-Hangfire.md

@ -66,9 +66,7 @@ public class YourModule : AbpModule
} }
```` ````
1. 我们需要在 `Module` 类的 `OnApplicationInitialization` 方法添加 `UseHangfireServer` 方法调用. 1. 如果你想要使用Hangfire的面板,你可以在 `Module` 类的 `OnApplicationInitialization` 方法添加: `UseHangfireDashboard`
如果你想要使用Hangfire的面板,你可以使用: `UseHangfireDashboard`
````csharp ````csharp
public override void OnApplicationInitialization(ApplicationInitializationContext context) public override void OnApplicationInitialization(ApplicationInitializationContext context)
@ -77,7 +75,6 @@ public class YourModule : AbpModule
// ... others // ... others
app.UseHangfireServer();
app.UseHangfireDashboard(); app.UseHangfireDashboard();
} }

36
docs/zh-Hans/UI/Angular/Component-Replacement.md

@ -11,25 +11,24 @@
然后打开 `app.component.ts` 使用 `AddReplaceableComponent` 将你的组件替换ABP组件. 如下所示: 然后打开 `app.component.ts` 使用 `AddReplaceableComponent` 将你的组件替换ABP组件. 如下所示:
```js ```js
import { ..., AddReplaceableComponent } from '@abp/ng.core'; // imported AddReplaceableComponent action import { AddReplaceableComponent } from '@abp/ng.core'; // imported AddReplaceableComponent action
import { eIdentityComponents } from '@abp/ng.identity'; // imported eIdentityComponents enum import { eIdentityComponents } from '@abp/ng.identity'; // imported eIdentityComponents enum
import { Store } from '@ngxs/store'; // imported Store import { Store } from '@ngxs/store'; // imported Store
//... //...
@Component(/* component metadata */) @Component(/* component metadata */)
export class AppComponent implements OnInit { export class AppComponent {
constructor(..., private store: Store) {} // injected Store constructor(
private store: Store // injected Store
ngOnInit() { )
// added dispatch {
// dispatched the AddReplaceableComponent action
this.store.dispatch( this.store.dispatch(
new AddReplaceableComponent({ new AddReplaceableComponent({
component: YourNewRoleComponent, component: YourNewRoleComponent,
key: eIdentityComponents.Roles, key: eIdentityComponents.Roles,
}), }),
); );
//...
} }
} }
``` ```
@ -47,9 +46,7 @@ export class AppComponent implements OnInit {
运行以下命令在 `angular` 文件夹中生成布局: 运行以下命令在 `angular` 文件夹中生成布局:
```bash ```bash
yarn ng generate component shared/my-application-layout --export --entryComponent yarn ng generate component my-application-layout
# You don't need the --entryComponent option in Angular 9
``` ```
在你的布局模板(`my-layout.component.html`)中添加以下代码: 在你的布局模板(`my-layout.component.html`)中添加以下代码:
@ -61,26 +58,23 @@ yarn ng generate component shared/my-application-layout --export --entryComponen
打开 `src/app` 文件夹下的 `app.component.ts` 文件添加以下内容: 打开 `src/app` 文件夹下的 `app.component.ts` 文件添加以下内容:
```js ```js
import { ..., AddReplaceableComponent } from '@abp/ng.core'; // imported AddReplaceableComponent import { AddReplaceableComponent } from '@abp/ng.core'; // imported AddReplaceableComponent
import { eThemeBasicComponents } from '@abp/ng.theme.basic'; // imported eThemeBasicComponents enum for component keys import { eThemeBasicComponents } from '@abp/ng.theme.basic'; // imported eThemeBasicComponents enum for component keys
import { MyApplicationLayoutComponent } from './shared/my-application-layout/my-application-layout.component'; // imported MyApplicationLayoutComponent
import { Store } from '@ngxs/store'; // imported Store import { Store } from '@ngxs/store'; // imported Store
//... import { MyApplicationLayoutComponent } from './my-application-layout/my-application-layout.component'; // imported MyApplicationLayoutComponent
@Component(/* component metadata */) @Component(/* component metadata */)
export class AppComponent implements OnInit { export class AppComponent {
constructor(..., private store: Store) {} // injected Store constructor(
private store: Store, // injected Store
ngOnInit() { ) {
// added dispatch // dispatched the AddReplaceableComponent action
this.store.dispatch( this.store.dispatch(
new AddReplaceableComponent({ new AddReplaceableComponent({
component: MyApplicationLayoutComponent, component: MyApplicationLayoutComponent,
key: eThemeBasicComponents.ApplicationLayout, key: eThemeBasicComponents.ApplicationLayout,
}), }),
); );
//...
} }
} }
``` ```

1
docs/zh-Hans/UI/AspNetCore/Tag-Helpers/Form-elements.md

@ -0,0 +1 @@
TODO...

27
framework/src/Volo.Abp.AspNetCore.Authentication.OAuth/Properties/launchSettings.json

@ -0,0 +1,27 @@
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:53601/",
"sslPort": 44330
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"Volo.Abp.AspNetCore.Authentication.OAuth": {
"commandName": "Project",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
"applicationUrl": "https://localhost:5001;http://localhost:5000"
}
}
}

27
framework/src/Volo.Abp.AspNetCore.MultiTenancy/Properties/launchSettings.json

@ -0,0 +1,27 @@
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:53597/",
"sslPort": 44355
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"Volo.Abp.AspNetCore.MultiTenancy": {
"commandName": "Project",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
"applicationUrl": "https://localhost:5001;http://localhost:5000"
}
}
}

27
framework/src/Volo.Abp.AspNetCore.Mvc.Client/Properties/launchSettings.json

@ -0,0 +1,27 @@
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:53603/",
"sslPort": 44305
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"Volo.Abp.AspNetCore.Mvc.Client": {
"commandName": "Project",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
"applicationUrl": "https://localhost:5001;http://localhost:5000"
}
}
}

2
framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/nl.json

@ -1,4 +1,4 @@
{ {
"culture": "nl", "culture": "nl",
"texts": { "texts": {
"GivenTenantIsNotAvailable": "Gegeven klant is niet beschikbaar: {0}", "GivenTenantIsNotAvailable": "Gegeven klant is niet beschikbaar: {0}",

31
framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/wwwroot/themes/basic/layout.css

@ -57,7 +57,34 @@
font-size: 0.8em; font-size: 0.8em;
} }
.dataTables_scrollBody { .dataTables_scrollBody {
min-height: 248px; min-height: 248px;
} }
div.dataTables_wrapper div.dataTables_info {
padding-top: 11px;
white-space: nowrap;
}
div.dataTables_wrapper div.dataTables_length label {
padding-top: 10px;
margin-bottom: 0;
}
.rtl .dropdown-menu-right {
right: auto;
left: 0;
}
.rtl .dropdown-menu-right a {
text-align: right;
}
.rtl .navbar .dropdown-menu a {
text-align: right;
}
.rtl .navbar .dropdown-submenu .dropdown-menu {
top: 0;
left: auto;
right: 100%;
}

27
framework/src/Volo.Abp.AspNetCore.Serilog/Properties/launchSettings.json

@ -0,0 +1,27 @@
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:53606/",
"sslPort": 44319
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"Volo.Abp.AspNetCore.Serilog": {
"commandName": "Project",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
"applicationUrl": "https://localhost:5001;http://localhost:5000"
}
}
}

27
framework/src/Volo.Abp.AspNetCore.SignalR/Properties/launchSettings.json

@ -0,0 +1,27 @@
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:53611/",
"sslPort": 44331
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"Volo.Abp.AspNetCore.SignalR": {
"commandName": "Project",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
"applicationUrl": "https://localhost:5001;http://localhost:5000"
}
}
}

27
framework/src/Volo.Abp.AspNetCore.TestBase/Properties/launchSettings.json

@ -0,0 +1,27 @@
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:53599/",
"sslPort": 44358
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"Volo.Abp.AspNetCore.TestBase": {
"commandName": "Project",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
"applicationUrl": "https://localhost:5001;http://localhost:5000"
}
}
}

27
framework/src/Volo.Abp.AspNetCore/Properties/launchSettings.json

@ -0,0 +1,27 @@
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:53596/",
"sslPort": 44300
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"Volo.Abp.AspNetCore": {
"commandName": "Project",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
"applicationUrl": "https://localhost:5001;http://localhost:5000"
}
}
}

2
framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Localization/Resources/AbpDdd/de.json

@ -1,6 +1,6 @@
{ {
"culture": "de", "culture": "de",
"texts": { "texts": {
"MaxResultCountExceededExceptionMessage": "{0} kann nicht mehr als {1} sein! Erhöhen Sie {2}.{3} auf der Serverseite, um mehr Ergebnisse zu ermöglichen." "MaxResultCountExceededExceptionMessage": "{0} kann nicht mehr als {1} sein! Erhöhen Sie {2}.{3} auf der Serverseite, um mehr Ergebnisse zu ermöglichen."
} }
} }

12
framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Localization/de.json

@ -12,12 +12,12 @@
"DisplayName:Abp.Mailing.Smtp.UseDefaultCredentials": "Standard-Anmeldeinformationen verwenden", "DisplayName:Abp.Mailing.Smtp.UseDefaultCredentials": "Standard-Anmeldeinformationen verwenden",
"Description:Abp.Mailing.DefaultFromAddress": "Die Standard-Absenderadresse", "Description:Abp.Mailing.DefaultFromAddress": "Die Standard-Absenderadresse",
"Description:Abp.Mailing.DefaultFromDisplayName": "Der Standard-Absendername", "Description:Abp.Mailing.DefaultFromDisplayName": "Der Standard-Absendername",
"Description:Abp.Mailing.Smtp.Host": "Der Name oder die IP-Adresse des für SMTP-Transaktionen verwendeten Hosts.", "Description:Abp.Mailing.Smtp.Host": "Der Name oder die IP-Adresse des für SMTP-Transaktionen verwendeten Hosts.",
"Description:Abp.Mailing.Smtp.Port": "Der für SMTP-Transaktionen verwendete Port.", "Description:Abp.Mailing.Smtp.Port": "Der für SMTP-Transaktionen verwendete Port.",
"Description:Abp.Mailing.Smtp.UserName": "Benutzername, der mit den Anmeldedaten verknüpft ist.", "Description:Abp.Mailing.Smtp.UserName": "Benutzername, der mit den Anmeldedaten verknüpft ist.",
"Description:Abp.Mailing.Smtp.Password": "Das Passwort für den Benutzernamen, der mit den Anmeldeinformationen verknüpft ist.", "Description:Abp.Mailing.Smtp.Password": "Das Passwort für den Benutzernamen, der mit den Anmeldeinformationen verknüpft ist.",
"Description:Abp.Mailing.Smtp.Domain": "Die Domäne oder der Computername, der die Anmeldeinformationen verifiziert.", "Description:Abp.Mailing.Smtp.Domain": "Die Domäne oder der Computername, der die Anmeldeinformationen verifiziert.",
"Description:Abp.Mailing.Smtp.EnableSsl": "Bestimmt, ob der SmptClient Secure Sockets Layer (SSL) zur Verschlüsselung der Verbindung verwendet.", "Description:Abp.Mailing.Smtp.EnableSsl": "Bestimmt, ob der SmptClient Secure Sockets Layer (SSL) zur Verschlüsselung der Verbindung verwendet.",
"Description:Abp.Mailing.Smtp.UseDefaultCredentials": "Bestimmt, ob die DefaultCredentials mit Anfragen gesendet werden." "Description:Abp.Mailing.Smtp.UseDefaultCredentials": "Bestimmt, ob die DefaultCredentials mit Anfragen gesendet werden."
} }
} }

27
framework/src/Volo.Abp.Http.Client.IdentityModel.Web/Properties/launchSettings.json

@ -0,0 +1,27 @@
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:53610/",
"sslPort": 44304
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"Volo.Abp.Http.Client.IdentityModel.Web": {
"commandName": "Project",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
"applicationUrl": "https://localhost:5001;http://localhost:5000"
}
}
}

38
framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/de.json

@ -1,18 +1,18 @@
{ {
"culture": "de", "culture": "de",
"texts": { "texts": {
"InternalServerErrorMessage": "Während Ihrer Anfrage ist ein interner Fehler aufgetreten!", "InternalServerErrorMessage": "Während Ihrer Anfrage ist ein interner Fehler aufgetreten!",
"ValidationErrorMessage": "Ihre Anfrage ist nicht gültig!", "ValidationErrorMessage": "Ihre Anfrage ist nicht gültig!",
"ValidationNarrativeErrorMessageTitle": "Die folgenden Fehler wurden bei der Validierung entdeckt.", "ValidationNarrativeErrorMessageTitle": "Die folgenden Fehler wurden bei der Validierung entdeckt.",
"DefaultErrorMessage": "Ein Fehler ist aufgetreten!", "DefaultErrorMessage": "Ein Fehler ist aufgetreten!",
"DefaultErrorMessageDetail": "Es wurden keine Fehlerdetails vom Server gesendet.", "DefaultErrorMessageDetail": "Es wurden keine Fehlerdetails vom Server gesendet.",
"DefaultErrorMessage401": "Sie sind nicht authentifiziert.", "DefaultErrorMessage401": "Sie sind nicht authentifiziert.",
"DefaultErrorMessage401Detail": "Sie sollten sich anmelden, um diese Operation durchzuführen.", "DefaultErrorMessage401Detail": "Sie sollten sich anmelden, um diese Operation durchzuführen.",
"DefaultErrorMessage403": "Sie sind nicht autorisiert!", "DefaultErrorMessage403": "Sie sind nicht autorisiert!",
"DefaultErrorMessage403Detail": "Es ist Ihnen nicht erlaubt, diese Operation durchzuführen!", "DefaultErrorMessage403Detail": "Es ist Ihnen nicht erlaubt, diese Operation durchzuführen!",
"DefaultErrorMessage404": "Ressource nicht gefunden!", "DefaultErrorMessage404": "Ressource nicht gefunden!",
"DefaultErrorMessage404Detail": "Die angeforderte Ressource konnte auf dem Server nicht gefunden werden!", "DefaultErrorMessage404Detail": "Die angeforderte Ressource konnte auf dem Server nicht gefunden werden!",
"EntityNotFoundErrorMessage": "Es gibt keine Entität {0} mit id = {1}!", "EntityNotFoundErrorMessage": "Es gibt keine Entität {0} mit id = {1}!",
"Languages": "Sprachen", "Languages": "Sprachen",
"Error": "Fehler", "Error": "Fehler",
"AreYouSure": "Sind Sie sicher?", "AreYouSure": "Sind Sie sicher?",
@ -20,11 +20,11 @@
"Yes": "Ja", "Yes": "Ja",
"No": "Nein", "No": "Nein",
"Ok": "Ok", "Ok": "Ok",
"Close": "Schließen", "Close": "Schließen",
"Save": "Speichern", "Save": "Speichern",
"SavingWithThreeDot": "Speichere...", "SavingWithThreeDot": "Speichere...",
"Actions": "Aktionen", "Actions": "Aktionen",
"Delete": "Löschen", "Delete": "Löschen",
"Edit": "Bearbeiten", "Edit": "Bearbeiten",
"Refresh": "Aktualisieren", "Refresh": "Aktualisieren",
"Language": "Sprache", "Language": "Sprache",
@ -36,28 +36,28 @@
"Register": "Registrieren", "Register": "Registrieren",
"Logout": "Abmelden", "Logout": "Abmelden",
"Submit": "Absenden", "Submit": "Absenden",
"Back": "Zurück", "Back": "Zurück",
"PagerSearch": "Suchen", "PagerSearch": "Suchen",
"PagerNext": "Nächste", "PagerNext": "Nächste",
"PagerPrevious": "Vorherige", "PagerPrevious": "Vorherige",
"PagerFirst": "Erste", "PagerFirst": "Erste",
"PagerLast": "Letzte", "PagerLast": "Letzte",
"PagerInfo": "Zeige _START_ bis _END_ von _TOTAL_ Einträgen", "PagerInfo": "Zeige _START_ bis _END_ von _TOTAL_ Einträgen",
"PagerInfo{0}{1}{2}": "Zeige {0} bis {1} von {2} Einträgen", "PagerInfo{0}{1}{2}": "Zeige {0} bis {1} von {2} Einträgen",
"PagerInfoEmpty": "Zeige 0 bis 0 von 0 Einträgen", "PagerInfoEmpty": "Zeige 0 bis 0 von 0 Einträgen",
"PagerInfoFiltered": "(gefiltert von _MAX_ Einträgen insgesamt)", "PagerInfoFiltered": "(gefiltert von _MAX_ Einträgen insgesamt)",
"NoDataAvailableInDatatable": "Keine Daten verfügbar", "NoDataAvailableInDatatable": "Keine Daten verfügbar",
"PagerShowMenuEntries": "Zeige _MENU_ Einträge", "PagerShowMenuEntries": "Zeige _MENU_ Einträge",
"DatatableActionDropdownDefaultText": "Aktionen", "DatatableActionDropdownDefaultText": "Aktionen",
"ChangePassword": "Passwort ändern", "ChangePassword": "Passwort ändern",
"PersonalInfo": "Mein Profil", "PersonalInfo": "Mein Profil",
"AreYouSureYouWantToCancelEditingWarningMessage": "Sie haben ungespeicherte Änderungen.", "AreYouSureYouWantToCancelEditingWarningMessage": "Sie haben ungespeicherte Änderungen.",
"UnhandledException": "Unerwartete Ausnahme!", "UnhandledException": "Unerwartete Ausnahme!",
"401Message": "Unauthorisiert", "401Message": "Unauthorisiert",
"403Message": "Verboten", "403Message": "Verboten",
"404Message": "Seite nicht gefunden", "404Message": "Seite nicht gefunden",
"500Message": "Internet Server Fehler", "500Message": "Interner Server Fehler",
"GoHomePage": "Zur Startseite", "GoHomePage": "Zur Startseite",
"GoBack": "Zurück" "GoBack": "Zurück"
} }
} }

46
framework/src/Volo.Abp.Validation/Volo/Abp/Validation/Localization/de.json

@ -1,34 +1,34 @@
{ {
"culture": "de", "culture": "de",
"texts": { "texts": {
"'{0}' and '{1}' do not match.": "'{0}' und '{1}' stimmen nicht überein.", "'{0}' and '{1}' do not match.": "'{0}' und '{1}' stimmen nicht überein.",
"The {0} field is not a valid credit card number.": "Das Feld {0} ist keine gültige Kreditkartennummer.", "The {0} field is not a valid credit card number.": "Das Feld {0} ist keine gültige Kreditkartennummer.",
"{0} is not valid.": "{0} ist nicht gültig.", "{0} is not valid.": "{0} ist nicht gültig.",
"The {0} field is not a valid e-mail address.": "Das Feld {0} ist keine gültige E-Mail-Adresse.", "The {0} field is not a valid e-mail address.": "Das Feld {0} ist keine gültige E-Mail-Adresse.",
"The {0} field only accepts files with the following extensions: {1}": "Das Feld {0} akzeptiert nur Dateien mit den folgenden Erweiterungen: {1}", "The {0} field only accepts files with the following extensions: {1}": "Das Feld {0} akzeptiert nur Dateien mit den folgenden Erweiterungen: {1}",
"The field {0} must be a string or array type with a maximum length of '{1}'.": "Das Feld {0} muss eine Zeichenfolge oder Auflistung mit einer maximalen Länge von '{1}' sein.", "The field {0} must be a string or array type with a maximum length of '{1}'.": "Das Feld {0} muss eine Zeichenfolge oder Auflistung mit einer maximalen Länge von '{1}' sein.",
"The field {0} must be a string or array type with a minimum length of '{1}'.": "Das Feld {0} muss eine Zeichenfolge oder Auflistung mit einer Mindestlänge von '{1}' sein.", "The field {0} must be a string or array type with a minimum length of '{1}'.": "Das Feld {0} muss eine Zeichenfolge oder Auflistung mit einer Mindestlänge von '{1}' sein.",
"The {0} field is not a valid phone number.": "Das Feld {0} ist keine gültige Telefonnummer.", "The {0} field is not a valid phone number.": "Das Feld {0} ist keine gültige Telefonnummer.",
"The field {0} must be between {1} and {2}.": "Das Feld {0} muss zwischen {1} und {2} liegen.", "The field {0} must be between {1} and {2}.": "Das Feld {0} muss zwischen {1} und {2} liegen.",
"The field {0} must match the regular expression '{1}'.": "Das Feld {0} muss dem regulären Ausdruck '{1}' entsprechen.", "The field {0} must match the regular expression '{1}'.": "Das Feld {0} muss dem regulären Ausdruck '{1}' entsprechen.",
"The {0} field is required.": "Das Feld {0} ist erforderlich.", "The {0} field is required.": "Das Feld {0} ist erforderlich.",
"The field {0} must be a string with a maximum length of {1}.": "Das Feld {0} muss eine Zeichenfolge mit einer maximalen Länge von {1} sein.", "The field {0} must be a string with a maximum length of {1}.": "Das Feld {0} muss eine Zeichenfolge mit einer maximalen Länge von {1} sein.",
"The field {0} must be a string with a minimum length of {2} and a maximum length of {1}.": "Das Feld {0} muss eine Zeichenfolge mit einer minimalen Länge von {2} und einer maximalen Länge von {1} sein.", "The field {0} must be a string with a minimum length of {2} and a maximum length of {1}.": "Das Feld {0} muss eine Zeichenfolge mit einer minimalen Länge von {2} und einer maximalen Länge von {1} sein.",
"The {0} field is not a valid fully-qualified http, https, or ftp URL.": "Das {0}-Feld ist keine gültige vollqualifizierte http-, https- oder ftp-URL.", "The {0} field is not a valid fully-qualified http, https, or ftp URL.": "Das {0}-Feld ist keine gültige vollqualifizierte http-, https- oder ftp-URL.",
"The field {0} is invalid.": "Das Feld {0} ist ungültig.", "The field {0} is invalid.": "Das Feld {0} ist ungültig.",
"ThisFieldIsNotAValidCreditCardNumber.": "Dieses Feld ist keine gültige Kreditkartennummer.", "ThisFieldIsNotAValidCreditCardNumber.": "Dieses Feld ist keine gültige Kreditkartennummer.",
"ThisFieldIsNotValid.": "Dieses Feld ist nicht gültig.", "ThisFieldIsNotValid.": "Dieses Feld ist nicht gültig.",
"ThisFieldIsNotAValidEmailAddress.": "Dieses Feld ist keine gültige E-Mail-Adresse.", "ThisFieldIsNotAValidEmailAddress.": "Dieses Feld ist keine gültige E-Mail-Adresse.",
"ThisFieldOnlyAcceptsFilesWithTheFollowingExtensions:{0}": "Dieses Feld akzeptiert nur Dateien mit den folgenden Erweiterungen: {0}", "ThisFieldOnlyAcceptsFilesWithTheFollowingExtensions:{0}": "Dieses Feld akzeptiert nur Dateien mit den folgenden Erweiterungen: {0}",
"ThisFieldMustBeAStringOrArrayTypeWithAMaximumLengthOf{0}": "Dieses Feld muss eine Zeichenfolge oder Auflistung mit einer maximalen Länge von '{0}' sein.", "ThisFieldMustBeAStringOrArrayTypeWithAMaximumLengthOf{0}": "Dieses Feld muss eine Zeichenfolge oder Auflistung mit einer maximalen Länge von '{0}' sein.",
"ThisFieldMustBeAStringOrArrayTypeWithAMinimumLengthOf{0}": "Dieses Feld muss eine Zeichenfolge oder Auflistung mit einer Mindestlänge von '{0}' sein.", "ThisFieldMustBeAStringOrArrayTypeWithAMinimumLengthOf{0}": "Dieses Feld muss eine Zeichenfolge oder Auflistung mit einer Mindestlänge von '{0}' sein.",
"ThisFieldIsNotAValidPhoneNumber.": "Dieses Feld ist keine gültige Telefonnummer.", "ThisFieldIsNotAValidPhoneNumber.": "Dieses Feld ist keine gültige Telefonnummer.",
"ThisFieldMustBeBetween{0}And{1}": "Dieses Feld muss zwischen {0} und {1} liegen.", "ThisFieldMustBeBetween{0}And{1}": "Dieses Feld muss zwischen {0} und {1} liegen.",
"ThisFieldMustMatchTheRegularExpression{0}": "Dieses Feld muss dem regulären Ausdruck '{0}' entsprechen.", "ThisFieldMustMatchTheRegularExpression{0}": "Dieses Feld muss dem regulären Ausdruck '{0}' entsprechen.",
"ThisFieldIsRequired.": "Dieses Feld ist erforderlich.", "ThisFieldIsRequired.": "Dieses Feld ist erforderlich.",
"ThisFieldMustBeAStringWithAMaximumLengthOf{0}": "Dieses Feld muss eine Zeichenfolge mit einer maximalen Länge von {0} sein.", "ThisFieldMustBeAStringWithAMaximumLengthOf{0}": "Dieses Feld muss eine Zeichenfolge mit einer maximalen Länge von {0} sein.",
"ThisFieldMustBeAStringWithAMinimumLengthOf{1}AndAMaximumLengthOf{0}": "Dieses Feld muss eine Zeichenfolge mit einer Mindestlänge von '{0}' sein.", "ThisFieldMustBeAStringWithAMinimumLengthOf{1}AndAMaximumLengthOf{0}": "Dieses Feld muss eine Zeichenfolge mit einer Mindestlänge von '{0}' sein.",
"ThisFieldIsNotAValidFullyQualifiedHttpHttpsOrFtpUrl": "Dieses Feld ist keine gültige vollqualifizierte http-, https- oder ftp-URL.", "ThisFieldIsNotAValidFullyQualifiedHttpHttpsOrFtpUrl": "Dieses Feld ist keine gültige vollqualifizierte http-, https- oder ftp-URL.",
"ThisFieldIsInvalid.": "Dieses Feld ist ungültig." "ThisFieldIsInvalid.": "Dieses Feld ist ungültig."
} }
} }

2
framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Localization/Resource/de.json

@ -2,6 +2,6 @@
"culture": "de", "culture": "de",
"texts": { "texts": {
"BirthDate": "Geburtsdatum", "BirthDate": "Geburtsdatum",
"Value1": "Wert Eins" "Value1": "Wert Eins"
} }
} }

5
framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/AbpLocalization_Tests.cs

@ -148,7 +148,10 @@ namespace Volo.Abp.Localization
_localizer["MaxLenghtErrorMessage", 42].Value.ShouldBe("El campo puede tener un máximo de '42' caracteres"); //Overriden in Source/es.json _localizer["MaxLenghtErrorMessage", 42].Value.ShouldBe("El campo puede tener un máximo de '42' caracteres"); //Overriden in Source/es.json
} }
using (CultureHelper.Use("de"))
{
_localizer["MaxLenghtErrorMessage", 42].Value.ShouldBe("Die Länge dieses Feldes kann maximal '42'-Zeichen betragen"); //Overriden in Source/es.json
}
} }
[Fact] [Fact]

2
framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/Base/CountryNames/nl.json

@ -1,4 +1,4 @@
{ {
"culture": "nl", "culture": "nl",
"texts": { "texts": {
"USA": "Verenigde Staten van Amerika", "USA": "Verenigde Staten van Amerika",

2
framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/Base/Validation/nl.json

@ -1,4 +1,4 @@
{ {
"culture": "nl", "culture": "nl",
"texts": { "texts": {
"ThisFieldIsRequired": "Dit veld is verplicht", "ThisFieldIsRequired": "Dit veld is verplicht",

2
framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/Source/nl.json

@ -1,4 +1,4 @@
{ {
"culture": "nl", "culture": "nl",
"texts": { "texts": {
"Hello <b>{0}</b>.": "Hallo <b>{0}</b>.", "Hello <b>{0}</b>.": "Hallo <b>{0}</b>.",

2
framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/SourceExt/nl.json

@ -1,4 +1,4 @@
{ {
"culture": "nl", "culture": "nl",
"texts": { "texts": {
"SeeYou": "Tot ziens" "SeeYou": "Tot ziens"

5
modules/account/.prettierrc

@ -0,0 +1,5 @@
{
"singleQuote": true,
"useTabs": false,
"tabWidth": 4
}

26
modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/de.json

@ -8,22 +8,22 @@
"RememberMe": "Angemeldet bleiben", "RememberMe": "Angemeldet bleiben",
"UseAnotherServiceToLogin": "Einen anderen Dienst zum Anmelden verwenden", "UseAnotherServiceToLogin": "Einen anderen Dienst zum Anmelden verwenden",
"UserLockedOutMessage": "Das Benutzerkonto wurde aufgrund fehlgeschlagener Anmeldeversuche gesperrt. Bitte warten Sie eine Weile und versuchen Sie es erneut.", "UserLockedOutMessage": "Das Benutzerkonto wurde aufgrund fehlgeschlagener Anmeldeversuche gesperrt. Bitte warten Sie eine Weile und versuchen Sie es erneut.",
"InvalidUserNameOrPassword": "Ungültiger Benutzername oder Passwort!", "InvalidUserNameOrPassword": "Ungültiger Benutzername oder Passwort!",
"LoginIsNotAllowed": "Sie dürfen sich nicht anmelden! Sie müssen Ihre E-Mail/Telefonnummer bestätigen.", "LoginIsNotAllowed": "Sie dürfen sich nicht anmelden! Sie müssen Ihre E-Mail/Telefonnummer bestätigen.",
"SelfRegistrationDisabledMessage": "Die Selbstregistrierung ist für diese Anwendung deaktiviert. Bitte wenden Sie sich an den Anwendungsadministrator, um einen neuen Benutzer zu registrieren.", "SelfRegistrationDisabledMessage": "Die Selbstregistrierung ist für diese Anwendung deaktiviert. Bitte wenden Sie sich an den Anwendungsadministrator, um einen neuen Benutzer zu registrieren.",
"LocalLoginDisabledMessage": "Die lokale Anmeldung ist für diese Anwendung deaktiviert.", "LocalLoginDisabledMessage": "Die lokale Anmeldung ist für diese Anwendung deaktiviert.",
"Login": "Anmelden", "Login": "Anmelden",
"Cancel": "Abbrechen", "Cancel": "Abbrechen",
"Register": "Registrieren", "Register": "Registrieren",
"AreYouANewUser": "Neuer Benutzer?", "AreYouANewUser": "Neuer Benutzer?",
"AlreadyRegistered": "Bereits registriert?", "AlreadyRegistered": "Bereits registriert?",
"InvalidLoginRequest": "Ungültige Login-Anfrage", "InvalidLoginRequest": "Ungültige Login-Anfrage",
"ThereAreNoLoginSchemesConfiguredForThisClient": "Es sind keine Anmeldeschemata für diesen Client konfiguriert.", "ThereAreNoLoginSchemesConfiguredForThisClient": "Es sind keine Anmeldeschemata für diesen Client konfiguriert.",
"LogInUsingYourProviderAccount": "Melden Sie sich mit Ihrem {0}-Konto an", "LogInUsingYourProviderAccount": "Melden Sie sich mit Ihrem {0}-Konto an",
"DisplayName:CurrentPassword": "Aktuelles Passwort", "DisplayName:CurrentPassword": "Aktuelles Passwort",
"DisplayName:NewPassword": "Neues Passwort", "DisplayName:NewPassword": "Neues Passwort",
"DisplayName:NewPasswordConfirm": "Neues Passwort bestätigen", "DisplayName:NewPasswordConfirm": "Neues Passwort bestätigen",
"PasswordChangedMessage": "Ihr Passwort wurde erfolgreich geändert.", "PasswordChangedMessage": "Ihr Passwort wurde erfolgreich geändert.",
"DisplayName:UserName": "Benutzername", "DisplayName:UserName": "Benutzername",
"DisplayName:Email": "E-Mail", "DisplayName:Email": "E-Mail",
"DisplayName:Name": "Name", "DisplayName:Name": "Name",
@ -31,12 +31,12 @@
"DisplayName:Password": "Passwort", "DisplayName:Password": "Passwort",
"DisplayName:EmailAddress": "E-Mail-Adresse", "DisplayName:EmailAddress": "E-Mail-Adresse",
"DisplayName:PhoneNumber": "Telefonnummer", "DisplayName:PhoneNumber": "Telefonnummer",
"PersonalSettings": "Persönliche Einstellungen", "PersonalSettings": "Persönliche Einstellungen",
"PersonalSettingsSaved": "Persönliche Einstellungen gespeichert", "PersonalSettingsSaved": "Persönliche Einstellungen gespeichert",
"PasswordChanged": "Passwort geändert", "PasswordChanged": "Passwort geändert",
"NewPasswordConfirmFailed": "Bitte bestätigen Sie das neue Passwort.", "NewPasswordConfirmFailed": "Bitte bestätigen Sie das neue Passwort.",
"Manage": "Verwalten", "Manage": "Verwalten",
"ManageYourProfile": "Ihr profil verwalten", "ManageYourProfile": "Ihr Profil verwalten",
"DisplayName:Abp.Account.IsSelfRegistrationEnabled": "Ist die Selbstregistrierung aktiviert", "DisplayName:Abp.Account.IsSelfRegistrationEnabled": "Ist die Selbstregistrierung aktiviert",
"Description:Abp.Account.IsSelfRegistrationEnabled": "Gibt an, ob ein Benutzer das Konto selbst registrieren kann.", "Description:Abp.Account.IsSelfRegistrationEnabled": "Gibt an, ob ein Benutzer das Konto selbst registrieren kann.",
"DisplayName:Abp.Account.EnableLocalLogin": "Authentifizierung mit einem lokalen Konto", "DisplayName:Abp.Account.EnableLocalLogin": "Authentifizierung mit einem lokalen Konto",

12
modules/account/src/Volo.Abp.Account.Web/Pages/Account/LoggedOut.js

@ -1,5 +1,7 @@
document.addEventListener("DOMContentLoaded", function (event) { document.addEventListener('DOMContentLoaded', function (event) {
setTimeout(function () { setTimeout(function () {
window.location = document.getElementById("redirectButton").getAttribute("href"); window.location = document
}, 3000) .getElementById('redirectButton')
}); .getAttribute('href');
}, 3000);
});

39
modules/account/src/Volo.Abp.Account.Web/Pages/Account/Manage.js

@ -1,20 +1,23 @@
(function ($) { (function ($) {
var l = abp.localization.getResource('AbpAccount'); var l = abp.localization.getResource('AbpAccount');
var _profileService = volo.abp.identity.profile; var _profileService = volo.abp.identity.profile;
$("#ChangePasswordForm").submit(function (e) { $('#ChangePasswordForm').submit(function (e) {
e.preventDefault(); e.preventDefault();
if (!$("#ChangePasswordForm").valid()) { if (!$('#ChangePasswordForm').valid()) {
return false; return false;
} }
var input = $("#ChangePasswordForm").serializeFormToObject().changePasswordInfoModel; var input = $('#ChangePasswordForm').serializeFormToObject()
.changePasswordInfoModel;
if (input.newPassword != input.newPasswordConfirm || input.currentPassword == '') { if (
abp.message.error(l("NewPasswordConfirmFailed")); input.newPassword != input.newPasswordConfirm ||
input.currentPassword == ''
) {
abp.message.error(l('NewPasswordConfirmFailed'));
return; return;
} }
@ -22,29 +25,23 @@
return; return;
} }
_profileService.changePassword( _profileService.changePassword(input).then(function (result) {
input abp.message.success(l('PasswordChanged'));
).then(function (result) {
abp.message.success(l("PasswordChanged"));
}); });
}); });
$("#PersonalSettingsForm").submit(function (e) { $('#PersonalSettingsForm').submit(function (e) {
e.preventDefault(); e.preventDefault();
if (!$("#PersonalSettingsForm").valid()) { if (!$('#PersonalSettingsForm').valid()) {
return false; return false;
} }
var input = $("#PersonalSettingsForm").serializeFormToObject().personalSettingsInfoModel; var input = $('#PersonalSettingsForm').serializeFormToObject()
.personalSettingsInfoModel;
_profileService.update( _profileService.update(input).then(function (result) {
input abp.notify.success(l('PersonalSettingsSaved'));
).then(function (result) {
abp.notify.success(l("PersonalSettingsSaved"));
}); });
}); });
})(jQuery);
})(jQuery);

5
modules/audit-logging/.prettierrc

@ -0,0 +1,5 @@
{
"singleQuote": true,
"useTabs": false,
"tabWidth": 4
}

5
modules/background-jobs/.prettierrc

@ -0,0 +1,5 @@
{
"singleQuote": true,
"useTabs": false,
"tabWidth": 4
}

5
modules/blob-storing-database/.prettierrc

@ -0,0 +1,5 @@
{
"singleQuote": true,
"useTabs": false,
"tabWidth": 4
}

5
modules/blogging/.prettierrc

@ -0,0 +1,5 @@
{
"singleQuote": true,
"useTabs": false,
"tabWidth": 4
}

8
modules/blogging/src/Volo.Blogging.Admin.Web/Pages/Blogging/Admin/Blogs/create.js

@ -3,12 +3,10 @@ $(function () {
abp.modals.blogCreate = function () { abp.modals.blogCreate = function () {
var initModal = function (publicApi, args) { var initModal = function (publicApi, args) {
var $form = publicApi.getForm(); var $form = publicApi.getForm();
}; };
return { return {
initModal: initModal initModal: initModal,
} };
}; };
}); });

8
modules/blogging/src/Volo.Blogging.Admin.Web/Pages/Blogging/Admin/Blogs/edit.js

@ -3,12 +3,10 @@ $(function () {
abp.modals.blogEdit = function () { abp.modals.blogEdit = function () {
var initModal = function (publicApi, args) { var initModal = function (publicApi, args) {
var $form = publicApi.getForm(); var $form = publicApi.getForm();
}; };
return { return {
initModal: initModal initModal: initModal,
} };
}; };
}); });

116
modules/blogging/src/Volo.Blogging.Admin.Web/Pages/Blogging/Admin/Blogs/index.js

@ -1,73 +1,84 @@
$(function () { $(function () {
var l = abp.localization.getResource('Blogging'); var l = abp.localization.getResource('Blogging');
var _createModal = new abp.ModalManager(abp.appPath + 'Blogging/Admin/Blogs/Create'); var _createModal = new abp.ModalManager(
var _editModal = new abp.ModalManager(abp.appPath + 'Blogging/Admin/Blogs/Edit'); abp.appPath + 'Blogging/Admin/Blogs/Create'
);
var _editModal = new abp.ModalManager(
abp.appPath + 'Blogging/Admin/Blogs/Edit'
);
var _dataTable = $('#BlogsTable').DataTable(abp.libs.datatables.normalizeConfiguration({ var _dataTable = $('#BlogsTable').DataTable(
processing: true, abp.libs.datatables.normalizeConfiguration({
serverSide: true, processing: true,
paging: false, serverSide: true,
info: false, paging: false,
scrollX: true, info: false,
searching: false, scrollX: true,
autoWidth: false, searching: false,
scrollCollapse: true, autoWidth: false,
order: [[3, "desc"]], scrollCollapse: true,
ajax: abp.libs.datatables.createAjax(volo.blogging.admin.blogManagement.getList), order: [[3, 'desc']],
columnDefs: [ ajax: abp.libs.datatables.createAjax(
{ volo.blogging.admin.blogManagement.getList
rowAction: { ),
items: columnDefs: [
[ {
rowAction: {
items: [
{ {
text: l('Edit'), text: l('Edit'),
visible: abp.auth.isGranted('Blogging.Blog.Update'), visible: abp.auth.isGranted(
'Blogging.Blog.Update'
),
action: function (data) { action: function (data) {
_editModal.open({ _editModal.open({
blogId: data.record.id blogId: data.record.id,
}); });
} },
}, },
{ {
text: l('Delete'), text: l('Delete'),
visible: abp.auth.isGranted('Blogging.Blog.Delete'), visible: abp.auth.isGranted(
confirmMessage: function (data) { return l('BlogDeletionWarningMessage') }, 'Blogging.Blog.Delete'
),
confirmMessage: function (data) {
return l('BlogDeletionWarningMessage');
},
action: function (data) { action: function (data) {
volo.blogging.admin.blogManagement volo.blogging.admin.blogManagement
.delete(data.record.id) .delete(data.record.id)
.then(function () { .then(function () {
_dataTable.ajax.reload(); _dataTable.ajax.reload();
}); });
} },
} },
] ],
} },
}, },
{ {
target: 1, target: 1,
data: "name" data: 'name',
}, },
{ {
target: 2, target: 2,
data: "shortName" data: 'shortName',
}, },
{ {
target: 3, target: 3,
data: "creationTime", data: 'creationTime',
render: function (date) { render: function (date) {
return date; return date;
} },
}, },
{ {
target: 4, target: 4,
data: "description" data: 'description',
} },
] ],
})); })
);
$("#CreateNewBlogButtonId").click(function () { $('#CreateNewBlogButtonId').click(function () {
_createModal.open(); _createModal.open();
}); });
@ -78,5 +89,4 @@
_editModal.onResult(function () { _editModal.onResult(function () {
_dataTable.ajax.reload(); _dataTable.ajax.reload();
}); });
}); });

14
modules/blogging/src/Volo.Blogging.Domain.Shared/Volo/Blogging/Localization/Resources/de.json

@ -9,11 +9,11 @@
"Permission:Create": "Erstellen", "Permission:Create": "Erstellen",
"Permission:Delete": "Löschen", "Permission:Delete": "Löschen",
"Permission:Blogging": "Blog", "Permission:Blogging": "Blog",
"Permission:Posts": "Beitr�ge", "Permission:Posts": "Beiträge",
"Permission:Tags": "Tags", "Permission:Tags": "Tags",
"Permission:Comments": "Kommentare", "Permission:Comments": "Kommentare",
"Title": "Titel", "Title": "Titel",
"Delete": "L�schen", "Delete": "Löschen",
"Reply": "Antwort", "Reply": "Antwort",
"ReplyTo": "Antwort auf {0}", "ReplyTo": "Antwort auf {0}",
"ContinueReading": "Weiterlesen", "ContinueReading": "Weiterlesen",
@ -29,15 +29,15 @@
"SeeAll": "Alle anzeigen", "SeeAll": "Alle anzeigen",
"PopularTags": "Beliebte Tags", "PopularTags": "Beliebte Tags",
"WiewsWithCount": "{0} Aufrufe", "WiewsWithCount": "{0} Aufrufe",
"LastPosts": "Letzte Beitr�ge", "LastPosts": "Letzte Beiträge",
"LeaveComment": "Kommentar hinterlassen", "LeaveComment": "Kommentar hinterlassen",
"TagsInThisArticle": "Tags in diesem Artikel", "TagsInThisArticle": "Tags in diesem Artikel",
"Posts": "Beitr�ge", "Posts": "Beiträge",
"Edit": "Bearbeiten", "Edit": "Bearbeiten",
"BLOG": "BLOG", "BLOG": "BLOG",
"CommentDeletionWarningMessage": "Kommentar wird gel�scht.", "CommentDeletionWarningMessage": "Kommentar wird gelöscht.",
"PostDeletionWarningMessage": "Beitrag wird gel�scht.", "PostDeletionWarningMessage": "Beitrag wird gelöscht.",
"BlogDeletionWarningMessage": "Blog wird gel�scht.", "BlogDeletionWarningMessage": "Blog wird gelöscht.",
"AreYouSure": "Sind Sie sicher?", "AreYouSure": "Sind Sie sicher?",
"CommentWithCount": "{0} Kommentare", "CommentWithCount": "{0} Kommentare",
"Comment": "Kommentar", "Comment": "Kommentar",

89
modules/blogging/src/Volo.Blogging.Web/Pages/Blogs/Posts/detail.js

@ -1,32 +1,47 @@
(function ($) { (function ($) {
var l = abp.localization.getResource('Blogging'); var l = abp.localization.getResource('Blogging');
var initSocialShareLinks = function () { var initSocialShareLinks = function () {
var re = new RegExp(/^.*\//); var re = new RegExp(/^.*\//);
var rootUrl = re.exec(window.location.href); var rootUrl = re.exec(window.location.href);
var pageHeader = $("#PostTitle").text(); var pageHeader = $('#PostTitle').text();
var blogName = $('#BlogFullName').attr('name'); var blogName = $('#BlogFullName').attr('name');
$('#TwitterShareLink').attr('href', $('#TwitterShareLink').attr(
'https://twitter.com/intent/tweet?text=' + encodeURI(pageHeader + " | " + blogName + " | " + window.location.href) 'href',
'https://twitter.com/intent/tweet?text=' +
encodeURI(
pageHeader + ' | ' + blogName + ' | ' + window.location.href
)
); );
$('#LinkedinShareLink').attr('href', $('#LinkedinShareLink').attr(
'https://www.linkedin.com/shareArticle?' 'href',
+ 'url=' + encodeURI(window.location.href) + '&' 'https://www.linkedin.com/shareArticle?' +
+ 'mini=true&' 'url=' +
+ "summary=" + encodeURI(blogName) + '&' encodeURI(window.location.href) +
+ "title=" + encodeURI(pageHeader) + '&' '&' +
+ "source=" + encodeURI(rootUrl) 'mini=true&' +
'summary=' +
encodeURI(blogName) +
'&' +
'title=' +
encodeURI(pageHeader) +
'&' +
'source=' +
encodeURI(rootUrl)
); );
$('#EmailShareLink').attr('href', $('#EmailShareLink').attr(
'mailto:?' 'href',
+ 'body=' + encodeURI('I want you to look at ' + window.location.href) + '&' 'mailto:?' +
+ "subject=" + encodeURI(pageHeader + ' | ' + blogName) + '&' 'body=' +
encodeURI('I want you to look at ' + window.location.href) +
'&' +
'subject=' +
encodeURI(pageHeader + ' | ' + blogName) +
'&'
); );
}; };
@ -39,18 +54,18 @@
var form = $(this).serializeFormToObject(); var form = $(this).serializeFormToObject();
$.ajax({ $.ajax({
type: "POST", type: 'POST',
url: "/Blog/Comments/Update", url: '/Blog/Comments/Update',
data: { data: {
id: form.commentId, id: form.commentId,
commentDto: { commentDto: {
text: form.text text: form.text,
} },
}, },
success: function (response) { success: function (response) {
$('div .editForm').hide(); $('div .editForm').hide();
$('#' + form.commentId).text(form.text); $('#' + form.commentId).text(form.text);
} },
}); });
}); });
@ -73,7 +88,7 @@
if (replyCommentId != '' && replyCommentId !== undefined) { if (replyCommentId != '' && replyCommentId !== undefined) {
var div = linkElement.parent().next(); var div = linkElement.parent().next();
if (div.is(":hidden")) { if (div.is(':hidden')) {
$('div .replyForm').hide(); $('div .replyForm').hide();
div.show(); div.show();
} else { } else {
@ -95,12 +110,12 @@
function (isConfirmed) { function (isConfirmed) {
if (isConfirmed) { if (isConfirmed) {
$.ajax({ $.ajax({
type: "POST", type: 'POST',
url: "/Blog/Comments/Delete", url: '/Blog/Comments/Delete',
data: { id: deleteCommentId }, data: { id: deleteCommentId },
success: function (response) { success: function (response) {
linkElement.parent().parent().parent().remove(); linkElement.parent().parent().parent().remove();
} },
}); });
} }
} }
@ -121,14 +136,16 @@
function (isConfirmed) { function (isConfirmed) {
if (isConfirmed) { if (isConfirmed) {
$.ajax({ $.ajax({
type: "POST", type: 'POST',
url: "/Blog/Posts/Delete", url: '/Blog/Posts/Delete',
data: { id: deleteCommentId }, data: { id: deleteCommentId },
success: function () { success: function () {
var url = window.location.pathname; var url = window.location.pathname;
var postNameBeginning = url.lastIndexOf('/'); var postNameBeginning = url.lastIndexOf('/');
window.location.replace(url.substring(0, postNameBeginning)); window.location.replace(
} url.substring(0, postNameBeginning)
);
},
}); });
} }
} }
@ -144,10 +161,9 @@
var updateCommentId = $(this).attr('data-updateid'); var updateCommentId = $(this).attr('data-updateid');
if (updateCommentId != '' && updateCommentId !== undefined) { if (updateCommentId != '' && updateCommentId !== undefined) {
var div = linkElement.parent().next().next(); var div = linkElement.parent().next().next();
if (div.is(":hidden")) { if (div.is(':hidden')) {
$('div .editForm').hide(); $('div .editForm').hide();
div.show(); div.show();
} else { } else {
@ -158,13 +174,16 @@
}); });
if ($('#FocusCommentId').val() != '00000000-0000-0000-0000-000000000000') { if ($('#FocusCommentId').val() != '00000000-0000-0000-0000-000000000000') {
$('html, body').animate({ $('html, body').animate(
scrollTop: ($('#' + $('#FocusCommentId').val()).offset().top - 150) {
}, 500); scrollTop:
$('#' + $('#FocusCommentId').val()).offset().top - 150,
},
500
);
} }
$(".post-content a[href^='http']").attr('target', '_blank'); $(".post-content a[href^='http']").attr('target', '_blank');
initSocialShareLinks(); initSocialShareLinks();
})(jQuery); })(jQuery);

89
modules/blogging/src/Volo.Blogging.Web/Pages/Blogs/Posts/edit.js

@ -1,22 +1,21 @@
$(function () { $(function () {
var $container = $('#edit-post-container');
var $container = $("#edit-post-container"); var $editorContainer = $container.find('.edit-post-editor');
var $editorContainer = $container.find(".edit-post-editor"); var $submitButton = $container.find('button[type=submit]');
var $submitButton = $container.find("button[type=submit]"); var $form = $container.find('form#edit-post-form');
var $form = $container.find("form#edit-post-form"); var editorDataKey = 'tuiEditor';
var editorDataKey = "tuiEditor"; var $titleLengthWarning = $('#title-length-warning');
var $titleLengthWarning = $("#title-length-warning"); var maxTitleLength = parseInt($titleLengthWarning.data('max-length'));
var maxTitleLength = parseInt($titleLengthWarning.data("max-length"));
var $title = $('#Post_Title'); var $title = $('#Post_Title');
var $coverImage = $("#CoverImage"); var $coverImage = $('#CoverImage');
var $postCoverImage = $('#Post_CoverImage'); var $postCoverImage = $('#Post_CoverImage');
var $coverImageFile = $('#CoverImageFile'); var $coverImageFile = $('#CoverImageFile');
var $postFormSubmitButton = $('#PostFormSubmitButton'); var $postFormSubmitButton = $('#PostFormSubmitButton');
var setCoverImage = function (file) { var setCoverImage = function (file) {
$postCoverImage.val(file.fileUrl); $postCoverImage.val(file.fileUrl);
$coverImage.attr("src", file.fileUrl); $coverImage.attr('src', file.fileUrl);
$postFormSubmitButton.removeAttr('disabled'); $postFormSubmitButton.removeAttr('disabled');
}; };
@ -25,14 +24,14 @@
formData.append('file', file); formData.append('file', file);
$.ajax({ $.ajax({
type: "POST", type: 'POST',
url: "/api/blogging/files/images/upload", url: '/api/blogging/files/images/upload',
data: formData, data: formData,
contentType: false, contentType: false,
processData: false, processData: false,
success: function (response) { success: function (response) {
setCoverImage(response); setCoverImage(response);
} },
}); });
}; };
@ -48,7 +47,7 @@
checkTitleLength(); checkTitleLength();
$title.on("change paste keyup", function () { $title.on('change paste keyup', function () {
checkTitleLength(); checkTitleLength();
}); });
@ -57,55 +56,55 @@
return; return;
} }
$postFormSubmitButton.attr('disabled',true); $postFormSubmitButton.attr('disabled', true);
var file = $coverImageFile.prop('files')[0]; var file = $coverImageFile.prop('files')[0];
uploadCoverImage(file); uploadCoverImage(file);
}); });
var uploadImage = function (file, callbackFn) { var uploadImage = function (file, callbackFn) {
var formData = new FormData(); var formData = new FormData();
formData.append('file', file); formData.append('file', file);
$.ajax({ $.ajax({
type: "POST", type: 'POST',
url: "/api/blogging/files/images/upload", url: '/api/blogging/files/images/upload',
data: formData, data: formData,
contentType: false, contentType: false,
processData: false, processData: false,
success: function (response) { success: function (response) {
callbackFn(response.fileUrl); callbackFn(response.fileUrl);
} },
}); });
}; };
var newPostEditor = $editorContainer.tuiEditor({ var newPostEditor = $editorContainer
usageStatistics: false, .tuiEditor({
initialEditType: 'markdown', usageStatistics: false,
previewStyle: 'tab', initialEditType: 'markdown',
height: "auto", previewStyle: 'tab',
initialValue: $form.find("input[name='Post.Content']").val(), height: 'auto',
hooks: { initialValue: $form.find("input[name='Post.Content']").val(),
addImageBlobHook: function (blob, callback, source) { hooks: {
var imageAltText = blob.name; addImageBlobHook: function (blob, callback, source) {
var imageAltText = blob.name;
uploadImage(blob,
function (fileUrl) { uploadImage(blob, function (fileUrl) {
callback(fileUrl, imageAltText); callback(fileUrl, imageAltText);
}); });
} },
}, },
events: { events: {
load: function () { load: function () {
$editorContainer.find(".loading-cover").remove(); $editorContainer.find('.loading-cover').remove();
$submitButton.prop("disabled", false); $submitButton.prop('disabled', false);
$form.data("validator").settings.ignore = '.ignore'; $form.data('validator').settings.ignore = '.ignore';
$editorContainer.find(':input').addClass('ignore'); $editorContainer.find(':input').addClass('ignore');
} },
} },
}).data(editorDataKey); })
.data(editorDataKey);
$container.find("form#edit-post-form").submit(function (e) {
$container.find('form#edit-post-form').submit(function (e) {
var $postTextInput = $form.find("input[name='Post.Content']"); var $postTextInput = $form.find("input[name='Post.Content']");
var postText = newPostEditor.getMarkdown(); var postText = newPostEditor.getMarkdown();
@ -122,6 +121,4 @@
$(this).off('submit').submit(); $(this).off('submit').submit();
return true; return true;
}); });
}); });

85
modules/blogging/src/Volo.Blogging.Web/Pages/Blogs/Posts/new.js

@ -1,22 +1,21 @@
$(function () { $(function () {
var $container = $('#qa-new-post-container');
var $container = $("#qa-new-post-container"); var $editorContainer = $container.find('.new-post-editor');
var $editorContainer = $container.find(".new-post-editor"); var $submitButton = $container.find('button[type=submit]');
var $submitButton = $container.find("button[type=submit]"); var $form = $container.find('form#new-post-form');
var $form = $container.find("form#new-post-form"); var editorDataKey = 'tuiEditor';
var editorDataKey = "tuiEditor"; var $titleLengthWarning = $('#title-length-warning');
var $titleLengthWarning = $("#title-length-warning"); var maxTitleLength = parseInt($titleLengthWarning.data('max-length'));
var maxTitleLength = parseInt($titleLengthWarning.data("max-length"));
var $title = $('#Post_Title'); var $title = $('#Post_Title');
var $url = $('#Post_Url'); var $url = $('#Post_Url');
var $coverImage = $("#CoverImage"); var $coverImage = $('#CoverImage');
var $postCoverImage = $('#Post_CoverImage'); var $postCoverImage = $('#Post_CoverImage');
var $coverImageFile = $('#CoverImageFile'); var $coverImageFile = $('#CoverImageFile');
var $postFormSubmitButton = $('#PostFormSubmitButton'); var $postFormSubmitButton = $('#PostFormSubmitButton');
var setCoverImage = function (file) { var setCoverImage = function (file) {
$postCoverImage.val(file.fileUrl); $postCoverImage.val(file.fileUrl);
$coverImage.attr("src", file.fileUrl); $coverImage.attr('src', file.fileUrl);
$coverImage.show(); $coverImage.show();
$postFormSubmitButton.removeAttr('disabled'); $postFormSubmitButton.removeAttr('disabled');
}; };
@ -26,14 +25,14 @@
formData.append('file', file); formData.append('file', file);
$.ajax({ $.ajax({
type: "POST", type: 'POST',
url: "/api/blogging/files/images/upload", url: '/api/blogging/files/images/upload',
data: formData, data: formData,
contentType: false, contentType: false,
processData: false, processData: false,
success: function (response) { success: function (response) {
setCoverImage(response); setCoverImage(response);
} },
}); });
}; };
@ -41,7 +40,7 @@
if (!$coverImageFile.prop('files').length) { if (!$coverImageFile.prop('files').length) {
return; return;
} }
$postFormSubmitButton.attr('disabled',true); $postFormSubmitButton.attr('disabled', true);
var file = $coverImageFile.prop('files')[0]; var file = $coverImageFile.prop('files')[0];
uploadCoverImage(file); uploadCoverImage(file);
}); });
@ -51,43 +50,44 @@
formData.append('file', file); formData.append('file', file);
$.ajax({ $.ajax({
type: "POST", type: 'POST',
url: "/api/blogging/files/images/upload", url: '/api/blogging/files/images/upload',
data: formData, data: formData,
contentType: false, contentType: false,
processData: false, processData: false,
success: function (response) { success: function (response) {
callbackFn(response.fileUrl); callbackFn(response.fileUrl);
} },
}); });
}; };
var newPostEditor = $editorContainer.tuiEditor({ var newPostEditor = $editorContainer
usageStatistics: false, .tuiEditor({
initialEditType: 'markdown', usageStatistics: false,
previewStyle: 'tab', initialEditType: 'markdown',
height: "auto", previewStyle: 'tab',
hooks: { height: 'auto',
addImageBlobHook: function (blob, callback, source) { hooks: {
var imageAltText = blob.name; addImageBlobHook: function (blob, callback, source) {
var imageAltText = blob.name;
uploadImage(blob,
function (fileUrl) { uploadImage(blob, function (fileUrl) {
callback(fileUrl, imageAltText); callback(fileUrl, imageAltText);
}); });
} },
}, },
events: { events: {
load: function () { load: function () {
$editorContainer.find(".loading-cover").remove(); $editorContainer.find('.loading-cover').remove();
$submitButton.prop("disabled", false); $submitButton.prop('disabled', false);
$form.data("validator").settings.ignore = '.ignore'; $form.data('validator').settings.ignore = '.ignore';
$editorContainer.find(':input').addClass('ignore'); $editorContainer.find(':input').addClass('ignore');
} },
} },
}).data(editorDataKey); })
.data(editorDataKey);
$container.find("form#new-post-form").submit(function (e) {
$container.find('form#new-post-form').submit(function (e) {
var $postTextInput = $form.find("input[name='Post.Content']"); var $postTextInput = $form.find("input[name='Post.Content']");
var postText = newPostEditor.getMarkdown(); var postText = newPostEditor.getMarkdown();
@ -108,7 +108,7 @@
var urlEdited = false; var urlEdited = false;
var reflectedChange = false; var reflectedChange = false;
$title.on("change paste keyup", function () { $title.on('change paste keyup', function () {
if (urlEdited) { if (urlEdited) {
return; return;
} }
@ -137,5 +137,4 @@
urlEdited = true; urlEdited = true;
} }
}); });
}); });

22
modules/blogging/src/Volo.Blogging.Web/Pages/Blogs/Shared/Scripts/blog.js

@ -1,9 +1,9 @@
(function() { (function () {
function handleArrows() { function handleArrows() {
var herosWidth = $(".hero-articles").width(); var herosWidth = $('.hero-articles').width();
var arrowsPosition = (herosWidth / 2 - 90); var arrowsPosition = herosWidth / 2 - 90;
$(".owl-next").css("right", arrowsPosition); $('.owl-next').css('right', arrowsPosition);
$(".owl-prev").css("left", arrowsPosition); $('.owl-prev').css('left', arrowsPosition);
} }
function handleImages() { function handleImages() {
@ -24,7 +24,7 @@
margin: 0, margin: 0,
nav: false, nav: false,
dots: false, dots: false,
//center: true, //center: true,
autoplay: true, autoplay: true,
autoHeight: true, autoHeight: true,
autoplaySpeed: 1000, autoplaySpeed: 1000,
@ -39,9 +39,9 @@
autoplaySpeed: 1000, autoplaySpeed: 1000,
responsive: { responsive: {
0: { 0: {
items: 1 items: 1,
} },
} },
}); });
} }
@ -49,7 +49,7 @@
handleImages(); handleImages();
handleOwlCarousel(); handleOwlCarousel();
$(".nav-link").on("click", function () { $('.nav-link').on('click', function () {
$(this).parent().parent(); $(this).parent().parent();
}); });
@ -64,4 +64,4 @@
handleArrows(); handleArrows();
}, 500); }, 500);
}); });
})(); })();

5
modules/client-simulation/.prettierrc

@ -0,0 +1,5 @@
{
"singleQuote": true,
"useTabs": false,
"tabWidth": 4
}

2
modules/client-simulation/src/Volo.ClientSimulation.Web/Pages/ClientSimulation/Index.js

@ -2,4 +2,4 @@
$(function () { $(function () {
SimulationArea.init($('#SimulationArea')); SimulationArea.init($('#SimulationArea'));
}); });
})(jQuery); })(jQuery);

8
modules/client-simulation/src/Volo.ClientSimulation.Web/Pages/ClientSimulation/SimulationArea.js

@ -1,14 +1,13 @@
var SimulationArea = {}; var SimulationArea = {};
(function ($) { (function ($) {
var $mainContainer = null; var $mainContainer = null;
function refreshSimulationArea() { function refreshSimulationArea() {
$.get('/ClientSimulation/SimulationArea') $.get('/ClientSimulation/SimulationArea')
.done(function(result) { .done(function (result) {
$mainContainer.html(result); $mainContainer.html(result);
}) })
.always(function() { .always(function () {
setTimeout(refreshSimulationArea, 1000); setTimeout(refreshSimulationArea, 1000);
}); });
} }
@ -17,5 +16,4 @@
$mainContainer = $container; $mainContainer = $container;
setTimeout(refreshSimulationArea, 1000); setTimeout(refreshSimulationArea, 1000);
}; };
})(jQuery);
})(jQuery);

5
modules/cms-kit/.prettierrc

@ -0,0 +1,5 @@
{
"singleQuote": true,
"useTabs": false,
"tabWidth": 4
}

5
modules/docs/.prettierrc

@ -0,0 +1,5 @@
{
"singleQuote": true,
"useTabs": false,
"tabWidth": 4
}

2
modules/docs/app/VoloDocs.Web/Localization/Resources/VoloDocs/Web/nl.json

@ -1,4 +1,4 @@
{ {
"culture": "nl", "culture": "nl",
"texts": { "texts": {
"DocsTitle": "VoloDocs", "DocsTitle": "VoloDocs",

2
modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/nl.json

@ -1,4 +1,4 @@
{ {
"culture": "nl", "culture": "nl",
"texts": { "texts": {
"Permission:DocumentManagement": "Document beheer", "Permission:DocumentManagement": "Document beheer",

17
modules/docs/src/Volo.Docs.Admin.Application/Volo/Docs/Admin/Documents/DocumentAdminAppService.cs

@ -3,7 +3,9 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.Extensions.Logging;
using Volo.Abp; using Volo.Abp;
using Volo.Abp.Uow;
using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services; using Volo.Abp.Application.Services;
using Volo.Abp.Caching; using Volo.Abp.Caching;
@ -100,14 +102,21 @@ namespace Volo.Docs.Admin.Documents
foreach (var leaf in leafs) foreach (var leaf in leafs)
{ {
if (leaf.Path.StartsWith("http://", StringComparison.OrdinalIgnoreCase) || if (leaf.Path.StartsWith("http://", StringComparison.OrdinalIgnoreCase) ||
leaf.Path.StartsWith("https://", StringComparison.OrdinalIgnoreCase)) leaf.Path.StartsWith("https://", StringComparison.OrdinalIgnoreCase) ||
(leaf.Path.StartsWith("{{") && leaf.Path.EndsWith("}}")))
{ {
continue; continue;
} }
var sourceDocument = try
await source.GetDocumentAsync(project, leaf.Path, input.LanguageCode, input.Version); {
documents.Add(sourceDocument); var sourceDocument = await source.GetDocumentAsync(project, leaf.Path, input.LanguageCode, input.Version);
documents.Add(sourceDocument);
}
catch (Exception e)
{
Logger.LogException(e);
}
} }
foreach (var document in documents) foreach (var document in documents)

264
modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Documents/index.js

@ -1,154 +1,187 @@
$(function () { $(function () {
var l = abp.localization.getResource('Docs'); var l = abp.localization.getResource('Docs');
var service = window.volo.docs.admin.documentsAdmin; var service = window.volo.docs.admin.documentsAdmin;
var getFormattedDate = function ($datePicker) { var getFormattedDate = function ($datePicker) {
return $datePicker.data().datepicker.getFormattedDate("yyyy-mm-dd"); return $datePicker.data().datepicker.getFormattedDate('yyyy-mm-dd');
}; };
var getFilter = function () { var getFilter = function () {
return { return {
projectId: $("#ProjectId").val(), projectId: $('#ProjectId').val(),
name: $("#Name").val(), name: $('#Name').val(),
version: $("#Version").val(), version: $('#Version').val(),
languageCode: $("#LanguageCode").val(), languageCode: $('#LanguageCode').val(),
fileName: $("#FileName").val(), fileName: $('#FileName').val(),
format: $("#Format").val(), format: $('#Format').val(),
creationTimeMin: getFormattedDate($("#CreationTimeMin")), creationTimeMin: getFormattedDate($('#CreationTimeMin')),
creationTimeMax: getFormattedDate($("#CreationTimeMax")), creationTimeMax: getFormattedDate($('#CreationTimeMax')),
lastUpdatedTimeMin: getFormattedDate($("#LastUpdatedTimeMin")), lastUpdatedTimeMin: getFormattedDate($('#LastUpdatedTimeMin')),
lastUpdatedTimeMax: getFormattedDate($("#LastUpdatedTimeMax")), lastUpdatedTimeMax: getFormattedDate($('#LastUpdatedTimeMax')),
lastSignificantUpdateTimeMin: getFormattedDate($("#LastSignificantUpdateTimeMin")), lastSignificantUpdateTimeMin: getFormattedDate(
lastSignificantUpdateTimeMax: getFormattedDate($("#LastSignificantUpdateTimeMax")), $('#LastSignificantUpdateTimeMin')
lastCachedTimeMin: getFormattedDate($("#LastCachedTimeMin")), ),
lastCachedTimeMax: getFormattedDate($("#LastCachedTimeMax")) lastSignificantUpdateTimeMax: getFormattedDate(
$('#LastSignificantUpdateTimeMax')
),
lastCachedTimeMin: getFormattedDate($('#LastCachedTimeMin')),
lastCachedTimeMax: getFormattedDate($('#LastCachedTimeMax')),
}; };
}; };
var dataTable = $('#DocumentsTable').DataTable(abp.libs.datatables.normalizeConfiguration({ var dataTable = $('#DocumentsTable').DataTable(
processing: true, abp.libs.datatables.normalizeConfiguration({
serverSide: true, processing: true,
scrollX: true, serverSide: true,
paging: true, scrollX: true,
searching: false, paging: true,
autoWidth: false, searching: false,
scrollCollapse: true, autoWidth: false,
ajax: abp.libs.datatables.createAjax(service.getAll, getFilter), scrollCollapse: true,
columnDefs: [ ajax: abp.libs.datatables.createAjax(service.getAll, getFilter),
{ columnDefs: [
rowAction: { {
items: rowAction: {
[ items: [
{ {
text: l('RemoveFromCache'), text: l('RemoveFromCache'),
visible: abp.auth.isGranted('Docs.Admin.Documents'), visible: abp.auth.isGranted(
confirmMessage: function (data) { return l('RemoveFromCacheConfirmation'); }, 'Docs.Admin.Documents'
),
confirmMessage: function (data) {
return l('RemoveFromCacheConfirmation');
},
action: function (data) { action: function (data) {
service.removeFromCache(data.record.id) service
.removeFromCache(data.record.id)
.then(function () { .then(function () {
abp.message.success(l('RemovedFromCache')); abp.message.success(
l('RemovedFromCache')
);
dataTable.ajax.reload(); dataTable.ajax.reload();
}); });
} },
}, },
{ {
text: l('ReIndex'), text: l('ReIndex'),
visible: abp.auth.isGranted('Docs.Admin.Documents'), visible: abp.auth.isGranted(
confirmMessage: function (data) { return l('ReIndexDocumentConfirmation'); }, 'Docs.Admin.Documents'
),
confirmMessage: function (data) {
return l('ReIndexDocumentConfirmation');
},
action: function (data) { action: function (data) {
service.reindex(data.record.id) service
.reindex(data.record.id)
.then(function () { .then(function () {
abp.message.success(l('ReindexCompleted')); abp.message.success(
l('ReindexCompleted')
);
dataTable.ajax.reload(); dataTable.ajax.reload();
}); });
} },
}, },
{ {
text: l('DeleteFromDatabase'), text: l('DeleteFromDatabase'),
visible: abp.auth.isGranted('Docs.Admin.Documents'), visible: abp.auth.isGranted(
confirmMessage: function (data) { return l('DeleteDocumentFromDbConfirmation'); }, 'Docs.Admin.Documents'
),
confirmMessage: function (data) {
return l(
'DeleteDocumentFromDbConfirmation'
);
},
action: function (data) { action: function (data) {
service.deleteFromDatabase(data.record.id) service
.deleteFromDatabase(data.record.id)
.then(function () { .then(function () {
abp.message.success(l('Deleted')); abp.message.success(l('Deleted'));
dataTable.ajax.reload(); dataTable.ajax.reload();
}); });
} },
} },
] ],
} },
}, },
{ {
target: 1, target: 1,
data: "name" data: 'name',
}, },
{ {
target: 2, target: 2,
data: "version" data: 'version',
}, },
{ {
target: 3, target: 3,
data: "languageCode" data: 'languageCode',
}, },
{ {
target: 4, target: 4,
data: "fileName" data: 'fileName',
}, },
{ {
target: 5, target: 5,
data: "format" data: 'format',
}, },
{ {
target: 6, target: 6,
data: "creationTime", data: 'creationTime',
render: function (creationTime) { render: function (creationTime) {
if (!creationTime) { if (!creationTime) {
return ""; return '';
} }
var date = Date.parse(creationTime); var date = Date.parse(creationTime);
return (new Date(date)).toLocaleDateString(abp.localization.currentCulture.name); return new Date(date).toLocaleDateString(
} abp.localization.currentCulture.name
}, );
{ },
target: 7, },
data: "lastUpdatedTime", {
render: function (lastUpdatedTime) { target: 7,
if (!lastUpdatedTime) { data: 'lastUpdatedTime',
return ""; render: function (lastUpdatedTime) {
} if (!lastUpdatedTime) {
return '';
}
var date = Date.parse(lastUpdatedTime); var date = Date.parse(lastUpdatedTime);
return (new Date(date)).toLocaleDateString(abp.localization.currentCulture.name); return new Date(date).toLocaleDateString(
} abp.localization.currentCulture.name
}, );
{ },
target: 8, },
data: "lastSignificantUpdateTime", {
render: function (lastSignificantUpdateTime) { target: 8,
if (!lastSignificantUpdateTime) { data: 'lastSignificantUpdateTime',
return ""; render: function (lastSignificantUpdateTime) {
} if (!lastSignificantUpdateTime) {
return '';
}
var date = Date.parse(lastSignificantUpdateTime); var date = Date.parse(lastSignificantUpdateTime);
return (new Date(date)).toLocaleDateString(abp.localization.currentCulture.name); return new Date(date).toLocaleDateString(
} abp.localization.currentCulture.name
}, );
{ },
target: 9, },
data: "lastCachedTime", {
render: function (lastCachedTime) { target: 9,
if (!lastCachedTime) { data: 'lastCachedTime',
return ""; render: function (lastCachedTime) {
} if (!lastCachedTime) {
return '';
}
var date = Date.parse(lastCachedTime); var date = Date.parse(lastCachedTime);
return (new Date(date)).toLocaleDateString(abp.localization.currentCulture.name); return new Date(date).toLocaleDateString(
} abp.localization.currentCulture.name
} );
] },
})); },
],
})
);
$("#FilterForm input[type='text']").keypress(function (e) { $("#FilterForm input[type='text']").keypress(function (e) {
if (e.which === 13) { if (e.which === 13) {
@ -156,9 +189,8 @@
} }
}); });
$("#SearchButton").click(function (e) { $('#SearchButton').click(function (e) {
e.preventDefault(); e.preventDefault();
dataTable.ajax.reload(); dataTable.ajax.reload();
}); });
}); });

12
modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Projects/Pull.js

@ -4,12 +4,12 @@ $(function () {
abp.modals.projectPull = function () { abp.modals.projectPull = function () {
var initModal = function (publicApi, args) { var initModal = function (publicApi, args) {
var $form = publicApi.getForm(); var $form = publicApi.getForm();
var fg = $form.find("#PullDocument_Name").parent(); var fg = $form.find('#PullDocument_Name').parent();
var nameInput = fg.html(); var nameInput = fg.html();
$form.find("input:checkbox").change(function() { $form.find('input:checkbox').change(function () {
if ($(this).prop("checked")) { if ($(this).prop('checked')) {
fg.html(""); fg.html('');
} else { } else {
fg.html(nameInput); fg.html(nameInput);
} }
@ -17,7 +17,7 @@ $(function () {
}; };
return { return {
initModal: initModal initModal: initModal,
}; };
}; };
}); });

8
modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Projects/create.js

@ -3,12 +3,10 @@ $(function () {
abp.modals.projectCreate = function () { abp.modals.projectCreate = function () {
var initModal = function (publicApi, args) { var initModal = function (publicApi, args) {
var $form = publicApi.getForm(); var $form = publicApi.getForm();
}; };
return { return {
initModal: initModal initModal: initModal,
} };
}; };
}); });

8
modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Projects/edit.js

@ -3,12 +3,10 @@ $(function () {
abp.modals.projectEdit = function () { abp.modals.projectEdit = function () {
var initModal = function (publicApi, args) { var initModal = function (publicApi, args) {
var $form = publicApi.getForm(); var $form = publicApi.getForm();
}; };
return { return {
initModal: initModal initModal: initModal,
} };
}; };
}); });

183
modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Projects/index.js

@ -1,136 +1,168 @@
$(function () { $(function () {
var l = abp.localization.getResource('Docs'); var l = abp.localization.getResource('Docs');
var _createModal = new abp.ModalManager({ var _createModal = new abp.ModalManager({
viewUrl: abp.appPath + 'Docs/Admin/Projects/Create', viewUrl: abp.appPath + 'Docs/Admin/Projects/Create',
modalClass: 'projectCreate' modalClass: 'projectCreate',
}); });
var _editModal = new abp.ModalManager({ var _editModal = new abp.ModalManager({
viewUrl: abp.appPath + 'Docs/Admin/Projects/Edit', viewUrl: abp.appPath + 'Docs/Admin/Projects/Edit',
modalClass: 'projectEdit' modalClass: 'projectEdit',
}); });
var _pullModal = new abp.ModalManager({ var _pullModal = new abp.ModalManager({
viewUrl: abp.appPath + 'Docs/Admin/Projects/Pull', viewUrl: abp.appPath + 'Docs/Admin/Projects/Pull',
modalClass: 'projectPull' modalClass: 'projectPull',
}); });
var _dataTable = $('#ProjectsTable').DataTable(
var _dataTable = $('#ProjectsTable').DataTable(abp.libs.datatables.normalizeConfiguration({ abp.libs.datatables.normalizeConfiguration({
processing: true, processing: true,
serverSide: true, serverSide: true,
scrollX: true, scrollX: true,
paging: true, paging: true,
searching: false, searching: false,
autoWidth: false, autoWidth: false,
scrollCollapse: true, scrollCollapse: true,
order: [[2, "desc"]], order: [[2, 'desc']],
ajax: abp.libs.datatables.createAjax(volo.docs.admin.projectsAdmin.getList), ajax: abp.libs.datatables.createAjax(
columnDefs: [ volo.docs.admin.projectsAdmin.getList
{ ),
rowAction: { columnDefs: [
items: {
[ rowAction: {
items: [
{ {
text: l('Edit'), text: l('Edit'),
visible: abp.auth.isGranted('Docs.Admin.Projects.Update'), visible: abp.auth.isGranted(
'Docs.Admin.Projects.Update'
),
action: function (data) { action: function (data) {
_editModal.open({ _editModal.open({
Id: data.record.id Id: data.record.id,
}); });
} },
}, },
{ {
text: l('Delete'), text: l('Delete'),
visible: abp.auth.isGranted('Docs.Admin.Projects.Delete'), visible: abp.auth.isGranted(
confirmMessage: function (data) { return l('ProjectDeletionWarningMessage') }, 'Docs.Admin.Projects.Delete'
),
confirmMessage: function (data) {
return l('ProjectDeletionWarningMessage');
},
action: function (data) { action: function (data) {
volo.docs.admin.projectsAdmin volo.docs.admin.projectsAdmin
.delete(data.record.id) .delete(data.record.id)
.then(function () { .then(function () {
_dataTable.ajax.reload(); _dataTable.ajax.reload();
}); });
} },
}, },
{ {
text: l('Pull'), text: l('Pull'),
visible: abp.auth.isGranted('Docs.Admin.Documents'), visible: abp.auth.isGranted(
'Docs.Admin.Documents'
),
action: function (data) { action: function (data) {
_pullModal.open({ _pullModal.open({
Id: data.record.id Id: data.record.id,
}); });
} },
}, },
{ {
text: l('ClearCache'), text: l('ClearCache'),
visible: abp.auth.isGranted('Docs.Admin.Documents'), visible: abp.auth.isGranted(
confirmMessage: function (data) { return l('ClearCacheConfirmationMessage', data.record.name); }, 'Docs.Admin.Documents'
),
confirmMessage: function (data) {
return l(
'ClearCacheConfirmationMessage',
data.record.name
);
},
action: function (data) { action: function (data) {
volo.docs.admin.documentsAdmin volo.docs.admin.documentsAdmin
.clearCache({ projectId: data.record.id}) .clearCache({
projectId: data.record.id,
})
.then(function () { .then(function () {
_dataTable.ajax.reload(); _dataTable.ajax.reload();
}); });
} },
}, },
{ {
text: l('ReIndexProject'), text: l('ReIndexProject'),
visible: abp.auth.isGranted('Docs.Admin.Documents'), visible: abp.auth.isGranted(
confirmMessage: function (data) { return l('ReIndexProjectConfirmationMessage', data.record.name); }, 'Docs.Admin.Documents'
),
confirmMessage: function (data) {
return l(
'ReIndexProjectConfirmationMessage',
data.record.name
);
},
action: function (data) { action: function (data) {
volo.docs.admin.projectsAdmin volo.docs.admin.projectsAdmin
.reindex({ projectId: data.record.id}) .reindex({ projectId: data.record.id })
.then(function () { .then(function () {
abp.message.success(l('SuccessfullyReIndexProject', data.record.name)); abp.message.success(
l(
'SuccessfullyReIndexProject',
data.record.name
)
);
}); });
} },
} },
] ],
} },
}, },
{ {
target: 1, target: 1,
data: "name" data: 'name',
}, },
{ {
target: 2, target: 2,
data: "shortName" data: 'shortName',
}, },
{ {
target: 3, target: 3,
data: "documentStoreType" data: 'documentStoreType',
}, },
{ {
target: 4, target: 4,
data: "format", data: 'format',
render: function (data) { render: function (data) {
if (data === 'md') { if (data === 'md') {
return 'markdown'; return 'markdown';
} }
return data;
}
}
]
}));
return data;
},
},
],
})
);
$("#CreateNewGithubProjectButtonId").click(function (event) { $('#CreateNewGithubProjectButtonId').click(function (event) {
event.preventDefault(); event.preventDefault();
_createModal.open({source:"GitHub"}); _createModal.open({ source: 'GitHub' });
}); });
$("#ReIndexAllProjects").click(function (event) { $('#ReIndexAllProjects').click(function (event) {
abp.message.confirm(l('ReIndexAllProjectConfirmationMessage')) abp.message
.confirm(l('ReIndexAllProjectConfirmationMessage'))
.done(function (accepted) { .done(function (accepted) {
if (accepted) { if (accepted) {
volo.docs.admin.projectsAdmin volo.docs.admin.projectsAdmin
.reindexAll() .reindexAll()
.then(function () { .then(function () {
abp.message.success(l('SuccessfullyReIndexAllProject')); abp.message.success(
}); l('SuccessfullyReIndexAllProject')
);
});
} }
}); });
}); });
@ -142,5 +174,4 @@
_editModal.onResult(function () { _editModal.onResult(function () {
_dataTable.ajax.reload(); _dataTable.ajax.reload();
}); });
}); });

4
modules/docs/src/Volo.Docs.Application/Volo/Docs/Documents/DocumentAppService.cs

@ -176,7 +176,7 @@ namespace Volo.Docs.Documents
Version = esDoc.Version, Version = esDoc.Version,
LanguageCode = esDoc.LanguageCode, LanguageCode = esDoc.LanguageCode,
Highlight = esDoc.Highlight Highlight = esDoc.Highlight
}).ToList(); }).Where(x => x.FileName != project.NavigationDocumentName && x.FileName != project.ParametersDocumentName).ToList();
} }
public async Task<bool> FullSearchEnabledAsync() public async Task<bool> FullSearchEnabledAsync()
@ -338,4 +338,4 @@ namespace Volo.Docs.Documents
return TimeSpan.Parse(value); return TimeSpan.Parse(value);
} }
} }
} }

9
modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/FullSearch/Elastic/ElasticDocumentFullSearch.cs

@ -72,7 +72,7 @@ namespace Volo.Docs.Documents.FullSearch.Elastic
Name = document.Name, Name = document.Name,
FileName = document.FileName, FileName = document.FileName,
Content = document.Content, Content = document.Content,
LanguageCode = document.LanguageCode, LanguageCode = ConvertLanguageCode(document.LanguageCode),
Version = document.Version Version = document.Version
}; };
@ -178,7 +178,7 @@ namespace Volo.Docs.Documents.FullSearch.Elastic
new TermQuery new TermQuery
{ {
Field = "languageCode", Field = "languageCode",
Value = languageCode Value = ConvertLanguageCode(languageCode)
} }
} }
} }
@ -232,5 +232,10 @@ namespace Volo.Docs.Documents.FullSearch.Elastic
throw new BusinessException(DocsDomainErrorCodes.ElasticSearchNotEnabled); throw new BusinessException(DocsDomainErrorCodes.ElasticSearchNotEnabled);
} }
} }
protected string ConvertLanguageCode(string languageCode)
{
return languageCode.Replace("-", "").ToLower();
}
} }
} }

2
modules/docs/src/Volo.Docs.Domain/Volo/Docs/Localization/Domain/nl.json

@ -1,4 +1,4 @@
{ {
"culture": "nl", "culture": "nl",
"texts": { "texts": {
"Documents": "Documenten", "Documents": "Documenten",

23
modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/bootstrap-toc.js

@ -12,12 +12,18 @@
// http://danielnouri.org/notes/2011/03/14/a-jquery-find-that-also-finds-the-root-element/ // http://danielnouri.org/notes/2011/03/14/a-jquery-find-that-also-finds-the-root-element/
// http://stackoverflow.com/a/12731439/358804 // http://stackoverflow.com/a/12731439/358804
var $descendants = $el.find(selector); var $descendants = $el.find(selector);
return $el.filter(selector).add($descendants).filter(':not([data-toc-skip])'); return $el
.filter(selector)
.add($descendants)
.filter(':not([data-toc-skip])');
}, },
generateUniqueIdBase: function (el) { generateUniqueIdBase: function (el) {
var text = $(el).text(); var text = $(el).text();
var anchor = text.trim().toLowerCase().replace(/[^A-Za-z0-9]+/g, '-'); var anchor = text
.trim()
.toLowerCase()
.replace(/[^A-Za-z0-9]+/g, '-');
return anchor || el.tagName.toLowerCase(); return anchor || el.tagName.toLowerCase();
}, },
@ -91,7 +97,10 @@
var secondaryLevel = topLevel + 1; var secondaryLevel = topLevel + 1;
var secondarySelector = 'h' + secondaryLevel; var secondarySelector = 'h' + secondaryLevel;
return this.findOrFilter($scope, topSelector + ',' + secondarySelector); return this.findOrFilter(
$scope,
topSelector + ',' + secondarySelector
);
}, },
getNavLevel: function (el) { getNavLevel: function (el) {
@ -126,14 +135,14 @@
var opts; var opts;
if (arg.jquery) { if (arg.jquery) {
opts = { opts = {
$nav: arg $nav: arg,
}; };
} else { } else {
opts = arg; opts = arg;
} }
opts.$scope = opts.$scope || $(document.body); opts.$scope = opts.$scope || $(document.body);
return opts; return opts;
} },
}, },
// accepts a jQuery object, or an options object // accepts a jQuery object, or an options object
@ -147,7 +156,7 @@
var topLevel = this.helpers.getTopLevel(opts.$scope); var topLevel = this.helpers.getTopLevel(opts.$scope);
var $headings = this.helpers.getHeadings(opts.$scope, topLevel); var $headings = this.helpers.getHeadings(opts.$scope, topLevel);
this.helpers.populateNav($topContext, topLevel, $headings); this.helpers.populateNav($topContext, topLevel, $headings);
} },
}; };
$(function () { $(function () {
@ -156,4 +165,4 @@
Toc.init($nav); Toc.init($nav);
}); });
}); });
})(jQuery); })(jQuery);

212
modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/index.js

@ -1,19 +1,19 @@
(function ($) { (function ($) {
$(function () { $(function () {
var initNavigationFilter = function (navigationContainerId) { var initNavigationFilter = function (navigationContainerId) {
var $navigation = $('#' + navigationContainerId);
var $navigation = $("#" + navigationContainerId);
var getShownDocumentLinks = function () { var getShownDocumentLinks = function () {
return $navigation.find(".mCSB_container > li a:visible").not(".tree-toggle"); return $navigation
.find('.mCSB_container > li a:visible')
.not('.tree-toggle');
}; };
var gotoFilteredDocumentIfThereIsOnlyOne = function () { var gotoFilteredDocumentIfThereIsOnlyOne = function () {
var $links = getShownDocumentLinks(); var $links = getShownDocumentLinks();
if ($links.length === 1) { if ($links.length === 1) {
var url = $links.first().attr("href"); var url = $links.first().attr('href');
if (url === "javascript:;") { if (url === 'javascript:;') {
return; return;
} }
@ -22,33 +22,48 @@
}; };
var filterDocumentItems = function (filterText) { var filterDocumentItems = function (filterText) {
$navigation.find(".mCSB_container .opened").removeClass("opened"); $navigation
$navigation.find(".mCSB_container > li, .mCSB_container > li ul").hide(); .find('.mCSB_container .opened')
.removeClass('opened');
$navigation
.find('.mCSB_container > li, .mCSB_container > li ul')
.hide();
if (!filterText) { if (!filterText) {
$navigation.find(".mCSB_container > li").show(); $navigation.find('.mCSB_container > li').show();
$navigation.find(".mCSB_container .selected-tree > ul").show(); $navigation
.find('.mCSB_container .selected-tree > ul')
.show();
return; return;
} }
var filteredItems = $navigation.find("li > a").filter(function () { var filteredItems = $navigation
return $(this).text().toUpperCase().indexOf(filterText.toUpperCase()) > -1; .find('li > a')
}); .filter(function () {
return (
$(this)
.text()
.toUpperCase()
.indexOf(filterText.toUpperCase()) > -1
);
});
filteredItems.each(function () { filteredItems.each(function () {
var $el = $(this); var $el = $(this);
$el.show(); $el.show();
var $parent = $el.parent(); var $parent = $el.parent();
var hasParent = true; var hasParent = true;
while (hasParent) { while (hasParent) {
if ($parent.attr("id") === navigationContainerId) { if ($parent.attr('id') === navigationContainerId) {
break; break;
} }
$parent.show(); $parent.show();
$parent.find("> li > label").not(".last-link").addClass("opened"); $parent
.find('> li > label')
.not('.last-link')
.addClass('opened');
$parent = $parent.parent(); $parent = $parent.parent();
hasParent = $parent.length > 0; hasParent = $parent.length > 0;
@ -56,54 +71,75 @@
}); });
}; };
$("#filter").keyup(function (e) { $('#filter').keyup(function (e) {
filterDocumentItems(e.target.value); filterDocumentItems(e.target.value);
if (e.key === "Enter") { if (e.key === 'Enter') {
gotoFilteredDocumentIfThereIsOnlyOne(); gotoFilteredDocumentIfThereIsOnlyOne();
} }
}); });
$("#fullsearch").keyup(function (e) { $('#fullsearch').keyup(function (e) {
if (e.key === "Enter") { if (e.key === 'Enter') {
window.open($(this).data("fullsearch-url") + this.value); window.open($(this).data('fullsearch-url') + this.value);
} }
}); });
}; };
var initAnchorTags = function (container) { var initAnchorTags = function (container) {
anchors.options = { anchors.options = {
placement: 'left' placement: 'left',
}; };
var anchorTags = ["h1", "h2", "h3", "h4", "h5", "h6"]; var anchorTags = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'];
anchorTags.forEach(function (tag) { anchorTags.forEach(function (tag) {
anchors.add(container + " " + tag); anchors.add(container + ' ' + tag);
}); });
}; };
var initSocialShareLinks = function () { var initSocialShareLinks = function () {
var pageHeader = $(".docs-body").find("h1, h2").first().text(); var pageHeader = $('.docs-body').find('h1, h2').first().text();
var projectName = $('#ProjectName')[0].innerText; var projectName = $('#ProjectName')[0].innerText;
$('#TwitterShareLink').attr('href', $('#TwitterShareLink').attr(
'https://twitter.com/intent/tweet?text=' + encodeURI(pageHeader + " | " + projectName + " | " + window.location.href) 'href',
'https://twitter.com/intent/tweet?text=' +
encodeURI(
pageHeader +
' | ' +
projectName +
' | ' +
window.location.href
)
); );
$('#LinkedinShareLink').attr('href', $('#LinkedinShareLink').attr(
'https://www.linkedin.com/shareArticle?' 'href',
+ 'url=' + encodeURI(window.location.href) + '&' 'https://www.linkedin.com/shareArticle?' +
+ 'mini=true&' 'url=' +
+ "summary=" + encodeURI(projectName) + '&' encodeURI(window.location.href) +
+ "title=" + encodeURI(pageHeader) + '&' '&' +
+ "source=" + encodeURI($('#GoToMainWebSite').attr('href')) 'mini=true&' +
'summary=' +
encodeURI(projectName) +
'&' +
'title=' +
encodeURI(pageHeader) +
'&' +
'source=' +
encodeURI($('#GoToMainWebSite').attr('href'))
); );
$('#EmailShareLink').attr('href', $('#EmailShareLink').attr(
'mailto:?' 'href',
+ 'body=' + encodeURI('I want you to look at ' + window.location.href) + '&' 'mailto:?' +
+ "subject=" + encodeURI(pageHeader + ' | ' + projectName) + '&' 'body=' +
encodeURI('I want you to look at ' + window.location.href) +
'&' +
'subject=' +
encodeURI(pageHeader + ' | ' + projectName) +
'&'
); );
}; };
@ -111,15 +147,15 @@
var clearQueryString = function () { var clearQueryString = function () {
var uri = window.location.href.toString(); var uri = window.location.href.toString();
if (uri.indexOf("?") > 0) { if (uri.indexOf('?') > 0) {
uri = uri.substring(0, uri.indexOf("?")); uri = uri.substring(0, uri.indexOf('?'));
} }
window.history.replaceState({}, document.title, uri); window.history.replaceState({}, document.title, uri);
}; };
var setQueryString = function () { var setQueryString = function () {
var comboboxes = $(".doc-section-combobox"); var comboboxes = $('.doc-section-combobox');
if (comboboxes.length < 1) { if (comboboxes.length < 1) {
return; return;
} }
@ -130,16 +166,16 @@
var uri = window.location.href.toString(); var uri = window.location.href.toString();
var new_uri = uri + "?"; var new_uri = uri + '?';
for (var i = 0; i < comboboxes.length; i++) { for (var i = 0; i < comboboxes.length; i++) {
var key = $(comboboxes[i]).data('key'); var key = $(comboboxes[i]).data('key');
var value = comboboxes[i].value; var value = comboboxes[i].value;
new_uri += key + "=" + value; new_uri += key + '=' + value;
if (i !== comboboxes.length - 1) { if (i !== comboboxes.length - 1) {
new_uri += "&"; new_uri += '&';
} }
} }
@ -148,19 +184,21 @@
var getTenYearsLater = function () { var getTenYearsLater = function () {
var tenYearsLater = new Date(); var tenYearsLater = new Date();
tenYearsLater.setTime(tenYearsLater.getTime() + (365 * 10 * 24 * 60 * 60 * 1000)); tenYearsLater.setTime(
tenYearsLater.getTime() + 365 * 10 * 24 * 60 * 60 * 1000
);
return tenYearsLater; return tenYearsLater;
}; };
var setCookies = function () { var setCookies = function () {
var cookie = abp.utils.getCookieValue("AbpDocsPreferences"); var cookie = abp.utils.getCookieValue('AbpDocsPreferences');
if (!cookie || cookie == null || cookie === null) { if (!cookie || cookie == null || cookie === null) {
cookie = ""; cookie = '';
} }
var keyValues = cookie.split("|"); var keyValues = cookie.split('|');
var comboboxes = $(".doc-section-combobox"); var comboboxes = $('.doc-section-combobox');
for (var i = 0; i < comboboxes.length; i++) { for (var i = 0; i < comboboxes.length; i++) {
var key = $(comboboxes[i]).data('key'); var key = $(comboboxes[i]).data('key');
@ -169,23 +207,28 @@
var changed = false; var changed = false;
var keyValueslength = keyValues.length; var keyValueslength = keyValues.length;
for (var k = 0; k < keyValueslength; k++) { for (var k = 0; k < keyValueslength; k++) {
var splitted = keyValues[k].split("="); var splitted = keyValues[k].split('=');
if (splitted.length > 0 && splitted[0] === key) { if (splitted.length > 0 && splitted[0] === key) {
keyValues[k] = key + "=" + value; keyValues[k] = key + '=' + value;
changed = true; changed = true;
} }
} }
if (!changed) { if (!changed) {
keyValues.push(key + "=" + value); keyValues.push(key + '=' + value);
} }
} }
abp.utils.setCookieValue("AbpDocsPreferences", keyValues.join('|'), getTenYearsLater(), '/'); abp.utils.setCookieValue(
'AbpDocsPreferences',
keyValues.join('|'),
getTenYearsLater(),
'/'
);
}; };
$(".doc-section-combobox").change(function () { $('.doc-section-combobox').change(function () {
setCookies(); setCookies();
clearQueryString(); clearQueryString();
location.reload(); location.reload();
@ -195,7 +238,6 @@
}; };
var initCrawlerLinks = function () { var initCrawlerLinks = function () {
var isCrawler = function () { var isCrawler = function () {
var crawlers = [ var crawlers = [
'Google', 'Google',
@ -227,13 +269,12 @@
'ExaLead', 'ExaLead',
'Search Dog', 'Search Dog',
'MSN Bot', 'MSN Bot',
'BingBot' 'BingBot',
]; ];
var agent = navigator.userAgent; var agent = navigator.userAgent;
for (var i = 0; i < crawlers.length; i++) { for (var i = 0; i < crawlers.length; i++) {
if (agent.indexOf(crawlers[i]) >= 0) { if (agent.indexOf(crawlers[i]) >= 0) {
return true; return true;
} }
@ -246,20 +287,20 @@
return; return;
} }
var comboboxes = $(".doc-section-combobox"); var comboboxes = $('.doc-section-combobox');
if (comboboxes.length <= 0) { if (comboboxes.length <= 0) {
return; return;
} }
$("#crawler_link").show(); $('#crawler_link').show();
var html = ''; var html = '';
var currentUrl = window.location.href.toString(); var currentUrl = window.location.href.toString();
if (currentUrl.indexOf("?") > 0) { if (currentUrl.indexOf('?') > 0) {
currentUrl = currentUrl.substring(0, currentUrl.indexOf("?")); currentUrl = currentUrl.substring(0, currentUrl.indexOf('?'));
} }
var getQueryStringsFromComboboxes = function (x) { var getQueryStringsFromComboboxes = function (x) {
@ -267,22 +308,28 @@
return []; return [];
} }
var key = $(comboboxes[x]).data("key"); var key = $(comboboxes[x]).data('key');
var queryStrings = getQueryStringsFromComboboxes(x + 1); var queryStrings = getQueryStringsFromComboboxes(x + 1);
var returnList = []; var returnList = [];
$(comboboxes[x]).find("option").each(function () { $(comboboxes[x])
.find('option')
if (queryStrings.length <= 0) { .each(function () {
returnList.push(key + "=" + $(this).val()); if (queryStrings.length <= 0) {
returnList.push(key + '=' + $(this).val());
} else { } else {
for (var k = 0; k < queryStrings.length; k++) { for (var k = 0; k < queryStrings.length; k++) {
returnList.push(key + "=" + $(this).val() + "&" + queryStrings[k]); returnList.push(
key +
'=' +
$(this).val() +
'&' +
queryStrings[k]
);
}
} }
} });
});
return returnList; return returnList;
}; };
@ -290,22 +337,27 @@
var queryStrings = getQueryStringsFromComboboxes(0); var queryStrings = getQueryStringsFromComboboxes(0);
for (var i = 0; i < queryStrings.length; i++) { for (var i = 0; i < queryStrings.length; i++) {
html += "<a href=\"" + currentUrl + "?" + queryStrings[i] + "\">" + queryStrings[i] + "</a> " html +=
'<a href="' +
currentUrl +
'?' +
queryStrings[i] +
'">' +
queryStrings[i] +
'</a> ';
} }
$("#crawler_link").html(html); $('#crawler_link').html(html);
}; };
initNavigationFilter("sidebar-scroll");
initAnchorTags(".docs-page .docs-body"); initNavigationFilter('sidebar-scroll');
initAnchorTags('.docs-page .docs-body');
initSocialShareLinks(); initSocialShareLinks();
initSections(); initSections();
initCrawlerLinks(); initCrawlerLinks();
}); });
})(jQuery);
})(jQuery);

25
modules/docs/src/Volo.Docs.Web/Pages/Documents/Search.cshtml.cs

@ -1,7 +1,9 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text.Encodings.Web;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Web;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.AspNetCore.Mvc.RazorPages;
using Volo.Docs.Documents; using Volo.Docs.Documents;
@ -29,12 +31,15 @@ namespace Volo.Docs.Pages.Documents
private readonly IProjectAppService _projectAppService; private readonly IProjectAppService _projectAppService;
private readonly IDocumentAppService _documentAppService; private readonly IDocumentAppService _documentAppService;
private readonly HtmlEncoder _encoder;
public SearchModel(IProjectAppService projectAppService, public SearchModel(IProjectAppService projectAppService,
IDocumentAppService documentAppService) IDocumentAppService documentAppService,
HtmlEncoder encoder)
{ {
_projectAppService = projectAppService; _projectAppService = projectAppService;
_documentAppService = documentAppService; _documentAppService = documentAppService;
_encoder = encoder;
} }
public List<DocumentSearchOutput> SearchOutputs { get; set; } = new List<DocumentSearchOutput>(); public List<DocumentSearchOutput> SearchOutputs { get; set; } = new List<DocumentSearchOutput>();
@ -45,7 +50,7 @@ namespace Volo.Docs.Pages.Documents
{ {
return RedirectToPage("Index"); return RedirectToPage("Index");
} }
KeyWord = keyword; KeyWord = keyword;
Project = await _projectAppService.GetAsync(ProjectName); Project = await _projectAppService.GetAsync(ProjectName);
@ -67,7 +72,19 @@ namespace Volo.Docs.Pages.Documents
Version = Version Version = Version
}); });
var highlightTag1 = Guid.NewGuid().ToString();
var highlightTag2 = Guid.NewGuid().ToString();
foreach (var searchOutput in SearchOutputs)
{
for (var i = 0; i < searchOutput.Highlight.Count; i++)
{
searchOutput.Highlight[i] = _encoder
.Encode(searchOutput.Highlight[i].Replace("<highlight>", highlightTag1).Replace("</highlight>", highlightTag2))
.Replace(highlightTag1, "<highlight>").Replace(highlightTag2, "</highlight>");
}
}
return Page(); return Page();
} }
} }
} }

10
modules/docs/src/Volo.Docs.Web/Pages/Documents/Shared/ErrorComponent/error.js

@ -1,20 +1,18 @@
(function ($) { (function ($) {
$(function () { $(function () {
var errorPageRedirect = function () { var errorPageRedirect = function () {
var second = 3; var second = 3;
var close = setInterval(() => { var close = setInterval(() => {
$("#ErrorRedirectSeconds").text(`(${--second})`); $('#ErrorRedirectSeconds').text(`(${--second})`);
if (second === 0) { if (second === 0) {
clearInterval(close); clearInterval(close);
$("#ErrorRedirect")[0].click(); $('#ErrorRedirect')[0].click();
} }
}, 1000); }, 1000);
} };
if (document.getElementById("ErrorRedirect")) { if (document.getElementById('ErrorRedirect')) {
errorPageRedirect(); errorPageRedirect();
} }
}); });
})(jQuery); })(jQuery);

113
modules/docs/src/Volo.Docs.Web/Pages/Documents/Shared/Scripts/vs.js

@ -2,62 +2,71 @@
$(function () { $(function () {
$('li:not(.last-link) a.tree-toggle').click(function () { $('li:not(.last-link) a.tree-toggle').click(function () {
$(this).parent().children('ul.tree').toggle(100); $(this).parent().children('ul.tree').toggle(100);
$(this).closest("li").toggleClass("selected-tree"); $(this).closest('li').toggleClass('selected-tree');
}); });
$('li:not(.last-link) span.plus-icon i.fa-chevron-right').click(function () { $('li:not(.last-link) span.plus-icon i.fa-chevron-right').click(
function () {
var $element = $(this).parent();
var $element = $(this).parent(); $element.parent().children('ul.tree').toggle(100);
$element.closest('li').toggleClass('selected-tree');
$element.parent().children('ul.tree').toggle(100); }
$element.closest("li").toggleClass("selected-tree"); );
});
var scrollTopBtn = $(".scroll-top-btn"); var scrollTopBtn = $('.scroll-top-btn');
var enoughHeight = $(".docs-sidebar-wrapper > .docs-top").height() + 60; var enoughHeight = $('.docs-sidebar-wrapper > .docs-top').height() + 60;
var enoughHeightPlus = 500; var enoughHeightPlus = 500;
$(window).scroll(function () { $(window).scroll(function () {
var topPos = $(window).scrollTop(); var topPos = $(window).scrollTop();
if (topPos > enoughHeight) { if (topPos > enoughHeight) {
$(scrollTopBtn).addClass("showup"); $(scrollTopBtn).addClass('showup');
$("body").addClass("scrolled"); $('body').addClass('scrolled');
} else { } else {
$(scrollTopBtn).removeClass("showup"); $(scrollTopBtn).removeClass('showup');
$("body").removeClass("scrolled"); $('body').removeClass('scrolled');
} }
if (topPos > enoughHeightPlus) { if (topPos > enoughHeightPlus) {
$("body").addClass("scrolledMore"); $('body').addClass('scrolledMore');
} else { } else {
$("body").removeClass("scrolledMore"); $('body').removeClass('scrolledMore');
} }
}); });
$(scrollTopBtn).click(function () { $(scrollTopBtn).click(function () {
$('html, body').animate({ $('html, body').animate(
scrollTop: 0 {
}, 500); scrollTop: 0,
},
500
);
return false; return false;
}); });
var scrollToHashLink = function () { var scrollToHashLink = function () {
var hash = window.location.hash; var hash = window.location.hash;
if (!hash || hash === "#") { if (!hash || hash === '#') {
return; return;
} }
var $targetElement = $(decodeURIComponent(hash)); var $targetElement = $(decodeURIComponent(hash));
$targetElement = $targetElement.length ? $targetElement : $('[name=' + this.hash.slice(1) + ']'); $targetElement = $targetElement.length
? $targetElement
: $('[name=' + this.hash.slice(1) + ']');
if (!$targetElement.length) { if (!$targetElement.length) {
return; return;
} }
$('html,body').stop().animate({ $('html,body').stop().animate(
scrollTop: $targetElement.offset().top {
}, 200); scrollTop: $targetElement.offset().top,
},
200
);
return; return;
}; };
@ -65,36 +74,40 @@
$(document).ready(function () { $(document).ready(function () {
handleCustomScrolls(); handleCustomScrolls();
var $myNav = $("#docs-sticky-index"); var $myNav = $('#docs-sticky-index');
Toc.init($myNav); Toc.init($myNav);
$("body").scrollspy({ $('body').scrollspy({
target: $myNav target: $myNav,
}); });
$("#docs-sticky-index a").on('click', function (event) { $('#docs-sticky-index a').on('click', function (event) {
if (this.hash !== "") { if (this.hash !== '') {
event.preventDefault(); event.preventDefault();
var hash = this.hash; var hash = this.hash;
$('html, body').animate({ $('html, body').animate(
scrollTop: $(decodeURIComponent(hash)).offset().top {
}, 500, function () { scrollTop: $(decodeURIComponent(hash)).offset().top,
window.location.hash = hash; },
}); 500,
function () {
window.location.hash = hash;
}
);
} }
}); });
$(".btn-toggle").on("click", function () { $('.btn-toggle').on('click', function () {
$(".toggle-row").slideToggle(400); $('.toggle-row').slideToggle(400);
$(this).toggleClass("less"); $(this).toggleClass('less');
}); });
$(".close-mmenu").on("click", function () { $('.close-mmenu').on('click', function () {
$(".navbar-collapse").removeClass("show"); $('.navbar-collapse').removeClass('show');
}); });
$(".open-dmenu").on("click", function () { $('.open-dmenu').on('click', function () {
$(".docs-tree-list").slideToggle(); $('.docs-tree-list').slideToggle();
}); });
scrollToHashLink(); scrollToHashLink();
@ -108,13 +121,13 @@
function handleCustomScrolls() { function handleCustomScrolls() {
var wWidth = $(window).width(); var wWidth = $(window).width();
if (wWidth > 766) { if (wWidth > 766) {
$("#sidebar-scroll").mCustomScrollbar({ $('#sidebar-scroll').mCustomScrollbar({
theme: "minimal", theme: 'minimal',
alwaysShowScrollbar: 0, alwaysShowScrollbar: 0,
}); });
$("#scroll-index").mCustomScrollbar({ $('#scroll-index').mCustomScrollbar({
theme: "minimal-dark", theme: 'minimal-dark',
alwaysShowScrollbar: 0, alwaysShowScrollbar: 0,
}); });
} }
@ -139,9 +152,9 @@
return $li; return $li;
}; };
function docsCriteria() { function docsCriteria() {
var docsContentWidth = $(".docs-content").width() - 20; var docsContentWidth = $('.docs-content').width() - 20;
$(".alert-criteria").width(docsContentWidth); $('.alert-criteria').width(docsContentWidth);
} }
$(document).ready(function () { $(document).ready(function () {
docsCriteria(); docsCriteria();
@ -149,4 +162,4 @@
$(window).resize(function () { $(window).resize(function () {
docsCriteria(); docsCriteria();
}); });
})(jQuery); })(jQuery);

5
modules/feature-management/.prettierrc

@ -0,0 +1,5 @@
{
"singleQuote": true,
"useTabs": false,
"tabWidth": 4
}

2
modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/de.json

@ -2,6 +2,6 @@
"culture": "de", "culture": "de",
"texts": { "texts": {
"Features": "Funktionen", "Features": "Funktionen",
"NoFeatureFoundMessage": "Es ist keine Funktion verfügbar." "NoFeatureFoundMessage": "Es ist keine Funktion verfügbar."
} }
} }

11
modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/feature-management-modal.js

@ -3,15 +3,12 @@
abp.modals = abp.modals || {}; abp.modals = abp.modals || {};
abp.modals.FeatureManagement = function () { abp.modals.FeatureManagement = function () {
$('.FeatureValueCheckbox').change(function () { $('.FeatureValueCheckbox').change(function () {
if (this.checked) { if (this.checked) {
$(this).val("true"); $(this).val('true');
} } else {
else { $(this).val('false');
$(this).val("false");
} }
}); });
}; };
})(jQuery); })(jQuery);

5
modules/identity/.prettierrc

@ -0,0 +1,5 @@
{
"singleQuote": true,
"useTabs": false,
"tabWidth": 4
}

82
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/de.json

@ -1,7 +1,7 @@
{ {
"culture": "de", "culture": "de",
"texts": { "texts": {
"Menu:IdentityManagement": "Identitätsverwaltung", "Menu:IdentityManagement": "Identitätsverwaltung",
"Users": "Benutzer", "Users": "Benutzer",
"NewUser": "Neuer Benutzer", "NewUser": "Neuer Benutzer",
"UserName": "Benutzername", "UserName": "Benutzername",
@ -10,13 +10,13 @@
"UserInformations": "Benutzerinformationen", "UserInformations": "Benutzerinformationen",
"DisplayName:IsDefault": "Standard", "DisplayName:IsDefault": "Standard",
"DisplayName:IsStatic": "Statisch", "DisplayName:IsStatic": "Statisch",
"DisplayName:IsPublic": "Öffentlich", "DisplayName:IsPublic": "Öffentlich",
"Roles": "Rollen", "Roles": "Rollen",
"Password": "Passwort", "Password": "Passwort",
"PersonalInfo": "Mein Profil", "PersonalInfo": "Mein Profil",
"PersonalSettings": "Persönliche Einstellungen", "PersonalSettings": "Persönliche Einstellungen",
"UserDeletionConfirmationMessage": "Der Benutzer '{0}' wird gelöscht. Sind Sie sicher?", "UserDeletionConfirmationMessage": "Der Benutzer '{0}' wird gelöscht. Sind Sie sicher?",
"RoleDeletionConfirmationMessage": "Die Rolle '{0}' wird gelöscht. Sind Sie sicher?", "RoleDeletionConfirmationMessage": "Die Rolle '{0}' wird gelöscht. Sind Sie sicher?",
"DisplayName:RoleName": "Rollenname", "DisplayName:RoleName": "Rollenname",
"DisplayName:UserName": "Benutzername", "DisplayName:UserName": "Benutzername",
"DisplayName:Name": "Name", "DisplayName:Name": "Name",
@ -32,72 +32,72 @@
"Permissions": "Berechtigungen", "Permissions": "Berechtigungen",
"DisplayName:CurrentPassword": "Aktuelles Passwort", "DisplayName:CurrentPassword": "Aktuelles Passwort",
"DisplayName:NewPassword": "Neues Passwort", "DisplayName:NewPassword": "Neues Passwort",
"DisplayName:NewPasswordConfirm": "Neues Passwort bestätigen", "DisplayName:NewPasswordConfirm": "Neues Passwort bestätigen",
"PasswordChangedMessage": "Ihr Passwort wurde erfolgreich geändert.", "PasswordChangedMessage": "Ihr Passwort wurde erfolgreich geändert.",
"PersonalSettingsSavedMessage": "Ihre persönlichen Einstellungen wurden erfolgreich gespeichert.", "PersonalSettingsSavedMessage": "Ihre persönlichen Einstellungen wurden erfolgreich gespeichert.",
"Identity.DefaultError": "Ein unbekannter Fehler ist aufgetreten.", "Identity.DefaultError": "Ein unbekannter Fehler ist aufgetreten.",
"Identity.ConcurrencyFailure": "Optimistischer Nebenläufigkeitsfehler, Objekt wurde geändert.", "Identity.ConcurrencyFailure": "Optimistischer Nebenläufigkeitsfehler, Objekt wurde geändert.",
"Identity.DuplicateEmail": "E-Mail '{0}' ist bereits vergeben.", "Identity.DuplicateEmail": "E-Mail '{0}' ist bereits vergeben.",
"Identity.DuplicateRoleName": "Der Rollenname '{0}' ist bereits vergeben.", "Identity.DuplicateRoleName": "Der Rollenname '{0}' ist bereits vergeben.",
"Identity.DuplicateUserName": "Der Benutzername '{0}' ist bereits vergeben.", "Identity.DuplicateUserName": "Der Benutzername '{0}' ist bereits vergeben.",
"Identity.InvalidEmail": "E-Mail '{0}' ist ungültig.", "Identity.InvalidEmail": "E-Mail '{0}' ist ungültig.",
"Identity.InvalidPasswordHasherCompatibilityMode": "Der angegebene PasswordHasherCompatibilityMode ist ungültig.", "Identity.InvalidPasswordHasherCompatibilityMode": "Der angegebene PasswordHasherCompatibilityMode ist ungültig.",
"Identity.InvalidPasswordHasherIterationCount": "Die Iterationszahl muss eine positive Ganzzahl sein.", "Identity.InvalidPasswordHasherIterationCount": "Die Iterationszahl muss eine positive Ganzzahl sein.",
"Identity.InvalidRoleName": "Der Rollenname '{0}' ist ungültig.", "Identity.InvalidRoleName": "Der Rollenname '{0}' ist ungültig.",
"Identity.InvalidToken": "Ungültiges Token.", "Identity.InvalidToken": "Ungültiges Token.",
"Identity.InvalidUserName": "Benutzername '{0}' ist ungültig, kann nur Buchstaben oder Ziffern enthalten.", "Identity.InvalidUserName": "Benutzername '{0}' ist ungültig, kann nur Buchstaben oder Ziffern enthalten.",
"Identity.LoginAlreadyAssociated": "Ein Benutzer mit diesem Login existiert bereits.", "Identity.LoginAlreadyAssociated": "Ein Benutzer mit diesem Login existiert bereits.",
"Identity.PasswordMismatch": "Falsches Passwort.", "Identity.PasswordMismatch": "Falsches Passwort.",
"Identity.PasswordRequiresDigit": "Passwörter müssen mindestens eine Ziffer ('0'-'9') enthalten.", "Identity.PasswordRequiresDigit": "Passwörter müssen mindestens eine Ziffer ('0'-'9') enthalten.",
"Identity.PasswordRequiresLower": "Passwörter müssen mindestens einen Kleinbuchstaben ('a'-'z') enthalten.", "Identity.PasswordRequiresLower": "Passwörter müssen mindestens einen Kleinbuchstaben ('a'-'z') enthalten.",
"Identity.PasswordRequiresNonAlphanumeric": "Passwörter müssen mindestens ein Sonderzeichen enthalten.", "Identity.PasswordRequiresNonAlphanumeric": "Passwörter müssen mindestens ein Sonderzeichen enthalten.",
"Identity.PasswordRequiresUpper": "Passwörter müssen mindestens einen Großbuchstaben ('A'-'Z') enthalten.", "Identity.PasswordRequiresUpper": "Passwörter müssen mindestens einen Großbuchstaben ('A'-'Z') enthalten.",
"Identity.PasswordTooShort": "Passwörter müssen mindestens {0} Zeichen enthalten.", "Identity.PasswordTooShort": "Passwörter müssen mindestens {0} Zeichen enthalten.",
"Identity.RoleNotFound": "Die Rolle {0} existiert nicht.", "Identity.RoleNotFound": "Die Rolle {0} existiert nicht.",
"Identity.UserAlreadyHasPassword": "Der Benutzer hat bereits ein Passwort gesetzt.", "Identity.UserAlreadyHasPassword": "Der Benutzer hat bereits ein Passwort gesetzt.",
"Identity.UserAlreadyInRole": "Benutzer ist bereits in der Rolle '{0}'.", "Identity.UserAlreadyInRole": "Benutzer ist bereits in der Rolle '{0}'.",
"Identity.UserLockedOut": "Benutzer ist ausgesperrt.", "Identity.UserLockedOut": "Benutzer ist ausgesperrt.",
"Identity.UserLockoutNotEnabled": "Aussperrung ist für diesen Benutzer nicht aktiviert.", "Identity.UserLockoutNotEnabled": "Aussperrung ist für diesen Benutzer nicht aktiviert.",
"Identity.UserNameNotFound": "Benutzer {0} existiert nicht.", "Identity.UserNameNotFound": "Benutzer {0} existiert nicht.",
"Identity.UserNotInRole": "Benutzer ist nicht in der Rolle '{0}'.", "Identity.UserNotInRole": "Benutzer ist nicht in der Rolle '{0}'.",
"Identity.PasswordConfirmationFailed": "Passwort stimmt nicht mit dem Bestätigungspasswort überein.", "Identity.PasswordConfirmationFailed": "Passwort stimmt nicht mit dem Bestätigungspasswort überein.",
"Identity.StaticRoleRenamingErrorMessage": "Statische Rollen können nicht umbenannt werden.", "Identity.StaticRoleRenamingErrorMessage": "Statische Rollen können nicht umbenannt werden.",
"Identity.StaticRoleDeletionErrorMessage": "Statische Rollen können nicht gelöscht werden.", "Identity.StaticRoleDeletionErrorMessage": "Statische Rollen können nicht gelöscht werden.",
"Volo.Abp.Identity:010001": "Sie können Ihr eigenes Konto nicht löschen!", "Volo.Abp.Identity:010001": "Sie können Ihr eigenes Konto nicht löschen!",
"Permission:IdentityManagement": "Identitätsverwaltung", "Permission:IdentityManagement": "Identitätsverwaltung",
"Permission:RoleManagement": "Rollenverwaltung", "Permission:RoleManagement": "Rollenverwaltung",
"Permission:Create": "Erstellen", "Permission:Create": "Erstellen",
"Permission:Edit": "Bearbeiten", "Permission:Edit": "Bearbeiten",
"Permission:Delete": "Löschen", "Permission:Delete": "Löschen",
"Permission:ChangePermissions": "Berechtigungen ändern", "Permission:ChangePermissions": "Berechtigungen ändern",
"Permission:UserManagement": "Benutzerverwaltung", "Permission:UserManagement": "Benutzerverwaltung",
"Permission:UserLookup": "Benutzer-Lookup", "Permission:UserLookup": "Benutzer-Lookup",
"DisplayName:Abp.Identity.Password.RequiredLength": "Erforderliche Länge", "DisplayName:Abp.Identity.Password.RequiredLength": "Erforderliche Länge",
"DisplayName:Abp.Identity.Password.RequiredUniqueChars": "Erforderliche eindeutige Zeichenanzahl", "DisplayName:Abp.Identity.Password.RequiredUniqueChars": "Erforderliche eindeutige Zeichenanzahl",
"DisplayName:Abp.Identity.Password.RequireNonAlphanumeric": "Erforderliches Sonderzeichen", "DisplayName:Abp.Identity.Password.RequireNonAlphanumeric": "Erforderliches Sonderzeichen",
"DisplayName:Abp.Identity.Password.RequireLowercase": "Erforderliche Kleinbuchstaben", "DisplayName:Abp.Identity.Password.RequireLowercase": "Erforderliche Kleinbuchstaben",
"DisplayName:Abp.Identity.Password.RequireUppercase": "Erforderliche Großbuchstaben", "DisplayName:Abp.Identity.Password.RequireUppercase": "Erforderliche Großbuchstaben",
"DisplayName:Abp.Identity.Password.RequireDigit": "Erforderliche Ziffer", "DisplayName:Abp.Identity.Password.RequireDigit": "Erforderliche Ziffer",
"DisplayName:Abp.Identity.Lockout.AllowedForNewUsers": "Aktiviert für neue Benutzer", "DisplayName:Abp.Identity.Lockout.AllowedForNewUsers": "Aktiviert für neue Benutzer",
"DisplayName:Abp.Identity.Lockout.LockoutDuration": "Aussperrdauer (Sekunden)", "DisplayName:Abp.Identity.Lockout.LockoutDuration": "Aussperrdauer (Sekunden)",
"DisplayName:Abp.Identity.Lockout.MaxFailedAccessAttempts": "Max fehlgeschlagene Zugriffsversuche", "DisplayName:Abp.Identity.Lockout.MaxFailedAccessAttempts": "Max fehlgeschlagene Zugriffsversuche",
"DisplayName:Abp.Identity.SignIn.RequireConfirmedEmail": "Bestätigte E-Mail erforderlich", "DisplayName:Abp.Identity.SignIn.RequireConfirmedEmail": "Bestätigte E-Mail erforderlich",
"DisplayName:Abp.Identity.SignIn.EnablePhoneNumberConfirmation": "Telefonnummer-Bestätigung aktivieren", "DisplayName:Abp.Identity.SignIn.EnablePhoneNumberConfirmation": "Telefonnummer-Bestätigung aktivieren",
"DisplayName:Abp.Identity.SignIn.RequireConfirmedPhoneNumber": "Bestätigte Telefonnummer erforderlich", "DisplayName:Abp.Identity.SignIn.RequireConfirmedPhoneNumber": "Bestätigte Telefonnummer erforderlich",
"DisplayName:Abp.Identity.User.IsUserNameUpdateEnabled": "Ist die Aktualisierung des Benutzernamens aktiviert?", "DisplayName:Abp.Identity.User.IsUserNameUpdateEnabled": "Ist die Aktualisierung des Benutzernamens aktiviert?",
"DisplayName:Abp.Identity.User.IsEmailUpdateEnabled": "Ist die E-Mail-Aktualisierung aktiviert?", "DisplayName:Abp.Identity.User.IsEmailUpdateEnabled": "Ist die E-Mail-Aktualisierung aktiviert?",
"Description:Abp.Identity.Password.RequiredLength": "Die Mindestlänge, die ein Passwort haben muss.", "Description:Abp.Identity.Password.RequiredLength": "Die Mindestlänge, die ein Passwort haben muss.",
"Description:Abp.Identity.Password.RequiredUniqueChars": "Die Mindestanzahl eindeutiger Zeichen, die ein Passwort enthalten muss.", "Description:Abp.Identity.Password.RequiredUniqueChars": "Die Mindestanzahl eindeutiger Zeichen, die ein Passwort enthalten muss.",
"Description:Abp.Identity.Password.RequireNonAlphanumeric": "Ob Passwörter ein nicht-alphanumerisches Zeichen enthalten müssen.", "Description:Abp.Identity.Password.RequireNonAlphanumeric": "Ob Passwörter ein nicht-alphanumerisches Zeichen enthalten müssen.",
"Description:Abp.Identity.Password.RequireLowercase": "Ob Passwörter ein kleingeschriebenes ASCII-Zeichen enthalten müssen.", "Description:Abp.Identity.Password.RequireLowercase": "Ob Passwörter ein kleingeschriebenes ASCII-Zeichen enthalten müssen.",
"Description:Abp.Identity.Password.RequireUppercase": "Ob Passwörter ein ASCII-Zeichen in Großbuchstaben enthalten müssen.", "Description:Abp.Identity.Password.RequireUppercase": "Ob Passwörter ein ASCII-Zeichen in Großbuchstaben enthalten müssen.",
"Description:Abp.Identity.Password.RequireDigit": "Ob Passwörter eine Ziffer enthalten müssen.", "Description:Abp.Identity.Password.RequireDigit": "Ob Passwörter eine Ziffer enthalten müssen.",
"Description:Abp.Identity.Lockout.AllowedForNewUsers": "Ob ein neuer Benutzer ausgesperrt werden kann.", "Description:Abp.Identity.Lockout.AllowedForNewUsers": "Ob ein neuer Benutzer ausgesperrt werden kann.",
"Description:Abp.Identity.Lockout.LockoutDuration": "Die Dauer, für die ein Benutzer ausgesperrt ist, wenn eine Sperre auftritt.", "Description:Abp.Identity.Lockout.LockoutDuration": "Die Dauer, für die ein Benutzer ausgesperrt ist, wenn eine Sperre auftritt.",
"Description:Abp.Identity.Lockout.MaxFailedAccessAttempts": "Die Anzahl der fehlgeschlagenen Zugriffsversuche, die erlaubt sind, bevor ein Benutzer gesperrt wird, vorausgesetzt, die Sperre ist aktiviert.", "Description:Abp.Identity.Lockout.MaxFailedAccessAttempts": "Die Anzahl der fehlgeschlagenen Zugriffsversuche, die erlaubt sind, bevor ein Benutzer gesperrt wird, vorausgesetzt, die Sperre ist aktiviert.",
"Description:Abp.Identity.SignIn.RequireConfirmedEmail": "Whether a confirmed email address is required to sign in.", "Description:Abp.Identity.SignIn.RequireConfirmedEmail": "Whether a confirmed email address is required to sign in.",
"Description:Abp.Identity.SignIn.EnablePhoneNumberConfirmation": "Ob für die Anmeldung eine bestätigte E-Mail-Adresse erforderlich ist.", "Description:Abp.Identity.SignIn.EnablePhoneNumberConfirmation": "Ob für die Anmeldung eine bestätigte E-Mail-Adresse erforderlich ist.",
"Description:Abp.Identity.SignIn.RequireConfirmedPhoneNumber": "Ob für die Anmeldung eine bestätigte Telefonnummer erforderlich ist.", "Description:Abp.Identity.SignIn.RequireConfirmedPhoneNumber": "Ob für die Anmeldung eine bestätigte Telefonnummer erforderlich ist.",
"Description:Abp.Identity.User.IsUserNameUpdateEnabled": "Ob der Benutzername vom Benutzer aktualisiert werden kann.", "Description:Abp.Identity.User.IsUserNameUpdateEnabled": "Ob der Benutzername vom Benutzer aktualisiert werden kann.",
"Description:Abp.Identity.User.IsEmailUpdateEnabled": "Ob die E-Mail durch den Benutzer aktualisiert werden kann." "Description:Abp.Identity.User.IsEmailUpdateEnabled": "Ob die E-Mail durch den Benutzer aktualisiert werden kann."
} }

120
modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Roles/index.js

@ -1,81 +1,108 @@
(function ($) { (function ($) {
var l = abp.localization.getResource('AbpIdentity'); var l = abp.localization.getResource('AbpIdentity');
var _identityRoleAppService = volo.abp.identity.identityRole; var _identityRoleAppService = volo.abp.identity.identityRole;
var _permissionsModal = new abp.ModalManager(abp.appPath + 'AbpPermissionManagement/PermissionManagementModal'); var _permissionsModal = new abp.ModalManager(
var _editModal = new abp.ModalManager(abp.appPath + 'Identity/Roles/EditModal'); abp.appPath + 'AbpPermissionManagement/PermissionManagementModal'
var _createModal = new abp.ModalManager(abp.appPath + 'Identity/Roles/CreateModal'); );
var _editModal = new abp.ModalManager(
abp.appPath + 'Identity/Roles/EditModal'
);
var _createModal = new abp.ModalManager(
abp.appPath + 'Identity/Roles/CreateModal'
);
$(function () { $(function () {
var _$wrapper = $('#IdentityRolesWrapper'); var _$wrapper = $('#IdentityRolesWrapper');
var _$table = _$wrapper.find('table'); var _$table = _$wrapper.find('table');
var _dataTable = _$table.DataTable(abp.libs.datatables.normalizeConfiguration({ var _dataTable = _$table.DataTable(
order: [[1, "asc"]], abp.libs.datatables.normalizeConfiguration({
searching: false, order: [[1, 'asc']],
processing: true, searching: false,
serverSide: true, processing: true,
scrollX: true, serverSide: true,
paging: true, scrollX: true,
ajax: abp.libs.datatables.createAjax(_identityRoleAppService.getList), paging: true,
columnDefs: [ ajax: abp.libs.datatables.createAjax(
{ _identityRoleAppService.getList
rowAction: { ),
items: columnDefs: [
[ {
rowAction: {
items: [
{ {
text: l('Edit'), text: l('Edit'),
visible: abp.auth.isGranted('AbpIdentity.Roles.Update'), visible: abp.auth.isGranted(
'AbpIdentity.Roles.Update'
),
action: function (data) { action: function (data) {
_editModal.open({ _editModal.open({
id: data.record.id id: data.record.id,
}); });
} },
}, },
{ {
text: l('Permissions'), text: l('Permissions'),
visible: abp.auth.isGranted('AbpIdentity.Roles.ManagePermissions'), visible: abp.auth.isGranted(
'AbpIdentity.Roles.ManagePermissions'
),
action: function (data) { action: function (data) {
_permissionsModal.open({ _permissionsModal.open({
providerName: 'R', providerName: 'R',
providerKey: data.record.name providerKey: data.record.name,
}); });
} },
}, },
{ {
text: l('Delete'), text: l('Delete'),
visible: function (data) { visible: function (data) {
return !data.isStatic && abp.auth.isGranted('AbpIdentity.Roles.Delete'); //TODO: Check permission return (
!data.isStatic &&
abp.auth.isGranted(
'AbpIdentity.Roles.Delete'
)
); //TODO: Check permission
},
confirmMessage: function (data) {
return l(
'RoleDeletionConfirmationMessage',
data.record.name
);
}, },
confirmMessage: function (data) { return l('RoleDeletionConfirmationMessage', data.record.name)},
action: function (data) { action: function (data) {
_identityRoleAppService _identityRoleAppService
.delete(data.record.id) .delete(data.record.id)
.then(function () { .then(function () {
_dataTable.ajax.reload(); _dataTable.ajax.reload();
}); });
} },
} },
] ],
} },
}, },
{ {
data: "name", data: 'name',
render: function (data, type, row) { render: function (data, type, row) {
var name = '<span>' + data + '</span>'; var name = '<span>' + data + '</span>';
if (row.isDefault) { if (row.isDefault) {
name += '<span class="badge badge-pill badge-success ml-1">' + l('DisplayName:IsDefault') + '</span>'; name +=
} '<span class="badge badge-pill badge-success ml-1">' +
if (row.isPublic) { l('DisplayName:IsDefault') +
name += '<span class="badge badge-pill badge-info ml-1">' + l('DisplayName:IsPublic') + '</span>'; '</span>';
} }
return name; if (row.isPublic) {
} name +=
} '<span class="badge badge-pill badge-info ml-1">' +
] l('DisplayName:IsPublic') +
})); '</span>';
}
return name;
},
},
],
})
);
_createModal.onResult(function () { _createModal.onResult(function () {
_dataTable.ajax.reload(); _dataTable.ajax.reload();
@ -90,5 +117,4 @@
_createModal.open(); _createModal.open();
}); });
}); });
})(jQuery); })(jQuery);

101
modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Users/index.js

@ -1,73 +1,91 @@
(function ($) { (function ($) {
var l = abp.localization.getResource('AbpIdentity'); var l = abp.localization.getResource('AbpIdentity');
var _identityUserAppService = volo.abp.identity.identityUser; var _identityUserAppService = volo.abp.identity.identityUser;
var _editModal = new abp.ModalManager(abp.appPath + 'Identity/Users/EditModal'); var _editModal = new abp.ModalManager(
var _createModal = new abp.ModalManager(abp.appPath + 'Identity/Users/CreateModal'); abp.appPath + 'Identity/Users/EditModal'
var _permissionsModal = new abp.ModalManager(abp.appPath + 'AbpPermissionManagement/PermissionManagementModal'); );
var _createModal = new abp.ModalManager(
abp.appPath + 'Identity/Users/CreateModal'
);
var _permissionsModal = new abp.ModalManager(
abp.appPath + 'AbpPermissionManagement/PermissionManagementModal'
);
$(function () { $(function () {
var _$wrapper = $('#IdentityUsersWrapper'); var _$wrapper = $('#IdentityUsersWrapper');
var _$table = _$wrapper.find('table'); var _$table = _$wrapper.find('table');
var _dataTable = _$table.DataTable(abp.libs.datatables.normalizeConfiguration({ var _dataTable = _$table.DataTable(
order: [[1, "asc"]], abp.libs.datatables.normalizeConfiguration({
processing: true, order: [[1, 'asc']],
serverSide: true, processing: true,
scrollX: true, serverSide: true,
paging: true, scrollX: true,
ajax: abp.libs.datatables.createAjax(_identityUserAppService.getList), paging: true,
columnDefs: [ ajax: abp.libs.datatables.createAjax(
{ _identityUserAppService.getList
rowAction: { ),
items: columnDefs: [
[ {
rowAction: {
items: [
{ {
text: l('Edit'), text: l('Edit'),
visible: abp.auth.isGranted('AbpIdentity.Users.Update'), visible: abp.auth.isGranted(
'AbpIdentity.Users.Update'
),
action: function (data) { action: function (data) {
_editModal.open({ _editModal.open({
id: data.record.id id: data.record.id,
}); });
} },
}, },
{ {
text: l('Permissions'), text: l('Permissions'),
visible: abp.auth.isGranted('AbpIdentity.Users.ManagePermissions'), visible: abp.auth.isGranted(
'AbpIdentity.Users.ManagePermissions'
),
action: function (data) { action: function (data) {
_permissionsModal.open({ _permissionsModal.open({
providerName: 'U', providerName: 'U',
providerKey: data.record.id providerKey: data.record.id,
}); });
} },
}, },
{ {
text: l('Delete'), text: l('Delete'),
visible: abp.auth.isGranted('AbpIdentity.Users.Delete'), visible: abp.auth.isGranted(
confirmMessage: function (data) { return l('UserDeletionConfirmationMessage', data.record.userName); }, 'AbpIdentity.Users.Delete'
),
confirmMessage: function (data) {
return l(
'UserDeletionConfirmationMessage',
data.record.userName
);
},
action: function (data) { action: function (data) {
_identityUserAppService _identityUserAppService
.delete(data.record.id) .delete(data.record.id)
.then(function () { .then(function () {
_dataTable.ajax.reload(); _dataTable.ajax.reload();
}); });
} },
} },
] ],
} },
}, },
{ {
data: "userName" data: 'userName',
}, },
{ {
data: "email" data: 'email',
}, },
{ {
data: "phoneNumber" data: 'phoneNumber',
} },
] ],
})); })
);
_createModal.onResult(function () { _createModal.onResult(function () {
_dataTable.ajax.reload(); _dataTable.ajax.reload();
@ -82,5 +100,4 @@
_createModal.open(); _createModal.open();
}); });
}); });
})(jQuery); })(jQuery);

5
modules/identityserver/.prettierrc

@ -0,0 +1,5 @@
{
"singleQuote": true,
"useTabs": false,
"tabWidth": 4
}

2
modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/nl.json

@ -1,4 +1,4 @@
{ {
"culture": "nl", "culture": "nl",
"texts": { "texts": {
"Volo.IdentityServer:DuplicateIdentityResourceName": "Identiteitsbronnaam bestaat al: {Name}", "Volo.IdentityServer:DuplicateIdentityResourceName": "Identiteitsbronnaam bestaat al: {Name}",

5
modules/permission-management/.prettierrc

@ -0,0 +1,5 @@
{
"singleQuote": true,
"useTabs": false,
"tabWidth": 4
}

2
modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/de.json

@ -5,6 +5,6 @@
"OnlyProviderPermissons": "Nur dieser Anbieter", "OnlyProviderPermissons": "Nur dieser Anbieter",
"All": "Alle", "All": "Alle",
"SelectAllInAllTabs": "Alle Berechtigungen erteilen", "SelectAllInAllTabs": "Alle Berechtigungen erteilen",
"SelectAllInThisTab": "Alle auswählen" "SelectAllInThisTab": "Alle auswählen"
} }
} }

149
modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Pages/AbpPermissionManagement/permission-management-modal.js

@ -4,7 +4,9 @@
abp.modals.PermissionManagement = function () { abp.modals.PermissionManagement = function () {
function checkParents($tab, $checkBox) { function checkParents($tab, $checkBox) {
var parentName = $checkBox.closest('.custom-checkbox').attr('data-parent-name'); var parentName = $checkBox
.closest('.custom-checkbox')
.attr('data-parent-name');
if (!parentName) { if (!parentName) {
return; return;
} }
@ -20,7 +22,9 @@
} }
function uncheckChildren($tab, $checkBox) { function uncheckChildren($tab, $checkBox) {
var permissionName = $checkBox.closest('.custom-checkbox').attr('data-permission-name'); var permissionName = $checkBox
.closest('.custom-checkbox')
.attr('data-permission-name');
if (!permissionName) { if (!permissionName) {
return; return;
} }
@ -37,37 +41,45 @@
function handleTabCheckedCheckboxCount($tab) { function handleTabCheckedCheckboxCount($tab) {
var newCount = 0; var newCount = 0;
$tab.find('input[type="checkbox"]').not('[name="SelectAllInThisTab"]').each(function () { $tab.find('input[type="checkbox"]')
if ($(this).is(':checked') === true) { .not('[name="SelectAllInThisTab"]')
newCount++; .each(function () {
} if ($(this).is(':checked') === true) {
}); newCount++;
}
});
var $tabTitle = $('#' + $tab.attr('id') + '-tab'); var $tabTitle = $('#' + $tab.attr('id') + '-tab');
var title = $tabTitle.html() var title = $tabTitle
.replace('<b>','').replace('</b>','') .html()
.replace('<small>','').replace('</small>',''); .replace('<b>', '')
.replace('</b>', '')
.replace('<small>', '')
.replace('</small>', '');
var titleSplitted = title.split(' '); var titleSplitted = title.split(' ');
if (titleSplitted[titleSplitted.length-1].startsWith('(')){ if (titleSplitted[titleSplitted.length - 1].startsWith('(')) {
titleSplitted.pop(); titleSplitted.pop();
} }
var titleWithoutCount = titleSplitted.join(' '); var titleWithoutCount = titleSplitted.join(' ');
var newTitle = titleWithoutCount + ' (' + (newCount) + ')'; var newTitle = titleWithoutCount + ' (' + newCount + ')';
if (newCount > 0){ if (newCount > 0) {
newTitle = '<b>' + newTitle + '</b>' newTitle = '<b>' + newTitle + '</b>';
} } else {
else { newTitle = '<small>' + newTitle + '</small>';
newTitle = '<small>' + newTitle + '</small>'
} }
$tabTitle.html(newTitle) $tabTitle.html(newTitle);
}; }
function handleUncheck($tab) { function handleUncheck($tab) {
var $checkBox = $tab.find('input[name="SelectAllInThisTab"]'); var $checkBox = $tab.find('input[name="SelectAllInThisTab"]');
if ($checkBox.is(':checked')) { if ($checkBox.is(':checked')) {
if ($tab.find('input[type="checkbox"]').not('[name="SelectAllInThisTab"]').length > 1) { if (
$tab
.find('input[type="checkbox"]')
.not('[name="SelectAllInThisTab"]').length > 1
) {
$($checkBox).prop('indeterminate', true); $($checkBox).prop('indeterminate', true);
} else { } else {
$checkBox.prop('checked', false); $checkBox.prop('checked', false);
@ -75,11 +87,13 @@
} else if ($checkBox.is(':indeterminate')) { } else if ($checkBox.is(':indeterminate')) {
var allUnchecked = true; var allUnchecked = true;
$tab.find('input[type="checkbox"]').not('[name="SelectAllInThisTab"]').each(function () { $tab.find('input[type="checkbox"]')
if ($(this).is(':checked') === true) { .not('[name="SelectAllInThisTab"]')
allUnchecked = false; .each(function () {
} if ($(this).is(':checked') === true) {
}); allUnchecked = false;
}
});
if (allUnchecked) { if (allUnchecked) {
$($checkBox).prop('indeterminate', false); $($checkBox).prop('indeterminate', false);
@ -93,11 +107,13 @@
var allChecked = true; var allChecked = true;
$tab.find('input[type="checkbox"]').not('[name="SelectAllInThisTab"]').each(function () { $tab.find('input[type="checkbox"]')
if ($(this).is(':checked') === false) { .not('[name="SelectAllInThisTab"]')
allChecked = false; .each(function () {
} if ($(this).is(':checked') === false) {
}); allChecked = false;
}
});
if (allChecked) { if (allChecked) {
$($checkBox).prop('indeterminate', false); $($checkBox).prop('indeterminate', false);
@ -107,7 +123,6 @@
} }
} }
function initSelectAllInThisTab() { function initSelectAllInThisTab() {
var tabs = $('.tab-pane'); var tabs = $('.tab-pane');
for (var i = 0; i < tabs.length; i++) { for (var i = 0; i < tabs.length; i++) {
@ -117,13 +132,15 @@
var allChecked = true; var allChecked = true;
var allUnChecked = true; var allUnChecked = true;
$tab.find('input[type="checkbox"]').not('[name="SelectAllInThisTab"]').each(function () { $tab.find('input[type="checkbox"]')
if ($(this).is(':checked') === true) { .not('[name="SelectAllInThisTab"]')
allUnChecked = false; .each(function () {
} else { if ($(this).is(':checked') === true) {
allChecked = false; allUnChecked = false;
} } else {
}); allChecked = false;
}
});
if (allChecked) { if (allChecked) {
$($checkBox).prop('checked', true); $($checkBox).prop('checked', true);
@ -174,55 +191,65 @@
$el.find('.tab-pane').each(function () { $el.find('.tab-pane').each(function () {
var $tab = $(this); var $tab = $(this);
handleTabCheckedCheckboxCount($tab); handleTabCheckedCheckboxCount($tab);
$tab.find('input[type="checkbox"]').not('[name="SelectAllInThisTab"]').each(function () { $tab.find('input[type="checkbox"]')
var $checkBox = $(this); .not('[name="SelectAllInThisTab"]')
$checkBox.change(function () { .each(function () {
if ($checkBox.is(':checked')) { var $checkBox = $(this);
checkParents($tab, $checkBox); $checkBox.change(function () {
handleCheck($tab); if ($checkBox.is(':checked')) {
} else { checkParents($tab, $checkBox);
uncheckChildren($tab, $checkBox); handleCheck($tab);
handleUncheck($tab); } else {
} uncheckChildren($tab, $checkBox);
setSelectAllInAllTabs(); handleUncheck($tab);
handleTabCheckedCheckboxCount($tab); }
setSelectAllInAllTabs();
handleTabCheckedCheckboxCount($tab);
});
}); });
});
}); });
$('input[name="SelectAllInThisTab"]').change(function () { $('input[name="SelectAllInThisTab"]').change(function () {
var $checkBox = $(this); var $checkBox = $(this);
var $tab = $('#' + $checkBox.attr('data-tab-id')); var $tab = $('#' + $checkBox.attr('data-tab-id'));
if ($checkBox.is(':checked')) { if ($checkBox.is(':checked')) {
$tab.find('input[type="checkbox"]').not(':disabled').prop('checked', true); $tab.find('input[type="checkbox"]')
.not(':disabled')
.prop('checked', true);
} else { } else {
$tab.find('input[type="checkbox"]').not(':disabled').prop('checked', false); $tab.find('input[type="checkbox"]')
.not(':disabled')
.prop('checked', false);
} }
$($checkBox).prop('indeterminate', false); $($checkBox).prop('indeterminate', false);
setSelectAllInAllTabs(); setSelectAllInAllTabs();
handleTabCheckedCheckboxCount($tab) handleTabCheckedCheckboxCount($tab);
}); });
$('input[name="SelectAllInAllTabs"]').change(function () { $('input[name="SelectAllInAllTabs"]').change(function () {
var $checkBox = $(this); var $checkBox = $(this);
if ($checkBox.is(':checked')) { if ($checkBox.is(':checked')) {
$('.tab-pane input[type="checkbox"]').not(':disabled').prop('checked', true); $('.tab-pane input[type="checkbox"]')
.not(':disabled')
.prop('checked', true);
} else { } else {
$('.tab-pane input[type="checkbox"]').not(':disabled').prop('checked', false); $('.tab-pane input[type="checkbox"]')
.not(':disabled')
.prop('checked', false);
} }
$($checkBox).prop('indeterminate', false); $($checkBox).prop('indeterminate', false);
$el.find('.tab-pane').each(function () { $el.find('.tab-pane').each(function () {
handleTabCheckedCheckboxCount($(this)) handleTabCheckedCheckboxCount($(this));
}); });
}); });
$(function () { $(function () {
$(".custom-scroll-content").mCustomScrollbar({ $('.custom-scroll-content').mCustomScrollbar({
theme: "minimal-dark" theme: 'minimal-dark',
}); });
$(".custom-scroll-container > .col-4").mCustomScrollbar({ $('.custom-scroll-container > .col-4').mCustomScrollbar({
theme: "minimal-dark" theme: 'minimal-dark',
}); });
}); });

5
modules/setting-management/.prettierrc

@ -0,0 +1,5 @@
{
"singleQuote": true,
"useTabs": false,
"tabWidth": 4
}

6
modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Index.js

@ -1,7 +1,7 @@
(function ($) { (function ($) {
var l = abp.localization.getResource('AbpSettingManagement'); var l = abp.localization.getResource('AbpSettingManagement');
$(document).on("AbpSettingSaved", function () { $(document).on('AbpSettingSaved', function () {
abp.notify.success(l("SuccessfullySaved")); abp.notify.success(l('SuccessfullySaved'));
}); });
})(jQuery); })(jQuery);

5
modules/tenant-management/.prettierrc

@ -0,0 +1,5 @@
{
"singleQuote": true,
"useTabs": false,
"tabWidth": 4
}

4
modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/de.json

@ -6,14 +6,14 @@
"NewTenant": "Neuer Mandant", "NewTenant": "Neuer Mandant",
"TenantName": "Mandantenname", "TenantName": "Mandantenname",
"DisplayName:TenantName": "Mandantenname", "DisplayName:TenantName": "Mandantenname",
"TenantDeletionConfirmationMessage": "Der Mandant '{0}' wird gelöscht. Sind Sie sicher?", "TenantDeletionConfirmationMessage": "Der Mandant '{0}' wird gelöscht. Sind Sie sicher?",
"ConnectionStrings": "Verbindungszeichenfolgen", "ConnectionStrings": "Verbindungszeichenfolgen",
"DisplayName:DefaultConnectionString": "Standard Verbindungszeichenfolge", "DisplayName:DefaultConnectionString": "Standard Verbindungszeichenfolge",
"DisplayName:UseSharedDatabase": "Nutze die gemeinsame Datenbank", "DisplayName:UseSharedDatabase": "Nutze die gemeinsame Datenbank",
"Permission:TenantManagement": "Mandantenverwaltung", "Permission:TenantManagement": "Mandantenverwaltung",
"Permission:Create": "Erstellen", "Permission:Create": "Erstellen",
"Permission:Edit": "Bearbeiten", "Permission:Edit": "Bearbeiten",
"Permission:Delete": "Löschen", "Permission:Delete": "Löschen",
"Permission:ManageConnectionStrings": "Verbindungszeichenfolgen verwalten", "Permission:ManageConnectionStrings": "Verbindungszeichenfolgen verwalten",
"Permission:ManageFeatures": "Funktionen verwalten", "Permission:ManageFeatures": "Funktionen verwalten",
"DisplayName:AdminEmailAddress": "Admin E-Mail-Adresse", "DisplayName:AdminEmailAddress": "Admin E-Mail-Adresse",

4
modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/nl.json

@ -16,7 +16,7 @@
"Permission:Delete": "Verwijder", "Permission:Delete": "Verwijder",
"Permission:ManageConnectionStrings": "Beheer connection strings", "Permission:ManageConnectionStrings": "Beheer connection strings",
"Permission:ManageFeatures": "Beheer functies", "Permission:ManageFeatures": "Beheer functies",
"DisplayName:AdminEmailAddress": "Admin e-mail adres", "DisplayName:AdminEmailAddress": "Admin e-mail adres",
"DisplayName:AdminPassword": "Admin wachtwoord" "DisplayName:AdminPassword": "Admin wachtwoord"
} }
} }

18
modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Pages/TenantManagement/Tenants/ConnectionStringsModal.js

@ -1,20 +1,20 @@
(function ($) { (function ($) {
abp.modals.TenantConnectionStringManagement = function () {
abp.modals.TenantConnectionStringManagement = function() {
var initModal = function (publicApi, args) { var initModal = function (publicApi, args) {
publicApi.getModal() publicApi
.getModal()
.find('input[name="Tenant.UseSharedDatabase"]') .find('input[name="Tenant.UseSharedDatabase"]')
.change(function () { .change(function () {
var $this = $(this); var $this = $(this);
$("#Tenant_DefaultConnectionString_Wrap").toggleClass("d-none"); $('#Tenant_DefaultConnectionString_Wrap').toggleClass(
$this.val($this.prop("checked")); 'd-none'
);
$this.val($this.prop('checked'));
}); });
}; };
return { return {
initModal: initModal initModal: initModal,
}; };
}; };
})(jQuery);
})(jQuery);

110
modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Pages/TenantManagement/Tenants/Index.js

@ -1,80 +1,99 @@
(function () { (function () {
var l = abp.localization.getResource('AbpTenantManagement'); var l = abp.localization.getResource('AbpTenantManagement');
var _tenantAppService = volo.abp.tenantManagement.tenant; var _tenantAppService = volo.abp.tenantManagement.tenant;
var _editModal = new abp.ModalManager(abp.appPath + 'TenantManagement/Tenants/EditModal'); var _editModal = new abp.ModalManager(
var _createModal = new abp.ModalManager(abp.appPath + 'TenantManagement/Tenants/CreateModal'); abp.appPath + 'TenantManagement/Tenants/EditModal'
var _featuresModal = new abp.ModalManager(abp.appPath + 'FeatureManagement/FeatureManagementModal'); );
var _createModal = new abp.ModalManager(
abp.appPath + 'TenantManagement/Tenants/CreateModal'
);
var _featuresModal = new abp.ModalManager(
abp.appPath + 'FeatureManagement/FeatureManagementModal'
);
var _connectionStringsModal = new abp.ModalManager({ var _connectionStringsModal = new abp.ModalManager({
viewUrl: abp.appPath + 'TenantManagement/Tenants/ConnectionStringsModal', viewUrl:
modalClass: 'TenantConnectionStringManagement' abp.appPath + 'TenantManagement/Tenants/ConnectionStringsModal',
modalClass: 'TenantConnectionStringManagement',
}); });
$(function () { $(function () {
var _$wrapper = $('#TenantsWrapper'); var _$wrapper = $('#TenantsWrapper');
var _dataTable = _$wrapper.find('table').DataTable(abp.libs.datatables.normalizeConfiguration({ var _dataTable = _$wrapper.find('table').DataTable(
order: [[1, "asc"]], abp.libs.datatables.normalizeConfiguration({
processing: true, order: [[1, 'asc']],
paging: true, processing: true,
scrollX: true, paging: true,
serverSide: true, scrollX: true,
ajax: abp.libs.datatables.createAjax(_tenantAppService.getList), serverSide: true,
columnDefs: [ ajax: abp.libs.datatables.createAjax(_tenantAppService.getList),
{ columnDefs: [
rowAction: { {
items: rowAction: {
[ items: [
{ {
text: l('Edit'), text: l('Edit'),
visible: abp.auth.isGranted('AbpTenantManagement.Tenants.Update'), visible: abp.auth.isGranted(
'AbpTenantManagement.Tenants.Update'
),
action: function (data) { action: function (data) {
_editModal.open({ _editModal.open({
id: data.record.id id: data.record.id,
}); });
} },
}, },
{ {
text: l('ConnectionStrings'), text: l('ConnectionStrings'),
visible: abp.auth.isGranted('AbpTenantManagement.Tenants.ManageConnectionStrings'), visible: abp.auth.isGranted(
action: function (data) { 'AbpTenantManagement.Tenants.ManageConnectionStrings'
_connectionStringsModal.open({ ),
id: data.record.id action: function (data) {
}); _connectionStringsModal.open({
} id: data.record.id,
}, });
},
},
{ {
text: l('Features'), text: l('Features'),
visible: abp.auth.isGranted('AbpTenantManagement.Tenants.ManageFeatures'), visible: abp.auth.isGranted(
'AbpTenantManagement.Tenants.ManageFeatures'
),
action: function (data) { action: function (data) {
_featuresModal.open({ _featuresModal.open({
providerName: 'T', providerName: 'T',
providerKey: data.record.id providerKey: data.record.id,
}); });
} },
}, },
{ {
text: l('Delete'), text: l('Delete'),
visible: abp.auth.isGranted('AbpTenantManagement.Tenants.Delete'), visible: abp.auth.isGranted(
confirmMessage: function (data) { return l('TenantDeletionConfirmationMessage', data.record.name)}, 'AbpTenantManagement.Tenants.Delete'
),
confirmMessage: function (data) {
return l(
'TenantDeletionConfirmationMessage',
data.record.name
);
},
action: function (data) { action: function (data) {
_tenantAppService _tenantAppService
.delete(data.record.id) .delete(data.record.id)
.then(function () { .then(function () {
_dataTable.ajax.reload(); _dataTable.ajax.reload();
}); });
} },
} },
] ],
} },
}, },
{ {
data: "name" data: 'name',
} },
] ],
})); })
);
_createModal.onResult(function () { _createModal.onResult(function () {
_dataTable.ajax.reload(); _dataTable.ajax.reload();
@ -89,5 +108,4 @@
_createModal.open(); _createModal.open();
}); });
}); });
})(); })();

5
modules/users/.prettierrc

@ -0,0 +1,5 @@
{
"singleQuote": true,
"useTabs": false,
"tabWidth": 4
}

5
modules/virtual-file-explorer/.prettierrc

@ -0,0 +1,5 @@
{
"singleQuote": true,
"useTabs": false,
"tabWidth": 4
}

6
modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Pages/VirtualFileExplorer/index.js

@ -1,7 +1,9 @@
var _fileContentModal = new abp.ModalManager(abp.appPath + 'VirtualFileExplorer/FileContentModal'); var _fileContentModal = new abp.ModalManager(
abp.appPath + 'VirtualFileExplorer/FileContentModal'
);
function showContent(filePath) { function showContent(filePath) {
_fileContentModal.open({ _fileContentModal.open({
filePath: filePath filePath: filePath,
}); });
} }

5
npm/ng-packs/packages/core/src/lib/actions/replaceable-components.actions.ts

@ -5,5 +5,8 @@ import { ReplaceableComponents } from '../models/replaceable-components';
*/ */
export class AddReplaceableComponent { export class AddReplaceableComponent {
static readonly type = '[ReplaceableComponents] Add'; static readonly type = '[ReplaceableComponents] Add';
constructor(public payload: ReplaceableComponents.ReplaceableComponent) {} constructor(
public payload: ReplaceableComponents.ReplaceableComponent,
public reload?: boolean,
) {}
} }

15
npm/ng-packs/packages/core/src/lib/components/dynamic-layout.component.ts

@ -24,6 +24,13 @@ import { TreeNode } from '../utils/tree-utils';
export class DynamicLayoutComponent implements OnDestroy { export class DynamicLayoutComponent implements OnDestroy {
layout: Type<any>; layout: Type<any>;
// TODO: Consider a shared enum (eThemeSharedComponents) for known layouts
readonly layouts = new Map([
['application', 'Theme.ApplicationLayoutComponent'],
['account', 'Theme.AccountLayoutComponent'],
['empty', 'Theme.EmptyLayoutComponent'],
]);
isLayoutVisible = true; isLayoutVisible = true;
constructor( constructor(
@ -36,11 +43,6 @@ export class DynamicLayoutComponent implements OnDestroy {
const route = injector.get(ActivatedRoute); const route = injector.get(ActivatedRoute);
const router = injector.get(Router); const router = injector.get(Router);
const routes = injector.get(RoutesService); const routes = injector.get(RoutesService);
const layouts = {
application: this.getComponent('Theme.ApplicationLayoutComponent'),
account: this.getComponent('Theme.AccountLayoutComponent'),
empty: this.getComponent('Theme.EmptyLayoutComponent'),
};
router.events.pipe(takeUntilDestroy(this)).subscribe(event => { router.events.pipe(takeUntilDestroy(this)).subscribe(event => {
if (event instanceof NavigationEnd) { if (event instanceof NavigationEnd) {
@ -62,7 +64,8 @@ export class DynamicLayoutComponent implements OnDestroy {
if (!expectedLayout) expectedLayout = eLayoutType.empty; if (!expectedLayout) expectedLayout = eLayoutType.empty;
this.layout = layouts[expectedLayout].component; const key = this.layouts.get(expectedLayout);
this.layout = this.getComponent(key).component;
} }
}); });

17
npm/ng-packs/packages/core/src/lib/guards/permission.guard.ts

@ -1,12 +1,11 @@
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { ActivatedRouteSnapshot, CanActivate, RouterStateSnapshot, Router } from '@angular/router'; import { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot } from '@angular/router';
import { Store } from '@ngxs/store'; import { Store } from '@ngxs/store';
import { Observable, of } from 'rxjs'; import { Observable, of } from 'rxjs';
import { tap } from 'rxjs/operators'; import { tap } from 'rxjs/operators';
import snq from 'snq';
import { RestOccurError } from '../actions/rest.actions'; import { RestOccurError } from '../actions/rest.actions';
import { ConfigState } from '../states/config.state';
import { RoutesService } from '../services/routes.service'; import { RoutesService } from '../services/routes.service';
import { ConfigState } from '../states/config.state';
import { findRoute, getRoutePath } from '../utils/route-utils'; import { findRoute, getRoutePath } from '../utils/route-utils';
@Injectable({ @Injectable({
@ -15,18 +14,16 @@ import { findRoute, getRoutePath } from '../utils/route-utils';
export class PermissionGuard implements CanActivate { export class PermissionGuard implements CanActivate {
constructor(private router: Router, private routes: RoutesService, private store: Store) {} constructor(private router: Router, private routes: RoutesService, private store: Store) {}
canActivate( canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> {
route: ActivatedRouteSnapshot,
state: RouterStateSnapshot,
): Observable<boolean> | boolean {
let { requiredPolicy } = route.data || {}; let { requiredPolicy } = route.data || {};
if (!requiredPolicy) { if (!requiredPolicy) {
requiredPolicy = findRoute(this.routes, getRoutePath(this.router, state.url))?.requiredPolicy; const route = findRoute(this.routes, getRoutePath(this.router, state.url));
requiredPolicy = route?.requiredPolicy;
if (!requiredPolicy) return true;
} }
if (!requiredPolicy) return of(true);
return this.store.select(ConfigState.getGrantedPolicy(requiredPolicy)).pipe( return this.store.select(ConfigState.getGrantedPolicy(requiredPolicy)).pipe(
tap(access => { tap(access => {
if (!access) { if (!access) {

30
npm/ng-packs/packages/core/src/lib/states/replaceable-components.state.ts

@ -1,8 +1,10 @@
import { Injectable } from '@angular/core'; import { noop } from '@abp/ng.core';
import { State, Action, StateContext, Selector, createSelector } from '@ngxs/store'; import { Injectable, NgZone } from '@angular/core';
import { Router } from '@angular/router';
import { Action, createSelector, Selector, State, StateContext } from '@ngxs/store';
import snq from 'snq';
import { AddReplaceableComponent } from '../actions/replaceable-components.actions'; import { AddReplaceableComponent } from '../actions/replaceable-components.actions';
import { ReplaceableComponents } from '../models/replaceable-components'; import { ReplaceableComponents } from '../models/replaceable-components';
import snq from 'snq';
@State<ReplaceableComponents.State>({ @State<ReplaceableComponents.State>({
name: 'ReplaceableComponentsState', name: 'ReplaceableComponentsState',
@ -28,10 +30,28 @@ export class ReplaceableComponentsState {
return selector; return selector;
} }
constructor(private ngZone: NgZone, private router: Router) {}
// TODO: Create a shared service for route reload and more
private reloadRoute() {
const { shouldReuseRoute } = this.router.routeReuseStrategy;
const setRouteReuse = (reuse: typeof shouldReuseRoute) => {
this.router.routeReuseStrategy.shouldReuseRoute = reuse;
};
setRouteReuse(() => false);
this.router.navigated = false;
this.ngZone.run(async () => {
await this.router.navigateByUrl(this.router.url).catch(noop);
setRouteReuse(shouldReuseRoute);
});
}
@Action(AddReplaceableComponent) @Action(AddReplaceableComponent)
replaceableComponentsAction( replaceableComponentsAction(
{ getState, patchState }: StateContext<ReplaceableComponents.State>, { getState, patchState }: StateContext<ReplaceableComponents.State>,
{ payload }: AddReplaceableComponent, { payload, reload }: AddReplaceableComponent,
) { ) {
let { replaceableComponents } = getState(); let { replaceableComponents } = getState();
@ -48,5 +68,7 @@ export class ReplaceableComponentsState {
patchState({ patchState({
replaceableComponents, replaceableComponents,
}); });
if (reload) this.reloadRoute();
} }
} }

74
npm/ng-packs/packages/core/src/lib/tests/permission.guard.spec.ts

@ -1,22 +1,57 @@
import { APP_BASE_HREF } from '@angular/common';
import { Component } from '@angular/core';
import { RouterModule } from '@angular/router';
import { createServiceFactory, SpectatorService, SpyObject } from '@ngneat/spectator/jest'; import { createServiceFactory, SpectatorService, SpyObject } from '@ngneat/spectator/jest';
import { Store } from '@ngxs/store'; import { Actions, Store } from '@ngxs/store';
import { of } from 'rxjs'; import { of } from 'rxjs';
import { PermissionGuard } from '../guards/permission.guard';
import { RestOccurError } from '../actions'; import { RestOccurError } from '../actions';
import { PermissionGuard } from '../guards/permission.guard';
import { RoutesService } from '../services/routes.service';
describe('PermissionGuard', () => { describe('PermissionGuard', () => {
let spectator: SpectatorService<PermissionGuard>; let spectator: SpectatorService<PermissionGuard>;
let guard: PermissionGuard; let guard: PermissionGuard;
let routes: SpyObject<RoutesService>;
let store: SpyObject<Store>; let store: SpyObject<Store>;
@Component({ template: '' })
class DummyComponent {}
const createService = createServiceFactory({ const createService = createServiceFactory({
service: PermissionGuard, service: PermissionGuard,
mocks: [Store], mocks: [Store],
declarations: [DummyComponent],
imports: [
RouterModule.forRoot([
{
path: 'test',
component: DummyComponent,
data: {
requiredPolicy: 'TestPolicy',
},
},
]),
],
providers: [
{
provide: APP_BASE_HREF,
useValue: '/',
},
{
provide: Actions,
useValue: {
pipe() {
return of(null);
},
},
},
],
}); });
beforeEach(() => { beforeEach(() => {
spectator = createService(); spectator = createService();
guard = spectator.service; guard = spectator.service;
routes = spectator.inject(RoutesService);
store = spectator.get(Store); store = spectator.get(Store);
}); });
@ -41,17 +76,32 @@ describe('PermissionGuard', () => {
}); });
}); });
it('should find the requiredPolicy from child route', done => { it('should check the requiredPolicy from RoutesService', done => {
routes.add([
{
path: '/test',
name: 'Test',
requiredPolicy: 'TestPolicy',
},
]);
store.select.andReturn(of(false)); store.select.andReturn(of(false));
const spy = jest.spyOn(store, 'select'); const spy = jest.spyOn(store, 'select');
guard guard.canActivate({ data: {} } as any, { url: 'test' } as any).subscribe(() => {
.canActivate( expect(spy.mock.calls[0][0]({ auth: { grantedPolicies: { TestPolicy: true } } })).toBe(true);
{ data: {}, routeConfig: { children: [{ path: 'test', data: { requiredPolicy: 'TestPolicy' } }] } } as any, done();
{ url: 'test' } as any, });
) });
.subscribe(() => {
expect(spy.mock.calls[0][0]({ auth: { grantedPolicies: { TestPolicy: true } } })).toBe(true); it('should return Observable<true> if RoutesService does not have requiredPolicy for given URL', done => {
done(); routes.add([
}); {
path: '/test',
name: 'Test',
},
]);
guard.canActivate({ data: {} } as any, { url: 'test' } as any).subscribe(result => {
expect(result).toBe(true);
done();
});
}); });
}); });

24
npm/ng-packs/packages/core/src/lib/tests/replaceable-components.state.spec.ts

@ -1,21 +1,27 @@
import { APP_BASE_HREF } from '@angular/common';
import { Component } from '@angular/core';
import { Router, RouterModule } from '@angular/router';
import { SpyObject } from '@ngneat/spectator';
import { createHostFactory, SpectatorHost } from '@ngneat/spectator/jest'; import { createHostFactory, SpectatorHost } from '@ngneat/spectator/jest';
import { NgxsModule, Store } from '@ngxs/store'; import { NgxsModule, Store } from '@ngxs/store';
import { ReplaceableComponentsState } from '../states/replaceable-components.state';
import { Component } from '@angular/core';
import { AddReplaceableComponent } from '../actions'; import { AddReplaceableComponent } from '../actions';
import { ReplaceableComponentsState } from '../states/replaceable-components.state';
@Component({ selector: 'abp-dummy', template: 'dummy works' }) @Component({ selector: 'abp-dummy', template: 'dummy works' })
class DummyComponent {} class DummyComponent {}
describe('ReplaceableComponentsState', () => { describe('ReplaceableComponentsState', () => {
let spectator: SpectatorHost<DummyComponent>; let spectator: SpectatorHost<DummyComponent>;
let router: SpyObject<Router>;
const createHost = createHostFactory({ const createHost = createHostFactory({
component: DummyComponent, component: DummyComponent,
imports: [NgxsModule.forRoot([ReplaceableComponentsState])], providers: [{ provide: APP_BASE_HREF, useValue: '/' }],
imports: [RouterModule.forRoot([]), NgxsModule.forRoot([ReplaceableComponentsState])],
}); });
beforeEach(() => { beforeEach(() => {
spectator = createHost('<abp-dummy></abp-dummy>'); spectator = createHost('<abp-dummy></abp-dummy>');
router = spectator.inject(Router);
}); });
it('should add a component to the state', () => { it('should add a component to the state', () => {
@ -38,4 +44,16 @@ describe('ReplaceableComponentsState', () => {
}); });
expect(store.selectSnapshot(ReplaceableComponentsState.getAll)).toHaveLength(1); expect(store.selectSnapshot(ReplaceableComponentsState.getAll)).toHaveLength(1);
}); });
it('should call reloadRoute when reload parameter is given as true to AddReplaceableComponent', async () => {
const spy = jest.spyOn(router, 'navigateByUrl');
const store = spectator.get(Store);
store.dispatch(new AddReplaceableComponent({ component: DummyComponent, key: 'Dummy' }));
store.dispatch(new AddReplaceableComponent({ component: null, key: 'Dummy' }, true));
await spectator.fixture.whenStable();
expect(spy).toHaveBeenCalledTimes(1);
expect(spy).toHaveBeenCalledWith(router.url);
});
}); });

2
npm/ng-packs/packages/core/src/lib/tests/rest.service.spec.ts

@ -1,10 +1,10 @@
import { ConfigState } from '@abp/ng.core';
import { createHttpFactory, HttpMethod, SpectatorHttp, SpyObject } from '@ngneat/spectator/jest'; import { createHttpFactory, HttpMethod, SpectatorHttp, SpyObject } from '@ngneat/spectator/jest';
import { NgxsModule, Store } from '@ngxs/store'; import { NgxsModule, Store } from '@ngxs/store';
import { of, throwError } from 'rxjs'; import { of, throwError } from 'rxjs';
import { catchError } from 'rxjs/operators'; import { catchError } from 'rxjs/operators';
import { Rest } from '../models'; import { Rest } from '../models';
import { RestService } from '../services/rest.service'; import { RestService } from '../services/rest.service';
import { ConfigState } from '../states/config.state';
import { CORE_OPTIONS } from '../tokens'; import { CORE_OPTIONS } from '../tokens';
describe('HttpClient testing', () => { describe('HttpClient testing', () => {

5
npm/ng-packs/scripts/publish.ts

@ -1,6 +1,7 @@
import execa from 'execa'; import execa from 'execa';
import fse from 'fs-extra'; import fse from 'fs-extra';
import program from 'commander'; import program from 'commander';
import replaceWithPreview from './replace-with-preview';
program program
.option( .option(
@ -26,7 +27,7 @@ const publish = async () => {
try { try {
await fse.remove('../dist'); await fse.remove('../dist');
await execa('yarn', ['install'], { stdout: 'inherit', cwd: '../' }); await execa('npm', ['install'], { stdout: 'inherit', cwd: '../' });
await fse.rename('../lerna.version.json', '../lerna.json'); await fse.rename('../lerna.version.json', '../lerna.json');
@ -48,6 +49,8 @@ const publish = async () => {
await execa('yarn', ['replace-with-tilde']); await execa('yarn', ['replace-with-tilde']);
if (program.preview) await replaceWithPreview(program.nextVersion);
await execa('yarn', ['build', '--noInstall'], { stdout: 'inherit' }); await execa('yarn', ['build', '--noInstall'], { stdout: 'inherit' });
await fse.rename('../lerna.publish.json', '../lerna.json'); await fse.rename('../lerna.publish.json', '../lerna.json');

19
npm/ng-packs/scripts/replace-with-preview.ts

@ -0,0 +1,19 @@
import fse from 'fs-extra';
export default async function(version: string) {
const corePkgPath = '../packages/core/package.json';
try {
const corePkg = await fse.readJSON(corePkgPath);
await fse.writeJSON(
corePkgPath,
{
...corePkg,
dependencies: { ...corePkg.dependencies, '@abp/utils': version },
},
{ spaces: 2 },
);
} catch (error) {
console.error(error);
}
}

6
npm/preview-publish.ps1

@ -24,9 +24,9 @@ $commands = (
"npm install", "npm install",
"npm run publish-packages -- --nextVersion $Version --preview", "npm run publish-packages -- --nextVersion $Version --preview",
"cd ../../", "cd ../../",
"yarn lerna version $Version --yes --no-commit-hooks --skip-git --force-publish", "npm run lerna -- version $Version --yes --no-commit-hooks --skip-git --force-publish",
"yarn replace-with-tilde", "npm run replace-with-tilde",
"yarn lerna exec 'npm publish --registry $Registry --tag preview'" "npm run lerna -- exec 'npm publish --registry $Registry --tag preview'"
) )
foreach ($command in $commands) { foreach ($command in $commands) {

12
npm/publish.ps1

@ -16,12 +16,12 @@ $commands = (
"npm install", "npm install",
"npm run publish-packages -- --nextVersion $Version", "npm run publish-packages -- --nextVersion $Version",
"cd ../../", "cd ../../",
"yarn lerna version $Version --yes --no-commit-hooks --skip-git --force-publish", "npm run lerna -- version $Version --yes --no-commit-hooks --skip-git --force-publish",
"yarn replace-with-tilde", "npm run replace-with-tilde",
"yarn lerna exec 'npm publish --registry https://registry.npmjs.org'", "npm run lerna -- exec 'npm publish --registry https://registry.npmjs.org'",
"yarn update:templates", "npm run update:templates",
"yarn gulp:app", "npm run gulp:app",
"yarn gulp:module" "npm run gulp:module"
) )
foreach ($command in $commands) { foreach ($command in $commands) {

5
templates/app/aspnet-core/.prettierrc

@ -0,0 +1,5 @@
{
"singleQuote": true,
"useTabs": false,
"tabWidth": 4
}

2
templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/Pages/Index.css

@ -1,3 +1,3 @@
body { body {
} }

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save