Browse Source

Merge branch 'dev' of https://github.com/volosoft/abp into dev

pull/1606/head
Yunus Emre Kalkan 7 years ago
parent
commit
6d2a58c019
  1. 2
      build-all.ps1
  2. 2
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/TemplateInfoProvider.cs
  3. 16
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppProTemplate.cs
  4. 115
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplate.cs
  5. 124
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateBase.cs
  6. 2
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/TemplateRandomSslPortStep.cs
  7. 2
      npm/ng-packs/packages/core/src/lib/states/config.state.ts
  8. 10
      npm/ng-packs/packages/identity/src/lib/components/roles/roles.component.html
  9. 12
      npm/ng-packs/packages/identity/src/lib/components/users/users.component.html
  10. 2
      npm/ng-packs/packages/identity/src/lib/services/identity.service.ts
  11. 10
      npm/ng-packs/packages/permission-management/src/lib/components/permission-management.component.html
  12. 21
      npm/ng-packs/packages/tenant-management/src/lib/components/tenants/tenants.component.html
  13. 7
      npm/ng-packs/packages/tenant-management/src/lib/components/tenants/tenants.component.ts
  14. 6
      npm/ng-packs/packages/tenant-management/src/lib/services/tenant-management.service.ts
  15. 10
      npm/ng-packs/packages/theme-basic/src/lib/components/change-password/change-password.component.html
  16. 12
      npm/ng-packs/packages/theme-basic/src/lib/components/profile/profile.component.html
  17. 28
      samples/BookStore-Angular-MongoDb/angular/package.json
  18. 21
      samples/BookStore-Angular-MongoDb/angular/src/app/app-routing.module.ts
  19. 4
      samples/BookStore-Angular-MongoDb/angular/src/app/app.component.ts
  20. 2
      samples/BookStore-Angular-MongoDb/angular/src/app/app.module.ts
  21. 13
      samples/BookStore-Angular-MongoDb/angular/src/app/books/books-routing.module.ts
  22. 32
      samples/BookStore-Angular-MongoDb/angular/src/app/books/books.component.html
  23. 26
      samples/BookStore-Angular-MongoDb/angular/src/app/books/books.component.ts
  24. 9
      samples/BookStore-Angular-MongoDb/angular/src/app/books/books.module.ts
  25. 0
      samples/BookStore-Angular-MongoDb/angular/src/app/books/services/books.service.spec.ts
  26. 20
      samples/BookStore-Angular-MongoDb/angular/src/app/books/services/books.service.ts
  27. 5
      samples/BookStore-Angular-MongoDb/angular/src/app/home/home.component.html
  28. 15
      samples/BookStore-Angular-MongoDb/angular/src/app/shared/services/books.service.ts
  29. 10
      samples/BookStore-Angular-MongoDb/angular/src/app/shared/shared.module.ts
  30. 1
      samples/BookStore-Angular-MongoDb/angular/src/app/store/actions/books.actions.ts
  31. 30
      samples/BookStore-Angular-MongoDb/angular/src/app/store/models/books.ts
  32. 28
      samples/BookStore-Angular-MongoDb/angular/src/app/store/states/books.state.ts
  33. 2
      samples/BookStore-Angular-MongoDb/angular/src/environments/environment.hmr.ts
  34. 2
      samples/BookStore-Angular-MongoDb/angular/src/environments/environment.prod.ts
  35. 2
      samples/BookStore-Angular-MongoDb/angular/src/environments/environment.ts
  36. 4
      templates/app/angular/package.json
  37. 1
      templates/app/angular/src/app/app-routing.module.ts
  38. 2
      templates/app/angular/src/app/home/home.component.html
  39. 10
      templates/app/angular/src/app/shared/shared.module.ts
  40. 26
      templates/app/aspnet-core/MyCompanyName.MyProjectName.sln.DotSettings
  41. 26
      templates/module/aspnet-core/MyCompanyName.MyProjectName.sln.DotSettings

2
build-all.ps1

