Browse Source

Merge pull request #21209 from abpframework/auto-merge/rel-9-0/3140

Merge branch dev with rel-9.0
pull/21215/head
maliming 2 years ago
committed by GitHub
parent
commit
dad210c02c
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 156
      npm/ng-packs/packages/permission-management/src/lib/components/permission-management.component.html
  2. 109
      npm/ng-packs/packages/permission-management/src/lib/components/permission-management.component.ts

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

@ -7,8 +7,21 @@
</h4> </h4>
</ng-template> </ng-template>
<ng-template #abpBody> <ng-template #abpBody>
<div class="row"> <div class="row d-flex align-items-center mb-2">
<div class="col-md-4 scroll-in-modal"> <div class="col">
<div class="input-group mb-2">
<span class="input-group-text" id="basic-addon1"><i class="bi bi-search"></i></span>
<input
type="text"
class="form-control"
id="permission-search"
placeholder="Filter"
[ngModel]="filter()"
(ngModelChange)="filter.set($event)"
/>
</div>
</div>
<div class="col-auto">
<div class="form-check mb-2"> <div class="form-check mb-2">
<input <input
#selectAllInAllTabsRef #selectAllInAllTabsRef
@ -24,78 +37,85 @@
'AbpPermissionManagement::SelectAllInAllTabs' | abpLocalization 'AbpPermissionManagement::SelectAllInAllTabs' | abpLocalization
}}</label> }}</label>
</div> </div>
</div>
</div>
<fieldset class="border rounded-4 p-3">
<legend class="px-1 h5 mb-0">{{ 'Permission Group' }}</legend>
<div class="row">
<div class="col-md-4">
<div class="overflow-auto lpx-scroll-pills-container scroll-in-modal">
<ul class="nav nav-pills flex-column">
@for (group of permissionGroups(); track $index) {
<li class="border nav-item">
@if ({ assignedCount: getAssignedCount(group.name) }; as count) {
<a
class="nav-link pointer"
[class.active]="selectedGroup?.name === group?.name"
(click)="onChangeGroup(group)"
(select)="setDisabled(group.permissions)"
>
<div [class.font-weight-bold]="count.assignedCount">
{{ group?.displayName }}
@if (count.assignedCount > 0) {
<span>({{ count.assignedCount }})</span>
}
</div>
</a>
}
</li>
}
</ul>
</div>
</div>
<hr class="mt-2 mb-2" /> <div class="col-md-8 scroll-in-modal">
<div class="overflow-auto"> <div class="ps-1">
<ul class="nav nav-pills flex-column"> @if (selectedGroupPermissions.length) {
@for (group of data.groups; track $index) { <div class="form-check mb-2">
<li class="nav-item"> <input
@if ({ assignedCount: getAssignedCount(group.name) }; as count) { #selectAllInThisTabsRef
<a type="checkbox"
class="nav-link pointer" id="select-all-in-this-tabs"
[class.active]="selectedGroup?.name === group?.name" name="select-all-in-this-tabs"
(click)="onChangeGroup(group)" class="form-check-input"
(select)="setDisabled(group.permissions)" [(ngModel)]="selectThisTab"
> [disabled]="disableSelectAllTab"
<div [class.font-weight-bold]="count.assignedCount"> (click)="onClickSelectThisTab()"
{{ group?.displayName }} />
@if (count.assignedCount > 0) { <label class="form-check-label" for="select-all-in-this-tabs">{{
<span>({{ count.assignedCount }})</span> 'AbpPermissionManagement::SelectAllInThisTab' | abpLocalization
}}</label>
</div>
<hr class="my-2" />
@for (permission of selectedGroupPermissions; track $index; let i = $index) {
<div [ngStyle]="permission.style" class="form-check mb-2">
<input
#permissionCheckbox
type="checkbox"
[checked]="getChecked(permission.name)"
[value]="getChecked(permission.name)"
[attr.id]="permission.name"
class="form-check-input"
[disabled]="isGrantedByOtherProviderName(permission.grantedProviders)"
(click)="onClickCheckbox(permission, permissionCheckbox.value)"
/>
<label class="form-check-label" [attr.for]="permission.name"
>{{ permission.displayName }}
@if (!hideBadges) {
@for (provider of permission.grantedProviders; track $index) {
<span class="badge bg-primary text-dark"
>{{ provider.providerName }}: {{ provider.providerKey }}</span
>
} }
</div> }
</a> </label>
} </div>
</li> }
} }
</ul>
</div>
</div>
<div class="col-md-8 scroll-in-modal">
<div class="ps-1">
<div class="form-check mb-2">
<input
#selectAllInThisTabsRef
type="checkbox"
id="select-all-in-this-tabs"
name="select-all-in-this-tabs"
class="form-check-input"
[(ngModel)]="selectThisTab"
[disabled]="disableSelectAllTab"
(click)="onClickSelectThisTab()"
/>
<label class="form-check-label" for="select-all-in-this-tabs">{{
'AbpPermissionManagement::SelectAllInThisTab' | abpLocalization
}}</label>
</div> </div>
<hr class="my-2" />
@for (permission of selectedGroupPermissions; track $index; let i = $index) {
<div [ngStyle]="permission.style" class="form-check mb-2">
<input
#permissionCheckbox
type="checkbox"
[checked]="getChecked(permission.name)"
[value]="getChecked(permission.name)"
[attr.id]="permission.name"
class="form-check-input"
[disabled]="isGrantedByOtherProviderName(permission.grantedProviders)"
(click)="onClickCheckbox(permission, permissionCheckbox.value)"
/>
<label class="form-check-label" [attr.for]="permission.name"
>{{ permission.displayName }}
@if (!hideBadges) {
@for (provider of permission.grantedProviders; track $index) {
<span class="badge bg-primary text-dark"
>{{ provider.providerName }}: {{ provider.providerKey }}</span
>
}
}
</label>
</div>
}
</div> </div>
</div> </div>
</div> </fieldset>
</ng-template> </ng-template>
<ng-template #abpFooter> <ng-template #abpFooter>
<button type="button" class="btn btn-outline-primary" abpClose> <button type="button" class="btn btn-outline-primary" abpClose>

