diff --git a/app/assets/javascripts/app/directives/views/accountMenu.js b/app/assets/javascripts/app/directives/views/accountMenu.js index f4df268a3..d984c28f8 100644 --- a/app/assets/javascripts/app/directives/views/accountMenu.js +++ b/app/assets/javascripts/app/directives/views/accountMenu.js @@ -243,36 +243,49 @@ class AccountMenu { }) } - $scope.importFileSelected = function(files) { - $scope.importData = {}; + $scope.importFileSelected = async function(files) { - var file = files[0]; - var reader = new FileReader(); - reader.onload = function(e) { - try { - var data = JSON.parse(e.target.result); - $timeout(function(){ - if(data.auth_params) { - // request password - $scope.importData.requestPassword = true; - $scope.importData.data = data; + let run = () => { + $timeout(() => { + $scope.importData = {}; - $timeout(() => { - var element = document.getElementById("import-password-request"); - if(element) { - element.scrollIntoView(false); + var file = files[0]; + var reader = new FileReader(); + reader.onload = function(e) { + try { + var data = JSON.parse(e.target.result); + $timeout(function(){ + if(data.auth_params) { + // request password + $scope.importData.requestPassword = true; + $scope.importData.data = data; + + $timeout(() => { + var element = document.getElementById("import-password-request"); + if(element) { + element.scrollIntoView(false); + } + }) + } else { + $scope.performImport(data, null); } }) - } else { - $scope.performImport(data, null); + } catch (e) { + alert("Unable to open file. Ensure it is a proper JSON file and try again."); } - }) - } catch (e) { - alert("Unable to open file. Ensure it is a proper JSON file and try again."); - } + } + + reader.readAsText(file); + }) } - reader.readAsText(file); + if(await privilegesManager.actionRequiresPrivilege(PrivilegesManager.ActionManageBackups)) { + privilegesManager.presentPrivilegesModal(PrivilegesManager.ActionManageBackups, () => { + run(); + }); + } else { + run(); + } } $scope.importJSONData = function(data, password, callback) { @@ -335,8 +348,8 @@ class AccountMenu { archiveManager.downloadBackup($scope.archiveFormData.encrypted); } - if(await privilegesManager.actionRequiresPrivilege(PrivilegesManager.ActionDownloadBackup)) { - privilegesManager.presentPrivilegesModal(PrivilegesManager.ActionDownloadBackup, () => { + if(await privilegesManager.actionRequiresPrivilege(PrivilegesManager.ActionManageBackups)) { + privilegesManager.presentPrivilegesModal(PrivilegesManager.ActionManageBackups, () => { run(); }); } else { diff --git a/app/assets/javascripts/app/directives/views/privilegesAuthModal.js b/app/assets/javascripts/app/directives/views/privilegesAuthModal.js index 84452687a..91816b1b8 100644 --- a/app/assets/javascripts/app/directives/views/privilegesAuthModal.js +++ b/app/assets/javascripts/app/directives/views/privilegesAuthModal.js @@ -39,7 +39,7 @@ class PrivilegesAuthModal { privilegesManager.netCredentialsForAction($scope.action).then((credentials) => { $timeout(() => { - $scope.requiredCredentials = credentials; + $scope.requiredCredentials = credentials.sort(); }); }); diff --git a/app/assets/javascripts/app/directives/views/privilegesManagementModal.js b/app/assets/javascripts/app/directives/views/privilegesManagementModal.js index d646cb48c..c9642b357 100644 --- a/app/assets/javascripts/app/directives/views/privilegesManagementModal.js +++ b/app/assets/javascripts/app/directives/views/privilegesManagementModal.js @@ -14,13 +14,22 @@ class PrivilegesManagementModal { } } - controller($scope, privilegesManager, $timeout) { + controller($scope, privilegesManager, passcodeManager, $timeout) { 'ngInject'; $scope.dummy = {}; + $scope.hasPasscode = passcodeManager.hasPasscode(); + $scope.displayInfoForCredential = function(credential) { - return privilegesManager.displayInfoForCredential(credential).label; + let info = privilegesManager.displayInfoForCredential(credential); + if(credential == PrivilegesManager.CredentialLocalPasscode) { + info["availability"] = $scope.hasPasscode; + } else { + info["availability"] = true; + } + + return info; } $scope.displayInfoForAction = function(action) { @@ -47,6 +56,11 @@ class PrivilegesManagementModal { $scope.sessionExpirey = sessionEndDate.toLocaleString(); $scope.sessionExpired = new Date() >= sessionEndDate; + $scope.credentialDisplayInfo = {}; + for(let cred of $scope.availableCredentials) { + $scope.credentialDisplayInfo[cred] = $scope.displayInfoForCredential(cred); + } + privilegesManager.getPrivileges().then((privs) => { $timeout(() => { $scope.privileges = privs; @@ -55,6 +69,7 @@ class PrivilegesManagementModal { } $scope.checkboxValueChanged = function(action, credential) { + console.log("toggleCredentialForAction", action, credential); $scope.privileges.toggleCredentialForAction(action, credential); privilegesManager.savePrivileges(); } diff --git a/app/assets/javascripts/app/services/passcodeManager.js b/app/assets/javascripts/app/services/passcodeManager.js index 1aa1f7c5e..d203f5aba 100644 --- a/app/assets/javascripts/app/services/passcodeManager.js +++ b/app/assets/javascripts/app/services/passcodeManager.js @@ -13,7 +13,6 @@ class PasscodeManager { const MillisecondsPerSecond = 1000; PasscodeManager.AutoLockIntervalNone = 0; - PasscodeManager.AutoLockIntervalFiveSecs = 5 * MillisecondsPerSecond; PasscodeManager.AutoLockIntervalOneMinute = 60 * MillisecondsPerSecond; PasscodeManager.AutoLockIntervalFiveMinutes = 300 * MillisecondsPerSecond; PasscodeManager.AutoLockIntervalOneHour = 3600 * MillisecondsPerSecond; @@ -27,10 +26,6 @@ class PasscodeManager { value: PasscodeManager.AutoLockIntervalNone, label: "None" }, - { - value: PasscodeManager.AutoLockIntervalFiveSecs, - label: "5 Secs" - }, { value: PasscodeManager.AutoLockIntervalOneMinute, label: "1 Min" diff --git a/app/assets/javascripts/app/services/privilegesManager.js b/app/assets/javascripts/app/services/privilegesManager.js index daed765ab..a2869ead4 100644 --- a/app/assets/javascripts/app/services/privilegesManager.js +++ b/app/assets/javascripts/app/services/privilegesManager.js @@ -15,7 +15,7 @@ class PrivilegesManager { PrivilegesManager.CredentialLocalPasscode = "CredentialLocalPasscode"; PrivilegesManager.ActionManageExtensions = "ActionManageExtensions"; - PrivilegesManager.ActionDownloadBackup = "ActionDownloadBackup"; + PrivilegesManager.ActionManageBackups = "ActionManageBackups"; PrivilegesManager.ActionViewLockedNotes = "ActionViewLockedNotes"; PrivilegesManager.ActionManagePrivileges = "ActionManagePrivileges"; PrivilegesManager.ActionManagePasscode = "ActionManagePasscode"; @@ -31,10 +31,10 @@ class PrivilegesManager { this.availableActions = [ PrivilegesManager.ActionManageExtensions, - PrivilegesManager.ActionDownloadBackup, - PrivilegesManager.ActionViewLockedNotes, + PrivilegesManager.ActionManageBackups, PrivilegesManager.ActionManagePrivileges, PrivilegesManager.ActionManagePasscode, + PrivilegesManager.ActionViewLockedNotes, PrivilegesManager.ActionDeleteNote ] @@ -164,8 +164,8 @@ class PrivilegesManager { label: "Manage Extensions" }; - metadata[PrivilegesManager.ActionDownloadBackup] = { - label: "Download Backups" + metadata[PrivilegesManager.ActionManageBackups] = { + label: "Download/Import Backups" }; metadata[PrivilegesManager.ActionViewLockedNotes] = { @@ -181,7 +181,7 @@ class PrivilegesManager { } metadata[PrivilegesManager.ActionDeleteNote] = { - label: "Delete Note" + label: "Delete Notes" } return metadata[action]; diff --git a/app/assets/stylesheets/app/_modals.scss b/app/assets/stylesheets/app/_modals.scss index 074bb4db9..e777e752f 100644 --- a/app/assets/stylesheets/app/_modals.scss +++ b/app/assets/stylesheets/app/_modals.scss @@ -17,6 +17,7 @@ th { text-align: left; + font-weight: normal; } } diff --git a/app/assets/templates/directives/account-menu.html.haml b/app/assets/templates/directives/account-menu.html.haml index ae99c67b7..81ef1ce88 100644 --- a/app/assets/templates/directives/account-menu.html.haml +++ b/app/assets/templates/directives/account-menu.html.haml @@ -133,7 +133,6 @@ .panel-row .horizontal-group %h4 Autolock - .vertical-rule %a.info{"ng-repeat" => "option in passcodeAutoLockOptions", "ng-click" => "selectAutoLockInterval(option.value)", "ng-class" => "{'info boxed' : option.value == selectedAutoLockInterval}"} {{option.label}} diff --git a/app/assets/templates/directives/privileges-auth-modal.html.haml b/app/assets/templates/directives/privileges-auth-modal.html.haml index 972a091f6..3be9f08d5 100644 --- a/app/assets/templates/directives/privileges-auth-modal.html.haml +++ b/app/assets/templates/directives/privileges-auth-modal.html.haml @@ -7,12 +7,12 @@ %h1.title Authentication Required %a.close-button.info{"ng-click" => "cancel()"} Cancel .content - .panel-section + %form.panel-section{"ng-submit" => "submit()"} %div{"ng-repeat" => "credential in requiredCredentials"} %p %strong {{promptForCredential(credential)}} %div - %input{"type" => "password", "ng-model" => "authenticationParameters[credential]"} + %input{"type" => "password", "ng-model" => "authenticationParameters[credential]", "sn-autofocus" => "true", "should-focus" => "$index == 0"} %div %label.danger{"ng-if" => "isCredentialInFailureState(credential)"} Invalid authentication. Please try again. .panel-row diff --git a/app/assets/templates/directives/privileges-management-modal.html.haml b/app/assets/templates/directives/privileges-management-modal.html.haml index 1a7ce94d1..ee9dac0ae 100644 --- a/app/assets/templates/directives/privileges-management-modal.html.haml +++ b/app/assets/templates/directives/privileges-management-modal.html.haml @@ -13,7 +13,8 @@ %tr %th %th{"ng-repeat" => "cred in availableCredentials"} - {{displayInfoForCredential(cred)}} + %strong {{credentialDisplayInfo[cred].label}} + %p.font-small{"style" => "margin-top: 2px", "ng-show" => "!credentialDisplayInfo[cred].availability"} Not Configured %tbody %tr{"ng-repeat" => "action in availableActions"} %td