milanfarkas / Jira Cloud: Copy Task Key and Title to Clipboard

// ==UserScript==
// @name         Jira Cloud: Copy Task Key and Title to Clipboard
// @version      1.1.2
// @copyright    2023 - Milan Farkas, Dominik Varadi, Zoltan Szepe / WRD Labs Zrt. (https://wrd.hu)
// @namespace    www.wrd.hu
// @description  Adds a button to Jira Cloud that copies the Task Key and Title to Clipboard. Jira server is not supported.
// @author       milanfarkas
// @license      MIT
// @include      /https?:\/\/.*atlassian.net\/browse\/.*
// @include      /https?:\/\/.*atlassian.net\/jira.*
// @include      /https?:\/\/.*atlassian.net\/.*issues.*
// @require      https://code.jquery.com/jquery-3.6.0.min.js
// @require      https://rawgit.com/notifyjs/notifyjs/master/dist/notify.js
// @updateURL https://openuserjs.org/meta/milanfarkas/Jira_Cloud_Copy_Task_Key_and_Title_to_Clipboard.meta.js
// @downloadURL https://openuserjs.org/install/milanfarkas/Jira_Cloud_Copy_Task_Key_and_Title_to_Clipboard.user.js
// ==/UserScript==

$(function () {
  setInterval(initPlugin, 2000);
});

const initPlugin = () => {

  if ($('section[role=dialog]').length) {
    if ($('section[role=dialog] #clipboardBtn2').length < 1) {
      $('div#jira-issue-header button[data-testid=\'issue-field-voters.ui.button.styled-button\']').parent().parent().parent().parent().prepend("<button id='clipboardBtn2' style='margin-left:0px;margin-top: 3px;margin-right:16px;' class='copy-task-button aui-button ghx-actions aui-button-compact aui-button-subtle'><span class='aui-icon aui-icon-small aui-iconfont-copy-clipboard'></span> Copy</button>");
    }
  }
  else {
    if ($('#clipboardBtn1').length < 1) {
      $('header[role=\'banner\'] > div').last().prepend("<button id='clipboardBtn1' style='margin-left:0px;margin-right:16px;' class='copy-task-button aui-button ghx-actions aui-button-compact aui-button-subtle'><span class='aui-icon aui-icon-small aui-iconfont-copy-clipboard'></span> Copy</button>");
    }
  }

  $(".copy-task-button").off("click");
  $(".copy-task-button").click(copyTaskKeyAndTitle);
};

const copyTaskKeyAndTitle = () => {

  const issueKey = $('a[data-testid="issue.views.issue-base.foundation.breadcrumbs.current-issue.item"] span').text();
  if (issueKey === '') {
    $.notify("No issue was selected", 'error');
    return;
  }
  const issueTitle = $('h1[data-testid="issue.views.issue-base.foundation.summary.heading"]').text();

  const htmlText = "<a href=\"" + new URL("/browse/" + issueKey, document.baseURI).href + "\">" + issueKey + "</a> " + issueTitle;
  const plainText = issueKey + ' ' + issueTitle;
  copyToClipboard(htmlText, plainText);
  $.notify(plainText, 'success');
};

const copyToClipboard = (htmlText, plainText) => {

  const listener = (e) => {
    e.clipboardData.setData("text/html", htmlText);
    e.clipboardData.setData("text/plain", plainText);
    e.preventDefault();
  };

  document.addEventListener("copy", listener);
  document.execCommand("copy");
  document.removeEventListener("copy", listener);
};

(function () {
  'use strict';
})();