Browse Source

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

pull/6585/head
Halil İbrahim Kalkan 6 years ago
parent
commit
3e2c43359f
  1. 3
      framework/src/Volo.Abp.Autofac/Autofac/Extensions/DependencyInjection/AutofacRegistration.cs
  2. 43
      framework/src/Volo.Abp.Autofac/Volo/Abp/Autofac/AbpAutofacConstructorFinder.cs
  3. 9
      framework/src/Volo.Abp.BlazoriseUI/Components/SubmitButton.razor
  4. 11
      framework/src/Volo.Abp.BlazoriseUI/Components/SubmitButton.razor.cs
  5. 4
      modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/RoleManagement.razor
  6. 4
      modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/UserManagement.razor
  7. 30
      modules/identity/src/Volo.Abp.Identity.Web/AbpIdentityWebModule.cs
  8. 6
      modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Roles/Index.cshtml
  9. 6
      modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Users/Index.cshtml
  10. 6
      modules/tenant-management/src/Volo.Abp.TenantManagement.Blazor/Pages/TenantManagement/TenantManagement.razor
  11. 24
      modules/tenant-management/src/Volo.Abp.TenantManagement.Web/AbpTenantManagementWebModule.cs
  12. 10
      modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Pages/TenantManagement/Tenants/Index.cshtml
  13. 1
      npm/ng-packs/packages/components/package.json
  14. 86
      npm/ng-packs/packages/components/tree/src/lib/components/tree.component.html
  15. 12
      npm/ng-packs/packages/components/tree/src/lib/components/tree.component.scss
  16. 8
      npm/ng-packs/packages/components/tree/src/lib/components/tree.component.ts
  17. 7
      npm/ng-packs/packages/components/tree/src/lib/tree.module.ts

3
framework/src/Volo.Abp.Autofac/Autofac/Extensions/DependencyInjection/AutofacRegistration.cs

@ -27,6 +27,7 @@ using System;
using System.Reflection;
using Autofac.Builder;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.Autofac;
using Volo.Abp.Modularity;
namespace Autofac.Extensions.DependencyInjection
@ -116,6 +117,7 @@ namespace Autofac.Extensions.DependencyInjection
.RegisterGeneric(service.ImplementationType)
.As(service.ServiceType)
.ConfigureLifecycle(service.Lifetime)
.FindConstructorsWith(new AbpAutofacConstructorFinder())
.ConfigureAbpConventions(moduleContainer, registrationActionList);
}
else
@ -124,6 +126,7 @@ namespace Autofac.Extensions.DependencyInjection
.RegisterType(service.ImplementationType)
.As(service.ServiceType)
.ConfigureLifecycle(service.Lifetime)
.FindConstructorsWith(new AbpAutofacConstructorFinder())
.ConfigureAbpConventions(moduleContainer, registrationActionList);
}
}

43
framework/src/Volo.Abp.Autofac/Volo/Abp/Autofac/AbpAutofacConstructorFinder.cs

@ -0,0 +1,43 @@
using System;
using System.Collections.Concurrent;
using System.Reflection;
using Autofac.Core.Activators.Reflection;
namespace Volo.Abp.Autofac
{
public class AbpAutofacConstructorFinder : IConstructorFinder
{
private const BindingFlags DeclaredOnlyPublicFlags = BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly; //Remove static constructor, BindingFlags.Static
private readonly Func<Type, ConstructorInfo[]> _finder;
private static readonly ConcurrentDictionary<Type, ConstructorInfo[]> DefaultPublicConstructorsCache = new ConcurrentDictionary<Type, ConstructorInfo[]>();
public AbpAutofacConstructorFinder()
: this(GetDefaultPublicConstructors)
{
}
public AbpAutofacConstructorFinder(Func<Type, ConstructorInfo[]> finder)
{
_finder = finder ?? throw new ArgumentNullException(nameof(finder));
}
public ConstructorInfo[] FindConstructors(Type targetType)
{
return _finder(targetType);
}
private static ConstructorInfo[] GetDefaultPublicConstructors(Type type)
{
var retval = DefaultPublicConstructorsCache.GetOrAdd(type, t => t.GetConstructors(DeclaredOnlyPublicFlags));
if (retval.Length == 0)
{
throw new NoConstructorsFoundException(type);
}
return retval;
}
}
}

