From b50ac452f569e64cfcb1a46dd0e476872b964005 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Alberto=20Hern=C3=A1ndez?= <44206706+josehernandezfintecheandomx@users.noreply.github.com> Date: Sat, 26 Aug 2023 13:28:56 -0600 Subject: [PATCH] Input to run Jobs with Parameters (#1850) Co-authored-by: Jose Alberto Hernandez --- .../custom-parameters-popover.component.html | 31 +++++++ .../custom-parameters-popover.component.scss | 9 ++ ...ustom-parameters-popover.component.spec.ts | 25 +++++ .../custom-parameters-popover.component.ts | 93 +++++++++++++++++++ .../custom-parameters-table.component.html | 41 ++++++++ .../custom-parameters-table.component.scss | 13 +++ .../custom-parameters-table.component.spec.ts | 25 +++++ .../custom-parameters-table.component.ts | 68 ++++++++++++++ .../manage-scheduler-jobs.component.html | 4 + .../manage-scheduler-jobs.component.ts | 13 +++ src/app/system/system.module.ts | 6 +- src/app/system/system.service.ts | 9 ++ 12 files changed, 336 insertions(+), 1 deletion(-) create mode 100644 src/app/system/manage-jobs/scheduler-jobs/custom-parameters-popover/custom-parameters-popover.component.html create mode 100644 src/app/system/manage-jobs/scheduler-jobs/custom-parameters-popover/custom-parameters-popover.component.scss create mode 100644 src/app/system/manage-jobs/scheduler-jobs/custom-parameters-popover/custom-parameters-popover.component.spec.ts create mode 100644 src/app/system/manage-jobs/scheduler-jobs/custom-parameters-popover/custom-parameters-popover.component.ts create mode 100644 src/app/system/manage-jobs/scheduler-jobs/custom-parameters-popover/custom-parameters-table/custom-parameters-table.component.html create mode 100644 src/app/system/manage-jobs/scheduler-jobs/custom-parameters-popover/custom-parameters-table/custom-parameters-table.component.scss create mode 100644 src/app/system/manage-jobs/scheduler-jobs/custom-parameters-popover/custom-parameters-table/custom-parameters-table.component.spec.ts create mode 100644 src/app/system/manage-jobs/scheduler-jobs/custom-parameters-popover/custom-parameters-table/custom-parameters-table.component.ts diff --git a/src/app/system/manage-jobs/scheduler-jobs/custom-parameters-popover/custom-parameters-popover.component.html b/src/app/system/manage-jobs/scheduler-jobs/custom-parameters-popover/custom-parameters-popover.component.html new file mode 100644 index 000000000..5ab6c16a1 --- /dev/null +++ b/src/app/system/manage-jobs/scheduler-jobs/custom-parameters-popover/custom-parameters-popover.component.html @@ -0,0 +1,31 @@ +

Edit Job Custom Parameters

+ + +
+
+ + +
+
+
+ + + + {{message.message}} + + + + + + + diff --git a/src/app/system/manage-jobs/scheduler-jobs/custom-parameters-popover/custom-parameters-popover.component.scss b/src/app/system/manage-jobs/scheduler-jobs/custom-parameters-popover/custom-parameters-popover.component.scss new file mode 100644 index 000000000..2f3a5bf2e --- /dev/null +++ b/src/app/system/manage-jobs/scheduler-jobs/custom-parameters-popover/custom-parameters-popover.component.scss @@ -0,0 +1,9 @@ +.message { + height: auto; + font-weight: 500; + color: #f44366; +} + +.message.green { + color: #32cd32; +} diff --git a/src/app/system/manage-jobs/scheduler-jobs/custom-parameters-popover/custom-parameters-popover.component.spec.ts b/src/app/system/manage-jobs/scheduler-jobs/custom-parameters-popover/custom-parameters-popover.component.spec.ts new file mode 100644 index 000000000..0267847af --- /dev/null +++ b/src/app/system/manage-jobs/scheduler-jobs/custom-parameters-popover/custom-parameters-popover.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { CustomParametersPopoverComponent } from './custom-parameters-popover.component'; + +describe('CustomParametersPopoverComponent', () => { + let component: CustomParametersPopoverComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ CustomParametersPopoverComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(CustomParametersPopoverComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/system/manage-jobs/scheduler-jobs/custom-parameters-popover/custom-parameters-popover.component.ts b/src/app/system/manage-jobs/scheduler-jobs/custom-parameters-popover/custom-parameters-popover.component.ts new file mode 100644 index 000000000..1dcd424d4 --- /dev/null +++ b/src/app/system/manage-jobs/scheduler-jobs/custom-parameters-popover/custom-parameters-popover.component.ts @@ -0,0 +1,93 @@ +import { SelectionModel } from '@angular/cdk/collections'; +import { Component, Inject, OnInit, QueryList, ViewChildren } from '@angular/core'; +import { MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { CustomParametersTableComponent } from './custom-parameters-table/custom-parameters-table.component'; +import { SystemService } from 'app/system/system.service'; + +interface SelectedJobsDataType { + selectedJobs: SelectionModel; + parameterValue: string; +} + +export interface JobIdAndParameterType { + jobId: string; + displayName: string; + jobParameters: JobParameterType[]; +} + +export interface RunJobWithParamPayloadType { + jobParameters: JobParameterType[]; +} + +export interface JobParameterType { + jobParameterName: string; + jobParameterValue: string; +} + +interface JobDataType { + active: boolean; + cronExpression: string; + currentlyRunning: boolean; + displayName: string; + jobId: number; + lastRunHistory: { + jobRunEndTime: string; + jobRunStartTime: string; + status: string; + triggerType: string; + version: number; + }; + nextRunTime: string; + jobParameters: JobParameterType[]; +} + +@Component({ + selector: 'mifosx-custom-parameters-popover', + templateUrl: './custom-parameters-popover.component.html', + styleUrls: ['./custom-parameters-popover.component.scss'] +}) +export class CustomParametersPopoverComponent implements OnInit { + + /* Job table childer */ + @ViewChildren(CustomParametersTableComponent) tableComponents: QueryList; + + /* Initialize Selected Jobs */ + selectedJobs: JobDataType[] = []; + /* Show modal or not */ + show: number; + /* API call response message */ + messages: { message: string; status: number }[] = []; + + constructor(private systemService: SystemService, @Inject(MAT_DIALOG_DATA) public data: SelectedJobsDataType) { } + + ngOnInit(): void { + this.selectedJobs = this.data.selectedJobs.selected.map((jobJSON) => ({ + ...jobJSON, + jobParameters: [] + })); + } + + /** + * Run all selected jobs with job parameters from table + */ + runSelectedJobs(): void { + this.messages = []; + const tableData: JobIdAndParameterType[] = []; + this.tableComponents.forEach((tableComponent) => { + tableData.push(tableComponent.getTableData()); + }); + + tableData.forEach((job) => { + this.systemService.runSelectedJobWithParameters(job.jobId, + { jobParameters: job.jobParameters } + ) + .then((response) => { + this.messages.push({ + message: `${job.displayName}: ${response.statusText} (${response.status})`, + status: response.ok + }); + }); + }); + } + +} diff --git a/src/app/system/manage-jobs/scheduler-jobs/custom-parameters-popover/custom-parameters-table/custom-parameters-table.component.html b/src/app/system/manage-jobs/scheduler-jobs/custom-parameters-popover/custom-parameters-table/custom-parameters-table.component.html new file mode 100644 index 000000000..57163ebec --- /dev/null +++ b/src/app/system/manage-jobs/scheduler-jobs/custom-parameters-popover/custom-parameters-table/custom-parameters-table.component.html @@ -0,0 +1,41 @@ +
+

Job: {{ displayName }}

+ + + + + + + + + + + + + + + + + + +
Parameter Name + + + + Parameter Value + + + + + +
+ + +
diff --git a/src/app/system/manage-jobs/scheduler-jobs/custom-parameters-popover/custom-parameters-table/custom-parameters-table.component.scss b/src/app/system/manage-jobs/scheduler-jobs/custom-parameters-popover/custom-parameters-table/custom-parameters-table.component.scss new file mode 100644 index 000000000..ab12b3e5f --- /dev/null +++ b/src/app/system/manage-jobs/scheduler-jobs/custom-parameters-popover/custom-parameters-table/custom-parameters-table.component.scss @@ -0,0 +1,13 @@ +table td { + padding-right: 50px; +} + +.jobs-container { + display: flex; + flex-direction: column; + gap: 10px; +} + +.jobs-container table td { + padding-right: 50px; +} diff --git a/src/app/system/manage-jobs/scheduler-jobs/custom-parameters-popover/custom-parameters-table/custom-parameters-table.component.spec.ts b/src/app/system/manage-jobs/scheduler-jobs/custom-parameters-popover/custom-parameters-table/custom-parameters-table.component.spec.ts new file mode 100644 index 000000000..9df2d83d9 --- /dev/null +++ b/src/app/system/manage-jobs/scheduler-jobs/custom-parameters-popover/custom-parameters-table/custom-parameters-table.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { CustomParametersTableComponent } from './custom-parameters-table.component'; + +describe('CustomParametersTableComponent', () => { + let component: CustomParametersTableComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ CustomParametersTableComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(CustomParametersTableComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/system/manage-jobs/scheduler-jobs/custom-parameters-popover/custom-parameters-table/custom-parameters-table.component.ts b/src/app/system/manage-jobs/scheduler-jobs/custom-parameters-popover/custom-parameters-table/custom-parameters-table.component.ts new file mode 100644 index 000000000..8afe2cdf7 --- /dev/null +++ b/src/app/system/manage-jobs/scheduler-jobs/custom-parameters-popover/custom-parameters-table/custom-parameters-table.component.ts @@ -0,0 +1,68 @@ +import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; +import { JobIdAndParameterType, JobParameterType } from '../custom-parameters-popover.component'; + +@Component({ + selector: 'mifosx-custom-parameters-table', + templateUrl: './custom-parameters-table.component.html', + styleUrls: ['./custom-parameters-table.component.scss'] +}) +export class CustomParametersTableComponent implements OnInit { + + /* Job name for table title */ + @Input() displayName: string; + /* Job id for table */ + @Input() jobId: string; + /* Array of custom job parameters */ + @Input() jobParameters: JobParameterType[]; + /* Listener to return jobs */ + @Output() retrieveJob: EventEmitter = new EventEmitter(); + + /* Job parameters copy updated by user input */ + updatedJobParameters: JobParameterType[]; + /* Columns for the table */ + columnsToDisplay: string[] = ['parameterName', 'parameterValue', 'actions']; + + constructor() { } + + ngOnInit(): void { + this.updatedJobParameters = this.jobParameters; + this.updatedJobParameters.push({ + jobParameterName: '', + jobParameterValue: '' + }); + } + + addParameter(): void { + this.updatedJobParameters = [ + ...this.updatedJobParameters, + { + jobParameterName: '', + jobParameterValue: '' + } + ]; + } + + deleteParameter(index: number): void { + let idx = 0; + const jobParameters: JobParameterType[] = []; + for ( ; idx < this.updatedJobParameters.length; idx++ ) { + if (idx !== index) { + jobParameters.push(this.updatedJobParameters[idx]); + } + } + this.updatedJobParameters = jobParameters; + } + + /** + * Gets the jobId and jobParameters array + * @returns jobId and jobParameters array + */ + getTableData(): JobIdAndParameterType { + return { + jobId: this.jobId, + displayName: this.displayName, + jobParameters: this.updatedJobParameters + }; + } + +} diff --git a/src/app/system/manage-jobs/scheduler-jobs/manage-scheduler-jobs.component.html b/src/app/system/manage-jobs/scheduler-jobs/manage-scheduler-jobs.component.html index 2789e86a5..049eb42c2 100644 --- a/src/app/system/manage-jobs/scheduler-jobs/manage-scheduler-jobs.component.html +++ b/src/app/system/manage-jobs/scheduler-jobs/manage-scheduler-jobs.component.html @@ -28,6 +28,10 @@ Run Selected Jobs +
diff --git a/src/app/system/manage-jobs/scheduler-jobs/manage-scheduler-jobs.component.ts b/src/app/system/manage-jobs/scheduler-jobs/manage-scheduler-jobs.component.ts index bd9df1ba2..91838f371 100644 --- a/src/app/system/manage-jobs/scheduler-jobs/manage-scheduler-jobs.component.ts +++ b/src/app/system/manage-jobs/scheduler-jobs/manage-scheduler-jobs.component.ts @@ -16,6 +16,7 @@ import { ConfigurationWizardService } from '../../../configuration-wizard/config /** Custom Dialog Component */ import { NextStepDialogComponent } from '../../../configuration-wizard/next-step-dialog/next-step-dialog.component'; +import { CustomParametersPopoverComponent } from './custom-parameters-popover/custom-parameters-popover.component'; /** * Manage scheduler jobs component. @@ -239,4 +240,16 @@ export class ManageSchedulerJobsComponent implements OnInit, AfterViewInit { } }); } + + /** + * Open Custom Parameters Dialog + */ + openCustomParametersDialog() { + this.dialog.open(CustomParametersPopoverComponent, { + data: { + selectedJobs: this.selection + } + }); + } + } diff --git a/src/app/system/system.module.ts b/src/app/system/system.module.ts index 130dc54d7..2a37eb24a 100644 --- a/src/app/system/system.module.ts +++ b/src/app/system/system.module.ts @@ -72,6 +72,8 @@ import { DragDropModule } from '@angular/cdk/drag-drop'; import { ManageExternalEventsComponent } from './manage-external-events/manage-external-events.component'; import { CobWorkflowComponent } from './manage-jobs/cob-workflow/cob-workflow.component'; import { LoanLockedComponent } from './manage-jobs/cob-workflow/loan-locked/loan-locked.component'; +import { CustomParametersPopoverComponent } from './manage-jobs/scheduler-jobs/custom-parameters-popover/custom-parameters-popover.component'; +import { CustomParametersTableComponent } from './manage-jobs/scheduler-jobs/custom-parameters-popover/custom-parameters-table/custom-parameters-table.component'; @NgModule({ imports: [ @@ -143,7 +145,9 @@ import { LoanLockedComponent } from './manage-jobs/cob-workflow/loan-locked/loan WorkflowDiagramComponent, ManageExternalEventsComponent, CobWorkflowComponent, - LoanLockedComponent + LoanLockedComponent, + CustomParametersPopoverComponent, + CustomParametersTableComponent ], }) export class SystemModule { } diff --git a/src/app/system/system.service.ts b/src/app/system/system.service.ts index 512cf56d4..6c8788435 100644 --- a/src/app/system/system.service.ts +++ b/src/app/system/system.service.ts @@ -4,6 +4,7 @@ import { HttpClient, HttpParams } from '@angular/common/http'; /** rxjs Imports */ import { Observable } from 'rxjs'; +import { RunJobWithParamPayloadType } from './manage-jobs/scheduler-jobs/custom-parameters-popover/custom-parameters-popover.component'; /** * System service. @@ -323,6 +324,14 @@ export class SystemService { return this.http.post(`/jobs/${jobId}?command=executeJob`, this.emptyPayload).toPromise(); } + /** + * @param {string} jobId Job Id on which jobs to run + * @returns {Observable} + */ + runSelectedJobWithParameters(jobId: string, jobParameters: RunJobWithParamPayloadType): Promise { + return this.http.post(`/jobs/${jobId}?command=executeJob`, jobParameters, { observe: 'response' }).toPromise(); + } + /* * @param jobId Job Id to view the history. * @returns {Observable} Fetches History of the Job.