keeweb/app/scripts/views/app-view.js

738 lines
25 KiB
JavaScript
Raw Normal View History

2017-01-31 07:50:28 +01:00
const Backbone = require('backbone');
const DragView = require('../views/drag-view');
const MenuView = require('../views/menu/menu-view');
const FooterView = require('../views/footer-view');
const ListView = require('../views/list-view');
const ListWrapView = require('../views/list-wrap-view');
const DetailsView = require('../views/details/details-view');
const GrpView = require('../views/grp-view');
const TagView = require('../views/tag-view');
const GeneratorPresetsView = require('../views/generator-presets-view');
const OpenView = require('../views/open-view');
const SettingsView = require('../views/settings/settings-view');
const KeyChangeView = require('../views/key-change-view');
const DropdownView = require('../views/dropdown-view');
const Alerts = require('../comp/alerts');
const Keys = require('../const/keys');
const Timeouts = require('../const/timeouts');
const KeyHandler = require('../comp/key-handler');
const IdleTracker = require('../comp/idle-tracker');
const Launcher = require('../comp/launcher');
const SettingsManager = require('../comp/settings-manager');
const Locale = require('../util/locale');
2017-05-25 21:37:04 +02:00
const FeatureDetector = require('../util/feature-detector');
2017-01-31 07:50:28 +01:00
const UpdateModel = require('../models/update-model');
const AppView = Backbone.View.extend({
2015-10-17 23:49:24 +02:00
el: 'body',
2015-12-16 22:50:45 +01:00
template: require('templates/app.hbs'),
2015-10-17 23:49:24 +02:00
events: {
2016-07-30 11:25:22 +02:00
'contextmenu': 'contextMenu',
2015-10-17 23:49:24 +02:00
'drop': 'drop',
'dragenter': 'dragover',
2015-10-22 20:03:44 +02:00
'dragover': 'dragover',
2015-11-17 22:49:12 +01:00
'click a[target=_blank]': 'extLinkClick',
'mousedown': 'bodyClick'
2015-10-17 23:49:24 +02:00
},
views: null,
titlebarStyle: 'default',
2015-10-17 23:49:24 +02:00
initialize: function () {
this.views = {};
this.views.menu = new MenuView({ model: this.model.menu });
this.views.menuDrag = new DragView('x');
this.views.footer = new FooterView({ model: this.model });
2015-11-21 15:55:42 +01:00
this.views.listWrap = new ListWrapView({ model: this.model });
2015-10-17 23:49:24 +02:00
this.views.list = new ListView({ model: this.model });
this.views.listDrag = new DragView('x');
2015-11-21 15:55:42 +01:00
this.views.list.dragView = this.views.listDrag;
2015-10-17 23:49:24 +02:00
this.views.details = new DetailsView();
this.views.details.appModel = this.model;
this.views.menu.listenDrag(this.views.menuDrag);
this.views.list.listenDrag(this.views.listDrag);
this.titlebarStyle = this.model.settings.get('titlebarStyle');
2015-10-17 23:49:24 +02:00
this.listenTo(this.model.settings, 'change:theme', this.setTheme);
2016-08-21 23:12:49 +02:00
this.listenTo(this.model.settings, 'change:locale', this.setLocale);
this.listenTo(this.model.settings, 'change:fontSize', this.setFontSize);
2015-10-17 23:49:24 +02:00
this.listenTo(this.model.files, 'update reset', this.fileListUpdated);
2015-10-31 20:09:32 +01:00
this.listenTo(Backbone, 'select-all', this.selectAll);
2015-10-17 23:49:24 +02:00
this.listenTo(Backbone, 'menu-select', this.menuSelect);
this.listenTo(Backbone, 'lock-workspace', this.lockWorkspace);
this.listenTo(Backbone, 'show-file', this.showFileSettings);
this.listenTo(Backbone, 'open-file', this.toggleOpenFile);
this.listenTo(Backbone, 'save-all', this.saveAll);
this.listenTo(Backbone, 'remote-key-changed', this.remoteKeyChanged);
2016-07-03 18:46:43 +02:00
this.listenTo(Backbone, 'key-change-pending', this.keyChangePending);
2015-10-17 23:49:24 +02:00
this.listenTo(Backbone, 'toggle-settings', this.toggleSettings);
2015-10-24 11:15:54 +02:00
this.listenTo(Backbone, 'toggle-menu', this.toggleMenu);
2015-10-26 22:07:19 +01:00
this.listenTo(Backbone, 'toggle-details', this.toggleDetails);
2015-10-31 20:09:32 +01:00
this.listenTo(Backbone, 'edit-group', this.editGroup);
2016-04-17 22:02:39 +02:00
this.listenTo(Backbone, 'edit-tag', this.editTag);
2016-08-13 21:13:16 +02:00
this.listenTo(Backbone, 'edit-generator-presets', this.editGeneratorPresets);
2015-10-24 21:06:44 +02:00
this.listenTo(Backbone, 'launcher-open-file', this.launcherOpenFile);
2015-11-17 22:49:12 +01:00
this.listenTo(Backbone, 'user-idle', this.userIdle);
2017-06-02 20:16:09 +02:00
this.listenTo(Backbone, 'os-lock', this.osLocked);
this.listenTo(Backbone, 'power-monitor-suspend', this.osLocked);
this.listenTo(Backbone, 'app-minimized', this.appMinimized);
2016-07-30 11:25:22 +02:00
this.listenTo(Backbone, 'show-context-menu', this.showContextMenu);
2016-09-16 19:33:38 +02:00
this.listenTo(Backbone, 'second-instance', this.showSingleInstanceAlert);
this.listenTo(Backbone, 'file-modified', this.handleAutoSaveTimer);
this.listenTo(UpdateModel.instance, 'change:updateReady', this.updateApp);
2015-10-17 23:49:24 +02:00
this.listenTo(Backbone, 'enter-full-screen', this.enterFullScreen);
this.listenTo(Backbone, 'leave-full-screen', this.leaveFullScreen);
2015-10-17 23:49:24 +02:00
window.onbeforeunload = this.beforeUnload.bind(this);
window.onresize = this.windowResize.bind(this);
2016-09-05 21:14:50 +02:00
window.onblur = this.windowBlur.bind(this);
2015-10-17 23:49:24 +02:00
KeyHandler.onKey(Keys.DOM_VK_ESCAPE, this.escPressed, this);
KeyHandler.onKey(Keys.DOM_VK_BACK_SPACE, this.backspacePressed, this);
2016-03-19 12:37:52 +01:00
KeyHandler.onKey(Keys.DOM_VK_F12, this.openDevTools, this, KeyHandler.SHORTCUT_ACTION);
setInterval(this.syncAllByTimer.bind(this), Timeouts.AutoSync);
2017-02-05 15:05:45 +01:00
this.setWindowClass();
this.fixClicksInEdge();
2017-02-05 15:05:45 +01:00
},
setWindowClass: function() {
2017-05-25 21:37:04 +02:00
const getBrowserCssClass = FeatureDetector.getBrowserCssClass();
if (getBrowserCssClass) {
this.$el.addClass(getBrowserCssClass);
2017-02-05 15:05:45 +01:00
}
if (this.titlebarStyle !== 'default') {
this.$el.addClass('titlebar-' + this.titlebarStyle);
}
2015-10-17 23:49:24 +02:00
},
fixClicksInEdge: function() {
// MS Edge doesn't want to handle clicks by default
// TODO: remove once Edge 14 share drops enough
// https://github.com/keeweb/keeweb/issues/636#issuecomment-304225634
// https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/5782378/
if (FeatureDetector.needFixClicks) {
const msEdgeScrewer = $('<input/>').appendTo(this.$el).focus();
2017-05-26 19:26:21 +02:00
setTimeout(() => msEdgeScrewer.remove(), 0);
}
},
2015-10-17 23:49:24 +02:00
render: function () {
2016-02-14 08:38:57 +01:00
this.$el.html(this.template({
beta: this.model.isBeta,
titlebarStyle: this.titlebarStyle
2016-02-14 08:38:57 +01:00
}));
2016-08-13 21:13:16 +02:00
this.panelEl = this.$el.find('.app__panel:first');
2015-11-21 15:55:42 +01:00
this.views.listWrap.setElement(this.$el.find('.app__list-wrap')).render();
2015-10-17 23:49:24 +02:00
this.views.menu.setElement(this.$el.find('.app__menu')).render();
this.views.menuDrag.setElement(this.$el.find('.app__menu-drag')).render();
this.views.footer.setElement(this.$el.find('.app__footer')).render();
this.views.list.setElement(this.$el.find('.app__list')).render();
this.views.listDrag.setElement(this.$el.find('.app__list-drag')).render();
this.views.details.setElement(this.$el.find('.app__details')).render();
2015-12-06 21:32:41 +01:00
this.showLastOpenFile();
2015-10-17 23:49:24 +02:00
return this;
},
2015-12-06 21:32:41 +01:00
showOpenFile: function() {
2016-07-30 11:25:22 +02:00
this.hideContextMenu();
2015-10-17 23:49:24 +02:00
this.views.menu.hide();
this.views.menuDrag.hide();
2015-11-21 15:55:42 +01:00
this.views.listWrap.hide();
2015-10-17 23:49:24 +02:00
this.views.list.hide();
this.views.listDrag.hide();
this.views.details.hide();
this.views.footer.toggle(this.model.files.hasOpenFiles());
2016-08-13 21:13:16 +02:00
this.hidePanelView();
2015-10-17 23:49:24 +02:00
this.hideSettings();
this.hideOpenFile();
this.hideKeyChange();
2015-10-17 23:49:24 +02:00
this.views.open = new OpenView({ model: this.model });
this.views.open.setElement(this.$el.find('.app__body')).render();
2019-03-31 14:30:14 +02:00
this.views.open.on('close', () => {
Backbone.trigger('closed-open-view');
}, this);
2015-12-06 21:32:41 +01:00
this.views.open.on('close', this.showEntries, this);
},
showLastOpenFile: function() {
this.showOpenFile();
2017-01-31 07:50:28 +01:00
const lastOpenFile = this.model.fileInfos.getLast();
2015-12-06 21:32:41 +01:00
if (lastOpenFile) {
this.views.open.currentSelectedIndex = 0;
2015-12-06 21:32:41 +01:00
this.views.open.showOpenFileInfo(lastOpenFile);
2015-10-24 21:06:44 +02:00
}
},
launcherOpenFile: function(file) {
if (file && file.data && /\.kdbx$/i.test(file.data)) {
2015-12-06 21:32:41 +01:00
this.showOpenFile();
this.views.open.showOpenLocalFile(file.data, file.key);
2015-10-24 21:06:44 +02:00
}
2015-10-17 23:49:24 +02:00
},
2015-10-29 22:20:01 +01:00
updateApp: function() {
if (UpdateModel.instance.get('updateStatus') === 'ready' &&
!Launcher && !this.model.files.hasOpenFiles()) {
window.location.reload();
2015-10-29 22:20:01 +01:00
}
},
2015-10-17 23:49:24 +02:00
showEntries: function() {
this.views.menu.show();
this.views.menuDrag.show();
2015-11-21 15:55:42 +01:00
this.views.listWrap.show();
2015-10-17 23:49:24 +02:00
this.views.list.show();
this.views.listDrag.show();
this.views.details.show();
this.views.footer.show();
2016-08-13 21:13:16 +02:00
this.hidePanelView();
2015-10-17 23:49:24 +02:00
this.hideOpenFile();
this.hideSettings();
this.hideKeyChange();
2015-10-17 23:49:24 +02:00
},
hideOpenFile: function() {
if (this.views.open) {
this.views.open.remove();
this.views.open = null;
}
},
2016-08-13 21:13:16 +02:00
hidePanelView: function() {
if (this.views.panel) {
this.views.panel.remove();
this.views.panel = null;
this.panelEl.addClass('hide');
}
},
showPanelView: function(view) {
this.views.listWrap.hide();
this.views.list.hide();
this.views.listDrag.hide();
this.views.details.hide();
this.hidePanelView();
this.views.panel = view.setElement(this.panelEl).render();
this.panelEl.removeClass('hide');
},
2015-10-17 23:49:24 +02:00
hideSettings: function() {
if (this.views.settings) {
this.model.menu.setMenu('app');
this.views.settings.remove();
this.views.settings = null;
}
},
hideKeyChange: function() {
if (this.views.keyChange) {
this.views.keyChange.hide();
this.views.keyChange = null;
}
},
2015-10-17 23:49:24 +02:00
showSettings: function(selectedMenuItem) {
this.model.menu.setMenu('settings');
this.views.menu.show();
this.views.menuDrag.show();
2015-11-21 15:55:42 +01:00
this.views.listWrap.hide();
2015-10-17 23:49:24 +02:00
this.views.list.hide();
this.views.listDrag.hide();
this.views.details.hide();
2016-08-13 21:13:16 +02:00
this.hidePanelView();
2015-10-17 23:49:24 +02:00
this.hideOpenFile();
this.hideKeyChange();
2015-12-08 20:18:35 +01:00
this.views.settings = new SettingsView({ model: this.model });
2015-10-17 23:49:24 +02:00
this.views.settings.setElement(this.$el.find('.app__body')).render();
if (!selectedMenuItem) {
selectedMenuItem = this.model.menu.generalSection.get('items').first();
}
this.model.menu.select({ item: selectedMenuItem });
2015-10-26 22:07:19 +01:00
this.views.menu.switchVisibility(false);
2015-10-17 23:49:24 +02:00
},
2015-10-31 20:09:32 +01:00
showEditGroup: function() {
2016-08-13 21:13:16 +02:00
this.showPanelView(new GrpView());
2015-10-31 20:09:32 +01:00
},
2016-04-17 22:02:39 +02:00
showEditTag: function() {
2016-08-13 21:13:16 +02:00
this.showPanelView(new TagView({ model: this.model }));
2016-04-17 22:02:39 +02:00
},
2016-07-03 18:46:43 +02:00
showKeyChange: function(file, viewConfig) {
if (Alerts.alertDisplayed) {
return;
}
if (this.views.keyChange && this.views.keyChange.model.remote) {
return;
}
2016-03-27 18:38:21 +02:00
this.hideSettings();
2016-08-13 21:13:16 +02:00
this.hidePanelView();
this.views.menu.hide();
this.views.listWrap.hide();
this.views.list.hide();
this.views.listDrag.hide();
this.views.details.hide();
2016-07-03 18:46:43 +02:00
this.views.keyChange = new KeyChangeView({
model: { file: file, expired: viewConfig.expired, remote: viewConfig.remote }
});
this.views.keyChange.setElement(this.$el.find('.app__body')).render();
this.views.keyChange.on('accept', this.keyChangeAccept.bind(this));
this.views.keyChange.on('cancel', this.showEntries.bind(this));
},
2015-10-17 23:49:24 +02:00
fileListUpdated: function() {
if (this.model.files.hasOpenFiles()) {
this.showEntries();
} else {
this.showOpenFile();
}
this.fixClicksInEdge();
2015-10-17 23:49:24 +02:00
},
showFileSettings: function(e) {
2017-01-31 07:50:28 +01:00
const menuItem = this.model.menu.filesSection.get('items').find(item => item.get('file').cid === e.fileId);
2015-10-17 23:49:24 +02:00
if (this.views.settings) {
2015-10-18 16:02:00 +02:00
if (this.views.settings.file === menuItem.get('file')) {
2015-10-17 23:49:24 +02:00
this.showEntries();
} else {
this.model.menu.select({ item: menuItem });
}
} else {
this.showSettings(menuItem);
}
},
toggleOpenFile: function() {
if (this.views.open) {
2016-04-07 18:36:34 +02:00
if (this.model.files.hasOpenFiles()) {
this.showEntries();
}
2015-10-17 23:49:24 +02:00
} else {
this.showOpenFile();
}
},
2015-11-04 07:16:39 +01:00
beforeUnload: function(e) {
2017-01-31 07:50:28 +01:00
const exitEvent = { preventDefault() { this.prevented = true; } };
Backbone.trigger('main-window-will-close', exitEvent);
if (exitEvent.prevented) {
Launcher.preventExit(e);
return;
}
2015-12-12 09:53:50 +01:00
if (this.model.files.hasDirtyFiles()) {
2017-01-31 07:50:28 +01:00
const exit = () => {
2017-01-29 20:21:07 +01:00
if (Launcher.canMinimize() && this.model.settings.get('minimizeOnClose')) {
Launcher.minimizeApp();
} else {
Launcher.exit();
}
};
2017-11-26 19:13:48 +01:00
if (Launcher && Launcher.exitRequested) {
return;
}
if (Launcher) {
2015-11-14 12:09:36 +01:00
if (!this.exitAlertShown) {
2016-01-13 19:18:45 +01:00
if (this.model.settings.get('autoSave')) {
this.saveAndLock(result => { if (result) { exit(); } });
2016-02-22 07:59:50 +01:00
return Launcher.preventExit(e);
2016-01-13 19:18:45 +01:00
}
2016-07-17 13:30:38 +02:00
this.exitAlertShown = true;
2015-11-14 12:09:36 +01:00
Alerts.yesno({
2015-12-17 19:25:25 +01:00
header: Locale.appUnsavedWarn,
body: Locale.appUnsavedWarnBody,
2016-01-13 19:18:45 +01:00
buttons: [
2016-08-23 22:20:13 +02:00
{result: 'save', title: Locale.saveChanges},
{result: 'exit', title: Locale.discardChanges, error: true},
2016-01-13 19:18:45 +01:00
{result: '', title: Locale.appDontExitBtn}
],
2016-07-17 13:30:38 +02:00
success: result => {
2016-01-13 19:18:45 +01:00
if (result === 'save') {
this.saveAndLock(result => { if (result) { exit(); } });
2016-01-13 19:18:45 +01:00
} else {
exit();
2016-01-13 19:18:45 +01:00
}
2015-11-14 12:09:36 +01:00
},
2016-07-17 13:30:38 +02:00
cancel: () => {
2015-11-14 12:09:36 +01:00
Launcher.cancelRestart(false);
},
2016-07-17 13:30:38 +02:00
complete: () => {
this.exitAlertShown = false;
2015-11-14 12:09:36 +01:00
}
});
}
return Launcher.preventExit(e);
2015-11-04 07:16:39 +01:00
}
2016-01-13 19:18:45 +01:00
return Locale.appUnsavedWarnBody;
} else if (Launcher && !Launcher.exitRequested && !Launcher.restartPending &&
Launcher.canMinimize() && this.model.settings.get('minimizeOnClose')) {
2015-11-21 08:29:49 +01:00
Launcher.minimizeApp();
return Launcher.preventExit(e);
2015-10-17 23:49:24 +02:00
}
},
windowResize: function() {
Backbone.trigger('page-geometry', { source: 'window' });
},
2016-09-05 21:14:50 +02:00
windowBlur: function(e) {
if (e.target === window) {
Backbone.trigger('page-blur');
}
},
enterFullScreen: function () {
this.$el.addClass('fullscreen');
},
leaveFullScreen: function () {
this.$el.removeClass('fullscreen');
},
2015-10-17 23:49:24 +02:00
escPressed: function() {
if (this.views.open && this.model.files.hasOpenFiles()) {
this.showEntries();
}
},
backspacePressed: function(e) {
if (e.target === document.body) {
e.preventDefault();
}
},
2016-03-19 12:37:52 +01:00
openDevTools: function() {
if (Launcher && Launcher.devTools) {
Launcher.openDevTools();
}
},
2015-10-31 20:09:32 +01:00
selectAll: function() {
this.menuSelect({ item: this.model.menu.allItemsSection.get('items').first() });
},
menuSelect: function(opt) {
this.model.menu.select(opt);
2016-08-13 21:13:16 +02:00
if (this.views.panel && !this.views.panel.isHidden()) {
2015-10-31 20:09:32 +01:00
this.showEntries();
}
2015-10-17 23:49:24 +02:00
},
2015-11-17 23:31:13 +01:00
userIdle: function() {
this.lockWorkspace(true);
},
2017-06-02 20:16:09 +02:00
osLocked: function() {
if (this.model.settings.get('lockOnOsLock')) {
this.lockWorkspace(true);
}
},
appMinimized: function() {
if (this.model.settings.get('lockOnMinimize')) {
this.lockWorkspace(true);
}
},
2015-11-17 22:49:12 +01:00
lockWorkspace: function(autoInit) {
2015-11-21 07:49:39 +01:00
if (Alerts.alertDisplayed) {
2015-11-18 19:33:04 +01:00
return;
}
2015-10-25 10:19:00 +01:00
if (this.model.files.hasUnsavedFiles()) {
2015-11-17 21:57:32 +01:00
if (this.model.settings.get('autoSave')) {
2016-01-13 19:18:45 +01:00
this.saveAndLock();
2015-11-17 21:57:32 +01:00
} else {
2017-01-31 07:50:28 +01:00
const message = autoInit ? Locale.appCannotLockAutoInit : Locale.appCannotLock;
2015-11-17 21:57:32 +01:00
Alerts.alert({
icon: 'lock',
header: 'Lock',
body: message,
2015-11-17 21:57:32 +01:00
buttons: [
2016-08-23 22:20:13 +02:00
{ result: 'save', title: Locale.saveChanges },
{ result: 'discard', title: Locale.discardChanges, error: true },
2015-12-17 19:25:25 +01:00
{ result: '', title: Locale.alertCancel }
2015-11-17 21:57:32 +01:00
],
2015-12-17 19:25:25 +01:00
checkbox: Locale.appAutoSave,
2016-07-17 13:30:38 +02:00
success: (result, autoSaveChecked) => {
2015-11-17 21:57:32 +01:00
if (result === 'save') {
if (autoSaveChecked) {
2016-07-17 13:30:38 +02:00
this.model.settings.set('autoSave', autoSaveChecked);
2015-11-17 21:57:32 +01:00
}
2016-07-17 13:30:38 +02:00
this.saveAndLock();
2015-11-17 21:57:32 +01:00
} else if (result === 'discard') {
2016-07-17 13:30:38 +02:00
this.model.closeAllFiles();
2015-11-17 21:57:32 +01:00
}
}
});
}
2015-10-25 10:19:00 +01:00
} else {
2015-11-17 21:57:32 +01:00
this.closeAllFilesAndShowFirst();
}
},
handleAutoSaveTimer: function () {
if (this.model.settings.get('autoSaveInterval') !== 0) {
// trigger periodical auto save
if (this.autoSaveTimeoutId) {
clearTimeout(this.autoSaveTimeoutId);
}
this.autoSaveTimeoutId = setTimeout(
this.saveAll.bind(this),
this.model.settings.get('autoSaveInterval') * 1000 * 60
);
}
},
2016-01-13 19:18:45 +01:00
saveAndLock: function(complete) {
2017-01-31 07:50:28 +01:00
let pendingCallbacks = 0;
const errorFiles = [];
const that = this;
2015-11-17 21:57:32 +01:00
this.model.files.forEach(function(file) {
if (!file.get('dirty')) {
2015-11-17 21:57:32 +01:00
return;
}
this.model.syncFile(file, null, fileSaved.bind(this, file));
2015-12-13 22:18:02 +01:00
pendingCallbacks++;
2015-11-17 21:57:32 +01:00
}, this);
if (!pendingCallbacks) {
this.closeAllFilesAndShowFirst();
}
function fileSaved(file, err) {
if (err) {
errorFiles.push(file.get('name'));
}
if (--pendingCallbacks === 0) {
2015-12-12 16:43:43 +01:00
if (errorFiles.length && that.model.files.hasDirtyFiles()) {
if (!Alerts.alertDisplayed) {
2017-01-31 07:50:28 +01:00
const alertBody = errorFiles.length > 1 ? Locale.appSaveErrorBodyMul : Locale.appSaveErrorBody;
2015-11-17 22:49:12 +01:00
Alerts.error({
2015-12-17 19:25:25 +01:00
header: Locale.appSaveError,
body: alertBody + ' ' + errorFiles.join(', ')
2015-11-17 22:49:12 +01:00
});
}
2016-01-13 19:18:45 +01:00
if (complete) { complete(true); }
2015-11-17 21:57:32 +01:00
} else {
that.closeAllFilesAndShowFirst();
2016-01-13 19:18:45 +01:00
if (complete) { complete(true); }
2015-11-17 21:57:32 +01:00
}
}
}
},
closeAllFilesAndShowFirst: function() {
2017-01-31 07:50:28 +01:00
let fileToShow = this.model.files.find(file => !file.get('demo') && !file.get('created'));
2015-11-17 21:57:32 +01:00
this.model.closeAllFiles();
2016-02-06 08:27:11 +01:00
if (!fileToShow) {
fileToShow = this.model.fileInfos.getLast();
}
if (fileToShow) {
2017-01-31 07:50:28 +01:00
const fileInfo = this.model.fileInfos.getMatch(fileToShow.get('storage'), fileToShow.get('name'), fileToShow.get('path'));
2015-12-07 22:00:44 +01:00
if (fileInfo) {
this.views.open.showOpenFileInfo(fileInfo);
}
2015-10-25 10:19:00 +01:00
}
2015-10-17 23:49:24 +02:00
},
saveAll: function() {
2015-10-24 21:06:44 +02:00
this.model.files.forEach(function(file) {
this.model.syncFile(file);
}, this);
},
syncAllByTimer: function() {
if (this.model.settings.get('autoSave')) {
this.saveAll();
2015-10-24 21:06:44 +02:00
}
2015-10-17 23:49:24 +02:00
},
remoteKeyChanged: function(e) {
2016-07-03 18:46:43 +02:00
this.showKeyChange(e.file, { remote: true });
},
keyChangePending: function(e) {
this.showKeyChange(e.file, { expired: true });
},
keyChangeAccept: function(e) {
this.showEntries();
2016-07-03 18:46:43 +02:00
if (e.expired) {
e.file.setPassword(e.password);
if (e.keyFileData && e.keyFileName) {
e.file.setKeyFile(e.keyFileData, e.keyFileName);
} else {
e.file.removeKeyFile();
}
2016-07-03 18:46:43 +02:00
} else {
this.model.syncFile(e.file, {
remoteKey: {
password: e.password,
keyFileName: e.keyFileName,
keyFileData: e.keyFileData
}
});
}
},
2015-10-22 20:03:44 +02:00
toggleSettings: function(page) {
2017-01-31 07:50:28 +01:00
let menuItem = page ? this.model.menu[page + 'Section'] : null;
2015-10-22 20:03:44 +02:00
if (menuItem) {
menuItem = menuItem.get('items').first();
}
2015-10-17 23:49:24 +02:00
if (this.views.settings) {
2015-10-22 20:08:11 +02:00
if (this.views.settings.page === page || !menuItem) {
2016-02-23 06:20:01 +01:00
if (this.model.files.hasOpenFiles()) {
this.showEntries();
} else {
this.showLastOpenFile();
2016-03-14 21:57:14 +01:00
this.views.open.toggleMore();
2016-02-23 06:20:01 +01:00
}
2015-10-22 20:03:44 +02:00
} else {
if (menuItem) {
this.model.menu.select({item: menuItem});
}
}
2015-10-17 23:49:24 +02:00
} else {
this.showSettings();
2015-10-22 20:03:44 +02:00
if (menuItem) {
this.model.menu.select({item: menuItem});
}
2015-10-17 23:49:24 +02:00
}
},
2015-10-24 11:15:54 +02:00
toggleMenu: function() {
this.views.menu.switchVisibility();
},
2015-10-26 22:07:19 +01:00
toggleDetails: function(visible) {
2015-11-24 23:01:09 +01:00
this.$el.find('.app').toggleClass('app--details-visible', visible);
2015-10-26 22:07:19 +01:00
this.views.menu.switchVisibility(false);
},
2015-10-31 20:09:32 +01:00
editGroup: function(group) {
2016-08-13 21:13:16 +02:00
if (group && !(this.views.panel instanceof GrpView)) {
2015-10-31 20:09:32 +01:00
this.showEditGroup();
2016-08-13 21:13:16 +02:00
this.views.panel.showGroup(group);
2015-10-31 20:09:32 +01:00
} else {
this.showEntries();
}
},
2016-04-17 22:02:39 +02:00
editTag: function(tag) {
2016-08-13 21:13:16 +02:00
if (tag && !(this.views.panel instanceof TagView)) {
2016-04-17 22:02:39 +02:00
this.showEditTag();
2016-08-13 21:13:16 +02:00
this.views.panel.showTag(tag);
} else {
this.showEntries();
}
},
editGeneratorPresets: function() {
if (!(this.views.panel instanceof GeneratorPresetsView)) {
if (this.views.settings) {
this.showEntries();
}
this.showPanelView(new GeneratorPresetsView({ model: this.model }));
2016-04-17 22:02:39 +02:00
} else {
this.showEntries();
}
},
2016-07-30 11:25:22 +02:00
isContextMenuAllowed(e) {
return ['input', 'textarea'].indexOf(e.target.tagName.toLowerCase()) < 0;
},
contextMenu: function(e) {
if (this.isContextMenuAllowed(e)) {
2015-10-17 23:49:24 +02:00
e.preventDefault();
}
},
2016-07-30 11:25:22 +02:00
showContextMenu: function(e) {
if (e.options && this.isContextMenuAllowed(e)) {
e.stopImmediatePropagation();
e.preventDefault();
if (this.views.contextMenu) {
this.views.contextMenu.remove();
}
2017-01-31 07:50:28 +01:00
const menu = new DropdownView({ model: e });
2016-07-30 11:25:22 +02:00
menu.render({
position: { left: e.pageX, top: e.pageY },
options: e.options
});
menu.on('cancel', e => this.hideContextMenu());
menu.on('select', e => this.contextMenuSelect(e));
this.views.contextMenu = menu;
}
},
hideContextMenu: function() {
if (this.views.contextMenu) {
this.views.contextMenu.remove();
delete this.views.contextMenu;
}
},
contextMenuSelect: function(e) {
this.hideContextMenu();
Backbone.trigger('context-menu-select', e);
},
2016-09-16 19:33:38 +02:00
showSingleInstanceAlert: function() {
this.hideOpenFile();
Alerts.error({
header: Locale.appTabWarn, body: Locale.appTabWarnBody,
esc: false, enter: false, click: false, buttons: []
});
},
2015-10-17 23:49:24 +02:00
dragover: function(e) {
e.preventDefault();
e.originalEvent.dataTransfer.dropEffect = 'none';
2015-10-17 23:49:24 +02:00
},
drop: function(e) {
e.preventDefault();
},
setTheme: function() {
2016-08-21 23:12:49 +02:00
SettingsManager.setTheme(this.model.settings.get('theme'));
2015-10-22 20:03:44 +02:00
},
setFontSize: function() {
2016-08-21 23:12:49 +02:00
SettingsManager.setFontSize(this.model.settings.get('fontSize'));
},
setLocale: function() {
SettingsManager.setLocale(this.model.settings.get('locale'));
if (this.views.settings.isVisible()) {
this.hideSettings();
this.showSettings();
}
2016-08-24 22:06:25 +02:00
this.$el.find('.app__beta:first').text(Locale.appBeta);
},
2015-10-22 20:03:44 +02:00
extLinkClick: function(e) {
if (Launcher) {
e.preventDefault();
Launcher.openLink(e.target.href);
}
2015-11-17 22:49:12 +01:00
},
2016-01-16 13:35:34 +01:00
bodyClick: function(e) {
2015-11-17 22:49:12 +01:00
IdleTracker.regUserAction();
2016-01-16 13:35:34 +01:00
Backbone.trigger('click', e);
2015-10-17 23:49:24 +02:00
}
});
module.exports = AppView;