diff --git a/src/app/pages/user-profile/user-profile-component.scss b/src/app/pages/user-profile/user-profile-component.scss
index edde89117..428989d32 100644
--- a/src/app/pages/user-profile/user-profile-component.scss
+++ b/src/app/pages/user-profile/user-profile-component.scss
@@ -175,4 +175,10 @@ table {
}
.govuk-item-custom .govuk-checkboxes__input + .govuk-checkboxes__label::after {
top: 18px;
-}
\ No newline at end of file
+}
+.govuk-checkboxes-custom-input .govuk-checkboxes__input:disabled + .govuk-checkboxes__label {
+ opacity: 1;
+ }
+ .govuk-checkboxes-custom-input .govuk-checkboxes__input:disabled + .govuk-checkboxes__label::after , .govuk-checkboxes-custom-input .govuk-checkboxes__input:disabled + .govuk-checkboxes__label::before {
+ opacity: 0.5;
+ }
\ No newline at end of file
diff --git a/src/app/pages/user-profile/user-profile-component.ts b/src/app/pages/user-profile/user-profile-component.ts
index 7ac527ad7..c1ba62d1d 100644
--- a/src/app/pages/user-profile/user-profile-component.ts
+++ b/src/app/pages/user-profile/user-profile-component.ts
@@ -4,7 +4,7 @@ import { Store } from '@ngrx/store';
import { LocationStrategy, ViewportScroller } from '@angular/common';
import { UIState } from 'src/app/store/ui.states';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
-import { UserEditResponseInfo, UserGroup, UserProfileRequestInfo } from 'src/app/models/user';
+import { UserEditResponseInfo, UserGroup, UserProfileRequestInfo, userGroupTableDetail } from 'src/app/models/user';
import { WrapperUserService } from 'src/app/services/wrapper/wrapper-user.service';
import { WrapperUserContactService } from 'src/app/services/wrapper/wrapper-user-contact.service';
import {
@@ -15,7 +15,7 @@ import { ActivatedRoute, Router } from '@angular/router';
import { OperationEnum } from 'src/app/constants/enum';
import { ScrollHelper } from 'src/app/services/helper/scroll-helper.services';
import { WrapperOrganisationGroupService } from 'src/app/services/wrapper/wrapper-org--group-service';
-import { Role } from 'src/app/models/organisationGroup';
+import { Group, GroupList, Role } from 'src/app/models/organisationGroup';
import { ContactHelper } from 'src/app/services/helper/contact-helper.service';
import { AuthService } from 'src/app/services/auth/auth.service';
import { AuditLoggerService } from 'src/app/services/postgres/logger.service';
@@ -30,14 +30,16 @@ import { WrapperOrganisationService } from 'src/app/services/wrapper/wrapper-org
styleUrls: ['./user-profile-component.scss'],
})
export class UserProfileComponent extends FormBaseComponent implements OnInit {
- public showRoleView:boolean = environment.appSetting.hideSimplifyRole
+ public showRoleView: boolean = environment.appSetting.hideSimplifyRole
submitted!: boolean;
formGroup!: FormGroup;
- userGroupTableHeaders = ['GROUPS','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'];
- userGroupColumnsToDisplay = ['group','','','','','','','','','','','','','','','',''];
userServiceTableHeaders = ['NAME'];
userRoleTableHeaders = ['ROLES', 'SERVICE'];
+ userServiceGroupTableHeaders = ['NAME'];
userServiceColumnsToDisplay = ['accessRoleName',]
+ userServiceGroupColumnsToDisplay = [
+ 'name'
+ ];
userRoleColumnsToDisplay = [
'accessRoleName',
'serviceName',
@@ -60,11 +62,15 @@ export class UserProfileComponent extends FormBaseComponent implements OnInit {
'fax',
'webUrl',
];
+ public tabConfig = {
+ userservices: true,
+ groupservices: false
+ }
public detailsData: any = [];
public isAdminUser: boolean = false;
userGroups: UserGroup[] = [];
public approveRequiredRole: Role[];
- public pendingRoleDetails: any =[]
+ public pendingRoleDetails: any = []
public selectedApproveRequiredRole: any = []
public pendingRoledeleteDetails: any = []
public organisationDetails: any = {}
@@ -78,11 +84,35 @@ export class UserProfileComponent extends FormBaseComponent implements OnInit {
roleDataList: any[] = [];
assignedRoleDataList: any[] = [];
routeStateData: any = {};
- hasGroupViewPermission: boolean = false;
isOrgAdmin: boolean = false;
- private selectedRoleIds:number[] = [];
- public groupHint:string=''
- private adminRoleKey:string= 'ORG_ADMINISTRATOR';
+ private selectedRoleIds: number[] = [];
+ public groupHint: string = ''
+ private adminRoleKey: string = 'ORG_ADMINISTRATOR';
+ public selectedGroupCheckboxes: any[] = [];
+ public orgGroups: Group[] = [];
+ public orgUserGroupRoles: any[] = [];
+
+ public groupsMember: userGroupTableDetail = {
+ isAdmin: false,
+ headerText: "Groups assigned",
+ headerTextKey: "groupName",
+ accessTable: "groupsMember",
+ noRoleMessage: "You do not have access to any service through membership of this group.",
+ noDataGroupsMemberMessage: "You are not member of any group.",
+ groupShow: true,
+ data: [],
+ }
+ public noneGroupsMember: userGroupTableDetail = {
+ isAdmin: false,
+ headerText: "Groups unassigned",
+ headerTextKey: "groupName",
+ accessTable: "noneGroupsMember",
+ noRoleMessage: "You do not have access to any service through membership of this group.",
+ noDatanoneGroupsMemberMessage: "There are no unassiged groups available for you.",
+ groupShow: false,
+ data: []
+ }
+
@ViewChildren('input') inputs!: QueryList
;
constructor(
@@ -98,7 +128,8 @@ export class UserProfileComponent extends FormBaseComponent implements OnInit {
private contactHelper: ContactHelper,
private authService: AuthService,
private auditLogService: AuditLoggerService,
- private organisationService: WrapperOrganisationService
+ private organisationService: WrapperOrganisationService,
+
) {
super(
viewportScroller,
@@ -115,6 +146,7 @@ export class UserProfileComponent extends FormBaseComponent implements OnInit {
this.locationStrategy.onPopState(() => {
this.onCancelClick();
});
+ this.orgGroups = [];
}
async ngOnInit() {
@@ -139,12 +171,7 @@ export class UserProfileComponent extends FormBaseComponent implements OnInit {
this.identityProviderDisplayName = 'User ID and password'
}
this.userGroups = user.detail.userGroups || [];
- this.userGroups = this.userGroups.filter(
- (group, index, self) =>
- self.findIndex(
- (t) => t.groupId === group.groupId && t.group === group.group
- ) === index
- );
+
if (this.routeStateData != undefined) {
this.formGroup.setValue({
firstName: this.routeStateData.firstName,
@@ -161,48 +188,49 @@ export class UserProfileComponent extends FormBaseComponent implements OnInit {
}
await this.getApprovalRequriedRoles()
await this.getPendingApprovalUserRole();
- await this.getOrgDetails()
+ await this.getOrgDetails();
+ //await this.getOrgGroups();
await this.orgGroupService
.getOrganisationRoles(this.organisationId)
.toPromise()
.then((orgRoles: Role[]) => {
- orgRoles.map((r:Role,index) =>{
- let userRole =
- user.detail.rolePermissionInfo &&
- user.detail.rolePermissionInfo.some(
- (rp) => rp.roleId == r.roleId
- );
- if(userRole){
- if ( r.roleKey == this.adminRoleKey && this.isAdminUser == false) {
- this.isAdminUser = true;
- }
- this.formGroup.addControl(
- 'orgRoleControl_' + r.roleId,
- this.formBuilder.control(this.assignedRoleDataList ? true : '')
- );
- } else {
- let PendinguserRole = this.pendingRoleDetails.some(
- (pendingRole: any) => pendingRole.roleKey == r.roleKey
- );
- this.formGroup.addControl(
- 'orgRoleControl_' + r.roleId,
- this.formBuilder.control(userRole ? true : PendinguserRole ? true : '')
- );
- if(userRole){
- r.enabled = true
- }
- }
- });
+ orgRoles.map((r: Role, index) => {
+ let userRole =
+ user.detail.rolePermissionInfo &&
+ user.detail.rolePermissionInfo.some(
+ (rp) => rp.roleId == r.roleId
+ );
+ if (userRole) {
+ if (r.roleKey == this.adminRoleKey && this.isAdminUser == false) {
+ this.isAdminUser = true;
+ }
+ this.formGroup.addControl(
+ 'orgRoleControl_' + r.roleId,
+ this.formBuilder.control(this.assignedRoleDataList ? true : '')
+ );
+ } else {
+ let PendinguserRole = this.pendingRoleDetails.some(
+ (pendingRole: any) => pendingRole.roleKey == r.roleKey
+ );
+ this.formGroup.addControl(
+ 'orgRoleControl_' + r.roleId,
+ this.formBuilder.control(userRole ? true : PendinguserRole ? true : '')
+ );
+ if (userRole) {
+ r.enabled = true
+ }
+ }
+ });
//bind Roles based on User Type
if (this.isAdminUser == true) {
- orgRoles.forEach((element:any) => {
+ orgRoles.forEach((element: any) => {
this.roleDataList.push({
roleId: element.roleId,
roleKey: element.roleKey,
accessRoleName: element.roleName,
serviceName: element.serviceName,
- description:element.description
+ description: element.description
});
this.formGroup.addControl(
'orgRoleControl_' + element.roleId,
@@ -219,11 +247,11 @@ export class UserProfileComponent extends FormBaseComponent implements OnInit {
});
}
});
- this.groupHint = "Select the services that you need access to."
+ this.groupHint = "Select the services that you need access to."
} else {
user.detail.rolePermissionInfo &&
user.detail.rolePermissionInfo.map((roleInfo) => {
- var orgRole:any = orgRoles.find((r) => r.roleId == roleInfo.roleId);
+ var orgRole: any = orgRoles.find((r) => r.roleId == roleInfo.roleId);
if (orgRole) {
switch (orgRole.roleKey) {
case 'CAT_USER': {
@@ -258,22 +286,32 @@ export class UserProfileComponent extends FormBaseComponent implements OnInit {
this.roleDataList.push({
accessRoleName: orgRole.roleName,
serviceName: orgRole.serviceName,
- description:orgRole.description,
- serviceView:!this.showRoleView
+ description: orgRole.description,
+ serviceView: !this.showRoleView,
+ approvalStatus: 1
+ });
+ }
+ });
+
+ //Adding the pending approval service to the user role list with label pending approval
+ this.pendingRoleDetails && this.pendingRoleDetails.map((roleInfo: any) => {
+ var orgRole: any = orgRoles.find((r) => r.roleId == roleInfo.roleId);
+ if (orgRole) {
+ this.roleDataList.push({
+ accessRoleName: orgRole.roleName,
+ serviceName: orgRole.serviceName,
+ description: orgRole.description,
+ serviceView: !this.showRoleView,
+ approvalStatus: roleInfo.approvalStatus
});
}
});
- this.groupHint = "These are the services that you have access to."
- }
- });
- this.authService
- .hasPermission('MANAGE_GROUPS')
- .toPromise()
- .then((hasPermission: boolean) => {
- this.hasGroupViewPermission = hasPermission;
+ this.groupHint = "These are the services that you have access to."
+ }
});
+
this.getUserContact(this.userName);
this.onFormValueChange();
@@ -292,6 +330,8 @@ export class UserProfileComponent extends FormBaseComponent implements OnInit {
'Send messages to multiple contacts in your organisation. You can also send targeted communications to specific users.',
];
}
+
+ await this.getOrgGroups();
}
ngAfterViewChecked() {
@@ -319,9 +359,10 @@ export class UserProfileComponent extends FormBaseComponent implements OnInit {
}
async getOrgDetails() {
- if(this.isOrgAdmin){
- this.organisationDetails = await this.organisationService.getOrganisation(this.organisationId).toPromise().catch(e => {
- });}
+ if (this.isOrgAdmin) {
+ this.organisationDetails = await this.organisationService.getOrganisation(this.organisationId).toPromise().catch(e => {
+ });
+ }
}
async getPendingApprovalUserRole() {
@@ -395,6 +436,7 @@ export class UserProfileComponent extends FormBaseComponent implements OnInit {
detail: {
id: 0,
roleIds: this.getSelectedRoleIds(form),
+ groupIds: this.selectedGroupCheckboxes
},
firstName: form.get('firstName')?.value,
lastName: form.get('lastName')?.value,
@@ -416,27 +458,10 @@ export class UserProfileComponent extends FormBaseComponent implements OnInit {
this.router.navigateByUrl('home');
}
- onGroupViewClick(event: any) {
- var formData = {
- firstName: this.formGroup.get('firstName')?.value,
- lastName: this.formGroup.get('lastName')?.value,
- };
- let data = {
- isEdit: false,
- groupId: event.groupId,
- url: this.router.url,
- accessFrom:"users",
- isUserAccess:false
- };
- this.router.navigateByUrl(
- 'manage-groups/view?data=' + JSON.stringify(data),
- { state: { formData: formData, routeUrl: this.router.url } }
- );
- }
getSelectedRoleIds(form: FormGroup) {
- if(this.organisationDetails.detail == undefined){
+ if (this.organisationDetails.detail == undefined) {
return
}
this.selectedRoleIds = [];
@@ -450,7 +475,7 @@ export class UserProfileComponent extends FormBaseComponent implements OnInit {
if (filterRole === undefined) {
this.selectedRoleIds.push(role.roleId)
} else {
- this.checkPendingRoleDetails(role)
+ this.checkPendingRoleDetails(role)
}
} else {
this.selectedRoleIds.push(role.roleId)
@@ -462,32 +487,32 @@ export class UserProfileComponent extends FormBaseComponent implements OnInit {
return this.selectedRoleIds;
}
- private checkPendingRoleDetails(role:any){
+ private checkPendingRoleDetails(role: any) {
let filterAlreadyExistRole = this.pendingRoleDetails.find((element: { roleKey: any; }) => element.roleKey == role.roleKey)
if (this.pendingRoleDetails.length == 0) {
this.updateSelectedRoleIds(role)
- } else if(filterAlreadyExistRole?.roleKey != role.roleKey) {
+ } else if (filterAlreadyExistRole?.roleKey != role.roleKey) {
this.selectedApproveRequiredRole.push(role.roleId)
}
// Remove below line to seperate normal and approval required role. It is added as we will not be using seperate api. Only user update api will be used
- else if(filterAlreadyExistRole?.roleKey == role.roleKey){
+ else if (filterAlreadyExistRole?.roleKey == role.roleKey) {
this.selectedRoleIds.push(role.roleId)
}
- }
+ }
- private updateSelectedRoleIds(role:any){
- if(role.enabled === true){
+ private updateSelectedRoleIds(role: any) {
+ if (role.enabled === true) {
this.selectedRoleIds.push(role.roleId)
} else {
this.selectedApproveRequiredRole.push(role.roleId)
}
- }
+ }
/**
* checking approve required roles are availble
*/
private checkApproveRolesSelected() {
- if(this.organisationDetails.detail == undefined){
+ if (this.organisationDetails.detail == undefined) {
this.updateUser()
return
}
@@ -509,13 +534,13 @@ export class UserProfileComponent extends FormBaseComponent implements OnInit {
})
})
localStorage.setItem('user_approved_role', JSON.stringify(matchRoles));
- localStorage.setItem('user_access_name',this.userName);
+ localStorage.setItem('user_access_name', this.userName);
}
this.submitPendingApproveRole(superAdminDomain === userDomain);
}
- private submitPendingApproveRole(isValidDomain:boolean): void {
+ private submitPendingApproveRole(isValidDomain: boolean): void {
let selectedRolesDetails = {
userName: this.userName,
organisationId: this.organisationDetails.detail.organisationId,
@@ -526,32 +551,32 @@ export class UserProfileComponent extends FormBaseComponent implements OnInit {
if (this.selectedApproveRequiredRole.length != 0 && !isValidDomain) {
this.userService.createPendingApproveRole(selectedRolesDetails).subscribe({
next: (roleInfo: UserEditResponseInfo) => {
- this.checkDeleteStatusForPendingRole()
+ this.checkDeleteStatusForPendingRole()
},
error: (err: any) => {
console.log(err)
},
});
} else {
- this.checkDeleteStatus()
+ this.checkDeleteStatus()
}
}
- private checkDeleteStatusForPendingRole(){
- if (this.pendingRoledeleteDetails.length === 0) {
- this.updateUser()
- } else {
- this.deleteApprovePendingRole()
- }
+ private checkDeleteStatusForPendingRole() {
+ if (this.pendingRoledeleteDetails.length === 0) {
+ this.updateUser()
+ } else {
+ this.deleteApprovePendingRole()
}
+ }
- private checkDeleteStatus(){
- if (this.pendingRoledeleteDetails.length != 0) {
- this.deleteApprovePendingRole()
- } else {
- this.updateUser()
- }
+ private checkDeleteStatus() {
+ if (this.pendingRoledeleteDetails.length != 0) {
+ this.deleteApprovePendingRole()
+ } else {
+ this.updateUser()
}
+ }
private updateUser(): void {
@@ -581,17 +606,17 @@ export class UserProfileComponent extends FormBaseComponent implements OnInit {
// }
// }
}
-
- private removePendingRole(obj:any){
+
+ private removePendingRole(obj: any) {
let pendingRole = this.pendingRoledeleteDetails.find((element: number) => element == obj.roleId)
- if (pendingRole != undefined) {
- this.pendingRoledeleteDetails.forEach((pRole: any, index: any) => {
- if (pRole === obj.roleId) {
- this.pendingRoledeleteDetails.splice(index, 1)
- }
- })
+ if (pendingRole != undefined) {
+ this.pendingRoledeleteDetails.forEach((pRole: any, index: any) => {
+ if (pRole === obj.roleId) {
+ this.pendingRoledeleteDetails.splice(index, 1)
}
- }
+ })
+ }
+ }
private deleteApprovePendingRole(): void {
const deleteRoleIds = this.pendingRoledeleteDetails.join();
@@ -628,11 +653,80 @@ export class UserProfileComponent extends FormBaseComponent implements OnInit {
}
}
- public getDisbleRole(orgRole:any){
- if(orgRole === 'ORG_DEFAULT_USER' || orgRole === 'ORG_ADMINISTRATOR'){
- return true
- } else {
- return null
- }
+ async getOrgGroups() {
+ const orgGrpList = await this.orgGroupService.getOrganisationGroupsWithRoles(this.organisationId).toPromise();
+ this.orgGroups = orgGrpList.groupList;
+ for (const group of this.orgGroups) {
+ const isGroupOfUser: any = this.userGroups?.find((ug) => ug.groupId === group.groupId);
+ if (isGroupOfUser) {
+
+ group.serviceRoleGroups.map((fc: any) => {
+ var serviceGroupApprovalDetails: any = this.userGroups?.find((ug: any) => ug.groupId === group.groupId && ug.accessServiceRoleGroupId === fc.id);
+ fc.approvalStatus = serviceGroupApprovalDetails?.approvalStatus;
+ });
+
+ group.checked = true
+ group.serviceRoleGroups = group.serviceRoleGroups.filter((item: any) => item.approvalStatus === 0 || item.approvalStatus === 1);
+ this.groupsMember.data.push(group)
+ this.selectedGroupCheckboxes.push(group.groupId)
+
+ group.serviceRoleGroups.forEach((element: any) => {
+ let groupRoles = this.orgUserGroupRoles.filter(e => { return e.id == element.id });
+ if (groupRoles.length <= 0 && (element.approvalStatus == 0 || element.approvalStatus == 1)) {
+ element.serviceView = true;
+ this.orgUserGroupRoles.push(element);
+ }
+ });
+ } else {
+ if (this.isAdminUser) {
+ this.noneGroupsMember.data.push(group)
+ }
+ }
+ }
+ this.groupsMember.isAdmin = this.isAdminUser;
+ this.noneGroupsMember.isAdmin = this.isAdminUser;
+ }
+
+ public groupsMemberCheckBoxAddRoles(data: any) {
+ this.formChanged = true;
+ this.selectedGroupCheckboxes.push(data.groupId);
+ }
+
+ public groupsMemberCheckBoxRemoveRoles(data: any) {
+ this.formChanged = true;
+ this.selectedGroupCheckboxes = this.removeObjectById(this.selectedGroupCheckboxes, data.groupId)
+ }
+
+ public noneGroupsMemberCheckBoxAddRoles(data: any) {
+ this.formChanged = true;
+ this.selectedGroupCheckboxes.push(data.groupId);
+ }
+
+ public noneGroupsMemberCheckBoxRemoveRoles(data: any) {
+ this.formChanged = true;
+ this.selectedGroupCheckboxes = this.removeObjectById(this.selectedGroupCheckboxes, data.groupId)
+ }
+
+ private removeObjectById(arr: any, id: any) {
+ return arr.filter((item: any) => item !== id);
+ }
+
+ public getDisbleRole(orgRole: any) {
+ if (orgRole === 'ORG_DEFAULT_USER' || orgRole === 'ORG_ADMINISTRATOR') {
+ return true
+ } else {
+ return null
+ }
+ }
+
+ public tabChanged(activetab: string): void {
+ if (activetab === 'userservices') {
+ this.tabConfig.userservices = true
+ this.tabConfig.groupservices = false
+ } else {
+ this.tabConfig.groupservices = true
+ this.tabConfig.userservices = false
+ }
}
-}
+
+}
\ No newline at end of file
diff --git a/src/app/services/wrapper/wrapper-org--group-service.ts b/src/app/services/wrapper/wrapper-org--group-service.ts
index 54a646eef..a958e92cf 100644
--- a/src/app/services/wrapper/wrapper-org--group-service.ts
+++ b/src/app/services/wrapper/wrapper-org--group-service.ts
@@ -44,6 +44,17 @@ export class WrapperOrganisationGroupService {
);
}
+ getOrganisationGroupsWithRoles(organisationId: string, searchString: string = ''): Observable {
+ const url = `${this.url}/${organisationId}/groups/servicerolegroups?search-string=${encodeURIComponent(searchString)}`;
+ return this.http.get(url).pipe(
+ map((data: GroupList) => {
+ return data;
+ }), catchError(error => {
+ return throwError(error);
+ })
+ );
+ }
+
getOrganisationGroup(organisationId: string, groupId: number): Observable {
if (!environment.appSetting.hideSimplifyRole) {
const url = `${this.url}/${organisationId}/groups/${groupId}/servicerolegroups`;
diff --git a/src/app/services/wrapper/wrapper-user.service.ts b/src/app/services/wrapper/wrapper-user.service.ts
index 9c58bf19f..93098ed36 100644
--- a/src/app/services/wrapper/wrapper-user.service.ts
+++ b/src/app/services/wrapper/wrapper-user.service.ts
@@ -135,6 +135,7 @@ export class WrapperUserService {
roleId: role.id,
roleKey:role.key,
roleName: role.name,
+ approvalStatus: role.status
}
roleInfo.push(structureObj)
})
diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json
index b7aaede0f..24c4a161d 100644
--- a/src/assets/i18n/en.json
+++ b/src/assets/i18n/en.json
@@ -372,5 +372,16 @@
"CONFIRM_EMAIL":"Confirm email address",
"NOTIFICATION_SENT":"Notification sent",
"DUP_ORG":"Duplicate organisations",
- "ACCESS_TO_USER":"Select the services that this user needs access to."
+ "ACCESS_TO_USER":"Select the services that this user needs access to.",
+ "ACCESS_TO_USER_SERVICE": "Select the services that this user needs access to as an individual, rather than through their membership of a group.",
+ "ACCESS_TO_GROUP_SEVICE": "This user has access to the following services through their membership of one or more groups. You can manage group membership, and access to services, through the dashboard.",
+ "ACCESS_TO_USER_ROLE": "Select the services that this user needs access to. You can also view the services that this user has access to through their membership of any groups.",
+ "NO_GROUP_ROLE_ACCESS_ADDUSER": "This user does not have access to any service through their membership of a group. You can manage group membership, and access to services, through the dashboard.",
+ "ORG_USER_INDIVIDUAL_ACCESS": "These services are assigned to you as an individual, rather than through your membership of a group.",
+ "ORG_USER_GROUP_ACCESS": "You have access to the following services through your membership of one or more groups.",
+ "ORG_USER_GROUP_ACCESS_NONE": "You do not have access to any service through your membership of a group.",
+ "ORG_ADMIN_GROUP_ACCESS": "You have access to the following services through your membership of one or more groups. You can manage group membership, and access to services, through the dashboard.",
+ "ORG_ADMIN_GROUP_ACCESS_NONE": "You do not have access to any service through your membership of a group. You can manage group membership, and access to services, through the dashboard.",
+ "PENDING_LABEL" : "Pending Approval",
+ "ACCESS_TO_REGULAR_USER_SERVICE": "These services are assigned to you as an individual, rather than through your membership of a group."
}