NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name Jira ready for review message // @description Lets you copy a message ready for pasting into Slack when a story is ready for review or prioritisation // @namespace https://openuserjs.org/users/floodmeadows // @author floodmeadows // @copyright 2021, floodmeadows (https://openuserjs.org/users/floodmeadows) // @license MIT // @version 0.4 // @include https://jira.*.uk/browse/* // @updateURL https://openuserjs.org/meta/floodmeadows/Jira_ready_for_review_message.meta.js // @downloadURL https://openuserjs.org/src/scripts/floodmeadows/Jira_ready_for_review_message.user.js // @grant none // ==/UserScript== /* jshint esversion: 6 */ const currentUrl = new URL(document.URL); const jiraBaseUrl = currentUrl.protocol + '//' + currentUrl.host; const issueKey = document.getElementById("key-val").childNodes[0].nodeValue; const issueName = document.getElementById("summary-val").childNodes[0].nodeValue; const issueUrl = `${jiraBaseUrl}/browse/${issueKey}`; const slackEmojiForLgtm = ":lgtm:"; (function() { 'use strict'; addButtonReadyForReview(); addButtonReadyForPrioritisation(); })(); function copyReadyForReviewMessage() { const text = `@android @ios @mobile-services @mobile-qa Story ready for review: > ${issueName} > (${issueUrl}) All OK? Just respond with :lgtm: and your points estimates. Comments or questions? Add them in a thread >>> If it's worth a refinement call, just let me know :) Thanks` const html = `@android @ios @mobile-services @mobile-qa Story ready for review:<br /> <a href="${issueUrl}">'${issueName}' (${issueKey})</a><br /> <br /> All OK? Just respond with ${slackEmojiForLgtm} and your points estimates.<br /> Comments or questions? Add them in a thread >>><br /> If it's worth a refinement call, just let me know :simple-smile: :thanks:` copyTextAndHtmlToClipboard(text, html) } function copyReadyForPrioritisationMessage() { const text = `@mobile-prioritisers this is now Ready For Dev: > ${issueName} > (${issueUrl})` const html = `@mobile-prioritisers this is now :ready-4-dev: :<br /> <a href="${issueUrl}">'${issueName}' (${issueKey})</a>` copyTextAndHtmlToClipboard(text, html) } function addButtonReadyForReview() { const buttonLabel = "Copy review message" const targetElement = document.getElementById('opsbar-opsbar-admin') const eventHandler = copyReadyForReviewMessage const buttonCssClasses = "aui-button toolbar-trigger issueaction-workflow-transition" addButton(buttonLabel, targetElement, eventHandler, buttonCssClasses) } function addButtonReadyForPrioritisation() { const buttonLabel = "Copy prioritisation message" const targetElement = document.getElementById('opsbar-opsbar-admin') const eventHandler = copyReadyForPrioritisationMessage const buttonCssClasses = "aui-button toolbar-trigger issueaction-workflow-transition" addButton(buttonLabel, targetElement, eventHandler, buttonCssClasses) } function addButton(text, parentElement, clickEventFunctionName, cssClass) { console.log("addButton called") addButtonBefore(text, parentElement, null, clickEventFunctionName, cssClass) } function addButtonBefore(text, parentElement, beforeElement, clickEventFunctionName, cssClass) { console.log("addButtonBefore called") const btn = document.createElement("a") const textNode = document.createTextNode(text) btn.appendChild(textNode) btn.setAttribute("href","#") btn.addEventListener("click", clickEventFunctionName) btn.setAttribute("class", cssClass) parentElement.insertBefore(btn, beforeElement) } function copyTextAndHtmlToClipboard(text, html) { console.log("copyTextAndHtmlToClipboard() called.") const blobText = new Blob([text], { type: "text/plain" }) const blobHtml = new Blob([html], { type: "text/html" }) const data = new ClipboardItem({ "text/plain": blobText, "text/html": blobHtml }) navigator.clipboard .write([data]) .then( (response) => { console.log("Success writing to the clipboard.") console.log(new Array(text, html)) }, (response) => { console.log("Error writing to the clipboard: " + response.text) } ) }