Skip to content

Commit 69e2ab3

Browse files
authored
Merge pull request #50 from fabioformosa/develop
Develop
2 parents d243c3a + 27fab8a commit 69e2ab3

File tree

50 files changed

+1659
-641
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

+1659
-641
lines changed

quartz-manager-frontend/angular.json

+3-3
Original file line numberDiff line numberDiff line change
@@ -108,11 +108,11 @@
108108
"defaultProject": "angular-spring-starter",
109109
"schematics": {
110110
"@schematics/angular:component": {
111-
"prefix": "app",
111+
"prefix": "qrzmng",
112112
"style": "css"
113113
},
114114
"@schematics/angular:directive": {
115-
"prefix": "app"
115+
"prefix": "qrzmng"
116116
}
117117
}
118-
}
118+
}

quartz-manager-frontend/package.json

+4-1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
"@fortawesome/fontawesome-free-regular": "^5.0.8",
3030
"@fortawesome/fontawesome-free-solid": "^5.0.8",
3131
"@stomp/ng2-stompjs": "^0.6.3",
32+
"@types/jest": "^27.0.2",
3233
"core-js": "2.5.1",
3334
"hammerjs": "2.0.8",
3435
"net": "^1.0.2",
@@ -65,6 +66,8 @@
6566
},
6667
"jest": {
6768
"preset": "jest-preset-angular",
68-
"setupFilesAfterEnv": ["<rootDir>/jest.setup.ts"]
69+
"setupFilesAfterEnv": [
70+
"<rootDir>/jest.setup.ts"
71+
]
6972
}
7073
}

quartz-manager-frontend/src/app/components/scheduler-config/scheduler-config.component.html

+40-12
Original file line numberDiff line numberDiff line change
@@ -2,36 +2,64 @@
22
<mat-card-header>
33
<mat-card-title><b>SCHEDULER CONFIG</b></mat-card-title>
44
</mat-card-header>
5-
<mat-card-content>
5+
6+
<!-- ADD BUTTON -->
7+
<mat-card-content *ngIf="!existsATriggerInProgress() && !enabledTriggerForm">
8+
<button mat-fab color="primary">
9+
<mat-icon (click)="enableTriggerForm()">add</mat-icon>
10+
</button>
11+
</mat-card-content>
12+
13+
<!-- TRIGGER DETAILS -->
14+
<mat-card-content *ngIf="existsATriggerInProgress() || enabledTriggerForm">
615
<div fxLayout="column">
716
<form name="configForm" fxFlex="1 1 100%" #configForm="ngForm">
8-
<mat-form-field>
9-
<input matInput placeholder="Freq [Num per day]" [(ngModel)]="config.triggerPerDay" name="triggerPerDay" type="number">
17+
<mat-form-field [appearance]="enabledTriggerForm ? 'fill': 'none'">
18+
<mat-label>Freq [Num per day]</mat-label>
19+
<input [readonly]="!enabledTriggerForm"
20+
matInput placeholder="Freq [Num per day]" name="triggerPerDay" type="number"
21+
[(ngModel)]="config.triggerPerDay"
22+
>
1023
</mat-form-field>
11-
<mat-form-field>
12-
<input matInput placeholder="Max Occurrences" [(ngModel)]="config.maxCount" name="maxCount" type="number">
24+
<mat-form-field [appearance]="enabledTriggerForm ? 'fill': 'none'">
25+
<mat-label>Max Occurrences</mat-label>
26+
<input [readonly]="!enabledTriggerForm"
27+
matInput placeholder="Max Occurrences" name="maxCount" type="number"
28+
[(ngModel)]="config.maxCount"
29+
>
1330
</mat-form-field>
14-
31+
1532
<br>
1633

