From 1400c6624de5ec0221fcc4c40d5618d25afd3fb2 Mon Sep 17 00:00:00 2001 From: lucas_nz Date: Sat, 29 Aug 2020 21:25:48 +1200 Subject: resolve build error --- config.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/config.xml b/config.xml index 77963746..295a94cb 100644 --- a/config.xml +++ b/config.xml @@ -144,12 +144,12 @@ - - - - - - + + + + + + -- cgit v1.2.3 From d167ac96958730179cbb0a8245d800e3ce1fbef5 Mon Sep 17 00:00:00 2001 From: lucas_nz Date: Mon, 31 Aug 2020 22:09:24 +1200 Subject: increment app version # Conflicts: # package.json # www/js/NVR.js --- www/js/EventCtrl.js | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/www/js/EventCtrl.js b/www/js/EventCtrl.js index a6e89d6c..8da67496 100644 --- a/www/js/EventCtrl.js +++ b/www/js/EventCtrl.js @@ -1159,6 +1159,54 @@ angular.module('zmApp.controllers') reload: true });*/ }; + + $scope.nextEventsLoad = function () { + NVR.debug("nextEventsLoad called"); + $scope.nextEvents = false; + //$scope.eventsBeingLoaded = true; + var lData = NVR.getLogin(); + + currEventsPage = 1; + maxEventsPage = 1; + currentPagePosition = 0; + currentPageLength = 0; + + nolangFrom = ""; + nolangTo = ""; + if ($rootScope.toString && $rootScope.fromString) { + //nolangTo = moment($rootScope.fromString).locale('en').format("YYYY-MM-DD HH:mm:ss"); + nolangTo = moment($scope.events[$scope.events.length-1].Event.StartTime).subtract(1, 'seconds').locale('en').format("YYYY-MM-DD HH:mm:ss"); + //$rootScope.fromString = new Date('01/01/2000'); + nolangFrom = moment(new Date('01/01/2000')).locale('en').format("YYYY-MM-DD HH:mm:ss"); + } + + //NVR.debug ("GETTING EVENTS USING "+$scope.id+" "+nolangFrom+" "+ nolangTo); + NVR.debug("EventCtrl: grabbing events for: id=" + $scope.id + " Date/Time:" + nolangFrom + + "-" + nolangTo); + + NVR.getEvents($scope.id, currEventsPage, "", nolangFrom, nolangTo, false, $rootScope.monitorsFilter) + .then(function (data) { + // console.log(JSON.stringify(data.pagination)); + if (data.pagination && data.pagination.pageCount) + maxEventsPage = data.pagination.pageCount; + + NVR.debug("maxEventsPage: " + maxEventsPage + ", currEventsPage: " + currEventsPage); + + // console.log ("WE GOT EVENTS="+JSON.stringify(data)); + + //NVR.debug("EventCtrl: success, got " + data.events.length + " events"); + loadEvents(data); + + currentPageData = data; + //$scope.events = data.events; + // we only need to stop the template from loading when the list is empty + // so this can be false once we have _some_ content + // FIXME: check reload + //$scope.eventsBeingLoaded = false; + moreEvents = true; + }); + loadMoreTime = Date.now(); + }; //---------------------------------------------------------------- // Alarm notification handling -- cgit v1.2.3 From e02255edfba2f055d7a35dea5f6442eeb149632e Mon Sep 17 00:00:00 2001 From: lucas_nz Date: Mon, 31 Aug 2020 22:16:48 +1200 Subject: increase image size in event list, improve layout and loading code. # Conflicts: # www/js/EventCtrl.js --- www/js/EventCtrl.js | 443 +++++++++++++++++++++++----------------------- www/templates/events.html | 113 ++++++------ 2 files changed, 269 insertions(+), 287 deletions(-) diff --git a/www/js/EventCtrl.js b/www/js/EventCtrl.js index 8da67496..7f0aeb5d 100644 --- a/www/js/EventCtrl.js +++ b/www/js/EventCtrl.js @@ -48,7 +48,6 @@ angular.module('zmApp.controllers') var currEventsPage = 1; var maxEventsPage = 1; var moreEvents; - var pageLoaded; var enableLoadMore; var lData; var showHiddenMonitors; @@ -58,14 +57,17 @@ angular.module('zmApp.controllers') var nolangTo; var broadcastHandles = []; var intervalReloadEvents; + var eventHeight = 0; + var currentPagePosition = 0; + var currentPageLength = 0; + var currentPageData; + var loadMoreTime; + var maxEventsToLoad = 5; //limit to 5 to minimise memory usage when displaying gifs $scope.typeOfFrames = $translate.instant('kShowTimeDiffFrames'); $scope.outlineMotion = false; $scope.outlineMotionParam = "&show=capture"; - - - var eventsListScrubHeight = eventsListScrubHeight; - var eventsListDetailsHeight = eventsListDetailsHeight; + $scope.eventsBeingLoaded = true; var eHandle; var scrubOngoing = false; @@ -176,7 +178,16 @@ angular.module('zmApp.controllers') $scope.$on('$ionicView.beforeLeave', function () { - + /*NVR.log("EventCtrl:beforeLeave Filter reset"); + $rootScope.isEventFilterOn = false; + $rootScope.fromDate = ""; + $rootScope.fromTime = ""; + $rootScope.toDate = ""; + $rootScope.toTime = ""; + $rootScope.fromString = ""; + $rootScope.toString = ""; + $rootScope.monitorsFilter = ''; +*/ NVR.debug ("Cancelling page reload timer"); $interval.cancel(intervalReloadEvents); NVR.debug("EventCtrl: Deregistering resize listener"); @@ -229,40 +240,29 @@ angular.module('zmApp.controllers') document.addEventListener("pause", onPause, false); //console.log("I got STATE PARAM " + $stateParams.id); $scope.id = parseInt($stateParams.id, 10); - if (isNaN($scope.id)) $scope.id = 0; $scope.showEvent = $stateParams.playEvent || false; $scope.monitors = NVR.getMonitorsNow(); + //console.log("lastCheckTime: " + $stateParams.lastCheckTime); + if ($stateParams.lastCheckTime != undefined && $stateParams.lastCheckTime != '' && moment($stateParams.lastCheckTime).isValid()) { + $rootScope.fromString = $stateParams.lastCheckTime; + var mToDate = moment().tz(NVR.getTimeZoneNow()); + $rootScope.toString = mToDate + .format("YYYY-MM-DD") + " " + mToDate.format("HH:mm:ss"); + $rootScope.isEventFilterOn = true; + $rootScope.fromDate = moment($rootScope.fromString).toDate(); + $rootScope.fromTime = moment($rootScope.fromString).toDate(); + $rootScope.toDate = moment($rootScope.toString).toDate(); + $rootScope.toTime = moment($rootScope.toString).toDate(); + //console.log("toString: " + $rootScope.toString); + } + //console.log("BEFORE ENTER >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"); NVR.log("EventCtrl called with: E/MID=" + $scope.id + " playEvent = " + $scope.showEvent); - - - // This is the only view that hardcodes row size due to - // collection repeat, so lets re-get the text size if it has changed - // note that there may be a delay as its a callback - so might involve - // a UI jiggle - - /* if (window.cordova) - MobileAccessibility.getTextZoom(getTextZoomCallback);*/ - - eventsListDetailsHeight = parseInt(zm.eventsListDetailsHeight * $rootScope.textScaleFactor); - eventsListScrubHeight = parseInt(zm.eventsListScrubHeight * $rootScope.textScaleFactor); - - - if (NVR.getLogin().enableThumbs) { - // NVR.debug("--> thumbnail means increasing row size"); - eventsListScrubHeight = 370; - eventsListDetailsHeight = 330; - - } - - NVR.debug(">>>height of list/scrub set to " + eventsListDetailsHeight + " and " + eventsListScrubHeight); - - pageLoaded = false; enableLoadMore = true; $scope.mycarousel = { @@ -397,6 +397,8 @@ angular.module('zmApp.controllers') function getInitialEvents() { NVR.debug("getInitialEvents called"); + $scope.eventsBeingLoaded = true; + $ionicScrollDelegate.$getByHandle("mainScroll").scrollTop(); var lData = NVR.getLogin(); // If you came from Monitors, disregard hidden monitors in montage @@ -407,6 +409,8 @@ angular.module('zmApp.controllers') $scope.monitors = message; currEventsPage = 1; maxEventsPage = 1; + currentPagePosition = 0; + currentPageLength = 0; if ($scope.monitors.length == 0) { var pTitle = $translate.instant('kNoMonitors'); @@ -426,11 +430,23 @@ angular.module('zmApp.controllers') } $scope.events = []; + + if ($scope.id) { + $rootScope.monitorsFilter = "/MonitorId =:" + $scope.id; + //console.log("monitors.length: " + $scope.monitors.length); + for (var i=0; i <= $scope.monitors.length; i++) { + //console.log("i: " + i); + if ($scope.monitors[i] != undefined) { + //console.log("$scope.monitors[i].Id: " + $scope.monitors[i].Monitor.Id); + if ($scope.monitors[i].Monitor.Id == $scope.id) + $scope.monitors[i].Monitor.isChecked = true; + else + $scope.monitors[i].Monitor.isChecked = false; + } + } + $scope.id = 0; + } - // First get total pages and then - // start from the latest. If this fails, nothing displays - - NVR.debug("EventCtrl: grabbing # of event pages"); nolangFrom = ""; nolangTo = ""; if ($rootScope.fromString) @@ -439,122 +455,40 @@ angular.module('zmApp.controllers') nolangTo = moment($rootScope.toString).locale('en').format("YYYY-MM-DD HH:mm:ss"); //NVR.debug ("GETTING EVENTS USING "+$scope.id+" "+nolangFrom+" "+ nolangTo); - - NVR.debug("EventCtrl: grabbing events for: id=" + $scope.id + " Date/Time:" + $rootScope.fromString + "-" + $rootScope.toString); - nolangFrom = ""; - nolangTo = ""; - if ($rootScope.fromString) - nolangFrom = moment($rootScope.fromString).locale('en').format("YYYY-MM-DD HH:mm:ss"); - if ($rootScope.toString) - nolangTo = moment($rootScope.toString).locale('en').format("YYYY-MM-DD HH:mm:ss"); NVR.getEvents($scope.id, currEventsPage, "", nolangFrom, nolangTo, false, $rootScope.monitorsFilter) .then(function (data) { - - pageLoaded = true; - //$scope.viewTitle.title = data.pagination.count; - // console.log(JSON.stringify(data.pagination)); if (data.pagination && data.pagination.pageCount) maxEventsPage = data.pagination.pageCount; - NVR.debug("We have a total of " + maxEventsPage + " and are at page=" + currEventsPage); + NVR.debug("maxEventsPage: " + maxEventsPage + ", currEventsPage: " + currEventsPage); // console.log ("WE GOT EVENTS="+JSON.stringify(data)); - var myevents = data.events; - - NVR.debug("EventCtrl: success, got " + myevents.length + " events"); - var loginData = NVR.getLogin(); - - //console.log ("-------->MON LEN"+$scope.monitors.length); - - for (var i = 0; i < myevents.length; i++) { - - var idfound = true; - if (loginData.persistMontageOrder) { - idfound = false; - for (var ii = 0; ii < $scope.monitors.length; ii++) { - if ($scope.monitors[ii].Monitor.Id == myevents[i].Event.MonitorId && (NVR.isNotHidden(myevents[i].Event.MonitorId) || showHiddenMonitors)) { - // console.log ("FOUND IT"); - - idfound = true; - break; - } - } - } - - //console.log ("IDFOUND="+idfound + " AND MON LEN="+$scope.monitors.length); - - myevents[i].Event.humanizeTime = humanizeTime(myevents[i].Event.StartTime); - myevents[i].Event.streamingURL = NVR.getStreamingURL(myevents[i].Event.MonitorId); - myevents[i].Event.recordingURL = NVR.getRecordingURL(myevents[i].Event.MonitorId); - myevents[i].Event.imageMode = NVR.getImageMode(myevents[i].Event.MonitorId); - - //console.log ("***** MULTISERVER STREAMING URL FOR EVENTS " + myevents[i].Event.streamingURL); - - // console.log ("***** MULTISERVER BASE URL FOR EVENTS " + myevents[i].Event.recordingURL); - - myevents[i].Event.MonitorName = NVR.getMonitorName(myevents[i].Event.MonitorId); - myevents[i].Event.ShowScrub = false; - myevents[i].Event.height = eventsListDetailsHeight; - // now construct base path - - - // get thumbW/H - - var tempMon = NVR.getMonitorObject(myevents[i].Event.MonitorId); - if (tempMon != undefined) { - - var mw = parseInt(tempMon.Monitor.Width); - var mh = parseInt(tempMon.Monitor.Height); - - - var mo = parseInt(tempMon.Monitor.Orientation); - myevents[i].Event.Rotation = ''; - - var th = computeThumbnailSize(mw, mh, mo); - myevents[i].Event.thumbWidth = th.w; - myevents[i].Event.thumbHeight = th.h; - } - - // in multiserver BasePath is login url for frames - // http://login.url/index.php?view=frame&eid=19696772&fid=21 - - // console.log ("COMPARING "+NVR.getLogin().url+ " TO " +myevents[i].Event.recordingURL); - + //NVR.debug("EventCtrl: success, got " + data.events.length + " events"); + loadEvents(data); - myevents[i].Event.videoPath = myevents[i].Event.recordingURL + "/index.php?view=view_video&eid=" + myevents[i].Event.Id; - - // if (idfound) - if (idfound) { - - //NVR.debug ("PUSHING "+JSON.stringify(myevents[i])); - $scope.events.push(myevents[i]); - //console.log ("SCOPE EVENTS LEN="+$scope.events.length); - } else { - //NVR.debug ("Skipping Event MID = " + myevents[i].Event.MonitorId); - } - - } //for - - //$scope.events = myevents; + currentPageData = data; + //$scope.events = data.events; // we only need to stop the template from loading when the list is empty // so this can be false once we have _some_ content // FIXME: check reload $scope.eventsBeingLoaded = false; + moreEvents = true; // to avoid only few events being displayed // if last page has less events //console.log("**Loading Next Page ***"); - if (myevents.length < 50) { + if ($scope.events < 5) { //console.log ("EVENTS LOADED="+JSON.stringify($scope.events)); NVR.debug("EventCtrl:loading one more page just in case we don't have enough to display"); loadMore(); } + navTitle(); }); - + loadMoreTime = Date.now(); } //------------------------------------------------------- @@ -2076,19 +2010,33 @@ angular.module('zmApp.controllers') $ionicSideMenuDelegate.toggleLeft(); }; - $scope.scrollPosition = function () { - if (!$ionicScrollDelegate.$getByHandle("mainScroll")) return ""; - if (!$ionicScrollDelegate.$getByHandle("mainScroll").getScrollPosition()) return ""; + $scope.scrolling = function() { + //console.log("scrolling : When Scrolling"); + navTitle(); + }; + + function navTitle() { + if (!$ionicScrollDelegate.$getByHandle("mainScroll")) $scope.navTitle = ""; + if (!$ionicScrollDelegate.$getByHandle("mainScroll").getScrollPosition()) $scope.navTitle = ""; var scrl = parseFloat($ionicScrollDelegate.$getByHandle("mainScroll").getScrollPosition().top); - var item = Math.round(scrl / eventsListDetailsHeight); + if (eventHeight == 0 && !$scope.eventsBeingLoaded && document.getElementById('item-0') != null) { + eventHeight = document.getElementById('item-0').offsetHeight; + NVR.debug("scrl: " + scrl + ", eventHeight: " + eventHeight); + } + var item = 0; + if (eventHeight) { + item = Math.floor(scrl / eventHeight); + } + //NVR.debug("scrl: " + scrl + ", events[0].Event.Height: " + eventHeight + ", item: " + item); if ($scope.events == undefined || !$scope.events.length || $scope.events[item] == undefined) { - return ""; + $scope.navTitle = ""; } else { //return prettifyDate($scope.events[item].Event.StartTime); - return ($scope.events[item].Event.humanizeTime); + $scope.navTitle = ($scope.events[item].Event.humanizeTime); } + $scope.$evalAsync(); //return Math.random(); - }; + } //------------------------------------------------------------------------- // called when user switches to background @@ -2160,8 +2108,6 @@ angular.module('zmApp.controllers') }; function toggleGroup(event, ndx, frames, groupType) { - - // If we are here and there is a record of a previous scroll // then we need to scroll back to hide that view if (scrollbynumber) { @@ -2178,7 +2124,6 @@ angular.module('zmApp.controllers') NVR.debug("EventCtrl:Old event scrub will hide now"); oldEvent.Event.ShowScrub = false; - oldEvent.Event.height = eventsListDetailsHeight; oldEvent = ""; } @@ -2210,7 +2155,6 @@ angular.module('zmApp.controllers') // $ionicListDelegate.canSwipeItems(false); //NVR.debug ("Disabling flag swipe as alarms are swipable"); $scope.alarm_images = []; - event.Event.height = (eventsListDetailsHeight + eventsListScrubHeight); $ionicScrollDelegate.resize(); var myurl = loginData.apiurl + '/events/' + event.Event.Id + ".json?"+$rootScope.authSession; NVR.log("API for event details" + myurl); @@ -2314,7 +2258,6 @@ angular.module('zmApp.controllers') }; - event.Event.height = (eventsListDetailsHeight + eventsListScrubHeight); $ionicScrollDelegate.resize(); $scope.mycarousel.index = 0; $scope.ionRange.index = 1; @@ -2424,15 +2367,6 @@ angular.module('zmApp.controllers') // console.log("top location is " + toplocation); var distdiff = parseInt($rootScope.devHeight) - toplocation - objheight; // console.log("*****Space at bottom is " + distdiff); - - if (distdiff < eventsListScrubHeight) // size of the scroller with bars - { - scrollbynumber = eventsListScrubHeight - distdiff; - $ionicScrollDelegate.$getByHandle("mainScroll").scrollBy(0, scrollbynumber, true); - - // we need to scroll up to make space - } - } // end of groupType == scrub } // end of ShowScrub == true else { @@ -2442,7 +2376,6 @@ angular.module('zmApp.controllers') // NVR.debug ("enabling options swipe"); $ionicSideMenuDelegate.canDragContent(true); - event.Event.height = eventsListDetailsHeight; $ionicScrollDelegate.resize(); if (scrollbynumber) { @@ -2465,7 +2398,6 @@ angular.module('zmApp.controllers') $scope.isGroupShown = function (event) { // console.log ("IS SHOW INDEX is " + ndx); //console.log ("SHOW GROUP IS " + showGroup); - return (event == undefined) ? false : event.Event.ShowScrub; }; @@ -2788,6 +2720,7 @@ angular.module('zmApp.controllers') //-------------------------------------------------------- $scope.moreDataCanBeLoaded = function () { + //console.log(new Date() + ' ' + moreEvents); return moreEvents; }; @@ -2818,9 +2751,18 @@ angular.module('zmApp.controllers') // except greater page limits than reported //console.log("***** LOADING MORE INFINITE SCROLL ****"); + loadMoreTime = Date.now(); + + if (currentPagePosition > 0 && currentPagePosition >= currentPageLength) { + currEventsPage++; + currentPagePosition = 0; + currentPageLength = 0; + } + NVR.debug("EventCtrl:loadMore() currEventsPage: " + currEventsPage + ", currentPagePosition: " + currentPagePosition + ", currentPageLength: " + currentPageLength); - if ((currEventsPage >= maxEventsPage) && (pageLoaded)) { + if (currEventsPage > maxEventsPage) { moreEvents = false; + $scope.nextEvents = true; NVR.debug("No more - We have a total of " + maxEventsPage + " and are at page=" + currEventsPage); // console.log("*** At Page " + currEventsPage + " of " + maxEventsPage + ", not proceeding"); @@ -2828,10 +2770,10 @@ angular.module('zmApp.controllers') return; } - currEventsPage++; if (!enableLoadMore) { $ionicLoading.hide(); moreEvents = false; // Don't ion-scroll till enableLoadMore is true; + $scope.nextEvents = true; $scope.$broadcast('scroll.infiniteScrollComplete'); // console.log("**** LOADMORE ARTIFICALLY DISABLED"); @@ -2861,88 +2803,130 @@ angular.module('zmApp.controllers') if ($rootScope.toString) nolangTo = moment($rootScope.toString).locale('en').format("YYYY-MM-DD HH:mm:ss"); + if (currentPagePosition && currentPageData) { + loadEvents(currentPageData); + //console.log("Got new page of events"); + moreEvents = true; + } + else { NVR.getEvents($scope.id, currEventsPage, loadingStr, nolangFrom, nolangTo, false,$rootScope.monitorsFilter) - .then(function (data) { - var loginData = NVR.getLogin(); - // console.log("Got new page of events with Page=" + eventsPage); - var myevents = data.events; - + .then( function (data) { + // console.log(JSON.stringify(data.pagination)); + if (data.pagination && data.pagination.pageCount) + maxEventsPage = data.pagination.pageCount; - for (var i = 0; i < myevents.length; i++) { + loadEvents(data); + currentPageData = data; + //console.log("Got new page of events"); + moreEvents = true; + }, - var idfound = true; - var ld = NVR.getLogin(); + function (error) { + // console.log("*** No More Events to Load, Stop Infinite Scroll ****"); + moreEvents = false; + $ionicLoading.hide(); + }); + } + } - if (ld.persistMontageOrder) { - idfound = false; - for (var ii = 0; ii < $scope.monitors.length; ii++) { - if ($scope.monitors[ii].Monitor.Id == myevents[i].Event.MonitorId && (NVR.isNotHidden(myevents[i].Event.MonitorId) || showHiddenMonitors)) { + $scope.loadMore = function () { + var now = Date.now(); + if (now - loadMoreTime > 1500) { + NVR.debug("$scope.loadMore > loadMore() ... delta: " + (now - loadMoreTime)); + loadMore(); + $scope.$broadcast('scroll.infiniteScrollComplete'); + } + else { + NVR.debug("$scope.loadMore ... delta: " + (now - loadMoreTime)); + $timeout(function () { + $scope.$broadcast('scroll.infiniteScrollComplete'); + }, 250); + } + }; + + function loadEvents(data) { + var loginData = NVR.getLogin(); + var myevents = data.events; + NVR.debug("EventCtrl:loadEvents() myevents.length: " + myevents.length + ", currEventsPage: " + currEventsPage + ", currentPagePosition: " + currentPagePosition); + + if (data.events.length == 0) { + NVR.debug("EventCtrl:loadEvents() no events so we must have reached the end."); + moreEvents = false; + $ionicLoading.hide(); + currEventsPage++; + return; + } - //console.log ( $scope.monitors[ii].Monitor.Id + " MATCHES " + myevents[i].Event.MonitorId); - idfound = true; + //console.log ("-------->MON LEN"+$scope.monitors.length); + currentPageLength = myevents.length; + var eventsLoaded = 0; + var prevPagePosition = currentPagePosition; + for (currentPagePosition; currentPagePosition < myevents.length && eventsLoaded < maxEventsToLoad; currentPagePosition++) { + var idfound = true; + if (loginData.persistMontageOrder) { + idfound = false; + for (var i = 0; i < $scope.monitors.length; i++) { + if ($scope.monitors[i].Monitor.Id == myevents[currentPagePosition].Event.MonitorId && (NVR.isNotHidden(myevents[currentPagePosition].Event.MonitorId) || showHiddenMonitors)) { + // console.log ("FOUND IT"); - break; - } + //console.log ( $scope.monitors[i].Monitor.Id + " MATCHES " + myevents[currentPagePosition].Event.MonitorId); + idfound = true; + break; } } + } - myevents[i].Event.humanizeTime = humanizeTime(myevents[i].Event.StartTime); - myevents[i].Event.MonitorName = NVR.getMonitorName(myevents[i].Event.MonitorId); - // now construct base path - - myevents[i].Event.streamingURL = NVR.getStreamingURL(myevents[i].Event.MonitorId); - myevents[i].Event.recordingURL = NVR.getRecordingURL(myevents[i].Event.MonitorId); - myevents[i].Event.imageMode = NVR.getImageMode(myevents[i].Event.MonitorId); - // console.log ("***** MULTISERVER STREAMING URL FOR EVENTS " + myevents[i].Event.streamingURL); - - // console.log ("***** MULTISERVER BASE URL FOR EVENTS " + myevents[i].Event.recordingURL); + //console.log ("IDFOUND="+idfound + " AND MON LEN="+$scope.monitors.length); - myevents[i].Event.ShowScrub = false; - myevents[i].Event.height = eventsListDetailsHeight; + myevents[currentPagePosition].Event.humanizeTime = humanizeTime(myevents[currentPagePosition].Event.StartTime); + myevents[currentPagePosition].Event.streamingURL = NVR.getStreamingURL(myevents[currentPagePosition].Event.MonitorId); + myevents[currentPagePosition].Event.recordingURL = NVR.getRecordingURL(myevents[currentPagePosition].Event.MonitorId); + myevents[currentPagePosition].Event.imageMode = NVR.getImageMode(myevents[currentPagePosition].Event.MonitorId); - // get thumbW/H + // console.log ("***** MULTISERVER STREAMING URL FOR EVENTS " + myevents[currentPagePosition].Event.streamingURL); + // console.log ("***** MULTISERVER BASE URL FOR EVENTS " + myevents[currentPagePosition].Event.recordingURL); - var tempMon = NVR.getMonitorObject(myevents[i].Event.MonitorId); - if (tempMon != undefined) { - var mw = parseInt(tempMon.Monitor.Width); - var mh = parseInt(tempMon.Monitor.Height); - var mo = parseInt(tempMon.Monitor.Orientation); + myevents[currentPagePosition].Event.MonitorName = NVR.getMonitorName(myevents[currentPagePosition].Event.MonitorId); + myevents[currentPagePosition].Event.ShowScrub = false; + //myevents[currentPagePosition].Event.height = eventsListDetailsHeight; + // now construct base path - myevents[i].Event.Rotation = ''; + // get thumbW/H + var tempMon = NVR.getMonitorObject(myevents[currentPagePosition].Event.MonitorId); + if (tempMon != undefined) { + var mw = parseInt(tempMon.Monitor.Width); + var mh = parseInt(tempMon.Monitor.Height); + var mo = parseInt(tempMon.Monitor.Orientation); + myevents[currentPagePosition].Event.Rotation = ''; + var th = computeThumbnailSize(mw, mh, mo); + myevents[currentPagePosition].Event.thumbWidth = th.w; + myevents[currentPagePosition].Event.thumbHeight = th.h; + } - var th = computeThumbnailSize(mw, mh, mo); - myevents[i].Event.thumbWidth = th.w; - myevents[i].Event.thumbHeight = th.h; + // in multiserver BasePath is login url for frames + // http://login.url/index.php?view=frame&eid=19696772&fid=21 - } + // console.log ("COMPARING "+NVR.getLogin().url+ " TO " +myevents[currentPagePosition].Event.recordingURL); + myevents[currentPagePosition].Event.videoPath = myevents[currentPagePosition].Event.recordingURL + "/index.php?view=view_video&eid=" + myevents[currentPagePosition].Event.Id; - - myevents[i].Event.videoPath = myevents[i].Event.recordingURL + "/index.php?view=view_video&eid=" + myevents[i].Event.Id; + // if (idfound) + if (idfound) { - if (idfound) $scope.events.push(myevents[i]); + //NVR.debug ("PUSHING "+JSON.stringify(myevents[currentPagePosition])); + $scope.events.push(myevents[currentPagePosition]); + eventsLoaded++; + //console.log ("SCOPE EVENTS LEN="+$scope.events.length); + } else { + //NVR.debug ("Skipping Event MID = " + myevents[currentPagePosition].Event.MonitorId); } - //console.log("Got new page of events"); - moreEvents = true; - $scope.$broadcast('scroll.infiniteScrollComplete'); - }, - - function (error) { - // console.log("*** No More Events to Load, Stop Infinite Scroll ****"); - moreEvents = false; - $ionicLoading.hide(); - $scope.$broadcast('scroll.infiniteScrollComplete'); - - }); + } //for + + NVR.debug("EventCtrl:loadEvents() Events added to view: " + (currentPagePosition - prevPagePosition)); } - $scope.loadMore = function () { - loadMore(); - - }; - function recomputeThumbSize() { // NVR.debug("EventCtrl: recompute thumbnails"); @@ -2961,6 +2945,8 @@ angular.module('zmApp.controllers') $scope.events[i].Event.thumbWidth = th.w; $scope.events[i].Event.thumbHeight = th.h; //console.log ("Setting to "+th.w+"*"+th.h); + + eventHeight = document.getElementById('item-0').offsetHeight; } @@ -2972,12 +2958,9 @@ angular.module('zmApp.controllers') } function computeThumbnailSize(mw, mh, mo) { - - - - - tw = Math.min(Math.round(0.35 * $rootScope.devWidth), 200); - th = 150; + + tw = Math.round(0.9 * $rootScope.devWidth); + th = Math.round(0.7 * $rootScope.devHeight); var ratio = mw / mh; var result = { @@ -3004,15 +2987,17 @@ angular.module('zmApp.controllers') } if (mw > mh) { - ratio = mh / mw; mw = tw; - mh = tw * ratio; + mh = tw / ratio; + if (mh > th) { + mw = th * ratio; + mh = th; + } } else if (mh > mw) { - ratio = mw / mh; mh = th; mw = th * ratio; } else { - mw = tw; + mh = th; mw = tw; } mw = Math.round(mw); @@ -3027,14 +3012,20 @@ angular.module('zmApp.controllers') $scope.constructThumbnail = function (event) { var stream = ""; + //console.log(event.Event.Notes); + var snapshotFrame = NVR.getSnapshotFrame(); + if (NVR.getSnapshotFrame() == 'objdetect' && !event.Event.Notes.includes("detected:")) { + snapshotFrame = 'snapshot'; + } stream = event.Event.recordingURL + "/index.php?view=image&fid=" + - NVR.getSnapshotFrame()+"&eid="+event.Event.Id + - "&width=" + event.Event.thumbWidth * 2 + - "&height=" + event.Event.thumbHeight * 2; + snapshotFrame+"&eid="+event.Event.Id + + "&width=" + event.Event.thumbWidth + + "&height=" + event.Event.thumbHeight; stream += $rootScope.authSession; stream += NVR.insertSpecialTokens(); + return stream; }; @@ -3068,7 +3059,7 @@ angular.module('zmApp.controllers') return stream; }; - + $scope.toggleObjectDetectionFilter = function () { var ld = NVR.getLogin(); @@ -3173,6 +3164,9 @@ angular.module('zmApp.controllers') NVR.debug("Reloading monitors"); maxEventsPage = 1; currEventsPage = 1; + currentLength = 0; + currentPagePosition = 0; + currentPageLength = 0; var refresh = NVR.getMonitors(1); refresh.then(function (data) { $scope.monitors = data; @@ -3190,6 +3184,7 @@ angular.module('zmApp.controllers') moreEvents = true; }); + $scope.$broadcast('scroll.refreshComplete'); } }]); diff --git a/www/templates/events.html b/www/templates/events.html index 3878921a..83ee4f00 100644 --- a/www/templates/events.html +++ b/www/templates/events.html @@ -1,5 +1,5 @@ - {{scrollPosition();}} + {{navTitle;}}   @@ -21,14 +21,19 @@ - + + +
- +
+       {{prettifyTime(event.Event.StartTime)}} {{tzAbbr}}       @@ -40,7 +45,19 @@   {{prettifyDate(event.Event.StartTime)}}  {{tzAbbr}} 
-
+
+ + + + + +
+
+ +
+
+
@@ -70,45 +87,21 @@  {{event.Event.MonitorName}} ({{event.Event.Id}})   -
- {{event.Event.Frames}}   {{event.Event.AlarmFrames}}   - {{event.Event.MonitorId}}   -
- {{humanize(event.Event.Length)}} + {{humanize(event.Event.Length)}}   -
- -
- - -
- - - - - -
- -
- -
-
-
  {{event.Event.Name}}
