Update Scheduling Manager

- Add selection for Days of the week
- Add Timezone selector
- cleanup schedule.js
pushover
Moe 2019-07-23 22:06:23 -07:00
parent dfd241d30e
commit c31d3bfebd
4 changed files with 387 additions and 142 deletions

View File

@ -38,6 +38,14 @@
"Allow API Trigger": "Allow API Trigger",
"When Detector is Off": "When Detector is Off",
"When Detector is On": "When Detector is On",
"Sunday": "Sunday",
"Monday": "Monday",
"Tuesday": "Tuesday",
"Wednesday": "Wednesday",
"Thursday": "Thursday",
"Friday": "Friday",
"Saturday": "Saturday",
"Today": "Today",
"Always": "Always",
"Never": "Never",
"API": "API",
@ -368,6 +376,7 @@
"hours": "hours",
"a day": "a day",
"days": "days",
"Days": "Days",
"a month": "a month",
"months": "months",
"a year": "a year",
@ -375,6 +384,8 @@
"Identity": "Identity",
"Input": "Input",
"Input Feed": "Input Feed",
"Timezone": "Timezone",
"Timezone Offset": "Timezone Offset",
"Stream": "Stream",
"Stream Timestamp": "Stream Timestamp",
"Stream Watermark": "Stream Watermark",

View File

