summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--www/js/DataModel.js7
-rw-r--r--www/js/LoginCtrl.js3
-rw-r--r--www/js/TimelineCtrl.js266
-rw-r--r--www/lang/README.md3
-rw-r--r--www/lang/locale-en.json1
-rw-r--r--www/templates/timeline.html3
6 files changed, 204 insertions, 79 deletions
diff --git a/www/js/DataModel.js b/www/js/DataModel.js
index ad1aaff6..e6af8baa 100644
--- a/www/js/DataModel.js
+++ b/www/js/DataModel.js
@@ -1493,6 +1493,9 @@ angular.module('zmApp.controllers')
},
+ getLocalTimeZoneNow: function() {
+ return moment.tz.guess();
+ },
//returns TZ value immediately (sync)
getTimeZoneNow: function() {
@@ -1507,10 +1510,10 @@ angular.module('zmApp.controllers')
return isTzSupported;
},
- getTimeZone: function() {
+ getTimeZone: function(isForce) {
var d = $q.defer();
- if (!tz) {
+ if (!tz || isForce) {
log("First invocation of TimeZone, asking server");
var apiurl = loginData.apiurl + '/host/getTimeZone.json';
diff --git a/www/js/LoginCtrl.js b/www/js/LoginCtrl.js
index 4e4efc0a..db0440b4 100644
--- a/www/js/LoginCtrl.js
+++ b/www/js/LoginCtrl.js
@@ -606,10 +606,13 @@ angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$r
// possible image digits changed between servers
NVRDataModel.getKeyConfigParams(0);
+
NVRDataModel.log("Validating APIs at " + apiurl);
$http.get(apiurl)
.success(function (data) {
+
+ NVRDataModel.getTimeZone(true);
var loginStatus = $translate.instant('kExploreEnjoy') + " " + $rootScope.appName + "!";
EventServer.refresh();
diff --git a/www/js/TimelineCtrl.js b/www/js/TimelineCtrl.js
index 523c6d5d..0f67b085 100644
--- a/www/js/TimelineCtrl.js
+++ b/www/js/TimelineCtrl.js
@@ -96,7 +96,12 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
});
}
-
+ // helps to navigate to current time quickly
+ // after a night of heavy navigation
+ $scope.gotoNow = function()
+ {
+ timeline.moveTo(timeline.getCurrentTime());
+ };
$scope.move = function(percentage) {
move(percentage);
@@ -308,7 +313,7 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
$scope.$on('$ionicView.afterEnter', function() {
$scope.monitors = message;
- console.log("***AFTER ENTER");
+ //console.log("***AFTER ENTER");
$scope.follow = { 'time': NVRDataModel.getLogin().followTimeLine };
@@ -353,11 +358,11 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
- console.log ("MONITORS:"+JSON.stringify($scope.monitors));
+ //console.log ("MONITORS:"+JSON.stringify($scope.monitors));
if ($rootScope.customTimelineRange) {
$scope.currentMode = 'custom';
- console.log("***** CUSTOM RANGE");
+ //console.log("***** CUSTOM RANGE");
if (moment($rootScope.fromString).isValid() &&
moment($rootScope.toString).isValid()) {
// console.log("FROM & TO IS CUSTOM");
@@ -368,15 +373,34 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
drawGraph(fromDate, toDate, maxItems);
} else {
console.log ("From:"+$rootScope.fromString + " To:"+$rootScope.toString);
- console.log("FROM & TO IS CUSTOM INVALID");
- fromDate = moment().startOf('day').format("YYYY-MM-DD HH:mm:ss");
- toDate = moment().endOf('day').format("YYYY-MM-DD HH:mm:ss");
+ //console.log("FROM & TO IS CUSTOM INVALID");
+
+ if (NVRDataModel.getLogin().useLocalTimeZone)
+ {
+ fromDate = moment().startOf('day').format("YYYY-MM-DD HH:mm:ss");
+ toDate = moment().endOf('day').format("YYYY-MM-DD HH:mm:ss");
+ }
+ else
+ {
+ fromDate = moment().tz(NVRDataModel.getTimeZoneNow()).startOf('day').format("YYYY-MM-DD HH:mm:ss");
+ toDate = moment().tz(NVRDataModel.getTimeZoneNow()).endOf('day').format("YYYY-MM-DD HH:mm:ss");
+ }
+
drawGraph(fromDate, toDate, maxItems);
}
} else {
$scope.currentMode = 'day';
- fromDate = moment().startOf('day').format("YYYY-MM-DD HH:mm:ss");
- toDate = moment().endOf('day').format("YYYY-MM-DD HH:mm:ss");
+
+ if (NVRDataModel.getLogin().useLocalTimeZone)
+ {
+ fromDate = moment().startOf('day').format("YYYY-MM-DD HH:mm:ss");
+ toDate = moment().endOf('day').format("YYYY-MM-DD HH:mm:ss");
+ }
+ else
+ {
+ fromDate = moment().tz(NVRDataModel.getTimeZoneNow()).startOf('day').format("YYYY-MM-DD HH:mm:ss");
+ toDate = moment().tz(NVRDataModel.getTimeZoneNow()).endOf('day').format("YYYY-MM-DD HH:mm:ss");
+ }
drawGraph(fromDate, toDate, maxItems);
}
@@ -449,8 +473,12 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
// fromDate and toDate will be used to plot the range for the graph
// We start in day mode
- var fromDate = moment().startOf('day').format("YYYY-MM-DD HH:mm:ss");
- var toDate = moment().endOf('day').format("YYYY-MM-DD HH:mm:ss");
+ //
+ var fromDate, toDate;
+
+
+ fromDate = moment().tz(NVRDataModel.getLogin().useLocalTimeZone?NVRDataModel.getLocalTimeZoneNow():NVRDataModel.getTimeZoneNow()).startOf('day').format("YYYY-MM-DD HH:mm:ss");
+ toDate = moment().tz(NVRDataModel.getLogin().useLocalTimeZone?NVRDataModel.getLocalTimeZoneNow():NVRDataModel.getTimeZoneNow()).endOf('day').format("YYYY-MM-DD HH:mm:ss");
@@ -566,8 +594,8 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
$scope.currentMode = "week";
$rootScope.customTimelineRange = false;
NVRDataModel.log("Week view");
- toDate = moment().format("YYYY-MM-DD HH:mm:ss");
- fromDate = moment().subtract(1, 'week').startOf('day').format("YYYY-MM-DD HH:mm:ss");
+ toDate = moment().tz(NVRDataModel.getLogin().useLocalTimeZone?NVRDataModel.getLocalTimeZoneNow():NVRDataModel.getTimeZoneNow()).format("YYYY-MM-DD HH:mm:ss");
+ fromDate = moment().tz(NVRDataModel.getLogin().useLocalTimeZone?NVRDataModel.getLocalTimeZoneNow():NVRDataModel.getTimeZoneNow()).subtract(1, 'week').startOf('day').format("YYYY-MM-DD HH:mm:ss");
$scope.fromDate = fromDate;
$scope.toDate = toDate;
drawGraph(fromDate, toDate, maxItems);
@@ -578,8 +606,8 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
$rootScope.customTimelineRange = false;
NVRDataModel.log("Day view");
//toDate = moment().format("YYYY-MM-DD HH:mm:ss");
- fromDate = moment().startOf('day').format("YYYY-MM-DD HH:mm:ss");
- toDate = moment().endOf('day').format("YYYY-MM-DD HH:mm:ss");
+ fromDate = moment().tz(NVRDataModel.getLogin().useLocalTimeZone?NVRDataModel.getLocalTimeZoneNow():NVRDataModel.getTimeZoneNow()).startOf('day').format("YYYY-MM-DD HH:mm:ss");
+ toDate = moment().tz(NVRDataModel.getLogin().useLocalTimeZone?NVRDataModel.getLocalTimeZoneNow():NVRDataModel.getTimeZoneNow()).endOf('day').format("YYYY-MM-DD HH:mm:ss");
$scope.fromDate = fromDate;
$scope.toDate = toDate;
drawGraph(fromDate, toDate, maxItems);
@@ -607,16 +635,24 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
var ld = NVRDataModel.getLogin();
// check for last 2 minutes to account for late DB updates and what not. 5 mins was likely enough
- var from = moment(lastTimeForEvent).subtract(2, 'minutes').locale('en').format("YYYY-MM-DD HH:mm:ss");
- var to = moment().locale('en').format("YYYY-MM-DD HH:mm:ss");
- lastTimeForEvent = moment();
+ //
+
+
+ // make sure these are server time
+ var from = moment(lastTimeForEvent).tz(NVRDataModel.getTimeZoneNow());
+ from = from.subtract(2, 'minutes').locale('en').format("YYYY-MM-DD HH:mm:ss");
+
+ var to = moment(lastTimeForEvent).tz(NVRDataModel.getTimeZoneNow());
+ to = to.locale('en').format("YYYY-MM-DD HH:mm:ss");
+
+ lastTimeForEvent = moment().tz(NVRDataModel.getLogin().useLocalTimeZone?NVRDataModel.getLocalTimeZoneNow():NVRDataModel.getTimeZoneNow());
// FIXME: totally ignoring event pages - hoping it wont be more than 100 or 150 whatever
// the events per page limit is. Why? laziness.
//
- var completedEvents = ld.apiurl + '/events/index/StartTime >=:' + from;
+ var completedEvents = ld.apiurl + '/events/index/EndTime >=:' + from;
// we can add alarmCount as this is really for completed events
- completedEvents = completedEvents + "/AlarmFrames >=:" + (ld.enableAlarmCount ? ld.minAlarmCount : 0);
+ //completedEvents = completedEvents + "/AlarmFrames >=:" + (ld.enableAlarmCount ? ld.minAlarmCount : 0);
completedEvents = completedEvents + ".json";
@@ -625,11 +661,15 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
// so, lets limiy to 15 m
//
- var st = moment().subtract (10,'minutes').locale('en').format("YYYY-MM-DD HH:mm:ss");
+ var st = moment(lastTimeForEvent).tz(NVRDataModel.getTimeZoneNow());
+ st = st.subtract (10,'minutes').locale('en').format("YYYY-MM-DD HH:mm:ss");
var ongoingEvents = ld.apiurl + '/events/index/StartTime >=:'+st+'/EndTime =:.json';
//NVRDataModel.debug("Getting incremental events using: " + completedEvents);
+ NVRDataModel.debug ("Completed events API:"+completedEvents);
+ NVRDataModel.debug ("Ongoing events API:+"+ongoingEvents);
+
isProcessNewEventsWaiting = true;
var $httpApi = $http.get(completedEvents);
@@ -651,60 +691,81 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
for (var j = 0; j < myevents.length; j++) {
- // get rid of the moment js deprecation notice
- myevents[j].Event.StartTime = moment.tz(myevents[j].Event.StartTime, NVRDataModel.getTimeZoneNow()).tz(moment.tz.guess()).format('YYYY-MM-DD HH:mm:ss');
+ // these are all in server timezone but no TZ
+
+ myevents[j].Event.StartTime = moment.tz(myevents[j].Event.StartTime, NVRDataModel.getTimeZoneNow()).format('YYYY-MM-DD HH:mm:ss');
- myevents[j].Event.EndTime = moment.tz(myevents[j].Event.EndTime, NVRDataModel.getTimeZoneNow()).tz(moment.tz.guess()).format('YYYY-MM-DD HH:mm:ss');
+ myevents[j].Event.EndTime = moment.tz(myevents[j].Event.EndTime, NVRDataModel.getTimeZoneNow()).format('YYYY-MM-DD HH:mm:ss');
var itm = graphData.get(myevents[j].Event.Id);
if (itm) {
- console.log(myevents[j].Event.Id + " already exists, updating params");
+ // console.log(myevents[j].Event.Id + " already exists, updating params");
- var content = "<span class='my-vis-font'>" + myevents[j].Event.Notes + " " + $translate.instant('kRecordingProgress') + "</span>";
+ var content = "<span class='my-vis-font'>" + "("+myevents[j].Event.Id+")"+myevents[j].Event.Notes + " " + $translate.instant('kRecordingProgress') + "</span>";
var style;
var recordingInProgress = false;
if (moment(myevents[j].Event.EndTime).isValid()) // recording over
{
-
- content = "<span class='my-vis-font'>" + "( <i class='ion-android-notifications'></i>" + myevents[j].Event.AlarmFrames + ") " + myevents[j].Event.Notes + "</span>";
+ //console.log ("EVENT "+myevents[j].Event.Id+" emded at "+myevents[j].Event.EndTime);
+
+ content = "<span class='my-vis-font'>" + "( <i class='ion-android-notifications'></i>" + myevents[j].Event.AlarmFrames + ") " + " ("+myevents[j].Event.Id+") "+ myevents[j].Event.Notes + "</span>";
style = "background-color:" + colors[parseInt(myevents[j].Event.MonitorId) % colors.length] +
";border-color:" + colors[parseInt(myevents[j].Event.MonitorId) % colors.length];
} else // still recording
{
- myevents[j].Event.EndTime = moment.tz(moment(), NVRDataModel.getTimeZoneNow()).tz(moment.tz.guess()).format('YYYY-MM-DD HH:mm:ss');
+
+ var tze;
+ tze = moment().tz(NVRDataModel.getTimeZoneNow());
+
+ myevents[j].Event.EndTime = tze.format('YYYY-MM-DD HH:mm:ss');
+
+ //console.log ("END TIME = "+ myevents[j].Event.EndTime);
+
style = "background-color:orange";
recordingInProgress = true;
}
- if (moment(options.max).isBefore(moment())) {
- // console.log("Adjusting Range to fit in new event");
- options.max = moment().add('1', 'hours').locale('en').format("YYYY-MM-DD HH:mm:ss");
- timeline.setOptions(options);
- }
- // data.update({id: 2, group: 1});
- // update end time - is it needed to be updated?
- //
-
+
+
// right at this point we need to decide if we keep or remove this event
//
if (ld.enableAlarmCount && ld.minAlarmCount > myevents[j].Event.AlarmFrames && !recordingInProgress) {
// remove
- NVRDataModel.debug("Removing Event:" + myevents[j].Event.Id + "as it doesn't have" + myevents[j].Event.AlarmFrames + " alarm frames");
+ NVRDataModel.debug("Removing Event:" + myevents[j].Event.Id + "as it doesn't have " + myevents[j].Event.AlarmFrames + " alarm frames");
+ // var old = timeline.getWindow();
graphData.remove(myevents[j].Event.Id);
+ // timeline.setWindow (old.start, old.end);
} else {
+
+ var tzs1, tze1;
+ if (NVRDataModel.getLogin().useLocalTimeZone)
+ {
+ tzs1 = moment.tz(myevents[j].Event.StartTime, NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getLocalTimeZoneNow());
+ tze1 = moment.tz(myevents[j].Event.EndTime, NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getLocalTimeZoneNow());
+ }
+ else
+ {
+ tzs1 = moment.tz(myevents[j].Event.StartTime,NVRDataModel.getTimeZoneNow());
+ tze1 = moment.tz(myevents[j].Event.EndTime,NVRDataModel.getTimeZoneNow());
+ }
+
+ //tzs1 = tzs1.format("YYYY-MM-DD HH:mm:ss");
+ //tze1 = tze1.format("YYYY-MM-DD HH:mm:ss");
+
+ NVRDataModel.debug("Updating Event:" + myevents[j].Event.Id + "StartTime:"+tzs1.format()+" EndTime:" + tze1.format());
graphData.update({
id: myevents[j].Event.Id,
content: content,
- start:moment.tz(myevents[j].Event.StartTime,NVRDataModel.getTimeZoneNow()),
+ start:tzs1,
// start: myevents[j].Event.StartTime,
// end: myevents[j].Event.EndTime,
- end:moment.tz(myevents[j].Event.EndTime,NVRDataModel.getTimeZoneNow()),
- group: myevents[j].Event.MonitorId,
+ end:tze1,
+ //group: myevents[j].Event.MonitorId,
//type: "range",
style: style,
myframes: myevents[j].Event.Frames,
@@ -716,7 +777,10 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
});
- timeline.focus(myevents[j].Event.Id);
+ //timeline.focus(myevents[j].Event.Id);
+ //
+ timeline.moveTo(timeline.getCurrentTime());
+ //console.log ("Focus EID="+myevents[j].Event.Id);
localNewEvents = localNewEvents + NVRDataModel.getMonitorName(myevents[j].Event.MonitorId) + '@' + shortenTime(myevents[j].Event.StartTime) + ' (' + myevents[j].Event.Id + '),';
@@ -754,12 +818,7 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
// console.log (JSON.stringify(myevents[j]));
myevents[j].Event.DefaultVideo = "";
- if (NVRDataModel.getLogin().useLocalTimeZone) {
- //console.log ("CHANGING TZ");
- myevents[j].Event.StartTime = moment.tz(myevents[j].Event.StartTime, NVRDataModel.getTimeZoneNow()).tz(moment.tz.guess()).format('YYYY-MM-DD HH:mm:ss');
- //2016-08-15 17:40:00
- myevents[j].Event.EndTime = moment.tz(myevents[j].Event.EndTime, NVRDataModel.getTimeZoneNow()).tz(moment.tz.guess()).format('YYYY-MM-DD HH:mm:ss');
- }
+
// now lets make sure we don't infinitely increase
@@ -778,48 +837,69 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
// since this is a new add its possible dates are not defined
if (!moment(myevents[j].Event.StartTime).isValid()) {
- NVRDataModel.debug("Event:" + myevents[j].Event.Id + "-Invalid Start time - this should really not happen ");
+ NVRDataModel.log("Event:" + myevents[j].Event.Id + "-Invalid Start time - this should really not happen ");
}
if (!moment(myevents[j].Event.EndTime).isValid()) {
- // NVRDataModel.debug ("Event:" + myevents[j].Event.Id +"-End time is invalid, likely recording, so fixing" );
- myevents[j].Event.EndTime = moment.tz(moment(), NVRDataModel.getTimeZoneNow()).tz(moment.tz.guess()).format('YYYY-MM-DD HH:mm:ss');
+ var t1 = moment().tz(NVRDataModel.getTimeZoneNow());
+
+
+
+ myevents[j].Event.EndTime = t1.format('YYYY-MM-DD HH:mm:ss');
+
+ NVRDataModel.debug ("Event:" + myevents[j].Event.Id +"-End time is invalid, setting to current time");
+
isBeingRecorded = true;
}
// if range doesn't allow for current time, we need to fix that
- if (moment(options.max).isBefore(moment())) {
+ /*if (moment(options.max).isBefore(moment())) {
// console.log("Adjusting Range to fit in new event");
options.max = moment().add('1', 'hours').locale('en').format("YYYY-MM-DD HH:mm:ss");
timeline.setOptions(options);
- }
+ }*/
var eventText = "<span class='my-vis-font'>" + "( <i class='ion-android-notifications'></i>" + (myevents[j].Event.AlarmFrames || ' unknown ') + ") " + myevents[j].Event.Notes + "</span>";
if (isBeingRecorded) {
- eventText = "<span class='my-vis-font'>" + myevents[j].Event.Notes + " " + $translate.instant('kRecordingProgress') + "</span>";
+ eventText = "<span class='my-vis-font'>" + "("+myevents[j].Event.Id+") "+ myevents[j].Event.Notes + " " + $translate.instant('kRecordingProgress') + "</span>";
}
// since we concated, its possible events may be repeated
if (!graphData.get(myevents[j].Event.Id)) {
- NVRDataModel.debug(">>> "+myevents[j].Event.Id + " at " + myevents[j].Event.StartTime + " New event updating graph");
+
localNewEvents = localNewEvents + NVRDataModel.getMonitorName(myevents[j].Event.MonitorId) + '@' + shortenTime(myevents[j].Event.StartTime) + ' (' + myevents[j].Event.Id + '),';
+ var tzs2, tze2;
+ if (NVRDataModel.getLogin().useLocalTimeZone)
+ {
+ tzs2 = moment.tz(myevents[j].Event.StartTime, NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getLocalTimeZoneNow());
+ tze2 = moment.tz(myevents[j].Event.EndTime, NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getLocalTimeZoneNow());
+ }
+ else
+ {
+ tzs2 = moment.tz(myevents[j].Event.StartTime,NVRDataModel.getTimeZoneNow());
+ tze2 = moment.tz(myevents[j].Event.EndTime,NVRDataModel.getTimeZoneNow());
+ }
+
+ //tzs2 = tzs2.format("YYYY-MM-DD HH:mm:ss");
+ //tze2 = tze2.format("YYYY-MM-DD HH:mm:ss");
+ NVRDataModel.debug(">>> "+myevents[j].Event.Id + " New event updating graph " + " from:" + tzs2.format()+" to:"+tze2.format() );
graphData.add({
id: myevents[j].Event.Id,
content: eventText,
- start:moment.tz(myevents[j].Event.StartTime,NVRDataModel.getTimeZoneNow()),
+ start:tzs2,
//start: myevents[j].Event.StartTime,
// end: myevents[j].Event.EndTime,
- end:moment.tz(myevents[j].Event.EndTime,NVRDataModel.getTimeZoneNow()),
+ end:tze2,
group: myevents[j].Event.MonitorId,
style: "background-color:orange",
//type: "range",
@@ -833,11 +913,13 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
});
graphIndex++;
+ //timeline.focus(myevents[j].Event.Id);
+ timeline.moveTo(timeline.getCurrentTime());
}
//options.max = moment(fromDate).locale('en').format("YYYY-MM-DD HH:mm:ss");
- timeline.focus(myevents[j].Event.Id);
+
} //idfound
@@ -918,21 +1000,48 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
//console.log ("AFTER VIS");
+ var tzs, tze;
+
+ // lets scope the time graph to either local or remote time zone
+
+ if (NVRDataModel.getLogin().useLocalTimeZone)
+ {
+ tzs = moment.tz(fromDate, NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getLocalTimeZoneNow());
+ tze = moment.tz(toDate, NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getLocalTimeZoneNow());
+ }
+ else
+ {
+ tzs = moment.tz(fromDate,NVRDataModel.getTimeZoneNow());
+ tze = moment.tz(toDate,NVRDataModel.getTimeZoneNow());
+ }
+
+ //tzs = tzs.format("YYYY-MM-DD HH:mm:ss");
+ //tze = tze.format("YYYY-MM-DD HH:mm:ss");
options = {
showCurrentTime: true,
editable: false,
+ moment: function (date) {
+
+ //var t;
+ if (NVRDataModel.getLogin().useLocalTimeZone)
+ //if (0)
+ return moment.tz(date,NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getLocalTimeZoneNow());
+ else
+ // typecast to server time zone - its in server time anyway
+ return moment.tz(date,NVRDataModel.getTimeZoneNow());
+ },
//throttleRedraw: 100,
moveable: true,
zoomable: true,
selectable: true,
- start: moment.tz(fromDate,NVRDataModel.getTimeZoneNow()),
- end: moment.tz(toDate,NVRDataModel.getTimeZoneNow()),
+ start: tzs,
+ end: tze,
orientation: 'top',
- min: moment.tz(fromDate,NVRDataModel.getTimeZoneNow()),
- max: moment.tz(toDate,NVRDataModel.getTimeZoneNow()),
- zoomMin: 1 * 60 * 1000, // 1 min
+ min: tzs,
+ //max: tze,
+ zoomMin: 5 * 60 * 1000, // 1 min
stack: false,
format: {
minorLabels: {
@@ -1046,25 +1155,30 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
// console.log (JSON.stringify(myevents[i]));
myevents[i].Event.DefaultVideo = "";
- if (NVRDataModel.getLogin().useLocalTimeZone) {
- //console.log ("CHANGING TZ");
- myevents[i].Event.StartTime = moment.tz(myevents[i].Event.StartTime, NVRDataModel.getTimeZoneNow()).tz(moment.tz.guess()).format('YYYY-MM-DD HH:mm:ss');
- //2016-08-15 17:40:00
- myevents[i].Event.EndTime = moment.tz(myevents[i].Event.EndTime, NVRDataModel.getTimeZoneNow()).tz(moment.tz.guess()).format('YYYY-MM-DD HH:mm:ss');
- }
-
+ //console.log ("ADDING "+myevents[i].Event.StartTime+"->"+myevents[i].Event.EndTime);
- console.log ("ADDING "+myevents[i].Event.StartTime+"->"+myevents[i].Event.EndTime);
+ var tzs, tze;
+ if (NVRDataModel.getLogin().useLocalTimeZone)
+ {
+ tzs = moment.tz(myevents[i].Event.StartTime,NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getLocalTimeZoneNow());
+ tze = moment.tz(myevents[i].Event.EndTime,NVRDataModel.getTimeZoneNow()).tz(NVRDataModel.getLocalTimeZoneNow());
+ }
+ else
+ {
+ tzs = moment.tz(myevents[i].Event.StartTime,NVRDataModel.getTimeZoneNow());
+ tze = moment.tz(myevents[i].Event.EndTime,NVRDataModel.getTimeZoneNow());
+ }
+ //console.log ("ADDED "+tzs+" " +tze);
graphData.add({
//id: graphIndex,
id: myevents[i].Event.Id,
- content: "<span class='my-vis-font'>" + "( <i class='ion-android-notifications'></i>" + myevents[i].Event.AlarmFrames + ") " + myevents[i].Event.Notes + "</span>",
+ content: "<span class='my-vis-font'>" + "( <i class='ion-android-notifications'></i>" + myevents[i].Event.AlarmFrames + ") "+ "("+myevents[j].Event.Id+") " + myevents[i].Event.Notes + "</span>",
- start:moment.tz(myevents[i].Event.StartTime,NVRDataModel.getTimeZoneNow()),
+ start:tzs,
//start: myevents[i].Event.StartTime,
//end: myevents[i].Event.EndTime,
- end:moment.tz(myevents[i].Event.EndTime,NVRDataModel.getTimeZoneNow()),
+ end:tze,
group: myevents[i].Event.MonitorId,
//type: "range",
style: "background-color:" + colors[parseInt(myevents[i].Event.MonitorId) % colors.length] +
@@ -1132,7 +1246,7 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
}
- lastTimeForEvent = moment();
+ lastTimeForEvent = moment().tz(NVRDataModel.getLogin().useLocalTimeZone?NVRDataModel.getLocalTimeZoneNow():NVRDataModel.getTimeZoneNow());
updateInterval = $interval(function() {
processNewEvents();
}.bind(this), 10 * 1000);
diff --git a/www/lang/README.md b/www/lang/README.md
index bf5f23f3..1f7dfd31 100644
--- a/www/lang/README.md
+++ b/www/lang/README.md
@@ -1,6 +1,7 @@
####Adding a new language
+* Languages translations are available [here](https://github.com/pliablepixels/zmNinja/tree/master/www/lang)
* To contribute a new language, add a new ``locale-xx.json`` (where `xx` is your language code).
-* Ideally, you should also provide a language translation for the zmNinja help file inside ``lang/help``
+* Ideally, you should also provide a language translation for the zmNinja help file inside [lang/help](https://github.com/pliablepixels/zmNinja/tree/master/www/lang/help)
The best way is to simply look at an existing language translation and follow the same model for yours. If any language translation keywords are missed, it will fallback to English.
diff --git a/www/lang/locale-en.json b/www/lang/locale-en.json
index 78175511..6e999e49 100644
--- a/www/lang/locale-en.json
+++ b/www/lang/locale-en.json
@@ -210,6 +210,7 @@
"kNoMonitors" :"No monitors to display",
"kNoMoreEvents" :"no more events",
"kNormalPlay" :"normal play",
+ "kNow" :"now",
"kOff" :"off",
"kOn" :"on",
"kOnTapNavigate" :"on tap, navigate to",
diff --git a/www/templates/timeline.html b/www/templates/timeline.html
index ab9d8030..d2ada69d 100644
--- a/www/templates/timeline.html
+++ b/www/templates/timeline.html
@@ -37,6 +37,9 @@
<button ng-click="toggleFollowTime()" ng-class="follow.time? 'button button-small button-balanced':'button button-small button-assertive'">
{{'kUpdateTimeline' | translate}}:&nbsp;{{follow.time}}
</button>
+ <button ng-click="gotoNow()" class="button button-small button-balanced">
+ {{'kNow' | translate}}
+ </button>
<div ng-if="follow.time">
<p>{{newEvents}}</p>
</div>