// ==UserScript== // @name atlassian license bulk copy // @namespace http://tampermonkey.net/ // @version 2024.12.11.14 // @description Inserts a textarea with basic license info in csv format for easy export // @author gwelch-contegix // @match https://my.atlassian.com/product // @match https://my.atlassian.com/products/* // @icon https://www.google.com/s2/favicons?sz=64&domain=atlassian.com // @grant none // @license MIT // @downloadURL none // ==/UserScript== (function () { "use strict" window.addEventListener("load", (event) => { function printlicense(n) { let lic = n.nextElementSibling if ( n.querySelector("td span.account-name") == null || lic.querySelector("textarea") == null || lic.querySelector("#sen") == null ) { setTimeout(printlicense, 1000, n) return } function getLicenseCountAndPluginName(name) { let split_name = name.split(" ") let data = split_name.indexOf("(Data") var app_name = "" if (split_name[data + 1] == "Center)") { let plugin = split_name.lastIndexOf("for", data) if (plugin < 0) { app_name = split_name.slice(0, data).join(" ") } else { app_name = split_name[plugin + 1] } } var license_count_index = split_name.lastIndexOf("Users:") - 1 var license_count = "" if (license_count_index > 0) { license_count = split_name.at(license_count_index) } else { license_count_index = split_name.lastIndexOf("Agents:") - 1 if (license_count_index > 0) { license_count = split_name.at(license_count_index) if (license_count == "Remote") { license_count = split_name.at(license_count_index - 1) } } } return [app_name, license_count] } let org = n .querySelector("td span.account-name") .textContent.trim() .replaceAll(",", "") let name = n .querySelector("span.desc") .textContent.trim() .replaceAll(",", "") let expiry = n .querySelector("td.support-expiry-date") .textContent.trim() .replaceAll(",", "") let sen = lic.querySelector("#sen").textContent.trim().replaceAll(",", "") var product_key = lic.querySelector("table.account-detail").getAttribute('data-product-key') if (product_key.endsWith(".data-center")) { product_key = product_key.slice(0, -12) } let t = lic .querySelector("textarea") .value.trim() .replaceAll(",", "") let [app_name, license_count] = getLicenseCountAndPluginName(name) let line = `${license_count},${org},${name},${app_name},${product_key},${expiry},${sen},${t}`.replaceAll( "\n", "", ) document.getElementById("tsx-csv").value += line + "\n" console.log(line) window.TSX_license_count -= 1 } function notify(message, time) { var popup = $(`
${message}
`) $("body").append(popup) // Style the popup (you can customize this) popup.css({ position: "fixed", bottom: "0%", right: "0%", // 'transform': 'translate(-50%, -50%)', "background-color": "red", padding: "10px", border: "1px solid black", "z-index": "1000", }) // Show the popup popup.fadeIn() // Hide the popup after a delay (e.g., 3 seconds) setTimeout(function () { popup.fadeOut() setTimeout(function () { popup.remove() }, 50) }, time) } function licenseDone() { if (window.TSX_license_count > 0) { console.log("waiting for csv to complete " + window.TSX_license_count) notify( "waiting for csv to complete " + window.TSX_license_count + " left", 1050, ) setTimeout(licenseDone, 1000) return } console.log("csv is done") notify("csv is done", 5000) let d = document.getElementById("tsx-div") let p = document.createElement("p") p.textContent = "csv is done" d.appendChild(p) } function click(n) { n.querySelector("td > span").click() } function download(file, text) { let element = document.createElement("a") element.setAttribute( "href", "data:text/plain;charset=utf-8," + encodeURIComponent(text), ) element.setAttribute("download", file) document.body.appendChild(element) element.click() document.body.removeChild(element) } function getlicenses() { var wait = 0 for (let name of document .querySelectorAll( "#your-licenses > section.product-list.show-paid > table > tbody > tr.headingRow", ) .values() .toArray() .reverse()) { if (name.checkVisibility()) { window.TSX_license_count += 1 if (window.TSX_license_count % 2 == 0) { wait += 1000 } setTimeout(click, 1200 * window.TSX_license_count, name) printlicense(name) } } licenseDone() } let form = document.querySelector( "#your-licenses > section.product-list.show-paid > form", ) let div = document.createElement("div") div.id = "tsx-div" let csv = document.createElement("textarea") let btnGetLicenses = document.createElement("button") let btnDownloadCSV = document.createElement("button") csv.id = "tsx-csv" csv.value = "license_count,owner,app,app_name,product_key,expiry,sen,license\n" $(csv).css({ display: "block", width: "100%", }) $(div).css({ margin: "0px 6px 0 0", }) btnGetLicenses.textContent = "Get Licenses" btnGetLicenses.addEventListener("click", getlicenses) btnDownloadCSV.textContent = "download csv" btnDownloadCSV.addEventListener("click", function (e) { download("licenses.csv", csv.value) }) div.appendChild(csv) div.appendChild(btnGetLicenses) div.appendChild(btnDownloadCSV) form.after(div) window.TSX_license_count = 0 }) })()