[MNT-22236] Permission i18n support (#6843)

* localized role pipe

* update tests

* additional tests

* update module

* fix package lock

* update module settings

* try update code

* update import

* test fixes
This commit is contained in:
Denys Vuika
2021-03-23 16:22:32 +00:00
committed by GitHub
parent c0a3f9d99d
commit b97aa7dfee
11 changed files with 217 additions and 64 deletions

View File

@@ -33,11 +33,11 @@
[placeholder]="entry.data.getValue(entry.row, entry.col)"
value="{{entry.data.getValue(entry.row, entry.col)}}"
(selectionChange)="saveNewRole($event, entry.row.obj)">
<mat-option *ngFor="let role of settableRoles" [value]="role">{{ role }}</mat-option>
<mat-option *ngFor="let role of settableRoles" [value]="role">{{ role | adfLocalizedRole }}</mat-option>
</mat-select>
</mat-form-field>
<ng-template #show_only_label>
<span>{{entry.data.getValue(entry.row, entry.col)}}</span>
<span>{{ entry.data.getValue(entry.row, entry.col) | adfLocalizedRole }}</span>
</ng-template>
</ng-template>
</data-column>

View File

@@ -31,7 +31,7 @@ import { fakeNodeWithPermissions,
import { ContentTestingModule } from '../../../testing/content.testing.module';
import { TranslateModule } from '@ngx-translate/core';
describe('PermissionDisplayComponent', () => {
describe('PermissionListComponent', () => {
let fixture: ComponentFixture<PermissionListComponent>;
let component: PermissionListComponent;
@@ -127,10 +127,10 @@ describe('PermissionDisplayComponent', () => {
const options: any = fixture.debugElement.queryAll(By.css('mat-option'));
expect(options).not.toBeNull();
expect(options.length).toBe(4);
expect(options[0].nativeElement.innerText).toContain('SiteCollaborator');
expect(options[1].nativeElement.innerText).toContain('SiteConsumer');
expect(options[2].nativeElement.innerText).toContain('SiteContributor');
expect(options[3].nativeElement.innerText).toContain('SiteManager');
expect(options[0].nativeElement.innerText).toContain('ADF.ROLES.SITECOLLABORATOR');
expect(options[1].nativeElement.innerText).toContain('ADF.ROLES.SITECONSUMER');
expect(options[2].nativeElement.innerText).toContain('ADF.ROLES.SITECONTRIBUTOR');
expect(options[3].nativeElement.innerText).toContain('ADF.ROLES.SITEMANAGER');
});
});
}));
@@ -152,11 +152,11 @@ describe('PermissionDisplayComponent', () => {
const options: any = fixture.debugElement.queryAll(By.css('mat-option'));
expect(options).not.toBeNull();
expect(options.length).toBe(5);
expect(options[0].nativeElement.innerText).toContain('Contributor');
expect(options[1].nativeElement.innerText).toContain('Collaborator');
expect(options[2].nativeElement.innerText).toContain('Coordinator');
expect(options[3].nativeElement.innerText).toContain('Editor');
expect(options[4].nativeElement.innerText).toContain('Consumer');
expect(options[0].nativeElement.innerText).toContain('ADF.ROLES.CONTRIBUTOR');
expect(options[1].nativeElement.innerText).toContain('ADF.ROLES.COLLABORATOR');
expect(options[2].nativeElement.innerText).toContain('ADF.ROLES.COORDINATOR');
expect(options[3].nativeElement.innerText).toContain('ADF.ROLES.EDITOR');
expect(options[4].nativeElement.innerText).toContain('ADF.ROLES.CONSUMER');
});
});
}));

View File

