diff --git a/app/scripts/util/copy-paste.js b/app/scripts/comp/copy-paste.js similarity index 55% rename from app/scripts/util/copy-paste.js rename to app/scripts/comp/copy-paste.js index 9114fd01..28c35d6e 100644 --- a/app/scripts/util/copy-paste.js +++ b/app/scripts/comp/copy-paste.js @@ -1,11 +1,17 @@ 'use strict'; -var FeatureDetector = require('./feature-detector'); +var FeatureDetector = require('../util/feature-detector'), + Launcher = require('./launcher'), + AppSettingsModel = require('../models/app-settings-model'); var CopyPaste = { tryCopy: function() { try { - return document.execCommand('copy'); + var success = document.execCommand('copy'); + if (success) { + this.copied(); + } + return success; } catch (e) { return false; } @@ -31,6 +37,21 @@ var CopyPaste = { 'copy cut paste': function() { setTimeout(function() { hiddenInput.blur(); }, 0); }, blur: function() { hiddenInput.remove(); } }); + }, + + copied: function() { + if (Launcher) { + var clipboardSeconds = AppSettingsModel.instance.get('clipboardSeconds'); + if (clipboardSeconds > 0) { + setTimeout(function() { + setTimeout((function (prevText) { + if (Launcher.getClipboardText() === prevText) { + Launcher.clearClipboardText(); + } + }).bind(null, Launcher.getClipboardText()), clipboardSeconds * 1000); + }, 0); + } + } } }; diff --git a/app/scripts/comp/launcher.js b/app/scripts/comp/launcher.js index 239eed6e..afd3bb1a 100644 --- a/app/scripts/comp/launcher.js +++ b/app/scripts/comp/launcher.js @@ -71,6 +71,12 @@ if (window.process && window.process.versions && window.process.versions.electro }, cancelRestart: function() { this.restartPending = false; + }, + getClipboardText: function() { + return this.req('clipboard').readText(); + }, + clearClipboardText: function() { + return this.req('clipboard').clear(); } }; window.launcherOpen = function(path) { diff --git a/app/scripts/models/app-settings-model.js b/app/scripts/models/app-settings-model.js index f01195ef..7c441b16 100644 --- a/app/scripts/models/app-settings-model.js +++ b/app/scripts/models/app-settings-model.js @@ -12,7 +12,8 @@ var AppSettingsModel = Backbone.Model.extend({ listViewWidth: null, menuViewWidth: null, tagsViewHeight: null, - autoUpdate: 'install' + autoUpdate: 'install', + clipboradSeconds: 0 }, initialize: function() { diff --git a/app/scripts/views/details/details-view.js b/app/scripts/views/details/details-view.js index dc3c2cf5..ca2c7b9e 100644 --- a/app/scripts/views/details/details-view.js +++ b/app/scripts/views/details/details-view.js @@ -16,7 +16,7 @@ var Backbone = require('backbone'), Keys = require('../../const/keys'), KeyHandler = require('../../comp/key-handler'), Alerts = require('../../comp/alerts'), - CopyPaste = require('../../util/copy-paste'), + CopyPaste = require('../../comp/copy-paste'), Format = require('../../util/format'), FileSaver = require('filesaver'), baron = require('baron'), @@ -256,6 +256,7 @@ var DetailsView = Backbone.View.extend({ var pw = this.model.password; var password = pw.getText ? pw.getText() : pw; CopyPaste.createHiddenInput(password); + CopyPaste.copied(); } }, diff --git a/app/scripts/views/fields/field-view.js b/app/scripts/views/fields/field-view.js index 053f6917..b2a1f674 100644 --- a/app/scripts/views/fields/field-view.js +++ b/app/scripts/views/fields/field-view.js @@ -2,7 +2,7 @@ var Backbone = require('backbone'), FeatureDetector = require('../../util/feature-detector'), - CopyPaste = require('../../util/copy-paste'); + CopyPaste = require('../../comp/copy-paste'); var FieldView = Backbone.View.extend({ template: require('templates/details/field.html'), diff --git a/app/scripts/views/generator-view.js b/app/scripts/views/generator-view.js index cb0bcb3a..668da440 100644 --- a/app/scripts/views/generator-view.js +++ b/app/scripts/views/generator-view.js @@ -2,7 +2,7 @@ var Backbone = require('backbone'), PasswordGenerator = require('../util/password-generator'), - CopyPaste = require('../util/copy-paste'); + CopyPaste = require('../comp/copy-paste'); var DefaultGenOpts = { length: 16, upper: true, lower: true, digits: true, special: false, brackets: false, high: false, ambiguous: false diff --git a/app/scripts/views/settings/settings-general-view.js b/app/scripts/views/settings/settings-general-view.js index 8c9606fd..443b99e2 100644 --- a/app/scripts/views/settings/settings-general-view.js +++ b/app/scripts/views/settings/settings-general-view.js @@ -16,6 +16,7 @@ var SettingsGeneralView = Backbone.View.extend({ 'change .settings__general-theme': 'changeTheme', 'change .settings__general-expand': 'changeExpandGroups', 'change .settings__general-auto-update': 'changeAutoUpdate', + 'change .settings__general-clipboard': 'changeClipboard', 'click .settings__general-update-btn': 'checkUpdate', 'click .settings__general-restart-btn': 'restartApp', 'click .settings__general-download-update-btn': 'downloadUpdate', @@ -39,6 +40,8 @@ var SettingsGeneralView = Backbone.View.extend({ themes: this.allThemes, activeTheme: AppSettingsModel.instance.get('theme'), expandGroups: AppSettingsModel.instance.get('expandGroups'), + canClearClipboard: !!Launcher, + clipboardSeconds: AppSettingsModel.instance.get('clipboardSeconds'), devTools: Launcher && Launcher.devTools, canAutoUpdate: !!Launcher, autoUpdate: Updater.getAutoUpdateType(), @@ -92,6 +95,11 @@ var SettingsGeneralView = Backbone.View.extend({ AppSettingsModel.instance.set('theme', theme); }, + changeClipboard: function(e) { + var clipboardSeconds = +e.target.value; + AppSettingsModel.instance.set('clipboardSeconds', clipboardSeconds); + }, + changeAutoUpdate: function(e) { var autoUpdate = e.target.value || false; AppSettingsModel.instance.set('autoUpdate', autoUpdate); diff --git a/app/templates/settings/settings-general.html b/app/templates/settings/settings-general.html index c84e39a1..ec461406 100644 --- a/app/templates/settings/settings-general.html +++ b/app/templates/settings/settings-general.html @@ -51,6 +51,20 @@ + <% if (canClearClipboard) { %> +

Function

+
+ + +
+ <% } %> + <% if (devTools) { %>

Advanced

Show dev tools diff --git a/release-notes.md b/release-notes.md index c4159cb6..79dd993b 100644 --- a/release-notes.md +++ b/release-notes.md @@ -6,6 +6,7 @@ Bugfixes `+` desktop Dropbox `+` Dropbox notification in self-hosted apps `+` option to check updates without install +`+` clear clipboard password after timeout ##### v0.3.0 (2015-11-14) Auto-update