summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpliablepixels <pliablepixels@gmail.com>2016-05-31 14:16:07 -0400
committerpliablepixels <pliablepixels@gmail.com>2016-05-31 14:16:07 -0400
commit7c2b57e3ebafe875e2672a7a04ebd189d16b1928 (patch)
tree870e6bd415b22fa54c7ebe6f72d196c7a7f51d31
parent75a26e142644f1a353f7ec8216e16802da8e9421 (diff)
#261 - additions
Former-commit-id: 58276aaa504b3c6ecccea2548d181d97c6742420
-rw-r--r--www/js/DataModel.js14
-rw-r--r--www/js/HelpCtrl.js43
-rw-r--r--www/js/WizardCtrl.js2
-rw-r--r--www/js/app.js38
-rw-r--r--www/lang/README.TXT5
-rw-r--r--www/lang/help/help-en.html72
-rw-r--r--www/lang/help/help-it.html72
-rw-r--r--www/lang/locale-en.json16
-rw-r--r--www/lang/locale-it.json15
-rw-r--r--www/templates/help.html83
-rw-r--r--www/templates/monitors-modal.html16
-rw-r--r--www/templates/monitors.html2
-rw-r--r--www/templates/montage.html15
13 files changed, 283 insertions, 110 deletions
diff --git a/www/js/DataModel.js b/www/js/DataModel.js
index e45829af..14864648 100644
--- a/www/js/DataModel.js
+++ b/www/js/DataModel.js
@@ -424,11 +424,6 @@ angular.module('zmApp.controllers')
loginData.montageSize = 2;
}
- if (typeof loginData.useNphZms == 'undefined')
- {
- zmDebug ("useNphZms does not exist. Setting to true");
- loginData.useNphZms = true;
- }
if (typeof loginData.useNphZms == 'undefined')
{
@@ -436,8 +431,7 @@ angular.module('zmApp.controllers')
loginData.useNphZms = true;
}
- // and now, force enable it
- loginData.useNphZms = true;
+
if (typeof loginData.useNphZmsForEvents == 'undefined')
{
@@ -445,6 +439,10 @@ angular.module('zmApp.controllers')
loginData.useNphZmsForEvents = true;
}
+ // and now, force enable it
+ loginData.useNphZms = true;
+ loginData.useNphZmsForEvents = true;
+
if (typeof loginData.packMontage == 'undefined')
{
zmDebug ("packMontage does not exist. Setting to false");
@@ -511,7 +509,7 @@ angular.module('zmApp.controllers')
if (typeof timelineModalGraphType == 'undefined')
{
zmDebug ("timeline graph type not set. Setting to all");
- loginData.timelineModalGraphType = 'all';
+ loginData.timelineModalGraphType = $translate.instant('kAll');
}
if (typeof loginData.resumeDelay == 'undefined')
diff --git a/www/js/HelpCtrl.js b/www/js/HelpCtrl.js
index 52e7c0f0..15504f7b 100644
--- a/www/js/HelpCtrl.js
+++ b/www/js/HelpCtrl.js
@@ -2,7 +2,7 @@
/* jslint browser: true*/
/* global cordova,StatusBar,angular,console, Masonry */
-angular.module('zmApp.controllers').controller('zmApp.HelpCtrl', ['$scope', '$rootScope', '$ionicModal', 'ZMDataModel','$ionicSideMenuDelegate', '$ionicHistory', '$state', function ($scope, $rootScope, $ionicModal, ZMDataModel,$ionicSideMenuDelegate, $ionicHistory, $state) {
+angular.module('zmApp.controllers').controller('zmApp.HelpCtrl', ['$scope', '$rootScope', '$ionicModal', 'ZMDataModel','$ionicSideMenuDelegate', '$ionicHistory', '$state', '$translate', '$q', '$templateRequest', '$sce', '$compile', function ($scope, $rootScope, $ionicModal, ZMDataModel,$ionicSideMenuDelegate, $ionicHistory, $state, $translate, $q, $templateRequest, $sce, $compile) {
$scope.openMenu = function () {
$ionicSideMenuDelegate.toggleLeft();
};
@@ -22,6 +22,44 @@ $scope.openMenu = function () {
}
};
+
+ function insertHelp()
+ {
+
+
+
+ var l = ZMDataModel.getDefaultLanguage() || 'en';
+ var lang = "lang/help/help-"+l+".html";
+ console.log ("LANG IS " + lang);
+ var templateUrl = $sce.getTrustedResourceUrl(lang);
+ var lang_fb= "lang/help/help-"+"en"+".html";
+ var templateUrlFB = $sce.getTrustedResourceUrl(lang_fb);
+
+ $templateRequest(lang)
+ .then (function(template)
+ {
+ var elem = angular.element(document.getElementById('insertHelp'));
+ $compile(elem.html(template).contents())($scope);
+ },
+ function (error)
+ {
+ ZMDataModel.zmLog ("Language file " + lang + " not found, falling back");
+ $templateRequest(templateUrlFB)
+ .then (function( template)
+ {
+ var elem = angular.element(document.getElementById('insertHelp'));
+ $compile(elem.html(template).contents())($scope);
+ },
+ function (error)
+ {
+ ZMDataModel.zmLog("fallback help not found");
+ });
+ }
+ );
+
+
+
+ }
//-------------------------------------------------------------------------
// Lets make sure we set screen dim properly as we enter
@@ -34,6 +72,9 @@ $scope.openMenu = function () {
//console.log("**VIEW ** Help Ctrl Entered");
ZMDataModel.setAwake(false);
$scope.zmAppVersion = ZMDataModel.getAppVersion();
+ insertHelp();
+
+
diff --git a/www/js/WizardCtrl.js b/www/js/WizardCtrl.js
index b241304d..aa48e1a5 100644
--- a/www/js/WizardCtrl.js
+++ b/www/js/WizardCtrl.js
@@ -190,6 +190,8 @@ angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$
var a3 = baseUri+"/zm/cgi-bin"; // ubuntu/debian
var a2 = baseUri+"/cgi-bin-zm"; //fedora/centos/rhel
var a1 = baseUri+"/cgi-bin"; // doofus
+
+
var urls = [a1,a2,a3];
diff --git a/www/js/app.js b/www/js/app.js
index dadda298..03b01c8f 100644
--- a/www/js/app.js
+++ b/www/js/app.js
@@ -1,6 +1,6 @@
/* jshint -W041 */
/* jslint browser: true*/
-/* global cordova,StatusBar,angular,console,alert,PushNotification, moment ,ionic, URI, $*/
+/* global cordova,StatusBar,angular,console,alert,PushNotification, moment ,ionic, URI, ConnectSDK,$*/
var appVersion = "0.0.0";
@@ -36,6 +36,7 @@ angular.module('zmApp', [
minAppVersion: '1.28.107', // if ZM is less than this, the app won't work
recommendedAppVersion: '1.29',
minEventServerVersion: '0.7',
+ castAppId: 'BA30FB4C',
alarmFlashTimer: 20000, // time to flash alarm
gcmSenderId: '710936220256',
httpTimeout: 15000,
@@ -80,6 +81,28 @@ angular.module('zmApp', [
})
+// credit: http://stackoverflow.com/questions/25391279/angularjs-ng-include-failover
+.directive("ngIncludeFailover", function() {
+ return {
+ restrict: 'CAE',
+ scope: {
+ src: '=',
+ myInclude: '='
+ },
+ transclude:true,
+ link: function(scope, iElement, iAttrs, controller) {
+ iAttrs.$observe('src', function (nv) {scope.src=nv; console.log ("CHANGED");});
+ scope.$on("$includeContentError", function(event, args){
+ scope.loadFailed=true;
+ });
+ scope.$on("$includeContentLoaded", function(event, args){
+ scope.loadFailed=false;
+ });
+ },
+ template: "<div ng-include='ngIncludeFailover||src'></div><div ng-show='loadFailed' ng-transclude/>"
+ };
+ })
+
// credit https://gist.github.com/Zren/beaafd64f395e23f4604
.directive('mouseWheelScroll', function($timeout) {
@@ -1184,19 +1207,23 @@ angular.module('zmApp', [
$ionicPlatform.ready(function () {
+
+
$ionicNativeTransitions.enable(true, false);
var lang = ZMDataModel.getDefaultLanguage();
if (lang == undefined)
{
- ZMDataModel.zmLog ("No language set, detecting...");
+ ZMDataModel.zmLog ("No language set, switching to en");
+ ZMDataModel.setDefaultLanguage("en", false);
+ /*
if(typeof navigator.globalization !== "undefined") {
navigator.globalization.getPreferredLanguage(function(language) {
// dont make this permanent
ZMDataModel.setDefaultLanguage((language.value).split("-")[0], false);
}, null);
- }
+ }*/
}
else
{
@@ -1229,6 +1256,9 @@ angular.module('zmApp', [
$rootScope.platformOS = "android";
ZMDataModel.zmLog("You are running on " + $rootScope.platformOS);
+
+
+
ZMDataModel.init();
EventServer.init();
@@ -1477,7 +1507,7 @@ angular.module('zmApp', [
- $translateProvider.determinePreferredLanguage();
+ //$translateProvider.determinePreferredLanguage();
//$translateProvider.preferredLanguage("en");
$translateProvider.fallbackLanguage("en");
$translateProvider.useSanitizeValueStrategy('sanitize');
diff --git a/www/lang/README.TXT b/www/lang/README.TXT
index 3add37e7..6353049c 100644
--- a/www/lang/README.TXT
+++ b/www/lang/README.TXT
@@ -1,4 +1,9 @@
+####Main Language file
* Make sure there is no comma after the last element
* Comments are not allowed
* Prettify and sort using http://www.uize.com/examples/json-prettifier.html
** Preset:Padded and Sorted/Key Padding:on, Key Quoting: always, Key Sorting: On
+
+####Help language file
+* Located inside lang/help
+* Please be careful not to mess up the html tags, please only focus on text translation
diff --git a/www/lang/help/help-en.html b/www/lang/help/help-en.html
new file mode 100644
index 00000000..e19ddd1d
--- /dev/null
+++ b/www/lang/help/help-en.html
@@ -0,0 +1,72 @@
+<ion-item class="item-text-wrap">
+ <h2><b>Is there an official FAQ?</b> </h2>There sure is. Always check <a href="#" onclick="window.open('https://github.com/pliablepixels/zmNinja/wiki/FAQ', '_blank', 'location=yes'); return false;">here</a> for the most updated help
+ </ion-item>
+
+ <ion-item class="item-text-wrap">
+ <h2><b> What do I enter for ZM Portal URL, Base path to cgi-bin and ZM API URL?</b> </h2>
+ <ul>
+ {{$root.appName}} now has a wizard that tries to detect your settings. This may fail if you have a custom install with non standard paths.
+ <li><i class="ion-android-arrow-dropright"></i> ZM Portal URL: The URL using which you can access ZM
+ <p>(example http://myserver.ddns.net/zm)</p>
+ </li>
+ <li><i class="ion-android-arrow-dropright"></i> CGI path: The URL using which your cgi-bin path is accessible
+ <p>(example http://myserver.ddns.net/zm/cgi-bin).</p>
+ </li>
+ <li><i class="ion-android-arrow-dropright"></i> API Url: The URL using which your API path is accessible
+ <p>(example:http://myserver.ddns.net/zm/api)</p>
+ </li>
+ </ul>
+ </ion-item>
+
+ <ion-item class="item-text-wrap">
+ <h2><b>Since when does ZM have an API?</b> </h2> The latest versions of ZoneMinder have an API that is supposed to replace the XML skin. It is only available starting Zoneminder 1.28.107. If you don't have the API installed the client will not work.
+
+ </ion-item>
+
+ <ion-item class="item-text-wrap">
+ <h2> <b>I do not have authentication enabled but the app keeps asking me to specify authentication</b></h2> If you don't use ZM authentication, just enter an "x" in both user name and password.
+ </ion-item>
+
+
+ <ion-item class="item-text-wrap">
+ <h2> <b>Everything works! but live streaming does not </b></h2> Check if streaming works in the web interface. If it does not work, {{$root.appName}} won't work either. Fix ZM first. If streaming in ZM works, go to {{$root.appName}} settings and fix your cgi-bin path. the automatic path that is filled in won't work. Here is a hint, go to zoneminder-options-paths and check the value of the cgi-bin path - your {{$root.appName}} path will be "base path of your server" + cgi-bin path.
+ </ion-item>
+
+
+ <ion-item class="item-text-wrap">
+ <h2><b> The data is not refreshing!</b></h2> Most screens that show lists of data has a pull down action. Pull down to refresh and your data should be reloaded.
+ </ion-item>
+
+ <ion-item class="item-text-wrap">
+ <h2><b> What do all the colors in the Monitor view mean?</b></h2>
+ <i class="icon ion-checkmark-circled" style="color:#03A9F4"></i> Checking
+ <br/>
+ <i class="icon ion-checkmark-circled" style="color:#4CAF50"></i> All good
+ <br/>
+ <i class="icon ion-close-circled" style="color:#F44336"></i> Not running
+ <br/>
+ <i class="icon ion-close-circled" style="color:#FF9800"></i> Not running (pending)
+ <br/>
+ <i class="icon ion-checkmark-circled" style="color:grey"></i> Disabled
+ <br/>
+ <i class="icon ion-help-circled" style="color:#795548"></i> Unknown
+ <br/>
+
+ </ion-item>
+
+ <ion-item class="item-text-wrap">
+ <h2><b>I want to contribute!</b></h2> Awesome. <a href="#" onclick="window.open('http://github.com/pliablepixels/zmNinja', '_blank', 'location=yes'); return false;"> Grab</a> the source code!
+ </ion-item>
+
+ <ion-item class="item-text-wrap">
+ <h2><b>I'm having problems with this app</b></h2>Tap on the logs option in the menu. Click the email button on the top right to send them to the author of this app. Note that when the email is composed, zmNinja tries to remove personal information by searching and replacing server IP addresses and server passwords. However it is <b>your responsibility</b> to make sure the logs don't contain any sensitive information. Before you send the email, please review the embedded logs and edit as needed.
+ </ion-item>
+
+ <ion-item class="item-text-wrap">
+ <h2><b>I can see my server URLs and passwords in logs. You said zmNinja removes them?</b></h2>zmNinja tries to remove them <b>after</b> you tap on the email button. I suppose I could remove them from the stored logs too, but then it would be harder for you to figure out if you made a mistake in configuring the app.
+ </ion-item>
+
+ <ion-item class="item-text-wrap">
+ <h2><b>How do I contact the author?</b></h2> Send me an <a href="#" onclick="window.open('mailto:pliablepixels@gmail.com', '_blank', 'location=yes'); return false;">email</a>
+ </ion-item>
+
diff --git a/www/lang/help/help-it.html b/www/lang/help/help-it.html
new file mode 100644
index 00000000..e19ddd1d
--- /dev/null
+++ b/www/lang/help/help-it.html
@@ -0,0 +1,72 @@
+<ion-item class="item-text-wrap">
+ <h2><b>Is there an official FAQ?</b> </h2>There sure is. Always check <a href="#" onclick="window.open('https://github.com/pliablepixels/zmNinja/wiki/FAQ', '_blank', 'location=yes'); return false;">here</a> for the most updated help
+ </ion-item>
+
+ <ion-item class="item-text-wrap">
+ <h2><b> What do I enter for ZM Portal URL, Base path to cgi-bin and ZM API URL?</b> </h2>
+ <ul>
+ {{$root.appName}} now has a wizard that tries to detect your settings. This may fail if you have a custom install with non standard paths.
+ <li><i class="ion-android-arrow-dropright"></i> ZM Portal URL: The URL using which you can access ZM
+ <p>(example http://myserver.ddns.net/zm)</p>
+ </li>
+ <li><i class="ion-android-arrow-dropright"></i> CGI path: The URL using which your cgi-bin path is accessible
+ <p>(example http://myserver.ddns.net/zm/cgi-bin).</p>
+ </li>
+ <li><i class="ion-android-arrow-dropright"></i> API Url: The URL using which your API path is accessible
+ <p>(example:http://myserver.ddns.net/zm/api)</p>
+ </li>
+ </ul>
+ </ion-item>
+
+ <ion-item class="item-text-wrap">
+ <h2><b>Since when does ZM have an API?</b> </h2> The latest versions of ZoneMinder have an API that is supposed to replace the XML skin. It is only available starting Zoneminder 1.28.107. If you don't have the API installed the client will not work.
+
+ </ion-item>
+
+ <ion-item class="item-text-wrap">
+ <h2> <b>I do not have authentication enabled but the app keeps asking me to specify authentication</b></h2> If you don't use ZM authentication, just enter an "x" in both user name and password.
+ </ion-item>
+
+
+ <ion-item class="item-text-wrap">
+ <h2> <b>Everything works! but live streaming does not </b></h2> Check if streaming works in the web interface. If it does not work, {{$root.appName}} won't work either. Fix ZM first. If streaming in ZM works, go to {{$root.appName}} settings and fix your cgi-bin path. the automatic path that is filled in won't work. Here is a hint, go to zoneminder-options-paths and check the value of the cgi-bin path - your {{$root.appName}} path will be "base path of your server" + cgi-bin path.
+ </ion-item>
+
+
+ <ion-item class="item-text-wrap">
+ <h2><b> The data is not refreshing!</b></h2> Most screens that show lists of data has a pull down action. Pull down to refresh and your data should be reloaded.
+ </ion-item>
+
+ <ion-item class="item-text-wrap">
+ <h2><b> What do all the colors in the Monitor view mean?</b></h2>
+ <i class="icon ion-checkmark-circled" style="color:#03A9F4"></i> Checking
+ <br/>
+ <i class="icon ion-checkmark-circled" style="color:#4CAF50"></i> All good
+ <br/>
+ <i class="icon ion-close-circled" style="color:#F44336"></i> Not running
+ <br/>
+ <i class="icon ion-close-circled" style="color:#FF9800"></i> Not running (pending)
+ <br/>
+ <i class="icon ion-checkmark-circled" style="color:grey"></i> Disabled
+ <br/>
+ <i class="icon ion-help-circled" style="color:#795548"></i> Unknown
+ <br/>
+
+ </ion-item>
+
+ <ion-item class="item-text-wrap">
+ <h2><b>I want to contribute!</b></h2> Awesome. <a href="#" onclick="window.open('http://github.com/pliablepixels/zmNinja', '_blank', 'location=yes'); return false;"> Grab</a> the source code!
+ </ion-item>
+
+ <ion-item class="item-text-wrap">
+ <h2><b>I'm having problems with this app</b></h2>Tap on the logs option in the menu. Click the email button on the top right to send them to the author of this app. Note that when the email is composed, zmNinja tries to remove personal information by searching and replacing server IP addresses and server passwords. However it is <b>your responsibility</b> to make sure the logs don't contain any sensitive information. Before you send the email, please review the embedded logs and edit as needed.
+ </ion-item>
+
+ <ion-item class="item-text-wrap">
+ <h2><b>I can see my server URLs and passwords in logs. You said zmNinja removes them?</b></h2>zmNinja tries to remove them <b>after</b> you tap on the email button. I suppose I could remove them from the stored logs too, but then it would be harder for you to figure out if you made a mistake in configuring the app.
+ </ion-item>
+
+ <ion-item class="item-text-wrap">
+ <h2><b>How do I contact the author?</b></h2> Send me an <a href="#" onclick="window.open('mailto:pliablepixels@gmail.com', '_blank', 'location=yes'); return false;">email</a>
+ </ion-item>
+
diff --git a/www/lang/locale-en.json b/www/lang/locale-en.json
index d6fef580..f17f9588 100644
--- a/www/lang/locale-en.json
+++ b/www/lang/locale-en.json
@@ -35,12 +35,14 @@
"kChromeMax" : "max of 5 monitors - chrome limit",
"kCleaningUp" : "cleaning up",
"kClear" : "Clear",
+ "kCollapse" : "collapse",
"kConfiguration" : "Configuration",
"kCredentialsBody" : "Please provide your ZoneMinder credentials",
"kCredentialsTitle" : "Credentials Required",
"kCurrentState" : "current state",
"kCustomRange" : "Custom Range",
"kDay" : "Day",
+ "kDecreaseSize" : "decrease size",
"kDelete" : "Delete",
"kDeleteEventError1" : "could not delete event",
"kDeleteEventError2" : "please check logs",
@@ -79,18 +81,23 @@
"kEventSingleImageScale" : "Event single image scale",
"kEventView" : "Event View",
"kEvents" : "events",
+ "kEventsCap" : "Events",
"kExampleServer" : "eg. My House",
"kExitAppBackground" : "exit app in background",
+ "kExitFullScreen" : "exit full screen",
+ "kExitLiveView" : "exit live view",
"kExpert" : "Expert",
"kExploreEnjoy" : "Please explore the menu and enjoy",
"kFallback" : "Fallback configuration",
"kFallback2Configs" : "You need to have at least 2 distinct configurations created for a fallback",
+ "kFillScreen" : "fill screen",
"kFilterByDateTime" : "Filter by Date/Time",
"kFilterEvents" : "Filter Events",
"kFilterEventsBetween1" : "You are viewing events between",
"kFilterEventsBetween2" : "Do you want to delete this filter?",
"kFilterOn" : "Filter On",
"kFilterSettings" : "Filter Settings",
+ "kFitScreen" : "fit screen",
"kFootage" : "Footage",
"kForceAlarmConfirm" : "Are you sure you want to force an alarm for Monitor:",
"kForcingAlarm" : "forcing alarm",
@@ -113,6 +120,7 @@
"kImpMsg5" : "Reported Version",
"kImpMsg6" : "Recommended Version",
"kImpMsg7" : "Ok, got it",
+ "kIncreaseSize" : "increase size",
"kLanguage" : "Language",
"kLatestEvents" : "Latest Events",
"kLiveView" : "Live View",
@@ -130,7 +138,7 @@
"kMaxItemsForTimeline" : "Max. items for Timeline",
"kMaxMonitorsMontage" : "Max monitors in montage",
"kMenuDevSettings" : "Developer Settings",
- "kMenuEventMontage" : "EventMontage",
+ "kMenuEventMontage" : "Event Montage",
"kMenuEvents" : "Events",
"kMenuExit" : "Exit",
"kMenuHelp" : "Help",
@@ -166,6 +174,7 @@
"kNegotiatingStreamAuth" : "negotiating stream authentication",
"kNews" : "News",
"kNext" : "Next",
+ "kNextMonitor" : "next monitor",
"kNoEvents" : "No events to display",
"kNoMonitors" : "No monitors to display",
"kNoMoreEvents" : "no more events",
@@ -176,6 +185,7 @@
"kOnlyUseWebSocket" : "only use websockets",
"kOperationInProgressBody" : "The previous operation is still in progress. Please wait...",
"kOperationInProgressTitle" : "Operation in Progress",
+ "kPTZ" : "pan/tilt/zoom",
"kPTZNotReady" : "Not ready for PTZ",
"kPTZnotConfigured" : "PTZ not configured for this monitor",
"kPassword" : "password",
@@ -192,6 +202,7 @@
"kPortalUrl" : "ZM portal url",
"kPresets" : "presets",
"kPrev" : "Prev",
+ "kPrevMonitor" : "prev. monitor",
"kProfileChangeNotification" : "You have changed from {{oldName}} to {{newName}}. Please save this profile first",
"kProtect" : "protect",
"kPullToReload" : "pull to reload data",
@@ -199,7 +210,7 @@
"kRecaptcha" : "Looks like you have enabled reCaptcha. It needs to be turned off for the app to work",
"kReconfirmPin" : "Reconfirm PIN",
"kRecordingProgress" : "recording in progress",
- "kRefresh" : "Refresh",
+ "kRefresh" : "refresh",
"kRefreshedView" : "refreshed view",
"kReportEvents" : "report events",
"kReportedVersion" : "Reported Version",
@@ -291,4 +302,5 @@
"kZMStopped" : "stopped",
"kZMUndetermined" : "undetermined",
"kZMUpgradeNeeded" : "ZoneMinder upgrade needed"
+
} \ No newline at end of file
diff --git a/www/lang/locale-it.json b/www/lang/locale-it.json
index 59c89203..fcc365d5 100644
--- a/www/lang/locale-it.json
+++ b/www/lang/locale-it.json
@@ -35,11 +35,14 @@
"kChromeMax" : "MAX OF 5 MONITORS - CHROME LIMIT",
"kCleaningUp" : "CLEANING UP",
"kClear" : "CLEAR",
+ "kCollapse" : "COLLAPSE",
"kConfiguration" : "CONFIGURATION",
"kCredentialsBody" : "PLEASE PROVIDE YOUR ZONEMINDER CREDENTIALS",
"kCredentialsTitle" : "CREDENTIALS REQUIRED",
+ "kCurrentState" : "CURRENT STATE",
"kCustomRange" : "CUSTOM RANGE",
"kDay" : "DAY",
+ "kDecreaseSize" : "DECREASE SIZE",
"kDelete" : "DELETE",
"kDeleteEventError1" : "COULD NOT DELETE EVENT",
"kDeleteEventError2" : "PLEASE CHECK LOGS",
@@ -78,18 +81,23 @@
"kEventSingleImageScale" : "EVENT SINGLE IMAGE SCALE",
"kEventView" : "EVENT VIEW",
"kEvents" : "EVENTS",
+ "kEventsCap" : "EVENTS",
"kExampleServer" : "EG. MY HOUSE",
"kExitAppBackground" : "EXIT APP IN BACKGROUND",
+ "kExitFullScreen" : "EXIT FULL SCREEN",
+ "kExitLiveView" : "EXIT LIVE VIEW",
"kExpert" : "EXPERT",
"kExploreEnjoy" : "PLEASE EXPLORE THE MENU AND ENJOY",
"kFallback" : "FALLBACK CONFIGURATION",
"kFallback2Configs" : "YOU NEED TO HAVE AT LEAST 2 DISTINCT CONFIGURATIONS CREATED FOR A FALLBACK",
+ "kFillScreen" : "FILL SCREEN",
"kFilterByDateTime" : "FILTER BY DATE/TIME",
"kFilterEvents" : "FILTER EVENTS",
"kFilterEventsBetween1" : "YOU ARE VIEWING EVENTS BETWEEN",
"kFilterEventsBetween2" : "DO YOU WANT TO DELETE THIS FILTER?",
"kFilterOn" : "FILTER ON",
"kFilterSettings" : "FILTER SETTINGS",
+ "kFitScreen" : "FIT SCREEN",
"kFootage" : "FOOTAGE",
"kForceAlarmConfirm" : "ARE YOU SURE YOU WANT TO FORCE AN ALARM FOR MONITOR:",
"kForcingAlarm" : "FORCING ALARM",
@@ -112,6 +120,7 @@
"kImpMsg5" : "REPORTED VERSION",
"kImpMsg6" : "RECOMMENDED VERSION",
"kImpMsg7" : "OK, GOT IT",
+ "kIncreaseSize" : "INCREASE SIZE",
"kLanguage" : "LANGUAGE",
"kLatestEvents" : "LATEST EVENTS",
"kLiveView" : "LIVE VIEW",
@@ -129,7 +138,7 @@
"kMaxItemsForTimeline" : "MAX. ITEMS FOR TIMELINE",
"kMaxMonitorsMontage" : "MAX MONITORS IN MONTAGE",
"kMenuDevSettings" : "DEVELOPER SETTINGS",
- "kMenuEventMontage" : "EVENTMONTAGE",
+ "kMenuEventMontage" : "EVENT MONTAGE",
"kMenuEvents" : "EVENTS",
"kMenuExit" : "EXIT",
"kMenuHelp" : "HELP",
@@ -165,6 +174,7 @@
"kNegotiatingStreamAuth" : "NEGOTIATING STREAM AUTHENTICATION",
"kNews" : "NEWS",
"kNext" : "NEXT",
+ "kNextMonitor" : "NEXT MONITOR",
"kNoEvents" : "NO EVENTS TO DISPLAY",
"kNoMonitors" : "NO MONITORS TO DISPLAY",
"kNoMoreEvents" : "NO MORE EVENTS",
@@ -175,6 +185,7 @@
"kOnlyUseWebSocket" : "ONLY USE WEBSOCKETS",
"kOperationInProgressBody" : "THE PREVIOUS OPERATION IS STILL IN PROGRESS. PLEASE WAIT...",
"kOperationInProgressTitle" : "OPERATION IN PROGRESS",
+ "kPTZ" : "PAN/TILT/ZOOM",
"kPTZNotReady" : "NOT READY FOR PTZ",
"kPTZnotConfigured" : "PTZ NOT CONFIGURED FOR THIS MONITOR",
"kPassword" : "PASSWORD",
@@ -191,6 +202,7 @@
"kPortalUrl" : "ZM PORTAL URL",
"kPresets" : "PRESETS",
"kPrev" : "PREV",
+ "kPrevMonitor" : "PREV. MONITOR",
"kProfileChangeNotification" : "YOU HAVE CHANGED FROM {{OLDNAME}} TO {{NEWNAME}}. PLEASE SAVE THIS PROFILE FIRST",
"kProtect" : "PROTECT",
"kPullToReload" : "PULL TO RELOAD DATA",
@@ -215,6 +227,7 @@
"kSec" : "SEC",
"kSelectFallback" : "SELECT FALLBACK",
"kSelectLanguage" : "SELECT LANGUAGE",
+ "kSelectRunState" : "SELECT RUN STATE",
"kSendingPTZ" : "SENDING PTZ",
"kSensitiveBody" : "WILL MODIFY THE LOGS WHEN CREATING THE FINAL OUTPUT TO REMOVE SENSITIVE DATA LIKE URLS AND PASSWORDS. HOWEVER IT IS EVENTUALLY YOUR RESPONSIBILITY TO MAKE SURE THERE IS NO SENSITIVE DATA IN THE LOGS. PLEASE MAKE SURE YOU REVIEW AND EDIT THE LOGS BEFORE YOU SEND IT OUT",
"kSensitiveTitle" : "SENSITIVE INFORMATION",
diff --git a/www/templates/help.html b/www/templates/help.html
index 8d9c7c04..169d1abe 100644
--- a/www/templates/help.html
+++ b/www/templates/help.html
@@ -8,91 +8,14 @@
</ion-nav-buttons>
- <ion-content class="padding" overflow-scroll="false">
+ <ion-content class="padding" overflow-scroll="false" ng-cloak>
<p><small>{{$root.appName}} v{{zmAppVersion}}</small></p>
<div class="list">
- <ion-item class="item-text-wrap">
- <h2><b>Is there an official FAQ?</b> </h2>There sure is. Always check <a href="#" onclick="window.open('https://github.com/pliablepixels/zmNinja/wiki/FAQ', '_blank', 'location=yes'); return false;">here</a> for the most updated help
- </ion-item>
-
- <ion-item class="item-text-wrap">
- <h2><b> What do I enter for ZM Portal URL, Base path to cgi-bin and ZM API URL?</b> </h2>
- <ul>
- {{$root.appName}} now has a wizard that tries to detect your settings. This may fail if you have a custom install with non standard paths.
- <li><i class="ion-android-arrow-dropright"></i> ZM Portal URL: The URL using which you can access ZM
- <p>(example http://myserver.ddns.net/zm)</p>
- </li>
- <li><i class="ion-android-arrow-dropright"></i> CGI path: The URL using which your cgi-bin path is accessible
- <p>(example http://myserver.ddns.net/zm/cgi-bin).</p>
- </li>
- <li><i class="ion-android-arrow-dropright"></i> API Url: The URL using which your API path is accessible
- <p>(example:http://myserver.ddns.net/zm/api)</p>
- </li>
- </ul>
- </ion-item>
-
- <ion-item class="item-text-wrap">
- <h2><b>Since when does ZM have an API?</b> </h2> The latest versions of ZoneMinder have an API that is supposed to replace the XML skin. It is only available starting Zoneminder 1.28.107. If you don't have the API installed the client will not work.
-
- </ion-item>
-
- <ion-item class="item-text-wrap">
- <h2> <b>I do not have authentication enabled but the app keeps asking me to specify authentication</b></h2> If you don't use ZM authentication, just enter an "x" in both user name and password.
- </ion-item>
-
-
- <ion-item class="item-text-wrap">
- <h2> <b>Everything works! but live streaming does not </b></h2> Check if streaming works in the web interface. If it does not work, {{$root.appName}} won't work either. Fix ZM first. If streaming in ZM works, go to {{$root.appName}} settings and fix your cgi-bin path. the automatic path that is filled in won't work. Here is a hint, go to zoneminder->options->paths and check the value of the cgi-bin path - your {{$root.appName}} path will be "base path of your server" + cgi-bin path.
- </ion-item>
-
-
- <ion-item class="item-text-wrap">
- <h2><b> The data is not refreshing!</b></h2> Most screens that show lists of data has a pull down action. Pull down to refresh and your data should be reloaded.
- </ion-item>
-
- <ion-item class="item-text-wrap">
- <h2><b> What do all the colors in the Monitor view mean?</b></h2>
- <i class="icon ion-checkmark-circled" style="color:#03A9F4"></i> Checking
- <br/>
- <i class="icon ion-checkmark-circled" style="color:#4CAF50"></i> All good
- <br/>
- <i class="icon ion-close-circled" style="color:#F44336"></i> Not running
- <br/>
- <i class="icon ion-close-circled" style="color:#FF9800"></i> Not running (pending)
- <br/>
- <i class="icon ion-checkmark-circled" style="color:grey"></i> Disabled
- <br/>
- <i class="icon ion-help-circled" style="color:#795548"></i> Unknown
- <br/>
-
- </ion-item>
-
-
- <ion-item class="item-text-wrap">
- <h2> <b>I can't connect using SSL!</b></h2> If you are using self-signed certificates, configuring SSL may require additional steps. It's not as simple as flipping the switch on in the app. Please read the <a href="#" onclick="window.open('https://github.com/pliablepixels/zmNinja/blob/master/docs/SSL-Configuration.md', '_blank', 'location=yes'); return false;">instructions</a> for more details.
- </ion-item>
-
-
- <ion-item class="item-text-wrap">
- <h2><b>I want to contribute!</b></h2> Awesome. <a href="#" onclick="window.open('http://github.com/pliablepixels/zmNinja', '_blank', 'location=yes'); return false;"> Grab</a> the source code!
- </ion-item>
-
- <ion-item class="item-text-wrap">
- <h2><b>I'm having problems with this app</b></h2>Tap on the logs option in the menu. Click the email button on the top right to send them to the author of this app. Note that when the email is composed, zmNinja tries to remove personal information by searching and replacing server IP addresses and server passwords. However it is <b>your responsibility</b> to make sure the logs don't contain any sensitive information. Before you send the email, please review the embedded logs and edit as needed.
- </ion-item>
-
- <ion-item class="item-text-wrap">
- <h2><b>I can see my server URLs and passwords in logs. You said zmNinja removes them?</b></h2>zmNinja tries to remove them <b>after</b> you tap on the email button. I suppose I could remove them from the stored logs too, but then it would be harder for you to figure out if you made a mistake in configuring the app.
- </ion-item>
-
- <ion-item class="item-text-wrap">
- <h2><b>How do I contact the author?</b></h2> Send me an <a href="#" onclick="window.open('mailto:pliablepixels@gmail.com', '_blank', 'location=yes'); return false;">email</a>
- </ion-item>
-
+ <div id="insertHelp"></div>
</div>
</ion-content>
-</ion-view> \ No newline at end of file
+</ion-view> \ No newline at end of file
diff --git a/www/templates/monitors-modal.html b/www/templates/monitors-modal.html
index 527b6307..064b2ff8 100644
--- a/www/templates/monitors-modal.html
+++ b/www/templates/monitors-modal.html
@@ -68,22 +68,22 @@
</ion-modal-view>
- <nav mfb-menu position="br" effect="zoomin" label="collapse" active-icon="ion-chevron-down" resting-icon="ion-chevron-up" toggling-method="click">
- <button mfb-button icon="ion-arrow-resize" label="{{imageFit?'fill screen':'fit screen'}}" ng-click="scaleImage();">
+ <nav mfb-menu position="br" effect="zoomin" label="{{'kCollapse' | translate}}" active-icon="ion-chevron-down" resting-icon="ion-chevron-up" toggling-method="click">
+ <button mfb-button icon="ion-arrow-resize" label="{{imageFit? ('kFitScreen' | translate):('kFillScreen' | translate)}}" ng-click="scaleImage();">
</button>
- <button mfb-button icon="ion-refresh" label="refresh" ng-click="reloadView();">
+ <button mfb-button icon="ion-refresh" label="{{'kRefresh' | translate}}" ng-click="reloadView();">
</button>
- <button mfb-button icon="ion-arrow-expand" label="pan/tilt/zoom" ng-click="togglePTZ();">
+ <button mfb-button icon="ion-arrow-expand" label="{{'kPTZ'| translate}}" ng-click="togglePTZ();">
</button>
</nav>
- <nav mfb-menu position="tr" effect="zoomin" label="collapse" active-icon="ion-chevron-up" resting-icon="ion-chevron-down" toggling-method="click">
- <button mfb-button icon="ion-android-arrow-back" label="previous monitor" ng-click="onTap(monitorId,-1);">
+ <nav mfb-menu position="tr" effect="zoomin" label="{{'kCollapse' | translate}}" active-icon="ion-chevron-up" resting-icon="ion-chevron-down" toggling-method="click">
+ <button mfb-button icon="ion-android-arrow-back" label="{{'kPrevMonitor' | translate}} " ng-click="onTap(monitorId,-1);">
</button>
- <button mfb-button icon="ion-android-arrow-forward" label="next monitor" ng-click="onTap(monitorId,1);">
+ <button mfb-button icon="ion-android-arrow-forward" label="{{'kNextMonitor' | translate}}" ng-click="onTap(monitorId,1);">
</button>
- <button mfb-button icon="ion-close" label="exit live view" ng-click="closeModal();">
+ <button mfb-button icon="ion-close" label="{{'kExitLiveView' | translate}}" ng-click="closeModal();">
</button>
</nav>
diff --git a/www/templates/monitors.html b/www/templates/monitors.html
index 2abfe751..20555a33 100644
--- a/www/templates/monitors.html
+++ b/www/templates/monitors.html
@@ -44,7 +44,7 @@
<div style="float:right;">
<a class="button button-small icon icon-left icon ion-gear-a"
href="" ng-click="changeConfig(monitor.Monitor.Name, monitor.Monitor.Id,monitor.Monitor.Enabled,monitor.Monitor.Function);">{{'kConfiguration' | translate}}</a>
- <a class="button button-small icon icon-left ion-calendar" href="#/events/{{monitor.Monitor.Id}}">{{'kEvents'|translate}}</a>
+ <a class="button button-small icon icon-left ion-calendar" href="#/events/{{monitor.Monitor.Id}}">{{'kEventsCap'|translate}}</a>
<a class="button button-small icon icon-left ion-ios-eye" ng-click="openModal(monitor.Monitor.Id, monitor.Monitor.Controllable, monitor.Monitor.ControlId, monitor.Monitor.connKey, monitor)">{{'kLiveView' | translate}}</a>
</div>
</div>
diff --git a/www/templates/montage.html b/www/templates/montage.html
index 6f8c9253..5995f53b 100644
--- a/www/templates/montage.html
+++ b/www/templates/montage.html
@@ -19,6 +19,11 @@
<button class="button button-icon button-clear ion-arrow-move" ng-click="dragToggle();">&nbsp;
</button>
+ <!--
+ <button class="button button-icon button-clear ion-monitor" ng-click="cast();">&nbsp;
+ </button>
+ -->
+
<button class="button button-icon button-clear ion-loop" ng-click="resetSizes();">&nbsp;
</button>
@@ -113,15 +118,15 @@
</ion-content>
<div ng-show="minimal">
- <nav mfb-menu position="br" effect="zoomin" label="collapse" active-icon="ion-chevron-down" resting-icon="ion-chevron-up" toggling-method="click">
+ <nav mfb-menu position="br" effect="zoomin" label="{['kCollapse' | translate}}" active-icon="ion-chevron-down" resting-icon="ion-chevron-up" toggling-method="click">
- <button mfb-button icon="ion-arrow-expand" label="increase size" ng-click="sliderChanged(1)">
+ <button mfb-button icon="ion-arrow-expand" label="{{'kIncreaseSize' | translate}}" ng-click="sliderChanged(1)">
</button>
- <button mfb-button icon="ion-arrow-shrink" label="decrease size" ng-click="sliderChanged(-1)">
+ <button mfb-button icon="ion-arrow-shrink" label="{{'kDecreaseSize' | translate}}" ng-click="sliderChanged(-1)">
</button>
- <button mfb-button icon="ion-refresh" label="refresh" ng-click="resetSizes();">
+ <button mfb-button icon="ion-refresh" label="{{'kRefresh' | translate}}" ng-click="resetSizes();">
</button>
- <button mfb-button icon="ion-close" label="exit full screen" ng-click="switchMinimal()">
+ <button mfb-button icon="ion-close" label="{{'kExitFullScreen'| translate}}" ng-click="switchMinimal()">
</button>
</nav>