From 6bb768de59dd5718ef9fea70f20e8fd6f5de0ea5 Mon Sep 17 00:00:00 2001 From: Fabio Formosa Date: Sat, 5 Mar 2022 20:50:23 +0100 Subject: [PATCH] #56 added a new FE component to schedule a simple trigger --- quartz-manager-frontend/package.json | 2 + quartz-manager-frontend/src/app/app.module.ts | 10 ++ .../scheduler-config.component.html | 34 +++--- .../components/simple-trigger-config/index.ts | 2 + .../simple-trigger-config.component.html | 103 ++++++++++++++++++ .../simple-trigger-config.component.scss | 3 + .../simple-trigger-config.component.ts | 99 +++++++++++++++++ .../src/app/model/jobKey.model.ts | 4 + .../src/app/model/simple-trigger.command.ts | 6 + .../src/app/model/simple-trigger.form.ts | 8 ++ .../src/app/model/simple-trigger.model.ts | 7 ++ .../src/app/model/trigger.model.ts | 15 +++ .../src/app/services/scheduler.service.ts | 19 +++- .../app/views/manager/manager.component.html | 2 +- 14 files changed, 296 insertions(+), 18 deletions(-) create mode 100644 quartz-manager-frontend/src/app/components/simple-trigger-config/index.ts create mode 100644 quartz-manager-frontend/src/app/components/simple-trigger-config/simple-trigger-config.component.html create mode 100644 quartz-manager-frontend/src/app/components/simple-trigger-config/simple-trigger-config.component.scss create mode 100644 quartz-manager-frontend/src/app/components/simple-trigger-config/simple-trigger-config.component.ts create mode 100644 quartz-manager-frontend/src/app/model/jobKey.model.ts create mode 100644 quartz-manager-frontend/src/app/model/simple-trigger.command.ts create mode 100644 quartz-manager-frontend/src/app/model/simple-trigger.form.ts create mode 100644 quartz-manager-frontend/src/app/model/simple-trigger.model.ts create mode 100644 quartz-manager-frontend/src/app/model/trigger.model.ts diff --git a/quartz-manager-frontend/package.json b/quartz-manager-frontend/package.json index 5e33306..7608d51 100644 --- a/quartz-manager-frontend/package.json +++ b/quartz-manager-frontend/package.json @@ -12,6 +12,7 @@ }, "private": true, "dependencies": { + "@angular-material-components/datetime-picker": "2.0.4", "@angular/animations": "9.1.4", "@angular/cdk": "9.2.1", "@angular/common": "9.1.4", @@ -32,6 +33,7 @@ "@types/jest": "^27.0.2", "core-js": "2.5.1", "hammerjs": "2.0.8", + "moment": "^2.29.1", "net": "^1.0.2", "rxjs": "6.5.5", "stompjs": "^2.3.3", diff --git a/quartz-manager-frontend/src/app/app.module.ts b/quartz-manager-frontend/src/app/app.module.ts index 5274d28..57b3a54 100644 --- a/quartz-manager-frontend/src/app/app.module.ts +++ b/quartz-manager-frontend/src/app/app.module.ts @@ -17,6 +17,11 @@ import {MatToolbarModule} from '@angular/material/toolbar'; import {MatIconModule} from '@angular/material/icon'; import {MatButtonModule} from '@angular/material/button'; import {MatCardModule} from '@angular/material/card'; +import {MatDatepickerModule} from '@angular/material/datepicker'; + +import {MatNativeDateModule} from '@angular/material/core'; +import { NgxMatTimepickerModule, NgxMatDatetimePickerModule} from '@angular-material-components/datetime-picker'; +import { NgxMatMomentModule } from '@angular-material-components/moment-adapter'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { FlexLayoutModule } from '@angular/flex-layout'; @@ -52,6 +57,7 @@ import { ChangePasswordComponent } from './views/change-password/change-password import { ForbiddenComponent } from './views/forbidden/forbidden.component'; import { APP_BASE_HREF } from '@angular/common'; import { environment } from '../environments/environment'; +import {SimpleTriggerConfigComponent} from './components/simple-trigger-config'; export function initUserFactory(userService: UserService) { return () => userService.jsessionInitUser(); @@ -102,6 +108,7 @@ export function jwtOptionsFactory(apiService: ApiService) { NotFoundComponent, AccountMenuComponent, SchedulerConfigComponent, + SimpleTriggerConfigComponent, SchedulerControlComponent, LogsPanelComponent, ProgressPanelComponent, @@ -132,6 +139,9 @@ export function jwtOptionsFactory(apiService: ApiService) { MatCardModule, MatProgressSpinnerModule, MatProgressBarModule, + MatDatepickerModule, MatNativeDateModule, + NgxMatMomentModule, + NgxMatDatetimePickerModule, FlexLayoutModule ], providers: [ diff --git a/quartz-manager-frontend/src/app/components/scheduler-config/scheduler-config.component.html b/quartz-manager-frontend/src/app/components/scheduler-config/scheduler-config.component.html index cf39730..fe87e40 100644 --- a/quartz-manager-frontend/src/app/components/scheduler-config/scheduler-config.component.html +++ b/quartz-manager-frontend/src/app/components/scheduler-config/scheduler-config.component.html @@ -14,23 +14,25 @@
- - Freq [Num per day] - - - - Max Occurrences - - - +
+ + Freq [Num per day] + + +
+
+ + Max Occurrences + + +