9
framework/src/Volo.Abp.BlazoriseUI/Components/SubmitButton.razor

@ -1,3 +1,10 @@
<Button form="@Form" Type="@Type" Color="@Color" Block="@Block" PreventDefaultOnSubmit="@PreventDefaultOnSubmit" Disabled="@IsDisabled" Loading="@IsLoading" Clicked="@OnClickedHandler">
@ChildContent
@if ( ChildContent != null )
{
@ChildContent
}
else
{
@SaveString
}
</Button>

11
framework/src/Volo.Abp.BlazoriseUI/Components/SubmitButton.razor.cs

@ -1,7 +1,9 @@
using System;
using System.Threading.Tasks;
using Blazorise;
using Localization.Resources.AbpUi;
using Microsoft.AspNetCore.Components;
using Microsoft.Extensions.Localization;
namespace Volo.Abp.BlazoriseUI.Components
{
@ -27,18 +29,27 @@ namespace Volo.Abp.BlazoriseUI.Components
[Parameter]
public bool? Disabled { get; set; }
[Parameter]
public string SaveResourceKey { get; set; } = "Save";
[Parameter]
public EventCallback Clicked { get; set; }
[Parameter]
public RenderFragment ChildContent { get; set; }
[Inject]
protected IStringLocalizer<AbpUiResource> StringLocalizer { get; set; }
protected bool IsDisabled
=> Disabled == true || Submiting;
protected bool IsLoading
=> Submiting;
protected string SaveString
=> StringLocalizer[SaveResourceKey];
protected virtual async Task OnClickedHandler()
{
try

4
modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/RoleManagement.razor

@ -104,7 +104,7 @@
</ModalBody>
<ModalFooter>
<Button Color="Color.Secondary" Clicked="CloseCreateModalAsync">@L["Cancel"]</Button>
<SubmitButton Form="RoleCreateForm" Clicked="@CreateEntityAsync">@L["Save"]</SubmitButton>
<SubmitButton Form="RoleCreateForm" Clicked="@CreateEntityAsync" />
</ModalFooter>
</Form>
</ModalContent>
@ -142,7 +142,7 @@
</ModalBody>
<ModalFooter>
<Button Color="Color.Secondary" Clicked="CloseEditModalAsync">@L["Cancel"]</Button>
<SubmitButton Form="RoleEditForm" Clicked="@UpdateEntityAsync">@L["Save"]</SubmitButton>
<SubmitButton Form="RoleEditForm" Clicked="@UpdateEntityAsync" />
</ModalFooter>
</Form>
</ModalContent>

4
modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/UserManagement.razor

@ -176,7 +176,7 @@
</ModalBody>
<ModalFooter>
<Button Color="Color.Secondary" Clicked="CloseCreateModalAsync">@L["Cancel"]</Button>
<SubmitButton Form="UserCreateForm" Clicked="@CreateEntityAsync">@L["Save"]</SubmitButton>
<SubmitButton Form="UserCreateForm" Clicked="@CreateEntityAsync" />
</ModalFooter>
</Form>
</ModalContent>
@ -287,7 +287,7 @@
</ModalBody>
<ModalFooter>
<Button Color="Color.Secondary" Clicked="CloseEditModalAsync">@L["Cancel"]</Button>
<SubmitButton Form="UserEditForm" Clicked="@UpdateEntityAsync">@L["Save"]</SubmitButton>
<SubmitButton Form="UserEditForm" Clicked="@UpdateEntityAsync" />
</ModalFooter>
</Form>
</ModalContent>

30
modules/identity/src/Volo.Abp.Identity.Web/AbpIdentityWebModule.cs

@ -2,9 +2,11 @@
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.AspNetCore.Mvc.Localization;
using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared;
using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.PageToolbars;
using Volo.Abp.AutoMapper;
using Volo.Abp.Identity.Localization;
using Volo.Abp.Identity.Web.Navigation;
using Volo.Abp.Localization;
using Volo.Abp.Modularity;
using Volo.Abp.ObjectExtending;
using Volo.Abp.ObjectExtending.Modularity;
@ -64,6 +66,34 @@ namespace Volo.Abp.Identity.Web
options.Conventions.AuthorizePage("/Identity/Roles/CreateModal", IdentityPermissions.Roles.Create);
options.Conventions.AuthorizePage("/Identity/Roles/EditModal", IdentityPermissions.Roles.Update);
});
Configure<AbpPageToolbarOptions>(options =>
{
options.Configure<Volo.Abp.Identity.Web.Pages.Identity.Users.IndexModel>(
toolbar =>
{
toolbar.AddButton(
LocalizableString.Create<IdentityResource>("NewUser"),
icon: "plus",
name: "CreateUser",
requiredPolicyName: IdentityPermissions.Users.Create
);
}
);
options.Configure<Volo.Abp.Identity.Web.Pages.Identity.Roles.IndexModel>(
toolbar =>
{
toolbar.AddButton(
LocalizableString.Create<IdentityResource>("NewRole"),
icon: "plus",
name: "CreateRole",
requiredPolicyName: IdentityPermissions.Roles.Create
);
}
);
});
}
public override void PostConfigureServices(ServiceConfigurationContext context)