-   {{prettify(event.Event.StartTime)}} {{tzAbbr}}  -
  {{event.Event.Notes}}
+
+
+ + + + + + {{'kUnflag' + | translate}} + + {{'kFlag' + | translate}} + -
+


-
+

@@ -220,45 +225,27 @@

-
- - - - - {{'kUnflag' - | translate}} - - {{'kFlag' - | translate}} - - - - -
-
-
-
-
-
-
-
-
-
- - +
+ +
-
+
+ +
+ +
+
- +
-- cgit v1.2.3 From 0e5779874010cd8730ee4f788ff4420f70dd2ad2 Mon Sep 17 00:00:00 2001 From: lucas_nz Date: Sat, 29 Aug 2020 21:29:07 +1200 Subject: when click notification in montage, filter event view to only display events since last notification click --- www/js/EventDateTimeFilterCtrl.js | 17 +++++++++++++++-- www/js/MontageCtrl.js | 36 ++++++++++++++++++++++++++++++++---- www/js/app.js | 2 +- www/lang/locale-en.json | 2 +- www/templates/menu.html | 4 ++-- 5 files changed, 51 insertions(+), 10 deletions(-) diff --git a/www/js/EventDateTimeFilterCtrl.js b/www/js/EventDateTimeFilterCtrl.js index e2d7b22e..689b800d 100644 --- a/www/js/EventDateTimeFilterCtrl.js +++ b/www/js/EventDateTimeFilterCtrl.js @@ -63,6 +63,7 @@ angular.module('zmApp.controllers') $rootScope.toTime = ""; $rootScope.fromString = ""; $rootScope.toString = ""; + $rootScope.monitorsFilter = ''; // if you come here via the events pullup // you are looking at a specific monitor ID @@ -100,6 +101,8 @@ angular.module('zmApp.controllers') // don't root. //-------------------------------------------------------------------------- $scope.saveFilters = function () { + // only reset date/time if at least one of them is set. + if ($rootScope.fromDate || $rootScope.toDate || $rootScope.fromTime || $rootScope.toTime) { if (!$rootScope.fromDate) { //console.log("RESET fromDate"); $rootScope.fromDate = new Date(); @@ -131,11 +134,21 @@ angular.module('zmApp.controllers') $rootScope.fromDate = $rootScope.toDate; $rootScope.toDate = t; } - - $rootScope.isEventFilterOn = true; + $rootScope.fromString = moment($rootScope.fromDate).format("YYYY-MM-DD") + " " + moment($rootScope.fromTime).format("HH:mm:ss"); $rootScope.toString = moment($rootScope.toDate).format("YYYY-MM-DD") + " " + moment($rootScope.toTime).format("HH:mm:ss"); + } + else { + $rootScope.fromDate = null; + $rootScope.toDate = null; + $rootScope.fromTime = null; + $rootScope.toTime = null; + $rootScope.fromString = null; + $rootScope.toString = null; + } + + $rootScope.isEventFilterOn = true; //console.log("CONCAT DATES " + temp); // diff --git a/www/js/MontageCtrl.js b/www/js/MontageCtrl.js index 967decfe..3da303a5 100644 --- a/www/js/MontageCtrl.js +++ b/www/js/MontageCtrl.js @@ -592,6 +592,7 @@ angular.module('zmApp.controllers') // now is server TZ time var now = ld.lastEventCheckTimes[monitor.Monitor.Id]; + NVR.debug ("ld.lastEventCheckTimes[id]:" + ld.lastEventCheckTimes[monitor.Monitor.Id]); apiurl += "/StartTime >:" + now; } @@ -615,7 +616,7 @@ angular.module('zmApp.controllers') apiurl += '.json?sort=StartTime&direction=desc&limit=1'+$rootScope.authSession; - NVR.debug ("Getting event count "); + NVR.debug ("Getting event count for monitor.Monitor.Id: " + monitor.Monitor.Id); $http.get(apiurl) .then (function (data) { // console.log ("EVENTS GOT: "+JSON.stringify(data)); @@ -1706,7 +1707,7 @@ angular.module('zmApp.controllers') function onResume() { // we should be going to portal login so no need here - //NVR.debug ("Montage resume called, regenerating all connkeys"); + NVR.debug ("Montage resume called, regenerating all connkeys"); //NVR.regenConnKeys(); // $scope.MontageMonitors = NVR.getMonitorsNow(); @@ -2290,9 +2291,29 @@ angular.module('zmApp.controllers') var stream; var fps = NVR.getLogin().montageliveFPS; + if (!monitor.Monitor.streamingURL) { + NVR.debug("monitor.Monitor.streamingURL: " + monitor.Monitor.streamingURL ); + NVR.debug("monitor.Monitor.MonitorId: " + monitor.Monitor.MonitorId ); + /*for (var key in monitor.Monitor) { + console.log(key + ": " + monitor.Monitor[key]); + } + return; + NVR.log("Reloading view for montage view, recomputing rand"); + $rootScope.rand = Math.floor((Math.random() * 100000) + 1); + $scope.monitors = []; + //imageLoadingDataShare.set(0); + + var refresh = NVR.getMonitors(1); + + refresh.then(function (data) { + $scope.monitors = data; + }); + return;*/ + } if (currentStreamState == streamState.STOPPED || monitor.Monitor.listDisplay == 'noshow' ) { //console.log ("STREAM=empty and auth="+$rootScope.authSession); //sconsole.log ('EMPTY STREAM'); + NVR.log("currentStreamState: " + currentStreamState + ", monitor.Monitor.listDisplay: " + monitor.Monitor.listDisplay); return ""; } @@ -2300,6 +2321,7 @@ angular.module('zmApp.controllers') stream = monitor.Monitor.streamingURL + "/nph-zms?mode=single&scale=10&monitor="+ monitor.Monitor.Id + "&rand=" + randToAvoidCacheMem + monitor.Monitor.Id ; // console.log(stream); + NVR.log("currentStreamState: " + currentStreamState); } else { stream = monitor.Monitor.streamingURL + @@ -2328,6 +2350,7 @@ angular.module('zmApp.controllers') //console.log("STREAM=" + stream); + //NVR.log("STREAM=" + stream); return stream; }; @@ -2611,15 +2634,20 @@ angular.module('zmApp.controllers') var ld = NVR.getLogin(); mid = monitor.Monitor.Id; // always use server tz to avoid confusion + var lastCheckTime = ld.lastEventCheckTimes[mid]; ld.lastEventCheckTimes[mid] = (new moment()).tz(NVR.getTimeZoneNow()).format('YYYY-MM-DD HH:mm:ss'); - NVR.debug ("Updating monitor:"+mid+" event check time (server tz) to " + ld.lastEventCheckTimes[mid] ); + NVR.debug ("Updating monitor:"+mid+" event check time (server tz) to " + lastCheckTime); NVR.setLogin(ld); + if (!monitor.Monitor.lastEvent) { + lastCheckTime = ""; + } monitor.Monitor.lastEvent = undefined; monitor.Monitor.showSidebar = false; if (!showEvents) return; $state.go("app.events", { "id": monitor.Monitor.Id, - "playEvent": false + "playEvent": false, + "lastCheckTime": lastCheckTime }); return; diff --git a/www/js/app.js b/www/js/app.js index f84673a5..8799784d 100755 --- a/www/js/app.js +++ b/www/js/app.js @@ -2388,7 +2388,7 @@ angular.module('zmApp', [ } }, cache: false, - url: "/events/:id/:playEvent", + url: "/events/:id/:playEvent/:lastCheckTime", templateUrl: "templates/events.html", controller: 'zmApp.EventCtrl', diff --git a/www/lang/locale-en.json b/www/lang/locale-en.json index 0410273d..088f21b3 100644 --- a/www/lang/locale-en.json +++ b/www/lang/locale-en.json @@ -334,7 +334,7 @@ "kReconfirmPin" :"Reconfirm PIN", "kRecordingProgress" :"recording in progress", "kReflow" :"reflow", - "kRefresh" :"refresh", + "kRefresh" :"Refresh", "kRefreshedView" :"refreshed view", "kReportEvents" :"report events", "kReportedVersion" :"Reported Version", diff --git a/www/templates/menu.html b/www/templates/menu.html index f00578b3..2a78bb6e 100644 --- a/www/templates/menu.html +++ b/www/templates/menu.html @@ -42,8 +42,8 @@ {{'kMenuTimeline'|translate}} - - + + {{'kMenuEvents'|translate}} -- cgit v1.2.3 From a711b32fd585308284c96f05dc9772a9abca1e3a Mon Sep 17 00:00:00 2001 From: lucas_nz Date: Sat, 29 Aug 2020 21:29:50 +1200 Subject: display gif if api supports --- www/js/NVR.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/www/js/NVR.js b/www/js/NVR.js index f1c369c3..a9b552e7 100644 --- a/www/js/NVR.js +++ b/www/js/NVR.js @@ -2674,7 +2674,10 @@ angular.module('zmApp.controllers') //console.log("API VERSION RETURNED: " + JSON.stringify(success)); $rootScope.apiValid = true; - if (versionCompare(success.data.version, '1.32.0') != -1) { + if (versionCompare(success.data.version, '1.34.0') != -1) { + debug("objdetect supported in image.php"); + snapshotFrame = 'objdetect'; + } else if (versionCompare(success.data.version, '1.32.0') != -1) { debug("snapshot supported in image.php"); snapshotFrame = 'snapshot'; } else { -- cgit v1.2.3 From 2f565924960a7487ecc75d504bf2c7b0d4586580 Mon Sep 17 00:00:00 2001 From: lucas_nz Date: Mon, 31 Aug 2020 22:21:48 +1200 Subject: Revert "resolve build error" This reverts commit 1400c6624de5ec0221fcc4c40d5618d25afd3fb2. --- config.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/config.xml b/config.xml index 295a94cb..77963746 100644 --- a/config.xml +++ b/config.xml @@ -144,12 +144,12 @@ - - - - - - + + + + + + -- cgit v1.2.3 From 1139b026aedbc609189a5b3cb7ef446e1ceec09d Mon Sep 17 00:00:00 2001 From: lucas_nz Date: Sat, 5 Sep 2020 11:41:25 +1200 Subject: select event view thumbnails type, replaces enableThumbs in dev options. Enables selection of different thumbnail types. If gif is selected limit the number of events returned to 5 to improve load time. --- www/js/DevOptionsCtrl.js | 29 +++++++++++++++++++++++++++++ www/js/EventCtrl.js | 17 +++++++++++------ www/js/NVR.js | 11 +++-------- www/templates/devoptions.html | 11 ++++++----- www/templates/events.html | 3 +-- 5 files changed, 50 insertions(+), 21 deletions(-) diff --git a/www/js/DevOptionsCtrl.js b/www/js/DevOptionsCtrl.js index 2ad40bfa..d735f967 100644 --- a/www/js/DevOptionsCtrl.js +++ b/www/js/DevOptionsCtrl.js @@ -181,6 +181,35 @@ angular.module('zmApp.controllers').controller('zmApp.DevOptionsCtrl', ['$scope' }); }; + $scope.selectEventViewThumbs = function() { + + var buttons = [ + { text: $translate.instant('kNone').toLowerCase(), value:'none' }, + { text: 'snapshot', value:'snapshot' }, + { text: 'objdetect', value:'objdetect' }, + { text: 'objdetect_jpg', value:'objdetect_jpg' }, + { text: 'objdetect_gif', value:'objdetect_gif' }, + + ]; + + $ionicActionSheet.show({ + titleText: $translate.instant('kSelect'), + buttons: buttons, + + cancelText: $translate.instant('kButtonCancel'), + cancel: function() { + NVR.debug ('obfuscation actionsheet cancelled'); + }, + buttonClicked: function(index) { + + $scope.loginData.eventViewThumbs = buttons[index].value; + NVR.debug ('changed event view thumbs to:'+$scope.loginData.eventViewThumbs ); + return true; + }, + + }); + }; + $scope.saveDevOptions = function () { saveDevOptions(); diff --git a/www/js/EventCtrl.js b/www/js/EventCtrl.js index 7f0aeb5d..359db3d5 100644 --- a/www/js/EventCtrl.js +++ b/www/js/EventCtrl.js @@ -458,6 +458,11 @@ angular.module('zmApp.controllers') NVR.debug("EventCtrl: grabbing events for: id=" + $scope.id + " Date/Time:" + $rootScope.fromString + "-" + $rootScope.toString); + if ($scope.loginData.eventViewThumbs != 'objdetect_gif') { + maxEventsToLoad = 50; //limit to 5 to minimise memory usage when displaying gifs + } + NVR.debug("maxEventsToLoad: " + maxEventsToLoad); + NVR.getEvents($scope.id, currEventsPage, "", nolangFrom, nolangTo, false, $rootScope.monitorsFilter) .then(function (data) { // console.log(JSON.stringify(data.pagination)); @@ -475,13 +480,12 @@ angular.module('zmApp.controllers') //$scope.events = data.events; // we only need to stop the template from loading when the list is empty // so this can be false once we have _some_ content - // FIXME: check reload $scope.eventsBeingLoaded = false; moreEvents = true; // to avoid only few events being displayed // if last page has less events //console.log("**Loading Next Page ***"); - if ($scope.events < 5) { + if ($scope.events < maxEventsToLoad) { //console.log ("EVENTS LOADED="+JSON.stringify($scope.events)); NVR.debug("EventCtrl:loading one more page just in case we don't have enough to display"); loadMore(); @@ -2861,6 +2865,7 @@ angular.module('zmApp.controllers') currentPageLength = myevents.length; var eventsLoaded = 0; var prevPagePosition = currentPagePosition; + NVR.debug("maxEventsToLoad: " + maxEventsToLoad); for (currentPagePosition; currentPagePosition < myevents.length && eventsLoaded < maxEventsToLoad; currentPagePosition++) { var idfound = true; if (loginData.persistMontageOrder) { @@ -3014,14 +3019,14 @@ angular.module('zmApp.controllers') var stream = ""; //console.log(event.Event.Notes); var snapshotFrame = NVR.getSnapshotFrame(); - if (NVR.getSnapshotFrame() == 'objdetect' && !event.Event.Notes.includes("detected:")) { - snapshotFrame = 'snapshot'; + if (($scope.loginData.eventViewThumbs.substring(0, 9) == 'objdetect') && event.Event.Notes.includes("detected:")) { + snapshotFrame = $scope.loginData.eventViewThumbs; } stream = event.Event.recordingURL + "/index.php?view=image&fid=" + snapshotFrame+"&eid="+event.Event.Id + - "&width=" + event.Event.thumbWidth + - "&height=" + event.Event.thumbHeight; + "&width=" + event.Event.thumbWidth * 2 + + "&height=" + event.Event.thumbHeight * 2; stream += $rootScope.authSession; stream += NVR.insertSpecialTokens(); diff --git a/www/js/NVR.js b/www/js/NVR.js index a9b552e7..5bdc23b9 100644 --- a/www/js/NVR.js +++ b/www/js/NVR.js @@ -188,7 +188,6 @@ angular.module('zmApp.controllers') 'timelineScale': -1, 'hideArchived': false, 'videoPlaybackSpeed': 2, - 'enableThumbs': true, 'enableStrictSSL': false, 'enableSlowLoading': false, 'isFullScreen': false, @@ -1562,10 +1561,9 @@ angular.module('zmApp.controllers') } + if (typeof loginData.eventViewThumbs == 'undefined') { - if (typeof loginData.enableThumbs == 'undefined') { - - loginData.enableThumbs = true; + loginData.eventViewThumbs = 'snapshot'; } @@ -2674,10 +2672,7 @@ angular.module('zmApp.controllers') //console.log("API VERSION RETURNED: " + JSON.stringify(success)); $rootScope.apiValid = true; - if (versionCompare(success.data.version, '1.34.0') != -1) { - debug("objdetect supported in image.php"); - snapshotFrame = 'objdetect'; - } else if (versionCompare(success.data.version, '1.32.0') != -1) { + if (versionCompare(success.data.version, '1.32.0') != -1) { debug("snapshot supported in image.php"); snapshotFrame = 'snapshot'; } else { diff --git a/www/templates/devoptions.html b/www/templates/devoptions.html index 435c4c40..00361460 100644 --- a/www/templates/devoptions.html +++ b/www/templates/devoptions.html @@ -189,12 +189,13 @@ -