angular-cron-gen
Version:
A cron expression generator for AngularJS.
1 lines • 51.3 kB
JavaScript
!function(){"use strict";function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function s(e,t){for(var n=0;n<t.length;n++){var s=t[n];s.enumerable=s.enumerable||!1,s.configurable=!0,"value"in s&&(s.writable=!0),Object.defineProperty(e,s.key,s)}}function t(e,t,n){return t&&s(e.prototype,t),n&&s(e,n),e}function T(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){if("undefined"==typeof Symbol||!(Symbol.iterator in Object(e)))return;var n=[],s=!0,a=!1,r=void 0;try{for(var i,c=e[Symbol.iterator]();!(s=(i=c.next()).done)&&(n.push(i.value),!t||n.length!==t);s=!0);}catch(e){a=!0,r=e}finally{try{s||null==c.return||c.return()}finally{if(a)throw r}}return n}(e,t)||n(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function r(e){return function(e){if(Array.isArray(e))return i(e)}(e)||function(e){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(e))return Array.from(e)}(e)||n(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function n(e,t){if(e){if("string"==typeof e)return i(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?i(e,t):void 0}}function i(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,s=new Array(t);n<t;n++)s[n]=e[n];return s}function c(e,t){var n=this;a(this,c),this.cronGenService=t,this.selectOptions={minutes:t.range(60),seconds:t.range(60),hourTypes:["AM","PM"]},e.$watch("$ctrl.use24HourTime",function(){n.selectOptions.hours=n.use24HourTime?n.cronGenService.range(24):n.cronGenService.range(1,13)})}var l=["quartz"],o={SUN:"Sunday",MON:"Monday",TUE:"Tuesday",WED:"Wednesday",THU:"Thursday",FRI:"Friday",SAT:"Saturday"},d={"#1":"First","#2":"Second","#3":"Third","#4":"Fourth","#5":"Fifth",L:"Last"},y={1:"January",2:"February",3:"March",4:"April",5:"May",6:"June",7:"July",8:"August",9:"September",10:"October",11:"November",12:"December"},h=1,D=2,k=3,e=function(){function s(e,t){var n=this;if(a(this,s),this.parsedOptions=this.mergeDefaultOptions(this.options),angular.extend(this,{cronGenService:t,cronFormat:"quartz",currentState:h,activeTab:function(){if(!n.parsedOptions.hideMinutesTab)return"minutes";if(!n.parsedOptions.hideHourlyTab)return"hourly";if(!n.parsedOptions.hideDailyTab)return"daily";if(!n.parsedOptions.hideWeeklyTab)return"weekly";if(!n.parsedOptions.hideMonthlyTab)return"monthly";if(!n.parsedOptions.hideYearlyTab)return"yearly";if(!n.parsedOptions.hideAdvancedTab)return"advanced";throw"No tabs available to make active"}(),selectOptions:t.selectOptions(),state:{minutes:{minutes:1,seconds:0},hourly:{hours:1,minutes:0,seconds:0},daily:{subTab:"everyDays",everyDays:{days:1,hours:this.parsedOptions.use24HourTime?0:1,minutes:0,seconds:0,hourType:this.parsedOptions.use24HourTime?null:"AM"},everyWeekDay:{hours:this.parsedOptions.use24HourTime?0:1,minutes:0,seconds:0,hourType:this.parsedOptions.use24HourTime?null:"AM"}},weekly:{MON:!0,TUE:!1,WED:!1,THU:!1,FRI:!1,SAT:!1,SUN:!1,hours:this.parsedOptions.use24HourTime?0:1,minutes:0,seconds:0,hourType:this.parsedOptions.use24HourTime?null:"AM"},monthly:{subTab:"specificDay",specificDay:{day:"1",months:1,hours:this.parsedOptions.use24HourTime?0:1,minutes:0,seconds:0,hourType:this.parsedOptions.use24HourTime?null:"AM"},specificWeekDay:{monthWeek:"#1",day:"MON",months:1,hours:this.parsedOptions.use24HourTime?0:1,minutes:0,seconds:0,hourType:this.parsedOptions.use24HourTime?null:"AM"}},yearly:{subTab:"specificMonthDay",specificMonthDay:{month:1,day:"1",hours:this.parsedOptions.use24HourTime?0:1,minutes:0,seconds:0,hourType:this.parsedOptions.use24HourTime?null:"AM"},specificMonthWeek:{monthWeek:"#1",day:"MON",month:1,hours:this.parsedOptions.use24HourTime?0:1,minutes:0,seconds:0,hourType:this.parsedOptions.use24HourTime?null:"AM"}},advanced:{expression:"0 15 10 L-2 * ?"}}}),-1==l.indexOf(this.cronFormat))throw"Desired cron format (".concat(this.cronFormat,") is not available");e.$watch("$ctrl.ngModel",function(e){return n.handleModelChange(e)}),e.$watch("$ctrl.options",function(e){return n.parsedOptions=n.mergeDefaultOptions(e)},!0)}return s.$inject=["$scope","cronGenService"],t(s,[{key:"$onInit",value:function(){var t=this;this.formCtrl&&this.name&&(this.ngModelCtrl.$validators.testCronExpr=function(e){return t.cronGenService.isValid(t.cronFormat,e)})}},{key:"setActiveTab",value:function(e,t){e.preventDefault(),this.ngDisabled||(this.activeTab=t,this.regenerateCron())}},{key:"dayDisplay",value:function(e){return o[e]}},{key:"monthWeekDisplay",value:function(e){return d[e]}},{key:"monthDisplay",value:function(e){return y[e]}},{key:"monthDayDisplay",value:function(e){return"L"===e?"Last Day":"LW"===e?"Last Weekday":"1W"===e?"First Weekday":"".concat(e).concat(this.cronGenService.appendInt(e)," Day")}},{key:"processHour",value:function(e){return this.parsedOptions.use24HourTime?e:(e+11)%12+1}},{key:"getHourType",value:function(e){return this.parsedOptions.use24HourTime?null:12<=e?"PM":"AM"}},{key:"hourToCron",value:function(e,t){return this.parsedOptions.use24HourTime?e:"AM"===t?12===e?0:e:12===e?12:e+12}},{key:"mergeDefaultOptions",value:function(e){return angular.extend({formInputClass:"form-control cron-gen-input",formSelectClass:"form-control cron-gen-select",formRadioClass:"cron-gen-radio",formCheckboxClass:"cron-gen-checkbox",hideMinutesTab:!1,hideHourlyTab:!1,hideDailyTab:!1,hideWeeklyTab:!1,hideMonthlyTab:!1,hideYearlyTab:!1,hideAdvancedTab:!0,use24HourTime:!1,hideSeconds:!1},e)}},{key:"regenerateCron",value:function(){var n=this;switch(this.currentState=D,this.activeTab){case"minutes":this.ngModel="".concat(this.state.minutes.seconds," 0/").concat(this.state.minutes.minutes," * 1/1 * ? *");break;case"hourly":this.ngModel="".concat(this.state.hourly.seconds," ").concat(this.state.hourly.minutes," 0/").concat(this.state.hourly.hours," 1/1 * ? *");break;case"daily":switch(this.state.daily.subTab){case"everyDays":this.ngModel="".concat(this.state.daily.everyDays.seconds," ").concat(this.state.daily.everyDays.minutes," ").concat(this.hourToCron(this.state.daily.everyDays.hours,this.state.daily.everyDays.hourType)," 1/").concat(this.state.daily.everyDays.days," * ? *");break;case"everyWeekDay":this.ngModel="".concat(this.state.daily.everyWeekDay.seconds," ").concat(this.state.daily.everyWeekDay.minutes," ").concat(this.hourToCron(this.state.daily.everyWeekDay.hours,this.state.daily.everyWeekDay.hourType)," ? * MON-FRI *");break;default:throw"Invalid cron daily subtab selection"}break;case"weekly":var e=this.selectOptions.days.reduce(function(e,t){return n.state.weekly[t]?e.concat([t]):e},[]).join(",");this.ngModel="".concat(this.state.weekly.seconds," ").concat(this.state.weekly.minutes," ").concat(this.hourToCron(this.state.weekly.hours,this.state.weekly.hourType)," ? * ").concat(e," *");break;case"monthly":switch(this.state.monthly.subTab){case"specificDay":this.ngModel="".concat(this.state.monthly.specificDay.seconds," ").concat(this.state.monthly.specificDay.minutes," ").concat(this.hourToCron(this.state.monthly.specificDay.hours,this.state.monthly.specificDay.hourType)," ").concat(this.state.monthly.specificDay.day," 1/").concat(this.state.monthly.specificDay.months," ? *");break;case"specificWeekDay":this.ngModel="".concat(this.state.monthly.specificWeekDay.seconds," ").concat(this.state.monthly.specificWeekDay.minutes," ").concat(this.hourToCron(this.state.monthly.specificWeekDay.hours,this.state.monthly.specificWeekDay.hourType)," ? 1/").concat(this.state.monthly.specificWeekDay.months," ").concat(this.state.monthly.specificWeekDay.day).concat(this.state.monthly.specificWeekDay.monthWeek," *");break;default:throw"Invalid cron monthly subtab selection"}break;case"yearly":switch(this.state.yearly.subTab){case"specificMonthDay":this.ngModel="".concat(this.state.yearly.specificMonthDay.seconds," ").concat(this.state.yearly.specificMonthDay.minutes," ").concat(this.hourToCron(this.state.yearly.specificMonthDay.hours,this.state.yearly.specificMonthDay.hourType)," ").concat(this.state.yearly.specificMonthDay.day," ").concat(this.state.yearly.specificMonthDay.month," ? *");break;case"specificMonthWeek":this.ngModel="".concat(this.state.yearly.specificMonthWeek.seconds," ").concat(this.state.yearly.specificMonthWeek.minutes," ").concat(this.hourToCron(this.state.yearly.specificMonthWeek.hours,this.state.yearly.specificMonthWeek.hourType)," ? ").concat(this.state.yearly.specificMonthWeek.month," ").concat(this.state.yearly.specificMonthWeek.day).concat(this.state.yearly.specificMonthWeek.monthWeek," *");break;default:throw"Invalid cron yearly subtab selection"}break;case"advanced":this.ngModel=this.state.advanced.expression;break;default:throw"Invalid cron active tab selection"}}},{key:"handleModelChange",value:function(e){var t=this;if(this.currentState!==D){if(this.currentState=k,e){var n=e.split(" ");if(6!==n.length&&7!==n.length)throw"Unsupported cron expression. Expression must be 6 or 7 segments";var s=T(n,6),a=s[0],r=s[1],i=s[2],c=s[3],l=s[4],o=s[5];if(e.match(/\d+ 0\/\d+ \* 1\/1 \* \? \*/))this.activeTab="minutes",this.state.minutes.minutes=parseInt(r.substring(2)),this.state.minutes.seconds=parseInt(a);else if(e.match(/\d+ \d+ 0\/\d+ 1\/1 \* \? \*/))this.activeTab="hourly",this.state.hourly.hours=parseInt(i.substring(2)),this.state.hourly.minutes=parseInt(r),this.state.hourly.seconds=parseInt(a);else if(e.match(/\d+ \d+ \d+ 1\/\d+ \* \? \*/)){this.activeTab="daily",this.state.daily.subTab="everyDays",this.state.daily.everyDays.days=parseInt(c.substring(2));var d=parseInt(i);this.state.daily.everyDays.hours=this.processHour(d),this.state.daily.everyDays.hourType=this.getHourType(d),this.state.daily.everyDays.minutes=parseInt(r),this.state.daily.everyDays.seconds=parseInt(a)}else if(e.match(/\d+ \d+ \d+ \? \* MON-FRI \*/)){this.activeTab="daily",this.state.daily.subTab="everyWeekDay";var y=parseInt(i);this.state.daily.everyWeekDay.hours=this.processHour(y),this.state.daily.everyWeekDay.hourType=this.getHourType(y),this.state.daily.everyWeekDay.minutes=parseInt(r),this.state.daily.everyWeekDay.seconds=parseInt(a)}else if(e.match(/\d+ \d+ \d+ \? \* (MON|TUE|WED|THU|FRI|SAT|SUN)(,(MON|TUE|WED|THU|FRI|SAT|SUN))* \*/)){this.activeTab="weekly",this.selectOptions.days.forEach(function(e){return t.state.weekly[e]=!1}),o.split(",").forEach(function(e){return t.state.weekly[e]=!0});var h=parseInt(i);this.state.weekly.hours=this.processHour(h),this.state.weekly.hourType=this.getHourType(h),this.state.weekly.minutes=parseInt(r),this.state.weekly.seconds=parseInt(a)}else if(e.match(/\d+ \d+ \d+ (\d+|L|LW|1W) 1\/\d+ \? \*/)){this.activeTab="monthly",this.state.monthly.subTab="specificDay",this.state.monthly.specificDay.day=c,this.state.monthly.specificDay.months=parseInt(l.substring(2));var u=parseInt(i);this.state.monthly.specificDay.hours=this.processHour(u),this.state.monthly.specificDay.hourType=this.getHourType(u),this.state.monthly.specificDay.minutes=parseInt(r),this.state.monthly.specificDay.seconds=parseInt(a)}else if(e.match(/\d+ \d+ \d+ \? 1\/\d+ (MON|TUE|WED|THU|FRI|SAT|SUN)((#[1-5])|L) \*/)){var p=o.substr(0,3),m=o.substr(3);this.activeTab="monthly",this.state.monthly.subTab="specificWeekDay",this.state.monthly.specificWeekDay.monthWeek=m,this.state.monthly.specificWeekDay.day=p,this.state.monthly.specificWeekDay.months=parseInt(l.substring(2));var g=parseInt(i);this.state.monthly.specificWeekDay.hours=this.processHour(g),this.state.monthly.specificWeekDay.hourType=this.getHourType(g),this.state.monthly.specificWeekDay.minutes=parseInt(r),this.state.monthly.specificWeekDay.seconds=parseInt(a)}else if(e.match(/\d+ \d+ \d+ (\d+|L|LW|1W) \d+ \? \*/)){this.activeTab="yearly",this.state.yearly.subTab="specificMonthDay",this.state.yearly.specificMonthDay.month=parseInt(l),this.state.yearly.specificMonthDay.day=c;var b=parseInt(i);this.state.yearly.specificMonthDay.hours=this.processHour(b),this.state.yearly.specificMonthDay.hourType=this.getHourType(b),this.state.yearly.specificMonthDay.minutes=parseInt(r),this.state.yearly.specificMonthDay.seconds=parseInt(a)}else if(e.match(/\d+ \d+ \d+ \? \d+ (MON|TUE|WED|THU|FRI|SAT|SUN)((#[1-5])|L) \*/)){var $=o.substr(0,3),f=o.substr(3);this.activeTab="yearly",this.state.yearly.subTab="specificMonthWeek",this.state.yearly.specificMonthWeek.monthWeek=f,this.state.yearly.specificMonthWeek.day=$,this.state.yearly.specificMonthWeek.month=parseInt(l);var v=parseInt(i);this.state.yearly.specificMonthWeek.hours=this.processHour(v),this.state.yearly.specificMonthWeek.hourType=this.getHourType(v),this.state.yearly.specificMonthWeek.minutes=parseInt(r),this.state.yearly.specificMonthWeek.seconds=parseInt(a)}else this.activeTab="advanced",this.state.advanced.expression=e}}else this.currentState=k}}]),s}(),u=/^\s*($|#|\w+\s*=|(\?|\*|(?:[0-5]?\d)(?:(?:-|\/|\,)(?:[0-5]?\d))?(?:,(?:[0-5]?\d)(?:(?:-|\/|\,)(?:[0-5]?\d))?)*)\s+(\?|\*|(?:[0-5]?\d)(?:(?:-|\/|\,)(?:[0-5]?\d))?(?:,(?:[0-5]?\d)(?:(?:-|\/|\,)(?:[0-5]?\d))?)*)\s+(\?|\*|(?:[01]?\d|2[0-3])(?:(?:-|\/|\,)(?:[01]?\d|2[0-3]))?(?:,(?:[01]?\d|2[0-3])(?:(?:-|\/|\,)(?:[01]?\d|2[0-3]))?)*)\s+(\?|\*|(?:0?[1-9]|[12]\d|3[01])(?:(?:-|\/|\,)(?:0?[1-9]|[12]\d|3[01]))?(?:,(?:0?[1-9]|[12]\d|3[01])(?:(?:-|\/|\,)(?:0?[1-9]|[12]\d|3[01]))?)*)\s+(\?|\*|(?:[1-9]|1[012])(?:(?:-|\/|\,)(?:[1-9]|1[012]))?(?:L|W)?(?:,(?:[1-9]|1[012])(?:(?:-|\/|\,)(?:[1-9]|1[012]))?(?:L|W)?)*|\?|\*|(?:JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)(?:(?:-)(?:JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC))?(?:,(?:JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)(?:(?:-)(?:JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC))?)*)\s+(\?|\*|(?:[1-7]|MON|TUE|WED|THU|FRI|SAT|SUN)(?:(?:-|\/|\,|#)(?:[1-5]))?(?:L)?(?:,(?:[1-7]|MON|TUE|WED|THU|FRI|SAT|SUN)(?:(?:-|\/|\,|#)(?:[1-5]))?(?:L)?)*|\?|\*|(?:MON|TUE|WED|THU|FRI|SAT|SUN)(?:(?:-)(?:MON|TUE|WED|THU|FRI|SAT|SUN))?(?:,(?:MON|TUE|WED|THU|FRI|SAT|SUN)(?:(?:-)(?:MON|TUE|WED|THU|FRI|SAT|SUN))?)*)(|\s)+(\?|\*|(?:|\d{4})(?:(?:-|\/|\,)(?:|\d{4}))?(?:,(?:|\d{4})(?:(?:-|\/|\,)(?:|\d{4}))?)*))$/,p=function(){function e(){a(this,e)}return t(e,[{key:"isValid",value:function(e,t){if(!t)return!1;var n=t.toUpperCase();switch(e){case"quartz":return!!n.match(u);default:throw"Desired cron format (".concat(e,") is not available")}}},{key:"appendInt",value:function(e){var t="".concat(e);if(1<t.length&&"1"===t.charAt(t.length-2))return"th";switch(t.charAt(t.length-1)){case"1":return"st";case"2":return"nd";case"3":return"rd";default:return"th"}}},{key:"padNumber",value:function(e){return 1==="".concat(e).length?"0".concat(e):"".concat(e)}},{key:"range",value:function(n,s){if(void 0===s&&(s=n,n=0),n<0||s<0)throw"Range values must be positive values";return n<s?r(new Array(s-n)).map(function(e,t){return t+n}):n<s?r(new Array(n-s)).map(function(e,t){return s-t}):[]}},{key:"selectOptions",value:function(){return{months:this.range(1,13),monthWeeks:["#1","#2","#3","#4","#5","L"],days:["MON","TUE","WED","THU","FRI","SAT","SUN"],minutes:this.range(1,60),fullMinutes:this.range(60),seconds:this.range(60),hours:this.range(1,24),monthDays:this.range(1,32),monthDaysWithLasts:["1W"].concat(r(r(new Array(31)).map(function(e,t){return"".concat(t+1)})),["LW","L"])}}}]),e}();c.$inject=["$scope","cronGenService"],angular.module("angular-cron-gen",[]).service("cronGenService",p).component("cronGenTimeSelect",{bindings:{isDisabled:"<",onChange:"&",isRequired:"<",model:"=",selectClass:"<",use24HourTime:"<",hideSeconds:"<",namePrefix:"@"},templateUrl:"angular-cron-gen/cron-gen-time-select.html",controller:c}).component("cronGen",{bindings:{ngModel:"=",ngDisabled:"<",options:"<",cronFormat:"@",templateUrl:"@",name:"@"},require:{ngModelCtrl:"ngModel",ngDisabledCtrl:"?ngDisabled",formCtrl:"^?form"},templateUrl:["$attrs",function(e){return e.templateUrl||"angular-cron-gen/cron-gen.html"}],controller:e})}(),angular.module("angular-cron-gen").run(["$templateCache",function(e){e.put("angular-cron-gen/cron-gen-time-select.html",'<div class="inline-block">\n <select class="hours"\n name="{{namePrefix}}Hours"\n ng-disabled="$ctrl.isDisabled"\n ng-change="$ctrl.onChange()"\n ng-required="$ctrl.isRequired"\n ng-model="$ctrl.model.hours"\n ng-options="hour as $ctrl.cronGenService.padNumber(hour) for hour in $ctrl.selectOptions.hours"\n ng-class="$ctrl.selectClass">\n </select>\n <select class="minutes"\n name="{{namePrefix}}Minutes"\n ng-disabled="$ctrl.isDisabled"\n ng-change="$ctrl.onChange()"\n ng-required="$ctrl.isRequired"\n ng-model="$ctrl.model.minutes"\n ng-options="minute as $ctrl.cronGenService.padNumber(minute) for minute in $ctrl.selectOptions.minutes"\n ng-class="$ctrl.selectClass">\n </select>\n <select class="seconds"\n name="{{namePrefix}}Seconds"\n ng-show="!$ctrl.hideSeconds"\n ng-disabled="$ctrl.isDisabled"\n ng-change="$ctrl.onChange()"\n ng-required="$ctrl.isRequired"\n ng-model="$ctrl.model.seconds"\n ng-options="second as $ctrl.cronGenService.padNumber(second) for second in $ctrl.selectOptions.seconds"\n ng-class="$ctrl.selectClass">\n </select>\n <select class="hour-types"\n name="{{namePrefix}}HourType"\n ng-if="!$ctrl.use24HourTime"\n ng-disabled="$ctrl.isDisabled"\n ng-change="$ctrl.onChange()"\n ng-model="$ctrl.model.hourType"\n ng-options="hourType as hourType for hourType in $ctrl.selectOptions.hourTypes"\n ng-required="$ctrl.isRequired"\n ng-class="$ctrl.selectClass">\n </select>\n</div>'),e.put("angular-cron-gen/cron-gen.html",'<!doctype html>\n<div class="cron-gen-main" ng-cloak>\n <ul class="nav nav-tabs tab-nav" role="tablist">\n <li ng-class="{\'active\': $ctrl.activeTab === \'minutes\', \'disabled\': $ctrl.ngDisabled}"\n ng-show="!$ctrl.parsedOptions.hideMinutesTab"\n role="presentation">\n <a href="#"\n aria-controls="minutes"\n role="tab"\n ng-click="$ctrl.setActiveTab($event, \'minutes\')">\n Minutes\n </a>\n </li>\n <li role="presentation"\n ng-show="!$ctrl.parsedOptions.hideHourlyTab"\n ng-class="{\'active\': $ctrl.activeTab === \'hourly\', \'disabled\': $ctrl.ngDisabled}">\n <a href="#"\n aria-controls="hourly"\n role="tab"\n ng-click="$ctrl.setActiveTab($event, \'hourly\')">\n Hourly\n </a>\n </li>\n <li role="presentation"\n ng-show="!$ctrl.parsedOptions.hideDailyTab"\n ng-class="{\'active\': $ctrl.activeTab === \'daily\', \'disabled\': $ctrl.ngDisabled}">\n <a href="#"\n aria-controls="daily"\n role="tab"\n ng-click="$ctrl.setActiveTab($event, \'daily\')">\n Daily\n </a>\n </li>\n <li role="presentation"\n ng-show="!$ctrl.parsedOptions.hideWeeklyTab"\n ng-class="{\'active\': $ctrl.activeTab === \'weekly\', \'disabled\': $ctrl.ngDisabled}">\n <a href="#" aria-controls="weekly"\n role="tab"\n ng-click="$ctrl.setActiveTab($event, \'weekly\')">\n Weekly\n </a>\n </li>\n <li role="presentation"\n ng-show="!$ctrl.parsedOptions.hideMonthlyTab"\n ng-class="{\'active\': $ctrl.activeTab === \'monthly\', \'disabled\': $ctrl.ngDisabled}">\n <a href="#"\n aria-controls="monthly"\n role="tab"\n ng-click="$ctrl.setActiveTab($event, \'monthly\')">\n Monthly\n </a>\n </li>\n <li role="presentation"\n ng-show="!$ctrl.parsedOptions.hideYearlyTab"\n ng-class="{\'active\': $ctrl.activeTab === \'yearly\', \'disabled\': $ctrl.ngDisabled}">\n <a href="#"\n aria-controls="yearly"\n role="tab"\n ng-click="$ctrl.setActiveTab($event, \'yearly\')">\n Yearly\n </a>\n </li>\n <li role="presentation"\n ng-show="!$ctrl.parsedOptions.hideAdvancedTab"\n ng-class="{\'active\': $ctrl.activeTab === \'advanced\', \'disabled\': $ctrl.ngDisabled}">\n <a href="#"\n aria-controls="advanced"\n role="tab"\n ng-click="$ctrl.setActiveTab($event, \'advanced\')">\n Advanced\n </a>\n </li>\n </ul>\n <div class="cron-gen-container">\n <div class="row">\n <div class="col-xs-12">\n <div class="tab-content">\n <div class="tab-pane"\n ng-show="!$ctrl.parsedOptions.hideMinutesTab"\n ng-class="{\'active\': $ctrl.activeTab === \'minutes\'}">\n <div class="well well-small">\n Every\n <select class="minutes"\n name="minutesMinutes"\n ng-disabled="$ctrl.ngDisabled || $ctrl.activeTab !== \'minutes\'"\n ng-change="$ctrl.regenerateCron()"\n ng-model="$ctrl.state.minutes.minutes"\n ng-required="$ctrl.activeTab === \'minutes\'"\n ng-options="minute as minute for minute in $ctrl.selectOptions.minutes"\n ng-class="$ctrl.parsedOptions.formSelectClass">\n </select>\n minute(s)\n <span ng-show="!$ctrl.parsedOptions.hideSeconds">on second</span>\n <select class="seconds"\n name="minutesSeconds"\n ng-show="!$ctrl.parsedOptions.hideSeconds"\n ng-disabled="$ctrl.ngDisabled || $ctrl.activeTab !== \'minutes\'"\n ng-change="$ctrl.regenerateCron()"\n ng-model="$ctrl.state.minutes.seconds"\n ng-required="$ctrl.activeTab === \'minutes\'"\n ng-options="second as $ctrl.cronGenService.padNumber(second) for second in $ctrl.selectOptions.seconds"\n ng-class="$ctrl.parsedOptions.formSelectClass">\n </select>\n </div>\n </div>\n <div class="tab-pane"\n ng-show="!$ctrl.parsedOptions.hideHourlyTab"\n ng-class="{\'active\': $ctrl.activeTab === \'hourly\'}">\n <div class="well well-small">\n Every\n <select class="hours"\n name="hourlyHours"\n ng-disabled="$ctrl.ngDisabled || $ctrl.activeTab !== \'hourly\'"\n ng-change="$ctrl.regenerateCron()"\n ng-model="$ctrl.state.hourly.hours"\n ng-required="$ctrl.activeTab === \'hourly\'"\n ng-options="hour as hour for hour in $ctrl.selectOptions.hours"\n ng-class="$ctrl.parsedOptions.formSelectClass">\n </select>\n hour(s) on minute\n <select class="minutes"\n name="hourlyMinutes"\n ng-disabled="$ctrl.ngDisabled || $ctrl.activeTab !== \'hourly\'"\n ng-change="$ctrl.regenerateCron()"\n ng-model="$ctrl.state.hourly.minutes"\n ng-required="$ctrl.activeTab === \'hourly\'"\n ng-options="minute as $ctrl.cronGenService.padNumber(minute) for minute in $ctrl.selectOptions.fullMinutes"\n ng-class="$ctrl.parsedOptions.formSelectClass">\n </select>\n <span ng-show="!$ctrl.parsedOptions.hideSeconds">and second</span>\n <select class="seconds"\n name="hourlySeconds"\n ng-show="!$ctrl.parsedOptions.hideSeconds"\n ng-disabled="$ctrl.ngDisabled || $ctrl.activeTab !== \'hourly\'"\n ng-change="$ctrl.regenerateCron()"\n ng-model="$ctrl.state.hourly.seconds"\n ng-required="$ctrl.activeTab === \'hourly\'"\n ng-options="second as $ctrl.cronGenService.padNumber(second) for second in $ctrl.selectOptions.seconds"\n ng-class="$ctrl.parsedOptions.formSelectClass">\n </select>\n </div>\n </div>\n <div class="tab-pane"\n ng-show="!$ctrl.parsedOptions.hideDailyTab"\n ng-class="{\'active\': $ctrl.activeTab === \'daily\'}">\n <div class="well well-small">\n <input type="radio"\n value="everyDays"\n name="daily-radio"\n ng-disabled="$ctrl.ngDisabled"\n ng-change="$ctrl.regenerateCron()"\n ng-model="$ctrl.state.daily.subTab"\n ng-class="$ctrl.state.formRadioClass"\n checked="checked">\n Every\n <select class="days"\n name="dailyEveryDaysDays"\n ng-disabled="$ctrl.ngDisabled || $ctrl.activeTab !== \'daily\' || $ctrl.state.daily.subTab !== \'everyDays\'"\n ng-change="$ctrl.regenerateCron()"\n ng-model="$ctrl.state.daily.everyDays.days"\n ng-required="$ctrl.activeTab === \'daily\' && $ctrl.state.daily.subTab === \'everyDays\'"\n ng-options="monthDay as monthDay for monthDay in $ctrl.selectOptions.monthDays"\n ng-class="$ctrl.parsedOptions.formSelectClass">\n </select>\n day(s) at\n <cron-gen-time-select\n is-disabled="$ctrl.ngDisabled || $ctrl.activeTab !== \'daily\' || $ctrl.state.daily.subTab !== \'everyDays\'"\n on-change="$ctrl.regenerateCron()"\n name-prefix="dailyEveryDays"\n is-required="$ctrl.activeTab === \'daily\' && $ctrl.state.daily.subTab === \'everyDays\'"\n model="$ctrl.state.daily.everyDays"\n select-class="$ctrl.parsedOptions.formSelectClass"\n use-24-hour-time="$ctrl.parsedOptions.use24HourTime"\n hide-seconds="$ctrl.parsedOptions.hideSeconds">\n </cron-gen-time-select>\n </div>\n <div class="well well-small">\n <input type="radio"\n value="everyWeekDay"\n ng-disabled="$ctrl.ngDisabled"\n ng-change="$ctrl.regenerateCron()"\n ng-model="$ctrl.state.daily.subTab"\n ng-class="$ctrl.state.formRadioClass"\n name="daily-radio">\n Every week day (Monday through Friday) at\n <cron-gen-time-select\n is-disabled="$ctrl.ngDisabled || $ctrl.activeTab !== \'daily\' || $ctrl.state.daily.subTab !== \'everyWeekDay\'"\n on-change="$ctrl.regenerateCron()"\n name-prefix="dailyEveryWeekDay"\n is-required="$ctrl.activeTab === \'daily\' && $ctrl.state.daily.subTab === \'everyWeekDay\'"\n model="$ctrl.state.daily.everyWeekDay"\n select-class="$ctrl.parsedOptions.formSelectClass"\n use-24-hour-time="$ctrl.parsedOptions.use24HourTime"\n hide-seconds="$ctrl.parsedOptions.hideSeconds">\n </cron-gen-time-select>\n </div>\n </div>\n <div class="tab-pane"\n ng-show="!$ctrl.parsedOptions.hideWeeklyTab"\n ng-class="{\'active\': $ctrl.activeTab === \'weekly\'}">\n <div class="well well-small row">\n <div class="col-sm-6">\n <input type="checkbox"\n name="weeklyMON"\n ng-disabled="$ctrl.ngDisabled || $ctrl.activeTab !== \'weekly\'"\n ng-change="$ctrl.regenerateCron()"\n ng-model="$ctrl.state.weekly.MON"\n ng-class="$ctrl.parsedOptions.formCheckboxClass">\n Monday\n </div>\n <div class="col-sm-6">\n <input type="checkbox"\n name="weeklyTUE"\n ng-disabled="$ctrl.ngDisabled || $ctrl.activeTab !== \'weekly\'"\n ng-change="$ctrl.regenerateCron()"\n ng-model="$ctrl.state.weekly.TUE"\n ng-class="$ctrl.parsedOptions.formCheckboxClass">\n Tuesday\n </div>\n <div class="col-sm-6">\n <input type="checkbox"\n name="weeklyWED"\n ng-disabled="$ctrl.ngDisabled || $ctrl.activeTab !== \'weekly\'"\n ng-change="$ctrl.regenerateCron()"\n ng-model="$ctrl.state.weekly.WED"\n ng-class="$ctrl.parsedOptions.formCheckboxClass">\n Wednesday\n </div>\n <div class="col-sm-6">\n <input type="checkbox"\n name="weeklyTHU"\n ng-disabled="$ctrl.ngDisabled || $ctrl.activeTab !== \'weekly\'"\n ng-change="$ctrl.regenerateCron()"\n ng-model="$ctrl.state.weekly.THU"\n ng-class="$ctrl.parsedOptions.formCheckboxClass">\n Thursday\n </div>\n <div class="col-sm-6">\n <input type="checkbox"\n name="weeklyFRI"\n ng-disabled="$ctrl.ngDisabled || $ctrl.activeTab !== \'weekly\'"\n ng-change="$ctrl.regenerateCron()"\n ng-model="$ctrl.state.weekly.FRI"\n ng-class="$ctrl.parsedOptions.formCheckboxClass">\n Friday\n </div>\n <div class="col-sm-6">\n <input type="checkbox"\n name="weeklySAT"\n ng-disabled="$ctrl.ngDisabled || $ctrl.activeTab !== \'weekly\'"\n ng-change="$ctrl.regenerateCron()"\n ng-model="$ctrl.state.weekly.SAT"\n ng-class="$ctrl.parsedOptions.formCheckboxClass">\n Saturday\n </div>\n <div class="col-sm-6">\n <input type="checkbox"\n name="weeklySUN"\n ng-disabled="$ctrl.ngDisabled || $ctrl.activeTab !== \'weekly\'"\n ng-change="$ctrl.regenerateCron()"\n ng-model="$ctrl.state.weekly.SUN"\n ng-class="$ctrl.parsedOptions.formCheckboxClass">\n Sunday\n </div>\n </div>\n Start time\n <cron-gen-time-select\n is-disabled="$ctrl.ngDisabled || $ctrl.activeTab !== \'weekly\'"\n on-change="$ctrl.regenerateCron()"\n name-prefix="weekly"\n is-required="$ctrl.activeTab === \'weekly\'"\n model="$ctrl.state.weekly"\n select-class="$ctrl.parsedOptions.formSelectClass"\n use-24-hour-time="$ctrl.parsedOptions.use24HourTime"\n hide-seconds="$ctrl.parsedOptions.hideSeconds">\n </cron-gen-time-select>\n </div>\n <div class="tab-pane"\n ng-show="!$ctrl.parsedOptions.hideMonthlyTab"\n ng-class="{\'active\': $ctrl.activeTab === \'monthly\'}">\n <div class="well well-small">\n <input type="radio"\n value="specificDay"\n ng-disabled="$ctrl.ngDisabled"\n ng-change="$ctrl.regenerateCron()"\n ng-model="$ctrl.state.monthly.subTab"\n ng-class="$ctrl.state.formRadioClass"\n name="monthly-radio"\n checked="checked">\n On the\n <select class="month-days"\n name="monthlySpecificDayDay"\n ng-disabled="$ctrl.ngDisabled || $ctrl.activeTab !== \'monthly\' || $ctrl.state.monthly.subTab !== \'specificDay\'"\n ng-change="$ctrl.regenerateCron()"\n ng-model="$ctrl.state.monthly.specificDay.day"\n ng-required="$ctrl.activeTab === \'monthly\' && $ctrl.state.monthly.subTab === \'specificDay\'"\n ng-options="monthDaysWithLast as $ctrl.monthDayDisplay(monthDaysWithLast) for monthDaysWithLast in $ctrl.selectOptions.monthDaysWithLasts"\n ng-class="$ctrl.parsedOptions.formSelectClass">\n </select>\n of every\n <select class="months-small"\n name="monthlySpecificDayMonths"\n ng-disabled="$ctrl.ngDisabled || $ctrl.activeTab !== \'monthly\' || $ctrl.state.monthly.subTab !== \'specificDay\'"\n ng-change="$ctrl.regenerateCron()"\n ng-model="$ctrl.state.monthly.specificDay.months"\n ng-required="$ctrl.activeTab === \'monthly\' && $ctrl.state.monthly.subTab === \'specificDay\'"\n ng-options="month as month for month in $ctrl.selectOptions.months"\n ng-class="$ctrl.parsedOptions.formSelectClass">\n </select>\n month(s) at\n <cron-gen-time-select\n is-disabled="$ctrl.ngDisabled || $ctrl.activeTab !== \'monthly\' || $ctrl.state.monthly.subTab !== \'specificDay\'"\n on-change="$ctrl.regenerateCron()"\n name-prefix="monthlySpecificDay"\n is-required="$ctrl.activeTab === \'monthly\' && $ctrl.state.monthly.subTab === \'specificDay\'"\n model="$ctrl.state.monthly.specificDay"\n select-class="$ctrl.parsedOptions.formSelectClass"\n use-24-hour-time="$ctrl.parsedOptions.use24HourTime"\n hide-seconds="$ctrl.parsedOptions.hideSeconds">\n </cron-gen-time-select>\n </div>\n <div class="well well-small">\n <input type="radio"\n value="specificWeekDay"\n ng-disabled="$ctrl.ngDisabled"\n ng-change="$ctrl.regenerateCron()"\n ng-model="$ctrl.state.monthly.subTab"\n ng-class="$ctrl.state.formRadioClass"\n name="monthly-radio">\n On the\n <select class="day-order-in-month"\n name="monthlySpecificWeekDayMonthWeek"\n ng-disabled="$ctrl.ngDisabled || $ctrl.activeTab !== \'monthly\' || $ctrl.state.monthly.subTab !== \'specificWeekDay\'"\n ng-change="$ctrl.regenerateCron()"\n ng-model="$ctrl.state.monthly.specificWeekDay.monthWeek"\n ng-required="$ctrl.activeTab === \'monthly\' && $ctrl.state.monthly.subTab === \'specificWeekDay\'"\n ng-options="monthWeek as $ctrl.monthWeekDisplay(monthWeek) for monthWeek in $ctrl.selectOptions.monthWeeks"\n ng-class="$ctrl.parsedOptions.formSelectClass">\n </select>\n <select class="week-days"\n name="monthlySpecificWeekDayDay"\n ng-disabled="$ctrl.ngDisabled || $ctrl.activeTab !== \'monthly\' || $ctrl.state.monthly.subTab !== \'specificWeekDay\'"\n ng-change="$ctrl.regenerateCron()"\n ng-model="$ctrl.state.monthly.specificWeekDay.day"\n ng-required="$ctrl.activeTab === \'monthly\' && $ctrl.state.monthly.subTab === \'specificWeekDay\'"\n ng-options="day as $ctrl.dayDisplay(day) for day in $ctrl.selectOptions.days"\n ng-class="$ctrl.parsedOptions.formSelectClass">\n </select>\n of every\n <select class="months-small"\n name="monthlySpecificWeekDayMonths"\n ng-disabled="$ctrl.ngDisabled || $ctrl.activeTab !== \'monthly\' || $ctrl.state.monthly.subTab !== \'specificWeekDay\'"\n ng-change="$ctrl.regenerateCron()"\n ng-model="$ctrl.state.monthly.specificWeekDay.months"\n ng-required="$ctrl.activeTab === \'monthly\' && $ctrl.state.monthly.subTab === \'specificWeekDay\'"\n ng-options="month as month for month in $ctrl.selectOptions.months"\n ng-class="$ctrl.parsedOptions.formSelectClass">\n </select>\n month(s) at\n <cron-gen-time-select\n is-disabled="$ctrl.ngDisabled || $ctrl.activeTab !== \'monthly\' || $ctrl.state.monthly.subTab !== \'specificWeekDay\'"\n on-change="$ctrl.regenerateCron()"\n name-prefix="monthlySpecificWeekDay"\n is-required="$ctrl.activeTab === \'monthly\' && $ctrl.state.monthly.subTab === \'specificWeekDay\'"\n model="$ctrl.state.monthly.specificWeekDay"\n select-class="$ctrl.parsedOptions.formSelectClass"\n use-24-hour-time="$ctrl.parsedOptions.use24HourTime"\n hide-seconds="$ctrl.parsedOptions.hideSeconds">\n </cron-gen-time-select>\n </div>\n\n </div>\n <div class="tab-pane"\n ng-show="!$ctrl.parsedOptions.hideYearlyTab"\n ng-class="{\'active\': $ctrl.activeTab === \'yearly\'}">\n <div class="well well-small">\n <input type="radio"\n value="specificMonthDay"\n ng-disabled="$ctrl.ngDisabled"\n ng-change="$ctrl.regenerateCron()"\n ng-model="$ctrl.state.yearly.subTab"\n ng-class="$ctrl.state.formRadioClass"\n name="yearly-radio">\n Every\n <select class="months"\n name="yearlySpecificMonthDayMonth"\n ng-disabled="$ctrl.ngDisabled || $ctrl.activeTab !== \'yearly\' || $ctrl.state.yearly.subTab !== \'specificMonthDay\'"\n ng-change="$ctrl.regenerateCron()"\n ng-model="$ctrl.state.yearly.specificMonthDay.month"\n ng-required="$ctrl.activeTab === \'yearly\' && $ctrl.state.yearly.subTab === \'specificMonthDay\'"\n ng-options="month as $ctrl.monthDisplay(month) for month in $ctrl.selectOptions.months"\n ng-class="$ctrl.parsedOptions.formSelectClass">\n </select>\n on the\n <select class="month-days"\n name="yearlySpecificMonthDayDay"\n ng-disabled="$ctrl.ngDisabled || $ctrl.activeTab !== \'yearly\' || $ctrl.state.yearly.subTab !== \'specificMonthDay\'"\n ng-change="$ctrl.regenerateCron()"\n ng-model="$ctrl.state.yearly.specificMonthDay.day"\n ng-required="$ctrl.activeTab === \'yearly\' && $ctrl.state.yearly.subTab === \'specificMonthDay\'"\n ng-options="monthDaysWithLast as $ctrl.monthDayDisplay(monthDaysWithLast) for monthDaysWithLast in $ctrl.selectOptions.monthDaysWithLasts"\n ng-class="$ctrl.parsedOptions.formSelectClass">\n </select>\n at\n <cron-gen-time-select\n is-disabled="$ctrl.ngDisabled || $ctrl.activeTab !== \'yearly\' || $ctrl.state.yearly.subTab !== \'specificMonthDay\'"\n on-change="$ctrl.regenerateCron()"\n is-required="$ctrl.activeTab === \'yearly\' && $ctrl.state.yearly.subTab === \'specificMonthDay\'"\n name-prefix="yearlySpecificMonthDay"\n model="$ctrl.state.yearly.specificMonthDay"\n select-class="$ctrl.parsedOptions.formSelectClass"\n use-24-hour-time="$ctrl.parsedOptions.use24HourTime"\n hide-seconds="$ctrl.parsedOptions.hideSeconds">\n </cron-gen-time-select>\n </div>\n <div class="well well-small">\n <input type="radio"\n value="specificMonthWeek"\n ng-disabled="$ctrl.ngDisabled"\n ng-change="$ctrl.regenerateCron()"\n ng-model="$ctrl.state.yearly.subTab"\n ng-class="$ctrl.state.formRadioClass"\n name="yearly-radio">\n On the\n <select class="day-order-in-month"\n name="yearlySpecificMonthWeekMonthWeek"\n ng-disabled="$ctrl.ngDisabled || $ctrl.activeTab !== \'yearly\' || $ctrl.state.yearly.subTab !== \'specificMonthWeek\'"\n ng-change="$ctrl.regenerateCron()"\n ng-model="$ctrl.state.yearly.specificMonthWeek.monthWeek"\n ng-required="$ctrl.activeTab === \'yearly\' && $ctrl.state.yearly.subTab === \'specificMonthWeek\'"\n ng-options="monthWeek as $ctrl.monthWeekDisplay(monthWeek) for monthWeek in $ctrl.selectOptions.monthWeeks"\n ng-class="$ctrl.parsedOptions.formSelectClass">\n </select>\n <select class="week-days"\n name="yearlySpecificMonthWeekMonthDay"\n ng-disabled="$ctrl.ngDisabled || $ctrl.activeTab !== \'yearly\' || $ctrl.state.yearly.subTab !== \'specificMonthWeek\'"\n ng-change="$ctrl.regenerateCron()"\n ng-model="$ctrl.state.yearly.specificMonthWeek.day"\n ng-required="$ctrl.activeTab === \'yearly\' && $ctrl.state.yearly.subTab === \'specificMonthWeek\'"\n ng-options="day as $ctrl.dayDisplay(day) for day in $ctrl.selectOptions.days"\n ng-class="$ctrl.parsedOptions.formSelectClass">\n </select>\n of\n <select class="months"\n name="yearlySpecificMonthWeekMontMonth"\n ng-disabled="$ctrl.ngDisabled || $ctrl.activeTab !== \'yearly\' || $ctrl.state.yearly.subTab !== \'specificMonthWeek\'"\n ng-change="$ctrl.regenerateCron()"\n ng-model="$ctrl.state.yearly.specificMonthWeek.month"\n ng-required="$ctrl.activeTab === \'yearly\' && $ctrl.state.yearly.subTab === \'specificMonthWeek\'"\n ng-options="month as $ctrl.monthDisplay(month) for month in $ctrl.selectOptions.months"\n ng-class="$ctrl.parsedOptions.formSelectClass">\n </select>\n at\n <cron-gen-time-select\n is-disabled="$ctrl.ngDisabled || $ctrl.activeTab !== \'yearly\' || $ctrl.state.yearly.subTab !== \'specificMonthWeek\'"\n on-change="$ctrl.regenerateCron()"\n name-prefix="yearlySpecificMonthWeek"\n is-required="$ctrl.activeTab === \'yearly\' && $ctrl.state.yearly.subTab === \'specificMonthWeek\'"\n model="$ctrl.state.yearly.specificMonthWeek"\n select-class="$ctrl.parsedOptions.formSelectClass"\n use-24-hour-time="$ctrl.parsedOptions.use24HourTime"\n hide-seconds="$ctrl.parsedOptions.hideSeconds">\n </cron-gen-time-select>\n </div>\n