From 81de5f9a76dec77df1d40eafc5d701a7c17d1f74 Mon Sep 17 00:00:00 2001 From: Scott Nonnenberg Date: Fri, 29 Mar 2019 11:30:43 -0700 Subject: [PATCH] Introduce CTRL-E shortcut for archiving a conversation --- js/views/conversation_view.js | 1 + js/views/inbox_view.js | 22 +++++++++++++++++++ ts/util/lint/exceptions.json | 41 +++++++++++++++++++++-------------- 3 files changed, 48 insertions(+), 16 deletions(-) diff --git a/js/views/conversation_view.js b/js/views/conversation_view.js index f83506088..8f8a601bf 100644 --- a/js/views/conversation_view.js +++ b/js/views/conversation_view.js @@ -88,6 +88,7 @@ this.listenTo(this.model, 'newmessage', this.addMessage); this.listenTo(this.model, 'opened', this.onOpened); this.listenTo(this.model, 'prune', this.onPrune); + this.listenTo(this.model, 'unload', () => this.unload('model trigger')); this.listenTo(this.model, 'typing-update', this.renderTypingBubble); this.listenTo( this.model.messageCollection, diff --git a/js/views/inbox_view.js b/js/views/inbox_view.js index eaea8cbb5..4e1f6c003 100644 --- a/js/views/inbox_view.js +++ b/js/views/inbox_view.js @@ -1,4 +1,5 @@ /* global + $, ConversationController, extension, getConversations, @@ -146,6 +147,27 @@ this.openConversationAction = openConversationExternal; + // In the future this listener will be added by the conversation view itself. But + // because we currently have multiple converations open at once, we install just + // one global handler. + $(document).on('keydown', event => { + const { ctrlKey, key } = event; + + // We can add Command-E as the Mac shortcut when we add it to our Electron menus: + // https://stackoverflow.com/questions/27380018/when-cmd-key-is-kept-pressed-keyup-is-not-triggered-for-any-other-key + // For now, it will stay as CTRL-E only + if (key === 'e' && ctrlKey) { + const state = this.store.getState(); + const selectedId = state.conversations.selectedConversation; + const conversation = ConversationController.get(selectedId); + + if (conversation && !conversation.get('isArchived')) { + conversation.setArchived(true); + conversation.trigger('unload'); + } + } + }); + this.listenTo(convoCollection, 'remove', conversation => { const { id } = conversation || {}; conversationRemoved(id); diff --git a/ts/util/lint/exceptions.json b/ts/util/lint/exceptions.json index 2e61480a3..1be2010ab 100644 --- a/ts/util/lint/exceptions.json +++ b/ts/util/lint/exceptions.json @@ -501,7 +501,7 @@ "rule": "jQuery-$(", "path": "js/views/inbox_view.js", "line": " let $el = this.$(`#${id}`);", - "lineNumber": 29, + "lineNumber": 30, "reasonCategory": "usageTrusted", "updated": "2018-09-19T21:59:32.770Z", "reasonDetail": "Protected from arbitrary input" @@ -510,7 +510,7 @@ "rule": "jQuery-prependTo(", "path": "js/views/inbox_view.js", "line": " $el.prependTo(this.el);", - "lineNumber": 38, + "lineNumber": 39, "reasonCategory": "usageTrusted", "updated": "2018-09-19T18:13:29.628Z", "reasonDetail": "Interacting with already-existing DOM nodes" @@ -519,7 +519,7 @@ "rule": "jQuery-$(", "path": "js/views/inbox_view.js", "line": " this.$('.message').text(message);", - "lineNumber": 50, + "lineNumber": 51, "reasonCategory": "usageTrusted", "updated": "2018-09-19T21:59:32.770Z", "reasonDetail": "Protected from arbitrary input" @@ -528,7 +528,7 @@ "rule": "jQuery-$(", "path": "js/views/inbox_view.js", "line": " el: this.$('.conversation-stack'),", - "lineNumber": 67, + "lineNumber": 68, "reasonCategory": "usageTrusted", "updated": "2018-09-19T21:59:32.770Z", "reasonDetail": "Protected from arbitrary input" @@ -537,7 +537,7 @@ "rule": "jQuery-prependTo(", "path": "js/views/inbox_view.js", "line": " this.appLoadingScreen.$el.prependTo(this.el);", - "lineNumber": 74, + "lineNumber": 75, "reasonCategory": "usageTrusted", "updated": "2018-09-19T18:13:29.628Z", "reasonDetail": "Interacting with already-existing DOM nodes" @@ -546,7 +546,7 @@ "rule": "jQuery-append(", "path": "js/views/inbox_view.js", "line": " .append(this.networkStatusView.render().el);", - "lineNumber": 89, + "lineNumber": 90, "reasonCategory": "usageTrusted", "updated": "2018-09-19T18:13:29.628Z", "reasonDetail": "Interacting with already-existing DOM nodes" @@ -555,16 +555,25 @@ "rule": "jQuery-prependTo(", "path": "js/views/inbox_view.js", "line": " banner.$el.prependTo(this.$el);", - "lineNumber": 93, + "lineNumber": 94, "reasonCategory": "usageTrusted", "updated": "2018-09-19T18:13:29.628Z", "reasonDetail": "Interacting with already-existing DOM nodes" }, + { + "rule": "jQuery-$(", + "path": "js/views/inbox_view.js", + "line": " $(document).on('keydown', event => {", + "lineNumber": 153, + "reasonCategory": "usageTrusted", + "updated": "2019-04-03T00:43:09.315Z", + "reasonDetail": "Interacting with already-existing DOM nodes" + }, { "rule": "jQuery-$(", "path": "js/views/inbox_view.js", "line": " this.$('.left-pane-placeholder').append(this.leftPaneView.el);", - "lineNumber": 167, + "lineNumber": 189, "reasonCategory": "usageTrusted", "updated": "2019-03-08T23:49:08.796Z", "reasonDetail": "Protected from arbitrary input" @@ -573,7 +582,7 @@ "rule": "jQuery-append(", "path": "js/views/inbox_view.js", "line": " this.$('.left-pane-placeholder').append(this.leftPaneView.el);", - "lineNumber": 167, + "lineNumber": 189, "reasonCategory": "usageTrusted", "updated": "2019-03-08T23:49:08.796Z", "reasonDetail": "Protected from arbitrary input" @@ -582,7 +591,7 @@ "rule": "jQuery-$(", "path": "js/views/inbox_view.js", "line": " if (e && this.$(e.target).closest('.placeholder').length) {", - "lineNumber": 208, + "lineNumber": 230, "reasonCategory": "usageTrusted", "updated": "2019-03-08T23:49:08.796Z", "reasonDetail": "Protected from arbitrary input" @@ -591,7 +600,7 @@ "rule": "jQuery-$(", "path": "js/views/inbox_view.js", "line": " this.$('#header, .gutter').addClass('inactive');", - "lineNumber": 212, + "lineNumber": 234, "reasonCategory": "usageTrusted", "updated": "2019-03-08T23:49:08.796Z", "reasonDetail": "Protected from arbitrary input" @@ -600,7 +609,7 @@ "rule": "jQuery-$(", "path": "js/views/inbox_view.js", "line": " this.$('.conversation-stack').addClass('inactive');", - "lineNumber": 216, + "lineNumber": 238, "reasonCategory": "usageTrusted", "updated": "2019-03-08T23:49:08.796Z", "reasonDetail": "Protected from arbitrary input" @@ -609,7 +618,7 @@ "rule": "jQuery-$(", "path": "js/views/inbox_view.js", "line": " this.$('.conversation:first .menu').trigger('close');", - "lineNumber": 218, + "lineNumber": 240, "reasonCategory": "usageTrusted", "updated": "2019-03-08T23:49:08.796Z", "reasonDetail": "Protected from arbitrary input" @@ -618,7 +627,7 @@ "rule": "jQuery-$(", "path": "js/views/inbox_view.js", "line": " if (e && this.$(e.target).closest('.capture-audio').length > 0) {", - "lineNumber": 237, + "lineNumber": 259, "reasonCategory": "usageTrusted", "updated": "2019-03-08T23:49:08.796Z", "reasonDetail": "Protected from arbitrary input" @@ -627,7 +636,7 @@ "rule": "jQuery-$(", "path": "js/views/inbox_view.js", "line": " this.$('.conversation:first .recorder').trigger('close');", - "lineNumber": 240, + "lineNumber": 262, "reasonCategory": "usageTrusted", "updated": "2019-03-08T23:49:08.796Z", "reasonDetail": "Protected from arbitrary input" @@ -6258,4 +6267,4 @@ "updated": "2019-03-09T00:08:44.242Z", "reasonDetail": "Used only to trigger menu display" } -] \ No newline at end of file +]