Project

General

Profile

1
var cronMaker = angular.module("cronMaker", []);
2

    
3
cronMaker.filter('range', function() {
4
	return function(input, min, max) {
5
		min = parseInt(min); //Make string input int
6
		max = parseInt(max);
7
		for (var i=min; i<=max; i++) {
8
			input.push(i);
9
		}
10
		return input;
11
	};
12
});
13

    
14
cronMaker.directive("cronMakerModal", function () {
15
	return {
16
		restrict: 'E',
17
		transclude: true,
18
		replace:true,
19
		scope: {
20
	        'cronExpression'  : '=',
21
	        'visible'         : '='
22
		},
23
		templateUrl: '/html/wf/cron-maker-modal.html',
24
		
25
		link: function (scope, element, attrs, ctrl) {
26
			scope.p1 = '0'; // Seconds      (0-59)
27
			scope.p2 = '0'; // Minutes      (0-59)
28
			scope.p3 = '0'; // Hours        (0-23)
29
			scope.p4 = '1'; // Day of Month (1-31)
30
			scope.p5 = '1'; // Month        (1-12 or JAN-DEC)
31
			scope.p6 = '1'; // Day of week  (1-7 or SUN-SAT)
32
			
33
			scope.error = '';
34
			
35
			$(element).modal({'show': false});
36
		
37
			scope.$watch(function() {
38
				return scope.visible;
39
			}, function(value) {
40
				if (value == true) { 
41
					$(element).modal('show');
42
					$('#cronMakerTabs a:first').tab('show')
43
					scope.visible = false;
44
					scope.prepareForCronMinutes();
45
				}
46
			});
47
						
48
			scope.verifyPart = function(name, val, min, max) {
49
				if (!val || val.length == 0) {
50
					scope.error = '[' + name + '] is empty';
51
					return false;
52
				}
53
				if (val == '?' || val == '*') {
54
					return true;
55
				}
56
				if (/^(0|1)\/\d+$/.test(val)) {
57
					return true;
58
				}
59
				if (Number.isInteger(val)) {
60
					if (val >= min && val <= max) {
61
						return true;
62
					} else {
63
						scope.error = '[' + name + '] is out of range (value: ' + val + ', range: ' + min + '-' + max + ')';
64
						return false;
65
					}
66
				}
67
				
68
				if (/^\d+$/.test(val)) {
69
					if (parseInt(val) >= min && parseInt(val) <= max) {
70
						return true;
71
					} else {
72
						scope.error = '[' + name + '] is out of range (value: ' + val + ', range: ' + min + '-' + max + ')';
73
						return false;
74
					}
75
				}
76
				
77
				scope.error = '[' + name + '] is invalid (value: ' + val + ')';
78
				
79
				return false;
80
			};
81
			
82
			scope.verifyDaysPart = function(name, val) {
83
				if (!val || val.length == 0) {
84
					scope.error = '[' + name + '] is empty';
85
					return false;
86
				}
87
				if (val == '?' || val == '*') {
88
					return true;
89
				}
90
				
91
				var res = true;
92
				angular.forEach(val.split(','), function(d) {
93
					if (!((d == 'MON') || (d == 'TUE') || (d == 'WED') || (d == 'THU') || (d == 'FRI') || (d == 'SAT') || (d == 'SUN'))) {
94
						scope.error = '[' + name + '] has an invalid day: ' + d;
95
						res = false;
96
					}
97
				});
98
				
99
				return res;
100
			}
101

    
102
			scope.isValid = function() {
103
				scope.error = '';
104
				return (
105
					(scope.verifyPart("Seconds",      scope.p1, 0, 59)) &&
106
					(scope.verifyPart("Minutes",      scope.p2, 0, 59)) &&
107
					(scope.verifyPart("Hours",        scope.p3, 0, 23)) &&
108
					(scope.verifyPart("Day of Month", scope.p4, 1, 31)) &&
109
					(scope.verifyPart("Month",        scope.p5, 1, 12)) &&
110
					(scope.verifyDaysPart("Day of week", scope.p6))
111
				);
112
			}
113
			
114
			scope.updateCronExpression = function () {
115
				scope.cronExpression = scope.p1 + ' ' + scope.p2 + ' '  + scope.p3 + ' ' + scope.p4 + ' ' + scope.p5 + ' ' + scope.p6;
116
			};
117
			
118
			scope.updateCronPart = function(part, value) {
119
				scope[part] = value;
120
			};
121
			
122
			scope.prepareForCronMinutes = function () {
123
				scope.stepMinutes = 10;
124
				
125
				scope.p1 = '0';
126
				scope.p2 = '0/' + scope.stepMinutes;
127
				scope.p3 = '*';
128
				scope.p4 = '1/1';
129
				scope.p5 = '*';
130
				scope.p6 = '?';
131
			};		
132
			
133
			scope.prepareForCronHour = function () {
134
				scope.stepHour = 1;
135
				
136
				scope.p1 = '0';
137
				scope.p2 = '0';
138
				scope.p3 = '0/' + scope.stepHour;
139
				scope.p4 = '1/1';
140
				scope.p5 = '*';
141
				scope.p6 = '?';
142
			};
143

    
144
			scope.prepareForCronDay = function () {
145
				scope.stepDay = 1;
146
				scope.atHour = 12;				
147
				scope.atMinute = 30;				
148
				
149
				scope.p1 = '0';
150
				scope.p2 = scope.atMinute;
151
				scope.p3 = scope.atHour;
152
				scope.p4 = '1/' + scope.stepDay;
153
				scope.p5 = '*';
154
				scope.p6 = '?';
155
			};
156
			
157
			scope.prepareForCronWeek = function () {
158
				scope.days = {
159
					'MON' : true,
160
					'TUE' : true,
161
					'WED' : true,
162
					'THU' : true,
163
					'FRI' : true,
164
					'SAT' : false,
165
					'SUN' : false
166
				};
167

    
168
				scope.atHour = 12;				
169
				scope.atMinute = 30;				
170
				
171
				scope.p1 = '0';
172
				scope.p2 = scope.atMinute;
173
				scope.p3 = scope.atHour;
174
				scope.p4 = '?';
175
				scope.p5 = '*';
176
				scope.p6 = scope.getSelectedDays(scope.days);
177
			};
178

    
179
			scope.getSelectedDays = function(map) {
180
				var res = [];
181
				angular.forEach(map, function(v, k) {
182
					if (v) res.push(k);
183
				});
184
				return res.join(',');
185
			}
186
			
187
			scope.prepareForCronMonth = function () {
188
				scope.stepMonth = 1;
189
				
190
				scope.atDay = 1;
191
				scope.atHour = 12;				
192
				scope.atMinute = 30;				
193
				
194
				scope.p1 = '0';
195
				scope.p2 = scope.atMinute;
196
				scope.p3 = scope.atHour;
197
				scope.p4 = scope.atDay;
198
				scope.p5 = '1/' + scope.stepMonth;
199
				scope.p6 = '?';
200
			};
201
			
202
			scope.prepareForCronYear = function () {
203
				scope.atDay = 25;
204
				scope.atMonth = '2';
205
				scope.atHour = 9;				
206
				scope.atMinute = 15;				
207
				
208
				scope.p1 = '0';
209
				scope.p2 = scope.atMinute;
210
				scope.p3 = scope.atHour;
211
				scope.p4 = scope.atDay;
212
				scope.p5 = scope.atMonth;
213
				scope.p6 = '?';
214
			};
215
		}
216
	}
217
});
(1-1/7)