Schedules - audit, bugs, allow HH:MM:SS end time granularity (#1857)

* cleanup unused code artifacts #1851

* fix bug found during audit where empty extra_data was being POSTd as null, #1593

* cleanup schedule helper #1851, update angular-scheduler dependency, automatically set end dt to start dt + 1 day in schedule > add, add hh:mm:ss end date grandularity, resolves #1758, resolves #1856'

* clean up dead schedule dependencies #1851

* fix extra vars in schedule > edit view, fix munge of nested yaml, resolves #1547

squash

* update angular-scheduler to v0.0.19

* re-add ng-toast dependency to bower manifest
This commit is contained in:
Leigh
2016-05-13 10:43:07 -04:00
parent 1e26df639f
commit 89bd66f1f6
26 changed files with 212 additions and 344 deletions

View File

@@ -1,6 +1,6 @@
{ {
"name": "angular-scheduler", "name": "angular-scheduler",
"version": "0.0.14", "version": "0.0.19",
"authors": [ "authors": [
"Chris Houseknecht <chouse@ansible.com>" "Chris Houseknecht <chouse@ansible.com>"
], ],
@@ -36,13 +36,13 @@
"rrule", "rrule",
"calendar" "calendar"
], ],
"_release": "0.0.14", "_release": "0.0.19",
"_resolution": { "_resolution": {
"type": "version", "type": "version",
"tag": "v0.0.14", "tag": "v0.0.19",
"commit": "618c50fabaf774f91db3ed3fb086ac9f45c22136" "commit": "952fb090bae47fe748bbb502d7409915c68bb572"
}, },
"_source": "git://github.com/chouseknecht/angular-scheduler.git", "_source": "https://github.com/chouseknecht/angular-scheduler.git",
"_target": "~0.0.14", "_target": "~0.0.19",
"_originalSource": "angular-scheduler" "_originalSource": "angular-scheduler"
} }

View File

@@ -1,6 +1,6 @@
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2015 Ansible, Inc. Copyright (c) 2014 Ansible, Inc.
Permission is hereby granted, free of charge, to any person obtaining a copy of Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in this software and associated documentation files (the "Software"), to deal in

View File

