summaryrefslogtreecommitdiff
path: root/www
diff options
context:
space:
mode:
Diffstat (limited to 'www')
-rw-r--r--www/js/DataModel.js10
-rw-r--r--www/js/EventModalCtrl.js2
-rw-r--r--www/js/LogCtrl.js154
-rw-r--r--www/js/PortalLoginCtrl.js1
-rw-r--r--www/js/StateCtrl.js117
-rw-r--r--www/lang/locale-ba.json1
-rw-r--r--www/lang/locale-de.json11
-rw-r--r--www/lang/locale-en.json13
-rw-r--r--www/lang/locale-es.json1
-rw-r--r--www/lang/locale-fr.json1
-rw-r--r--www/lang/locale-hu.json1
-rwxr-xr-xwww/lang/locale-nl.json1
-rw-r--r--www/lang/locale-pl.json13
-rw-r--r--www/lang/locale-pt.json1
-rw-r--r--www/lang/locale-ru.json1
-rw-r--r--www/templates/log.html2
-rw-r--r--www/templates/state.html100
17 files changed, 244 insertions, 186 deletions
diff --git a/www/js/DataModel.js b/www/js/DataModel.js
index 17e2a688..17305f22 100644
--- a/www/js/DataModel.js
+++ b/www/js/DataModel.js
@@ -20,7 +20,7 @@ angular.module('zmApp.controllers')
DO NOT TOUCH zmAppVersion
It is changed by sync_version.sh
*/
- var zmAppVersion = "1.3.028";
+ var zmAppVersion = "1.3.029";
var isBackground = false;
var justResumed = false;
var timeSinceResumed = -1;
@@ -1980,11 +1980,11 @@ angular.module('zmApp.controllers')
return $http.get(req + "&command=1")
.then(
function (s) {
- debug("pause success for ck:" + ck + " with:" + JSON.stringify(s));
+ // debug("pause success for ck:" + ck );
},
function (e) {
- debug("pause success for ck:" + ck + " with:" + JSON.stringify(e));
+ // debug("pause error for ck:" + ck + " with:" + JSON.stringify(e));
}
);
@@ -2004,11 +2004,11 @@ angular.module('zmApp.controllers')
return $http.get(req + "&command=2")
.then(
function (s) {
- debug("play success for ck:" + ck + " with:" + JSON.stringify(s));
+ // debug("play success for ck:" + ck + " with:" + JSON.stringify(s));
},
function (e) {
- debug("play success for ck:" + ck + " with:" + JSON.stringify(e));
+ // debug("play error for ck:" + ck + " with:" + JSON.stringify(e));
}
);
diff --git a/www/js/EventModalCtrl.js b/www/js/EventModalCtrl.js
index 58c65399..11a7434a 100644
--- a/www/js/EventModalCtrl.js
+++ b/www/js/EventModalCtrl.js
@@ -261,7 +261,7 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro
NVRDataModel.debug("player reported a video error:" + JSON.stringify(event));
$rootScope.zmPopup = SecuredPopups.show('alert', {
title: $translate.instant('kError'),
- template: $rootScope.platformOS == 'desktop' ? $translate.instant('kVideoError') : $translate.instant('kVideoErrorMobile'),
+ template: $translate.instant('kVideoError'),
okText: $translate.instant('kButtonOk'),
cancelText: $translate.instant('kButtonCancel'),
});
diff --git a/www/js/LogCtrl.js b/www/js/LogCtrl.js
index 38cd3464..599c63d1 100644
--- a/www/js/LogCtrl.js
+++ b/www/js/LogCtrl.js
@@ -2,7 +2,7 @@
/* jslint browser: true*/
/* global saveAs, cordova,StatusBar,angular,console,moment */
-angular.module('zmApp.controllers').controller('zmApp.LogCtrl', ['$scope', '$rootScope', 'zm', '$ionicModal', 'NVRDataModel', '$ionicSideMenuDelegate', '$fileLogger', '$cordovaEmailComposer', '$ionicPopup', '$timeout', '$ionicHistory', '$state', '$interval', '$ionicLoading', '$translate', '$http', function ($scope, $rootScope, zm, $ionicModal, NVRDataModel, $ionicSideMenuDelegate, $fileLogger, $cordovaEmailComposer, $ionicPopup, $timeout, $ionicHistory, $state, $interval, $ionicLoading, $translate, $http) {
+angular.module('zmApp.controllers').controller('zmApp.LogCtrl', ['$scope', '$rootScope', 'zm', '$ionicModal', 'NVRDataModel', '$ionicSideMenuDelegate', '$fileLogger', '$cordovaEmailComposer', '$ionicPopup', '$timeout', '$ionicHistory', '$state', '$interval', '$ionicLoading', '$translate', '$http', 'SecuredPopups', function ($scope, $rootScope, zm, $ionicModal, NVRDataModel, $ionicSideMenuDelegate, $fileLogger, $cordovaEmailComposer, $ionicPopup, $timeout, $ionicHistory, $state, $interval, $ionicLoading, $translate, $http, SecuredPopups) {
$scope.openMenu = function () {
$ionicSideMenuDelegate.toggleLeft();
};
@@ -11,20 +11,7 @@ angular.module('zmApp.controllers').controller('zmApp.LogCtrl', ['$scope', '$roo
// Controller main
//---------------------------------------------------------------
- var intervalLogUpdateHandle;
- document.addEventListener("pause", onPause, false);
- document.addEventListener("resume", onResume, false);
-
- function onPause() {
- NVRDataModel.debug("LogCtrl: pause called, killing log timer");
- // $interval.cancel(intervalLogUpdateHandle);
- }
-
- function onResume() {
- // NVRDataModel.debug("LogCtrl: resume called, starting log timer");
- loadLogs();
- }
@@ -78,33 +65,44 @@ angular.module('zmApp.controllers').controller('zmApp.LogCtrl', ['$scope', '$roo
}
};
- //--------------------------------------------------------------------------
- // Make sure user knows information masking is best effort
- //--------------------------------------------------------------------------
-
- $scope.sendEmail = function (logstring) {
- logstring = logstring.substring(0, 20000);
- $ionicPopup.confirm({
- title: $translate.instant('kSensitiveTitle'),
- template: $rootScope.appName + ' ' + $translate.instant('kSensitiveBody'),
- okText: $translate.instant('kButtonOk'),
- cancelText: $translate.instant('kButtonCancel'),
- })
- .then(function (res) {
- if (res) {
-
- logstring = "zmNinja version:" + $scope.zmAppVersion +
- " (" + $rootScope.platformOS + ")\n" +
- "ZoneMinder version:" + NVRDataModel.getCurrentServerVersion() + "\n" +
- logstring;
- sendEmailReally(logstring);
- }
+
+ // desktop download
+ $scope.downloadLogs = function () {
+ var body = "zmNinja version:" + $scope.zmAppVersion +
+ " (" + $rootScope.platformOS + ")\n" +
+ "ZoneMinder version:" + NVRDataModel.getCurrentServerVersion();
+
+ body = $translate.instant('kSensitiveBody') + '\n\n\n' + body;
+ var fname = $rootScope.appName + "-logs-" +
+ moment().format('MMM-DD-YY_HH-mm-ss') + ".txt";
+
+ $fileLogger.checkFile()
+ .then(function (d) {
+
+ body = body + window.localStorage[d.name];
+ var file = new Blob([body], {
+ type: 'text/plain'
+ });
+ var url = URL.createObjectURL(file);
+
+ $rootScope.zmPopup = SecuredPopups.show('alert', {
+ title: $translate.instant('kNote'),
+ template: $translate.instant('kTapDownloadLogs') + "<br/><br/><center><a href='" + url + "' class='button button-assertive icon ion-android-download' download='" + fname + "'>" + " " + $translate.instant('kDownload') + "</a></center>",
+ okText: $translate.instant('kDismiss'),
+ okType: 'button-stable'
+ },
+ function (e) {
+ NVRDataModel.debug("Error getting log file:" + JSON.stringify(e));
+ }
+
+ );
});
- };
- // picks up applogs on the FS and sends an email with it
+ };
+
+ // mobile - picks up applogs on the FS and sends an email with it
$scope.attachLogs = function () {
var body = "zmNinja version:" + $scope.zmAppVersion +
@@ -144,90 +142,8 @@ angular.module('zmApp.controllers').controller('zmApp.LogCtrl', ['$scope', '$roo
};
- //--------------------------------------------------------------------------
- // Convenience function to send logs via email
- //--------------------------------------------------------------------------
- function sendEmailReally(logstring) {
-
- //console.log ("LOGSTRING:"+logstring);
- if (window.cordova) {
-
- // do my best to replace sensitive information
- var loginData = NVRDataModel.getLogin();
-
- // We don't need this anymore as log and debug now strip passwords
- /*if (loginData.password !="")
- {
- var re1 = new RegExp(loginData.password, "g");
- logstring = logstring.replace(re1, "<deleted>");
- }*/
- // keep the protocol, helps to debug
- var urlNoProtocol = loginData.url.replace(/.*?:\/\//, "");
- if (urlNoProtocol != "") {
- var re2 = new RegExp(urlNoProtocol, "g");
-
- logstring = logstring.replace(re2, "<server>");
- }
- urlNoProtocol = loginData.streamingurl.replace(/.*?:\/\//, "");
- if (urlNoProtocol != "") {
- var re3 = new RegExp(urlNoProtocol, "g");
- logstring = logstring.replace(re3, "<server>");
- }
-
- urlNoProtocol = loginData.eventServer.replace(/.*?:\/\//, "");
- if (urlNoProtocol != "") {
- var re4 = new RegExp(urlNoProtocol, "g");
- logstring = logstring.replace(re4, "<server>");
- }
-
- //console.log ("NEW LOGSTRING:"+logstring);
- /* window.plugins.emailComposer.showEmailComposerWithCallback(callback, $rootScope.appName + ' logs', logstring, [zm.authoremail]);*/
-
-
- cordova.plugins.email.isAvailable(
- function (isAvailable) {
-
- if (isAvailable) {
- // body encapsulation requires br :^
- // see https://github.com/katzer/cordova-plugin-email-composer/issues/150
- logstring = logstring.split('\n').join('<br/>');
- cordova.plugins.email.open({
- to: zm.authoremail,
- subject: $rootScope.appName + ' logs',
- body: logstring
- });
- } else {
- // kEmailNotConfigured
- $rootScope.zmPopup = SecuredPopups.show('alert', {
- title: $translate.instant('kError'),
- template: $translate.instant('kEmailNotConfigured'),
- okText: $translate.instant('kButtonOk'),
- cancelText: $translate.instant('kButtonCancel'),
- });
- }
-
- });
- } else {
- // console.log("Using default email client to send data");
-
- var fname = $rootScope.appName + "-logs-" +
- moment().format('MMM-DD-YY_HH-mm-ss') + ".txt";
-
- var blob = new Blob([logstring], {
- type: "text/plain;charset=utf-8"
- });
- saveAs(blob, fname);
- }
-
- }
-
- function callback() {
- // console.log ("EMAIL SENT");
- NVRDataModel.debug("Email sent callback called");
- }
-
function loadZMlogs() {
var ld = NVRDataModel.getLogin();
var lapi = ld.apiurl + "/logs.json?sort=TimeKey&direction=desc&page=" + $scope.zmPage;
diff --git a/www/js/PortalLoginCtrl.js b/www/js/PortalLoginCtrl.js
index 40dc446e..22bb46f8 100644
--- a/www/js/PortalLoginCtrl.js
+++ b/www/js/PortalLoginCtrl.js
@@ -414,6 +414,7 @@ angular.module('zmApp.controllers').controller('zmApp.PortalLoginCtrl', ['$ionic
// NVRDataModel.debug("logging state transition");
if (!processPush) {
+ alreadyTransitioned = true;
NVRDataModel.debug("Transitioning state to: " +
statetoGo + " with param " + JSON.stringify($rootScope.lastStateParam));
diff --git a/www/js/StateCtrl.js b/www/js/StateCtrl.js
index cef454a7..c14c8628 100644
--- a/www/js/StateCtrl.js
+++ b/www/js/StateCtrl.js
@@ -26,30 +26,59 @@ angular.module('zmApp.controllers').controller('zmApp.StateCtrl', ['$ionicPopup'
var apiRun = loginData.apiurl + "/host/daemonCheck.json";
var apiLoad = loginData.apiurl + "/host/getLoad.json";
- var apiDisk = loginData.apiurl + "/host/getDiskPercent.json";
+ var apiStorage = loginData.apiurl + "/storage.json";
+ var apiServer = loginData.apiurl + "/servers.json";
var apiCurrentState = loginData.apiurl + "/States.json";
var apiExec = loginData.apiurl + "/states/change/";
var inProgress = 0; // prevents user from another op if one is in progress
getRunStatus();
+ getLoadStatus();
+ getCurrentState();
+ getStorageStatus();
+ getServerStatus();
+
+
+// credit https://stackoverflow.com/a/14919494/1361529
+ $scope.humanFileSize = function(bytes, si) {
+ var thresh = si ? 1000 : 1024;
+ bytes = parseFloat(bytes);
+ if (isNaN(bytes)) bytes=0;
+ if(Math.abs(bytes) < thresh) {
+ return bytes + ' B';
+ }
+ var units = si? ['kB','MB','GB','TB','PB','EB','ZB','YB']:['KiB','MiB','GiB','TiB','PiB','EiB','ZiB','YiB'];
+ var u = -1;
+ do {
+ bytes /= thresh;
+ ++u;
+ } while(Math.abs(bytes) >= thresh && u < units.length - 1);
+ return bytes.toFixed(1)+' '+units[u];
+};
+
+$scope.matchServer = function (id) {
+ var str = id;
+ var name = "";
+ for (var i=0; i< $scope.servers.length; i++) {
+ if ($scope.servers[i].Server.Id == id) {
+ name = $scope.servers[i].Server.Name;
+ break;
+ }
+ }
+ if (name) {
+ str = name + " ("+id+")";
+ }
+ return str;
+};
+$scope.toggleStorage = function() {
+ $scope.showStorage = !$scope.showStorage;
+};
-
-
- // Let's stagger this by 500ms each to see if Chrome lets these through
- // This may also help if your Apache is not configured to let multiple connections through
-
- $timeout(function () {
- NVRDataModel.debug("invoking LoadStatus...");
- getLoadStatus();
- }, 2000);
-
- $timeout(function () {
- NVRDataModel.debug("invoking CurrentState...");
- getCurrentState();
- }, 4000);
-
+$scope.toggleServer = function() {
+ $scope.showServer = !$scope.showServer;
+};
/*
$timeout(function () {
NVRDataModel.debug("invoking DiskStatus...");
@@ -67,6 +96,9 @@ angular.module('zmApp.controllers').controller('zmApp.StateCtrl', ['$ionicPopup'
$scope.$on ('$ionicView.beforeEnter', function () {
+ $scope.showStorage = true;
+ $scope.showServer = true;
+
$scope.$on ( "process-push", function () {
NVRDataModel.debug (">> StateCtrl: push handler");
var s = NVRDataModel.evaluateTappedNotification();
@@ -194,22 +226,42 @@ angular.module('zmApp.controllers').controller('zmApp.StateCtrl', ['$ionicPopup'
}
//----------------------------------------------------------------------
- // returns disk space in gigs taken up by events
+ // returns Storage data
//----------------------------------------------------------------------
- function getDiskStatus() {
- NVRDataModel.debug("StateCtrl/getDiskStatus: " + apiDisk);
- $http.get(apiDisk)
+ function getStorageStatus() {
+
+ $scope.storage = [];
+ NVRDataModel.debug("StorageStatus: " + apiStorage);
+ $http.get(apiStorage)
.then(
function (success) {
- NVRDataModel.debug("StateCtrl/getDiskStatus: success");
- NVRDataModel.debug("Disk results: " + JSON.stringify(success));
- var obj = success.data.usage;
- if (obj.Total.space != undefined) {
- $scope.zmDisk = parseFloat(obj.Total.space).toFixed(1).toString() + "G";
- } else {
- $scope.zmDisk = "unknown";
- NVRDataModel.log("Error retrieving disk space, API returned null for obj.Total.space");
- }
+
+ $scope.storage = success.data.storage;
+ //console.log (JSON.stringify($scope.storage));
+
+ },
+ function (error) {
+ $scope.zmDisk = "unknown";
+ // console.log("ERROR:" + JSON.stringify(error));
+ NVRDataModel.log("Error retrieving DiskStatus: " + JSON.stringify(error), "error");
+ }
+ );
+ }
+
+
+ //----------------------------------------------------------------------
+ // returns Storage data
+ //----------------------------------------------------------------------
+ function getServerStatus() {
+
+ $scope.servers = [];
+ NVRDataModel.debug("ServerStatus: " + apiStorage);
+ $http.get(apiServer)
+ .then(
+ function (success) {
+
+ $scope.servers = success.data.servers;
+ // console.log (JSON.stringify($scope.storage));
},
function (error) {
@@ -386,9 +438,10 @@ angular.module('zmApp.controllers').controller('zmApp.StateCtrl', ['$ionicPopup'
//console.log("***Pull to Refresh");
NVRDataModel.debug("StateCtrl/refresh: calling getRun/Load/Disk/CurrentState");
getRunStatus();
- $timeout(getLoadStatus, 2000);
- $timeout(getCurrentState, 4000);
- //$timeout (getDiskStatus,6000);
+ getLoadStatus();
+ getCurrentState();
+ getStorageStatus();
+ getServerStatus();
$scope.$broadcast('scroll.refreshComplete');
};
diff --git a/www/lang/locale-ba.json b/www/lang/locale-ba.json
index 2b10fcf3..7a75656b 100644
--- a/www/lang/locale-ba.json
+++ b/www/lang/locale-ba.json
@@ -387,7 +387,6 @@
"kVibrateOnPush" :"Vibriraj",
"kVideo" :"Video",
"kVideoError" :"Nije moguće pustiti snimak.",
- "kVideoErrorMobile" :"Nije moguće pustti snimak. pokušajte omogućiti opciju 'force image path for events' in postavkama uređaja. Moguće da je i format nekombatibilan u mobilnom prikazu.",
"kVideoLoading" :"Učitavam video",
"kVideoMp4Warning" :"Trenutno nije moguće znati kada je preuzimanje dovršeno. Molimo pratite preuzetu veličinu u download prikazu.",
"kWarningBasicAuth" :"Osnovna autentifikacija može praviti problem prilikom live prikaza. Molimo pročitajte FAQ",
diff --git a/www/lang/locale-de.json b/www/lang/locale-de.json
index b8824460..1eb53f18 100644
--- a/www/lang/locale-de.json
+++ b/www/lang/locale-de.json
@@ -77,6 +77,7 @@
"kDismiss" :"verwerfen",
"kDone" :"Erledigt",
"kDownload" :"Herunterladen",
+ "kTapDownloadLogs" :"Klicke auf den Button um die Logdateien herunterzuladen.",
"kDownloadVideoImage" :"Drücke den Knopf um das Video herunterzuladen. Bitte achte auf die Dateigröße, da es kein Fortschrittsbalken während des Downloads gibt.",
"kEmailNotConfigured" :"Email nicht eingerichtet",
"kEnable24hr" :"24-Stunden Zeitformat aktivieren",
@@ -351,6 +352,15 @@
"kStateAreYouSure" :"Bist Du sicher, dass Du folgendes tun möchtest ",
"kStateHideControls" :"Verstecke ZoneMinder Bedienelemente",
"kStateShowControls" :"Zeige ZoneMinder Bedienelemente",
+ "kStateStorage" :"Speicherplatz",
+ "kStateServer" :"Server",
+ "kStatePath" :"Pfad",
+ "kStateHost" :"Host",
+ "kStateDiskUsed" :"Festplatte benutzt",
+ "kStateCpuLoad" :"CPU Auslastung",
+ "kStateTotalMem" :"Arbeitsspeicher gesamt",
+ "kStateFreeMem" :"Arbeitsspeicher frei",
+ "kScheme" :"Schema",
"kStatus" :"Status",
"kStop" :"Stop",
"kSuccess" :"erledigt",
@@ -392,7 +402,6 @@
"kVibrateOnPush" :"Bei Push vibrieren",
"kVideo" :"Video",
"kVideoError" :"Video nicht abspielbar.",
- "kVideoErrorMobile" :"Video nicht abspielbar. Versuche 'force image path for events' in den Entwicklereinstellungen zu aktivieren. Der Format kann auch inkompatibel mit einem mobilen Systenview sein",
"kVideoLoading" :"Lade Video",
"kVideoMp4Warning" :"Es ist aktuell nicht erkennbar, wann das Video komplett heruntergeladen ist. Bitte Downloadgröße verfolgen.",
"kWarningBasicAuth" :"Basisauthentifizierung kann das Abspielen des Livebilds stören. Bitte FAQ lesen",
diff --git a/www/lang/locale-en.json b/www/lang/locale-en.json
index 41292397..82d58859 100644
--- a/www/lang/locale-en.json
+++ b/www/lang/locale-en.json
@@ -77,6 +77,7 @@
"kDismiss" : "Dismiss",
"kDone" :"done",
"kDownload" :"Download",
+ "kTapDownloadLogs" : "Tap the button to download logs",
"kDownloadVideoImage" : "Tap the button below to download. If you are downloading a video, there is no progress indication, so please monitor file size",
"kEmailNotConfigured" :"Email not configured",
"kEnable24hr" :"enable 24hr time format",
@@ -351,6 +352,15 @@
"kStateAreYouSure" :"Are you sure you want to ",
"kStateHideControls" :"Hide ZoneMinder Controls",
"kStateShowControls" :"Show ZoneMinder Controls",
+ "kStateStorage" :"Storage",
+ "kStateServer" :"Server",
+ "kStatePath" :"Path",
+ "kStateHost" :"Host",
+ "kStateDiskUsed" :"Disk Used",
+ "kStateCpuLoad" :"CPU Load",
+ "kStateTotalMem" :"Total Memory",
+ "kStateFreeMem" :"Free Memory",
+ "kScheme" :"Scheme",
"kStatus" :"Status",
"kStop" :"Stop",
"kSuccess" :"Success",
@@ -391,8 +401,7 @@
"kVersionIncompatible" :"I am incompatible with your ZoneMinder version",
"kVibrateOnPush" :"Vibrate on push",
"kVideo" :"Video",
- "kVideoError" :"Video not playable.",
- "kVideoErrorMobile" :"Video not playable. Try enabling 'force image path for events' in Dev Settings. The format may also be incompatible with a mobile system view",
+ "kVideoError" :"Video not playable",
"kVideoLoading" :"Loading Video",
"kVideoMp4Warning" :"It is currently not possible to know when video is fully downloaded. Please track file size of download.",
"kWarningBasicAuth" :"Basic auth may interfere with live streaming. Please read FAQ",
diff --git a/www/lang/locale-es.json b/www/lang/locale-es.json
index a644927a..d4fb53a6 100644
--- a/www/lang/locale-es.json
+++ b/www/lang/locale-es.json
@@ -383,7 +383,6 @@
"kVibrateOnPush" :"Vibrar en notificaciones push",
"kVideo" :"Vídeo",
"kVideoError" :"El vídeo no se puede reproducir.",
- "kVideoErrorMobile" :"El vídeo no se puede reproducir. Trata de habilitar 'forzar el directorio para los eventos' en Opc de Desarrollador. El formato también podría ser incompatible con la vista en sistemas móviles",
"kVideoLoading" :"Cargando Vídeo",
"kVideoMp4Warning" :"Actualmente no es posible saber cuando el vídeo se ha descargado completamente. Por favor fíjese en el tamaño del archivo para tener un estimado.",
"kWarningBasicAuth" :"La autenticación básica puede interferir con stremings en vivo. Por favor lea las preguntas frecuentes.",
diff --git a/www/lang/locale-fr.json b/www/lang/locale-fr.json
index 566c8aff..0b5dd537 100644
--- a/www/lang/locale-fr.json
+++ b/www/lang/locale-fr.json
@@ -340,7 +340,6 @@
"kVibrateOnPush" :"Vibrer en cas de notification",
"kVideo" :"Vidéo",
"kVideoError" :"Impossible de lire la vidéo.",
- "kVideoErrorMobile" :"Impossible de lire la vidéo. Essayez d'activer l'option 'Forcer le chemin des événements' dans les options développeur. Il se peut que le format soit incompatible avec les appareils mobiles",
"kVideoLoading" :"Chargement de la vidéo",
"kVideoMp4Warning" :"Impossible de déterminer l'avancement du téléchargement de la vidéo. Veuillez suivre la taille du fichier.",
"kWarningLargeTimeline" :"Une valeur élevée peut réduire les performances. Si vous trouvez le calendrier lent, essayez de réduire à la valeur 200 puis augmentez progressivement.",
diff --git a/www/lang/locale-hu.json b/www/lang/locale-hu.json
index e445ff43..4f4db929 100644
--- a/www/lang/locale-hu.json
+++ b/www/lang/locale-hu.json
@@ -343,7 +343,6 @@
"kVibrateOnPush" :"Rezgés érintéskor",
"kVideo" :"Videó",
"kVideoError" :"A videó nem játszható le.",
- "kVideoErrorMobile" :"A videó nem játszható. Próbálja engedélyezni a 'Elérési út az eseményekhez' lehetőséget az eszköz beállításaiban. A formátum is összeegyeztethetetlen a mobil rendszer nézettel",
"kVideoLoading" :"Videó betöltése",
"kVideoMp4Warning" :"Jelenleg nem lehet tudni, hogy a videó teljesen letöltődik-e. Kérjük, kövesse nyomon a letöltés fájlméretét.",
"kWarningLargeTimeline" :"Nagy érték befolyásolhatja az idővonal teljesítményét. Ha az idővonal teljesítményét lassunak találja, próbálja csökkenteni a 200-as értéket, és folytassa tovább.",
diff --git a/www/lang/locale-nl.json b/www/lang/locale-nl.json
index b6800697..a6367952 100755
--- a/www/lang/locale-nl.json
+++ b/www/lang/locale-nl.json
@@ -335,7 +335,6 @@
"kVibrateOnPush" :"Trillen bij push",
"kVideo" :"Video",
"kVideoError" :"Kan video niet afspelen.",
- "kVideoErrorMobile" :"Kan video niet afspelen. Probeer 'Dwing gebeurtenissen bestands map te gebruiken' te activeren in ontwikkelaars instellingen. Het formaat is wellicht ook niet compatible met mobiel systeem beeld",
"kVideoLoading" :"Video laden",
"kVideoMp4Warning" :"Het is niet mogelijk te detecteren wanneer video volledig is gedownload. Vergelijk grootte van de download.",
"kWarningLargeTimeline" :"Een hoge waarde kan de tijdlijn prestatie beïnvloeden. Bij slechte prestaties van de tijdlijn start met een waarde van 200 en verhoog deze langzaam.",
diff --git a/www/lang/locale-pl.json b/www/lang/locale-pl.json
index 8c495f2e..53879451 100644
--- a/www/lang/locale-pl.json
+++ b/www/lang/locale-pl.json
@@ -319,6 +319,7 @@
"kSaveToCloudIOS" :"zapisuje ustawienia na twoim koncie iCloud. Synchronizacja może zająć kilka godzin",
"kSaveToCloudANDROID" :"zapisuje ustawienia przez Serwis Backup Android'a. Synchronizacja może zająć kilka godzin",
"kSavingSnapshot" :"zapisuję obraz",
+ "kScheme" :"Schemat",
"kScore" :"punkty",
"kScrub" :"Podgląd",
"kSearch" :"szukaj",
@@ -349,13 +350,22 @@
"kSpeed" :"prędkość",
"kStart" :"Start",
"kStateAreYouSure" :"Jesteś pewien, że chcesz ",
+ "kStateCpuLoad" :"Obciążenie CPU",
+ "kStateDiskUsed" :"Dysku w użyciu",
+ "kStateFreeMem" :"Wolnej pamięci",
"kStateHideControls" :"Ukryj Przyciski ZoneMinder",
+ "kStateHost" :"Host",
+ "kStatePath" :"Ścieżka",
+ "kStateServer" :"Serwer",
"kStateShowControls" :"Pokaż Przyciski ZoneMinder",
+ "kStateStorage" :"Pamięć",
+ "kStateTotalMem" :"Całość pamięci",
"kStatus" :"Stan",
"kStop" :"Stop",
"kSuccess" :"Sukces",
"kSwitchingEvents" :"przełączam zdarzenia",
"kSystemStatus" :"Stan Systemu",
+ "kTapDownloadLogs" :"Wciśnij przycisk by pobrać logi",
"kTapEvents" :"Zdarzenia",
"kTapLiveMonitor" :"Podgląd na żywo",
"kTapMontage" :"Podgląd",
@@ -391,8 +401,7 @@
"kVersionIncompatible" :"Jestem niekompatybilny z wersją Twojego ZoneMinder'a",
"kVibrateOnPush" :"Wibruj przy dotknięciu",
"kVideo" :"Wideo",
- "kVideoError" :"Wideo nie odtwarzalne.",
- "kVideoErrorMobile" :"Wideo nie odtwarzalne. Spróbuj włączyć 'wymuś ścieżkę obrazu dla zdarzenia' w Ustawieniach Zaawansowanych. Format może być też niekompatybilny z przeglądarką systemu mobilnego",
+ "kVideoError" :"Wideo nie odtwarzalne",
"kVideoLoading" :"Ładuję Wideo",
"kVideoMp4Warning" :"Obecnie nie ma możliwości stwierdzenia, czy wideo zostało w pełni ściągnięte. Sprawdź wielkość pliku do ściągnięcia.",
"kWarningBasicAuth" :"Prosta autoryzacja może powodować konflikt ze streamingiem na żywo. Proszę, przeczytaj FAQ",
diff --git a/www/lang/locale-pt.json b/www/lang/locale-pt.json
index 3b5f1e71..276ff573 100644
--- a/www/lang/locale-pt.json
+++ b/www/lang/locale-pt.json
@@ -312,7 +312,6 @@
"kVibrateOnPush" :"Vibrar ao premir",
"kVideo" :"Vídeo",
"kVideoError" :"Vídeo não reproduzível.",
- "kVideoErrorMobile" :"Vídeo não reproduzível. Experimente ativar 'forçar o caminho da imagem para eventos' em Configurações Dev. O formato também pode ser incompatível com o sistema de visualização do equipamento móvel",
"kVideoLoading" :"Carregando Vídeo",
"kVideoMp4Warning" :"Não é possível de momento saber quando o vídeo está totalmente carregado. Por favor, verifique o tamnho do arquivo de download.",
"kWarningLargeTimeline" :"Um valor elevado pode afetar o desempenho da timeline. Se você achar o desempenho da timeline lento, tente reduzir o valor para 200 e trabalhe a partir daí.",
diff --git a/www/lang/locale-ru.json b/www/lang/locale-ru.json
index 8c5e48ad..b79de803 100644
--- a/www/lang/locale-ru.json
+++ b/www/lang/locale-ru.json
@@ -317,7 +317,6 @@
"kVibrateOnPush" :"Вибрировать при нажатии",
"kVideo" :"Видео",
"kVideoError" :"Не возможно проиграть видео.",
- "kVideoErrorMobile" :"Не возможно проиграть видео. Попробуйте включить 'принудительный путь к картинкам для событий' в Настройках Разработчика. Формат может быть также не совместим с плеером мобильной системой",
"kVideoLoading" :"Загрузка Видео",
"kVideoMp4Warning" :"Сейчас не возможно определить когда видео будет полностью загружено. Пожалуйста следите за размером скачиваемого файла.",
"kWarningLargeTimeline" :"Большое значение может повлиять на производительность временной шкалы. Если производительность временной шкалы медленна, попробуйте уменьшить значение до 200.",
diff --git a/www/templates/log.html b/www/templates/log.html
index c67cab4c..99de95d3 100644
--- a/www/templates/log.html
+++ b/www/templates/log.html
@@ -19,7 +19,7 @@
<a class="button button-icon icon ion-email" ng-href="" ng-click="attachLogs()"> </a>
</div>
<div ng-if="$root.platformOS=='desktop'">
- <a class="button button-icon icon ion-android-download" ng-href="" ng-click="sendEmail(log.logString)"> </a>
+ <a class="button button-icon icon ion-android-download" ng-href="" ng-click="downloadLogs()"> </a>
</div>
</ion-nav-buttons>
<ion-content delegate-handle="none" overflow-scroll="false" mouse-wheel-scroll>
diff --git a/www/templates/state.html b/www/templates/state.html
index f5bff536..7791cd7b 100644
--- a/www/templates/state.html
+++ b/www/templates/state.html
@@ -6,6 +6,24 @@
</ion-nav-buttons>
<ion-content delegate-handle="none" overflow-scroll="false" mouse-wheel-scroll>
<ion-refresher pulling-text="{{'kPullToReload' | translate}}..." spinner="bubbles" on-refresh="doRefresh()"></ion-refresher>
+
+ <ion-item>
+
+ <div>
+ <div class="row">
+ <div class="col text-center">
+ <a class="button button-small button-outline button-dark " ng-click="selectCustomState();" href="">{{'kChangeState'|translate}}</a>
+ <a class="button button-small button-outline button-dark " ng-click="controlZM('restart');" href="">{{'kRestart'
+ | translate}}</a>
+ <a class="button button-small button-outline button-dark" href="" ng-click="controlZM('stop');">{{'kStop'
+ | translate}}</a>
+ <a class="button button-small button-outline button-dark" ng-click="controlZM('start');" href="">{{'kStart'
+ | translate}}</a>
+ </div>
+ </div>
+ </div>
+ </ion-item>
+
<ion-list>
<ion-item>
<div class="row">
@@ -35,23 +53,73 @@
</div>
</div>
</ion-item>
+ </ion-list>
- <ion-item>
-
- <div>
- <div class="row">
- <div class="col text-center">
- <a class="button button-small button-outline button-dark " ng-click="selectCustomState();" href="">{{'kChangeState'|translate}}</a>
- <a class="button button-small button-outline button-dark " ng-click="controlZM('restart');" href="">{{'kRestart'
- | translate}}</a>
- <a class="button button-small button-outline button-dark" href="" ng-click="controlZM('stop');">{{'kStop'
- | translate}}</a>
- <a class="button button-small button-outline button-dark" ng-click="controlZM('start');" href="">{{'kStart'
- | translate}}</a>
- </div>
- </div>
+
+
+ <div class="list" >
+ <div class="item item-divider icon-left" ng-click="toggleStorage()">
+ <i class="icon" ng-class="showStorage? 'ion-chevron-up':'ion-chevron-down'"></i>
+ {{'kStateStorage' | translate}}
</div>
- </ion-item>
- </ion-list>
+ <div ng-repeat = "store in storage">
+ <div class="item item-accordion item-divider item-icon-left " ng-show="showStorage">
+ <i class="icon ion-social-buffer"></i>
+ {{store.Storage.Name}} ({{store.Storage.Id}})
+ </div> <!-- divider -->
+ <div class="item item-accordion" ng-show="showStorage">
+
+ <div class="row">
+ {{'kStatePath' | translate }}: {{store.Storage.Path}}
+ </div>
+ <div class="row">
+ {{'kStateDiskUsed' | translate }}: {{ humanFileSize(store.Storage.DiskSpace,true)}}
+ </div>
+ <div class="row">
+ {{'kScheme' | translate }}: {{ store.Storage.Scheme}}
+ </div>
+ <div ng-if="store.Storage.ServerId" class="row">
+ {{'kStateServer' | translate }}: {{ matchServer(store.Storage.ServerId)}}
+ </div>
+
+ </div> <!-- item -->
+ </div> <!-- repeat -->
+
+ <div class="item item-divider icon-left" ng-click="toggleServer()">
+ <i class="icon" ng-class="showServer? 'ion-chevron-up':'ion-chevron-down'"></i>
+ {{'kStateServer' | translate}}
+ </div>
+ <div ng-repeat = "server in servers">
+ <div class="item item-accordion item-divider item-icon-left " ng-show="showServer">
+ <i class="icon ion-monitor"></i>
+ {{server.Server.Name}} ({{server.Server.Id}})
+ </div> <!-- divider -->
+ <div class="item item-accordion" ng-show="showServer">
+
+ <div class="row">
+ {{'kStateHost' | translate }}: {{server.Server.Hostname}}
+ </div>
+ <div class="row">
+ {{'kStatus' | translate }}: {{ server.Server.Status}}
+ </div>
+ <div class="row">
+ {{'kStateCpuLoad' | translate }}: {{ server.Server.CpuLoad}}
+ </div>
+ <div class="row">
+ {{'kStateTotalMem' | translate }}: {{ humanFileSize(server.Server.TotalMem, true)}}
+ </div>
+ <div class="row">
+ {{'kStateFreeMem' | translate }}: {{ humanFileSize(server.Server.FreeMem, true)}}
+ </div>
+
+
+ </div> <!-- item -->
+ </div> <!-- repeat -->
+ </div> <!-- list ---->
+
+
+
+
+
</ion-content>
</ion-view>