6
modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Roles/Index.cshtml

@ -2,6 +2,7 @@
@using Microsoft.AspNetCore.Authorization
@using Microsoft.AspNetCore.Mvc.Localization
@using Volo.Abp.AspNetCore.Mvc.UI.Layout
@using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Pages.Shared.Components.AbpPageToolbar
@using Volo.Abp.Identity
@using Volo.Abp.Identity.Localization
@using Volo.Abp.Identity.Web.Navigation
@ -33,10 +34,7 @@
<abp-card-title>@L["Roles"]</abp-card-title>
</abp-column>
<abp-column size-md="_6" class="text-right">
@if (await Authorization.IsGrantedAsync(IdentityPermissions.Roles.Create))
{
<abp-button button-type="Primary" name="CreateRole" text="@L["NewRole"].Value" icon="plus" />
}
@await Component.InvokeAsync(typeof(AbpPageToolbarViewComponent), new { pageName = typeof(IndexModel).FullName })
</abp-column>
</abp-row>
</abp-card-header>

6
modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Users/Index.cshtml

@ -2,6 +2,7 @@
@using Microsoft.AspNetCore.Authorization
@using Microsoft.AspNetCore.Mvc.Localization
@using Volo.Abp.AspNetCore.Mvc.UI.Layout
@using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Pages.Shared.Components.AbpPageToolbar
@using Volo.Abp.Identity
@using Volo.Abp.Identity.Localization
@using Volo.Abp.Identity.Web.Navigation
@ -34,10 +35,7 @@
<abp-card-title>@L["Users"]</abp-card-title>
</abp-column>
<abp-column size-md="_6" class="text-right">
@if (await Authorization.IsGrantedAsync(IdentityPermissions.Users.Create))
{
<abp-button button-type="Primary" name="CreateUser" text="@L["NewUser"].Value" icon="plus" />
}
@await Component.InvokeAsync(typeof(AbpPageToolbarViewComponent), new { pageName = typeof(IndexModel).FullName })
</abp-column>
</abp-row>
</abp-card-header>

6
modules/tenant-management/src/Volo.Abp.TenantManagement.Blazor/Pages/TenantManagement/TenantManagement.razor

