diff --git a/languages/en_CA.json b/languages/en_CA.json index 362518ba..2cc9f748 100644 --- a/languages/en_CA.json +++ b/languages/en_CA.json @@ -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", diff --git a/libs/scheduler.js b/libs/scheduler.js index 4cf08121..f5665c68 100644 --- a/libs/scheduler.js +++ b/libs/scheduler.js @@ -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 + } } }) }) diff --git a/web/libs/js/dash2.schedules.js b/web/libs/js/dash2.schedules.js new file mode 100644 index 00000000..51b1ad74 --- /dev/null +++ b/web/libs/js/dash2.schedules.js @@ -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; + }) +}) diff --git a/web/pages/blocks/schedules.ejs b/web/pages/blocks/schedules.ejs index 21bf25e5..1a44d396 100644 --- a/web/pages/blocks/schedules.ejs +++ b/web/pages/blocks/schedules.ejs @@ -35,16 +35,195 @@ +