@@ -35,11 +35,11 @@ export class PermissionListComponent implements OnInit {
/** Emitted when the permission is updated. */
@Output()
update: EventEmitter<PermissionElement> = new EventEmitter();
update = new EventEmitter<PermissionElement>();
/** Emitted when an error occurs. */
@Output()
error: EventEmitter<any> = new EventEmitter();
error = new EventEmitter<any>();
permissionList: PermissionDisplayModel[];
settableRoles: any[];
@@ -47,7 +47,6 @@ export class PermissionListComponent implements OnInit {
constructor(private nodeService: NodesApiService,
private nodePermissionService: NodePermissionService) {
}
ngOnInit() {
@@ -61,7 +60,7 @@ export class PermissionListComponent implements OnInit {
private fetchNodePermissions() {
this.nodeService.getNode(this.nodeId).subscribe((node: Node) => {
this.actualNode = node;
this.permissionList = this.getPermissionList(node);
this.permissionList = this.nodePermissionService.getNodePermissions(node);
this.nodePermissionService.getNodeRoles(node).subscribe((settableList: string[]) => {
this.settableRoles = settableList;
@@ -69,26 +68,9 @@ export class PermissionListComponent implements OnInit {
});
}
private getPermissionList(node: Node): PermissionDisplayModel[] {
const allPermissions: PermissionDisplayModel[] = [];
if (node?.permissions?.locallySet) {
node.permissions.locallySet.map((permissionElement: PermissionElement) => {
const permission = new PermissionDisplayModel(permissionElement);
allPermissions.push(permission);
});
}
if (node?.permissions?.inherited) {
node.permissions.inherited.map((permissionElement: PermissionElement) => {
const permissionInherited = new PermissionDisplayModel(permissionElement);
permissionInherited.isInherited = true;
allPermissions.push(permissionInherited);
});
}
return allPermissions;
}
saveNewRole(event: any, permissionRow: PermissionDisplayModel) {
const updatedPermissionRole: PermissionElement = this.buildUpdatedPermission(event.value, permissionRow);
const updatedPermissionRole = this.buildUpdatedPermission(event.value, permissionRow);
this.nodePermissionService.updatePermissionRole(this.actualNode, updatedPermissionRole)
.subscribe(() => {
this.update.emit(updatedPermissionRole);
@@ -96,11 +78,11 @@ export class PermissionListComponent implements OnInit {
}
private buildUpdatedPermission(newRole: string, permissionRow: PermissionDisplayModel): PermissionElement {
const permissionRole: PermissionElement = {};
permissionRole.accessStatus = permissionRow.accessStatus;
permissionRole.name = newRole;
permissionRole.authorityId = permissionRow.authorityId;
return permissionRole;
return {
accessStatus: permissionRow.accessStatus,
name: newRole,
authorityId: permissionRow.authorityId
};
}
removePermission(permissionRow: PermissionDisplayModel) {
@@ -111,5 +93,4 @@ export class PermissionListComponent implements OnInit {
error => this.error.emit(error)
);
}
}

View File

@@ -22,7 +22,7 @@ import { MaterialModule } from '../material.module';
import { PermissionListComponent } from './components/permission-list/permission-list.component';
import { AddPermissionComponent } from './components/add-permission/add-permission.component';
import { AddPermissionDialogComponent } from './components/add-permission/add-permission-dialog.component';
import { CoreModule } from '@alfresco/adf-core';
import { CoreModule, PipeModule } from '@alfresco/adf-core';
import { InheritPermissionDirective } from './components/inherited-button.directive';
import { NoPermissionTemplateComponent } from './components/permission-list/no-permission.component';
import { AddPermissionPanelComponent } from './components/add-permission/add-permission-panel.component';
@@ -35,7 +35,8 @@ import { SearchModule } from '../search/search.module';
FormsModule,
ReactiveFormsModule,
MaterialModule,
SearchModule
SearchModule,
PipeModule
],
declarations: [
PermissionListComponent,

View File

@@ -20,6 +20,7 @@ import { Observable, of, from, throwError } from 'rxjs';
import { AlfrescoApiService, SearchService, NodesApiService, TranslationService } from '@alfresco/adf-core';
import { QueryBody, Node, NodeEntry, PathElement, GroupMemberEntry, GroupMemberPaging, PermissionElement } from '@alfresco/js-api';
import { switchMap, map } from 'rxjs/operators';
import { PermissionDisplayModel } from '../models/permission.model';
@Injectable({
providedIn: 'root'
@@ -52,6 +53,25 @@ export class NodePermissionService {
);
}
getNodePermissions(node: Node): PermissionDisplayModel[] {
const result: PermissionDisplayModel[] = [];
if (node?.permissions?.locallySet) {
node.permissions.locallySet.map((permissionElement) => {
result.push(new PermissionDisplayModel(permissionElement));
});
}
if (node?.permissions?.inherited) {
node.permissions.inherited.map((permissionElement) => {
const permissionInherited = new PermissionDisplayModel(permissionElement);
permissionInherited.isInherited = true;
result.push(permissionInherited);
});
}
return result;
}
/**
* Updates the permission role for a node.
* @param node Target node
@@ -128,14 +148,13 @@ export class NodePermissionService {
private transformNodeToPermissionElement(nodes: NodeEntry[], nodeRole: any): PermissionElement[] {
return nodes.map((node) => {
const newPermissionElement: PermissionElement = <PermissionElement> {
return {
'authorityId': node.entry.properties['cm:authorityName'] ?
node.entry.properties['cm:authorityName'] :
node.entry.properties['cm:userName'],
'name': nodeRole,
'accessStatus': 'ALLOWED'
};
return newPermissionElement;
});
}
@@ -188,10 +207,11 @@ export class NodePermissionService {
private buildRetrieveSiteQueryBody(nodePath: PathElement[]): QueryBody {
const pathNames = nodePath.map((node: PathElement) => 'name: "' + node.name + '"');
const buildedPathNames = pathNames.join(' OR ');
const builtPathNames = pathNames.join(' OR ');
return {
'query': {
'query': buildedPathNames
'query': builtPathNames
},
'paging': {
'maxItems': 100,