diff --git a/src/app/shared/icons.module.ts b/src/app/shared/icons.module.ts index 622d99fa4..5ef77ddb9 100644 --- a/src/app/shared/icons.module.ts +++ b/src/app/shared/icons.module.ts @@ -25,6 +25,7 @@ import { faCommentAlt, faEdit, faEnvelope, + faExclamationCircle, faEye, faEyeSlash, faFileAlt, @@ -88,6 +89,7 @@ library.add( faCommentAlt, faEdit, faEnvelope, + faExclamationCircle, faEye, faEyeSlash, faFileAlt, diff --git a/src/app/system/manage-scheduler-jobs/manage-scheduler-jobs.component.html b/src/app/system/manage-scheduler-jobs/manage-scheduler-jobs.component.html new file mode 100644 index 000000000..097527996 --- /dev/null +++ b/src/app/system/manage-scheduler-jobs/manage-scheduler-jobs.component.html @@ -0,0 +1,98 @@ +
+

Scheduler Status: {{ schedulerData.active === true ? 'Active' : 'Inactive' }}

+ +
+ +
+ +
+ + Filter + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + Name {{ job.displayName }} Next Run {{ job.nextRunTime }} Previous Run {{ job.lastRunHistory.jobRunStartTime }} Previous Run Status + + + Currently Running +
+ +
+
Error Log + +
+ + + +
+ +
+ +
+ + +
diff --git a/src/app/system/manage-scheduler-jobs/manage-scheduler-jobs.component.scss b/src/app/system/manage-scheduler-jobs/manage-scheduler-jobs.component.scss new file mode 100644 index 000000000..16dc1fb8c --- /dev/null +++ b/src/app/system/manage-scheduler-jobs/manage-scheduler-jobs.component.scss @@ -0,0 +1,32 @@ +table { + width: 100%; + + .select-row:hover { + cursor: pointer; + } +} + +.success { + color: #32cd32; +} + +.fail { + color: #f44366; +} + +.currently-running { + color: #32cd32; +} + +.not-currently-running { + color: #f44366; +} + +.errorlog { + color: #ffa726; +} + +.suspend { + background: #ffa726; + color: #ffffff; +} diff --git a/src/app/system/manage-scheduler-jobs/manage-scheduler-jobs.component.spec.ts b/src/app/system/manage-scheduler-jobs/manage-scheduler-jobs.component.spec.ts new file mode 100644 index 000000000..c545f33b6 --- /dev/null +++ b/src/app/system/manage-scheduler-jobs/manage-scheduler-jobs.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ManageSchedulerJobsComponent } from './manage-scheduler-jobs.component'; + +describe('ManageSchedulerJobsComponent', () => { + let component: ManageSchedulerJobsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ManageSchedulerJobsComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ManageSchedulerJobsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/system/manage-scheduler-jobs/manage-scheduler-jobs.component.ts b/src/app/system/manage-scheduler-jobs/manage-scheduler-jobs.component.ts new file mode 100644 index 000000000..9afd7a13e --- /dev/null +++ b/src/app/system/manage-scheduler-jobs/manage-scheduler-jobs.component.ts @@ -0,0 +1,98 @@ +/** Angular Imports */ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { MatTableDataSource, MatPaginator, MatSort } from '@angular/material'; +import { ActivatedRoute } from '@angular/router'; +import { SelectionModel } from '@angular/cdk/collections'; + +/** rxjs Imports */ +import { of } from 'rxjs'; + +/** + * Manage scheduler jobs component. + */ +@Component({ + selector: 'mifosx-manage-scheduler-jobs', + templateUrl: './manage-scheduler-jobs.component.html', + styleUrls: ['./manage-scheduler-jobs.component.scss'] +}) +export class ManageSchedulerJobsComponent implements OnInit { + + /** Jobs data. */ + jobData: any; + /** Scheduler data */ + schedulerData: any; + /** Columns to be displayed in manage scheduler jobs table. */ + displayedColumns: string[] = ['select', 'displayName', 'nextRunTime', 'previousRunTime', 'previousRunStatus', 'currentlyRunning', 'errorLog']; + /** Data source for manage scheduler jobs table. */ + dataSource: MatTableDataSource; + /** Initialize Selection */ + selection = new SelectionModel(true, []); + + /** Paginator for table. */ + @ViewChild(MatPaginator) paginator: MatPaginator; + /** Sorter for manage scheduler jobs table. */ + @ViewChild(MatSort) sort: MatSort; + + /** + * Retrieves the scheduler jobs data from `resolve`. + * @param {ActivatedRoute} route Activated Route. + */ + constructor(private route: ActivatedRoute) { + this.route.data.subscribe((data: { jobsScheduler: any }) => { + this.jobData = data.jobsScheduler[0]; + this.schedulerData = data.jobsScheduler[1]; + }); + } + + /** + * Filters data in manage scheduler jobs table based on passed value. + * @param {string} filterValue Value to filter data. + */ + applyFilter(filterValue: string) { + this.dataSource.filter = filterValue.trim().toLowerCase(); + } + + /** + * Whether the number of selected elements matches the total number of rows. + */ + isAllSelected() { + const numSelected = this.selection.selected.length; + const numRows = this.dataSource.data.length; + return numSelected === numRows; + } + + /** + * Selects all rows if they are not all selected; otherwise clear selection. + */ + masterToggle() { + this.isAllSelected() ? + this.selection.clear() : + this.dataSource.data.forEach(row => this.selection.select(row)); + } + + /** + * Sets the manage scheduler jobs table. + */ + ngOnInit() { + this.setJobs(); + this.dataSource.sortingDataAccessor = (item, property) => { + switch (property) { + case 'previousRunStatus': return item.lastRunHistory.status; + case 'errorLog': return item.lastRunHistory.status; + case 'previousRunTime': return new Date(item.lastRunHistory.jobRunStartTime); + case 'nextRunTime': return new Date(item.nextRunTime); + default: return item[property]; + } + }; + } + + /** + * Initializes the data source, paginator and sorter for manage scheduler jobs table. + */ + setJobs() { + this.dataSource = new MatTableDataSource(this.jobData); + this.dataSource.paginator = this.paginator; + this.dataSource.sort = this.sort; + } + +} diff --git a/src/app/system/manage-scheduler-jobs/manage-scheduler-jobs.resolver.ts b/src/app/system/manage-scheduler-jobs/manage-scheduler-jobs.resolver.ts new file mode 100644 index 000000000..b1bb7513f --- /dev/null +++ b/src/app/system/manage-scheduler-jobs/manage-scheduler-jobs.resolver.ts @@ -0,0 +1,33 @@ +/** Angular Imports */ +import { Injectable } from '@angular/core'; +import { Resolve } from '@angular/router'; + +/** rxjs Imports */ +import { Observable, forkJoin } from 'rxjs'; + +/** Custom Services */ +import { SystemService } from '../system.service'; + +/** + * Manage Scheduler Jobs data resolver. + */ +@Injectable() +export class ManageSchedulerJobsResolver implements Resolve { + + /** + * @param {SystemService} systemService System service. + */ + constructor(private systemService: SystemService) {} + + /** + * Returns the manage scheduler jobs data. + * @returns {Observable} + */ + resolve() { + return forkJoin( + this.systemService.getJobs(), + this.systemService.getScheduler() + ); + } + +} diff --git a/src/app/system/system-routing.module.ts b/src/app/system/system-routing.module.ts index a24568aec..bf9c49680 100644 --- a/src/app/system/system-routing.module.ts +++ b/src/app/system/system-routing.module.ts @@ -14,6 +14,7 @@ import { ManageDataTablesComponent } from './manage-data-tables/manage-data-tabl 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'; /** Custom Resolvers */ import { CodesResolver } from './codes/codes.resolver'; @@ -21,6 +22,7 @@ import { ManageDataTablesResolver } from './manage-data-tables/manage-data-table 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'; const routes: Routes = [ Route.withShell([ @@ -87,7 +89,15 @@ const routes: Routes = [ surveys: ManageSurveysResolver }, data: { title: extract('Manage Surveys'), breadcrumb: 'Manage Surveys' }, - } + }, + { + path: 'scheduler-jobs', + component: ManageSchedulerJobsComponent, + resolve: { + jobsScheduler: ManageSchedulerJobsResolver + }, + data: { title: extract('Manage Scheduler Jobs'), breadcrumb: 'Manage Scheduler Jobs' }, + }, ] } ]) @@ -101,7 +111,8 @@ const routes: Routes = [ ManageDataTablesResolver, ManageHooksResolver, RolesAndPermissionsResolver, - ManageSurveysResolver + ManageSurveysResolver, + ManageSchedulerJobsResolver, ] }) export class SystemRoutingModule { } diff --git a/src/app/system/system.component.html b/src/app/system/system.component.html index 47b88041f..6315b5079 100644 --- a/src/app/system/system.component.html +++ b/src/app/system/system.component.html @@ -88,7 +88,7 @@

Add new report and classify reports

- + diff --git a/src/app/system/system.module.ts b/src/app/system/system.module.ts index bbc1f954f..025ea3b94 100644 --- a/src/app/system/system.module.ts +++ b/src/app/system/system.module.ts @@ -14,6 +14,7 @@ import { ManageDataTablesComponent } from './manage-data-tables/manage-data-tabl 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'; @NgModule({ imports: [ @@ -28,7 +29,8 @@ import { ManageSurveysComponent } from './manage-surveys/manage-surveys.componen ManageDataTablesComponent, ManageHooksComponent, RolesAndPermissionsComponent, - ManageSurveysComponent + ManageSurveysComponent, + ManageSchedulerJobsComponent ] }) export class SystemModule { } diff --git a/src/app/system/system.service.ts b/src/app/system/system.service.ts index e085f62a5..6044c131b 100644 --- a/src/app/system/system.service.ts +++ b/src/app/system/system.service.ts @@ -53,6 +53,20 @@ export class SystemService { return this.http.get('/surveys'); } + /** + * @returns {Observable} Fetches Jobs. + */ + getJobs(): Observable { + return this.http.get('/jobs'); + } + + /** + * @returns {Observable} Fetches Scheduler. + */ + getScheduler(): Observable { + return this.http.get('/scheduler'); + } + /** * @param {any} code Code to be created. * @returns {Observable}