JiraRoboScript

Jira helper to preselect some fields when creating dialog is shown

2020/04/26のページです。最新版はこちら

スクリプトをインストールするには、Tampermonkey, GreasemonkeyViolentmonkey のような拡張機能のインストールが必要です。

You will need to install an extension such as Tampermonkey to install this script.

スクリプトをインストールするには、TampermonkeyViolentmonkey のような拡張機能のインストールが必要です。

スクリプトをインストールするには、TampermonkeyUserscripts のような拡張機能のインストールが必要です。

このスクリプトをインストールするには、Tampermonkeyなどの拡張機能をインストールする必要があります。

このスクリプトをインストールするには、ユーザースクリプト管理ツールの拡張機能をインストールする必要があります。

(ユーザースクリプト管理ツールは設定済みなのでインストール!)

このスタイルをインストールするには、Stylusなどの拡張機能をインストールする必要があります。

このスタイルをインストールするには、Stylus などの拡張機能をインストールする必要があります。

このスタイルをインストールするには、Stylus tなどの拡張機能をインストールする必要があります。

このスタイルをインストールするには、ユーザースタイル管理用の拡張機能をインストールする必要があります。

このスタイルをインストールするには、ユーザースタイル管理用の拡張機能をインストールする必要があります。

このスタイルをインストールするには、ユーザースタイル管理用の拡張機能をインストールする必要があります。

(ユーザースタイル管理ツールは設定済みなのでインストール!)

このスクリプトの質問や評価の投稿はこちら通報はこちらへお寄せください
// ==UserScript==
// @name         JiraRoboScript
// @namespace    http://tampermonkey.net/
// @version      2.1
// @description  Jira helper to preselect some fields when creating dialog is shown
// @author       Robo
// @homepage     https://greasyfork.org/sk/scripts/400374-jiraroboscript
// @require      https://code.jquery.com/jquery-3.4.1.min.js
// @match        https://pmjira.cz.tmo/browse/*
// @grant        none
// ==/UserScript==

(function () {
	'use strict';
	//due to conflicts with page scripts
	let $myJQuery = jQuery.noConflict(true);

	let bodyMutationObserver = new MutationObserver(function (mutations) {
		for (let i = 0; i < mutations.length; i++) { //faster than forEach
			let mutation = mutations[i];
			//console.log(mutation);
			if (mutation.addedNodes.length > 0
				&& (mutation.addedNodes[0].id === "create-issue-dialog" || mutation.addedNodes[0].id === "create-subtask-dialog")) {
				//add inner dialog mutationObserver
				initializeDialogMutationObserver(mutation.addedNodes[0]);
			}
		}
	});

	// Starts listening for changes in the target HTML element of the page.
	let target = document.getElementById('jira');
	bodyMutationObserver.observe(target, {
		childList: true
	});

	function initializeDialogMutationObserver(dialog) {
		let dialogMutationObserver = new MutationObserver(function (mutations) {
			for (let i = 0; i < mutations.length; i++) { //faster than forEach
				let mutation = mutations[i];
				//console.log(mutation);
				if (mutation.target.className.includes("jira-dialog-content-ready")) {
					//dialog is ready
					//don't disconnect observer, because changing project type cause reload of inner content and dialog panel class change is triggered
					makeMiracle(mutation.target);
					//createMiracleButton(mutation.target);
				}
			}
		});

		dialogMutationObserver.observe(dialog, {
			attributes: true,
			attributeFilter: ["class"]
		});
	}

	function makeMiracle(dialog) {
		//load team value from parent task (rendered page), if exists
		let parentTaskTeamValue = $myJQuery("#issue-content").find("#customfield_10685-field").text().trim();
		let newTaskTeamValue = "16135";
		if (parentTaskTeamValue === "ST_SK - One Shop") {
			newTaskTeamValue = "16400";
		}

		console.log(parentTaskTeamValue);
		let agileRadio = new ElementConfig("#customfield_10267-1", true, "Agile");
		let epicInput = new ElementConfig("#customfield_10000-field", "OASK - Generic Epic", "Epic");
		let teamSelect = new ElementConfig("#customfield_10685", newTaskTeamValue, "Team"); //ST_SK - One App
		let privacyRelevanceSelect = new ElementConfig("#customfield_12605", "14042", "Privacy Relevance"); //NO

		let issueTypeToFieldMap = {
			"Technical US": [agileRadio, epicInput, teamSelect],
			"Task": [agileRadio, epicInput, teamSelect],
			"Sub-task": [agileRadio, teamSelect],
			"Story": [agileRadio, epicInput, teamSelect, privacyRelevanceSelect],
			"Bug": [agileRadio, epicInput, teamSelect]
		};

		let dialogContent = $myJQuery(dialog).find(".jira-dialog-content");
		let issueType = dialogContent.find("#issuetype-field").val();
		let prefilledFields = issueTypeToFieldMap[issueType];

		prefilledFields.forEach(function(prefilledField) {
			prefilledField.apply(dialogContent);
		});
	}

	function ElementConfig(selector, value, readableName) {
		this.selector = selector;
		this.value = value;
		this.readableName = readableName;
		this.apply = function (parentElement) {
			let element = parentElement.find(this.selector);
			if (element.parents(".qf-form.qf-configurable-form").length === 1 && element.parents(".qf-field-active").length === 0) {
				alert("Missing required field '" + this.readableName + "'");
			}
			if (element.is(":checkbox, :radio")) {
				element.prop('checked', this.value);
			} else if (element.is("input, textarea")) {
				element.val(this.value);
			} else if (element.is("select")) {
				element.val(this.value);
				//scroll to selected
				setTimeout(function () {
					let optionTop = element.find("option:selected").offset().top;
					let selectTop = element.offset().top;
					element.scrollTop(element.scrollTop() + (optionTop - selectTop));
				}, 100);
			}
		}
	}
})();