diff --git a/src/components/Envelope.vue b/src/components/Envelope.vue index c0fa1f8c52..17c8779289 100644 --- a/src/components/Envelope.vue +++ b/src/components/Envelope.vue @@ -15,8 +15,9 @@ :name="addresses" :details="formatted()" :one-line="oneLineLayout" - @click="onClick" - @click.ctrl.prevent="toggleSelected" + @click.exact="onClick" + @click.ctrl.exact.prevent="toggleSelected" + @click.shift.exact.prevent="onSelectMultiple" @update:menuOpen="closeMoreAndSnoozeOptions"> diff --git a/src/components/EnvelopeList.vue b/src/components/EnvelopeList.vue index eb53216d7a..524ec0470f 100644 --- a/src/components/EnvelopeList.vue +++ b/src/components/EnvelopeList.vue @@ -544,12 +544,15 @@ export default { this.setEnvelopeSelected(envelope, selected) }, onEnvelopeSelectMultiple(envelope, index) { - if (this.lastToggledIndex === undefined) { + const lastToggledIndex = this.lastToggledIndex + ?? this.findSelectionIndex(parseInt(this.$route.params.threadId)) + ?? undefined + if (lastToggledIndex === undefined) { return } - const start = Math.min(this.lastToggledIndex, index) - const end = Math.max(this.lastToggledIndex, index) + const start = Math.min(lastToggledIndex, index) + const end = Math.max(lastToggledIndex, index) const selected = this.selection.includes(envelope.databaseId) for (let i = start; i <= end; i++) { this.setEnvelopeSelected(this.sortedEnvelops[i], !selected) @@ -581,6 +584,21 @@ export default { this.showMoveModal = false this.unselectAll() }, + /** + * Find the envelope list index of a given envelope's database id. + * + * @param {int} databaseId + * @return {int|undefined} Index or undefined if not found in the envelope list + */ + findSelectionIndex(databaseId) { + for (const [index, envelope] of this.sortedEnvelops.entries()) { + if (envelope.databaseId === databaseId) { + return index + } + } + + return undefined + }, }, }