@ -19,7 +19,7 @@ $solutionPaths = (
"modules/audit-logging", "modules/audit-logging",
"modules/background-jobs", "modules/background-jobs",
"modules/client-simulation", "modules/client-simulation",
"templates/mvc-module", "templates/module/aspnet-core",
"templates/app/aspnet-core", "templates/app/aspnet-core",
"samples/MicroserviceDemo", "samples/MicroserviceDemo",
"abp_io/AbpIoLocalization" "abp_io/AbpIoLocalization"

2
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/TemplateInfoProvider.cs

@ -19,6 +19,8 @@ namespace Volo.Abp.Cli.ProjectBuilding
{ {
case AppTemplate.TemplateName: case AppTemplate.TemplateName:
return new AppTemplate(); return new AppTemplate();
case AppProTemplate.TemplateName:
return new AppProTemplate();
case ModuleTemplate.TemplateName: case ModuleTemplate.TemplateName:
return new ModuleTemplate(); return new ModuleTemplate();
default: default:

16
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppProTemplate.cs

@ -0,0 +1,16 @@
namespace Volo.Abp.Cli.ProjectBuilding.Templates.App
{
public class AppProTemplate : AppTemplateBase
{
/// <summary>
/// "app-pro".
/// </summary>
public const string TemplateName = "app-pro";
public AppProTemplate()
: base(TemplateName)
{
}
}
}

115
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplate.cs

@ -1,123 +1,16 @@
using System.Collections.Generic; namespace Volo.Abp.Cli.ProjectBuilding.Templates.App
using Volo.Abp.Cli.ProjectBuilding.Building;
using Volo.Abp.Cli.ProjectBuilding.Building.Steps;
namespace Volo.Abp.Cli.ProjectBuilding.Templates.App
{ {
public class AppTemplate : TemplateInfo public class AppTemplate : AppTemplateBase
{ {
/// <summary> /// <summary>
/// "app". /// "app".
/// </summary> /// </summary>
public const string TemplateName = "app"; public const string TemplateName = "app";
public AppTemplate() public AppTemplate()
: base(TemplateName, DatabaseProvider.EntityFrameworkCore, UiFramework.Mvc) : base(TemplateName)
{
DocumentUrl = "https://docs.abp.io/en/abp/latest/Startup-Templates/Application";
}
public override IEnumerable<ProjectBuildPipelineStep> GetCustomSteps(ProjectBuildContext context)
{
var steps = new List<ProjectBuildPipelineStep>();
SwitchDatabaseProvider(context, steps);
DeleteUnrelatedProjects(context, steps);
RandomizeSslPorts(context, steps);
CleanupFolderHierarchy(context, steps);
return steps;
}
private static void SwitchDatabaseProvider(ProjectBuildContext context, List<ProjectBuildPipelineStep> steps)
{ {
if (context.BuildArgs.DatabaseProvider == DatabaseProvider.MongoDb)
{
steps.Add(new AppTemplateSwitchEntityFrameworkCoreToMongoDbStep());
}
if (context.BuildArgs.DatabaseProvider != DatabaseProvider.EntityFrameworkCore)
{
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.EntityFrameworkCore"));
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations"));
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.EntityFrameworkCore.Tests", projectFolderPath: "/aspnet-core/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests"));
}
if (context.BuildArgs.DatabaseProvider != DatabaseProvider.MongoDb)
{
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.MongoDB"));
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.MongoDB.Tests", projectFolderPath: "/aspnet-core/test/MyCompanyName.MyProjectName.MongoDB.Tests"));
}
}
private void DeleteUnrelatedProjects(ProjectBuildContext context, List<ProjectBuildPipelineStep> steps)
{
if (context.BuildArgs.UiFramework == UiFramework.Mvc)
{
if (context.BuildArgs.ExtraProperties.ContainsKey("tiered"))
{
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.Web"));
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.Web.Tests", projectFolderPath: "/aspnet-core/test/MyCompanyName.MyProjectName.Web.Tests"));
steps.Add(new AppTemplateProjectRenameStep("MyCompanyName.MyProjectName.Web.Host", "MyCompanyName.MyProjectName.Web"));
}
else
{
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.Web.Host"));
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.HttpApi.Host"));
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.IdentityServer"));
steps.Add(new AppTemplateChangeConsoleTestClientPortSettingsStep("44303"));
}
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.HttpApi.HostWithIds"));
}
if (context.BuildArgs.UiFramework != UiFramework.Mvc)
{
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.Web"));
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.Web.Host"));
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.Web.Tests", projectFolderPath: "/aspnet-core/test/MyCompanyName.MyProjectName.Web.Tests"));
if (context.BuildArgs.ExtraProperties.ContainsKey("separate-identity-server"))
{
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.HttpApi.HostWithIds"));
steps.Add(new AngularEnvironmentFilePortChangeForSeparatedIdentityServersStep());
}
else
{
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.HttpApi.Host"));
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.IdentityServer"));
steps.Add(new AppTemplateProjectRenameStep("MyCompanyName.MyProjectName.HttpApi.HostWithIds", "MyCompanyName.MyProjectName.HttpApi.Host"));
steps.Add(new AppTemplateChangeConsoleTestClientPortSettingsStep("44305"));
}
}
if (context.BuildArgs.UiFramework != UiFramework.Angular)
{
steps.Add(new RemoveFolderStep("/angular"));
}
}
private static void RandomizeSslPorts(ProjectBuildContext context, List<ProjectBuildPipelineStep> steps)
{
steps.Add(new TemplateRandomSslPortStep(
new List<string>
{
"https://localhost:44300",
"https://localhost:44301",
"https://localhost:44302",
"https://localhost:44303",
"https://localhost:44305"
}
)
);
}
private void CleanupFolderHierarchy(ProjectBuildContext context, List<ProjectBuildPipelineStep> steps)
{
if (context.BuildArgs.UiFramework == UiFramework.Mvc)
{
steps.Add(new MoveFolderStep("/aspnet-core/", "/"));
}
} }
} }
} }

124
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateBase.cs

@ -0,0 +1,124 @@
using System.Collections.Generic;
using Volo.Abp.Cli.ProjectBuilding.Building;
using Volo.Abp.Cli.ProjectBuilding.Building.Steps;
namespace Volo.Abp.Cli.ProjectBuilding.Templates.App
{
public abstract class AppTemplateBase : TemplateInfo
{
protected AppTemplateBase(string templateName)
: base(templateName, DatabaseProvider.EntityFrameworkCore, UiFramework.Mvc)
{
DocumentUrl = "https://docs.abp.io/en/abp/latest/Startup-Templates/Application";
}
public static bool IsAppTemplate(string templateName)
{
return templateName == AppTemplate.TemplateName ||
templateName == AppProTemplate.TemplateName;
}
public override IEnumerable<ProjectBuildPipelineStep> GetCustomSteps(ProjectBuildContext context)
{
var steps = new List<ProjectBuildPipelineStep>();
SwitchDatabaseProvider(context, steps);
DeleteUnrelatedProjects(context, steps);
RandomizeSslPorts(context, steps);
CleanupFolderHierarchy(context, steps);
return steps;
}
private static void SwitchDatabaseProvider(ProjectBuildContext context, List<ProjectBuildPipelineStep> steps)
{
if (context.BuildArgs.DatabaseProvider == DatabaseProvider.MongoDb)
{
steps.Add(new AppTemplateSwitchEntityFrameworkCoreToMongoDbStep());
}
if (context.BuildArgs.DatabaseProvider != DatabaseProvider.EntityFrameworkCore)
{
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.EntityFrameworkCore"));
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations"));
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.EntityFrameworkCore.Tests", projectFolderPath: "/aspnet-core/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests"));
}
if (context.BuildArgs.DatabaseProvider != DatabaseProvider.MongoDb)
{
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.MongoDB"));
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.MongoDB.Tests", projectFolderPath: "/aspnet-core/test/MyCompanyName.MyProjectName.MongoDB.Tests"));
}
}
private void DeleteUnrelatedProjects(ProjectBuildContext context, List<ProjectBuildPipelineStep> steps)
{
if (context.BuildArgs.UiFramework == UiFramework.Mvc)
{
if (context.BuildArgs.ExtraProperties.ContainsKey("tiered"))
{
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.Web"));
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.Web.Tests", projectFolderPath: "/aspnet-core/test/MyCompanyName.MyProjectName.Web.Tests"));
steps.Add(new AppTemplateProjectRenameStep("MyCompanyName.MyProjectName.Web.Host", "MyCompanyName.MyProjectName.Web"));
}
else
{
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.Web.Host"));
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.HttpApi.Host"));
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.IdentityServer"));
steps.Add(new AppTemplateChangeConsoleTestClientPortSettingsStep("44303"));
}
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.HttpApi.HostWithIds"));
}
if (context.BuildArgs.UiFramework != UiFramework.Mvc)
{
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.Web"));
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.Web.Host"));
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.Web.Tests", projectFolderPath: "/aspnet-core/test/MyCompanyName.MyProjectName.Web.Tests"));
if (context.BuildArgs.ExtraProperties.ContainsKey("separate-identity-server"))
{
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.HttpApi.HostWithIds"));
steps.Add(new AngularEnvironmentFilePortChangeForSeparatedIdentityServersStep());
}
else
{
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.HttpApi.Host"));
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.IdentityServer"));
steps.Add(new AppTemplateProjectRenameStep("MyCompanyName.MyProjectName.HttpApi.HostWithIds", "MyCompanyName.MyProjectName.HttpApi.Host"));
steps.Add(new AppTemplateChangeConsoleTestClientPortSettingsStep("44305"));
}
}
if (context.BuildArgs.UiFramework != UiFramework.Angular)
{
steps.Add(new RemoveFolderStep("/angular"));
}
}
private static void RandomizeSslPorts(ProjectBuildContext context, List<ProjectBuildPipelineStep> steps)
{
steps.Add(new TemplateRandomSslPortStep(
new List<string>
{
"https://localhost:44300",
"https://localhost:44301",
"https://localhost:44302",
"https://localhost:44303",
"https://localhost:44305"
}
)
);
}
private void CleanupFolderHierarchy(ProjectBuildContext context, List<ProjectBuildPipelineStep> steps)
{
if (context.BuildArgs.UiFramework == UiFramework.Mvc)
{
steps.Add(new MoveFolderStep("/aspnet-core/", "/"));
}
}
}
}

2
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/TemplateRandomSslPortStep.cs

@ -44,7 +44,7 @@ namespace Volo.Abp.Cli.ProjectBuilding.Templates
) )
.ToList(); .ToList();
if (context.Template.Name == AppTemplate.TemplateName) if (AppTemplateBase.IsAppTemplate(context.Template.Name))
{ {
// no tiered // no tiered
if (launchSettings.Count == 1 && if (launchSettings.Count == 1 &&

2
npm/ng-packs/packages/core/src/lib/states/config.state.ts

@ -113,6 +113,8 @@ export class ConfigState {
const selector = createSelector( const selector = createSelector(
[ConfigState], [ConfigState],
function(state: Config.State) { function(state: Config.State) {
if (!state.localization) return key;
const { defaultResourceName } = state.environment.localization; const { defaultResourceName } = state.environment.localization;
if (keys[0] === '') { if (keys[0] === '') {
if (!defaultResourceName) { if (!defaultResourceName) {

10
npm/ng-packs/packages/identity/src/lib/components/roles/roles.component.html

@ -100,9 +100,13 @@
<button type="button" class="btn btn-secondary" #abpClose> <button type="button" class="btn btn-secondary" #abpClose>
{{ 'AbpIdentity::Cancel' | abpLocalization }} {{ 'AbpIdentity::Cancel' | abpLocalization }}
</button> </button>
<button type="button" class="btn btn-primary" (click)="save()"> <abp-button
<i class="fa fa-check mr-1"></i> <span>{{ 'AbpIdentity::Save' | abpLocalization }}</span> [requestType]="['POST', 'PUT']"
</button> requestURLContainSearchValue="roles"
iconClass="fa fa-check"
(click)="save()"
>{{ 'AbpIdentity::Save' | abpLocalization }}</abp-button
>
</ng-template> </ng-template>
</abp-modal> </abp-modal>

12
npm/ng-packs/packages/identity/src/lib/components/users/users.component.html

@ -84,7 +84,7 @@
<ng-template #abpBody> <ng-template #abpBody>
<perfect-scrollbar class="ps-show-always" style="max-height: 70vh;"> <perfect-scrollbar class="ps-show-always" style="max-height: 70vh;">
<form [formGroup]="form"> <form [formGroup]="form" validateOnSubmit>
<ngb-tabset> <ngb-tabset>
<ngb-tab [title]="'AbpIdentity::UserInformations' | abpLocalization"> <ngb-tab [title]="'AbpIdentity::UserInformations' | abpLocalization">
<ng-template ngbTabContent> <ng-template ngbTabContent>
@ -183,9 +183,13 @@
<button type="button" class="btn btn-secondary" #abpClose> <button type="button" class="btn btn-secondary" #abpClose>
{{ 'AbpIdentity::Cancel' | abpLocalization }} {{ 'AbpIdentity::Cancel' | abpLocalization }}
</button> </button>
<button type="button" class="btn btn-primary" (click)="save()"> <abp-button
<i class="fa fa-check mr-1"></i> <span>{{ 'AbpIdentity::Save' | abpLocalization }}</span> [requestType]="['POST', 'PUT']"
</button> requestURLContainSearchValue="users"
iconClass="fa fa-check"
(click)="save()"
>{{ 'AbpIdentity::Save' | abpLocalization }}</abp-button
>
</ng-template> </ng-template>
</abp-modal> </abp-modal>

2
npm/ng-packs/packages/identity/src/lib/services/identity.service.ts

@ -108,7 +108,7 @@ export class IdentityService {
} }
updateUser(body: Identity.UserItem): Observable<Identity.UserItem> { updateUser(body: Identity.UserItem): Observable<Identity.UserItem> {
const url = `/identity/users/${body.id}`; const url = `/api/identity/users/${body.id}`;
delete body.id; delete body.id;
const request: Rest.Request<Identity.UserItem> = { const request: Rest.Request<Identity.UserItem> = {

10
npm/ng-packs/packages/permission-management/src/lib/components/permission-management.component.html

@ -82,9 +82,13 @@
<button type="button" class="btn btn-secondary" #abpClose> <button type="button" class="btn btn-secondary" #abpClose>
{{ 'AbpIdentity::Cancel' | abpLocalization }} {{ 'AbpIdentity::Cancel' | abpLocalization }}
</button> </button>
<button type="submit" class="btn btn-primary" (click)="onSubmit()"> <abp-button
<i class="fa fa-check mr-1"></i> <span>{{ 'AbpIdentity::Save' | abpLocalization }}</span> [requestType]="['PUT']"
</button> requestURLContainSearchValue="permissions"
iconClass="fa fa-check"
(click)="onSubmit()"
>{{ 'AbpIdentity::Save' | abpLocalization }}</abp-button
>
</ng-template> </ng-template>
</ng-container> </ng-container>
</abp-modal> </abp-modal>

21
npm/ng-packs/packages/tenant-management/src/lib/components/tenants/tenants.component.html

@ -73,13 +73,6 @@
> >
{{ 'AbpTenantManagement::ConnectionStrings' | abpLocalization }} {{ 'AbpTenantManagement::ConnectionStrings' | abpLocalization }}
</button> </button>
<button
[abpPermission]="'AbpTenantManagement.Tenants.ManageFeatures'"
ngbDropdownItem
(click)="onManageFeatures(data.id)"
>
{{ 'AbpTenantManagement::Features' | abpLocalization }}
</button>
<button <button
[abpPermission]="'AbpTenantManagement.Tenants.Delete'" [abpPermission]="'AbpTenantManagement.Tenants.Delete'"
ngbDropdownItem ngbDropdownItem
@ -110,9 +103,13 @@
<button #abpClose type="button" class="btn btn-secondary"> <button #abpClose type="button" class="btn btn-secondary">
{{ 'AbpTenantManagement::Cancel' | abpLocalization }} {{ 'AbpTenantManagement::Cancel' | abpLocalization }}
</button> </button>
<button class="btn btn-primary" type="button" (click)="save()"> <abp-button
{{ 'AbpTenantManagement::Save' | abpLocalization }} [requestType]="['POST', 'PUT', 'DELETE']"
</button> requestURLContainSearchValue="change-password"
iconClass="fa fa-check"
(click)="save()"
>{{ 'AbpIdentity::Save' | abpLocalization }}</abp-button
>
</ng-template> </ng-template>
</abp-modal> </abp-modal>
@ -158,7 +155,3 @@
</div> </div>
</form> </form>
</ng-template> </ng-template>
<ng-template #featuresModalTemplate>
Manage Features
</ng-template>

7
npm/ng-packs/packages/tenant-management/src/lib/components/tenants/tenants.component.ts

@ -68,9 +68,6 @@ export class TenantsComponent implements OnInit {
@ViewChild('connectionStringModalTemplate', { static: false }) @ViewChild('connectionStringModalTemplate', { static: false })
connectionStringModalTemplate: TemplateRef<any>; connectionStringModalTemplate: TemplateRef<any>;
@ViewChild('featuresModalTemplate', { static: false })
featuresModalTemplate: TemplateRef<any>;
constructor( constructor(
private confirmationService: ConfirmationService, private confirmationService: ConfirmationService,
private tenantService: TenantManagementService, private tenantService: TenantManagementService,
@ -126,10 +123,6 @@ export class TenantsComponent implements OnInit {
}); });
} }
onManageFeatures(id: string) {
this.openModal('AbpTenantManagement::Features', this.featuresModalTemplate, 'saveFeatures');
}
onAddTenant() { onAddTenant() {
this.selected = {} as ABP.BasicItem; this.selected = {} as ABP.BasicItem;
this.createTenantForm(); this.createTenantForm();

6
npm/ng-packs/packages/tenant-management/src/lib/services/tenant-management.service.ts

@ -61,7 +61,7 @@ export class TenantManagementService {
} }
getDefaultConnectionString(id: string): Observable<string> { getDefaultConnectionString(id: string): Observable<string> {
const url = `/api/multi-tenancy/tenants/${id}/defaultConnectionString`; const url = `/api/multi-tenancy/tenants/${id}/default-connection-string`;
const request: Rest.Request<TenantManagement.DefaultConnectionStringRequest> = { const request: Rest.Request<TenantManagement.DefaultConnectionStringRequest> = {
method: 'GET', method: 'GET',
@ -72,7 +72,7 @@ export class TenantManagementService {
} }
updateDefaultConnectionString(payload: TenantManagement.DefaultConnectionStringRequest): Observable<any> { updateDefaultConnectionString(payload: TenantManagement.DefaultConnectionStringRequest): Observable<any> {
const url = `/api/multi-tenancy/tenants/${payload.id}/defaultConnectionString`; const url = `/api/multi-tenancy/tenants/${payload.id}/default-connection-string`;
const request: Rest.Request<TenantManagement.DefaultConnectionStringRequest> = { const request: Rest.Request<TenantManagement.DefaultConnectionStringRequest> = {
method: 'PUT', method: 'PUT',
@ -83,7 +83,7 @@ export class TenantManagementService {
} }
deleteDefaultConnectionString(id: string): Observable<string> { deleteDefaultConnectionString(id: string): Observable<string> {
const url = `/api/multi-tenancy/tenant/${id}/defaultConnectionString`; const url = `/api/multi-tenancy/tenant/${id}/default-connection-string`;
const request: Rest.Request<TenantManagement.DefaultConnectionStringRequest> = { const request: Rest.Request<TenantManagement.DefaultConnectionStringRequest> = {
method: 'DELETE', method: 'DELETE',

10
npm/ng-packs/packages/theme-basic/src/lib/components/change-password/change-password.component.html

@ -27,8 +27,12 @@
<button type="button" class="btn btn-secondary" #abpClose> <button type="button" class="btn btn-secondary" #abpClose>
{{ 'AbpIdentity::Cancel' | abpLocalization }} {{ 'AbpIdentity::Cancel' | abpLocalization }}
</button> </button>
<button type="button" class="btn btn-primary" (click)="onSubmit()"> <abp-button
<i class="fa fa-check mr-1"></i> <span>{{ 'AbpIdentity::Save' | abpLocalization }}</span> [requestType]="['POST']"
</button> requestURLContainSearchValue="change-password"
iconClass="fa fa-check"
(click)="onSubmit()"
>{{ 'AbpIdentity::Save' | abpLocalization }}</abp-button
>
</ng-template> </ng-template>
</abp-modal> </abp-modal>

12
npm/ng-packs/packages/theme-basic/src/lib/components/profile/profile.component.html

@ -6,7 +6,7 @@
<form *ngIf="form" [formGroup]="form" novalidate> <form *ngIf="form" [formGroup]="form" novalidate>
<div class="form-group"> <div class="form-group">
<label for="username">{{ 'AbpIdentity::DisplayName:UserName' | abpLocalization }}</label <label for="username">{{ 'AbpIdentity::DisplayName:UserName' | abpLocalization }}</label
><span> * </span><input type="text" id="username" class="form-control" formControlName="userName" autofocus/> ><span> * </span><input type="text" id="username" class="form-control" formControlName="userName" autofocus />
</div> </div>
<div class="row"> <div class="row">
<div class="col col-md-6"> <div class="col col-md-6">
@ -36,8 +36,12 @@
<button #abpClose type="button" class="btn btn-secondary"> <button #abpClose type="button" class="btn btn-secondary">
{{ 'AbpIdentity::Cancel' | abpLocalization }} {{ 'AbpIdentity::Cancel' | abpLocalization }}
</button> </button>
<button type="button" class="btn btn-primary" (click)="onSubmit()"> <abp-button
<i class="fa fa-check mr-1"></i> <span>{{ 'AbpIdentity::Save' | abpLocalization }}</span> [requestType]="['PUT']"
</button> requestURLContainSearchValue="my-profile"
iconClass="fa fa-check"
(click)="onSubmit()"
>{{ 'AbpIdentity::Save' | abpLocalization }}</abp-button
>
</ng-template> </ng-template>
</abp-modal> </abp-modal>

28
samples/BookStore-Angular-MongoDb/angular/package.json

@ -1,5 +1,5 @@
{ {
"name": "my-project-name", "name": "BookStore",
"version": "0.0.0", "version": "0.0.0",
"scripts": { "scripts": {
"ng": "ng", "ng": "ng",
@ -17,14 +17,14 @@
"@abp/ng.identity": "^0.8.0", "@abp/ng.identity": "^0.8.0",
"@abp/ng.tenant-management": "^0.8.0", "@abp/ng.tenant-management": "^0.8.0",
"@abp/ng.theme.basic": "^0.8.0", "@abp/ng.theme.basic": "^0.8.0",
"@angular/animations": "~8.1.2", "@angular/animations": "~8.2.0",
"@angular/common": "~8.1.2", "@angular/common": "~8.2.0",
"@angular/compiler": "~8.1.2", "@angular/compiler": "~8.2.0",
"@angular/core": "~8.1.2", "@angular/core": "~8.2.0",
"@angular/forms": "~8.1.2", "@angular/forms": "~8.2.0",
"@angular/platform-browser": "~8.1.2", "@angular/platform-browser": "~8.2.0",
"@angular/platform-browser-dynamic": "~8.1.2", "@angular/platform-browser-dynamic": "~8.2.0",
"@angular/router": "~8.1.2", "@angular/router": "~8.2.0",
"@angularclass/hmr": "^2.1.3", "@angularclass/hmr": "^2.1.3",
"@ngxs/devtools-plugin": "^3.5.0", "@ngxs/devtools-plugin": "^3.5.0",
"@ngxs/hmr-plugin": "^3.5.0", "@ngxs/hmr-plugin": "^3.5.0",
@ -33,10 +33,10 @@
"zone.js": "~0.9.1" "zone.js": "~0.9.1"
}, },
"devDependencies": { "devDependencies": {
"@angular-devkit/build-angular": "~0.801.2", "@angular-devkit/build-angular": "~0.802.0",
"@angular/cli": "~8.1.2", "@angular/cli": "~8.2.0",
"@angular/compiler-cli": "~8.1.2", "@angular/compiler-cli": "~8.2.0",
"@angular/language-service": "~8.1.2", "@angular/language-service": "~8.2.0",
"@types/jasmine": "~3.3.8", "@types/jasmine": "~3.3.8",
"@types/jasminewd2": "~2.0.3", "@types/jasminewd2": "~2.0.3",
"@types/node": "~8.9.4", "@types/node": "~8.9.4",
@ -48,7 +48,7 @@
"karma-coverage-istanbul-reporter": "~2.0.1", "karma-coverage-istanbul-reporter": "~2.0.1",
"karma-jasmine": "~2.0.1", "karma-jasmine": "~2.0.1",
"karma-jasmine-html-reporter": "^1.4.0", "karma-jasmine-html-reporter": "^1.4.0",
"ngxs-schematic": "^1.1.5", "ngxs-schematic": "^1.1.6",
"protractor": "~5.4.0", "protractor": "~5.4.0",
"ts-node": "~7.0.0", "ts-node": "~7.0.0",
"tslint": "~5.15.0", "tslint": "~5.15.0",

21
samples/BookStore-Angular-MongoDb/angular/src/app/app-routing.module.ts

@ -6,21 +6,15 @@ import { ABP } from '@abp/ng.core';
import { TENANT_MANAGEMENT_ROUTES } from '@abp/ng.tenant-management'; import { TENANT_MANAGEMENT_ROUTES } from '@abp/ng.tenant-management';
const routes: Routes = [ const routes: Routes = [
{ path: '', redirectTo: '/home', pathMatch: 'full' },
{ {
path: 'home', path: '',
loadChildren: () => import('./home/home.module').then(m => m.HomeModule), loadChildren: () => import('./home/home.module').then(m => m.HomeModule),
data: { data: {
routes: { routes: {
name: 'Home', name: '::Menu:Home',
} as ABP.Route, } as ABP.Route,
}, },
}, },
{ path: 'books', loadChildren: () => import('./books/books.module').then(m => m.BooksModule), data: {
routes: {
name: 'Books',
} as ABP.Route,
}, },
{ {
path: 'account', path: 'account',
loadChildren: () => import('./lazy-libs/account-wrapper.module').then(m => m.AccountWrapperModule), loadChildren: () => import('./lazy-libs/account-wrapper.module').then(m => m.AccountWrapperModule),
@ -37,8 +31,15 @@ const routes: Routes = [
import('./lazy-libs/tenant-management-wrapper.module').then(m => m.TenantManagementWrapperModule), import('./lazy-libs/tenant-management-wrapper.module').then(m => m.TenantManagementWrapperModule),
data: { routes: TENANT_MANAGEMENT_ROUTES }, data: { routes: TENANT_MANAGEMENT_ROUTES },
}, },
{ path: '**', redirectTo: '/' }, {
path: 'books',
loadChildren: () => import('./books/books.module').then(m => m.BooksModule),
data: {
routes: {
name: 'Books',
} as ABP.Route,
},
},
]; ];
@NgModule({ @NgModule({

4
samples/BookStore-Angular-MongoDb/angular/src/app/app.component.ts

@ -7,6 +7,4 @@ import { Component } from '@angular/core';
<router-outlet></router-outlet> <router-outlet></router-outlet>
`, `,
}) })
export class AppComponent { export class AppComponent {}
title = 'myProjectName';
}

2
samples/BookStore-Angular-MongoDb/angular/src/app/app.module.ts

@ -12,14 +12,12 @@ import { AppComponent } from './app.component';
import { SharedModule } from './shared/shared.module'; import { SharedModule } from './shared/shared.module';
import { ThemeSharedModule } from '@abp/ng.theme.shared'; import { ThemeSharedModule } from '@abp/ng.theme.shared';
import { BooksState } from './store/states/books.state'; import { BooksState } from './store/states/books.state';
import { HttpClientModule } from '@angular/common/http';
@NgModule({ @NgModule({
declarations: [AppComponent], declarations: [AppComponent],
imports: [ imports: [
BrowserModule, BrowserModule,
BrowserAnimationsModule, BrowserAnimationsModule,
HttpClientModule,
AppRoutingModule, AppRoutingModule,
SharedModule, SharedModule,
ThemeSharedModule.forRoot(), ThemeSharedModule.forRoot(),

13
samples/BookStore-Angular-MongoDb/angular/src/app/books/books-routing.module.ts

@ -1,19 +1,14 @@
import { NgModule } from '@angular/core'; import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router'; import { Routes, RouterModule } from '@angular/router';
import { BooksComponent } from './books.component';
import { LayoutApplicationComponent } from '@abp/ng.theme.basic'; import { LayoutApplicationComponent } from '@abp/ng.theme.basic';
import { BooksComponent } from './books.component';
const routes: Routes = [ const routes: Routes = [
{ { path: '', component: LayoutApplicationComponent, children: [{ path: '', component: BooksComponent }] },
path: '',
component: LayoutApplicationComponent,
children: [{ path: '', component: BooksComponent }],
},
]; ];
@NgModule({ @NgModule({
imports: [RouterModule.forChild(routes)], imports: [RouterModule.forChild(routes)],
exports: [RouterModule] exports: [RouterModule],
}) })
export class BooksRoutingModule { } export class BooksRoutingModule {}

32
samples/BookStore-Angular-MongoDb/angular/src/app/books/books.component.html

@ -1 +1,31 @@
<p>books works!</p> <div id="wrapper" class="card">
<div class="card-header">
<div class="row">
<div class="col col-md-6">
<h5 class="card-title">
Books
</h5>
</div>
</div>
</div>
<div class="card-body">
<p-table [value]="books$ | async" [loading]="loading" [paginator]="true" [rows]="10">
<ng-template pTemplate="header">
<tr>
<th>Book name</th>
<th>Book type</th>
<th>Publish date</th>
<th>Price</th>
</tr>
</ng-template>
<ng-template pTemplate="body" let-data>
<tr>
<td>{{ data.name }}</td>
<td>{{ bookType[data.type] }}</td>
<td>{{ data.publishDate | date }}</td>
<td>{{ data.price }}</td>
</tr>
</ng-template>
</p-table>
</div>
</div>

26
samples/BookStore-Angular-MongoDb/angular/src/app/books/books.component.ts

@ -1,13 +1,27 @@
import { Component, OnInit } from "@angular/core"; import { Component, OnInit } from '@angular/core';
import { Store } from "@ngxs/store"; import { Store, Select } from '@ngxs/store';
import { BooksState } from '../store/states';
import { Observable } from 'rxjs';
import { Books } from '../store/models';
import { BooksGet } from '../store/actions';
@Component({ @Component({
selector: "app-books", selector: 'app-books',
templateUrl: "./books.component.html", templateUrl: './books.component.html',
styleUrls: ["./books.component.scss"] styleUrls: ['./books.component.scss'],
}) })
export class BooksComponent implements OnInit { export class BooksComponent implements OnInit {
@Select(BooksState.getBooks)
books$: Observable<Books.Item[]>;
bookType = Books.Type;
loading = false;
constructor(private store: Store) {} constructor(private store: Store) {}
ngOnInit() {} ngOnInit() {
this.loading = true;
this.store.dispatch(new BooksGet()).subscribe(() => (this.loading = false));
}
} }

9
samples/BookStore-Angular-MongoDb/angular/src/app/books/books.module.ts

@ -5,13 +5,8 @@ import { BooksRoutingModule } from './books-routing.module';
import { BooksComponent } from './books.component'; import { BooksComponent } from './books.component';
import { SharedModule } from '../shared/shared.module'; import { SharedModule } from '../shared/shared.module';
@NgModule({ @NgModule({
declarations: [BooksComponent], declarations: [BooksComponent],
imports: [ imports: [CommonModule, BooksRoutingModule, SharedModule],
CommonModule,
BooksRoutingModule,
SharedModule
]
}) })
export class BooksModule { } export class BooksModule {}

0
samples/BookStore-Angular-MongoDb/angular/src/app/shared/services/books.service.spec.ts → samples/BookStore-Angular-MongoDb/angular/src/app/books/services/books.service.spec.ts

20
samples/BookStore-Angular-MongoDb/angular/src/app/books/services/books.service.ts

@ -0,0 +1,20 @@
import { Injectable } from '@angular/core';
import { RestService, Rest } from '@abp/ng.core';
import { Books } from '../../store/models';
import { Observable } from 'rxjs';
@Injectable({
providedIn: 'root',
})
export class BooksService {
constructor(private rest: RestService) {}
get(): Observable<Books.Response> {
const request: Rest.Request<null> = {
method: 'GET',
url: '/api/app/book',
};
return this.rest.request<null, Books.Response>(request);
}
}

5
samples/BookStore-Angular-MongoDb/angular/src/app/home/home.component.html

@ -1,9 +1,8 @@
<div class="card"> <div class="card">
<div class="card-header">Welcome</div> <div class="card-header">{{ '::Welcome' | abpLocalization }}</div>
<div class="card-body"> <div class="card-body">
<p> <p>
Welcome to the application. This is a startup project based on the ABP framework. For more information, visit {{ '::LongWelcomeMessage' | abpLocalization }}
abp.io.
</p> </p>
<p *ngIf="!hasLoggedIn"> <p *ngIf="!hasLoggedIn">
<a routerLink="/account/login" [state]="{ redirectUrl: '/home' }" class="btn btn-primary" role="button" <a routerLink="/account/login" [state]="{ redirectUrl: '/home' }" class="btn btn-primary" role="button"

15
samples/BookStore-Angular-MongoDb/angular/src/app/shared/services/books.service.ts

@ -1,15 +0,0 @@
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { environment } from 'src/environments/environment';
@Injectable({
providedIn: 'root'
})
export class BooksService {
constructor(private http: HttpClient) { }
get() {
return this.http.get(`${environment.apis.default.url}/app/book`)
}
}

10
samples/BookStore-Angular-MongoDb/angular/src/app/shared/shared.module.ts

@ -1,12 +1,14 @@
import { NgModule } from '@angular/core';
import { ThemeSharedModule } from '@abp/ng.theme.shared';
import { CoreModule } from '@abp/ng.core'; import { CoreModule } from '@abp/ng.core';
import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap';
import { NgModule } from '@angular/core';
import { ThemeBasicModule } from '@abp/ng.theme.basic'; import { ThemeBasicModule } from '@abp/ng.theme.basic';
import { ThemeSharedModule } from '@abp/ng.theme.shared';
import { TableModule } from 'primeng/table';
@NgModule({ @NgModule({
declarations: [], declarations: [],
imports: [CoreModule, ThemeSharedModule, ThemeBasicModule], imports: [CoreModule, ThemeSharedModule, ThemeBasicModule, TableModule, NgbDropdownModule],
exports: [CoreModule, ThemeSharedModule, ThemeBasicModule], exports: [CoreModule, ThemeSharedModule, ThemeBasicModule, TableModule, NgbDropdownModule],
providers: [], providers: [],
}) })
export class SharedModule {} export class SharedModule {}

1
samples/BookStore-Angular-MongoDb/angular/src/app/store/actions/books.actions.ts

@ -1,4 +1,3 @@
export class BooksGet { export class BooksGet {
static readonly type = '[Books] Get'; static readonly type = '[Books] Get';
constructor(public readonly payload?: any) { }
} }

30
samples/BookStore-Angular-MongoDb/angular/src/app/store/models/books.ts

@ -1,5 +1,33 @@
import { ABP } from '@abp/ng.core';
export namespace Books { export namespace Books {
export interface State { export interface State {
data: any; data: Response;
}
export type Response = ABP.PagedResponse<Item>;
export interface Item {
name: string;
type: Type;
publishDate: string;
price: number;
lastModificationTime: string;
lastModifierId: string;
creationTime: string;
creatorId: string;
id: string;
}
export enum Type {
Undefined,
Adventure,
Biography,
Dystopia,
Fantastic,
Horror,
Science,
ScienceFiction,
Poetry,
} }
} }

28
samples/BookStore-Angular-MongoDb/angular/src/app/store/states/books.state.ts

@ -1,27 +1,29 @@
import { State, Action, StateContext } from "@ngxs/store"; import { State, Action, StateContext, Selector } from '@ngxs/store';
import { BooksGet } from "../actions/books.actions"; import { BooksGet } from '../actions/books.actions';
import { Books } from "../models/books"; import { Books } from '../models/books';
import { BooksService } from "src/app/shared/services/books.service"; import { BooksService } from '../../books/services/books.service';
import { tap } from "rxjs/operators"; import { tap } from 'rxjs/operators';
@State<Books.State>({ @State<Books.State>({
name: "BooksState", name: 'BooksState',
defaults: {} as Books.State defaults: { data: {} } as Books.State,
}) })
export class BooksState { export class BooksState {
@Selector()
static getBooks({ data }: Books.State) {
return data.items || [];
}
constructor(private booksService: BooksService) {} constructor(private booksService: BooksService) {}
@Action(BooksGet) @Action(BooksGet)
booksAction( getBooks({ patchState }: StateContext<Books.State>) {
{ getState, patchState }: StateContext<Books.State>,
{ payload }: BooksGet
) {
return this.booksService.get().pipe( return this.booksService.get().pipe(
tap(data => { tap(data => {
patchState({ patchState({
data data,
}); });
}) }),
); );
} }
} }

2
samples/BookStore-Angular-MongoDb/angular/src/environments/environment.hmr.ts

@ -3,7 +3,7 @@ export const environment = {
hmr: true, hmr: true,
oAuthConfig: { oAuthConfig: {
issuer: 'https://localhost:44359', issuer: 'https://localhost:44359',
clientId: 'BookStore_ConsoleTestApp', clientId: 'BookStore_App',
dummyClientSecret: '1q2w3e*', dummyClientSecret: '1q2w3e*',
scope: 'BookStore', scope: 'BookStore',
showDebugInformation: true, showDebugInformation: true,

2
samples/BookStore-Angular-MongoDb/angular/src/environments/environment.prod.ts

@ -3,7 +3,7 @@ export const environment = {
hmr: false, hmr: false,
oAuthConfig: { oAuthConfig: {
issuer: 'https://localhost:44359', issuer: 'https://localhost:44359',
clientId: 'BookStore_ConsoleTestApp', clientId: 'BookStore_App',
dummyClientSecret: '1q2w3e*', dummyClientSecret: '1q2w3e*',
scope: 'BookStore', scope: 'BookStore',
showDebugInformation: true, showDebugInformation: true,

2
samples/BookStore-Angular-MongoDb/angular/src/environments/environment.ts

@ -3,7 +3,7 @@ export const environment = {
hmr: false, hmr: false,
oAuthConfig: { oAuthConfig: {
issuer: 'https://localhost:44359', issuer: 'https://localhost:44359',
clientId: 'BookStore_ConsoleTestApp', clientId: 'BookStore_App',
dummyClientSecret: '1q2w3e*', dummyClientSecret: '1q2w3e*',
scope: 'BookStore', scope: 'BookStore',
showDebugInformation: true, showDebugInformation: true,

4
templates/app/angular/package.json

@ -1,5 +1,5 @@
{ {
"name": "my-project-name", "name": "MyProjectName",
"version": "0.0.0", "version": "0.0.0",
"scripts": { "scripts": {
"ng": "ng", "ng": "ng",
@ -48,7 +48,7 @@
"karma-coverage-istanbul-reporter": "~2.0.1", "karma-coverage-istanbul-reporter": "~2.0.1",
"karma-jasmine": "~2.0.1", "karma-jasmine": "~2.0.1",
"karma-jasmine-html-reporter": "^1.4.0", "karma-jasmine-html-reporter": "^1.4.0",
"ngxs-schematic": "^1.1.5", "ngxs-schematic": "^1.1.6",
"protractor": "~5.4.0", "protractor": "~5.4.0",
"ts-node": "~7.0.0", "ts-node": "~7.0.0",
"tslint": "~5.15.0", "tslint": "~5.15.0",

1
templates/app/angular/src/app/app-routing.module.ts

@ -31,7 +31,6 @@ const routes: Routes = [
import('./lazy-libs/tenant-management-wrapper.module').then(m => m.TenantManagementWrapperModule), import('./lazy-libs/tenant-management-wrapper.module').then(m => m.TenantManagementWrapperModule),
data: { routes: TENANT_MANAGEMENT_ROUTES }, data: { routes: TENANT_MANAGEMENT_ROUTES },
}, },
{ path: '**', redirectTo: '/' },
]; ];
@NgModule({ @NgModule({

2
templates/app/angular/src/app/home/home.component.html

@ -5,7 +5,7 @@
{{ '::LongWelcomeMessage' | abpLocalization }} {{ '::LongWelcomeMessage' | abpLocalization }}
</p> </p>
<p *ngIf="!hasLoggedIn"> <p *ngIf="!hasLoggedIn">
<a routerLink="/account/login" [state]="{ redirectUrl: '/home' }" class="btn btn-primary" role="button" <a routerLink="/account/login" [state]="{ redirectUrl: '/' }" class="btn btn-primary" role="button"
><i class="fa fa-sign-in"></i>{{ 'AbpIdentity::Login' | abpLocalization }}</a ><i class="fa fa-sign-in"></i>{{ 'AbpIdentity::Login' | abpLocalization }}</a
> >
</p> </p>

10
templates/app/angular/src/app/shared/shared.module.ts

@ -1,12 +1,14 @@
import { NgModule } from '@angular/core';
import { ThemeSharedModule } from '@abp/ng.theme.shared';
import { CoreModule } from '@abp/ng.core'; import { CoreModule } from '@abp/ng.core';
import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap';
import { NgModule } from '@angular/core';
import { ThemeBasicModule } from '@abp/ng.theme.basic'; import { ThemeBasicModule } from '@abp/ng.theme.basic';
import { ThemeSharedModule } from '@abp/ng.theme.shared';
import { TableModule } from 'primeng/table';
@NgModule({ @NgModule({
declarations: [], declarations: [],
imports: [CoreModule, ThemeSharedModule, ThemeBasicModule], imports: [CoreModule, ThemeSharedModule, ThemeBasicModule, TableModule, NgbDropdownModule],
exports: [CoreModule, ThemeSharedModule, ThemeBasicModule], exports: [CoreModule, ThemeSharedModule, ThemeBasicModule, TableModule, NgbDropdownModule],
providers: [], providers: [],
}) })
export class SharedModule {} export class SharedModule {}

26
templates/app/aspnet-core/MyCompanyName.MyProjectName.sln.DotSettings

@ -1,7 +1,23 @@
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation"> <wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<s:Boolean x:Key="/Default/Environment/InjectedLayers/FileInjectedLayer/=59923913AE66194DB837F628B1FC08BE/@KeyIndexDefined">True</s:Boolean> <s:Boolean x:Key="/Default/CodeEditing/Intellisense/CodeCompletion/IntelliSenseCompletingCharacters/CSharpCompletingCharacters/UpgradedFromVSSettings/@EntryValue">True</s:Boolean>
<s:String x:Key="/Default/Environment/InjectedLayers/FileInjectedLayer/=59923913AE66194DB837F628B1FC08BE/AbsolutePath/@EntryValue">D:\github\abp\common.DotSettings</s:String> <s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=EnforceDoWhileStatementBraces/@EntryIndexedValue">WARNING</s:String>
<s:String x:Key="/Default/Environment/InjectedLayers/FileInjectedLayer/=59923913AE66194DB837F628B1FC08BE/RelativePath/@EntryValue">..\..\..\common.DotSettings</s:String> <s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=EnforceFixedStatementBraces/@EntryIndexedValue">WARNING</s:String>
<s:Boolean x:Key="/Default/Environment/InjectedLayers/InjectedLayerCustomization/=File59923913AE66194DB837F628B1FC08BE/@KeyIndexDefined">True</s:Boolean> <s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=EnforceForeachStatementBraces/@EntryIndexedValue">WARNING</s:String>
<s:Double x:Key="/Default/Environment/InjectedLayers/InjectedLayerCustomization/=File59923913AE66194DB837F628B1FC08BE/RelativePriority/@EntryValue">1</s:Double> <s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=EnforceForStatementBraces/@EntryIndexedValue">WARNING</s:String>
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=EnforceIfStatementBraces/@EntryIndexedValue">WARNING</s:String>
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=EnforceLockStatementBraces/@EntryIndexedValue">WARNING</s:String>
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=EnforceUsingStatementBraces/@EntryIndexedValue">WARNING</s:String>
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=EnforceWhileStatementBraces/@EntryIndexedValue">WARNING</s:String>
<s:String x:Key="/Default/CodeStyle/CodeFormatting/CSharpCodeStyle/BRACES_FOR_FOR/@EntryValue">Required</s:String>
<s:String x:Key="/Default/CodeStyle/CodeFormatting/CSharpCodeStyle/BRACES_FOR_FOREACH/@EntryValue">Required</s:String>
<s:String x:Key="/Default/CodeStyle/CodeFormatting/CSharpCodeStyle/BRACES_FOR_IFELSE/@EntryValue">Required</s:String>
<s:String x:Key="/Default/CodeStyle/CodeFormatting/CSharpCodeStyle/BRACES_FOR_WHILE/@EntryValue">Required</s:String>
<s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/CSharpCodeStyle/BRACES_REDUNDANT/@EntryValue">False</s:Boolean>
<s:Boolean x:Key="/Default/CodeStyle/Generate/=Implementations/@KeyIndexDefined">True</s:Boolean>
<s:String x:Key="/Default/CodeStyle/Generate/=Implementations/Options/=Async/@EntryIndexedValue">False</s:String>
<s:String x:Key="/Default/CodeStyle/Generate/=Implementations/Options/=Mutable/@EntryIndexedValue">False</s:String>
<s:Boolean x:Key="/Default/CodeStyle/Generate/=Overrides/@KeyIndexDefined">True</s:Boolean>
<s:String x:Key="/Default/CodeStyle/Generate/=Overrides/Options/=Async/@EntryIndexedValue">False</s:String>
<s:String x:Key="/Default/CodeStyle/Generate/=Overrides/Options/=Mutable/@EntryIndexedValue">False</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=SQL/@EntryIndexedValue">SQL</s:String>
</wpf:ResourceDictionary> </wpf:ResourceDictionary>

26
templates/module/aspnet-core/MyCompanyName.MyProjectName.sln.DotSettings

@ -1,7 +1,23 @@
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation"> <wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<s:Boolean x:Key="/Default/Environment/InjectedLayers/FileInjectedLayer/=A9046795AF04F2428C81EEAFEDBD18EE/@KeyIndexDefined">True</s:Boolean> <s:Boolean x:Key="/Default/CodeEditing/Intellisense/CodeCompletion/IntelliSenseCompletingCharacters/CSharpCompletingCharacters/UpgradedFromVSSettings/@EntryValue">True</s:Boolean>
<s:String x:Key="/Default/Environment/InjectedLayers/FileInjectedLayer/=A9046795AF04F2428C81EEAFEDBD18EE/AbsolutePath/@EntryValue">D:\github\abp\common.DotSettings</s:String> <s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=EnforceDoWhileStatementBraces/@EntryIndexedValue">WARNING</s:String>
<s:String x:Key="/Default/Environment/InjectedLayers/FileInjectedLayer/=A9046795AF04F2428C81EEAFEDBD18EE/RelativePath/@EntryValue">..\..\..\common.DotSettings</s:String> <s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=EnforceFixedStatementBraces/@EntryIndexedValue">WARNING</s:String>
<s:Boolean x:Key="/Default/Environment/InjectedLayers/InjectedLayerCustomization/=FileA9046795AF04F2428C81EEAFEDBD18EE/@KeyIndexDefined">True</s:Boolean> <s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=EnforceForeachStatementBraces/@EntryIndexedValue">WARNING</s:String>
<s:Double x:Key="/Default/Environment/InjectedLayers/InjectedLayerCustomization/=FileA9046795AF04F2428C81EEAFEDBD18EE/RelativePriority/@EntryValue">1</s:Double> <s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=EnforceForStatementBraces/@EntryIndexedValue">WARNING</s:String>
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=EnforceIfStatementBraces/@EntryIndexedValue">WARNING</s:String>
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=EnforceLockStatementBraces/@EntryIndexedValue">WARNING</s:String>
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=EnforceUsingStatementBraces/@EntryIndexedValue">WARNING</s:String>
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=EnforceWhileStatementBraces/@EntryIndexedValue">WARNING</s:String>
<s:String x:Key="/Default/CodeStyle/CodeFormatting/CSharpCodeStyle/BRACES_FOR_FOR/@EntryValue">Required</s:String>
<s:String x:Key="/Default/CodeStyle/CodeFormatting/CSharpCodeStyle/BRACES_FOR_FOREACH/@EntryValue">Required</s:String>
<s:String x:Key="/Default/CodeStyle/CodeFormatting/CSharpCodeStyle/BRACES_FOR_IFELSE/@EntryValue">Required</s:String>
<s:String x:Key="/Default/CodeStyle/CodeFormatting/CSharpCodeStyle/BRACES_FOR_WHILE/@EntryValue">Required</s:String>
<s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/CSharpCodeStyle/BRACES_REDUNDANT/@EntryValue">False</s:Boolean>
<s:Boolean x:Key="/Default/CodeStyle/Generate/=Implementations/@KeyIndexDefined">True</s:Boolean>
<s:String x:Key="/Default/CodeStyle/Generate/=Implementations/Options/=Async/@EntryIndexedValue">False</s:String>
<s:String x:Key="/Default/CodeStyle/Generate/=Implementations/Options/=Mutable/@EntryIndexedValue">False</s:String>
<s:Boolean x:Key="/Default/CodeStyle/Generate/=Overrides/@KeyIndexDefined">True</s:Boolean>
<s:String x:Key="/Default/CodeStyle/Generate/=Overrides/Options/=Async/@EntryIndexedValue">False</s:String>
<s:String x:Key="/Default/CodeStyle/Generate/=Overrides/Options/=Mutable/@EntryIndexedValue">False</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=SQL/@EntryIndexedValue">SQL</s:String>
</wpf:ResourceDictionary> </wpf:ResourceDictionary>
Loading…
Cancel
Save