From 370fc9b481f5244a2dca46c9edb47efdee6a65ac Mon Sep 17 00:00:00 2001 From: Chirag Gupta Date: Sun, 27 Jan 2019 20:33:47 +0530 Subject: [PATCH] feat: add global-configurations component (#357) * view global configurations * edit global configuration Fixes: #178 --- src/app/shared/icons.module.ts | 2 + .../edit-configuration.component.html | 37 +++++++++ .../edit-configuration.component.scss | 3 + .../edit-configuration.component.spec.ts | 25 ++++++ .../edit-configuration.component.ts | 69 ++++++++++++++++ .../global-configuration.resolver.ts | 31 ++++++++ .../global-configurations.component.html | 65 +++++++++++++++ .../global-configurations.component.scss | 12 +++ .../global-configurations.component.spec.ts | 25 ++++++ .../global-configurations.component.ts | 79 +++++++++++++++++++ .../global-configurations.resolver.ts | 30 +++++++ src/app/system/system-routing.module.ts | 30 ++++++- src/app/system/system.component.html | 2 +- src/app/system/system.module.ts | 6 +- src/app/system/system.service.ts | 24 ++++++ 15 files changed, 437 insertions(+), 3 deletions(-) create mode 100644 src/app/system/global-configurations/edit-configuration/edit-configuration.component.html create mode 100644 src/app/system/global-configurations/edit-configuration/edit-configuration.component.scss create mode 100644 src/app/system/global-configurations/edit-configuration/edit-configuration.component.spec.ts create mode 100644 src/app/system/global-configurations/edit-configuration/edit-configuration.component.ts create mode 100644 src/app/system/global-configurations/global-configuration.resolver.ts create mode 100644 src/app/system/global-configurations/global-configurations.component.html create mode 100644 src/app/system/global-configurations/global-configurations.component.scss create mode 100644 src/app/system/global-configurations/global-configurations.component.spec.ts create mode 100644 src/app/system/global-configurations/global-configurations.component.ts create mode 100644 src/app/system/global-configurations/global-configurations.resolver.ts diff --git a/src/app/shared/icons.module.ts b/src/app/shared/icons.module.ts index 5ef77ddb9..151dcda82 100644 --- a/src/app/shared/icons.module.ts +++ b/src/app/shared/icons.module.ts @@ -47,6 +47,7 @@ import { faPlay, faPlus, faPlusCircle, + faQuestionCircle, faRandom, faRoad, faSearch, @@ -111,6 +112,7 @@ library.add( faPlay, faPlus, faPlusCircle, + faQuestionCircle, faRandom, faRoad, faSearch, diff --git a/src/app/system/global-configurations/edit-configuration/edit-configuration.component.html b/src/app/system/global-configurations/edit-configuration/edit-configuration.component.html new file mode 100644 index 000000000..c896213bf --- /dev/null +++ b/src/app/system/global-configurations/edit-configuration/edit-configuration.component.html @@ -0,0 +1,37 @@ +
+ + + +
+ + + +
+ + + Configuration Name + + + + + Configuration Value + + + Configuration Value is required + + + +
+ +
+ + + + + + +
+ +
+ +
diff --git a/src/app/system/global-configurations/edit-configuration/edit-configuration.component.scss b/src/app/system/global-configurations/edit-configuration/edit-configuration.component.scss new file mode 100644 index 000000000..d774f68da --- /dev/null +++ b/src/app/system/global-configurations/edit-configuration/edit-configuration.component.scss @@ -0,0 +1,3 @@ +.container { + max-width: 37rem; +} diff --git a/src/app/system/global-configurations/edit-configuration/edit-configuration.component.spec.ts b/src/app/system/global-configurations/edit-configuration/edit-configuration.component.spec.ts new file mode 100644 index 000000000..fc7d6a6af --- /dev/null +++ b/src/app/system/global-configurations/edit-configuration/edit-configuration.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { EditConfigurationComponent } from './edit-configuration.component'; + +describe('EditConfigurationComponent', () => { + let component: EditConfigurationComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ EditConfigurationComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(EditConfigurationComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/system/global-configurations/edit-configuration/edit-configuration.component.ts b/src/app/system/global-configurations/edit-configuration/edit-configuration.component.ts new file mode 100644 index 000000000..537aea5f8 --- /dev/null +++ b/src/app/system/global-configurations/edit-configuration/edit-configuration.component.ts @@ -0,0 +1,69 @@ +/** Angular Imports */ +import { Component, OnInit } from '@angular/core'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { ActivatedRoute, Router } from '@angular/router'; + +/** Custom Services */ +import { SystemService } from '../../system.service'; + +/** + * Edit Configuration Component + */ +@Component({ + selector: 'mifosx-edit-configuration', + templateUrl: './edit-configuration.component.html', + styleUrls: ['./edit-configuration.component.scss'] +}) +export class EditConfigurationComponent implements OnInit { + + /** Global Configuration form. */ + configurationForm: FormGroup; + /** Configuration. */ + configuration: any; + + /** + * Retrieves the configuration 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: { configuration: any }) => { + this.configuration = data.configuration; + }); + } + + /** + * Creates and sets the configuration form. + */ + ngOnInit() { + this.createConfigurationForm(); + } + + /** + * Creates and sets the global configuration form. + */ + createConfigurationForm() { + this.configurationForm = this.formBuilder.group({ + 'name': [{ value: this.configuration.name, disabled: true }, Validators.required], + 'value': [this.configuration.value, Validators.required] + }); + } + + /** + * Submits the global configuration form and updates global configuration, + * if successful redirects to view all global configurations. + */ + submit() { + this.systemService + .updateConfiguration(this.configuration.id, this.configurationForm.value) + .subscribe((response: any) => { + this.router.navigate(['../../'], { relativeTo: this.route }); + }); + } + +} diff --git a/src/app/system/global-configurations/global-configuration.resolver.ts b/src/app/system/global-configurations/global-configuration.resolver.ts new file mode 100644 index 000000000..485dc9518 --- /dev/null +++ b/src/app/system/global-configurations/global-configuration.resolver.ts @@ -0,0 +1,31 @@ +/** Angular Imports */ +import { Injectable } from '@angular/core'; +import { ActivatedRouteSnapshot, Resolve } from '@angular/router'; + +/** rxjs Imports */ +import { Observable } from 'rxjs'; + +/** Custom Services */ +import { SystemService } from '../system.service'; + +/** + * Global Configuration data resolver. + */ +@Injectable() +export class GlobalConfigurationResolver implements Resolve { + + /** + * @param {SystemService} systemService System service. + */ + constructor(private systemService: SystemService) {} + + /** + * Returns the Configuration data. + * @returns {Observable} + */ + resolve(route: ActivatedRouteSnapshot): Observable { + const configurationId = route.paramMap.get('id'); + return this.systemService.getConfiguration(configurationId); + } + +} diff --git a/src/app/system/global-configurations/global-configurations.component.html b/src/app/system/global-configurations/global-configurations.component.html new file mode 100644 index 000000000..01e5df737 --- /dev/null +++ b/src/app/system/global-configurations/global-configurations.component.html @@ -0,0 +1,65 @@ +
+ +
+ + Filter + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name {{ configuration.name }}   + + Status +
+ +
+
Value {{ configuration.value }} Action + + + Edit + +
+ + + +
+ +
diff --git a/src/app/system/global-configurations/global-configurations.component.scss b/src/app/system/global-configurations/global-configurations.component.scss new file mode 100644 index 000000000..24044de6d --- /dev/null +++ b/src/app/system/global-configurations/global-configurations.component.scss @@ -0,0 +1,12 @@ +table { + width: 100%; +} + +// TODO: CONFIGURE THESE CLASSES GLOBALLY +.enabled { + color: #32cd32; +} + +.disabled { + color: #f44366; +} diff --git a/src/app/system/global-configurations/global-configurations.component.spec.ts b/src/app/system/global-configurations/global-configurations.component.spec.ts new file mode 100644 index 000000000..43f960069 --- /dev/null +++ b/src/app/system/global-configurations/global-configurations.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { GlobalConfigurationsComponent } from './global-configurations.component'; + +describe('GlobalConfigurationsComponent', () => { + let component: GlobalConfigurationsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ GlobalConfigurationsComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(GlobalConfigurationsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/system/global-configurations/global-configurations.component.ts b/src/app/system/global-configurations/global-configurations.component.ts new file mode 100644 index 000000000..75ca62ce1 --- /dev/null +++ b/src/app/system/global-configurations/global-configurations.component.ts @@ -0,0 +1,79 @@ +/** Angular Imports */ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { MatPaginator, MatSort, MatTableDataSource } from '@angular/material'; +import { ActivatedRoute, Router } from '@angular/router'; + +/** Custom Services */ +import { SystemService } from '../system.service'; + +/** + * Global Configurations Component + */ +@Component({ + selector: 'mifosx-global-configurations', + templateUrl: './global-configurations.component.html', + styleUrls: ['./global-configurations.component.scss'] +}) +export class GlobalConfigurationsComponent implements OnInit { + + /** Configuration data. */ + configurationData: any; + /** Columns to be displayed in configurations table. */ + displayedColumns: string[] = ['name', 'enabled', 'value', 'action', 'edit']; + /** Data source for configurations table. */ + dataSource: MatTableDataSource; + + /** Paginator for configurations table. */ + @ViewChild(MatPaginator) paginator: MatPaginator; + /** Sorter for configurations table. */ + @ViewChild(MatSort) sort: MatSort; + + /** + * Retrieves the configurations data from `resolve`. + * @param {ActivatedRoute} route Activated Route. + * @param {SystemService} systemService System Service. + * @param {Router} router Router for navigation. + */ + constructor(private route: ActivatedRoute, + private systemService: SystemService, + private router: Router) { + this.route.data.subscribe((data: { configurations: any }) => { + this.configurationData = data.configurations.globalConfiguration; + }); + } + + /** + * Sets the configurations table. + */ + ngOnInit() { + this.setConfigurations(); + } + + /** + * Initializes the data source, paginator and sorter for configurations table. + */ + setConfigurations() { + this.dataSource = new MatTableDataSource(this.configurationData); + this.dataSource.paginator = this.paginator; + this.dataSource.sort = this.sort; + } + + /** + * Filters data in configurations table based on passed value. + * @param {string} filterValue Value to filter data. + */ + applyFilter(filterValue: string) { + this.dataSource.filter = filterValue.trim().toLowerCase(); + } + + /** + * Enables/Disables respective configuration + */ + toggleStatus(configuration: any) { + this.systemService.updateConfiguration(configuration.id, { enabled: !configuration.enabled }) + .subscribe((response: any) => { + configuration.enabled = response.changes.enabled; + }); + } + +} diff --git a/src/app/system/global-configurations/global-configurations.resolver.ts b/src/app/system/global-configurations/global-configurations.resolver.ts new file mode 100644 index 000000000..e338456c5 --- /dev/null +++ b/src/app/system/global-configurations/global-configurations.resolver.ts @@ -0,0 +1,30 @@ +/** Angular Imports */ +import { Injectable } from '@angular/core'; +import { Resolve } from '@angular/router'; + +/** rxjs Imports */ +import { Observable } from 'rxjs'; + +/** Custom Services */ +import { SystemService } from '../system.service'; + +/** + * Configurations data resolver. + */ +@Injectable() +export class GlobalConfigurationsResolver implements Resolve { + + /** + * @param {SystemService} systemService System service. + */ + constructor(private systemService: SystemService) {} + + /** + * Returns the configurations data. + * @returns {Observable} + */ + resolve(): Observable { + return this.systemService.getConfigurations(); + } + +} diff --git a/src/app/system/system-routing.module.ts b/src/app/system/system-routing.module.ts index bf9c49680..672b91337 100644 --- a/src/app/system/system-routing.module.ts +++ b/src/app/system/system-routing.module.ts @@ -15,6 +15,8 @@ import { ManageHooksComponent } from './manage-hooks/manage-hooks.component'; import { RolesAndPermissionsComponent } from './roles-and-permissions/roles-and-permissions.component'; import { ManageSurveysComponent } from './manage-surveys/manage-surveys.component'; import { ManageSchedulerJobsComponent } from './manage-scheduler-jobs/manage-scheduler-jobs.component'; +import { GlobalConfigurationsComponent } from './global-configurations/global-configurations.component'; +import { EditConfigurationComponent } from './global-configurations/edit-configuration/edit-configuration.component'; /** Custom Resolvers */ import { CodesResolver } from './codes/codes.resolver'; @@ -23,6 +25,8 @@ import { ManageHooksResolver } from './manage-hooks/manage-hooks.resolver'; import { RolesAndPermissionsResolver } from './roles-and-permissions/roles-and-permissions.resolver'; import { ManageSurveysResolver } from './manage-surveys/manage-surveys.resolver'; import { ManageSchedulerJobsResolver } from './manage-scheduler-jobs/manage-scheduler-jobs.resolver'; +import { GlobalConfigurationsResolver } from './global-configurations/global-configurations.resolver'; +import { GlobalConfigurationResolver } from './global-configurations/global-configuration.resolver'; const routes: Routes = [ Route.withShell([ @@ -98,7 +102,29 @@ const routes: Routes = [ }, data: { title: extract('Manage Scheduler Jobs'), breadcrumb: 'Manage Scheduler Jobs' }, }, - ] + { + path: 'global-configurations', + data: { title: extract('Global Configurations'), breadcrumb: 'Global Configurations' }, + children: [ + { + path: '', + component: GlobalConfigurationsComponent, + resolve: { + configurations: GlobalConfigurationsResolver + } + }, + { + path: ':id/edit', + component: EditConfigurationComponent, + data: { title: extract('Edit Configuration'), breadcrumb: 'Edit' }, + resolve: { + configuration: GlobalConfigurationResolver + } + } + ], + + }, + ] } ]) ]; @@ -113,6 +139,8 @@ const routes: Routes = [ RolesAndPermissionsResolver, ManageSurveysResolver, ManageSchedulerJobsResolver, + GlobalConfigurationsResolver, + GlobalConfigurationResolver ] }) export class SystemRoutingModule { } diff --git a/src/app/system/system.component.html b/src/app/system/system.component.html index 6315b5079..620a2d2a1 100644 --- a/src/app/system/system.component.html +++ b/src/app/system/system.component.html @@ -96,7 +96,7 @@

Schedule a job, modify or delete jobs

- + diff --git a/src/app/system/system.module.ts b/src/app/system/system.module.ts index 025ea3b94..54f3252e0 100644 --- a/src/app/system/system.module.ts +++ b/src/app/system/system.module.ts @@ -15,6 +15,8 @@ import { ManageHooksComponent } from './manage-hooks/manage-hooks.component'; import { RolesAndPermissionsComponent } from './roles-and-permissions/roles-and-permissions.component'; import { ManageSurveysComponent } from './manage-surveys/manage-surveys.component'; import { ManageSchedulerJobsComponent } from './manage-scheduler-jobs/manage-scheduler-jobs.component'; +import { GlobalConfigurationsComponent } from './global-configurations/global-configurations.component'; +import { EditConfigurationComponent } from './global-configurations/edit-configuration/edit-configuration.component'; @NgModule({ imports: [ @@ -30,7 +32,9 @@ import { ManageSchedulerJobsComponent } from './manage-scheduler-jobs/manage-sch ManageHooksComponent, RolesAndPermissionsComponent, ManageSurveysComponent, - ManageSchedulerJobsComponent + ManageSchedulerJobsComponent, + GlobalConfigurationsComponent, + EditConfigurationComponent ] }) export class SystemModule { } diff --git a/src/app/system/system.service.ts b/src/app/system/system.service.ts index 6044c131b..025d1007f 100644 --- a/src/app/system/system.service.ts +++ b/src/app/system/system.service.ts @@ -75,4 +75,28 @@ export class SystemService { return this.http.post('/codes', code); } + /** + * @returns {Observable} Configurations data. + */ + getConfigurations(): Observable { + return this.http.get('/configurations'); + } + + /** + * @param {string} configurationId Configuration ID of configuration. + * @returns {Observable} Configuration. + */ + getConfiguration(configurationId: string): Observable { + return this.http.get(`/configurations/${configurationId}`); + } + + /** + * @param {string} configurationId Configuration ID of configuration to be updated. + * @param {any} configuration Configuration to be updated. + * @returns {Observable} + */ + updateConfiguration(configurationId: string, configuration: any): Observable { + return this.http.put(`/configurations/${configurationId}`, configuration); + } + }