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

347 lines
14 KiB
JavaScript
Raw Normal View History

2017-01-31 07:50:28 +01:00
const Backbone = require('backbone');
const SettingsPrvView = require('./settings-prv-view');
const SettingsLogsView = require('./settings-logs-view');
const Launcher = require('../../comp/launcher');
const Updater = require('../../comp/updater');
const Format = require('../../util/format');
const AppSettingsModel = require('../../models/app-settings-model');
const UpdateModel = require('../../models/update-model');
const RuntimeInfo = require('../../comp/runtime-info');
const Alerts = require('../../comp/alerts');
const SettingsManager = require('../../comp/settings-manager');
const Storage = require('../../storage');
const FeatureDetector = require('../../util/feature-detector');
const Locale = require('../../util/locale');
const SemVer = require('../../util/semver');
2017-01-31 07:50:28 +01:00
const Links = require('../../const/links');
2017-04-09 10:31:05 +02:00
const AutoType = require('../../auto-type');
2015-10-17 23:49:24 +02:00
2017-01-31 07:50:28 +01:00
const SettingsGeneralView = Backbone.View.extend({
2015-12-16 22:50:45 +01:00
template: require('templates/settings/settings-general.hbs'),
2015-10-17 23:49:24 +02:00
events: {
2015-10-23 22:12:12 +02:00
'change .settings__general-theme': 'changeTheme',
2016-08-21 23:12:49 +02:00
'change .settings__general-locale': 'changeLocale',
'change .settings__general-font-size': 'changeFontSize',
'change .settings__general-expand': 'changeExpandGroups',
'change .settings__general-auto-update': 'changeAutoUpdate',
2015-11-18 19:33:04 +01:00
'change .settings__general-idle-minutes': 'changeIdleMinutes',
'change .settings__general-clipboard': 'changeClipboard',
2015-11-17 21:57:32 +01:00
'change .settings__general-auto-save': 'changeAutoSave',
'change .settings__general-auto-save-interval': 'changeAutoSaveInterval',
2016-02-14 12:20:21 +01:00
'change .settings__general-remember-key-files': 'changeRememberKeyFiles',
2015-11-21 08:29:49 +01:00
'change .settings__general-minimize': 'changeMinimize',
'change .settings__general-lock-on-minimize': 'changeLockOnMinimize',
'change .settings__general-lock-on-copy': 'changeLockOnCopy',
'change .settings__general-lock-on-auto-type': 'changeLockOnAutoType',
2017-06-02 20:16:09 +02:00
'change .settings__general-lock-on-os-lock': 'changeLockOnOsLock',
2015-11-21 15:55:42 +01:00
'change .settings__general-table-view': 'changeTableView',
2015-12-02 22:12:14 +01:00
'change .settings__general-colorful-icons': 'changeColorfulIcons',
'change .settings__general-titlebar-style': 'changeTitlebarStyle',
2015-11-14 12:09:36 +01:00
'click .settings__general-update-btn': 'checkUpdate',
'click .settings__general-restart-btn': 'restartApp',
2015-11-14 16:28:36 +01:00
'click .settings__general-download-update-btn': 'downloadUpdate',
'click .settings__general-update-found-btn': 'installFoundUpdate',
'change .settings__general-prv-check': 'changeStorageEnabled',
2016-06-04 10:31:06 +02:00
'click .settings__general-show-advanced': 'showAdvancedSettings',
'click .settings__general-dev-tools-link': 'openDevTools',
2016-06-04 10:31:06 +02:00
'click .settings__general-try-beta-link': 'tryBeta',
'click .settings__general-show-logs-link': 'showLogs'
2015-10-17 23:49:24 +02:00
},
2016-06-04 14:59:03 +02:00
views: null,
2015-10-29 22:20:01 +01:00
initialize: function() {
2016-06-04 14:59:03 +02:00
this.views = {};
2015-10-29 22:20:01 +01:00
this.listenTo(UpdateModel.instance, 'change:status', this.render, this);
2015-11-14 12:09:36 +01:00
this.listenTo(UpdateModel.instance, 'change:updateStatus', this.render, this);
2015-10-29 22:20:01 +01:00
},
2015-10-17 23:49:24 +02:00
render: function() {
2017-01-31 07:50:28 +01:00
const updateReady = UpdateModel.instance.get('updateStatus') === 'ready';
const updateFound = UpdateModel.instance.get('updateStatus') === 'found';
const updateManual = UpdateModel.instance.get('updateManual');
const storageProviders = this.getStorageProviders();
2015-10-17 23:49:24 +02:00
this.renderTemplate({
2017-02-21 22:05:18 +01:00
themes: _.mapObject(SettingsManager.allThemes, theme => Locale[theme]),
2015-10-25 20:26:33 +01:00
activeTheme: AppSettingsModel.instance.get('theme'),
2017-02-19 10:29:18 +01:00
locales: SettingsManager.allLocales,
2017-01-29 10:04:18 +01:00
activeLocale: SettingsManager.activeLocale,
fontSize: AppSettingsModel.instance.get('fontSize'),
expandGroups: AppSettingsModel.instance.get('expandGroups'),
canClearClipboard: !!Launcher,
clipboardSeconds: AppSettingsModel.instance.get('clipboardSeconds'),
2016-02-14 12:20:21 +01:00
rememberKeyFiles: AppSettingsModel.instance.get('rememberKeyFiles'),
supportFiles: !!Launcher,
2015-11-17 21:57:32 +01:00
autoSave: AppSettingsModel.instance.get('autoSave'),
autoSaveInterval: AppSettingsModel.instance.get('autoSaveInterval'),
2015-11-18 19:33:04 +01:00
idleMinutes: AppSettingsModel.instance.get('idleMinutes'),
2015-11-21 08:29:49 +01:00
minimizeOnClose: AppSettingsModel.instance.get('minimizeOnClose'),
2015-10-29 22:20:01 +01:00
devTools: Launcher && Launcher.devTools,
canAutoUpdate: Updater.enabled,
2019-01-02 21:45:53 +01:00
canAutoSaveOnClose: !!Launcher,
canMinimize: Launcher && Launcher.canMinimize(),
2016-07-17 15:01:06 +02:00
canDetectMinimize: !!Launcher,
2017-06-12 21:07:09 +02:00
canDetectOsSleep: Launcher && Launcher.canDetectOsSleep(),
2017-04-09 10:31:05 +02:00
canAutoType: AutoType.enabled,
lockOnMinimize: Launcher && AppSettingsModel.instance.get('lockOnMinimize'),
lockOnCopy: AppSettingsModel.instance.get('lockOnCopy'),
lockOnAutoType: AppSettingsModel.instance.get('lockOnAutoType'),
2017-06-02 20:16:09 +02:00
lockOnOsLock: AppSettingsModel.instance.get('lockOnOsLock'),
2015-11-21 15:55:42 +01:00
tableView: AppSettingsModel.instance.get('tableView'),
2016-07-17 21:08:23 +02:00
canSetTableView: !FeatureDetector.isMobile,
autoUpdate: Updater.getAutoUpdateType(),
2015-11-14 12:09:36 +01:00
updateInProgress: Updater.updateInProgress(),
updateInfo: this.getUpdateInfo(),
2015-12-16 22:50:45 +01:00
updateWaitingReload: updateReady && !Launcher,
showUpdateBlock: Updater.enabled && !updateManual,
2015-12-16 22:50:45 +01:00
updateReady: updateReady,
updateFound: updateFound,
updateManual: updateManual,
2015-12-02 22:12:14 +01:00
releaseNotesLink: Links.ReleaseNotes,
colorfulIcons: AppSettingsModel.instance.get('colorfulIcons'),
2017-04-26 22:38:01 +02:00
supportsTitleBarStyles: Launcher && FeatureDetector.supportsTitleBarStyles(),
titlebarStyle: AppSettingsModel.instance.get('titlebarStyle'),
storageProviders: storageProviders
2015-10-17 23:49:24 +02:00
});
this.renderProviderViews(storageProviders);
},
renderProviderViews: function(storageProviders) {
storageProviders.forEach(function(prv) {
if (this.views[prv.name]) {
this.views[prv.name].remove();
}
if (prv.hasConfig) {
this.views[prv.name] = new SettingsPrvView({
el: this.$el.find('.settings__general-' + prv.name),
model: prv
}).render();
}
}, this);
2015-10-17 23:49:24 +02:00
},
2015-10-29 22:20:01 +01:00
getUpdateInfo: function() {
switch (UpdateModel.instance.get('status')) {
case 'checking':
2015-12-17 19:25:25 +01:00
return Locale.setGenUpdateChecking + '...';
2015-10-29 22:20:01 +01:00
case 'error':
2017-01-31 07:50:28 +01:00
let errMsg = Locale.setGenErrorChecking;
2015-10-29 22:20:01 +01:00
if (UpdateModel.instance.get('lastError')) {
errMsg += ': ' + UpdateModel.instance.get('lastError');
}
if (UpdateModel.instance.get('lastSuccessCheckDate')) {
2015-12-17 19:25:25 +01:00
errMsg += '. ' + Locale.setGenLastCheckSuccess.replace('{}', Format.dtStr(UpdateModel.instance.get('lastSuccessCheckDate'))) +
': ' + Locale.setGenLastCheckVer.replace('{}', UpdateModel.instance.get('lastVersion'));
2015-10-29 22:20:01 +01:00
}
return errMsg;
case 'ok':
2017-01-31 07:50:28 +01:00
let msg = Locale.setGenCheckedAt + ' ' + Format.dtStr(UpdateModel.instance.get('lastCheckDate')) + ': ';
const cmp = SemVer.compareVersions(RuntimeInfo.version, UpdateModel.instance.get('lastVersion'));
2016-02-07 12:49:31 +01:00
if (cmp >= 0) {
2015-12-17 19:25:25 +01:00
msg += Locale.setGenLatestVer;
2015-10-29 22:20:01 +01:00
} else {
2015-12-17 19:25:25 +01:00
msg += Locale.setGenNewVer.replace('{}', UpdateModel.instance.get('lastVersion')) + ' ' +
2015-10-29 22:20:01 +01:00
Format.dStr(UpdateModel.instance.get('lastVersionReleaseDate'));
}
2015-11-14 12:09:36 +01:00
switch (UpdateModel.instance.get('updateStatus')) {
case 'downloading':
2015-12-17 19:25:25 +01:00
return msg + '. ' + Locale.setGenDownloadingUpdate;
2015-11-14 12:09:36 +01:00
case 'extracting':
2015-12-17 19:25:25 +01:00
return msg + '. ' + Locale.setGenExtractingUpdate;
2015-11-14 12:09:36 +01:00
case 'error':
2015-12-17 19:25:25 +01:00
return msg + '. ' + Locale.setGenCheckErr;
2015-11-14 12:09:36 +01:00
}
2015-10-29 22:20:01 +01:00
return msg;
default:
2015-12-17 19:25:25 +01:00
return Locale.setGenNeverChecked;
2015-10-29 22:20:01 +01:00
}
},
getStorageProviders: function() {
2017-01-31 07:50:28 +01:00
const storageProviders = [];
2016-07-17 13:30:38 +02:00
Object.keys(Storage).forEach(name => {
2017-01-31 07:50:28 +01:00
const prv = Storage[name];
if (!prv.system) {
storageProviders.push(prv);
}
});
2016-07-17 13:30:38 +02:00
storageProviders.sort((x, y) => (x.uipos || Infinity) - (y.uipos || Infinity));
return storageProviders.map(sp => ({
name: sp.name,
enabled: sp.enabled,
hasConfig: sp.getSettingsConfig
}));
},
2015-10-17 23:49:24 +02:00
changeTheme: function(e) {
2017-01-31 07:50:28 +01:00
const theme = e.target.value;
2015-10-17 23:49:24 +02:00
AppSettingsModel.instance.set('theme', theme);
2015-10-23 22:12:12 +02:00
},
2016-08-21 23:12:49 +02:00
changeLocale: function(e) {
2017-01-31 07:50:28 +01:00
const locale = e.target.value;
2016-08-21 23:12:49 +02:00
if (locale === '...') {
e.target.value = AppSettingsModel.instance.get('locale') || 'en';
2017-05-05 20:41:45 +02:00
this.appModel.menu.select({ item: this.appModel.menu.pluginsSection.get('items').first() });
2016-08-21 23:12:49 +02:00
return;
}
AppSettingsModel.instance.set('locale', locale);
},
changeFontSize: function(e) {
2017-01-31 07:50:28 +01:00
const fontSize = +e.target.value;
AppSettingsModel.instance.set('fontSize', fontSize);
},
changeTitlebarStyle: function(e) {
2017-03-26 01:57:52 +01:00
const titlebarStyle = e.target.value;
AppSettingsModel.instance.set('titlebarStyle', titlebarStyle);
},
changeClipboard: function(e) {
2017-01-31 07:50:28 +01:00
const clipboardSeconds = +e.target.value;
AppSettingsModel.instance.set('clipboardSeconds', clipboardSeconds);
},
2015-11-18 19:33:04 +01:00
changeIdleMinutes: function(e) {
2017-01-31 07:50:28 +01:00
const idleMinutes = +e.target.value;
2015-11-18 19:33:04 +01:00
AppSettingsModel.instance.set('idleMinutes', idleMinutes);
},
2015-10-25 20:26:33 +01:00
changeAutoUpdate: function(e) {
2017-01-31 07:50:28 +01:00
const autoUpdate = e.target.value || false;
2015-10-25 20:26:33 +01:00
AppSettingsModel.instance.set('autoUpdate', autoUpdate);
if (autoUpdate) {
2015-10-29 22:20:01 +01:00
Updater.scheduleNextCheck();
2015-10-25 20:26:33 +01:00
}
},
2015-11-14 12:09:36 +01:00
checkUpdate: function() {
Updater.check(true);
},
2015-11-17 21:57:32 +01:00
changeAutoSave: function(e) {
2017-01-31 07:50:28 +01:00
const autoSave = e.target.checked || false;
2015-11-17 21:57:32 +01:00
AppSettingsModel.instance.set('autoSave', autoSave);
},
changeAutoSaveInterval: function(e) {
const autoSaveInterval = Number(e.target.value) || 0;
AppSettingsModel.instance.set('autoSaveInterval', autoSaveInterval);
},
2016-02-14 12:20:21 +01:00
changeRememberKeyFiles: function(e) {
2017-01-31 07:50:28 +01:00
const rememberKeyFiles = e.target.value || false;
2016-02-14 12:20:21 +01:00
AppSettingsModel.instance.set('rememberKeyFiles', rememberKeyFiles);
this.appModel.clearStoredKeyFiles();
2016-02-14 12:20:21 +01:00
},
2015-11-21 08:29:49 +01:00
changeMinimize: function(e) {
2017-01-31 07:50:28 +01:00
const minimizeOnClose = e.target.checked || false;
2015-11-21 08:29:49 +01:00
AppSettingsModel.instance.set('minimizeOnClose', minimizeOnClose);
},
changeLockOnMinimize: function(e) {
2017-01-31 07:50:28 +01:00
const lockOnMinimize = e.target.checked || false;
AppSettingsModel.instance.set('lockOnMinimize', lockOnMinimize);
},
changeLockOnCopy: function(e) {
2017-01-31 07:50:28 +01:00
const lockOnCopy = e.target.checked || false;
AppSettingsModel.instance.set('lockOnCopy', lockOnCopy);
},
changeLockOnAutoType: function(e) {
const lockOnAutoType = e.target.checked || false;
AppSettingsModel.instance.set('lockOnAutoType', lockOnAutoType);
},
2017-06-02 20:16:09 +02:00
changeLockOnOsLock: function(e) {
const lockOnOsLock = e.target.checked || false;
AppSettingsModel.instance.set('lockOnOsLock', lockOnOsLock);
},
2015-11-21 15:55:42 +01:00
changeTableView: function(e) {
2017-01-31 07:50:28 +01:00
const tableView = e.target.checked || false;
2015-11-21 15:55:42 +01:00
AppSettingsModel.instance.set('tableView', tableView);
Backbone.trigger('refresh');
},
2015-12-02 22:12:14 +01:00
changeColorfulIcons: function(e) {
2017-01-31 07:50:28 +01:00
const colorfulIcons = e.target.checked || false;
2015-12-02 22:12:14 +01:00
AppSettingsModel.instance.set('colorfulIcons', colorfulIcons);
Backbone.trigger('refresh');
},
2015-11-14 12:09:36 +01:00
restartApp: function() {
2015-11-14 16:28:36 +01:00
if (Launcher) {
Launcher.requestRestart();
} else {
window.location.reload();
}
},
downloadUpdate: function() {
Launcher.openLink(Links.Desktop);
2015-11-14 12:09:36 +01:00
},
installFoundUpdate: function() {
2016-07-17 13:30:38 +02:00
Updater.update(true, () => {
Launcher.requestRestart();
});
},
changeExpandGroups: function(e) {
2017-01-31 07:50:28 +01:00
const expand = e.target.checked;
AppSettingsModel.instance.set('expandGroups', expand);
Backbone.trigger('refresh');
},
changeStorageEnabled: function(e) {
2017-01-31 07:50:28 +01:00
const storage = Storage[$(e.target).data('storage')];
if (storage) {
storage.setEnabled(e.target.checked);
AppSettingsModel.instance.set(storage.name, storage.enabled);
this.$el.find('.settings__general-' + storage.name).toggleClass('hide', !e.target.checked);
}
},
2016-06-04 10:31:06 +02:00
showAdvancedSettings: function() {
this.$el.find('.settings__general-show-advanced, .settings__general-advanced').toggleClass('hide');
this.scrollToBottom();
},
2015-10-23 22:12:12 +02:00
openDevTools: function() {
if (Launcher) {
Launcher.openDevTools();
}
},
tryBeta: function() {
if (this.appModel.files.hasUnsavedFiles()) {
Alerts.info({
header: Locale.setGenTryBetaWarning,
body: Locale.setGenTryBetaWarningBody
});
} else {
location.href = Links.BetaWebApp;
}
2016-06-04 10:31:06 +02:00
},
showLogs: function() {
2016-06-04 14:59:03 +02:00
if (this.views.logView) {
this.views.logView.remove();
}
this.views.logView = new SettingsLogsView({ el: this.$el.find('.settings__general-advanced') }).render();
2016-06-04 10:31:06 +02:00
this.scrollToBottom();
},
scrollToBottom: function() {
this.$el.closest('.scroller').scrollTop(this.$el.height());
2015-10-17 23:49:24 +02:00
}
});
module.exports = SettingsGeneralView;