[ACA-3492] ADF - Expose new Groups Endpoints (#5893)

* [ACA-3492] ADF - Expose new Groups Endpoints

* * docs added

* * fix ut

* unit test split cloud

* Update data-table-component.page.ts

* unit test split cloud

Co-authored-by: Eugenio Romano <eugenio.romano@alfresco.com>
Co-authored-by: Eugenio Romano <eromano@users.noreply.github.com>
This commit is contained in:
dhrn
2020-07-22 11:20:07 +01:00
committed by GitHub
co-authored by Eugenio Romano Eugenio Romano
parent 7b1da04f77
commit a5972e753a
12 changed files with 243 additions and 39 deletions
+4 -2
View File
@@ -21,6 +21,8 @@ import { UserProcessModel } from '../models/user-process.model';
import { EcmUserModel } from '../models/ecm-user.model';
import { IdentityUserModel } from '../models/identity-user.model';
export type User = (EcmUserModel | UserProcessModel | IdentityUserModel) & { displayName?: string };
@Pipe({
name: 'usernameInitials'
})
@@ -29,10 +31,10 @@ export class InitialUsernamePipe implements PipeTransform {
constructor(private sanitized: DomSanitizer) {
}
transform(user: UserProcessModel | EcmUserModel | IdentityUserModel, className: string = '', delimiter: string = ''): SafeHtml {
transform(user: User, className: string = '', delimiter: string = ''): SafeHtml {
let safeHtml: SafeHtml = '';
if (user) {
const initialResult = this.getInitialUserName(user.firstName, user.lastName, delimiter);
const initialResult = this.getInitialUserName(user.firstName || user.displayName, user.lastName, delimiter);
safeHtml = this.sanitized.bypassSecurityTrustHtml(`<div id="user-initials-image" class="${className}">${initialResult}</div>`);
}
return safeHtml;
+97 -11
View File
@@ -16,9 +16,19 @@
*/
import { Injectable } from '@angular/core';
import { Observable, from, throwError } from 'rxjs';
import { from, Observable, throwError } from 'rxjs';
import { AlfrescoApiService } from './alfresco-api.service';
import { SitePaging, SiteEntry, MinimalNode, SitesApi, SiteMembershipRequestWithPersonPaging, SiteMembershipBodyCreate, SiteMemberEntry, SiteMembershipBodyUpdate } from '@alfresco/js-api';
import {
MinimalNode,
SiteEntry, SiteGroupEntry, SiteGroupPaging,
SiteMemberEntry,
SiteMemberPaging,
SiteMembershipBodyCreate,
SiteMembershipBodyUpdate,
SiteMembershipRequestWithPersonPaging,
SitePaging,
SitesApi
} from '@alfresco/js-api';
import { catchError } from 'rxjs/operators';
@Injectable({
@@ -95,6 +105,16 @@ export class SitesService {
return this.getSite(siteId, { relations: ['members'] });
}
/**
* Gets a list of all a site's members.
* @param siteId ID of the target site
* @param opts Optional parameters supported by JS-API
* @returns Observable<SiteMemberPaging>
*/
listSiteMemberships(siteId: string, opts: any): Observable<SiteMemberPaging> {
return from(this.sitesApi.listSiteMemberships(siteId, opts));
}
/**
* Gets the username of the user currently logged into ACS.
* @returns Username string
@@ -126,7 +146,7 @@ export class SitesService {
* @param opts Options supported by JS-API
* @returns Site membership requests
*/
getSiteMembershipRequests(opts?: any): Observable<SiteMembershipRequestWithPersonPaging | {}> {
getSiteMembershipRequests(opts?: any): Observable<SiteMembershipRequestWithPersonPaging> {
return from(this.sitesApi.getSiteMembershipRequests(opts))
.pipe(
catchError((err: any) => this.handleError(err))
@@ -138,9 +158,9 @@ export class SitesService {
* @param siteId The identifier of a site
* @param siteMembershipBodyCreate The person to add and their role
* @param opts Optional parameters
* @return Site member entry
* @return Observable<SiteMemberEntry>
*/
createSiteMembership(siteId: string, siteMembershipBodyCreate: SiteMembershipBodyCreate, opts?: any): Observable<SiteMemberEntry | {}> {
createSiteMembership(siteId: string, siteMembershipBodyCreate: SiteMembershipBodyCreate, opts?: any): Observable<SiteMemberEntry> {
return from(this.sitesApi.createSiteMembership(siteId, siteMembershipBodyCreate, opts))
.pipe(
catchError((err: any) => this.handleError(err))
@@ -153,9 +173,9 @@ export class SitesService {
* @param personId The identifier of a person.
* @param siteMembershipBodyUpdate The persons new role
* @param opts Optional parameters
* @return Site member entry>
* @return Observable<SiteMemberEntry>
*/
updateSiteMembership(siteId: string, personId: string, siteMembershipBodyUpdate: SiteMembershipBodyUpdate, opts?: any): Observable<SiteMemberEntry | {}> {
updateSiteMembership(siteId: string, personId: string, siteMembershipBodyUpdate: SiteMembershipBodyUpdate, opts?: any): Observable<SiteMemberEntry> {
return from(this.sitesApi.updateSiteMembership(siteId, personId, siteMembershipBodyUpdate, opts))
.pipe(
catchError((err: any) => this.handleError(err))
@@ -168,7 +188,7 @@ export class SitesService {
* @param personId The identifier of a person.
* @return Null response notifying when the operation is complete
*/
deleteSiteMembership(siteId: string, personId: string): Observable<any> {
deleteSiteMembership(siteId: string, personId: string): Observable<void> {
return from(this.sitesApi.deleteSiteMembership(siteId, personId))
.pipe(
catchError((err: any) => this.handleError(err))
@@ -182,7 +202,7 @@ export class SitesService {
* @param opts Options supported by JS-API
* @returns Null response notifying when the operation is complete
*/
approveSiteMembershipRequest(siteId: string, inviteeId: string, opts?: any): Observable<SiteMembershipRequestWithPersonPaging | {}> {
approveSiteMembershipRequest(siteId: string, inviteeId: string, opts?: any): Observable<SiteMembershipRequestWithPersonPaging> {
return from(this.sitesApi.approveSiteMembershipRequest(siteId, inviteeId, opts))
.pipe(
catchError((err: any) => this.handleError(err))
@@ -196,14 +216,80 @@ export class SitesService {
* @param opts Options supported by JS-API
* @returns Null response notifying when the operation is complete
*/
rejectSiteMembershipRequest(siteId: string, inviteeId: string, opts?: any): Observable<SiteMembershipRequestWithPersonPaging | {}> {
rejectSiteMembershipRequest(siteId: string, inviteeId: string, opts?: any): Observable<SiteMembershipRequestWithPersonPaging> {
return from(this.sitesApi.rejectSiteMembershipRequest(siteId, inviteeId, opts))
.pipe(
catchError((err: any) => this.handleError(err))
);
}
private handleError(error: any): any {
/**
* List group membership for site
* @param siteId The identifier of a site.
* @param opts Options supported by JS-API
* @returns Observable<SiteGroupPaging>
*/
listSiteGroups(siteId: string, opts?: any): Observable<SiteGroupPaging> {
return from(this.sitesApi.listSiteGroups(siteId, opts))
.pipe(
catchError((err: any) => this.handleError(err))
);
}
/**
* Create a site membership for group
* @param siteId The identifier of a site.
* @param siteMembershipBodyCreate The Group to add and its role
* @returns Observable<SiteGroupEntry>
*/
createSiteGroupMembership(siteId: string, siteMembershipBodyCreate: SiteMembershipBodyCreate): Observable<SiteGroupEntry> {
return from(this.sitesApi.createSiteGroupMembership(siteId, siteMembershipBodyCreate))
.pipe(
catchError((err: any) => this.handleError(err))
);
}
/**
* Get information about site membership of group
* @param siteId The identifier of a site.
* @param groupId The authorityId of a group.
* @return Observable<SiteGroupEntry>
*/
getSiteGroupMembership(siteId: string, groupId: string): Observable<SiteGroupEntry> {
return from(this.sitesApi.getSiteGroupMembership(siteId, groupId))
.pipe(
catchError((err: any) => this.handleError(err))
);
}
/**
* Update site membership of group
* @param siteId The identifier of a site.
* @param groupId The authorityId of a group.
* @param siteMembershipBodyUpdate The group new role
* @return Observable<SiteGroupEntry>
*/
updateSiteGroupMembership(siteId: string, groupId: string, siteMembershipBodyUpdate: SiteMembershipBodyUpdate): Observable<SiteGroupEntry> {
return from(this.sitesApi.updateSiteGroupMembership(siteId, groupId, siteMembershipBodyUpdate))
.pipe(
catchError((err: any) => this.handleError(err))
);
}
/**
* Delete a group membership for site
* @param siteId The identifier of a site.
* @param groupId The authorityId of a group.
* @return Observable<void>
*/
deleteSiteGroupMembership(siteId: string, groupId: string): Observable<void> {
return from(this.sitesApi.deleteSiteGroupMembership(siteId, groupId))
.pipe(
catchError((err: any) => this.handleError(err))
);
}
private handleError(error: any): Observable<never> {
console.error(error);
return throwError(error || 'Server error');
}
@@ -88,4 +88,13 @@ export class DocumentListPage {
async doubleClickRow(nodeName: string): Promise<void> {
await this.dataTable.doubleClickRow('Display name', nodeName);
}
async isItemPresent(name: string): Promise<boolean> {
return this.dataTable.getRow('Display name', name).isPresent();
}
async getLibraryRole(name: string): Promise<string> {
return this.dataTable.getRow('Display name', name).element(by.css('adf-library-role-column')).getText();
}
}
@@ -31,6 +31,9 @@ export class DataTableComponentPage {
allSelectedRows: ElementArrayFinder;
selectAll: ElementFinder;
copyColumnTooltip: ElementFinder;
emptyList: ElementFinder;
emptyListTitle: ElementFinder;
emptyListSubtitle: ElementFinder;
constructor(rootElement = element.all(by.css('adf-datatable')).first()) {
this.rootElement = rootElement;
@@ -42,6 +45,9 @@ export class DataTableComponentPage {
this.allSelectedRows = this.rootElement.all(by.css(`adf-datatable-row[class*='is-selected']`));
this.selectAll = this.rootElement.element(by.css(`div[class*='adf-datatable-header'] mat-checkbox`));
this.copyColumnTooltip = this.rootElement.element(by.css(`adf-copy-content-tooltip span`));
this.emptyList = this.rootElement.element(by.css(`div.adf-no-content-container`));
this.emptyListTitle = this.rootElement.element(by.css(`.adf-empty-content__title`));
this.emptyListSubtitle = this.rootElement.element(by.css(`.adf-empty-content__subtitle`));
}
async checkAllRowsButtonIsDisplayed(): Promise<void> {
@@ -372,4 +378,50 @@ export class DataTableComponentPage {
async clickColumn(columnName: string, columnValue: string): Promise<void> {
await BrowserActions.clickExecuteScript(`div[title="${columnName}"] div[data-automation-id="text_${columnValue}"] span`);
}
async selectMultipleItems(names: string[]): Promise<void> {
await browser.actions().sendKeys(protractor.Key.ESCAPE).perform();
await browser.actions().sendKeys(protractor.Key.COMMAND).perform();
for (const name of names) {
await this.selectRowByContent(name);
}
await this.clearSelection();
}
async clearSelection(): Promise<void> {
await browser.actions().sendKeys(protractor.Key.NULL).perform();
}
async getEmptyListText(): Promise<string> {
const isEmpty = await this.isEmpty();
if (isEmpty) {
return this.rootElement.by.css('adf-custom-empty-content-template').getText();
}
return '';
}
async isEmpty(): Promise<boolean> {
return this.emptyList.isPresent();
}
async waitForEmptyState(): Promise<void> {
await BrowserVisibility.waitUntilElementIsPresent(this.tableBody.element(this.emptyList));
}
async getEmptyStateTitle(): Promise<string> {
const isEmpty = await this.isEmpty();
if (isEmpty) {
return this.emptyListTitle.getText();
}
return '';
}
async getEmptyStateSubtitle(): Promise<string> {
const isEmpty = await this.isEmpty();
if (isEmpty) {
return this.emptyListSubtitle.getText();
}
return '';
}
}