From 28b3f730f02198ee2995bd81c0063088ea4a2b88 Mon Sep 17 00:00:00 2001
From: Muskan Khedia <36980003+muskankhedia@users.noreply.github.com>
Date: Sun, 31 May 2020 13:05:52 +0530
Subject: [PATCH] feat: add view, edit roles and permission component (#632)
- Add view roles and permission
- Edit roles and permission
- Edit role description
Fixes: #176
---
.../disable-dialog.component.html | 8 +
.../disable-dialog.component.scss | 0
.../disable-dialog.component.spec.ts | 25 ++
.../disable-dialog.component.ts | 25 ++
.../enable-dialog.component.html | 8 +
.../enable-dialog.component.scss | 0
.../enable-dialog.component.spec.ts | 25 ++
.../enable-dialog/enable-dialog.component.ts | 25 ++
src/app/shared/shared.module.ts | 10 +-
.../edit-role/edit-role.component.html | 37 +++
.../edit-role/edit-role.component.scss | 11 +
.../edit-role/edit-role.component.spec.ts | 25 ++
.../edit-role/edit-role.component.ts | 67 ++++
.../roles-and-permissions.component.html | 11 +-
.../roles-and-permissions.component.ts | 10 +-
.../view-role/view-role.component.html | 99 ++++++
.../view-role/view-role.component.scss | 40 +++
.../view-role/view-role.component.spec.ts | 25 ++
.../view-role/view-role.component.ts | 301 ++++++++++++++++++
.../view-role/view-role.resolver.ts | 31 ++
src/app/system/system-routing.module.ts | 32 +-
src/app/system/system.module.ts | 6 +-
src/app/system/system.service.ts | 51 +++
23 files changed, 864 insertions(+), 8 deletions(-)
create mode 100644 src/app/shared/disable-dialog/disable-dialog.component.html
create mode 100644 src/app/shared/disable-dialog/disable-dialog.component.scss
create mode 100644 src/app/shared/disable-dialog/disable-dialog.component.spec.ts
create mode 100644 src/app/shared/disable-dialog/disable-dialog.component.ts
create mode 100644 src/app/shared/enable-dialog/enable-dialog.component.html
create mode 100644 src/app/shared/enable-dialog/enable-dialog.component.scss
create mode 100644 src/app/shared/enable-dialog/enable-dialog.component.spec.ts
create mode 100644 src/app/shared/enable-dialog/enable-dialog.component.ts
create mode 100644 src/app/system/roles-and-permissions/edit-role/edit-role.component.html
create mode 100644 src/app/system/roles-and-permissions/edit-role/edit-role.component.scss
create mode 100644 src/app/system/roles-and-permissions/edit-role/edit-role.component.spec.ts
create mode 100644 src/app/system/roles-and-permissions/edit-role/edit-role.component.ts
create mode 100644 src/app/system/roles-and-permissions/view-role/view-role.component.html
create mode 100644 src/app/system/roles-and-permissions/view-role/view-role.component.scss
create mode 100644 src/app/system/roles-and-permissions/view-role/view-role.component.spec.ts
create mode 100644 src/app/system/roles-and-permissions/view-role/view-role.component.ts
create mode 100644 src/app/system/roles-and-permissions/view-role/view-role.resolver.ts
diff --git a/src/app/shared/disable-dialog/disable-dialog.component.html b/src/app/shared/disable-dialog/disable-dialog.component.html
new file mode 100644
index 000000000..29c94683b
--- /dev/null
+++ b/src/app/shared/disable-dialog/disable-dialog.component.html
@@ -0,0 +1,8 @@
+
Disable
+
+
Are you sure you want to disable {{ data.disableContext }} ?
+
+
+
+
+
diff --git a/src/app/shared/disable-dialog/disable-dialog.component.scss b/src/app/shared/disable-dialog/disable-dialog.component.scss
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/app/shared/disable-dialog/disable-dialog.component.spec.ts b/src/app/shared/disable-dialog/disable-dialog.component.spec.ts
new file mode 100644
index 000000000..005a653e3
--- /dev/null
+++ b/src/app/shared/disable-dialog/disable-dialog.component.spec.ts
@@ -0,0 +1,25 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { DisableDialogComponent } from './disable-dialog.component';
+
+describe('DisableDialogComponent', () => {
+ let component: DisableDialogComponent;
+ let fixture: ComponentFixture;
+
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ declarations: [ DisableDialogComponent ]
+ })
+ .compileComponents();
+ }));
+
+ beforeEach(() => {
+ fixture = TestBed.createComponent(DisableDialogComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/src/app/shared/disable-dialog/disable-dialog.component.ts b/src/app/shared/disable-dialog/disable-dialog.component.ts
new file mode 100644
index 000000000..e773998fd
--- /dev/null
+++ b/src/app/shared/disable-dialog/disable-dialog.component.ts
@@ -0,0 +1,25 @@
+/** Angular Imports */
+import { Component, OnInit, Inject } from '@angular/core';
+import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material';
+
+/**
+ * Disable dialog component.
+ */
+@Component({
+ selector: 'mifosx-disable-dialog',
+ templateUrl: './disable-dialog.component.html',
+ styleUrls: ['./disable-dialog.component.scss']
+})
+export class DisableDialogComponent implements OnInit {
+
+ /**
+ * @param {MatDialogRef} dialogRef Component reference to dialog.
+ * @param {any} data Provides a disableContext.
+ */
+ constructor(public dialogRef: MatDialogRef,
+ @Inject(MAT_DIALOG_DATA) public data: any) { }
+
+ ngOnInit() {
+ }
+
+}
diff --git a/src/app/shared/enable-dialog/enable-dialog.component.html b/src/app/shared/enable-dialog/enable-dialog.component.html
new file mode 100644
index 000000000..d2f903ae1
--- /dev/null
+++ b/src/app/shared/enable-dialog/enable-dialog.component.html
@@ -0,0 +1,8 @@
+Enable
+
+
Are you sure you want to enable {{ data.enableContext }} ?
+
+
+
+
+
diff --git a/src/app/shared/enable-dialog/enable-dialog.component.scss b/src/app/shared/enable-dialog/enable-dialog.component.scss
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/app/shared/enable-dialog/enable-dialog.component.spec.ts b/src/app/shared/enable-dialog/enable-dialog.component.spec.ts
new file mode 100644
index 000000000..256ca842a
--- /dev/null
+++ b/src/app/shared/enable-dialog/enable-dialog.component.spec.ts
@@ -0,0 +1,25 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { EnableDialogComponent } from './enable-dialog.component';
+
+describe('EnableDialogComponent', () => {
+ let component: EnableDialogComponent;
+ let fixture: ComponentFixture;
+
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ declarations: [ EnableDialogComponent ]
+ })
+ .compileComponents();
+ }));
+
+ beforeEach(() => {
+ fixture = TestBed.createComponent(EnableDialogComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/src/app/shared/enable-dialog/enable-dialog.component.ts b/src/app/shared/enable-dialog/enable-dialog.component.ts
new file mode 100644
index 000000000..1fe396c43
--- /dev/null
+++ b/src/app/shared/enable-dialog/enable-dialog.component.ts
@@ -0,0 +1,25 @@
+/** Angular Imports */
+import { Component, OnInit, Inject } from '@angular/core';
+import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material';
+
+/**
+ * Enable dialog component.
+ */
+@Component({
+ selector: 'mifosx-enable-dialog',
+ templateUrl: './enable-dialog.component.html',
+ styleUrls: ['./enable-dialog.component.scss']
+})
+export class EnableDialogComponent implements OnInit {
+
+ /**
+ * @param {MatDialogRef} dialogRef Component reference to dialog.
+ * @param {any} data Provides a enableContext.
+ */
+ constructor(public dialogRef: MatDialogRef,
+ @Inject(MAT_DIALOG_DATA) public data: any) { }
+
+ ngOnInit() {
+ }
+
+}
diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts
index d25935ea1..b0d1a99df 100644
--- a/src/app/shared/shared.module.ts
+++ b/src/app/shared/shared.module.ts
@@ -12,6 +12,8 @@ import { FooterComponent } from './footer/footer.component';
import { LanguageSelectorComponent } from './language-selector/language-selector.component';
import { ThemePickerComponent } from './theme-picker/theme-picker.component';
import { ChangePasswordDialogComponent } from './change-password-dialog/change-password-dialog.component';
+import { EnableDialogComponent } from './enable-dialog/enable-dialog.component';
+import { DisableDialogComponent } from './disable-dialog/disable-dialog.component';
/** Custom Modules */
import { IconsModule } from './icons.module';
@@ -37,7 +39,9 @@ import { MaterialModule } from './material.module';
FooterComponent,
LanguageSelectorComponent,
ThemePickerComponent,
- ChangePasswordDialogComponent
+ ChangePasswordDialogComponent,
+ EnableDialogComponent,
+ DisableDialogComponent
],
exports: [
FileUploadComponent,
@@ -53,7 +57,9 @@ import { MaterialModule } from './material.module';
entryComponents: [
FormDialogComponent,
DeleteDialogComponent,
- ChangePasswordDialogComponent
+ ChangePasswordDialogComponent,
+ EnableDialogComponent,
+ DisableDialogComponent
]
})
export class SharedModule { }
diff --git a/src/app/system/roles-and-permissions/edit-role/edit-role.component.html b/src/app/system/roles-and-permissions/edit-role/edit-role.component.html
new file mode 100644
index 000000000..881f02d9b
--- /dev/null
+++ b/src/app/system/roles-and-permissions/edit-role/edit-role.component.html
@@ -0,0 +1,37 @@
+
diff --git a/src/app/system/roles-and-permissions/edit-role/edit-role.component.scss b/src/app/system/roles-and-permissions/edit-role/edit-role.component.scss
new file mode 100644
index 000000000..74a518510
--- /dev/null
+++ b/src/app/system/roles-and-permissions/edit-role/edit-role.component.scss
@@ -0,0 +1,11 @@
+.container {
+ max-width: 37rem;
+}
+
+span {
+ font-size: 1rem;
+}
+
+.roleName {
+ line-height: 3rem;
+}
diff --git a/src/app/system/roles-and-permissions/edit-role/edit-role.component.spec.ts b/src/app/system/roles-and-permissions/edit-role/edit-role.component.spec.ts
new file mode 100644
index 000000000..128057ce0
--- /dev/null
+++ b/src/app/system/roles-and-permissions/edit-role/edit-role.component.spec.ts
@@ -0,0 +1,25 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { EditRoleComponent } from './edit-role.component';
+
+describe('EditRoleComponent', () => {
+ let component: EditRoleComponent;
+ let fixture: ComponentFixture;
+
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ declarations: [ EditRoleComponent ]
+ })
+ .compileComponents();
+ }));
+
+ beforeEach(() => {
+ fixture = TestBed.createComponent(EditRoleComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/src/app/system/roles-and-permissions/edit-role/edit-role.component.ts b/src/app/system/roles-and-permissions/edit-role/edit-role.component.ts
new file mode 100644
index 000000000..b7300c61f
--- /dev/null
+++ b/src/app/system/roles-and-permissions/edit-role/edit-role.component.ts
@@ -0,0 +1,67 @@
+/** Angular Imports */
+import { Component, OnInit } from '@angular/core';
+import { FormGroup, FormBuilder, Validators } from '@angular/forms';
+import { ActivatedRoute, Router } from '@angular/router';
+
+/** Custom Services */
+import { SystemService } from '../../system.service';
+
+/**
+ * Edit Role Description Component.
+ */
+@Component({
+ selector: 'mifosx-edit-role',
+ templateUrl: './edit-role.component.html',
+ styleUrls: ['./edit-role.component.scss'],
+})
+export class EditRoleComponent implements OnInit {
+ /** Role Form */
+ roleForm: FormGroup;
+ /** Role Data */
+ roleData: any;
+
+ /**
+ * Retrieves the code data from `resolve`.
+ * @param {FormBuilder} formBuilder Form Builder.
+ * @param {SystemService} systemService System Service.
+ * @param {ActivatedRoute} route Activated Route.
+ * @param {Router} router Router for navigation.
+ */
+ constructor(
+ private formBuilder: FormBuilder,
+ private systemService: SystemService,
+ private route: ActivatedRoute,
+ private router: Router
+ ) {
+ this.route.data.subscribe((data: { role: any }) => {
+ this.roleData = data.role;
+ });
+ }
+
+ /**
+ * Creates and sets the role form.
+ */
+ ngOnInit() {
+ this.createRoleForm();
+ }
+
+ /**
+ * Creates and sets role form.
+ */
+ createRoleForm() {
+ this.roleForm = this.formBuilder.group({
+ name: [{ value: this.roleData.name, disabled: true }, Validators.required],
+ description: [this.roleData.description, Validators.required],
+ });
+ }
+
+ /**
+ * Submits the role form and updates role description,
+ * if successful redirects to view updated roles and permissions.
+ */
+ submit() {
+ this.systemService.updateRole(this.roleForm.value, this.roleData.id).subscribe(() => {
+ this.router.navigate(['../../'], { relativeTo: this.route });
+ });
+ }
+}
diff --git a/src/app/system/roles-and-permissions/roles-and-permissions.component.html b/src/app/system/roles-and-permissions/roles-and-permissions.component.html
index 4beda9fb1..2bab8d90b 100644
--- a/src/app/system/roles-and-permissions/roles-and-permissions.component.html
+++ b/src/app/system/roles-and-permissions/roles-and-permissions.component.html
@@ -37,8 +37,17 @@
+
+ Actions |
+
+
+ |
+
+
-
+
diff --git a/src/app/system/roles-and-permissions/roles-and-permissions.component.ts b/src/app/system/roles-and-permissions/roles-and-permissions.component.ts
index a8c6917f5..5441e6449 100644
--- a/src/app/system/roles-and-permissions/roles-and-permissions.component.ts
+++ b/src/app/system/roles-and-permissions/roles-and-permissions.component.ts
@@ -19,7 +19,7 @@ export class RolesAndPermissionsComponent implements OnInit {
/** Role data. */
roleData: any;
/** Columns to be displayed in roles and permissions table. */
- displayedColumns: string[] = ['name', 'description', 'disabled'];
+ displayedColumns: string[] = ['name', 'description', 'disabled', 'actions'];
/** Data source for roles and permissions table. */
dataSource: MatTableDataSource;
@@ -53,6 +53,14 @@ export class RolesAndPermissionsComponent implements OnInit {
this.setRoles();
}
+ /**
+ * Stops the propagation to view roles and permissions
+ * @param event Mouse Event
+ */
+ routeEdit(event: MouseEvent) {
+ event.stopPropagation();
+ }
+
/**
* Initializes the data source, paginator and sorter for roles and permissions table.
*/
diff --git a/src/app/system/roles-and-permissions/view-role/view-role.component.html b/src/app/system/roles-and-permissions/view-role/view-role.component.html
new file mode 100644
index 000000000..d62a70c46
--- /dev/null
+++ b/src/app/system/roles-and-permissions/view-role/view-role.component.html
@@ -0,0 +1,99 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Name:
+ {{ rolePermissionService.name }}
+
+
+
+ Description:
+ {{ rolePermissionService.description }}
+
+
+
+
+
+
+
+
+
+ Permissions: {{ formatName(previousGrouping) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ formatName(grouping) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/app/system/roles-and-permissions/view-role/view-role.component.scss b/src/app/system/roles-and-permissions/view-role/view-role.component.scss
new file mode 100644
index 000000000..38b0b749c
--- /dev/null
+++ b/src/app/system/roles-and-permissions/view-role/view-role.component.scss
@@ -0,0 +1,40 @@
+.displayPermissions {
+ padding-top: 15px;
+}
+
+span {
+ font-size: 1rem;
+}
+
+mat-list-item {
+ cursor: pointer;
+}
+
+.mat-list-base .mat-list-item .mat-list-item-content {
+ cursor: pointer;
+}
+
+.active {
+ background-color: #f2f2f2;
+}
+
+.groupingName {
+ padding: 0px 10px;
+}
+
+.listPermission {
+ padding-left: 20px;
+}
+
+.permissionSelected {
+ margin-top: 10px;
+ height: 40px;
+}
+
+.inactive {
+ transition: all .2s ease-in-out;
+}
+
+.inactive:hover {
+ transform: scale(1.1);
+}
diff --git a/src/app/system/roles-and-permissions/view-role/view-role.component.spec.ts b/src/app/system/roles-and-permissions/view-role/view-role.component.spec.ts
new file mode 100644
index 000000000..2f2fca0e2
--- /dev/null
+++ b/src/app/system/roles-and-permissions/view-role/view-role.component.spec.ts
@@ -0,0 +1,25 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { ViewRoleComponent } from './view-role.component';
+
+describe('ViewRoleComponent', () => {
+ let component: ViewRoleComponent;
+ let fixture: ComponentFixture;
+
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ declarations: [ ViewRoleComponent ]
+ })
+ .compileComponents();
+ }));
+
+ beforeEach(() => {
+ fixture = TestBed.createComponent(ViewRoleComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/src/app/system/roles-and-permissions/view-role/view-role.component.ts b/src/app/system/roles-and-permissions/view-role/view-role.component.ts
new file mode 100644
index 000000000..ee5e0cd39
--- /dev/null
+++ b/src/app/system/roles-and-permissions/view-role/view-role.component.ts
@@ -0,0 +1,301 @@
+/** Angular Imports */
+import { Component, OnInit } from '@angular/core';
+import { ActivatedRoute, Router } from '@angular/router';
+import { FormGroup, FormBuilder, Validators } from '@angular/forms';
+import { MatDialog } from '@angular/material';
+import { SystemService } from '../../system.service';
+import * as _ from 'lodash';
+
+/** Custom Components */
+import { DeleteDialogComponent } from '../../../shared/delete-dialog/delete-dialog.component';
+import { DisableDialogComponent } from '../../../shared/disable-dialog/disable-dialog.component';
+import { EnableDialogComponent } from '../../../shared/enable-dialog/enable-dialog.component';
+
+/**
+ * View Role and Permissions Component
+ */
+@Component({
+ selector: 'mifosx-view-role',
+ templateUrl: './view-role.component.html',
+ styleUrls: ['./view-role.component.scss']
+})
+export class ViewRoleComponent implements OnInit {
+
+ /** Role Permissions Data */
+ rolePermissionService: any;
+ /** Stores the current grouping */
+ currentGrouping: string;
+ /** Stores the previous grouping */
+ previousGrouping = '';
+ /** Stores Grouping Data */
+ groupings: string[] = [];
+ /** Stores the selected role */
+ selectedItem = '';
+ /** Checks if its disabled */
+ isDisabled: Boolean = true;
+ /** Checks if there is any change in data */
+ checkboxesChanged: Boolean = false;
+ /** Stores backup values */
+ bValuesOnly: string[] = [];
+ /** Role ID */
+ roleId: any;
+ /** Creates permission form */
+ formGroup: FormGroup;
+ /** Creates Backup form */
+ backupform: FormGroup;
+ /** Temporarily stores Permission data */
+ tempPermissionUIData: {
+ permissions: { code: string }[]
+ }[];
+ /** Stores permissions */
+ permissions: {
+ permissions: { code: string, id: number }[]
+ };
+
+ /**
+ * Retrieves the roledetails data from `resolve`.
+ * @param {ActivatedRoute} route Activated Route.
+ * @param {SystemService} systemService System Service.
+ * @param {Router} router Router for navigation.
+ * @param {FormBuilder} formBuilder Form Builder.
+ * @param {MatDialog} dialog Shared Dialog Boxes.
+ */
+ constructor(private route: ActivatedRoute,
+ private systemService: SystemService,
+ private router: Router,
+ private formBuilder: FormBuilder,
+ public dialog: MatDialog) {
+ this.route.data.subscribe((data: { roledetails: any }) => {
+ this.rolePermissionService = data.roledetails;
+ });
+ }
+
+ /**
+ * Groups all the data on init
+ */
+ ngOnInit() {
+ this.permissions = {
+ permissions: []
+ };
+ this.createForm();
+ this.groupRules();
+ this.selectedItem = 'special';
+ this.showPermissions('special');
+ this.route.params.subscribe((routeParams: any) => {
+ this.roleId = routeParams.id;
+ });
+ }
+
+ /**
+ * creates the form to display and edit permissions
+ */
+ createForm() {
+ this.formGroup = this.formBuilder.group({
+ roster: this.formBuilder.array(this.rolePermissionService.permissionUsageData.map((elem: any) => this.createMemberGroup(elem)))
+ });
+
+ }
+
+ createMemberGroup(permission: any): FormGroup {
+ return this.formBuilder.group({
+ ...permission,
+ ...{
+ code: [permission.code, Validators.required],
+ selected: [{ value: permission.selected, disabled: true }, Validators.required]
+ }
+ });
+ }
+
+ /**
+ * Groups the permissions based on rules
+ */
+ groupRules() {
+ this.tempPermissionUIData = [{
+ permissions: []
+ }];
+ for (const i in this.rolePermissionService.permissionUsageData) {
+ if (this.rolePermissionService.permissionUsageData[i]) {
+ if (this.rolePermissionService.permissionUsageData[i].grouping !== this.currentGrouping) {
+ this.currentGrouping = this.rolePermissionService.permissionUsageData[i].grouping;
+ this.groupings.push(this.currentGrouping);
+ this.tempPermissionUIData[this.currentGrouping] = { permissions: [] };
+ }
+ const temp = { code: this.rolePermissionService.permissionUsageData[i].code, id: i, selected: this.rolePermissionService.permissionUsageData[i].selected };
+ this.tempPermissionUIData[this.currentGrouping].permissions.push(temp);
+ }
+ }
+ }
+
+ /**
+ * Displays the permission for selected role
+ * @param grouping Selected Role
+ */
+ showPermissions(grouping: string) {
+ this.permissions = this.tempPermissionUIData[grouping];
+ this.selectedItem = grouping;
+ this.previousGrouping = grouping;
+ }
+
+ /**
+ * Formats the Role Name
+ * @param string String
+ */
+ formatName(string: any) {
+ if (string.indexOf('portfolio_') > -1) {
+ string = string.replace('portfolio_', '');
+ }
+ if (string.indexOf('transaction_') > -1) {
+ const temp = string.split('_');
+ string = temp[1] + ' ' + temp[0].charAt(0).toUpperCase() + temp[0].slice(1) + 's';
+ }
+ string = string.charAt(0).toUpperCase() + string.slice(1);
+ return string;
+ }
+
+ /**
+ * Formats the permission from permission code
+ * @param name String
+ */
+ permissionName(name: any) {
+ name = name || '';
+ // replace '_' with ' '
+ name = name.replace(/_/g, ' ');
+ // for reorts replace read with view
+ if (this.previousGrouping === 'report') {
+ name = name.replace(/READ/g, 'View');
+ }
+ return name;
+ }
+
+ /**
+ * Backups the valued
+ */
+ backupCheckValues() {
+ this.backupform = _.cloneDeep(this.formGroup) as FormGroup;
+ }
+
+ /**
+ * Restores the checkboxes to previous data on clicking cancel
+ */
+ restoreCheckboxes() {
+ this.formGroup = _.cloneDeep(this.backupform) as FormGroup;
+ }
+
+ isRoleEnable(value: any) {
+ return value;
+ }
+
+ editRoles() {
+ this.isDisabled = false;
+ this.formGroup.controls.roster.enable();
+ }
+
+ /**
+ * Cancel the changes
+ */
+ cancel() {
+ this.isDisabled = true;
+ this.formGroup.controls.roster.disable();
+ }
+
+ /**
+ * Submits the modified permissions
+ */
+ submit() {
+ const value = this.formGroup.get('roster').value;
+ const data = {};
+ const permissionData = {
+ permissions: {}
+ };
+ for (let i = 0; i < value.length; i++ ) {
+ data[value[i].code] = value[i].selected;
+ }
+ permissionData.permissions = data;
+ this.formGroup.controls.roster.disable();
+ this.checkboxesChanged = false;
+ this.isDisabled = true;
+ this.systemService.updateRolePermission(this.roleId, permissionData).subscribe((response: any) => {
+ console.log('response: ', response);
+ });
+ }
+
+ /**
+ * Selects all the permission of a particular role
+ */
+ selectAll() {
+ for (let i = 0; i < this.permissions.permissions.length; i++) {
+ this.formGroup.controls.roster['controls'][this.permissions.permissions[i].id].patchValue({
+ selected: true
+ });
+ }
+ }
+
+ /**
+ * Deselects all the permissions of a particular role
+ */
+ deselectAll() {
+ for (let i = 0; i < this.permissions.permissions.length; i++) {
+ this.formGroup.controls.roster['controls'][this.permissions.permissions[i].id].patchValue({
+ selected: false
+ });
+ }
+ }
+
+ /**
+ * Deletes the Role and redirects to Roles and Permissions.
+ */
+ deleteRole() {
+ const deleteRoleDialogRef = this.dialog.open(DeleteDialogComponent, {
+ data: { deleteContext: `role ${this.roleId}` }
+ });
+ deleteRoleDialogRef.afterClosed().subscribe((response: any) => {
+ if (response.delete) {
+ this.systemService.deleteRole(this.roleId)
+ .subscribe(() => {
+ this.router.navigate(['/system/roles-and-permissions']);
+ });
+ } else {
+
+ }
+ });
+ }
+
+ /**
+ * Enables the Role and redirects to Roles and Permissions.
+ */
+ enableRolesConfirmation() {
+ const enableRoleDialogRef = this.dialog.open(EnableDialogComponent, {
+ data: { enableContext: `role ${this.roleId}` }
+ });
+ enableRoleDialogRef.afterClosed().subscribe((response: any) => {
+ if (response.enable) {
+ this.systemService.enableRole(this.roleId)
+ .subscribe(() => {
+ this.router.navigate(['/system/roles-and-permissions']);
+ });
+ } else {
+
+ }
+ });
+ }
+
+ /**
+ * Disables the Role and redirects to Roles and Permissions.
+ */
+ disableRolesConfirmation() {
+ const deleteRoleDialogRef = this.dialog.open(DisableDialogComponent, {
+ data: { disableContext: `role ${this.roleId}` }
+ });
+ deleteRoleDialogRef.afterClosed().subscribe((response: any) => {
+ if (response.disable) {
+ this.systemService.disableRole(this.roleId)
+ .subscribe(() => {
+ this.router.navigate(['/system/roles-and-permissions']);
+ });
+ } else {
+
+ }
+ });
+ }
+
+}
diff --git a/src/app/system/roles-and-permissions/view-role/view-role.resolver.ts b/src/app/system/roles-and-permissions/view-role/view-role.resolver.ts
new file mode 100644
index 000000000..412a6a28b
--- /dev/null
+++ b/src/app/system/roles-and-permissions/view-role/view-role.resolver.ts
@@ -0,0 +1,31 @@
+/** Angular Imports */
+import { Injectable } from '@angular/core';
+import { Resolve, ActivatedRouteSnapshot } from '@angular/router';
+
+/** rxjs Imports */
+import { Observable } from 'rxjs';
+
+/** Custom Services */
+import { SystemService } from '../../system.service';
+
+/**
+ * Roles and Permission data resolver.
+ */
+@Injectable()
+export class ViewRoleResolver implements Resolve