NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript==
// @name IBM Verse - Auto-Select Next Email
// @namespace https://openuserjs.org/users/zachhardesty7
// @author Zach Hardesty <zachhardesty7@users.noreply.github.com> (https://github.com/zachhardesty7)
// @description load up next email when the current one is deleted
// @copyright 2020, Zach Hardesty (https://zachhardesty.com/)
// @license GPL-3.0-only; http://www.gnu.org/licenses/gpl-3.0.txt
// @version 2.2.4
// @homepage https://github.com/zachhardesty7/tamper-monkey-scripts-collection/tree/master/verse-ibm-select-next-email
// @homepageURL https://github.com/zachhardesty7/tamper-monkey-scripts-collection/tree/master/verse-ibm-select-next-email
// @homepageURL https://openuserjs.org/scripts/zachhardesty7/IBM_Verse_-_Auto-Select_Next_Email
// @supportURL https://github.com/zachhardesty7/tamper-monkey-scripts-collection/issues
// @updateURL https://openuserjs.org/meta/zachhardesty7/IBM_Verse_-_Auto-Select_Next_Email.meta.js
// @downloadURL https://openuserjs.org/src/scripts/zachhardesty7/IBM_Verse_-_Auto-Select_Next_Email.user.js
// @include https://mail.notes.na.collabserv.com/verse*
// @require https://greasyfork.org/scripts/419640-onelementready/code/onElementReady.js?version=887637
// ==/UserScript==
/* global onElementReady */
/**
* the email that should be active after active email is deleted or archived
*
* @type {HTMLElement}
*/
let nextEmail = null
/**
* safely move to next email
*
* will trigger the click function to find the next email
*
* @param {string} description - message to log
* @returns {(event: Event) => void} - function to be called
*/
const clickNextEmail = (description) => (event) => {
console.log(`clicked ${description}`)
nextEmail && nextEmail.click()
}
/**
* @param {HTMLElement} el - input
* @returns {boolean} whether or not the input is the last email
*/
const isLastEmail = (el) =>
!el.nextElementSibling || el.nextElementSibling.tagName === "SPAN"
window.addEventListener(
"load",
() => {
// heading buttons
onElementReady("button.action.pim-delete.icon", {}, (button) => {
// trigger on click heading del
button.addEventListener("click", clickNextEmail("header del"), {
once: true,
})
})
onElementReady("li.seq-msg-row", { findOnce: true }, (clickedEmail) => {
// trigger on click inline archive
clickedEmail
.querySelector("button.triage-action.remove")
.addEventListener("click", clickNextEmail("inline archive"), {
once: true,
})
// trigger on click inline delete
clickedEmail
.querySelector("button.triage-action.delete")
.addEventListener("click", clickNextEmail("inline del"), {
once: true,
})
// find next email
// also triggered on calling `clickNextEmail`
clickedEmail.addEventListener("click", (e) => {
const targetEl = /** @type {HTMLElement} */ (e.target)
/** subtract out the invisible span element from the total sibling count */
const emailCount = clickedEmail.parentElement.childElementCount - 1
// don't update if user clicked on an inline button icon
// `clickNextEmail` handles to prevent double click
if (targetEl.tagName === "svg" || targetEl.tagName === "rect") return
if (emailCount < 2) return
if (isLastEmail(clickedEmail))
nextEmail = clickedEmail.previousElementSibling
// when second-to-last is also first email
else if (emailCount === 2) nextEmail = clickedEmail.nextElementSibling
// when second-to-last and many emails visible
else if (isLastEmail(clickedEmail.nextElementSibling))
nextEmail = clickedEmail.previousElementSibling
else nextEmail = clickedEmail.nextElementSibling
})
})
},
false
)