mirror of https://github.com/keeweb/keeweb.git
idle locking; visual lock idea
This commit is contained in:
parent
ae29852b60
commit
87944b33b4
|
@ -3,6 +3,7 @@
|
|||
var AppModel = require('./models/app-model'),
|
||||
AppView = require('./views/app-view'),
|
||||
KeyHandler = require('./comp/key-handler'),
|
||||
IdleTracker = require('./comp/idle-tracker'),
|
||||
Alerts = require('./comp/alerts'),
|
||||
DropboxLink = require('./comp/dropbox-link'),
|
||||
Updater = require('./comp/updater'),
|
||||
|
@ -17,6 +18,7 @@ $(function() {
|
|||
return;
|
||||
}
|
||||
KeyHandler.init();
|
||||
IdleTracker.init();
|
||||
|
||||
var appModel = new AppModel();
|
||||
if (appModel.settings.get('theme')) {
|
||||
|
|
|
@ -0,0 +1,21 @@
|
|||
'use strict';
|
||||
|
||||
var Backbone = require('backbone'),
|
||||
AppSettingsModel = require('../models/app-settings-model');
|
||||
|
||||
var IdleTracker = {
|
||||
idleMinutes: 0,
|
||||
init: function() {
|
||||
setInterval(this.minuteTick.bind(this), 1000 * 60);
|
||||
},
|
||||
minuteTick: function() {
|
||||
if (++this.idleMinutes === AppSettingsModel.instance.get('idleMinutes')) {
|
||||
Backbone.trigger('user-idle');
|
||||
}
|
||||
},
|
||||
regUserAction: function() {
|
||||
this.idleMinutes = 0;
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = IdleTracker;
|
|
@ -1,7 +1,8 @@
|
|||
'use strict';
|
||||
|
||||
var Backbone = require('backbone'),
|
||||
Keys = require('../const/keys');
|
||||
Keys = require('../const/keys'),
|
||||
IdleTracker = require('../comp/idle-tracker');
|
||||
|
||||
var shortcutKeyProp = navigator.platform.indexOf('Mac') >= 0 ? 'metaKey' : 'ctrlKey';
|
||||
|
||||
|
@ -11,6 +12,7 @@ var KeyHandler = {
|
|||
|
||||
shortcuts: {},
|
||||
modal: false,
|
||||
|
||||
init: function() {
|
||||
$(document).bind('keypress', this.keypress.bind(this));
|
||||
$(document).bind('keydown', this.keydown.bind(this));
|
||||
|
@ -36,6 +38,7 @@ var KeyHandler = {
|
|||
return e[shortcutKeyProp];
|
||||
},
|
||||
keydown: function(e) {
|
||||
IdleTracker.regUserAction();
|
||||
var code = e.keyCode || e.which;
|
||||
var keyShortcuts = this.shortcuts[code];
|
||||
if (keyShortcuts && keyShortcuts.length) {
|
||||
|
@ -72,6 +75,9 @@ var KeyHandler = {
|
|||
!e.altKey && !e.ctrlKey && !e.metaKey) {
|
||||
this.trigger('keypress', e);
|
||||
}
|
||||
},
|
||||
reg: function() {
|
||||
IdleTracker.regUserAction();
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -14,7 +14,8 @@ var AppSettingsModel = Backbone.Model.extend({
|
|||
tagsViewHeight: null,
|
||||
autoUpdate: 'install',
|
||||
clipboardSeconds: 0,
|
||||
autoSave: false
|
||||
autoSave: false,
|
||||
idleMinutes: 15
|
||||
},
|
||||
|
||||
initialize: function() {
|
||||
|
|
|
@ -12,6 +12,7 @@ var Backbone = require('backbone'),
|
|||
Alerts = require('../comp/alerts'),
|
||||
Keys = require('../const/keys'),
|
||||
KeyHandler = require('../comp/key-handler'),
|
||||
IdleTracker = require('../comp/idle-tracker'),
|
||||
Launcher = require('../comp/launcher'),
|
||||
ThemeChanger = require('../util/theme-changer'),
|
||||
UpdateModel = require('../models/update-model');
|
||||
|
@ -25,7 +26,8 @@ var AppView = Backbone.View.extend({
|
|||
'contextmenu': 'contextmenu',
|
||||
'drop': 'drop',
|
||||
'dragover': 'dragover',
|
||||
'click a[target=_blank]': 'extLinkClick'
|
||||
'click a[target=_blank]': 'extLinkClick',
|
||||
'mousedown': 'bodyClick'
|
||||
},
|
||||
|
||||
views: null,
|
||||
|
@ -59,6 +61,7 @@ var AppView = Backbone.View.extend({
|
|||
this.listenTo(Backbone, 'toggle-details', this.toggleDetails);
|
||||
this.listenTo(Backbone, 'edit-group', this.editGroup);
|
||||
this.listenTo(Backbone, 'launcher-open-file', this.launcherOpenFile);
|
||||
this.listenTo(Backbone, 'user-idle', this.userIdle);
|
||||
|
||||
this.listenTo(UpdateModel.instance, 'change:updateReady', this.updateApp);
|
||||
|
||||
|
@ -250,12 +253,16 @@ var AppView = Backbone.View.extend({
|
|||
}
|
||||
},
|
||||
|
||||
lockWorkspace: function() {
|
||||
lockWorkspace: function(autoInit) {
|
||||
var that = this;
|
||||
if (this.model.files.hasUnsavedFiles()) {
|
||||
if (this.model.settings.get('autoSave')) {
|
||||
this.saveAndLock();
|
||||
this.saveAndLock(autoInit);
|
||||
} else {
|
||||
if (autoInit) {
|
||||
this.visualLock();
|
||||
return;
|
||||
}
|
||||
Alerts.alert({
|
||||
icon: 'lock',
|
||||
header: 'Lock',
|
||||
|
@ -283,15 +290,16 @@ var AppView = Backbone.View.extend({
|
|||
}
|
||||
},
|
||||
|
||||
saveAndLock: function() {
|
||||
visualLock: function() {
|
||||
// TODO: think and implement
|
||||
},
|
||||
|
||||
saveAndLock: function(autoInit) {
|
||||
var pendingCallbacks = 0,
|
||||
errorFiles = [],
|
||||
that = this;
|
||||
if (this.model.files.some(function(file) { return file.get('modified') && !file.get('path'); })) {
|
||||
Alerts.error({
|
||||
header: 'Cannot auto-save',
|
||||
body: 'Some opened files cannot be saved automatically. To enable auto-save, you can sync them to Dropbox.'
|
||||
});
|
||||
this.visualLock();
|
||||
return;
|
||||
}
|
||||
this.model.files.forEach(function(file) {
|
||||
|
@ -316,10 +324,14 @@ var AppView = Backbone.View.extend({
|
|||
}
|
||||
if (--pendingCallbacks === 0) {
|
||||
if (errorFiles.length) {
|
||||
Alerts.error({
|
||||
header: 'Save Error',
|
||||
body: 'Failed to auto-save file' + (errorFiles.length > 1 ? 's: ' : '') + ' ' + errorFiles.join(', ')
|
||||
});
|
||||
if (autoInit) {
|
||||
that.visualLock();
|
||||
} else {
|
||||
Alerts.error({
|
||||
header: 'Save Error',
|
||||
body: 'Failed to auto-save file' + (errorFiles.length > 1 ? 's: ' : '') + ' ' + errorFiles.join(', ')
|
||||
});
|
||||
}
|
||||
} else {
|
||||
that.closeAllFilesAndShowFirst();
|
||||
}
|
||||
|
@ -354,6 +366,10 @@ var AppView = Backbone.View.extend({
|
|||
}
|
||||
},
|
||||
|
||||
userIdle: function() {
|
||||
this.lockWorkspace(true);
|
||||
},
|
||||
|
||||
toggleSettings: function(page) {
|
||||
var menuItem = page ? this.model.menu[page + 'Section'] : null;
|
||||
if (menuItem) {
|
||||
|
@ -420,6 +436,10 @@ var AppView = Backbone.View.extend({
|
|||
e.preventDefault();
|
||||
Launcher.openLink(e.target.href);
|
||||
}
|
||||
},
|
||||
|
||||
bodyClick: function() {
|
||||
IdleTracker.regUserAction();
|
||||
}
|
||||
});
|
||||
|
||||
|
|
|
@ -384,6 +384,7 @@ var DetailsView = Backbone.View.extend({
|
|||
},
|
||||
|
||||
titleInputKeydown: function(e) {
|
||||
KeyHandler.reg();
|
||||
e.stopPropagation();
|
||||
var code = e.keyCode || e.which;
|
||||
if (code === Keys.DOM_VK_RETURN) {
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
var FieldView = require('./field-view'),
|
||||
GeneratorView = require('../generator-view'),
|
||||
KeyHandler = require('../../comp/key-handler'),
|
||||
Keys = require('../../const/keys'),
|
||||
PasswordGenerator = require('../../util/password-generator'),
|
||||
kdbxweb = require('kdbxweb');
|
||||
|
@ -111,6 +112,7 @@ var FieldViewText = FieldView.extend({
|
|||
},
|
||||
|
||||
fieldValueKeydown: function(e) {
|
||||
KeyHandler.reg();
|
||||
e.stopPropagation();
|
||||
var code = e.keyCode || e.which;
|
||||
if (code === Keys.DOM_VK_RETURN) {
|
||||
|
|
Loading…
Reference in New Issue