Skip to content

Commit a930704

Browse files
committed
(core): pull angular-cron-gen library internally
* pull angular-cron-gen library internally to deck to fix several issues with the library. * the latest version of the library will not allow angular expressions for the new `template-url` property as it uses the `templateUrl` function which executes before the scope is initialized so any scoped property value is not accessible. this means that our template value set via a controller property is not accessible. this is a long-standing issue [in the core library](angular/angular.js#2895) and it doesn't look to be fixed anytime soon. * an hourly cron trigger set in the UI to execute start at a specific time actually generates a daily cron expression so the portion of the hourly cron trigger that allows starting at a specific time was removed from deck's cron picker template. * the regex used by the library to match hourly cron expressions was incorrectly matching daily cron expressions which was resulting the UI displaying `hourly` instead of `daily` in the select so the regex for hourly was fixed to properly test for matching hourly cron expressions.
1 parent 245e1fb commit a930704

File tree

4 files changed

+132
-134
lines changed

4 files changed

+132
-134
lines changed

app/scripts/modules/core/pipeline/config/triggers/cron/cronPicker.html

Lines changed: 124 additions & 129 deletions
Original file line numberDiff line numberDiff line change
@@ -2,232 +2,227 @@
22
<div class="row">
33
<div class="col-md-12">
44
<select class="form-control input-sm"
5-
ng-model="state.activeTab"
6-
ng-change="regenerateCron(state)"
5+
ng-model="$ctrl.activeTab"
6+
ng-change="$ctrl.regenerateCron()"
77
ng-options="tab for tab in ['minutes', 'hourly', 'daily', 'weekly', 'monthly', 'advanced']"></select>
88
</div>
99
</div>
1010
<div class="cron-gen-container">
11-
<div ng-if="state.activeTab === 'minutes'">
12-
<div class="row" ng-init="regenerateCron(state)">
11+
<div ng-if="$ctrl.activeTab === 'minutes'">
12+
<div class="row" ng-init="$ctrl.regenerateCron()">
1313
<div class="col-md-12">
1414
<input class="form-control input-sm"
1515
type="number"
1616
min="1"
1717
max="59"
18-
ng-change="regenerateCron(state)"
19-
ng-model="state.minutes.minutes"
20-
ng-required="state.activeTab === 'minutes'">
21-
minute<span ng-if="state.minutes.minutes > 1">s</span>
18+
ng-change="$ctrl.regenerateCron()"
19+
ng-model="$ctrl.state.minutes.minutes"
20+
ng-required="$ctrl.activeTab === 'minutes'">
21+
minute<span ng-if="$ctrl.state.minutes.minutes > 1">s</span>
2222
</div>
2323
</div>
2424
</div>
25-
<div ng-if="state.activeTab === 'hourly'">
25+
<div ng-if="$ctrl.activeTab === 'hourly'">
2626
<div class="row">
2727
<div class="col-md-12">
28-
<input type="radio"
29-
value="every"
30-
name="hourly-radio"
31-
ng-change="regenerateCron(state)"
32-
ng-model="state.hourly.subTab">
3328
Every
3429
<input class="form-control input-sm"
3530
type="number"
3631
min="1"
3732
max="23"
38-
ng-change="regenerateCron(state)"
39-
ng-model="state.hourly.every.hours"
40-
ng-required="state.activeTab === 'hourly' && state.hourly.subTab === 'every'">
41-
hour<span ng-if="state.hourly.every.hours> 1">s</span>
42-
</div>
43-
</div>
44-
<div class="row">
45-
<div class="col-md-12">
46-
<input type="radio"
47-
value="specific"
48-
ng-change="regenerateCron(state)"
49-
ng-model="state.hourly.subTab"
50-
name="hourly-radio">
51-
At
52-
<select class="form-control input-sm"
53-
ng-change="regenerateCron(state)"
54-
ng-model="state.hourly.specific.hours"
55-
ng-options="hour as padNumber(hour) for hour in selectOptions.hours"
56-
ng-required="state.activeTab === 'hourly' && state.hourly.subTab === 'specific'">
57-
</select>
58-
:
59-
<select class="form-control input-sm"
60-
ng-change="regenerateCron(state)"
61-
ng-model="state.hourly.specific.minutes"
62-
ng-options="minute as padNumber(minute) for minute in selectOptions.minutes"
63-
ng-required="state.activeTab === 'hourly' && state.hourly.subTab === 'specific'">
64-
</select>
65-
<system-timezone></system-timezone>
33+
ng-change="$ctrl.regenerateCron()"
34+
ng-model="$ctrl.state.hourly.hours"
35+
ng-required="$ctrl.activeTab === 'hourly'">
36+
hour<span ng-if="$ctrl.state.hourly.hours > 1">s</span>
37+
on minute
38+
<input class="form-control input-sm"
39+
type="number"
40+
min="0"
41+
max="59"
42+
ng-change="$ctrl.regenerateCron()"
43+
ng-model="$ctrl.state.hourly.minutes"
44+
ng-required="$ctrl.activeTab === 'hourly'">
6645
</div>
6746
</div>
6847
</div>
69-
<div ng-if="state.activeTab === 'daily'">
48+
<div ng-if="$ctrl.activeTab === 'daily'">
7049
<div class="row">
7150
<div class="col-md-12">
7251
<input type="radio"
7352
value="everyDays"
7453
name="daily-radio"
75-
ng-change="regenerateCron(state)"
76-
ng-model="state.daily.subTab"
54+
ng-change="$ctrl.regenerateCron()"
55+
ng-model="$ctrl.state.daily.subTab"
7756
checked="checked">
7857
Every
7958
<input class="form-control input-sm"
8059
type="number"
8160
min="1"
8261
max="31"
83-
ng-change="regenerateCron(state)"
84-
ng-model="state.daily.everyDays.days"
85-
ng-required="state.activeTab === 'daily' && state.daily.subTab === 'everyDays'">
86-
day<span ng-if="state.daily.everyDays.days > 1">s</span>
62+
ng-disabled="$ctrl.state.daily.subTab !== 'everyDays'"
63+
ng-change="$ctrl.regenerateCron()"
64+
ng-model="$ctrl.state.daily.everyDays.days"
65+
ng-required="$ctrl.activeTab === 'daily' && $ctrl.state.daily.subTab === 'everyDays'">
66+
day<span ng-if="$ctrl.state.daily.everyDays.days > 1">s</span>
8767
</div>
8868
</div>
8969
<div class="row">
9070
<div class="col-md-12">
9171
<input type="radio"
9272
value="everyWeekDay"
93-
ng-change="regenerateCron(state)"
94-
ng-model="state.daily.subTab"
73+
ng-change="$ctrl.regenerateCron()"
74+
ng-model="$ctrl.state.daily.subTab"
9575
name="daily-radio">
9676
Every week day
9777
</div>
9878
</div>
9979
<div class="row">
10080
<div class="col-md-12">
10181
Start time
102-
<select class="form-control input-sm"
103-
ng-change="regenerateCron(state)"
104-
ng-required="state.activeTab === 'daily'"
105-
ng-model="state.daily.hours"
106-
ng-options="hour as padNumber(hour) for hour in selectOptions.hours">
107-
</select>
108-
:
109-
<select class="form-control input-sm"
110-
ng-change="regenerateCron(state)"
111-
ng-required="state.activeTab === 'daily'"
112-
ng-model="state.daily.minutes"
113-
ng-options="minute as padNumber(minute) for minute in selectOptions.minutes">
114-
</select>
82+
<cron-gen-time-select class="visible-xs-inline-block visible-sm-inline-block visible-md-inline-block visible-lg-inline-block"
83+
ng-if="$ctrl.state.daily.subTab === 'everyDays'"
84+
is-required="state.activeTab === 'daily'"
85+
select-class="$ctrl.parsedOptions.formSelectClass"
86+
is-disabled="$ctrl.activeTab !== 'daily'"
87+
on-change="$ctrl.regenerateCron()"
88+
model="$ctrl.state.daily.everyDays"
89+
use-24-hour-time="$ctrl.parsedOptions.use24HourTime"
90+
hide-seconds="$ctrl.parsedOptions.hideSeconds">
91+
</cron-gen-time-select>
92+
<cron-gen-time-select class="visible-xs-inline-block visible-sm-inline-block visible-md-inline-block visible-lg-inline-block"
93+
ng-if="$ctrl.state.daily.subTab === 'everyWeekDay'"
94+
is-required="state.activeTab === 'daily'"
95+
select-class="$ctrl.parsedOptions.formSelectClass"
96+
is-disabled="$ctrl.activeTab !== 'daily'"
97+
on-change="$ctrl.regenerateCron()"
98+
model="$ctrl.state.daily.everyWeekDay"
99+
use-24-hour-time="$ctrl.parsedOptions.use24HourTime"
100+
hide-seconds="$ctrl.parsedOptions.hideSeconds">
101+
</cron-gen-time-select>
115102
<system-timezone></system-timezone>
116103
</div>
117104
</div>
118105
</div>
119-
<div ng-if="state.activeTab === 'weekly'">
106+
<div ng-if="$ctrl.activeTab === 'weekly'">
120107
<div class="row">
121108
<div class="col-md-12">
122109
<div class="btn-group">
123110
<label ng-repeat="day in [{k: 'SUN', l: 'Sun'}, {k: 'MON', l: 'Mon'}, {k: 'TUE', l: 'Tue'}, {k: 'WED', l: 'Wed'}, {k: 'THU', l: 'Thu'}, {k: 'FRI', l: 'Fri'}, {k: 'SAT', l: 'Sat'}]"
124111
class="btn btn-default"
125112
uib-btn-checkbox
126-
ng-class="{active: state.weekly[day.k]}"
127-
ng-click="regenerateCron(state)"
128-
ng-model="state.weekly[day.k]">{{day.l}}</label>
113+
ng-class="{active: $ctrl.state.weekly[day.k]}"
114+
ng-click="$ctrl.regenerateCron()"
115+
ng-model="$ctrl.state.weekly[day.k]">{{day.l}}</label>
129116
</div>
130117
</div>
131118
</div>
132119
<div class="row">
133120
<div class="col-md-12">
134121
Start time
135-
<select class="form-control input-sm"
136-
ng-change="regenerateCron(state)"
137-
ng-required="state.activeTab === 'weekly'"
138-
ng-model="state.weekly.hours"
139-
ng-options="hour as padNumber(hour) for hour in selectOptions.hours">
140-
</select>
141-
:
142-
<select class="form-control input-sm"
143-
ng-change="regenerateCron(state)"
144-
ng-required="state.activeTab === 'weekly'"
145-
ng-model="state.weekly.minutes"
146-
ng-options="minute as padNumber(minute) for minute in selectOptions.minutes">
147-
</select>
122+
<cron-gen-time-select class="visible-xs-inline-block visible-sm-inline-block visible-md-inline-block visible-lg-inline-block"
123+
is-required="state.activeTab === 'weekly'"
124+
select-class="$ctrl.parsedOptions.formSelectClass"
125+
is-disabled="$ctrl.activeTab !== 'weekly'"
126+
on-change="$ctrl.regenerateCron();"
127+
model="$ctrl.state.weekly"
128+
use-24-hour-time="$ctrl.parsedOptions.use24HourTime"
129+
hide-seconds="$ctrl.parsedOptions.hideSeconds">
130+
</cron-gen-time-select>
148131
<system-timezone></system-timezone>
149132
</div>
150133
</div>
151134
</div>
152-
<div ng-if="state.activeTab === 'monthly'">
135+
<div ng-if="$ctrl.activeTab === 'monthly'">
153136
<div class="row">
154137
<div class="col-md-12">
155138
<input type="radio"
156139
value="specificDay"
157-
ng-change="regenerateCron(state)"
158-
ng-model="state.monthly.subTab"
140+
ng-change="$ctrl.regenerateCron()"
141+
ng-model="$ctrl.state.monthly.subTab"
159142
name="monthly-radio"
160143
checked="checked">
161-
Day
162-
<input class="form-control input-sm"
163-
type="number"
164-
min="1"
165-
max="31"
166-
ng-change="regenerateCron(state)"
167-
ng-model="state.monthly.specificDay.day"
168-
ng-required="state.activeTab === 'monthly' && state.monthly.subTab === 'specificDay'">
144+
On the
145+
<select class="month-days"
146+
ng-disabled="$ctrl.state.monthly.subTab !== 'specificDay'"
147+
ng-change="$ctrl.regenerateCron()"
148+
ng-model="$ctrl.state.monthly.specificDay.day"
149+
ng-required="$ctrl.activeTab === 'monthly' && $ctrl.state.monthly.subTab === 'specificDay'"
150+
ng-options="monthDaysWithLast as $ctrl.monthDayDisplay(monthDaysWithLast) for monthDaysWithLast in $ctrl.selectOptions.monthDaysWithLasts"
151+
ng-class="$ctrl.parsedOptions.formSelectClass">
152+
</select>
169153
of every
170154
<input class="form-control input-sm"
171155
type="number"
172156
min="1"
173157
max="11"
174-
ng-change="regenerateCron(state)"
175-
ng-model="state.monthly.specificDay.months"
176-
ng-required="state.activeTab === 'monthly' && state.monthly.subTab === 'specificDay'">
177-
month<span ng-if="state.monthly.specificDay.months > 1">s</span>
158+
ng-change="$ctrl.regenerateCron()"
159+
ng-model="$ctrl.state.monthly.specificDay.months"
160+
ng-required="$ctrl.activeTab === 'monthly' && $ctrl.state.monthly.subTab === 'specificDay'"
161+
ng-disabled="$ctrl.state.monthly.subTab !== 'specificDay'">
162+
month<span ng-if="$ctrl.state.monthly.specificDay.months > 1">s</span>
178163
</div>
179164
</div>
180165
<div class="row">
181166
<div class="col-md-12">
182167
<input type="radio"
183168
value="specificWeekDay"
184-
ng-change="regenerateCron(state)"
185-
ng-model="state.monthly.subTab"
169+
ng-change="$ctrl.regenerateCron()"
170+
ng-model="$ctrl.state.monthly.subTab"
186171
name="monthly-radio">
187172
<select class="form-control input-sm"
188-
ng-change="regenerateCron(state)"
189-
ng-model="state.monthly.specificWeekDay.monthWeek"
190-
ng-required="state.activeTab === 'monthly' && state.monthly.subTab === 'specificWeekDay'"
191-
ng-options="monthWeek as monthWeekDisplay(monthWeek) for monthWeek in selectOptions.monthWeeks">
173+
ng-change="$ctrl.regenerateCron()"
174+
ng-model="$ctrl.state.monthly.specificWeekDay.monthWeek"
175+
ng-required="$ctrl.activeTab === 'monthly' && $ctrl.state.monthly.subTab === 'specificWeekDay'"
176+
ng-options="monthWeek as $ctrl.monthWeekDisplay(monthWeek) for monthWeek in $ctrl.selectOptions.monthWeeks"
177+
ng-disabled="$ctrl.state.monthly.subTab !== 'specificWeekDay'">
192178
</select>
193179
<select class="form-control input-sm"
194-
ng-change="regenerateCron(state)"
195-
ng-model="state.monthly.specificWeekDay.day"
196-
ng-required="state.activeTab === 'monthly' && state.monthly.subTab === 'specificWeekDay'"
197-
ng-options="day as dayDisplay(day) for day in selectOptions.days">
180+
ng-change="$ctrl.regenerateCron()"
181+
ng-model="$ctrl.state.monthly.specificWeekDay.day"
182+
ng-required="$ctrl.activeTab === 'monthly' && $ctrl.state.monthly.subTab === 'specificWeekDay'"
183+
ng-options="day as $ctrl.dayDisplay(day) for day in $ctrl.selectOptions.days"
184+
ng-disabled="$ctrl.state.monthly.subTab !== 'specificWeekDay'">
198185
</select>
199186
of every
200187
<input class="form-control input-sm"
201188
type="number"
202189
min="1"
203190
max="11"
204-
ng-change="regenerateCron(state)"
205-
ng-model="state.monthly.specificWeekDay.months"
206-
ng-required="state.activeTab === 'monthly' && state.monthly.subTab === 'specificWeekDay'">
207-
month<span ng-if="state.monthly.specificWeekDay.months > 1">s</span>
191+
ng-change="$ctrl.regenerateCron()"
192+
ng-model="$ctrl.state.monthly.specificWeekDay.months"
193+
ng-required="$ctrl.activeTab === 'monthly' && $ctrl.state.monthly.subTab === 'specificWeekDay'"
194+
ng-disabled="$ctrl.state.monthly.subTab !== 'specificWeekDay'">
195+
month<span ng-if="$ctrl.state.monthly.specificWeekDay.months > 1">s</span>
208196
</div>
209197
</div>
210198
<div class="row">
211199
<div class="col-md-12">
212200
Start time
213-
<select class="form-control input-sm"
214-
ng-change="regenerateCron(state)"
215-
ng-required="state.activeTab === 'monthly'"
216-
ng-model="state.monthly.hours"
217-
ng-options="hour as padNumber(hour) for hour in selectOptions.hours">
218-
</select>
219-
:
220-
<select class="form-control input-sm"
221-
ng-change="regenerateCron(state)"
222-
ng-required="state.activeTab === 'monthly'"
223-
ng-model="state.monthly.minutes"
224-
ng-options="minute as padNumber(minute) for minute in selectOptions.minutes">
225-
</select>
201+
<cron-gen-time-select class="visible-xs-inline-block visible-sm-inline-block visible-md-inline-block visible-lg-inline-block"
202+
ng-if="$ctrl.state.monthly.subTab === 'specificDay'"
203+
is-required="state.activeTab === 'monthly'"
204+
select-class="$ctrl.parsedOptions.formSelectClass"
205+
is-disabled="$ctrl.activeTab !== 'monthly'"
206+
on-change="$ctrl.regenerateCron();"
207+
model="$ctrl.state.monthly.specificDay"
208+
use-24-hour-time="$ctrl.parsedOptions.use24HourTime"
209+
hide-seconds="$ctrl.parsedOptions.hideSeconds">
210+
</cron-gen-time-select>
211+
<cron-gen-time-select class="visible-xs-inline-block visible-sm-inline-block visible-md-inline-block visible-lg-inline-block"
212+
ng-if="$ctrl.state.monthly.subTab === 'specificWeekDay'"
213+
is-required="state.activeTab === 'monthly'"
214+
select-class="$ctrl.parsedOptions.formSelectClass"
215+
is-disabled="$ctrl.activeTab !== 'monthly'"
216+
on-change="$ctrl.regenerateCron();"
217+
model="$ctrl.state.monthly.specificWeekDay"
218+
use-24-hour-time="$ctrl.parsedOptions.use24HourTime"
219+
hide-seconds="$ctrl.parsedOptions.hideSeconds">
220+
</cron-gen-time-select>
226221
<system-timezone></system-timezone>
227222
</div>
228223
</div>
229224
</div>
230-
<div ng-if="state.activeTab === 'advanced'">
225+
<div ng-if="$ctrl.activeTab === 'advanced'">
231226
<div class="row">
232227
<div class="col-md-12">
233228
<strong>Expression</strong>
@@ -236,15 +231,15 @@
236231
class="form-control input-sm"
237232
cron-validator
238233
cron-validation-messages="validation.messages"
239-
ng-change="regenerateCron(state)"
240-
ng-model="state.advanced.expression">
234+
ng-change="$ctrl.regenerateCron()"
235+
ng-model="$ctrl.state.advanced.expression">
241236
</div>
242237
</div>
243238
<div class="row">
244239
<div class="col-md-12">
245-
<p>More details about how to create these expressions can be found <a
246-
href="http://www.quartz-scheduler.org/documentation/quartz-2.x/tutorials/crontrigger.html"
247-
target="_blank">here</a>.</p>
240+
<p>More details about how to create these expressions can be found
241+
<a href="http://www.quartz-scheduler.org/documentation/quartz-2.x/tutorials/crontrigger.html"
242+
target="_blank">here</a>.</p>
248243
</div>
249244
</div>
250245
<div class="row" ng-if="validation.messages.description && !validation.messages.error">

app/scripts/modules/core/pipeline/config/triggers/cron/cronTrigger.html

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55
</label>
66
<div class="col-md-9">
77
<cron-gen ng-model="vm.trigger.cronExpression"
8-
options="vm.cronOptions"></cron-gen>
8+
options="vm.cronOptions"
9+
template-url="spinnaker-custom-cron-picker-template"></cron-gen>
910
</div>
1011
</div>
1112

0 commit comments

Comments
 (0)