1734
<div>
1835
<h5>Misfire Policy</h5>
19-
<div>RESCHEDULE NEXT WITH EXISTING COUNT</div>
36+
<div>RESCHEDULE NEXT WITH REMAINING COUNT</div>
2037
<div class="small">
21-
In case of misfire event, the trigger is re-scheduled to the next scheduled time after 'now' with the repeat count left unchanged (missed events are definitively lost).
38+
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.
2239
<br/>
23-
<strong>Warning:</strong> This policy could cause the trigger to go directly to the complete state if the end-time of the trigger has arrived,
24-
so this misfire instruction doesn't guarantee that the repeat counter reaches your max value, but it guarantees that the end-time doesn't go over the expected final fire time.
40+
<strong>Warning:</strong> This policy could cause the Trigger to go directly to the 'COMPLETE' state if all fire-times where missed.
2541
</div>
2642
</div>
27-
43+
2844
<br>
2945

46+
<button mat-raised-button
47+
type="button"
48+
*ngIf="enabledTriggerForm"
49+
(click)="cancelConfigForm()">
50+
Cancel
51+
</button>
3052
<button mat-raised-button
31-
type="button"
53+
type="button" color="primary"
54+
*ngIf="enabledTriggerForm"
3255
(click)="submitConfig()">
3356
Submit
3457
</button>
58+
<button mat-raised-button type="button"
59+
*ngIf="!enabledTriggerForm"
60+
(click)="enabledTriggerForm = true">
61+
Reschedule
62+
</button>
3563
</form>
3664
</div>
3765
</mat-card-content>
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,69 @@
11
import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core';
22
import { SchedulerService } from '../../services';
33
import { SchedulerConfig } from '../../model/schedulerConfig.model'
4+
import {Scheduler} from '../../model/scheduler.model';
45

