diff --git a/src/app/products/products-routing.module.ts b/src/app/products/products-routing.module.ts index 7789a66fa..477268717 100644 --- a/src/app/products/products-routing.module.ts +++ b/src/app/products/products-routing.module.ts @@ -616,7 +616,8 @@ const routes: Routes = [ ManageTaxGroupTemplateResolver, EditTaxGroupResolver, ProductsMixTemplateResolver, - FixedDepositProductAndTemplateResolver + FixedDepositProductAndTemplateResolver, + FloatingRatesResolver ] }) export class ProductsRoutingModule { } diff --git a/src/app/shared/error-dialog/error-dialog.component.html b/src/app/shared/error-dialog/error-dialog.component.html new file mode 100644 index 000000000..b2dd0944d --- /dev/null +++ b/src/app/shared/error-dialog/error-dialog.component.html @@ -0,0 +1,11 @@ +

Error Log

+ +
+ +

{{ data }}

+ +
+ + + + diff --git a/src/app/shared/error-dialog/error-dialog.component.scss b/src/app/shared/error-dialog/error-dialog.component.scss new file mode 100644 index 000000000..e69de29bb diff --git a/src/app/shared/error-dialog/error-dialog.component.spec.ts b/src/app/shared/error-dialog/error-dialog.component.spec.ts new file mode 100644 index 000000000..9f3434803 --- /dev/null +++ b/src/app/shared/error-dialog/error-dialog.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ErrorDialogComponent } from './error-dialog.component'; + +describe('ErrorDialogComponent', () => { + let component: ErrorDialogComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ErrorDialogComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ErrorDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/shared/error-dialog/error-dialog.component.ts b/src/app/shared/error-dialog/error-dialog.component.ts new file mode 100644 index 000000000..3502ff0e9 --- /dev/null +++ b/src/app/shared/error-dialog/error-dialog.component.ts @@ -0,0 +1,19 @@ +/** Angular Imports. */ +import { Component, OnInit, Inject } from '@angular/core'; +import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; + +@Component({ + selector: 'mifosx-error-dialog', + templateUrl: './error-dialog.component.html', + styleUrls: ['./error-dialog.component.scss'] +}) +export class ErrorDialogComponent { + + /** + * @param {MatDialogRef} dialogRef Component reference to dialog. + * @param {any} data Provides any data. + */ + constructor(public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) public data: any) { } + +} diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts index 793933111..18d9ed304 100644 --- a/src/app/shared/shared.module.ts +++ b/src/app/shared/shared.module.ts @@ -21,6 +21,7 @@ import { KeyboardShortcutsDialogComponent } from './keyboard-shortcuts-dialog/ke /** Custom Modules */ import { IconsModule } from './icons.module'; import { MaterialModule } from './material.module'; +import { ErrorDialogComponent } from './error-dialog/error-dialog.component'; /** * Shared Module @@ -47,7 +48,8 @@ import { MaterialModule } from './material.module'; EnableDialogComponent, DisableDialogComponent, ConfirmationDialogComponent, - KeyboardShortcutsDialogComponent + KeyboardShortcutsDialogComponent, + ErrorDialogComponent ], exports: [ FileUploadComponent, @@ -58,7 +60,8 @@ import { MaterialModule } from './material.module'; IconsModule, MaterialModule, FormsModule, - ReactiveFormsModule + ReactiveFormsModule, + ErrorDialogComponent ] }) export class SharedModule { } diff --git a/src/app/system/manage-scheduler-jobs/view-history-scheduler-job/view-history-scheduler-job.component.html b/src/app/system/manage-scheduler-jobs/view-history-scheduler-job/view-history-scheduler-job.component.html new file mode 100644 index 000000000..85574ef56 --- /dev/null +++ b/src/app/system/manage-scheduler-jobs/view-history-scheduler-job/view-history-scheduler-job.component.html @@ -0,0 +1,56 @@ +
+ +
+ + + Filter By Version + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Version {{ jobHistoryData.version }} Run Start Time {{ jobHistoryData.jobRunStartTime }} Status + + + Run Type {{ jobHistoryData.triggerType }} Error Log + +
+ + + +
+ +
diff --git a/src/app/system/manage-scheduler-jobs/view-history-scheduler-job/view-history-scheduler-job.component.scss b/src/app/system/manage-scheduler-jobs/view-history-scheduler-job/view-history-scheduler-job.component.scss new file mode 100644 index 000000000..153047653 --- /dev/null +++ b/src/app/system/manage-scheduler-jobs/view-history-scheduler-job/view-history-scheduler-job.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/view-history-scheduler-job/view-history-scheduler-job.component.spec.ts b/src/app/system/manage-scheduler-jobs/view-history-scheduler-job/view-history-scheduler-job.component.spec.ts new file mode 100644 index 000000000..cedaf24f0 --- /dev/null +++ b/src/app/system/manage-scheduler-jobs/view-history-scheduler-job/view-history-scheduler-job.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ViewHistorySchedulerJobComponent } from './view-history-scheduler-job.component'; + +describe('ViewHistorySchedulerJobComponent', () => { + let component: ViewHistorySchedulerJobComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ViewHistorySchedulerJobComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ViewHistorySchedulerJobComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/system/manage-scheduler-jobs/view-history-scheduler-job/view-history-scheduler-job.component.ts b/src/app/system/manage-scheduler-jobs/view-history-scheduler-job/view-history-scheduler-job.component.ts new file mode 100644 index 000000000..9738773fd --- /dev/null +++ b/src/app/system/manage-scheduler-jobs/view-history-scheduler-job/view-history-scheduler-job.component.ts @@ -0,0 +1,95 @@ +/** Angular Imports. */ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { MatPaginator } from '@angular/material/paginator'; +import { MatTableDataSource } from '@angular/material/table'; +import { MatSort } from '@angular/material/sort'; +import { MatDialog } from '@angular/material/dialog'; +import { ErrorDialogComponent } from 'app/shared/error-dialog/error-dialog.component'; +import { ActivatedRoute, Router } from '@angular/router'; + +@Component({ + selector: 'mifosx-view-history-scheduler-job', + templateUrl: './view-history-scheduler-job.component.html', + styleUrls: ['./view-history-scheduler-job.component.scss'] +}) +export class ViewHistorySchedulerJobComponent implements OnInit { + + /** Job History data. */ + jobHistoryData: any; + /** Columns to be displayed in Scheduler Job History. */ + displayedColumns: string[] = ['version', 'run_start_time', 'status', 'run_type', 'error_log']; + /** Data source for Scheduler Job History table. */ + dataSource: MatTableDataSource; + + /** Paginator for Scheduler Job History table. */ + @ViewChild(MatPaginator, { static: true }) paginator: MatPaginator; + /** Sorter for Scheduler Job History table. */ + @ViewChild(MatSort, { static: true }) sort: MatSort; + + /** + * Retrieves the scheduler Job History data from `resolve`. + * @param {ActivatedRoute} route Activated Route. + */ + constructor(private route: ActivatedRoute, + private dialog: MatDialog, + private router: Router ) { + this.route.data.subscribe(( data: { jobsSchedulerHistory: any }) => { + this.jobHistoryData = data.jobsSchedulerHistory; + console.log(this.jobHistoryData); + }); + } + + /** + * Filters data in scheduler Job History table based on passed value. + * @param {string} filterValue Value to filter data. + */ + applyFilter(filterValue: string) { + const filterObject = [{ + id: 'version', + value: filterValue + }]; + this.dataSource.filter = JSON.stringify(filterObject); + } + + ngOnInit() { + this.setJobHistory(); + } + + /** + * Initializes the data source, paginator and sorter for scheduler Job History table. + */ + setJobHistory() { + this.dataSource = new MatTableDataSource(this.jobHistoryData.pageItems); + this.dataSource.paginator = this.paginator; + /** Search By Version */ + this.dataSource.filterPredicate = + (data: any, filtersJson: string) => { + const matchFilter: any[] = []; + const filters = JSON.parse(filtersJson); + filters.forEach((filter: any) => { + const val = data[filter.id] === null ? '' : data[filter.id]; + if (filter.value !== '') { + matchFilter.push(val === parseInt(filter.value, 10)); + } else if (filter.value === '') { + matchFilter.push(val.toString().toLowerCase().includes(filter.value.toLowerCase())); + } + }); + return matchFilter.every(Boolean); + }; + } + + /** + * Open Error Dialog. + * @param version version Id. + */ + openError(version: any) { + const openErrorLogDialog = this.dialog.open(ErrorDialogComponent, { + width: '400px', + data: this.jobHistoryData.pageItems.filter( (data: any) => data.version === version )[0].jobRunErrorLog + }); + openErrorLogDialog.afterClosed().subscribe((response: any) => { + this.router.navigate(['']); + }); + } + +} diff --git a/src/app/system/manage-scheduler-jobs/view-history-scheduler-job/view-history-scheduler-job.resolver.ts b/src/app/system/manage-scheduler-jobs/view-history-scheduler-job/view-history-scheduler-job.resolver.ts new file mode 100644 index 000000000..e9be23685 --- /dev/null +++ b/src/app/system/manage-scheduler-jobs/view-history-scheduler-job/view-history-scheduler-job.resolver.ts @@ -0,0 +1,31 @@ +/** Angular Imports */ +import { Injectable } from '@angular/core'; +import { Resolve, ActivatedRouteSnapshot } from '@angular/router'; + +/** rxjs Imports */ +import { Observable, forkJoin } from 'rxjs'; + +/** Custom Services */ +import { SystemService } from '../../system.service'; + +/** + * View History Scheduler Jobs data resolver. + */ +@Injectable() +export class ViewHistorySchedulerJobsResolver implements Resolve { + + /** + * @param {SystemService} systemService System service. + */ + constructor(private systemService: SystemService) {} + + /** + * Returns the Scheduler Jobs History data. + * @returns {Observable} + */ + resolve(route: ActivatedRouteSnapshot): Observable { + const jobId = route.paramMap.get('id'); + return this.systemService.getHistoryScheduler(jobId); + } + +} diff --git a/src/app/system/system-routing.module.ts b/src/app/system/system-routing.module.ts index 78de223d5..7c06f55d9 100644 --- a/src/app/system/system-routing.module.ts +++ b/src/app/system/system-routing.module.ts @@ -83,6 +83,8 @@ import { ViewRoleResolver } from './roles-and-permissions/view-role/view-role.re import { EntityToEntityMappingResolver } from './entity-to-entity-mapping/entity-to-entity-mapping.resolver'; import { ConfigureMakerCheckerTasksComponent } from './configure-maker-checker-tasks/configure-maker-checker-tasks.component'; import { MakerCheckerTasksResolver } from './configure-maker-checker-tasks/configure-maker-checker-tasks.resolver'; +import { ViewHistorySchedulerJobComponent } from './manage-scheduler-jobs/view-history-scheduler-job/view-history-scheduler-job.component'; +import { ViewHistorySchedulerJobsResolver } from './manage-scheduler-jobs/view-history-scheduler-job/view-history-scheduler-job.resolver'; const routes: Routes = [ Route.withShell([ @@ -418,6 +420,14 @@ const routes: Routes = [ resolve: { jobSelected: ManageSchedulerJobResolver } + }, + { + path: 'viewhistory', + component: ViewHistorySchedulerJobComponent, + data: { title: extract('Scheduler Job History'), breadcrumb: 'View History' }, + resolve: { + jobsSchedulerHistory: ViewHistorySchedulerJobsResolver + }, } ] } @@ -589,7 +599,8 @@ const routes: Routes = [ ManageSchedulerJobResolver, ViewRoleResolver, EntityToEntityMappingResolver, - MakerCheckerTasksResolver + MakerCheckerTasksResolver, + ViewHistorySchedulerJobsResolver ] }) export class SystemRoutingModule { } diff --git a/src/app/system/system.module.ts b/src/app/system/system.module.ts index 9fcadb51e..7d7013d11 100644 --- a/src/app/system/system.module.ts +++ b/src/app/system/system.module.ts @@ -44,10 +44,11 @@ import { CreateReportComponent } from './manage-reports/create-report/create-rep import { EditReportComponent } from './manage-reports/edit-report/edit-report.component'; import { AuditTrailsComponent } from './audit-trails/audit-trails.component'; import { ViewAuditComponent } from './audit-trails/view-audit/view-audit.component'; +import { ColumnDialogComponent } from './manage-data-tables/column-dialog/column-dialog.component'; +import { ViewHistorySchedulerJobComponent } from './manage-scheduler-jobs/view-history-scheduler-job/view-history-scheduler-job.component'; import { EditHookComponent } from './manage-hooks/edit-hook/edit-hook.component'; import { ViewHookComponent } from './manage-hooks/view-hook/view-hook.component'; import { CreateHookComponent } from './manage-hooks/create-hook/create-hook.component'; -import { ColumnDialogComponent } from './manage-data-tables/column-dialog/column-dialog.component'; import { ViewRoleComponent } from './roles-and-permissions/view-role/view-role.component'; import { EditRoleComponent } from './roles-and-permissions/edit-role/edit-role.component'; import { EntityToEntityMappingComponent } from './entity-to-entity-mapping/entity-to-entity-mapping.component'; @@ -114,7 +115,9 @@ import { ConfigureMakerCheckerTasksComponent } from './configure-maker-checker-t EditRoleComponent, EntityToEntityMappingComponent, ConfigureMakerCheckerTasksComponent, - CreateSurveyComponent - ] + CreateSurveyComponent, + EditSchedulerJobComponent, + ViewHistorySchedulerJobComponent + ], }) export class SystemModule { } diff --git a/src/app/system/system.service.ts b/src/app/system/system.service.ts index 8dfc447d8..19e02c4b9 100644 --- a/src/app/system/system.service.ts +++ b/src/app/system/system.service.ts @@ -252,6 +252,14 @@ export class SystemService { return this.http.put(`/jobs/${jobId}`, job); } + /* + * @param jobId Job Id to view the history. + * @returns {Observable} Fetches History of the Job. + */ + getHistoryScheduler(jobId: string): Observable { + return this.http.get(`/jobs/${jobId}/runhistory`); + } + /** * @param {any} code Code to be created. * @returns {Observable}