@ -15,6 +15,10 @@ module.exports = function(s,config,lang,app,io){
var schedule = Object.assign(row,{})
if(!s.schedules[schedule.ke])s.schedules[schedule.ke] = {}
s.checkDetails(schedule)
schedule.timezoneOffset = parseInt(schedule.details.timezone) || 0
schedule.details.days.forEach(function(dayNumber,key){
schedule.details.days[key] = parseInt(dayNumber)
})
if(!s.schedules[schedule.ke][schedule.name]){
s.schedules[schedule.ke][schedule.name] = schedule
}else{
@ -22,7 +26,10 @@ module.exports = function(s,config,lang,app,io){
}
}
//check time in schedule
s.checkTimeAgainstSchedule = function(start,end,callback){
var checkTimeAgainstSchedule = function(schedule,callback){
var start = schedule.start
var end = schedule.end
if(!callback)callback = function(){}
try{
if(
start
@ -32,16 +39,17 @@ module.exports = function(s,config,lang,app,io){
var startHour = parseInt(startSplit[0])
var startMin = parseInt(startSplit[1])
checkStartTime.setHours(startHour)
checkStartTime.setMinutes(startMin)
checkStartTime.setMinutes(startMin - schedule.timezoneOffset)
if(end){
var checkEndTime = new Date()
var endSplit = end.split(':')
var endHour = parseInt(endSplit[0])
var endMin = parseInt(endSplit[1])
checkEndTime.setHours(endHour)
checkEndTime.setMinutes(endMin)
checkEndTime.setMinutes(endMin - schedule.timezoneOffset)
}
var currentDate = new Date()
currentDate.setMinutes(currentDate.getMinutes() - schedule.timezoneOffset)
if(
(
currentDate >= checkStartTime &&
@ -50,6 +58,7 @@ module.exports = function(s,config,lang,app,io){
currentDate >= checkStartTime && !end
){
callback()
return true
}else{
callback({
currentDate : currentDate,
@ -58,12 +67,46 @@ module.exports = function(s,config,lang,app,io){
})
}
}else{
callback()
callback({}) //no start time selected, failed
}
}catch(err){
console.log(err)
callback()
callback(err)
}
return false
}
//check days in schedule
var checkDaysAgainstSchedule = function(schedule,callback){
var days = schedule.details.days
if(!callback)callback = function(){}
console.log(days)
try{
if(
days
){
var currentDate = new Date()
currentDate.setMinutes(currentDate.getMinutes() - schedule.timezoneOffset)
var currentDay = currentDate.getDay()
if(
days.indexOf(currentDay) > -1 // if currentDay of week is found in schedule selection
){
callback()
return true
}else{
callback({
currentDate: currentDate,
currentDay: currentDay
})
}
}else{
callback() //no days selected, succeed
return true
}
}catch(err){
console.log(err)
callback(err)
}
return false
}
//check all Schedules
s.checkSchedules = function(v,callback){
@ -73,25 +116,25 @@ module.exports = function(s,config,lang,app,io){
scheduleNames.forEach(function(name){
var schedule = s.schedules[key][name]
if(!schedule.active && schedule.enabled === 1 && schedule.start && schedule.details.monitorStates){
s.checkTimeAgainstSchedule(schedule.start,schedule.end,function(err){
if(!err){
schedule.active = true
var monitorStates = schedule.details.monitorStates
monitorStates.forEach(function(stateName){
s.activateMonitorStates(key,stateName,{
ke: key,
uid: 'System',
details: {},
permissions: {},
lang: lang
},function(endData){
// console.log(endData)
})
var timePasses = checkTimeAgainstSchedule(schedule)
var daysPasses = checkDaysAgainstSchedule(schedule)
if(timePasses && daysPasses){
schedule.active = true
var monitorStates = schedule.details.monitorStates
monitorStates.forEach(function(stateName){
s.activateMonitorStates(key,stateName,{
ke: key,
uid: 'System',
details: {},
permissions: {},
lang: lang
},function(endData){
// console.log(endData)
})
}else{
schedule.active = false
}
})
})
}else{
schedule.active = false
}
}
})
})

View File

@ -0,0 +1,128 @@
$(document).ready(function(){
$.schedules = {
e: $('#schedules'),
selector: $('#schedulesSelector'),
loadedMonitorStates: {},
loadedSchedules: {}
}
$.schedules.f = $.schedules.e.find('form')
$.schedules.selectedStates = $.schedules.e.find('[name="monitorStates"]')
$.schedules.selectedDays = $.schedules.e.find('[name="days"]')
$.schedules.loadSchedules = function(callback){
$.get($.ccio.init('location',$user) + $user.auth_token + '/schedule/' + $user.ke,function(d){
console.log(d)
var html = ''
$.each(d.schedules,function(n,v){
$.schedules.loadedSchedules[v.name] = v
html += $.ccio.tm('option',{
id: v.name,
name: v.name
})
})
$.schedules.selector.find('optgroup').html(html)
if(callback)callback()
})
}
$.schedules.loadMonitorStates = function(){
$.get($.ccio.init('location',$user) + $user.auth_token + '/monitorStates/' + $user.ke,function(d){
var html = ''
$.each(d.presets,function(n,v){
$.schedules.loadedMonitorStates[v.name] = v
html += $.ccio.tm('option',{
id: v.name,
name: v.name
})
})
$.schedules.selectedStates.html(html)
})
}
$.schedules.e.on('shown.bs.modal', function (e) {
$.schedules.loadMonitorStates()
$.schedules.loadSchedules()
})
$.schedules.e.on('click','.delete',function(e){
$.confirm.e.modal('show');
$.confirm.title.text(lang['Delete Monitor States Preset']);
$.confirm.body.html(lang.deleteMonitorStateText1);
$.confirm.click({title:'Delete',class:'btn-danger'},function(){
var form = $.schedules.f.serializeObject()
$.post($.ccio.init('location',$user) + $user.auth_token + '/schedule/' + $user.ke + '/' + form.name + '/delete',function(d){
$.ccio.log(d)
if(d.ok === true){
$.schedules.loadSchedules()
$.ccio.init('note',{title:lang.Success,text:d.msg,type:'success'})
}
})
})
})
$.schedules.selector.change(function(e){
var selected = $(this).val()
var loaded = $.schedules.loadedSchedules[selected]
var namespace = $.schedules.e.find('[name="name"]')
var deleteButton = $.schedules.e.find('.delete')
var tzEl = $.schedules.e.find('[name="timezone"]')
$.schedules.selectedStates.find('option:selected').removeAttr('selected')
$.schedules.selectedDays.find('option:selected').removeAttr('selected')
if(loaded){
namespace.val(loaded.name)
var html = ''
$.each(loaded,function(n,v){
$.schedules.f.find('[name="' + n + '"]').val(v)
})
$.each(loaded.details.monitorStates,function(n,v){
$.schedules.selectedStates.find('option[value="' + v + '"]').prop('selected',true)
})
$.each(loaded.details.days,function(n,v){
$.schedules.selectedDays.find('option[value="' + v + '"]').prop('selected',true)
})
tzEl.val(loaded.details.timezone || '+0')
deleteButton.show()
}else{
tzEl.val('+0')
namespace.val('')
deleteButton.hide()
}
})
$.schedules.f.submit(function(e){
e.preventDefault()
var el = $(this)
var form = el.serializeObject()
var monitors = []
var failedToParseAJson = false
var rows = $.monitorStates.monitors.find('.state-monitor-row')
if(form.name === ''){
return $.ccio.init('note',{title:lang['Invalid Data'],text:lang['Name cannot be empty.'],type:'error'})
}
if(form.start === ''){
return $.ccio.init('note',{title:lang['Invalid Data'],text:lang['Start Time cannot be empty.'],type:'error'})
}
if(form.monitorStates instanceof Array === false){
form.monitorStates = [form.monitorStates]
}
if(!form.days || form.days === ''){
form.days = null
}else if(form.days instanceof Array === false){
form.days = [form.days]
}
var data = {
start: form.start,
end: form.end,
enabled: form.enabled,
details: {
monitorStates: form.monitorStates,
days: form.days,
timezone: form.timezone,
}
}
$.post($.ccio.init('location',$user) + $user.auth_token + '/schedule/' + $user.ke + '/' + form.name + '/insert',{data:data},function(d){
$.ccio.log(d)
if(d.ok === true){
$.schedules.loadSchedules(function(){
$.schedules.selector.val(form.name)
})
$.ccio.init('note',{title:lang.Success,text:d.msg,type:'success'})
}
})
return false;
})
})

View File

@ -35,16 +35,195 @@
</select></div>
</label>
</div>
<div class="form-group">
<label><div><span><%-lang['Timezone Offset']%></span></div>
<div><select class="form-control" name="timezone">
<% [
{
"text": "UTC12:00, Y",
"value": -720
},
{
"text": "UTC11:00, X",
"value": -660
},
{
"text": "UTC10:00, W",
"value": -600
},
{
"text": "UTC09:30, V†",
"value": -570
},
{
"text": "UTC09:00, V",
"value": -540
},
{
"text": "UTC08:00, U",
"value": -480
},
{
"text": "UTC07:00, T",
"value": -420
},
{
"text": "UTC06:00, S",
"value": -360
},
{
"text": "UTC05:00, R",
"value": -300
},
{
"text": "UTC04:00, Q",
"value": -240
},
{
"text": "UTC03:30, P†",
"value": -210
},
{
"text": "UTC03:00, P",
"value": -180
},
{
"text": "UTC02:00, O",
"value": -120
},
{
"text": "UTC01:00, N",
"value": -60
},
{
"text": "UTC±00:00, Z",
"value": 0,
"selected": true
},
{
"text": "UTC+01:00, A",
"value": 60
},
{
"text": "UTC+02:00, B",
"value": 120
},
{
"text": "UTC+03:00, C",
"value": 180
},
{
"text": "UTC+03:30, C†",
"value": 210
},
{
"text": "UTC+04:00, D",
"value": 240
},
{
"text": "UTC+04:30, D†",
"value": 270
},
{
"text": "UTC+05:00, E",
"value": 300
},
{
"text": "UTC+05:30, E†",
"value": 330
},
{
"text": "UTC+05:45, E*",
"value": 345
},
{
"text": "UTC+06:00, F",
"value": 360
},
{
"text": "UTC+06:30, F†",
"value": 390
},
{
"text": "UTC+07:00, G",
"value": 420
},
{
"text": "UTC+08:00, H",
"value": 480
},
{
"text": "UTC+08:45, H*",
"value": 525
},
{
"text": "UTC+09:00, I",
"value": 540
},
{
"text": "UTC+09:30, I†",
"value": 570
},
{
"text": "UTC+10:00, K",
"value": 600
},
{
"text": "UTC+10:30, K†",
"value": 630
},
{
"text": "UTC+11:00, L",
"value": 660
},
{
"text": "UTC+12:00, M",
"value": 720
},
{
"text": "UTC+12:45, M*",
"value": 765
},
{
"text": "UTC+13:00, M†",
"value": 780
},
{
"text": "UTC+14:00, M†",
"value": 840
}
].forEach(function(option){
var selected = ''
if(option.selected)selected = 'selected'
%>
<option value="<%- option.value %>" <%- selected %>><%- option.text %></option>
<% }) %>
</select></div>
</label>
</div>
<div class="form-group">
<label><div><span><%-lang['Start']%></span></div>
<div><input class="form-control" name="start" placeholder="HH:ss"></div>
<div><input class="form-control" name="start" placeholder="HH:mm"></div>
</label>
</div>
<div class="form-group">
<label><div><span><%-lang['End']%></span></div>
<div><input class="form-control" name="end" placeholder="HH:ss"></div>
<div><input class="form-control" name="end" placeholder="HH:mm"></div>
</label>
</div>
<div class="form-group">
<label><div><span><%-lang['Days']%></span></div>
<div><select class="form-control" style="min-height:100px" multiple name="days">
<option value="0"><%- lang.Sunday %></option>
<option value="1"><%- lang.Monday %></option>
<option value="2"><%- lang.Tuesday %></option>
<option value="3"><%- lang.Wednesday %></option>
<option value="4"><%- lang.Thursday %></option>
<option value="5"><%- lang.Friday %></option>
<option value="6"><%- lang.Saturday %></option>
</select></div>
</label>
</div>
<div class="form-group">
<label><div><span><%-lang['Monitor States']%></span></div>
<div><select class="form-control" style="min-height:100px" multiple name="monitorStates">
@ -60,120 +239,4 @@
</form>
</div>
</div>
<script>
$(document).ready(function(){
$.schedules = {
e: $('#schedules'),
selector: $('#schedulesSelector'),
loadedMonitorStates: {},
loadedSchedules: {}
}
$.schedules.f = $.schedules.e.find('form')
$.schedules.selectedStates = $.schedules.e.find('[name="monitorStates"]')
$.schedules.loadSchedules = function(callback){
$.get($.ccio.init('location',$user) + $user.auth_token + '/schedule/' + $user.ke,function(d){
console.log(d)
var html = ''
$.each(d.schedules,function(n,v){
$.schedules.loadedSchedules[v.name] = v
html += $.ccio.tm('option',{
id: v.name,
name: v.name
})
})
$.schedules.selector.find('optgroup').html(html)
if(callback)callback()
})
}
$.schedules.loadMonitorStates = function(){
$.get($.ccio.init('location',$user) + $user.auth_token + '/monitorStates/' + $user.ke,function(d){
var html = ''
$.each(d.presets,function(n,v){
$.schedules.loadedMonitorStates[v.name] = v
html += $.ccio.tm('option',{
id: v.name,
name: v.name
})
})
$.schedules.selectedStates.html(html)
})
}
$.schedules.e.on('shown.bs.modal', function (e) {
$.schedules.loadMonitorStates()
$.schedules.loadSchedules()
})
$.schedules.e.on('click','.delete',function(e){
$.confirm.e.modal('show');
$.confirm.title.text(lang['Delete Monitor States Preset']);
$.confirm.body.html(lang.deleteMonitorStateText1);
$.confirm.click({title:'Delete',class:'btn-danger'},function(){
var form = $.schedules.f.serializeObject()
$.post($.ccio.init('location',$user) + $user.auth_token + '/schedule/' + $user.ke + '/' + form.name + '/delete',function(d){
$.ccio.log(d)
if(d.ok === true){
$.schedules.loadSchedules()
$.ccio.init('note',{title:lang.Success,text:d.msg,type:'success'})
}
})
})
})
$.schedules.selector.change(function(e){
var selected = $(this).val()
var loaded = $.schedules.loadedSchedules[selected]
var namespace = $.schedules.e.find('[name="name"]')
var deleteButton = $.schedules.e.find('.delete')
$.schedules.selectedStates.find('option:selected').removeAttr('selected')
if(loaded){
namespace.val(loaded.name)
var html = ''
$.each(loaded,function(n,v){
$.schedules.f.find('[name="' + n + '"]').val(v)
})
$.each(loaded.details.monitorStates,function(n,v){
$.schedules.selectedStates.find('option[value="' + v + '"]').prop('selected',true)
})
deleteButton.show()
}else{
namespace.val('')
deleteButton.hide()
}
})
$.schedules.f.submit(function(e){
e.preventDefault()
var el = $(this)
var form = el.serializeObject()
var monitors = []
var failedToParseAJson = false
var rows = $.monitorStates.monitors.find('.state-monitor-row')
if(form.name === ''){
return $.ccio.init('note',{title:lang['Invalid Data'],text:lang['Name cannot be empty.'],type:'error'})
}
if(form.start === ''){
return $.ccio.init('note',{title:lang['Invalid Data'],text:lang['Start Time cannot be empty.'],type:'error'})
}
if(form.monitorStates instanceof Array === false){
form.monitorStates = [form.monitorStates]
}
console.log(form.monitorStates)
var data = {
start: form.start,
end: form.end,
enabled: form.enabled,
details:{
monitorStates: form.monitorStates
}
}
$.post($.ccio.init('location',$user) + $user.auth_token + '/schedule/' + $user.ke + '/' + form.name + '/insert',{data:data},function(d){
$.ccio.log(d)
if(d.ok === true){
$.schedules.loadSchedules(function(){
$.schedules.selector.val(form.name)
})
$.ccio.init('note',{title:lang.Success,text:d.msg,type:'success'})
}
})
return false;
})
})
</script>
<script src="<%-window.libURL%>libs/js/dash2.schedules.js"></script>