56
@Component({
6-
selector: 'scheduler-config',
7+
selector: 'qrzmng-scheduler-config',
78
templateUrl: './scheduler-config.component.html',
89
styleUrls: ['./scheduler-config.component.scss']
910
})
1011
export class SchedulerConfigComponent implements OnInit {
1112

13+
config: SchedulerConfig = new SchedulerConfig()
14+
configBackup: SchedulerConfig = new SchedulerConfig()
15+
scheduler: Scheduler;
16+
17+
triggerLoading = true;
18+
enabledTriggerForm = false;
19+
private fetchedTriggers = false;
20+
private triggerInProgress = false;
21+
1222
constructor(
1323
private schedulerService: SchedulerService
1424
) { }
1525

16-
config : SchedulerConfig = new SchedulerConfig()
17-
configBackup : SchedulerConfig = new SchedulerConfig()
18-
1926
ngOnInit() {
20-
this.retrieveConfig()
27+
this.triggerLoading = true;
28+
this._getScheduler();
29+
this.retrieveConfig();
2130
}
2231

2332
retrieveConfig = () => {
2433
this.schedulerService.getConfig()
2534
.subscribe(res => {
26-
this.config = new SchedulerConfig(res.triggerPerDay, res.maxCount)
35+
this.config = new SchedulerConfig(res.triggerPerDay, res.maxCount, res.timesTriggered)
2736
this.configBackup = res
37+
this.triggerLoading = false;
38+
this.triggerInProgress = res.timesTriggered < res.maxCount;
2839
})
2940
}
3041

42+
private _getScheduler() {
43+
this.schedulerService.getScheduler()
44+
.subscribe( res => {
45+
this.scheduler = <Scheduler>res;
46+
this.fetchedTriggers = this.scheduler.triggerKeys.length > 0
47+
})
48+
}
49+
50+
existsATriggerInProgress = (): boolean => this.fetchedTriggers && this.triggerInProgress;
51+
52+
cancelConfigForm = () => this.enabledTriggerForm = false;
53+
3154
submitConfig = () => {
32-
this.schedulerService.updateConfig(this.config)
55+
const schedulerServiceCall = this.existsATriggerInProgress() ? this.schedulerService.updateConfig : this.schedulerService.saveConfig;
56+
57+
schedulerServiceCall(this.config)
3358
.subscribe(res => {
3459
this.configBackup = this.config;
60+
this.enabledTriggerForm = false;
61+
this.fetchedTriggers = true;
62+
this.triggerInProgress = true;
3563
}, error => {
3664
this.config = this.configBackup;
3765
});
3866
};
3967

68+
enableTriggerForm = () => this.enabledTriggerForm = true;
4069
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
import { TestBed, async, inject } from '@angular/core/testing';
2+
import { Router } from '@angular/router';
3+
import { NO_AUTH, UserService } from '../services';
4+
import { AdminGuard } from './admin.guard';
5+
import {jest} from '@jest/globals'
6+
7+
export class RouterStub {
8+
navigate(commands?: any[], extras?: any) {}
9+
}
10+
11+
const RouterSpy = jest.spyOn(RouterStub.prototype, 'navigate');
12+
13+
const MockUserServiceNoAuth = jest.fn(() => ({currentUser: NO_AUTH}));
14+
const MockUserService = jest.fn(() => ({
15+
currentUser: {
16+
authorities: ['ROLE_ADMIN']
17+
}
18+
}));
19+
const MockUserServiceForbidden = jest.fn(() => ({
20+
currentUser: {
21+
authorities: ['ROLE_GUEST']
22+
}
23+
}));
24+
25+
// describe('AdminGuard NoAuth', () => {
26+
// beforeEach(() => {
27+
// TestBed.configureTestingModule({
28+
// providers: [
29+
// AdminGuard,
30+
// {
31+
// provide: Router,
32+
// useClass: RouterStub
33+
// },
34+
// {
35+
// provide: UserService,
36+
// useClass: MockUserServiceNoAuth
37+
// }
38+
// ]
39+
// });
40+
// });
41+
//
42+
// test.skip('should run', inject([AdminGuard], (guard: AdminGuard) => {
43+
// expect(guard).toBeTruthy();
44+
// }));
45+
//
46+
// test.skip('returns true if user is NO_AUTH', inject([AdminGuard], (guard: AdminGuard) => {
47+
// expect(guard.canActivate(null, null)).toBeTruthy();
48+
// }));
49+
//
50+
// });
51+
52+
// describe('AdminGuard activates the route', () => {
53+
// beforeEach(() => {
54+
// TestBed.configureTestingModule({
55+
// providers: [
56+
// AdminGuard,
57+
// {
58+
// provide: Router,
59+
// useClass: RouterStub
60+
// },
61+
// {
62+
// provide: UserService,
63+
// useClass: MockUserService
64+
// }
65+
// ]
66+
// });
67+
// });
68+
//
69+
// test.skip('should run', inject([AdminGuard], (guard: AdminGuard) => {
70+
// expect(guard).toBeTruthy();
71+
// }));
72+
//
73+
// test.skip('returns true if user has admin role', inject([AdminGuard], (guard: AdminGuard) => {
74+
// expect(guard.canActivate(null, null)).toBeTruthy();
75+
// }));
76+
//
77+
// });
78+
79+
// describe('AdminGuard redirects to 403', () => {
80+
// beforeEach(() => {
81+
// TestBed.configureTestingModule({
82+
// providers: [
83+
// AdminGuard,
84+
// {
85+
// provide: Router,
86+
// useClass: RouterStub
87+
// },
88+
// {
89+
// provide: UserService,
90+
// useClass: MockUserServiceForbidden
91+
// }
92+
// ]
93+
// });
94+
// });
95+
//
96+
// test.skip('should run', inject([AdminGuard], (guard: AdminGuard) => {
97+
// expect(guard).toBeTruthy();
98+
// }));
99+
//
100+
// test.skip('returns false if user is not authorized', inject([AdminGuard], (guard: AdminGuard) => {
101+
// expect(guard.canActivate(null, null)).toBeFalsy();
102+
// expect(RouterSpy).toHaveBeenCalledTimes(1);
103+
// }));
104+
//
105+
// });

quartz-manager-frontend/src/app/guards/admin.guard.spec.ts

-105
This file was deleted.

0 commit comments

Comments
 (0)