@@ -1,6 +1,6 @@
{ {
"name": "angular-scheduler", "name": "angular-scheduler",
"version": "0.0.14", "version": "0.0.19",
"authors": [ "authors": [
"Chris Houseknecht <chouse@ansible.com>" "Chris Houseknecht <chouse@ansible.com>"
], ],
@@ -30,7 +30,7 @@
"angular-tz-extensions": "*" "angular-tz-extensions": "*"
}, },
"homepage": "https://github.com/chouseknecht/angular-scheduler", "homepage": "https://github.com/chouseknecht/angular-scheduler",
"main": "./lib/angular-scheduler.js", "main": "git@github.com:chouseknecht/angular-scheduler.git",
"keywords": [ "keywords": [
"schedule", "schedule",
"rrule", "rrule",

View File

@@ -3,7 +3,7 @@
Partial to be injected on inectDetail() method call, providing occurrence list, rrule and a natural language description. Partial to be injected on inectDetail() method call, providing occurrence list, rrule and a natural language description.
Copyright (c) 2015 Ansible, Inc. Copyright (c) 2014 Ansible, Inc.
Maintainers: Maintainers:
Chris Houseknecht Chris Houseknecht

View File

@@ -1,7 +1,7 @@
/*************************************************************************** /***************************************************************************
* angular-scheruler.css * angular-scheruler.css
* *
* Copyright (c) 2015 Ansible, Inc. * Copyright (c) 2014 Ansible, Inc.
* *
* Maintainers: * Maintainers:
* *

View File

@@ -3,7 +3,7 @@
Partial to be injected on inect() method call, providing the form for our widget. Partial to be injected on inect() method call, providing the form for our widget.
Copyright (c) 2015 Ansible, Inc. Copyright (c) 2014 Ansible, Inc.
Maintainers: Maintainers:
Chris Houseknecht Chris Houseknecht
@@ -19,49 +19,7 @@
<div class="form-group"> <div class="form-group">
<label><span class="red-text">*</span> Name</label> <label><span class="red-text">*</span> Name</label>
<input type="text" class="form-control input-sm" name="schedulerName" id="schedulerName" ng-model="schedulerName" required placeholder="Schedule name"> <input type="text" class="form-control input-sm" name="schedulerName" id="schedulerName" ng-model="schedulerName" required placeholder="Schedule name">
<div class="error" ng-show="scheduler_form.schedulerName.$dirty && scheduler_form.schedulerName.$error.required">A schedule name is required.</div> <div class="error" ng-show="scheduler_form.schedulerName.$dirty && scheduler_form.schedulerName.$error.required">Schedule name is required</div>
</div>
<div class="factDetailsNote" ng-if="isFactCleanup"><span class="factDetailsHeader">Note:</span> For facts collected older than the time period specified, save one fact scan (snapshot) per time window (frequency). For example, facts older than 30 days are purged, while one weekly fact scan is kept.
Caution: Setting both numerical variables to "0" will delete all facts.</div>
<div class="form-group" ng-if="cleanupJob && !isFactCleanup">
<label><span class="red-text">*</span> Days of data to keep</label>
<input type="number" class="form-control input-sm" name="schedulerPurgeDays" id="schedulerPurgeDays" min="1" ng-model="schedulerPurgeDays" required placeholder="Days of data to keep">
<div class="error" ng-show="scheduler_form.schedulerPurgeDays.$dirty && scheduler_form.schedulerPurgeDays.$error.required">A value is required.</div>
<div class="error" ng-show="scheduler_form.schedulerPurgeDays.$error.number">This is not a valid number.</div>
</div>
<div class="form-group cleanupStretcher factDaysToKeepCompacter" ng-if="isFactCleanup">
<div class="col-md-12">
<label><span class="red-text">*</span> Select a time period after which to remove old facts</label>
</div>
<div class="col-md-6 inputSpacer inputCompactMobile">
<input type="number" id="keep_amount" name="keep_amount" ng-model="keep_amount" ng-required="true" class="form-control input-sm" aw-min=0 aw-max=9999 integer></input>
<div class="error" ng-show="scheduler_form.keep_amount.$dirty && scheduler_form.keep_amount.$error.required">Please enter the number of days you would like to keep this data.</div>
<div class="error survey_error" ng-show="scheduler_form.keep_amount.$error.number || scheduler_form.keep_amount.$error.integer" >Please enter a valid number.</div>
<div class="error survey_error" ng-show="scheduler_form.keep_amount.$error.awMin">Please enter a non-negative number.</div>
<div class="error survey_error" ng-show="scheduler_form.keep_amount.$error.awMax">Please enter a number smaller than 9999.</div>
</div>
<div class="col-md-6 inputSpacer">
<select id="keep_unit" name="keep_unit" ng-model="keep_unit" ng-options="type.label for type in keep_unit_choices track by type.value" ng-required="true" class="form-control input-sm"></select>
</div>
</div>
<div class="form-group cleanupStretcher" ng-if="isFactCleanup">
<div class="col-md-12">
<label><span class="red-text">*</span> Select a frequency for snapshot retention</label>
</div>
<div class="col-md-6 inputSpacer inputCompactMobile">
<input type="number" class="form-control input-sm" id="granularity_keep_amount" name="granularity_keep_amount" ng-model="granularity_keep_amount" ng-required="true" aw-min=0 aw-max=9999 >
<div class="error" ng-show="scheduler_form.granularity_keep_amount.$dirty && scheduler_form.granularity_keep_amount.$error.required">Please enter the number of days you would like to keep this data.</div>
<div class="error survey_error" ng-show="scheduler_form.granularity_keep_amount.$error.number || scheduler_form.granularity_keep_amount.$error.integer" >Please enter a valid number.</div>
<div class="error survey_error" ng-show="scheduler_form.granularity_keep_amount.$error.awMin">Please enter a non-negative number.</div>
<div class="error survey_error" ng-show="scheduler_form.granularity_keep_amount.$error.awMax">Please enter a number smaller than 9999.</div>
</div>
<div class="col-md-6 inputSpacer">
<select id="granularity_keep_unit" name="granularity_keep_unit" ng-model="granularity_keep_unit" ng-options="type.label for type in granularity_keep_unit_choices track by type.value" ng-required="true" class="form-control input-sm"></select>
</div>
</div> </div>
<div class="row"> <div class="row">
@@ -88,7 +46,7 @@ Caution: Setting both numerical variables to "0" will delete all facts.</div>
<span>:</span><input name="schedulerStartMinute" id="schedulerStartMinute" sch-spinner="scheduler_form" class="scheduler-time-spinner" ng-model="schedulerStartMinute" placeholder="MM" min="0" max="59" data-zero-pad="2" required ng-change="scheduleTimeChange()" > <span>:</span><input name="schedulerStartMinute" id="schedulerStartMinute" sch-spinner="scheduler_form" class="scheduler-time-spinner" ng-model="schedulerStartMinute" placeholder="MM" min="0" max="59" data-zero-pad="2" required ng-change="scheduleTimeChange()" >
<span>:</span><input name="schedulerStartSecond" id="schedulerStartSecond" sch-spinner="scheduler_form" class="scheduler-time-spinner" ng-model="schedulerStartSecond" placeholder="SS" min="0" max="59" data-zero-pad="2" required ng-change="scheduleTimeChange()" > <span>:</span><input name="schedulerStartSecond" id="schedulerStartSecond" sch-spinner="scheduler_form" class="scheduler-time-spinner" ng-model="schedulerStartSecond" placeholder="SS" min="0" max="59" data-zero-pad="2" required ng-change="scheduleTimeChange()" >
</div> </div>
<div class="error" ng-show="scheduler_startTime_error">The time must be in HH24:MM:SS format.</div> <div class="error" ng-show="scheduler_startTime_error">Time must be in HH24:MM:SS format</div>
</div> </div>
</div> </div>
</div> </div>
@@ -131,7 +89,7 @@ Caution: Setting both numerical variables to "0" will delete all facts.</div>
<input name="schedulerInterval" id="schedulerInterval" sch-spinner="scheduler_form" class="scheduler-spinner" <input name="schedulerInterval" id="schedulerInterval" sch-spinner="scheduler_form" class="scheduler-spinner"
ng-model="schedulerInterval" min="1" max="999" ng-change="resetError('scheduler_interval_error')"> ng-model="schedulerInterval" min="1" max="999" ng-change="resetError('scheduler_interval_error')">
<label class="inline-label" ng-bind="schedulerIntervalLabel"></label> <label class="inline-label" ng-bind="schedulerIntervalLabel"></label>
<div class="error" ng-show="scheduler_interval_error">Please provide a value between 1 and 999.</div> <div class="error" ng-show="scheduler_interval_error">Provide a value between 1 and 999</div>
</div> </div>
</div> </div>
</div> </div>
@@ -146,7 +104,7 @@ Caution: Setting both numerical variables to "0" will delete all facts.</div>
<div class="col-md-3" style="padding-top:5px"> <div class="col-md-3" style="padding-top:5px">
<input name="monthDay" id="monthDay" sch-spinner="scheduler_form" class="scheduler-spinner" <input name="monthDay" id="monthDay" sch-spinner="scheduler_form" class="scheduler-spinner"
ng-model="monthDay" min="1" max="31" ng-change="resetError('scheduler_monthDay_error')" > ng-model="monthDay" min="1" max="31" ng-change="resetError('scheduler_monthDay_error')" >
<div class="error" ng-show="scheduler_monthDay_error">The day must be between 1 and 31.</div> <div class="error" ng-show="scheduler_monthDay_error">Must be between 1 and 31</div>
</div> </div>
</div> </div>
</div> </div>
@@ -183,7 +141,7 @@ Caution: Setting both numerical variables to "0" will delete all facts.</div>
<div class="col-md-3 padding-top-slim"> <div class="col-md-3 padding-top-slim">
<input name="yearlyMonthDay" id="yearlyMonthDay" sch-spinner="scheduler_form" class="scheduler-spinner" <input name="yearlyMonthDay" id="yearlyMonthDay" sch-spinner="scheduler_form" class="scheduler-spinner"
ng-model="yearlyMonthDay" min="1" max="31" ng-change="resetError('scheduler_yearlyMonthDay_error')" > ng-model="yearlyMonthDay" min="1" max="31" ng-change="resetError('scheduler_yearlyMonthDay_error')" >
<div class="error" ng-show="scheduler_yearlyMonthDay_error">The day must be between 1 and 31.</div> <div class="error" ng-show="scheduler_yearlyMonthDay_error">Must be between 1 and 31</div>
</div> </div>
</div> </div>
</div> </div>
@@ -225,7 +183,7 @@ Caution: Setting both numerical variables to "0" will delete all facts.</div>
<button type="button" ng-class="weekDaySAClass" class="btn btn-default" data-value="SA" ng-click="setWeekday($event,'sa')">Sat</button> <button type="button" ng-class="weekDaySAClass" class="btn btn-default" data-value="SA" ng-click="setWeekday($event,'sa')">Sat</button>
</div> </div>
</div> </div>
<div class="error" ng-show="scheduler_weekDays_error">Please select one or more days.</div> <div class="error" ng-show="scheduler_weekDays_error">Select one or more days</div>
</div> </div>
<div class="row"> <div class="row">
@@ -244,7 +202,7 @@ Caution: Setting both numerical variables to "0" will delete all facts.</div>
ng-model="schedulerOccurrenceCount" min="1" max="999" on-change="resetError('scheduler_occurrenceCount_error')" > ng-model="schedulerOccurrenceCount" min="1" max="999" on-change="resetError('scheduler_occurrenceCount_error')" >
<label class="inline-label">Occurrence(s)</label> <label class="inline-label">Occurrence(s)</label>
</div> </div>
<div class="error" ng-show="scheduler_occurrenceCount_error">Please provide a value between 1 and 999.</div> <div class="error" ng-show="scheduler_occurrenceCount_error">Provide a value between 1 and 999</div>
</div> </div>
</div> </div>
<div class="col-md-4" ng-show="schedulerEnd && schedulerEnd.value == 'on'"> <div class="col-md-4" ng-show="schedulerEnd && schedulerEnd.value == 'on'">
@@ -257,7 +215,7 @@ Caution: Setting both numerical variables to "0" will delete all facts.</div>
<i class="fa fa-calendar"></i></button> <i class="fa fa-calendar"></i></button>
</span> </span>
</div> </div>
<div class="error" ng-show="scheduler_endDt_error">Please provide a valid date.</div> <div class="error" ng-show="scheduler_endDt_error">Provide a valid date</div>
</div> </div>
</div> </div>
</div> </div>

View File

@@ -1,7 +1,7 @@
/*************************************************************************** /***************************************************************************
* angular-scheruler.js * angular-scheruler.js
* *
* Copyright (c) 2015 Ansible, Inc. * Copyright (c) 2014 Ansible, Inc.
* *
* Maintainers: * Maintainers:
* *
@@ -59,7 +59,7 @@ angular.module('AngularScheduler', ['underscore'])
scope.scheduleRepeatChange(); scope.scheduleRepeatChange();
}; };
scope.scheduleTimeChange = function() { scope.scheduleTimeChange = function(callback) {
if (scope.schedulerStartDt === "" || scope.schedulerStartDt === null || scope.schedulerStartDt === undefined) { if (scope.schedulerStartDt === "" || scope.schedulerStartDt === null || scope.schedulerStartDt === undefined) {
scope.startDateError("Provide a valid start date and time"); scope.startDateError("Provide a valid start date and time");
scope.schedulerUTCTime = ''; scope.schedulerUTCTime = '';
@@ -91,6 +91,9 @@ angular.module('AngularScheduler', ['underscore'])
':' + scope.schedulerStartSecond + '.000Z'); ':' + scope.schedulerStartSecond + '.000Z');
} }
} }
if (callback){
callback();
}
}; };
scope.resetError = function(variable) { scope.resetError = function(variable) {
@@ -108,7 +111,6 @@ angular.module('AngularScheduler', ['underscore'])
scope.schedulerEnd = scope.endOptions[0]; scope.schedulerEnd = scope.endOptions[0];
} }
scope.sheduler_frequency_error = false; scope.sheduler_frequency_error = false;
scope.$emit("updateSchedulerSelects"); scope.$emit("updateSchedulerSelects");
}; };
@@ -169,12 +171,8 @@ angular.module('AngularScheduler', ['underscore'])
} }
}; };
scope.schedulerEndChange = function() { scope.schedulerEndChange = function(key, value) {
var dt = new Date(), // date adjusted to local zone automatically scope[key] = $filter('schZeroPad')(parseInt(value), 2);
month = $filter('schZeroPad')(dt.getMonth() + 1, 2),
day = $filter('schZeroPad')(dt.getDate(), 2);
scope.schedulerEndDt = month + '/' + day + '/' + dt.getFullYear();
scope.schedulerOccurrenceCount = 1;
}; };
// When timezones become available, use to set defaults // When timezones become available, use to set defaults
@@ -225,7 +223,10 @@ angular.module('AngularScheduler', ['underscore'])
if (this.scope.schedulerEnd.value === 'on') { if (this.scope.schedulerEnd.value === 'on') {
options.endDate = scope.schedulerEndDt.replace(/(\d{2})\/(\d{2})\/(\d{4})/, function(match, p1, p2, p3) { options.endDate = scope.schedulerEndDt.replace(/(\d{2})\/(\d{2})\/(\d{4})/, function(match, p1, p2, p3) {
return p3 + '-' + p1 + '-' + p2; return p3 + '-' + p1 + '-' + p2;
}) + 'T' + this.scope.schedulerUTCTime.replace(/\d{2}\/\d{2}\/\d{4} /,'').replace(/ UTC/,'') + 'Z'; }) + 'T' +
$filter('schZeroPad')(this.scope.schedulerEndHour,2) + ':' +
$filter('schZeroPad')(this.scope.schedulerEndMinute,2) + ':' +
$filter('schZeroPad')(this.scope.schedulerEndSecond,2)+ 'Z';
} }
if (this.scope.schedulerFrequency.value === 'weekly') { if (this.scope.schedulerFrequency.value === 'weekly') {
options.weekDays = this.scope.weekDays; options.weekDays = this.scope.weekDays;
@@ -299,10 +300,7 @@ angular.module('AngularScheduler', ['underscore'])
} }
return false; return false;
}); });
scope.rrule_nlp_description = rrule.toText().replace(/^RRule error.*$/,'Minutely or hourly frequency selected'); scope.rrule_nlp_description = rrule.toText().replace(/^RRule error.*$/,'Natural language description not available');
if(rrule === "none"){
scope.rrule_nlp_description = 'Natural language description not available';
}
scope.rrule = rrule.toString(); scope.rrule = rrule.toString();
} }
}; };
@@ -346,11 +344,6 @@ angular.module('AngularScheduler', ['underscore'])
$('#schedulerName').addClass('ng-dirty'); $('#schedulerName').addClass('ng-dirty');
validity = false; validity = false;
} }
if(this.scope.cleanupJob===true && !this.scope.scheduler_form.schedulerPurgeDays.$valid){
this.scope.scheduler_form.schedulerPurgeDays.$dirty = true;
$('#schedulerPurgeDays').addClass('ng-dirty');
validity = false;
}
if (this.scope.schedulerEnd.value === 'on') { if (this.scope.schedulerEnd.value === 'on') {
if (!/^\d{2}\/\d{2}\/\d{4}$/.test(this.scope.schedulerEndDt)) { if (!/^\d{2}\/\d{2}\/\d{4}$/.test(this.scope.schedulerEndDt)) {
this.scope.scheduler_form.schedulerEndDt.$pristine = false; this.scope.scheduler_form.schedulerEndDt.$pristine = false;
@@ -408,7 +401,6 @@ angular.module('AngularScheduler', ['underscore'])
return validity; return validity;
}; };
var that = this; var that = this;
that.scope.$on("loadSchedulerDetailPane", function() { that.scope.$on("loadSchedulerDetailPane", function() {
@@ -806,17 +798,13 @@ angular.module('AngularScheduler', ['underscore'])
}); });
} }
scope.schedulerEnd = scope.endOptions[2]; scope.schedulerEnd = scope.endOptions[2];
if (useTimezone) {
dt = new Date(value); // date adjusted to local zone automatically
month = $filter('schZeroPad')(dt.getMonth() + 1, 2);
day = $filter('schZeroPad')(dt.getDate(), 2);
scope.schedulerEndDt = month + '/' + day + '/' + dt.getFullYear();
}
else {
scope.schedulerEndDt = value.replace(/T.*$/,'').replace(/(\d{4})-(\d{2})-(\d{2})/, function(match, p1, p2, p3) { scope.schedulerEndDt = value.replace(/T.*$/,'').replace(/(\d{4})-(\d{2})-(\d{2})/, function(match, p1, p2, p3) {
return p2 + '/' + p3 + '/' + p1; return p2 + '/' + p3 + '/' + p1;
}); });
} timeString = value.replace(/^.*T/,'');
scope.schedulerEndHour = $filter('schZeroPad')(timeString.substr(0,2),2);
scope.schedulerEndMinute = $filter('schZeroPad')(timeString.substr(3,2),2);
scope.schedulerEndSecond = $filter('schZeroPad')(timeString.substr(6,2),2);
} }
if (key === 'BYMONTH') { if (key === 'BYMONTH') {
@@ -896,7 +884,6 @@ angular.module('AngularScheduler', ['underscore'])
defaultDay = $filter('schZeroPad')(defaultDate.getDate(), 2), defaultDay = $filter('schZeroPad')(defaultDate.getDate(), 2),
defaultDateStr = defaultMonth + '/' + defaultDay + '/' + defaultDate.getFullYear(); defaultDateStr = defaultMonth + '/' + defaultDay + '/' + defaultDate.getFullYear();
scope.schedulerName = ''; scope.schedulerName = '';
scope.schedulerPurgeDays = 30;
scope.weekDays = []; scope.weekDays = [];
scope.schedulerStartHour = '00'; scope.schedulerStartHour = '00';
scope.schedulerStartMinute = '00'; scope.schedulerStartMinute = '00';
@@ -996,11 +983,7 @@ angular.module('AngularScheduler', ['underscore'])
.filter('schZeroPad', [ function() { .filter('schZeroPad', [ function() {
return function (n, pad) { return function (n, pad) {
var str = (Math.pow(10,pad) + '').replace(/^1/,'') + (n + '').trim(); var str = (Math.pow(10,pad) + '').replace(/^1/,'') + (n + '').trim();
if (str.substr(str.length - pad) === 'll') { return str.substr(str.length - pad);
return undefined;
} else {
return str.substr(str.length - pad);
}
}; };
}]) }])
@@ -1056,10 +1039,6 @@ angular.module('AngularScheduler', ['underscore'])
return { return {
require: 'ngModel', require: 'ngModel',
link: function(scope, element, attr, ctrl) { link: function(scope, element, attr, ctrl) {
if (element.attr("ng-model").indexOf("$parent") > -1) {
scope = scope.$parent;
attr.ngModel = attr.ngModel.split("$parent.")[1];
}
// Add jquerui spinner to 'spinner' type input // Add jquerui spinner to 'spinner' type input
var form = attr.schSpinner, var form = attr.schSpinner,
zeroPad = attr.zeroPad, zeroPad = attr.zeroPad,
@@ -1084,25 +1063,16 @@ angular.module('AngularScheduler', ['underscore'])
}); });
}, 100); }, 100);
}, },
icons: {
down: "Form-numberInputButton fa fa-angle-down",
up: "Form-numberInputButton fa fa-angle-up"
},
spin: function() { spin: function() {
if (scope[form][attr.ngModel]) { scope[form].$setDirty();
scope[form][attr.ngModel].$setDirty(); ctrl.$dirty = true;
scope[form][attr.ngModel].$dirty = true; ctrl.$pristine = false;
scope[form][attr.ngModel].$pristine = false;
}
if (!scope.$$phase) { if (!scope.$$phase) {
scope.$digest(); scope.$digest();
} }
} }
}); });
$('.ui-icon').text('');
$(".ui-icon").removeClass('ui-icon ui-icon-triangle-1-n ui-icon-triangle-1-s');
$(element).on("click", function () { $(element).on("click", function () {
$(element).select(); $(element).select();
}); });

View File

@@ -1,6 +1,6 @@
{ {
"name": "angular-scheduler", "name": "angular-scheduler",
"version": "0.0.14", "version": "0.0.19",
"devDependencies": { "devDependencies": {
"grunt": "~0.4.2", "grunt": "~0.4.2",
"grunt-contrib-jshint": "~0.6.3", "grunt-contrib-jshint": "~0.6.3",

View File

@@ -11,7 +11,7 @@
"tag": "v1.4.7", "tag": "v1.4.7",
"commit": "6bdc6b4855b416bf029105324080ca7d6aca0e9f" "commit": "6bdc6b4855b416bf029105324080ca7d6aca0e9f"
}, },
"_source": "git://github.com/angular/bower-angular.git", "_source": "https://github.com/angular/bower-angular.git",
"_target": "~1.4.0", "_target": "1.4.7",
"_originalSource": "angular" "_originalSource": "angular"
} }

View File

@@ -18,6 +18,6 @@
"commit": "622a619d25358b86a93c2335f88e1884acc9ccb8" "commit": "622a619d25358b86a93c2335f88e1884acc9ccb8"
}, },
"_source": "https://github.com/ivaynberg/select2.git", "_source": "https://github.com/ivaynberg/select2.git",
"_target": "~4.0.2", "_target": "~4.0.0",
"_originalSource": "select2" "_originalSource": "select2"
} }

View File

@@ -12,7 +12,7 @@
export function ScheduleEditController($scope, $compile, $location, $stateParams, SchedulesList, Rest, ProcessErrors, ReturnToCaller, ClearScope, export function ScheduleEditController($scope, $compile, $location, $stateParams, SchedulesList, Rest, ProcessErrors, ReturnToCaller, ClearScope,
GetBasePath, Wait, Find, LoadDialogPartial, LoadSchedulesScope, GetChoices) { GetBasePath, Wait, Find, LoadSchedulesScope, GetChoices) {
ClearScope(); ClearScope();
@@ -82,4 +82,4 @@ GetBasePath, Wait, Find, LoadDialogPartial, LoadSchedulesScope, GetChoices) {
} }
ScheduleEditController.$inject = [ '$scope', '$compile', '$location', '$stateParams', 'SchedulesList', 'Rest', 'ProcessErrors', 'ReturnToCaller', 'ClearScope', ScheduleEditController.$inject = [ '$scope', '$compile', '$location', '$stateParams', 'SchedulesList', 'Rest', 'ProcessErrors', 'ReturnToCaller', 'ClearScope',
'GetBasePath', 'Wait', 'Find', 'LoadDialogPartial', 'LoadSchedulesScope', 'GetChoices']; 'GetBasePath', 'Wait', 'Find', 'LoadSchedulesScope', 'GetChoices'];

View File

@@ -20,41 +20,9 @@ export default
angular.module('SchedulesHelper', [ 'Utilities', 'RestServices', 'SchedulesHelper', 'SearchHelper', 'PaginationHelpers', listGenerator.name, 'ModalDialog', angular.module('SchedulesHelper', [ 'Utilities', 'RestServices', 'SchedulesHelper', 'SearchHelper', 'PaginationHelpers', listGenerator.name, 'ModalDialog',
'GeneratorHelpers']) 'GeneratorHelpers'])
.factory('ShowSchedulerModal', ['$rootScope', function($rootScope) { .factory('EditSchedule', ['SchedulerInit', '$rootScope', 'Wait', 'Rest',
return function(params) { 'ProcessErrors', 'GetBasePath', 'SchedulePost', '$state',
// Set modal dimensions based on viewport width function(SchedulerInit, $rootScope, Wait, Rest, ProcessErrors,
var buttons,
scope = params.scope;
buttons = [{
"label": "Cancel",
"onClick": function() {
$(this).dialog('close');
},
"icon": "fa-times",
"class": "btn btn-default",
"id": "schedule-close-button"
},{
"label": "Save",
"onClick": function() {
setTimeout(function(){
scope.$apply(function(){
scope.saveSchedule();
});
});
},
"icon": "fa-check",
"class": "btn btn-primary",
"id": "schedule-save-button"
}];
$rootScope.$broadcast("ScheduleFormCreated", scope);
};
}])
.factory('EditSchedule', ['SchedulerInit', 'ShowSchedulerModal', 'Wait',
'Rest', 'ProcessErrors', 'GetBasePath', 'SchedulePost', '$state',
function(SchedulerInit, ShowSchedulerModal, Wait, Rest, ProcessErrors,
GetBasePath, SchedulePost, $state) { GetBasePath, SchedulePost, $state) {
return function(params) { return function(params) {
var scope = params.scope, var scope = params.scope,
@@ -155,7 +123,7 @@ export default
scope.$on("htmlDetailReady", function() { scope.$on("htmlDetailReady", function() {
scheduler.setRRule(schedule.rrule); scheduler.setRRule(schedule.rrule);
scheduler.setName(schedule.name); scheduler.setName(schedule.name);
ShowSchedulerModal({ scope: scope, callback: 'DialogReady', title: 'Edit Schedule' }); $rootScope.$broadcast("ScheduleFormCreated", scope);
}); });
scope.showRRuleDetail = false; scope.showRRuleDetail = false;
}); });
@@ -172,7 +140,7 @@ export default
$state.go("^"); $state.go("^");
}); });
scope.saveSchedule = function() { scope.saveSchedule = function() {
schedule.extra_data = scope.serializedExtraVars; schedule.extra_data = scope.extraVars;
SchedulePost({ SchedulePost({
scope: scope, scope: scope,
url: url, url: url,
@@ -190,7 +158,8 @@ export default
Rest.get() Rest.get()
.success(function(data) { .success(function(data) {
schedule = data; schedule = data;
scope.serializedExtraVars = schedule.extra_data; scope.extraVars = data.extra_data === '' ? '---' : '---\n' + jsyaml.safeDump(data.extra_data);
if(schedule.extra_data.hasOwnProperty('granularity')){ if(schedule.extra_data.hasOwnProperty('granularity')){
scope.isFactCleanup = true; scope.isFactCleanup = true;
} }
@@ -207,10 +176,9 @@ export default
}; };
}]) }])
.factory('AddSchedule', ['$location', '$stateParams', 'SchedulerInit', .factory('AddSchedule', ['$location', '$rootScope', '$stateParams',
'ShowSchedulerModal', 'Wait', 'GetBasePath', 'Empty', 'SchedulerInit', 'Wait', 'GetBasePath', 'Empty', 'SchedulePost', '$state', 'Rest', 'ProcessErrors',
'SchedulePost', '$state', 'Rest', 'ProcessErrors', function($location, $rootScope, $stateParams, SchedulerInit,
function($location, $stateParams, SchedulerInit, ShowSchedulerModal,
Wait, GetBasePath, Empty, SchedulePost, $state, Rest, Wait, GetBasePath, Empty, SchedulePost, $state, Rest,
ProcessErrors) { ProcessErrors) {
return function(params) { return function(params) {
@@ -286,11 +254,12 @@ export default
Wait('start'); Wait('start');
$('#form-container').empty(); $('#form-container').empty();
scheduler = SchedulerInit({ scope: scope, requireFutureStartTime: false }); scheduler = SchedulerInit({ scope: scope, requireFutureStartTime: false });
scope.processSchedulerEndDt();
scheduler.inject('form-container', false); scheduler.inject('form-container', false);
scheduler.injectDetail('occurrences', false); scheduler.injectDetail('occurrences', false);
scheduler.clear(); scheduler.clear();
scope.$on("htmlDetailReady", function() { scope.$on("htmlDetailReady", function() {
ShowSchedulerModal({ scope: scope, callback: 'DialogReady', title: 'Add Schedule' }); $rootScope.$broadcast("ScheduleFormCreated", scope);
}); });
scope.showRRuleDetail = false; scope.showRRuleDetail = false;
@@ -356,12 +325,9 @@ export default
}; };
schedule.extra_data = JSON.stringify(extra_vars); schedule.extra_data = JSON.stringify(extra_vars);
} }
else if (scope.serializedExtraVars){
schedule.extra_data = scope.serializedExtraVars;
}
else if(scope.extraVars){ else if(scope.extraVars){
schedule.extra_data = ToJSON(scope.parseType, schedule.extra_data = scope.parseType === 'yaml' ?
scope.extraVars, false); (scope.extraVars === '---' ? "" : jsyaml.safeLoad(scope.extraVars)) : scope.extraVars;
} }
Rest.setUrl(url); Rest.setUrl(url);
if (mode === 'add') { if (mode === 'add') {
@@ -401,34 +367,6 @@ export default
}; };
}]) }])
/**
* Inject the scheduler_dialog.html wherever needed
*/
.factory('LoadDialogPartial', ['Rest', '$compile', 'ProcessErrors', function(Rest, $compile, ProcessErrors) {
return function(params) {
var scope = params.scope,
element_id = params.element_id,
callback = params.callback,
url;
// Add the schedule_dialog.html partial
url = '/static/partials/schedule_dialog.html';
Rest.setUrl(url);
Rest.get()
.success(function(data) {
var e = angular.element(document.getElementById(element_id));
e.append(data);
$compile(e)(scope);
scope.$emit(callback);
})
.error(function(data, status) {
ProcessErrors(scope, data, status, null, { hdr: 'Error!',
msg: 'Call to ' + url + ' failed. GET returned: ' + status });
});
};
}])
/** /**
* Flip a schedule's enable flag * Flip a schedule's enable flag
* *

View File

@@ -420,6 +420,4 @@
<div id="host-modal-dialog" style="display: none;" class="dialog-content"></div> <div id="host-modal-dialog" style="display: none;" class="dialog-content"></div>
<div ng-include="'/static/partials/schedule_dialog.html'"></div>
</div> </div>

View File

@@ -1,7 +1,6 @@
<div class="tab-pane" id="job_templates"> <div class="tab-pane" id="job_templates">
<div ui-view></div> <div ui-view></div>
<div ng-cloak id="htmlTemplate" class="Panel"></div> <div ng-cloak id="htmlTemplate" class="Panel"></div>
<div ng-include="'/static/partials/schedule_dialog.html'"></div>
<div ng-include="'/static/partials/logviewer.html'"></div> <div ng-include="'/static/partials/logviewer.html'"></div>
</div> </div>

View File

@@ -13,7 +13,7 @@
<form class="form Form" <form class="form Form"
role="form" role="form"
name="scheduler_form_new" name="scheduler_form"
novalidate> novalidate>
<div class="form-group SchedulerForm-formGroup"> <div class="form-group SchedulerForm-formGroup">
@@ -25,13 +25,13 @@
type="text" type="text"
class="form-control input-sm class="form-control input-sm
Form-textInput" Form-textInput"
ng-class="{'RepeatFrequencyOptions-nameBorderErrorFix': scheduler_form_new.$dirty && scheduler_form_new.schedulerName.$error.required}" ng-class="{'RepeatFrequencyOptions-nameBorderErrorFix': scheduler_form.$dirty && scheduler_form.schedulerName.$error.required}"
name="schedulerName" name="schedulerName"
id="schedulerName" id="schedulerName"
ng-model="schedulerName" required ng-model="schedulerName" required
placeholder="Schedule name"> placeholder="Schedule name">
<div class="error" <div class="error"
ng-show="scheduler_form_new.$dirty && scheduler_form_new.schedulerName.$error.required"> ng-show="scheduler_form.$dirty && scheduler_form.schedulerName.$error.required">
A schedule name is required. A schedule name is required.
</div> </div>
</div> </div>
@@ -85,7 +85,7 @@
<div class="input-group SchedulerTime"> <div class="input-group SchedulerTime">
<input name="schedulerStartHour" <input name="schedulerStartHour"
id="schedulerStartHour" id="schedulerStartHour"
sch-spinner="scheduler_form_new" sch-spinner="scheduler_form"
class="scheduler-time-spinner class="scheduler-time-spinner
ScheduleTime-input SpinnerInput" ScheduleTime-input SpinnerInput"
ng-model="schedulerStartHour" ng-model="schedulerStartHour"
@@ -99,7 +99,7 @@
</span> </span>
<input name="schedulerStartMinute" <input name="schedulerStartMinute"
id="schedulerStartMinute" id="schedulerStartMinute"
sch-spinner="scheduler_form_new" sch-spinner="scheduler_form"
class="scheduler-time-spinner class="scheduler-time-spinner
SchedulerTime-input SpinnerInput" SchedulerTime-input SpinnerInput"
ng-model="schedulerStartMinute" ng-model="schedulerStartMinute"
@@ -113,7 +113,7 @@
</span> </span>
<input name="schedulerStartSecond" <input name="schedulerStartSecond"
id="schedulerStartSecond" id="schedulerStartSecond"
sch-spinner="scheduler_form_new" sch-spinner="scheduler_form"
class="scheduler-time-spinner class="scheduler-time-spinner
SchedulerTime-input SpinnerInput" SchedulerTime-input SpinnerInput"
ng-model="schedulerStartSecond" ng-model="schedulerStartSecond"
@@ -188,7 +188,7 @@
</label> </label>
<input name="schedulerInterval" <input name="schedulerInterval"
id="schedulerInterval" id="schedulerInterval"
sch-spinner="scheduler_form_new" sch-spinner="scheduler_form"
class="scheduler-spinner class="scheduler-spinner
SpinnerInput" SpinnerInput"
ng-model="$parent.schedulerInterval" ng-model="$parent.schedulerInterval"
@@ -224,7 +224,7 @@
<input <input
name="monthDay" name="monthDay"
id="monthDay" id="monthDay"
sch-spinner="scheduler_form_new" sch-spinner="scheduler_form"
class="scheduler-spinner SpinnerInput" class="scheduler-spinner SpinnerInput"
ng-model="$parent.monthDay" ng-model="$parent.monthDay"
min="1" max="31" min="1" max="31"
@@ -301,7 +301,7 @@
</select> </select>
<input name="yearlyMonthDay" <input name="yearlyMonthDay"
id="yearlyMonthDay" id="yearlyMonthDay"
sch-spinner="scheduler_form_new" sch-spinner="scheduler_form"
class="scheduler-spinner class="scheduler-spinner
SpinnerInput" SpinnerInput"
ng-model="$parent.yearlyMonthDay" ng-model="$parent.yearlyMonthDay"
@@ -459,8 +459,7 @@
ng-options="e.name for e in endOptions" ng-options="e.name for e in endOptions"
required required
class="MakeSelect2 class="MakeSelect2
form-control input-sm" form-control input-sm">
ng-change="schedulerEndChange()">
</select> </select>
</div> </div>
</div> </div>
@@ -475,7 +474,7 @@
<input <input
ng-name="schedulerOccurrenceCount" ng-name="schedulerOccurrenceCount"
ng-id="schedulerOccurrenceCount" ng-id="schedulerOccurrenceCount"
sch-spinner="scheduler_form_new" sch-spinner="scheduler_form"
class="scheduler-spinner class="scheduler-spinner
SpinnerInput" SpinnerInput"
ng-model="$parent.schedulerOccurrenceCount" ng-model="$parent.schedulerOccurrenceCount"
@@ -574,7 +573,7 @@
</form> </form>
<div class="SchedulerFormDetail-container <div class="SchedulerFormDetail-container
SchedulerFormDetail-container--error" SchedulerFormDetail-container--error"
ng-show="!schedulerIsValid && scheduler_form_new.$dirty"> ng-show="!schedulerIsValid && scheduler_form.$dirty">
<p class="SchedulerFormDetail-errorText"> <p class="SchedulerFormDetail-errorText">
The scheduler options are invalid or incomplete. The scheduler options are invalid or incomplete.
</p> </p>

View File

@@ -20,7 +20,6 @@
<dashboard></dashboard> <dashboard></dashboard>
</div> </div>
<div> <div>
<!--
<!-- <div ng-include="'/static/partials/schedule_dialog.html'"></div>
<div ng-include="'/static/partials/logviewer.html'"></div> <div ng-include="'/static/partials/logviewer.html'"></div>
<div id="host-modal-dialog" style="display: none;" class="dialog-content"></div> --> -->

View File

@@ -43,7 +43,5 @@
<div id="schedule-dialog-target"></div> <div id="schedule-dialog-target"></div>
<div ng-include="'/static/partials/logviewer.html'"></div> <div ng-include="'/static/partials/logviewer.html'"></div>
<div ng-include="'/static/partials/schedule_dialog.html'"></div>
</div> </div>
</div> </div>

View File

@@ -2,5 +2,4 @@
<div ui-view></div> <div ui-view></div>
<div ng-cloak id="htmlTemplate" class="Panel"></div> <div ng-cloak id="htmlTemplate" class="Panel"></div>
<div ng-include="'/static/partials/logviewer.html'"></div> <div ng-include="'/static/partials/logviewer.html'"></div>
<div ng-include="'/static/partials/schedule_dialog.html'"></div>
</div> </div>

View File

@@ -1,5 +1,3 @@
<div class="Panel"> <div class="Panel">
<div id="schedule-list-target"></div> <div id="schedule-list-target"></div>
</div> </div>
<div ng-include="'/static/partials/schedule_dialog.html'"></div>

View File

@@ -1,13 +0,0 @@
<div id="scheduler-modal-dialog">
<ul id="scheduler-tabs" class="nav nav-tabs">
<li class="active"><a href="#schedule" id="schedule-link" data-toggle="tab" ng-click="toggleTab($event, 'schedule-link', 'scheduler-tabs')">Options</a></li>
<li><a href="#occurrences" id="occurrence-link" data-toggle="tab" ng-click="toggleTab($event, 'occurrence-link', 'scheduler-tabs')">Details</a></li>
</ul>
<div class="tab-content">
<div class="tab-pane active" id="schedule">
<div id="form-container"></div>
</div>
<div class="tab-pane" id="occurrences">
</div>
</div>
</div>

View File

@@ -14,15 +14,19 @@
export default [ export default [
'$scope', '$compile', '$location', '$stateParams', 'SchedulesList', 'Rest', '$scope', '$compile', '$location', '$stateParams', 'SchedulesList', 'Rest',
'ProcessErrors', 'ReturnToCaller', 'ClearScope', 'GetBasePath', 'Wait', 'ProcessErrors', 'ReturnToCaller', 'ClearScope', 'GetBasePath', 'Wait',
'Find', 'LoadDialogPartial', 'LoadSchedulesScope', 'GetChoices', '$q', 'Find', 'LoadSchedulesScope', 'GetChoices', '$q',
function ($scope, $compile, $location, $stateParams, function ($scope, $compile, $location, $stateParams,
SchedulesList, Rest, ProcessErrors, ReturnToCaller, ClearScope, SchedulesList, Rest, ProcessErrors, ReturnToCaller, ClearScope,
GetBasePath, Wait, Find, LoadDialogPartial, LoadSchedulesScope, GetChoices, GetBasePath, Wait, Find, LoadSchedulesScope, GetChoices,
$q) { $q) {
ClearScope(); ClearScope();
$scope.schedulerStartDT = 'test';
var base, id, url,parentObject, title; var base, id, url,parentObject, title;
$scope.schedulerStartDT = 'test';
base = $location.path().replace(/^\//, '').split('/')[0]; base = $location.path().replace(/^\//, '').split('/')[0];
if (base === 'management_jobs') { if (base === 'management_jobs') {

View File

@@ -2,5 +2,3 @@
<div class="Panel"> <div class="Panel">
<div id="schedule-list-target"></div> <div id="schedule-list-target"></div>
</div> </div>
<div ng-include="'/static/partials/schedule_dialog.html'"></div>

View File

@@ -4,12 +4,27 @@
* All Rights Reserved * All Rights Reserved
*************************************************/ *************************************************/
export default ['$compile', '$state', '$stateParams', 'AddSchedule', 'Wait', export default ['$compile', '$filter', '$state', '$stateParams', 'AddSchedule', 'Wait',
'$scope', '$rootScope', 'CreateSelect2', 'ParseTypeChange', 'GetBasePath', '$scope', '$rootScope', 'CreateSelect2', 'ParseTypeChange', 'GetBasePath',
'Rest', 'ParamPass', 'Rest', 'ParamPass',
function($compile, $state, $stateParams, AddSchedule, Wait, $scope, function($compile, $filter, $state, $stateParams, AddSchedule, Wait, $scope,
$rootScope, CreateSelect2, ParseTypeChange, GetBasePath, Rest, ParamPass) { $rootScope, CreateSelect2, ParseTypeChange, GetBasePath, Rest, ParamPass) {
$scope.processSchedulerEndDt = function(){
// set the schedulerEndDt to be equal to schedulerStartDt + 1 day @ midnight
var dt = new Date($scope.schedulerUTCTime);
// increment date by 1 day
dt.setDate(dt.getDate() + 1);
var month = $filter('schZeroPad')(dt.getMonth() + 1, 2),
day = $filter('schZeroPad')(dt.getDate(), 2);
$scope.$parent.schedulerEndDt = month + '/' + day + '/' + dt.getFullYear();
};
// initial end @ midnight values
$scope.schedulerEndHour = "00";
$scope.schedulerEndMinute = "00";
$scope.schedulerEndSecond = "00";
$scope.$on("ScheduleFormCreated", function(e, scope) { $scope.$on("ScheduleFormCreated", function(e, scope) {
$scope.hideForm = false; $scope.hideForm = false;
$scope = angular.extend($scope, scope); $scope = angular.extend($scope, scope);
@@ -37,7 +52,10 @@ export default ['$compile', '$state', '$stateParams', 'AddSchedule', 'Wait',
"yearlyOtherMonth", "yearlyOtherMonth",
"schedulerEnd", "schedulerEnd",
"schedulerOccurrenceCount", "schedulerOccurrenceCount",
"schedulerEndDt" "schedulerEndDt",
"schedulerEndHour",
"schedulerEndMinute",
"schedularEndSecond"
], function() { ], function() {
$scope.$emit("formUpdated"); $scope.$emit("formUpdated");
}, true); }, true);
@@ -73,20 +91,6 @@ export default ['$compile', '$state', '$stateParams', 'AddSchedule', 'Wait',
field_id: 'SchedulerForm-extraVars' field_id: 'SchedulerForm-extraVars'
}); });
}); });
$scope.$watch('extraVars', function(){
if ($scope.parseType === 'yaml'){
try{
$scope.serializedExtraVars = jsyaml.safeLoad($scope.extraVars);
}
catch(err){ return; }
}
else if ($scope.parseType === 'json'){
try{
$scope.serializedExtraVars = JSON.parse($scope.extraVars);
}
catch(err){ return; }
}
});
} }
else if ($state.current.name === 'projectSchedules.add'){ else if ($state.current.name === 'projectSchedules.add'){
$scope.extraVars = '---'; $scope.extraVars = '---';

View File

@@ -51,18 +51,6 @@ export default ['$compile', '$state', '$stateParams', 'EditSchedule', 'Wait', '$
// extra_data field is not manifested in the UI when scheduling a Management Job // extra_data field is not manifested in the UI when scheduling a Management Job
if ($state.current.name !== ('managementJobSchedules.add' || 'managementJobSchedules.edit')){ if ($state.current.name !== ('managementJobSchedules.add' || 'managementJobSchedules.edit')){
$scope.$on('ScheduleFound', function(){ $scope.$on('ScheduleFound', function(){
if ($scope.parseType === 'yaml'){
try{
$scope.extraVars = '---\n' + jsyaml.safeDump($scope.serializedExtraVars);
}
catch(err){ return; }
}
else if ($scope.parseType === 'json'){
try{
$scope.extraVars = JSON.stringify($scope.serializedExtraVars, null, ' ');
}
catch(err){ return; }
}
ParseTypeChange({ ParseTypeChange({
scope: $scope, scope: $scope,
variable: 'extraVars', variable: 'extraVars',
@@ -70,21 +58,6 @@ export default ['$compile', '$state', '$stateParams', 'EditSchedule', 'Wait', '$
field_id: 'SchedulerForm-extraVars' field_id: 'SchedulerForm-extraVars'
}); });
}); });
$scope.$watch('extraVars', function(){
if ($scope.parseType === 'yaml'){
try{
$scope.serializedExtraVars = jsyaml.safeLoad($scope.extraVars);
}
catch(err){ return; }
}
else if ($scope.parseType === 'json'){
try{
$scope.serializedExtraVars = JSON.parse($scope.extraVars);
}
catch(err){ return; }
}
});
} }
EditSchedule({ EditSchedule({

View File

@@ -12,7 +12,7 @@
<div id="SchedulerFormTarget"> <div id="SchedulerFormTarget">
<form class="form Form" <form class="form Form"
role="form" role="form"
name="scheduler_form_new" name="scheduler_form"
novalidate> novalidate>
<div class="form-group SchedulerForm-formGroup"> <div class="form-group SchedulerForm-formGroup">
@@ -24,13 +24,13 @@
type="text" type="text"
class="form-control input-sm class="form-control input-sm
Form-textInput" Form-textInput"
ng-class="{'RepeatFrequencyOptions-nameBorderErrorFix': scheduler_form_new.$dirty && scheduler_form_new.schedulerName.$error.required}" ng-class="{'RepeatFrequencyOptions-nameBorderErrorFix': scheduler_form.$dirty && scheduler_form.schedulerName.$error.required}"
name="schedulerName" name="schedulerName"
id="schedulerName" id="schedulerName"
ng-model="schedulerName" required ng-model="schedulerName" required
placeholder="Schedule name"> placeholder="Schedule name">
<div class="error" <div class="error"
ng-show="scheduler_form_new.$dirty && scheduler_form_new.schedulerName.$error.required"> ng-show="scheduler_form.$dirty && scheduler_form.schedulerName.$error.required">
A schedule name is required. A schedule name is required.
</div> </div>
</div> </div>
@@ -52,7 +52,7 @@
sch-date-picker sch-date-picker
placeholder="mm/dd/yyyy" placeholder="mm/dd/yyyy"
required required
ng-change="scheduleTimeChange()" > ng-change="scheduleTimeChange(processSchedulerEndDt)" >
<span class="input-group-btn"> <span class="input-group-btn">
<button <button
class="btn btn-default btn-sm class="btn btn-default btn-sm
@@ -84,7 +84,7 @@
<div class="input-group SchedulerTime"> <div class="input-group SchedulerTime">
<input name="schedulerStartHour" <input name="schedulerStartHour"
id="schedulerStartHour" id="schedulerStartHour"
sch-spinner="scheduler_form_new" sch-spinner="scheduler_form"
class="scheduler-time-spinner class="scheduler-time-spinner
ScheduleTime-input SpinnerInput" ScheduleTime-input SpinnerInput"
ng-model="schedulerStartHour" ng-model="schedulerStartHour"
@@ -98,7 +98,7 @@
</span> </span>
<input name="schedulerStartMinute" <input name="schedulerStartMinute"
id="schedulerStartMinute" id="schedulerStartMinute"
sch-spinner="scheduler_form_new" sch-spinner="scheduler_form"
class="scheduler-time-spinner class="scheduler-time-spinner
SchedulerTime-input SpinnerInput" SchedulerTime-input SpinnerInput"
ng-model="schedulerStartMinute" ng-model="schedulerStartMinute"
@@ -112,7 +112,7 @@
</span> </span>
<input name="schedulerStartSecond" <input name="schedulerStartSecond"
id="schedulerStartSecond" id="schedulerStartSecond"
sch-spinner="scheduler_form_new" sch-spinner="scheduler_form"
class="scheduler-time-spinner class="scheduler-time-spinner
SchedulerTime-input SpinnerInput" SchedulerTime-input SpinnerInput"
ng-model="schedulerStartSecond" ng-model="schedulerStartSecond"
@@ -120,18 +120,6 @@
min="0" max="59" data-zero-pad="2" min="0" max="59" data-zero-pad="2"
required required
ng-change="scheduleTimeChange()" > ng-change="scheduleTimeChange()" >
<!-- <div class="form-group
SchedulerTime-utc"
ng-show="schedulerShowUTCStartTime">
<label
class="SchedulerTime-utcLabel">
UTC Start Time
</label>
<div id="schedulerUTCTime"
class="SchedulerTime-utcTime">
{{ schedulerUTCTime.split("UTC")[0] }}
</div>
</div> -->
</div> </div>
<div class="error" <div class="error"
ng-show="scheduler_startTime_error"> ng-show="scheduler_startTime_error">
@@ -187,7 +175,7 @@
</label> </label>
<input name="schedulerInterval" <input name="schedulerInterval"
id="schedulerInterval" id="schedulerInterval"
sch-spinner="scheduler_form_new" sch-spinner="scheduler_form"
class="scheduler-spinner class="scheduler-spinner
SpinnerInput" SpinnerInput"
ng-model="$parent.schedulerInterval" ng-model="$parent.schedulerInterval"
@@ -223,7 +211,7 @@
<input <input
name="monthDay" name="monthDay"
id="monthDay" id="monthDay"
sch-spinner="scheduler_form_new" sch-spinner="scheduler_form"
class="scheduler-spinner SpinnerInput" class="scheduler-spinner SpinnerInput"
ng-model="$parent.monthDay" ng-model="$parent.monthDay"
min="1" max="31" min="1" max="31"
@@ -300,7 +288,7 @@
</select> </select>
<input name="yearlyMonthDay" <input name="yearlyMonthDay"
id="yearlyMonthDay" id="yearlyMonthDay"
sch-spinner="scheduler_form_new" sch-spinner="scheduler_form"
class="scheduler-spinner class="scheduler-spinner
SpinnerInput" SpinnerInput"
ng-model="$parent.yearlyMonthDay" ng-model="$parent.yearlyMonthDay"
@@ -458,8 +446,7 @@
ng-options="e.name for e in endOptions" ng-options="e.name for e in endOptions"
required required
class="MakeSelect2 class="MakeSelect2
form-control input-sm" form-control input-sm">
ng-change="schedulerEndChange()">
</select> </select>
</div> </div>
</div> </div>
@@ -474,7 +461,7 @@
<input <input
ng-name="schedulerOccurrenceCount" ng-name="schedulerOccurrenceCount"
ng-id="schedulerOccurrenceCount" ng-id="schedulerOccurrenceCount"
sch-spinner="scheduler_form_new" sch-spinner="scheduler_form"
class="scheduler-spinner class="scheduler-spinner
SpinnerInput" SpinnerInput"
ng-model="$parent.schedulerOccurrenceCount" ng-model="$parent.schedulerOccurrenceCount"
@@ -522,6 +509,65 @@
Please provide a valid date. Please provide a valid date.
</div> </div>
</div> </div>
<div class="form-group SchedulerForm-formGroup"
ng-if="schedulerEnd && schedulerEnd.value == 'on'">
<label class="Form-inputLabel">
<span class="red-text">*</span>
End Time
<span class="fmt-help"
ng-show="schedulerShowTimeZone">
(HH24:MM:SS)
</span>
<span class="fmt-help"
ng-show="!schedulerShowTimeZone">
(HH24:MM:SS UTC)
</span>
</label>
<div class="input-group SchedulerTime">
<input name="schedulerEndHour"
id="schedulerEndHour"
sch-spinner="scheduler_form"
class="scheduler-time-spinner
ScheduleTime-input SpinnerInput"
ng-model="$parent.schedulerEndHour"
placeholder="HH24"
aw-min="0" min="0" aw-max="23"
max="23" data-zero-pad="2" required
ng-change="schedulerEndChange('schedulerEndHour', $parent.schedulerEndHour)" >
<span
class="SchedulerTime-separator">
:
</span>
<input name="schedulerEndMinute"
id="$parent.schedulerEndMinute"
sch-spinner="scheduler_form"
class="scheduler-time-spinner
SchedulerTime-input SpinnerInput"
ng-model="$parent.schedulerEndMinute"
placeholder="MM"
min="0" max="59" data-zero-pad="2"
required
ng-change="schedulerEndChange('schedulerEndMinute', $parent.schedulerEndMinute)" >
<span
class="SchedulerTime-separator">
:
</span>
<input name="schedulerEndSecond"
id="schedulerEndSecond"
sch-spinner="scheduler_form"
class="scheduler-time-spinner
SchedulerTime-input SpinnerInput"
ng-model="$parent.schedulerEndSecond"
placeholder="SS"
min="0" max="59" data-zero-pad="2"
required
ng-change="schedulerEndChange('schedulerEndSecond', $parent.schedulerEndSecond)" >
</div>
<div class="error"
ng-show="scheduler_startTime_error">
The time must be in HH24:MM:SS format.
</div>
</div>
</div> </div>
<div class="RepeatFrequencyOptions-subFormBorderFixer" <div class="RepeatFrequencyOptions-subFormBorderFixer"
ng-show="schedulerFrequency.value && schedulerFrequency.value !== 'none'"> ng-show="schedulerFrequency.value && schedulerFrequency.value !== 'none'">
@@ -529,7 +575,7 @@
</form> </form>
<div class="SchedulerFormDetail-container <div class="SchedulerFormDetail-container
SchedulerFormDetail-container--error" SchedulerFormDetail-container--error"
ng-show="!schedulerIsValid && scheduler_form_new.$dirty"> ng-show="!schedulerIsValid && scheduler_form.$dirty">
<p class="SchedulerFormDetail-errorText"> <p class="SchedulerFormDetail-errorText">
The scheduler options are invalid or incomplete. The scheduler options are invalid or incomplete.
</p> </p>