@ -114,7 +114,7 @@
</ModalBody>
<ModalFooter>
<Button Color="Color.Secondary" Clicked="CloseCreateModalAsync">@L["Cancel"]</Button>
<SubmitButton Form="TenantCreateForm" Clicked="@CreateEntityAsync">@L["Save"]</SubmitButton>
<SubmitButton Form="TenantCreateForm" Clicked="@CreateEntityAsync" />
</ModalFooter>
</Form>
</ModalContent>
@ -148,7 +148,7 @@
</ModalBody>
<ModalFooter>
<Button Color="Color.Secondary" Clicked="CloseEditModalAsync">@L["Cancel"]</Button>
<SubmitButton Form="TenantEditForm" Clicked="@UpdateEntityAsync">@L["Save"]</SubmitButton>
<SubmitButton Form="TenantEditForm" Clicked="@UpdateEntityAsync" />
</ModalFooter>
</Form>
</ModalContent>
@ -187,7 +187,7 @@
</ModalBody>
<ModalFooter>
<Button Color="Color.Secondary" Clicked="CloseEditConnectionStringModal">@L["Cancel"]</Button>
<SubmitButton Form="ConnectionStringEditForm" Clicked="@UpdateConnectionStringAsync">@L["Save"]</SubmitButton>
<SubmitButton Form="ConnectionStringEditForm" Clicked="@UpdateConnectionStringAsync" />
</ModalFooter>
</Form>
</ModalContent>

24
modules/tenant-management/src/Volo.Abp.TenantManagement.Web/AbpTenantManagementWebModule.cs

@ -2,8 +2,10 @@
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.AspNetCore.Mvc.Localization;
using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap;
using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.PageToolbars;
using Volo.Abp.AutoMapper;
using Volo.Abp.FeatureManagement;
using Volo.Abp.Localization;
using Volo.Abp.Modularity;
using Volo.Abp.ObjectExtending;
using Volo.Abp.ObjectExtending.Modularity;
@ -61,6 +63,28 @@ namespace Volo.Abp.TenantManagement.Web
options.Conventions.AuthorizePage("/TenantManagement/Tenants/EditModal", TenantManagementPermissions.Tenants.Update);
options.Conventions.AuthorizePage("/TenantManagement/Tenants/ConnectionStrings", TenantManagementPermissions.Tenants.ManageConnectionStrings);
});
Configure<AbpPageToolbarOptions>(options =>
{
options.Configure<Volo.Abp.TenantManagement.Web.Pages.TenantManagement.Tenants.IndexModel>(
toolbar =>
{
toolbar.AddButton(
LocalizableString.Create<AbpTenantManagementResource>("ManageHostFeatures"),
icon: "cog",
name: "ManageHostFeatures",
requiredPolicyName: FeatureManagementPermissions.ManageHostFeatures
);
toolbar.AddButton(
LocalizableString.Create<AbpTenantManagementResource>("NewTenant"),
icon: "plus",
name: "CreateTenant",
requiredPolicyName: TenantManagementPermissions.Tenants.Create
);
}
);
});
}
public override void PostConfigureServices(ServiceConfigurationContext context)

10
modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Pages/TenantManagement/Tenants/Index.cshtml

@ -2,6 +2,7 @@
@using Microsoft.AspNetCore.Authorization
@using Microsoft.AspNetCore.Mvc.Localization
@using Volo.Abp.AspNetCore.Mvc.UI.Layout
@using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Pages.Shared.Components.AbpPageToolbar
@using Volo.Abp.FeatureManagement
@using Volo.Abp.TenantManagement
@using Volo.Abp.TenantManagement.Localization
@ -30,14 +31,7 @@
<abp-card-title>@L["Tenants"]</abp-card-title>
</abp-column>
<abp-column size-md="_6" class="text-right">
@if (await Authorization.IsGrantedAsync(FeatureManagementPermissions.ManageHostFeatures))
{
<abp-button button-type="Primary" name="ManageHostFeatures" icon="cog" text="@L["ManageHostFeatures"].Value" />
}
@if (await Authorization.IsGrantedAsync(TenantManagementPermissions.Tenants.Create))
{
<abp-button button-type="Primary" name="CreateTenant" icon="plus" text="@L["NewTenant"].Value"/>
}
@await Component.InvokeAsync(typeof(AbpPageToolbarViewComponent), new { pageName = typeof(IndexModel).FullName })
</abp-column>
</abp-row>
</abp-card-header>