-
Misfire Policy
RESCHEDULE NEXT WITH REMAINING COUNT
diff --git a/quartz-manager-frontend/src/app/components/simple-trigger-config/index.ts b/quartz-manager-frontend/src/app/components/simple-trigger-config/index.ts new file mode 100644 index 0000000..8612d8b --- /dev/null +++ b/quartz-manager-frontend/src/app/components/simple-trigger-config/index.ts @@ -0,0 +1,2 @@ +export * from './simple-trigger-config.component'; +export {SimpleTriggerCommand} from '../../model/simple-trigger.command'; diff --git a/quartz-manager-frontend/src/app/components/simple-trigger-config/simple-trigger-config.component.html b/quartz-manager-frontend/src/app/components/simple-trigger-config/simple-trigger-config.component.html new file mode 100644 index 0000000..40793a3 --- /dev/null +++ b/quartz-manager-frontend/src/app/components/simple-trigger-config/simple-trigger-config.component.html @@ -0,0 +1,103 @@ + + + SCHEDULER CONFIG + + + + + + + + + + +
+ + +
+ + Start Date (optional) + + + + + + + + +
+ +
+ + End Date (optional) + + + + + + + + +
+ +
+ + Repeat Interval [in mills] + + +
+
+ + Repeat Count + + +
+
+
+
Misfire Policy
+
RESCHEDULE NEXT WITH REMAINING COUNT
+
+ In case of misfire event, the trigger is re-scheduled to the next scheduled time after 'now' with the repeat count set to what it would be, if it had not missed any firings. +
+ Warning: This policy could cause the Trigger to go directly to the 'COMPLETE' state if all fire-times where missed. +
+
+ +
+ + + + + +
+
+
diff --git a/quartz-manager-frontend/src/app/components/simple-trigger-config/simple-trigger-config.component.scss b/quartz-manager-frontend/src/app/components/simple-trigger-config/simple-trigger-config.component.scss new file mode 100644 index 0000000..e4cf5d5 --- /dev/null +++ b/quartz-manager-frontend/src/app/components/simple-trigger-config/simple-trigger-config.component.scss @@ -0,0 +1,3 @@ +.small{ + font-size: 0.8em; +} diff --git a/quartz-manager-frontend/src/app/components/simple-trigger-config/simple-trigger-config.component.ts b/quartz-manager-frontend/src/app/components/simple-trigger-config/simple-trigger-config.component.ts new file mode 100644 index 0000000..8efd796 --- /dev/null +++ b/quartz-manager-frontend/src/app/components/simple-trigger-config/simple-trigger-config.component.ts @@ -0,0 +1,99 @@ +import {Component, OnInit} from '@angular/core'; +import {SchedulerService} from '../../services'; +import {Scheduler} from '../../model/scheduler.model'; +import {SimpleTriggerCommand} from '../../model/simple-trigger.command'; +import {SimpleTrigger} from '../../model/simple-trigger.model'; +import {SimpleTriggerForm} from '../../model/simple-trigger.form'; +import * as moment from 'moment'; + +@Component({ + selector: 'qrzmng-simple-trigger-config', + templateUrl: './simple-trigger-config.component.html', + styleUrls: ['./simple-trigger-config.component.scss'] +}) +export class SimpleTriggerConfigComponent implements OnInit { + + simpleTriggerForm: SimpleTriggerForm = new SimpleTriggerForm(); + formBackup: SimpleTriggerForm = new SimpleTriggerForm(); + + trigger: SimpleTrigger; + scheduler: Scheduler; + + triggerLoading = true; + enabledTriggerForm = false; + private fetchedTriggers = false; + private triggerInProgress = false; + + constructor( + private schedulerService: SchedulerService + ) { } + + ngOnInit() { + this.triggerLoading = true; + this.retrieveConfiguredTriggerIfExists(); + } + + retrieveConfiguredTriggerIfExists = () => { + this.schedulerService.getSimpleTriggerConfig() + .subscribe((retTrigger: SimpleTrigger) => { + this.trigger = retTrigger; + this.formBackup = this.simpleTriggerForm; + this.simpleTriggerForm = this._fromTriggerToForm(retTrigger); + + this.triggerLoading = false; + this.triggerInProgress = this.trigger.mayFireAgain; + }) + } + + existsATriggerInProgress = (): boolean => this.trigger && this.triggerInProgress; + + cancelConfigForm = () => this.enabledTriggerForm = false; + + submitConfig = () => { + const schedulerServiceCall = this.existsATriggerInProgress() ? + this.schedulerService.updateSimpleTriggerConfig : this.schedulerService.saveSimpleTriggerConfig; + + const simpleTriggerCommand = this._fromFormToCommand(this.simpleTriggerForm); + schedulerServiceCall(simpleTriggerCommand) + .subscribe((retTrigger: SimpleTrigger) => { + this.trigger = retTrigger; + this.formBackup = this.simpleTriggerForm; + this.simpleTriggerForm = this._fromTriggerToForm(retTrigger); + this.enabledTriggerForm = false; + this.fetchedTriggers = true; + this.triggerInProgress = this.trigger.mayFireAgain; + }, error => { + this.simpleTriggerForm = this.formBackup; + }); + }; + + enableTriggerForm = () => this.enabledTriggerForm = true; + + private _fromTriggerToCommand = (simpleTrigger: SimpleTrigger) => { + const command = new SimpleTriggerCommand(); + command.repeatCount = simpleTrigger.repeatCount; + command.repeatInterval = simpleTrigger.repeatInterval; + command.startDate = simpleTrigger.startTime; + command.endDate = simpleTrigger.endTime; + return command; + } + + private _fromTriggerToForm = (simpleTrigger: SimpleTrigger): SimpleTriggerForm => { + const command = new SimpleTriggerForm(); + command.repeatCount = simpleTrigger.repeatCount; + command.repeatInterval = simpleTrigger.repeatInterval; + command.startDate = moment(simpleTrigger.startTime); + command.endDate = moment(simpleTrigger.endTime); + return command; + } + + private _fromFormToCommand = (simpleTriggerForm: SimpleTriggerForm): SimpleTriggerCommand => { + const simpleTriggerCommand = new SimpleTriggerCommand(); + simpleTriggerCommand.repeatCount = simpleTriggerForm.repeatCount; + simpleTriggerCommand.repeatInterval = simpleTriggerForm.repeatInterval; + simpleTriggerCommand.startDate = simpleTriggerForm.startDate.toDate(); + simpleTriggerCommand.endDate = simpleTriggerForm.endDate.toDate(); + return simpleTriggerCommand; + } + +} diff --git a/quartz-manager-frontend/src/app/model/jobKey.model.ts b/quartz-manager-frontend/src/app/model/jobKey.model.ts new file mode 100644 index 0000000..afc7171 --- /dev/null +++ b/quartz-manager-frontend/src/app/model/jobKey.model.ts @@ -0,0 +1,4 @@ +export class JobKeyModel { + name: string; + group: string; +} diff --git a/quartz-manager-frontend/src/app/model/simple-trigger.command.ts b/quartz-manager-frontend/src/app/model/simple-trigger.command.ts new file mode 100644 index 0000000..3d9db64 --- /dev/null +++ b/quartz-manager-frontend/src/app/model/simple-trigger.command.ts @@ -0,0 +1,6 @@ +export class SimpleTriggerCommand { + startDate: Date; + endDate: Date; + repeatCount: number; + repeatInterval: number; +} diff --git a/quartz-manager-frontend/src/app/model/simple-trigger.form.ts b/quartz-manager-frontend/src/app/model/simple-trigger.form.ts new file mode 100644 index 0000000..98a0210 --- /dev/null +++ b/quartz-manager-frontend/src/app/model/simple-trigger.form.ts @@ -0,0 +1,8 @@ +import {Moment} from 'moment/moment'; + +export class SimpleTriggerForm { + startDate: Moment; + endDate: Moment; + repeatCount: number; + repeatInterval: number; +} diff --git a/quartz-manager-frontend/src/app/model/simple-trigger.model.ts b/quartz-manager-frontend/src/app/model/simple-trigger.model.ts new file mode 100644 index 0000000..d5e2537 --- /dev/null +++ b/quartz-manager-frontend/src/app/model/simple-trigger.model.ts @@ -0,0 +1,7 @@ +import {Trigger} from './trigger.model'; + +export class SimpleTrigger extends Trigger { + repeatCount: number; + repeatInterval: number; + timesTriggered: number; +} diff --git a/quartz-manager-frontend/src/app/model/trigger.model.ts b/quartz-manager-frontend/src/app/model/trigger.model.ts new file mode 100644 index 0000000..5b67f47 --- /dev/null +++ b/quartz-manager-frontend/src/app/model/trigger.model.ts @@ -0,0 +1,15 @@ +import {TriggerKey} from './triggerKey.model'; +import {JobKeyModel} from './jobKey.model'; + +export class Trigger { + triggerKeyDTO: TriggerKey; + priority: number; + startTime: Date; + description: string; + endTime: Date; + finalFireTime: Date; + misfireInstruction: number; + nextFireTime: Date; + jobKeyDTO: JobKeyModel; + mayFireAgain: boolean; +} diff --git a/quartz-manager-frontend/src/app/services/scheduler.service.ts b/quartz-manager-frontend/src/app/services/scheduler.service.ts index ead76f3..53df2bb 100644 --- a/quartz-manager-frontend/src/app/services/scheduler.service.ts +++ b/quartz-manager-frontend/src/app/services/scheduler.service.ts @@ -1,6 +1,10 @@ import { Injectable } from '@angular/core'; import { getBaseUrl } from '.'; import { ApiService } from './api.service'; +import {Trigger} from '../model/trigger.model'; +import {Observable} from 'rxjs'; +import {SimpleTriggerCommand} from '../model/simple-trigger.command'; +import {SchedulerConfig} from '../model/schedulerConfig.model'; @Injectable() export class SchedulerService { @@ -33,17 +37,30 @@ export class SchedulerService { return this.apiService.get(getBaseUrl() + '/quartz-manager/scheduler') } + // deprecated getConfig = () => { return this.apiService.get(getBaseUrl() + '/quartz-manager/scheduler/config') } + getSimpleTriggerConfig = (): Observable => { + return this.apiService.get(getBaseUrl() + '/quartz-manager/simple-triggers/my-simple-trigger'); + } + saveConfig = (config: Object) => { return this.apiService.post(getBaseUrl() + '/quartz-manager/triggers/mytrigger', config) } - updateConfig = (config: Object) => { + saveSimpleTriggerConfig = (config: SimpleTriggerCommand) => { + return this.apiService.post(getBaseUrl() + '/quartz-manager/simple-triggers/mytrigger', config) + } + + updateConfig = (config: SchedulerConfig) => { return this.apiService.put(getBaseUrl() + '/quartz-manager/triggers/mytrigger', config) } + updateSimpleTriggerConfig = (config: SimpleTriggerCommand) => { + return this.apiService.put(getBaseUrl() + '/quartz-manager/simple-triggers/mytrigger', config) + } + } diff --git a/quartz-manager-frontend/src/app/views/manager/manager.component.html b/quartz-manager-frontend/src/app/views/manager/manager.component.html index ac239e1..7c5e377 100644 --- a/quartz-manager-frontend/src/app/views/manager/manager.component.html +++ b/quartz-manager-frontend/src/app/views/manager/manager.component.html @@ -4,7 +4,7 @@

- +