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
If you want to use hangfire's dashboard, you can add it, too: by `UseHangfireDashboard`
2. If you want to use hangfire's dashboard, you can add `UseHangfireDashboard` call in the `OnApplicationInitialization` method in `Module` class
````csharp
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
app.UseHangfireServer();
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:
* [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/)
* [Node v12+](https://nodejs.org)
* [Yarn v1.19+](https://classic.yarnpkg.com/)
* [Node v12 or v14](https://nodejs.org/en/)
* [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" }}
* [Redis](https://redis.io/) (the startup solution uses the Redis as the [distributed cache](Caching.md)).
{{ 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
@ -348,4 +349,4 @@ See the "[Getting Started with the React Native](Getting-Started-React-Native.md
## 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
* 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:
````csharp
[HubRoute("/my-messasing-hub")]
[HubRoute("/my-messaging-hub")]
public class MessagingHub : Hub
{
//...
@ -132,7 +132,7 @@ public class MessagingHub : Hub
### 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:

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:
```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 { Store } from '@ngxs/store'; // imported Store
//...
@Component(/* component metadata */)
export class AppComponent implements OnInit {
constructor(..., private store: Store) {} // injected Store
ngOnInit() {
// added dispatch
export class AppComponent {
constructor(
private store: Store // injected Store
)
{
// dispatched the AddReplaceableComponent action
this.store.dispatch(
new AddReplaceableComponent({
component: YourNewRoleComponent,
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:
```bash
yarn ng generate component shared/my-application-layout --export --entryComponent
# You don't need the --entryComponent option in Angular 9
yarn ng generate component my-application-layout
```
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:
```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 { MyApplicationLayoutComponent } from './shared/my-application-layout/my-application-layout.component'; // imported MyApplicationLayoutComponent
import { Store } from '@ngxs/store'; // imported Store
//...
import { MyApplicationLayoutComponent } from './my-application-layout/my-application-layout.component'; // imported MyApplicationLayoutComponent
@Component(/* component metadata */)
export class AppComponent implements OnInit {
constructor(..., private store: Store) {} // injected Store
ngOnInit() {
// added dispatch
export class AppComponent {
constructor(
private store: Store, // injected Store
) {
// dispatched the AddReplaceableComponent action
this.store.dispatch(
new AddReplaceableComponent({
component: MyApplicationLayoutComponent,
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](./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
- 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.

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

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

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

@ -11,25 +11,24 @@
然后打开 `app.component.ts` 使用 `AddReplaceableComponent` 将你的组件替换ABP组件. 如下所示:
```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 { Store } from '@ngxs/store'; // imported Store
//...
@Component(/* component metadata */)
export class AppComponent implements OnInit {
constructor(..., private store: Store) {} // injected Store
ngOnInit() {
// added dispatch
export class AppComponent {
constructor(
private store: Store // injected Store
)
{
// dispatched the AddReplaceableComponent action
this.store.dispatch(
new AddReplaceableComponent({
component: YourNewRoleComponent,
key: eIdentityComponents.Roles,
}),
);
//...
}
}
```
@ -47,9 +46,7 @@ export class AppComponent implements OnInit {
运行以下命令在 `angular` 文件夹中生成布局:
```bash
yarn ng generate component shared/my-application-layout --export --entryComponent
# You don't need the --entryComponent option in Angular 9
yarn ng generate component my-application-layout
```
在你的布局模板(`my-layout.component.html`)中添加以下代码:
@ -61,26 +58,23 @@ yarn ng generate component shared/my-application-layout --export --entryComponen
打开 `src/app` 文件夹下的 `app.component.ts` 文件添加以下内容:
```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 { MyApplicationLayoutComponent } from './shared/my-application-layout/my-application-layout.component'; // imported MyApplicationLayoutComponent
import { Store } from '@ngxs/store'; // imported Store
//...
import { MyApplicationLayoutComponent } from './my-application-layout/my-application-layout.component'; // imported MyApplicationLayoutComponent
@Component(/* component metadata */)
export class AppComponent implements OnInit {
constructor(..., private store: Store) {} // injected Store
ngOnInit() {
// added dispatch
export class AppComponent {
constructor(
private store: Store, // injected Store
) {
// dispatched the AddReplaceableComponent action
this.store.dispatch(
new AddReplaceableComponent({
component: MyApplicationLayoutComponent,
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",
"texts": {
"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;
}
.dataTables_scrollBody {
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",
"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",
"Description:Abp.Mailing.DefaultFromAddress": "Die Standard-Absenderadresse",
"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.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.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.EnableSsl": "Bestimmt, ob der SmptClient Secure Sockets Layer (SSL) zur Verschlüsselung der Verbindung verwendet.",
"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.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.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.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",
"texts": {
"InternalServerErrorMessage": "Während Ihrer Anfrage ist ein interner Fehler aufgetreten!",
"ValidationErrorMessage": "Ihre Anfrage ist nicht gültig!",
"InternalServerErrorMessage": "Während Ihrer Anfrage ist ein interner Fehler aufgetreten!",
"ValidationErrorMessage": "Ihre Anfrage ist nicht gültig!",
"ValidationNarrativeErrorMessageTitle": "Die folgenden Fehler wurden bei der Validierung entdeckt.",
"DefaultErrorMessage": "Ein Fehler ist aufgetreten!",
"DefaultErrorMessageDetail": "Es wurden keine Fehlerdetails vom Server gesendet.",
"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!",
"DefaultErrorMessage403Detail": "Es ist Ihnen nicht erlaubt, diese Operation durchzuführen!",
"DefaultErrorMessage403Detail": "Es ist Ihnen nicht erlaubt, diese Operation durchzuführen!",
"DefaultErrorMessage404": "Ressource nicht gefunden!",
"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",
"Error": "Fehler",
"AreYouSure": "Sind Sie sicher?",
@ -20,11 +20,11 @@
"Yes": "Ja",
"No": "Nein",
"Ok": "Ok",
"Close": "Schließen",
"Close": "Schließen",
"Save": "Speichern",
"SavingWithThreeDot": "Speichere...",
"Actions": "Aktionen",
"Delete": "Löschen",
"Delete": "Löschen",
"Edit": "Bearbeiten",
"Refresh": "Aktualisieren",
"Language": "Sprache",
@ -36,28 +36,28 @@
"Register": "Registrieren",
"Logout": "Abmelden",
"Submit": "Absenden",
"Back": "Zurück",
"Back": "Zurück",
"PagerSearch": "Suchen",
"PagerNext": "Nächste",
"PagerNext": "Nächste",
"PagerPrevious": "Vorherige",
"PagerFirst": "Erste",
"PagerLast": "Letzte",
"PagerInfo": "Zeige _START_ bis _END_ von _TOTAL_ Einträgen",
"PagerInfo{0}{1}{2}": "Zeige {0} bis {1} von {2} Einträgen",
"PagerInfoEmpty": "Zeige 0 bis 0 von 0 Einträgen",
"PagerInfoFiltered": "(gefiltert von _MAX_ Einträgen insgesamt)",
"NoDataAvailableInDatatable": "Keine Daten verfügbar",
"PagerShowMenuEntries": "Zeige _MENU_ Einträge",
"PagerInfo": "Zeige _START_ bis _END_ von _TOTAL_ Einträgen",
"PagerInfo{0}{1}{2}": "Zeige {0} bis {1} von {2} Einträgen",
"PagerInfoEmpty": "Zeige 0 bis 0 von 0 Einträgen",
"PagerInfoFiltered": "(gefiltert von _MAX_ Einträgen insgesamt)",
"NoDataAvailableInDatatable": "Keine Daten verfügbar",
"PagerShowMenuEntries": "Zeige _MENU_ Einträge",
"DatatableActionDropdownDefaultText": "Aktionen",
"ChangePassword": "Passwort ändern",
"ChangePassword": "Passwort ändern",
"PersonalInfo": "Mein Profil",
"AreYouSureYouWantToCancelEditingWarningMessage": "Sie haben ungespeicherte Änderungen.",
"AreYouSureYouWantToCancelEditingWarningMessage": "Sie haben ungespeicherte Änderungen.",
"UnhandledException": "Unerwartete Ausnahme!",
"401Message": "Unauthorisiert",
"403Message": "Verboten",
"404Message": "Seite nicht gefunden",
"500Message": "Internet Server Fehler",
"500Message": "Interner Server Fehler",
"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",
"texts": {
"'{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.",
"{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.",
"'{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.",
"{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 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 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 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 {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 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 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 {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.",
"ThisFieldIsNotAValidCreditCardNumber.": "Dieses Feld ist keine gültige Kreditkartennummer.",
"ThisFieldIsNotValid.": "Dieses Feld ist nicht gültig.",
"ThisFieldIsNotAValidEmailAddress.": "Dieses Feld ist keine gültige E-Mail-Adresse.",
"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 {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.",
"ThisFieldIsNotAValidCreditCardNumber.": "Dieses Feld ist keine gültige Kreditkartennummer.",
"ThisFieldIsNotValid.": "Dieses Feld ist nicht gültig.",
"ThisFieldIsNotAValidEmailAddress.": "Dieses Feld ist keine gültige E-Mail-Adresse.",
"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.",
"ThisFieldMustBeAStringOrArrayTypeWithAMinimumLengthOf{0}": "Dieses Feld muss eine Zeichenfolge oder Auflistung mit einer Mindestlänge von '{0}' sein.",
"ThisFieldIsNotAValidPhoneNumber.": "Dieses Feld ist keine gültige Telefonnummer.",
"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.",
"ThisFieldIsNotAValidPhoneNumber.": "Dieses Feld ist keine gültige Telefonnummer.",
"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.",
"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.",
"ThisFieldIsNotAValidFullyQualifiedHttpHttpsOrFtpUrl": "Dieses Feld ist keine gültige vollqualifizierte http-, https- oder ftp-URL.",
"ThisFieldIsInvalid.": "Dieses Feld ist ungültig."
"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.",
"ThisFieldIsNotAValidFullyQualifiedHttpHttpsOrFtpUrl": "Dieses Feld ist keine gültige vollqualifizierte http-, https- oder ftp-URL.",
"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",
"texts": {
"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
}
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]

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

@ -1,4 +1,4 @@
{
{
"culture": "nl",
"texts": {
"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",
"texts": {
"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",
"texts": {
"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",
"texts": {
"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",
"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.",
"InvalidUserNameOrPassword": "Ungültiger Benutzername oder Passwort!",
"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.",
"LocalLoginDisabledMessage": "Die lokale Anmeldung ist für diese Anwendung deaktiviert.",
"InvalidUserNameOrPassword": "Ungültiger Benutzername oder Passwort!",
"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.",
"LocalLoginDisabledMessage": "Die lokale Anmeldung ist für diese Anwendung deaktiviert.",
"Login": "Anmelden",
"Cancel": "Abbrechen",
"Register": "Registrieren",
"AreYouANewUser": "Neuer Benutzer?",
"AlreadyRegistered": "Bereits registriert?",
"InvalidLoginRequest": "Ungültige Login-Anfrage",
"ThereAreNoLoginSchemesConfiguredForThisClient": "Es sind keine Anmeldeschemata für diesen Client konfiguriert.",
"InvalidLoginRequest": "Ungültige Login-Anfrage",
"ThereAreNoLoginSchemesConfiguredForThisClient": "Es sind keine Anmeldeschemata für diesen Client konfiguriert.",
"LogInUsingYourProviderAccount": "Melden Sie sich mit Ihrem {0}-Konto an",
"DisplayName:CurrentPassword": "Aktuelles Passwort",
"DisplayName:NewPassword": "Neues Passwort",
"DisplayName:NewPasswordConfirm": "Neues Passwort bestätigen",
"PasswordChangedMessage": "Ihr Passwort wurde erfolgreich geändert.",
"DisplayName:NewPasswordConfirm": "Neues Passwort bestätigen",
"PasswordChangedMessage": "Ihr Passwort wurde erfolgreich geändert.",
"DisplayName:UserName": "Benutzername",
"DisplayName:Email": "E-Mail",
"DisplayName:Name": "Name",
@ -31,12 +31,12 @@
"DisplayName:Password": "Passwort",
"DisplayName:EmailAddress": "E-Mail-Adresse",
"DisplayName:PhoneNumber": "Telefonnummer",
"PersonalSettings": "Persönliche Einstellungen",
"PersonalSettingsSaved": "Persönliche Einstellungen gespeichert",
"PasswordChanged": "Passwort geändert",
"NewPasswordConfirmFailed": "Bitte bestätigen Sie das neue Passwort.",
"PersonalSettings": "Persönliche Einstellungen",
"PersonalSettingsSaved": "Persönliche Einstellungen gespeichert",
"PasswordChanged": "Passwort geändert",
"NewPasswordConfirmFailed": "Bitte bestätigen Sie das neue Passwort.",
"Manage": "Verwalten",
"ManageYourProfile": "Ihr profil verwalten",
"ManageYourProfile": "Ihr Profil verwalten",
"DisplayName:Abp.Account.IsSelfRegistrationEnabled": "Ist die Selbstregistrierung aktiviert",
"Description:Abp.Account.IsSelfRegistrationEnabled": "Gibt an, ob ein Benutzer das Konto selbst registrieren kann.",
"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) {
setTimeout(function () {
window.location = document.getElementById("redirectButton").getAttribute("href");
}, 3000)
});
document.addEventListener('DOMContentLoaded', function (event) {
setTimeout(function () {
window.location = document
.getElementById('redirectButton')
.getAttribute('href');
}, 3000);
});

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

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

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

@ -1,73 +1,84 @@
$(function () {
var l = abp.localization.getResource('Blogging');
var _createModal = new abp.ModalManager(abp.appPath + 'Blogging/Admin/Blogs/Create');
var _editModal = new abp.ModalManager(abp.appPath + 'Blogging/Admin/Blogs/Edit');
var _createModal = new abp.ModalManager(
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({
processing: true,
serverSide: true,
paging: false,
info: false,
scrollX: true,
searching: false,
autoWidth: false,
scrollCollapse: true,
order: [[3, "desc"]],
ajax: abp.libs.datatables.createAjax(volo.blogging.admin.blogManagement.getList),
columnDefs: [
{
rowAction: {
items:
[
var _dataTable = $('#BlogsTable').DataTable(
abp.libs.datatables.normalizeConfiguration({
processing: true,
serverSide: true,
paging: false,
info: false,
scrollX: true,
searching: false,
autoWidth: false,
scrollCollapse: true,
order: [[3, 'desc']],
ajax: abp.libs.datatables.createAjax(
volo.blogging.admin.blogManagement.getList
),
columnDefs: [
{
rowAction: {
items: [
{
text: l('Edit'),
visible: abp.auth.isGranted('Blogging.Blog.Update'),
visible: abp.auth.isGranted(
'Blogging.Blog.Update'
),
action: function (data) {
_editModal.open({
blogId: data.record.id
blogId: data.record.id,
});
}
},
},
{
text: l('Delete'),
visible: abp.auth.isGranted('Blogging.Blog.Delete'),
confirmMessage: function (data) { return l('BlogDeletionWarningMessage') },
visible: abp.auth.isGranted(
'Blogging.Blog.Delete'
),
confirmMessage: function (data) {
return l('BlogDeletionWarningMessage');
},
action: function (data) {
volo.blogging.admin.blogManagement
.delete(data.record.id)
.then(function () {
_dataTable.ajax.reload();
});
}
}
]
}
},
{
target: 1,
data: "name"
},
{
target: 2,
data: "shortName"
},
{
target: 3,
data: "creationTime",
render: function (date) {
return date;
}
},
{
target: 4,
data: "description"
}
]
}));
},
},
],
},
},
{
target: 1,
data: 'name',
},
{
target: 2,
data: 'shortName',
},
{
target: 3,
data: 'creationTime',
render: function (date) {
return date;
},
},
{
target: 4,
data: 'description',
},
],
})
);
$("#CreateNewBlogButtonId").click(function () {
$('#CreateNewBlogButtonId').click(function () {
_createModal.open();
});
@ -78,5 +89,4 @@
_editModal.onResult(function () {
_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:Delete": "Löschen",
"Permission:Blogging": "Blog",
"Permission:Posts": "Beitr�ge",
"Permission:Posts": "Beiträge",
"Permission:Tags": "Tags",
"Permission:Comments": "Kommentare",
"Title": "Titel",
"Delete": "L�schen",
"Delete": "Löschen",
"Reply": "Antwort",
"ReplyTo": "Antwort auf {0}",
"ContinueReading": "Weiterlesen",
@ -29,15 +29,15 @@
"SeeAll": "Alle anzeigen",
"PopularTags": "Beliebte Tags",
"WiewsWithCount": "{0} Aufrufe",
"LastPosts": "Letzte Beitr�ge",
"LastPosts": "Letzte Beiträge",
"LeaveComment": "Kommentar hinterlassen",
"TagsInThisArticle": "Tags in diesem Artikel",
"Posts": "Beitr�ge",
"Posts": "Beiträge",
"Edit": "Bearbeiten",
"BLOG": "BLOG",
"CommentDeletionWarningMessage": "Kommentar wird gel�scht.",
"PostDeletionWarningMessage": "Beitrag wird gel�scht.",
"BlogDeletionWarningMessage": "Blog wird gel�scht.",
"CommentDeletionWarningMessage": "Kommentar wird gelöscht.",
"PostDeletionWarningMessage": "Beitrag wird gelöscht.",
"BlogDeletionWarningMessage": "Blog wird gelöscht.",
"AreYouSure": "Sind Sie sicher?",
"CommentWithCount": "{0} Kommentare",
"Comment": "Kommentar",

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

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

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

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

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

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

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

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

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

@ -1,14 +1,13 @@
var SimulationArea = {};
(function ($) {
var $mainContainer = null;
function refreshSimulationArea() {
$.get('/ClientSimulation/SimulationArea')
.done(function(result) {
.done(function (result) {
$mainContainer.html(result);
})
.always(function() {
.always(function () {
setTimeout(refreshSimulationArea, 1000);
});
}
@ -17,5 +16,4 @@
$mainContainer = $container;
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",
"texts": {
"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",
"texts": {
"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.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Microsoft.Extensions.Logging;
using Volo.Abp;
using Volo.Abp.Uow;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
using Volo.Abp.Caching;
@ -100,14 +102,21 @@ namespace Volo.Docs.Admin.Documents
foreach (var leaf in leafs)
{
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;
}
var sourceDocument =
await source.GetDocumentAsync(project, leaf.Path, input.LanguageCode, input.Version);
documents.Add(sourceDocument);
try
{
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)

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

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

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

@ -1,136 +1,168 @@
$(function () {
var l = abp.localization.getResource('Docs');
var _createModal = new abp.ModalManager({
viewUrl: abp.appPath + 'Docs/Admin/Projects/Create',
modalClass: 'projectCreate'
modalClass: 'projectCreate',
});
var _editModal = new abp.ModalManager({
viewUrl: abp.appPath + 'Docs/Admin/Projects/Edit',
modalClass: 'projectEdit'
modalClass: 'projectEdit',
});
var _pullModal = new abp.ModalManager({
viewUrl: abp.appPath + 'Docs/Admin/Projects/Pull',
modalClass: 'projectPull'
modalClass: 'projectPull',
});
var _dataTable = $('#ProjectsTable').DataTable(abp.libs.datatables.normalizeConfiguration({
processing: true,
serverSide: true,
scrollX: true,
paging: true,
searching: false,
autoWidth: false,
scrollCollapse: true,
order: [[2, "desc"]],
ajax: abp.libs.datatables.createAjax(volo.docs.admin.projectsAdmin.getList),
columnDefs: [
{
rowAction: {
items:
[
var _dataTable = $('#ProjectsTable').DataTable(
abp.libs.datatables.normalizeConfiguration({
processing: true,
serverSide: true,
scrollX: true,
paging: true,
searching: false,
autoWidth: false,
scrollCollapse: true,
order: [[2, 'desc']],
ajax: abp.libs.datatables.createAjax(
volo.docs.admin.projectsAdmin.getList
),
columnDefs: [
{
rowAction: {
items: [
{
text: l('Edit'),
visible: abp.auth.isGranted('Docs.Admin.Projects.Update'),
visible: abp.auth.isGranted(
'Docs.Admin.Projects.Update'
),
action: function (data) {
_editModal.open({
Id: data.record.id
Id: data.record.id,
});
}
},
},
{
text: l('Delete'),
visible: abp.auth.isGranted('Docs.Admin.Projects.Delete'),
confirmMessage: function (data) { return l('ProjectDeletionWarningMessage') },
visible: abp.auth.isGranted(
'Docs.Admin.Projects.Delete'
),
confirmMessage: function (data) {
return l('ProjectDeletionWarningMessage');
},
action: function (data) {
volo.docs.admin.projectsAdmin
.delete(data.record.id)
.then(function () {
_dataTable.ajax.reload();
});
}
},
},
{
text: l('Pull'),
visible: abp.auth.isGranted('Docs.Admin.Documents'),
visible: abp.auth.isGranted(
'Docs.Admin.Documents'
),
action: function (data) {
_pullModal.open({
Id: data.record.id
Id: data.record.id,
});
}
},
},
{
text: l('ClearCache'),
visible: abp.auth.isGranted('Docs.Admin.Documents'),
confirmMessage: function (data) { return l('ClearCacheConfirmationMessage', data.record.name); },
visible: abp.auth.isGranted(
'Docs.Admin.Documents'
),
confirmMessage: function (data) {
return l(
'ClearCacheConfirmationMessage',
data.record.name
);
},
action: function (data) {
volo.docs.admin.documentsAdmin
.clearCache({ projectId: data.record.id})
.clearCache({
projectId: data.record.id,
})
.then(function () {
_dataTable.ajax.reload();
});
}
},
},
{
text: l('ReIndexProject'),
visible: abp.auth.isGranted('Docs.Admin.Documents'),
confirmMessage: function (data) { return l('ReIndexProjectConfirmationMessage', data.record.name); },
visible: abp.auth.isGranted(
'Docs.Admin.Documents'
),
confirmMessage: function (data) {
return l(
'ReIndexProjectConfirmationMessage',
data.record.name
);
},
action: function (data) {
volo.docs.admin.projectsAdmin
.reindex({ projectId: data.record.id})
.reindex({ projectId: data.record.id })
.then(function () {
abp.message.success(l('SuccessfullyReIndexProject', data.record.name));
abp.message.success(
l(
'SuccessfullyReIndexProject',
data.record.name
)
);
});
}
}
]
}
},
{
target: 1,
data: "name"
},
{
target: 2,
data: "shortName"
},
{
target: 3,
data: "documentStoreType"
},
{
target: 4,
data: "format",
render: function (data) {
if (data === 'md') {
return 'markdown';
}
return data;
}
}
]
}));
},
},
],
},
},
{
target: 1,
data: 'name',
},
{
target: 2,
data: 'shortName',
},
{
target: 3,
data: 'documentStoreType',
},
{
target: 4,
data: 'format',
render: function (data) {
if (data === 'md') {
return 'markdown';
}
return data;
},
},
],
})
);
$("#CreateNewGithubProjectButtonId").click(function (event) {
$('#CreateNewGithubProjectButtonId').click(function (event) {
event.preventDefault();
_createModal.open({source:"GitHub"});
_createModal.open({ source: 'GitHub' });
});
$("#ReIndexAllProjects").click(function (event) {
abp.message.confirm(l('ReIndexAllProjectConfirmationMessage'))
$('#ReIndexAllProjects').click(function (event) {
abp.message
.confirm(l('ReIndexAllProjectConfirmationMessage'))
.done(function (accepted) {
if (accepted) {
volo.docs.admin.projectsAdmin
.reindexAll()
.then(function () {
abp.message.success(l('SuccessfullyReIndexAllProject'));
});
.reindexAll()
.then(function () {
abp.message.success(
l('SuccessfullyReIndexAllProject')
);
});
}
});
});
@ -142,5 +174,4 @@
_editModal.onResult(function () {
_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,
LanguageCode = esDoc.LanguageCode,
Highlight = esDoc.Highlight
}).ToList();
}).Where(x => x.FileName != project.NavigationDocumentName && x.FileName != project.ParametersDocumentName).ToList();
}
public async Task<bool> FullSearchEnabledAsync()
@ -338,4 +338,4 @@ namespace Volo.Docs.Documents
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,
FileName = document.FileName,
Content = document.Content,
LanguageCode = document.LanguageCode,
LanguageCode = ConvertLanguageCode(document.LanguageCode),
Version = document.Version
};
@ -178,7 +178,7 @@ namespace Volo.Docs.Documents.FullSearch.Elastic
new TermQuery
{
Field = "languageCode",
Value = languageCode
Value = ConvertLanguageCode(languageCode)
}
}
}
@ -232,5 +232,10 @@ namespace Volo.Docs.Documents.FullSearch.Elastic
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",
"texts": {
"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://stackoverflow.com/a/12731439/358804
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) {
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();
},
@ -91,7 +97,10 @@
var secondaryLevel = topLevel + 1;
var secondarySelector = 'h' + secondaryLevel;
return this.findOrFilter($scope, topSelector + ',' + secondarySelector);
return this.findOrFilter(
$scope,
topSelector + ',' + secondarySelector
);
},
getNavLevel: function (el) {
@ -126,14 +135,14 @@
var opts;
if (arg.jquery) {
opts = {
$nav: arg
$nav: arg,
};
} else {
opts = arg;
}
opts.$scope = opts.$scope || $(document.body);
return opts;
}
},
},
// accepts a jQuery object, or an options object
@ -147,7 +156,7 @@
var topLevel = this.helpers.getTopLevel(opts.$scope);
var $headings = this.helpers.getHeadings(opts.$scope, topLevel);
this.helpers.populateNav($topContext, topLevel, $headings);
}
},
};
$(function () {
@ -156,4 +165,4 @@
Toc.init($nav);
});
});
})(jQuery);
})(jQuery);

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

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

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

@ -1,7 +1,9 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.Encodings.Web;
using System.Threading.Tasks;
using System.Web;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Volo.Docs.Documents;
@ -29,12 +31,15 @@ namespace Volo.Docs.Pages.Documents
private readonly IProjectAppService _projectAppService;
private readonly IDocumentAppService _documentAppService;
private readonly HtmlEncoder _encoder;
public SearchModel(IProjectAppService projectAppService,
IDocumentAppService documentAppService)
public SearchModel(IProjectAppService projectAppService,
IDocumentAppService documentAppService,
HtmlEncoder encoder)
{
_projectAppService = projectAppService;
_documentAppService = documentAppService;
_encoder = encoder;
}
public List<DocumentSearchOutput> SearchOutputs { get; set; } = new List<DocumentSearchOutput>();
@ -45,7 +50,7 @@ namespace Volo.Docs.Pages.Documents
{
return RedirectToPage("Index");
}
KeyWord = keyword;
Project = await _projectAppService.GetAsync(ProjectName);
@ -67,7 +72,19 @@ namespace Volo.Docs.Pages.Documents
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();
}
}
}
}

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

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

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

@ -2,62 +2,71 @@
$(function () {
$('li:not(.last-link) a.tree-toggle').click(function () {
$(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 enoughHeight = $(".docs-sidebar-wrapper > .docs-top").height() + 60;
var scrollTopBtn = $('.scroll-top-btn');
var enoughHeight = $('.docs-sidebar-wrapper > .docs-top').height() + 60;
var enoughHeightPlus = 500;
$(window).scroll(function () {
var topPos = $(window).scrollTop();
if (topPos > enoughHeight) {
$(scrollTopBtn).addClass("showup");
$("body").addClass("scrolled");
$(scrollTopBtn).addClass('showup');
$('body').addClass('scrolled');
} else {
$(scrollTopBtn).removeClass("showup");
$("body").removeClass("scrolled");
$(scrollTopBtn).removeClass('showup');
$('body').removeClass('scrolled');
}
if (topPos > enoughHeightPlus) {
$("body").addClass("scrolledMore");
} else {
$("body").removeClass("scrolledMore");
if (topPos > enoughHeightPlus) {
$('body').addClass('scrolledMore');
} else {
$('body').removeClass('scrolledMore');
}
});
$(scrollTopBtn).click(function () {
$('html, body').animate({
scrollTop: 0
}, 500);
$('html, body').animate(
{
scrollTop: 0,
},
500
);
return false;
});
var scrollToHashLink = function () {
var hash = window.location.hash;
if (!hash || hash === "#") {
if (!hash || hash === '#') {
return;
}
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) {
return;
}
$('html,body').stop().animate({
scrollTop: $targetElement.offset().top
}, 200);
$('html,body').stop().animate(
{
scrollTop: $targetElement.offset().top,
},
200
);
return;
};
@ -65,36 +74,40 @@
$(document).ready(function () {
handleCustomScrolls();
var $myNav = $("#docs-sticky-index");
var $myNav = $('#docs-sticky-index');
Toc.init($myNav);
$("body").scrollspy({
target: $myNav
$('body').scrollspy({
target: $myNav,
});
$("#docs-sticky-index a").on('click', function (event) {
if (this.hash !== "") {
$('#docs-sticky-index a').on('click', function (event) {
if (this.hash !== '') {
event.preventDefault();
var hash = this.hash;
$('html, body').animate({
scrollTop: $(decodeURIComponent(hash)).offset().top
}, 500, function () {
window.location.hash = hash;
});
$('html, body').animate(
{
scrollTop: $(decodeURIComponent(hash)).offset().top,
},
500,
function () {
window.location.hash = hash;
}
);
}
});
$(".btn-toggle").on("click", function () {
$(".toggle-row").slideToggle(400);
$(this).toggleClass("less");
$('.btn-toggle').on('click', function () {
$('.toggle-row').slideToggle(400);
$(this).toggleClass('less');
});
$(".close-mmenu").on("click", function () {
$(".navbar-collapse").removeClass("show");
$('.close-mmenu').on('click', function () {
$('.navbar-collapse').removeClass('show');
});
$(".open-dmenu").on("click", function () {
$(".docs-tree-list").slideToggle();
$('.open-dmenu').on('click', function () {
$('.docs-tree-list').slideToggle();
});
scrollToHashLink();
@ -108,13 +121,13 @@
function handleCustomScrolls() {
var wWidth = $(window).width();
if (wWidth > 766) {
$("#sidebar-scroll").mCustomScrollbar({
theme: "minimal",
$('#sidebar-scroll').mCustomScrollbar({
theme: 'minimal',
alwaysShowScrollbar: 0,
});
$("#scroll-index").mCustomScrollbar({
theme: "minimal-dark",
$('#scroll-index').mCustomScrollbar({
theme: 'minimal-dark',
alwaysShowScrollbar: 0,
});
}
@ -139,9 +152,9 @@
return $li;
};
function docsCriteria() {
var docsContentWidth = $(".docs-content").width() - 20;
$(".alert-criteria").width(docsContentWidth);
function docsCriteria() {
var docsContentWidth = $('.docs-content').width() - 20;
$('.alert-criteria').width(docsContentWidth);
}
$(document).ready(function () {
docsCriteria();
@ -149,4 +162,4 @@
$(window).resize(function () {
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",
"texts": {
"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.FeatureManagement = function () {
$('.FeatureValueCheckbox').change(function () {
if (this.checked) {
$(this).val("true");
}
else {
$(this).val("false");
$(this).val('true');
} else {
$(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",
"texts": {
"Menu:IdentityManagement": "Identitätsverwaltung",
"Menu:IdentityManagement": "Identitätsverwaltung",
"Users": "Benutzer",
"NewUser": "Neuer Benutzer",
"UserName": "Benutzername",
@ -10,13 +10,13 @@
"UserInformations": "Benutzerinformationen",
"DisplayName:IsDefault": "Standard",
"DisplayName:IsStatic": "Statisch",
"DisplayName:IsPublic": "Öffentlich",
"DisplayName:IsPublic": "Öffentlich",
"Roles": "Rollen",
"Password": "Passwort",
"PersonalInfo": "Mein Profil",
"PersonalSettings": "Persönliche Einstellungen",
"UserDeletionConfirmationMessage": "Der Benutzer '{0}' wird gelöscht. Sind Sie sicher?",
"RoleDeletionConfirmationMessage": "Die Rolle '{0}' wird gelöscht. Sind Sie sicher?",
"PersonalSettings": "Persönliche Einstellungen",
"UserDeletionConfirmationMessage": "Der Benutzer '{0}' wird gelöscht. Sind Sie sicher?",
"RoleDeletionConfirmationMessage": "Die Rolle '{0}' wird gelöscht. Sind Sie sicher?",
"DisplayName:RoleName": "Rollenname",
"DisplayName:UserName": "Benutzername",
"DisplayName:Name": "Name",
@ -32,72 +32,72 @@
"Permissions": "Berechtigungen",
"DisplayName:CurrentPassword": "Aktuelles Passwort",
"DisplayName:NewPassword": "Neues Passwort",
"DisplayName:NewPasswordConfirm": "Neues Passwort bestätigen",
"PasswordChangedMessage": "Ihr Passwort wurde erfolgreich geändert.",
"PersonalSettingsSavedMessage": "Ihre persönlichen Einstellungen wurden erfolgreich gespeichert.",
"DisplayName:NewPasswordConfirm": "Neues Passwort bestätigen",
"PasswordChangedMessage": "Ihr Passwort wurde erfolgreich geändert.",
"PersonalSettingsSavedMessage": "Ihre persönlichen Einstellungen wurden erfolgreich gespeichert.",
"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.DuplicateRoleName": "Der Rollenname '{0}' ist bereits vergeben.",
"Identity.DuplicateUserName": "Der Benutzername '{0}' ist bereits vergeben.",
"Identity.InvalidEmail": "E-Mail '{0}' ist ungültig.",
"Identity.InvalidPasswordHasherCompatibilityMode": "Der angegebene PasswordHasherCompatibilityMode ist ungültig.",
"Identity.InvalidEmail": "E-Mail '{0}' ist ungültig.",
"Identity.InvalidPasswordHasherCompatibilityMode": "Der angegebene PasswordHasherCompatibilityMode ist ungültig.",
"Identity.InvalidPasswordHasherIterationCount": "Die Iterationszahl muss eine positive Ganzzahl sein.",
"Identity.InvalidRoleName": "Der Rollenname '{0}' ist ungültig.",
"Identity.InvalidToken": "Ungültiges Token.",
"Identity.InvalidUserName": "Benutzername '{0}' ist ungültig, kann nur Buchstaben oder Ziffern enthalten.",
"Identity.InvalidRoleName": "Der Rollenname '{0}' ist ungültig.",
"Identity.InvalidToken": "Ungültiges Token.",
"Identity.InvalidUserName": "Benutzername '{0}' ist ungültig, kann nur Buchstaben oder Ziffern enthalten.",
"Identity.LoginAlreadyAssociated": "Ein Benutzer mit diesem Login existiert bereits.",
"Identity.PasswordMismatch": "Falsches Passwort.",
"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.PasswordRequiresNonAlphanumeric": "Passwörter müssen mindestens ein Sonderzeichen 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.PasswordRequiresDigit": "Passwörter müssen mindestens eine Ziffer ('0'-'9') enthalten.",
"Identity.PasswordRequiresLower": "Passwörter müssen mindestens einen Kleinbuchstaben ('a'-'z') 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.PasswordTooShort": "Passwörter müssen mindestens {0} Zeichen enthalten.",
"Identity.RoleNotFound": "Die Rolle {0} existiert nicht.",
"Identity.UserAlreadyHasPassword": "Der Benutzer hat bereits ein Passwort gesetzt.",
"Identity.UserAlreadyInRole": "Benutzer ist bereits in der Rolle '{0}'.",
"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.UserNotInRole": "Benutzer ist nicht in der Rolle '{0}'.",
"Identity.PasswordConfirmationFailed": "Passwort stimmt nicht mit dem Bestätigungspasswort überein.",
"Identity.StaticRoleRenamingErrorMessage": "Statische Rollen können nicht umbenannt werden.",
"Identity.StaticRoleDeletionErrorMessage": "Statische Rollen können nicht gelöscht werden.",
"Volo.Abp.Identity:010001": "Sie können Ihr eigenes Konto nicht löschen!",
"Permission:IdentityManagement": "Identitätsverwaltung",
"Identity.PasswordConfirmationFailed": "Passwort stimmt nicht mit dem Bestätigungspasswort überein.",
"Identity.StaticRoleRenamingErrorMessage": "Statische Rollen können nicht umbenannt werden.",
"Identity.StaticRoleDeletionErrorMessage": "Statische Rollen können nicht gelöscht werden.",
"Volo.Abp.Identity:010001": "Sie können Ihr eigenes Konto nicht löschen!",
"Permission:IdentityManagement": "Identitätsverwaltung",
"Permission:RoleManagement": "Rollenverwaltung",
"Permission:Create": "Erstellen",
"Permission:Edit": "Bearbeiten",
"Permission:Delete": "Löschen",
"Permission:ChangePermissions": "Berechtigungen ändern",
"Permission:Delete": "Löschen",
"Permission:ChangePermissions": "Berechtigungen ändern",
"Permission:UserManagement": "Benutzerverwaltung",
"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.RequireNonAlphanumeric": "Erforderliches Sonderzeichen",
"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.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.MaxFailedAccessAttempts": "Max fehlgeschlagene Zugriffsversuche",
"DisplayName:Abp.Identity.SignIn.RequireConfirmedEmail": "Bestätigte E-Mail erforderlich",
"DisplayName:Abp.Identity.SignIn.EnablePhoneNumberConfirmation": "Telefonnummer-Bestätigung aktivieren",
"DisplayName:Abp.Identity.SignIn.RequireConfirmedPhoneNumber": "Bestätigte Telefonnummer erforderlich",
"DisplayName:Abp.Identity.SignIn.RequireConfirmedEmail": "Bestätigte E-Mail erforderlich",
"DisplayName:Abp.Identity.SignIn.EnablePhoneNumberConfirmation": "Telefonnummer-Bestätigung aktivieren",
"DisplayName:Abp.Identity.SignIn.RequireConfirmedPhoneNumber": "Bestätigte Telefonnummer erforderlich",
"DisplayName:Abp.Identity.User.IsUserNameUpdateEnabled": "Ist die Aktualisierung des Benutzernamens 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.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.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.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.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.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.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.RequireConfirmedPhoneNumber": "Ob für die Anmeldung eine bestätigte Telefonnummer 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.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."
}

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

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

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

@ -1,73 +1,91 @@
(function ($) {
var l = abp.localization.getResource('AbpIdentity');
var _identityUserAppService = volo.abp.identity.identityUser;
var _editModal = new abp.ModalManager(abp.appPath + 'Identity/Users/EditModal');
var _createModal = new abp.ModalManager(abp.appPath + 'Identity/Users/CreateModal');
var _permissionsModal = new abp.ModalManager(abp.appPath + 'AbpPermissionManagement/PermissionManagementModal');
var _editModal = new abp.ModalManager(
abp.appPath + 'Identity/Users/EditModal'
);
var _createModal = new abp.ModalManager(
abp.appPath + 'Identity/Users/CreateModal'
);
var _permissionsModal = new abp.ModalManager(
abp.appPath + 'AbpPermissionManagement/PermissionManagementModal'
);
$(function () {
var _$wrapper = $('#IdentityUsersWrapper');
var _$table = _$wrapper.find('table');
var _dataTable = _$table.DataTable(abp.libs.datatables.normalizeConfiguration({
order: [[1, "asc"]],
processing: true,
serverSide: true,
scrollX: true,
paging: true,
ajax: abp.libs.datatables.createAjax(_identityUserAppService.getList),
columnDefs: [
{
rowAction: {
items:
[
var _dataTable = _$table.DataTable(
abp.libs.datatables.normalizeConfiguration({
order: [[1, 'asc']],
processing: true,
serverSide: true,
scrollX: true,
paging: true,
ajax: abp.libs.datatables.createAjax(
_identityUserAppService.getList
),
columnDefs: [
{
rowAction: {
items: [
{
text: l('Edit'),
visible: abp.auth.isGranted('AbpIdentity.Users.Update'),
visible: abp.auth.isGranted(
'AbpIdentity.Users.Update'
),
action: function (data) {
_editModal.open({
id: data.record.id
id: data.record.id,
});
}
},
},
{
text: l('Permissions'),
visible: abp.auth.isGranted('AbpIdentity.Users.ManagePermissions'),
visible: abp.auth.isGranted(
'AbpIdentity.Users.ManagePermissions'
),
action: function (data) {
_permissionsModal.open({
providerName: 'U',
providerKey: data.record.id
providerKey: data.record.id,
});
}
},
},
{
text: l('Delete'),
visible: abp.auth.isGranted('AbpIdentity.Users.Delete'),
confirmMessage: function (data) { return l('UserDeletionConfirmationMessage', data.record.userName); },
visible: abp.auth.isGranted(
'AbpIdentity.Users.Delete'
),
confirmMessage: function (data) {
return l(
'UserDeletionConfirmationMessage',
data.record.userName
);
},
action: function (data) {
_identityUserAppService
.delete(data.record.id)
.then(function () {
_dataTable.ajax.reload();
});
}
}
]
}
},
{
data: "userName"
},
{
data: "email"
},
{
data: "phoneNumber"
}
]
}));
},
},
],
},
},
{
data: 'userName',
},
{
data: 'email',
},
{
data: 'phoneNumber',
},
],
})
);
_createModal.onResult(function () {
_dataTable.ajax.reload();
@ -82,5 +100,4 @@
_createModal.open();
});
});
})(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",
"texts": {
"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",
"All": "Alle",
"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 () {
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) {
return;
}
@ -20,7 +22,9 @@
}
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) {
return;
}
@ -37,37 +41,45 @@
function handleTabCheckedCheckboxCount($tab) {
var newCount = 0;
$tab.find('input[type="checkbox"]').not('[name="SelectAllInThisTab"]').each(function () {
if ($(this).is(':checked') === true) {
newCount++;
}
});
$tab.find('input[type="checkbox"]')
.not('[name="SelectAllInThisTab"]')
.each(function () {
if ($(this).is(':checked') === true) {
newCount++;
}
});
var $tabTitle = $('#' + $tab.attr('id') + '-tab');
var title = $tabTitle.html()
.replace('<b>','').replace('</b>','')
.replace('<small>','').replace('</small>','');
var title = $tabTitle
.html()
.replace('<b>', '')
.replace('</b>', '')
.replace('<small>', '')
.replace('</small>', '');
var titleSplitted = title.split(' ');
if (titleSplitted[titleSplitted.length-1].startsWith('(')){
if (titleSplitted[titleSplitted.length - 1].startsWith('(')) {
titleSplitted.pop();
}
var titleWithoutCount = titleSplitted.join(' ');
var newTitle = titleWithoutCount + ' (' + (newCount) + ')';
if (newCount > 0){
newTitle = '<b>' + newTitle + '</b>'
}
else {
newTitle = '<small>' + newTitle + '</small>'
var newTitle = titleWithoutCount + ' (' + newCount + ')';
if (newCount > 0) {
newTitle = '<b>' + newTitle + '</b>';
} else {
newTitle = '<small>' + newTitle + '</small>';
}
$tabTitle.html(newTitle)
};
$tabTitle.html(newTitle);
}
function handleUncheck($tab) {
var $checkBox = $tab.find('input[name="SelectAllInThisTab"]');
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);
} else {
$checkBox.prop('checked', false);
@ -75,11 +87,13 @@
} else if ($checkBox.is(':indeterminate')) {
var allUnchecked = true;
$tab.find('input[type="checkbox"]').not('[name="SelectAllInThisTab"]').each(function () {
if ($(this).is(':checked') === true) {
allUnchecked = false;
}
});
$tab.find('input[type="checkbox"]')
.not('[name="SelectAllInThisTab"]')
.each(function () {
if ($(this).is(':checked') === true) {
allUnchecked = false;
}
});
if (allUnchecked) {
$($checkBox).prop('indeterminate', false);
@ -93,11 +107,13 @@
var allChecked = true;
$tab.find('input[type="checkbox"]').not('[name="SelectAllInThisTab"]').each(function () {
if ($(this).is(':checked') === false) {
allChecked = false;
}
});
$tab.find('input[type="checkbox"]')
.not('[name="SelectAllInThisTab"]')
.each(function () {
if ($(this).is(':checked') === false) {
allChecked = false;
}
});
if (allChecked) {
$($checkBox).prop('indeterminate', false);
@ -107,7 +123,6 @@
}
}
function initSelectAllInThisTab() {
var tabs = $('.tab-pane');
for (var i = 0; i < tabs.length; i++) {
@ -117,13 +132,15 @@
var allChecked = true;
var allUnChecked = true;
$tab.find('input[type="checkbox"]').not('[name="SelectAllInThisTab"]').each(function () {
if ($(this).is(':checked') === true) {
allUnChecked = false;
} else {
allChecked = false;
}
});
$tab.find('input[type="checkbox"]')
.not('[name="SelectAllInThisTab"]')
.each(function () {
if ($(this).is(':checked') === true) {
allUnChecked = false;
} else {
allChecked = false;
}
});
if (allChecked) {
$($checkBox).prop('checked', true);
@ -174,55 +191,65 @@
$el.find('.tab-pane').each(function () {
var $tab = $(this);
handleTabCheckedCheckboxCount($tab);
$tab.find('input[type="checkbox"]').not('[name="SelectAllInThisTab"]').each(function () {
var $checkBox = $(this);
$checkBox.change(function () {
if ($checkBox.is(':checked')) {
checkParents($tab, $checkBox);
handleCheck($tab);
} else {
uncheckChildren($tab, $checkBox);
handleUncheck($tab);
}
setSelectAllInAllTabs();
handleTabCheckedCheckboxCount($tab);
$tab.find('input[type="checkbox"]')
.not('[name="SelectAllInThisTab"]')
.each(function () {
var $checkBox = $(this);
$checkBox.change(function () {
if ($checkBox.is(':checked')) {
checkParents($tab, $checkBox);
handleCheck($tab);
} else {
uncheckChildren($tab, $checkBox);
handleUncheck($tab);
}
setSelectAllInAllTabs();
handleTabCheckedCheckboxCount($tab);
});
});
});
});
$('input[name="SelectAllInThisTab"]').change(function () {
var $checkBox = $(this);
var $tab = $('#' + $checkBox.attr('data-tab-id'));
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 {
$tab.find('input[type="checkbox"]').not(':disabled').prop('checked', false);
$tab.find('input[type="checkbox"]')
.not(':disabled')
.prop('checked', false);
}
$($checkBox).prop('indeterminate', false);
setSelectAllInAllTabs();
handleTabCheckedCheckboxCount($tab)
handleTabCheckedCheckboxCount($tab);
});
$('input[name="SelectAllInAllTabs"]').change(function () {
var $checkBox = $(this);
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 {
$('.tab-pane input[type="checkbox"]').not(':disabled').prop('checked', false);
$('.tab-pane input[type="checkbox"]')
.not(':disabled')
.prop('checked', false);
}
$($checkBox).prop('indeterminate', false);
$el.find('.tab-pane').each(function () {
handleTabCheckedCheckboxCount($(this))
handleTabCheckedCheckboxCount($(this));
});
});
$(function () {
$(".custom-scroll-content").mCustomScrollbar({
theme: "minimal-dark"
$('.custom-scroll-content').mCustomScrollbar({
theme: 'minimal-dark',
});
$(".custom-scroll-container > .col-4").mCustomScrollbar({
theme: "minimal-dark"
$('.custom-scroll-container > .col-4').mCustomScrollbar({
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 ($) {
var l = abp.localization.getResource('AbpSettingManagement');
$(document).on("AbpSettingSaved", function () {
abp.notify.success(l("SuccessfullySaved"));
$(document).on('AbpSettingSaved', function () {
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",
"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",
"DisplayName:DefaultConnectionString": "Standard Verbindungszeichenfolge",
"DisplayName:UseSharedDatabase": "Nutze die gemeinsame Datenbank",
"Permission:TenantManagement": "Mandantenverwaltung",
"Permission:Create": "Erstellen",
"Permission:Edit": "Bearbeiten",
"Permission:Delete": "Löschen",
"Permission:Delete": "Löschen",
"Permission:ManageConnectionStrings": "Verbindungszeichenfolgen verwalten",
"Permission:ManageFeatures": "Funktionen verwalten",
"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:ManageConnectionStrings": "Beheer connection strings",
"Permission:ManageFeatures": "Beheer functies",
"DisplayName:AdminEmailAddress": "Admin e-mail adres",
"DisplayName:AdminPassword": "Admin wachtwoord"
"DisplayName:AdminEmailAddress": "Admin e-mail adres",
"DisplayName:AdminPassword": "Admin wachtwoord"
}
}

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

@ -1,20 +1,20 @@
(function ($) {
abp.modals.TenantConnectionStringManagement = function() {
abp.modals.TenantConnectionStringManagement = function () {
var initModal = function (publicApi, args) {
publicApi.getModal()
publicApi
.getModal()
.find('input[name="Tenant.UseSharedDatabase"]')
.change(function () {
var $this = $(this);
$("#Tenant_DefaultConnectionString_Wrap").toggleClass("d-none");
$this.val($this.prop("checked"));
$('#Tenant_DefaultConnectionString_Wrap').toggleClass(
'd-none'
);
$this.val($this.prop('checked'));
});
};
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 () {
var l = abp.localization.getResource('AbpTenantManagement');
var _tenantAppService = volo.abp.tenantManagement.tenant;
var _editModal = new abp.ModalManager(abp.appPath + 'TenantManagement/Tenants/EditModal');
var _createModal = new abp.ModalManager(abp.appPath + 'TenantManagement/Tenants/CreateModal');
var _featuresModal = new abp.ModalManager(abp.appPath + 'FeatureManagement/FeatureManagementModal');
var _editModal = new abp.ModalManager(
abp.appPath + 'TenantManagement/Tenants/EditModal'
);
var _createModal = new abp.ModalManager(
abp.appPath + 'TenantManagement/Tenants/CreateModal'
);
var _featuresModal = new abp.ModalManager(
abp.appPath + 'FeatureManagement/FeatureManagementModal'
);
var _connectionStringsModal = new abp.ModalManager({
viewUrl: abp.appPath + 'TenantManagement/Tenants/ConnectionStringsModal',
modalClass: 'TenantConnectionStringManagement'
viewUrl:
abp.appPath + 'TenantManagement/Tenants/ConnectionStringsModal',
modalClass: 'TenantConnectionStringManagement',
});
$(function () {
var _$wrapper = $('#TenantsWrapper');
var _dataTable = _$wrapper.find('table').DataTable(abp.libs.datatables.normalizeConfiguration({
order: [[1, "asc"]],
processing: true,
paging: true,
scrollX: true,
serverSide: true,
ajax: abp.libs.datatables.createAjax(_tenantAppService.getList),
columnDefs: [
{
rowAction: {
items:
[
var _dataTable = _$wrapper.find('table').DataTable(
abp.libs.datatables.normalizeConfiguration({
order: [[1, 'asc']],
processing: true,
paging: true,
scrollX: true,
serverSide: true,
ajax: abp.libs.datatables.createAjax(_tenantAppService.getList),
columnDefs: [
{
rowAction: {
items: [
{
text: l('Edit'),
visible: abp.auth.isGranted('AbpTenantManagement.Tenants.Update'),
visible: abp.auth.isGranted(
'AbpTenantManagement.Tenants.Update'
),
action: function (data) {
_editModal.open({
id: data.record.id
id: data.record.id,
});
}
},
},
{
{
text: l('ConnectionStrings'),
visible: abp.auth.isGranted('AbpTenantManagement.Tenants.ManageConnectionStrings'),
action: function (data) {
_connectionStringsModal.open({
id: data.record.id
});
}
},
visible: abp.auth.isGranted(
'AbpTenantManagement.Tenants.ManageConnectionStrings'
),
action: function (data) {
_connectionStringsModal.open({
id: data.record.id,
});
},
},
{
text: l('Features'),
visible: abp.auth.isGranted('AbpTenantManagement.Tenants.ManageFeatures'),
visible: abp.auth.isGranted(
'AbpTenantManagement.Tenants.ManageFeatures'
),
action: function (data) {
_featuresModal.open({
providerName: 'T',
providerKey: data.record.id
providerKey: data.record.id,
});
}
},
},
{
text: l('Delete'),
visible: abp.auth.isGranted('AbpTenantManagement.Tenants.Delete'),
confirmMessage: function (data) { return l('TenantDeletionConfirmationMessage', data.record.name)},
visible: abp.auth.isGranted(
'AbpTenantManagement.Tenants.Delete'
),
confirmMessage: function (data) {
return l(
'TenantDeletionConfirmationMessage',
data.record.name
);
},
action: function (data) {
_tenantAppService
.delete(data.record.id)
.then(function () {
_dataTable.ajax.reload();
});
}
}
]
}
},
{
data: "name"
}
]
}));
},
},
],
},
},
{
data: 'name',
},
],
})
);
_createModal.onResult(function () {
_dataTable.ajax.reload();
@ -89,5 +108,4 @@
_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) {
_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 {
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 {
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;
constructor(
@ -36,11 +43,6 @@ export class DynamicLayoutComponent implements OnDestroy {
const route = injector.get(ActivatedRoute);
const router = injector.get(Router);
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 => {
if (event instanceof NavigationEnd) {
@ -62,7 +64,8 @@ export class DynamicLayoutComponent implements OnDestroy {
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 { ActivatedRouteSnapshot, CanActivate, RouterStateSnapshot, Router } from '@angular/router';
import { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot } from '@angular/router';
import { Store } from '@ngxs/store';
import { Observable, of } from 'rxjs';
import { tap } from 'rxjs/operators';
import snq from 'snq';
import { RestOccurError } from '../actions/rest.actions';
import { ConfigState } from '../states/config.state';
import { RoutesService } from '../services/routes.service';
import { ConfigState } from '../states/config.state';
import { findRoute, getRoutePath } from '../utils/route-utils';
@Injectable({
@ -15,18 +14,16 @@ import { findRoute, getRoutePath } from '../utils/route-utils';
export class PermissionGuard implements CanActivate {
constructor(private router: Router, private routes: RoutesService, private store: Store) {}
canActivate(
route: ActivatedRouteSnapshot,
state: RouterStateSnapshot,
): Observable<boolean> | boolean {
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> {
let { requiredPolicy } = route.data || {};
if (!requiredPolicy) {
requiredPolicy = findRoute(this.routes, getRoutePath(this.router, state.url))?.requiredPolicy;
if (!requiredPolicy) return true;
const route = findRoute(this.routes, getRoutePath(this.router, state.url));
requiredPolicy = route?.requiredPolicy;
}
if (!requiredPolicy) return of(true);
return this.store.select(ConfigState.getGrantedPolicy(requiredPolicy)).pipe(
tap(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 { State, Action, StateContext, Selector, createSelector } from '@ngxs/store';
import { noop } from '@abp/ng.core';
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 { ReplaceableComponents } from '../models/replaceable-components';
import snq from 'snq';
@State<ReplaceableComponents.State>({
name: 'ReplaceableComponentsState',
@ -28,10 +30,28 @@ export class ReplaceableComponentsState {
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)
replaceableComponentsAction(
{ getState, patchState }: StateContext<ReplaceableComponents.State>,
{ payload }: AddReplaceableComponent,
{ payload, reload }: AddReplaceableComponent,
) {
let { replaceableComponents } = getState();
@ -48,5 +68,7 @@ export class ReplaceableComponentsState {
patchState({
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 { Store } from '@ngxs/store';
import { Actions, Store } from '@ngxs/store';
import { of } from 'rxjs';
import { PermissionGuard } from '../guards/permission.guard';
import { RestOccurError } from '../actions';
import { PermissionGuard } from '../guards/permission.guard';
import { RoutesService } from '../services/routes.service';
describe('PermissionGuard', () => {
let spectator: SpectatorService<PermissionGuard>;
let guard: PermissionGuard;
let routes: SpyObject<RoutesService>;
let store: SpyObject<Store>;
@Component({ template: '' })
class DummyComponent {}
const createService = createServiceFactory({
service: PermissionGuard,
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(() => {
spectator = createService();
guard = spectator.service;
routes = spectator.inject(RoutesService);
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));
const spy = jest.spyOn(store, 'select');
guard
.canActivate(
{ data: {}, routeConfig: { children: [{ path: 'test', data: { requiredPolicy: 'TestPolicy' } }] } } as any,
{ url: 'test' } as any,
)
.subscribe(() => {
expect(spy.mock.calls[0][0]({ auth: { grantedPolicies: { TestPolicy: true } } })).toBe(true);
done();
});
guard.canActivate({ data: {} } as any, { url: 'test' } as any).subscribe(() => {
expect(spy.mock.calls[0][0]({ auth: { grantedPolicies: { TestPolicy: true } } })).toBe(true);
done();
});
});
it('should return Observable<true> if RoutesService does not have requiredPolicy for given URL', 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 { NgxsModule, Store } from '@ngxs/store';
import { ReplaceableComponentsState } from '../states/replaceable-components.state';
import { Component } from '@angular/core';
import { AddReplaceableComponent } from '../actions';
import { ReplaceableComponentsState } from '../states/replaceable-components.state';
@Component({ selector: 'abp-dummy', template: 'dummy works' })
class DummyComponent {}
describe('ReplaceableComponentsState', () => {
let spectator: SpectatorHost<DummyComponent>;
let router: SpyObject<Router>;
const createHost = createHostFactory({
component: DummyComponent,
imports: [NgxsModule.forRoot([ReplaceableComponentsState])],
providers: [{ provide: APP_BASE_HREF, useValue: '/' }],
imports: [RouterModule.forRoot([]), NgxsModule.forRoot([ReplaceableComponentsState])],
});
beforeEach(() => {
spectator = createHost('<abp-dummy></abp-dummy>');
router = spectator.inject(Router);
});
it('should add a component to the state', () => {
@ -38,4 +44,16 @@ describe('ReplaceableComponentsState', () => {
});
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 { NgxsModule, Store } from '@ngxs/store';
import { of, throwError } from 'rxjs';
import { catchError } from 'rxjs/operators';
import { Rest } from '../models';
import { RestService } from '../services/rest.service';
import { ConfigState } from '../states/config.state';
import { CORE_OPTIONS } from '../tokens';
describe('HttpClient testing', () => {

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

@ -1,6 +1,7 @@
import execa from 'execa';
import fse from 'fs-extra';
import program from 'commander';
import replaceWithPreview from './replace-with-preview';
program
.option(
@ -26,7 +27,7 @@ const publish = async () => {
try {
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');
@ -48,6 +49,8 @@ const publish = async () => {
await execa('yarn', ['replace-with-tilde']);
if (program.preview) await replaceWithPreview(program.nextVersion);
await execa('yarn', ['build', '--noInstall'], { stdout: 'inherit' });
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 run publish-packages -- --nextVersion $Version --preview",
"cd ../../",
"yarn lerna version $Version --yes --no-commit-hooks --skip-git --force-publish",
"yarn replace-with-tilde",
"yarn lerna exec 'npm publish --registry $Registry --tag preview'"
"npm run lerna -- version $Version --yes --no-commit-hooks --skip-git --force-publish",
"npm run replace-with-tilde",
"npm run lerna -- exec 'npm publish --registry $Registry --tag preview'"
)
foreach ($command in $commands) {

12
npm/publish.ps1

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

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

Loading…
Cancel
Save