1
npm/ng-packs/packages/components/package.json

@ -8,6 +8,7 @@
},
"peerDependencies": {
"@abp/ng.core": ">=4.0.0",
"@abp/ng.theme.shared": ">=4.0.0",
"@ng-bootstrap/ng-bootstrap": ">=6.0.0"
},
"dependencies": {

86
npm/ng-packs/packages/components/tree/src/lib/components/tree.component.html

@ -7,10 +7,12 @@
[nzData]="nodes"
[nzTreeTemplate]="treeTemplate"
[nzExpandedKeys]="expandedKeys"
[nzExpandedIcon]="expandedIconTemplate?.template"
[nzExpandedIcon]="expandedIconTemplate?.template || defaultIconTemplate"
(nzExpandChange)="onExpandedKeysChange($event)"
(nzCheckBoxChange)="onCheckboxChange($event)"
(nzOnDrop)="onDrop($event)"
[nzNoAnimation]="noAnimation"
(nzContextMenu)="dropdowns[$event.node?.key]?.toggle()"
></nz-tree>
<ng-template #treeTemplate let-node>
<div
@ -19,22 +21,76 @@
[title]="node.title"
(click)="onSelectedNodeChange(node)"
>
<ng-container
*ngTemplateOutlet="
customNodeTemplate?.template || defaultNodeTemplate;
context: { $implicit: node }
"
></ng-container>
<ng-container *ngTemplateOutlet="nodeTemplate; context: { $implicit: node }"></ng-container>
<ng-template #defaultNodeTemplate>
<span>{{ node.title }}</span>
</ng-template>
<ng-template #nodeTemplate let-node>
<div class="d-inline-block">
<ng-container
*ngTemplateOutlet="
customNodeTemplate ? customNodeTemplate?.template : defaultNodeTemplate;
context: { $implicit: node }
"
></ng-container>
</div>
<div *ngIf="menu" class="ellipsis" ngbDropdown placement="bottom" container="body">
<i class="fas fa-ellipsis-h" ngbDropdownToggle [class.dropdown-toggle]="false"></i>
<div ngbDropdownMenu>
<ng-template *ngTemplateOutlet="menu; context: { $implicit: node }"></ng-template>
<div
#dropdown="ngbDropdown"
*ngIf="menu"
class="d-inline-block ml-1"
ngbDropdown
placement="bottom"
container="body"
(abpInit)="initDropdown(node.key, dropdown)"
>
<i
class="fas fa-caret-down text-muted"
ngbDropdownToggle
[class.dropdown-toggle]="false"
></i>
<div ngbDropdownMenu>
<ng-template *ngTemplateOutlet="menu; context: { $implicit: node }"></ng-template>
</div>
</div>
</div>
</ng-template>
<ng-template #defaultNodeTemplate let-node>
<span>{{ node.title }}</span>
</ng-template>
</div>
</ng-template>
<ng-template #defaultIconTemplate let-node let-origin="origin">
<i style="line-height: 28px" aria-hidden="true">
<ng-container *ngTemplateOutlet="node.isExpanded ? minusIcon : plusIcon"></ng-container
></i>
</ng-template>
<ng-template #minusIcon>
<svg
width="15"
height="15"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
fill-rule="evenodd"
clip-rule="evenodd"
>
<path
d="M11.5 0c6.347 0 11.5 5.153 11.5 11.5s-5.153 11.5-11.5 11.5-11.5-5.153-11.5-11.5 5.153-11.5 11.5-11.5zm0 1c5.795 0 10.5 4.705 10.5 10.5s-4.705 10.5-10.5 10.5-10.5-4.705-10.5-10.5 4.705-10.5 10.5-10.5zm-6.5 10h13v1h-13v-1z"
/>
</svg>
</ng-template>
<ng-template #plusIcon>
<svg
width="15"
height="15"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
fill-rule="evenodd"
clip-rule="evenodd"
>
<path
d="M11.5 0c6.347 0 11.5 5.153 11.5 11.5s-5.153 11.5-11.5 11.5-11.5-5.153-11.5-11.5 5.153-11.5 11.5-11.5zm0 1c5.795 0 10.5 4.705 10.5 10.5s-4.705 10.5-10.5 10.5-10.5-4.705-10.5-10.5 4.705-10.5 10.5-10.5zm.5 10h6v1h-6v6h-1v-6h-6v-1h6v-6h1v6z"
/>
</svg>
</ng-template>

12
npm/ng-packs/packages/components/tree/src/lib/components/tree.component.scss

@ -27,18 +27,6 @@
cursor: pointer;
padding-left: 8px;
border: 1px solid transparent;
&:hover {
background-color: transparent;
border: 1px solid var(--primary);
color: var(--text-color);
}
&.selected {
background-color: transparent;
color: var(--white);
background-color: var(--primary);
}
}
.ellipsis {

8
npm/ng-packs/packages/components/tree/src/lib/components/tree.component.ts

@ -11,6 +11,7 @@ import { NzFormatEmitEvent, NzFormatBeforeDropEvent } from 'ng-zorro-antd/tree';
import { of } from 'rxjs';
import { TreeNodeTemplateDirective } from '../templates/tree-node-template.directive';
import { ExpandedIconTemplateDirective } from '../templates/expanded-icon-template.directive';
import { NgbDropdown } from '@ng-bootstrap/ng-bootstrap';
export type DropEvent = NzFormatEmitEvent & { pos: number };
@ -26,6 +27,8 @@ export type DropEvent = NzFormatEmitEvent & { pos: number };
export class TreeComponent {
dropPosition: number;
dropdowns = {} as { [key: string]: NgbDropdown };
@ContentChild('menu') menu: TemplateRef<any>;
@ContentChild(TreeNodeTemplateDirective) customNodeTemplate: TreeNodeTemplateDirective;
@ContentChild(ExpandedIconTemplateDirective) expandedIconTemplate: ExpandedIconTemplateDirective;
@ -33,6 +36,7 @@ export class TreeComponent {
@Output() readonly expandedKeysChange = new EventEmitter<string[]>();
@Output() readonly selectedNodeChange = new EventEmitter();
@Output() readonly dropOver = new EventEmitter<DropEvent>();
@Input() noAnimation = true;
@Input() draggable: boolean;
@Input() checkable: boolean;
@Input() checkStrictly: boolean;
@ -68,4 +72,8 @@ export class TreeComponent {
this.dropOver.emit(event);
}
initDropdown(key: string, dropdown: NgbDropdown) {
this.dropdowns[key] = dropdown;
}
}

7
npm/ng-packs/packages/components/tree/src/lib/tree.module.ts

@ -1,17 +1,18 @@
import { CommonModule } from '@angular/common';
import { CoreModule } from '@abp/ng.core';
import { NgModule } from '@angular/core';
import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap';
import { NzNoAnimationModule } from 'ng-zorro-antd/core/no-animation';
import { NzTreeModule } from 'ng-zorro-antd/tree';
import { TreeComponent } from './components/tree.component';
import { TreeNodeTemplateDirective } from './templates/tree-node-template.directive';
import { ExpandedIconTemplateDirective } from './templates/expanded-icon-template.directive';
import { TreeNodeTemplateDirective } from './templates/tree-node-template.directive';
const templates = [TreeNodeTemplateDirective, ExpandedIconTemplateDirective];
const exported = [...templates, TreeComponent];
@NgModule({
imports: [CommonModule, NzTreeModule, NgbDropdownModule],
imports: [CoreModule, NzTreeModule, NgbDropdownModule, NzNoAnimationModule],
exports: [...exported],
declarations: [...exported],
})

Loading…
Cancel
Save