From 2f654ef664f145ae412078546b4224270812ae5c Mon Sep 17 00:00:00 2001
From: Benura Abeywardena <43112139+BLasan@users.noreply.github.com>
Date: Mon, 24 Aug 2020 11:39:25 +0530
Subject: [PATCH] feat: add view scheduler job history component (#676)
Fixes: #675
---
src/app/products/products-routing.module.ts | 3 +-
.../error-dialog/error-dialog.component.html | 11 +++
.../error-dialog/error-dialog.component.scss | 0
.../error-dialog.component.spec.ts | 25 +++++
.../error-dialog/error-dialog.component.ts | 19 ++++
src/app/shared/shared.module.ts | 7 +-
.../view-history-scheduler-job.component.html | 56 +++++++++++
.../view-history-scheduler-job.component.scss | 32 +++++++
...ew-history-scheduler-job.component.spec.ts | 25 +++++
.../view-history-scheduler-job.component.ts | 95 +++++++++++++++++++
.../view-history-scheduler-job.resolver.ts | 31 ++++++
src/app/system/system-routing.module.ts | 13 ++-
src/app/system/system.module.ts | 9 +-
src/app/system/system.service.ts | 8 ++
14 files changed, 327 insertions(+), 7 deletions(-)
create mode 100644 src/app/shared/error-dialog/error-dialog.component.html
create mode 100644 src/app/shared/error-dialog/error-dialog.component.scss
create mode 100644 src/app/shared/error-dialog/error-dialog.component.spec.ts
create mode 100644 src/app/shared/error-dialog/error-dialog.component.ts
create mode 100644 src/app/system/manage-scheduler-jobs/view-history-scheduler-job/view-history-scheduler-job.component.html
create mode 100644 src/app/system/manage-scheduler-jobs/view-history-scheduler-job/view-history-scheduler-job.component.scss
create mode 100644 src/app/system/manage-scheduler-jobs/view-history-scheduler-job/view-history-scheduler-job.component.spec.ts
create mode 100644 src/app/system/manage-scheduler-jobs/view-history-scheduler-job/view-history-scheduler-job.component.ts
create mode 100644 src/app/system/manage-scheduler-jobs/view-history-scheduler-job/view-history-scheduler-job.resolver.ts
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
+
+
+
+
+
+
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