diff --git a/projects/admin/src/app/routes/patrons-route.ts b/projects/admin/src/app/routes/patrons-route.ts index 0b2c58c1a..6af86637e 100644 --- a/projects/admin/src/app/routes/patrons-route.ts +++ b/projects/admin/src/app/routes/patrons-route.ts @@ -14,7 +14,10 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ +import { FormlyFieldConfig } from '@ngx-formly/core'; import { DetailComponent, EditorComponent, RecordSearchComponent, RouteInterface } from '@rero/ng-core'; +import { JSONSchema7 } from 'json-schema'; +import { map } from 'rxjs/operators'; import { CanUpdateGuard } from '../guard/can-update.guard'; import { PatronsBriefViewComponent } from '../record/brief-view/patrons-brief-view.component'; import { PatronDetailViewComponent } from '../record/detail-view/patron-detail-view/patron-detail-view.component'; @@ -58,6 +61,11 @@ export class PatronsRoute extends BaseRoute implements RouteInterface { } return record; }, + formFieldMap: (field: FormlyFieldConfig, jsonSchema: JSONSchema7): FormlyFieldConfig => { + // If the current logged user doens't have the 'system_librarian' role, then the user + // can't manage the role 'librarian' and 'system_librarian' + return this._limitRolesManagement(field, jsonSchema); + }, // use simple query for UI search preFilters: { simple: 1 @@ -68,4 +76,25 @@ export class PatronsRoute extends BaseRoute implements RouteInterface { } }; } + + /** Limit the patron roles management. + * + * @param field - FormlyFieldConfig + * @param jsonSchema - JSONSchema7 + * @return FormlyFieldConfig + */ + private _limitRolesManagement(field: FormlyFieldConfig, jsonSchema: JSONSchema7): FormlyFieldConfig { + const formOptions = jsonSchema.form; + if (formOptions && formOptions.fieldMap === 'roles') { + const values = Object.assign([], field.templateOptions.options); // create a clone of original values + field.templateOptions.options = this._routeToolService.recordPermissionService.getRolesManagementPermissions().pipe( + map(results => results.allowed_roles), + map(roles => { + values.forEach((role: any) => role.disabled = !roles.includes(role.value)); + return values; + }) + ); + } + return field; + } } diff --git a/projects/admin/src/app/routes/route-tool.service.ts b/projects/admin/src/app/routes/route-tool.service.ts index 1f951fa9b..2b239d68c 100644 --- a/projects/admin/src/app/routes/route-tool.service.ts +++ b/projects/admin/src/app/routes/route-tool.service.ts @@ -62,6 +62,13 @@ export class RouteToolService { return this._recordService; } + /** + * @return recordPermissionService + */ + get recordPermissionService() { + return this._recordPermissionService; + } + /** * Constructor * diff --git a/projects/admin/src/app/service/record-permission.service.ts b/projects/admin/src/app/service/record-permission.service.ts index 365864821..a4bffe7a1 100644 --- a/projects/admin/src/app/service/record-permission.service.ts +++ b/projects/admin/src/app/service/record-permission.service.ts @@ -18,6 +18,8 @@ import { I18nPluralPipe, NgLocaleLocalization } from '@angular/common'; import { HttpClient, HttpHeaders } from '@angular/common/http'; import { Injectable } from '@angular/core'; import { TranslateService } from '@ngx-translate/core'; +import { Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; @Injectable({ providedIn: 'root' @@ -54,6 +56,16 @@ export class RecordPermissionService { return this._httpClient.get(url, this._httpOptions); } + + /** + * Get roles that the current user can manage + * @return an observable on allowed roles management + */ + getRolesManagementPermissions(): Observable { + const url = 'api/patrons/roles_management_permissions'; + return this._httpClient.get(url, this._httpOptions); + } + /** * Generate tooltip messages * @param reasons - Object with reasons to insert into the tooltip