109
npm/ng-packs/packages/permission-management/src/lib/components/permission-management.component.ts

@ -1,4 +1,5 @@
import { ConfigStateService, CurrentUserDto } from '@abp/ng.core'; import { ConfigStateService, CurrentUserDto } from '@abp/ng.core';
import { LocaleDirection, ToasterService } from '@abp/ng.theme.shared';
import { import {
GetPermissionListResultDto, GetPermissionListResultDto,
PermissionGrantInfoDto, PermissionGrantInfoDto,
@ -7,15 +8,16 @@ import {
ProviderInfoDto, ProviderInfoDto,
UpdatePermissionDto, UpdatePermissionDto,
} from '@abp/ng.permission-management/proxy'; } from '@abp/ng.permission-management/proxy';
import { LocaleDirection, ToasterService } from '@abp/ng.theme.shared';
import { import {
Component, Component,
computed,
ElementRef, ElementRef,
EventEmitter, EventEmitter,
inject, inject,
Input, Input,
Output, Output,
QueryList, QueryList,
signal,
TrackByFunction, TrackByFunction,
ViewChildren, ViewChildren,
} from '@angular/core'; } from '@angular/core';
@ -41,10 +43,38 @@ type PermissionWithGroupName = PermissionGrantInfoDto & {
max-height: 70vh; max-height: 70vh;
overflow-y: scroll; overflow-y: scroll;
} }
.scroll-in-modal { .scroll-in-modal {
overflow: auto; overflow: auto;
max-height: calc(100vh - 15rem); max-height: calc(100vh - 15rem);
} }
fieldset legend {
float: none;
width: auto;
}
.lpx-scroll-pills-container ul {
display: block;
max-height: 500px;
overflow-y: auto;
}
.lpx-scroll-pills-container .tab-content {
padding-top: 0 !important;
padding-bottom: 0 !important;
}
.lpx-scroll-pills-container ul li {
margin-bottom: 10px;
border-radius: 10px;
}
.lpx-scroll-pills-container ul li a.active {
color: #fff !important;
border-color: #6c5dd3 !important;
background-color: #6c5dd3 !important;
}
`, `,
], ],
}) })
@ -77,7 +107,9 @@ export class PermissionManagementComponent
} }
set visible(value: boolean) { set visible(value: boolean) {
if (value === this._visible) return; if (value === this._visible) {
return;
}
if (value) { if (value) {
this.openModal().subscribe(() => { this.openModal().subscribe(() => {
@ -93,6 +125,7 @@ export class PermissionManagementComponent
this.setSelectedGroup(null); this.setSelectedGroup(null);
this._visible = false; this._visible = false;
this.visibleChange.emit(false); this.visibleChange.emit(false);
this.filter.set('');
} }
} }
@ -119,8 +152,38 @@ export class PermissionManagementComponent
modalBusy = false; modalBusy = false;
filter = signal<string>('');
selectedGroupPermissions: PermissionWithStyle[] = []; selectedGroupPermissions: PermissionWithStyle[] = [];
permissionGroupSignal = signal<PermissionGroupDto[]>([]);
permissionGroups = computed(() => {
const search = this.filter().toLowerCase().trim();
let groups = this.permissionGroupSignal();
if (!search) {
return groups;
}
const includesSearch = text => text.toLowerCase().includes(search);
groups = groups.filter(group =>
group.permissions.some(
permission => includesSearch(permission.displayName) || includesSearch(group.displayName),
),
);
if (groups.length) {
this.setSelectedGroup(groups[0]);
this.disabledSelectAllInAllTabs = false;
} else {
this.disabledSelectAllInAllTabs = true;
this.selectedGroupPermissions = [];
}
return groups;
});
trackByFn: TrackByFunction<PermissionGroupDto> = (_, item) => item.name; trackByFn: TrackByFunction<PermissionGroupDto> = (_, item) => item.name;
getChecked(name: string) { getChecked(name: string) {
@ -307,14 +370,38 @@ export class PermissionManagementComponent
} }
onClickSelectAll() { onClickSelectAll() {
this.permissions = this.permissions.map(permission => ({ if (this.filter()) {
...permission, this.permissionGroups().forEach(group => {
isGranted: group.permissions.forEach(permission => {
this.isGrantedByOtherProviderName(permission.grantedProviders) || !this.selectAllTab, if (
})); permission.isGranted &&
this.isGrantedByOtherProviderName(permission.grantedProviders)
)
return;
const index = this.permissions.findIndex(per => per.name === permission.name);
this.permissions = [
...this.permissions.slice(0, index),
{ ...this.permissions[index], isGranted: !this.selectAllTab },
...this.permissions.slice(index + 1),
];
});
});
} else {
this.permissions = this.permissions.map(permission => ({
...permission,
isGranted:
this.isGrantedByOtherProviderName(permission.grantedProviders) || !this.selectAllTab,
}));
}
if (!this.disableSelectAllTab) { if (!this.disableSelectAllTab) {
this.selectThisTab = !this.selectAllTab; this.selectThisTab = !this.selectAllTab;
this.setTabCheckboxState(); this.setTabCheckboxState();
if (this.filter()) {
this.setGrantCheckboxState();
}
} }
this.onChangeGroup(this.selectedGroup); this.onChangeGroup(this.selectedGroup);
} }
@ -364,9 +451,13 @@ export class PermissionManagementComponent
return this.service.get(this.providerName, this.providerKey).pipe( return this.service.get(this.providerName, this.providerKey).pipe(
tap((permissionRes: GetPermissionListResultDto) => { tap((permissionRes: GetPermissionListResultDto) => {
const { groups } = permissionRes || {};
this.data = permissionRes; this.data = permissionRes;
this.permissions = getPermissions(permissionRes.groups); this.permissionGroupSignal.set(groups);
this.setSelectedGroup(permissionRes.groups[0]); this.permissions = getPermissions(groups);
this.setSelectedGroup(groups[0]);
this.disabledSelectAllInAllTabs = this.permissions.every( this.disabledSelectAllInAllTabs = this.permissions.every(
per => per =>
per.isGranted && per.isGranted &&

Loading…
Cancel
Save